From e4e1852462bf70612e9fa375c56a0fdeda71be92 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sun, 6 Nov 2022 22:32:58 +0600 Subject: [PATCH 001/285] Start of global config infrastructure --- src/include/86box/plat.h | 1 + src/qt/qt_platform.cpp | 12 ++++++++++++ src/unix/unix.c | 12 ++++++++++++ src/win/win.c | 20 ++++++++++++++++++++ 4 files changed, 45 insertions(+) diff --git a/src/include/86box/plat.h b/src/include/86box/plat.h index aa01ac129..cd88f3653 100644 --- a/src/include/86box/plat.h +++ b/src/include/86box/plat.h @@ -106,6 +106,7 @@ extern int plat_getcwd(char *bufp, int max); extern int plat_chdir(char *path); extern void plat_tempfile(char *bufp, char *prefix, char *suffix); extern void plat_get_exe_name(char *s, int size); +extern void plat_get_global_config_dir(char* strptr); extern void plat_init_rom_paths(); extern int plat_dir_check(char *path); extern int plat_dir_create(char *path); diff --git a/src/qt/qt_platform.cpp b/src/qt/qt_platform.cpp index bcf51d70d..734af2aab 100644 --- a/src/qt/qt_platform.cpp +++ b/src/qt/qt_platform.cpp @@ -609,6 +609,18 @@ plat_chdir(char *path) return QDir::setCurrent(QString(path)) ? 0 : -1; } +void +plat_get_global_config_dir(char* strptr) +{ +#ifdef __APPLE__ + auto dir = QDir(QStandardPaths::standardLocations(QStandardPaths::GenericConfigLocation)[0] + "/net.86Box.86Box/"); +#else + auto dir = QDir(QStandardPaths::standardLocations(QStandardPaths::GenericConfigLocation)[0] + "/86Box/"); +#endif + if (!dir.exists()) dir.mkpath("."); + strncpy(strptr, dir.canonicalPath().toUtf8().constData(), 1024); +} + void plat_init_rom_paths() { diff --git a/src/unix/unix.c b/src/unix/unix.c index f2c6ed125..acd81c1f9 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -810,6 +810,18 @@ plat_init_rom_paths() #endif } +void +plat_get_global_config_dir(char *strptr) +{ +#ifdef __APPLE__ + char* prefPath = SDL_GetPrefPath(NULL, "net.86Box.86Box") +#else + char* prefPath = SDL_GetPrefPath(NULL, "86Box"); +#endif + strncpy(strptr, prefPath, 1024); + path_slash(strptr); +} + bool process_media_commands_3(uint8_t *id, char *fn, uint8_t *wp, int cmdargc) { diff --git a/src/win/win.c b/src/win/win.c index 5515d8e78..e99b94984 100644 --- a/src/win/win.c +++ b/src/win/win.c @@ -882,6 +882,26 @@ plat_mmap(size_t size, uint8_t executable) return VirtualAlloc(NULL, size, MEM_COMMIT, executable ? PAGE_EXECUTE_READWRITE : PAGE_READWRITE); } +void +plat_get_global_config_dir(char* strptr) +{ + wchar_t appdata_dir[1024] = { L'\0' }; + + if (_wgetenv(L"LOCALAPPDATA") && _wgetenv(L"LOCALAPPDATA")[0] != L'\0') { + size_t len = 0; + wcsncpy(appdata_dir, _wgetenv(L"LOCALAPPDATA"), 1024); + len = wcslen(appdata_dir); + if (appdata_dir[len - 1] != L'\\') { + appdata_dir[len] = L'\\'; + appdata_dir[len + 1] = L'\0'; + } + wcscat(appdata_dir, L"86box"); + CreateDirectoryW(appdata_dir, NULL); + wcscat(appdata_dir, L"\\"); + c16stombs(strptr, appdata_dir, 1024); + } +} + void plat_init_rom_paths() { From 8c9dd1d7c872bccd1b13699c89844037fb026740 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dan=20Hor=C3=A1k?= Date: Sat, 26 Nov 2022 16:58:31 +0100 Subject: [PATCH 002/285] fix build for non-dynarec platforms --- src/cpu/cpu.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c index 58ddf8dc6..0d7858397 100644 --- a/src/cpu/cpu.c +++ b/src/cpu/cpu.c @@ -1170,7 +1170,9 @@ cpu_set(void) 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 } timing_rr = 1; /* register dest - register src */ From d05d988e349d6a9a2dd2a41b7f9e5ef942643328 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Wed, 30 Nov 2022 16:01:33 +0100 Subject: [PATCH 003/285] IDE/ATAPI: Don't overwrite data in packet writes during Phase Data In. Fixes Solaris 2.6 CD installation on ide/atapi. --- src/disk/hdc_ide.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/disk/hdc_ide.c b/src/disk/hdc_ide.c index a306c5288..2f544cfb9 100644 --- a/src/disk/hdc_ide.c +++ b/src/disk/hdc_ide.c @@ -1150,6 +1150,9 @@ ide_atapi_packet_write(ide_t *ide, uint32_t val, int length) bufferw = (uint16_t *) bufferb; bufferl = (uint32_t *) bufferb; + if (dev->packet_status == PHASE_DATA_IN) + return; + switch (length) { case 1: bufferb[dev->pos] = val & 0xff; From 898eb5c9506d77415623d93d446c273196afa6f0 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 30 Nov 2022 20:16:03 +0100 Subject: [PATCH 004/285] Fixed AHA-1640 MCA write handler I/O address calculation. --- src/scsi/scsi_aha154x.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scsi/scsi_aha154x.c b/src/scsi/scsi_aha154x.c index e7cd02884..669d050bf 100644 --- a/src/scsi/scsi_aha154x.c +++ b/src/scsi/scsi_aha154x.c @@ -519,7 +519,7 @@ aha_mca_write(int port, uint8_t val, void *priv) /* Get the new assigned I/O base address. */ dev->Base = (dev->pos_regs[3] & 7) << 8; - dev->Base |= ((dev->pos_regs[3] & 0xc0) ? 0x34 : 0x30); + dev->Base |= ((dev->pos_regs[3] & 0x40) ? 0x34 : 0x30); /* Save the new IRQ and DMA channel values. */ dev->Irq = (dev->pos_regs[4] & 0x07) + 8; From 136db56b990eeab453de81185130812db41e4a0e Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 30 Nov 2022 20:23:40 +0100 Subject: [PATCH 005/285] Fixed the WD8003 MCA IRQ selection. --- src/network/net_wd8003.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/net_wd8003.c b/src/network/net_wd8003.c index cb2d0bc35..c820e7444 100644 --- a/src/network/net_wd8003.c +++ b/src/network/net_wd8003.c @@ -548,7 +548,7 @@ wd_mca_write(int port, uint8_t val, void *priv) dev->base_address = (dev->pos_regs[2] & 0xfe) << 4; dev->ram_addr = (dev->pos_regs[3] & 0xfc) << 12; - dev->irq = irq[dev->pos_regs[5] & 0x02]; + dev->irq = irq[dev->pos_regs[5] & 0x03]; /* Initialize the device if fully configured. */ /* Register (new) I/O handler. */ From 6e3ffea3d483ecb9a49381ddfe94c23a1e0c57d2 Mon Sep 17 00:00:00 2001 From: Alexander Babikov <2708460+lemondrops@users.noreply.github.com> Date: Thu, 1 Dec 2022 22:33:55 +0500 Subject: [PATCH 006/285] Add the CR4 Page Global Enable bit support to Pentium Pro and Pentium II CPUs --- src/cpu/cpu.c | 9 +++++---- src/cpu/cpu.h | 1 + src/cpu/x86_ops_mov_ctrl.h | 4 ++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c index 0d7858397..d667c743e 100644 --- a/src/cpu/cpu.c +++ b/src/cpu/cpu.c @@ -61,6 +61,7 @@ enum { CPUID_AMDSEP = (1 << 10), CPUID_SEP = (1 << 11), CPUID_MTRR = (1 << 12), + CPUID_PGE = (1 << 13), CPUID_MCA = (1 << 14), CPUID_CMOV = (1 << 15), CPUID_MMX = (1 << 23), @@ -1298,7 +1299,7 @@ cpu_set(void) if (cpu_s->cpu_type >= CPU_PENTIUM2) cpu_features |= CPU_FEATURE_MMX; msr.fcr = (1 << 8) | (1 << 9) | (1 << 12) | (1 << 16) | (1 << 19) | (1 << 21); - cpu_CR4_mask = CR4_VME | CR4_PVI | CR4_TSD | CR4_DE | CR4_PSE | CR4_MCE | CR4_PAE | CR4_PCE; + cpu_CR4_mask = CR4_VME | CR4_PVI | CR4_TSD | CR4_DE | CR4_PSE | CR4_MCE | CR4_PAE | CR4_PCE | CR4_PGE; if (cpu_s->cpu_type == CPU_PENTIUM2D) cpu_CR4_mask |= CR4_OSFXSR; @@ -1959,7 +1960,7 @@ cpu_CPUID(void) } else if (EAX == 1) { EAX = CPUID; EBX = ECX = 0; - EDX = CPUID_FPU | CPUID_VME | CPUID_PSE | CPUID_TSC | CPUID_MSR | CPUID_PAE | CPUID_MCE | CPUID_CMPXCHG8B | CPUID_MTRR | CPUID_MCA | CPUID_SEP | CPUID_CMOV; + EDX = CPUID_FPU | CPUID_VME | CPUID_PSE | CPUID_TSC | CPUID_MSR | CPUID_PAE | CPUID_MCE | CPUID_CMPXCHG8B | CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_SEP | CPUID_CMOV; } else if (EAX == 2) { EAX = 0x00000001; EBX = ECX = 0; @@ -1977,7 +1978,7 @@ cpu_CPUID(void) } else if (EAX == 1) { EAX = CPUID; EBX = ECX = 0; - EDX = CPUID_FPU | CPUID_VME | CPUID_PSE | CPUID_TSC | CPUID_MSR | CPUID_PAE | CPUID_MCE | CPUID_CMPXCHG8B | CPUID_MMX | CPUID_MTRR | CPUID_MCA | CPUID_SEP | CPUID_CMOV; + EDX = CPUID_FPU | CPUID_VME | CPUID_PSE | CPUID_TSC | CPUID_MSR | CPUID_PAE | CPUID_MCE | CPUID_CMPXCHG8B | CPUID_MMX | CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_SEP | CPUID_CMOV; } else if (EAX == 2) { EAX = 0x00000001; EBX = ECX = 0; @@ -1995,7 +1996,7 @@ cpu_CPUID(void) } else if (EAX == 1) { EAX = CPUID; EBX = ECX = 0; - EDX = CPUID_FPU | CPUID_VME | CPUID_PSE | CPUID_TSC | CPUID_MSR | CPUID_PAE | CPUID_MCE | CPUID_CMPXCHG8B | CPUID_MMX | CPUID_MTRR | CPUID_MCA | CPUID_SEP | CPUID_FXSR | CPUID_CMOV; + EDX = CPUID_FPU | CPUID_VME | CPUID_PSE | CPUID_TSC | CPUID_MSR | CPUID_PAE | CPUID_MCE | CPUID_CMPXCHG8B | CPUID_MMX | CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_SEP | CPUID_FXSR | CPUID_CMOV; } else if (EAX == 2) { EAX = 0x00000001; EBX = ECX = 0; diff --git a/src/cpu/cpu.h b/src/cpu/cpu.h index 11e1bc93c..a28618fe1 100644 --- a/src/cpu/cpu.h +++ b/src/cpu/cpu.h @@ -195,6 +195,7 @@ typedef struct { #define CR4_PVI (1 << 1) #define CR4_PSE (1 << 4) #define CR4_PAE (1 << 5) +#define CR4_PGE (1 << 7) #define CPL ((cpu_state.seg_cs.access >> 5) & 3) diff --git a/src/cpu/x86_ops_mov_ctrl.h b/src/cpu/x86_ops_mov_ctrl.h index 0cfa38095..d28033d5d 100644 --- a/src/cpu/x86_ops_mov_ctrl.h +++ b/src/cpu/x86_ops_mov_ctrl.h @@ -148,7 +148,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) + if (((cpu_state.regs[cpu_rm].l ^ cr4) & cpu_CR4_mask) & (CR4_PAE | CR4_PGE)) flushmmucache(); cr4 = cpu_state.regs[cpu_rm].l & cpu_CR4_mask; break; @@ -205,7 +205,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) + if (((cpu_state.regs[cpu_rm].l ^ cr4) & cpu_CR4_mask) & (CR4_PAE | CR4_PGE)) flushmmucache(); cr4 = cpu_state.regs[cpu_rm].l & cpu_CR4_mask; break; From 910265d670d01c740191a7e810d6fcb827a5a23a Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 1 Dec 2022 19:02:58 +0100 Subject: [PATCH 007/285] Initialize the BusLogic geometry register to have bit 4 set, fixes older versions of BTDOSM.SYS/BTCDROM.SYS. --- src/scsi/scsi_x54x.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scsi/scsi_x54x.c b/src/scsi/scsi_x54x.c index 6cac77e02..45854a0ba 100644 --- a/src/scsi/scsi_x54x.c +++ b/src/scsi/scsi_x54x.c @@ -1402,7 +1402,7 @@ x54x_reset(x54x_t *dev) clear_irq(dev); if (dev->flags & X54X_INT_GEOM_WRITABLE) - dev->Geometry = 0x80; + dev->Geometry = 0x90; else dev->Geometry = 0x00; dev->callback_phase = 0; From 702ca98657be0c4ab9dd8a8c20c7f7f6e16396c7 Mon Sep 17 00:00:00 2001 From: cold-brewed Date: Fri, 2 Dec 2022 15:06:25 -0500 Subject: [PATCH 008/285] qt: Allow img suffix to be specified on macOS for removable image files. Fix path issue when manually typing image file names. --- src/qt/qt_newfloppydialog.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/qt/qt_newfloppydialog.cpp b/src/qt/qt_newfloppydialog.cpp index 1cb81d2ce..57227c71d 100644 --- a/src/qt/qt_newfloppydialog.cpp +++ b/src/qt/qt_newfloppydialog.cpp @@ -25,6 +25,7 @@ #include "qt_util.hpp" extern "C" { +#include <86box/86box.h> #include <86box/plat.h> #include <86box/random.h> #include <86box/scsi_device.h> @@ -130,20 +131,20 @@ NewFloppyDialog::NewFloppyDialog(MediaType type, QWidget *parent) Models::AddEntry(model, tr(floppyTypes[i].toUtf8().data()), i); } ui->fileField->setFilter( - tr("All images") % util::DlgFilter({ "86f", "dsk", "flp", "im?", "*fd?" }) % tr("Basic sector images") % util::DlgFilter({ "dsk", "flp", "im?", "img", "*fd?" }) % tr("Surface images") % util::DlgFilter({ "86f" }, true)); + tr("All images") % util::DlgFilter({ "86f", "dsk", "flp", "im?", "img", "*fd?" }) % tr("Basic sector images") % util::DlgFilter({ "dsk", "flp", "im?", "img", "*fd?" }) % tr("Surface images") % util::DlgFilter({ "86f" }, true)); break; case MediaType::Zip: for (int i = 0; i < zipTypes.size(); ++i) { Models::AddEntry(model, tr(zipTypes[i].toUtf8().data()), i); } - ui->fileField->setFilter(tr("ZIP images") % util::DlgFilter({ "im?", "zdi" }, true)); + ui->fileField->setFilter(tr("ZIP images") % util::DlgFilter({ "im?", "img", "zdi" }, true)); break; case MediaType::Mo: for (int i = 0; i < moTypes.size(); ++i) { Models::AddEntry(model, tr(moTypes[i].toUtf8().data()), i); } - ui->fileField->setFilter(tr("MO images") % util::DlgFilter({ "im?", "mdi" }) % tr("All files") % util::DlgFilter({ "*" }, true)); + ui->fileField->setFilter(tr("MO images") % util::DlgFilter({ "im?", "img", "mdi" }) % tr("All files") % util::DlgFilter({ "*" }, true)); break; } @@ -185,6 +186,8 @@ NewFloppyDialog::onCreate() { auto filename = ui->fileField->fileName(); QFileInfo fi(filename); + filename = (fi.isRelative() && !fi.filePath().isEmpty()) ? usr_path + fi.filePath() : fi.filePath(); + ui->fileField->setFileName(filename); FileType fileType; QProgressDialog progress("Creating floppy image", QString(), 0, 100, this); From ae60078d26f5770c04bef792c2548870391b5b26 Mon Sep 17 00:00:00 2001 From: cold-brewed Date: Fri, 2 Dec 2022 17:26:58 -0500 Subject: [PATCH 009/285] Add some parens to the ternary --- src/qt/qt_newfloppydialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qt/qt_newfloppydialog.cpp b/src/qt/qt_newfloppydialog.cpp index 57227c71d..a445c47d3 100644 --- a/src/qt/qt_newfloppydialog.cpp +++ b/src/qt/qt_newfloppydialog.cpp @@ -186,7 +186,7 @@ NewFloppyDialog::onCreate() { auto filename = ui->fileField->fileName(); QFileInfo fi(filename); - filename = (fi.isRelative() && !fi.filePath().isEmpty()) ? usr_path + fi.filePath() : fi.filePath(); + filename = (fi.isRelative() && !fi.filePath().isEmpty()) ? (usr_path + fi.filePath()) : fi.filePath(); ui->fileField->setFileName(filename); FileType fileType; From 6a4d1bbfc41a04e5a1a4ae784a76a4ed68c2b397 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Sun, 4 Dec 2022 16:56:14 +0100 Subject: [PATCH 010/285] IBM PS/2 model 60: Looks like the model 50 bios expects the 50 POS id, and given the 60 shares its stuff with 50, I believe the id is identical then. --- src/machine/m_ps2_mca.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/machine/m_ps2_mca.c b/src/machine/m_ps2_mca.c index 90c69aa3c..e59fb1a19 100644 --- a/src/machine/m_ps2_mca.c +++ b/src/machine/m_ps2_mca.c @@ -1385,7 +1385,7 @@ machine_ps2_model_60_init(const machine_t *model) machine_ps2_common_init(model); - ps2.planar_id = 0xf7ff; + ps2.planar_id = 0xfbff; ps2_mca_board_model_50_init(8); return ret; From df3c4b155a16874e5639c5748fc35c363e83335f Mon Sep 17 00:00:00 2001 From: TC1995 Date: Sun, 4 Dec 2022 20:53:03 +0100 Subject: [PATCH 011/285] SCSI/CD-ROM fixes: Properly implemented the Toshiba specific SCSI commands including the Audio side per the Toshiba CD-ROM SCSI-2 manual from 1990 (they were previously implemented with some hacks). --- src/cdrom/cdrom.c | 62 ++++++++++++++++++++------------------- src/include/86box/cdrom.h | 2 +- src/scsi/scsi_cdrom.c | 17 ++++++----- 3 files changed, 43 insertions(+), 38 deletions(-) diff --git a/src/cdrom/cdrom.c b/src/cdrom/cdrom.c index ae7278742..dd1604801 100644 --- a/src/cdrom/cdrom.c +++ b/src/cdrom/cdrom.c @@ -430,26 +430,31 @@ cdrom_audio_track_search(cdrom_t *dev, uint32_t pos, int type, uint8_t playbit) if (dev->cd_status == CD_STATUS_DATA_ONLY) return 0; + cdrom_log("Audio Track Search: MSF = %06x, type = %02x, playbit = %02x\n", pos, type, playbit); switch (type) { + case 0x00: + if (pos == 0xffffffff) { + cdrom_log("CD-ROM %i: Search from current position\n", dev->id); + pos = dev->seek_pos; + } + break; case 0x40: - cdrom_log("Audio Track Search: MSF = %06x, type = %02x\n", pos, type); m = CD_DCB((pos >> 24) & 0xff); s = CD_DCB((pos >> 16) & 0xff); f = CD_DCB((pos >> 8) & 0xff); - pos = MSFtoLBA(m, s, f) - 150; + if (pos == 0xffffffff) { + cdrom_log("CD-ROM %i: Search from current position\n", dev->id); + pos = dev->seek_pos; + } else + pos = MSFtoLBA(m, s, f) - 150; break; } - /* Do this at this point, since it's at this point that we know the - actual LBA position to start playing from. */ - if (!(dev->ops->track_type(dev, pos) & CD_TRACK_AUDIO)) { - cdrom_log("CD-ROM %i: LBA %08X not on an audio track\n", dev->id, pos); - cdrom_stop(dev); - return 0; - } + /* Unlike standard commands, if there's a data track on an Audio CD (mixed mode) + the playback continues with the audio muted (Toshiba CD-ROM SCSI-2 manual reference). */ dev->seek_pos = pos; - dev->noplay = !playbit; + dev->cd_buflen = 0; dev->cd_status = playbit ? CD_STATUS_PLAYING : CD_STATUS_PAUSED; return 1; } @@ -462,30 +467,29 @@ cdrom_toshiba_audio_play(cdrom_t *dev, uint32_t pos, int type) if (dev->cd_status == CD_STATUS_DATA_ONLY) return 0; - if (dev->cd_status == CD_STATUS_STOPPED || dev->cd_status == CD_STATUS_PAUSED) - dev->cd_status = CD_STATUS_PLAYING; - /*Preliminary support, revert if too incomplete*/ + cdrom_log("Toshiba Play Audio: MSF = %06x, cdstatus = %02x\n", pos, dev->cd_status); switch (type) { case 0x40: - cdrom_log("Toshiba Play Audio: MSF = %06x, type = %02x\n", pos, type); m = CD_DCB((pos >> 24) & 0xff); s = CD_DCB((pos >> 16) & 0xff); f = CD_DCB((pos >> 8) & 0xff); pos = MSFtoLBA(m, s, f) - 150; break; + case 0xc0: + if (pos == 0xffffffff) { + cdrom_log("CD-ROM %i: Playing from current position\n", dev->id); + pos = dev->cd_end; + } + break; } - /* Do this at this point, since it's at this point that we know the - actual LBA position to start playing from. */ - if (!(dev->ops->track_type(dev, pos) & CD_TRACK_AUDIO)) { - cdrom_log("CD-ROM %i: LBA %08X not on an audio track\n", dev->id, pos); - cdrom_stop(dev); - return 0; - } + /* Unlike standard commands, if there's a data track on an Audio CD (mixed mode) + the playback continues with the audio muted (Toshiba CD-ROM SCSI-2 manual reference). */ - dev->cd_end = pos; + dev->cd_end = pos; dev->cd_buflen = 0; + dev->cd_status = CD_STATUS_PLAYING; return 1; } @@ -587,15 +591,12 @@ cdrom_get_current_subcodeq_playstatus(cdrom_t *dev, uint8_t *b) dev->ops->get_subchannel(dev, dev->seek_pos, &subc); - if (dev->cd_status == CD_STATUS_PLAYING) - ret = 0x00; - else if (dev->cd_status == CD_STATUS_PAUSED) { - if (dev->noplay) - ret = 0x02; - else - ret = 0x01; - } else + cdrom_log("Get Current Subcode-q Play Status = %02x, op = %02x.\n", dev->cd_status, dev->audio_op); + + if ((dev->cd_status == CD_STATUS_DATA_ONLY) || (dev->cd_status == CD_STATUS_PLAYING_COMPLETED)) ret = 0x03; + else + ret = (dev->cd_status == CD_STATUS_PLAYING) ? 0x00 : dev->audio_op; b[0] = subc.attr; b[1] = CD_BCD(subc.track); @@ -895,6 +896,7 @@ cdrom_read_disc_info_toc(cdrom_t *dev, unsigned char *b, unsigned char track, in dev->ops->get_tracks(dev, &first_track, &last_track); + cdrom_log("Read DISC Info TOC Type = %d.\n", type); switch (type) { case 0: b[0] = CD_BCD(first_track); diff --git a/src/include/86box/cdrom.h b/src/include/86box/cdrom.h index 72c74a144..f5bfc9026 100644 --- a/src/include/86box/cdrom.h +++ b/src/include/86box/cdrom.h @@ -116,7 +116,7 @@ typedef struct cdrom { seek_diff, cd_end; int host_drive, prev_host_drive, - cd_buflen, noplay; + cd_buflen, audio_op; const cdrom_ops_t *ops; diff --git a/src/scsi/scsi_cdrom.c b/src/scsi/scsi_cdrom.c index 80ff4184a..e736b879d 100644 --- a/src/scsi/scsi_cdrom.c +++ b/src/scsi/scsi_cdrom.c @@ -2045,7 +2045,8 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb) break; } pos = (cdb[2] << 24) | (cdb[3] << 16) | (cdb[4] << 8) | cdb[5]; - ret = cdrom_audio_track_search(dev->drv, pos, cdb[9], cdb[1] & 1); + ret = cdrom_audio_track_search(dev->drv, pos, cdb[9] & 0xc0, cdb[1] & 1); + dev->drv->audio_op = (cdb[1] & 1) ? 0x03 : 0x02; if (ret) scsi_cdrom_command_complete(dev); @@ -2061,7 +2062,7 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb) break; } pos = (cdb[2] << 24) | (cdb[3] << 16) | (cdb[4] << 8) | cdb[5]; - ret = cdrom_toshiba_audio_play(dev->drv, pos, cdb[9]); + ret = cdrom_toshiba_audio_play(dev->drv, pos, cdb[9] & 0xc0); if (ret) scsi_cdrom_command_complete(dev); @@ -2388,7 +2389,7 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb) if (dev->early) ide_padstr8(dev->buffer + idx, 40, "CD-ROM CDS-431"); /* Product */ else - ide_padstr8(dev->buffer + idx, 40, "XM6201TASUN32XCD1103"); /* Product */ + ide_padstr8(dev->buffer + idx, 40, "CD-ROM DRIVE:XM"); /* Product */ } else { if (dev->early) ide_padstr8(dev->buffer + idx, 40, "CD-ROM DRIVE:260"); /* Product */ @@ -2399,7 +2400,7 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb) } #endif idx += 40; - ide_padstr8(dev->buffer + idx, 20, "53R141"); /* Product */ + ide_padstr8(dev->buffer + idx, 20, "53R141"); /* Serial */ idx += 20; break; @@ -2443,8 +2444,8 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb) ide_padstr8(dev->buffer + 32, 4, "H42"); /* Revision */ } else { ide_padstr8(dev->buffer + 8, 8, "TOSHIBA"); /* Vendor */ - ide_padstr8(dev->buffer + 16, 16, "XM6201TASUN32XCD"); /* Product */ - ide_padstr8(dev->buffer + 32, 4, "1103"); /* Revision */ + ide_padstr8(dev->buffer + 16, 16, "CD-ROM DRIVE:XM"); /* Product */ + ide_padstr8(dev->buffer + 32, 4, "3433"); /* Revision */ } } else { if (dev->early) { @@ -2492,12 +2493,14 @@ atapi_out: case GPCMD_PAUSE_RESUME: scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS); cdrom_audio_pause_resume(dev->drv, cdb[8] & 0x01); + dev->drv->audio_op = (cdb[8] & 0x01) ? 0x03 : 0x01; scsi_cdrom_command_complete(dev); break; case GPCMD_STILL: scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS); - dev->drv->cd_status = CD_STATUS_PAUSED; + cdrom_audio_pause_resume(dev->drv, 0x00); + dev->drv->audio_op = 0x01; scsi_cdrom_command_complete(dev); break; From fee8970aab01e8d241be2847456d7eb728047ded Mon Sep 17 00:00:00 2001 From: TC1995 Date: Sun, 4 Dec 2022 21:42:34 +0100 Subject: [PATCH 012/285] S3: Don't allow 16-bit I/O pixtrans blitting on the first port of the 8-bit I/O handling (e2e8 write), fixes fonts on Unix flavors where affected. --- src/video/vid_s3.c | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/video/vid_s3.c b/src/video/vid_s3.c index 6c93c32f4..b17f0e50b 100644 --- a/src/video/vid_s3.c +++ b/src/video/vid_s3.c @@ -1239,18 +1239,6 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) 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.frgd_mix & 0x60) != 0x40) || ((s3->accel.bkgd_mix & 0x60) != 0x40)) - s3_accel_start(16, 1, s3->accel.pix_trans[0] | (s3->accel.pix_trans[0] << 8), 0, s3); - else - s3_accel_start(2, 1, 0xffffffff, s3->accel.pix_trans[0] | (s3->accel.pix_trans[0] << 8), s3); - } else { - if (s3->chip != S3_86C928PCI && s3->chip != S3_86C928) { - s3_accel_start(2, 1, 0xffffffff, s3->accel.pix_trans[0] | (s3->accel.pix_trans[0] << 8), s3); - } - } - break; } } break; From f2ff608e34dba042858dad0461f97632affbed74 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 4 Dec 2022 22:44:44 +0100 Subject: [PATCH 013/285] Fixed some AT NVR flags. --- src/nvr_at.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/nvr_at.c b/src/nvr_at.c index 222b635ae..4b4cbb2a3 100644 --- a/src/nvr_at.c +++ b/src/nvr_at.c @@ -997,13 +997,13 @@ nvr_at_init(const device_t *info) case 1: /* standard AT */ case 5: /* AMI WinBIOS 1994 */ case 6: /* AMI BIOS 1995 */ - if ((info->local & 0x0f) == 1) + if ((info->local & 0x1f) == 0x11) local->flags |= FLAG_PIIX4; else { local->def = 0x00; - if ((info->local & 0x0f) == 5) + if ((info->local & 0x1f) == 0x15) local->flags |= FLAG_AMI_1994_HACK; - else if ((info->local & 0x0f) == 6) + else if ((info->local & 0x1f) == 0x16) local->flags |= FLAG_AMI_1995_HACK; else local->def = 0xff; @@ -1079,7 +1079,7 @@ nvr_at_init(const device_t *info) io_sethandler(0x0070, 2, nvr_read, NULL, NULL, nvr_write, NULL, NULL, nvr); } - if (info->local & 0x10) { + if ((info->local & 0x1f) == 0x11) { io_sethandler(0x0072, 2, nvr_read, NULL, NULL, nvr_write, NULL, NULL, nvr); } From 60b5c5ba7441d8fce92f0f49c11bf92df269dee4 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 4 Dec 2022 22:59:22 +0100 Subject: [PATCH 014/285] Implemented missing ALi M1543C behavior. --- src/chipset/ali1543.c | 8 ++++++++ src/include/86box/nvr.h | 1 + src/nvr_at.c | 17 +++++++++++++++++ 3 files changed, 26 insertions(+) diff --git a/src/chipset/ali1543.c b/src/chipset/ali1543.c index e6bfbf878..150e54468 100644 --- a/src/chipset/ali1543.c +++ b/src/chipset/ali1543.c @@ -254,6 +254,14 @@ ali1533_write(int func, int addr, uint8_t val, void *priv) dev->pci_conf[addr] = val & 0xcf; /* This actually enables/disables the USB *device* rather than the interface itself. */ dev->usb_dev_enable = !(val & 0x40); + if (dev->type == 1) { + nvr_at_index_read_handler(0, 0x0070, dev->nvr); + nvr_at_index_read_handler(0, 0x0072, dev->nvr); + if (val & 0x20) { + nvr_at_index_read_handler(1, 0x0070, dev->nvr); + nvr_at_index_read_handler(1, 0x0072, dev->nvr); + } + } break; /* Hardware setting status bits, read-only (register 0x54) */ diff --git a/src/include/86box/nvr.h b/src/include/86box/nvr.h index 47e52c95b..25f5e90ad 100644 --- a/src/include/86box/nvr.h +++ b/src/include/86box/nvr.h @@ -118,6 +118,7 @@ extern void nvr_time_set(struct tm *); extern void nvr_reg_write(uint16_t reg, uint8_t val, void *priv); extern void nvr_at_handler(int set, uint16_t base, nvr_t *nvr); extern void nvr_at_sec_handler(int set, uint16_t base, nvr_t *nvr); +extern void nvr_at_index_read_handler(int set, uint16_t base, nvr_t *nvr); extern void nvr_read_addr_set(int set, nvr_t *nvr); extern void nvr_wp_set(int set, int h, nvr_t *nvr); extern void nvr_via_wp_set(int set, int reg, nvr_t *nvr); diff --git a/src/nvr_at.c b/src/nvr_at.c index 4b4cbb2a3..301399533 100644 --- a/src/nvr_at.c +++ b/src/nvr_at.c @@ -892,6 +892,23 @@ nvr_at_handler(int set, uint16_t base, nvr_t *nvr) nvr_read, NULL, NULL, nvr_write, NULL, NULL, nvr); } +void +nvr_at_index_read_handler(int set, uint16_t base, nvr_t *nvr) +{ + io_handler(0, base, 1, + nvr_read, NULL, NULL, NULL, NULL, NULL, nvr); + nvr_at_handler(0, base, nvr); + + if (set) + nvr_at_handler(1, base, nvr); + else { + io_handler(set, base, 1, + nvr_read, NULL, NULL, NULL, NULL, NULL, nvr); + io_handler(set, base + 1, 1, + nvr_read, NULL, NULL, nvr_write, NULL, NULL, nvr); + } +} + void nvr_at_sec_handler(int set, uint16_t base, nvr_t *nvr) { From 15b2b8178b59bd65e14a2d3425a0215f55522fbb Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 4 Dec 2022 23:07:39 +0100 Subject: [PATCH 015/285] Fixed a minor accidental screw-up in nvr_at.c. --- src/nvr_at.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/nvr_at.c b/src/nvr_at.c index 301399533..97224ab99 100644 --- a/src/nvr_at.c +++ b/src/nvr_at.c @@ -902,9 +902,9 @@ nvr_at_index_read_handler(int set, uint16_t base, nvr_t *nvr) if (set) nvr_at_handler(1, base, nvr); else { - io_handler(set, base, 1, + io_handler(1, base, 1, nvr_read, NULL, NULL, NULL, NULL, NULL, nvr); - io_handler(set, base + 1, 1, + io_handler(1, base + 1, 1, nvr_read, NULL, NULL, nvr_write, NULL, NULL, nvr); } } From ebb73706c68c55f6a237ae82f0ef7690f5214b9f Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 4 Dec 2022 23:26:08 +0100 Subject: [PATCH 016/285] Fixe another accidental mess-up in nvr_at.c. --- src/nvr_at.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/nvr_at.c b/src/nvr_at.c index 97224ab99..f233e82ba 100644 --- a/src/nvr_at.c +++ b/src/nvr_at.c @@ -896,14 +896,14 @@ void nvr_at_index_read_handler(int set, uint16_t base, nvr_t *nvr) { io_handler(0, base, 1, - nvr_read, NULL, NULL, NULL, NULL, NULL, nvr); + NULL, NULL, NULL, nvr_write, NULL, NULL, nvr); nvr_at_handler(0, base, nvr); if (set) nvr_at_handler(1, base, nvr); else { io_handler(1, base, 1, - nvr_read, NULL, NULL, NULL, NULL, NULL, nvr); + NULL, NULL, NULL, nvr_write, NULL, NULL, nvr); io_handler(1, base + 1, 1, nvr_read, NULL, NULL, nvr_write, NULL, NULL, nvr); } From 3ba26fe8345aa9cde9e5cd87f3cd9ad93b11c8a1 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 4 Dec 2022 23:29:18 +0100 Subject: [PATCH 017/285] And a mistake in machine/machine_table.c probably introduced by jriwanek when she redid the machines table. --- 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 0b846e784..df740ee2a 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -10553,7 +10553,7 @@ const machine_t machines[] = { .max = 1572864, .step = 8192 }, - 255, + .nvrmask = 255, .kbc = KBC_UNKNOWN, .kbc_p1 = 0, .gpio = 0, From bec9b59d6d2568382e383b72f1ffc3f3cda53bbe Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 4 Dec 2022 23:31:21 +0100 Subject: [PATCH 018/285] Added the Winbond W29C010 Flash. --- src/include/86box/flash.h | 1 + src/machine/m_at_slot1.c | 2 +- src/mem/sst_flash.c | 15 +++++++++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/include/86box/flash.h b/src/include/86box/flash.h index 4edb67467..21ba6b212 100644 --- a/src/include/86box/flash.h +++ b/src/include/86box/flash.h @@ -26,6 +26,7 @@ extern const device_t intel_flash_bxb_device; extern const device_t sst_flash_29ee010_device; extern const device_t sst_flash_29ee020_device; +extern const device_t winbond_flash_w29c010_device; extern const device_t winbond_flash_w29c020_device; extern const device_t sst_flash_39sf010_device; extern const device_t sst_flash_39sf020_device; diff --git a/src/machine/m_at_slot1.c b/src/machine/m_at_slot1.c index d1856c70f..2cc76c69b 100644 --- a/src/machine/m_at_slot1.c +++ b/src/machine/m_at_slot1.c @@ -691,7 +691,7 @@ machine_at_m729_init(const machine_t *model) pci_register_slot(0x10, PCI_CARD_NORMAL, 3, 4, 1, 2); device_add(&ali1621_device); device_add(&ali1543c_device); /* +0 */ - device_add(&sst_flash_29ee010_device); + device_add(&winbond_flash_w29c010_device); spd_register(SPD_TYPE_SDRAM, 0x7, 512); return ret; diff --git a/src/mem/sst_flash.c b/src/mem/sst_flash.c index 8bf0dc6c9..7d3c6a0b1 100644 --- a/src/mem/sst_flash.c +++ b/src/mem/sst_flash.c @@ -77,6 +77,7 @@ static char flash_path[1024]; #define SST39SF040 0xb700 #define WINBOND 0xda /* Winbond Manufacturer's ID */ +#define W29C010 0xC100 #define W29C020 0x4500 #define SIZE_512K 0x010000 @@ -482,6 +483,20 @@ const device_t sst_flash_29ee010_device = { .config = NULL }; +const device_t winbond_flash_w29c010_device = { + .name = "SST 29EE010 Flash BIOS", + .internal_name = "winbond_flash_w29c010", + .flags = 0, + .local = WINBOND | W29C010 | SIZE_1M, + .init = sst_init, + .close = sst_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + const device_t sst_flash_29ee020_device = { .name = "SST 29EE020 Flash BIOS", .internal_name = "sst_flash_29ee020", From c81df8dfe7566a39dce2d8f014a6e23a37bea251 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Mon, 5 Dec 2022 18:43:19 +0100 Subject: [PATCH 019/285] Fix Winbond W29C010 display name --- src/mem/sst_flash.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mem/sst_flash.c b/src/mem/sst_flash.c index 7d3c6a0b1..5ad110fa5 100644 --- a/src/mem/sst_flash.c +++ b/src/mem/sst_flash.c @@ -484,7 +484,7 @@ const device_t sst_flash_29ee010_device = { }; const device_t winbond_flash_w29c010_device = { - .name = "SST 29EE010 Flash BIOS", + .name = "Winbond W29C010 Flash BIOS", .internal_name = "winbond_flash_w29c010", .flags = 0, .local = WINBOND | W29C010 | SIZE_1M, From d7c0889fe1f608a1b4b07287e7e23dcdf6478024 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 7 Dec 2022 02:05:49 +0100 Subject: [PATCH 020/285] Fixed a small bug. --- 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 d667c743e..5030d9ff7 100644 --- a/src/cpu/cpu.c +++ b/src/cpu/cpu.c @@ -1159,7 +1159,7 @@ cpu_set(void) if (cpu_s->cpu_type >= CPU_K6_2) x86_setopcodes(ops_386, ops_k62_0f); # if defined(DEV_BRANCH) && defined(USE_AMD_K5) - else if (cpu_s->cpu_type = CPU_K6) + else if (cpu_s->cpu_type == CPU_K6) x86_setopcodes(ops_386, ops_k6_0f); else x86_setopcodes(ops_386, ops_pentiummmx_0f); From 8b1d037670743c96fbc43af09a43b95249b8e973 Mon Sep 17 00:00:00 2001 From: ts-korhonen Date: Fri, 9 Dec 2022 16:31:48 +0200 Subject: [PATCH 021/285] Fix debian/rules having accidental +x filemode. --- debian/rules | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 debian/rules diff --git a/debian/rules b/debian/rules old mode 100755 new mode 100644 From 975426e3fcc80ec78fdad8a88794dfb270453678 Mon Sep 17 00:00:00 2001 From: ts-korhonen Date: Fri, 9 Dec 2022 22:13:15 +0200 Subject: [PATCH 022/285] qt: Fix status bar icons ignoring update activity setting. Disabling status bar icons activity was left unimplemented on qt. Prevent refreshing the icons and clear their activity status on setting change. --- src/qt/qt_machinestatus.cpp | 21 +++++++++++++++++++++ src/qt/qt_machinestatus.hpp | 1 + src/qt/qt_mainwindow.cpp | 3 +++ 3 files changed, 25 insertions(+) diff --git a/src/qt/qt_machinestatus.cpp b/src/qt/qt_machinestatus.cpp index 15aa51a7c..23df27150 100644 --- a/src/qt/qt_machinestatus.cpp +++ b/src/qt/qt_machinestatus.cpp @@ -366,6 +366,10 @@ hdd_count(int bus) void MachineStatus::refreshIcons() { + /* Check if icons should show activity. */ + if (!update_icons) + return; + 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); @@ -399,6 +403,23 @@ MachineStatus::refreshIcons() } } +void +MachineStatus::clearActivity() +{ + for (auto &fdd : d->fdd) + fdd.setActive(false); + for (auto &cdrom : d->cdrom) + cdrom.setActive(false); + for (auto &zip : d->zip) + zip.setActive(false); + for (auto &mo : d->mo) + mo.setActive(false); + for (auto &hdd : d->hdds) + hdd.setActive(false); + for (auto &net : d->net) + net.setActive(false); +} + void MachineStatus::refresh(QStatusBar *sbar) { diff --git a/src/qt/qt_machinestatus.hpp b/src/qt/qt_machinestatus.hpp index c2e51819a..cf706180d 100644 --- a/src/qt/qt_machinestatus.hpp +++ b/src/qt/qt_machinestatus.hpp @@ -70,6 +70,7 @@ public: static void iterateNIC(const std::function &cb); QString getMessage(); + void clearActivity(); public slots: void refresh(QStatusBar *sbar); void message(const QString &msg); diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index bf3ef4014..102363414 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -2231,6 +2231,9 @@ MainWindow::on_actionUpdate_status_bar_icons_triggered() { update_icons ^= 1; ui->actionUpdate_status_bar_icons->setChecked(update_icons); + + /* Prevent icons staying when disabled during activity. */ + status->clearActivity(); } void From a4b9c88695e489690da84ef0aaa73e638569cb4d Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 10 Dec 2022 21:56:41 -0300 Subject: [PATCH 023/285] Jenkins: Disable -Werror flags for building SDL2 --- .ci/build.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.ci/build.sh b/.ci/build.sh index f0d91fe18..54c875e68 100644 --- a/.ci/build.sh +++ b/.ci/build.sh @@ -1006,6 +1006,8 @@ else rm -rf "$cache_dir/SDL2-"* # remove old versions wget -qO - https://www.libsdl.org/release/SDL2-2.0.20.tar.gz | tar zxf - -C "$cache_dir" || rm -rf "$prefix" fi + cp cmake/flags-gcc.cmake cmake/flags-gcc.cmake.old + sed -i -e 's/ -Werror=.*\([" ]\)/\1/g' cmake/flags-gcc.cmake # temporary hack for -Werror=old-style-definition non-compliance prefix_build="$cache_dir/SDL2-2.0.20-build-$arch_deb" cmake -G Ninja -D SDL_SHARED=ON -D SDL_STATIC=OFF \ \ @@ -1028,6 +1030,7 @@ else -S "$prefix" -B "$prefix_build" || exit 99 cmake --build "$prefix_build" -j$(nproc) || exit 99 cmake --install "$prefix_build" || exit 99 + mv cmake/flags-gcc.cmake.old cmake/flags-gcc.cmake # Archive Discord Game SDK library. 7z e -y -o"archive_tmp/usr/lib" "$discord_zip" "lib/$arch_discord/discord_game_sdk.so" From 542d9f111702dd2eb0b4aedf1b088cf2ff206a45 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 11 Dec 2022 19:48:58 +0100 Subject: [PATCH 024/285] Dialogs.rc now correctly undefines STR_SPEED. --- src/win/languages/dialogs.rc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/win/languages/dialogs.rc b/src/win/languages/dialogs.rc index d32192397..0f74ef10b 100644 --- a/src/win/languages/dialogs.rc +++ b/src/win/languages/dialogs.rc @@ -1009,6 +1009,7 @@ END #undef STR_BUS #undef STR_CHANNEL #undef STR_ID +#undef STR_SPEED #undef STR_SPECIFY #undef STR_SECTORS From 7c6e390c951843b4229a70ac373796f85e303277 Mon Sep 17 00:00:00 2001 From: Alexander Babikov <2708460+lemondrops@users.noreply.github.com> Date: Sat, 10 Dec 2022 21:49:11 +0500 Subject: [PATCH 025/285] nvr_at: Re-add a forgotten check for VIA NVR Fixes the GT694VA and CUV4X-LS stuck at POST C1 C0 --- src/nvr_at.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/nvr_at.c b/src/nvr_at.c index f233e82ba..a881444c2 100644 --- a/src/nvr_at.c +++ b/src/nvr_at.c @@ -1096,7 +1096,7 @@ nvr_at_init(const device_t *info) io_sethandler(0x0070, 2, nvr_read, NULL, NULL, nvr_write, NULL, NULL, nvr); } - if ((info->local & 0x1f) == 0x11) { + if (((info->local & 0x1f) == 0x11) || ((info->local & 0x1f) == 0x17)) { io_sethandler(0x0072, 2, nvr_read, NULL, NULL, nvr_write, NULL, NULL, nvr); } From 66d250d011b7212ce31d0595ca3d9344dbf8b6fc Mon Sep 17 00:00:00 2001 From: Alexander Babikov <2708460+lemondrops@users.noreply.github.com> Date: Sat, 10 Dec 2022 21:53:17 +0500 Subject: [PATCH 026/285] machine: Move the GT694VA code to the correct file --- src/include/86box/machine.h | 2 +- src/machine/m_at_slot1.c | 42 ++++++++++++++++++++++++++++++++++++ src/machine/m_at_socket370.c | 42 ------------------------------------ 3 files changed, 43 insertions(+), 43 deletions(-) diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index 596972ded..052e55abd 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -681,6 +681,7 @@ extern int machine_at_p6sba_init(const machine_t *); extern int machine_at_ficka6130_init(const machine_t *); extern int machine_at_p3v133_init(const machine_t *); extern int machine_at_p3v4x_init(const machine_t *); +extern int machine_at_gt694va_init(const machine_t *); extern int machine_at_vei8_init(const machine_t *); @@ -702,7 +703,6 @@ extern int machine_at_awo671r_init(const machine_t *); extern int machine_at_63a1_init(const machine_t *); extern int machine_at_s370sba_init(const machine_t *); extern int machine_at_apas3_init(const machine_t *); -extern int machine_at_gt694va_init(const machine_t *); extern int machine_at_cuv4xls_init(const machine_t *); extern int machine_at_6via90ap_init(const machine_t *); extern int machine_at_s1857_init(const machine_t *); diff --git a/src/machine/m_at_slot1.c b/src/machine/m_at_slot1.c index 2cc76c69b..ec818871a 100644 --- a/src/machine/m_at_slot1.c +++ b/src/machine/m_at_slot1.c @@ -572,6 +572,48 @@ machine_at_p3v4x_init(const machine_t *model) return ret; } +int +machine_at_gt694va_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/gt694va/21071100.bin", + 0x000c0000, 262144, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_init_ex(model, 2); + + pci_init(PCI_CONFIG_TYPE_1); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 3, 4); + pci_register_slot(0x0D, PCI_CARD_SOUND, 4, 1, 2, 3); /* assumed */ + pci_register_slot(0x0F, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x11, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x13, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); + device_add(&via_apro133a_device); + device_add(&via_vt82c596b_device); + device_add(&w83977ef_device); + device_add(&keyboard_ps2_ami_pci_device); + device_add(&sst_flash_39sf020_device); + spd_register(SPD_TYPE_SDRAM, 0x7, 1024); + device_add(&w83782d_device); /* fans: CPU, unused, unused; temperatures: System, CPU1, unused */ + hwm_values.voltages[1] = 1500; /* IN1 (unknown purpose, assumed Vtt) */ + hwm_values.fans[0] = 4500; /* BIOS does not display <4411 RPM */ + hwm_values.fans[1] = 0; /* unused */ + hwm_values.fans[2] = 0; /* unused */ + hwm_values.temperatures[2] = 0; /* unused */ + + if (sound_card_current == SOUND_INTERNAL) { + device_add(&es1371_onboard_device); + device_add(&cs4297_device); /* assumed */ + } + + return ret; +} + int machine_at_vei8_init(const machine_t *model) { diff --git a/src/machine/m_at_socket370.c b/src/machine/m_at_socket370.c index d11dc0876..1388eec3a 100644 --- a/src/machine/m_at_socket370.c +++ b/src/machine/m_at_socket370.c @@ -344,48 +344,6 @@ machine_at_apas3_init(const machine_t *model) return ret; } -int -machine_at_gt694va_init(const machine_t *model) -{ - int ret; - - ret = bios_load_linear("roms/machines/gt694va/21071100.bin", - 0x000c0000, 262144, 0); - - if (bios_only || !ret) - return ret; - - machine_at_common_init_ex(model, 2); - - pci_init(PCI_CONFIG_TYPE_1); - pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 3, 4); - pci_register_slot(0x0D, PCI_CARD_SOUND, 4, 1, 2, 3); /* assumed */ - pci_register_slot(0x0F, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x11, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x13, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); - device_add(&via_apro133a_device); - device_add(&via_vt82c596b_device); - device_add(&w83977ef_device); - device_add(&keyboard_ps2_ami_pci_device); - device_add(&sst_flash_39sf020_device); - spd_register(SPD_TYPE_SDRAM, 0x7, 1024); - device_add(&w83782d_device); /* fans: CPU, unused, unused; temperatures: System, CPU1, unused */ - hwm_values.voltages[1] = 1500; /* IN1 (unknown purpose, assumed Vtt) */ - hwm_values.fans[0] = 4500; /* BIOS does not display <4411 RPM */ - hwm_values.fans[1] = 0; /* unused */ - hwm_values.fans[2] = 0; /* unused */ - hwm_values.temperatures[2] = 0; /* unused */ - - if (sound_card_current == SOUND_INTERNAL) { - device_add(&es1371_onboard_device); - device_add(&cs4297_device); /* assumed */ - } - - return ret; -} - int machine_at_cuv4xls_init(const machine_t *model) { From 4e4e3864bf1cf86378def0c698321218d3c780fb Mon Sep 17 00:00:00 2001 From: Ompronce <88358700+Ompronce@users.noreply.github.com> Date: Sun, 11 Dec 2022 15:38:37 -0400 Subject: [PATCH 027/285] Minor changes to OPTi 82C929A emulation Solves the issue of the power-on IRQ being 7 instead of 5, and removes the unused NVR reference (these cards don't have an EEPROM on board), as well as using the correct WSS IRQ ranges. --- src/sound/snd_optimc.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/sound/snd_optimc.c b/src/sound/snd_optimc.c index b54174ce0..5d36d990b 100644 --- a/src/sound/snd_optimc.c +++ b/src/sound/snd_optimc.c @@ -6,7 +6,7 @@ * * This file is part of the 86Box distribution. * - * OPTi MediaCHIPS 82C929 (also known as OPTi MAD16 Pro) audio controller emulation. + * OPTi MediaCHIPS 82C929A (also known as OPTi MAD16 Pro) audio controller emulation. * * * @@ -31,7 +31,6 @@ #include <86box/io.h> #include <86box/midi.h> #include <86box/timer.h> -#include <86box/nvr.h> #include <86box/pic.h> #include <86box/sound.h> #include <86box/gameport.h> @@ -41,7 +40,7 @@ #include <86box/rom.h> static int optimc_wss_dma[4] = { 0, 0, 1, 3 }; -static int optimc_wss_irq[8] = { 5, 7, 9, 10, 11, 12, 14, 15 }; /* W95 only uses 7-10, others may be wrong */ +static int optimc_wss_irq[4] = { 7, 9, 10, 11, }; enum optimc_local_flags { OPTIMC_CS4231 = 0x100, @@ -68,7 +67,7 @@ typedef struct optimc_t { sb_t *sb; uint8_t regs[6]; -} optimc_t, opti_82c929_t; +} optimc_t, opti_82c929a_t; static void optimc_filter_opl(void* priv, double* out_l, double* out_r) @@ -334,7 +333,7 @@ optimc_init(const device_t *info) optimc->cur_wss_addr = 0x530; optimc->cur_mode = 0; optimc->cur_addr = 0x220; - optimc->cur_irq = 7; + optimc->cur_irq = 5; optimc->cur_wss_enabled = 0; optimc->cur_dma = 1; optimc->cur_mpu401_irq = 9; @@ -424,7 +423,7 @@ mirosound_pcm10_available(void) return rom_present("roms/sound/yamaha/yrw801.rom"); } -static const device_config_t acermagic_s20_config[] = { +static const device_config_t optimc_config[] = { // clang-format off { .name = "receive_input", @@ -455,7 +454,7 @@ const device_t acermagic_s20_device = { { .available = NULL }, .speed_changed = optimc_speed_changed, .force_redraw = NULL, - .config = acermagic_s20_config + .config = optimc_config }; const device_t mirosound_pcm10_device = { @@ -469,5 +468,5 @@ const device_t mirosound_pcm10_device = { { .available = mirosound_pcm10_available }, .speed_changed = optimc_speed_changed, .force_redraw = NULL, - .config = acermagic_s20_config + .config = optimc_config }; From c6de006c249730466a9959c6d105b3c69de951a7 Mon Sep 17 00:00:00 2001 From: Ompronce <88358700+Ompronce@users.noreply.github.com> Date: Mon, 12 Dec 2022 12:36:16 -0400 Subject: [PATCH 028/285] Minor changes to OPTi 82C929A emulation Corrected typographical error in code at line 43 --- src/sound/snd_optimc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sound/snd_optimc.c b/src/sound/snd_optimc.c index 5d36d990b..eec718277 100644 --- a/src/sound/snd_optimc.c +++ b/src/sound/snd_optimc.c @@ -40,7 +40,7 @@ #include <86box/rom.h> static int optimc_wss_dma[4] = { 0, 0, 1, 3 }; -static int optimc_wss_irq[4] = { 7, 9, 10, 11, }; +static int optimc_wss_irq[4] = { 7, 9, 10, 11 }; enum optimc_local_flags { OPTIMC_CS4231 = 0x100, From 07857b7fd1b0f1759c05adb0f1a907ca1cdc72a8 Mon Sep 17 00:00:00 2001 From: Ompronce <88358700+Ompronce@users.noreply.github.com> Date: Mon, 12 Dec 2022 21:18:06 -0400 Subject: [PATCH 029/285] Minor changes to OPTi 82C929A emulation Corrected bug introduced by earlier pull request which broke WSS audio in Windows. --- src/sound/snd_optimc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sound/snd_optimc.c b/src/sound/snd_optimc.c index eec718277..7a76d3258 100644 --- a/src/sound/snd_optimc.c +++ b/src/sound/snd_optimc.c @@ -101,7 +101,7 @@ optimc_wss_write(uint16_t addr, uint8_t val, void *priv) return; optimc->wss_config = val; ad1848_setdma(&optimc->ad1848, optimc_wss_dma[val & 3]); - ad1848_setirq(&optimc->ad1848, optimc_wss_irq[(val >> 3) & 7]); + ad1848_setirq(&optimc->ad1848, optimc_wss_irq[val & 3]); } static void From d11b901a53e369cbdfdc781f37c32df0d04106c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Castell=C3=B3?= Date: Tue, 13 Dec 2022 14:51:18 -0300 Subject: [PATCH 030/285] Add suggested new macOS icons --- src/mac/icons/beta/86Box.icns | Bin 169574 -> 315191 bytes src/mac/icons/branch/86Box.icns | Bin 194973 -> 309676 bytes src/mac/icons/dev/86Box.icns | Bin 217773 -> 317326 bytes src/mac/icons/release/86Box.icns | Bin 196323 -> 314012 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/mac/icons/beta/86Box.icns b/src/mac/icons/beta/86Box.icns index 0068beeda30c9d8219a71b4467cd5e0dd35a9e6c..e1e78daa7cc05da5b0f53aa1b281a995c11682cb 100644 GIT binary patch literal 315191 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

LPX4+1T?uo_4P8oOOA-_0uWyOHZFZ@BKMzqcBqX zYH-l{z+C>izy8|Z&v)g$?8O!wtkW^k;k_5C=U^XSSyyYnKD;hseg3Su47HsrCU6-r z9!S0rp5WA6&->`Ay#3l8@@<9QuaDpIxRV|K*9ru-9^)Ki9cDwoi5!+2^dF>SNI0C5s!l57_xa08M z!r%J4_-lVmzq@^3ZFp23^Oq0D`GVtg@+!Y^v42mrT75Ov|0ks644cV3gJH#)wQ_%) zyk-7mKahLf5---Reg2Tax;}t zzVE-#_w4t->t7m5y~$>Hzx=OFww?ak;MFmit(8Bu^ks}V17@rW5}nDg;>ugSx{bmT zf3gkM`)RJd@X2(;_s3e{kz#iL3ajtbzWcnc$|JpSKoh{ zx96q9t$Dnc4$E8j&R@Po{##e{%>P=cN)4V2^QY|KG+;bXd_mQKx%q#=g!>g?Z!3HM z?fDh@eD_=Sz1q6>E|(gnK!OKc=m)el)S4d%4Uc_e_viL~ui4T5^(GItUlR>qu_tcf z)SKG*8|F`+FB|$HUX78~^`hnnkozpSn9%AT-(k3sy?PV3)mn(s)a z@3H*b_CH;GuiYy|xu{^!bU^prar>&h)vxRSzum&i`z?9lT&JI1$DK}Zo_@7=@25}6 zrNy6Tu$)-BGKNu@Ve0OuKgDA%J&0%icBAu;(b4MGFtPuYFTMRrcbEU)-D z=6E(V?hxB%B+S5Foz1>`1E|e-B7FIjzSg>VN3H9xUCVkWs$bt39lcveH#)4j1<|14 z@Civser$io^t#RQz0ddlpE56;`OlsUyOuTXd9`Bqsqe2>_$-WfuY@F}Z3XNGj2jBJ zmwe!!)p)Qz=R&^tqJ#Bo1?!I-F5hw4zn;JTUjB#bGlB@?lR;^<>h<{@@fELsU%FFb5H&Sgwr zRHJTi`7r3bS^Ks=F<9cyZ|3^f3)p_u#Z+=-zvErM|3vP+KhL&YS{3@F6<%mJ95}<7 zlk;cx?{nqz-q!s!-#6piS+(>0%3cur2{gb)Ie%{oy|IeQOF0DE?ljX(9%^O-F zR@5dMoBa5$&U&l4ZnliYvl*h_dzSwfy8r3^@3^2YxcLUgOxt(K|NEf&Zu-4%7q__o z(_`TMCK}cL`H|M<3vrdrfA{=(vw{g!k1}K)TxGzxA;EmhiKl07Jcw`pckY8>|Gl?< zRxh2`g<0=CVH(JelvX4KZxoc@`>6L_dw&~zo zh`GP-pq2gO=KpVI|BL^->iDj=x9`u6yZP+ky1rY8^ucjv#(`tM_U~9<^L6FB`oHJ4 zUz+!n_s`#&-3+`h4qwpUyyJgRtbP6hi^&Ykg=ce9)fk?AyT*I%BPZ{_t%vgGUOrV9 z7xVPyf%~uiKR4fVX6@S8dp6hl9wSF+4R=mX%;Y-D2g0-B`6TK@4#@w>7FchyJI~&q z?^JM9V%)w{zuSD6zNpUn&E>;z=CAIXdPZZTAJ?BWw7zxR&--V4{`%eC@xMOjr9OT1 zFWi|I-dJX2dFJ=P{au^%yqEWWuG79W@3zC<>n;tkbFN-&u;U5MOZ*XZ*I<9aEYF5R zA;pmsIU9EF$vtXq`|#j?`xD#!qIP{hU;A$JGr97I`8$>_br;{Sm4!6%ZcxrtzAHMf za^~;%`@dLco;N+v@5^$db!80mFM|+S?!(hxwf$_p?@E^cec~Rowl3=b>V<4bwNtVFhKG5(-#)){{{JECOWGgV|JTJZS8#t#7Jv6V z`c~Yj(?M_RKYzMyT6JUw%Zo-D$g z;gatdE+pLN=XK6Js=HNj1_pJRa(AX9~J)L(zU`+NNZq3?I!-a)33Q_9lr2ufelhVx2baT)BV! zt>1SP+jW+oZQCFJx;)Q*%VzDhJ6gYO`V$oI!!+fT<{O9D3OCxc|`eg^wy&W-v(fzjld|{do5I|Mr9L^Y_xb{Y<^Fg7!7B_M%LV(Rk%{T_Y5&6Ym1l3W&tSRm{zGDhdhopZ zM-lVl?-|=YvRIOSTcj_%fwSS`ufDZk4fnqM^It$CFHs_VUhCZE|HbkfPv8B0Z~t_@ zfA7t!ugQC*(Lr??N#sy^^{`;N>0|6{{f-}UYlLMl5N4oqNLJv;7Q-2YwO zmlvD<2$%S$_ip*ylxf?hA2PV7!E=kxvZ4_l1fU{EkvbYPlpe&PDctCKH<-P&KBzJK}a@=p;N z>RW57HF+NQ9$FAn+3KXm$YppoL{*I;?N!;A_h<jsBlqKlx{6m-ZGbvHrg$|JYx+ z>i=@xzNKWIlq#ZQ>%h<$#3EFF;amC6>HD6n*|PQA{e!pnFaNE6>HWKD%kRGy{q@zW zv){r_b1A<`P)q}7!=td^^_GujYkynz{jP%ugi=7u9IuK#{5(>Z{c1Y`AS>Z|2*3guz&XJ?_Ukp)@)7Aghyoyx6%QY15I~M%sKtx{+(5i zo@;^Fi)C;Lq&%h)s6cJn7Sp7D8-qd+#j}=!k|Nrp4;`N;W z*87)w*Y@rxh|G%5(9t`<;&3N5t;oAh_$6=t_2oO9o<>@ITl{~+l{?1szLkZqo}a{y z8XTG&Ik&%sm7nbP^FN=nfA{wK@c#dL>+io`yIAadeB!NBNtOQ$cYd67Tz}{Dg$Wjn zY7A|~vrhyn@2jlZn;H77UF`k$;Ntc5Z;$3xK3yry_&^1z8KN*jeZwO@>o?8s4sm~9 zCiojM#DwkH(!2ABuZH9{nyEV*&k0`U(vc+e{L>XoJoq@sQj?| zj_~|~kXxJMn*V($|9_+P$79y1$3KNklb*I`!^~XcZ%?n!&*1ysEW1cI~zf^abWYsO0C_&0E7+WO1$ zUFG>&-&@MR_r~qNt-a;`_rvm~agUi>Pklcems+>Cui|9#oW5bH&c-``-lSr9NF* z#sHhc11GW>(v7Oy^WRtB{ri5u>D$8fSL^H7EZ7m75?7PQ@FHU$gD}HSv(HhF_9y<$ z-tZ^R{_TH@n1X`~^RAyO|G|!0y;%x+WF6n(9{ZsF`_lO@dKVoDA#1ohl-WhGYBXpmoGT&?O&Fa=~GFR>>>sy?W-SReFz3k&04yfC} zoyueC6I7}%aWx}Wc@n)+1M`QH>!J^YDR;?tMC_j0s0 z2NceAtNi$3$>e*p2X9?5sbTd>EeG?%A7iqTT+RT5z1iEz^j3b%(ax{lDhSzOVI_KPQGY!sh3|316qj z;Srzpm)v*rzTcS>7r1^dgOss`NW;>vpB|r*wvZ{3G5Jtwu>iFCDsOVLEw;X73H$)X$fa}_*Hj-Nem%k>)yZzjKr+IRGG+}=~4 z`V{NEn0y#~IO|Sa{#I4I@{H5bQmLm$4{tud?~Lln#8o~hr9HRWhHYh?)$fYm&5jGL z@wqTpzv0FWr&Q;5RlN?ryX{(XCs+=MysPTuuU>Dy`2VqOtG`?>yTAF1>v{X5YnRRE zeuUIrV_@pm+3@6D+4lGnZSAjLlyYq@$O&iU2=J#0_1R9zPh4-bU+$wOw*jNUQ)z<( zFRS;i{A1KD{&S`2y+768|HW+n#}KvO!#zUcZrt-XzY?9vFyn)8z$0h5eLtu0tv~VUvAurn$;os7x;LPNe~5F!@xK3$ z?9j#TG=P%XmJ0|NmC95cPIU= z^xh`q>{(#*dcS=5EvLO}=3JKn4YRnLufBQpgYUEDf6Z4sy8AGAeo@oyEoB$~#9G-R zMq(Wp8iiQG?sTgExxQuYyNyoM(wBEkeR(Bp+V@wXVzy}~S}$cpr+gDjU|O*K{1)%( zy_J8Ay4&rqeK*kemaqTgzdZFcTG|Z>NXY#8@ZBSEJC(hke#}rj-G4Bm_P^+|zebOY zK_yB{o`>h=sE4z)eO_nj*#9fO_}Rbo^l9-GO333693deOHXOe9;%}sbwEc}A26lZJ z&$&;(db+o2s%yVy<{pvU*=M#f2s7k%M|OX$y8I(m?EUxT@0P!BRv$Tk=2q(^d6Y7w z$zg9@&@S!+V(hs#f_(qhI!mQT#OT|ffAlSA#?l|k3ocdF= zbn^#Q{kk2i_5UuZXDCEAZN-KI>tg@klr8G0wb@bp=7OJeUwoLz>Ar`i$)L*e25)BB z@)xs@)+@i7VW97we>13jclrP6H}}L;p(Ooa!4+5Ey_@&-jQaBDef`Q-pRc-J-MZ!I z+ocBHydU#DxtBZ7*=f~oz-aKSI`)$D8uQ8WT6y6KAMe@g?|8wvE^PPn8T!+op_D}T zShnTY_gcT(v31Msy~jk#Lba}oM%}9a>ixU4(;qa$thwO3W$KS*FGKIvGi%+Gz4hvU zpX~Yy@Bin>u<87!8i? zj=FSswfSWEXM2Ap{p{TR;-~ns)&Gz8ehkW#LQenBA`@Q{7`X8SR{cdq3H&zpXk0wE}2U!l8(PTZY1I_Re$aA16lp-E00j(&_O|Mf=c^N zZvC35sFdW+8!8R5SLM>TJf4=XudV$w^paDSW^Lpaw;2pG-de9RpD6!q@5@6qySJNu zKO{cqc~+_2Z~NQdXWl~|&#i52-nRFO>?ZGeK?O6;1%;kBt{d!+x3Zb{r3KV;6#gQx zIqc!=B^l@6?D(+!Z`$3hucx|7FOoyffFThIE8mu$uQ=wvlm}Wv_}NIwV3Au>iFz9?XlC@W)1UR$vx+87XGwvmnrHDpN>)-C|rnM z5N3UF?*rE7%cg!hF8R@D>*|fYPEUnlD`u2pFU&s5uPgWO#=^w7X?3S2`%An&0j0XF+TfgU>`Bc7o&Alz3 zt6RUI)ctDu3EZ9MYuak3?D#%IIWF(-RfqV8Pu4dYyMao#O+520kLZN{Sk|%huT8i1 z+KTjwXOg?`Ec5;LR2FGr0cd~9LDqL=+r^i#m-ZRo%FOmpo^WJLGKNI!bWBmYk+^Xf)}9`(HUf~)gRPkY`|V`u^n5Ev0E z7E!o-?zc4}4v+ix1h`4fezJ6`zlAHK8pE=V`;V{un|-`~@k@cHkx?IYYW_UdFYw&t zE{f7vU}#*(vMr}>)$Khy=gHl+e3r3%ZRFIS%Qx8kzpDTCx~iQUqZ-4pj@!#$e()6t z>z^7uuWrr0M{hqokoD)5R_X<{FJVsM;L(|IrO#(S&xbQ#c6_T?e7ED%l*Li>5x zYu=IZ>qI#0fD_l6HFH3xB)^?xI)VSV#-k6Xr@C9HGO~4FZoEF*A-#WTa=yY+Het**6O8xJr{fCp-k!SuGm^gTJHcSRpp7*I_ z&ZU-Qu>_`sGY6bauJ)Cmul#m0bLqQ6k7?=0 zqi4p|-T8EA%PT>@hz8CE&gSLIx#jDYibnP8tdsY??fvrIhkxI1KMM;xcXHK7edJ<7 zAz;&ihwZU5w%xE5%Y1&5GxXj3JD71>vK>u37h zuP443g}Lt$;X@voVq|&5H2a#|V?L`D^Tf6tSA09`RB+!Vu~$oX95RT{JY>jaz-Zuh z$K&!}xiW43`ZbcW&!=nJd*1IblRl0X&;1UQ-jw-QJ!-ym%v5dT=Od4#cK0lo-(oe1 zL6|}Lm zW_9aJo$Uwq3*TsrT_FBBx|Orx=FakmvkzQ46}-o~=E2E+&)2$V&!t`vMvm_YkH)K4 zKi_@We%rl&_i@#^$>Op5ju}_Jtox~@uH)Ij*&wLEKBx9n^^ddw>12$LS-ZcoO&4$f=+q_hWPUME2$ArSH7s2I;k9cyJeMrZGMAq{aOzWBWoqTm%C{5j zTNs*;D_(drfiZpVq4vnk)?T%>H=p${eY>>8=FYaWY7B@4Yhb5M7W9}D`>xa9LeqBU zF{6zeyS}q>mi?=vE zEpM~tPy4-}6Lt9FB-fQ!<>mdAUoO7%v_7seH}m!6Q@ZP>Km9lhl-`^V@c;Pv-|_qc z^A;!TxcoU~J9brlTfiGEk5V*gxIWnNSZ>y~#fIM1b0(Rt+v2x$%PZ~sha%?1`|WXQ zTq<;X(aM9YhuUL7Gh3b2hy3Thm~`u5^ZY(#0f&S*)_Wxhdl$b>p4ailLY$MusF7De zz#*ZH)ofP&#nZ3Xyg&OPH)_qg+?z#iRgUr=^*MVM8Ft4mKKj+3*FG=xpZ0nk{rmRQ zeoSEcBc9~3Ly>=TyJbz}yt+R|Pc^p~bz7G|naH2l@~0V53NkQp_&6t2{xsR18*OX5 z^_cd?3suv46OUbR7jt2APh~&wAgx(u;`a^DpGM!Vdi>*gV4PUq%|qM&|F$|J7?Hpj z_D}rBvvW6>W|kJ7+vQs>xMEJjzx@aO8cyB)buzwSQciJy^&QW5+v{GxpQV0%hHGu$ ztup3_J8_9Nr=Q;M(}yuEk!`TwP^DE-XK!Vyt+CuPg; zMBQrqR_zSN6TziV;z?(bPdl_}U)URoO`{mZHm76c8Ry83< zgQ!?UQTp7&(csl-N@$v;;u-t+Fu&*%4**B*QRzt;5;IOjtN1KUR5**Q!KGKVATr!3!>S+m&W zp$N+jMgzGod)lq_EI_w*TH;0*$Of8k;`VpR;_fb3wFN6Ku#~jxSL^ z!>eyG2CO!%@BMSreB}z+f7egnE==O+(b}-5W>fU-kn-(!_suh#+8h07;ajE*yBTX` z8K=G5YMpT9USW;G0lo%?6fe)cf^WW5UHTJi#jaFgH{v5G=a&UL-+HK+N z0?2bE3{1v~8!9*NTd~Ks?&SL!uby0AkdnjnhCyS#+55(K)AOG`?Ek8FdiQhN_rZ1H znSzWg%M>rs|Zh<(G=fL_0LdGO$iK7U7!TcSG}!d3W(`{v;-aWiBXv z37_xT# zhKvfjPAty?7TjO8KUPTle{n_fOCu%@(2R|N_Wxgd_Se6mAP~#yt!*AOy zbvutvJ@;t&yj{kBnGPs(l}yzFr%M=d;0f!toNb&8^)kt|7j7Km|69|2+xvK`=0Dll z4DyT`)5|WfUtho8y!ETc$2EWKzF*6U+PQbBDT{!_ZieXp$NkQ5g1QMiML4!=@qccu zFMF8tcmC6@DoKiC4I z7V?Gdl9emD(5a<@JRil#lIEANvTo1qEhmpnH|xvnPrX(6debLex$2cMiEH>Ol{q#r zC$Q{MCz+O?yXn5mzvh#4W^8YM$&5=;FSl=bwCb|9PRM+HrZ=uLrfy_ju>Yb(_Kjwl zeN&cS*!lG7g`E{5tct`RTT& zKfNw3W9WHrchQJxDc6Qi@mlJ=piU>Z@_|$T58d(7TQdE?wp{fkN9*VPJ96AKa^L<> z`Cq4ed%X9Y(@hShHw-VD%@4#gTyVa({OG=;S;r5l{5|}jeYeWZYu`1rz{8Vp;<89Y zEN?kOM83(skJZnfr#_b3Kjp^_kbBH-^|k$Fzr!`sF)(W^xO(5ulYQsZU-{L`lQ;c&`gHeGSsy!;u7E)>({Y*Fkj?f|*H=_O+;RMT z|Iw-L5sMgv8B~+_E`8(3`6ha%a}&9knbC*IQU`FkWD;X|QL!v3Tk_ z_Pgs>n>YPW+we)}|CY;q{*O=pV?=9g&J>M^1ZCwK;bVtO-UNlXgK~;9D5r32QRLgm ze!afp?~eO1>HqfCy8i~XR1@E6!=G z4fwhDkmIXwS<5%2zG2Y#f9>_ckQwD{+SmJE{Wz}jaz2BN6R7iGV9OZxZ+ZIpnSu@s zjgevrPwS_>=c}DP%OU9Y)3Wz*h1X-tt8cOQ=Kl#uR`_qtpyQuuZ@2Yy#1-Mqpvo+a zzrG^vY4nVv)2F|+MsK};R+_Mb{my@b^_!)hS46H|5r0jNeQQ^H_mnTOd57oL9P3YF zKk&l*M198Zt;=?Cg~n&LPMg1Dsj3=-ic7}<5f*6n2!0{D99%HXSmv#x{n@t)d+SBSUhco|H}Th%mx>4Y8sscgMSk+HmhU%xJ3ZQ_@T=5) zMuEvn{EdcOU!uQm58nLA{+P7GWe$ag13g?kn?KdxOr2gD%L~pSI*Sf0^Zn+e- zZa6LL&As(__RbeS9+gkxY?xDR^Gv_*!+nmrJ5`hS2KL!imHS;kft=SFS<=E2R?79I znmjvs%_kauk+bg1Tk&>rTFq|)}FC!-Nt#&yX8JnIep;q}QP#%I zpSjk=X#WorT4tR+S<16PmO=TWY542ztqX7Jv|4#(wnqN@^l8K9w5;hUGY$eXnjC(m zK68I}d&;~U@{cvvUHJ9%`0@+qU(KB)%kX&j^SyFu+L!z9H<#VJ6!hb$WS#9JP>aFg z-l_ky?|oS&82zjOT)D5}Y^i_OKlT4ATgI6DkOy(!t*+GmewFWX`c|@H{ZsqpuL^E{ zTl%i1-gmpKHN!67V-qiD8yz?&K23dH+SLm`WPEUpV92;aAk{#Y&ULu#n{dY%w#H4>4Bh(mb1RrtqC`{P?D&P0h z%>RN3mLiNS0xK4Pavw|0v;9r{Ow;egCsbCphkHJjOU=|td1!E-+2Bo~Reh>+8H3Ne zYrpyT%7^n?eV)|9$#4?2?5^R|(Y;x5?3l$ri{t&r*B#gY{&?fAC%lRWSR7c+?lUav zn9dgzv4wMgo!I{Se{;62iQB@6y!g0*fyr1kVEu1vhBev$cBC)c6}9x-2f>D$yKi?| z|Jm^2tWoveCGH#{4i7fZ|C__QZj!glf*A*X{i@p7b;T*+AWM}l&sVKz12#SO#)GWW zUi~X)_|aT%zphNzU!FB!=cQH75lx_`k%PI6Q~sfYUD%edxLVO zt+RSFbLL#OymnGgWtw^Ubc=r3H1-22@1ou?@_)Yda_iRI$uGsy5#cZ4(h&OJam$M6 z%*G|#OpE@$HT17eI`AptZGS?qa&L; z`O8N$uG}BFjPu}5 zs6y~yO#&l}pN(P6jVnwmoMM+;;+pCo0h(h}ZT^;du6}`N_zGv?@b$T2O=#KNyV3dk z4`GJ8kLT^&v*PDF6JdtQ`|H0wXy>m_*PnDNDxFOe*+UKq=UB}0?_GIQc<;yZ|2H)L zPx^f8jD3^Pah3x)HY{`b^C#(?ciRqbBp}83k^{?p%@{9OUVG{HJ5J}ufd2$N#PrNDrXe>*7TSpPd8hCH<4+<9c%MbhqI2S z9alf;we#*G*f}4NQLBVQOxoHH%V+l*#my>sF8;a1hvCeF$ zeKzy(>Bts6eceN@Q!05qjkcw4t~gx7vfxa#S2Uzmp)=*cv14w>zxKQ?pZ>u{R()=x z%i3vclh>|a|NZUR9X-G1&EVn)iA~5nX~#6dobS}>^}B9Gte-E-ko+{)B<{(3!Ltj@w&DGG#(OKu;X#H{R2;-y2xV%=?^ua z@fK0Rxb{kT?o{jir}5UzPd0tvXAti=pu?@B`}MargPGo@`RCU9Zm#hyzGq&>z*Ej# z&Hv!@?JLZ3s~=9+J+6hcCk|x$nTZY-d0dx^OEkMLhL$n-e78GxkKtQ5!w;bYFYk$; z>pKv`6;t_iYVpl{D_eagopU~q{aEF{=a)S6&94e}5C3xSdRKX*HRCzE-*5UppDA|Q z&9rXEqpoAACp^+V*W`YYZJa3X$K3z$tA}VBp5<#0GMw%Ev$@JX?u}2o z{IU5AI%=-EP~SnKB(t&aJ;R6NZgqQ3h_2XoNa=Whx)P{NOkEXuyL^q$*FSSmt5yx? z1!0%VXB!siAKu(z_JhNLvqRbJ;?J}dSFJ89o1J^ep|Ifw)2&~-Z-k$`s@UM5&zO7l z`F{4fUbnuzf3Btfo}1LK#bz>AyWc-`weS^S{ApFi%=Y{?7CH*%yBO)D3K6V45n>vGz-B+0E3c zJIeHg8dq_*#4~B|zh(JxCf#oFnxMny>%MJXx-C2``InRZ*6%O<>!U8Nn=tjio{*7% z#CnHGNB-@adCZRM_-*#6_W}v*4(!KuRDN7K9l3-13nOv@b`wp=F!2 zoN!h`L#N2+zSXz;T>qY=&+a^!b~|a(#y@ZMZg0z*nc{ANHiahExa9G9hFhA43Ik@y zd7Ec!(LKP|uFaAZwcCAJ*!$(_^!R%mKf#+A7C?;Ik<9b$xUSD{NQQ%C69a1|&qwd`&Pnq} z*2Ud?6LY%hON%VS>Y(6lQ&RPPJZtB2$81zVuwQ7H5pY%G}u><-*og*RUk~ z+CC?8^~?LrRiIo3@`ka7K;GZ$+v;Dh+V)S||D{qq(~0>(a}Lh-oi1=fe8a~{e=8m0 zR5>;8B;VxryN6eN5VOl2o>4OyvZ9Z)gsp4JScZ>>QvMB5lFKZf{bhb zxOe?Z1C>W>omoKxQ-Z8F7!CIBe&x^e zR6&PaLaU>pCp@J$I3&iY3+m!8y~JI>c&=OCr>8olY>En3W)f-EReuh%Ju3E!wjaX{$RDd%*^2aBIvnN4h)U0LMNi%Ztv!? zfBybG1IOuzpYbb>H+4HQG#Y}&tbI0^pbji57))r`uYKTAUDblN6*A%p><)KYV-Swj z26&&ie7?zTKUH07Pta@PeD7~WrS@_D@a2w%g;n|#-e?lT(9k#R-T#6I>xPFtW4>K3LDdv)Jrd@(+#!5`{>M8WsdA z{JFIM#<>GTh z!Kn*QEHGkv!!ToO^jwwGo3E+Yms|rLZ7R zC}6BNtxHZ`e6iuvl(5yO!f)|!J@x*%=DPErwbuq5|MB$H>ry>gfAARo1kMf22dagZ zeX*Z#&a){h_v&k*K$tnO5cU#GV0X~$VK%*F`9S_ffEGN#UKYQw$aCV<`n9*RkH+l{ z-*-uDRjmE_NAv%ESuPz}S81)k##f4w<(Wf+;l(L=Le>n+Sk7l6H>W@r%vi!8%rNR}d{yP_-lG(Gbfhyklk!O9ImgR=0Ck|4nQ9LH%T>4|XEma5k8pMwFxV+lB*7%a} zuEqm*IR9i={tGwRf9FqeXqn@8AFJm#@@ij47q9=^cvk3t#r~oj)29AC{Brs4(2nUU z1@Auozn78uecxWytv7C-DGje*KJnwq)qQVu6j~XWbQ$ZH+Q$6U-z2p@v}WzA?NWU% zA?h~A-aD_o_VfN{591VYu3%w$!@%L7HiPH?deLR-H$?qV)+llKxHc4CV7Ymd(ZJ%H zh5Ushsx_Ps9&B$>UZwEiyZ7Aqe!=M4^TiTN^49cz__0TpvFr`A{r{hC!mEVkvRgy% zsV*M2>p`Dd?p?fvvO zVD+!Mc}J6fM!gK*?ZrNO$Dw5&;AHVdFysI9J^rp;>M9ddd`|gv%(@JZD{zE`3MFi? ztS-0y9d-BSYjInr1TCh@`LE}DrO#6DUHhv2FX!tF_lB#dZ>uh_vah?)eCXLTy|q*8 z)~zK77n2$P zo_FMB5%W6me@^|5rno0g;p_M93VhpF`&%k;#x|d)rdmt>e_6HKDz#&~Y)cW!Y$ z@M!ZMZH4@)_kY=*om#hcU$(2APxSv&H7{-IW}muT&ec-;;5T!P?xW8d3*IwdIJKvY z=|z;>uM6#3x3~^lZA>nm^J*2}{J;5zLZI~TCX~Q_z@z4|g~iK1%QhFzX);5}HH|j~ z6F!zWeQ)Ay;B*wX^PQBV6*IjH9J)w^h{ywF2G)fu+8CG~3rjrd{&z_C&&Igc(nDM7 zeImq`{oR!qBQMYKx!w1;ozR6--2e7GxWE6YZtvwepDx?mzIn-J=NDhKocZ*vXYzUd z{Flq@p1!=}dg#LpgS)GFb02>14~$#?_|vIF$+g~doAr6lTvo0RV_CQ7)2VgqGP3_2 za|;i=&m;Rfe9xmUfAdKjjrPkGf=ZRfhoCZRPIRPuX@05aq^+Bzmdk>~p+z7#^Qj!* zWAHrVHACgj!H*7`}cTk?Yz#pJ~w&BT5jR@rr^UIPJu@0DyKDXxw7|@{fUcLTtP(@ zs6YZcQNSU=fiY}0JBxJnSCyMq---*ESkyEO@>l=;n!PUfrHn<1zqVb@k@%nC(i?52 zK5ebs&Gtu@v3_p(2Zo=&a(*eyf6pI&jNRgHOt@~*-Ke|rPn=47%2<9J|MZ->miJLA zcgyO>hu8d>epme#c;B~1c!Mm%)2dab^{w~&SI^%;6A; z{CPh5tX@&);WhhS&v3lef0g$(=jF1VGS(G7nfv!{(9w@wVtfD6eclK2^~J7x6|Fh* z>Cn{Id#aS5wrhX(;=h>j_So!b_qFnS_KLpm=($kmZhgyh!M7>zR*3i?iD|znDsa!f zjOEDQlh6oj^kXbzD5>(%zWPtXVN%Y#Fm(&m^*#*;9)VWlRDa)QR~@^^9V!2SiiXdi z5&N{~eA~(y&-l%M!O7Ihdg|V<`P+5lqF;r|y-rwfbX7mdy_B8vaM|H4Tc?)uZrt^7 z=V7bzKZotNty*LE>5to=dB4Az9@78+I9lo<>-xIV)qeXua=NSbC$ni?-&Seu5&it{ zo;k<19F4#Idumwe(`YLl?$24Xz!hW*u)|{lV*dR$OXb?Ak}aE5r1CUPsu!302Pt&y;;H zzk8ie>%pzt$~acs;dbAt{%<<-Cg}sts<18Byo_ZG9~3}A%z;D%Ffx`g_`Fx!e7C;p z+nh?5#<Ns2 z`Ab9eXo5~JS!e*3F3Yq{VrIiuGr1pWv2G{3oWA&;SqiDiQd zqzqoMfx((VtLF3064ZjL@fF7g<^-efv#$O-X;D1QkXt13r@xt*Rn^9cA{BqGZ}#`O zzW@8*ZyUEh`aD_sdhBhByv3F8mMrr>xPA8N-rSP9DC?VhmxqSF-DWgtjsL?{HLGoU zbJoabs7!uVx_a-rZENy2@84?Mp61I^o0-B^X;q%{H2%`*v$2fjb)W5}eD~DkdMnqw zy?uY;T=l=@KSS5&9LfIwOTV{Z?@nQbw;^H2_vfFwyy|OW^=7MI;ZLXi`&T|?cI(-) zEb}`zJl4Or+OgTjw>5R`)UVHqFIp%(ugtjmHfw8j>HhH8=krhB%3AjK-?!K4YyRH) zYM=2X=kJ8My#_gpCu&}IJM>$9ld*%f=?%^YmV&S>cZlg|{b9X3Dx#18Ln;dru7QgG z?DCd>3I@$gd&B;H-X$IVGk@)e?9!b(i)tQxI4pJc%db8Ee{H>P@+xC%Oy=n;S-Vf| z3cEd9`+G0jq53AHwHwS=v8Fy;__C-zJnRPh*WlVM%u&0UW?jFs>hhhP7cTyvV|V9g zZ+_bIX-l`xe!64#EbaeZ^^0cKt@$p_Jg@wvxAa!~5AWhLTVkylXXTnQ&2`rPe}A`? zcIdwN@Q-OT!wy`YeMRFUSH-l9bB^ZW-*<;yC=UDk_Qu!M`)8YOeBa@=$&#j;X|#|zfzueCe!OXT!tsgL&W?`Nr(-Mwen8+^Z_Soyg9zKMdjB`@3& zT`-p+D{F!*qg5NM^j-yOk(|6&{MXLz=H?hUZTlzwGr0bjk;DJR3~Sf^`#1gX(pu@V*Y&SA&AR<0`u6wYZD*rvbLYleKFjbf zTPi)%^?&D_5S$)==uexh%9l+@p?H$ctxeU7me$T5WC5f}7&2pMPIo8nam8 z$B%}mtno@Wet9&=SV^4_T5EN7)4G0^h<$cq0yT~c?1V17Ud-?(@_?ESBVvRbsh_ThX`^!@t2S^v{z@k3h= zC44n4lUqA!`#vB2O~2MX-g0Vv$?F*=&L6LdKQ#@nIh_3FM&Vnb3+ouxp4k2`XW_n( z4ac{>oONiQ>8HJ+1>X5FcYmt?e0SwwX2r{CxxH6*-=Fw5^T6}mxa=igmo}`m=g!y} z_49h|rRfh%{~w8cZ5MU-Sy%mzS#OoJ|3|%iZ*lKd#-P<&cPOog45EgyT$7ykQ-704hx!?-Y~3q;QM@%phVb$6Y2l2ZVUUj zRoLNY?}g~ltzUkXUM~}gcGCX3_UgxVQgI z|3km;3V)oE|Nqi-EB{sJXGO0I+m*j#3<_S@&!LR^L6FqI}`h_qp?bOWRvZ<*)5B z_ud-yZqHoCjl~hAYj^#Ada8S#j(V}P_SLidMJ|+{{a1L)^un3TJCmR1ZhgJB#GH@& za^|zx{}XG={=K{YcR}FO%IW*I2=4p8yndPBE&H`sU(XT!e=Ysz+MAKb*d4f6{|8*_^AJrk|R1viI4!)+LeYkJ-&vF7qyXmvLn3 zb+7F0&EetCJ+6q?iaQv8`7Ld=rHsYo_p0N&zm4RYd7PT zPwSJdUTrbzgasTTcpw81uuK>d*C5L#e8u*!=&Xvh8qc?cMd4K3#mrzTe=E=z^=Y`~Bi`+i>zE1n-wm7?v(0?lM%pk{e@b^cBx)Iyq(C5p+1VT(owG~i(2q_ANJQw>W( z;d|ZiHV4JV!2N&pzpLC@^)`3fhS*Y+FTcdVX%c{1fhfO0^fJmFG6b z=jGLwpAESEcP+R4{!g35b{w~P__4R(@vqm?3omc`^Pu~uRO`k)TO6*>GoA2Pn|*3) z=IX1zW;m=b{?)teh`y{7qnOv0dJY}Qz_MFp7`F~!9UCjP}J6ftR_h)`?|MdLT zX}9htoZkQMPHgt;{q;V@-Syek`)_@G{p88o8tdPm4q5lxYzlPF4DD}S^;>=WpB15d zF7=duT^OmHc{RuVil4Q5_si34e`{(#F37GEagd*W!(z+t^8s!0+#L2o54Nw){Zkhw z@qShDP}c|msz4~xJFVUGV- z;@8BzKL0;cG(2%hQFf_y&@!E?7fb@17UZ2nR{myUG(d`@$jJ^!_COM7tZT%E{a`z^#8xM*E$8u-`u*( zvGvq_kCy*0xc|T4d)cxL}EkMXCb|I4u2TJwg~CpG^a zR<9H14FB^~=Gkq<@O_VEdzB|o-*+Q>q3m4_yXbp*p2=r_hopqYA3qv)*Zk9lk_!_O z-^Bc#<<-=@Mft${q}SC_BKm8;hFE*t&x3F+x9E?_jmKIFO_v`kJLR~@n-h5{o7ObUVS2-e{LV= z-*dO~v!47tmwR*L_WKe#ua_;Iop(Cw)-KiG{!dR`T6WCv`^|lO1?B!derFl-R^!6E z#_i_&lNS^^e4hV!{qGp%Z#SOBi)T!IIjf{Mv++!by3gz1ENg0#_x}9Luyxle^FtqY zGw1|gdw6R9rRT5LD=#UX-hXOe=Ks>(Yq$Py3H!JAUz_&dwNpQQON`xExb|K7+!afD z*8MY+m$fY~ld{~h?!NJ+PrdRf=jR_i9KNa8ecIKSh51V_-zf-pm^hbV)#AAfw=x&Z zY+_^F{J-yyFAA+& z`zyNk>B}1*j9>lh+8VZc@-wcjcAw?fxvgFsvE$Q&%hET0)$CXOw`Av~{ri7De3PHM zZ*kyr`Ss`ih5hMY_b%>keu&5aoxksHzHxp3yjHLDm2Yug`4pJ{w%O^=B;e``Rmuqf6_5ey>|En(uOGYW>o+1`(Fm8jIe2 z*lT88zDv~M>L!CvcNwJ57Prj*$$$CUf#dd*-$wk%Fs`}tG(Ts{?wYSxBY)r9zwk@Y z=jdP8|2{2TUw84v{5X@pqOaWd{pbAn&TReJ@ax}MGSnORa^7+Txbs z*V*ryc<&8gX3O+HCyz@n{QLRz`l?Xnf7`b2-z&K9k*9xFi*ES-!(Ht1tQ>RKGCqB| zSghA=Z~d3lhG|Rt<13EJ2G+V9FgkDhDzA6b)nK_B9MkvR`1iT6m*@TbYwiqeH$K^O z-~PSV`$X@vug2dlGSmhxu=z5P;eYq{l101w&g@GGlo#KzIdVZiL&oWSsoMU>`Gj6Q zW_~sKoVkbe71sqkjQ{uRyWW<5@?YHb_7czv>Ht^9GKP?k>x$2!mG)CX!);IVEX8{q zmLE{4|F{10iE~$ueZ8J8c~*bHW%0kI*G>hM*S*V6x_ME5&*ka=Ui$xe>HT%z&adCX zr04&v%BE(H|<*bZu9$fQLn?(=UV-qBX>o2>#sk*`eQ>^ zhpmnMy7qGJ&o!Z|pZ(nDc{^3Mc5^ywY)I5Dm0gUvD(o%S?N5B>+LQglS)}c*unV(- zkixfhH@_X8E4}Au&SAIsdy6iLe~YlGE&u*>u5pm7#Sfz*CGvNS-(1H64A6B_ewEbP4wd0<%wTc6i ziorEb1Ez#E?+vcIGlBRHD5NE$8^ecW2PR*q2OjJGOLHtLnKh@hJ+2sXZ)cmiddhO{!y?cB6-O>h|NnSJgMeVe z29{*bxQ!2f_J3lRxVr1=wQsEp-?OdljaHb*rN1^-`q!gV`~UshxPP7gyvrLijt4S! za5$(m%ngODh6es(0cPuH{6ZMS*;=GORaHwg>;6v zBv1PPiz_V|guecH+_Urjy-lJ~S5q6?r6T_q9{ag5^V9RJpXay#-e`U=!m!c!SN!iN z*D{kVfBV=X#-&b?~e#o=#k2@?F#SU)1h?b2N}~2D37w)Wj5d&It~ig%emDHrF%lr~`)+BNExT zOyK}W!?GJ`dXrePI89Fd<3C^jc10BDxqsJPm{w@noLN^HVSB|i{r}f9)_eZ>eQ%vv zB=>Ko=cn{n?z4B#u{c;+UwuwKu6%ugi2R3NyTg^F7>v$vPGqRvyEifI`+faN#&tE@ zRkS0jcbxrxbRvUaM@B=)VHq#pJgyU$|5sb5e*I#;i&f#G2d_(p$)_2%3+DYVzxPA> z-oNKzYrm+)>zFj#+jTc3R>GN=98+U0Whepk)=ue9F2B=Od*<{ni}o~aCb-buti zS?PYiVEV`1VQZsI@2p>73-X{uF^dGF!Lw~sxRsDS3}H7$G5uj$FpX0cTUvR>@qy#O zjN3ta9V~rw7$*JWeWKyu`@(+Gf7^eH|EUK}_`~0PEc3)~|6g%m7e#J9z0c-eRNky8DC zctvByzlG83W$KTv|FzDUxsyf1;L{yW;XNh4`(pRi?4IF0;Say(H?B55FBX4Wnb+5L z^GD_gB(J$HfAXKf`l{r)x;^y|#qWPyw!ZFu<)^Nq)l*o{ckYlfFzR{Da91FPGs2v6 zfu!^zMiVB5x~Gc8x(T6S)~!L1;q11@G5VYn7*LTzuuuYv zLvWt8_+1^AxLnzK7jIX+hJzB8Yvw&JxH|u%)#F*aj+`ob+%IGICjR3h%jkW{LG!1d zoxeW(wkKBui`=)yGo16vUavfES=Zw(Uy^ITh*9BiVRcXAots^y7u`}A?mhQCx|Bzn;8b`9!YJ=}V$P5u?NLTdn5*U#(u>R&`fsSE=X? zM^M=KIyDF~_-?uwqlOwV44e}jia|w0@q7Dlezn`PolV^Ig0Qa`hE8(uz&XCDKnyr~P$jVX(QHC6RvmZFSnY$@cyq7Tn&qL$3P% z!`yb6T=R3+*2+E+Yj}R|>%+Se%(6FJGvD6$=-0O~?D@Ohx!Rs__kMc|E(s4Qmr3NF zS3kqk)Vv|Pouk2LlJ=4G|JCz;NVci&U}czB|BQhnqtEMT)f?%jtS|D7uKCsPdZXUB zQ0RbUZN=}ovK5~n8~^|CVDbHz$E-Sp9Cp_HEL#4oe%;=0QSo}wW$n|-z1*ACZU6H= z*wD@5u|Sinj)Ti;O8?hg_F^mj8-MixqnW_2{tfl!I(+xr z`JRN88=U-K!2962z5e9i-?qnnn!0_z|EsX;^VRf1kh5 zN6VWI^+CPMPE3d}l)qt~y-dEZw)wdHJiRHd?;V5=xV-JnkC(V&w``(R{nG3IZ@!jl z76La~CJ1Z%vKFqs`S4@=9XFOE7nvHOp1f`6>0~@R-g91k4Zcyb>!UcbLJ*Q6nP`>N+ZHe^4szxFzR zF=Nbq_4Ah3MNdATUw>|T_M|h@-xa?5sh;_FszR}7#odRk*{#P4$W5+7&uKB8*hB(*WVv)wdd`JFN^i_qGKz*7VeW*-Sf}S zyl(mAkL@fT4J;lD3>n=ROr9N%!;*<5gu(UIwu#*ejY&+R^;P%Qryo<#xutT-LZ|c6 zEREAArmcIcq`P$6_EmiThDwZlYoqo5W|=qtwwZp&>)Q3_rE(EFFHNuiaxuF0=kMz8 zKQ7tEMcE&{et$}cJHv|$3(~cBxoAt3$lj~97MNGBUHtXni+iQvsU~k2&qm*`ob`Uq zt@T}1rStVRrDji`{{8G+VUyo!=RcLYbBoS+#=-dSckg@_EFqD>#MHx((d7F~X!Z<;M(;h<2buU&4jt>gn$W|& zG=E#lTQyoet%HFwzPdYb4@YOn_x{pft-BcW`>f>ItUsn$m|6!fK=i>LfU+w?3 z>*pJ@KdoLj&2q}=deLLMy}IM#|9`nGYM7#-ZF_v*x0&Zp$UOME-MH$LXJ+iLU&b}5 zp4*Rj-0)zy5}35->mO&a=L`qx6gS&{$&sx7cU*tMU#l&Jn?pZ;)!*9l{b_Oi2gUe0 zS7pX55lsa~p$sdg4ihb_>--Ww@*VE9smm9ID+w_ez5dz$#>4B3`Mk>$Z#;xn=yv_z`kJ2`)8~I& zTKy%j;_UVO-wpashiqf^rVD>iG<=X@#nf=2erD~Y9^?AliGTQO*Jo#czq%z_rErJ+ zmztF^!KOinuGUwo_pv@W;dbM5(_)1UH`jVHT=e4-Vr|>EqUiGdt8&5}AvaVQg))Sg zIQ|~LKiBS0qSI@`|EPh z?%#QuYp=_n{J+d+YW7#Pchg(i85Mh;sHRM|wsu`rW88bH;rjj3wiCQAIVU>yEdJ(i z`;GPYmCgGuXQ%INH`JQ)xbCg)zJFit?A*7J8ZZ{|8L^ryE_Se&))QvUlr*1365)L_kfv0}|>7 zI2sK19gLB~DD4?IEtt0EDHbU*3P~8V_`Q0~n|;%MUFfSOJWg_4Hzf6ze0-{rgk`V`Vw{H)kJuJ!i`ACE@pfp8US=`u4MD>rNWmSDiY2?Ty{- z>Eh=maWrgRI&;s5rWpnPbGEl%-+Rf}XzQZyj&0_B)1^NPSv<~VVJNZt(m1=;v^Mge zhi1XccL&>sO2#!# zAAUVQ)OCI5<<&j$7U!qW|9x$HP37(7c2B*(|5&)|%=wvRi>JT6b^Yb(=kw!VdizR0 zc>Uqe@wgvKmML`)6y!JXOJ_tIpZLb#Z$Br|;`{rO^z-vxwZ{}BOw^z5_U3e)l)&&dy=H`lMTa@7e42|DNiz zN`h*|v+fFid{0jAGyWZkIjKhf*!&sxUzIvu$A z|9n>SH9VjH{I6q+Dkx*{^g29^U*ar%J`hrdppnNJ8S5AeWO9U-dw}{1XtM5J4ektm zQxuL*K2YeC(3`e2x+|r~>iw*g2ETPywVTr`*NX94`_vt0vx|G{ zn)7`#;uDs5Hoaz;yMeuMfz^9?yMLRm%ijO=dY{dQTU_zGjhP2L-WMDCSv(fpcZzP{Ss-F<%x+vBtE zug?fPAfwRroWs%^RH0;~fm##K?moZeiByI_ij-Mx49X0%(pK-hkfvTx8TseTdY608 zJ7=3!n%w2qdj3&;h0dI>{pY@h@A=o3wQTy0gZuXBUtImKC+%HS_i-h&6w|o}5 zS2QO(epPMu=FQF54z67O>sRybryu@5`B+r?K=o0L|GT~BE7YFP*Z-P6f2xq&@216H zJX!_VoYlX5V{hHFDfKnaeVf{iXTDsX9`pWoMElj;CqK7Wg_iOlxYcFLv{l=6!g2YQ0}$R?+9w9tI8rP=TtU!jND6rnUSOb0?RE$*q2aI`L;0 z&Ks10+F1_4hzdW)3j{)# zlu^a>wTQ9h^FK?)C(J8OvNBY42o&UgjZ)TkcysoA*}DT8&(}@dRkeQejiqrH*R1rt zvFGOLxXT_5i}LlSr+re-eYtvhbCmdC(|8&U)vtK>5uipNuTw2YS#%>|DAg# z?RWXxwt4l-AJi$Gx3Ac}PJr=&)HC+&dN({8*636-p0B^XbdteCX>q$3?&tRO#ML)X z2o+LjR8|nEeignZ!Z0IyW3Qw10|rp4S77vC@Z$aj7iX-YaE#*vcZ1=!g)w}fq7)RG zuzF+y1E+}K1HlF*ttk^7gatY#Gv3N)c6M@Td2`*HZAS5_GOr5TK87m`j1&L8JQI2K z?rqhT3Qx@D>@{%~`mHFLaQ}{F-J2)9(zTTbVxl<~>#oS?bZO82=Fe{{p7Hl{zNPtz zn5Uv^KHj{i=A-Doy4#gS)lTNZ;H`gdPV3E&r;*tTTh4IyZ)6i-st1}f`^k4 z4TfVvjKA~$ZQP=_t`#8&$@n1hfItFEL*qd$P7~qAT_+i2TmG&4Y25kZ(#uD&=gT}c z*~dH$f3oo0w$f0=Hoca@+ow&N6u$K-3mtf=AeG>hzFfX&!QQ*mf3$sm#4BBM+m6DF5_x`Q!zZa$;8o1To)-&mR{fA%D+%q4(IMPvMpyj!vsc^UFvJ8<| zs{f3&7FyMPJQQHRWu5Vr*r%IU&;RMB@Stn=o*>syHw?Da5d^c>b>N-=6$uJq;^TXUD8=_h2YFFgstF zF-h{5!tsdsRnO()3SAgNUS=e3`uO2?UB$!QuPgqpeK+yiN4*=Jw*PMKX#Br(ZIt#R zmREECzJGql{@G)%YTkrdr@rsceJdpTVdbWnkRSKc>+kYUe)PCp^_lR~YU_Re=(({ph=B{_75)u^3}0_vf^Iwe96H6B*Bitdd)} z#&y%3_CE|CL}u<(jBoH$Id{T?GR z)xr>lX9qkQq(Z>$bqCOdLqn4&B-5dg61zb?`m*oSw3QnZl?93zb8bD!RWjb2-ICGZ z^ZCK`PN@x(8_U_^-W<|kta!h*<+yxYarXKvThE#=6#m6!^HR}DL4$Xn(5COwzbCY2 zuv~tAFX4G_<)SUMb!MzTnGR^AwQZAMeo>~g^Vx@@+An*y=$Qo1z0bV*-`&&qDj)YQ z%-<4nul(u3i$+sdRi^xs{C{l~XK0a`#{x;t1F!qGmh&`km*4hF`|*l~(A8mI&0GG0 zip~pPKvlvQc}6C*ewYHIPzD=l*iEu*W;T`~xhf_brV9{#iVZ0Z>snhH6dmOb{o+3K zr%*;ghSlN4KD8&>k7l2n^YrM3euJ`>oxjg%wAkIyoS-~K&Whu>`|cGkE9&l~AHR0F z@y@G5eiP4py=kfR#Qp@=HJ0kuoC`CjPmA0Z+vlWG+Q+m-carx1J0ISCmEI%T^6&O) z+1lfQ6??WXKE9vTrvH$3`%}@C|Kv=p7B!qdxIJte?`iAI78W<_Mz@9kJ+8Hz-dO!- z&YCMP@)!IwXSFK4VV|?>6KGPwSB`Z<2xP1^i>ZfU#j}HApwx_3HuiWj^)N_GzJ1Dd z;sHYi0e4OXp#=vv3s-MlE57^QndJ4BxBTSim7KV+F8%b$hYMx9{4Q1}Mf$q19FqMc zo>b?^K3O9{bhD#%+6&)=ny9~b^R}z~*Pi-hmdo<)mo^3e|JJ=Y;%?HpIG^`Eb6j1- zmV0&4<$q@gmpuGfoLj+Dog!dnwP`Tc z+>;QzAaD6iUY}*cpY@9uC!YvD_THjye>cxjE3;V&eQXVSZ`Q=@6uKIabkFes7s!7m zl8vwGRn2Zb+8KkAb|KN9AqHwYO`H47$}>TLWdeV~{~ckHOVj7^>qR`cE&SEWA$wE) zHJ{r)QQLB-m*wZXuDgEwXk3nlL*F+2hgZWCZQh1j-Qt+{RX2JsOYZ9KkFK?T{D0TQ z`7ih2lRVbGEiQ1z?hSK2|6iW}T>f6|avrq_3w5Uzo&T{-FJ!XFZ&8(?nFY6!;x}Gr z*tSyV_7=lScAL_a`}c2-c@o&aw~YDYD}I-B1MQXR=iS&Go?mJGy!YiKx2P{O_pbeZ zu1b*6Z+;--*A;6`0{4W^837PduRPW_N2ChCF6@w#lMMv?XPVu-Xh59$N#?X_y%84Qz3aSXejm< zUvVv{I6!MdO%P6CVX$XYabPOtToda5Kj`Zx^IyjV=G9Ad?|tfbZ&NM%E^hCNt+DDh zcLR88U#YI$l)Crz&xQxJ;guQI$*x9wj!ezE-~B;v&g1o$w;evbdyVYs2d{d6Da96W zyuMy{;`Q9$~rgS1w6A4->I9wKdAkN^s{b`H=NHJ6tqRzos=z(BE+MUvMGg;U? z9(*dAfBnw-hZi~K9w}{DSN!N$Z<236r$=&zf6Lb07da~1c~W(@?|Qhl(4zd#x8^Uu z{acF7FLAcHFKgO*&}!1bg>SuHTv@aKe9Yz>L4Va{7yftU{2}*lN^N!Nx9fki(|)9X zTpahJUgq6zhSjfbiX|{cJ@-!@O4Xkw!L_M{*{cU?Y8c34mrm@ zpFe)&H5-36AG`4>vz=+{8k8CL-@GV%Wu}6`f`q3M0xw>?Sn)fo<(2cnwol4A``7#b zo84qq@+RWNkurm47v1Gu!;9W-z5eT0muQg)!*wPxRn{YS!q-GRJbpm#-)^ySYy4#Mp68a4>8%eRVTtmE6r$ENK!<@0YqUwY>hY zEvMDZ;{dy3?0Pd1u2VV3%k;O#72Rm8dZX%o`|I_~MbY!q?95E=;UBQues);%bBClYaWiW;?EY%)~EjXk5F{ z#dymK9yw1JmK*1p7cok325b?WBJ0icVa4P3&0k+7$9eE{*j4;Cy!O(OeLuU$7xsL6 zujSnt4BEw?8vh*l=TNc|+#*lzZ1{QoR78~6b#OSL=Qa482WWsRhlSx2qtBf!C;NTB z_M~6C^yqd6OF?ge>%8|XD-La)8KEy=bN54E`t9wNTT71l#4ma)b>X1IlsLos8)a*v zmoQ5%;=Lf}k-2y4*Dr?iEA%qbt+lVKI+<7eG1Ygry&cx)(Gc?e(7W3Y&+*26oyDH_ z`6=sUwV$8X^zp^tVn23pv-qAHVJr7r?Rl)R)^5+64@++E+rbxmqWjItHCvL!x70+= zGdw$eX>7GtQN@d7Yb|~M*-;l=d6O^nJ%92fg8NMpk5|vx({rVtmZ$$}`We@CpZO=R z*Caca>reLns4)~ez>xBFhET`)|IOv{_4;?7C>&0g7H-=v|8|klw|9qMzb|=g=fW*= zb0K(8(8GblfT@ANjDhC^56&yQc@Nw+O`qBS#g_Mc$|`l!iX&&M6`R@j#@#-EHZvUsCUjo!vHnyWbq^^QYOK{Oq^A_xOvw@rRn|e9Jvg?o}N;{OVZQ z!gWQj-?m@3`}Tuz`^E;rObGsC|?gXi;ktFd$k63z%DupF3i(@U>~#jWqazZZ2s&s5x3&%2|c@5WYa zo8NbH3(q4lhS#i3=^SN7XLT9+Eo|Pr(ARosdR$^Tv*edTJGoB<*X+Vil%13;I+1m& zO1W_}>)ZtQ$_IBRRL5>GO5Z(q&kOcS4ukV|O5>M2Oa1W2SNv(tl9b6|9N+~ z{4V}%zV?(^b0)tx6J)r%H#N}s_dC{%!@J+Nd}vy{exCZBmy7t5A8osQQGU*C{(I$f z9v|P`8@_)_{{Egz=Y2lBdp+aRl*x%^jmPCLG9I*3V!YBOzu^6Wm_t#frx?xV>v$Q{7-n(rgV+WgqN`uBHPp0GZ82+U_es8hoUtU@vAH$1;Yac%C zHnaKv!kJUn+H6{E@mbTjzvryqAK9==^-aRPQqh~>bp^>i4qx~49l!BthYXe`kpiRQ z0eyxao{$C-3fZWpa6p;Ccf-jTCC(m|M#os@9ea!R&YdfK=&_*Q``=%*Y`!ej{ZyNp zp?t(9{FsFdH^9<B4Xm|9}SN8W0q*s=G-N^I#Rlw20hLxY6%wU+rxbNqe(zxdn#l_iU!#o~j2<-TD zO8aki*t(d=ue%mqsH!$y5bVaWUzS6%k7+@ROya*Xo4VGpH4%Bf8~s2Phf07$0>}SH zx*MDXF=|!@&It!rs2$*F2;6HsM}|`-n#to|`;vN(St3IJpI&xmVMv>G@b{{wRVoc1 z{vDca?Y-y7hpfdV&JPXGZ!4|ze)(nQJ{Rl8)9TaN^7mD(aF&+)aO!ROy|&r|(S0mc z8PRih@aL`$4!-`PA>_1y`f`r7-`q8IcS#a)M_cPo5_g?=UFSz@+>CJmzB!A88y311b!LL?+&mSX( z&zFq89lC89a_>R*L2mw?7j^S5X|Q}rx6R!xEas}gk{SjoEfRQy6Ic#N+>6oc z#c1<3uz*${Djb}|;;|r}>DiL<3%nN@UU?q9S>nR`EGIH z$^9i6uho-wS1i8Uuw}ddF-4=qn%Viw*Jo^T$bM>X{WSQA)xJxor2-p@{~UX*cTDU2 zgS*H7T-=(^6Co_*BoZnvRtk60>lZ(23$NMysC%k$S`FW4Ww0VzDo9F+q&QR&s`4g~W zvlEkhH^aG~(frmnUq9SCJiFi0@!hQ#n~k*fr#{KwJ~_7btLZuq&=gPnCvefCa>1VQ zkN1vx-z=22BBaI0z$vqxMQh!R$7P&zEI20|C=fVMS)a~5udbr=;Zy$Sf7iAfRWzrH zefYEeh2+y!pWi+H;_vrlZ|~l}t*<+c-W@)jTUvN;UwZ9w@x#02Z653t$@bRrQ@PlC zD^9}REMKhi)v|*TdEw_TO&9BMm%OKc=IE?Lcbruk?nwlQ++{E;+p{|Tgv0tukv%!r z_13fPuJG@&%r%+$d?Wj-y~qC8e=>jMxUP$#A@2?E@q3F)^26tT+3#4nbhvP+zG zc`vi??knlP^looZ`|m zhAd_^a^a5HZKZO?|9VuEMs-}Od7gqlL!Q3DM1~K4n%QriC=NVkRW#d7>cCzl7p6W>m1Y-}76dVcXYli}UV3{W4vD zI?w-a_VydNs|!0Vqb&cKMUym#7T~K;5wiMdsICi>LUC1S`jr=#-#pQceKoV>?<>Q# z)!*W6AKnXj^0B?LV(Y~+Rhz#PQl+m3uV;FFNB>KkwKQv7(TN1{rCY=O#rA}M=$QSr zCthXU%?jNQcMdPpZMN0!d9_23VIs>0@%_j7oK+Z8%ylO0y!+w%e}=$MAAZ-nzbe>! z@NxfE*;RL3CVV-m`E`wZO62*~MrFqpsB1iN_ zt^<=wfOmsCL)OdyCnjIl2kIQY=7rNa-p<)jxOjuZd`^9~CC#5z8E?6$oVeUKf#pJr zRWi>hxA5Ob6JPJRq{sKYeA|R4{EkZ$1?Q{nUCs6M`i_DZTef+h_|2>xo)opv$NKv3 zU3{FC%=hnIeE9Ufaq_*Do8GT_bA799&rGlL-mh!86@PK|*=1y|7djHR#5nz@p$AvT zYsTK2UZUSNY`>Lk*$^qQ z%!N;(dmrWRpYn3yDZvJTbL&2zSrqX1jLIoz4cm2hyf28iAKATqF~8!^i|Gc&$Jv5> zPpMB{ry_aePJzmSugYKSRXAGy#(7qB82X8avraRgain{l@~m!Q#V7Kq9Dl#h{i(@1 zn3XH4 zl44WS$|LjYFNX%ZhB$1C71qyEVTg#@m$;#7!sC>Ne6x$p^;S%-G6PxiwoB+)>3k) zU;klU0q=t~l}VTW-BT1|%3f8aDXmhF!t&_#mj|WqGX(y&nDZU!=8v7iEZJm&!$#=pA1Uayxs-26(lH0t55{jU^{ z>V6H{mUCP0?}vR-{#I;{WbAF`-F|J~WX zZ)w=1C$d_*y;JLpzM3vPANoNm-2IA6Z~6VwXZA13OJ68tEl5mpJh-*}oSVhszS=Xc z%S+3Due%oh?f0h-n(DueE}svWbwae>Z-(Ok2BDKv*cY*G`pf<&;=6~x)y3 z+*>>E^~YnU`S*SJ^8H|Ue&WifcD3m%brv7X)a#D>+q3xX6~)U7J(rawUVE18A;4=8 z{VDDMcmKxFrE%>uww(C>rgdID&w-kU8?Tpj9B7=Ud3yGCFYaB-^g~R$67K|`@9<#q zb28UHuHR_B*K^%%8DH%K_xIf3e*es3!it84YgFsRpBacm%YeJqM6H&*e}?5jAaDBr zwd#WRt~N4UDy-eC>RszSeV+aGjn|xI&;48dTw-4R9N+DN3>%-@JG#}+mELr9_jQ|? zX*zE{-1-+}`!B=Zw$SOU*R?q+ac^v6Cry8_)mc>EY>N8UtqWhB)>aGIeqE{SK*mwI z74s^K%&J%1-!?7njLEg)^*iseF(~f&m$6&u%*A#Oh7V;{3GZJ0Q@{23&4#pX=dHbG z9Z$G9eczMN|EHJRsV1A8I{a$ctB2?LzIXanoXT6G?#DODr&zHihT&H8=fA0+XS&qJ zsa@pwT>ZW3ZAtoaeg3j+5yyMCc8BLFR8-2_J^l19*e~zvu3*1ud&_&btqtCj^LdSN z?M_3>!_y^Z-uV1E(2rxze*Lp^-yT;9+%Nv9ttG6o+?9R)xtP^UN;k(DM*NSQWq!Oo ziO=z}OCHP2uyy<6!bI!cl5Mwv7U+xA?o0Cj8=%CLB%Rmi`rc~N&SD)jj6T z^h+-ORyzN`dGDi@`G#%vcExS^dl$(4inIOw=ZE9Y;(rIUCzamUOkG*A?f19t=l{=a zK5G1Xv-*+EHP<3V53A47n8=*__-OK;ohBE{r=3>+v1xnwt#yXs#_#>Fc`()Nt~#G? z|GG54^}0=dtzYW)m22`hKe5cXx$p4nHtYAX+K(iwzo$BU6`oh`QP^i|I`gj}?}f#i za!!k_@4L+q^!V()ho*^}%T^ogewhF7+H1Sgi>&)>Qoen?8WL9bqu~knft__{6f1v< z`e?7=P5)cCO7i*d^Y3npmz>u*`Nynu-N#MOJa90dKiQYu!#xO7j2PC92J4yZOek1-u22mS}^z!v7#;9&EkeMnm6*c!r*r zZ=XH_bsrnhK5#JDbE;fOVJY}~zr}ZU%2O#hnM3D`Gv{1bAGez;R%BgIz*o10 zD-?NR*E1g}tvjbD#H6&ulJ9T5=S5L01^mE=<36CJLR({)z5LCdigT_$FI}6MN5?K zYCn9PUH@(Kf@UtK|NED?Gv@7osaE2ddFbEolDQU1fwRo^MqS^wLBsf7>0=LuNsPY~ zpIJ2IC$GtW!r!v$`PGvDtK)Wstbh7DKfiKw{&K1E`)QBfM_)b1x7WzP@}iR9yZu@*bJbBrVFUx(C8$$1PrCeI# zXTNA`^r?Fv_e<&Q$^RM`zdvu?n~(2Rf6c!TTXp1!8qbjxJGpDt+W4)1+kB_({_FRC zncHvVm;9A)YgcKwSlV!N&8c*w%DSy9UWfmEJg-jdaAcn$6USfq=bhmQeZI{Jj3_kFXNe`}fs5Z%vD-RCghB?{H`>6fWf7j!uc{E(oELt1$ zb8Y_Dz1asf^L6+C&eL~RIpBETYf|Sc+w;dn|75nc+dbpixw+Bq#D%cmih}X?+)`X` zFKXSlU0P7_qJ-?L?vTB|pws3k=*y8|FX&ddut+KGk=eJ)k%#8pE1!Sk z=!`txUpv0vllOH0XY+B%=9=2?-yq^~Lb%qEj?qKTPTGV6gq~-qPRfnQ%t9kbjtUv61Jk;ik1pj&aTN;;HtMcO3 z|M^@r_xa(fxAN94lth)UjpJL(3-{h-Pd3lv*|kGxUH-c{T{`Qx=3F#> zdW>1-Ik$%Z(?Y8gtPglnt)HH9e8c%o;qnRY81@$>g1QCG&v<`im-bJ;GIgFLzlEJ& za7oB?;|c#C?6KeT&#$aZZ71urEqfl!I=R0#{u=N3|C3bX-pCtnQu-#EyYi@2q4l-$ zw-M=0cUWGAn&V3*%L;djEb+k5voY2{Bd-ORYiaEs3Ct2HNcio^DMFLFP% z-0x#qRuLn^s(nXAm;NlS)!xTvFk5%O_rBuYZk#%n$IXS$KD@B{x_MN-q3!>s7ZtU) z_S(cUF3?((&oNZ1y#sxTD`~U8^-1ohTT#ls^g%9wxey{vm z@w1rq{Qs}})#4(S->wbVvo`+!E?LV@U)ATW*z@?3_fkIoPp_^%I{WWUdg{FSzd~Hi zV?VInk0?6CDY|gw-fa#>$E`1_e7!a6-72kbr#J;g8!{N*#9w8|U2^$p!{3&Wee7;3 z4m;!y@)-rP`PD>x|8r)(?aQro|8|{jGW#a-+syAd|Ia@@O3HT{ilgfv9{>B}_@P(3 zUN=d`Ti*KpGOo+E_xt5@Zyw7}mtl?n^N4@XkK4~<9-O{!@$^pDthE2@A9i*$tev{~ zmm(K?AXA}=!_ln7BYkhTmCpHj{)<_|;a@wswlnVesI~gt>n|$T6&5zIxY;%?toRqc zHtOm1(yObcF0QMcqrf@gzz3lOmIEI?EiuJXyGTq06 zllsmFIz?+{pPORx_U5|SecBb%K8xA>QMLUnf9%!G|LkA)?4SJj_DS*Ob6;Kkw>N#i ze)?JaC#UUyRotBZj&XgpfXq^^JxAV^eziHiI{dWe59jvQ_RD`i78eQqdv*G0Tf^q5 z+Sg*Xy3g8a+k5UdyS{x9-v4&q^GB**6IF`jsJK|yY~01`ua1| zYbG#o_S7={`2Orhyk}c5HMrboKfmen%gFmLLyf=wQ2uPAm#jbasPVfg1#N#ig`@t?VEugLw@tF! z(a-O#-989bH_o4y{c19|{+e1%o8vD!kJo(?o;rv1{$KHrP3tXo9AB+JQzek^hV+yT zPrWPpR<|7O-L;dUCtTi~Ng;@N+NGb9T& zeMj=Y;1)kC&sFJj1YMM)I=>&;yXM}!W4~XPJpQ=-&Z8xspPJ=QuqQ`PpR@Aop`YBf zf^r{zWFPy_BFN}?Fr;LCb{=bimSJ&?UeZoO@na6|$8ElJxm>lldOK7;&e3{KsgMGr zqJdOV3eVBc{OkAMb^o_6T58Q?hho757Kh@u=HZwnz=b6&KUf_m=h;jLPne^$a4*EL zRIn`A`EB-U)kc+l|M)!~wG{gGW&c0)kwMt0ukhh7`xf!VA+63*-`>xjZT9<-BJbDw z*J+%_^%0Z*E55m}`8R0t|GzIDXxE*2{aoh5)3;Kqds=ehDp>eiO8YPGZ!_B?zv+g} zu^R@3Ds6}Nyy`98R<|#0t@+PSr;~nOdtK+Qb?RJE#oE1hzx%#=^F?(Mbyr+;tv_>_lkbql|4ve*CHzj@VKufpSXzb@Xo zy!V^Ry~`E$cYPjzoUC^8kNN3KleXIbXBXV@{AraPgW@j>CWGR>7Y`y@v(L^`H+tc9 zI`xtB+B(U<`>uwcsa`fu>8`Z-wH1nr57hI2HoSLUVSKnHJ0S2v3(JS!1v=C1Vix|7 zV7|5`=_r@r-AeUcT2JG}PH632Gm(K)W;v+fos%cC95ZMgn3@$A*sVXvvrvz7!hw$- z44k+5vL&?~DE{|VrjvpR5U;m~I+VIVotWdr!DR#?4 z&tt!1I$yt&t8x)~T>G=3h3QV&A(7S3UVBtZC^4GleE4+Z^!t|5$^Q@jmf5}GuELwG zt8dHq6mAmu8TfXhp6Q2x{oA~SWaouVJJFjdT>o(G{Hm;{st+nvs~_U3bDoRHlm>ZJqq`#$oOfzYdOqImdcCl$qmg~t6wzhd7XGDSl0Z(@5F-U z#rGt#<2O9Bv^-vabEkD^j5K3|?uN%PwxRsBVtYP+J^wE`=f?GzfP0GX`_?lb+1h(I zdRx+s38%tM4n0{D_c7xAgoO4de?DtJYb*BGjo;A!U8HDrx7Du=^&jhYMLMhB3uXz+ zxg8dHJ3pu9g89CpXYMtYdutc!mzR05xVsv!SG>iv&gBWqfvJsVmzb=w7VPm{pKUU~ zS?hKs^F{lUD?k0rs(mFHXt^+RlOtl-flUK8vatNO2taEMLTs6L@~1-?^&x z$yR!e58mG2xVX&IRLbj))qj_N`F2W|VXOWckEDFv zJ-a3>e(QFl>ZsGC2QpTB_N>$Y_Qi?4EHKKtY|muzz3+|ZZ&d#Di=~qx;&OG{`-r3; z&4HFuMhkd8TCwe9%#r&2;OBJ@hC56R9laroP3Ls#oDvT-o*I#GYw{@}#tZlK4%Pnl zNuR5=CYd;miyUj!m>wLg{Zw5hXw-DO ze4`(euU|sIy-&&srXuV2SKmD~Ra<(WXk7j3lz+y_N7qaS?XzV3b9)o#v{S0sn#`Yt z5?CBQzq1X$m%`HY-2U6MRniRQN3C^qtB%+7tk7V0*v9<)dU9@NdV&3{cia1<-$(a< zkqcYt!mwthiDAZ6uk~%aRv!qCR+Tx%X0!K$koDz_%f+oGM8{UFUf68+;?~MXVhy|B zi@p5+=eqpwQ|@^c&7k_S&zb#PbN`0lY!{{e?OodB%Okuh_~OsGw(&Nn_fPR=m^9gM z)eHHzwz{{t--!R(kPk|Xi}`m&aDMx|{=d{Dm6td7ue@|3JJt4ie}{w%lf}}xvxFC` zt#U4AoN_j9`Zqp>7N&f&#|o>W`P{az6D*r>;D(C9rTucwAOC!R{ z-nbLCu8U>XG|+yAve!EcFw$FNn$iJ%hFO{0cZOlgEmH+eT<`uGQ?XglLFmASyvcLU zpIkMG!L7FNMg6wqaD&C>KSFO6@;*GfQ>OE&+`E|fTZ3f(oX%W+Z1E)5ZvLv9@^x#L ztzO5#c}HMT@1}PRO?{0$jxVeZ9iKb%-@RU!LO=0}z_{|gGOZ2^_WE{qSpB;5<6qr` zFYEK)$pjv?Ep=t~u99E$ZRyG_AMY(vY@V3=V#@B1%U<#JJMa8;elP#;rXqu4i4!v_ z{2%|_QhZ?d#^pDTUkm%9a&q0>Pm=3Bmb7IvycKMSP~Y-Z%0c>D{I%78)|`3$Sj*8z zO+0P$v(A;z!@V=t-4t~AvsBUCx_6B`3~Rz{EW+Fn#ACC@(I^uhOB3cfBdrFGWTH4@=i95 z8Ekw0#f2|soN!~^t?x0m6(?`ry~>n(@HJomTH(WoyH#>qnb|eAlzr5@akN@NzC$mr z+of=wY<1uMpS+$^zIT3i-W_yo-v8#eZ}$~HYUADKW4LqA)R!#H&+li8*q^$+E9H;H z<89kk9h)2@C|=$0RwlXkTiMTfJI|lloaCQn=wFa$pkj7$LvQV&>NT-@xNDg&9zDHb z`3?W<@Am&U`(LqR$kp^Wy{;Yh{Yw79*Y8cdc7N|m+GAg6ecfxfiQqyv-Xqn*+m9N| zS8-rc_HCH=f1;YtZxsioUJe7M1%k5Quq=T)AfX7_uDEGp3>zoU3#bn5I^W~st_f-xY-`t&s2&t;%pXcDq4ZAEwG&;RM~+xu9@ zBVh}uyOMEN@?1BTDe|_749W~`f@;1K4-~p8d{W?3V|Vy!wR*pMPV}A=<=@x5UK4gY zdge~S17%8W2TtYvyn8+Sv!OQM^S=|9-Yq@!xocC_0mHlpH9O|A$?WsD)4b%m+;iK% zrLS7I+T`55<*+x9kHLjWr64dlAa2>koB!WUzxMNpM z@!_FgT@|X|L~^Hmb(fnxufl)h{Os#t&psc^KEJ}mXD$EDU%fd2p)Q;Yt{i-NHhQVp z$+-q=Co?m|)teq{V(~~25qxp}^ZuHjpJv^>^f|t{g-J-Ek%{T*|04Z>1szy??eX9T zsA2H9o_{Bkkc3EMbCvV~mpg11GPbyJrdXF(>8AYOKJ)+OmzQhex2^tR*1&V`aSXR5 zL!Iyap8`dU3Q~?w*Zp{Q|NY0c_J4x~ALW$IS$g;DBc7ibpCpdQJ^J`KRrZ~vbz?RE z*)MZlEg3%OzHK?@x4sy(*P_DY6eGi2WnDpTgNpz4lkR-k7XNkq{ms8yXJuZwefi>! z`FWqdeiQk9^IBMBQq?AxQlH*U|IBy&RBHTg_p6p;=Ktc)I|LVODUW}eTAKAxjN!)G z#m|r2c+95tMu|~KB9ZBD<=?xnU;dPT=)0g&D1(XV$M#fVovGfKi`^9(pQ(b%((?B^ zi!h4{H6>74y5(k!7N-T1uz9YKK<}X@!KO7g&pN&M-zRIDe7LY-){g>Ct#b+5@-x+h z81CL$C;6~|g`wDR*V^+ZOViTl>#nc)SE(szrl(ukx9mdwnb()+PrG%u+`H4D@Ve6{ z`!m1acAx+3#(E&Ej2?sU^NO--l7yie~T_vU1xJ(6f z=+d1sy;&H^Wx-8Q*>SUM&g+I8;V zB!+2TQ@5ngOe_EW?$p$K@79->{P?tPYj#cLwQTmdq4O4)1B$%zl7wT zi2L|is-!o!U(@b;u=qvogoj%_ezCjj${cu6{&e?!<&*!__Gziw{CAyq^Q5%-sQ}X% znUd>%ov!}<%?0Imz zx9!)>&pX#$74&o!&z-WNu`KS|=ReY-VV(^veTs}#|N0ec_RV6MH3L*jSA5=Cf|+`r zfr`^-H?!AmIm!7zr|!cuzLs`3_9NFBZdo5TdcxYVXKHS@_|-iNe=jYK`*!Uocg;+{ z$=WQJ@5SBU_cnMwSF+u|r}{sC75jS%HGH04_RGxX|21cB|BX{EpDJ0V+`9qW+5Ca+ zcwgKc;qqM{RNmjHX_K!y7x{`S+_|-`%yh;>)>YZv0=xn*AH1ord3V3}=)5Hs75%kG znC49SwzN`={d;plV^QPvo7zwMC$$+S=&p{Nu-9&nn3QMH=d(fm-?s?f-@*U3>*~R) z8`?KCo2`kM;=tr`CUopg+GpZL0qJz1PM6eLTn?_G+D2b@9cr+7BO`!q(qCaW1xe=e<|* z6<=2`_55^1c%zEvy>I7K<9?)HUN`xibI_NSStq{C-#+oL{T$)&xd9RS8^3C?x89Mq z&)$}wy1Ps=vvjM$@A|E$7DT1;3Lo5lrhm<(zrR0-zUM3Bllzk%AHUJb1w3GsU;n$c zZh3UR|H9_FZ1a1UtA4*cmf)}MTeMbXrqxrW_`1LK|Fh$(W?ow}-L_;`*Io09KZ1-4 z_Agd^y#MdqtzWg8S$iYOzsCi3J>B_bt@>$G-uv1H&Vrm14qV_|6Q%n9Y>}8iX0uV> ziRgVbm1nzWyxq^n$*SVOtPblBs;r%gYme?R>B z#`&KK-(UU9V=k~#WN*mcF@MXiYS)UtvEqvu)pVj>%zF6Tf8D-g*WdrTw!P_1_bmPg zkK?DrFuec&Wp~Z}m+5wEt$sJXV-@%KIx~Gq&6hyU!Y#kv?QYJp$m5M%)4WYu@O90< z&q?eYYxAD+9^HDhTl@Lp`&QvL{~v$fUis9^#`SH43$uyUZ+SOY;X^m;zlc9&@c25d z&49gEiNlid)4`Q>VRG-L2DFMVJ6-v&{ojM{iMxVUDb{dRJ@<6`{qAM(-gEWuZ53bC zWqkIF-~aE|@uoAOdb>Pk`P+sHUcVizBU$~_?Z~F8+~w9YY+V~zWnPHK?zu73!|(rH z?HbFad+$#Fwoy9$pW=~r_N9{#fA05S`0~(IB06B2`OCLV62S{5yOu?n=X{7twPvg5 z=QmWqZ^$fAnn2kU{0$!E>6 zrFui<1Ii4?d2Hi-n2swlwiwO2@Nfc)z;#BYDHdGTWvh=CHpuPe`>@bg+P0+<34}&))NezpLY3hNukSuuXg|UypXwcq}t;f zTkPg7DxeMAD*h^MyT1fwKJMB9YH*ewe52j`Yw7RjKdcVDD-4x8^f$L@#~D8jdC_&h znoW;vUmP2-Y@%k|4)|FByvv&&ODJBEw~9!aC_8m)Qa^XeDXCBKPEN;{KCfD9y1_nN zNXY7;=IfOE_pWPQcQ`lmv-0}ivpNn3GN`ZFzWigI)!nM}q&_n&zG?%lQa^okcdUG09yS%tru`t8)lX`faGyGZVL=B+q> zQt|RS->Kq>HYyu-2j0(pqojFrQ|jpju>p^Sqc6A$a`q%LJqtg&{?n_~>(@o*2Ck@I zb0r>B#~nQaT4*i7$@KT1bgD|6*K8FBEYkw+(;1W*`t%J;wibiFg+?wa{E@2i_H zJ@;{PP~Y?G+wI!>PpkbuKlR^q|I5;9pUS_7m41Iri$8R@`s2}kGi%;v2km;^D()qF zFQ(#+;j%@MwZXF|gLakQHr!DCZ4zhPANTy9vhi^{t7-yXUz9p=;B&wBf3?HT(r!HK znx51jyxp=_!$3Ixe|ram%D-Y~r%(G^AFYi0`0IMLckKJWx*K=Yv`%@qa^0_cCsM;^ znI3*UW%(SL68RlZq~hlnzTkjyi%lW7{{PO3C51NsrbQ>HdcNE3|Egf!qcwG|i|csf z5;G3met)a@s$%sq$@E|E?(clCcHf?q_dfC8PUKeXvs<|N^7MxbC(m4RQR3U3`kH6^ z^VdD$&$yV;^I%oku`7O=)8=eGU-ouV_zTeqcVC;gge%EAf1kE?)#8sFy1M&#&#jy2 zJLg5}-fr>VMOWwlS*d?G`Q*)ovtCL5=ed4)u6AulnMc*rJ^SSs#C_QBo#Jc$FaQ6G zqr(64cgB6VeZS7=#@`3*OLsYKGqe0(lX-k1gJ0KP(cWX{EBqJsoW z@$rSbS|&b_E}0S<_dlflVU*97=PTOlP9ICyz9rv&%F>(-44}GOK!4k@*Y9=S-CO-_ zb+uIS|Nn_WFba8Hx=2ZWGHF?YG>PbNTb%4_VKcAN=H>$Y7jaX?%ip zLe_20&AGAr^yix0o&F(C`O<-B3?7S%Kd_6R_*q;r>FxIE!QW5){B(W4(!E)Q-6~cO z&hM+3Uw^*zy^YTM)AQd?OlW*keP39RNr5jsq$w|Zbx2`KRofo5%xvMG^L$rLF#rFk zRw%9DruN%?#g~d_*Hi|~I(Y=V;rmeJe+?mp(DE(43>ulad6{(tiV+q^v=j@V7@isQ@uGV{LZ{nk!ref`5X z>*ri-=d-H_3s=^5QaLb9@AB+$!)u|2>}UVo|8>PU&OCVckLZBh23?^HKBkY)`OIr(74yJipfV_q>b}hI8lq^W$HX{!Vcz`Y&pp zseAtOg@0`E^~c3J8Fu`8%3f3b=V0%?nlFuB`x=VY=eW)C6gj+k^;2P^%1uv^J( zGTPDj`Tj@gx<8fWcV3*9pR+F9{YO~e-4A^8jlZr*zW0!MMRLu?(8H1w-qv@YFS9Zu4JwTr-4ZnJ)tzpbSMS|iDx}bO z5j69+xU$^B9HYm7hQlQuPRs?oJ!wofOa`;c+l!SO1r-XC=Eoe~CeQgu z;8^day}~CCfBCEEBL7*F!L;Z5@NSUrK?f+G0OdI^}|6Niwhxv4U z%A6YgKX+V1jMw&O)`v$eUG zg!Lq*w(n1-Y8F4qI($4(?fR{EDwXb~n*+1=zWg(DoB91Z-cs+Zdb$ua)aKeC$e`>xt;`c`IaLFA zbS8o2fW|EzzgCt$HO7h;t8M1YV6fTzYAui4uiRNNeDmU$ua7(0sKVItvnutz&*TvQ zsRd7OrNk^=UhL%35Zt|(De1kn64M;LJ>N9up7|TI=G(+Q{!2dflwM5V`>#U%S(DM` zxI~_wQ#VfMD>FEK+MmHQ>%*_zWvg<8_I~3(`F}z7WCka3zvt}6o%1b9o<+v}6`vl{ zlz39udzy!AT+N;Sj`NMITk7|}m}lhbwTGdYJM1%8%8xyzE5AprXXWwyR&+I3ysLfp zlIyR&CiZMKZ?Rg|zVJt_gVTn)Qd1xN@^}2?utvI=VS4P;l*tb#x1HecS-FQ}>mHT^ zuWnwc_(WbEWhXJH~yLcmS>&&+1-w4aZYfMW!iZC{>qD=W`H;}%E5 z2Jv5hbN;%kIPCbP|K6R2VcB#)!T!I^;xP|gzsJ{_?waIcd*@}I?RLAsb(c>+*zoT1 z<_~#Cp1i2}xovF{d;0(FIcshl6|J1$a-GTP&8fT6D)tRicUrCE+fwAho=~+-f8F87 z{FNP64k_GLpNh_h#d6z)x0`-H$mq#6QO+*pqF(oY+p9K=PtE>r?%ODOcGuQVX_fLy zjB}DIy~8)|`zM$7?Ua42^J=&4cM2|b9!=I%WfYPSVU%VRa6f-zpQGebBT#tCs5131 zSa>b?DTSpVv6u#$(9(JN`L0R<59gdE+Zp#s`=D@M`$N-W{(1E;6qFcp!=0XQt(=r8H}BVxir9xM^Pik;_kDc* z+oA;jy?;UjIjlH}8+sQR#YOv8@3!@h%RTt1#8%VjMEL5TVmAN3y|KUYK(>BI_?~N# zw=3?K{=a=sP0MW3LjO<9ORB$n-QQOmZQN%Y>y zkBr;@9<;tVZ6fddgUR;;vN`5{Sdr{^j^$bPifEoy)9p36=lgsX-f?crnv0B5ssUCV zmt(!^=A89We3muu*FL57^)=t@wSUZQdA|SN&Hp!wBR|)1c{H%B;!sFB@$cP(H}*FF zS@(B^n%w|x86)}2 zD{k}ug|oC(ug%*JXTmF&83uU2P*`oH#Qa90;*TQtMAli!3a;P2-%%@Bbe(67WU+?D zcYBrd`)?h+`F~YysJ?YdeeuKAx^?Yp{_AEIN5)1yluqukU2yN8uvYS>!mPq}x9&3& zGkT6x{d;VF_Fz;vn$T+*8El12 zCw$AeeQWLZdrXxd{xCbe$ur5V__wg@QkA}9GU&Vod&Vbc8n^HNFL(tUAQ#;g{#56E z@$EInvTBi0NJ0-(NA2*q#0N@+6X2`lz>JRcDPJov17q~{a1xi{)ESI69L+xfFl>Qi5(I!9yp?!q1W zrG>v8Z<|@2Je7UYKi1A$*^voC?=zntp8LA??eyh-U!NxL|9d-e#%hH(_pcr{Kl*W3 zq3wfx;d5sFKe=pLpH}6UE;< zKC)*QtWAF8e`m(8kOD&$2d1waE%n#01}~Vyf@RSz%5c6Ile%0Oe`?-a^;fBJO!-Qa z7|vZ-&SY12Lww6ipBXutIGP;t-47r~bIvd^gLMsNR>R{1R_ z{?OsLdCIx!I+H4&CRSa!as8+ByLje)`)h6G$-No7g*Kh|%%A_i<+2$2Ta&9DERSQ# z=6Wzmhv&C{ohkJN3- z?SAp#vq5>|mb=BL-Bw1=oa_)@^|bSR^VFSHwv}tlFO=<3FO#WrkDF%Nwp!!stRqhZ z*8MuoE;}iueq|i>{`Onx{yy)?PyXhEah5&KQ@qwWoUdPSE~+NO_2-_FhnOci}w(00EfWAofcFL~zG%g%gz<6-too@DNMz7g)ys!!InJP)}a z>Lk)M?;?Nha_Q4&{=}FoN$$y-@|mI5HJf|huN!vH+Ac|6o1b%CFJx)R+>$w#-f?Ru zepxel^KXmtTbuW7Uex&c>1?xVNhU@)z3%Ojxz~3-depu5T>YN+wfl}Rr~j9(wT`*9 zJ^so@aW!$L2fM4+U)S`vbuAJ6dO@}L^Pw4>ztT=W_hox!d~5lGpY6Q2`zu2wS6uEW zHEfS~*Y;R;vj2x;o9^zejkMAT|I=Ex`nBn&g?EcmlfHejo2a04VC$mts}=t?x@~>h z^}}A{@s}*GiobKuotmm0YuID|F}nStiSNV%44e;IO_oGt$+n09~78M=Uo}DZ9zUp+%#|7zuDhF)M_eiEqs{eiCxYOOx2S3*fUCW;F z^J*~T>`QT9D_-Ana%qs}u>P>?aKxRmPm5MCyx1+YZH>-4XZAU<_V+|@&o>QsE6?O( zzJBTBQr$_}Om9D_obCKD%ZO-L@$@U@%KA)i zUivaV&7Jk0X}j`)Y1#|BgMM#{t=5XVye#Zh<=W8Cg);x1*MIwz8WpCw(UB>6$^qH( zJBDuI$5KI~ss~O8cKqLKQIx+Z6-)kBXiRo%h-Z*7{!(LzrSg%nWwK!^_!9BiSEb;N za7RDW57x|#&z4f3{#^O$V!0b7C10qN87+s>bUWa)TuYT*2>tkxf`wK@N(NXA^Wp74Ty;eXrL z<{|f1#b3VG^5=ETs(nYVPWaMpef{^x|3>jbHyckqv7H+5>F@G+QI+m-&3;oi%y+At zta3v8Wwq3*;}8GsH0ooXvZ$r(Y4Gw6P1(oN+upHo+!Q~1%k0VDsZ}zIms}S+_9{`Y z(%t6#hsq8+@oR3CyHz&x%zv9ZX~o4?3W-Tm&zR+G@|^p;!uLl-hvNTfu;ZIm9GLzJ ztoXG(*?!j>yCNnFwc01sG8(ZZG{*)(hUNy>P|&K&1`meoPDuxzn+hp}=D*0E9`k0Z z`rkL6l2hz|n@BBac~b82ZCP^FwQ{!Dio=Q=oJ^*P3Qs~)H>lsw4O_&f@^RMHwH0qx z|5hm9b?xx`TQ8cY-#__5c#*)PmbQYm%cs7Ne)y5UuKeqVvj4yN6W0YD+T9aW?Uj*y zcBhQz|7%%Wj?DRd?)$C%MX%TH+f(_cLUyjo_3z)>cCDTgZ>#Wj`qNwcF72^gC_k@` zqv^POv4eY@llhAU{-tZhWj((Na5Cucyn67%EFnQwDcuCyA0KY9TX)E5%*fx6z4wh{ z#DlNre`h^g`|Ii1D%%B;{ThuX-~L>$oG&dk>7Og-|Csxmg8d3zH@)GG|DY<5D9a2a zn5NcGz=IIc+s8VB13$}%74X^4jI>ebWOZ8JtM9mW!Ajs z*F6|2j;y^dAO7g+zW`bNbzim}eY>yMaGl^W*SM=*R~+7!&t1qLm-tnv-T3#;yEh)o zD=`@ytN8kN$s6alimMdQTzq-t^Bs}7-0ii={1Zhr3pDP#e_3U}oa_AmZsA*hPTUVT z|DRKRUWSfmY3l43B{k2jm1bzodz!NCNr6WG%T+y{&!lbcvVLwkzI(q1L%NLIFR6a3 zJ-=rJGsjl^d-!#GS?t~aFKn{!J+}I|PE);mo!#S|mWE2A7uvVBHL}`VTIaj)cDT|s zzp%$2!{-+I+dgjp^Yf?B$%oRQh0V|w-vL2^6@SA&3Q9Zz?YHs!XL?mc6 zDLc!*9qWJjSQatYq<(#6@cY01DeehbYE>Uy)lVu;W>%>9r@UUv=GDQBxR;UJ51QW= z)BmEnhc-!i0<^X7f7OfUp2%?GM8D6Ub>-J=u3lsMd?hV(i^JS~ zm+st*lb*=9uF;0^!&18=GA;LgHgVBwFXUdg}mrie*xA?2p zKFq@v7gU1IoPY6VtMyiH_qfOAX*U-h<9ego__&#&h`Hv1Px;z;(fgmP+kd-sdH2)b z>-^^zugmX`zw*xey9M}gO4a6c$@B-!;dbvY8-KC=p&NWY=ln0;Eav7pioxe+7fx|F z+8lp-`7x)&(&m8scdzZc&^_U%{oMGEi<0*x>RGW}_Fw%k=0uJB%d7Uhb6@Yh%l^z; z#i1fU?&P|P#kqVd`d%=&F#Xwo|NlPu?+dCHclRhrG2VN7#)abmx17y`ECm-%iS?Bq zmaOK>lWUO4y&kJ_Iq|PJ@1CC#&N)jS{{9fz!#>l@;>we1jYq4#)st68wlB#1x&5w-uAA(`%k2wa?C1Tx|LI|QG1b~>Ur(^E6Ik=AN6LchgL;0|mc6DKo~&6mlGA36ZxEH zn+yIZ&$sD|KeF)ujmd(M^1bjuT@zJCHwKyAxyS#Xli4l#;Vh!Gf;Gf^L6a!Ho3F-b zaLQCO?a=zb{p#oc_&0kwcjR0Ty}xt4%59-zJlmQSSqvC8&2G#{P>QUW#FClAaaT=X z-@hKuODY#QGoxRcFgh(?%jn_M_RfHO=|*X}NVHAl+->fg8TS8x9oSN(SH^?z@R->tTt6MX$^Szw&i1yKg;J?0?RDxe13-)-0dC zJ@@se?d3n_o(q5axa#EmvOnF|tZ&M{-1{Pb?e|6Y!F3zI8`uB#d-pFQ>36FB`y2o6 z${qGw^!>bOc+ADl%;!Ju6rcZk^XRhTucgP|PG)fB-G6EIQ~U3JtUR`Y7hdo8lU;H2 zZ7|cl_IYo=d9##Ga?lqI*_9E$TxDB4o8^VgRh@R_6YodfyRA{aTR*5}y%*`jeeWpn-u!fq{{u$Fo70A-QR>1eoW*0GDt`n8{JV zlrYncJ6>^v5=)7Y!`+|n|38W^Tm0_l@7e!9@LTP=UA>%XU%`_A^}n{!(y~8=_s+k$ z`AFNm?brG?&D;MzLhS#Jxwr0|TX$yBmA?Ed{NCBmt8Xv+F7vN!SI3+OepWN$&i_2U z{l}dBH#469pFZ#Y-;+o9*O%8jUHmOkJ}LRuD@pYgymPsJY~Snk&--L2!|AY@C9jOF zuidu(UZ+#_c-yxJ52__6-TwLBbgOM!(w4RJ4T8evmwmoo^{;%^%eRlV?_Ia%ucGz8 zu#~9e;A=Kj95Am+H+q7@BeHm z`||(K)7tCbs62Jvz5Vw8rTM?4Yd24l{r~>`-kb5MYY!;zmHq$ryTq4YbEEh6T3`Ch z_FVk(%7*y*Q^8ifc{wHbZ+`e*|NeWK#YWBEW1l8AUn+U}?PJf}_aZmULT3KB_VwEv3Jx{N5UfwBR{p<4f*}K*}e}3$KZDRO!YtMqCtK;|PF6OZQr_|U2 zN%Ia1JXwnFE6#p$|J~=Mci)|hD2qS;(hxlZoSDGD&0ySO9e4HZtM@=&al@I*eP!`S%74$@o`1V;d&%BUR%QFHW&3ApFPQ(O z+x=g;%y;u-+5YVnf+cJA&dz$b-|Ck>zx}^m*Gm^IpHtKo^76&S#d9laY!t2^=iTcP z;QlYv`~8Z#PgREeZ$ebmPWrd6dB<_dM0mbUxCttsZo2W*V>&un-~r14i3=J`j2vg?AJ{PWf8f2E`;qBy4Js4e zt{eV38h+ARWpHn$^ z{_9y5?WwSQb0L6f4nxMd14ni`6x$pYh6N-vummEinC37<{8C)PEYRREnKL6*fBWwF zmrZx-U;dUm=kE8wC_4_v8jhmkve1#8enm~jflhv<%bME=y&;Ixzu;JzArEZ{L zS?$#z%-}11v#fe?rrtw-^z5T!4=R!VOI%_GDHdora7yTc-uF{w6Z#w>mOk@n5N0TD z@ePK@I7D25q0v?F0n33!Cobzj3{7Zc39C)7y*a;oy|GRI)ggHE1|=3OacuK{ReK{x@Fc~w)=Oo+$6jF+Zld>KNmcE z;(bM1e&=ouo!fbZb1x>Q@8ny1^yVw6ls#hRY+HC3Io`xE&0)B)H`)I@dNNE92RTzu zDrXlLBgdJ(hO(Pio$9ymt@m=M+&t;8*=}8z`Ds`6zUr|vzTK5qecN`+rnxbvJl=nc zIyyJyYv%DCHyw0;-}rj$ZRq-{(C3?OZ%#iS6jx`#%gEu7Ajw(4lpyKOJ0IOn1}0O^ z4GaOo63;+B2gMsWO@U&wF;(S&GQ(+$tRFm#941W-_C@O-e|tW!I`8=Qz182#mgG#a z&pjTxe|@-}$MnsCaz)}o5#Js^&O1@!b8lss-YUCSJN|f;6tu28I8}n*ijk4yjTXq` zp@)6b(H)VnUFZSJfk*Cj1+sgt#>MaPu3%u~xS}dhe)GKL^Etahea_nbGTPd;GGis@ zoXTU8-f!#A{k;3-lg0h(+cO1*1Xjnr7i& zyS{F}ef+i9K~SWDJO)XHphRrY#h}jMCa5G2iRcYYERXWu7?l+2{#muG?2!JB2ZvG% z>XqcLUQe8AQtMM{^|D3ykOSXqkxFo28H6&;VVI%ir`3#VDgz^j$z%p~hBSMTI%z3e%ZhKAKKno z^Y~db)~-l=>?Oydz|a^e@Ie2)&WdFwH>(-a9t&?p&*=yB)DCbq#M=BQkp+9DOrG)W zr1;XSq2AYj?ydgL_v6kL+4qd<$9+O>{>o;$H{?2CKYMYy36IVa${%W~tCY$)`?KyKENz7b(YfhVf*!@L^wc|c^ zx$X{F`PZsnE5y<)e&xkB>6b6;^{;0CaCis~0yd!sEDp@C>eOP?XGCgPh*Cylm_FDme4{P;r+cz)qX;I~;qn|?j*Vu>q z?aEkfH6=d$l>AlU*YaWUTS8?IpW-<^`^fafuanGYHN^c|F8kq!_U=>ivB95pzg({T zbmc#9!t?l$382tYKrRhXlfZ@+77NA;TO6~u_nV$o{nN<6@`>e7U(7wF^>=rA@4RMs z=IZpzPqW|JFOHiw|FV9w{-M-^znjAS)wA}>y8S=@w3(OOS3Y$9rD-M0M_y2wWDF{*Gap~d%Qu18 zixOImPt^}_HawMgu3}*1Si`|+yZT*k1wj!&wAo5yl!gcuLZL2t@iU6`2T-) zb(+PQ)wZ`9L0)UTs(662;i{x}6%$4Z&`>?V*$`xs0xdbhrXR5X|B1c4Nc6iMTYHIf&1HL_;?T!u1+8a-K-FsykFXzlrek1HQ$E0S zAmxt+sEmb}3bP=Bi%Ew;=cvI$6^Q9bvI#~^dzcf9>MrZw&61s6xAY1J*mt|<9+)ln z^W;Sixktw{-JB0GfitqghCSevv@v_T`K)I`|Iqz$;FE9yW5Unl6Xeik7+Bnd5*QOy zlz3on0+o1>40GDQffbev(DX@oHcV&eb7^6OxI2NB<4?eQ*81yfd#}$7?+@<@f`zO} zJA*pIEMu_>%mgt*lF^Uh43Dm;GsN3c9t+NSGL-$5wrJSF0`{zc#C!&IhGXgOo{&I> zrVEhr1D8PI{if}d+%}odj;C*0x}Jqt*~rH@mxX~H;w}cJ-E9o&3}t5nE(f9;apNqD z1>=UUZ(}%mhZjZ)UNpUkQ z=9tJ22{}Y83Pdn6*)VNjYW5IUU}!ul@WK61>6O2ywAa6}DE@Xc{d(D}JH_Yk1|HkK zQQ24{Wp~!T2y#FdMDZcQi=+@uzuUEu6u6J0IezSIC-ch^W!)oEjm2UQ2W zYZw^)7}gw6xWoz$%?Meh!sq+1X1#wAv-;|-h0cs{%iKUQrQ!4hnjDexLs$c-5J(Vs z$pm)78o9&0RU4zjMk9$3Y~$f477fK@!kV%OVlts6b-Sh+bI7AS)9( zz`;^x*!Y9#Y-~@{I*@zO3Rh&egEOG%G@G~!Yd#*B9qW-0Sr(SQ_p)g&-|0vB!hgTm z`Bul2J=FD^9zMfi>hHt%{k40NQm$A0yzk*6;gFCDY7(ZlPlGj|kxc#t@?yFp50gNI zAyarZuVQbPd8B549EydA9n?<`WEb0PM-&TZDJ zpQq#JXo2xy->tV|XXIFNgp*+%6M8hvuxl*){o#xD(ql*|Q_9g{f3IHp zmeca(6;twqD)p;xp59ZXaIfX=D#rG%BWr4ds`t(HENiZ{T~#f1X}fXX{(XOR{shm> zN|%ve%QrQ=cJrjH^s9eG?7xP;jP%@Utatsz^jF=#GM8UHx1(ef-Ur%l`e(ZfD-~SXfn5r{%xx;`BQkBc@jVeI36(N%p7p{?FFTFIRP@elY)) zQ7hbjBDCuM|H{I-Tj%e~pWO3*(~p&gF=qA8pKjl}I6KKahJSs#=VE2a)<36G zN<-}8Ws>fPltuoTyLJA&nKxWCr46_KIbr&1rBT}J(~-BHNAB`k5#(mJZ*S@c<6kc- zO(woJsDE1h<@T4IA3s)2U8@v&-5~m=&gZWNul{%5x&Qfui_D^ZnVDt(W}7MfU~Wtk ze8A$c`51FPlDnZyW5olU4KowwF1WPz+D1;VU=b#7&jqK>)vq@FG4G80zlZYoE{4B- za3prtj@S9DTUReLT6N}qfv5QE$#pZ<1i6`I8UIT9dfF{F^rqpI+$kINPM@Fa)A97w zrKA_1lcjw>nE#TjHThq@c>d$Qzk4eCUN2vFI`wmTU|sa?#~bpD?r(~%H(aMxTyMN; z+T7)`*8jm{auJ~JWyY-=Tcc+C7IW4^-3cn*!OVo8oNJzz&6&18`tjEV$GG0l%62T& z*UgiUPMEl*;?JCj7hg8+5x%_t*V6gk=j*=xbe+S{I8}YaiMjO$=YG3?;757NjlNs& z|Gj%(c4q?rq>X$(t=65nD*iXhdf{*NHL`wD5wkyimVIAwyn);P_h$Rsp1*%xZD%|@ zi!*+Hm*1oOFU3-Jv*ItFf02BASy6%shkf~0&+G6czv`;`Y*6=eQQUsBikqiO)=irGf9IoR z8+WnXdaHiNUp(LG?#0<55;kgDYbWolzLWZX)e2uL&d>ICmL4fJr?)Jkses5Ja)`w1~V zMfLn=vQbeqW)?7wd%T-z7M|nik(Y=}(uh3;ewOjg@Tr zpY*5e)1#iP|9bS0MP0Pz&vn^*-c%Xfwz}T({q8BPp2y2;wph9Sj6ClC^T|^c>;J3T zW9uh6I3=uNxuG#v>)fYP7K{Ps+GH?`ky8Q*j0ttlmN}uT=U>l~oj>0jJqQxgSl;}s zb86=Jz~Ru$w)pX>YuBnS#~hO9@aaCVV)6fv%m1yp`=hwtN^4c}qI=s5`~Dq&ylQ7v zt+d$rp8;iS%6{+2s-LMJw!QXAsN~MY2SWb@ReJthxuyQ&969?7k2!AFow{-IMZbMo zZkpl!65kKubzO(o{1pj){a<6*c~*>m3_h}&qL>Z)S?&$O z3}>Zle zO7?2SuB?*`pRmfmC}W~j9sk<&9-p7;k;}Vmr@xgn=->TsT4bxS^?zmwPX`7jZAgV0 zAjg<-tK$Lc_?Uq;6L(D6oY>{FqKwrUW|-5j1R=&r|+MdoW zJSKVjX4SN)t_Xk8`p~i&_cu-KdFzpH^sKTzRs8m<$ID+ys4eEVyqz)mbMVtA@3;I7 z`Fm0PrSGvlsUJU|F+TsMMETeI-^+e%*%_8;d~45-qp|f*gDdXDzM6UBg}2Xdx2em8 zeNRokcgZgArBzMo+GtDeU$?LN^8S;)-I;o}O3M0w;r08kp3baa?9jl#64nc9tmV4A zMD;sEqnp5t=RxVpR(C4YuRS`I_1Jda!seZ!PbWRQHYW~Rx^-SEQUCVIhws?`m-as& ze%b#2n>4pABdD}~Y5jk)LvOwEpLJ8qPJT82y65w`*CwLn7ko5ld)5Trd@=du)9IhC z%&Q5BoLr?`bLZpPo2%sF>n82^6D<2F`sEz{)PJjbPDbS2s#~plb#&u-IB{d?^a-*dJ7>$LpqwBqZdb@!&9|B(K#xNdda)#K;(dnhOxC^OBT zy?tqS-D7!?t@*9}e{B}L+_S})LMwVB?Gmf3xA3wKux5>wu|9{Nc z|J~x*(OqY*ZBKo9+0Xjy5r+WFw_TdX@A_uO?GC$jwA<{Wy7uB*bphaF8cp3tM?2mPV@Y36_P0Zvj6I>pWki&-I?!q|A_LeYa27=|H`v!KX;Cl zlwG;C=BwhZV~;;ii(k%rHGFwb+^o`%N5#v#R+ztUXa`R|nb2I->K|=4tvY=B_sWXNf4?U0)2j0``ev4PS?>R)*ABmS9G>^taogdP zFV!>F9@}+wQ~XUSo{jT7D~|12v()pw`fBBOzh<9{KRxZ-*0bmKPgHbBU}T9}+RvbK zKysD|(;S8eR?s+u#Vct1hY2+Oa!WzpvS37<&fNb$_Uym9^zN)3-oo?0hwt7z z$`LQRo!1MIp6Gh=C5b3rJgQ7cJEY(Wc}5( zcgvPOE;T&KxBIH)sr;?hKF6%uZibyaeKq`Bxr5Gm>-T%!uKIibYHq5aWcqXacfX=* z|J<3s+)IY3SmA=O>?a*U4Jk-1p3M{mU6YWHqMVy!Ul= z;c~bASNdL^IcYTijM=ZPZ-dt@TF||p?ZM{c*_S`uex?7|Qh)#1_P{e&%k!;y_y5gX ze~)ARwkN?)-qdcW&|ATGI@tE|xA5E*|5CpO|9fuXCH_0>SLUZHH&*YBJaOavCfTy= z=-qENUF6&SYJ$n_7rW1I{u9$-b2=jG=8y6O>$m@oy?XmU>-DPD>t4BB?OXE6*UkRs z&+jE2pdPS<$^p&>N4X{7_A9j10u5s&Sh4(hnYR6o`P@@0m)bG-?YN+f$CqYQ6Sdv)zk-Z+zPN=jXS2r&+z76M2XIW>xH$ zY$?0QzggaOCzrpSYy93tf8E{auYvo1$Ywp&ZN7g^_otoj{p&w7bshKeUQs>g8?tlN@+MM3sm3un#&7aSE{+szJ2}H;=hIN0R zt=m_(E!B@9Wus2O&W#(l9=Mh%g@Rh!y-2T^a=CaCm^wNEmV8+%yR%bb8 z4u@xRp9nTo3d>);XZyX#Crw28Q@UTmm5cww-ar4aNBQIPez( z^pNPPjdL$qO5XnB9+MpB^ZeCk_sHU(lV2_3H=Mh6|FQb{6Bk|$U)h^;xHffN-<);v zi#l{y-@n!=wQu!#<;oKU9cQjiy!>`WQp^5-yH%e&hC+1s6K{$2bZ(Y{kG{@3w~|Iaim zY&x)rW6N!6)7gFXg~_|pN@ut;&0*+p5u5!k_Cc-~qnI_{7SJRFB8B)IWLUEamTm5`l1>HBQMpYx~GFSAi+FbWV`@+$tp+bt8XUDD+K)SOnX*%-L{Ut8)m>;Hx7 zxpx)@*xu6oWL;#%yTE4aLL;x)J=Xs%rEm6I%@nx3xhQqt3ctyzxzE1n*L|EhchTE_ z@xt*}uRQ*wc-{QzQMck>u0M14x!y1Sx02uR{Tbt<)!Po#?ww_rmP@cipdF@I$EPY+*GII!y!lgHR)s~%XTjY(-j8|P{x|YvR+y(3G9`Svc)eBIvQ;X&U44Cv z6k3kanQ-9QvxThN{4Pr}Wf!)ZCU0IHvQzXKPs2g>dtFC=%jn3SPN5x#Sj7-Mr2ItPz*W9~5=gR#_75qP+|1CcMEBfXfyK9SooxOJ` zbNSqBy*uhd-Rv!w>g=Dqe*VL*ubJ+Fr4ctX7XMP4x{r6Yw>o3d*I$>pr>)<(>+318jfmSbO?h|3wNozAmwk;hc%G!+yb(S7;(pKC;M=eIBdYfP zi(9$&^Eqq(XRAIzTBy&e=fC|{ORIrKl{HW^L=jp{J!t!4$0%&9$>2S^NB(xi*8Z1UPin<3ymc+|PE*dV zm1p*U%=bQ)a(zY4BhMMSjT6P6^gX-%_OW$|271s7H}>-SF_`4+sbF_F%(mpQ-|nNm zmyQ%h8qR;V_4EAOcg0W55HGJvG55Nrxja_$ZQRkj*7vXNtNmS5blfi_&(w0B&xHJ2 zo?k?>ru&)g{IzFqKmX?5TB)?xuVqBTZ9j#-?RdK4)3o(gMcY>SS02tu4R&2M@5T11 zYadtVaM$m4QHsCZMhe3|4TcvYfaAF>QCi$&&z9yogZI3A9LGTTjOMi z?Z>LGI-=L_8~@b}j669>Eo*h?{F+T%SL%N*+VgKc^OxC@TR*S=^;`AE&+j@N&Iv0y zb8^?}Z~d?R!bY7z%zlNnKgSJk22Qj#=Cqjyo;};a%~03(Pgg*IQQmWWl_j{nn+^-k*-NdUs~#x~z`3Q9JMGRY%s|vh4n8xxYB~ zXpv#;a-T1*)>&c8AFa~2>s}MPLx*qs*U)HbDChB3!S%`i@9dB8KXm<;jOdg12G%!E zsQ1>-%nu9S6BpW^@BYgE@6hxvJE zQ9|}W38zf-^^?ym*t=f7+~%FTl%;}Yfymh_#&49i&u5mAjf$SbAmPi|J&VOn_HX{y zvVXFD_TQI3p7pU~+0I3a|C`=jl{+unTFyV#dSUhIt<|-kepa2F{wi?(6Av3E?b^_l zRjKc9Ps@{${5$81$0rT>B>T3TzuhGs3I2-6yH*!n{rE@RGxLAP1ZDcy%Q0RkeREvH zXj*Sn+!NcE>vMl9OZMOVZFe$l%9`L~#a%sD{Jxz0QhF=Ew)E7Bvp*KuUrjB#a`Asm zwank|ES=5?ot!eZkM1*W_H13F<4^W{KG(g>)B3-)(X#~|wVl@g?`^Lza@4;(X?ERmeWPycNskt9 zQd7Ta*!y?GucUaNaIq);Yt(<`K22S{Yt|Fm+x#^(U%c&p?keTVK0nVkZtvsD`qNh=P8)2K zEdP79Z~kv#T@{vTGaPoumIoJqvd{AF$&OoB%#>iZrL=QBM`CseB*4LMB z?^zYJWW&YWE2iPHhq7lhf0e-N6HC9osrjP4Ej@MdS*5?%s>MrU zALM`Eceyn2@lx6N?&u4pcYJyOo5zVi%3XRS>P=|y)Yp#NCav<$oE-YjGk<>f@$9QP ztA420r)bZcn7VwQ)c2V+J#{N(pFU5S>7OS3SIX>I;q&d&x7q2*a=r!Yge{N%aZjK}*nGHm!!c#s)o{4XJfY3;PLnK|n=7w%Ip3_>WMH>Cel4!gS8N@elgC7D}| zGi^WRPYULI*8FPaqyDmgsjKJKFD%1y)qxKulQ2_boa`4`#;`VaVY${+aA4|y@u;vS6utPAZID^HaZU`|nxy zukzk~4y#_xi>HV zzax0b%KiUhd8>6=mNVl2e+#s=`n76$SL9wRrPax+)8`Z(b12rbUhqcsSLM~(SJPi! zpKM>9uz@6fh<1bGCZZB!4D* zs|BmU{f!GvQPW8jOP~CDqxl;xFFdfxhHGIA&f6MwN=`F>|KD$Yy{|5w-d}U@PTz#{^TYl$aqCH}$hyC;mieWp z@T>M;SzlM~x0)&7ulmDGfA<@s`D;Yxm&u=!`dZs%X1LzVe%jgmKfR0Z`5*rn?&oL! z>edXi=Y{W1&gsAW&AVsO8N+Tfuj?B_XBMXBX#cx1zwGbYfAPP!#!F|o{g0nhaOm7# z)v|x=0TUYzyi?q;?_Y#xdilB92o?=T)7r1+_FuZ3pS&`w=l@UNgO#xlCS6^Xv-MQo zjI5^{VQW&L{e}%1OzwR*YK}c~Nd3IP=#liuU+v1a zm>lz6-ml9M5!1~UC>CigChVrC^y2*#QMD5F`2`tbjqh6R?nN8VzAC&2b;iC-y>Wfb z*NGQC22L)We}ArUE0>3#Uqd;A&$)tGreE}bJwDFwvpMNiQv*lFb+vcbG~}Uc01TM^ z&HQhq^zpw?*}u~s3)>ImDPM^5-+uR7%ChUT-g~6^1e~4JAZxGgV~bU z{RyJ_%OftY)(+dc{0ld@Z~IE%gze}2r=?A2t}ji`e*9n6@a^d{+I0t6#l!MnEt1-H zHT$R#)9&d9!qOQJJhQNVZuxbEPt?A+?A-@ufz~BI$ud9mxZi(Mmf8Qfi%Q@Shqtd7 zl{ajCYHs}a&vE}($#JrE`{r3aE!(Qg&G1>au70AHo~FOfUBBPof6sQS^gziF3`}R$ zHtd`^`}C7%wrAfR=c+oc%y3rf%0J(aH>Kr0*Vldhcxdl(v(v77B1M_13McpF$5lR^ zdOOzo_nXbzA43--e&vX%{d#rj+*L(2_P1U7`NMzv+Csk^(d28y_E+UvYEB zGsj7$-N|uN8Ppk8OjnO1HiW)5{|inljZ;dv z&TPKm{m;+l2bW{_$Vz+yA9|%9}s>lk9Sx6$C0ic}6pAu;I>=*R7}#p7%HX`F_rDF*^qZfggXwA2BsZetB+L`+3f~`QACNKr_sxOQve~ zh*$e8-?HxexB_(_mislyI*+)pe5~+sk>La z-O{im>grKF&DwCgpHKdMIeXt`g)(cSrND>XHpLlzYT$rRaAVo>c>Sx>W#6aT`($0O zpK;da^NpYL)pKt(Iq)(?&#wD^|C!~^oqm4div@j-gI2~Bo;(jEn2-nF^UwJ*#Zi&qk5zYc81?J0PJJfG5Zsp!~Za3qjqxZhQXp?^D ztzR9vI$%S<<>gL1(A3bV$nt01e--P0&a-ZuoAu!Lr83!4r8mE>FKpFi5pzlS`@>dM z_jjd#C+Dk3;e;eh+e3@>Ui|vmFL%cyI{F{S*)MyRs-dO#%W4H*UhH+9YWDr&@$CWW zekP}`UH9Ij#3;s~)ii6-%siHQ$KN|)0_Z_}Ty6 zf7czG6St=xJ+2!bc7NT)&m0Gm+O6VtSm(F&KH@lgdEU22M|XL`8}>Tfjgj)d<5}4I z{^>VaWe!r}Kx3jiPFUS}zFK7x{)cxt3H0#&r+4~x=|E##bNM3sC{q1j#zL|cP!y2^w zMt!oC)b3TQ-n}^;cIj4Uc&g9xFDGBW_f6lQv^V2fW~t0!F=!k!a_DF?mi?Pv`s73P zbzzILGhz%mevj=BE!x@l$wz-~&IDu75?D#*bpd@%Jp}pL|_Z@aglyIjXxhf?`D{XK8E6MsGLg_3Nt&w_l#P zcn`b6Bo)L;I#BL0={%6O>)o#PUt})DsGqBUvi{Rlv&gj9xgGwXwfm|JZFs=f7o<$@WFdKA~4v-AWhy=Kp+szWtc#^p9Eg_dixWDh4g0 zvus>HH^Gko^*x*PPp3cM-@{YI zp<~#%_U!J#NuE%yRf)K(EC``9=o_F zcIQuN?vK3_Fo&T-1+87st-hh|kN3gOe>TfzKYVU^>a%OozVpgyJCI~bN{#UGx9kkl(F#1?%KK{rg+Ak zJI8K??fWxf?vgKuQ)F)^etmPx#*g7l`is+gW%qaKrFotX-dT3*R@Tzw*YiKKf+rSW z1r`I7K!io(@Avx+e=Ml%xl-4sEL+3~%Hu4%Y^{x2pWl6x^xgVzSM=#!h9%AwD=Y3F zc5ct}Sw5$zEZ&iashMTfn{_c24_ljCJ)jw8meT{JfBjjf0v@oltP;*xzg&C$CUJ&i zJ9|SF=dL=vbn5e^&zvUN_5WZ2S;A-&zU5r2X0&JM;w?*F>fZZr^MOH~!G#;ORMnYx z;A5};5_dUEIhl(x$5ubKIsRO5zA$K=EoaHmw36T_c{4)RthqZW?n6`WqIJtd*6hl<{uLre_AvCO7acw)@}yeLnHtIa;9DVoL6v&$NZx zbo=7@*@-jO?th@Wu4MZ>>-Sb6d)Oa*e!0^B@4lF$FF<7-I5#;g=G^f4{)>kPEjg|z zeR$wJU+0Z!`os{?S;sxR@{N{%{&^%FH2G@G^m>)$?nLz5TyStnXI8 zH+?zt{2$g}Aq4}6hS;f$i2a=n3@m9b3AKNpmAtQY@4980|M8O4)-9|j^H$B*yL_6@ zk{M(s;}ylwX?I1!j@)PHa{rxoRsQ#nvn%h~nJkgr1ot5WI9AW}9hmIjSN-RH&83>< ztLmq|`N`UF(IS#T;%r8g*vCbow^AbS+zP9UxBGa+&8qCn<;z7qRcJ;7)vZ&USkNpAq!mL7*( zrnT1=zuaWI{mZGZ&ozE})~~TMKi+A!B;BQfwSg-^-NI{8ceK$qwY{GI4R_CYetO&G zbo<|&>5o677YH+C8X(&1+RWZ^4v4W2MgQRY0bKL=g5+#l4;+n=EqM{mwv*- zxq-pJdB@CE?RN!EP2Tco=Z=!MUw%9ePr2oQw#g>Jjpf$sm!I}tZ#nh5cuHQ|Qr(KZ z*Gr4p|A+otV77mPK(0r)$^j+^*8pRq%dUDaXHPu0B@X0WBtBVKk%VfZMJ|Ue>K|o~y6&xAKm*VSA}ERsQlN z<#dMz)&@z3wE;_GpZuyQeyO5+{*l;{&qhn5^LDP8eRe-efyBU)=JDXg#O%v&x7!D9 zSzy^|x@?Chcign6rMm9_SMPF*P73T~;AWU=;Codg?ueK7uVX&T`(KK_KfO2n&QvqA zeNVUrQAd0f3`&{!?Y>N0*rdVCVqLkWOB&7C0|Zxf|>`X9ICHQjoq>M z%QSiWu%#t-da>5Fzh20lRsaVLByWJ2GdLT|erNo8;lBRG)w}b%-^^J(!}H8{y`MJg z<*n@wKE9Q_edik1NKo_irmI}DUd_wBzIyN8ioQQ3o!6mVxJnqcGH^&JVsht;pZe~0 z{gxFO1$vi!qyNUq-`;G)J?ZY1b6dWgkQ7W{T)=iibDhpl?s)UA%1Pbc&zEk`UH;m> zv_2~Se@ySX1TJVx3hKrMR*k>E-Cmh&uO4{k)rq4^jWZoL&3^SiI{d!A=NdCcF@`MV z*^!L(52It`vjZwGz4ei|D0q3sW^od{k^$8V3Ezb>w(>3W*5A90;lXp|)WXM0Yz!~| zQJp@0^F%(&R8U5iT(SCG{1d;uwllw59ev!JRQ0lG)BOJv``>xK{U#XNg4$zKFc4+x zxBs{B%Z3phXuHV1H~e^!O+;rv1a}K8E=*!Z$Iz8hVyKAQt>i< z?o*Se#QJ#m&jIZL7iOAMR2ch0?eXzhQq%7H$^Yp-zqGga_VPEvS5Z^`?x_cw`Rg{k zsJeMab0Ub*FS&Q{+3M@?g~ik&FFF1 zU274$?YNw=oSFJYv!Y^&t!p=VRadW9wqs|~VK~G1X@XkG;u)R$4fn(yooXKwS9r9& zYt^+-4)g@2!{l#M7Czn@*vbN%Ozr_Y^c*0sMCkw1Sg@cSyQ2!@P% zCtfvO=Y71i(pqQ#++3?jdE=l+eksG3{y-L`k>`hzA&!^w& zHfntqTz&oa&oZC)&OX0w9vQ10U^>vl7``ITyldvM3Y~R-9)9|?w|vQB_x1g)Xzfmc z6)q3n?cTal;<;Q{%r1%WtEbFoa;N^9qq|EJv`4DTV0pyUJdXOuSGw<)UbkNMfsC2v60to z6WPQ@mI#Ijg_`SI_6z>$RoYu}_35=RZQCCU_HJngWi?3nfQ!%tQjKA+KYm&0{dW1$ z)6e7zKL>t2wzK<7;3>UVp644GxEYEYY|?~x8LEW#E?pXIbLyS%&qi;%8BuH9Lj=&% zfkvadTxI#L_jdm;*B2g=e=g@0z18mBm#a@3nU7y;WPZP;ivz7#ZWGGb-oK>3?n`W|?^Mh7(5ah0S9NR8&`mrD zT6UMfux!sKk$jH3KF=0D3Vrf`>u&1wz2;k^{rxWZcA<{k?`}MBu=&0J_P5n*Uc7oR zCn$*V3DV>oFeVRXMll0n{`s?BIJoxRCR#&i~q)i4URhCD`;%+VMU_0Zsxs+JN0|c zJ>t6O_VJI`-FE%m7F%z(V}@SCfrH2I&ClES^Py9?+4c$dyh9b|F4gtR&|nl}P?MRV zx!&Pvp4iKh;Lxdmk2YAp*YRVtIkTHVO(wewc~B@pm2->r?*I9^zpl-9{vys~@?T<_ zy7XkRq^MnfYX5cm7`Pd_ljWnYomJZFul+86iPgujU)}p_sy}u!e6!(4PhayvVdiUo zw`4)U5lgqLp7nFqe|decQpsW4rq0Zl|x+Fyp_*ac-OG)6S(_?cZ-% zyC?b|s1RkBuQ~l^w>Rq4vqLiHjoJV0KV7uf{d0Mb@;TL{sIs`I?>fF27K~yH%M2Wf zqdG6~KF!|}V{>o8-!HrGf1bBxYw3THT|S~HiQ|BlK*f)T-Iu5DE7|bEtNxyWM1L{g z>#f%{btOM9`F`n<*qLeImc$vsZP{9JFTA{GtvveI-O6)*xS0H&PJX!<|L=D`A4ktr zH=eRYt#!BV=i)zSZL-UBBO{cdyI#yExzcOX)Q6uZxxz8Rk~8%1>XnZO-MD zuW!}qMuU89k`%m0;VCXylS?g^x^Y%afzWhq=D%7!RdK|bo-du9sc)+^!4MnUk1c>@|`4?+McWci$*FNK0rS+p=o7}yN-`!o7z?jgbYx|XYHBf5g4X0S->YmJfIV=0U-mZ+#?Vol! z{cKx2zg$9d{+!z&|LpF(cXOmmo=abHmwc||=C#Y??3crbR{Tj!Jvkdv z-}f9n9|4Q+XX)FzE!vH(up>K1jYr5%z=;E@^nt0yBibu{PM1ai%q0o-pWi) z)~@~Z>%LZr^feCDoF3uG7uruKR5o{bKtxnTkanj- z3#_JTOcTu5-oNbh_kZn&H0|Rr$T(j5RCDLHR^H!DJ6K<;K%CA7YI!;~2R`b`GdO+i ztm@3mn&(sYG)^^p`S|UZZ{>S-TJU}lT|EJ{23sT0`1}3;#a~|f-w*$yaZZr!Im_Rl zZC~p01Ro1dc>3Ew>uql5c~INEm??JQ%s_LGGuyR%)%QLMeD$pN(wkqqj>|>+o8SF1 z+cs7aweC4^N!ViFzt%6)w(r~h;`oE_|Nq4-vR9Yb()pRoInj!Hr_D=iw#omDkF9*= zIs1<2(@2IH7Y+P>HeKyayZ0<_+lua&6~WPUSGHb?uX|Daa$~dn3_+n)sQXx-c_$dh z{$F`tC+^qYNR!>4f7i!}KNs3r@}~9X4~V-bf-2ya*o7+t&Ap)RUYzpo*>)P z7kBGc%>gZxga1oSydjlGvW%D{Z)M`jZ3xc z)_SSxFq|n+Szhz-m$cTslAT-b9{8sgRVk=t!WMOZ zP9Kf_e?R7m^`GDW&vDk~*o0dCjTY^`;;LD5jOY{GnJlZW+;~UYpDOk%6!89$hGcT zufN*G{p~+E``(vxB~Lz>79VgCMy(@%u-tmt9luB8ZqaLJSJA8c-#;(^{`by8oxFKb za`Gu}t93VVnD4EeeE!mBlM`~EYFFI&5o{VD@u#0*rxWk`V9c;Qv&=f}rZ zq!u&&UiW_gdu?6K*@2(gUN70cu|#i1FTdg2&zn9Pn)_}pU8tjefXTsf_R42Hm5$+i z3;*~=id{dems!>|{p7l{`)z|Ut>F@P@-t692n=k)uuidR9KO6m@M{TX)4lLXH=XM2?4ueTu$0oj4 zZNba@qhm6UF1{kq`f}!wDnU0d?;=>CajefJl(q4sSKG;!E`I3U0L``-VP zU0?tDckl1Ld;Z?}L6x(ZuS|WlWU4mz;ZK`VkKIu@d#$y|gi(ya&3M+Tqcg;RY>@V> zR1-CyKXsa4X8q^a{7p}f?kJgbx9Iy@`zdz+!uJR1u-T;b3ZTXWt3bu4ll@EWs~$&p zO?&*ky0*UG=+@8o|I=3Ym%0^B=CaG%HDj9WCQySsyLQFE*qKG-tFK2v;A-4 zi(9e(S5{y0HUIm2(M(>`F4Ru?GnWTHeu-a>{{Losm#<}Qzx-F(d(YT6tu+e&AUkpI zOPx5ewx_A5dv;pRTFaek%A~^(^4KJFwPxIlT_+dy{EMoa+W$|(BWmW4<4acWe$qVO zul)Y!`^nB|5iTi|k!w3i@9&58OPJaFMAkmpzq)+?@7LCQQ*PEcl+L(pIXfo(47f>h zL>e^K$Hwc%8s2s{!tVT|#dg1(A1pofqQBvM_pY+4%d_uK=abvBr0M<)P;LPC>A}5e zVPOrw2X(J5@1JB>e!1B-^xNIo``2r2Ui~SrdHQnq-cKrLox6W8D4B9^Sy@fj>_uB| z-#g11!4Prbh5yH<>%A-H{n&E!bg3`=>we`uF|YtItfuam5^^M=qr%M#M!*e&JR+z;vMLfd7Rz8>D?I z)kMGhdde^T*Dxbw-gQs;(zRcnOg`Qn&-O#KPVzvq8e(!pfuT`Tc*p;L=F7J4t@RIF zT^oP@=iZtfarZy&y;5FNeC4(1^m|L1p8Cox+aYPSQGfSZCNTyvi$}qGKK$*Kc)Y9e z^pd=qr@!shmVM5=>2>|={@?S|FSqOcwZDArnltwi&&$X~Q-m**zs<*sUyj+=WnbKR z@cqNPB{$2z&567JT=#r^&+MhO0amBx^j;UtH((TFkg~CGj=Ajn!gtZR<+}5JAF*fH zxurzy@9|f!m)n2?R=HX(S~A$1uTkw>`MCdU;1J1|Ev2JhtFotn3v%9 zYsaP3bF*{b8XWb#a4R=hK~;=FtVYzQfSG6a!ztqV317pi^jH58H2nQ<$$t6w*NTr$ z{e9`{{9o5s-nCoShB`!hU-O{S{h1d3-lpvK-*>iee(%_~oPYDny8QS4Uy3t} zuYIvQvgN$;J{M5$;Xs1#1`dI}-_6r{qIbPne6n6IzTRV%XSL=@@qHiK7U^zQM@?6c z1#aBfp}qHe?fy4)@BHr{e`{T>r#JWHruSdt^5Zmf3t2BmPI$A7?Z50a^Ng24!E?Uv zi0ZrsT8$E z)9l&bmwD?|#(tdp>*68b|97MBA1^MNG56_HyG09Z=AS#dbhYlxKiA#NCWHDFEZKj( z)ORSpNz(-lV9nisP_#d&K4eLF)s#24_CJ2qzs&mmAAi^8X=v?}P>!5Dy9xh3IsbRx z_4PA5S8?t4ZSSvi@lXEs&aTho{iE{lGtS+d(YHYbG=wp!an;LZ`va40rklh%I`Pwfn!;`PXj8)Nj0zi8N>X%CUhVp#QqhTJ;@TR|0 z-_8F0-u-CP$IR~I3u-Pu|FqclrK;KiCWpgp`KP)WUd_!*@x1)nO@Hz?cGchxAUXNANjrKmTaH*|KqXk z%c|f1y?bHXR)0k4CD3r-o$7|IUki5Cyx;E?E@r>d*5csy_ZJWEE1&-K_xq2VChB=T z&a;wFy7j5ZDqc-G{nPxTn*yFnHE#;|x3qWt+O<=k^`1B(`o*eSdu@f^tw$4H`X1Y{ z)W4*1Q|GQ3c8Y)h{QoxjrRDjbPvdSnp;Rs#yg6@h|F`>f@%mE#+F$dU9P&2p7yV*5 zS3B8i_6GM%tJ=k+h1K;CEtnMi%KXLxN&EPd2H3q*O$}n zckh2uaMQ)k??poO)8)nWau zCsV{3O+IdaCi?x-qmRMmf(m{=l6UQ|_%Q4GACIbcFY`5K)p&)<-9R1$Oi<;>$*EC| z{dDm9^63296)*bL-UL2V`)xUQ>SoVfr?m4ny$Mdq^?!5rSW}Am)xYM;KmS}>D8}G* zQOBg2wW0Nq{M{cc-3+tt{C3;pSLpletY6{DJ4_8vzp8&~{%G;A|K-6V`@g~VQ{p}} z-S^7QRdt)>C>3=%vSZWg zxBph#tY0mX{wbdGvQtk4Lj=dSSG|547!rDKq}Z~p55BX+E^Yk|F$SHrJLVtp&fm4^ zWZlet(dV`6zx;f8RR7=lmo38k?n$9!_=HqW8M~U=s?*W+wzgj`OkC7o_h?@C@6I~C z`>%609W3%$vC-v-;+%zK?GOiRnnLG2LQiJaU-HObQoBGxM zPh0;(!?K3)z$?qwYuYsl}UpD{W%Kww*m3{htCAHZWxxA6`Suj_w;(_kbC;xp{UcHo3 zJ7taW&+R97&HwUyN8-gJ@sq1OpU(Vp@Oky$6Bd*IPwWuOJHT|{Q2T;e%*HVc2JAUT z`3JqbpWD?5DjaLqW$TG!skmnB?`Qx2bH2y;T^={!i7eob$e|)@B>8EvcO{C*@QA+avuKFC4M+IvpG^@6uKkZicM|x@TsvHnc93 zU;nU8mnp;W!09_j?!Ru+W%?p66!&|x{VYH0xA#T&3w*fp(Ib!x*>BuR8}`*j|GKbr z|E#=yKN}A*&yMJy^+kJs&L{cT8@7~mJzv6Tu$T3u#QT)CnwMIhAg`Go>R@ef<8dxk zSBqiT&{nkjRowC&Cncu)3Dv!$hQt>W$#dh_-)7FDaTWPJC zfB27H-r*z0AZ4zySa#M&r3T+ax)qX-XRVn1rO@}=(%`C?ozwj6|3j~ds1=V(uLo7s{ad%`&yCt@rR++CC$7`O)ryA zyjR0|<`sa)PUKQK_KmYHm2z+q;q$f&~Rm|(bjf=Cpp8q}Xzx~dyfQRk(S6)x4lgSh= zo*H~7rN=w{Qq!fb@+r1^A5GF)T%vpO$$qhQ$0Rm0T$r(N#rqR2+zi(isD0j7xIXxf zclYltYJV?*?0qS^UOV~b)-Qkc|4jRmY+n{=_4CR5uYSVFo&N)KIJaDO=HF|)_ox5; z8GUkhb#Ct>i6go5H8^d0Amb_lOf9AdK z|FXN?Of|1Bv7P>{^6(=w&G3DX)RJSYCX2b9To?L3{^oa6(PW>0+D%z2B)J)QWoKCB z=^j*a$a9*1Idjqc$@lh2|34W%f9AgTzw2!0Ry|zw<_h z4+(+ozDwMFf21z%{A-{Yt)G17(zlHQk1v%PRsZbrUbP0ACr!`IU~M?Yd$NL0_n}h5 z{0q<3{=|vrPL1zPphBp zlkN2W@ujIJ=d3M>JGNu#+hoOKOJApa`y@I&BywrCr`rFm1*Vr~ur|2yov!fHy{Xio z_OWh}{Nq%!xcrY>zucPt_hQMd^8fLfZ(El4yZ58mrlAPR|GQqTy6Z)%I$Apq8jn-L?wpp`zJ+z_+htk*PCwbNwt;Q- zW`+w74oV*1$|=sU#&dSa^QPTONEb>Z5R@`m*`e zZ|yzq|D3x&B!E*1l$-?P=nfcF4 zyQ-^?{{FP{yshcqBmMthf9Y9ooo+O1N*lyRP?PpXD9fA3|G(e;zWn9e_Wjnfw#(*! z-|V?%{+8oA)P8RYzU4iCd4=CBz3&?n4feKb>|K|9;kSEPT)5@AC;N?7Ej3JGOvr3o zHE%I@9E(AEuF*UDSr@#Qf7!sf_tTy&pHefQetl~H>*e&N?7%~er~P|&|Ie*2 zm+ilvzr1q!zr#wkk19+wkw)P*Y+~8AP0qLc-cR?JkILV@-23pp+WEpF{n#theSa*T zd+Pa;m#6I7?tap7d08ske9wN<=Uq{Spp>rLYsk&uZ5;C0^40}c2H$JDg}?lI&ld1A zk(+VT%hS{MJ+Z#*9sg^6rRRf+>q1N6-K_&$LN|Qa`S#e?e$c-c_2gJM>{%B!=VZNZjCbl8rUOB|*DKDMReL5Zb*lM4WBbpazTDaW`B%v$&+~Hq8VE}nSfJmsDte}cFj++Ukki-Pis(;^ka{rsfbHAvuKR#c5Z{^FW_P@?w zHm`fUy36Jsf56+ILx_fjj(p?VwarHj|J!S;{i~k|p58j3c4pRz-xYHnXzRZ!&b;|- z$@R!P^*!l&x_doYH+O^TKj+In|Jol#&h!yu2y1G2FU7#1tnTUJ7?P&3x-{inH^Z|j zYIi{+U)Pqze)D?1_5@}Hk{mhig$CM?9OdVK40?CUb|zu*!Bc7!zU#d z(=ukA{2ySWJ@q8h0WaS4t><(y1P{!)+!8IEGyhwm?;YRe6@FE*Q!CclZN07gU)lcC zo-d2!f3$x2vi$$vEED8?N*QX6-`uKxOypn2U;iWbWuG;_m|a$r?o0Jg%T6!dyUy#* zb>YWZ=3a-@=YmUF(KUBm8c+Ur`7v#s0XKuUdCFvKn^sna;zMfZb_#s;s+N2_?Od(N z%I!8si!Z%C_2}@c50$a@aX%O9d+7h!S3hUozpd%tYEFL@McV7(@R&nH_`kc{--27a zzrTGsEm~gd&SuX|YVT)dXxsYy+OuiL`rEfx$a+4N)P1S4^t9*t%{%zR>J}Y%Qm<6w z9XW%wVX4fvlXK@?QfjbF5`HGJ$nWJGlh~>K^KZPhZmi|LX5c`)d2e z{$&*922C!0Ic1$vv00$_?SOr^PJ245?R})CJ0tGk@ukL*%f6dAKL#hsm!KqBRpDN~ zF0q^8Swa1!x&7IT-mAa9^fblKe9fBkw_l#_j{CCqrE2=$kg98&>ulD}{b0J7GZ}HF zse*wp)9l&&OaA`8KV9$dhovtY+4;nCGlFy_)gOC>PYlgDb!(!XI&bTjuGw1>Ky%gS zQfA(}&C_fAQ@$(xsc|Gj#7{-Jy9ZfynPw!L9o)8{b6dZ+xzDkadvChUU0S?r&f4oo zcP#xqKmT|1d5`rqPyLtV|C|=Se6rs!vEn&M0b#(-Qvi>f)b-dm8%vAH0TfT*~ z=Ua=LGhKp|R}yRbI+-T_@BFaVCsB+cEKNiGy$7>6oxN|me2dOs^n4U`8hQ%D-biVZ;F_XUw`lM`~ClbUoVc^O?$Wd zeSo9$5;U zK*t$}zkVSj#&||>wuSbSN3$Yk_deS6IrHe_BX^dI_Fp>XHusX9{;}fB%P%Kix?XcO z_)`D>8<8(9&sTcid(WLoR6L+| zhHK}JlE0m$^^d}U8%obUYlI?^Yl5-`+v^b&+)T-`qTAp znln<|NGM#m=i@K;D`eO6dHv$M|6X6#%znK)$9K`{6IzqYZn|WC<-dINTWWR{w_*IQ z#7m!aR`lhq`ky~@Uw)wCu_ybPmc*tVVmhEF{lV()+|No4JC~jOXt2_A+ncH1f`ltx z)>w(JUv>Jb`dx#YU%#^ISCmzKocVlN{;y^7e*V?BUM_=eZBSrnjP+SCwNGZB;obiS zM2{B#4PUmt?rUdLtJ>u@*N;Xo)gPrjzP$L+;!nx7sdh8&HGL}n*yng&O?`(_3R=tb8|}4g0vt$o%B?O^d(S+230IHbZ%@ zC%4_*t8*)lZD0Pr{-O4z&3?6+RzIIS|CVEQ45=p>HqBvot&OZ*jdRt9gRd`{UXPpm zZpY(<_3LLj^eeyid$#(B*5&uM=(;}8GQ&999k8E$-??qJFg9K*7K zEjMTmci{WWU7(8Q+VNN6Hhy;?d{%2pI`p?xOU$ESti+sUSBSK zTzKi-WxKquzqa(RK0C*+a?&-{qoAP_JN;w2Z<}9z*tPMI&%fh`wyoyc$gp8`TlJ=M z=Q0Hk%-M2sqm!QA-06mSFIUYEoLoKs{o_^k%Y*M3WY&K9X?M5R{(a^0W#WGi@Qc0Y ztqAECA#pM4{JIdA?ax?5MdvW~rk0vq3 zGm*13v^Cy6-LT_n@2@9n9|OfNho$?OuUZ?k@2l^xPd_BnYoe|GZh5{u*#GanFI(e( z*B<3;%zr<1vk{^cFyLpJ{qn}f+LtHQ^F8@(3cPpyoOXV>e*MphixPd)_V#>?xm8kX zSGY;;a#;A4qa|~{^{jj&dfsz=ccJ(1gs;B320!OZotnD7gSBC*{G*rU1*f_ho-OdL zIo)*r^wFiKJukmZ{;D0Pc3SPTWv$=xs`jTRk1b)Hf9_?9^2^+yUw!X??0VF4;B)tU z$v^iVwH$bPl$+IG-;cAVSyC9$k`4iF-k9Gfb2t3Whx(mAX6}myP1Q{LJ<~4RX>z1K zc=|=~Go-RCqaZgO!d)S+MoxOV4va;V1k*YKMUy#|DN2sRm+= zta?l{_RnJZy#w6EJza9j*fNL7K5yQ7`(s!6*MHv?WAkc?-^=R#&-0f&w|)O!WI2o9 zYaOmRMW@P_PWG$XCJE_PKKP&i{@tuC7VDV%__-s5Jj?m&b{{4ak!|K0z0fB(<(U-nYX{OYYaU-lO2Ec?3ctJzo8pLc9_w|)C6 zdwAoqz1NN{(Vu?i`?`obtIr<0@h81gqkzSNp&)=`Dz{IOfP!@T-Yx5AXLeTq4e=?y zw9M>JRCv(htt+qDt-f}1#`WtFt75PHKYZZuQ~CPOUqAg=y+2aU_E%cvhX?DY_uKzU z+gbj9b?Krz-Q0{U0uBs}EP4G0o__jub@J1r|NkHVbh&?j{J!7+?oU_$|M&OP`Tt+q zPyb*2?UccbHq)zBmYp|u^d%e4_WxQu`&Z1p=;*lX$KFQ#j>}HIG~N4JXY9(D96ytD z&+NUNm6Q)KITWj|JTZ=cb-!=tU#~x0pBZ;5&u?q| zW7%fcqZbfWlW+KuXC2I99`_;ni+14s2?y8@;UAS(2jQnK%?07??PEL@It)?X3Cyx2W>x-CwVNfA#;gKi>R@|8)8KnqB{1{{64_|MQoZ zpVt5X_V&}4m)&1A5A`mWt*-6O)Yez3m91Xe+gdAmJZaYMlh^k7|A?984RYtslDWAh zf77+f_iidU@@&6A*QON=>1loWwe{T(E>?Mbc=>BPhh6M{vBp2Ya%?qzl-O$A zsJpxO_sgn;5C5(oO+P)ioBe&*Gj@otw);B#Yx(!;?B=IuZ|$qx{CC%$ntge%=IgJI zJ30TJeSF-$ntlH~|8D+z|A~G4|1bagU(df+zx~fc{`0({I}ZBv=AL_c)rQO+NJ4-ONq0)`75$G7Y_ zplih;z>@#?o>2E%(PM9Kyk4F(X|lKZr(4I8%;dhM>P(MK?*3u8|J%L2-A_M0Za@9J z{$qiy#Eyu%k1sYqeRuTer<2X?r~g)ezkay6|9ZUqTFaOA5&u08-7RP5E}yph^?j#` zAOG6Q@5vgxxcfe?W|Q5ayXA+wyXWhQm)l*sQdC$Tn>_b*Z27gyO?9tJpPxJbLtS`n z#TjP?MwTwtdwQD+*X><*jd$DLb@%qg+>5LIvHe~C^|Nzw4!u?Vxq7>N*0k;U*X=9! z$9?|wb+c*B*1T)=G4o#+-QBZ4qJD4H_t#HXi@%;V{q_Eh@#eq6!%y?upIG*<=;vd8 z{cHax{WGrCzTBTHwYNeq?eork&%C47yCs>)NoU_#y>;ibeFklx56zIxzMq||^QJnv z^X1a_%O2m=o&EoAi%tTI1%rV^$!|`XhXM|Ac6WMiZM=Sc#+GgCvs(*gZ%0XYe?9y) z>(!y18#nf5?_aic>&m(rpO0;f(9*Nqd8JHx>ffB1!P|^NA*or0YfIjTqR&Z{`f|sD zl4oDux9wBeE&a?~-&OL@QgZ5F*5>M5J%6>jQu^~Rsm-}yLH){q@5E>Sf45|Nog*JZ z-rxMjLWX8O#wU%z(sugk$+xawTc>W=d)o};?4^%poxl3x^O9G&z1RJZny9ah`Bu5@ zMEi`h%YWV56QUF2ot?Y-d}^}l-)ohs*}=^WOdJXY)vQtG<*J{POyg{NmL4;E{?&BZ z+M3vxuWw|76T5le(JgiU_o}}Y*slE;CC&Z&UPRKjOVu}Tth1B;A6w(&$5FsA;eg^* z_XjTgOi!Mc3ddc#-n;zV#vs_xauM$1ATr zJG9Sy+Kjzle&*(s&p-P=&q>S!YP90xLpYQE3S@!IUS+5_rBS# zf5uaH$3klzdpM)|BPK(YL@;OoNjJR-xyOhKeyzE@pSt+fdYw-;~QK&#Toe+b{TB)=sj@2nW3`h zj+_3O<;P~N&dkmAwl_Wg>`QF!nQx}+b7x%Mas646nSSlglE1kn7T>ahw$AcCyV>*> z|9t1io3}0hwr8`|rx*@}f?Z6`X2EkUqvjc!t55s>DDg~RZhYMBzOC!mp3Ppf>}yu8 z&ei<0FO6^iTsh;(6Ry{}I-pRQySbOI{@JH?V=m>Kf7}Z-UMn47bP#tFTPZ40!=cbW z`F2EQrS$2qrti1zoN@O0x371TKAWsxyY}*o++6!LTX%-opPAaT)J<>ib7Bzv6Dc_;o(SPun|d%eEzN_r{&HT?uxFgtkEvbNH^bReIC7K?&wH zC%cDiz-?fD01w{E;t7oncK^GoISi{CDHXWC7@ES2f~ z`pujT_mg`Ie2;-s?q|*yZX2&pp1NlGs?Mi}D$d@xRt0JSL5wl{DQA}V``6k-Gy2}% z+3>zM*|76<>h)_8+o$!`n|q06i9BFfAlR4rmz7PP=>+rioG*K38KfQGx$jx^7Taqa zvWHA_w4v_Q{mU@e4~R`fA2VZanJQ*NoIQBgtq1Hmn755=;*uYkK=uhwKy`#Fz_^`-YjeE z8Fq8#QiF&{C>;mdhyncA$y-~*?NA###v?W|IDfm>;~IE-(kIP{7b8iyJl5HWFOzA zf2-`x*X-n|^=tRGA4>v7DJp38Pc&l6y&WLW`<>&BW>K@|m=ONKY?7*BbnxZ#SKpm&f1h%lyI41QrgHd> zcVfNAP3OJ9F;#?Csf0 zeduDBa$&*}`^ZQ}V z?A0%iXL(=uzv}6ySIwXQXWfaFr;mDnj#{4k!$xYkD=4=+EC^jt`gq1{@zc|f9o{u- z<67IW_D0_>!63nN=2J3@nhnPU@!nj!y%iFx zC2vRF=AVD?S<>Gta}1vMW+w${Pp_S(`{`l2*7t>3udiNdD^7kan0@S>s|={^{~(RU zEsr7ln%~u9MN13UpF5Tlf936sZ^1k7mHzsAxb$%Pg z> z+Q89g&AO*Iv)AS1pAcW2=SL4mSWJ7)2MQP4?BZH?Mb?e5x$@ynz&A4(()b6<0*ZON$ zerboe-24%q5NNfOft?|^PE2l9=z}(XrYDBk<`Y)_ia6K(y=UsWsa5g$ynlOE#$@@< zeZO_5>0V3Qq~p8t`_t2TSp*y&%wf$d5teYcc5n9*yHMfNSC1UNRiLvzLg;f=QgQId z7{5;sMR%7+Tu(i7Y(KYhw~xXB#se(!jqWe>3tE~PDm!nTOgmF z>K;szT6=X{YTvos-2TGz*V0qvz{Ol?qx5}^S+}>}*`4CIPHk%c)2zpzW^J_G8RHq3 zbx6B(|AuY1XMju8Sw0QS4JYk5`iC**I^m=rPl$c}~=A3AMWcZugr$9nMe`|Si zwDJBe+qSIx`ZN2Q{@)ME*L3!pmx3#q?d}Oz+_t9Pon^Un>(bIsN3*l`-dC)CUY#9w z^u~|y!oV6ekYOj=pP1faRkP%{ApT=Dx5drdn(BAH{L0p%xAUH#S?enY&SEvJ zc~!-`p4aIXXFtDkt$M$4)tZNEqh*u96@#(R1BM4Zc53T4#V2e!%uu;7PWp!J>o+r3 z%P&1HwJR*Q`b_n8JMFJvXB`)}_~y3t_}}R38FQc4Zk?B1`8xdQjV~Yv9RoS&*(rloI}P4lf6 zmY#errh&P^`2T@D_v#uu`I)~wb<1yXU%&qS!neNn{oi|o%m0Q08jZ8>$@K5L|Ke+T zExXyj-9Kj3JOkPLll|G(UtDtzBsT2(u+i+|@m=fpnL|6a&$SBH_!aN4e>-?3S-x=JEDgG%SYQlN(qmlin6RCpooP2`B)CpsU}RzA+Hh08+UD zh&*6;aG`~RiNicqaIOAz@zr!O0+Fp{9UJ zAq4|a*_F6Orw3F!fkhz10UIV6hBKdaD}>OEYU3===-&IxQNUnue)|JYhye(rB-9Qt9x#X!bAv@ZR6&9qBOk-FpJFzg z=tdo8v0#vJJADY*YaoxDQ9i(Uz~+9FIylG?HaH~AU|?rBoDnI32s|*Wv697tVaD_5 z4=U(J@d!U)NRZIwhLp4*!y#cg8X2RJ0m&nyIRiE454D`pXwSH!h?!6Del!~c0|SGn ztDnm{r-Y`=WJ5y+29{f$0eq{9OQU%m!@MU=`UwO#k`Q+5S zeGKbz7ldtGb6)xMD%r~)lmkL@-%IT-DB@pot?`HGhVA@4&t9HeT5t1eRrQq*3v>Ms zAJMHCh= zBiJC>em{qk3=B*=KntlNIFE)K2B{eGOj-GxQ;}1#hM^hIC)5On>tM97c5iUD% z<0pgWN!J6>&#r7sJuO!`V`bB!(C*xwOQ)&cmg=b6VcA`OC(qqG?)06%wb$g2pD&$r z`bWkZ0hLGn{j*Nblb4^odpCEscZtON*+oyLM|^vd+OkO4 zy){=NGTCFw^j8uV^P9H(miq8VM*0&`m20vJ zi%iZ}JEU;qu;E*lBS~8pI!{yX*(w|Gn21#*7dTw~3np2NOq zs?Wa%s)s+gl{l4r%=c~)*42DmP*&@|_h6radtt$nqD3|>(-^A~=57CB%xGft^HG>< zwi#1*uO4HYM~lXj6(;8#5T`wZclYnl4!@PWG5so2 z#=>1o!v&dq+bXXLER=gP|ACfi*0rXlnnk9fYt+nTeA(3}W(&06$ay8{_f*2+PT}g% z{{A}4)6OfVCf9BCI2Iqrt+qS-$xq9^FG1V_n*V;jZ``~&;I4$xyZY|=`^rVMQ;&#u z+hn>oh#T(=&?1d*65{c5p`3(<5b@pWof>9J+q?gB=02f=i(+hM zs=e1~xnYfFlHlKp|MFo{%UOs*SVX<((V7=_r%Hk-$U_GcoVJgWviN(c> z1ce%y8kiS}h&He^ur{!ThU$8&e0~~@468B=?=dhi zPRw+64)An#RtPA{Ps_|nWnj>lSUcggH&dXX8L!@YT5Hj217bE^s!2Gm@i|FMvreYJVrw%6|~ zZ@-whsg1*;;*n2 z(i{D!l(Ig!QMZ1H$CBd9W~+NrkIkHRvxZyy=%yPL>c1DNuReEnQ{5>=7s10kLJuZ7 zO0tS19`X-WJ?b#&+~Ksct0{*kPTICi{L`kB?I#xM$Oj)al$YmWInMa(d%pbasFwmW zYS`yYT{i6|qn=sg!S-d(Y#FLfuKw)pd!cpLlO<1zEFV0blHNtpuhT|Cu}`Q)4ohmdDfs{uQc|MHDB` z^PbN*%jeYfCG8~-!vdBrtqh%X|Iu>g*C(uVa)XuCp<`K0vthz63)01p2(+^Q= z!=4^kCY`;kR`1Wb@)}1k$p_!Re-923U$}Yu_T}f!pMS{Bw$|~`<{19%5;X!@VvPR0 zHWHp{4>X(D89lQZ4$PlB*ReiZ&-!`w-?yp_58l6jU)`I#*y)qV4YvYKyYFreXHML` z8@ndU%yOBcvS9zV3rBwi#Cn*`V6ZiH`j$5J=j#dlV%3xHG)np~Ot^RNT$lOj3cUiU z|GU{Ha4vg#)U~?5zH;Ru<8@i36&LcHs(tdW_sVJkzv|QZ`CIvl*T)%#FU|P;cD7ZGMbLJ2 z^Rv5nr{0me@FKq1K9A$oA=3^;P7&rmhncl`!s}Ai z;~h~S77E(_(VC?{rNxZ#+HdKMp>ou1y{`+7*_tJUx>#uX$esVXrn&ZzBFx*iGLyc+-QQc}n3k0--R9n&b<)Pt^3y`QYK{}O+)G}2AAi;u7pa=DtS&x~ zY0^2SLs5l))>ocYUGACluRE=OQg5UC^IWE)b4)k13-lM%Z@1<-$Z5m4z^t6*!(9jQ ziXRu%7=k7=h@3lpT7NU&?70!KE`IEpNqt-RZGM>?f2jQT;{?W>^2&2FJ3cRq>#tL+ zmw9t(spD_A7w-6dO>!Ajw(nAmJ#{3^@~Wko zuV=g4l-W$YLRD2qJOvi-s4u;`Saa3e?9W%);U*~k;@x&coLM^uszInImR>YGD z2R6)4{?hEH#udvFAg`jZK0Nbt;*>j^+UBSmY`ed0i|c`9j3u^myI-~a+H1&^l#o=! z&~x?Z6U`+lf(9i^c`YB+zjvOiXW)G6LY_|P`XfnPL3~V4tR_TH+xDT+`Ngp;x!umc zlI^FQP;y|Bm|Y*fZ}q;r-*}EX^s&AwecUCj{Gj{SqA7nT-mKi*=yOfVU}gQgsYjNC zZSGAKRCsP*bxL2sYsmN6_dsdI)U#$14;-2H?PU+Jn>S7CG%J5mlpw>08OwJ#{V&-NGLuFB z^Tvth3}5HFSqS_wYp><2nDAiPfnbi`F&`8T_%Qa_uz2$p{%G_5rOtS|CjLhFv^Vh$ z*L%w(hO)|U|?wA05t;++a;bJZ3YaVWpv94_u=ILgkYv2JzT zmsf&;=c3#vY!g2fxX0V&`d+(f*^&LHg8DyM6os(lc5#X1aW8dh+-BmC=`CORWul3% zQStuy_s__wU7ne8DMd~5tp4ly|Fif1`~CgS{=c`YmBLga_EdaS3cV`O>CzRFeE;f^ z#~=3z%g)q%HC-=um(l!X)1OVwSdhu|>3F|B$j`~y5+0wsq*@^Vt5wxhmOxbv37+&P z;%^pr#}uf2nyw$8mzlL~;reGHJq&IW?uTFJ|5I!B#C>t4=f9ArtcneSPnQ4Mo*>@b zSR-Zrg2kZePt!x2&<_cU^%po3Sbl2Ch`vcOm}tKOA)`FMi9J=KLPdGLpKXvr?TYrT z_v4%OZMzyh;29=j3&sTwcQ{+;A!*VoSzE<^Na1<7JQd z>(&Ii3w>|DC*kuX_*sI0L&j{I0Czb?8BdpnX7#ftC%^jM7{fDzf$QRm#+rco&wOR= z-?sl-=x6_;u3_Q71rvY$zRt`%jp6U=cP~6;L%f%@aGwACw)4!NpU+O4$6n-IuypCs zd9~ke*4z$%P|_;NWVGqZixc}dZ{51}xcQaq*T3(0|MuCUZoN&a-qXHJOF8hq%a4KI z=0gL2GTWU`iE#|d$`ke$Jw4?d_3K7*zw9TS&j*dq+e|jiPutaaPkb(e#IZZ2({KLy z$(;M^!#Vqnl1Hw~hbf!q-;3FDVCIX&tpyD;@4Y**yxQ%&^&UT_pJ&gWEjwd)Tqch3 z?-^4SmJ8?2DB4$d_MvUR1q((Yh`3lxq8w!Z)+~Z~XZd+HNENj=#ycW2UWz z+}`~O2bs8CE?l}~^TO_bOzow7rW;ky=W2UhI%Yn7$|?>HhvOetrS9LOkgT#_flWcc zDchdo(e%rC+rB;)Pj%fTF7@wft!>QB`s$Zq`}bAd-X3(m?KA5M|9It(VxOYB+G>8O z=QA}tZoR`cA$n7KzpJ$s-^=?El{-UUXO@?46=vk@6Hjyyx$G(+a5&O#kEew7OV%~= z|Mh-9-BSOu@k?`NX^GnU!#jOS8Rxjatax$6`p-W*!J~h^sk;iyX2f?EB0&{rJHri(Ph|dZo2rUindU{Js;{^lQ!p2!`kHKJAxR zsbleF zowKnba_0Tx?o%a`&#dTBb9lKfHY_YORejCA%W-iZOgn#;-`r#@XK1lE_qks+_sWwp z?5e3Dd0Z*^5?bxg7Yhj;xWDq>w%E>e0lp&)iV5aAmp>jncDwY>M6EOp{a>$d>#KZv z**=FwV1m40ksGI_L(2VsM{Z7>tH4lyq3xx*z$fLobL%3MRtmG6SKz7te(SYa==IfJ z`!Y}G?YTJd{;uM1rTQQ80_P)B-T7oZ6y%sV7!*}FmClvU?CbFGyPkWBU9o4j$;GS8 zS&T`$pWgI#emAjr6Z6TVx z={{a^ZR@3@lV6Ke%HLmJ^yEpzhHsYErEem#cYKIVn>v-#Z~CbXYJ$ui;zi1Dt-RIU ztXeCsit11OIkV+NBVYIQ)irw`*QVr8?^tu?k*L;U-z(<(u0@6N38nv8;+YqsXZ_e; z*+sz0pwg~|f$7s_-n}p0srkzZ207Hoa58M?Txh7s)RDBez=5SBSJ1KMe_eNv|y`of2AWitoqW)~sgCJaB@^(_l_clgr`ucmEYx7A!MS_;z=K_v1em z%S&u!dOWVhzj2sd+CBO4CSIjScl0`6PSOl+>EY_`TUX#zuw=4aQlkaS(%|J$*T20D z)4u({$@cdh-T2M^|5J9hcx*4OSrR=*k4Z>R_ny{o#v~`D0){zL`@ic|t~#dLvqY=c zUZqp%@hTmqMGjIsUIpy-=r)lsPj36W=9_ofa|0u;pFIm(HNBi5q9A{X;mBgHl$cA?IwuM3_A34RjL&y(=Ys&} z$;%^Rv{dX8C%LXVo^>NIQ}Bw2GPmqnrDa!ROTWeZDVZ%EX+GtzUCyg_jtp5>g>-7S z-w|9}Ab+RrhWi|MZ=GwGvJ82jJJ?(ZF}=2p>tOCw(QArLGZgsT=A6IO;`Y{}F!ho{ zcd{@?qkvn@!7)j>$6-gG_oFQ@ zbiP;@^uK3(WU`h0uwh(qwprMvgi9=*O)XzKR@^Oo8hyL6=d8576GKT{7eiHn{R#2! zyT9tW>^LX>i9avTq&j(Z`7isd?40DvnYJ?7+s*m5MIK*Q8+1Bww&D`s-sv}A*slHN zFRXThbF$j)BOjB6*c2@_{aXT*m>hEzT+=$L&qwS$bZt(>qM2`ar?}2^lT(_xU18;~ zjqE~M4lE+~xK^t6gao+SXb10nD>d`Pj-Hcj9X|7)WpO<@zCCYq>Fp`O+n#eQ5p1wJ zymP)^;gfFbSn=0A61F#ftWw_Zc_PZPw(GCXt;E^h+io{TET6me!ka0Pla4Gt`+?zq z@_CEdJMwq^wY59B>*zyqhk%ZZC7iDurU!cFhA^Jb`ua}W-zN9}xr~JRBo9g9MgH@* z8JC{9T&nlu=&azDE1ui(UaM#ePv31KVEE%h!SS-%b^&`a`K1ZZ`KtE?UO(KyaOwCj zi@GjOJ;q7X>iPBO7w<38J@NipfkDB)Q<0b7{x91eb$LeG?uVPx!ebOewb|I0sQ#(? z|1a$K-S^*a6`#L)Yq!$!h~+$6CNaPDi`b;*p()i7Ju`$ch;^~yy*o+I*VbSBrYDmt zAOE50Yg>W7(%bu{>3biPpYP;&*D9g1WX18TK4&Y8eb=!l8ws^-%lz5?%1B|~x^;S2 zTaF!b+pj04$RZlhpI0hy+`ZLP{<8PZ_lq+GeSdb@>ZM6WEW?vMf6(P8NFI?R4G~LA4`yt(*cDkeSKc-^S3`O-TmTQ zZl@F9V|y3l_kXo{J3pMhx_pO}ryygS!nckG$(~J?Jz8wK+$Ylg<(up;F(x%|SadnE zaJGeTH~qJ}Dp6?vXlM1~V=V`lXP5jt_Dbycm*v$;@-4*~CFv^d0z39UnY6=p_w)X3 z_CnkFcm;QVRq89&Xt?4iVybYsV9~Lc&8!|R)~*~3|9IqG4Vos@9z)ZH7CD|VULhborU0&=7XO;ZSTAI)a>=2tj@1@&pj+K|F@8# zQQ*+b=RF(+l2?4Q`A@bK&a9UbW%%)7qv4_=uA`v!ScwM}w81r}N=c6P6^TyDv0XSQfaQ|KbxrQN5AM03kDRk7HTf?Gclk@J* z&UIW}S9vv=UR*I-JhP#(t=?X%_Ns1uosQk{S+iDE7u2QAEBJpaTgr0Z!o=_EI_8F1 z9p_xIB-Z)hl11NtvfO=amS&Xx?B(*?n$u4wSaUIa>=)_ie3`KC%Zdl~|9_r87qf!N zjkA?aogwgnQ2JY)tv`?ST`-SK{wjQWRZjHhYM>(Z`%HUrA}Hg z1+OZ@uC81-Pbe{YhdRHqB4?psW7Xlh9iM$y+eWh;4rEXeXR3I&^SMq(?GgruISPv# z-7N2|+yAesKI}w&9`hR!Q9qIG<9i8*@)6>419rbmB*DkO!Wh99B{fXn8 zwqM}g1RHC?7Y8#xafNL!yZI}9-R8}HyY6p$UwMz$_JwPm4ExQZJe9BzpKZ7GcV1go zGJW>ROZv$+egDJ{&5ZaI*id9JbQMAFf4*=S6N?vvAk0U2;qv89vYNIq+|ulp*x!QMIVBMy7#tVXd%eVsY6M zsp?&6n|s$q=YIeDvhpXR)fy+|)>RuPzghEfbI!pf!fy^0O4V`x6y=c=;OwwGt0N@O z(7Evc>1BS~G~d73w)W_cTZv)p9?u#$m_(f4wC}R8W-R#VX0y-5=T3u2N0yiAIU&`` zw=+CCGbX7mQt-KRc+o!VpXv{wdB0Pk2@P#J_YK| zYU?$2srp|O=&#ADAFtt#PUEi%PWGnnPW}J zu>{ULT+bhGO1`7Vq4*%;bE-y-tk2g^mJ6=gYag1*z$9exX}2p!6UTmurjPAj0sCT4 znXa<>{o}uRab9TOj=$H=&$E4P|LV_$)#WehRVvTT%89T|5ouW1ZZ6Q$oYT?t{Oi}R zk=v(h9%28Y(C{icFLI}Qki+7}UqP*LM>nw6oS3#CY{&In=Ci9RB_b}Zbavs(dt9(= zp`a^|V5CdJGHX5&4Ht&x?yRQ;dJO*rSNi+cs)*in-X|`yh4WFoM0sM8SNPMit?w?* zYGl4Pv*(SXY{1Hk&YY#IA2Ut-lXgy5sVVjFECC0T6URUKyW6=iI9|DW^=4%H+*Iwb zH6Aq?jQ@AbE9|Y|<-E(cAo$@oiB$@g&EnI~-&@|m(&3{uS`})-RjeNaQW!X|y{Yn3B zrG)=jBzX1pktsIYI}N_Q`g>2-daY+BzXt!slL7~i-@E#*Wy*?*ioffHn-0e~2z+*A zx^U@z&2#H}3D20gc-sXIY}|ft*B0Ls<>wU`XE1npJMGzda&gw9BX3muJ9sSZMfg2J z)_0fl|Go6WG5KG_<-F%LN<9JGjlX9fxwZ(sVH!0Y%qZ>#hBDQrzQ{=Ulgvk^Fy@5&)?rJ&h?L4fg+f(&Q8!)kAKH|Cd% zo1JQ%`9%e^CT=TB-rzGwJpJt4HQzgyZxTP*pJ8cx#?qeiJc46o7inR zhR(J-?(ggmTUNaJp5RsK+xp&d7tYq$dG8QmeWS3h`24~NvaFfA%6B(zZ22v!a*5UD z#iN8>uR24wJ$X8Pjpt;)WfKbKw_dT{G3S?~!Sf$}D+N6pE801<1r)VbMaiz*rPO7d zVCb>MGbxlsESyK_X{npnl`Uz%Q-7wnoh>TlvF~vR<7}?sd&a=@U0GJH;(?H_TK$?nY3__i<|1igM~l&m2U7UDQ%Z6^S-Z~`oYgD zz@8HZxuJJln{!nXC5R1xv=k0HrOm9c!zI|ggJN|CO3%j?QYd9JnFPojW z=~tE6lszYQ%5fg}JXKqI4-W@JXq3kbM~1huvfjs%J-IdSR=jf1ag%-*U0N4jyt07r;Hh%g1J2$_&S~z*=n`vZX+Fp6v9$LDLyzCQHwP8g@a_6^(f+o% zpY7Go!{Vg@Y#q}XqZUm($a2|h!QR`d=Q=~AbQyzFt)I_Jll5fkI5Xp&UfTDVta-MV zR^Gc}9iM$-`l)Wot6yHW%hM_Ww|-DOyq;?kk&aK%LNiq4WXI-NJ(Z?QSW zFT9YBUX|7%pCTASW?nw4nBDY@TaaQaBM#-iY-q?@V_utO% zw?9|bJ6*5kwX20{mxiV0w&Sb5+hkjt?SGifw{Dk4>YLlIuC89Q=C90c!&gbaSKpGF zzsAz{WzCU&`ufKuS{)c9H*D+_ej~0wKY4rXw|z%8GyOlG9{k2Y(PV~i<`k)u;z2AM zmT%frwd%z4Y_b|JS{1Cui*49~QXBc-Grj{jwYQYaXm^Rs8*} zG(%-u@Zw{0za3~ke#^Kw{l@Q<*Rlf3r*GDCsG1$>zHYtX(~is>M!{n`mTi93iF<7; z-&uw!rj%t}dfC#q_S(-sTC?jfGVcDPwt2F@-}=*UisxG^DE(M%`_rX6RPIN5wS}E4 zr}&PYuDWoITKAE!XY`Lu{Wiv zw^vJ>|HEZ_ak7TY*+%~kj|IHaLI)LXc7M5Kp6eRi>@QZT{EO4Zx5=BaGc{g*sUU3G#muPE522W@m3)$-v`w@%a1?J9=+_S>m5)E%;zVQVNrU zCPS7-(2I0`+o?P1rT?CHv2$C}HvQ|bBS-hvE)!;W{EwmW^WQkW>3Tcs)H7oCIxgJT zA0B$kll!}+`6oG-4MH7X8Rs~g7#wk!c%*U8-VgHMwoIG6Q)I$t<-Vu-9Vcd##5YWM zRL!Z;tgmo&_o}+b)jPdQi>i_2K7 z`yiymIO#yk)$BDAe!ri6$lEc$Q|27o%?bVfikZzif%8Ofe)@POx8YLBa(@rc_gs(I z`EKRy%@@mmH!CRd>t|s;c>#t;i#=5j)$yk!&XAwrB)`6X;bpB;aho@1`+HB}F>eys zQ*L$qsYBPpW4_HFH=6f;y72Rgv*i`l=qsH&- z@p6**%$178jX^zjy9SsYXf9Jk^cUEu070yY{J5T1+ah-2s;c77}oW$dG z(9vjlv$yO@78U-}SH9+*oTU0vv+qSVk6npfl6~{%-+$IEVGu9BWO=f*dY<>YkeXkG zozI0ux3M;r<@W6qHW2=KGmBAEho`an`1G@%{M18uPJK8jttjt2Inr@D$2_ILAm6t- zt5c2Bl;~RrOh(nOh^sI}|_|~qn{nsL#^L|B8bz<#yrTXo+y7gzBoj3Qz?t*81t%?fq zk#nk-`_In!yePPK_jIm1M_DFVd}^42)(UCbppkZHHNy9<5rn-{1 zp=MTcTZ>#A9avZz);B&)+cBNhSBh<)9lPgZ>8pR|um3Yy<+yZM_;sy~(>ACYy*~IM zIi-Ec%F9Y!?C1BZZG11Fv?}&#@*S>2LgjAOf|hgoCU1#;pWk<;en+>X9k)B5`It!sGFx&3EFq^-6)*W)icj=f)Ox-ri4u{w*ic}c?NHTdI{%+iRCw{K{r?$<)4CZ;v0o-K`zs@r{32g97cr<0@ws2vK z%Qs#wPVGCpVqThk&ToFj^wkd!Fbf*U$sJ5y?z6pqUj53smRWsMyFSm1Eh*$NI-qc8 z{Sn7M*{4p*?S3%#+mZBt?MLrVS)%aw2xr;SOc?dZtVwK*xQp)0yLUa>J<@NMDbD3VkuN@D zSjXqe%l1iA+m&Hg-is@<82G=F5 zk2D`?d0khSw!Fk}&b~mFqWA80Isa#v-Br)GnZu*$vQ=qL*~wZa`*||;i$br>o$Vy! zw2Hgg-^^vsN%pqMT=L8__PKEt{E$1$GFd~8f%%ItxA?MCAC9=+u(x{ElT((e#JX6`B`oW!8x?MSgkts`Jity{}cODv>$d6Y-@NCsPN13GD`<5)qeH*lYvMYJ+ugjd|5Y+oH?gX#19fyM2T|XCt=tBm3&$zF- zeC6$@{@7eYPsVqOt2zXpIS1X@p%8X#dH2+ihmm?MF)Ho(c8uS{06n&%P-%tg8Qeed;ZfO?B7r?Bo@GdiZPn-vh$R zu{~Gi%36*zeEy*4qQ8J`_pJ#o3Q^*ojF&8JmURDd^4ZR_Ay2Vs!+PIadp@4i*4uvd zeOth8BV&SSOf$90`9 z?GNwS6ukc<@9u8H$J*;7a-QeCb=Y^coU8k^`Gb}Qx$wXHzW8J_D(QqA&3h1aEM|-9 z$-4@2uBuKQo?BU-2#4kbF<(DzU^{8TeP%(|9WNI$U3%Tj@#5xf``})^r{f+YfOH~T$j4dYd|1b9Iz1sEjnW$)W)a&%U|7OK5`B>WP z#vbvJLE7s_3ZL*7o5ykth8^j$XNx|sTP>4YKhx-@m;Rmu$1-{3AMmtR+~4~__FJ&8 z-XB-T<;zO=l0_~$ONcvYh^H=fT=uQ+%~Y02CI_Bb1Up~OpI<(2`MZ^$FLO!k{37>a zGK0s~FVXjRy|6w#P4`wr@a`uc)#tCUk9Xev*lV#_)UUEdCEtFi2wDVf;ASbPaS{G5 z{WaJ?`^m4nAI_EEi1}-iwfR!g$!k}yR$Bc#drht-Ui^@qrXj!LnhPmTd%PyQShP+0 z{L}WLzNW(AbK>m=Zw_;a9Ne4kH`i>H#mQ&qC+tsR`ShxB4@bkKyesz@tzt`lPg4E3 z+|(yW?9#Q<8=8!@rOl(4zS;8m*)`Al&&7tK-+Gp~Mtk1jo3rtN)_F_!Zf7l?zx@{{ zo;*8+pT%j1Z>rGt?NLHccb;AECFCJ`rN>`|>%S{Q=-W?zS_ev|EjjUZ^K*$yDJ;LP zGgk^bXlx7ikWnvx`&?Y#?Cgpg>+Aj%AN{BK!+&9{e&U~<&mFeS(1|pg{K-Ja_HEEU zA3eU*w0V;3@!E@an*CIY7Erh6YHYD^uKOf-B>h{$zwdw58hljzuD)k1PH~#trakx4 z-gyA&oyJ1zUhWI#kL_A> z_`tnc$}i`be^Ji7mnx?H&|!kVH2?I1uCKKV=hb;POxU=-IRD+5g>yQsWsZDnpWSc$ z&%*lOkH>qf^{Vfu)|O7*|K9&+rRa@*m%q~(eoi|pWA^Y~&~sb9c^~suBrHs0u65%+ zJK^}n_$N7cHe4*rcJ8h@#h1Cq*ZGPf>tu%Xd6mxuYJ=Wi)r&bXrRaU;q3A1je|^>e z5gup-hPV1dsEw@B5`pEx>{Pi4H#lFTEFloFB|FU?~)6>(lKWs8tFY`lt-Tr^S z_FN9ukdB|kex&cZS9;mM7uMN#1Xni^iAVF}Bm* zo4rveJU8d2Q;G}A28-~*b{qc{Hf0WLjl*6(n{~xf<*|URh6H2F){h;5PBV-aUU+Z( z`t^I;Nlm>{pB_HQNj-e^uIQhI&&iUU;~;^*ym+W)>WuH;{(@*VkKOA>?{wq`RNUX%k8=a;uAdbgLIOO5f@ zt=H==yg!`o+@L&RH#?Ub!_L(@?`B&@75Yqhdy%8JxA);@=|is1Dlc#>(6^P-I%oFm z{Iv27mmW@3p7P71HRtby_uH4$exDRm$>zdvaJKuy7e8}$*=>H5<0vG`CB8Z(e!s~H z_1M`?=lL~QbcJVp@@+q;qkZ3MWxc_xvs)ch{{G$+d-(5;y{x=eVMP;pf2FdVQs39% z^dRESoNAHH%b%v~3p~gfRdjbHtKvh86%PXXCQTCh-tB)aZ(+>m9+Nq%MNGUbBzs$f zEkF6X-wW_t(Vkv^Sxj{f`)-|6rn>4KFTX~w#_`0d*FY~Q#^S{z77n`4O zsM~w#*^|0cnh)dSC-nU(e0=P;e$>SF`+N3&IK;hm_H*{F9m{>Zf2(I4?ufE)?uq~N zNIdS#%jNUe)&481P=9xMmxBts(tOUzy|c}v97UFAtgZ;*lJ`!3?p40YjNc`7P4xD2 zm)~4X3OeO1TJyg8{^uDXtV^o*{@!YmYjEn3xJ_Di^P+vPRPLI!ZsEUX{^tR^{fE2z zmu-+=-;nxHma9HoJhkXmzyu!9;htjoIt>UaMQD@%Y}Qg+>+*ZdJRo*X=xZTJcm{{L{Mk)%Rbs%$V24 z^0M?<^tDv3cMHz!do^d_R}S&`n!@>C5An$CJhk|&_jJ9|C++eR*nX~E8x=8|`FDGB z&9BAbOfPtUE_UnPG(E1W)2NC;-tD;D@}==5GU)>IoF)W0^DKERTQ&9m3FoeqWy-v= z@|P|i4Bk40$2#%eo=V$Ss`@VjxR)?rdd<`6p8eYT6;Gyy`evO=%cirke+zwnW~T8J zwSy}S9IO_-=uhsqy>|M~Bk}zbvmW&bz^K9Oy#|vAC7zxpRlXWdd4y3I!6wH5N5N(y4&wOlJP&@EHGi>>NS@x1-+ILySV;;!djo#ZW zrfYQRYiO8)kP1s%W&+2lWxfVS%lH3|EqD94ZoA#juj}h$MK=21W|DDY*sEwSKiB_Y z#~z=#{1d6fs z0t<>R{1kAw&>XY)bg+z`GVi*FmXA!I@ISrSIfeDp&sYU3v5#JoGbhBQ3GDs3Z1KMa zgHyii#ji3bI#xWi_FzsjeyzfLEJm-HZ}F5(#5r zSUB2?oMtvp>@!*+?#XoV;SQ!i1-lyl>j(2MM$Z-CJM1(=N%&BC(DB&vyP+X-=ie0j z&ius5?r}}p+aDP{N>+`^9p*CDKCkE1e!F?@YQ?h`1`Q@Z7$?ydE=bIZ#=miwb@TZR6# zt^V<;%sCBgUpFUxude!G@MGVCyW5@JRV1TN-oF(4!hC|X#au22wgc`?3=D_$I#@P# zyx>cnG%fv|iPnOP)7KYvIJQTe`)R8bBH;b|a<2G3<Y953i{F$+V=>Y;Qf_p zc*LZE#pC^s3FZ>DQ`+}8Sk{ENsIi<|7-J>V!kf11!nre5hreI2+c*2SkH=PD{T+2) z(lIQh5|=*7%zkzEmQ=ol!u&GVB}_8=eQYj#lu-_tA$MT!={rZCPLF@*V>)Gy{5}I! z#*SHyzuh?$O3pr*H}m@bPp7o+a=OJEpFKS>`?|kM^sOm*d!sfN6+}}4^<6zzBdAFKR>*i%`7 zOPhZxm;e0cVD@CPx%6gH>7QGYTNqxnCNelT*4S0IF!Uuo`L58Aqm(J}zQUz9aPkZZ)2x_Huk3k#svFvs3vZvkXT`)H zHTo)2A!6nU0z94EOq)0!8Jsc5G1fW!=JMV5-+#{iHE&(@yPezf@9(p%eg8K2?(?v@ zQFWnTt-t>LTNk?goaI)71@9Jh>q#xn-WrwbP<^8}&$4@$Bc%O|?Gd4xa6@AggXnHair-@^kX9E}V2y{w(hEBfR1nYh%|78f?lI5-sFm@(~s zX{YV>^y>SLhr1rg%gMcKIQ2#|D3W1s?b`EJuh;BpJUvY}S!%-ka%}?xF$cjv>GNyL zwpWB)Txqf4u;qlN`KJUK3N5*{7i3R6;K0$q^~buVCQQ_inLXvx^ydAEJJ)GDEqKrB z!1^y!qEqyw>^Vl?<6W1-OzhX4JiA7dyK$cwgXoXioDlokbB&z`>`ksL_`Cbs<9(tG zqCa+O;j*%*2?_OZkI z#`%3;_b{wDaDVH^aKTxQd|#A)B)a=^H*oziwn$pNYWK0mI97YvH<641jr+47uU9f@ zmU)r-;qbJ1A`GHG(hH7+g_id+@8zqrx>elI91gN+_Jj#+FIps5^T-x2xOwm2%RBe1 zXCC`Dg*BkD-e~%|Q@3BsyeR!}c>lbO3_%~FcU)hedv#wI^W;Yj^Ip9cJ-hzc_ZHTG z#`x)rKe10_-pf^2Vfz^5B?Z2ptNb51=r_+d`*udefoJmmnx93i+V!(646LlIe5Yt{ zdinar<%0EvX~%RM;*veC&g){n`vj!E?%WPmhUQhb1MkWdy}kVE>%p6K{;TH9ElN1X z%D}sxEou4m^;+SD30X2LmN5iBjt|}S$RWOXfe=G&?ax)m!ewSiv1>6JnEnf0s?GPs zl)Wm6cfoqg2-CXuA_wkcZ`Vm{{tuD1G%*qB+U|Qh_i)JTdFMV&Wi^<4XKjYRH2W^r zH)YZ@n&cA=I36s2zxf!`j%Ty7Z|%LdS>yf`d!5aPE0*fdd~GSXPTeU%NkL5h#LKj1 zL6-3N+O69Y-MN?KeN7IF0Hp!bn5y=3B}}{L#xd2&)a`GY|BZhStHOtDf3vykV*VF7 zh%wkYaKu!<-I`mvOgj2>YHrQ{-}leI_F2wWnIg}c*2)^txWC`+35)O4XLA*zuTMUG z;Qm*yw1x)Dy#pf*5V`@Gg&7J!8 zs}Hk2LkXkShi>7&Z{Sh=A*YbQ#65Hueri2aa(yz`|laY{=b9%f$m!r3z3f3rYl(W%di z)9r!-ZJ+P|u%h~q9lQLMu-$TTTdiVBzYFF*U2Eh!mpP-b>`d?@MX4$SsMSb7|@{uBOX%Kb*yRyk>JYUf_B0d&R@t9~@oR z<@YRAe6D(3C!=Gv(z0`nUyjOVdaF+Y^C z`_HjooNvb1a7{d*yC-@>R_KkQ4+j;$o}7G4^z@Xu-TP`jc_@@P3zRT_(VTI6uAIjF zH7plbtZCj9c%e=vtii;3>6Z|BC&uL_k2)XMOxS8)J5P);VA)s3>Q^Ot^G#ZxF8?XW zCv3^d^!;(jL6*RZU-SR}ba8!s>EfXsohEx5X8tN|dBpkB;-}#)+svv)JKx}l%uRf& zwlWtktBqgZ#(d%Ar65_x#=oytGuFpmIxw#!lwk|=A3w`T5w5op+(H~2jirf6iW9Q_ zq`lQ?ig^BM_S9^#^+lgpzoq^3On=+(XR1QRv86h4ynWf<_SBi*d$rhV%XWp;JL~Iq zD>3Zi{bR{*C*t<)_I6cqRe>ks#>>T+n;!g1YCB|kYpc&=?isCbE|*2ESwGWZg2DpD zt5+6$EaI4P_Q3s!q_Sf^kqjkFb&Pw?JU3#fyL9P;3)4Ykb^DbG4iYxM)#bnJW`FIs zb~{VTJ9SrY->)Wn7k_B}-oD{}<77Rp#tS|I4ioG`oEFU6dg;WT?e$i3U(GycwQTaY zDJ%|xe>7io^@`m%{V4jVr@)En1rrxOn{V z3%T9B%eS3)JySqnk#*cD=d5UB#|8UBnid?`@oI}IyH%ak2H6kXTQn^$@7R*s<^TB9 zp;PVW6&oGmmad%hDd+z+Q9YI!TyK6p-e1_Oc|c=5!?MrQ_Bli`m^2)J$o+?FdFH9d zGcU_uJnVniQ|{KyRcnvdsk*LCINHd@SE9mji?M#=G9`=dm&yG$liZg+wAtjjpeN5T z?_lO~ww42P&i{9|_*efgdB>l{@@H3WWeT3>$=EpQvxFW~bmT`>7Lnz9URoA*O<%uh z)#1Ne@=jk^b$6T{T{bNQ4is1!5)a4}`L{wU?w7A-OVZ6b_x;|x z>Tgno93Q6kwjH0XUlr*x?f&V=NS1?tRNE_s%v(h2t}i;8c>B2ByN}NH`>+1}^UUCH zrNZv~_ncP!e`TV6XH2_a$N5}go859f*7b)z+0Oqo`@PAN$r*`HWvf!=rk{W9%JJgE zlxIw9gqS8ePQ5;bIhVUZ4xx#OK zTI!nuU%A7TQ6hYCW(z}atM86|u|>1Hz~fZj->Y34N{{aKOPl?Zqe=Ut?}ii1=qfohi)^l*j3eg`TSpr`Jqy$yV`2}WwtA1 z`193ypMI?zuf(x|WmY8f#FVF@G8qpJSa?ZKI;I@-LHul8Bm>{C6{^9TvyKHYKzZ={W%Bu&%XcscZIH^VO9gn7p7&+#*AtT>@zMs zV%T(U?Kz)}rPm|bIA!O*UjDq)<(U5pZ)vlvsyO>=Kj%H}EA~E6%&f$`j(Pr0bE*3c z>eI8nE_C*Zh={Y-aprr&@})GBgXMt!{TI6$COB*;IyIl0HBuzYA*b6R{!4c-QjDB;@a^u3Woi|CyTWf2R00EUMgf{=D$!m|L<5`F{`cuIps2%S^k(pjpWp z#So*;!j=2ACd@xBexYBgxUK#6s)E~Rgd%=@*p*}ZVA^ftUak*|cg8P&xz;Cd+w5a( z2P_(F%MK_m{I-D8=*6M#+c{YaH~dV_$gkO~RdoN;Ps>VOpURBRb|cnI<3K?(o0sxDLOQ!ZPaTBLVko7@Bft?Ma?$HUrc;dh zf*QUGzeURD9#3X<_B zQsBA$^GLsE(${tPKj$*{Gn-$0@sn%+#c!Ex4cn|4lNT%Re9v;pXk(%f)5k4-92@06 zJmgO~&-p~k{M*?^e+k`KmKv6wmwSFbzdwEE=N~T}=jE@fzx4Q7CJ8(YN@=k1-f87zbKQhsO*S+1GzT?fMdj9g+^;2fPD4*HC z^53QKzq5|-f3oKJkGrf}>H>c#2-xJEX<^FszQ!3NF*CqxEib3StDo<;^0zO4ztw-; z+r5bwZOV=3aeOuZ#TVDTZK-qlkA~>yhPzDqOr9?0$-AxC{-iV@{p>rI9r=G2z1#SA z(|10mR|}i@J{Ya7)B3Re(YZH%+M*0Azxj**W2rm)pOuBt!1Un7KMnqA+crxcxS`;; z_0L`DYqw{cf8!~CvqeKDIqkd~``x}>-IO><2cD|B)_;#L?g_;Ykhl#hdeLsqs3i|aw< zYz9Y#g6W)0ODk=+|F_xm;ahq8>T{>f97JEQJD0A`?#0>=F|jGWa1&FJqJS`qg+ZTo z6qB9~&!6zz`|oDW%PE&B3y9cUVRGlwkH?9xpB+CGZl23OTmEdohJs+-H+w4bX4sb} zS|o12dx%lmC|E+VvEWC6+8?QbPdu2jY%as0vPnu49cxOg420EOSN~k}u z=P(~<{hYwl2j(~2W0bu7;TCI6(2`Vx<>@*N_8iijj9gi78wzsI-+jCFqjufnwIr2hWTQKNWsLKx!>2Cm-B59|ND6LvCK%>9GzoI6OIOo*rk*yHk`l9 zUOYv!n1k=s{wMNrp`49IY-bB-MRgbjeiki0Mnn940h^r z%$mBK%sNc3+ys`qX3moo$PZ(9Fik<@(i54747{9^Hra&6l)XLuBfxCl=}%v?V}cn2 z(*7-<`{nPiWr3e%E2f?Bs(<$=hT-h_M{-itN6*bZymfzthD>D&hkx~~Or79J%@_U_ ziY?K3oQ`%cb(-owc1PN5vHx{(_aQ&)^<3`rKb$HEujt$Vl>Ni!L;Z6jmOQa!DgJrb z;~L+Ae&z>499yED9KYs0Tgm;KM5shQ58xJ03}>GGGwRY8smzBY=S zcsb<&t78s-FcbT}pPBPAv-0jwO11HMGQ~YPWznC%)8f<_qGtX-+V@kqT5P7?pG>{E z&rR8k!_!mipEiAcILli8?7{!<%F}l;fLiVGnO5gnjxGD}(f`l;4VjluKKwlYzvGW1 z@AqHb-1~0xcKf*}#GYC?Hi#G=clB8-+V4}hgST?t-1D|y9(*``d-LsdmHOrQ`FH~RT>@~Y== zS?iwt-F5!`Qr-*;pL(a$-{(p1t3SW^VW`>Jqj&xOXeAT&B}}s^(v@ za^mv2d0g)MAOHCyoHU!?R>V|3YX;xNrTm&dk12MS&;QC`y@Bb;j@V9tAJ0C$wtdz6 z|8Kmt&+FB^sry(Q4SlaQY^k{zUdP#$C1~)t;{eZ#(vEP~{WI2WI$HC$Do%?b=yUw` zf0y{YerxjyWD1^r%+nH{dt2VEX`?*S9}>yNi3TB-{kD`|1LMOs_yQ&|M*z=>1R?L`7)J8 zZ|VU6HqE7|J9-uJeG>t@zRTa@2E8M)|h-XS4_?HW-^ z4fBt(G|Jz9A9X{n>F1Y&EezsfZ~q5b-)LB3%i*`8z3#%JHP22jyvt}|*Dzf`!IoFM z{%LyvTiwiGRlPgxRKw0xUyDp{&0fE^EaAqD1jZ$|=EqHoWXOEKb)|Z5@Q-VA#oO4g z+dXt(TVr&8YTOq_vxeiGyIYq2j8r%xdU@Zc*7dCyEpKl=@?&?#(^G$9E;m?l9|)@D zn*4l|tIuqvgu7oBu}(1A{4OjmaJTpC$@4c{(*7*3T#ys=puJs)r=^giWAk~t+oH!5 zBA9nFWNc-aaqhpdS<3!1Gw(79C@t>)dH&tr_A)8XcA2DQ+kLm6KA@k#T*YT%b1EuI zetvNz(}jRpEsRZ1O~v#0Pq)82y`1re!X~CqnGIWWHSz?@xDRk-`zHLGo2BU3mR%Fa9yW59PPuJ&{v9OcwyXNj8@QmRB!#tae+DP_CvzG~5 zy?3`4XILwB{|wiGlylGjasF6%G;i-O`q|0~rp#yObT{nmAOY<+E4`$tQ4{_b|o zAA(v%=J#`cilxs^6j6^aXO5Xv;Q06+t6ttkCWqgfS5LUzC465Yh}Zb}bWTQx_0GE5 z&w~Htd^)|wzTvsRkKo>Qnhk%Hezdo@vmfFz=(xK35xdE$E&Ih7KToZ{VxspeqyA1E z`}xwh@6|uD3p{2hmpYepT$hzmX03ljWpJaTq#5VLe>WCyYu&(m+=M~>?fJP4Yqi6E z-DS9^(34#L@P}8M``0(;T^`KS*qd%`c9z$9wfE`%o}P+ark&?f8DG3UczRmwl?$ut zwlhhIG2V`3zM!P=xqcbrzXSYgTWxQOTlD8t75%N^pE~nD@0=b%1{nusg@QT4YJA!Y zW}Fi_Fz-I+|9@BG+ota^)4u#FoV#J4yu*368zK#L4-Ecq-S~pv{`<|aB~@x`nSLIb z&eW?r{oHForX3-dwdX{!-2Z*=`=OoB=e@3+uDkn2ZN{gUhTGMave+)IuTwg6N?Pab z{Ck`Xe>O3&{Hu{lNU6w~9$TM$zRu6$-^#_M)_+5~x9oISSMl>`1q(;v(V~p{+Q*Me z*PC(%KKe9$+PnF0+0N)TSfnoG5MyxaHf^xq@SUmVl1@V%W4-6})ho;_7&2I6wpiSf zmw)RYam|6NCX&hZ)88Cc6OM)wt^;@CA51p@S-pjAf}P**dCTSA_kX^%*yiC6;qtSU zp(b}fw@hl#VcTNYw@HYpOIhx%{`d9&XL%OQJ?$SK?I$DVVC;VX*}fMw;%xbqr{9~O z4mh@m|2q!L`fPRP+xBJ~TY^vR%(vhF-uVC1{^48oITCfxx5vLLF8^e7^-}JB zi?>R#}Z`++kcN4kJO|blGqOjR#=?ZWiUvIiOi5PVZC^I{_i;- zUiQ}<(QPo_|1LN2{@?k6Iq?(DKVG?5`qqE{e@EusF#b?1d+}fOo1F?eQTey4Glizk zh~AUb`a3yoY69yMr=A;@GoLKDyG8zVYL2zOyy32GYz431@3oxGRN?d0m_x=R{9k)} z`(AH`xZ*koyF?tMTwf}z`zmYicId@Coo3oV;pP!v! zI?-}qhZw8NyEkX|aI}8k^USpF*JkNDsdc|z8XkKh&}XT3TIucFxm&-lHu@oR=Uel# zJG1Y9dA-og$eewDl$qGl-fN6g?$1;Dr0_OPmO1G58)X@8KWo!HPdEMNn7{ew|MlUw z?9;C+urb)N`>pDR0E=ahMzxayw1EVpmGSP@<$y_U1-j;iCMSIZd7^n7=f9<9wY zt$DLL{_L~I%NEVw^?mgr<$nJ5`M0^t81!#NJG6;C4Aawfw#%$Ll<}XL?}qW5Ee}5w z#O(2!S(x5gR+wG5@8N5PGP_>~q`Iy~GWaAGO}_B1s^(R0{`zPCB&V~z68D`O#b|S- zSvgM4e%5@0!j{swV;mP>rN8yx@5Sm6*?xIPjg)|LD&v{>qK@X*{pakCFK0Y&=60{- zuWsV^x%IX+zjs@=>enR7d=O&!q^O!W;n$Mvt@Z!@_;M0z`vv>% z@4FDa=&1e7|3AyQFZ)kbf3|;%!&x2HE&q@E7VLd(Jb&Gm`aSEKpE2glF|l`Qc>HSh z{`Vi3Wbd;#Ir3$}v&@Wtj#vJj<9=WHXQ!@S-vPDlOj{y^;x`|aV$j>p5Tt$Zk@^2u zadMZw+xRd?Os$`G@yAL2H!HVT>hnvR$xYb*|2)f@>|(P|3$D)oY4n}3{*{>Ss@B8& z_PRQCHGlU0Sh;Z0`M-~I9ZvmX@HkUHYrWB%%8KniGwS4$rI@+x$zT5` zapzgYkIBk1ra26EpKW03Gj`d3^U!%|YqdGMpU*z@>+H7e*YB)c-u7Xs{>`u$W_$lH z4;kt&vi~Sr{rrKT=bh+cj9sa26TEtGq=L`%9Xh?2=-)jGu8d z#xO)ks4w_k{Pkj5`Q%%d1Q;S1Z*^|J*y0fK?&sTGx8Eq`+LLb(xtR`Uw=rMOS=i2cz3|5}^9-P50Zbq(ho zU%xt#|COQcYU_eYFW3EJAj~_0(zOHg|`|9~!%$qxzEstIHTb|9B zxu=~sXKU@ZLPdoI$#RS)*SDx~6yz~R#K{~;36)c9h|b_HWsp#qU-W)2->YPv8#41Z zwg0ov{Ql_wyCakT%rRJ?-up*JNNLwy_S`vZc*R2u`zp-;bE@S16KsE)F26DN^wimN zWiHIAQ>qWxd3gg{z_mazW^txC=Bf5de;R7J&a^Q2IXT!l9XRN}D3Wa-*ZezO(K!v% znNQ4~u5>tE-~D0YMC!S9^EkK*}$Bz5%LEPb--LqpL5 zi{e5gx`%U@s{qvs2)47!1e*WI_LIq#}aBRXaiB-fZ>#VJ}QgKkS$!Z~n18XI?(L|M!zm*ndPwl!m!&;Zo^% z^84+{6xoLF3?Bq8q+XAE-fu8H#Cqk5>+^PI2K_v3wE4xatJ#}ldsAPA-nn9_z`(zq zp*B*NgDGaczSXp?dqZQq85=|&l(Q^oIM%=5d@BRP_UO!_eF7QkI|U3Hp6a!k`ipl= zomY3x+rj_xlz6*LrhS)vUY&Z~&mzE-yoaNumLZTs$KsE{{hcR%bI;oQHR9{^pX(*> z1%2n-w8>_2@8hqjD-{;5kKdbiFy&;(PxS`}3YhBlip897_PFfaWO0tQ?h)JD!wR~r z46=EzR0IT=1Z$Y&8ocM4lwS1zyySqIovr?~&zT%wXZaKlPbq7gN#WRGyXqh`E&HquC}i0mQGGi4Hk3q-k)3)FthIS=6hQ*N`K8L z_%~&NVbPJeO_oIq7-by=%Kvf}a5UXHXkg8-agNFMbC*pXbvfi9l(vyM=pVI>yFlfG*@ChK{2!Knl>OtzeBs>2Izt5p+lJ%EeOc!h-v>w(J{ zpRw4mG+HMs`Q0*SU7&uWpJ7f`$Z1M}J~ z`|oki=qqkvYL{t>>lY9Uw@%G}D5_{avBKVIIk$1X!WMyrP7wW7kNpRe}+v|-C8D7NvTF3ByjUoT^ zS+D0@XYB8I!JxMNE=$NF&ePuw6bzPE*lYd_ta`=$rok!kQta>JQ|k}RKl?w|dUGU$ z{?_S^Z)U&wFaD!l>BmYbhEq=;-Z&R@LB1q|V|Dl{kL>uLA1qZ2+IskfxF$AnH&uuK zYH&616bNxzVA_2;h*9U3JmUdHZ-xhtE!-uRtmks(n3Jo&OSAaGi}3VS=|y~z?V=k_ zd}H}=N_XDAVnu=HPnqU>Ut7_-ll6F-bj>BkG{HSDEp;cU>2K>}oNsliQ_YTFP4M{v z|9Jr+l4t+FWREwqdcJ9U`{c4)nl`BwH#Q5LKYIS)yNxILA3Qm*HcpbM!C$t};;CW% zi-qnsSta-P9=@Rb+UHQD{FJj|FTW~y5w7ZUOmSJpQ_Xoeq|YOvVt1TeNQ@fPxNC}J2%%?{8Np= zEr(9w1WxY=4L>{aBdl!V><1_QnBv*$?REL}hCO;56{qu+W-k4EGXK3%IseJOXZ`Ed zZ2taz&wt68tbUsoMi*T(jN*-0i!a{DcZbvtyH8J@euTGrrSC(fc~z-j#=xgz6k za%9|M{~NMj!lP|vW~oiMFXMEe|M!}`PmI+SAE;mTkCt(Gtjx0H=hBmmHpx8prOj-0 zzozxh+cMqv(CfE?iIXCFE=4zgeY1D{6=Q+71p-lao}v28i@B?rJH#JwKCUpIKiz!t z-TjUk`5#W!E)yuz`*lHi&b7&b8_gz(Z-|I~y5+}lZKB3nkeX-xJr1=xJH0Cpy zJb!8SW8rJ3qYMXGPnoUjl_Boyv_dgU!+}vS! z#`N{UgI_!Dw%$m2&&H55&D>_gEfqJT^U8AR`?B9$F@IongZIL}d&Zv_f4IxbfA3`e zaKv>w7c;y4%LwKxsZ0m&{#9Ec;J_}Eb9Y18QD()4#rySby6nQ%NwRNQ*j~cPw1(l> z1d}}``i&yonf2S2U!-pA@mz6(|<|y1+`zVg_ z@q+pYldOu#JYfpVWM@2a-%dsg+xc&1*?dr|RTeo&L z7k@5nxf{7}OV9E|O^4gp_-kG{-0g9YVe0($pg7{zuHVM9syA7#F5;EBuuNX4t-W3P zlBnW^<A9oKc+&YrGMc(!iljxvE~=NRqSf1a2>t$db{#>Rz0PFdzA1##yL zo;=$>ck|I{c5};bOe(l%A8*8GV5A&zjOPdcEY{7r)hlxE$zh$4V}jEGR>s#XGMl6X*vfuX zim<)j_d8acMSstC`OUjl-Cri-@cJ>s1{1sIErLuxx}JZ1@O*~ogr@m>njb9k(tO{Q zT{o#GvLSBuf4;sG2P`w>4j7fM6K4Ff!zeiJz}lVHwi_L*X$+KpbXtnVBm2R{KZ?SL~omMz(99@hU1FdJ9BdD&8+6he#ml=ypXy4+~Hg9&bj*4H#KBGvj|Ppy=lyl z%q~04^@I1`GM<~}Vz1|H?ayRoN+>yh_wa;^N80Nx=4;Kc&x$wyw4?nUfB4+GiOYE( z`7dA3l6;4UpWoVBfZ@*N<4gSW-*bNH;kINAW>n~QN)D{--uJ1~&9HXU^GxZan;+Z! zrpwWu`2J9h!RXiL%2nr|e|x<9kH+*khjW5l9I7p?pQ>xFJa{f!H6xNSo-cgg zLvv#R#Vae4SKsxO*yuiCd(P&^Ck5ngW$m-&JmDmhy4F5x`ekS5_nX5xqK<6d@cHAz zt!AQ|Dr8E06Z+nk2dr4T^Zeptd>f*x4Q;v%w%WWqySHo4+4a_C{m;GXedyTrQ zAJ)g(TyRoIKKG=~RBg%M%WL;?FkWMbQCuQ^Wt9fw-6vY_9^RQL8*=G@^#51uZ>T+0 z+u>7}db{L=g~eT_1cqadGiLo}=w-evyLNVV9JBQ-89VC>l84LoJvj5cMLYb@sjVMF zpH<(eiMw6v`bEFrZoV4(ADip^E5xHD7Cv@Zes>$kOh5NMZ%^)HSRbyid0X$=DA{{O zC&LdhZofB+lYxstZ(q)@BfkXXj1z9lHE+mDU9mQ9CgT;B3o{sRZ=O{q$Na@jJL1Mq zMt=@%xk)X`>t#NOiT&8f#_^m#T()S!hJa$W8G_mkTX zH!yx+RC};|*2ap}yjl(ZR~XFvo|nJfJ6-?S+3s1EaqQ<0^H&M3EWM(feOUk7En}Hf z?uzvr(tiosSoplY!?m&aP|-iXh9$N8t}#fg?YX|cV)=)akLL;f`=TuWP094Y{?zOh zl0WAD+r{(7a>v@j{QQ>7OrE}KiZ9(@0^_Nd+S?K|t6H#eFezsLQ8*&s_TK4Wu*9Y5O#OZGo&HgSKj zt2ck!pBBElKC|KY-LwbI^Uj{SymHf9>kTg5_IZch`qQ~}&eVUreP8Sc$4l?C|2O=s z=@)P>%dBIsDe4PVaC}(lE0Fo>;jG&)P-FR zf6gnfZC}}b_lZ3Fesil?|J<&(>J~ox^s~O~l~c+)|9Y`QFS{go>{;uV+a~?tm~l9l zi|J{;_>Z~Ua^0tEi!$(}Z2NWUPEN)Y-hF@8I!v39UC-R}>;?xzqrJq7zjw~O(azo2 z>)5~S`2NhmZ(M6`m)+G}6TMk2=ZUf7v$CiS2mU_SIrHbXpun>d#%(J1B|o%0Nk8$8 z@d1O4UzmfQ#F?l7>&-lD5yi>dZkVS?)!tlgFMIF*zVDVhI#)|RIKJ&>&HcHYjj>|w zhMR3tPA&fE-m5Od-k;0Yp0mAme|va~?`(PQe!E>4)A$Rvh?U*Xjk}S&{qCWr-`_b_ zf3vq*!{cq7*sdy|E4Ssx1;@0lM~de+6{sIL-<$l#o8b?udC7;ypKo1RmfhiwOJLHr z4F8k!{irbG?wJY!yFT$t-IsEo^z}pM{-4tFjynZ3BnyoGCU$T$L?;~1Z1nwHtHtnV zdj9=aw{zZa=r6dJxZs(uh5d~!syR2(9;~{_?(*jSi{xjm^8Yi6D^3OfFgS5&L&Cqj zwvDl8mG0eKcC`DD|(jhq}0s@@#)eYlqGl7IaZ<%e&d>2G-1WuMn$w)Iy5)1LV% z_LS`n0epc;@ON3mnZvkMf&6J+9%{FuU{{`H&d91UX zU*DdY{WsZ7j^CYsE#LRGJ9O{VmQU-IJR<1cQt*84!QWdlCf>jJc-_4FCNr(KsI0O7 zcBY^~*Rba83T5XFu8#Bn+rO3{>}?e)gAb z)rzl-p#m?|w&%YtSSN*E);e?C756?1{K74uJG{$HC|6HP`Ntqpg?D#+D$D>$2 zzO9R=wH<$U<5%O^`uzVN`%gZ3;Lfq<`yuYXG7UdgpMLvr$-=#x!>3m}DM@VLsL@)m zTV%;Yo|LU${o5Y%-1z_ckNB;(`*RZ;Wk2iuRTN_?ziY~FA2t8lzNCKE#5W&rAL^QF z&&@w`V^S>l9>c#!gy$wb`1~yO+$@>0TbZsiwpY5|u=^kRaO-v(sd?oW6d#uFFg)zE z@ESXxl}XRJt=4=yII8lPmpxEFsoPK?U650MTl2@~Xq`(eXMN2l+Z6a6klN9=^+f>Z zkLV|P`YRK;4m{u0w>7kG%l>=cCO6s7|Lv~(`s$2nM;88l?Ne|3vvApNrdj`|{rr4r zyL`NKU-d1$#QlHsic{GIp7>cPwnXRLIpzLv;Sar?Ek8o1<%a(FeO`yxdAGc*oBj@k z4~r(fzg>QGBZFDwD<$Tvf0Y|pKCJUxx;J@usrbI+xtC_W#<)7@VOax{ohN~Iaw7}2mEJCu`tAcD*bJrRq9jA z(jen>u(iSUNAf<_%kyjYy+{{hSg`Ao&wp#i{h9w(&#SPIsrg~X{Qua8d*9PU7~Ni# z=*4GR{cqlWS5z*3ziQ1-Z|Otd=ijlOqwF-T@bDzno8`dGSMc-c?L!aGNPnyDyqYj|(~k~?&4=gfKagxNUF{?A=Hcwd zJ&7N!Hdd_2Y`7ozpzOg$f8NG#w?f!9ggh|c_HAJ{V_nBd>9Qxce37!b%vKeF`52UEBfVPky>^; zHTA~{_jf$o@0C06keY2>D1G^MuHn7k3Ax3NX%D79ZdAPWR^Eg)W592nj z$l>zK@cIFl9}_m}KKxO+pW}b&<5M5@JWqZ0FXZ=;YhC60KF|BGTJ%2e|9zFIVGC#e z-?_NfhNs0@q2T|0mbvngId|9RU*49=fGKTLm{{-TBVaYo0| z*x$zsR{gBKxIUmc?B>NqcRoEfn=e1DztaBJ{Hy<7Z(GCvTYi)2p4W4g^UjH%*iu?` zD^qcaQ^L_M)5O=?ULWSq-+OI2lfX&q3^BC-@RJBJ}+5d%RBEr z$xT21)-$m&@j1Lduzf?b+Of$;8vkI(8K z%aZx2_KVB7-~G5)`fx$*|I62zw_cc@k|~+9+&{l2nWJ55NFm*gI} zRHW^&Rcrsb(!DzWxWo+4@?J7=xcerwUMpKiywczu=4jE-;O2*Z3gqH zjW1bN&F8c<5S8<1sncq&+arAF!WE9I}?X6yNN9 zA)dH?@1`=}@cDJ`zxy1pc{=aIZ|U$AsW(j}>`yzXF$8HhL^rPdT*|OJ^@P=dZ_87^ zt1dS(2)-4%!;<|-^4zI{{_YYxS%s$S)sIy;?yNc}l%RO_8pD@OLcYm1#V5}TFPrxL&cBF+x5Ah0_g-E8 z=I$$DF}|Yjs@nSHm;PB5ZLxKK(;v;WL`d8{;$PFm8w&Fe-LPUP*L!xej)C{gjF`&H z2N*wASRK6I^leG2LsCZigX2sQN6uLk&-&l(&k*mF5EFdsUdiQIXa3J*N)b}cKJMuL zCQZubwyC<*r3VeO4eZ)wqCy$ehr{hhaYZx>wS158{4f3>n#{2 zG=1L6;2gP2G2>6!f}8g{y}jR?{F=eJML_QSHs&Wgmo4_UexFnR;oWxE6N@+RGx>dQ z!91=fRX^4q__0lqr8(O9SbuK2tk|=gn>nW2|8ud}8Cd+}?+T{7j~SW{{JUNDHtV0* zgZ$m=Op@oaK6sGMB;^=v9=4_ugthOQQGZ+5Ep34*FMVf0%sl%+u}}sgiH962jVgy_Pu9L4>~jzI-w?U?k-gVf_wt`iJ;u1gOpW{iQf{!odX~?x`0+4FQGjYPg} z_-kHt`KJ1>pZEXIy*p{izP&xiQ_mfgk7s!F@*ewcr){z~;$6kKLj&|5-#c^ctjUj; zwR2e?ykYoIC}6ssLBh{;KeIw&g8)bC^y)i5;y>pskJ+|Rm37_q%a4}xM5GqVZ~I>6 zF?0W;sk>R~`wp^5Ebwg&{PitKmu=gMeTpv^&aO+lyXAQ8@o&7_@6TJ?KOxiVcgu$A zZ^e9^_xsi+&OK@$acHaNX8oOcV&@khu?c!}yRlM1VTkWb;#Tm_NMua8aO%q=rfS{kF;?}{wpBjPw+}wKZm;3wLf2x8?zwmLpY7lB z-#_R0yAvlGAMW7bxvJl_l6ApZhb1qMF4bX3+crUWPUi|P^?$P3<(%8*O|$-G7+bsR zZ`th6@;gk{XD@Nx9iwn$-|x>18$+@fUqm-q9@M%}EOX=HgLXzJZHMzlhfj|2V@5XiicZIfTU;Zb=^z8R<#!Yj6=Kt$E zC~?_q!_(GP2YLz;mL2dJk#rHJDEi;JXo@K^X6}Lp=|RXKb9|_^Q<-g=c~Vm7OB52P7qt%xNk+)6NPTz7{cY*(^}7`In_9-!E}FT%>agX*N&A1y*#D$tZtnVZ zv;W_Iwcq+0bAb?>=Zx)4q3ga|8ccrBZe7Z>;AOK?A=iU9COJ=LH|jK%GQ^$dP0_P> zav|V$b^h9A1tuG=%o{C*E} z+=6NTah%Op)aPEUlSyD-E>qR_;HbW}*`I#ldCy(wpa#FrP>^UOAD&3q}$&-`}h@skfv|G$5Kw*b=)zPKpoN`jLv!C<{g-z4?D1(vYqpCwy_(ywGIOPP;{^Tf z3=$JA?i6_NSmxOetM~11CwuQ%^?L67pCuKC=kHNkbMN*1!`=E7HZ_lg75|)hx9TP1 z{D?g(-9$SR^699)%b-~?$*u7n!E**qia>GIi(Elu3DTH;D5+fDJuA6^OG-0FB@Zpoy* z(R=PcVPH^M06Gg`|EK5QJU(9YIn4dWRlcf0ZbIU(&6>|IFrUj|+0R=t^WV;!@iTsJ zUe)*c@BcLlMSiUp4<4-SG&MP;ePUxqpS9f`x47Nc_x-k&KAinLcf0%Ce2#Ca9}7O6 zocpy?Yvr$Jvl;&{Og#8n-|R#D3numK)Etp}ucn55U-weCJpH?Uas7~J5S}z_UoCSr^>l~sgCKCW)sL!i8F0NREQ!TX;z=*^lx^?%s8=l>X# z^Zu)@Kl4B2_x-vX3m@M8wr;)Y`k%cU(&DR&F3el${`+y;x9uCLjyW511Z}X|LX2;i#t<4XBk7w()1jOw$f@Fk-Yogmwosv zz5W}kZCppEfWU{7^Q|<~4jg&CZMvSV)t_gc;w{1R&%BCUVQGIzQ)uF|^y~2-qZ$8A zO%RUw)g(Ay_P8Pg!^x?ipS8@lf86sST>fXqjU@Sx8@^9#za{)FbHnc(_6Hw7hOzZB z^*oD9m1m6naecqE+xGt|f3D?!oMX2B_c=3;i*q*Bt@NLA+@kW!$>nXX@_&{Wd=2zJ zZMwf%zU}6|?i|4besAVBIQOqtzr-=w;$7D>d(GsJ#i^fjx<1$4_Kub5c)WCVfVqXj zzfYBghphZF%ccJW&t-DCYjW?%CO7S?@q9_@vzUHZGxGW{)%Je>aQnqG-aQcv+-JW$ zIUt!5Bk<*?=g&S5-*3gtB*7vh)56#udH>(8w?`A>eso{o zXIb;+g?UT*{aq(Bb+l>M8l->(1f zbK%43`_HTqVT}LlS^J}L>W3f8lnWOX`8eJ%%x5m%&*OfVt=`-!L11-xkM5j$@d-x_ z*=F&o$?<+WYSK1&?r#x=)35gbJhiJdt~)P+F@JNb!#=$|2k&_`3ltdip82SG@aq1b z(;upL%X7^ZvzMqd_>%u{#bxo^IgbqQTbSe@eD}?kQCLH{y48G6k()(o^UQnwX-+Ne zHDa!3_fI~1_O;lbFWcmou&*#?|L{5e|J#`2dh`E+4A>qLo4~(kkNf$}=a)B5 z55E7m_D{~A_~fvL+C7J#KT_kkaLHz2y5_@6&toL6=~k9iynJ>05VzcJoiq2h7}dPr zG=D~F!hBBY+hTe9mWqk#$BBHqbKb7w)1`QB^_VZKKHOcLvo9fU-PX%LlX6d*+H-zi ze@dtKsv%qkjU#5BCeyjrR$o!KTvgf4HH%jku07|SJiDp%DUFm&-q$s`_)(d=v$k3 zr{Z9@k-)|Ix!bH>KI?dE{9q2V+>w1k_tft#e_ovas{NMHME|<~aeJrM&bZt0X4RIp zSM&ZUl*nz%6g&6o;bVoyzuX%qg?tuY&X9cP-)5r-hUYh5{ja|NCE9P95W~4P*P>Lqlie?i)U(Y>OMZ4IHv>1ze9fcP7Nz z{^+MqVe)(~jYk+CO#iUJCTf0c9h3cn^S=K$>a^dTJDC5Ko!S1@{N^shzc)V>AHCsm zqw34058S(LKPrcPj+lDnVz|_Xd(ZB+tmXMzpl*L}x_hy*_p5Jj(k-Ry6b~=llg;}> z`I}(Sdgi+P?dlrxJM5Y5ZKi*=Ix3jWCC_a5`My23Uwj424B3V$oo|)PS?df7j{m;Q z`7iH_THiCbpc%%qzfRomD8E^Sr;>l7)0AV+r{t0y*X4| zVY6F<0>gtJD=XJqG{)bqHr=r@XkFqxdErmrj+(u`TOajTJ^HNNr~P-{xyNN~&pF2P zXY1DfmRpavRqZ?2u>a({kGl6P7qe+FhV9{h|Ik8I;qa~M_r=0>a~Y)yxF0a>sWI6n z_dd3IzHj21+}H2SZ#B%#o+`lo4q%t8!X6nM|abic|z_vYcR9UET%z8_zG$WG`~f)fYBr5av^s~#KYoXN4@ z+BmCe;)X3-#9msQU(PyBKH;?0glX3czOQV4TK+Imv}4+=o(&88?rdM#F7x(K=4JlG zv;S@H)!q1FoHk!~_m`vk=MLnimA?%%o?rR#zS8dx>er5>F+a3Z`}1vkbmKOm_wp|V zG}h*(KKQcJW~$E<1|5?H+poqgX!@DYy*k;Z)H3VP0hU7(YF%$uB|ftkUVbD}^7=oq zrPcrU{YZb_u>aCO&h=>u9TVJlY(CBZVY)*)TU2QL(%wBq?E)WuDlrSE+c`PN^Z2sY zu1h_cK6e_cLV{3l@&fJyQG1Gm?>$PDRp9BEJX62%z-Lyi*@4=Bj#Y`?7WuQKai`h2 z7XGN8^|wy5ZP$yN<61b?!sGUallycVG>qhIQi=;7@o#Z;c{u3 zPrPgYBsPItto7C**R;wvLdVKB9%h+%UVn{mY2U81mOpGA^3O#6eiZsScz>VVs=6{2 z_9$JhcPGlWtXjR2VSzw#3LAepOMwsbr5hj~A?W>iT|I<=!o#i2m`t;h1 z{RcjoENmj@#3kXvJTG^41?XtS82lVQ{rJL3} zbTGEECS)_r;>t*0z$SfUNvZ4x1|jjrlY4XSdTMYr%bbbqoVLF*Zt?84y#fc0K0JQ6 zj>+!)pU)eF__!OI|Ne`&KL76L>}hL@uU!w^o%*~)fUBXa&SrzvZdQ+HSGA9KACTt@ zdt16;g2ly!MFEfU4)5A}^VVTuwGugF1N*e?0`u=o;FJsbb>f>r)&5AOEk|Rx{^=b0 zm76<1+i5e?{^BLs_LCXyr}~-IUzf7-bP_aN>uvk1sF}EjQRZD%i+V$Ou(}nl7%zv)m z!fRjhXS05diP9Qee^i#_vdY5nJGJu{XUqq=$B)h znDpCTW#`#Bx(&sAtFzDSld}3YW3A_pbqC%|5gx?6#ua1-n({M$^&^T z73NjV|M!SrYqU4Zy`z1_`R|@4>-!zdcPqFr)HYgvQ+$8j;%MQ9)iRknI!5!>+?n9p z-V{>r|U4-%H!Z(}n|%NBIr_V1D8&a2DM+HG<4n_bt_$2ND8*8XC?BZ{KabfcfS zs4@RLmwmTT)p*Ia$oswZU&E9CJ(ZQN=!v}lEIaXje*SaI3#JA~ZC@PU@Qt5i$ETB% ztUqxzWLl)1cl-v`g{Xl*_*|5iB*gZ=EfqUH09 zD(*@isOV}Jn%4I1x;5)YfmgchqMkcMUvhrYnw)(iLWTYR`gf&U`qysz{kq})sqA23 zdA*-)x$|~bKWy4iad+3BUVG2niBZpfzT34+!g^z!f8V@pLf`e5zloMb zr!?(I_t^khj5T`|QqNkAwZn z6c7Anki4+dY+w3O3kO~OkMAT-oM?2HJJ~p)(TZ6{%*ia&V8d*M4;SC3ZYpWJLxXFZ{51 z!s5rX!uKfcE&*XjP0YVPwbN^EG)n}Rr(|aB ztCNlKVe_um-F|sItNy7LpHC~ZEH^{wDow^|2WIF0N&Ip9>Gi5he-2NV5ZKJR&F8h` z0v?ewXDfyJ4eXi@I@bDc;agL(?rx}O&*uv5?GHLs*L{qpUmYb=bQM;geYVOC> zbM=vPKKI)`-x+!DkbV<`Vgci|2FBB^3~Jlu)@=OqbJgzFR8@>JA@}9dM_pW=mI)3fkl0%%y zpdF4C^Y&IgE4TlC^Fz{X_x(8)7CDcXO8bQ6=JdN6*XC?JyOB}%B3sh+2V(bfwja#e z!+6BuTuofx4#P_)vQ5mK*#k1x@yjk|ugUs0iLarb`H#hc|HroPIeK{C{DllAEeGUn z|Nm61d2ao%sD&Z*OwI9^FRe14{3(r|*rwBBb>Dm2&*YLlYr?|}ey)w>`*lOCqHV*i zQ`{nFFTOh!Dl>zNeU}nL2E*k>{~OFM<}L{}mk*R5KcCNg{ASI+J%^`B6jWyWvL&$Z zcbL&2VWlU-p%GhHHjinZ&W<~$3^Wfn+nO@lfBw7s%oF+QcQYTR*lFjy%c>3+Z?Jqm zr})nv9vhBE`)ybL2a2$SnP+q99iO4bU~}%fdE(K^FM>{0634YQe>!?B-SAZA`4&!z z*cjOlx%cAVzAN4qVjug=;W`V$TPKbO${ZISncvnv_}9a|!%f8g}?6+!NCEC=Oh z{(l%EFyZ#Q?bZhbIj;5JYW|qlc#W?^{XUD{S>_AbcaEnQ^4phke(0RH;%(+dt(d|E zvV0|>3@Z+W2;9lJ+_;-3pgexN&7C|kMyYoa@BT-pHO@KTX&CCTaZ*D;!339Fja~0< zM=|^D{&nLWYS&V-_SuHu*dEKfh_3Uf*4@)BJ^z*l~MKMCCx)Dscl z+p+Xp!I`_?@5uHY+HP{-$>-e9GoMdqoL|JzoM(BU|MA0xuH9lcmmf5HddT5x&S9$w z4iDzlvsB&Ob-;Md{Qr`yN1k#&zs|TnI(OZR5SbYr%+@Xp773H5?P=!!=lZ?8{`Ypi z7xO)pqiW8!Fn)iV9hiIX>~UtDxjQaaSf77q)#Cp6kKBD(she{cUaDXI!2F}IYSM%c z+-Hmu^y}VTDv-&?(AZ=o&>UE3)7R%!gm z=7P+;t2J{R_}^-%FO&TdSNJEeTIBm&&zw^$eX0xBeoCJO(&Xc=&bXJQ`_Ic2%O%gI zDd=&vrTv_B@$L2>pY<*3+s%G6_m1 zMO?k?s>OKW^7Q5A(&3C7%-4IXuYGmfw878HdiLoz92fkq|Jk$VZE9ig&V84!ep|UE z(|yWYX>Nz^?3Y#tQY4pbT4Z|j)8AS9ZzpIzcHYmN;r?MoPrkA2b#o>LH_jb5nWD?2 z=SIJLE2}fD_wt9yksl`W=d2YiyKOG#Xa3{$i}Kxn7p4ET`2Ri740=7cgOxZT+ISnF!_3(%viGeaI=eh zu#|5z+sgdV_%a^$U#FOE80x(2k7B8do75;REBm&;Eqv`8O}-E@2mjc2vh_3vy*C}W+sZc2-{o+3iKS@N>FN6CSr7C@b-bPSt$q6B zIFk#k8P~UeKl~(%{(Kv{BG&G1E+MfHLdpEjHrEaMW4}riPf=>TcQ}4_FHMQc|KkqwLkVlciVTX zqOaonf4Exwda*dv_d(3dT?d5BwDcDU|36p0@ABvRPm|}L$z0NycWE~7mItxszgK2o z^qqBg$|R$f1QPK{P>h-|u(3ncL549(Md! zzV~%(T?b!DbZo>`ZF^mJndhtGD|dP3n_XzizxyU#Kc4-V0{c3PX|s-2KI5xf#{9=5 zIZCHN>BrW{r+13ae_gkHR{Z*DX%{@IxLQ(uS{)4I4un=N^*&v_v{nA;#Bcg4zcZ~S zbk5)cg`-^Q=J^*6mrhRGp27Jel3Tjobe~kPn!IuBgXOBS=VfP=E)M?S?9Y(rHoL;m zjP>1eyRR#2_?CS+d11v(@w{V?`m8cyi%zP>{V}h5Y`$k-=dGnySC<)8ZEh6vc^zi| z|7rX`ReAoqi%yo#)zV#O8ho_m)XK_z$2yNO&tIjS^IvxNOBVaySF2braQ;v~ENQrn z!{ppf4av>fmJL(mOA8u1s_(vzdmhaGh%x)(-hW@$pU<3dEa6D0SHGjW`HC&en$v}j z>^)(O=4A3%s)ynNQ7rb?VTU)-C^C z9$eopyq9_MpP6}Q*FP(9W$4g=}YisoO_3f(ZR9M-a|9FXP)h3%;3eVrJ zJ{_Jho5e47o|^iWwdZ`5b+29yST4j>=e*D9_K9`-%%138cr?X^_or9JG?Cm6t)-&H zv4uZH<)m0XT%M@u&uGQEzhQm%oLMI)UjNDJyL9`d52d&Hq|Uy`2 z-}-wutUWb(+9d@Z-kH;UG+8)~E^S^R`F4t0Wr*3*>BqJ^PyX|y*^GS)!;D8CL;ZJu z(YV~b<yeS_%*%b!cX zLe^~1Tfnv@Z|h5?N#Wv?xDPM5@G~WIg}^$ZzZX|rLlEixBfnh^tTJn{QS&!^uQ9<10e_E_cRaDx^@eBTX+6Jl%XdkhVcp$pdH4DC+0!0K`;~4!%zvH#`_H`#b?csO@i;ws8B^WN zqFpDFlKgBqK{r7>Y~t2C5f&r-!PtL!jJnC5eID6&ca=VTHaov8>XOCT1M^L^MQ)qk zHMzbn_VwF0VbTlT!b^xOrADP zbs2Bs^ZE65ORU~6o_e+Eeh!2Eo>><_$%e^xQt+kV?I9~f)EyaCh)$dTR3iTG^-Asd z)ThrYg&h}JY+b3i-pD2X<)_b2WL+lzl6rMcdLru-J$rw>Efej`pPV%AXFqXy!upnL z6`j`>hHWX4Re7N%^x;&$lf&c1KZAc|?pPCg&9wODvlS-m5A8Z{AANw|Jc_GfWz&4F zS(dyWdUaYXm%4o-=L+Y!cZi%`VI%FcNY#DXwmG*v(k^-)zU&yh`fIMK!8UK^9cy}T zJziiVd{LD5XJ)-?x5W$5_3p;EQn#qx_P=^F&;Hb{pgsS#cz;P#{xNrXYL8OhrU%on zEnjmeX&qZbSW4%08NSTEo6Bu@v@VtM?G5uQ^{Ac@F4bx!kzsK$c-A@FjUOgo3W*NM z+m*5GK~QXP=HrkT2l=)xy!=lr;?;GLsNhWT>rEdS<4t%kn&L%Iiti}tThD!PLGZ3PhM*e7j#Cr+9SHqRlw@>7(YB;}W{;e>b z>GQ-hC!`%dem95Bo+o1lQwdj{VPuqDa{k}-4q6wMtrTK9BC6YABATVoKwCyR@3&X z@y*vir`P|Su9O^>x9wuO+1a0;&mDJ|%P>RdNB5Dax!D06F>4-(<=+=M7~!_wW4R80 z;Ud$ijoh*<-d3)P>u#G=Pn2U~kUNyW)!$~WrlP;~6}ENGf`5)I^-EUmUEH(9?&D_3 zKVR&{8Rj;{H@iq}I#IIJ{LbU$-#o1@>Io~&;x_WQA{NOiWipp9=4<1#ve{|tFD+jG zA$rf_8l~&6e!Y;}`=Yc;H^bRH!y$cJv%K66h8H4#Jc9MuZZR!qe4u`^Ur$1Tbx+;z zWlwxJEsI@i;97F%e%@xeu3@-8hg-0S0C8)j|!{@B;dD#4_tSGv2! zToo_%gh}##+9YRq``u^r#}gktFXO5coWOti?fxUC_sUg;ofz5!7&zu~O)SwmSQ9EP zf9t~2npMo9tsGoRCvk0;EQPr0h>IO*QI#d2(V zc}C3B|15HsIG!LJu-jF*N@lN@{@dbXt#8UVU3cGe<;$AM*@mG~w^V1`d%pgFeO+iV zqe0|{Zk7aT`wP3ivj6nBe)M`m!qeH!COdolYJc{`MY&J1j}m0s|H9{{{Q9I*ONyB8 zF5B7s!uRQ~C$;kzHi)zxsJ~bF{A#cH((`U-*LzRWXVOyoy7NcPa{vB_Wtn&WtL~j? zIqjJ)_v_i;sv?~u<&G9E3=v&c-cg=f9Pi zy!o~Azpc*AyPjOizNqDwnYu6I#2fZM^}m+azlxMRU$y>!4x9a%6`8yaT|ed&pF8<; zX5BjN{xwXZ?7v!=nJicTwP@&12>6r3Zf|pPIm4U>r?%8i3;G)-^TM8Q!O!6EM*F93 zoA?!aCnM*I3-UR7|kvF>4miT&HDNr#y(+=;JK|9esIkkidezY|(*Y)hkdu{BI- z3Eab*T2ZlMxm1klvPTZud^+*_Z2a|@VxG_V*Ru2Wl}>4q50}3OF)m;gF?uo8qeVNs zaKUv;1!4JK`}A{jVm@Df7xKIOR=*>Yy-h|0vxlT|=gecF54)K6o??t#$F%EA-L2Id zZA9PNXFO=vUn<7HS(G&Aoc8`l4(kgQuKqfEYg*LSv!Awf$-8{Ge4mrmL3>$9rYL*b zEanFLt6zk-E*EY!Tk)VhTz5Hxu;FH}^%e$~WoGdFu+Ds~&@5jU!n9y=VBpl5qB0UC zABqLF84a}CimskKS(ISbAU`jJDPfcH;#2k?WM=3-c+7cBh4QFQ3l5neESpjY15Ut!HSx z`g^o7lC@6HSC!#cc0<_OxpsVKtUeq*^`G65FLcAQFHO5qZ?iG5U>Lp4X6Ce;HQd@q zH{GaE|GiLs^|`Z~>P{)T2p;AUdN9#Zl2s(}kbmgtZ8i*}x7jeWr;OfaGkTlN=xsI( zqqo_N-exm;o6UsL+iY%*-e#jZdYcX3=xsKmx7m!|W;1%5&FF15qqo_N-exm;o6YEL zHlw%Mw2j_oGkTlN=xsKmx7m!|W;1%5&FF15qqo@@jNWE5dYjGYZ8oE~*^J(1GkTlN z=xsKmx7m!|W;1%5&FF15qqo_N-exm;o6YELHlw%MjNWFGF?yTL=xsKmx7m!|X2UXi zo6YELHlw%M+#0>jX7o0j(c5fBZ?h2?z0GFyHk;AgY({Uh8NJPB^fsH(+iXT}vl+e3 zX7n~2h0)t=MsKqjz0GFyHk;AgY({Uh8NJPB^fsH(+iXT}vl+e3X7o0j(c5fBZ?hS_ z&1UpAo6*~BMsKqjz0GFyHk;AgY({Uh8NJPB^fsH(+iXT}vl+e3X7o0j(c5fBZ?hS_ z&1UpAo6*~BhSzO2CJYQr>5f6}PK*o;P5(i-k)i89BLhRve+Gs&5Tg;yXkcLe4`#G7 zbpCH*==|Tn(ET5x3ZxQ(85tP5{x?F+nZN)xvYnyje=9@7|Aqj@|NmPVnEw9{X!_sE z!14co!2f9h|NjTHFfjiA-xvUrXk}>r&k)eg&Wxp z|FnQcxK@USfJTPa|7{Em0Zsoq7@7j6fo<=Dc!;5|DVw3M@ebS0{|pR$*&YoHJRaFQ z0|IvLYzScJ%Vuc!FWBc1z`zjD0O9|i7SQL>$iNm508-A-5Wv{y(Z;~om)+3E=)utR zzlnjhFWbX|;eXQ|hW`y<2?i#QJ3AW!*mmB5n#k1W5zzQw6v;rae<6IZiH!klAP<7v z)5qk&u(RPm)6Rx~R*)AOK%vkS00}~3J+Tqh6B`*AK%QWQc%qSkbU$na`JrK>D8!Wv zU;_g-GB7~+jSOIE2Ev}mOg6A&V3^d?8Q|y6%O%Cdz`(%k>ERN@z`(=+!W?W23=Cf? zuKZ$PV4Rrg>>S|f?5q$_l%JNFlghxLF|l^SX>X=Lkz@A94+$x+5Yvs~Nm*-h#!NSu zS&-)l&!#Aob1RfB9vc`3Ii6nN%e~OG-*>(1>}y*~FPd?5DRq?nW!`J1czI{vLea_x z1$8yw=M=yH%aG@NVM~%bLqJHdzuVzIHC2t}wugK3zHAh6apqPPDh#N(KL2AOJNs($ zx^1uDSKfXxaZ?+IMa3h{z{|dmQXf4O4Nl(UXtUt*;*N63=ec&tb2jdbdhe;Kd}RBP zJsR9XAEh_?Pbp=6aHDSh5|1Utm(5o9q#helmnJbWEMR6}VPF7dLr^R;FlZP|-_O9{ zz~JfP7*fIbW^d)3rJ<$o|IP`vH8=j^QtoWL!lYSPBe2utLBnRZrdioCLc&Ki3qAIj zSLvVq?e_PFR+i74cVF3jYd%*A3n{Dd1XginnP@0o;%&OXd-n^=*$WQ+rRSpGY~8op z^7WO=&*!WP4qd*g?yvjW^tXGz-TM90cKNFF`D?d+57zvWAEQ|Ca_RJI^Y=XPTKXv^ z^t#gmUlu7lx7@yoGX(^gniT`S$1gvvw>u~1uj4wtGUF^^CMO3D4n{=<7Bw@b$FFXm zI#MUXzTevLfAizT_s$8daE`Q+R?AjYV7cXxu*Zc-gfZiB;wcx1j+O&1&JKbNa`lTQ z{@fh%^q-?skp_nblYz(;6E_YCrjOs#e|~zplKJHQ=W+ck8cYlPw+IM;t!wn`I55St z;{4-B(@xK@?~dP=BRPGN(}H9crRJA68re7+J$nx9d_K?m#a&@WiG+X6-@ZpJR$|!u z&1H+6q5?}xgMa|j;)Vt#hQ$m;>cLx*{ym>t9;f~;MH?a&>$ITf=i_-C4qIoPe*LIX zdS|m?vZg4bg!dQI?Jx%zIyne77&6)UX+M(}oTvxVC?U;~)a$c)mi7$$tN+;}O$8h0 zb+BkK6--cHst2=GSd`I~;nRK!}Tp7)r}1Y3TFPFyy{=`^Lt^Uj4$3kUwoAls$4>lMTAj8Fyi#w zuAkGB7lXZeAVbL@a;Ck6HWP!;B#;3hwQ7P)T?{>!4vT%3S6yJ*3-Z$fR;I~we=_$g zF(@c%f_x*un7SBBetzuwSuPo{6Re#_kkRmeGxKte z0|!3_t_QiqfrF!wv$H{oA+~Bw(!W@ypgeGV9d>azv)`6Mlre)}Jrd^Q83CXGI&)m} znY|B#X$&Y;T~K8?^2eGvNU-7Dhe=!E1~xV*F*w)sB>i({@jDDQFxJiCOnpX!7L$R= z9TP8*Rt1)p13TOt1RMC|=g+8bZ#W4y(7=hK<0n6VgeyZ^`+PTUkUv@)1SF<&XfR!P zmMr`^Usz)%*gb9%jE4W;F|6TmC@+{I4vX=}T#T*^Q8s#p|HT+qR>vp_NM6~ohf}xe zlJbU}o12=GHq`w5)b=lH>!k($Wv+q^C;xF?_zSV*z!Db+!G=l4^`6Bu^~?f?esWL4 zjQVo91|^2O2Lt24-f(i@=+R~oVdUsv-Sd-w3%mD9NN8X1=FoV4|K{ZYmIcOpQgmTa z>ZGuMqru+I@IU9r%4@zHjEV-FpqRSl9L|!Eu_JQ|EWiqT4=m|t==jfrdWQ~pr_uP~ES0+Yf5jsq+e9lKZ|MhY;^RWf*~%)p@L#v%kw z>;{scv}t6MdUr9*YYh$i7+4&Zz%v;S#|!QQDHW%7xxi7VqSWRz>5B!+n(>X$|dama>-j-;Nf>+ zHJdvg2R5aimip5#-r8~C)Ku-ulMXV*96Mdx^SxAy$>84n1=sXp-r)en4a$ySX;a;ROXl8_!%enDr9- zK^p4j$3|63e%}9XS7BXp)INb33>(kypSI#gh3ao|^6z~R7e+mol`dS<`0#;JCJ7ko_W@wa8|_r79nJO3-; zpLk3Gqp#<*w@euZlZ;-0tbH{h+XGxd}45GPnum_^N`!f5r)p1Anady3ggfp_z1dV>rtKYl~CxxGrpM zP-1xesxWgSNO$8#XN70~B0X2Hs(;JGu=3udE`~4HK3~X!mkeAWzj2+J1+H)n{t0L# z|1rGo&!Vuc`{(y>#^Edrw$JYmQwLcKD(_uDdBr7RYB1Q{N1PRm{+#%;n2%{HSNNp8 zEe%Qxd%u`$5d%qrs)EHJk;N=qmI;Dl?28qX;dB1S?KhQ^^X7lc*kAOtD{lW&&%Ji8 z3~FB=Uq1^i(^6a=1RGBNdQy5H?0zwhDTdW;uE*rxt`1fGe{hxfQYD7HKSH*s!7Nek z0VOh?4R^r$t3(?&&8d&cPx)3Dvt_!S9mu^kHtK7GU{Mz?7{Ib%b-^i6Tg55ijX=Z9 z>#x6V=~%JZ=+?!F2DK$BJL^hRzI|Cd{b%}|lzfE+91i(5>}#E%+7GNyTEKB&#i6w) z!2zh;&%iUsgTeSxpWMvq9QXdm8P9DPe(}GE@c3rL)Wz`S)8&h|zzRWSumC8e1vV6c z+Yl1DEWdvLzC5M2w$}4n)>gK;Ul05_T~hS(i~GrnHwph-WI8yG6ke+4W^`q!dR>`e z3JMEQ#p1@==qb!t@n!P-Et_sIytZ0DEmkTn{Ogb9cA`4Iwx^>d#d{acm!AK9PlnQ7 zUY5A3Pq8Pn&Mj)qjo6;QsrK=*l$yJ9)wkJuOmj+@qrmXF@63Kt-<-~y{x9SF z9;=`0d3N5*31?YgKEFE*oY=szE;z$Lu;KroBkEETbt#WhHMV7oA3t80D%iNW?#p76 zDgP|;Ho0(ErG6<^dJuc5Q)5r%#d+Io>WZ&^+4d$yg{6wIG3%;@Y|nhtiHqBJUhZqT zxmY>b+DE?rg<`|0f|GLY;1-@k)I3;mHPIpAjyuDtqTkAl*ACXWrOD?e+Y2^s;$ZyS zZ~On}#Zdp(sXp~fB>s9de|(lIrn#W3frDvR7N^@U&J*?O920)0^Z3{r{a=yX-|}<% z&5Qml4TX~)gF^Dy_0N~GV8w3~TW%+kz_#h+>ein#fQyum0c9 z7&Xb?k1gJ8TpYjiKbyqyxr;as?5IwO+5q#_LuG?JC5E@pekFcOy>R5;3S+%(?y|cz zI%ST0^ZP0xc%te?sDXf>=eqfy)9bIj6p_6-nLGVLLGiDNhSOi3x$b2ow|m89IaMFI z>Mt4Bz4{*?;NHJVG^2IFuicFYR)wyXx^v*d-yM_N_BCtv98P5~h2>VEeH=d=lo+kM-nlTHD*7{b zoiJOBncg?|y*V-4Z#}LF>_4;ba;2nvHmiu>3lYzo_L7W6AGS>V?4GZxzx&OmFtx>( zJ^D*T*(1K}!#Al8J8HWE)Jh*-JXU~B@lHu3-WdGismMX}s#H|10 zruyY6b5wRbKGS@i<-m{VwVOqS^Gxfm{MvpmJ@~A3S;(@U9S1&G&z}J@K^e@$C`&Hh<7jCCMy0QJW z`K_ZL1Jh-7rmK?#jY;JQCC(=8I<3E%B&y%j7<+E)6qf}45ujO)Uey^M>^5YYK zt;Q~ikba)BfW-?<+|+vG9%&oZl$=TYw{h_676L=TOz@1Rf(GvxBg6NTnlG``+|NZ*=y}$3&>6?V1#^>94)}J4U&;7V%^6&ZEo>c5&n|l5K(fB3b z*!|Si9;7Xw>8Fx#;UIf<%g;j<7bS(ioLS)f)$T2i^RY4s%eNX!Aq3MDd7aDR!@0h5&%i%EeC$MCLB>>SUaO$b)C}gQu*`A}$tIg9YwTs`#GWpn1h zhUNcFon+e2B4Q&xkKL-L?BAi3`Slm}rv~SFiQDb_b)eaEt!!B}>8;|HG=EmIEu4E_~&1ko>H_d-aJw#)tWNw$vZ|^JJ0E^Z47_Ourspa53@T zmg$B+mVLF{yj=EJY)jd%%{)G~=cKPsRc6}v@6P*)U3>0Ls{DR$@4aPZdpa226hG^) z>wUfc<6Wlx-}ilAR#^Xcdi~UtV3h-V#8}TWKHFcJe7I&tD(C0&v@;bm3e&!w`=Gq| z+~1oEW3QOqlKg+wwd`1Z?&W7!0%Lb5oK&;DkzQVSFRV%~L;T5~&%1WU_m{AImYJCl z^R9m)V?T!g=Ye&1I~cx!TmFq@pq4=Fk`#F3hDq_lR*={7L*M%AGE8hZ^X24M>l<^8 z{{QJo>f6UUd0yF}NhTs`z4QKV-No@wxp}=v?^afWIwjT@hR^S3-3t4w|9KX}wa;6Q zmoHVc|F`ri!yMUi_6e8Ue=ar_+*vPCa-vndHZI%o+}*bla;b0QRx7U1+a|>n|J$$EAq2;IH`ANUOlnaP#EK}I>ys&PfGTXZ8ZY)-7crUDL z=-5&M8ZiO2mC7bgnhVPqoGk}7C^Mv<*)Qs5P*?PC=Fj|%F?Kw9rw`m&R6oPm^8cn7 z+cWb%-cT-ncSka5i@K77wbj3{LH*FFAsltY_+kQ=l=9+habf& zbM}3AxP2hB_TZx>;oBm5oofFrYJQzJUzw#YKJs~8v{8O2bE`CS+bwceO{_o)e zf**eWd9ZT%vQE3*Wx0=ALRKDbNSU!D6>%yRI(zB^Biof6j?ZFjZ~kso@@zjpe6`SG*$<>mNg=B`W<0%e>VtQ%sP z^=*HyOR2m&SKY`7-0mz0U=d-o(6D(0@3|NXN))jqtk_w<>Zj%9{rz+7e^?!May_Q? zb5H%e6AV7L*blTw@+;q~KFpsf6_U2>&0d2Sha`)?bWc8U;Nr`CRZGqZvl^EDKJ0k1 z_Snx&_USu#+7%bSzn!r2%krGelDmJe+Xe-G{P(M`J;?v*3gt;TmpXHH$ku6}@z-tez9wF% z^2pKpx$uuovsirW-IxrP$nK7iX83&E?)!7LSa7WI^))Clupf8d3o9hlRG6Im7+g$l zo&9;dFp}S=uWZ%tizj~uoBH?3rtt~4eKh7v<6rE)-2PNXdtZGP$D=)8((6@s{yp*G zbJg63$A6zTWxlyF_Q=l*k>PzT6)era-HPJHe_1k?+icsM$TlOlkEKHYt-;eXJtt4L z$5f^Lh@0!*H>Yey@k5^d=d`@+#0@IXY$~b#75{z0-tGstZywNlasKn651lLr{v6)n z)e}&7uJLvw^F+S3;~fk<^Zyx1zLoNyC?WB5E8~s5YkpjR@@kgmdX3_hWuOj*gOh_G zL#;pys5j%}z~SS>V%5jMWBNV5OPA-oq0R~Jb^p|qI(G&i`zJ3t1CIQDV3+y4F0;R?PhiT~X65OU{P#o!e(k(} zA*R62;p0Yo@7VfJ&*ysx9h)y{{9|YHjLZ46A8u}Vpnv}H-^=f|Mz!wk&fRZsb$IcS zckyL*vvw`pd1hj(K|{IPg)Ti$-d)zNlU50euhoe6yLvd9A30l z&U^gW<0UAL8r@h#7&DGI&w^z$&qjyif(>PXomc-A#;p6-{!_6zF>T*M*{O9BR%gW2 z`eP@ngumVSG5c?B<&C?At3zjhuRgc^eDU6?mf!AuU%l?n@|3FOuhpwX|H`fl4)tHc z@H>2NwVxFGVfE|$pVR+otdu-a_Vr)Np}*5zrIJ(@@W|hqIsNy~^X%J}FMBRyd;A&q z?@t@g_uOCoTsgR}$L`g{i|)(%?5-*^zNq|HaB-dN;YIexF7H3D%wKr-j{3xgHNnmg z=D)7;bWym*W)Q#J$oRh>`>8k%jz-V!1|^2c-!8sB25F@w7%5*UV_Bf{JwEL3dAs@p zs!9!VGegq0=6%FNFgO)Xd(_dH#Im{2dC@>(xWwpSzR)+4!UX$L&w= zS|(RXwfogS{AQsl~)^+bp6=xjVkMRU%2;m!tYW=P#d>^MTGH!yCbZr zq2jXOEr-LAWj#OLt!LN^GJeTumy^s>2x4wzwvbS6T5^Bp|I**z)tQTa_3V3FvHH?I zo7-h!_dk6&d@}ESp0(w>=-oMY-my!se9#m7?BRr)Yj}kX?!STRNkQu?a~-zwUsjo&#VE7<#Gi}t&vwf% zlgkhNUVrOB?t{102KC>CXV#^iNR-LiE@@Y{TXpue=km;U_IL94`P-H6Yp6Nr5Fwy0 zbm+>(WS0e@Dh+i?j4l!#AvNFm*YOy8i-JZAOq4GC*dLla-vpEm!PzgNN$G+SQ^2&} z`K|0e`+I&)zI=?oM@;Q>XMOJTKX)%~5x3Ego%r~_c>1s3wkxa8ud!YEf4OvS{LjVG z(vo(sD^CT#dDUm_vxvXo{*{3B?~8*cmw&s>S#|r_S--c(^TlL+2wmW^{L0;U5}cI3-+X-znv{i3a zxY!$nN$40o`>|N=?}Fno|KBPeuYdeEdeX~@#yZ>gKZua#d{}qP_(RGkXZfrv(V5fZ z`;I2RTokp}@Z`$%+X4=q`#oKyHmuNR()2&4%P0T&!)`z0$-eF0?`f>rrhMkLz*Ts51X(%=D-~BjMon>AR!~XC7 zdDb^dch}G7f9719+}@zXklemEO$-$2ps~O-juIKhjP1Ynzv+8)^XHRai~ru+Wc-(z zS?#(1RC~*BU)$gK>4pE#ik_rCH^tcI^GvnM&S=TY_K$fs?|v#aIWXNuzy0^G>(Xz1 zwYyI1Z&zxHY>zniXJz^xyVARXb0$BrO8;i?-?m$9>9@$}+`E6dpFP$(x$msl$rHVO z>}Tee?K^pSp0dt9YXvu^N9L6!ejaP`cc|~ITkRgU@8g{3YO-oI3M>iQ8p)T|A@TJq zA81tQ+~x~juo|UDifO4}!@{ut+oLLGjMjYMd%;9*XO=?D>Jny-C?|c#P~D+MB!(ellSm`bTXe&G{;q~Zg1Y* z1Y(Xlv0OmIPzeN$u@H^b-Sa1t#XOH=elhct+~!X-Ahezgiu( zHtR+Izn|7u5>%F^3k0w%NSA9BQv#J#paG*V0vf#xTXwUox_bKC@5k!T{}ngCFDZL= zzV3h0<=P07QwI`O{!$O$^-N;-RMG9X?S6FYZF>0R)&F1XrSJAm`SyAK?DQ<&4vqlt z4_DXU@T`5m>j=;MU;FO+Ghcgas<-{h`{M6~VYT*;R^TKB=fm8=hPyS6MA=6n#tdav=rwf}!SjsCv=~Inki!7tY z>VNG&w@2CT{J+ejf&Yxp70H6&clV1Q8vMWgEVA#^RFS0}|X&5?;HUKYQNyJ0d@=bkCG z&ik{j&e|e(FZ9FBtE+dhUTyi}tkN+1v5Vaojl?$wKgwp>m;E@*ziWv=1yke1q<^U| zj&&S(b#?V=pR4znK~qo6{Eps`$xuc`gIi!%M@Ot-)YzPz^zX?(P{e3F`IkBGkoB(QlVTgJ1gmGbgUwmbcsfWcbY4 zi=ubdOIW)|xAn_SZ?!!$e^q^!KveJUx8e8w^v+jLmUoPpEw$X^m(P9C0G9SbbB9dc zhJIzCfR@kVGfLk7;(b~4D>7Z}=d12IZO^L=4FTz!bc7f_>wk7rQTTRQ?zpl4mg#mo z1r)yD?^@XGwfu~IpZ08ZH-SesYlQ13Ed~|ei@Ud{2}2Xj1z`>oSBADKCWWmGZ|{lz zK2yBazGqsD*)HondH45~lrDe1VEfrkf4_8#-~Lw_6m0M=>~%-a+!(vZ37>9U^jBe+ z`!vbFdW*BV(E%IwEXFswt=X%-FI$)OpVM=bbi-%96|6HV*Wdh@$DqXE!nUgT*|Lvw zSUh+guB<#eW80B)vNv}Bn`e@Di_?43pT6h+4$duI;`jH31fxV%q%T9yyr_mvoEx-X zhwm1!kYLKbwnlQx?)B^Sw|@VA`+j&dGt+XnVxry}|_%Mu}IKR!`ZQ1EkYk7}PZzlXc zzRu^+g~T@#CkB7<+Fh@B?p?<5KE7Ltzs@xK*-z}U_$R*K!2f*hL$%!%CzKd|=ue*c zGugr8P+`xR`T1|wW-(Z7Z~Xh;=02!qHlF;%Kp?|h=)yaZAKBOA%7ld(XOu?z&D-5} zaPi>}na|&|{Pp;?*l(S@XZ@5l-dh<2XKuVG$|xay$8Zv)-b_&zU_m6bdm92{`$!OP?FLiRn* z{hwp%EN#`~t3L4UUNPtL4MUgSIrfKd{-3YRP-<*Q3|vUjEKz0Z+`qBhpg47aVxdY2w1>Z~ykj*4e+)#Sc8UOYi=>JpZp%?4DP? zu@Qe7xU(1%{o%8?xKknA|^L1(Y_d`4Wn9C+^j*gS%j4nGh zrs+nTX>b`n?-QKJP$FSp)x&au@3XsmT>am#FDH30ygfbL+>I&X`KhVelR5v12r_KE zII)YNhwt1hS6GtqR|K`@w%wZXTmN$6zm04R%T8J{7}S+K+k5!?-}~>b{{Jc-k@x4z zt^2CNe*X^d^O-ceeWmj0H_6r7)k*>`EKz60i~s-lKi53c&+c6OvT&QEpzpUj|NZtT32uvWFe+ZS%(111VZ!I$tqf28CC&Ape9G;SlV=}a z7u;$8=Q02PE!#IG#})lI6#BsbKVj!j@&9Ji*ryxRud$Fc*e5zcis4O^=e*lfF8lc| zEA404^Lg%juV3N&e@zY3yQ0t1;?S=kFtc9r@^aZ{{d~^tHzz-KKlJCZjcw8IC^t@~ zE`})#i_>83Wnsz2WgHIcwtc_ziO0Tp-kpMJ3xYNa*3RA@u6%#e{!iJwJ6A56 z^2~QMs4q#`T{i#Umfi#Wg00i{KU;ET;(X@5*k@(?7w-FQwtU{d*5k8c4D3CXjJK|h zo-}X&%=TCRZTIif{_1c4@`y?$x59IVCC3`&U#I!_Pk+7d&r+4IX9ZJKS`YkiWN?$0 zw6m<6VP{p&cDViH<-R3zIUINItUu=6$IJA~+Rki8b{Ncy$z2Y?EDJb7D!&&VU&?y! zf$bNa>-!&l)!(qHcvj-PA1m|k&)cO{{Pu0h4PWbzEhU~R3pP~*Ui!%vRhac>R=1wl z+xh?O|Er(;Uh%2se5G0b+Hc}3=gQBydp`Qlg^4$Mr~bLJJST02{p%k$&%b%K=DDqE ztj^usjRF$&Q+k?zE2hb1 z>H!UGU6{-vz}RzU{?Sk6=C2H@ZgsLOIQ-{gyH;d;%<+J~nK9L%+FH(UlMuAFFjy#% z(Z%qAwBn!-$<)G z(ei-1IXml=m|T)R74uA#{qyFV6vG##D;!V06%>BFE~U(}FnX1M0F!MC!G2P4M=t3X`v3!={sEmAVIf%2;-sL^J-_z!bng3R{`SfK^EJ#u#B*ndOx_rJt{PyY4WoLcoJ{oR&ZZ9J2$9p>+?+q>1GuC#wg%Cq+q8O||& zc*yKvVwd%S?Z0jL?EAm|)mEMm77vd5xM|7%nuU93KRi9}cm3h(QfI)i!OT(c>_2Fo zLs;{^s;{rE)HQ6ZUOUm9Bl(=Xy1`!w&IS8@j+HYc9JjjIX|uq)57cBwFStCo*{7A= zaJQeePw3sBBkDaRzswJx`Q!OX;cwZmZ4rFCG~P(7hCaW-aAmt>@N(PRKPzTvoY}JC zYjpql&j-!-8NReH|2@0DB6wHS?*p2icE$T#8T<^l?s#ivtn!_Y`TN6I@j|&0wOMJd zUuMn_W?b-JHow|=*BYCYew72SpUWr3ihLEg_2PEP{L(6y2MtT(zrNqj-OtiszT04x z-NSvo&(c9Hm*3?vU+1d)T`86y@a{h2Q~{>P{EX)q6P_BpKk+B=mqGoTi5u*|v;kKf++<$T@iXwUld?e=q?@Xv9YU)D2MxZwZcwEEX;R|oB%&Ld**|HO%8>nf=` z2l@XP$;pauyd~e{_pbh6)8a`ljpeKrPX;ru^L@`&!Y+FMo`Z_Qb%va+9^Sd#a|Jxs ztzW~|Q2HtCV3)gC#rDJE_x{dH`See}RxsF8QGumOgt6}a$&HhLr|*0|uR3p6&sGM5 zsy7M$wg@XOkhT65zAnb`vZLzjLmeC}yPmuNP1?VBwDu+}m40Di%5`UG+kNYqRD)Z; zL4DM6-N>Bj`}F_%pR=}qIlnBce&2kKABW}dOu99{wD0MK|8IZWd;Ss)zhTLkU%z|j z!}OF_cQ0Aqo?m(5=VImjJr~!do!|C8?*Dh`|K3>^e~s&bfEH&6iA*^nMe|QnFb(f&X#MT>Bjl7p54keZSSy z?%R)3D)T?`oNm3J!_FagJwAWliL;ya>sS1GZkPT~rmg1C{H1*@~i%Q?CZ0O&!7JCl$V^-Kn1|(E9xYUt0{b!0P|Yea_m=+mSGxwKsJAxAn{&uYdplIxFQ9 z|N9M6&E_?44ck1p7!?it1UjyMHTaNvdYbGPz9f|g3y$TM80jx7jNJmNrMeh;c;C$m z<$&a-12dEYq!=xJC(C;;`9HD0eoy17Vx_osdJthZ7Ympdv7kBXW-c=K)3DW_s>z2&VTXxx=`;*wW@s|C2wuE>qANlsRDrf9(6mE(w z-4}Yc_?zwS=jHmFgqbC`iM)E3e|@&$??+d@UcQ;GzBBXqDwX@cu31n1bIg3w344o` z`sPz&0+=1X+kTgsr+41sai*u7;pY|=?f?IpRi@ATdP(JH;Hf{d=6=5p+j+m^e<|zY z6gBscJMV!ns_M%o8r1)(|9W-3=X7nZxeOd?AfG4;NLHr2nd`>#=*NrtJ&#Q%`Kz@Ztyx^lcAUV?@PG0!ojXJ%j^FCefh|D_Wfx~ivG8C*MS%3 zscA9&v9}9+@BbaP=*WSCr^(^?&-MuJ1CjrY=Tsi{nW_DJmF;smWkz3~X^nct=j^wn zo6g~OP+9OukX4D%;O+5gI-brypBWeb{k7!%r*BJo4)g~-dtbcu)X&XJdX}3v#IL?% z|9E0`rFg@2hML6ZhgWu&>#nKTy6XQyuOJQ{@y58dj4#Tr*8Q_Ki8*jfX1!E{S)-QW zj240Yu}m%kD;w|W<|Z8@+d@!E}pXD%*o z*?7F{*wn9=`(z(4_OpK7^l|a=ugUjI{+H}vnZ9fOoCq<_8Fhy~W*&LB+gye7bNY6- zg4?BEdryB;ng8JGSI%8eHawbte^Up``LEHdmz8I_?G$8EZg-IUte$@UOvvZO;fL=B z-`cp?-l+b~Iot1dN>+L>bbOf>!m?ody!J3<*!XIQ0BHL7#A@a5{w)n24nLMjO6v1$ z&$)MEN%YIqx`eX1-?q=vf8X|?&UOpq=ktGkWIl9!@0Tk)CCE~LTmIdR|M6?1jL4yBIasI2Bn~x}o-@YFGM2ROm`Y1p1 zx8I)`_-{pfzH8=SoGZb4S&0qGO?Lpq}=jQVak8?J%rvIwGTAi|^XSuAcaa?{w z=kvP#Cwy-EUvoa*SGaNS-G3H*w!hB$+@G0#ZKj67{}Ue;pEJ01`W)kl-~VgH4}6*I z=i~hP`@QDw#FIwH`Y)f@plqCR^iA|vV}I?)XYD5#{<_QWx7fL=N@eN%6TT-|x;UmV zEPgi6g+cAydqu(R`vNAn`q_WGBeHwzg_B?1t$$5S`ln#HEl99o>;_mw#+(m!q{ciubNxPwg!N>Cb`*Jm&$L$Z5GSmNQC^Ij&-?sR2yxPX(xob=Q zq*&YcH+*aQ``6&~fj=9&zjw+NI;6`?x?^8uT61{+f9Ce3>mGAeODmMEP4PbV{=Dru z_QQEk?Y}pBbI;jSyPEqC%kCZP*v%r|IvQwqh+K#hlk5;=JQw@J`mGd$)k#5zhW&?6 zPt$#U!rEuPE@)gMn4?6O zX~Q|m`zz0VIlV9Pz#qqjoq_px-L5Y%GD_&lSgxk9UzuUq+cp=4ga=El`X(9#POpsV zJhvgky?WY@v%Jmm2R?kR-6i>UZP9-hrdOugS8u%D%8+mU_Uy^aU5~n({okxzD^VZ6 zqyNMT{#SoG{f-^Ja8XjC^p^G1)VfD|UL367vtB~*#{2#3JD(l=y6boH^#&y-#)y^5 zT@0bWe3%}$S1Kp|dEqg`_HidmLVwK0Bv+%IUoLr1-t%VDX$hkhNB%FEnM~N;|!MEdf(>(ZhGyX`MUe0`{xc{!|a|WJ|^Ah(MB$lM)xSzl5 z$`-NgFvICzn-9N>E0C{f)m(J>eC@*NbN{e^?%(+%`}*zA6(t9+Pkz1AM<7M=bN-@eMlvAQ3 z__{3~47-_LNH>?}&%lrH;c|3RBc%H0m7DR)o9n#_!f7rH@SJaBexXG z)Ap_OJ~N-ytv>KL-$|=SwNqSK{(QE5UeO)%WhdWZMWq9uLsb|SsJb&TN|^26Z&3Yg zky=BUg#F_e&p&&wlRwtqGm+uX_DMf-Qq5R_%b68vKF;n9@cZNr?!i*=j zGSnF*94+=My+3`PGGpR?n=|73Ym{3VFQ1S8pjG^KiDSvHjqZ>5ZEqc|D^cQku~vm= z{h4(+b=QLL=j~S7aJpxIn&obz{ab`NS6H00>94I@_U~u-UiF!F$=BAX%oi)_xN%tK zl!X0fQ%?zFA!Z5lGqb*FY+P*nt8nkGw{<#`)||CfJNfFb^%~h_a>uKy-_BSpb?o^G zmbHblYozOcxc}PmcF*Yt7S@py&adA)aiPYq!+MOaObjubq&befs+X|afBr>{-b~?R z{c@^3^S>EA^IyVXee#}@gJ8qGD!C}|PAbrjj6lZ)uLT=6-DPNf?$BNxzI3NjdeThI z-!(4`UK#COGq=!1q{Cp#rvAS@{cm4*Jac|NyE3x+i10E0ck;Chc<%bFKKAn9$M}6e zmR|Wcr(MqH)2Z0qliu763@jq2p(RLc<$tD1^W%%{|vsCN!XvU zHLCm7y)syGrpmXg?9%>rYu;6yc+d_MD7w%sEB=HCr`DqGptXzx#EWS(wNKTG?cne~@l&zER- z_ujl*r<9cK;v&kp#!y>PAC3zieCTx zUnkEIkA}kviY&XD80z(ZRx^L@H)Z%@oT{PtB0@kV@a`jolop9XT>rE#|O6~5s;uB_W zH7=8=dw6E2(bB{3JwjjY=H*mkZ4H0Bc^~uZ4O;d0TsQ`uO!n?voE^_D*|TfAgdFq|^NR(bJyP|3B$JY0jgbvj5k9Pl|g`|1IY-|Hkbc zVy)G8Hl4inT+cwV{!mNesdb097%MN&vj0{+)y`*M!^Y2L&eM0=zgp9Ng7M7!vgw9N z2W-|DyL0SGYbbs0aq!>YXD|0v`w9t0UXUo{ye#Iz)EAW^$dtth-d*rzm$iS7^AhgH zX&ie#wCekqt-ZJJ_&NreLr)g_eYF>|o?&MtU+u?oq(3EJ@xsIZd3(23taXESjT;0c zq?mfQ6lU06(kS}>dcJZcRFWOd1lSAvP#=1JNKX3%ZZI$r}ywl?BRc~Z-;+@%W?g(Il=+=_v@Dm z7ADwMf8uPYTm0a)&z^S^8V!!|P= z#n&88O?h(WbnmV+XXce{Uw!xWMD|-V#pjlOtc-dwUtK;t_KoGwO&yG{7am)%WSN4$ z_<7+4%^aK+m-@bN9PIo3=5x)JjobWE3f0>tIW3T3obk`7|3zZwxto8sY@amorTgz2 z=kII3nWn$L=QP_%tIUvh@+xlOT1*DJDzeRBS;)50;kpvT$GoC-H?2EZCTOdc`yNr4 z&*H(`V7z@+_|?M|iHAHS^3Oay{`J6v#A7dRe0GFf-7|2Fx5hD7-7l-K8XbKi;X<9V=G$4TIvlfXte7=0$k8k#GRI9lgkNr2T%Fcxsq>PFNP8=0V+lt>?K0hCjo?%d1^w0QaJYO-7 z&${!)^D5(azu$gL*GFFVSbv;a;(;%dtIvnNK6k{(_*`4ej2v+VB{|Xk4(oq;=GQzv zRvnqraF@yThOa~4{Evo84RXpH4;);S@2|IKmtc6Gw&PqjW8Cj%Q=imHF;;7B{HIT? z4O0%dxmi8(O5}f^eioa3x7~tN{qyerooe{E%ed-;O4C83F7`JphfiH}j}qqB;Xg6$ zCDWbFkv$3t=ltjWlPt7XBBMDT^9fSjA%wwMtO;QUKqrG`DH7;(`VB9c+nZV=1*x41jR|`{Ghq(m(|s~ zs4SaXP$MODT{fF}Q~aL`0xA=klvICo{*ye$+4VwPF8%e+5BdMhOk;mfyT4WMS?kYY z`Rd&7ju-QJmhU_M<<~s-+&kO$dS0_N3V0aPIN^8ykDCt~D|ml@eJ+#hJ4d*oar^W0 zkH4`8`LkBPiCFJGH?;g(hty!Ypo|`uPd#92(=SS_- z=ePDf{4u}uN>VoeWTDQ-FJ&v(W$`@=kQ`S$ovk}@bT^}5 zPYm|~hvWPAU0n6-{?D`fy=~3ye@A-e@x6@Q4m%6L?r+KFmW@i^D_I^~Jihk7;q?BZ zxQ3Ib;#TvX5L7(p%+a%#FS#xA^UejfMyalTaC_ip^(m#p)B&;6NqLyE53HFz*QUcBVn^!zCG`}vly;$>??jBI~4%6jg5x2SuP z%A-bkB?g1q4-4m)m8iV8(>T2TLott$a{02^@9V#{Ndx*)nW_{ zRndLl^cp(Y>iwrrbx~SeyZy_=w0{@vCwAtot=~}>8z)u&;iG*S+Wd@Aiu_oNM{D?MCzuBW5nk;G&;j-tW6TL%wHz-3&yOLUiZIq{*t3r1^l1eKc=_6Z`-*4(N?CJ6CYntt!VUr_pI{A-#J@ue|zs= zd&KX{?dR%0ul~KuHTBTyKYP;}i^VJ+8qWW* zXVlqGWM=rt`rUfp)mgnW9?d`gSB|q|7r(Xzr(n5D6jvGRk35E=zdfffmD`H^6Fa5$ ztY7hU^G@f$2{(4;-1;y7>t?CJ(`B>QKHquKp-Nvd;MgDc>fS$pJ9~EC7HoVmzta78 zooPI_xl?N<2IbT0zYiuPq^(UT{QZwL?C8AW|8{(A-s`%)pFjNPUNjx+lgth#^Q z+4T3;x=pe^{d4SoolifP5%KfZ;Wul3$iWI16MGD5N|cyiJn*!h*wCT=ZKv1)=~s1|;;$BeIlceK(JP-X z^4H(cnX@xFys$0){`L8>w^|irElbLRUdMeFc&>ar{_}axqQJXK0^Q$#ch=v&u5Q1( zESlxvLH6A12c7vpb8h|FXHk>2$@)`4^}NgPH&13VKUbfXwSReq*Q6e;6`UNVa(lEF zyvi5UajJLJWqHqX;_pAs&&HQJ=PdQ)|Fn45iyK!?@40zJ*(maR_w+qS-YL|bTQs)> zwDja-v5;i-a=}ImyI<(FD-?^ zDh(YD-2O9vwx3|^nJWCIfcdj~`h5GH*?A2o4qW}+yYc(ahTG51`i5_}48H&V>K*ep zn`&S7zukPNWN%XX&F|vJ66RNR8J?JbFN5bxW*ASrOwkHgo@M^VX_0H?rv15|)vmI$ z{{I;j@w~f}p5*i^eDKYF`FMBGZ`E^4_Wzi9UgfXtI{)v*Lcb103o0kG=}XiV6-|)8 z;a>B-qSv){^4tIF$9dL$J^c2c-ShN^_X|#GW=@+u?`x0B_bS~3i$!-Iu6^_W`OhHN z^SA%k^gj7@Q`K?Z|0#91eLq}Twf6bFui2M7tlw{G+|gVyzhcqW`*piL=Uw)x=3zY| zbF#56c$N31hPmGHGoCQjXFlBSZ+BAWr)MMU@Bi~(K39myXY@Ov_1)cgYV30 z{eAY+Q%xB}?fDySaouYS_+iQPwf}Gb6Gt8$hFgoZ&RDwJRF}-%yHBSeWv=S}u#)~= zSM(YJ+hc^m!{Fc{=CuMDk<1QX|MPsi{ySVpBJ0e{=`Sl4A8JRXEn6sCU36{c%C;DL zpRGMV?;F)d6@6_!-t$tve%8}V;@97KznyI!&G&QW`7M%(Gvt4IoJrlR)XgEnda2B` z=2h@D``-blKZg5lllkmiTgH@h^!%3i@0aI4((s&NKe2&7wx-b8{>=XS%91VttB#+^ z+~WM0En(h0za;?*M6l~m2N-z_wu~?U(D|&ZDrGs$~gb_JNJLlhq5eJxKv&@%5%TH(|Akdx6Q>f zdO}72_wWkX-fr!VVHUW@7BN46{_029qH|i>r!4#PNBm&(l{hyAqib<-tFM`ru-r=c z=Ujg8=tP%gyI%yY1BWdrc{j$nFGvN=o$5?4nzrAa>DP1fu%*)t|1Yck-#9a^!Df1o z-@EyD>VmKCpC8#@d*)f< zcz&Gp>F+c1jrU*Z`TV;&T}LRu_Ry;H+4}XBui~HYShwTPrzOIi8@L)9rMT0tluo+# z&eZs8M{>%)!0#X5l&cpR&D}02^suw8Hs zXZ_D#9hVUakNJ4`O5uydus0tMT$?@V-~Q*e+9&Tncf9@K+5A59eC9PjJ^NjMblojc zO89W)iyp)K=XY64?`1xC&eib$%Juzrk#+BD-)DbVF{^>iqRK7s-Trhr*Kl#8xEc25 zvj1!@>c9?yap3StVTp2M@GEtjv7MnM#?~@Zi9t|DiPci*0o$Au@zs|S|6Sx)zaF}W zt>Mm(t#M!LcRxRI@@M?_6W^XBUF7_>ZCB-IIsaenc2{0V9=ma)%AxyjpnXDS_{RTx z-|tf{wb^sIO!m)P^PZpUD!$CPQdbuJP@U3%qvRB7%xA}g~#07t@+24D`p5XEQ+{xxbbB8*2#`i1{RkM0O z-0JzePn$VS^V$1`Z!;eJ{BmQ{mN|(^1}x9c&%c&<&SuZUE(RWc`(82F0w6um^1cV_ z9__1_usvh%#`GfH=IZ&cxyNjZt9LATRsVgKbdZ0a%??>pMxMvnS9CAG2}}5=U)gH7 zS?_x`+&Pd{?vlytty|Ma=3Ldz;o>mDny|123T&i*R2uiDWlrmADEvOxIv9rH8o zwfFGq-+KD|fgqz2tIhO`_?gKkze(<^pYP$Y&M?7Y1?P?DJzrPa|Bc+Vu0Q~yQz@MBl~B&Es8f9FJ;{e3^*lr#Rvq3^+$?dPUFm-}-~ zuuiTa{J;4_SCCzqpPTiFJkDuw z?h<&R#WdIG|JBvu%YUA?-Tv|Wmet*_4$M?ykZn)}A3Oot4kFCjI8BgYM(mzMiS(TF zJ)2n+g4Uaf1K}yZq0m|Ji;&Usu0x=be}NpMQV1wVwR)&(SiW2l9LOPb-nA z_-1@a+~EHwkA~Fa-`{Qi{qLf_u65nLo7=1(h#c?zefmc=uY>B7d&Zaf&&n7N{khUdEi#Zz_C{`neP8p> z-+etf)$a9w3+su!lV7fS__oemE{W&c4%cG=&(E2jEV(;v;?4hewrv!jqjI9gh3UfM z9sG3%vKasU+FkPB$e?qxKpFqyGa^VftO7Gb|aPY)w z)!lQhGiQ)~`FCyE8uj^}=MN}k=hav3zkB`A&i@m2EEGOy`g1bxTI05-{nwm(zrvz# zeBYnXUv)a|^h43^{`?rjo%QQ~J#RVSwwUp(GRxB4OcD+%2kYZA&P^&?ay$OR zPs^*1F@O1!9d{kxd+twnwfVAX*>hg*zvKTWdA~j9WNVx6{}0FZtNea0oBjLsO?$gL zbBuTO4Z?!%?{MT+@if7jRt#!4N zt}unjmd~hrCG+Fr68#OzUso_5SeIbG`~Bzji+3~j%rAXX_;At5bJy*c-=Ft<`u-f| zbJpjdR8;zHPP}tJ z@pV@S%K~kKQ}9i-A6p$VSsG;C>)m5yVEy#_w9owa+Hr61e)^VZCThL6{(Nlta>dL3 zHi{?j$}v_P6}r5VwWF@ythy>I%HaH}|CYDqkIBAWEGKDgne+y>JiT(`a@$)Ag(VZ@ zRy|n1^IXx>_^LBbjPEUm{;yTtEDgN|O%QaDL*PWBRME zp2(>E^Z0wT?_p2V?h`V`m%sg$&t1yG@Y*T2qGVQRly?^86R`A@y32kP_LA3V0;U!b7$Av;>VN11237RxbFrjNyY zl8$z5sk?Ri@7C8}mhC?JXXba$GxL{e{B(}~Hr?_TzjruGLd1tm_$eJ9J3*myJ2RB| zf(+*deZ41twChe-PpbX@!@Y=);rIWk=kv7onO}L~rMl@Ei$ClBF1;FH^StDCdb~)lV8f>M&7$eA zO4DB%DqRR!{cty9*6o~qJERx9v|$jtv8?8ZvaA2?{E0oeVmCDA{VORph?_6mI9Ye! z%tzbb?XCD?hSqW3&W=Nb1TFKLCD&wsu%+$?9uc|Rwed0EO8dP^rV$goGMe)r$~ zU+&3vrejhJ{SqId-Bl9qe-vw+@k+2^wfwgG-RZI`%+lDv0rR54k^iNfd)Lp+Gt6e# zFI%kivpzLM?Xn7}$q4BYYu;;>d^J#Q%T7S%5SJOGzl{t z|6TlR^?oCUZ*RVA|7$5{dj6~M$x{;<>f2rG;vPKT%3!Kw!@rGVqQSbm&+o32ty671 zVBwIk#O|8%**~l2{*#qmn!b?ZfCl5*OjtaB5n@^@$dJYGDarYr-F1eRZ)wl+^Y>~q z9X?;TvtXIayPvndmM@>z#sB1q{TY9Y!th-+_p384cc?t)W_FjWxzczq?3+QfME&ZY zCp4MmKe_5}>|igLnCyP3E+Mr!e&XlzyO}hS`=8DGy?p1R=f(!|Z|9!keZ4m3--^XK zDa)_^f6$v#{x9s?;ab1ow^xOa{^h^%+<0AgEQ1R}QvJ1Bafhoj>+Sdz+?Z~-K9HaA z>yPWRN7tf#eyyAF#yn<%G4EOCR|WG6HoI@-X#CiAASLymjk+s?17y!VX#I%_Xr0=I z+x`r59C;mXtiKb&{NUuwh`;l{zLn$DU=)Am|8C}-?Q_L%*krua+&x>GJu2aWfvtq1 zptrt7s%k{Ou%k|6eZ@Kf6{a(}3lPCU^>qbtpO8eE>ut$2qJML3w_Fwe9mKFV` zW#=i8-qUWBpRQ{-Rrf~e5o@37v&52}x48aW=v#f>#Fy4_ zo^$vAKj-U=E2XEY^*?(%wfF4OsI-6lHW_Au-xq|NRljX~|G$5S``(hIQt*kDDe3=g zsxZAc!LZ>cyV|8nUWPkIER^3fXgC!zOl&xm%@D!vBmDQcz2UQ8i^Mm2AE-*mxKZkT zNaUmVOr^JPZ`J;~Y^JpAS^W1Z>w~##AD^>ixMM$2@R{?WKNn|bF}#pa-1+u-ozPtO zrmU|!GnbXVHsiH=Tv6+1^Id$-W{bPm_qXm&7H8PXz`Ec3?KJ(*zn^`(+RA;2$JCyG z!M+2}bfc~?gw+1|^z`&$uBBXziWl^lR)?*%TA``_C-KVatN+&Md$}?wDP3v>HReED z>zP=h+!+`Y4JMamGf2dV^xikE_G)?{UmEGK|?lr9qfMQoQ*8PZkG;k|Wxt z^LHMuU94hyE@L) z&yp>Pa5=Q2{{5aU+aj0`m~WMQeSP^q(1Nx}@~Nf_U-(0XDi^RVjI|fv|LNz+lH<(V zO?f2WpYPo69LBfZ<80u6J}f;_ji6d^O0f(sSDC8W+aL`ba1e2Ue*!$ zX1X3ri-R%Kmgv>K^ZbKY8X~r*G^3J0Q-b%=|m{uWPP$ zrY}*|t3A@dq_^sS;=j$dLK9}D-t2A7WlR12|1)R9oLK+Drsw}US*G|3-wwZ z=1i5^sbZ_YCA;U#|M|>Z_AzUJv7E+^%HqinihbH&yD)uP$M~x`Mcg6v^sx)cSF=FiqxZJbCO-<(@8vh89?afSP`%ISy>_XIY}Qz?IkG>iH$>f3tn8|MqwK`q*tc zwtfEVqh~+4EVsR!;ZE4xiC?t;S9(rbK7W&)=Zt5$^QzRo^D+CoDSuEt*L*JI$sffI z0k>cA|8GzGJ^$wl&l&Y8C7b`&zBf3!%X-Nz`}qtKGweT4@lxYq`>FHO%CI9LU{T!9 z1#ADjx?f$nX~)xPt0zCv`TOzPoQBVfw$GXW?(x~>wPq)k|2o?3xOm?B!NE@p693eF ztACi!_~fUmy8oX8dgeb|GxU@H70xJ8RA7lx1|7_LLIdq!)}?|Cb0+iiED@1DfA)AR z!xZJu(+-@dvEXOe|Hi%k=cC6#!A~V_+Xmd+Z~yZB&kyaBYyMB)H{*$Z{wAe{<@0yh zy-Yo0Z&akjv}Liny6m5h#}^A3i+hetxMM%DF&DI5KGT2psS7HzE4Ev&dc5P{E{zVB zBenlich-Mc7tq2`oOge4Qd0wPGEfltpLp{PEbq;`ymI-i zUF(0VuMV{QB$qO^%?dP84Ao^f2$8F4*pbqvg*g*-1{4KS`R#N zOxR>xKW_`#(Xs(jj1kX$nuTB9I@%J;!2YIJ=u+G^X$Cc`$4i7SU#KmYp1dmmcGZEa z2d+*R2hi;gh!C+hcW7d!0e^_WgHN>=S<(e9e0~=k0kLgX)qez2-%! zpQf&loTc~gwW0o|w!Lb9VvAX?{tNj({aIJy6a)X_$@O8+Z_oU+^tr*2SO0A`ZSJ1c zUh^ZZ@@`hO-g}$pUr%0K7yEz4lT%ZlZNEPM@|wtP=N9+XgzftAYyRKRN$!!w6_Z=d z?G!8I4C<5^&fO`#YVRZWQ$@Tv&dvIslEkg}x*fUuf1F$3cSVCmO`K_U`0fAPF2^S9 zJa+P-#QXH$<-bCHTHk$XaTB)EOn~XJM5EX0t?&OFQ5R~RU$}mMyUemi9=>1OERy;E z?qp-AmJr%?T87i&;g7a?r|wjG{{M1H)bm(W!}gjdr7LSMU#y?}L_7Xp!KC^BYlM!T zHJ@$sT4(Yc$NXCt>WicW^1m4MyD<3KTr4_S|Ls+|`sK}Kw@wyuzG)OIdf~$GA$->F z`+JW19AY~0*Vt|!a{~WFv3cvIgM8Jl% zxr2YNEbh^kFaDzFS$|wGT=nM^;cF55pI_Vmp>>Iv`Q4PFHS>hePb{_h&#Hc_s{Z`B zWqba-Ij=G|e$JfF+f(He{ynr5abeoCch_S@w;4S9^|w~nhC6;Ztk+=mO^$KKtKH5w zL_c*o^S*x{^YQDk$|anQoIMOa_V5Pi14=4Wc*%E0ITzB%u^&fR~#&SJ7K zY*O7Rp++GfirL`J)6c!9C4JU0K4>{GDJw0D;oF~I>$bFHzuT*R@_KAZ;NeLtSa&=T zO1^OP@Ugki{eQkqDgU~){`t3l^~z^6mwl3}n)baXJ;GX@^W9e&8_SwE3Q22A=5J|u zc{pX|ulP+z_7%%+f6#hzi|Xg^orz^X&R_j!5|G;`m(nWzp-f5F;P0Hx&)6PUTwng_ zj#GW^#YI)IRsumN#>l z1;zPy{&^&R?b9D|ndy4V_TSvMFuv~FQP1bn#*;q!7EP|r>u!Cv{8jp&;%D{io@yL4 z{=WP1rE-QJ(Tv>Z+6(HRSWMTCzqiFCTj5&BrL}2_7n(Va#83Zx&U$^~)QK<6OZYVQ z9{Tfm*DSm6{iO!(&MlN?YB>L9QYkn7RVE^???%ioBJL{DgPW%ch zx;Bkl|Bz?#<-Yhi$M(N_^Zb^N-$lD0$IR9KZodC(+ScFaKihp-SW^0}SzYz#<6rMp zDxZ8_XZqJ&dUDGIyWclGb^rZZ?`!vYrdncyLHV1t-yOQlUrqdYxqpA~v~wQ5^iO>Us$&4f6XU(zS~ot{QGPkXP;@vx4!*Vy%Lk}&i{{lPp+%E_jywH z+5A8H&$5nsP4>I_y?y))O@JbBNnGoL5V*?s+-?T%kTt0iy#y|F&n`Z>#= zSK*$z6@DAjnmKwSr`k{7RCg=!pU!W~{fYDEACFHl~K=^_Ar#GtV8^UVAX z@xOu3_BY=%yt(SHvfPV5w$9TLnpJw= zR-31q{=VY-fA>sRuY9(6+ib?)l6$W9v&B2Co@1Z>PdM|W=bHlN%KPP=iRv$47-OT+hT@zz(BOt$|!c5~(b^Y+D+ldAd5-Qsh$Z8r*&+ZZcey6U>W{nCT^ zaq?$wRO{dRpRjAz$B*_No3{N=_bjSoe$KirAl_{JU?Y@e!R$BnfXjz zS7pnm6mHIsypl6#+RJa~`o5sp=s@jvwfd{=<-bDm9^{9o{L|=Uc`}Q~t$q9dtBL>a z*G!03DyYX?h8ZMX5M18^!jwkBu6?O7CBGKkv`A`xSmg zU*}Gbo$+Lza^Hcip6m@A4o8b`Y^^+Qc5C6!+OwADvTW9ExzzLM#Q(30Q$F4{|5H0D z{{Jua$#?db=T5TeKk?)Aj9Mv^6aCS78;?Eqvonm9Dg0PH`Om@Z{{|;DFTeTOSa0f= zahP93R)BHA+}2(5ivJsw{rbs}_R`c>VV2_OG!KmFslEb!C+l;qV&C-gXhj;Wb2bKzlz%kxg2ENr}Z z;L1u?jSATX#&SxGsVj=oYTuQ2P5*1DyjbkP-G5~VX37ax=(sRN)NkFdzcXd}fm8SY z?w|B;^UW~j4cXg57vB%~d;Ch>r{Z+=$k+86p5K=G&&}i6vHk;x>;H=@|LdOLCi8Q% z{O1V`OSkR(opgPY>dCxkzrK2YN}l$9w!ZDd^OE-8e(KgY{yOyMp#DB*#dp8+SN;3` z+*$PhKIbwR{ob}?jqR=X@Nby?r+Zt^a7wi8RwM;6s& zZRcuTwBys9?#cU-PjXMH`Ks2%Kd$bd`o&mp>t~gH^_%jUJ=eM#9{qS`zWDz+8~uWQ=f#P9uYA!oi|rjh zbN`tqtLi1}g?5J(ZFcQ@w63A4gX!_#%91GAvjv`t7rZ%2PW_17J;UB(i#o>X_6`+M z_e6FxuGn^7kRjd6;)KuKwhQv-Sv$^5P28DvN4hBG;Cb;CKWBb<;v)Zj@{1(BxiZ#u zx_lEJ3z?)#GDdP=J}Xuxcz+Uy-VE1e=dC{dN@&vC$$!lK=9JIn%^mVp|J3eWmw3{d z{y)4Zbl2UVSA*YJKRiD_d*}c6KRJ8s>vqm53rWd<9?=uu~pdil^XjBoM@AI@lrxyF;uT&dJn;JGz3Z?zP|ooOfkRnAK;XI`~6 zy*kwPOlMTXnH_iK)cXEQ2zL1VyZLUqjNRi!vTqIQpC#6%M6R3vapucv=BxiLzxO9j znECT}vBsWP^Y7R{d-M7HbDfIgS4&SHdSCnMa?t7Zf1Yxh>&0e?{eJuA-yYtk=Uf8T zwflbyy3exhnf~>Mjm>-+#RpGp?u$B{`6f#zDLe>uosKIzyLI9?(#_P{z_=dT>Tr_13>U-yT~tzbbxqUrVULe$};$n|XYe z_ef5*Ru^jUE3HkN^Uh-aTK>gfDwB>duefuYIOW1$!*6C(w zkQZz?6LYuT?&JIGF1vh6grN}c{^)gv8nKNIGW9pCBt&iLQQMp)?PFJK2ZOo=kxv5HJ|3YGcBu1 zd3ES8-_f8T4j(I)4hDgRYz((9s?G}7{GR~|2yZB&|6hqPflEW42@8*a8`TFv5(DkY7 zYnILw*!dyr`>E!-4F?aGJ*zh?uG)0kly`Ue%^jB8-tU{S|3Znq@P3PH=b074`GV8r zN~A-785@5O>gKafxUr`B>)X4zeJlQbFW0_Rb3PF{#TD-!?d|J(BeKfd>)PYb zM}+?;y_+xm?*r54@OSbqD(cEiE?*MyIPCql0p=$U6E{o^UIo?&>_p#Ijym-@-~48EL+k$f9Zk{LD-KchRdq*4-?Br)-_}@16ehf02#GdGqf7uUWSDZ{GVHYevJ_ zKf_=C@ts)MZ~55%$eY)}cP^XV7q4IQ{9ocf3zxRvO!>RqV}%-De72rzd3xH0>*paJ*X`B%-`2uiwqk}W-h4d4@bA!boBQDz=g-JDdnCrR|4eRc;aup=)!5m? zurMd^Z;P{V(<@>q*Vrz^N}cmND)=biL7TcDd4l8&39?F>h9X&-L3rO z2I~h8-6z%lJ#jeK=C$(lb354H?_KkQorCTDl-*7#3*M>A3P~13-h4W-sbG_m;QBeQ z+2z|8bpEWapF5dlW4f)~yWj8Y>vsu#e*g6Rr6;k{^H1j)m;8Aczw`gY+GC&Ye}B01 zVg{lcW20#BgyX=%|8MuJuKM!W{{QDA6Q>;tnDg`N`R`c;5-Z+wotVh5>b4~N<-#us z`*xZ!sCBj^8tH90&fzlu{rh#g5fjoH3a|Ic#=O7g-1B+D>t(jab?=%xcg|nI{*3=| z`u_T*kFGxVOOf>BW%!l*Pp@@#+^0!bwmiQe_WPvl`&s)_*Z(@P_}QuJkzco8zWPiq z`EB%{+y+=5o)o{uPjVMB4t%=lT=(m}ZtwF8KC8ZvD6W z**pJnJ!kpxuAzxpD66a}Dfe~RXPIZ($^Uee-530+TVAom^NhXnl5RN{hBUh%Z|Thc z%3I&XeO=Aru-;B`tv9T|<4_W)cyuAX>dWN$J`)>a=DzGnXR|Dt5uM;gx!&oA&&&QO zy}vtSSH*$rRa>ooO^?qy^S}Cib$r>!Bd)>k_Ae}VU=)AW`S;w9Y#&0vhCanDDPKGbafA_tr)-ejGKXKkuK}q1x z_N0GtMFArJuI<;{x0~hJ{;aF3Hd(*fV0-?`LyMW*jcF`DN*fmH$M3U|TpPJr&GXi5 zcfR$i|Lj`gw?DL$Z@pM0{XnB(jV7$t<7jkaX^UaL@M4(;UuK}N!#im<&d>ckQqS%m z>EPb6`fSX7wr? zV6594!E{ExcF7F;f2!^64O!^d>!c)IdVBTxT}A_~^tKea&(SP<_x8s!?h}|%7$<&a zR@;xOo0r(Sv3&5ZzEXHuWv0H-_D$a&G*lKD*G<@YSTEtv%$N6{`p8@Vf5mo~|E%j# zWrpiN>grehv#&ZTIz!F#+Ebvd)o7u9#@49vOU8XK_VVeW=XY*i zCv)%s|Lb%aD^vcE-__Nr-L6Rze3Q>#vi?-}Ke=y{SU-c$*E|3B)&DvE#!1|1!F9m} zY(1sx;`YuuEjZE8=-B$_9X@7Eexb|;Obbpeh0a?uDi##5>8Kkl83{? z-z)q-PyUn_m6P9Y{W{%z>B7ICpQ%YIGfp&oI;VEt1&i#X-?s)!JDgVM6wr92f)|eapm)ObmxHz|GefF&D1#d(@_j`DXGdV3d&GF>F z`K~wN?-0pW&JA=@`kmq)mOHN|GMp=^`*S8;{c@!J-^fWWOsl?Eo7(J5Og~lqE^hvt z6TRxG58P#c*N9o$>TQ<)eXdv`X~Wus9~g??Z@KGVQ=D)4>A~xhubZ=e+Z9UG_XSua z-}(FAJ|iMLZGmD^fa~|)$@~9X^>@frAGt$|8eu5nM=OCNG^N% z`^M_-H?dp>wQr0br^mfNp!ePQz}tjthC&W5?R9OYo=Ti@nkOu)OIAHke3V#wGoDkq z|Fikp%d%I@e!XLm`DNp4`F~R7tfGJK(tiq;Wj`6{^PL`T~kLA;q9bTPEUu*w6($oHOHd9yf8=uM<#y*nI_CH_u^_^6?+uG&x zcc^T2|2-!=HKb3%q>epl-Tb^^Hr*$an1gnJU$|AXKSi!{{Q(R-0$z}JCTuR@e%z?zl&QG zu1lHR@%s{F5P#gV?%CH9jGIF)h)0&%U;USD`<(xC{ptI4n-g_Y)r;0v-F-bNwvT0k z_xC$hhWGtM&YX*wZvMo>(X+aA;oe+BH@1W?7xVMV>m!d}kSxjL|9t3+VZTxT;>9WR zWL|OzN=ek;RaP}rYPhZTGW4Hv`L_DYJz3zx6J@>g5pi=t4^v$`6Cwqfy-={x( z-{@q$`1av{RZ5)a)|`zF49ITao815Qi}FV2<=+y133WRJ+&%AEYx(^ApM7@IqE9{- zztJ1Jy?*`9Z^Hl9eX9L;CfxqH`OX|~AxQP(EE*H*VI=#>2Z z#?tA*_o*|tet&+KEiN{G+4fRne~GCERks$)Upu^K=lt`*c^P{i)K%{La!on!-Sc+w z_&Gk`-hF+3oWT^b*?;Vl1h5< z=IR9tKYMabY_PBV*uC~^^?h$6H>Out*nZsD^Z)L9W#i=c=XVxeR~9}m$Rr=X%6Q*x zqjTN=C;dLzbKl;5=12CJ6|M@Kgl5`T7|#Vy4kc^>-6OF@@Olj>cY@lDRSb>uIvE;R zce7aNKWIO9BL;zi}mPJn^Ms>VZ?+5{_QFr_6HM!_n5>P2;r6qvK`#IzlIfCNfDM=u~@| z7_)xg_1NY2->&+;t1d6JcC+RCe{-wfmB0FWr#LTkFaN)%^Sf7_pZ@+@{ln>XJ2mWM z_ARax+&SMeng7=|p@|lsb&c6Wj(kl0yD9$Wysi&{%};vfcg$Zd{coSm>-&1=e^u`L zzoKT}|A$LYw|41IlN9=LcVF%9A090`w{Le3Ub-)6=OPES2mYtF*{?p$G3B+|3?|mlIfQ7OrH~S}Lv(3Lwo%qN3R3XDtmm~h4U3V^a*JR}MSfI_6 z#;{9ibsVRM1IQc4ST>zya7kO)bKv`_<;;Djc3*$Lzka>Mul%RBOm|BEt+tQZvwObB zgcH*$>+;LD|2PrMDiirx!tT3}f!y96|5L_-^fr%-!>8slKSxzXzw|*JT(zTK`~!0wZTnLxW_4poOQfssba(?YY7d zzHAD5b9xT+N}G2nynTK;e*14f$zAm!^AtbZe7k7BFMfqW&@vX68xV(t^B+3JNMKh`_I@+ zdEITjLt>{`^mF@xG7( z@{!Pl29|582Df+|VqVlwEkA7k^^Ebo@WjSJxcA@1B~n zBRGvKLrwU@dw<kceeyYV ze||g9p|$FDd4@`YAJwl!>N0YABy3?h!_afBR7wvV3qm*M97r)@IL%>w@X^)vwYjOM zt?&PE3q1eh{W0T5MOVsZO74i?*O@fS8QHY zfiks+0~0TYj~erZgtd_+ikH+s9bXZ#tS+nQuE!p|4um9{>%pPuhZnVZI>u;@%@gJi>;JqvZg+7%k-arD?RUl3MbKCyu%O2NV9 zPSdKul?iv#nB1OjJ1L#bmhefhtP!eqGs_u+S;wdd{8rl;2v z-w3LI^FJ!Dzi-En-nM4u`qK$N@6LL_Zp;umpvPfR&^|J-@a~QocrR(b2<;E zF&GuLq=5^+29{qc32Y0LZy7$?SM@c^-FR)7^z-<;r*CZ(u6TDd-F*he;FqU>0kZ+8`7RDyT?`YA z1=D*r6dP{Sdvvt!+T`xLuWuc+3VQrtLihX)?I-@fj*q{ydBf)9oEe`UPI>k9)090g zqoB^<<($Eo!Eq{2=)_EhiJ$N8E-yAK?*5*bkfJxy;9HK?Yo-5>A0K7@wnzTStE+o` zm%l2RGqHYo#pd8VHU;bH851BGXhAho8iQ5R89({2yLa!dS#v_#eARi*VspLo4=>HE zI#qh<=jw9f?`QX)vya^xzq4qm_Eqsqw@r)##XaLsbTG0B|ExY{$569;jcNkh0< z{M=Au(=GGYtL_hbx9qslzW;9j1OlIV9N=;2i@T@>2{eb}EN2+D@XVN7AG|ePd7i6_ z$k!u9UiFvjddllO6!eeD>z>kLeCKOnXQwB1ujX@_V&|OmaqU+>?wr11{#S{g&)*ro z{XL~Yl3_hF#JmGMoHH0tTzNUil0S9c=kW8(+CLq>^6aVQ=Vkt^J+*(=l)rg>;a{eZ z0keVc{#{y7Jv%|Ut^2qeXHWM5`MMw1MVtS>a^D}Xng93Nqu!FMr~Y~05x(&M%sCB4 zPKN_L3@THg`AJgHfZ0GfefO1@LLC$9i}Je3u_Kl9Okaa!!_A#{SiM2@cmqp~;DqatEaH(cjpYo( znM-f=qQE84Grt4X4A1IVcl-+!w)i}!KISa{=Zbgsvr;3Oge2xQNH#pIUBC);**(r3 zj4xz&3VT5eZBu{1mQW#|(Fjc)f;7x2l6B5b>RK z;26sZmYg*Q8ighth~b#QIHP-c>~e^$4?xAw@`NoP3#+R?R=?(#k9)(LQ&Z+xW^P7eihrZk44&mG^OWkQt#D6yV!`QY-P{M{YRv>SKt#%3?uyLYcw z{g*JUaFG|!|8(;>-2W54;|Mq%L<$)&Pgojl;svquf-cC;kE%lMf8XBT{_}>%v5&oM zb6<%Zx31s+$A9Oceo#nnQb}M_@ZO#=1>(a6(V$Ryy1I;WjmiOADU)N%1y_WFqToeW zgJi?H6RW}@W=}9=G-i;rcE7yLUBT_&@#9y``Q+r~{qrxb^I#G>F{weaLFewGK#&D0 z3XOT3GZvt{7;XHEU|EsI3Ti2Gqzo(m$bG}SbO0AKN<&mvEZ`+Nf?o4S6RV{BrpxQtY zmhqx9MtSqPvKzT;&BK2eZREDT_2}-0qHVKTsuTmtV~hWOPx4`#{G{j`KbJAXgaDB5 zCN!|5xg>0pWT;cs+seH5_Re!JqzYHc3UyqMd{wn)1!v*B(yvdm#9yDdyYJ3hnJ)S3 zso|dw$L^ffAlYy=X3bPcYWJCS;EfT3%fE}Ot*yKF24uNc{rvRQLZ$oD#fyRJWj24m zTweR)>{YwBQRnyW{FEfR^Y--JbDcl#E`J}_sFudC?3>$}JLmrGlsn7d-~?(PJ1_~& z5NwRQXLd#P{NKOQQ>U*y9v^!9?%lOM=lz5uGi^e5l)SvO^3uuU3(HQai|N>vrn=8b zzwG0%?px;ds+n_RDhua6%Zq{f2Q`Ts>Jmw!6B0;kV1 zG{ht9x_FOSK>7cR%{!WV(*JBZ?&ENKqWx!=-;egl*M14S_;hCayw2EeqqinTcJCgn zTpmBi-tEhm`nOxJO9Y+Rey?hE&^qlWS@X+uZLVLLzw^_hU#CHVb!O`QsoLROB`#n7 z#CFy1e=vLZ8QV|o^CcNPG(g$J!-2_I$zT`Hfn^ixzi3+fyt>&K^zXxA{+|&OYu)e6 zes@FLZN0{kugCSaY`!7-mrk_*D>1!W z#`_7sK5D$0NH**`@&Ct;PX-6BZOy)}m6zf!S>9*(DSf$5{S*Pt;J&IA{wH_++hXiL zXMWk2kn_OKONsD(HOjcU61v(kRyM; z-Od+ZHB(&j_-uB?{>dmv}%I>{y#;E7rXaP^~)ByaCn06 z+so@%4=($6W~%sg$GmTQzu&8F&HPw({;c1=_0G4CexJ2GAjsdc@Vk9of6Ybb-wz)q zew_Gg;k^Iy*-!Z0Q36Eab~VGVu0Oj!nOX;bx$e4U%jV!Tn@O^^zg8@lQMJza6}!J~ z?~6~rUat?|C8P-|XyPiLPF-Yn%Q0L@`P3P2%TwFlDqrgSoDr_FN#pscY@O?ouc{ex z*IRqc(Kqk?b1~})f9KgHk_~5fSVBu8gDj?-cbN@Bp2)wS)@%Len)0nr3t5#C*D0O5 zqq#nt{qdqWCA({m#~S~oFg>zmIB)k`Czi{z#Vu9uTcY^uICG|C+n(h$fqAz=Yqb*Z zzUHatd3*l(yy|s3R5rA~7rf5?)%o_x?^9p*z25Quz2;{n{yfGU7OLnx|-;FhC`(9;> zoHHp8ZHztf#K!d7!M$PrMNLken}F*jSIrR}@_W*+BL`C9tzNaZ5g7mjX!SN^&ZnIsdRF8?dI>{4IPui&pY z+^etLzoK_+dCDodU&p^?i2vQNUU&Be>F54epJ#>JL?8dBar@Dw=Gc{N7?@^s4`H&mYC9+fA4!Y_H$q2XWs8&c=iD zm`><^x<4iF&d*KB&-7x-PTADYzqK*n%KmXsSwO$+jiVOtd^-e_-W;zumaDa~{o{v4 zGS7W)PJeZO+T0iJ@@2{!yE)9hEtk38Y{+^q@ zCtUfK`1BUU&?C#8uQEiFx@}fJpWS2#C;FfH!1&al5BVry9Cye`o>u@k5NMF z)B4+u=B|?EcRu=T^gDl{%%DDo-MZ?{a`~qc8w29iAKUm=9{o8}-Q0R3_srR~1y|O+ z$`^RBewopymd3>G)4+yCp|ys#e2P=inQtjR9&XBm1KYxF##r%o&Dn{!z zNj4Pz^v;IH?OK5hTjmMgPtM0a4d}9te>L&VmzU*#e|=rlDQobzW5;%>e^TMk%Mv1- zjxA?=A$EQB+~@ag`OKAE=CPgVRsNQFJ?-C-^SPe?<}FyS_h{MNj@chQ)>(fE^tU`! zA$#RtthVTp{l$0w_W#>m{$5P}V*e7`Tcs5h9>I#`WwU-RH(Jqp=-@nx z{c6m7LCE7OwDEP!Wx>|ia{&|U_h^^jl{GroWgVfEUbgAYnV0ga>F=(5Pi43M+J5}% z6qg#gIi(x)uI(7K3e{7k0d`UAy z>&W=GyIw-MVTT3nufMWfTv5teHDPtN?W)|2@S;C$yt8kysxMP5cAB}LdrJ26g~^(W z>;A<}kW_x;|I+trd*&q9y0Zn@t7kp&ecAif?VsnC$yo->2Abu&B%n=ZV=EuwDP5iR_jNiPXoaOu0`mp>8`h4Wq^ZE7bBo3{gX}B-<2r?P!iS7jE3QV!6@Fl}@YTx7c5OKV?<1y^-AS3;gSg+3mAZ zYTmTVy$b%Dv3_#T{VV5I#Q%=doN(o*2_!wfXxgPn(-MWnD?fEISSCaFu-#>4D zzh<(gw$VP}`{sW_Kb%>Xz?NXPu52MR5`~#g@;F?d_`j3$ZCz4&?=^{?$I6>8pOaL2 z+^KTma=BVl<>H<)UeUrtaY=5a{~7Xsi?#><{%|F$bN)$&2kHCtC(6Igc>Vi#^WHQ4 zYr1#5oIYud`Bgt#8zuHzzc)2kK8mz2llbYJH18760h_q{kf^Q zd9&K2Bl=f@`;7YXf4zx<`qWW>MvJvm!Vzv$KP-<=>@=Jx+}ap3AT z%`0Ih;|uFg&vUxw8m4#uP;_IsvRtJqLw%B3QN+Jr*Zek5mp|6A`<&dftcws4lq~&%^|t8)&o?`r&hbV!doi*{+Yhp)U)scFg;@@?Q#5 zhI*5#lFFlHd;R49PI$4fr%s9enffBPAb

    ;2B2x7orkTUa6iRLOW9m2#RRqoEv@sRo%YR&8}_g( zth4wx?+d8O9(%*_*xbicwZpak2DMt)z4GkMj_Uun>~FIDo0nR`2WwpZP3iojdA#(A zSfSv}Cwb{TKE;n`?5@?cFP`gm^Xqr@y8II&1+s4QZV12inR?OL`q#+|M}H>UA1lv2 ze(iA4GoydDJGTBhbN_@qzox&i0dv8uw)x-`;=p9ASfIvyq4bIT&P~B?^R}!nUvjvj z?9QCfV{@(FbEL~13v`=z#eDPQCI6kAbry?DDtAcyysR(nxnyFmBd2rG_Tr>(OV@p# z{3~ytJ?H!L%dFB&lAioO#H}x){(gp|4f@mhgNzZxf&v+g2Kc?`_{8RgtJxe7UDu3U<3LXkN;KO<49`gY|qjw7F zr%tDW#7?v^r2o@wesn)q`M=1@%4@S3XDq)TyA@m*otfj1%f?`5|NG|ouKqh~z4wB~ z)f-rTsS2F`Gjnc_Zt6S6j{5D%GylbU-+z1G^x@Ypvl%1$r|$*3#er$E!UYTF1Cc`3 zr>x80i7=Fvm#Z@#a`kXv5<1a)U~l#JuvsDE2alJX`?oUxpR~I6^7!4CPSoe7?By|F zzQCQP4jmwV;<})at>J|IEPpkHYti8TLSwg}!sjlrb3f#(-)vmeW%SnLU!3sA;QQN6 zKE0p)qw4ca3|9z*pFTHfZd%TE(5Q|B(`-S7PyO}rKX=dW`jeS{Cm{X5+rQaA_r4EI zWB8@^t_E8E@o?nKVLVV)HfIW?*||ZEQK`;tsZ!0Y;7KR!uih)&JF)(H%k8WAYzt!N zWle_kWO|wov>G!kj#%mjN;@YeFiiZvOtAj$q+h2lNd3HCsdT=~n4$8Q>uPAOnk!_$ zd_gmADkv&EgkNZV@;`qguX|$sZkylN(%2T{KRTxlX$+nK&2jO}S-=T$+%cB}C+dCf zdEL%pQ#gA}44N)dKocHovSVkks3Bc8YUiK{NK>Zz|b)1KVw5f3j<@r|49eHET)G42f7;={~u`h z&vXDJ1rq3D;Ar@N;C}5~49));0-6|F;HEb*H2!A@Xkln+VE=yrqPG#Gw;_Pxe=9@Ff3^b$ zz&aZkKxQ@lX8<{op%da-ZkPiY{_hNEVCZUKWjMgV0JWH*A)uFm`9K2$L+k$*hRz0% zhZ`6e0-FA}Fm(NIXlP_;3ScGA12O?EDkqprK(219g&19|J?vf7ArS(ASjB(ARi}ap!;J zbi>q_?a{!%;gP*FAYkXth5(f0)0fTA@Smg4BVgywfCf}Kj=pSA-1T`dH0)#y2tZ9j zOdyQ`Onn{4gbcf+TYGUfkZeU>YxU;h%fNAHQ z0F)#Jvfw{cpGQFBf5wIYXsY6axe1)O8v?o-*g(k&q&9%D&jXaI8v?o**g#1OK zS~g*%F;qE*231fRV_*QMF(f(mzHA0n28KS5Mg~w41DA-9lBR)yu`j!kfw9k{6Cw&O zYCr<;1O_*U`~;>7N?;ADO#e|*7}!MtstgSOK`9JeaDm(cR?7fVJDS26GLsDr7#Q9K zbq4sk^KwaXF)%RjdV077F)*+&fG`Ie0|P_7tadX41LMR@XXgM_gqWrYXoKyw| zjfu4rPJ1&2iX5{)en?1pg_v#>Ps&=8GiJKM%z`{ecs50uoLix6@z}sP$no?7U+#sj z{l4p6XJ6Y|deMxdOR1ymFY{hA#mhVU7K&CrD5$IXKBxHoUxqyI3tN)h83ICr{oM}# zsi|r#w>{jO_hqAqi!-;XP+>sL_4ywQ+1Xc{*KK?KzVh~qiJRIuEGiyp2441kl=|qQ zXmIi#N1Fwg7k89PKF_sFp0jah)O$}=$*qN60MNa7*?P}QRjlg=GZE4!L< zc;cjO%fvrzI@x|=p^kj;QA2ro9+u;b&%Wo&&yIR2Fr$Wj&eUboZZhhbH6CnV_RN-{ z>g4Lr-o6)FcRgA1q{#BY(kyz=Q) zvX?(72ZZLnm)c!W#J}WP;}6jd+xdH*y*#(H-saV+>MI`>=K3E#uCF??e0xREJaGmF z28+}P&op0O1}z2#1`YP z+^yd5y*V~+bzxU6*@1M)&TYe6<_y1n~&%NQm6_$H{o|*Hv z`QCf~z1=ih*`eV83v1gyi&+n9eOwzD7@1hM=^1qFpO?4mrP_Xl{JHs0=4mVU8-Qgv z1QZ;gj2YI9{0z_DozR&9(t?oa(R;vn;6<7nLM2E`<4)lT@rLE@X$Lp!C_Jy9=70Pa zhtBo`3X^rF&p!N)Q$WEX!H?w%%ZxXUKUof>*q(KR+5*zc$i$Ksbbz^Grj1y)63lvt z#AMMA3<;a&r75Ed8*46LJK!VN?RvJ`LHoJ=_lxhVPcQA9!O-|tFn~Fsdd}TekegRI zyna7lI)Bebo)Z@J^x{0w4`ByyWjZQ>FCz>u(`KMX~&!Uh4R zEC!t;hPRGvVL5j8XZ=y_IK#C|XHJLfJ#dDzXV&NW(kG-Cw6*`fF*?C5SkC71JE+}` zal@74`Ja)kR@k7!B*&n0+Vi$Likoz{Hn1~z*Zwi{M+650BhzW61#Aa4&Dm0$=jm|n z|Fjt;@aT#VYCM=waq92CzrT-9Ix**eUHu!8e=#3!2={G0C@K9$n8CPAVVX0FVJyoO zA21#;2|4SDDxBtXfVn}^THv%IYNTHl2w+Z-TJ>y>G^6GJ;^Gi7FPOd!yiB*}ex4sK zwV%b|+>K!22c9Z+j2~2Z>Qzup=+=6`cwo`IHMN3})CCQRMs>~#2CT{#uz{85YAHOg z4;B-LCy!|%3CoNBg@^s}*4l4;`x|G&+`{s3v}jt(B*&1Wy?r*CU2_FLFeIekxjPje zUtmVg>INx>+o#^9-PTojUcdY3-F~nzDBnzDee&o0r- z`9@YynuBR-U}${FUBQ4=`2w~BAmu(m4(I->n4X0c2^<0n2Je}Q{yqQ8qQ1LsKEsSP z%WonjQ3Z#F13p|83fbI)^eTrd4JWE zI=K941%>DJl72tme19R#ke;8e0yPO5oin6C1<$h;I#Uq70jZd?w}BnIa#Mz9&sOMs zIn7k`Z!aIh)i#O>&;N6B*JpA6U~#zZ!H*h22H% z_BKc{6xX+O?`5?7-(9<}%pK}l1%p`)bN*l4^JN{A9bh zmItufFszVMLKWOF0hF_!Y&`dV*^@u#-`|Y11bG`2tp}d4KKbK+uViNW7tV%MyV`1X zV06qKei`);|x6DTMU5@v$zes+0#If^wAQjDey)1IwJFJ4^qFa2}Onl6}66Vh3p z{CVH=d()k(>I~DKE_pi{CIj~Cw5S8j4NL9nW}{l33bH)X@0J~^-a;*3~E%m16J&AN9O&1Z->61-I%#d!(>OmYk?9TQNj=FnNxz|PQJvFe)( z*eM|Iff-H?ybTP3eqj#h{v%f^2KPZp`S+h^wO{QR4c@C~`~}AbSPMvR0yijgGJ1-m zT5a$ilq7z0M%lvx9^#4{O$|~E(GHhVUo#c`+n%=+UREA>#C_st{2$|a%VmGD9I%-? zZL1JU?rhvF@`2%j&O;uw`s=gG14iu11DHX|f9HdevJfa!$}_E%x$^TyYp9TdL&87S zZ}0EhUsKE5^YPfi$KheWoNt@zZEx^r(E0xJwk?XIbvi*Mc+rJzsHN*^-3N>ZistXX zD~#;W1CuybFm6y`w_TZg>gW6^ODaKu1P-lfjt=Mk8_oIj=gmcRhG);$tU=F|po${h zH(de6a)BB0pgfFKxfDaX?{*nx_p?9mzt}HhP=;_{0vD6{y^6;dA|W0Vl2Cgf%y775 z3t9=v3QBN}e3#7Njs!Cf7%=iPw7twg3uE&@J<-xd4rc{}LG<%PQ@DL#MuHZox^2C>1k8gQlduhB%G%Exq)^j~fhZ$C!?HtJ zL1@C!ppx!dWdtuIY+)Xo(bd4t5S(bLi6*Se$j^}W+GY(XeIZ%w<9dL(VdaKdsFBZc zW?BO~!{$=CFyzo>WMWySRB$dN4ax9EO->%R=7q-JfB#+h*81*^sQ-TJ^OwKhzbWXy z^wVFzenoiC`g;9v#BAdk2RfL(-Zg!ca2GX{7#e>Hd|*hhJ9knGRpLMdsO^3<-2lxa z{EVgy&mPZNGYOVb61tgYChN1;bQc(3%Dpn@{~E~&&+V0OZ{lGx2IU;%LLMj&n+BQwnj)P=EN>xSeocqm;K4PZ{#wJ%NGVA_F$&Fsge@#fzP|a1>(2Y) zywVvPEyX`@Hdxv_oJOgK8JVI%sZ`tR7g}nx1oa}$@n86a7C>PvR~T+|O|oOz=BZFD zw*BQcXbB|drBM9l@84Yk$8X>9dG_adLr#2r{CT}3CT{Hq!VKKiTg=e1)I5O?3=cTD z>*0L?NC0qyg6WXl+FrCGMxEsfL&c#(^Eq;MJ7}waJSLrg=bPzHMQ}XLC~Y*~|MRS} zu3szc0UQA2T~2Pwsg)%m126acYe786uWl-iF%r zj)-F9XPEZwMeZC}9D^fjnkT48vdXPS$;FLJLD7@hfA3g&pu@TUI`g_rLGC@UhVzHq z_ekrBC)cH4viv_ecJ57%GoXt0%=e#>s1>cijY$pc4ADuKI#H|xDQ9Q+Tw520+J$1- zrm}$T0I2I^Aln#N{4alRsnu%(NRM!adZT~cZ=1E(qN17B&iQ{kZ}(cCiGSDc{dVh8 z-DO|%sSyqh2ZWjI7(cYM+Jjt)u&}WeR9hwXUpod*k6^|DVJ0~So5Y9y@Z<<)BqV~0 z^c#z}Zgdrx@OeMS@(g~ExIt#)^M4PQq?_C?<4WPHzh_!{OE+IK)xGu))ARQyF9mtSnJ*cyNYEj$zJCH*Rp`LXrgwhd_h`qbY;f zGmYF9gb8mrduD&WzlyWq?bhqleD9ZB_EpVe)z<#HzjNLC_1oJr)D5;XeZ6Y8{q}|e z)RN30VMYTxNv#A^v`Qo)n$_re{Vnt9pY3xKKcAn};LmX8Qf362qi29(Ik?GG7u7E_ zR6!-j)44PmGYQ3K;-ky!(-v}d6;(l`=7t!Ab*)T2Gfw$qQP5Ev$c<2{|F)e=f z<9^xgT<7FW-SbgyR0WkEs`ZRF>`=U-)84?&aJujuQiBYXZ@fX>%Srng za^{2VfqQV8Gsr@V^xcSt1$gx1U)Z_&)wbpr-#-^MWMoPQRj9@%cc2xOVjc&W8(6J; zqS5NvbfFIn4}6T)p|njI8d-$`m=hZLE{DNw=jhSCkgswzy|4b+oAjCo2O1Z8pZd4< zXa4@$A2rVT%O)O}#QlTi05(@2U~YJd;%bKm22hAFB%F+A*oK-_Pb)59J5V%db1b4F zpV4t(h2`(c%VB->+5e_at@G1Vb4ciBvSZxfs&NLlKD9HNj??cNkGZ){VwQuU?`@7<^>)x_(`1l=AXHZMe zR6{dhGpI^`b1^~!ZUC4uV@?A*!{p5-!eAae6V8ZaG-XKpmZ8%Fi`N86R-^Pf0|}9~ zuRQIqcOdxX8Ya}aRCK`wg!KO zp2lLua`b>km?SFN5D^ISe`6(RlrYZklodS3O>;`f&0YJZxU_WZ zk=L(ZtDgIIX@_9Sx&JHPu9af6j6YWSe~y0fzs<)SuW_9Cd6b1CC-#6k!?rv`PY~j@ z8POnje0!mTTJ?aGGdHY_eu?PofU*|LvoHtVhMl&%&WiuLpu3&NEdS=8SF+8w{#O3| z_e}Qxr&rVKel2g`mj2lLk<&f>S=Nc!w(tK>%YWHZ*mz(IOWfBx)~BzC#}`(1rt9u_ zf8*n(CDHbkrJbyxAT^lHH1qSlQ$OX+)9s2s8K>8WES0%G%l`ZBO-6sdUktpy*q)Ke zpW_G10b#L!XkBWtumj8ut+r9pXdNkkjtT~>6;A+j!m++@{`Wskn>9uLb@tOE?%&fa zUjB?S&$*j_MT$}X=VN=l?Por&{k>8#;Kwt&8D)L{juxv;G3DC#zsp^HSMzO@NCzNvTpIYpxrD6ZiygdIkwR$m2=+5m842>UI zUinY|_{?Y)B=kXX3r-g^0zrlHmjs<|R0$tYpUN|97Mk#x6%A4h)-?wFcZ*J6nDbvY z?%uZhp!^mUkX>_)Lt<;2L*M^L+v~EkJ#QTskT6|df3N7v@dYzG7vA5$|C$Im=+~`r zobYyg-KSTV;=u**f8T`K+FA|QXIHit{fmCupTfYA&u3BVaCnH8x7EMwQdWpf};l&!Rtm$94aQRj=D0>g>?lpry8ae^rWKjdr@-?bkWh@>{P> ze|x|FXoe|E-RB4I=H6c-3L1B0X9){?RloVP%&#?^6TJ6)yOsSps5AO;^!L+0i}%Ug ze?R>;H;2Ftx5i(WQ>63Xgn^w8PS)UZ@W3}vzqa<;JGA6g1{&R!U0j}w>c0)OOj!&* zH-0UQ&eOE~|JZN7 zFDGrP!>Z@^BE#;Sx~VsJxj+ivj}_Z9dh@sTSM85{eg9Vc>e}V!?ce|Z8*UTT zQT#WHMMRE~k?FR^g?yEx>(}^v-+%IM$z|W$J8s|HANtyc?Xun~gWoP;I}R{i{+qe^ zK*2UNFFXUai7Tyivr*c_j7;g84;T+b9+JdR?!en%p=1 zVEMoDe^~W5c~iNq#~iM4{8${AZ}ITo&%Lk3{VV>Rxj65`mu0gz9oX@Fy5*nAae3$F zn=*Z>+h18w9w#KM;P7A#OO)la%jbUDuXdGoX*duBDwl#}Hv6KK+6OjqS1@dNv!3BM zO1GzRDX9Oa*>_V7UY3KBU&2k+Y5Uj?EPDE9d(j8=yYuoFocVeFckeCx=chkzmg|p7 zR>)?nxy_!Z8NEk&-}G;d;{QW3{0}^y{=cyJQ1QN{{r>lYIltMgK2|KZHBNu# zVf(jlpZ#|9ZOH7NJ^#QXt}XlA|9!iiAAjfU`Ge=8o*T1AZ*XBs*L@(&K+h{r0T&rT@dKt3Y-0*Db&NciUc{yng)}&Iy0r zdyS7*Uir9o&fCD}v#b7x@zrkguXNO&|F>r6;a|q{!XBk`gtIT>7r`ow~I`og;z!38Y5q`gte$j?xQ zO?kq@Y=$#Y=l(A#J{7%w!k+lm_1pTb?Visrxf2z?+BTbI%dhRXqJL-i)_?h1AGYkq z-?{e#A3cvPbnSfqWApYYKl1MtICmcBjk3J)_?-R6k89_A$&oK)Tr2Z0=lo0K=lieL zU-`K9=VsgI`NwqkhgDzWIPvf1y@-IE^_HrTs4!38fok z{g>H)_v4b<<8$-Bd&k9a$o>6mukkUfvudxn%b)kkc~@CZ$h^vY?sNQ;8^8Nm$@BjT zkDobsUgl>`|3l?=%lj+7pZ>U5FX76^wO>=K*QvkXK2O#tZ%%mr87aogb+z^X|GA&; zyTYO&!vysd8>q{`#&-}jLX4<88V+m$d1~8+pD1~u;Q$Y4K#I9NffKciPPoNX9M7C^ zWzPS*$NPM*niL=ST>b3xvzzv})n(KB{;l}jZ&i2Y-&!f=#p}v1{VlfNc`xVu@AUuf z_y4CaJ-x0rd}_s&2ixZV|7rBZSpS3;&i^brx%T7D{igA&_m=L@Isd!-ky(Mf{ zxYu6)z9gGv1!urtSBR4joC7uJ&&_WH)l7(3WN2IoYGjutnZr{ggki1!fbjrU~S@rdvaOsItDf4&oyt58{CV%ALFYTXaKQ8_K;^2aJ z`sy#@Ydm*Od9B?W&-d%<;;GK_AG5#Cei~$dF8|8cCHGIMR-gK__t?Maw>$TTovYs` zb-q`Mv0rxQ>NW4>=hi!R{y%y9UfiSN`yYM@t*?1o>2h`g1prZuEx&i;c znqH6ISOG~u@DP091L~oB9xFu^-{1h66~2&oiwiZoTTDK1<~oCf>GS_S(zchshMlWd zZ?`X+V9Z|ic9Zw%wPF6(Wd2^-;klviRm#p;mM?D3vwVNE{))_>qR(fWPTV}NH}mm4 z%YQfbOPUwGi~gNkS(?StQlDOPCFI2qvzns){k6Y5_KK`uzlQNc#gjkjzvW$iXUBbd zWc1(uN2k30$MyfZ>mwhf`8HgtR_^%v&FK06d P-`20atMM!ST*W>6;$zm9zb78P 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 diff --git a/src/mac/icons/branch/86Box.icns b/src/mac/icons/branch/86Box.icns index a2631c66ed8764c3633af309be5422fd5bef64c0..f466bfe3f271a5c61c6ba8793c07f3bd0587ac8f 100644 GIT binary patch literal 309676 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 literal 194973 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 diff --git a/src/mac/icons/dev/86Box.icns b/src/mac/icons/dev/86Box.icns index 5ff137b55a47114bcd3988ab666df6e9d0d9ef3a..9663821d5b12f9d5daf3d8274a25a284bc334c41 100644 GIT binary patch literal 317326 zcmc~y&MRhMx!#wVY-q&5z@N|=;OEZECB?468B=?=dhi zFct^7J29*~C-ahlfx#s;!ZXd+mqCkxfq{d8u|1Q41*C+5fkBD^1eg~vGBATh7#SEA zFu`RV7BC~&Acby$P8%2)_zroxIEGX(zKyOf2>B}d@7u(?HfA?fp0p||?qOMI!@?4> z!7Fgas}QdX3%3N!%`9E>_Da^&OVd_fv)cN2h3xW63;(+3UM*V{%I<9)wuO!D;6fD@ zh4m6bCnnpRY_l=DdAII9Z@BZO^3Agw`ZLd+d7Ag`ukE>?=RTL0F&@j{X*6UxCLrPb z;J-NI?G-NjzuznTP*wb}B#o(2q~%TCjV8WzndaAcZ|45FeeC%jC$k$rBg&=M7l>?X zO?cd@aQtPl!I7PRzc++EO<&NT{i8Df`3<*{vTF}cs?R>8D}HwKhaQ(%mG^5`dicgN zx9^?Mb4FQs=AK7956@I?yD{B#x!az0mH(AoLQ4`hoM%uJ(Q?)JAa$#z{_ti0?K7Mg z?L2<$d9eC7Om-tR-B4ELY9Yz2Y7l3kCbVz!&`?(3VoVzu(*iJDdn zb^D%~dw5lGT-sswd(WiI&b;qJKC@QiiGs8HxC zAs=m&^riLk!vmh{Zrr$?y?5OjvvYgfnCCqeEn8s9u>H;?=gaerh2Aa~`g^wWXM{;2 z6Vu_$t~obT))`Kie4uLb*e!^#MT8*evns4CTqtKVyMN9-EIlP6CK zKkeAS-5&k&kFkF6lV^Wwbmm%JZMaj_>@U_S)*x`Or@K4Z$?MSX>Te77ZW8kFe!HIW z5aV5b2dPb)Kkt-g=U2`C_vrB^jt1pv51v14JFgSx^l+#0O>W$ESWPvj|$l7R`J>Aj9g;hj=a^E{^QIer?l76}YQC%U^Iem2W*@Ho`SYTGj z?}2~y?X{^J*%UH1*OedSoB!wH*|SbpA|`~ZI~Gixny9ulbrOS+$gT`=tIw^fz227P ze0=K`D%^4_UavM`>(;Fr8X6qd>W>ajIJ@cIMzKq73@vdcM+(i0?v(##nz5x^e^-p2 zg|P5M7vr}dsse*{h=qphw&)uR&wD2JWU5H=x9s%?qvP`#3@f-91(w{ry&{vd{>24F zlY$&~clVrI=HlC;W%mEPC&jR9o~8YzyM7Pl!)|3~wQb(Y`(#?`3hAGI>~D&nJ(B+Z zpCfd0I`i7K4&~+s&Fm+qnkWAGUf*!LZkOcddlkw$9Jhi$Y%h#Ua$@3I@iTIBnrl+3 z%lkz_Mwd>NZ%p5~bRXl2RZizSi?&?+Zacl#e9Qg?>*TKQ`7Iw(I*)l(_Kias;SNm4 zdYxr2Kk4STX<#pZ+q8YD>Kbbeu_eowD>pxO{q)y3{hUjZ`m^%IObVU1{x3Ywe&yQ2 zjY~vaIXyST?__zWCqJ!X@`Sw2$)8u(yT3drw}kCye-<7!pJFNH+kdYjT;4z9zA;E z>{(v(k|XEcSRIs(7HS0rUpVu6KhJy3S(VS-Gi=IO=HC44&2Dk*Si>@=V=9dW+{Q<= z;<(OFyV=07L()T=Gs4r8)63gCFv8-|HS|MLYb$l5DIW1eiyw z8Z_Uwzqa=9wstue@w1Y$JTn&E&OiRN{C?~EoEr@M-LntsDI9cuu6-(n>CVwFm4AK| z?)iPrI$~?q)Qv}u{z@-l2)O1nZG~Qz)e({MXHPssf}H1F3GvaM!6BY}xZ>Hzb)SSw z+AsYJnK75y;D_vT(>#r={fvY!s>nrmzH?Si#y3r zKivF`FG6iq|6(Qw#}9mB_TPS4h16BB{7ygb{_9a{#wSyy#oI5RV7Py0H-GfyJrVax z#9n{acVDgFG5^T!z=NyaUAVJz#-2jvOExD>W^p?PJos{v%f3d^2Xo(V7p`2Uyg053zxk!nDF$`%CoIc zkDvN@Cj9#0$p?OTy|pmyBiJfUZt(6 z_$vBl?y?6IJZvxu!`&WMxAdJHY=V#^w`?U=d)Nb zn_&jgMvO7y#9J7&Yo%J#~q1JzZOgky!|q3PHNbXo5%7Gnx}Hjn{O{)AGLRr z{iE=Zra<1}7l*sk&l|4Mm?R(+x3s`)wyxc>b9-$HSGgN3nJAPg*j;{&LE`?Us53_L zlQ+g+JZ`P_?D4Qq3XVU$GFao+siKl|3+w-VXP7XrO~Jo2MEX3RX+%J9 z^Wxk88hA^%IW>&lKl{YYI>$+1d+zNtna)&B`EXT?&ca2A{Zt}SWp_eXosr)KpobR1cS{)r}JfrE<^-{hG+jeIL8vXQkyvA^3 z$NXF2WnwN_DrLbFUY@zl74%fT_QL7xp`JQg<^Qm z&d%Q_d3$^Q@fa}&Gp0L}MGy6@w7&S&Vz=uOoiyRgM_AjsWG9Dk%zS?)UHow#uR{l; zHJiSGagu?<{m=uG++06B4ViYVO09R*D&d=zZ6DZ#E^Ob-A2)5U(#+kStG*rUPuF#v z^z3V;0mG&_5tSy_&EH>Rn4z4sLpwwD;+^a3VzZ~L{uKLjd(aG)>Hgl6jb8uce*Sps z^Z3ToFPm)7<+0d2eo$Im$dfU6?jWFKi+x*?m!7s-ZdY-~MZ} zyZG&XFnku%ao~=AsOi(rVl~%EM zfov_~qVJcN`#wuMz#g#e`rP>SvvXU?DAcY4W~+-oEy?m zcI{bG+_O~*W{tl7M;U78PMtnIJ)}@5rq;H!LS>K7-buRpU;lpbdn{`5`qitRz76*{ zMQnq+{~Wovxb4GS@5*@{YHS*Ptcf>$x0W?F>~B74uEfComQUo;p4ltchOq4|)ahL6 z%DJiFq0^D$$E9b*@2S|hu++8mCzy3oniHO z_DzTLQ+dxQs67n5qw(Qn>KDu2qf3i$!^<|`{iYUbDLk+TTVlRhMW8A?YCWCWi?&*ZM?#* zvnP~mU+Jt~k+pj6TE-ijm-Cs&{8xPY!>UNI>|f))I2jFFiEnpZYi9`XpLuvadr?N~ z^$5lbx64J|?~7h-e|VxP!zj5~Hgf)*Z?`ZoZ_mflGbKas?fm^DDi&s4DU%B?O z!pCEc%u{_X`Ab-zRNU{OQuq4xyrl0fx|!KsDU5$NcXjt0`llMtiO&?}UNika&pnTV zY4>!D;}5;xX6MFtC4@ux=V((%;^H;~J);7YZ0Md^$?A#C`ps-8J# z>Wadj)vqEfZTr&e|7UaQ@0WizVS$6Vt!DC$!lR;>H|E^T+Lj*v=|A6w*$+LQUOc}{ z>BNpj@%c}bQyX{vGIo~M-di-S>wnsTYTkB!`G<$@?r9T^<2l0AU>WCd;pBvKHw+km z?i7CTF-?HS?7wW@Kb4;Sy`7b@Yi(^dIy)X@?s2VKyyxrBSvN{oJ}ZBIb=wUbe2U zg)e}5wVtkiF6*2Unlh6O%o!Ne7hvgMH!v_TG=TfphwTzigSyJp=wCM=^{+uTFnIK_ zlru1>GeP^;b1Q3Pu1xzu!G}?AWn}#2!ZJLkxzE4V;R`Dn1+^8hK{= z%-HkC@O|pNbfLECt>0(5&tUkR=+Dt|R>DByeM9fZeMvVzDZQVRdivU>)4yw1hh8|b zY4N08R}a1X{WB!IwDjuQ=;wdV6`i;JzAbW-ispnR4wINXxrk*P*y+O+%nZ%wN~}XWpV@udaRU zf0xfMugiJdZZENI*|Y4w|2DkhS$%FpvD%9J8s{oy&0krlsuuNqept{kmz60oR=8we zyAxw}R@RnRuh?#HTzoHV?W*gd6JO8i7XCbugW<>9f4|uy%Dzbm=C1i!>wNb4>($rw zui5z@Id!RUS6}d!_J><8<}TlTedYP{uJXJ0@BV$Q?r}_X*Xe-r^S18_Q{=Cmd;a^= zPLHz}pIfwDbjnPB6h&CNRM&+~PU{x`LKVdLr6$k4E*rgE|99Bc9J^)v6hS-gG12SE;ou2M0+ zeTiF3^=}{M&(BeFjA<0mXQ;XO;`e*`U~tY_ z)#LVI3TspU?RmEUPs`Q+X~^rpux;(vEf04^Fe_X-Aa84M^b?od)-7K+J&$c~&+-SGEFB^Gw6s!&u|*l+H)==}6F z$(P}`r<_#J{Wxi9m50j%s~=k;7!(fuk^lQ4?6iJ`&s)#n{d=0vdfls&Vpa0neBQ`N zZ~MvT@|#q>?Jt?ivN^gl3T$+@|8dYnTdUHI_mrQ}f0JuRzqR=HIaVFJe`AN?>YStP zx2?FE`WP6V{m!|zMo8M~39GmF+xa2CH$E+0y>%hypMNHe39G)o__%3peEjPV3$J$n z|Ku6sQO(W3ar4JV`%P!gY<#tQ+xB@+YU4B;>ZeXLJi*5MM}C*7Qb*kDjD7p|N;S04 zx?A_#MO*v#+ADT}KT}@%a6L$0x~y;8!^7e?PffM{`hvsXX4}HOQVqZVT-*MA@3eW- zX7{|RTvDZ@cU)x2vSrbQADLJ2G3JQt-!2yR;J)o^-W#ys`L2|Bd$Bt?>9RBKe)*#P zw(s`2VBV6wHrb8em=scKfB#$iCZI0p*X@&gBJQ+_dHA2+uqm#1*6PnZ46Ji(#ph3* z_AJYyyll~~nw~xBFP?7weQGL4`=M(KzOhUGd6`it4fb!?5^^Ir-Xg50JJdG)q5K*Dt0(SlNIabLbXDlKil0TF-`>qG`>;TB z!R0!J4?ef%PqcJ%|51`Vtu8OOpDmy-?$-mpmAdoZEKKSCS-kY-I!WtmTwUGDXTBHI zFVc5?tNhd8|Koo9ZBLWxqz>=-!JyJmvSk75rAurpXYu6n#;y9y#IQvodfBHRRpnv~ zo338n={m{2`b@@YO^pi|EF@=a)ct72Xi&Z5%D&ToLVhwdD5bG}e)#$8mOXoPtm|Z$ z4lXydJ;2SN^j25*tWmvJU^;_>f7ZW$cC~M(tqj(+KQ~EUU*N!tHEVQ!dzjVV+>|PK zvS0G~Y;7i=eN&vivJ~Z9R`a)IT+i?!GB9x3hpUC(EDKh{QXzjbM;_v6Dg(`D+OCQO-@#?3IVvZ=KNgX`0eulKmND(Wlvvxt^4VG3#nBzFKXUeAHV-zT=n15-LI?fXBXd< z-E$#d@|5t0h&|a2UrHWL=VW#G+9_Q2VQzWOxs#L6ad^zW6WiZndHd;1cD@<$m)>Wm z{ovf1ZvXtt+_yVSE?>*Ny=LJ)J2k0SIk}y`&gLunF8>^1bN|Ac^EQ@Ja<{K6J8gV* zE7QBVbK971%(1Hp(Z1+qAU8WcJUo5t)~#hu3J1(zYazD`67myfX1$bn^)Yr`1-nC5)*asi z8G@gK4F3duW%?Ap&Sd|t=9x+_PVTYEzTkFV;et-A!My1i0R^e&XBd{19O1CGN@$RM zef|2wvTaoYw&pn-CY8Qk^JDXQ9q)6>QOeUC9F*sXeE$Caetu=quT|gPZk}x9pU$*e zPQJgXWDe*5^qP6)3`;D^j(u)EccW>A{3p?bAJ%7I)veG>IQq5JuVzmmq7dV%(h{=f~9V)!q5t?zVZ=mbpO}T6a_%EQq|xN zmp5!%=H%EPv+v({VgLW;rj+f;sdi%eac@|vjINqpso$GpAG@Dtt0m*oQqjt`whDHJ zV|siSR&tG?flsXv~`-&I(NDzz4F)Jdu3io#*d@( z{~QU6ubRpFWXjEni`4?JsN|e=&bcO_BdqW^=WC>8m~p{`w^g4!U+ec4yuDj~+krLx zjw-`Bhxwc5wec+fa%Zu7zZS>!<2$!4S@NX#Q_1^#vA!=)2%r1)W5%BsvJ8Tzk2zE8 zS1vv5aw5G+arT0Y_zC-J?|Oc|-o3E*Y|oYVc7_)}?qY42aK`cELgz5E#HO{^7y=)B zc*ybiwciZ>tJWr9Wi6-^t8smzjY#RoZa^Qb-w@JU#rgU{pcqB=U(;O z>nvH^p9=o{d|rR<%Zu`(oNq$h4Sqe$wfV-?FvDn`nOK*ne@D2ms_Vk!ts5|`dyBZxKBx$$u z?UV)uw$`P(B0c41^IuJ<+ji{L;%)Ue3aY=i^GEz#;6d=9&cK5{k8 z*nhg*b-~K3reZFy{5yUg&(akCCg$$1Y!Y^|woY4b$fz=FQdCruTEm~m z^8Zt~O%k?jcIfVwxh}=c)MxdmPx8ab8U`_U<`b5iA1QtQ`Xcq8l5X&ZytQj5nnf7b z?eU$m_~us8(laOjRkm`nI&4(=b&hRiw&7Xz+r3ZNzsqkpaLy}QgzpAZ>7A@pHZFd- zZC_p~oB5TMmA$W<)*0e?sCjSo%?qb&za7xlzrA2r!}s~ zseEB~WuMG}3+dKxOjrI~Yy0cg+3ROEGA=$IJu9U0Y~R~$1(%Cfzq)#u?V5MoYS9YE zQt!9^x9cw~%Un_V=3ebJ@3@MIe;CX&MP^@BXbaJ5eRFrAb57|`2X507ArF$Tm`4OS zyvkU(|GY#!f9kg<9^Qid7HS(VO22rex{yIaS@f;=M5j;R4kx+oNSgjuzgn$j^d$J*!I?5c^e#j8$gG5=n>F}!o>p#zh-PQ|-lz0AygvmWSyEX2&0^M~#XV9s6&skF4qvkC;mx_TBQVc< zS&_+;{Ur}4Suk{DPVYAKEB8H~SUTM)>BOa;lHCs$Nlpt5$@%u|wjg`&jo`Arryieb zLzx`T%S}^yq;%J=lz;XWXO0cx3<-6o4_P)G{Aw(^`22)t5y5eJho?+758-*;!QJsi z+;ew;1jC}`o17On?Em+5{o6gC&uyNazwhSHwX5q?_!w6B8s2*tVIc7Gk?51??{#}~ zPq6rw+}xu3=tAd4zZd?oyZ>g}ZA^Yyddj0XV*Tf$4<+*q8SAa)r|atp=m|F8(2z~E z`=0!rk%8ICVEzmS&eeNGR@_=p;Vk2%W@DD7y0CVNuZ!MMi}}CaeEIx0b?G(tb5XI| z&imy> z>b?B^&*$^jneoo;e5Et`-_EzKE{mBIk^FNOC+h*FmFKxC&pxf(nRYzu%1-}{POY`a z-&m&{SMT3&x9j$q{~0Syv-BcfP7ThPHfOt1>EoItn^0hhkHzf7_Z{DEWv{LO|8HC6=d{_z>3zO4jgCsny?dqH#L3FQeShzYh`;@!m-)SG z9|^Rn1imaf!?i?olRNLWxLZwD@h|*0_GIa{Ij)FkRPLPi)6}dWW^ZHF%KA8#W9F~+ z*#_-pWJ@YA3YC{y((cA=d{m?1Kt_@dx6iT1?H`x4KjaTN$umLX($(6A7A6L@KVfI~ zMlQU?STg;{T!Y$@L;G7=uez2r*(nu7_^hP1s|Evk>ufgjMts-_G{zxTL-SkZO&1e zD0hOF-WEZ62Z+{rjWe}X8MUQ09*6f=7ID-@cK!MKD)X{=?iS1ZJ(=g@ zO-~=<+S3yFe};fzM5DH`7f{J2lB}X34&@_qN=eEY|S$<(X%x z9gzwP?2;Jr_x)UUcE0_6Lw3`u`4>NVF7uyXcPvlgyJhankh1yzHncD;@Nn6|r76xh z_duVDddY_kvbXl$p6B;9yJP!}UEklVPJ9p(eLW&sxr=LUdEm^a-IX(1L!SO!dg@)> z@1@~6^W50_PpYJ7zt6w*%G6Bn#df=-Ums(yZp$cXt~JQoV#;Y_F{$s1ml1z_eRJ&B zE2V;$i>z|bRj9ez_AI_6<6$k;;Hh;zwtTMd9E-quwoQkBeR-GL{8VI;#4V}GC*_W% zuedtx#iRfRo-4PfPduWSeolY4T? ze(N&pzSo3;Nv@Zss%vD*tlL@s^c4S{mGvn<|2>l}yMJf*+MG*MI`|hJnJ7H_`fdAn zca!^9=F16P{M)5!ux&%iYq9F=vr^JatnR2>-e%M?#Z=;@*ntb%^W&ur5*nC!X831n zzPxkTcG=2PkL;>H6LDMDclwG+77QN$`=?Ewrq|y8Fkyzwm4XlIrN?!1e^ku= z%>Ui}&Hpyva~pD(O|sPU)ZLtGDthh8+6zH1`OM5_#Q%NgliBQ(IVscn`wd&;eQBwe z^)FX^`sR_;aZISFyZYAJ*W$N}#r-zka`MeNwthmTg(TN4Ya{8uBJCLh%#Q;v2zXet zK6|WV_xHN zH2wwIGSO>)d57n0WZZ6cYuCM_Vsp^YlYjZ_+nr~g2XeA92-|JB=J4d`%T1k{yq`XCPyLpATl-7w z{*9d#KRD;>M(4Qyern0=-p8zV*3pT**^{@6FTGrHHud2@y1?78*7g72L4E1zh{EadTi@AtUd`)YSjHh7f2YU!;> z;CTA*`s<^_B~ujR8x@^bRYc6Y#$>VSeBZkp=?fDkr;3+scKgc5=NVcbwezamnH?7| zZFp?aZ{@GFQXqv<@W%q~Ud8@N z*29^(fXQic!%>a6J>18}*LT~`vp>JhyqdM={__8k+>s|;C+CKImwRTv;-Z70o{GQ^ z(Ym`aK}n&)>Nkb=?z(+o7TfIKU$Vmj?c=jzHJ^BWkFm?zVf*{^{Al0BB7Y5MiZLkk zJ`|p?>{PV=Wd*-AVKUjCDR1mnCW*&YEEJYfbMaXvvClDFgOl}uq2cc-O;#^`?m2L4 zcyD)~c4@_vySJy!mERHP-)Ws;Z@9-O&@^e@?sIFKYNv;MuyK8{&(p8LY3q$c zJt1d*h0543aR~Tc=USHgQ}o>4x?lg)UoFuTF;uBiXIS!f^`>yQzAg4~hQVd=ljg3z zQqZfuXSu=|r<+m7%MW;lgd5Z(>~APOQ{yA498prR-}n8!%WhiJ*BkO(v@&O7;NTFM zsNl3`fwrOip(^$R;{T`I)C%4^N5$jUge?aQmWKE`Xw4K;3x04s+i&s|;giY9dJS_d z=L@-?WaThoTG4Q^>g#X$orQgq+%BD6?=wdr)>6j9&_rc}g~ii343AZMu4ra^9N>}< z__jgFf7zEaTY04~rxM{Jaa+DRa)+a$#fmiodnhXZb>IPAyV$U#b10{>uOI z2C>EE9qZUK+g;*YABi#)RFt(+!skQY%0E zSC?%!756dw8`}Fg;B3&H+7(rT`C9wy51x}P<2dwM&a9nt21D**Bcr$3&h0nfI5xkn z_2npiCV8yWGdA$*e9oRYMg?1Kb%VA#hmylhNhi3D{yUxar+4ao+e52N>h^ogE9STK z?@dzjOOEhd_|i-6qvzV>&$CPXcQzEy|I?ArBayIri^X9t-76Ow#1813=;;aPJK*EX zsy$(|riF!O+Qsv^Z)b?Czb4^1_eR+#hVvj#eXLJ6G!1o}mFV^QRoTm>+hUb->Si+R z3aq};{w;a)# zo!?$5`nwWd@Ba0pzNFgH?(f^^xQm~v19sj~Qse1J=kz+oG-=a>CHAi8y#+r9&5|{H zBXH@Z(cxV7do|JQr3@U5vjP{p&1Dl?^52+Od-8*eLLLlhP1jU+JZR#U@qJ)7dmDp9 z!^KZ>-)F7ck@(Z!?8@7zX5T;ZB>h=yyLxNYu0xjZ89FBa zwU;(bP`dQvO0fUU-l(h1sn-?%DEHeu>RB_fGI#~Y1L^!diP2NUKYU$Ze^)YZZP2C@ z!u~di;jyJtm0w(4fo~E)j#;SG#9Qpa5TwhddA0$pbZyUYTRE*CMM_3 zD?RmB{gGMnF`o2EY~T0%|M$D^RNBt6aOV#)3?aAj8-C{LZ|;w)QU4S#eU|seibnOc zA3MA+xoqcd*t6Wq{I%tCr;mILf^k>6ck^GEv|~l_Kgrg;(LeYs61Z5|lo!7He(hc1 zd)1qF%rB>3-LARe$f0!k*L!DidrI@%`eQ2co}ps~L-^-Xsoo8%OZF~$t9}0>%R1R- zGb(mh_g3@UIhc9r1pnE!4N= z^WOPRCoGyP9$0i*lr4SrotdrZ%LmCFZLb$g9{#aMGhgLTOPsr4`d@ypGhC&+qh91p zE$S_nl`?faYRzD^a-m+~grphV$tRaM9%5wKKRM>0;hAH}$Bp;@c+@@j{T=7?57+H} zSG4Y-6+^?dgj?Tszu))!=j=83=$y^jWW92oj(hW1d z1X}i;+ux?j!4fOPppjDadgh-_6Xiey0nN0pz8tT0&g&^9Jx?^*zw`B{0^92gB{{B5 zm~!%c&KEI;c5AESe|=uGY-E|OF(-L${fy(KI=@ftHJJ80ll%N~S%XII_J(m!pO6r1}&K|SWJ&7R5j`#!9&`gt(D>W+l#toH7TfP)0AkCG4)>_FFP+&G2hAG51RR9)DD+yVSfI?Xj09?S!~l2ySJz%tYhm=kcqTx zc)WJ|y`pyu>t?v`eV@68!Qg<)_d9+|3w0wm9br_?eQxvhl3EfQ1H*y<^NkIuQCnV> zpZc*@Fd$-;-mU|GL|+};v$?GI=GAcPN`WkwFRE`X)f67>6nZbk;5D&Dyxl0sWryR} zzHle@`b|fKw1q`W7u)kE$6pRvcjB?K6q9D{@3-6M-tXW&pmJ_)?C!Ati*_B4T-N&k z^}{=Qz5fK4F0MXq*t%=R+2C~>s~H+ulpnr-v7aO1L&RDqulV_{^TXE1y}jZuz%fDQ zf`-aOmv`y93a^?z+PuE(Z@-n_{?7$Z=EqgAZENO= zm3~+(YdA|^NxA;#&5UOv(l$HJ{Q9;tHvh`5!r!OAZmD8D^S>>@^yQz-ch68K9gj~|N z)$;j{zf5EH#3U1*I;QJ|e7=pdmKVs?x9nnk`sCzf*GUKctQq-BnXF#zdDNvXb0Ki~ zZPnOq1q;tcZ@qNr{x035-%AaxV!qU6`FI?h^gm1?W&0~tR@Z z;K7K@b<$V$g?pc7Y5 z{KllC&xQQwZs9Ke#D3Ny?P12E$r&;xoM(>LN2r~guRd9D*Vi!NNy+Lz1%tX?HeUX{ zd*c0bKVIHtG10tv?fK_F3yilWY?)C%_tW>|y;7OSk35(+NoPqHQ?TN_HIbWTUaHkf zrzNM~yuc5pk%?iz@H7Ay$weW#auCA4Q{%8 ztk!0JdVu)#hwTea?VSGlg2xYT8+nI9KHozYM^btP{K8jA{gz+*ZThLex$5)PM6zeU z4-yp?;F-5!>1n;m%$xm|JBH7m@%S$Li)F3f-FtTWid>l_muqC4XS{#Q`?b~kRk!kg zwx6=9=3%RN&K3zK!-;k(q9+s2Gxd1LpOfU1=r&X=G+@?DUZkp)G~wS_?y0>~7F}8? ztQO3_jPWhQ;uXRR5>{KfHT_?5)A0u{L%Z36z#Z%x9;z4Urad?+9$)f@?Y^_+r+Y2Z=l*>Ah>X6PLQrDp z)}X{gQKA>SKV{rZV!g-GP~-W*VdWXeqBD8BUaGmDO5kZ}UbrGZ#Bx&GWcKC>Dd#R< zW#(Ct7GkGdQgYOyzob}Bl$RmF;QK=vrH2;HSB@Xs{G;#6Efch%=7>szMmdBswl^zg%6zf&h>2E3SZ;mnV%>c=W} z&dC1w=kwcz?QvV@ywNn8FtL66CO8oY#ca~|*C*E0pTk-70 z=Nfn3k+^FWkM^!__^*)%sji#q+jbU%#FHzayyEk$J*;v0~l_+Z>IJm}ezD zX0?8|HvXP-h)SR0o%LCa98vx=1_I#Pu_xJtj`f#i7_w9d6&g~WwIGt&-r&eYE<{9rj_REDu?u^s#R&l&wCVX}E zi^LB`Ul-kd)5!i$$GsqFcc@Iybm3Az(Huj*$n<^FA2XQcY>WR}we8m$c31x@rd+k0 zY7>UTX|rO&Kd-y?cJ_@twx*b$49`P6SynI}*m$coY2Pv%>z}^4)9Nz%U8;3k8V_&F zI~@ILLH53F;i^JkEjY^bas$_2(`>&m@5QxmZ`Z%B^r)S!dOvr5I77p_6U}0Jca|93 zx&7+Pu2R+SbA1_2GGgy0wVK;sUHs73#lm*WVQq#Lv)CWrGrKiw>wa-2)1Uj8qZ*_p zAGKy(V0m%<+S_v1&#G@dC|vP)H!m?5X>p^V!Co5@(}>|E}8m z=TlNBhd;;ZDz*lj4nEOod+)3&4NTWq6ntgnz5MoBe?|9OKKl87bLD6G3m={_?&TFc z;K$0~k(^xkXR?&)&81&2rfWK!W7zGd?tMo?z;Ju-wz|Xinw5n+=Q-b*e|9sohqU!7 z#s_6xYERy7t^1q3cFB*RpUgem0?IcXnZ;xkZ zf;)b!@HrI1T6t-bU8DCizIPjcR{Y#u_V3ca`^o>qkC&c}p50!%a>3S1febrJnHX{= z+_#I}e37fjJgV?yL~4e?<3oGZc7FF_ToSjqCrY$-{o2_76KwyUDPF~NlAU4Q-S-n# z^_nugko%SU`P$vEto4rB_^rO>V9j|)`MbqY7bho$t?1st6zMD_X1w;}vcFTq{WfhprFiD_Y&{d>7oT@Ox>a$-_Tk-K!l!c%FZ;jkdVKt{?hRkxxgAhfJM;YEMwW(X`BEYIux0Jc zObip(y8I7}s?1zgs=X(|u-WmGppi_!n1T!QqZoF!o@G0D($8B@_H_z!_dRQLdsF4U zy?YbZu5-FN`3d9ayZh|SOw%q2XEUtG^;;Nsrkk6^gz0z`hsD}}l~0*X0^cELC;&W9gTIG;|um839DJ_S5 z60Rg2Ul?T=^S>`NUUOOg*11z>n?6o$zqCu@YIn;mWgqvuyMyG5+qL2t8tkvUWoj&p zH)-7cQMQ{=J!cG>m)`E~VIPuTT$hSd`1+HBiD=DahkuIrY59J)Q&YW5C2i5u?5cT@NMw(jlD zi~h3l@`v>o+)XZLZaW>JnE<-bgRT`5RzUp1My>8q4Gk^Ba zH?Cf?I#G4)lDRi$&Mltz{M_E+_dA#G`CfCsY*r*kBh%14b&KWq2dwG+oAA}{#@`I#7oKx6{uIoO=K8|&fW5nT!|$DI9r=p2+m6kNJpSVU zi>?2EoRqm_pE9+Y>%-Z{k~e?lpMU$JwEVwuobH?bfea#LzI-~hTjKuRn*Z~_Oa=YT zm7lY69u<~`8RtxxI{kX2PFVWVrOazp%nm&IsO5ch)t9)X|E9l=S@m4iYiY^-QmxQM z)%!jkd3)f0*EP{3y?OfGv!b<@ZSgjm^`!B=aQh!Vp03G-{aZH62CYignO5-hTjkLp z&R98*%Tpd53CgSrsOwh$I=|xOgmvXkU+?{w3qPXRe@0;M`Q3Y_7riXi%1Zxbb#LW& zYn_=n7x#uOy`0qPvbfLo+Rd98E4R7bzPsnPS#H*bcKN)ZIoo=25_taI{$cdPIB@ZG z$@OB-;^S`~()ruCwC~!{_}`oJD-3skxpdGh`IyD(m2=WI{wQgz>5_ULQTy%jl@09L zC#7P;UrH_rF7A-I_-EIxvM*sf-Z^u9n7gR)y|C@1zVlnOye7Xhe{nc(Tgr1c!*0N#R{GfLcI)r9U%c;Q zpio$ReCqqk^Do0?cd;*W^DX~ABm|MK&K3kx~^ zHZU15NjNEOJZvRgesf*y{q6bn)rsNOUvdQ+(!Bx=QKAbRS`&&!_YogV$qxx1@=yZqmbsjFQ31sK&H zNH*B-X8-x)v8?pZ2($QQ8ZR{US^93q|M|&lR&}O-&8AOx7nRRtt`GQZd-jm!Y>@+N zmU!=2RI`p(qG0dbV!!sc_x7IHmXmqC_B;oJeXjX>=Y8TAn&%s5g|*i{Q5IfX_vQZS zbM^h7A1!*-E}(HCT;zbxgBNf9%+0;|OZE4=^7x>@0*k{8d(0+mpXIPGi(%#g_CIsK zE!B@rR&KkmH}!wa^BJ5%@hO}O{WTq=kDQDNGxOZ*XMW?3W$(8um$`SHa@qa$!Flh* z+5J2Rgt;CqJ#C)ow6gZs<@(gETmP@q+q>}5w%T83ou4%_ntdwbk>+b8*@iQt!9bJo1|-srb`!(zkcz{o927cbr|d zYTdRk2YU7`4Le~Qus~hpfPQG4-9ff1u_?jJZBx0$axP_8zLYs5&L+TWpXzmM?e@OS znZfmXQ(xU-_&0CME&=uR8WX;8_iUIo%RBejnV;VdaZ88p+mp=n^8mv=u7A>b63QR$ ztA3a-d0>9{Su2re9vTe78oIJN&mXv&<^Ga?b5z{?b!orl8HW4c`cc57&|9o;ZtN!*jY~@L7$G7%QL2WN8-5dYaIjy*a4X04sioQTFZrv&wtW8^^}a4` z!e_4UQ`sIg@(XG>FRy)9eEsHxga4N?+SP_Gn5{XA{p`wwyIj-s&aZL%IlX_Y0q~?!LY*%Gu z4zT<>BJc35Rxp9-$=o!i;PiiUbCwk5RpiG{QF|h(F+rPa0qc}0S8kp#yuab)Wp<6| z{${&_N$ZSzSN(f(H}n7d&DWz-uYNuFa{6j9iBB(!xeTW4-Bh$Lw)U%fh?pD4qR#4^ z3SLX~qi42qK2Wv)c`Wzd9>GUV|CReJbk^LMJo&w>(Mff#DO2a>9Ph0!p7UnPK+dIHPwI?CqLftg8?%)iC|vlj+m` z885F7=-V%N@b&!swMJ9a(?t@}vLhpx_R9ZWsTWhBs}R1UMD9e))$7>|hByB`UbE}j zv<1JOcYRTuzh@}}-@#8^tGD$0J*lN^$8dl@jN{*&f74s<#}v$3@kM=q%iOA0rj!0H zZvJxqkT|cWm>BB?rc4)k83IPY!>eyr) zxVnf%o2xoqVaLg=6RgY&gfjcg%HAYc+UW6|+rOsn@`MV-poY{Vr%s*Uw0-~HeXD=O zai7S_{UhXh^Td(W`tul7LU&5$S-(??IW6zxKjpA{bzge(HN~@XK?-{Ix6NwXW!F5N z@6TwwU`xr4xh9`Wem|DKzA9rL;}5px<_*`K%_JN2*Q7IOuKb_w`Bz_eTj77HmnqX# zgUq6P_?h+NoqI%ce;0ai{#eRT{~_Ub++n%fC+g}M^y8VHu9U4<*HzrlXV+%GiK%YY z++4N?2l>srqf@`e80ju!Xw-l2b4#bO{>P1tuNYQtREf2(l=x-L?7{WIbkW}y&Rgzf z7Zj==s@reu^*x)$Y^taqZxVDWFtBbHS5&sIh~Dp4NqQ0tJ_ojRJ{MSNq5gz-W9-6B zznj&cYvo2*dH3djInrsCdP?MN+B7xyvSPbkS3d8|aSvboCAwk%u3fj%&dyq@_q}NM z|9`*Neric0c}HV7cJt<<%En{y?JoN8&bx^SdM`=(0Ize`lX+VEwRV zW0;V9sLtR2p{qV!W%|!k_*GMVUPkh<9>Mpg)0rLQb^2#c&USYH$oxZFOY6!XzX?xo zCffi1d46l+`K<2cS8Tq&G5mct|E%4=jf*`jxz{g{oHm7LLt(O-_SaM^8|D*EX)jeS zKR6ThNiR{t@swN7j5Vi1MVOfzR>!S6C~I7D#rspgl&ROUG`X9zZvMSjIeFLgKk9Q! zCQUgXRQ;flJ?G>k)gtGW%X`B-PnZ{<`N{ZdS+J38T*t3VL672iZ(d^1SfX#^qn2tK z8hnJ|)A4(+LXF<}uZfu+?(u2wfres>i zG0PoxTejEZk(?^);iK2=1DAA1d*<4xty;Q2tEV{0yE#QnndTS3sa3k=<%gz_ z>3iijWika6wJ@yVS3LT|4w9dI8eT2t9ASR6)S_c{=RIX{*!wmBio%@e?zg+I()c3|GmIySSZ&wm2GFM2QZ&A1?`0KE-M3t)oYYqF`tMk-E@>e zW5e^9l58FUqfKF*`#daGzETNQx8Ifj`PtcRwD=ui?$T)#VQ>e)GGk zZ#eYM@wfA}1CxE(96nxVU9YqHT|SROtflX}w@Eo33Q`OI@Be>W^jxUoblF?tn}k0% zggMRD(mwfy%|^j1|L;jR^9B0RE!k5;zPhtL(3U#a$h6n5F+zq-;AlFF|K91*Ce8P} zOY6N}I!*tg&;H=wE7_l+irzPs*XN4ebFg~l@aX$(2Y&}ondO#0KDvjknyo9W!273U zVzQY2S`I0O$JURo-Mg1}dYW#r@#U^gNduKxcE2wB+ux0=|NC|O3@>BTl3m-jZF9f7 z;=;#`$K{G&&Z&O4vu|0XqkFuXRQJP^XISk2AC;}rPw8e1IP|x*e|IZi_4+HUGlUY- ztzHHD+otZX{1TX*m0QZ9bzqfD=tN#se-wvnM-!okF#r~LCY-D?*v6a=s} z+~S{{U{~+$?fswCzQxm$t)Re9LiL_u%yYIG8!PP1ZdAF|F1dAYnc8jD5A|;AIhewF zKC@(}+*jLBxSP}9Wb@Z04*Ta?ms_zNEXZDOTQb?_{|?dqM&I?W?vjkx?+Sm=$eNeS zHesEEjvCvA>{Pq1tY^oyO_D-xOj#oP*{0i<`GK~KuXaP8jPBX9+qQ4K$h)U0P~_8w z*K%7<_~f|Fbl{JBA2}uG3)7yh3k+v6xPN|H9o8m6o6oas zTFAKP>+L1lpRfIX=(pg2qeep)|Bvmtx1XJ}U=LK%KFaXISCdPvK;YJwXK!ON7>ZJt z{F=*lVb%HziYuqQk(w~+klNHENp%h}-;>!3OJrXjcfNM73_Vp{#1NW=vo6qKH_~tQzU47nUyR#)_H-9g65_l72 zdLh#)ZOZhU3rb(F3Fh6Jc9_jvdV*%mS!T9~?9`>qDm;%oW;U`{@4obE%B|D?@7_9- z^iy^EDet-km)evIAHA>7cQ%pad|%c2CiT?InN51!Y73q*ze`*Br`vROf3MA}tus$O zP;{0NzM;CTAuK@U;Q{`+OTE6EF@IR_{iyH%^A{Je&CkrAzw$_H){Odf_s%$4`CtDZ zG}qeuw9dCztFJBk_x58FlXK~O#yhgJ`flkw*uH|%JVSbw*g;@d)d|o)o#yD7JTHgm0?}`iugTV2Q(%ozj^ZiU%qy@ z{7;n`hnD$=!V}``d%`<*;qRwb zuUJk@+>|ISvOSh3p;^LV=REZ#=iHdT2_Cp-kvr?|@3ZxrkIgjBIew%w??;N4&|ObA zTm8GYmvk6r=VxwhxwL-8s*;8q##KFU^(MXy49a?a&f>6YtoAa4IP3c{|F*8bRiN8- zlKr4hhY`QHp?_V(QSto$VwpxcbB|4U7=9$ed`*1*W0L}nmFY(uoi&Vv8~nwO2CuK% zm}A($%so?U&%y&9pNp^Fuv7goU;V*ymBvXPk&OPj1@{-dUAL%8O=Z__&Xxac{JCBf z>}^r`E-)u7>&EmKzxLn%ZdVwp>IFxB@>M>tyZ-sy@>|>Y|IJl@`m>*{;jR4CZ*o5jTznW!S_S%gnRX^HYeeXRF4JGy+wZM9*Ee0J>4^SS zCDC`bmxP#icwWjm`1Sg2Z>ChQgqlCy@mtdE{uSP?*|W_zpxHmC=CaiysixE0wckff zXLPWf)Ujh?C1|(XM2|;d2N?w!7`S8GcI{} zPC8n_7V%WS!#iuKS>BeFkJWE@hsS01XIO4j-}lWl`}*H&qS{|q1?aeKd@rzIZS0w4 zuF^**#RvIqT36Hgct%h6`lbT~OBiRIVJMw;I{RMQ+e=2LN@I-+7EE2`qn{!3Z`bB? zoA_f2TX_W^Trw@V`r@%1w>H&N19pS4I zw|cMDFU{KJpvftpo#)x?Kk1}ri3)!L%Ll6@hJY-4g%YWzhL<5>4ri@5nyG(W`Z((C zqw8<4Xik2cfB$dZ?cJ5#sz(E4es~^Us+o5A)+Dz5VX|!xk4%wo=-1piXGajdTNKp`VHUCG5RfT;Cx_wLv7{H`~CKL*Xw^AHv4!|{j;0!g4y~l zcY+nnc@(~XwR$Au{<1gTt7_h=;-J3WK`M3Am-KtCEuSRrskf{l`J89%5`71e7r`0q zM&fh6=((0Yoq6d+63fb#KOB=@bRJV%F4|N7&GNVY%Kzr~YBrnBS355IN^g?f1LdEo zX-9;TY$pBE(^da_l*PcZWbUh1d_A709WE@8)j8Ha?J`gQ zn)UmHGyl!+CcD=rzcBc!ccSk4!-h5A=jJzV`d~LH*3a>it9QXORvWgp&7T&^dYpYO z)q8X%%iJWf*d9&Qwo5C2^Cr14Pq~)&bf?eVp3U!fot~1!;p)|xW5i(UpKkZuG*j`w zZ`O|4EEm4TMumpO)-agfyQ1-dqhivxmB-lTs-9)sdtmyVji-gGpU7v3H4D6$aBAtK zH5+e9IV)MWHMl&NHRO0xzlCw$)P9*n+1uq2ty@}Wl}f+4{K?p6X|?{{g65+oZ)@11 z@?;hyi!IUMpVj(J!6RGIYqM*Q)6>#4W*+v-3%!1?(>Omv>{>yve%2Pg)$1+>ys&Di zO!QJ&dep?@u*Q1%?EV$*Nz1NX?0>y4sWqTQ_q za{m|BnxZF5S>`Nx^Zndg>)7cFOqcCudHiY9akeGl1$u&;56CDaEMK0|Y+X9fZ$is~ zHNOo@g{PgczOT7?QE+#(OnhMG`?@EF)tSG1yk*TV1xf8`{`KC6{nFt#0uO@MGHLQT z&R{;{nrhAGKHp^OT)$WOq4O8bm^dRcr{mj{8|&7cXl&L|yKV1wUBOm3$!+7^YLhhu z{asg+wB2RX`MW;u`MmA+r*+vE1P%YB%w=*t&u~wF0iR{f+4&YI1U&YvRrau zc2K@hox$yyDek#+y>;2*OEHVzuKD-=R`%M;=X{OP3)o*6$gg}`*eI&5az;~anSlFR z@ekiQe#~I+S+ICIQ?bIz#1k3(8@()*L(85sU)cR|q4Om*CSR{Y$>|H?tCJt8?C$#Y zI*#M0d*h-shOfWw$%{xR@wi{(R!Y7W$%(? zmRB_wbhmVu&FDEMWH4db2(#MNHb5d|AwUO?19tWBu)phh_V7KK?x0 zyRB~d0nJXkm7A`yaXBy_^$CLMtrfBjF#ofQ!UscpA-b_?~ z|7yecvo@#I&e|P)wfx+cuE51-o=D_OW#3=;neFzTl!dk-cT>(^6?=eKR@A`Afy>CmI=R=XKeOp?L&2zT=pL*9W;AzF}RiS1<%q?wM3YRJ}H9XQ! zzHMgvaVmZOkLKKI&o)+^$@u+viRU)ouNs*Xs`S$noTMDrI8C0OlC(sGojujZuEXqU zE9YaA?&f9lZnHDYPu$n@H=R*{iMehDkBh}6M(1}+KU~&j?V85eBVf5MWb^weQoZG} zzwh*ZJN&zEdHk#Tp^rGCMdZjrl9hAV%5x~BeQ zing%F>!Tv;qJOM9TUR`}_rUM<3brZpoBLiLZVkMY_G-G$)}5=b-;iBCH%q&XcYE4Z z-e(i1urWXGd>EoqZ@BGOtaa|1U3S%zzCHZ(uJ<{^{J)G5KPE3d^g1Do>rQ&!0X0j{ zo2(YW)-QVZbQ|)TzJ0`#JLwREeV=ciZ_lazDQYL2=ikzt9Vyf#;|pXU)B}qRGFX{7HYaSASoIs@Cq} zqE)knpFMlEve@g{nE=Bjja}Vr7q2r0Y<_nC%F5u}C0mr2{WEfJsAY(d%sA2^Shi`I zJO8DYl?H+<%J+p`%wnk6m;K~sc>+Vrq)B=n%pR{iyz9?8hAY@L6hz&mBLy6M^NKF^=Ac_ux*9y%%c*P$hh$`-B>}4n<-dsx!s>oo7#FcFVE^N5)V$~I`CAOHO>KV^&$9e^^L*VkHUD{Ue43M$ zLMHBy*~0T6`PHn|)3$gr)an1sdn9Y*TZhUTw5d&SK=A&r|4=Y4Fp&vEyc`;-%|-zYMk%wwsol-JUQh%G~t^ugIj!XMeJoIB2vw z2c$WyWD_j)uzjCye>|9vVp<%G{c-zYu%o! zU0uMpdST&Sf8_*;_3v`E!>7-(`L+0UTU5=Rh|Ozn`$XUHczS=Hne2prOk1SuPX7+t zJdFws~r>*JR<}z#CVmN2T`yg?~ zdykvHoR3|*Ju}(ADEZ^uv+EW2tc&hs((QE{i>DU^VfKI*ZFHotvdG2`q+Ua1u5eR zLT%Ug|Co~-x%Y^f@7j$A53geVq_^Us#g&I@KQd&Rq~~b|D{L#;I(Nw*i6fJB0~WnH z%)wyieveIMf1l9Br0s0Zd)2PWZ`kZ5;CE=jr|b@Tj;wsch!omys4MCOzvEly|Gj#Ht5vKPruaUcI3{o*;0M9==R*4?Z;Lf zG+W@}-I^tqD8s(Mhb=wJQfe+)GWpT%8T?!K~$ zT^>69C7+9T)w`X~*EoK0c70xw=0rla@?9X&$h)u1x*nSJ!R2wTHi* zYP-KNXXVzDG8KE3@`}&f#PYc9ab0DX{NwJHSj*oVxPzp^de$#+QDzGFnV-bJ@57$n z1c?GcHi-kXOtW)lv}vuM#(!YtzoKJC5*>^VS1%oj2>4oQ*vQH)cH?Z6yP^(f*&E)a z8IlLWOn2~EK91P3S;Sgy;$zia2PEH1?Tc1tyYTN4Q}#;v#MNHkZ*16@{O0WMciYQk znxZ<!%vaToVpGt##kO+lVa9bT+{MplzHEPTu&saP>b6o|RiK z!lU+m!w!uDeXIZ9J$vD@g3R_6%O!l+&)Ju1hMiy!?0L}d#H{|HRXi@^^YioD^Xnc< zn}w~GKCF|-)WdD@@5ke}#`AynToyUhv>@=5?A_9fMhvCbZvOW&IxpsA{WLU9%OIH{ z;Q8GT_KJpW?(;Oaesb!cSZlRo)4f?HbIPu_pWnVIefo`8SMzTy^367#=(eo6VgK&1 zI;NSdbC=IaGoMq@HP@_SN9l>raSPAt8R*|>l6%s;bKwuq%1x(D-fZ-Wh1>y_Z7MTX{f4<<+5o$;4RLQCereQV#P8IlZ7c8Bx6>;814 ze;V6_ki*@pZ|g5xxUu0z?>pzC<<756p4T1s({}g1uw>S*iN|lAEAQDN9ObuV?)g0l zr{m+7RXeXu`@$h@ozW6o^XQ~mNbfe^zdu8H_`~eZeQf`=Ub5oG|GcXTbA^-GqPH$P z@J=GcEpqYf9YeGmIhsoedf8SzIZ;r2HiKe%&q? z_kZ2T=QrPL2t2bTgyG8(%Mp-Ht%Qr|EJs3l*Qif zH7z@Ky7HTN1OLUe1w5Q-pZrS}oIlbjoVz*9D9ML`xe@BVhMMe>8t(_cwU`T*BrS`u z_kXqT_4DZ_(>0W4ap$qd{VV?}wu9B>CnjzNZT1JwZl8YT(cg&fDoKY$ZQ{q- zc&@}Szb(DL^-1~UdE14SYx6hw`!iUxzFoO~JFEP!38p9CL==8JdabG7sW8&z2s^{0 zOr`CEQz-lx}+ z%#AbD_EdaKGLK`ZZ%nTH89ud1Gw`A@gX86W+Qtu-h1^+o@|gQ1b#}gh?XguKIn|FA z-dVYEqt=9#=j~K?+lFbL@H(|TMag1wV_@xyWxJmL`ZM$6@{*^XKJ!^)oVu3oXZ^S& z`k!^?>Fqh2OJ}{(%CJ`3@Nr7;o2lRT92dJ&)NPtsVNlInmT}L{d(uW$iR4F@c^IZC zhAFcJEZa2IQ=0KbeoRH<)C|K*s_!e>ZP!LNsQ-HvUUsa%K8M+~Z{Ea)pK@xMioy>2 zb8Z^lR+i`DIoCYL(V^jg@~ww29^dkN`{(oday7?&*EQ##4*$Z_(BJ&Mwo~Oy&$`4N zhI5*9R-fJUVA8TRFAl%jXXvTEy>R)iPcsfQ2lN~Mi|@Vi_Rit|db$TPSxyu!ea$Ap zxhIdS;CjR27Kgb(QqIS&MDLVvSpI2G^sC>Gr1Q7%87|_>RP6jJz2(G;Pl~)uv)FPD z&ArQOK4r$;Cd-)jt-FLz9~D?-vZ>(l%=BATvgc3M?06yn|KhWM=l@%%U6?Ax`NVfY zpU%I74fC(xztEtSsh1bA<(;u6$Fd8Wx9nCIGUbT=YnK0W;8|8z@dc*7x5A5Z+Z4F& zC}!SOOpkXe+ZO(D?l1ly3|sp|n9EbvZw|BHX8)jH@uX@0{k6CKZJ1WsA87Sl5cp=o z?m*sKOO^lZ@^w?WIq}46^SznXCO2B=R>l1~z&=NRLF(D4*Au>EtMjJ&X~YI_Z@#&5 z%eE}PL(hDd?cGxPVoj^(*026n{695k_*`CK$on=ba)nFKX2+nf``*_am-~Avd`_jK z;AdThmv{fvT}++6%a?IadQFV^%6ArwkvdOorC2-k8yua#@U#?s5#f+>5PvJi`67SS z!ro~tNwy3&|MTn}-uOIY*l=wBo3i5^4ECq1R$kn-k=bI&j%&Z)t#Lb}ApcFMz|XZ; ztYj8LRKq&qDtpBVVV#LQbIi`Z`!jq0#-+EmOb)HOeZ*%@i<)lZO+((ZVI_UepIT2I zn6jh2bKyFdn`*0CA8r1&|Csa!%M7pBnQKoqfBnDuYg~-24FCVX_oG*ynOS-NPg>k8 z=7yiXmOoxF-Y^%9FwMU5{lH81*S3dE5q{ zI<@UBWrMFKMZDTOA=~*>yUEm5YO6zLimiyRefNF;deOcu4_;o}K6}j`&KZHfIS)v! zP5AoiD&HHObBCTN9Eew4=JP?S>9=rQUl&s&W68v~f3tF?PSVJmz`0=Zk}{#V8BFzg z`|WnUPY~*QuEzUt!sXJS-bo&7-kkPv;^mrP98fs5FIlXQQA6;U@P=3YOTxWwIkcxS zpNrjh$8Y-LcN15yn^L*(sM{6Um%bd&n*~Jfbh$23JbS2AHOX&Fc_xE_`qP)oOeX8E z5Nl4l=jc_CQc=Dbv~ z&So&;;ij++MNhq|e@t}GS@CcFGSR+63l=2*E^|H4z}8v!Uvoj6j)U5j z2QTiIA6WW-KX*YM$NFRJ8)oyLvz*4`pZNXsM0N}B0MHZ#s+br@cKAyvy&@;zy6Y6EuwY>^`MjSNOw_ zAzCG`>FE)g@wQ3po9dLCio$O9OxW{Over0n=9@cnLH1APThn#6{(d$mF}Uu#wRHDq z!?`YTf0(M;81C2I&Ru6?(9Cr)W%f6V2MMMR#N#Rs`m+Cf6~6yf7&{lwgBy0S7mXW? zUG`_QObEJ?(rB;w^-k&2jUFqOSg*35WU{fmzjPI&+S57O!pQ}DG^OsyYq952ZA_`-oTsSim_&7G`t#CY^a{I8vEmNNz&Xx1_m&}Z{o3so z3ub@Q@>s~Lv0p-Z@}Z6i*ODw=DxRA3t3fvRaHeF_MlAB!C=jFlr z9j!BheY~e_)jVIVxBG});qSS}>e_Z*U_KEyWdom~&D2%58&3USbnVaYU)T4)dsW^1 zO*iF~e%ya4!)@;JwO8UUS+yCo6`!*_K9lXPnn>Qa8BDHc8C2BYax>LSDmZUq3h}&a z@tHBDc(I-OQ3)&4+5B%6)-Bw#ljukyVm9~n+>@jM~cm^Znh-zxU*%{*s@nV04+ z5^WWVs{en*Fgd3tH&*IE*JHEaQ*z^?R!?nTdQ45_Zu`63E&5*EKMpSyzkN>eR^o=x z2luxGKIT5c@#vRJSM!%N9*3n80z9jPKX_kST&m*6Gudsy|Ep3*mYCdJdc%@EF{$dE z3G3e1wZd15edivt%GeS+Ri>qC(pLw`B&j<~Htx-wyll42#f}*-K3}i@d;QxHVgDPo zw|4$`xBGpWVWEJL$BSLB*KLkAabs$`plQ`okRzgz$EL8cVpmB0_If#`AokPEyIZYU zylg(qHDG95=Q62y`GNgm59)mw>H;s8Yvk=_IPzejBUAj>3yD&%BIH@b;cGPWc9nX_>-`N za=}J7=S}epJ&z&|^e;Oo*fh)0Q23#i=^rVT{S0q*O=e)~Iq>!I>2J%faygW+Z+iWn zd#Pb{jCB2)36pb^+&g2}^g8&@uUy4@Vb0gCX=S(7)NgyQm416QWVP90&dJTc zwPU*Y?atk^a*uqNX!i4rrCH4@lht`5#aTHUpYGm%Yf-rP?Ol>{zrFT6e%o!&6RDye z&WAIkmNoOQ3h}XPPU{WWI9~Uzw>uj_5PjDFn`LF)mI$mh2{EG z&1&PCzczKlI;+gSxgRgCUhDS2JWXTKr^9iwqS9>ee*$Uu*r! zR{qNRPTlXfc}{^#U&PtHx5>Ux?p^#l7}>o)&0L4&)<9yo#)3a|I+cXqU+QPZ@3!%# z^KZ}G6#G%}Lb8LM=FO*?b6P%`PRUB}R$t7o`qho=Lh^Lo?XjPvOS1G1m3F4hUgc|G zS9*GR&YO1oM_0;D%{mwS-0uvhp=htfn%ULcuJYKQTlfDlvzUG5tlIP&97iY5(&klL z`X@P8%5jB~Rj`A@f<3yYJ_oM6VLrEf-Z4?n%M11XnlRM)^vAC}Evj~)VUhi1K4;bR zIf?NX>w5Ya6*#(dMAj;r#Pt5vkygl2D4YO50&WyaircwRIU+LEF&?2#W zCQnnOYksD#yDxiu&gS)|IoG$WUcdI*&#A7NnR*+-d8N{(_gLIB^ISEVeJ}Sp&i22& z2Ar21B-8~at4+9Mm9kVSJwPu&ZOVOztw#&Jr`^8Y-nVh%^tg8_dy~VoHn*LgsT)7_ zT=~Q7%(t#Q%Il_fFTc*SVb@Q7?cA%a&dCfHEP`%5U|HXkEN4=Zsr=TePB-AqvEz=B z3tSoHf3WT1Uh%hKo++#4R~bKf4#nDzm5N&&v{hQ`~A8N%ZxL}bl=Gy_X&6}dfl`140omo^W>{#pC*Zx z)uc~eE0SDzxYM*p@_B;KVu?gHJqHF~tE7^2Cooco?ZO7Gl3bX6)vKcZo7X0-3K1=#;`;t^% z#>&6Be`jZ=Ex6liJ>}XrQSICpGu2m4cgWhu&k(+sU(f$;@m}U0VUG#hMOaH!{qpW5 zCbNa#?zn6c)L6^Wxj!T*{;6YC^i&DHN6A*S@~~e2MjiPy=rJGrS*Gv;KU-_*=@e z;=uU`rZTx-m!|J~QYBHqWb}fg?KRUZhNuRg<^v2itiM0bWVFsx3^@Nbk*#M&vS&i; z4z~wePy5|l>~>}0xk<+9^YjwDd&LuS&i>kR<>)*2U&ed~Joy@ne+2NpysP@~Uf%2{ zGgjZ+cbsiY))d9+jz`K0E4uqES%1Ir<25O2?z`mwRlC@s&~0x0#G_j|Rxo5 z*Tp=+lucyu0_Q88CrzUcGV|L!IM9FVzk2;AbvN8bcV>*+S-WvQpNQch`{ z7u$ZZ&e`tvrwK6~n<35%TebIxF$VZJ-XYGc{~@%=wscR%XV zzGIer#*#zPxA9Rb1CzT`*?MU!?XNe#UNo)^Z|KNg;NL!vfBN^D1MB>5D?9Gqxah2# zLhkjv35)&B7d8H?RWWXFxTX0v@nydJ7Phx4Uv5oFG;_9PE98f%wi&6!vpo48)=yNAcG_Yr$ftx8(@ZPPYRN#m+Da~e&bIp|(s zt})-~@qUTQ!Z|nICb4Dw$lQG3&CyviN_(VIM0ZQ&_P4Q4=iKx3lEMvx$);>E0snN1 z3QV&d1s+W~UEZJ=Q29zGI>;!bdydfu55v^H3H+P6=e8cUW!+S4)h^*u&+~&}!_V`< z=FcxJ_0C-^5zFwuF@9Huq{Hrp{jt0$9WNM}3u4m@m^^*d-c8|=PP)43`|;E7_B&~R z+cWdRrs&mM9xhk;^KSb81ZKDEyKVojYUe4wSIhR(BCh_Ly zZ8MLrJLe{2fA!Rp{1q1`Joa09SgNtww5wqEH>Ec>HalC3mfrgG%c}a9v;4L;!>`ls z{78#>JAK=OWn#=VCL9y`uPN9&uRX<}`$6K%bO(8RWsXSW37*bzpBBGuDNtbTn#Ooy z)wcF4AC|xN;9}A2o$v3Rw$NFjyt~XJiBB*%Lg{3ndGW5d7v3z~*clkMFK_+ZD<1ow zO_6E+bZ2*~)sqnIiBtSmoc5nvyUp`<+gzj9IkOGw=DaprGr^>+`0K|Fk%6VOqy7hnZjcw}0mH8!DNc;wQK~a^G*57Mp(~?RNIuC5#=RWuIC$ zhGa%w%w0Nn+bizvw+@xZrRGYTTosRReKdp3$WmQ_A>+zcpB@oA#;3u0ZRLMjIIn5& zTY8FREnshmZMkXHz>|@&dFbOaOK-e!bcoflFoWekxP_befn*q z{qH${KPK0!UUuT1y`?K#;c4XNfXm%;_aCs7DRfvSF6Q`g{(@f*Ws;B1b>cmvy`a0_ zl=Y@hOQ(}Zb(mOMjswI0gZpzX8Zmf0((32EZ<>DJ^5ctSf36Eft1fQHN_{QA{9=RX ztyQbs&QB6{i+o(YO84LGDQEAQoye>HoO*l86t#fJtix=48#m5+SblWp^BWm^!yl!|M8Jn^qu*G@k@;s z=U~uMhsjJQ)J>1=4|@IH@+H5;hZ(O6{;SF|o(uSU|EPwY=W9OG9X}eRq-#E_hHYGa z@!sx~Ne6VLt16cAN?G1gV~Vr+{z|f7H{-%o58K|0-}TjHwYhe$b88e*V{o{BdgYHZ zH`8y=id0{Imho-RWVa=LQ8_AxSzGp2Jof$eOErJ<>go3BvgdQRwC!EHZK+k-+2`}} zwEe8_pSt?u=8-LpfnAe6tn(IndESC`-a_6LdU+`dU#FNA%n5mNb8}kc)^k0q8ZK-P zW}7dTV6-cBc(r+QLBWs8S2BO*XtOO4n_i!|PwEWc&3B6>jk?|CHZX~>eO1t9jmdfH zRe9fiWwyb>i6u{u2r7G=Dp_&Gu;QD}^M}Wc#6H$0MV z-e)jUJTAlCv*F+m{d0Dw-|hGpyU8VG^W^=nSBKl3@eXLto48niUCHc_w%dM}&e^B0 zx*hZ+WuH@w&r%oXnAss_W;%tJ_6GiAE&a~O5ze1!ly^XY&*Q7ag|Cv+`5)a9_TOT4 zwec?}XX_aT4SOl++W$BHF#ZX6@|CxfeTl!rr{KD$3-y||d};r9pl8>C_a+RU|Fe9(?cDi}^G)5mpJkt9mObCW0}NH) zLW>VGRE15ObDYVnpUa^C^^TAz20ttFJz}CW6SvK|IzwXX^Rj;n<>%&E{d&l_{GPTV zUqeWNG55|1DrL7@AHHd>Oc3gbv|w9&{H@gT^VPDVsoy5-xu(6$*FT%xfLE92kqQ49 z{+Vof_6)tA0_;UUHNDH#q{V;mA69Hg{ij{$Wh;`wks;{m#$1*wH)+!2jXpgu(|ns{ z7g@Q7)}R04p%u^k;9Z`f;5)-@^{d7B-@dEdcWwFl(^Gxf9?Z%LXWe=3bc6C+wqAxm z3zxj>jp|Tdws0|zVBcY$fRl_na#EggTDUc|JeNyja(qy(&ETC~5L>k3rwx0}uIFx2 zr#eqOS=938f6K0iUPpMgW$t*tH|q5J`YpNPP7Xb*6PI5Op0whh)Pu=EHpf{K%nX>t z7zaL5zYG>zI7RP*-JKgFoDRzC0N{g^T#oxst)?Z4^BoF+X6Wp=>4=+#C&yEEF>MN^v zN;o?4?J;7MG_Yi-3k>dIK>*unDab1VDtHtyw8KpOsA$VX^USmG3BwUtM(m>8eMk1<3in$yGs8CKHa!F zRcXgrM~1mejBhvWY+yMS$nin-tF>vW`O5EeAN!sUc>iCcXWfoZMZ5DZsr=rk63KMo z(U0N>p^61^Nlg>_9i*lozTjJ1o0P)9ps52o3m_(I;`OF2qDPOaIwwlZclC;$a;NOU z^x})Un(MxDbWXUm%5ACCaf8Tnhf?eREY5Y@tZ|?rtA7gr!tWXrq}c?D7vHH~er?*l`Bh7IeYmydhx?jrp@5Y#B^!$}IXtos96ut%pq=?< zn(*W=>6(RZBA2uegvHKydA95GhBjus@agv>=l|=8Rk~XLV%F7fbDwIjaqaWCoHW-k zQ)J1+pzkSF%7T_GUyF29Ir(lC{+K9HXp(aC>3PZA<|2>V3I2@|XS{thRp%d)*jv1J zm)Q4HZgD{i9z37?_y)I-oY$AQ6THj?a%=8smzV`lx|;v}WKyJ-+k%(&W^oQy?q+`q zCv8|GJR?9n!CISpd|G?&*pC3IBBF{Cty( z&-Q(mT7B`r)HKh{uaEU!_c`MB`}|bxob_VAeO8_hjB~sB_11O&(>2*f)m2-R=GEp@ zNbs(*ezfoC*_Xw9F3Zn&Hy1p}pK^?Gv4HTbHDC7CKCHa9#L<2KwGB4}m{=EyoDgL0 zNQ-2+&U8b1(uorObHW$mXaDcesL_!`O+9hq~tmody+bI`79<=s8fcPyIB3}>CbDqG%U_Oilb^(7mn*|p*f z$3HF)t-rt&bjc&;yKJA+rw2Rv|Lwn2=y*nJ>B9ZYBF}|-Cse=p+?=!F)Slb+-`}?u zFKEyZkT`H~RwF~po|uJmbJSw$_nxi%DjL1wsJ%Paj^?er;Zv`?HEeFX70|fZ$?V^b zg@^A*$y#ufYxcE0y^+>f-)Pc)RegSHVQ#vqOYL7>ukDSEF0lZB|G{GJ{bbXwq0E^>mG*<<6K)I>IwEz6$W5aFFEYhKs1l}|b=daKs^*|Rnr=Cd<= zd&StHyL3)Oc@a#`1JJKEQv!*x)D2lpSgHNwUqN%NguH0JDL%(=ZQ#Z^1k##Dzn!b zZCiaOH-m>ONnDYItHir8#(+WcxKKN*+@zv!Q$3i@&#*ds@8?qe-MOpgSH99*e(Lel z`$tbWG{zU*+P12D!qv7{S5i+{fAJOOYpMOt;>oc?W^2{|W5NDg!}i`@!Rh3`>i4?H zhB7~cEex_b9#YAM0huhzGd5jPSu5J`^WvIKY1#%qpJlk;H1u9?ZvN{;m~6M^-57(0 zI!FI+%h(Ti6rE#!8Y69==u~xqQ%H7dOrvPE*xp~O)?Vkc-Sb#XqR{`_{~!NeIah9Z zIO8mnec>w;mY-6Fjm(b@vv9mt@Y2&Xy z)id}~GlKY8s{d{^I-u3EXMw{y35Wd#PKzCw7;b!=IXi@@Vhbz(nRok&Oy<6u_q*Co zuJR|R^}on<=X1_gF7gqc!SK{Fh|QrU>{a4HKCzb^iuRzgX2G{f@>kFLYW9i9?9{v( zU7Yx_N7&Eep{`x$_G2OKEo@F35Apf*8-CB({8V=4-J|{YlCM2kX_PK;+}`c*ghZBh zZiD@{pEmCK_v>|j;->a$bDQ^;tVM?zs^aF=2~OVlqMeD|tYn$8!FAE}h_^bHW|1C` z15&>}ZCWV^+Cukj(>HA!A+_rY?rNVuAMclc|EkyQ;$(*ALoo@3{Q{eu8}Ar2C}-;4 zT$z3@$n})(g!}`mPtBBc=9;G{`g@X&!OE9w>`z!QPhF|bc&zo;y~{r?n%wM3-cjXx z!D2z6|0RdV4UsHt0!vfg$31UjJW+ma_tA6juVn04Z{O(u-e+%y}cJ06vejour-`7xtl9>$h!1Z$a2$^Tj!2c{`>iS z>wS;S$rfw6xOY??Vo8wL|MP5q&LlOJ(8o7~KU;*%uuE=xdqE^s;&`Ui?E`JIZF#4> zzT~Z6+S65KwsMcI&jc%%c}tV(>MtBw>MmEgWckgO3U|lGziU5f#Jzi{{WnR*f&cZZ zT_@^3O`d<_eEq-TA;=a-yLQqH_6 zQ+0@C!i)Pqj+s}5n3}YH-}ilQ-_4lPtD)=UY^wq%YH*jb{mC}D^Yi|{xA*V-pSMr` zQEESE6OIwXr)t}Vdn)=2>GoDl;phK4D9q>YVc<7ExbhGa$2q-wss(PVjK7K+EH-3V zlrdfTlDw!~!b5)rzUy~qa_U`d{^Mi&p67PN<~y_gtuPfdo%S-};rIRj_ZlH$N4mOQMd zUTfuEOFt)k&pe{K+3nfh;9JM9X7WBUSl@R1ZwJ%Piws;9MgjJ}uCa$K)xDOp{pz3Q zYo-%gx5XZKf8`h38^r~&ZB80;Tr9i`D)xPCG`(u2-1+|kle&-Qvy+FJ{wcFsXMR4g ztF_*CnZq`dhQp=W-*+^$N*G=iygt|cUqRunYW2xt?cU19{}}%t{B^$6X1TxUb*t*^ z61x)r2aN06?f*72-ArPbc|~*8vZEiOnC{g(bgA1*72GpC(fYvlQOWC{3_m`;x$JzP z`2FAGm)|oNz6ev+trB<<`C%`gonQYs2K$ypOF;o9=*!0R<$d-2-**_Kf4zHod-;30 z1|bGLhriwXe{f&dHA_6iV(qv3yTOU$#~DBD`F{TYpYwT-cn_y1N*wtZB!3~k>}IN7 z?y{RkYo;q6TT*NA_Mq`3r`)&hm(N!2*!Avp?!|J=V-uv=0$irBF7SBvdfo1GjiMJA zPiSZ`S~<5e>Ry+TyD=~1kG*#`htk8$AA9CYw(sCszf|yd&8}`|8;Q%3w|F}QD=%*P zuqJ?MOG1jOv0$~f!M#JQXUkF&rzUalJO6OB} zrMGw95ylT0>^>)5H*18jIsBE}dt%Mg>nO_YgkYVzO9@tFX|^$X&jk<-h0Tnwt|o7ZiF1D%|+7LD+arvbvU54Klc4rUI^=$SG^Jy!(bwo6L#!G3f zg@^afI{neIsb(j zZw^<~r5!G0`*Y;u$BYh(4|RWE$6G51uHU_5Px}!j3(!IQlWUGFemJ?`Usz$0(&Bf< zW%D^*k1)p=$e;3)c{Ew=yCpNr0sokWIWyIK`b}oe++O(DO}zhq!;~F%zULUaO62N( zByO+ZxPD~mpDB#Le*7?Co_E-%{`>CxmTo8NFFlyq?_Q}X{DKn^{?P=!?{(+qJwH)6FPHbgWo`94XVS0Detwea zUvHL-Xpp%!%eTU)t85?s|ND6Sts~?2?D*fam<@YHG>;kvoi5J5wdEvudvpB1r}4Yk zd>1>Xo{iycZ#&OrZSk3-fh+A|Y|JtVZtwVTh&%QsgLMLP0?Yho!u~di`~SYpkG<>W9TjBv%H`IR$B&u59CwwL zU`PtdxuOA8%W$a>SsAf7bFLVF@djG%G(bFH~|NEBz zeJ1mTCjpEfCYxpRthuS&(hZ&;WIkN@ z%Kl;El|Syg&RuDfYiLW|zNpYsdcvQ;&yPE~1@3+9E8k(^QF(x|lTr8i{C{7Tp9?v7 z&%X0+JFC?UCWeQzOc)F=l{`Gu>i21r8Dlo{g0jtFjsC&{OtV0T7BJ5E${ujglRK^1 z^2y^x)0CewN;IUgCP>_SbhNuSvSmu+?S@n_lDQ1m3 zi9L_Ax#?d-9g+WD#>HE0^T{-oSu!`xp!oT`bknWHDop*lPi6MlI#u3L`VjtV z0>}2rs(&-Scx;;g=g0AHbKln-U%A=D=Kz0%#2lsv87oZ6mZ+`%bKw9ZLxQ`pgVW#l z|NpH|7FhAlB%`6^>D2IDY<*jnZ4_dV$GX3H?wR=F2HtSV&=b#@D}>(*&Hv=&{L0BvL-^+e`!g-&kqshm56ouuxBt6k zvA(vdVEgxrF?{MjBNuYIFP2eCdtX1lv-tV;v;C5nZ|yoVuj*IbL_xQP-b0pWXO>=! zRxFot$e(J_{nAIUa=pL;?W;Syt|&~rz%Xm;&wYR2=HIsed)R(Q>duS`hNgxV#)SGG zhvn~lwZ8w;Z~3pqOvWrT7$!3uIl@@r5kG@v+ncA;6=-Dd-P1}@^#EAFDu&R(pXkmq_)j` z=yRm+xld&6-;?uq3Gwfibvsa>QT}e{^Ih4eTpIZH@J~q8(J6I{J=tA!P=e!v$g<8( z#^eJpj~Atw-zjL``~UCz@?|3T8Q314)%u?Fq`f3@#tiN$-Z4ksw7oX{8_9Q?Nx)?l z*Mj$@2i!fL=oKGk*y0$LcI@Xj`&V!E!<7^N?p?_AU%6<<->Eh~S6ozP325+O&@l;F zVn0dh0;89d8n4_|u?v?SCNA+Pm#H=Rl0L8U*vgL#N1NNX)Hnp)D?BdC$KqkJ#EOUc z!oi+By?hH!Ox{xXLU3O7JIi$a!#fO2_w@Sh+tdG_L0zfwd4|Z6_Tuxi8L#lJ{JnYp z-!oTP-JZxUSi-+SLqGG-7K7@F`PCU-Q#yZS@LV}>ELtOCVHbINLiz=cvkhMYAD+CP z9bzEzetSaU1^&7Z&EFdNYYy19pZxG9;lXmb8uoqN(l45yu>aATeuXvs`=0-vOZo0D zz344^f|dD#LfL80)V^tI&R-u{v#RC%nJE0)OF$ zHOw~hf07p24jp-$>PU`$QDwaPd$ni96NmMgnJ@x+aM7hF?6AEPfE}9CjSz*q@ zJNy3gw?=(`Ch$GI^Zf1cXZu}aYd!usG1`CiG;V0R!f-F@MaUvw(XN_he|8?JEzb=) zXKcF8sC2RK0gd{sS3H80J{m zFxN0J%|8U%%2f5bk$1(OSN&fOg|VHnxHREd-p@SKq%DjM4)=~I+p6d+Xnz?XcIn75 zHNB?_df!Y7C+^5#U(z_sZ{HMFdFHR5R~b7rb1pCp$eVX?ib3IyZ;S^5`7Wu*XB?fw z{4V*puy|Vgm1R0p_hRiOzG`mYj=5F0ayln-Uw!q(y#A1i=+nDQ z^;@OVb{?>geteMeHus9dOvl($@|6?=CuYtuN%(hpE{ny+`-}n!NA=iVFtDHGlmKOK ztKU)$2P8VUS4^02&yIah%wYuv&Ho$EGn!->@)^mb+WD$jUlL@v{GLDJg3yot{)Qh7 zb3XmrF{QP7O7HJK>T(XQn=aR~2P?&@7#B{s)G+D4#lH%^%ZueaaxXFO`TtS=|HCt? zTa;e8Ml#xNVS2EHQ{!UOg&7F~Kh!U5s%W=)@#yiaiUzs=2f8oCEqnFP{mI+s(GNVw}pR9`Luf&$933)ofFrKR3Uif{{sTPyPyztLpP>F5UdlAR>CJ zoH2=wLCA-3iM-hxDPEt2jgM2^H!((-a4_^wpZ6tEk71H=Y^Z_4f!5yYZ#UDe*_dW@ z@HbSlyE*-uA>|Qris#2mX?0zRzJ6{AMv+yP50qo))LFb>F#mXBcKM0+iJeP&x3~u} zXT9QRSgCBXsP6(x6hlOVdHy|{a5f39mlO4TCN^j`usO`jFkx9@`OzXF?uYV*n~739 zKW-|eb-i@mt*Cp7DS6SmnT%D3r%2p;ec(LD{@3@X{*SGlDcbq({hOSN@eYsq|8EIz zoWd>Nuq>j??5QyG3@xF!^=(go|CD^fTp@Yr*V_Er)91pIj}`YE=5`Rws9~7-+oVWJ ziC1R1_@s$$9?ot-$|v_6?yq~@t-r5gew9yD+@)gPW(Jx4KaT3lXzXzN%Q|PpF}WET zax4w)%0j;-CNO1fVZTy)N%hB$2C)x;{0`kF^At+wmv?X%e<-}jRKWKre*xc>)_2w> zf-~5jF6uMjlu&$s>GOg5OZKj}CNF2s{3IiF&}ZVE3;eyD2F}5cKIr{qs(a<~YmWWD zPX8Ngx8HkpfPXLJ{^dJYCp>8{Utk_P!63$bkNDR4>-Me77w?Rdn7*jn&LLQjYql@j z1Iut9t5^4Gk{CX_BwYD7<3P!zJy$)%GQ54=cPhY;@fDaIeQdCpLT0$I@y-nO{5qNAlcEV)z}saL(Z@+uqobI~g`6A_M z&+tl8%!iZn+zQ77JRTQ?I=cTWNlh;bushYr*1+a;t3m8RVBDi>wga}WI@KDVxk$da zwPcRm3Y&JxNo>zfvt-ImnZIYz*M)noh`TW=@A0$MJmMVuKSJupbYWFIqHL%By+Zii#_RVn;;{`z`lO-E@4;5^WO)_mWFRr(0)Ce)DFtT)^uU zWmB!c+4O0)_MiGDuiW4>?QZ{DdvD$w&68Rf`FRaCKl~`KE_G zI`5iU=-K}1V^6jOZ)5cjN2Avqdl{@VC)q!JD8p-`oPX-|+_oj6yiZymzdJ6K`g5s% z{moTJ0t$a5mIZu2lYe0M6YpJn*n_9dn)L14;}4guS>+Qd*6Z&(`EJMS!mF)Z8~22S z$u!=)#PEYnPSo&aMZspV+OvBS7)1IU7B9Pa>B1r&hJYk789jx+mb8Kr@@U#Eq1=$~l(-R~->e%b{{58K9Fyrr^b|pWpt2*vH-sX<8)-c>p zpYO}&aPV^L{f*Ar?j?DXujfuWZxMgafbmMquMf^A3|U=%@8G+Ch|%_yy;P(c^8@>y z#QR=$!fGqDpYJ*(b?>(Dr!G06X}h0p{c6W>?~}?aPcC;6^=KZ2%?I9In^+O7c0f>6 zFMMJm)7_i1cAnb*;?u{s3XiNUMR*zP_c8DK_3iBQbg%riVLY$+&FZ&&GFq;4bEm5o z-#Mj%DV<9*-X!lkw=Ddg_`KpnQPBm#^2LqLOn)1g81}b6aDRKe&?`J%>W|dD-*I0* zpHA6uj!F9A^~wJ1ZdO*;HM63_zi9MTO*$la^yDp9=DNw8 z>bXn}^8?%V|GK*V8~^*g?`|EEdw5+~%XI6S0FwigLO%pg$uVlkc=$LdGwf!|M;)*5 zYr*gQ88-_CXnxeceBedX;ci){`@s$G51BtaQ-1LFe*Qmo75aB4|Mh*_KPhgn!nXA1 zMt7ZJzxgOgEe>D5`5*&Boyh{mBRMA*^_CrbIop&gB`4mP!REx=SNq#{efggLt<#-b zeqFIUW5f9l51CCd#`*_)-=mDV1;t>G-5*wDIWPWUiYD z4Er1|9$KFBwJlaka8rn~?Xgp*Up{{FPeOY*r+QU!|y zEo1Z3Ti3ZqZ~8DV`+IE4g@B~(Rrw41-@bntt}Do#ky#mf*l8xmlZ}th+xkB3c$7Ms zF`%Gf|NQQ?w?8ZjyY29~?zO;rWvy?9F2{b?Jnq#JJ<6fDUXx*RnoDZ^^gsWU7f9yc z{3jS)lNdy19jLT7zrCr|bj`di zvsUd(WpKa1|29joj)`@XFQcVxYp=MeZ1LhvOy(XZ)?_mj%*tUqzjpgj8@=5|`uRPQxXJm}Ea zw4~wlzwNnOf1bBn`lM!3@ z-y-#Dk)Bk=%lDEFVV;w@*&J9Cm_m5o9ZP&Aw8wcL!?%TH^@sfzI9v==u>G?Aa9sSS z`c>BF?ECpQJX*S6Z?pKOUb}eC^{f?Y6NH!}6ypz^U%Tb~F_zT+HHuFi8s!2QUf#d( zVa2qWb&eY)f6Isd-^<2Own=Q$S%#W}w#p5R1qLS+)B5fI7-#3*TrpGLF3y6TON5>E zLXEYR)Z3rp`_^++AAIrg;lcT(QBRr}D?U`)AE+~ZzBN@k_wKF#XR36a*&3OCx-qug zd!}n2y8TDCmXw5}MiuXYWVP2z&#^Lpn7SayfKkgc^>WmKx8?WJcYn88$oXKGsM7)m z!GHsn|7P90pf>sc_0ZcZ{>o4Nm!P(K;rf#NH?lMQ@AQ7{J38&wkHYDZnUQh2((^)3 zwIAu8%w+K|Xk}P+<-zcrgQvY+SgzDf`~S)3K=vuih5mYy3=7l?`s9}0+Ml)jYX9Bb z!|ky*zV=iovT%K|=UVVGFXF%L?zesMtBO1-%>FX`$v9%bEWx1o`qF%#qLU0K^raU0 zEQm>Fo|bLDsxj*8(1d%oa)L-adD?+~)VS|K~6HnZ%|1({j(>_gDYV zX_&w2=`6+y-G)7XO_woTSG~paE;Tp7+*x~HAHNTSQ0s+!jfN-pcb9kGEq*V)<(cH{ zI)$%$U%g*if3D&E%URiM4?cf=(EqPLyS=aF?Tt^1%C^`zb368M_#Bw5K8Jf2lf~a# zx6N(}*Z&C4J-f%PwDZ>AxL?e5^-tF9sy)hJq|M>%k^>YH_*Z)Mys_uv1Da!J!{_P!pG^^st+GJ3R}pWJoI_bB8SN7xBkB=j^EH;_j%5#YqCEU`|Y38 zEMN6?Dx1LHusG=xDh{1y!Z#QHWb(h+Qg}St_w9}YEQ?aOuUC3A%G8}b>;0yD|No}H z|GuyI+wxAup67ruqqydE`=19Gj9$y6vJ|eJbSo!cr}B`R-WzGvD%C zd&~b{G0VNZ@=j(4$Y7t7=ZouKY|3}um%%WPE713Vu;ynO;dbAw|65v%1pXat?EQOwJKnzCGq?XqzgMmP&)WF;>|It_wL9?va2_R%c;+*7lX6RNlV6wisy7jU~UeYfCq zMnh-8zDZ0C^Cs5JnEp2RcFy!`Ya@1iU@U#B8`dTFW6t6Q?oZi&$lSX;fBJ*)pE3m& z&$AhB%;PLLmeR<1fZ@->T9!ZUkuzk=?*vr;zU{a9SK;&3uRoZ4mFg+U=1)>OAkeh` zz(mbIDFF;$`~`d~~!yZo+4!2j3m~ z=j}bx?^Vn2oO?C~2 zWefagcqN`!y<;irz2lx@uzZcu#k9^TeJ-mV?k&lD=J9RstmsP#)!$8SZJS%2^ZD7{ zZPn$Qg`9RVmodpt+~z2E=P|>be=@9l>(AY6o>%^N;psp86T@czZ+)w^P~SMco*{+r zJjaf23%-9}lrBGgv%mB7e9oFPXa01E?EOA%x>4Sb9g^D*-IO;BiU$x9_`t z^VvLRI3V}s-y6nvk`4dgpZ_O2zwP|-`TXI}_Eg-H4g9ny!B(S1-#Wd%!oi(UZtu6K z2K&!v-y(1u`@@0*|-1MoJ!t`ozER*Y^yuZ?e*E< z{`hCf;>_1m4{`lnc<`5%%lU>`|1WN4-({a}_q_g#T>Pc`pRZpuzRvQfGSoTH}U*k`O)q5B+i(B)oBwd-##uYf3~=2 z{)6)~ufI$Dagv*h!AJg2=@*&3@A$6Vz596Xi-|M${g0pUJY%um2`-r>7cN%)%sw~s z`rW(ACo}eBi2eKb@SW@Y_SbKM4m4XCPk&KcfA{Xp>Wj@Kf9mVc&U|p+|Nm?D{dY}Y z)CH_%UNs@|_>21bx99g%YNXK-oJ>c zvi@(!!nlFIKIm^B(|`NgD`%}XZV3Iyz`(%Z>FVdQ&MBcOGugm`Vf0ofrh$(ld@k5I zdaKjutxlu2I*s1yG~I)hTK8R;SThoknkU8okwN^j4?QTb)L4 zb#foQ)oJurr|ok_Z*>Y7z13;-R;SThoknkUY8buMNo(|0r|qM+I*s1yGpj9>NI+*(|ecETb+K7-s&`ZtJCPM zPNTOvjo#`sdaKjutxlu2I*s1yGpj9>NI+*lf&q( zPNTOvjo#`sdaKjutxkobw>pj9>NI+*)99^EqqjPZ-s&`ZtJCPMPNTOvjo#`sdaKju ztxlu2I*s1yGpj9>clX5tJCPMPNTOvrH$U|Gpj9>NI+* z)99^E_^tv%mcw_elL-R@Q@Uf2yAvY=L(_i{Ze-~C&&a^g^PhpC4a8^!Ga49}|AQH= z44wa*7&`wqFm(Tir~;{kU`7UpuK$ftb0#o=jcjLV`QOUW@V_B|@&Er;2B!c21DgJ~ zGI0F=AMpQ9!2kaNEewqR|2GDJBw87o|1$)%Gc^&H2iO5;D+gA z_s1DX0f0va}of_%`I%>XtqU?T$qgx|;j zmS$jsa6KCOm^>JEHvDJW*$~hQ@*?VV#K6GB0Kyz>3=9lkDz5xuU|?V@4sv&5Sa(k5B?AM4OKOB?ny)W|76StV2Loe! zCIbsd2?GOz6zFm?2Id8f49s8=Mh1ojOfXp{h6T(BHb^D+kFBi?3=RyQE{-7;jBoa` z&yYP{s#f*u7^g&n!3;@;<~hX*2N)&^6`xz;8MrA$J0danCFdu74cw$NbCJs_vt|iLA(jpYrSygqm5+G;{`>!Bt>fcI=M>JK@m=09 z@720@>(>2Ro&SHi-&`xzq=NzmEIf?P2S%yUAfQqzSa5=)!nJOn?L7gFmWI94TLU(3 zDRMuc|D7x1r#3g^?+amJ)qG*OZ)_!XQgq{;6AAO!0yb|&vG$7(eY<&TLolS)Nnn`&1`c}RW=BC zQe*ft=8WysJ7S{Y=D!WXV zM~(HC#gz3cI;z|8A|lu=CFr zZrilNJGOr=?(TgV`OmRHo>|=Z?A^nE3r_f-x95wu7WvKm^H0#(Y>k39uO%OrFIt~{ z&U|mkXRG_4p2ts*pZ_O0PTsHheYnN5x{BiS9QUWsKYvt4eAjW?*D=ozUB6k^sqi3f zk&tGe=wf-6U)ihw6hD0Y`R?=MO3l3+mA`U)tNi~m_tzJxnUIG5?=)L-7CWQ;tW*2URrx$onc= zQ~SK?*S-UDKkjafwcEIJazp%Wh1QlYFOM))?|ZL2{~c5MIiFKpr>2zdZ#O>wRQ~1W zk1^*Tf97ugV5-wRU%UDJ=68`(wzMoU>@(;yl?7h=P$ma;>`gtprosfd*v(F)6OM;$F(>%P(Cq znB!2{muStUm?-|}?4`N46lR_&v#d;6|L4)p*iEIcHJ7xvGI6o-{E^tf?^O5ZoN-#g z^XA15@)vITPm^Xz5XzyD+|UUk01=1V}g&rBm`+h03h zT-2ZDQNnnl&Zg?aTCY!k0xX!)W$yjbSfDD+)aEc#=>ZG#vApEa9rG^*b~jJ@`u(x> zhPX{Hr(U|b*UfLv4V8ZTeazv3yAQnQZe`5tJ9A$2@uhp&JKs0$J}(;`!@_dmlUP@e z!$LET%>7TQelBdky-qQKLxSnKOM`Qx2$#g?=t(CX6i%$0Uh+!((#?O1Z2muy zirn}$MNd9G=QRt1`@5fp`sJDHIDQ`2yZgw|<-o*K3U-G!opW9w@Jvrv=K1^2>`q_n zeC&8H?s>JY{dHw9^8CYkIme#rAt9e%V}f zzgE{M{aJ5N^nZ>upVuEXi~6kguy`}bCv67;lpdHci*N*K`gni2Kh5Wrd(oF4!JoqG zw=%ju+`ig=t;38zhkvhe{bzVthsS`auY%1Y`m`Q@W6hkqg%;2D-L9~%w-NmLCSBa4 z__Oj1|NjCW^=a$1&Uwt2h%{i~X$*2u(BWBP+^)!BqbP(1xw2R@v>7}d z)5Ry;kv-V{ed3+j=W5x?V+&I1*+m%L9hhgWOug3aV7Kp`g-r4N+&vSY?b!P1M)LdV zg35KWTK}vUKFUASyZ_@JR&d?tCC+H>GvVZcy}{o~U%vWh*2eZvbRYXY=Y^kH8Lu7Y zWK7)jK6`)3>)1BcVwaFMSN)et&mX_)J8byaX8-V4_$Tf7$I#-# zf%D3LqBUMtMLz^Lu{Z<@q8N{@ypkrt_pkZQt(Wms+RAWIPVp#}V@Py7%J_{RhVjtvl?Kj>tP*DFfw;O#%xP1Tt96 zy!>D3r+$6){`6%3L%AEdm=YNeyxsioVQqUmCnH~{cZaNJtdm%owgAWD7vByWe&2bK zqfI|A%I@dMN~3*mzpIG-XEd4xYiM}n!%p;W=au|aWeU98`{U;m$I$5+mBzhPlA zVLdMgH$&nh{`Zf~xW&5~lvi@^J-^Pr*FnO0`+19c<)7aZtl~H8M0}9+RI_7mx79T} zRxjmo+n9x?QOlVj&Cfu@=dj&_`Kk9C|0~A-|COciU>V;tZYCCW9UhAfJ^}?EF$r^o z59@u<+dYTFqKW_gZWHmzUv?U%JnfF(!@TdO{PbB*+6!aW@2#^Jf1OwO=f7&#{Aqv1z=j&I_$fbF#=k7+{K<#R|3m*h`mb~RB#YVg z*YCZRAAB>IkkdHt zUH#PF+5a8>y_|3MSnU?uhUxRya~9aviyQy{VAroJ;-E193Rg^$r-MSzRIGx1G3`=d)`Qu%6^?7V8mZb%N(6KJ%su%CKM>3Cm#;J#m1=ReN7#X8~6&Zpc= z9#+jid^r@9{<16&d-;6QD*LA#^Bs2lt$9@bWd0=mnuldGEgo7c{7+4L82|NsA0w#D zncl=;?SC;t_|0;;0}~qbUtiy^C@b5@KUE?AyYI8Wiv1S~3)=s_bv?k+5U0WQt|eY$ z`}rHWDs}Gv_WgM%Ul--Z^WQ4wN1x%;dPf`Gi=ZA*Be!$IHpYn_GQrF9C!H4apLFcl z^pwMGWhsx+I1TK-*Pc7Sd;OO`uUCD#!P2mAw(XxsJ8F;Jk@;x+E%hU>>8H;4zx4*a zPyZj<5&GcD^7l1wd%$IU+ksYv2X_{!Pv%~-^{Lj(E8kY_+51gl69+eA?b8?g?$^#; zf2%~8fy=!1M{D7d`Tl>7=xJ}ie^13c_Vaax|Mw46>`(vqo0~anWm|({0!NGylZ;Tu zadofc%e_YF@3<--_r{*M+|tm^a*d^7bK~p&KZl(h*gpSOKQZa({YkfORr@@xH=8gm zi33vCJ18oMWl#L|%lgTt*4Iz3K9&B+qt4Q@|NhVZckg5VZ4E8VVLCALtW2Hbj`{m7 zuhvJ|{W(!G)AqZ(YGkqQnvnBnj`l&*FdKj40gHkiSFYUC^q!tKF+47^z1>p$&|h2g zKfUkY?^auvN z0pA|ybrG9_#z$p$ECkLU+>++8myz#62x^;VCj4;!=&1ZcWEQ)`5{D1QQBERo+ z&EWrmj}-oIS^4+;XW7lC!M>2NVYy>+@Yb!_sSg+Fe!7*N{n0>}=^XRNEOCZU)&E+0 zGDE)aws`T={?mzynU=42OMKpc=EQshP;CTmFL1Ops9cNLDS3MBe(lrK*Snwe;jnQ3 zJcB`i;Ry?)`!7AdXFu~vM|{*DyK%=70Q(OHznuJjYg$Uv*q~w6bfPWJ;Mj^2ygl z@yWS3%|BRsKlaY^)~RKSW`SIySGKnT5dj01Ricd^Dq5xjOv`*K!ot>-xiwzxIwtvb zofzYRiFVrOYqz&n|2v|jEdTq4e8R-ee#xK0THN65IK`4_j-)`pxyRiNk(WxJ#HXHb zELrE4=-Y6+Jm%peqxCiakFGakJRrEgdoF{(g#Y>fp7~y~d8Hk3&HSQ$PT4h3nZxM3 zAV(lz@qr^LlGY2|IY`Q{7Q}+akWc|1t0P>#Q!-Y*k|nD=Jv>{?&=c zAD*!=PCPyRA7hW}v)QliJEm>~>lSTsc%ZojCIL74Uq2dTsVPd-VC-1cUBptaw}BAW^4 z`5&GNUnB4!MB(A7uv7c8w-mgQnr-;{-NEDkH6r)C$WK&BTJ_&6vvPGi*ad$T4?MlI z{9KJ|*t#37r%$l+gqn*y(2@(;U-bW(ce$Uyi4$wh>!rH?=xn=J|I}>X)ia=AYm8&b zcr4n@JAK==|5}%qUss&_=Yd7z#@8m_?p<<^`cV`4E_@Zk11W>~KMwQyw%dPR@aun% zNYmm#3TSnr)=YC*Uv7en8l!yk6LmG+*o z&}?bDYqesbI~i}lZ1 z7sdmo-a7<$zL%O-7-jc$JNnc=hN$k=vHER@yvGS3_WlC-@I3574K)>z2Pzw z!@+_l=l^zbPgP?O$y&2PL4boX`Ph|{GcL}b?r}uy*UBB?x3p3~rN@CvB?rX?+ul7c zx?gKt$ll6O9lfQL~rQ$u!$|1uv*HDBd=?!EszbU#OL ze7`jm65^ko6`b!gY?YtlE<)Y_v zw|giRPW}2%HbzXE2~-B(b@dc*$`EgFkYc%J!xP;QdE!7O;|bY5_d|yB13QXm#Dy&kVqsvf z+A;Ca?=|Ue@Af~H^7*~{SQR{w4OmLFDwHm&Y)-Ei$gp5kIHM@)_~WN;Y$j8~>iO9g z*Usk}W@i56uyHt=^XC4+6i8lZYfy4%KCtVS`;#{5W6uQ&?>zjWBJ+9DCUGt;M}~r4 zfxI~%>|W29%3oJtXJdai>GQwh_1j#*1%U+9a=`}%4oZfBdeJ57LUYRx7)-ZVXIbk% z^L=O&!-V@R580CcR?L~|DJ*}e$^P)#@ALVm%YuU@f#ZwP1%p3<8Qtv0D-I^XYZ74cst z)-dPM4wWth)X85_Hg_YrYLFCR~uU;qoF~8dL|I@=w$>0K;r!kJD#)q@# z*rZFhzA0RiX@BzB>;2QG`+_~07^FK7nu@(XrmNQ5%isBY=jT1gn!r&3Y7v?-U17SS zl0W(Ny6nTAdO|L8g?lE+fBv`W>9is-2ALP@9Alh6+%Sy@d$%iFYmSYM@mKqY8$s=~ zwg$xu`b=|p1-g5uw|<`X(8`aKr`T&o{;#vkWc;RWW|+{wK3hV3b6(_3%fD6;Wqn4B z3i5i^W{|e6MhAoGvEJVA4`jkQN@Tsnt@|FXy`z6SU>#Ef^IcPyg)>UMJ)956ru~fH z_I|nO9dOyO(A{AxLxEKJ?_S}LAO0jVgv%Xww&8of`?IS2^wkU(#5ec}B<$T(bX+!A zMJzsL@Be)dHkCj_X0rfC7^jSGaJv3MO9@tugVuG0A0xL#e#WB%~9|ijl|9)5Fd3@s}y}PZV=S+Pr zaCD2AdMj-^a_ql8&k?U3Rd&<9@40#YP1W% z;`13<8!~d5V(Nb8RDQoJJ~41c@*TUk%%{vkniw8PDaoX#e0+2>V^86-fBLt}KQH34 z23CXf+cSfA2taZY?l=0iS)dGVE!TJAG&`y?72VPvc`G51JJ6lAGErlm}%}vj~o%*!z!1{xY$1}eCo4mq< z%RX+t(4N+Arvoev-A!wsb>iJopjdQC7g`UZwHAmy~?`Z zfBL_abmu&o!~EPokFjn)|M`x-bmM|MEDY=>$=lDn6&%;=TXb>VrhD=WSN0jO+g~xu z*}5W+->&NLtJkSdPE4#|J@ssRL=bN(lY^(}aaQrR_q8fQj?cHUaxYkxdTEL048gk! z?BCx_J#upLi<{5v{$6u@B_Ca9pR{pifx5k0T~ws_=* z1(8Y{Bh?t591fj%T;)IeWyyyY>0D3Zql1+%FZZ8b_}GGJimBoQrCE1b8oC+Qy5uST z-2C@gzr6lrb^mv|p(avOA1cpQ`Tb36;^gHo-i4*yv(c$MY?`kl;=*vBztheAbdO}P zBEy?wrpqgrJ>Y#hHR2tUgGBCigUCHsE?>w<&i!N0@WD{7NBzm<{nqz3r}zK)vfO@Z?eFj2UwX}5udThjkm0S$+4=cS z4)MK?ybd;U(*u{^nK%<^!>Y|pUkfp3Ai@rX6=)#lUgcQuU%3U_{(T9uW%!C$ML>D;M9KXsS1NY zi1?@Pm1lG}Tw1d}I^k74d+5`nz6$?5f2_RAxY&Nx-`bid9)CVBIM?&=aoUsk%G^9t zD|4ohkHMc^KP@+Kc)Xui+U&%qr>9$=%=b_^cdo_hK(K%3nR%`H89z2xeOnqjn@MNm zoIg65S*xZhyEEK~bYf^Mei9#MFwx+&sl}!9{f}S#4USD-=p;C!PyPve@sst>cKj$f zJI^+{cb-wqsmo1@0jV4lK1|;5uKdaQdH+2ne%pRLBD|^k`@2I=-WxQv-FC9)2w?cI z$FS(>)W?NWXEO!}UJA0zWcZc2Fs}2AyYkkgKlh*g|K1)ZIe#{P=>Ogs&+qqH1w2`{ z^mFR;*k!i$Qhy>1SXS{e?)$Ft@7lGnw?8NU>6f$By8rv$_mUsGZhesW@GFR+!)dz<3=b4m^~{j__vvK)$w{hK z*YBU$Z*=QMR$(HC#i!*L=TH3Knpl1?JeXs}+WC#YPt0sw8|m=rOxK;@X$xaa82&QK zh%qRAC^HmI(ibb(vhl&D8s*PiXOGS0{w{ z7u611@ld|~7-(ej3d0elWW(z_;=a9K&M9Qsaj-D3ASA6``=M_k?*R)Y@#(^+*YK{{ zQLAvE@?Y}CtB-AL|6DxD|NK|6)#R^#elwh%q%Fp1ety1_!P~ewx8{HTvpwhLqU8T> z|C+D-5n)gZVHUBOte!1_R}jzFjMk?sp3+j681a79Tp zZkQ}Tsh;=F?{jl3gL~)Z%&Sj4qqDV0u;7XR_iN`)@@GqzeF`p^SO3(>Xp5=x@`|{{ zTl%sNHg8WV-t#yqTu#n-3M=Q-)oceEWgKKp+W7b0&@j2gAm#Qe88{~I)85`4>-<5Y`RLc)8H@qX{i0&*I41( zkGt~6Xb{1cKaQ?*pnp>B=tO__{rc~c=tlslG({BI#N&D(wADJ_*{ZqYH5w^$C zv0?9jr+2mWADZP?G|RvK$CLWl4ONG}& zXNn|K$*1Dr6MOYT=ajrZ9ct10r~C4Z9A@sL&JCMmKHdF&>9G9W-$e(txm}$Uq*RaZ zkUu{2kFZE*W~#DG$femL6C;>{O-`}>R@!@T>DP!!_H+Lf%&Qk$B7D$|zrMG(*Xru| zjujSfQ+J57m)lKs%8!3n%P()2^RBl0y2*>*?wKqeybPjK{R9eBwX{E_FFftbP|#p( zSKYn1u;>5X(-EIGD*xAL%X!xHC4b+~v>W-qf}*2WxA~pBweyK~5~~Rdn*`&k?{{tL zpWnWJqQ1d#--S08EDsKzsJXMF%IBcP#NBs4UTA$5CUkxJYzBu5a|9kR*xY59=rP%Q z%Z?Jkgl5a{`&9n727JF?`~B{#7t2e$b5)I5+V~i`_TPDNZ#wsHiJ$zk-)ikN1sJkY z549v(GAf*LZT;rG&pN7)sUds*`|4L$G=qQh>;9>=Kl?c=<%YpIlj0}y&O877 z{%Ox{v;Q#{`%k+voM4}MT#w~>R@S6d^A=7?Tew6}qSI_q^?kh~A>S__T_5~i-lD+a zk^qm7fJUCM)W4(0=kIS_?B4&%r{U4GWAoN=Oo-m&A$0ld&!0&gp92;q?_DwF|CDZq z0zDqX&Kj8|Mjq*6UUH04=PeA+3fgm@{o5;T?v7mG(38gzrXR(qx;V<+v@X8<*}ZnB6Zwf@7?EZLAHUf zm>d-Ea5cU?{o$c$z~TNzI74N%@RrK<1w?@0n)tF^+UoDT@B5M#Nqa|wT& z$DSmUvs+GTEq_pP_~`P}avrH_40GI;Jo(=9#Cu=onufLpMFF=4*~t|)Im{1sbZorM ze?Rcj@26@EEeA^)jK3+)ocJf%j76aB1f<7nz``cdSg}RyXX{D3J@yOwrQV!570F;B zJX`8V@7Fy=GM6ki%awtrve!Y7PPT4 zo|E>T#qeOk#v6(c>^5nKt(mZHo!;*kRtZ`*eu=%E(Rn*v#q{HJqPOQw{eG|d{T#p2 zJ6bi#$9i6V^|8EQaP`WS6YuWse){kC`|0+-H``xUU9a!rAo=1`M4fme!%j7hM7|`i ze}(ThUFtpM$?!t{PJ~L_E`#WkU5yNLS8mz9{k4pomo|z(|u9M`M(br!RHYBudX-)?1p`t$kxY6qi;^BZc|B^l#c8IHT_ovUBr zt)F?m1k|KTU|+>N`}m!j&KD*Q)AI_aDj(ptJz0NyTkfX(`*xAr^X5(v(FtK^dUH0u z`t8=Jo7b*|mFl?q9@u%u$C`0sUd3%|t1tT+9eNIFv`)~ked+z_^ZfrYZvAq$36=aV zKXv-K9TXOAKFf4(XTxo;kC%#s8Gaozn5`S$d~DzAlyp5QMlOaw9qVIvhn2m%qiO&9 z=J}F4Ul$o~kv`4WXmKq^(l~F9&J64DsHmtfwGVbX7}usSseeCsI@Nql(mNw+|?6c-*O;a&~I?sY8{YO%8J_#&AtgdG}dR?3cFg`{!MC?;V&; zb8Z+&nr4O6Prtph$f4miBg?_eC9yGlOYIl;JoTED&dj&?mT^`ZduT7i@p|)|8w;MC z7k|u^BY)6MeqK!P1*fOV2N>rc{lFi##zFDRi;2pcLI@l(`R{IO2-@nAl3b91_PboA|)j~-dY zWiNaqkZ^pblGHjGQ-;=t?*`lpWL^iA-`L$ zTnNcOU@D$8{X+Hpw<6+=9oOU2Hw)N{Zr}6Q#`cTZx8l%3f58j;9C(+1zpim~ZKLg7 z(3mP4W7SXPoBF$dWxaivAF)5~^}fQ#ZnOW#3+6jM)v*faV>|#8PL5>S1Rh^w0GCio$ zevJ%hP=b%eB6Y%(d%WS7^Y?sgOL^Fm@oG!vCnlSJs*^oSe_dv@X0TG`{|RD)l>Pyemxd(kouQ8!7lTZ$Xqs$bO#X$oe&gBrJE0Er86qTNd914A@iK)VOQuWyQ{{3mKJm$ z2y0%v(C~=dTeAd{rQf7?Ca3E>U3Yw`R839I%x5i3@5GH;PCq(zaEngJ5y>x1AD@<= z{Cj+jxj{!#-;UMM|IKgQbaZFPeN=qT?$*RY7Q^G;!uNfhcI}1>OZzohT81weL zTz2p0-;&>_U00-?o29z?eqHs2?o56SCMMA%rcbpP=KM|VbrEu{5PdU|RUqN<4)N~a zA!ltm`Cq79DCgpA-&j=4e97&wkrkivs&DJ-W!)PK47m3$&;9XWS@H470_vHey&JE{ z1~1d_49ZB@cXNWnfyWCu-dWa8w240?E??zQ_p$!}N|R%aOs8%wFVtdX$vGalfAzml z>z~})|94lx*`|99)r&V6JU7;q*sj6k?l@xqaL<%4 z3ty#H#xb3=|NFaM;qb%9wq3t0CO!Wu8^E8wf#b}@n96gZERQxn^8XiM_UBx_Hs2mQ z?nX_{)t~zBSFOI1WLvr1_k+PTA74gh!_5XB91Grh{0aG4{_yXUAOCa&tV4gw{C{r1 zaQyG=*|SR*%18bG9JT8I^~5*xzu(yLUtz0nW}5WBkSS@L+*4LfVQpYK`d0m955sT9 z^bh_YT_5Q`a1{6-|5$nE6GOX>a|X>V^9~ty26f6Gm-M>q!+g_lE{k8#d_S_M@=@_V(>~MqXSJP*z5TYIgD%y7aIF00 zzhA}o#m(}DAI1{Qc8$B9vGcRYy7wE{Z(#TIiFtEw^SaD6;`J;)TbW<~`5GQKRhXUs z#D{5OmYrR(U!TV}FMCk<(($TAj)3NeIR$dt>L+qARPURtQY7?ij%D$c4ewW_o;Gp* z_D+*$!|`}--UE}CdYjITV%WuG_G!PzowwT*T^HP8Y1p^_g&G6T%kIhlH|+0lNo5pT z-t?d?(K}hWFlg#|{!F3I3#unOS6^AH-#Jh0pS0mQe`fnE#v5^8zWX1y zU%lX0x^$EQ%PGc2P;=$blvsCZrWf3E9sT|@*foSdlzhC=G{L^LKb__A62YG7k6y3v ze_kjeAJn_>)-tVV-un)Z?7kP;wSD>1pDwlJ^``_k5k8L}Dj6jQuS}Sb*<0bqdu6@K z6T>-GTWfcpIlA|=n$LvN-DRv%jQ1}4C-~2?=lFK_{-3MyQ_H@b=+}=@VPbk_Icdwc zH^rrk91eXd+q&I*(>k%j_A3Y8W=oa6Y;0(@-tctM8hyzn<&4b7=BnR5+Wl+``zi4g z(zm!LdHRQMzrwdVyiuKNVZ(Vfx4=1z4_q;=-L=HQX||zFK=ZD$ z1V>00gM-nEIlDw&=k7T0+^(npfyRV8^~@7_+h5Js`p4s8!4{OxKfh)DlireJg*&{j zN{C(Iu{(D8=I3(7rnr#x39a z@aR{G%3qUDo(t=;iW`i!%3H6CyKm(;CuEXG=~s{P>UHmG#tt<5t zSn%xW8^;a>?%&Z8jFaqbf9?JE>-DF#`L*6=haIl^zJF}V#Z-Oab^5L9j+?Lfg{@BB z=VWP}ci{I6!3#}_0a_d(e3@1IG8x()tewT7wwt@frRe8-g@0l)^A8n@U7nvYr;P36 zs(D?Zc|*Zya-f~Wkdn;KhLdGzFC)-Pgs z#8VYzs_?$5X2Sa!R-xf9nKCcyryUghtvO+1+nj_&zjtP_{kC{u$z@jgQbbF} z?XA0_!ULP?xix7DIsx7jCRqGEou1&$_)zm$G4J6g%j18~TH@d#$-(3^e?!eqpJNdv z_m%tue12C;G5&h}|EPYQV*I~P(^FM9NS|@I&BWd2uu)J$o$)}eUhJIqx$eFzTOC~* zp8QXpaJ{{FNj2B+862vHU%otkv$wfm>K%_iJbU!S_w@Nmyl^bN#k=}{lt6@(_u{mR zo7>(tT)(`q<;1*g4!wSlK4-sH5O^RrY3^zE^W7W7{XZQs4zXCU;DYyx9TT0H-X-Su z{EnGE*LM5O@K{xL$6M^hvlyoJ2q|~g-`3rJVwrUQl&|tX8n!h3uryxyTEt`in(qJ0 zJ&wI7%w8aKVD?WRw(xB-YK(!#vFD%tdvHK@^Paf^asl=)el&mfDL(l0yu|qs$A;%$ zg|axa49_$?oMiEe^-$7-kgZV@>U2$%{G9|6-q&9%K7aD>{@=TeG}T!G5;kA3XL_@+ z*z&$%^05=O-|t@ke{_1qv{`K%zC94yy!ke7W4F_SIV=rMqEFJV)<$v9-M)ph2>WoJ`br@De7xfpCshC{-%5X z-QzpTTT;A*-21JW4xMY7Fjd3xk==6sLo?2;XZ)z>e^sL3&K}`e%~BlVZ$b}l(DTY= znfJW;k7de(Mv3WntJkk_pUHQ)qT88qirDw_bG7~JUwVJKw*F7of+<=jN`f2?{*zqt z{>0pfw)3| zz|t$YJCHA`q)CF!`+D&X0-!xvH}1-i5 z$!aU#-p2Py1^bg4jeaP%&A%oivplS^;>*1Y)q9r(STiuX`8ge*bSBd=W~RXMfG}Aj zhA>VJg}kbEZsdH5!;__dgw zk1h3pZD8oq<}VfeP7Xb9wmx^upCVA)bHYaQLk!!uccz`&js54GGcofLX)9N`r?G{@ zalMts;`VznBA0nCvu}KRPx<5P`})Dh`=_5fU*jhC`vLn?1|F8+7na&TmFrjivCdfH zvDT%oAhq!6W5eD*eh+Ud&vxl^&RAe@pd@F_^hwsQTzxcHQVka?G^Ou&y@~fiS;34( zCZYGvvLzWyzTaH&BJs-PpK^8$62~v3yx4lBizlDw+(IAs?{C8y6H>Hwj5<_Lck1$; zX?s}lQ{7JS@CLiTyaqW>KD0rW6LvUQax?tMijweQS+QZC{F5)G6AE~f&b?h;HTUt~ zIqdIGSiU&9$kM~c$NkO1ziR>+n47bICc*idEq8!jPrEUwo~ek$!)+{`!Z{ zm^NLXpnO|H_f@Rr40F!uO-||W4v8$wY&2PXdAa9#@AV!+*Y#Z1|MLIPbKXfHqn%+w zTY%G92bLq}H-5SI{Nv6ulN$~DHG3v}sXX(Sr{jmj3Hc|omX%(c3=%>nE#DR2uGw_E zli5_}X5xlV%X^vI43%cEow&i8rL*Ghg$DQ3z`QJzO;;u<*gsn@C!A@2@Iq(JtAcfj z777k_8ixZp+?1oE1I;)TcYZ3CN@P3Cs{iNT`_r%7<)`}Jso8wR+2GVwofD`3NinrK zgenD`V`7ljIl>ouv#vQTvrpNc)oCt&N47(m-HBaoZFL;!6YTqL{yt~Y$I;QwawblV z^OE3l<)E0?msiOzS<*7g`@5q@U(VMWy}OIkZJr79shGK+d&5~Q-}t@q#noc7#(qV% zzTfE?&JABAWCVT+7)3$uay3+0PZ0 zS-o56HLw3kaiJZPV#|^90t?NW7@to$v-v}zgJZ*SiQWBkUQNicZDB}QX=ti;MQlO& z`|F>qcv?5isWIW0pV~FYp@+q;dB-ZZ#?*y@N!Ih+Z#M^?tK!A`!uMM9WAV>ae&>nI6ZQ)O1hBx zE5UqeZMiki-ygR5yZzrc=}+qa|GifV=>1*rW6`k)o%PCpl>_z%2P7u^Q~CE;B8_3` zq%*dwK1+IBd$V%#l)~Nj4)5Bi!{K%7#ocU&Sy>Dj4>%GXuKqgM`M}2LbK?F9xh-xi zEc06fm$03gvA|KKl`Gxv~N$yg|%QtPxU)Eh;e=fg3#@6Ez>&1sP z%QBa^Y)$V^7Fgl`)#S?iEq&knWkc1?CN2wnG4t|=-s=kPlXRIEbM(A$@UuJqpjO2~ zeCL_@PrQxR9-dK|%X66JMd9Y#LZwiU(0JH&G_`t1gBYUwKZa&PRO(f zFe=3`U)o>!kZGq_@zeB0HPUiF9SV4t)xX?a@!#XiDoeKWpFaJ(Gr?c~W6)W@skQ6m z1S6ikwllbV;8R13s4|arf&HaRJ(~_yo>?(bpo8!A##{Ceaxc_756WvHp_fx?@W`eob(~q?x5Ver?xjL`ereD@!U~Y z-<*E_=NA>vyjkZaJ(jxHoc>#*|GbgHj~(-GZcX?lbNu&X0fBX`1{+$oajCpBIdyKH zo$-4|ss7m58Rnk15)T}Iaw2kmYwi5Uzj#E_EMy$M+ExF*Ah99Giszuw#(giY8h^{= zIMKUVEv=e)i2a*$&Ha&TrE&cu z2d85KP1Cx6uURks{kihZ$L_oQ8=H>R?dfkkET(ybIbg>Mc{RJ^FAY;3yuT~_sZ# zwG!6X7%oR~*l%I4cy|7u&$=Ja%&%4_@jZM{^*ftGf+@7Qfs-Nh@|C~gQ=a@-t{^+( zqNjLA|GmFcdOVU;l*JwN=KQ;Eea~O$$d4^-=jNB&<_Sy|clI}RPf_`=Q~f*3wSV=^ z%dJ&+gMFLyHFa(rzE_m;FDBxd{8Wyf=bKK1AOBEXnelxt|0&tk9~gqZTBJDKOaFe4 zRiKciMf`h|O0VVjRjCfDwO?KZn`~%aV8nR7&+)*Gub0(R&9;cLPt##^Y|gPQ-L&VSBWo)0nS@slgwfL*sRV*tPnfART?4;FU z;RW+s&6*+t0v;7FnET;o^>M@Je}8{?t$(D=JLZDNgkX)#01n5Ki^Ui=GrkbcZ?KtnlQgvGuVV2TQhwqtt_Gi^i;N`t?<9DA7H~ZSm?y3dXn4MIKFgy6aW#>0RtT~DxV=5#DTfYo;U86x#my{-3hUj=Y>r*aK6x%qopWx=Tw#$Fx5Aa!6fd2Y zJ892tYW-`CSA=HI#%wu-IVSCF6}FzICQ4sZK9;Mcc0JGkcUsocDii%($7{x*lJ3Jv;QtyyjiB@cH*Ouw9Z-k$GL==4o0 zD&lwSlJmTdbzImT;$6Qi@y<+RhD{33csl1+Hd|bElDEz4UsvFHZ$UL3!1TFr41k7V;3%k%QBF83TOE#CU?J`=L}^Ffu` zC$dkCH~P=}&eaDy3m~zHsf&x}gTe|at_`$7fL4a*@kLYTcsi+6sJ@D+^<2fXbBoTiFYazEE>aWt&n-MYoAF|?o>lGZ z<=575?&$bFDdMHwjGK=p^yO|+Sk57KqVwE5O-X@Bt|kAUtqR@5qW%4z#!f5I_osbP{><;HYbM}3R#dATfnwVS@I=T{2Ruh2Tz@+8{EoY9`aw)+0-x2CJJ zV=Yd$+J-qB7d)O=92`oNyw&iiA zNebx8P419ftS-kYX7f$4!X@$ggAI>=mUwsnk=~+YQqj|V;O-YM2Vsu*9cr%Zu4lMQ z%h}qlOsOc4dQ$4-u~7DqK}7C@n>U$fO!KsvJ^Lcx0j}>a4A_iQ;Y;&YP5c|Z?Zw_efgrB1 zH|lZKzI;x;_q*$(MoBx5Lx{HsFTJc_Vm)xupIZfSMWuaTE4Bvwt z+u0KxPKygDm@;UwB;+zoYn=A0gvljQh0!tT&PCxO)~e&D`QAX_5=VDyO+{ErJ)|l3O zYl1P;y3WNpHS4&T_DrAM_mw^Tm#l{T@gJ6l7p`<&e^##L@Uk!t#&?l=Wiy$zu0}Cr z{}oA#|(x5Q{UP$*PFlpYppqR^LM((JNAVe!a0l{I9c~to?UbO zk^J@Itoc@N7$5$AQ#g5t!w%bk+TS6wgG=AedH+G@#Ka}?v-#gM1$^DVD{E=aAp=LQ zy;uL9UCd(lRfW&LVXlOh1hdl}&Sv{*>Rd^-Z680HRQ*(Wm;OM|fcN#E%7Clqn;8{* zxs?S17QLCcI7TO%f2~@3H4pjHTuN){m#m#9CA#0s(J_ORT#Co92Pnx zJMzU(=nsstJ-pwhtkGL{@|0u&mKCfIe=$f(8I~R5YmB&DYjFCABx`%3KErh1e=EdJ zzH2XIc`3&tEnD``R8PU4i_`0yNZhvk$M{B-Z?@b0th1rCup93gg0Y78ND z(&B3p^WV#>T;aUr*TArKyLVBFgG}poD|y>bIy^5zI20xp$jC*rtbUMs@$|K7j{_?9 zeWlqvPD$$}UY59gmU>Ze`QF`0ZD9$@dmbbzEtFw@`TpRH3aLW26gOQ*o}b?p>e$cw z9muLPI`)3?iT1sh-6n*}{IqAk`uiL2>#fi4w0-;%y>2((x11Tl{+o{M%?emy(pAeL zP~ztD{ot+_0$YW49Lr?%=zbL~f8N)5LWXnXF~1oaZ*|vxO0{{fV*8`;jND=LwUQC!*aHwHf%nkWz-Ek6@E{jr+Y`(JAaI0*^ysWez zI=5nEnwK5ET5DmVCo$4@2a1!$*3B;MWzNuDcksgTP-!!c zBaEPl+5lHj;&bhlUH59Q!leJb_w1+tP<{IP(!Rbwg)*-C^SJ+9c<96OWV!amg~$Dy zdV3^S=apN|yZ>3PYTgB@l#MEDqvkhnx}ZNz%4hHG_N(v1n%4YhPQLk8Kt;)5PITkO ze|iFSY%Nzf9g}1}HCWDXxYcr5@MinD2AiE#akJQ3zk0ruy05cbYIe$vZ;LOnPMT+( zx~eAQq0-Oa^Zz{A@=EG!fs4mfi_W0G!WS6UmG=Ayc)hxysYKMzqa&ob*k|tdr0(Av zuCTMMUmvIZ|LNWGr~LJ=jf5w_M_vb5(+_%H=K4ma6E8RR5(0UxVVYq^!bGx>*bvIZ%+&svaH=8 zyPCDkVfNu)S*%4%mmO3({x8w^gU}Y^vjPnHx3;}qbb3wcc6-p4kT6hChMhGnXnnfG z^n_?S(%5;>MBhQG< z_W!4(d`pf{oHgaIu=@$d^{Ho<2dZZJ3Zk%mx-0=T&=H(`%MLAag=eJEb zVeiz-;55xxbH&pI2M#1Ma_L+VVDMJ0n`Ha$YVD&#fA!7;IGk~9vzmC#)1GzK?7xOA zJdIh72Ur@iGGFegO4=k*wf6z1#A8>-bGMq$>~_2QPeo|e3rpADbs3eq%YQVQ7;Rah z&S_b6@b4F+?b0q^l6|J$zA8EW-NfD^4zcHRBTAloy*Qw8!5 zw@Pv`cyjQGNTe+m|L>N)Iz@Ae0Q(sxiSC>HpBIQOSjMzvm7TEMfzr|))0r5U&$F6d zIL!Uex%9vC3`a+&Wl{U4@l9;_8`kqb|8bM6fZ2{2{n_SRtTKyUB>t6rv2cQ&^bAIh zIKzb>-1M7Gq@G+jp{OUtBFT7ID)P$Q=}|ijSSF zr?W2ezAt9K%^VcW$na$0URQy}Z$eWo9XM^S)z-WyshQuF{bR#ZyS$jp^X-Xp?-wqN zOZ$<&kbwds;9a9cbS#9&aJw8^7{QL(hlFczn7l&pJn~z?abUy`K#|w>pxg;zxQLI z)&l?SyU%dXYV+V};`$U`&o)EJL(w(%t=of{{J*Va1z*+glJYyaK!B^P)ZS-zY66eo0INrM|Vb0$_ee#=+TNrr{E^wZp+RFGM{z>kN z*Z13Q)oHh-ZF4l}bew%?fwtkIwTmt=U05`K(%f@(4-$OD)ACaaWo1MP8P)mQCe}%r zF>c81U^3>-u%62*AanD6oxp<+BFvrjS5^cX@x1qs;CN6FB=!Dob%p;7xrGHwb1(TX zD?25iA;hG{Aj0`0$?lt0%>+9x#s@6hBJ@u-n_1}cr7YiDTeD}%AJ0oK468i@1ZL=Q z=a)6cOS6!dq(VYih2`k*xiDC0^=c-dWXIt=m{i!dz9bUXydTvJ7 zJ&pGc3rwx&vp#ls$rgBae(#Z(`jGj(Tb2o4`f$MZl0o96EqQlT!gK1Jck!*CnmhT} ziEq0qjU=CXTuv02x7JzY#oIJ@M+t}Xc1(w^%;a5B%u@U}bB9FZw5D4OtG?Nu@mXN3 z^z}Kv&5P*?AGf^RB-&T*c5vr~niZe33+~#SDN^{j_}VMK>8|pt91gbyHsi^2ok-_gQQ&`~BS4FPRK0PCtGmQCs`<;{1i8 zmemt}2wYl`XP(1Ww&?gCu~pA&AI$z5V0+(UQKX&qSEHA64BT$jJ>T3I&mgo<$l7b- z7JJx%^^k|FNuKMYl8aHBA@KPF;Cld8_^&mGx(4DFi$?Z4h&v3WB`FMYSX%HP&55_Y9(zO5OTUX8{UUKNk80v#6Ki=73Y>Tx)_PgM6Vx!U*E zh`+5bJP1cD1|IC+)3lw zGoskt*bcflNEJ$)a9!{(<$Zjm)XUe33^{G7e;A)^lwC6EV9d{(kJV4CsD3x`WBebc zs%sMEY3pY{dB1OF&(7BSPFFb;ba@>cAHTaE*QlC%@pM)B<`WrTDjd(<%(cF<``*X& zFo*1mdLQ&xY~~8u&~^SvRZ7+YkB7%tr%Zg;WUC{!WHWPyL_5E!XZ&={V|G`cRjkT6 zAaJ0^vRH*r$k$Q(LT}Zo3r{|275V5M;qkfnXRE08lZ)HKylh$IrbWM%6$s{7usTt1 z*%60JfuGL%vVU2*my?rwPEmx{*UL`RFUTiNKeF55)AN0|Z(P>jQaIy4>}4k1vu9=+ zFYPoo(~)3OZEMJ6@LJ>8w#cHd{%fQH`*OyPL!$Z9_I&9CoAR1ZTzq`#Q?~rHiIbO~I3&MUp4)R+?z$lOmwiF)Y#AvyVjw{ZznqU zGH5sng;XzYKhauWB4Z!Uaqf3GFN5dJ+BXuPCFHkpR2g0@%*~2e_N4#!kDG@h|DKrJ z#CVS{gXz|TmG34>o=$mn+)nSqmF75Wk14i!aXtqf_fP#ZBkA_W=qKv-;*p>E`ewF# zKH(gD&+d1T!23G>yPtd=XMQm3O_-tBIPag|`w44)9@F1&N`4t<(2N9zgRYLhy#DQ& z=KVa)z`H?_n|a5H4QwZ!gcp=9DqvQ&oU7OId#6Ew`5(y(x*wF*xKB9HKF9n2w5kl& zoAnQWK2K$N<-Aa#&9L?y*9EIZZ+GYzn~T1FKO_vrY|I6S1ciX(jUv0j- z*MD&@`u%qM>CYMJTq2;wh7Jcz7?xh(at>h&dg6akc}~Avow%LPt~dJCEqW7dGCkZ( zYb|8IrzjXKDQ{X+Igib6PWQQz8kP9-OHyoG+MQoy_8mN)CnjNMS3JvQ-ApH96l zkZO3y*7NkWSCz71b;8lxS#RyXUvy8sWdFB)&lD>)>CJ~z)!be^t`K{EboqxwzYEXp z`vc9csW+*XUF8rcV~FIizh!*v%8m@?Q&*WEvd^fHxK$yz_y1ahX|ESu2xi-B+NGgu zsrVq<+(DS3>EROC&^18IkT8gS@s*q_K^@y&nz6dslD zp$cVOY?^znTg~I2Gk3$8jrD9vxBKp&md@X^Fy;T%^>v~1Djso)viL2Wt053!z~aT& zc;Whfk*?%ai5!-wj|{U;Ys!9jEXwy|gJ$G}2eOGDY`!g?V|1M>{`Zzg$Ir^>KX3og zTjJICXp*kQem-?KnfKG$m&K~)Zoen@cKZ#g&HDSYP8d9pKN;x!rhlCA6yw%)mLx;wGz?xyd1{on2USLMmj zo+FvT5Kwsa&C&!`Qc9T2C-@*LLpU&e26D~ZzC~f*ly(*pk`tRkh z?n}PQ%$MK$M~}l--TQy%*8I9W|Cn~qOz8}H z?luQQK?BAGGhT>4yg5T=*^#+!`a9a&JQWu$|9wC1{y!b*^9#*iUVN(~^LEKYW4T|x z^EmA46w0KQyk#>iU$i`g-L#7P4ErOA{Ju*cc}~v1tsl=B@^j9!?SFJ*6$4tCxTH*Y zmM||^%B`sJV6m6G=^M|xf9mR7UE^Z(KAm%$m}~8NZ5{t5k260S*8Mo1e{$ku_LN6` z&XYV2e$e_~eTqM4UHGwA8|-c_zL4OM@o_`JgmC|d3d)&hgdVWZx7{&sd$_mmHP(tx zPp3asIUy{vYWuXq@?8#RC64`gT>smAXXax!Pv-@J%=Ql)_}g|Z>?<+(Qpv$3W3?eb zf-(Kh@q6~2R;}N2&qi^~zfpcj|NingU4~7CPtKbN{ad|$->QEM@AiI=n`xNbX4hfN zXkmJRS5u^J*HS4a=Vpd|2gFthGX9$0-xfOYN5)3>Gb@X{{;;rS-nxCPR4(L$V1!Bf zL)L)aUl*9$#YI-k-1tS`Gi>?yr4DEAPReUI7%zS7ZtVNW*vpTk;@agzu5Y})=O@py zmrd3?<)%uXzQ0*tfKNkVOJC6WGN)(;sb>?97}(jTy{ozT^;c14@?X7~CepU6{^hLx zurX~xyZyIcR~IW9Bv>k~F+X**wf@qE3Gth&r~Aye2waw+cHkecbcn@;*{2`yXIt{T zHI=sgyRQ76U~Hg4NZ!2Vuj*COIa@B}em7wfVawcl|AeTa;Em7sxpli%y(@k{ao_&D z`Qjh9Ke}i5CfH*ETY~-{caz8E#j;{+AC)-xai{$9-_Un7w)}4E?NjatQcQJ2#F*3= zLc*%&h3A%VDcCs~u28G(D{SVl%+=#|`fgC$-^4JTQEURs)uV52POy0C7rx8kghG54 zlTFWB`IhNBnGODV_e!fP8?LiouC1uNZf8`=rlgB077A}Z@&1VI*9yNM zi)HRCtgpSndf~&w%8!d*A667#<>cR6`-}0!g#f;%-HZH=8|c?PImEh2{&$}1z9J>> zEfdZh>*@V@;}@4qtKM>}uc7@1J<{LTo1_I@xX91k`+HmN-CN$*)?HtJS?}Y%mxlMP z_k?eeTyX2ZEeFq>f7|(;^{?pY?*5e(xixDl7efipmmiP&R|hJjvjjZYkia3r%ve*a z8zRlLz_V23a3TZSs=u~Xea`12_CC|}Y*x7N`Qh@;V|8{_KkSx$4@`a6_~GX7=k58I zj(EOu+m`-GWu{r-sylX{jU=}UT>k#8vF6(%@$-9D%vN7mEF&U+cr%lIgUOfK_U7pc z9JvfzSxo*!8>sI{e|# zR+(HTysPfHS8fuh3Nqm8Y50)6%zyIh=lT=E6W?qV+iMzkwuCV2elvgH$J#88 z4_hA_Fr+i2Y}~TWeYvBD41ek8zmu1HF@2xw_3M(I&>=?qdA}cO7QF5|(BOad*WW!^ zQ;b4ZIQ;W-cyRpF+wv{P^}o(ATiV2O>BAY8WuLBYKOk;5mwRE%>t$tL=`wy@1qYVD zXqPlB*|zf`*OG}pW-k9d;j@-%{fa|{ddI%9Eckc+K(h4ohqf%thpIR%qp}_y{i73N z%k(R6;+LO#ANL+`d)V;)xZDK$6b2~A4;vvKHtEVk^bj$))|f)(!OSW=w5cs+KmF1-J<2{wOpHFhK=scZx zc6Q4BXIm$UNJuqJ3r~>U_xJ4A8MOkT&s#(8WaS2=t*bk}v7Sq7*FMH{m6p>7stPrj zzZZ2rc)_6~#3J3Ov5nusVaMaY*HgdJd9}@xt7Oa}{nn~pWzXEH2r6G^>oXoO5XYx=eb&o-)oBg{rq6qvy^X5tZwwZA4@0I%l!Q>r*n$? zZ_Ak%vvdsS2QxJFud0jrx$zm>={o*dJv^_RuJ8E8xIC@ltGlcv>xSnK6gv;I8nALb z6KuS;nEU+Wn)i`2{+-wu`|QkSu~p2BLgwbB?+$<0_^!9>W1ZY*+hAV7Z!5p;XYvmI z{Nt?o{V7k^AABgv^!#@*N5e}$i3fYrm;+?r2d=z+$%J9)JtyWEyBh~z->IFHER{0v zkyh0YkB8iqmoO9`8CYh#M#|z|D6r^;IP2@9*@}D z%vn~x%VNuTJ9e=DH~Lg;sW@}jl9I%=zj;hJW?6gK@*VO&^xW#MRJ!4``HhW=C+C-5 zNk9B){$b9{C55JYEYAHd@oM>OQt;-WPFwlAz3z2CJ}*~kohc-c+Vf|t>Z-^5oYlX- zz1>vw)Jrw@Ip2(z4-d@y=dHh2g?*e^tsZ=P4?7Iuh(}tD1dn&Bfd9 zjuL-wUEjCt`Ybhto)vHTO_|gfcuXI;*2q=twrUarf))H%0%*&J1l7MA9c^66`ST@=35`m*ZxwY5{l_kVo8 z>Ct=n>CF);8d|1W3?<2o3wPUno1o(ERLbAj%Ea*ch21K+Jce8QW; zT9I{)$`VN@66&`3A9lZ@S#~q&=l#{;C++|IaKFTrZdJ(Tq_d@Ul~aRlnba4Ay+YlMd<%{CU9na?ZU6Mi&^CynMr=a$VX$HsI=G9|c9{tuGJ0io5*5 z@pO`2t@$$xbwhuv;wLO7jCVhs`SjF?$@Xd5gtF;dPIa#QtSWj}o4x)|aOK<1_a~-g zubW)z|9ADCZ~XnM6+T=OzCZcw{u;kcC*~jVO>Efs?Z?WQ4(Bt!_Sb6!udkcG#&OTX zo9Q3!dAbWc>6s^*vZFNJoaAt7b4B1Qp?4#I`N2m zV-dRv)Be9Z&!6PX=zZ~g{*wRuzVDC!o^81zH2f( zNEWv^doWhvltz`l%>E^53Pw^#y5ug}ZcaO0zW;aZN_U%Q@2XRLokM0VKA!rhV+qgy z-Srcu_SZUE@$FIfu7CUZ(>r7TlYgq;O+S2l+lgu7|D4@=-&<=j4>Pm+dE} z?*Atl`TI$K%C)oGPcDo96VvzDuJ8Nfl~(uu^SShhJN~OFtp7XDJtfU~u^z*b^V+sT z$38Z$bL^kDnzQOcNkBvAhZ!N~lB51Bm*m}FIEznj*5Trt6zp;q*4a2`j`v08X^XvaR{IF$W#eNNu2m_X`-Ud#Fqj`-=Hu84=p0L>Eh5Y{! z5EvwUK()m4*(<|-dG$HZCoo)nwB=8`amkWK9mg3e^=&4{ZY9sKG~hYRP^|9X7Pdfi zUAl46D}y$sU7Lf<3tLRg%}>qf+mUnpYo{;!g1mOG|94F<@u^$ijhLd&di~H`i6oE9 zy!sy1?@yU86%Jn2mvciS*5Jb74y_s<7snqG^Bm-UsCb9x#t1Fm*ys4TpmWlJ$gp|I zm4X&W1NTZMt&EpqTs1pM*LdC0<1@c5v31@idx-Zn@9#DpyEAKF{MA3GYJYEY^j7v8 zri>1PYwy{se4hJ($J4vMEm_9M`9abC{KK2$g^zvKWC@5Uc+EE9Lwt>3l9q|j!vhN& zEerI0*EX;^FAxzhU|b*)mDq9mLUX^U+7D0VM?6)Zzi>z}&s=@+&IdLQW&uHuA20p} zGdx&iX;*zwCF-r=;sZCr-!~}u3q36@ezxlQK4yb!*3-I9Un^NVM@n|`PwBXcD|1%4wQkyJrtIte>~u+u&+EhqCk`<3@TseODC|2}G(Y+OsyNn*)oa+#UHotVcXRQd z`P2S~d@TAU|2{R=XhUd6shNjxoAog#fzE*FgoUdF3l1}=6zRSA{A9BKw?`Wpvt4RF z&%S@fwQf$;e09rr=kNX1um5@aUiMDsPxWs$9uHx75XAr)Y+-2#%4k*8I~->7zA}eD zIho(0NzPM>tv*o5&Qos5xdo43zVNM%`O&U({-1$=Ajbi*d^i1=^{fYzR2>JEFCZzxrGJafhk_vMGbJehtV z{-1YpG{5_{;>2|o3?Hp`Oyb@mGt)jkuRZsG=-J0h6?v1Lrc7UbM|H)o_OQk%?kck{ z3nD*goJg3@)*y52LRCVaeYz;iA#M*j+dUk|{v{ts{QBwo)6R8#ksNCsb;3ih-E#V> z$6zR65rWx|Hsr>e{WA^(c@losh{83r_9ynVp3xeVg2^V zPNe(QsqY^Xs|B7c*DJc1{H|^C{HU5M7Pc3TPhhw{@%synj+Fk|(7Dbk8ir}Y@xp? zfrEkZ+lQ6U()s5l|4{i-`uf_+S@V(R)XZDXUBp-8tv_sQ#%UcW^)O%k~{bM<||G9=t zK*ECRST5cTv-*?%%zOOaRzM@E!%#9{FI(E|bkF0lcQ+-!H{1Dp?aECT?X{%))=g!W zE|uE-}k3fGx?F{qV%0R_c5e1Eht~l#S`^^^B&C|0#-s2Y{vqhOT5}HeXIMi!r#*d zDIc`fDgJ$Jd*-~;Rb>ZX2F^Ls)t}4n*KX%xig~DS&(r?k&q@EfAXbLH@AB;dIR^za zTtRbyN5dqWj1rga`@_90o^|D9AIp0)8&?@0+xSUfr}oRs0s<+1)Ay-V{g*f~`3e7| zr%sMu+f-uNmbezketx;^LW6@+Zs68xC$qkpy4HEEjSn`+MeZ=vIxlCTcTzZ_cfGpk z8ZVA!Cw{iN(p=r5MO#BRtu{OTWtrK|t+{O`J$|P%o?Pwx0+t3zLzuW5hk7?5`M{67h% zN{$Ivb_NRUcsecm)45NgUrIS2ZuX04QVd7}O|~cT8cjL6Q1L-o&6;D67B0!}TW-x1 z`o6M+*XOar_0Q_ZgDeg_>*ZR;aO$G6gjR#AZ3~mX_??4YHOKp2U$J?1)wTQ(&kc2V zf5$y{n-$~SL(;bCPM!HbbK@Rv=ELIQ`&2i+y?r!#SBTskTlcshM=uv$-*nWd=HFH$ zE~ldvI<7vKmj4tvE$KKjD|2RVtvnOg+`k*n$l0B#**D34xq*}QLME@gclOixA8=$@SX!riU9(Qo1f`(bgNDiWKv_85}3?e5*Y8$ z_FtdlOW}k}>l-tp7*aFsI;I*3#fZ+640y0bRgy`yv4N98 z^&-zvO_tFAGMw+{PGL!UBWdg=^dhoa;XIGn?~ex0BpYYNFTW6|;b0Z|YT`uSNv#4C zT;JOsimQ_;W4gfef~!Vi`S%@43hPqsN_YP8xbbFhx+2Gi!;;7C?3c)Bcw9QyAkB37 zm7<8jv%fvY6=rXRU)`y&=M_B6_&H zan+HhH7dE|nEuO3aZGy}{xs{=FzU^;K%SX$%+F$;}oX!)|w@_!&KQoT0zZG(fT3B2ERKK|)puq;J zH<-T)RjIAL`*O+@eJ0I$?;7WdHLPZ?Qdq!o<;g3-2`sP7V!RifajKPD_-meR(S)7n zcCvH+ifHXWa$dl3eeCh)nl2xtSiU{W)VLuXqu=%OIg_k#;O_(JpB|qywhI&g;x}iK zh6%sqs*ekQ^~)XjQ(rSfvmqehgF?&;tu~Kf#Rk6~i}VS34KwXOy}G&AeUZg}S!bzC z3-(273Ic_9E}z%uD-mN9yRzaBug!tEM@pPbmz0!R?O#*1J}4$|x{Az&8o|#eUT2)> z*zA*TdZlFH_pIBJIV?Zk6$;K@s!%$~?)&f87eCAFWis+<-C&UVDdns92RRl-F36c2 z2kspU%Is8{_E^^DxAuY=?jILsANuxx^LM!mWpl6BKHv8}^vgZQMS=G$T zfuTvE>iyrV)z81*{yuNHJBNy66NB7=&l8`|{Wf>~o8rQMyX#%O?oQdYapmf3*LUij zXJ_2vU@efgeAeCSracaC!WtPL%&KJlbjPx4Z)6;0K^cb|WKW_xF|^z&=&H&^huE9D>i`CO}^Z}PV&j?xs>=@Q-F7EJB`BB%N`Sfg*> z5BJ9&^+z7*-M!%G>n49-!~ClcccrMw^v^!Jb5G2|I7L~p14_ziyY2t1z2C(*SF&=S z{D&F8A2e_5U`PRAX@`Lo&;ZyY}UhxLrGubFat@gw=h`C`d`C#i0Hb@%&tyzdBA(`QiL!#mkIKXRP$KLbBe35InmRSmong!vg*yJ?hr)bL|#8X#V@zsi2?- zcY+qAFr3r<+wSxJ)QWmG<`2+6(RTSsrIK7G}1qwW*aIu;5*st9opT%goDdv-7$_&F{-}C$em-dmVjYv31_B z%l5u&T~2a*SQK|$=`3sI!TXE;-k-|Y|7rGQLxCT6xsDyUAM-D7=QHc-c|FtHE5Bbh zZ&R93RitcsfO*^nRs3wbjO?sKVB%|G?P>HS-wONxQt`+Ap z2}-9a$ug(L1>6kdNZj&e*%y9hr@3Nc!mr+C^eS7Ir?@x?@7_G`!1_EV(fwyG+}gfZ zx3OO0i{#-QZ}0Q(TQI-dSh)-SM>-w+Ty&TT#5*151fUvwPQe(N4 z86fQNjN<}l|C~QeRiab(O3YnVH$U9!TQz6bHO7}(rP(1Xo)(*|5Yy*b8YyRd`-eQF~(=6 zy?vST+LPuHKAL|PpRc#;V_H-Ge|Ej_@t4tU4iDbD3K#ydxWy6j+w8m21^G3cg)t{3 zEh4S-e{F9T?*6`s>7pR3u|xFn(tT4RIL+RySl+f^>PL_Lt2Ae3{;vN2?!K$`^Wz`V zCHR_)--hoKT5G`Bw_ay`FH_S_o&$3%i-TgZE{(DS3?~>)vdFM`?EfwQ&sipD)3Ut}J)YOS zinZGzFMQ;pQ|)Wl<8RUm^?l=5ctX6^HcX9Qwc< z#wLPG<~639tS!l~TKMw)zu)!pb9>4K?U)t^hHjtYbHH2hkLY^skK!Nyt@<}Vemmc% znVwWONX>iqrvLAd{T+^=a5U#9PAkKli(U4CEoZp|Fl|JR<) z3H{1_XzmZ$o*5R3eY4bVrcToBi+tdpdH1970p%ZV5oi22)Cb%>c2)d;so&ybCNH#e zk53AAbU)UlX32Id<$h~&ig~p9ttk%;GGBNEtSGDSYDhtccRqq#7$eV;R)O&r5JAXg+@E_$5-!C2$_O}r%etzz3-~W^L zKh+;9Io|*Kt~{CFb9vok^E&0fOeJDxw)xdoq@JC`v|gHZR{VzRYxizi_<0V~smHGw zy_6Y^e#bMOsJZZkv0&-`X>Tj8n9pQ5xIIfrF60sKg(QB1YlZ8&mD_`(R=vGDnWrhJ zCYOIzz`W3)^>0j$yzfiINZ53bP+etc==!_Fy3eG30}Oi?ft=hy|a_n3b*S3jsVY1K`p zRF<5@+p5LYn3R~ORHd>p)W1&seReC`B!w$~IS-hrR?lVIn`dn#|0R_9&1U}tmb(m` zLtaGNx9ITxDCWz%YouSZL)+uo-e0iaoqV~KT+Ck$*%C-cA81Y`;V$HO=jUO z?la;uiZoCvbzj*hapHySGdJ99Uvv3<**@R0S9$Zo1y_{X5B%UQ-1B|@ z|Kd`?kA5bMnS2j-=&bK!YWu|bqG_A!vK#ju+_qNeU4H5oxc5F|^B#%P{m1(seK60z zx5t3}z^c&INz%8LFIo|);qBR2?A!P$ykgz`0|Kw(|NNM~K(r`TZTrVPKMp(%V6Xka zcFuBz@r5==<3WyI(7Xd@t<%dF|MuwGPG;o;U6DVU6l$seKW)CN1LVlLvcWCBAf#FMX92 zc4JjpL*3H(w|GNNm>x)zpUGQnJfHFJsXd%w<%e1Bd_Mm#(#lZn;3@m{T}(}T&(*t5 z?0n+;B>(dF*R|_qAD90;^XchMo)26SZ1W3!8MZQ=Umq(Sy*)?r0)t5I)Zdesp3h=Z zWi9}R;C=Zc@ytcVKhAtz!KNy*K{hk~e8uOV($lUp-B5W^sJpbP!FSK+!!P3PI~rA@ zSvN>$W=f7deY{$<+Emas+U#iE zl~*gjm7cj)p2oDFTTb%hhFoDDh6cS4?-$9=Y;X$o|H~EC;U#{CBRA~3KvPA}$Hfy@ z$SJNhIuIv)`p#0>9`7`hlDdY9G*cZ3_HS328TPrbK3V;{@PLii{m30JjE?7>o4nTV zzo|qkoACzTc*Y>z!wz2#*?c{$;qY|R9yczYjM@r2Q-*Di^ZOU^*30rW`P=_3iK#m( zdh&?egYsWjCi_48`~2FPPF`uVluz=TIYE_Az@moxzc)=0kyyYGFs-ve$bey?l*7IC zEbrL;6Ru~j^mz6-c*Ta-EpKKPZCA3;HszkAw#|`glJN!03p;95Kbx%4-pf?Mxxg!& zA;RlF(>jKVO^-_7N5{80^S@FHo_MCIwz{u4K2_!Wt%<8rxn{{{9sX9;>+vF8&g<@( zrN?F*JJ1kwl>N`5>USrXwrOYZy_zL-#y-KMF<0y_*Oh5%nG8uD#{Vx; z^ZG7V8_4dIH&70^{`;JyeTz@K&u_^rP2X8d`_z;(9i`PgyyTAj&TF%+O=3cRMlXLuzIKY zHhjt_)-7r`zFv0UUsiqVwW4+WdP`=F+EoX187lQ29o`)37(09Cfy_&ajMIA$7W|n! zzsM`cKudIn_`#|M!3F&?TZJ~;F&JnhXTIO2KCfr#{U27d%1kAmL61uJK^Z&Z1O1o!}1>`)gX}AMvl-yxd^TCNIy%>vNfEGEW5sEpTK! z__6+Zv*}EJ;R`}@8#b=`KkI;AgQC%P+ZM*icIqVFbxUHJif$>H}ZDVx7;(0y}t%g@7o{PSsbmQDR+lyv- zJPJ1xw7xKUs2%;d=#=?4`*2p1mcR{biq=)_YkHz@@a#tPfv@Xkuo!O;Q9t_r1Eal{ zM6zDvo7#i-e0>`dym$Bcn-+Ne$+ApvkrJ}{{BjxJ-{&)W4_<%gKmQ`{;pQ!I=Ev@r zvAz_{&`dF4;0*UWW4P_{euZXbXNAQJmbs=mNNxD3r?sYDfjMB}%1i7Ee##k1FV5X; zxy`C)=4u%^+a2~%CvI=x%=}`#{hru$`-1u{meV)wQDJ3y7Q4G_>GFM-_CGIvey+FK zV71rBrvK~aS}zt(k9c2c*L44>s{!Nd>+Aj14m_^rP!E0kei!5Y-}k;Jsh^K9k*@i+ zdH&O>pQXRgoeFAtE&??@l@IYR%@a4C@m=vgH}~8o-dCrrURG@V8D5&gWMITSU#nK- z=NHz1-nk0AAGGFjxiRJTTGfaw-aqm1zWtgfzfZjC$MD{|!eTDd*4fLq=&oSg^w(qU zj$?*QbJk7R*DLTMQD&x{#0Ng12OQH@y=AQx|1xo6#(WDyS+2|5*4N}$A9W9XZuy+S zBPKJakWkP&*lg6y4i9(FcO?)Yt>o9VDgCL%%rbx+(Z_#|8h5Z}#)}Gt*Zvx8oU;seqNR+GdCOJ1c~@ylQ^f^*p{~ zD#Mjk<@>escKmPmeClW`VmtM>qlmzb(BJv0B_UJy#r?hi=b8EA=XPHf-rx_;l!#~F z?=IPLb#?f2Gj_E^S-yJR3;!*84jJ70nz1GQ{F(?uhJWjrA8b10CVs*K+^hn(`@LWB zPu#bj@xZ_Q2DcN|>s$^WKP&V3Kos)}wqu+xR;;>qE_TJ&!1QIj_xd9RtK6fXZGNx% zH*^1_H4Dz{z2_S(G=CM-ssk_FG-8%AYgSoYS|?Oyyv)9F%7i^y7B??QD3l&fx$<`R zwN?lH!;bry-u^OR%AMKGurk8IB{p6$M(?c9w}r-!);+#xmYKwqF8^3^PgA0Ja_p8= z?>+teU%5}u@0=@swyREZVbjD5H~rffU&id-YgTsKZ|nbuYb)1P?a#-)FU34b^!&?DDE#Jj|F{DP6Jt z>A_Bs54BvsW}D~t88-Zo|8r3O$n2%X7Y)RuRtvvu(Oav(3ottPHT*O4Wi?=Cl0M_gIwkjM@+!>({f29o zxm;6P@ajan*n+u#n2s~%ss0Z8E5c&e-Eg9wv!L(z##?-cPlOy;CST^$Wc59(C)XsZ z$vZJDCN=;5`FfLZgPfN8j9<3=7iMGdl$~9_;hm$`>)qScFDn`cU*yYQ&L`IYe@W}} z6;Fbb8^o0N3iKV4VYt@Y^-eo{#eP3ZrAVCmZ|y@8jO%p|}0Arq$O>z8|)mwSxX> zul^Nz=Hvd7mzS=vtPs?g#8$aJf$80z&wl>wUH=%T9X!{-Y<{|V64UbrP=k%H!*0s1 z8tLYr_BR_$ww!7?t$0`EfhprA{sZPh3+D3Adk{3$@WJ944SWx-dLCQ+EB3g<+uyd; zWzFdf{R^J4^Y^TJe`BU4>#E7>6Ls_Rza&3izgY0X=e>_7xo(u?thxD1{6va-&cAQD zGoRlR*>gR9qlsK)S*nk+UA=|RA-gTC;kq$167<%|-Q1<>c4o%A1H$h@Ki|%us?op_ zAFg52-_UU4>zQ-yOg56N*BCs4+Y{S#c^Q|&mZ6BEp{x+=6UQvgQ}OF zYz~vzwf>bny6h>?8KrLj+w-{FjIL7>zgT~;pJD&zxtsG}kNC%phGH+>S8~6ZA)ux9 z?;y{D#|b@co(X?MuZ67ePwep%Nf1Ay-NKtzsBtNff0D$l_B8I^GQAD^|1GOtayMJYXx_0;>m7_!r0yTQ z`CG2$#ln#H@wH#C?r8tAY}o!PzfpPAj3#UZ7KU4GQ4F*y{FyiFkBDS!eEWW%=>O}f(~kz){aWeX z;MQj<`;+ey+b!N*k8Y|NFI>-lMOY=f1aOKfkGazb&GGTv+Qkr zy~3RD^CkJe7v+zN@BiUivAeFWt0jWz*R!wtU$5KkcWYOa{%ejudHcV3?-!B(_o4ms z&l-94+EsfZf*!m94~XmSZ4b$R&#v-MfW@M(y_Pq9nct%s>`SgEEn#TYdbTR7IIy38 z_JSabTcz*s$iBUGZRhp%x8!-9WM2mBe-)eleX63u(s#GLme2ctAgWjFgJs{_ z-K?8iwY9b_in?}lleoh4hlZyPSuS7vXkV=00~;I~@MI??bEpk?Q-u@BNuOHSWLq z;*iR>G2nPm{d&Ieey+!4}YeY|+cVvdCS z!yh-gn4he=xjE^nD)%D!V=LO+>tAo+GZEV6dF5bSSnw3ijBkndoKN;Gwv%LtO15CW zz9(;@*etObmmNx)ayM+9xaDPRznzqE;*w2!j|q$4xo^g>qxF6#!@FwRNTd1T#+hds zrq%!H|6lm$*ZTieS*$56emcSlRsTQm|2O!{bcS&On}Vdn{n$t^E*?d$DLe-RswC5^ zHEwzQcJJlUJvev87vppB4qu&FJ4CA=-&xI+dbw)LfAMH5V@GFtch^Z-g?r#mRzkAOt)t@Wve$=%6`|;e<^ZP`XNZ&g&XZp(>?vaPK z&3ntWZDP;bw=*V+xj$MP-G5B?d|v18dsV49krw9b+A@Fr+he&$w4>uloV4vG$Ld=` z7kWRNODW!;nAllr$eJwe^Dkk9G>bp4(kKS5!7W z(u>QZaS~%i^FO|69}0i5zI}Gr{nEL3#s|Tw>!$PzPqzGjcX>(d1&#|@Du)?o=r9yX zE8NQNvEP<=n0f0o`3H-aYsZT_Y@Xl$)NjcK(}o25&gx}vEPMXnc{k(G^-4M4GZOa7 z%VIZ46uj*{x$2GYFJm5IMnNY3H5EqN{BwHWJ-ljR*WaS^HF0D4>1P%k9DQ!PcF(DJ zbyYk3Si~9e!;|9|1}-gf^u78fp+NgUpu>U3cGtyESaS4niZ-apyS=#77h7kO*3f+G z3F|8s!8tOCCRH8Z{bzY_KZ|mmz2MY8rB{9labH7UCmp-^?#10|m0JuiTh9e5s9$@u z>-2pQbA^Zg?P6Kxt3;pOx+Ld*Ek8xG(f8u!Z2vcM_aucMSM14rzD}Z*^MTy4$;qkv zB0IuPXfS@}s#tHip66`J9Ok2jt2yJ%hnl<|%8vzBf&o#3;XR)yZUrPOdW!O^ZCUSi)v9y_%hRephYPMsBBDGiL|o zNe6vMY^YH_bI@-_bFat0^9LkkGFKm+%`em6%Dy}K)FkucJ?8{(eCI6R|LBzj^Mv$g zyCaPQ#BJ_RSd;nxSZ8q3^M|^H3pVS{d$Hm;^WFC3-#c12W}mrogZ)L;=J&2^^OiK7 z=D+?^VfRx0hT_JV548VGUd!OU>B&`=fMYA?H{E3YT@bNGfOo<&fm^dWMCt@5{Y_iM z^QY&s(V_DAFAHoR@Ncn{3jMA$xIJbSal++NRG%eY!-GQ*!r;j|-{D!Y^Y zhpUMrBn8m%XdnOpY0X= z5q_u9Iko@urWsc}_OmF<$w)r_9=l@c#gO2ZjI>zxc?w6YwfgQl@4n|d`_ccO$IKrs zz8)w2_QJ)}&8J`9IK#fZcwPV8_QaaBkJhp;|EGM`kZ7EIS32uD%YW1CYe&lWeV%*6 zx2{ioYD!vs$x@rj=70q$4EGfDe;vvE#>nG7C1FGMwiRh?EUO!$cnj7%;<;hZxxV)B zRF)c3R;JG9Rm+$^J$v*1?q>au`}^4U-aKEDVBOJMZLFAW-TAzJ&t}_e2TgV?dca=s zE_t)K`|mA+hOaNrPm8Ty5_quW5z7HV&k(hwbFQ4H3PlQ>&)R)m{Jwvs^!5w+`7!_g ze44TU;lzrPF!!8{mp$w|udy=hfBkIs#>M3>;?dGQKDYi(-4|2nAG+W0w@CQC(*~9Y z&O0s_V>qVf%bFprrE>4&5=$e_Go^aPdtYum{`jKybhrLG&Y1U0_%#G$m;6|3RKJ)p z#Uig!@Kx=zl@=VA3v|D)m$5dUb}n9G@$@*^#rb=;3NBP|HtPS`>$2J?pO1_29AnwU z${%lLZVbrfj(o0m;oJ^&IrW;2x?%SJN@`x*TKch8MncglRC4#@_Q=x#zB3t()OO`L z>d8H^F4}D1uKM>&WPnK8pO*O{QJ{#2e*rsXc@=Kae!I$L*>%}QErvCaVmcg}R zp^|^6kY=3w_K@Yu4`=;ZwkYJSyYm9W%X1rCWX1WiSY0|8JEk%`OSae~Ygu5j&RNz^ z>FSRMyY1yZ-~YPLA)Sli+_@j$Rano}-xNDn%T%l5l$rNiOjY>ulS3*!^}lyNV(#zn zU+Qjt?0!h!k-NLE9lM?Ps(f^oo~6-V7}O~u*+=O@0eyvKYDdFW5)u&rIOn5 zhL075YI#lfuIvqV)zejI^6TJED5^V9r?c_P@$|+8lG=@Z4Yge$L`3p*eqrj_B`I`CT;YlI^w! z9-I>XJO17^O#C;gqx8JM#R8Quop@RKy%k}9N~cq{@H3e{=Ueek|YrUT4RSlM(Zl3+uN3ouwII#ISy5$@A~cC%$s3c%60Xkmp|d zMC|a70PS!V;e)Z(h7NO9<|p#}N@V#p@r5b#il+RQHE;V%6Z#VK*%>D5-ihwc{j*nD z{pkAGO5c+6^Tdqze_&Pde{*A-robY%`ansQozMP;Nr^~YwOeyvz_2@g-7c+XIdg^H zS3KJH<5ukVW0S+b9uu9e+xPOz@+b3s7(Qn>8l5j>p7yd~sU@@9;|Ma?gEkp#cl`yeh44KC@?O{b-50Br2U%AsE%|{k#8|)1)Ig zxA!XlJ8SyBznQUfUI3Z|j&!Gp8{%lrMTh8XP!EEg4EX&J|T%FE% zV{YNob-5dVN&i>A_y0hL#K(Kzk3YWgVLsD_$ukws7&tcWO}H}t|JPu+c-md5aZ>GFpW@8l`Ao+bRCB7$ zGk0`NJ0SDtN{`m0?F+-sC;Qh=%Vn*6wO#PmwkH*~c{5Fn)%HLBHpBHsNZX@Q#%lx|10e|XC~>EZZq%k z&Nceei#skX=&O9BRrKM1+5d?*_E#Hc{XaM3|F!5Owa-2d;w@*7ls84iEAUy$gg0h-OY}~7z@I$Hq-omMa}x_+UU_-(-(Ix-8F7M{=TpOzx=@e zs*rzeMs<%S&+ifZ<7QubF{h62kKUbApV}5R%-_9f&q0j`kL=~yMXFeN4mcm*sKtFV zWraM)VtI$ACGso>o&PuptzZ1|9K8QdaC9^+S+M-e%kSwwyRP^g=`x+U%G{JeO)ALOGegdMsgNKa2x7wy~Jy^tlyX;Ss^l?jj#`t<>3C`&f>lREs;o6*#bcz4KufEo# zB01q-JpT-C)oDML@w~ivV}Q?LmO|g-GkX5|2X~&IA0hN(=ZY=sBAE;Nm(PF5)cfGA zynaqjhSiCc6MP!{rk|eXUV8G-jz^bPCtX`{?Z)nOUm43ilha?^(TlO@>}h=It-w6t zC+7}RCN_opl2eyB7oJi68DnTO&v56ZG>J{Idk)ua6-?c!pz&b;S=$*a<&Ev^8P09H${m68G#iUv$q5ltVm!v$F z-#w|w{+mO8G{^L;i{23dADta+#s8ixo@ac&-ahhE&+ht3Uzw+WS{Ui(vwtT`iB?Q+ z|A7wK-H-2bukVd~GKc-3)B$COlX=VD%D6k7-}*oQhQ!Ac!h+(=AHw7LHYuG{Gd}S5 zcb&+`bJ2{R$C9_%9=>&pF+e59`SvflDEVmhH(iV6YxKLHPvn~3A8zm0dzT^Fx{}xD zsP>2Nv%k;JUZ%Y5%VrJ#?#iF6?!P}RUVg;4$3Bk#Ov~%DlXzSU&pg#LQ8j;SEn|Ek z*9g{k@_lF|Ffp+PBv= zcXBSDt^6Su{P^M{PZGqE@-542TE?><)DZk)V zz4WU;`+s!r|FQBT_rLu=XYZFZe{7K*((+g4P|UVB`+h6^`&^&*r!2x~*4HlS^V9Y> z&tLSgwQOMugWeYNDz48Tne+Sp+Q}Te#ZdnCZx%xkQ~n>u0EVMX7Dt3~+G>vkU-xjj z?56j(&S~|!qlN3)j4w2MMK8G1sry@lp)#~}P2KbunXBfX6)(2w&--C0_~(7K!lPxc z8NTinw6Bv{Zr|{K)oCTU=xYTn)!N_dc$^LT;_ijy7RKtC4QDtVzU!WK?GXAg_0Y=O44!$X1Vo>E zJ#V{d8JExaLdEb*f2w}*`{V!a-;D0%bpMqscHo|2Rm7Hie3O+HsQvgn;Y-x!ZHjLn z7s~e=o6k{t>~==-`#t%>^UZ?h@$w&;GaR!XMX)^Ben4cW9mD62-7AV8&sLJFnxo?R zb;noT_nn=u-}UqwID9vj2-e!YAaI#V*@Rz$J7#RImgtw_{ujcbd1c~ersOBPue_W8 zxM-Du@;cWG{det8*xl$}oV-6uVPc=fLzpZ<1yJe<6J+$26Bty)P_disOT`sYo z_;P3a3)y@82evcJ;H+VA)H7>V-y8Q_bcwU<{V9FFLv|L&xOTmBuKimOZ?4T5mSipW ze)YkghwQr^KYtc4y*b}~lE+D@FFxt!dH1+K#8z4|{8u@^e&BS%2918jdgjDN{=*_W zcJSA-B^Gebx?MIQN}{v&6pKXb(;mTROBUVMdUE$?=*>dYwK^yrbEyJ4fwy*;YyRHoJ2*zuWf z^XtpD`<7|MWfXQW{_5VcpXrA25~nQsUi%xdvoBrpPvf&1Z~iPsxtcYB@y8Nx=b0#6 zh)Q>OS@hahkpIt)!aI&rnEUf?UlZNGA*pgp{O6EA$G!791ZVK~J+i-WAz+0k!=9@w zFP^SXJE}A}AcZ;Q53erclgaN|n8U*D#kan_T`}$ZDTz|4V&MihW9Hstr}n2eGcon>6hv7c++`P}* ztGJRiR?nFaTAuj%^WMGR0zdQby{cl-vj6LY1J@U73B0p6W$@a|#H#8j-?@Kb-}A=` z8BfZaLf=`eP&Bo3%ZiD5v`6ml7Hgpo(ic7L7#L#X8(Cy#Htd#nc(s4ptS$c!DBB%y zOKzypn{HjqmT+^zo5k#&Eq@p}|L`B;`Sal4vEwKIZJoY3ILhq#zfJr9y2&_Ay&q&R zF#AK^{P@hH;*ELIwx)I&=T2UlGhKdHO3988Lz@Zw3-|HXvh%y^&zf+`{-G>3Ys(Zf8SnzxyGMo{ubS~w|Dv^7f8)D z@-UEHw|GMElI|3y7uw=^o9z3vt^Ncm1~Xa9O3IZPF=jDDG0x)sQux03{PJlFjz8B> zWuA~?pp0no} zW8+DuTG_{6diKk)?_dv{IhkMo+G5QcSL3>O?$u#ha<=y6Qr_j}^B4A(gl*>SZ)Yso zGTHUz{i7{cSQfnFQ@NKSa)m{Lw_pzct<>oXca;wQ=XmD$)h4bY^v%=jHE)DJKDPf~ z^ryc3zV!aDovau8?#6sw7F4LllC+Nb?~R$YRlXA@D{35@@O4M(GiMVS%S~%$E9d;X zXv}c+KgYA1`}M-)?uf{**!bu{bimWsvll2Yp7;M;pl4h#)AETMf4zC@fA;9%{)Ms& z)+L-@dSk;*$Kuzgc~%Gp1SizhXIyNW{AhOFKjDjCpZ*t=y?udA=AcNDhJ3QzvEMHn z7;m=QyIC3CI{qYc=H>$(?LJLUY`Q9~CLcWRD|IE|Sk+5=QwCLLg{kKD}a>wl>CN~tkV#nYcZ=tZ2Of)q5#?LcbBDv%J_0@C5io6$y-{?NHF{*Et&~Amdw#Nevm}IhF z`#)H=_F(D)-`DT0MeepozDd2vYnXp=O~yvs+XWBSFi7~@F&|hgF8JeW(VU2sh7^`F z<_UpG%I6(?=1FX8dLnaTD@R}8{KAsU?WFn>&-aJV{OA{DB8apOjVI(vvg~E_7^P_$Pe#zsnW{ z`#v1vwrBl!@AsK>yTkUuXUhNRndoYKeLwZ(@+t4jHTK`!Y`$$0qeb-=IV0Pr_H}kY zm}WniP?mBas%A2$2fJ~|Ez!mauSdW#Rd|q&V@S1aT_Zdth;?< z!j?$m9j#Zk%C2~CZu>>xaq7$mwH~{-JlvDQG$;7%3AW2puQ{H}FmB&cYt4S_eeu^T z1{cB^ADj!1-c>ruqPMY#ZQAGS%y~L58uw z&hA_9w0Pq;)-(LEy=JLp9_%vFjA_oYTlX9N=X$@0*DdGn-|sH$7xv^HpBC}`(6bu* zbDH;)`}V%*_}0H*t>97F{eL6b-Wss`s z)V4QU3Yn{FT7)9}?N+foG2yR>->`K}T=(AU#K$&_Q~Mb1h?)5cj<459fAzd}#s%dw#h(9E3ebzvluBOTd-d7ei6}(&YD~C#ES3y+DPH!1zg$><(uZPy9!)?RNv?9$!e?SK+zIv*8JZTv{o5Vrzv|icbw^)UU0LlFUVPyAn-hI+ zH$I#9{@A{==iRG$`qNk27G9p@oz$|7^_bcM)e}3P@0l^}!24Mo`2uS z%!uo#&Bvu2hcqW|+m>#-t(5-iodJxi3_C{|B2MpU893Tpa)Yf0_U9@{~WU z^>6=y*7m&IKjqK)+t;hy*w0O0u9I)U#WBT~b0;t7jfkIC^8I4QS2Ky*tiu@0h_UWi}CFlmSl=?6pJ1sADQ);(b$&oK_J+|CBPj^_`|97M~w?@++r44vh1U~y{2i5;# z{_*F5l5<17Gt;s&JqtW{Z+*NbpJDUm0~gdf=6%SS#lUdson&y*x1&>c?2*2`-)GXt zf78#T&pUrf`1~n`JwcW;C69dkVe?n&;f8+;*^~Y*=3n$H-}I1unBnfJeet{Hcp zACu1S`M&@EUrEjd&dYu7K07h0Rbwy%8^eWgU%LQ? zJ{===hKyCeEbV*?DgkG%S9$mnCui#*d8FyQCdK5<|6}-eya-cUE)o3gaBotb>s;aQD}KMetbX*x&SJx2lbN%`&0Kuu zcX_fJH~spoCh1@E<>+(undyCvuir`D{+2%9Q`lRYr=d>l@XUDrZPSvKZ!hL$@Lz8G zdY%Ql)v6OqEbUF1#a@e+_8*oJ;fZ_vZYA%|$nAG{ZMiZ&?|-}P_M>F^-!~kX7Cbhn ziQbmu`M^JZ;zIK`MJ~>ubs7dNafc%1nHJ@VHsq+E`|oO2=%BXrNT;y$%X;4v&DZN~ zRZp>XtWsJp+@|(nhWmn0|IaKpqI&LCs;GTA9HJ8`u(2-KS&OaZSJtZ2vlX7Cu*>hi z@?_=ZC@vLqqI-fpqw;pX<%{Nw*hp2;5-&f9$`SoQz+nH$M_4}Sjq<0;qoY>(`}2D&@f7+OmGn)&{!{Lc!W_bR)Z zD(lu4S%~${lsmqyzjNyONgL0XH%wFDm2>^wv@1%4yZE}fl4Rq-yQkOq&Y1LmN1$L) zVS$&8_eY1F@?Kqc@ zl|f+dlj=@kv)DYb0|#>|XL2(bJFph4&z^pbr6IgJww~d@GOZm6o7X-3@cl(s`iV!? zkv9FYb&3sJwy#w#%c;}*HSMnO+T#0XPF2fZ{Qg3CsyJKg zR;$=8Kh7|L;7PJu-YZ(3H~#;jeB+b!d&0lX*7ciyzb`p=>bZ>f?sGfY8m`#xta;zQ zexFIy@jkydn>lkI>lNNnEPfo3SQ2INu6(Qg!T1FxyB18CQ>@Rj$#lJ@q3IV+b%B|$ ztG~(hrJ8TD`EX?8#ZTttZl^6&{%h-ZzxyrUCHnuh^u`~t?_Hhb+2kGL{kU^adY|9C zQQ`bDb@}FbwHN(%J$^2?quYf2tszg@vRln38w*1di|+mOHa{{y{_nRP@28c!SeO0( zyY6_x9i`$koA@`Mj@Tq4_WbCDxwA@2liyAKdu1})yy;K(EOSto+M{3hv3un=`8oHl z&tXXWt?ljE7{18iB*Pw|R=oqiIj5X^?IMuT%X71 zC@YZPmNSR1u;n%Dzi`HG{)0?C2hTtFDHxn=n6SDvc)81Dk<=g=^_6!o+phX8w)r*Z zDTb_GQC96)<~#CJocWX2K6tDUrdG@#8+Bn)$dwWvtw*`C*1wZ=V?S}y8qce>qV`4ouB-9-OZyqtS=Ou$(b)wzjv4Qya+3`Tb$G1g#1dk*89Bd zo9hL6e~G1;4Xod%Ya7{5Q`>y_^2*mAUTNFB3{I6~5|MDNSncy_{l8c1`5N{&)QhOa zp4`v!U-84FbCVUP@EoZ8v?%U;;v`4AYm5w={Zkm;us8(%@=p*HDpg@V;lsD&cy({T z5C67*e3PzU`98^C{^c&=tHs(6Gu~dA>0!}j<(FR+GjnQ3c*jgmiaQ6F3hse{qjP6V(v++4>pk;+jHJ@%g382 zEvrd!I&-VY#OnXQlRN&z|9u_tZTEkxKAAg`#q0NIMnxQb&(Y(m{#w(f{`&W%f6@2k z{QsQa-=q4zE`E)Z@}?)T?@x>D4;G6*^@&0G@lN)7f!x2k7JqkcFlrS3^7Z>h^uFtB^5HU!ewkn(RMpLq0#s!w&IX5_1WoPVXzO2(FRoq>xQ@@%zAyTEmO@t6EkC3GrHXIMedhMK z+?Ly4@HF(}{r7u}(#SQTmf`2D|!>>stK>-L`OUhYzQ=10UWb4$6-vll2E5>ir_gUKT!%Mz&1DS6{ z$9$C@M|4;w{QI+dk?>Yav5zd)_7i@YY6!0W=db1_u*Kvo?^fFe)dT50wO;3L{ZAE| z@J)M-YQRyS1y)}Zr?JJE7CPDdILPnDul1L!n>|z_d~R!fl$w9v{`pqg|J3~^oR_Iq zT2}w!SjO=q8@5yz*$6~0`gG=4#_EzI-+qOu)Vsa4316GGc0t~=@7GsyR!XHEu=&4x ze$+Ji&)fEiEr{oJ4J-;P{Q0Om`K|agx7(uK28lgtZ}RI)G=FkGnPrl~H09s-H#tT& zXUrMr+n#ZhZCgv+u|MyBhzoIJah9 zyXoBW(tWy@e(&N+n6<9!{_hKOyewBKx`E;-N&iU>kNX96_E=^OAsx1_S_>+CJ#X;y z1-UI_HFLR8U6T+pefvVy7s`5dygdhOBpQ-c<{D1P;}kj-xMXT=&6Znz@|}tHKg`U2 zJ~q@>bB*Rt%=uGpIE(QT*U_*mw@qeD@|~NS^R?nVvxw(cXN}8+3-+_VSkJUlCx+!r z|HB&Y)BL^CmS$DY&Nyo+DGFM!mn=UV|Lp(tz{EMCb6#!vzkJK<9lBv@d4JA6cKc(m zIk9qC=oV*ZyIFOpW?uQ$&t`?GxCU&EfA zWgqUS8XCGi$dE;>!cUY4_`{E`=4eQ=qIbW|42&UC zj0fZwEDDwt%JDkQ5VHF9iR8n1;x#`K_J02L`tgH{${)Wl^Sj)hbhNPM-HaFa_S)~d zzP@v!`MJKA-x-P-UgT?&v{)r}KyJHxpUpR~Wc|kr zGY?uW?`*7mEG5ytjK81V?(fPSzl-)6 ze_85Y1f={u{d*SYp0@kVUrs7beq56{#qGeF*u4)PNwlRcKf!-tP3XIGMyxF5SAPXB z_v>Zl7Hj!dcYgPewX^DWYou1)ZxVX?uLLw4wA^{`=UaG~^7*1AZ_@Vs zUU6{+CqvEUr$ySApFY~#?1oAOg@IEb>msY>V(PPs5%h>Mkg};Tj@9`SWoUqq$ZtQdc9X&v2T$m#`JYRZV103k%lDpDahgs*wDasHpTJ3y zT7IYgN-l3u(Es5--%eJp*vIF{^kXLbtiH{SIQ3g!%RKmWBXP*`ev z@S^XB#aAX|MaRU2m73pbJj1LofkEfllB^4}xAS^9jh7$0a#8r9e?Uui5d+KRXXkI+KI?IU-Prm61)m*{5?38z zty^0Ei9_WR*PMnL`CE)LrHmhhGMo^5^(OUpm;QloH^q;hdcCfjH-Goehu#hG&QCwQ z_#%CQeZje+eij#9yY2Cq#Jkj8fw+Kg_?rF81jmyXMYd zx&3OOrIgu9w}1YhApcwIK>TH%1MJIPJ)PYc8rCotg?o$8M+oz_3TaJ_yNqk(;aso2Jq*E}&+l9LcJZRO0y|H?+?XCDee+%0@g36wH?q7mY1@8`CFfnSxPE7rc=D0t z{k!&S3rk*QSYPsOF@Naqrl_X*LPloayEF^_cC6B4|MIFuTubu%u6GTByjxQ1{%ck8 zPC4It<7!Qhd3;$C4SH^*9g-QBH<_lgU0OV-?zuby{bSh@e3J9qalo0W0RH~#fqJbZGxfo@&R zUDJ;@T)7`#*n0iQGV{A4a}5%eKL}1}J1#LlaT0S@{U?Pd9}N%Ock!KNvEiZm^&>Ky z7(_Ce9=NETGdOF&oM2`1>E4p*o)apzizhyl;Cy`Ly$$=+NsJOMJ;oI;_VcU$nz`Ae zU}cT7_0iq-8#(?NvA({xR{Qerc^-2<{V@$*kirmW{PNs;_Rw!a9BuiM3tevfiQe#2 z{YIhhOZ&HXo0cD72uQiO@|;q`2cLV7o2Q;D^O#}HFzc%U>vU!>T?U`{$%O@yaf==$ zS!jJWzyD?0jax^#>T2F)^~-kNbT>PGNN{rD9Ou2UYmd*1JpA~;k;02t%@oz*x0koA&A?mbd(PcI z`~CUOeN1`R3cor@DyLm#+-zR`?Tv)4@Qlw-k~U9KYiJTmPrt9P{FCb_Yi-w;ed`0Z z?uiY0Fh%3SpH1_F?ryro>e5)xz*Hxk@RLjaUtZ&(MOAYyC9yf!do*=iH(?ZcZp0$? z{p|B!>Vj4r9C3Y@FD=awu3CAYKiRP8Fx!&<+g>=WjSQab5WOzQY@S-{8`b<>R?`?h zwP$3pKMr^`ho>!;d+~&I?2SuT)I_BRhHag3vdTLH0X2wJcsO{nqq) z<{^m(tC?PGwN?4OuufLs%^XA9UFC1`w4PK7=>PxvMsB8+uGxaFT7mu_c{3Fxy5}tS zY5m)ydTk#=*sI6O&etA0P{!~q{Z5Z$hEkSc&sAY-wVuwakMq0hO@2RHv0qY`;{bR4 zWY>0ge&Ljv+4d$A}nJdG*^{!dE*VFK!ZBc+Ps|d&QIjmRa1lEt;M^ZaBmLhx>EI?+OWlc`p~QKeX8< z|I_jm1}-n2-rAY>$}{$~bLWbP3o$onoMPXtv)qO8Y476(r>02>C)HkX6#RYcQS80P zGVdSn1Xm{!ff$t+OEd1+m-#SNtm-qA-@=$u>v87pvg9ZFw`1Z^c~(i zn`gpK?kRs{%M0f|Pi=YiM0~}444L)DP>oJe+-8 zX4YF-_u?X%wsezo^^)(N3#TRB={|MOO6=HN-d*K7ynKrNt6kKuENKtj+rK$w9m9;T zD_+a_p5WM|QTMCXUi$DA2FvrCcs#j&NME(w?DO7QCH{P+{R-}O#ue8EFQ599rNOY~ zh@;9GGlqTA(kaK!&6Tvj-y~k!tI;rJ3F|%<{tqrw?Mj0`eV=v7V5zI7aKWm{YCF=n z65nZ_+_mS!23hN%QzAW9g)u>M^%=Czu9m$JxxT%{`EA366JK9Hws@TJd}iK(EzAaQ zlk%-)4OCYB6~3}5{GW+r>p#xN#XP#!WoE~+Y~MZYYWurbim#zbF`C`S>H0I>K=)l? z$_?JhMxxSzt^fb>UO(P-dVPnTqug@0xh%c^m`_R{SReL4V%a3M#YbLgyRi89T3zw1 zC~5dN_3dtk4|%m(6Mk8Ld?DAkWbV01eJdrZi{G=yxgXJM_`l*J_o|Nz?0nZZQvi@$%FDnRhp=T-cFp;VO0Y;Emez+ZSz>>|43) zWY8RgRi8>U0uJ17+aFoW#Hg~aD$^^%S!XcZStAn@4s*@2xnc9$`rKgd1dICx+5(4 z2W@6DsC?kN^`h*m-3*4txOA7_-pg$r)(NXQYzTg(A9R1&;dn>YcQfzrmv=uPcED<@ zn4V)!y@Y}g1{wLeW?27j@_xQ#> zw-m=kYhG1+Vo(uYP?mD)3)_!VDi7@q7OdO;e~x*SSP_58%5C*a4@LaZ7nC%1y*rh4 z>YuGQtNneMx2LjbrD(2^Im*wtD=p-}gKd)GSqyvJ>KaZ7&Jf9nd7t{GXLFa?vgXhJ zN`K1_F-*DiKj9JY+~kAz&!*N+{b!t%{(@({%t=1EDEh^AEM8f?VO)*u5j-2 zsW!L2oLj!%#CFB1=f4aj1g^e0zF|4Pb5N*rf;{ts{AjUTr+qsm1uf1pFhpN7?F?L| z&-N!ZNXO=S>#z7=$GNRNS}6~T+1^$#*>E5Jw76SODV(va^u2g3!@jAHzt~TzSMzgp z_k3=gCZo>lrhGdrIl=JP0*$kYRj&f#H;R1iuFO0Y@OZ(Mb5T6MSZ6HS(6@Jg-+qVI z*P=6-?}s}k&;8T2aY3NR)%~Bp?7H@N&FSa1Gc$#) z_4e(!sP~oq*u+;AGZ|(GFJ`z?+?Q$sS|fB z@_iXSesccnooMzfXWxID_CEH)Z_2wAUv^!I&%dN|d+FZu_e+9HrtmaOk=x|@K>yO8 zX+5_l)cQXEd*H{SsZV?T8jmy1xz9G&?r@!1&>kKKuN_SOOmeSsXEGdqqvNaQAX?q} zrb4rntF39j53_52jUkbmL%tMXMBC$702@N|2U z{qaz}cdAYg1to_OH>&ecB_3a*s;{$63`=JzY>1fo{XogmlF zSU*{=(x2_bu5*r7fzPks|M%_3kJOoWDhg}bJBe;EH{1u+=>b}O2@sdX)SRsRJ+8V8h;OGfL zwhxX-tg_R7q1YMDk~ot`HL=0FzWItD$0yCVm)iewe`1KYUvPbQarnONQav5q60A|2 zhrfg|PuR78t-_jj^JeGwg&Hudd|OcS)8%u2aPCB}f4LDgG3OBvR6@f9|tyYX_=vp2*-@pBW`!Q2jyn zgXHbS`yO^iu4g#UBr){}Yl7Fdmp_UGW%L;SncjNmd{^H%z_sbUd)GVV&+{E#1!t+5 zG1d1!O5PyjQ1i<6eP^o4iB$>d*zH+gz*d z;J$FJiHVcqRvF(56C5u@PAp6R%$I-UWbxC_=P!%aPJP-F>|hmNbW*j@@R{o4A5&kP z4hl-p2n5wwUd}gPf7<=an;}j9=ZF8g4V!Mr{NJ)lH}>S7R-Lj{w}n|IX1r=yrCPvf zHB;GP!^6eXyPq($aZa$~cUDx8o;B??r^(XqDFQ)3OU362&yiL*X>26Ql-871oHa{i z!V0cuiq|zKe02Er)^%4==OZcZM_=CFmDl|tqw)4S=UQRM)yo*w7%vnzJl&SK_)+%! zUm-clg%=ZxggGXxieYcA|2E^m{WrJgCI@nr^UP8!IkfnR&D1MjzKOrE-m$(#PdQ;R z(>k6;Zm!DvK_zK>Wfaa|Zksi+VWFp6w@-7JPj9mtlPtds^WST4XKOT`Qe0Bkc%My{ z`SS{I_p?f0LZ@Df-ge~hl8k$0-|y-#Q}>_x^h}@w+k;uz>pDFRX8b<8IuNvtxra%d zkJ;b|N3|XQ^W8lEnsa_JZ(+7DVp#j;wa47GOw$~cCve{5eDG%KE8V#8Pg^z4M)Q0W zUNNkM+ z-Jbo@lamezDKjuQFnGE+h8&jKb?a1wnO>|^tO1W^sd(+P%j$nN);n(3xVAN3l5wk& zkYfw+&5Z&9}8@G(D>^a{XBFB4huz;0!UF>Gcz0zUewY zl-c_(?f$mVA6YAQPMmmai{`eqvC_A@>`woUT-;#x2XsWwDiMo#Ne27oRLf?OAHEZg zJ+UdinYN)cVSahxoJtq=85Qp5|G6=iFwC3MbaVHSbqVv+80K;^F59(?rIgcaU51br zlRiVF`WgL<&6il-u{~hiA;x(2*O4FW4;zgXOaCxxJ(Cc)!gx$6-NAfe^IKsxm-E+T ze;hejvmqm(jge_z=psgmz!JlD_LuMfX--}=``>coWw8w31&?!OEbEF*5OrBOyY=y{ zzSt!~$6Ov%=$!psS|jFD6JqQ0j`^?Hn%7B=N+nGuZ!P>@N6*Uod+g+b{XH8mHLKib z$(7~LPDxrL)tadJtJKHL*LM4sui_8xn{;yg`^nGzAm3T~a+l_k=NH`<*Wcac7X9@8 zX1~VpVNBoeg^xzM=c5~^R_5m{jxjh zL7YmwO1EvbD9&f^< zrxVinvoKH8`D2I9ie9Bfj!A`aXFZsIJ-O+U#3Cvto$yZm+ zH!$hFcWS>Xs~6W45f82@JPtpdD?GV4ww7956|s|9)4!X2yuD*txf`*$*-p+;eSeY63y#?AHafA=x<#GI}u z^P4S}|M!Oe5tn0+_s(Z;iJs8+zvOAxi&+MSuaZyh*Z-Wv-B6TkevAF!%{q_g396L62q<3Lq7H{V>jb6cYw%a_=j8%1?FXNvKr z>&y{e%U_$C=C(LdqSfq~{l7cskM5eP{kf_+SJO)CJ0$5;7_#cguq_CC%pEn&*pac( zCF8%`?J9@oxeT}59G;&(ZzHShvHJIIZ@u1!pyOg}=I&2~##zzZ-M62< z$2jNiZPv@rRxer`mh(&Y@-i3x2lu-7?k)beXTAZ)9rN<~EY26ZMTJ`yHriGjxSW|G zxUtgPd9L5?14;{-W4_d1KM%1;T7Aw0{X7m~%z_vN&I_=oZeeA16yaW6%y%pUM18Q+dI$1y-p= zkL?uZ&0@0F>iV)FLjJ77MgKzGvpfbinQ0CCcqiJw|I}Vw{QIm*?)+{2NwKba~#ptkS;?5$0z9 zW-U1O_n!DQ{+^vp;F_V2_5j`yqi%^w|DF5R`}E0VuGsqBj9uF5rH4sSWW*3Il_+xSCZOTqr-7Y@z2P*WKN2@PS*f_=se`u}Fl zx7hvZ&)2043B>~L`=2uWt#>?Iw_Ebuga_{Ev!$rkMBd z`k@{3oTJuH3Q3nfexBirbjM!1vX_%~R2)0A;^B-NonQ9%saS0G{CPXA`igd!_9Ndz zj_;klryU8J!)*R=cER=H?4+&9jfS4aEtAZbI>|A9{`hq}+^qe)1 zZP?Dgp0Z0t25g7#cvV*(s5q@)Aj3@_uc&y znf5|vY7wK%13N~6ObO4J%pI~{_f7hEYj3rI@0X)oAz#`VUdaY8Kk~#pR(g7DRpy)W zr%u1(_9r?|%2DHMcx!dnvfpv(bSvQ#)dsDWcaQ9CH4t3gxp4pQozD|k7!oBJeia=( z#PTAU$@uVsyrykuI*XGV7cxfIJwCS}&d=h@L76t*!b@jv4|(|7uEX!)TE>Jw=PuGsT`l1PQifyE_^Ta+hE zS-xS(yOJw^`GxcMw|!P+`0SMPyO!gPFvIq+X&bNhC`9-&?MdsC?k|>?`){>t;jZ&r z_TEf$(punglqKu!ohPp1KRVS`tkPu=x&G~|3;*}|8Tq|yb>DuJDf=gAz-lacyk+I( zh^HHb+70wqlpDzH?l@^D_-E%_*JVrEKSr-}TeYw4uaZQgIKz!n6~kTaEmrOZo;&g! z7yR6iGGo4^ps9FC;^c7agUe1k_r)e`e_|ume)PUla(wHJ`qkmLe!Q+?zV)qgU03GO zjZ$7aQywju(O;G%_c*d;=F_vq&yN+Fh_+wlnX(jAKuls<-^irO{6VTC%DlpzGTX(g|A{!f7uv9C`C{Fy zhTk3g-br|KJ!&m}#^>?kugdE}Rr|O9t2^y(?8#2wa>!R8LYzH;#q6!Ul=X+M`~AFo zggq;^U9x3Zx%NND+>62r~X@k}>b3kB`e~L&?p@rHUB7 zEY{3C>hr16M>zb!7YpWP$!tBr=006LzOWkAN@PcX1cS?wk`Q~@s43^?sj-$Z`e<6Q>)7+K3u2%?VKeIo5&kmcIEma`hZS~K#;XTK*OO4Z#j_xX*8MlK!z+PctA3vj zf|PdGo0*;)Gk-`bT(vN=&Nd@xTcMOl2J4FcuMe;CPl#>Nic|PEHU96_9p87~?>+A6 zT`h5P&s5&IjyX5CnP%O%F?Gpy=3m)W?#GH>&+C`-AOk>-K1gDagLQQr@w&gul8sX}+B4xlfle|4$6G zz5n0N<{zv3!}{gW{qvRkw^bjTu&U-P>#=vza+#TZhW(c}ZjgH{nQ{BWxf{p!lz+Gr zIHUdKmhY-tG?Nq9Qc|Y;f_rQ-*ke_f7UsMzUDU8ZJN;Q2SHkv07v7pT^0jJqe@^-@ z3;DlweVr)p!G$;aqpELjc^Sy~M9W1mWWp*|hgzmDJMTCCx<9Q?@u%E88`WQd$NSY6 zo`2%G;!&c~D~1g5ue*1|XEUw-%e*~(%ZY|3uNuEtv$;L@xBs^B&HCAff2W;ksAHeu z$mYYx8rT(>$(69DHrU6a<;nS-Jd>j)eD|9xH~;wN_yg|~>eTI`Oak9|b4?M^&@9*m znuNZ*G~wr;ZjA{C&Wkp#*09>NRp8k3XCDup)_4ExTXFw^l7`YtbGbh!FUxIZXqkP| zZb#MGSyOh^Zd&zsPCASK>6vVQ-=tiaUvlno%mn#k5i+jovwG}*9*sX^`HW|lkLRj? zwt0P}3uaznsMu-9zFs`7+wWcFSM_qXc~irafYbHW178!JTveCMzF#iSCS^p0tb!X>5?RXPf*`t&1OHuL^b=iAIM!|B%h zDTbNT9?klEZX-X_uSMtl->x*Cq4;Cv@8=g;8|xn)YBel>7Zam+ZXM_0ec|ilWTnk= z4xHcg@Is~B#C0-Ro{gJ9L$?;%DRqxalrE_5Fkk-WW9QS5gZH1a&0y>MyfZvO!tc#$ z3;8?gjAxGSy?k?jOmuT&&4-Vtza9U>_3T;d>%B+LPM1FKZBukikNeN(=jZ)3W7OW| zOjrHUUh>#vXX@!`o9~w1jQ4E(+{9%6x71F*&DP+=qv+0rjHqp!K+#|zqG8bK({nkZ zc4NYWbKhok)s?!)`rm5-OMbX4vZKL-;V74}z3s_QUY?DUn9}>1x;rM!@Hy9F*pfMK zMP0aX!LltPP5&PJGdXY3xAsT>o5Px$!NIv_29vk|^M^;BQ`14AyT^!CPjN|L^-s;& z8gUCf8Si}+(`i0<;9I-}G9=G`e_xDzSSet8!bChbKQI zN^9@AS*F^{>#e@jsQ&WIZY=u!?QOcuAKC6&$#2Ua-!Hhcy6zv2SXTkN%tZr|0}QGc`QUv+7@;F&CG< zaf@Q<>Vy^NR2)`Kir-iBGm`i4=k1?99Oge>s^hOKT(InZxq77D-1JB$=RBUF0F=xg4!ie<0h6n$5X|J<*{9whgwDDKsp zE~A9Y`3j-ad7OgyF|988VaLE+c?kN*e*PLSsep0>Z?d`nXy0^o%-X|(9 z-5kjC_xGE0d+E7z=UTQoC4Z?pAAEIx@f1dII+)1xT$p*ml6=i?y_-MfgVN>tE+(dH z^Z);xfBd=q|DRV@aa>!kZgFegrH!vD7(acxo$o*4&&U4yKdX-Y%+kKS{@%a&zwbOR zV$^yba>m+U`>7VY1eO^d$3U?*?Q{6J=3hR zz?VuY?fYq7KiMy5xz+pNm)@TBx~FYkPf&lcZ{C65MSru40zQ5JE4H8e_2~~fDz6d` zHnINP7r(AIc<=IWPrlc`|Ncn&{*Pm?uRUA&E%utW=7*|4(E0;?uW4`R1akcdjNg_M zS@Zw*{quDpud^P1-F0-%=k+O%#lNt=v;R5SzVmQ9|MOzCwUN6@GFL6i)>r|M>{I;bjvqju zEZ{lN=~w@YdC%9i`Ddr9{AWvBUf0EQPrLNGSA4(iuNVLC-<#QRGjvMjeyh0?ScIlA zByxH;b8u)had&VX6curm-7hKYYA^X$CSB(E$HFUx)oE_&l`+R;UEKp6T?AbMCdl3l zQAp%u;rQ+MZLjs*CA;^3FVFjTw{-RS*j>NNzT1A^H}(0FS65b6yji1u@f4Hf2=RYab-^QD2{eDmJw;q!#os-`l%Vz0aSbS1-`U)=I zk24qkywGkpMN;oU@4G9_#_TIjS6JQBHoK?rfBODEPa}8#dve_V+&&M9^Pgh3DF>La zM4e!eSW(ZnBV+BAXTO||O-S+iC&2yj#{`}Bvn8dasca6aI}{dm>+jp~#;`>-vZrI` zx0~tnyXKb#svW;s^rKtGjnQa_LLT3q#P8O#FKSty__*iuIqlmHYOxcV7yAh;f2Vyi zYugX~`k$vC>Moxr)o1tX#fE}|O$Rb0->6?oG z{g%))hP}VHTt0Lhh0`Y8J>mbGo}-hb-q=5xUVMJj0Y2fiGpBzov>RY z`Md2v;ra>U4>&BC7CS8{_Mj&@8y&VEqrvCwZU$&);asF#E5?iuIRy8dvxJSigPt zY4vYU?6mLBRer$XW5DEU%uwTDbWp!T{Q4n|1ePx|1QWdf-^`fL%eYLs#INL%m7ZMw-qjERWt1Qp7k+&+cmlKQRi9x@2&s* zQnJprNNVb`Ymz^|P7!|nF3}yN)2+#2wFHA%#mntSz022jFu3eE%x9f4{S|wq(E9HC zjn7+lXZ1bb{dQY)q!16&$p`HXKQ=DNDtdLXRsQ2conKjfM&E8E_iy<7?KZz!cj>}8 zRj*8D++^-+P=3JCBfuEXB%zovujY~9gYvunc0ZrI*?zD7$6@(2E{9DM)LVM3Kb=rE zKGb6IS?1%PJMXUV|M&I7#r`^zHF0~bytkd!+s*UrcJ=$chl}TZp5xf8;Lo>fPL_S? z>GMDTeOYdQc9O%lKbz!teK6kg`Po@+cDag#qwxow#V^e(y%zcK5Vt;QAc)a_nFX&<~oI7bMsa5&wPH_15tHzpge{9kHLzoq0{k zYo77sf@6~DJj+s5`efz_u2XG3bn$6#eoeB)%O#VGN*(>yE@d;C^vpNED!AgX^t}lu z7xER_KKhX0sLXL?@nMc5m6rk)9^@KuU9dUbqWFOAK#SvB)?QY|4oRmT&;4?n{7$R* zTiN={EQwv8y+p6FRH{>NYDrr~*`31U8{Y5xeJ%A$$fU;~lbsX3y}6kzY{0m)lD*yX z_w0h}zd&XAuiQI9rZT)Qmou0+u^G+w?R(W3C&8doy5~)*e)f!clit_;P$=k?5m{Htm?&ezv%=+*1hyY$pllId&?Lqgp(d;Qxf2X`uY3&N9-=kjSXIZ;-Ro(*}3pZoo_Clm}{CHmSA3?y7RH( zWWKt`$9ivS^cU#1=UtKI(R$fAhgaIH)um-mnyUcvvrmA_oa#Pmh=FY{9SCN9q|k+*CP6Qfq2EPa~# zXnN}9b#Ee->-_e;-ooqN^QW-nm{PRggT>A*ECvh;GqdKJp1-p2_;N;}{y@j}QyoP& zp8H0gT>AgUpB82QBgZ%dWhWl@h&Vr0ZCdvmFTbBbJ7>jS$l>^@m~lyQeca3m{NgT$ zUN*-V&g^$nD`jW)@Tv%#+Lk2e4x0&y2%s#EZu&p`M zmVqf#JUk-g4ueL{Wz*@8WXeC){N8MF(rWt+n`N69Kc1PT%rD5`;;8PGZgE$SV|KOM zo2hR9PYArc-05ggvPj@FB7nTC6|3~Zrn5H z#P@UM`-~?m8!5+YO;2r|svVy8Ye~`WUAs0N?wU}2nAf~z{+}o652pnCalWrOZf#^~ z#9&Z1uj3zW%?#On!LT1nw~$Nk*ob_MS%=qPPF5(w}eJ_n&n;Bp|GEc#G9s)29~` zSIeYqe0Of@^Q4_Uza)H(xLO=0oc^-Qt#6X&yeOlU$|>hw$nQMS5}}a1;nZZ#n_UIL zv6_>2IlA2cb#1#*CFdq}u6yArrMIE?=_dCD zm;Q0QJQekG`~JUg&r~?*l`iKwxilwb(e{#q>38>DvJ;&5xMIG6$NwM4?bEE3qpdFI zJqYOcImsMtwx{m7_5G6_;lCC=-v8(H{+9TEpQblgYZ_z)yIXP0{$9MMZ@=ZgG`(Ff z76rKd<0$(iuf3=B{CzDphOjRI@8f@@X}Ym~Iw61d<$)h!e|Mg*&AX<#+Dzb_`@e_s zOw~;H{(alte!liyapZHC<0sV|-M&nnV|6rp-A=XHQE8{9)lBg8`O>rQU{g?L^n@`}Jzg%9Dm6#HJU-)}d2*|eB6 zoe94?{cDtBs^4zicKy|koKupAL^Ge9bX7ZcVpHnrL+1N`p6&T!lJ)nn{J#l_$ATCx zpPBRLILEHInOj(mJpC=7?EUlUwDHUyzw`G0{}lZBcs%_^kIOP1u9HVN4js68dEW;H z<`WZD1z!dB$81R7CG%00#;qex3y&VeHffK*Hh(7D7_N0H`9{o$xSC*fcSDm&);h8g^rAp1$)$zQ+ zx-zf1KHe|CUwiXD=S#QO1|0_)%@Xd`Z{Rs>^2X5o#uw>e@5Q3;e?~DhUNdBfT42}} z)_OVTmc881#r7;`mhF2kSMx#P=jE3dAJ)H_|4;Mv6%Y4x&*#h1kAxPLbVLQG&kYMc zI>q(*Ss^B6k4KVE@6>!g8(CTTN#pa^_4TzsE=}JzMUwy37f)|?&&U&%XS3rbujLeG z-?$-|a{G1kF70V0o`0SLFWVg6xJ%Pup&c`SQRb`N<@`Y2I}PPtzAn1n}VOR@@&d(D`r zb>vuI)~DCT?-{Rca z^C)w+_}&+;k+&Cap2qa4K$XwAPkHjiw+GqfWz=R@Y)HJ)_c5^F=R~y8#py*$^y`^> zUd=3Zy53*=Ci!84@gz^>cE5xre-%%ye*X2>o^GRv8M)fU?)wy4rteW{nQ2_nc}ni5 zuPleew#3iVj;~d$PhH6(I4-0CH`KCY0neBtZPyK|E}qpZY4!@qM*g|hog z$rR1(I_~lF^ZfsFma5Myd2zauLx16C)AIj+zw=99P2=D8xBcG6qrA{o-oxnVCp?Ttmb!x)0nb|K_ZgXTmsluz`@mDeT ziPwCuT}qQ}CVAg|GJ$*NLh+9hoO_ffXj^>VGi!04#L5$CDf;a?Uye_B^7CQ4{Jgu1 z^^Jmeo>-W7L^#dm{3XV>OUoxzB?u(BB&?}>z$||vEm5Q0#^TZjo#uxV&YkhtURCqq zfo| zKGkn7jbNV<6fp50*NYc3KBaG-dZNBs+VO6p^7H!bVR#5V+Os(Rw9{{O<*pobM5O&-`nlep~Fk z#Wfz%P0!~}^!f61=86C3tlyuR7HaqBA%D8J*sP^ac0ZC*jFg>rPslgvtGTk&=;!>D zC;8UpbN;w9=dZPK)(=}d#rMme6Ko6({4;<4-KOw1?~Z`L&-eMNN0zr-E|g1A;d8vq zc(K!{DlSEO-@ac{*QY4kPWkoYxV_xJZ~6btUaKf_Sy}P0`NkiYHI~)mn=i>UkwrOs z*@XYE*8kHomU&@OsKnmGIVa_!Zf@piNE%g(kn@M#=7@{=*|-i2OanSI2d@`Q|>kFfskb zk$vK63si(_Z$AFGVlR76-H`{4e>|s8vN!gVIQ-yYX7Toq+ zkcruO+OkDluf%UMFcf*jhdQ-k7LlCrtN? z-=x6$$>1n|`vAB@-8}@vEXxhtW+~o&V{*war1KA`UM2|n9{`UUS8n-dz0t*^NfVXJ_*Jb z{fpQ6+&%up#m4G*(aPWYbsxFqQa2m)lqvFDt)5@|P4doShgz+ZF8)s*DO{fa|IhQt zzcX(p{<5BWavw(;qk+)@Gk^b+OY~~`+;1-wkLUT|=NW!!V}H}G0J9lMHBGEV7p=|K zB{?^IZ+$+&I??T}ME03E2E|8rFaGxYulIfZlEr*SKIa)rmwvxn-v0CR^K>>Q7ysGG zEJ+hKT%7W4(ObJO3;9!@^q;dxxo~dI33jy;a%&&&J@(_sgr$DX=kA^TaO?Uk*6It} zGV9gm_J9{RE=~@Vn5&n<;ApI*+Q+@f z*Hg;&b4u{El*#TzGaokWP!vfC=1UEq)az%|bfEDv=gHzvC)LwKj}$c6xQI;9S{(G@ zNW(*h`8IPs^>Q$Fbqen|w@hJ_pQpP3u-*m8+) zy6bXTYmSyZN{StQB`20nerjyt(fYjPkCkcvIkVD9u60&LRuQM1`NY{+@Bh90u$V#M z<&F9S8Wa3Plv{gCUmOR^B+RQ(+p;8brApb*|uKwrjpi^CdOZj z|3c(t$;+Dk zzwf?Jo2%T?ATK-R5(*4}|Gfz1)lpY`fa+{DX2PI?V#jgroED!%9EexG(2&7KJf%Azupt4 zyc4PXY(LjarkE4f#rG$-6qQjY@s{IFAw9hN{7p?eR`F!ql zUHyx0CtUqYoXy1BR8J@DQJ!GZXO!Vw()j0M>XtsM&OefW7vEmc{KxXPJ^SQ?CUO$C zOu8mFbmX7)$W1zV{^tIx&v!^&;i^>sbMfGXM#m>sPuyi6T{ipm>xH|0)V6)z=^Q%^ zs)C=-TIF76<#DOVNv_3d#<^aAJ>rn^zZBpX~eE^5-qa@KGgeIuZxem`Vc$aa+{l&hjs$=IaU)?b^A^e9juL;H zdr!>Y^hIyN{PL*me^V@@mY0V~{|j+bJAbl%%Z6+7^A|9$>(p7dso-zXEQQq95)90B zA_dC#mfL)C*OL`X|K0tkb8+zF+fVEN9Irof?RIB#i)m77u#olj&u-~UuD+PuHzoE) zp;d}=)sc&d%H3yM3#C#{EW988=V*M&>`f8&Z8MV8lUsPBrnEkEZ1-D!=3TB^%G8v} z(=Xa&uHXFmNAS%f&Z~SFH*aZp*R!cJJy>k^;Z-NotfU{M&Wdi)y1UeT{z6ANB_X%k z9G5j}(|a>|%q(lv{PkLn@3J*gJYfB9hw|Z_vwZf=T5wizPl(!A-_%QKFJgVwte-@h zrz=Ny>3&VW!m~{x-r|;2b8|(>`QiymZ@ZH{yY})c<#@~yR{5!@`DlXc-N?)5FAGOX zC~RRgj*)t+Jp0p1nkl^!!6w$W$tn<%sMPNH@;@&WjC?c zo8KIA6H8%abZE1v)95gb;b1v*^7WihJ)=nBXHH_WyH2#E$CS*;F<2bav3~Vx?blNj z=Vfj3Jio=jrM3A&^35ZjW-eTu4iRqz)~7K{)Su=n5p;fX@5Dpp?@y@unkIV`dG?>% zBERcMk)nD*+AO(6EczTv#rU?cyPUXU?KU$dNXm&yNo;hyMb^2wd={o-?6E81LR(&A?9*^@4#ct)=G z#(@)jKQ>M_)iu&zecY6bF)h#R>mAX&T|ZCdD!ml=DJLoa;qmFb*|(?iPo5Qh{nf3n z{7d3jg!;etZ&y6^rRvcdT!E%<&U%I&?Ac(#OI>^2aw69pK-6x3aFGmWh31 z!TFWxnajPFA2t76vZrWCV#pEW6J7FLm#SCps*c+;6S&ub3{JXy`;c4<%f zA*W4A^0peY_1%An=$nRJ+VZh>>xO%>mp<4nVmDUW(|)F9sdD|J%D#&R(it$bC19)w-p76* zv_SZ{p{?I>Pj|oLZp*!vyH(13I((u>P)gR~V~@bkX;!MTDaKXmyhSf^Cbse&37mJL zHUH?v**_xG=LP4fsxvEJGoE@k)tK{y8=v^o$8OrQcTJxDYmxb{Ahp8esoi;3T#H&= zbz?n`v+m2%FL4S_5o-5Inao!y(Y(hzb9d_08{gzJBaM`7KTTNr=fsf@A#>8iW}Ho6 z(V3G}*>W}Qi8B9eeaWSdI~MEQ)3uzs`uC0LIdm;RkftA(ZO>wQ|6bs{ zh4y{rOrO%foPWbw>Gt?U`@Wi^2XuUAHvjQ|)MDTFeeEB)=}$k--l%AB;k-zy>8ADH za&l75Ey@LX7#b~WP6(PG3cJnX!G7{Y%5C|C=8ajNg%j$RKCZP4NbQ@rb}U{l-16dUt^M~LnPjfd`u{)aZ|3XG%ymmIStKF(zW)F3 z&4SXh_OdIVEIr0@{$ z-oO0Z!!0GfC}A6u?FHdl%NNfBt>3ho#(z=@-hJ$5e1qMUnS8S^X3fia5@@#k*hG0H zM>FX=9LBQzl|lYr)aL!V#JBZ{Q`)5NiL7jISOp?KN-lf?YFxA4nNceE?B!`cxmP_G zj~%oAu=MOsceSDw=9>zxbU$S>@RHr}NWZioo;xguRy95!1=9wzrJUZTFrcbLp zpn7#`^@oERD*9HzVr-hyTsOa-7w12*Af{vLx1{*yl1b}MD9yhm&*ZL`d(cSy?a^bQ zC;lJ)CVc((?1fH}tHi$^e36iuc<01_*1ALUZ)G25e4oE{?emKGj&EAG6aCpaK3;z4Y*bQIvY@cthn*wP zA*$q9$(E7@KCSaol*Qb>mONSWdsCsnqJ-M%e_19(=yd;)kQWe{YqeORkE88`rDnec z4>w1bg~zOk@~@9g5LnVsCm`3xmf|XDQ6h3PpihRS(K(+(bg!cNtG>h|%S>M}cuwH| zxji?-5?I@Z1*3s!w(+&Rz&^oBQRt<jZ`aGE3)K`#$}i%5lc{ik~4<+zf0H&d{G*^8HV6l1OK&aepKn5+5o!^Fcc=Fk0fq>%rhqeMwT z$$~d$o>k|iTta7e{wEt=_8cy|(b>(01kX9^DsRZGLPFoKlv)jpdEOCy9@*FUY_0 zm;F@08oc3Xqw?&Z75fb?-B9tcyT^Rbm`9r@)a?Dz7M`>zr>z_6YPwFmkbT@ZlTY?E zkK*U@1L30W5z;Sn{>QCW@3XqN?#wQSf0>q%i>&@H*5NVZ;na;!iF`YkV}12n*|U`a z9J?)kUgu0tp8PfcY0MU(_dL^mY7%26@-`GLcp2%Per*S1z~isU+IJgouiGR1@0*d+ zGULU`ON5(aX2iYU#wUO1sjV=EG2U$u*u4Yzj^UT zG4WJ$h(xaAt`iFmw>`+LD@$4|EuN`p*dg`E+3u;c*-FNSnpe$@igPXdBx+aa|CT;+ zIEY=PDaUQ^1pX!MdJ_~k1uuFu?~4G>rky|JWPJ?vR%jn-&gl{Mkgt`T8f0IxLS_1{ z<3*BFgW`0=brc+*7&$k_oLaL)f5&3|HsKix{5xM9=kc8`Xmo7;KCOgjY|BQQ#gId@bJ3AwzWGR zt(JXnec0oXhIH-4!b_6bQeUQWxAt3)#f^)*+zMoI!Bn1|_eJ-?o zq9|v(L&5ixGh56Y_x{3zFZwI=PK2m`YUJGHIos-_THGd0?smTkw!ajmHzoD{>QL@G z@ybwW=L3P$uJ#@+D?dy;;i|tuOw7+anzpZ4*VSr|1NepIx7<@Cbl3bROFM<#B^Gtf*Os;0wLseHlWlp`A^Bak?~3Q2 zP7|K7F7>$SVv|$pucn`iwK8ftTRg>4>dS(2CtT9MJfAm{>x;5%m2p?wiV*fsVb;&4 z?}>TC@&DTPeN!c!1$uad<~1@uIo}$Sa!q;qF9R!AyPO$2qY~2#Pb4}}W%U2zX zb3CMW3aEciIMgAtbID_-_;-ai;s11$e)gA4_`G4ko7Mnx+*{Qek)+C<3 znS5~B(oaT#|KqHmq?>=<%H)^s%g$-|s>S}10>9PX{#)f|OV%B^X!!s3{=d=NlIO1s z6ZDB|_m`Qw(X8O_^ZI}3W^eu5dy{|7$xOBib+f$6xAowRh65V?nUTFk#*W|Qjb1D% z%sH2IYR(pm8lGtrB_sp{Qx|B-46@KRq1KxMPC)&Z{Rxb}nI;e$^Ml(Xr>s^!3I!WH?_=?)#!V@w7&ia!De) zVv&&i>qmR^jZP`#-cwBTHMnrVX9+i3(TfEui#^0_AD3)Vp8jfr-E^6nl#5~yj($9- zqkl1Ni}{YkEgzyquE_pfebR}2nxIGf#x9*#{x-S4Klaz#bTgk`U-ML3@@KGJpUI0g zwlXj5qT1g{DEwJ4W%B=wK$+(?*X~_=5OaoMiq7dmy`nuw#m_Q$=<2@P`J!=6;2Q%4 zsgtpiObVagwfymPXg_))^vQZ3rFyf#lNWDJoOjM&cEP;RPgB+F`grQh8&-y#h*y6a zI?2;U_Q#)}pEqk>D?Vqbt}LIjiuvC`{<;aiCodOHmMdyfcrho^`RQgWN!E>eEsBAC zKUMFSUXL}`ku{oOm*#Tv#Qc@{Db5dkekM)HP?@bRU8Ju2d|SlimGc=GG}n8&IEHjD znd-;J!Y1g(_jO`S&rGi)t>W=^OXhF@qjWx`Ii>28VjV-U< z@;T1F{Fw6l>1L8j-Mu9_e@;(!-6^3eqj>f@ua#}k+Xlu1mw2Rw>QmJJG-~FmvB&i) z)bC}Nh)8{sA91t$`SIUeAJRU&-EjI1|7OXO%m%*2=8@6?KR8@@-iNlal-vl|s{Vz4 z%bD*pokO#IG~T{@xuJ!Y&ueS z^|8l%_oyfB8(jXKNDo%n%s(r3fz8yZ&z-lt+4a04p=9b}o07EqjPsKU;~2BQP0*LM zpTEIz(hi%QM-=&-2y1x~x3V-=5?@N(_MO8wgIOg?1Yp!15gF6UaxvRB&ie_t7V zQs<3#PT*MjwexkD_L=(}?*)D*ojNhUNBtas*)_A^$gM|yeC~8gIKVgO_MVxU4y7xd z>nomG3BRdj8q?QPQEV&(B&z^?n&1)oJ%T;Ubo3 zm9KYVij9)x()G{6jSODQ**T$~KhDVI)mrA47u8EA_39taSYmZudHN@JC2`x&Pnz~F zyRx)6YI)T6Ew+7SPU=q-jMvrcN>;_KJnMGL?!;uBj=4|y?NX1tG(Ns#?MmkN=BKSH zEm9?4|LEVdC;U&8^81{bnGPeq&zp{Gz||*6sg8e%t82yYXVdO^)L$ zIs!%KhUQp2nd-#u<$fyB-bc8Y@4)VRU)SYm&GnncH=kQ+g<5xd&z2eUQmtkS%2x|S z+)tfy>UsLc#d;+dO4huH^tQ{~aYDUmvfYV?(fQLn4>X&+&{JL6Y1@oi5nL0 z&9qJnu<+=b$@jt4{R`{-iLX3o?wNncsakKxdR6cDT$!TJj<}>L%}_k9Le z-5%H+zxZ#${~vPicfXw=|Nor*;XNn+-A>8QG-6m1)mdK>uCV`R`{_&k^Scv8#EX+8 z^kZtOk8b}j`*8C7AG6Nh+Xw4{xW@X%(a)PGXG ziOh<};)9Mn;Vx{dR%K?0by*~lyCm7ub^iv9$KA4j-t1h_s{LNejrsL&flar1er;af zTz!k(M*F1D%j5?W--8xru-gaP9-YQAV{6qq$qlQ-?Vc`Fe(#{V^UBs)%JMftZ6BUL zxnHVf^5--6G^HbLM9%&B7rjO~Wy48%+4>7HEjQ!OstLwQEjhK_{p`~RZE0nf_~);l z#b}V=JpX+A-Lk(8U&GGEEa$w=`yhz9;qrGQ<^vmU-ClN)e`9G$>4lX|SFOI94ls?9cyvUUgm?$DVV3!f&?CY}GZJ z+>$4uaqGkJzZqYTUN|r#P2Tk;XT3(={Ap>&e_Q?RUn+TAU!QsYyLY<}iT{7RHjG0h z*s6M&$TY?VL57FPEFC|dMu!ydyyd*}*`@81%v2k;=RI@ZtG)E&4-rP?$Bns{=f7P1 zBW`YqjQO;J#ZQ;+>RJBhUO=UU5@nUl%!?nQ3@P6wfr)K`?R1Tni_=KeMa1`NtfF8=X$#+PkfuHF3_l3 zE5V@o{fLc8>7Fd$(tod8?nA5)#4<^WeTR&yzIz9V)+j%Ca?Mp1HJUuPl*SV1I zlvdArgO9BRuEq=uru-?7ta6@Tk1}Sk*goa)d9I5LXBVl+D$JFUjazzdLu5&*txThv z!i2MB7gx@HJXd|nSE<1Jjx}c90!LFNU;XKyxc@}`jq-m=^=8v|YO^uzwUuC4!^^u* z?`VKcytmm^)6J`oJ+kRu&nJCq-A313zIpl2tW3A&`Tg^~YqKs!S@6J(RDPc9ziuCH z?v@wa>-N8f*KpQF`_0*Y|9W#acuqT7y{Yc;CK=sTA4B{;J?qqZ#N(j)#p+GCTiDIa z1__4U;a*QZ_BAM9xW`d)V};Cg!T%PHjRz079XhSQf6t$m{Rbb{-cOb{Hvj!2d(HvP zMGDyzy=l?d{ zRWRLrA4dYim+$&pB^!7H9W}*Y1}?3z&6nDr!Pd|q`tr4$gLk3yHQO_7a^>L74?ZGH znm?yctzPnXL;qZz7wvzhEDYK++qaD8!-XsRJ(eA@b~a{OHGSUeeVTt4NitL_9OJzp z7`DFp*qMTJ@6UL@E(9B5BEsnRquc#o>Y=%RPCw9i!&`Id?%xG3&)>55+Y`J?`)@qQ zrG8PpQ)&kyo?EPOn{Z!pUPVf##iyUEo!r&;3rjEmxnZQ z7*EWP|GN9fqwdr7H`pJ>#)3vcr_DK>d`DEeF^6qIedLb6-ym5`cnPAXR+M<-p(s6e!IUl-}{*y#|F=plf`e!%y+uj_;L1^o7*o&uK5qz_+iNO zC-;N-q5EEc%AICBZnV68zyEu$VD?3Wzt5(fjkJba?>5Ow!B!;K9O^;W0Z%vFB0KCJp<@K%$_zt(iHF)T2e z63V=!E{`JfV(}~Xs6Tr__Pcy9cA* z{=;?G@+vK!_VVB6zjNMO`1fA{CR6Ke3zx`&_Ii17$kf+x9N%wr<2`q{*Tavlt_;ix zucwLLT(D^i;{?H_JJ{m=3U}$Z#JBi1R620I*}*ttUSLi9jU9=NXN#Xd{b~W;OC;6I zaQ~H47o;{HNM*_PajTv=v2pM@t&KZ&~LJ4+PZPm3oH(hry2etY-ZZ-$Cae@oRHean{BE5W<$cqHwV5dTrvLMQ<2SFo!HSzE7%cN8g7J&fK}_@2c#@ zEcosEi&?58rcT~DvyE-w3bSl4j>kv+koF2?pclNcEu6lGfE@fL*_iH@BbVv(A5ewRfaDoHUg`6(Rlb)3-_ zlw5k_e92vzZC`#FH3Ssj7c2ldb%7bv>1pwaotMu4KcahT{-+6#xF3SnBR!b%CzavE ze4%xFzb)L5`B`=!Pe8}_i&INLdJ>8RHQxSql%%HddJ} z*s@5HVbvxFe`%$?%MUJVvH$ne?f0C=ne$l%Y9Lj~0}dYN2LJ!Re*Zr7*#FurPH{jpuE*SBf~;~KXE;mt??HO%F_ zAU&_*QImmz!Gp~Vl>$|B!092k$00p^!_r5m53k*Bm!^@xa71QN!8}EQ&;AP;azvRK zE?jO4Y<_55ds$L%|EFgc?iTmwv$5zwYBvieNhY7a`8PKy-YNawTBiRg|E6-o)mN^j z3`yPEs&(&@KZRE)L|?D`_40E_<#$<769BY*(%@>Hc>dd6*@r^Ib+Lejxlu6rJd=bJr16wt&a&zKKXYAv^SfUz=Z5y5wCC#%Z<$cx z{=M~UcOJtN#`VX#-2WEtxUxaoJddkf_gCGGU0aWzXFbt;@iExt8Hp?g4Ab=fcGiCX z-*Gj_`oC#Fi+j>Nf%Oj_2kjS$-ta&ABtro6%EA(P^F@bDiqdy{xx|`y^i=$B9fyPW zqQb9(lj=r=16TeZdsls^RXjE!=?%+*O_E6!PR0z61b-%LZhiS_TN9(h;Uj*$s`hHN zk>#J7*Z%#Z@#Txn!}+Yo1gdU;jSzEf=&i5)8+~Y!>ivz94OhdwcQ`H4e#`mTXpLgt7O-^n9oUko zxF)79(c*J`eM;!U{`N1X!aB?j``G%77@jmUJ)BnXHi@C*Lh>d5!tx}Z#q*^&s@m>LUR(2$&p6#q;M>jT zF1Ps&F7M-;zyr(pU2P0(2Oj&^*v|Rh?d@A?;eSN__XPVT>%05*KehfJX2P)MZreng z!W~{u)~DOdmy)Y`@p8lay6nSqEY*M1F)S#A#2lkw!mIkHUEPPi*MFG%W_x_wwZFli z`gs{9*1rkMFy6jV|9>f|sXn^pCiHrQrG8@9l^AZtK0-a{1yukqL*Me+L(v zCYDS&ziw}MxUJyZ`G2NsVsGc(GTPl=Q$MpD*p0AJ3H|%|RdFw@eQ>IIq|0|ZP z-|&YiWM7?V^i2ka))_ZiyEx*`m+HrV40g)TkFR*OvUQv02ant08JX6o@}VY?+5488X76mczovi`@p zoL3pi-wzcyTsKVo^~Exeg~JLG;u%IPH$GgyzhCpt_8;8eob9jAEPL~#{Yff=Mvwet zd*zzmPfw#mo?WUwDt<4&l(~UTXy*0D$1_FdNzJQF>wPP`SNqNG_l1eK%B*(@2K@Mb zPaD*SSlh<%gny;|p9|9u-+UgIlK8{7Wxe43KQsPF{yfbfaC7-S)lA##d~6JB)r_Xk zKNi{*-tEuZZ@0}R$NcZT4d3@nZ_T`%wo_0c<4!raj-Mo`A$#vu{@*Xx5A~n3I=|(h z)P)uH-!4zweNEc^p@`(SL{WZ<~T|Z&VZecbW+sU)#F%rhlE!7p~LhfoosiI?1p=)b+^^uH$Q^j~_oTdhGp{^Ir2f zZl8~k`F7{C>NfR+ZPJW}EplaG4>Ji|nDt+|zs~m0hj#m$VT(@4Z|c|Y{qb~p@IQgN z=m~XqjNWE39Fe#p+{epssl1K-&6We_R(2n{S1l{M?RH+eIn%4gie&0a z?=ZIcbmG#5-9N*ATRkxN{c(Zq9S#8(Nc+dYkE7tk`D<&l5AXe6t2n3l+|e+vUn}FS zKKY;AFZ6M7!R-n5Q*+&!8>+gmJQWUK-~G9yO?`fh?7X^X&n|5Jzb~;}cGsWd&97Q7 zUbY0e(7=hs;@))Oe_}d+a&~+;^jgPUMohR)%I{=+@L$7=+B)?uUZUoeyQLVm%;<=z zlL=q#`q*afx8Ikf5AXecPk_&+AZ>>2>y9_-m<@wEBX0E{N?{jbw6)?nBMpAcHfue1GjH7Ft7_+?mJ{?R~RD`CUw-;aP=1b zJ4L7GAFBJkev`a_)v35^Z)-dq40eJG@&g)z37h5F4t#nl-v0UgZ>NYoEt~&lPpseb zEuR19_N9ss*c_gg3l%+IDsXbL5nr*q^*mqB@;e(f&dk}T@y70Zz-{pjtMxgL2vkC< zI6;MgsQ331?*FJ){_~(Zy)E>0wT}7UBAcu01NVEx*ZKUp>h>?!^WPSy-O>yR0o_+T zmBV${UMgv0f6Lvt)H|Q!^Ru^N+wT8caHi_3D&xb)kcRkG!3$IB{m=h>I4%0W>7P%3 zwBH=BQOxSFQTuPP=4D;YrIY2K%nd%xk!Da0d8Jqu^enQgvT$zV(^I_Art%bLn@p5QU#MkHY7ike6q6SX}q>)%4){ z*+0I0xx=85|2@jBA#UEMn5DbF%zS5kSlEBfmh)ljxPPCC7EC*9b)+t=qWZq{1onl; zK_{?8D;-}}w@oUy?UiM$f95(%bK6luw{h#sUs`&D{XeZh5Tf7Yt zy+J#s2?{*Fz`b;b*Z1Hz54!#p?9LUqv*Y74gYxY+&7=z)W>{TKq~*MYk;&(~@vHZ5 zV+H3`{d)fJQnx;rziw=<>GJ*5>yEeE+}GrN>7KB|!?yp6>8Jk79X}My4=L46tbG+NRPLmp zW_fg{eTzd+e-FdFQw$U4r?Z48{l6ig@c&xDhlACv!u~arb46;pb$Q>+lw`6~Hn_qC z9z94>R(N!OQ)+O;=5JEBZ`Q}{_;~DSnC35sIVbGZetISHFo0@`AEM`2Zr2+zmAwCF z#=^3XIY_cmLb>&0Y3HBh_{B9p4PPEloHv<2vi4zz^LIY|`llxo-^nd+n`!(!Rhsp# zfI-F`Q0yxTUXc1fO;`HxE7R-k)$evG#1xty|KarRORZ8}@2k}l_jSbERl0s#ncr{p z{E5CwQH@~KIpzK?fsVo;iTLRrHl|EF{5kFCNls{VusXEE?zeBF?O{&!J;&;@eux;e z%#;41d`RHK;TA8BpZ`GtxQD~w*7c8jXIF=}T{U~O|L?c^ZLinwKR=~y&&&5FMbGW_ zB{4Ttyh~Nl=&w03cY{ZqTZ3z=-^X3$_KprI(_DV%@-Z2PaXmgRu5b4JM~u|N?iWvw zyER^VDfxZJzYVX~S+|DIukd;Cs>*qW>FoRBHxdixH%K$9PWe+0%0+xECb#ZqsejJ9 z^~WJ%-2sfR4=cO*(J;<$&u^YkoQZ+BoBk>xWNYeZGI{?AI5p zdlNnBU}S^InZ3KYI4)ScbL(^HnSJQT$D{GA-+#m?eZ3+6a(Q84)zjzw3MreJj?0!; zSbS&*Z;>sxxt7NI?QEUeOo zXp!soR_pgQr;-%&f0=khJ@J)!IOB%swE1@7aW#Vb4vCpcxJUGrynE%s&{Sk@#ggipmZ2sN$cH8Wk zl8h2ec>)bnK}|XdT_(ea!uOIc|Bl{nm&^YBPV$of$2X*$yqkEiN!`aL`|GRUNsrWI zCf8TV+Xq{m(^qz4YpBU`iO}QIKKECO<3hqaw|9q8slbCtPiM==x@h z`G=+)miKPg<$fd3XS+@N&Gz#Pzlk2~&iVY{;5HwF>pV@8&1{Trje149z@s|~ZVt1* zyZjNTi@(2VL+0hliEnqYKKyw6J>U1c-vcUsJQSVAdnjzb*yJ)9v6ZKv&ph;lOIuDU zyzbDh?FlzK=2z^rSYz@1wL`O*Lx*@aJ}-OzP~eW zboRgJJpR4V&Pws!$IGV|ZL+Abe7~jTh(=Av;n-vWkBwJs>#7{@967r0M2uTQ&C%eh2Bt!E_~+&26CW`gW_ z&vQ2<0(MODuL6~=29_KS_lmf}KmC-xmvs2ozI~;M3+ij#zDe(v=ax3J5ei#dp=GoA z%gqfHA2*ksU;p9gU-s6H38MY+Z=0T+RNgdw{xd~io#3Yr9tYX?ofi60zt~x!s@P5a zKryeg!m*HtH`Lc~C#lK&*1VX^q2W6(a6$U1<<);oWd1MI{JW*#f}?f&-tRMn%WhSQ z|K94fJMBELar&FQYOZH3D=$Brk!YY@;xkilSxL_HSlQrhn+2O&mzSj3KS^ZeEjAKs zvz177S^Ts&i1++6jw`(l9y{Lgm>l*J}xPM)C z+qbobhvG%6%+_+;y?eUnMtDo<>uW8d+F|YPa*?vv*4<55y6i90U$(xASWU-prH>}_ zephwGKV7o#%Yo_2y}Q{I7PRFxXow3cPI$Dc`j3guC-u0*iN!VYllNbGw)FDm8~%sy zymrd{d-3D(E^UAN4d&t@^y_vBhRCbKPPX3q`v9_6{a*_0>jQ{feR|A?niB>C>~I;m%IEpqLm;=cz|-i3rnWH6YbZZSvaR%wz14@f!M*Pw*8Mk9qKx~UhLZE8{&<^)7w73 z6AeGvpSnEp)?AA@e=gnqP)$GAow6y!@x`J%@=hljhE=mkjl5rNr-R$DDm0`6uT4 zN`0m9nws?muO^2TR{mVE{?W(6mGND&UDx;ie%#PdzU47P7VkvOXCG}7?`p^N>pO+t z`ZDjw9*d>!sjVLicZFM=?|;nkc*_0~^FMJPSI&RtJ^%M!Z$6ke^Fcl3N|{7LuDJ?WWy-aS2@ zD$stqyZiBGmq4q#%lAE5^0Dqc#};m;uLALLv*1o%!+l0{-Lr5n@#ESuzcVe~&$B2O zZfPh#Ak0!Cd-TaxSDEDn^W={U%DuFGwe+XR^ykM5GiOxKDbct)^?&@^$V#vM#Vohj z89la7I$bSx{AsIb_}TvXAl1K?{S;~MpM2(0?92aqcKq1cuFk;tzC)eiiJ(~EO5aBn zt*<|RzH~)e{p#f}nKs|O7N>vGKKgp+pQ_86dw=&i1PV%M{(QRB|M8>Wdp11!^k?Id zi)^Rjb=Pd`x~z5Xucy-i>${#z`_3h4Z}pd%FCI3hrYm?yoV|Ykm1#X*-wWfGu6(k5 zlh)GD748eJ3P^BDhI!3CcKmx~;?a}r!L6^qe*Ux~SH<~z;Vp}EhkY9w%J=zR;3!=c zuyXCCA3yem?YLGP(tY_#v3$7tS!w&#qH^B%qBi~AscdkO%gqz-T=(kUl_?dvFlf)b)9cOW zUfTVhV~a4;*GXwxOCZwT(MvKPeOviW$M5+=HHQP%kJU0-3|9rL=GC@6-@V@4PwV;8 z>zi+^H;ERN@z`(=+!W?W23=Cf?uKZ$PU|=i`a(7}_cTVOd z0|SFgYJ_K+uP=iZ0|NsG17mw80}DtA0|SE;$b1Io1&j>LU=c$E)Vcx5C@7AsRwL1U*a=*D&s!0b03|M#=oezvsqd`EWRIuO#M}=$M zKHGZ&8Z8Zbr?&=d+*0IzK>s^e#7}K*#@`ph!m9bga^KiW>ZIt#J0}zf8Z1mM_^A8( z&fCLr*Up+Nw90ptCuqzwR7i+WYjfySG!S926FIM87_rvE<$&FptDog!e4^ve*tQDD zuBhR9nw#0?psH*T@TA7@XUrMfsdvOg!_9vigvU(IYCX3-_I&Bxo#(8-ocnH7UaNU* zYCwC?k*!lshrDAcSA1%Jed}|p^JO;kv%PliU7J(Mal>7oe}a*%O}O>9(tQC{3r!AP z3a^sb^m(UR&EKPM_>UUvEsH7ZS9D-$>ry%YbbZ zmc(;`YyRC@dtv9FE!?(gg?DWKT-@FJGV-5efjqOg@!7kF{}!C^KX1<$Z!Pkh`RAXY zv)LL2Z(d72EMK%f`<(gSkk3~4KRu719zXw2a-6(h@%wO#XLS|D=Q-|ApMU|0#a>`19T8$Ca9UH!6SS_*VJAW7;Cq2=j4X?+X}5MUtS(zs^0frdHy@5^m9I^ zxK2$e-QR9}{;B-S%^zdVKmN?!{=rnIdA@e@`_1nnr^rYAlw6X2L%!Mc|v=`Axq=pB>-v zq$hrj_5AtglEn{Q-(k}2&A{j`q#7Wi?ZnaO^j64Ed&~PvhYag)tP4LcU*==?w}rI|0V`||W#-w-w15A}T)gUh zhs~FOZl9S(%(lOFzPPAA&7*|zM4e65hqYdx{sdSsrOVv=rLjO&nyJlUrqTlz=3{xu zp*!YZ3hZv4^!58=>kV<6UQWGqbFZ7QSzgshy<~OCZ&@F3L*Ds-fCLMR28YE$ zg{iNC5)YiW(>?BQr)>ZCW%Q;>Y`Yd)_(Y8Lfb?P2j|kWbnU1SmZ)VHV*C()98E za(|l7EBB%=KY~An*KcKXeYkzK{aS|^e-8g%GX)cMC0^ z?YmuJU2h}!^G&+ANAYLn8UFtTJnGZdYn}6$FA-_L!qXV!prFIE#JF9N!$wTA6yS+re(%I}4fO z`?-52KHIVN(~ac!(*>35WVQZTFMO1Lrg#6xJ*?om&r6)q+-Jhc1ABwNmA-uS&#aB@ zpXfgJd(I0#voc;g%*mLz>3#P8lGm|qs>LoLZLaz+m7YI-)pywN`{C$*pZRt^a=ZSE zt<3)6ukcUW@sFX!hXd!8|3quNtcrdJZeno=6htu|TX`i-g707Rn_Hi4e_q>O_Nb}G z@j&epiT3Y@Gj@F`nDsWEiK%abo+9^dQ~pMSWqJ0XpkJEu<%QJG7w+$-{AxSzc(ngz zb)bb`>%#ql^>SOvGB_ldQac?)${Mq@FKlLB*S%lyc3DmIzTbEEuHepP`C+?6ak6r~ z`1^SBi!^e?qei^+H#vX3L=?{)9T9r_QB7g~4NCmoS@ zx>5$p7n=kYCiy}-{)cimaxo<`9(cR?-^1GWc1}jVPVWv`&sZn1 zGHn5l$1lDeHvGQxB1fBkUXla)sM-hNjR`_FK~KJy5Fh>iqPn?tFBgJXl@+`3r5 zdB6TY(T=a2<$lA$WWsu04sM3TNBr*}n{kVGH7Kv--g|zXeXoOr^Y-%=^~yiLCs@UA z)`|Ea>8WPN-fpXFcC22?N-3Y8+-%`JYo{&2p`t_ptpMtheZ?r``squlfUdVOnKTJzlV9>PxD@XvqMuKCmcih&I^VDVFau#A6M(D{=O zng56Wd-PxD_(>MC>#yH?D?j*T;M?H*$R_zR!yNU1g{Ng68lQaI-g*D)FXm76Z#K?O zd2}S-EB9<|KK*r@eBw`1O-_%kA0f{~CPhzVs?E{#`g0!a#iZw|LyzpP`)n8jpx5r%#S|9sr8OFx)(t`phj-zhHZ=! zJ!FEH=TAB<=0EA!vFRy?+saZNrEwbAf3H1ve)sw>e_pTpbc3Z~-)!4Ik9O1^yCd__ z_*?2nUeiyV@qglqQlHGdWb0F{nODB8+OzkY z!X^%G#@eSZ_T8_YyZ%;*Fawu)?T^;NCG-9N9MRL>e*d0|dF9Gd z*2=a9#RQHRBPJQ4j^pZH$(MVL(%*4aKJJY@ak-_To8=ly!{)}<{eKQSIk0{Ht$t$C z(fgBb-KzF^T5mRCS`r7Ou6IyW5X+wU>zDPDO|7q=UVSS4kw=}SW&i!3{qNq#{M#B@ zn8S2n=2@9K#~t(cTVAb?viozQWTx$RdDX~b-8CWS&m8T8reQYz#sd}wJFZ;0r|CUC zZ(?{{WP7`%_@TeH=6`zMzu&dWBAw~L%QU|I5rj7`qyF{p-RmBmpUEI#Quw3wMfac1 zP&d1eot8$GugV{;&1#%jfAqiInx?h}#eh>BEKUwWm)GSVFL>iu`E~2|z!+hsbDPil zFjy4-^7#Mc|3!Y^>6*d+10N~;-?H-W`OmVOPlJ6SVZ(CA}QE>BC{+{&@z20K*d&M)zNOe9wN~FS)ECF{>szD{GzE*8i6GG^}$$5#eAc zz|qE>wPf8lwwc!7eSHM)^d-&VKfd#Qy`fj^mGpW17OuJv6zuMpR$1@~*Dqk*@#$35 z&X33TAM-9x$;i{g`WahiXy_I~W0=dDxA7R>^=M6YabUDBjU_kX^Tt*HFR_1m-f zeRSsfy;qM57_ex`F>*1UJQ6e0#`DS2>GR!d&$qu{<;7tk@1XV4wy^hg(j>d@vOkT_ zooctYaaQyBVRmd%)WzTHm;8#31$$(L9LtIq{%Y$FeL3JeLv9C~`xBex|K4-6ALp-~ zyMD%(EFp%N#chu_FgWPg?0mDSYUi(2>yvlg5BmH*-thg-&?5o{EUQEtJyf(z1(=rk zRD^}CD|2hS+I39w>pC&U0~77E&)05mt^RjJNm>5)4f%wLo&AzOg|)cB*>Q>`(;P{G zeshnz8zL{2K8a5~-&nHFEz!5(c6rRhM@H*w{vTa$#&|$*fA?GlfeHWf|2^})Wb;Zp z;+pwI`<$|CpfZQic|ndqz~Tc(QY5Vxy2sT$t(@|^X2<$Rtqq?U7v|jB(ciSojpumZ z4@q{3J7u>sW*Yx~Z}`q$j>$njGIA57fN_Xaa`1Iv;@)v~E~mPq_O?ZQeg9+L@7Gyf zs@bZ>7*T%&oqgTf937WKSC%jyxH_eG#{Qjc{wLGzt2bY{T6^Wh{ev*=9S%~5|DSx4 z6uIrq_CRaDk3}{U&htM!6~0E`L5RY`Q(>p}Wp62XBQ@Lb^}B<||7%39v@ku-c%{`6Y(@rBz${!dmv z!P}=VVf^H{V;1Y5wJwYYOucsq?tCvbtuV^&>&n*)f7Krd`Ol}<4biQ{^5U88%o%## z`oDRv%qrf`ynDlCCWeCrPtO1C;-0F;AdpCudxoKi%Vq*sqm4!f$D% zfJ%=8l}ZkZ3%0#`Ty($IxRAY-p~&Tc@N!nhj(0pLmE%zsF(#M_)6yACG zLq+EEq)p;nT8<0_y#jf2KG?mUF_pirz|O}0Zqny}#p}1Zf(rr(rsaYU3>=gU1NEXy z)P?4jA2671vCgvAf9CtpCWZ<3Sst<_|E-ua)l*phP?P=PwcqFSPnQJ;O#;Ukr3(gs z0yDbXAI|vm(BjC%`uM{4Z=Y@ne#hjn!*GZEy_mzDI*~?ES=sMQr|*CIB`YctoQx!r zSVFi3;&r~?-74b0Osrwfqa7+|%$;L49ITAl$<6R{MGGs#^@7Nqzh1pg_+x&x=l`dN zo07o=Hcw+5ON|d_&#_6DZhcd@B-8%nv)B8lPxl3TGBHSZ9yAqueN0!ax0k>3`OeRK zjx~X!0@NZjW4gk0MJ0do>vh?OJ@tfKaQ9pkU|4>y9^X>ARP7xbCt@CtPIPH+7@?V*()Cr`20jQn3`m&y1|+srVbe|@%u z_~yLGnU;U8BFg%V7!~C8tj!>8Ta69|(__88-yg_?bCk$>iCgzQTzg0VcECEO2Ijk_ zE(>RrdV4q@j!pX+zwP~U(L3O>VWGRjR)zwp^54C}A3yv_WC)i#?rg*Ne)nfp`RS_} zE{JdN6G+&*spzlG%HIF`9&9RshRkLGjxbIc-QaZngO(Dk8V9ZG3O`0}pBnA7 zl!IZN9@q+mWj~)z^{HyEE zc%X6aeSvo~N*{?$Wy{@Tl*OmL3KE(Qo(c}S4n`Y&o}I}&H?@7wql#mq7e5O2AO8KW z#`E~bNqTo%MbDY~T;S*yGxb*5cI4Q9eV!v;JF4uaecyBQ{Gsml^v(9#3mw<;P497# zvHT-bmizj2-y*%8uf*pwvNmMoG{w~Y%&Gi-SA1gNjO06ZZ<$Y-g)}idkW!LKPx<)h zX2zbvW&iYVmw#TwWyf!StJ*kn<v3_~|$?E>^bVE&~ran}jt@8Vu*2KxnU%U%Txo4wOdDt{x zN5qBUK7Xg1`{^FZU`2*E$4r-3E_=ZHbZW#qCI^Y!>jsf~u3Wy5k(~R-p2t7+UHi%X z?DCs-?XsF_nmujH)~zdFZ8plb{jt@EG2w%uT#x#b$@{JEZBFn1^JTgH)Y{+Qy}$ID zyIxy+c_G7Fm9z8nogCtO9eEvWO> ze4+ZR!(!FkKlTi(g8rX7+W)yR=Da&>-swF(bT%(MNU zd3o8(P?0AxKi}Wk8QjKu*y#JlJL&s(M?aZgFA{KV&du5T3yM9`3;P7}que8~TPft&`KAG>Ka_(G<(}7_B&NK5` z^)r5KuKKn#bT*UD#yNj_Tne&pY8ZjaCV+;bniT)m{XUV6a!K@CVZH@;a&NY^Yi|DO8mC{ctm(p_4jv& zp1e0`YP;=Z&k?}zVUJ!5WEy*naS`gb75TP8F%HaNq_D?`~ST?OmhBg z{?PxuGoIh?vkG{!Z0YCJ>9Naf>!tog8nCS5W!(2&<=?eyVQ+s<{?jjKt9AePz3(MI zcHR0Q@!?kxLx(DwLt1;ra1>KC?~4F5S|QW|H_Y-|?cc z%Fp}EpPt*)2klj^_xo=ANx$lI1Y=hN!~NeYgO|VR5$9txkg+cF+4p(wdxz*+mwIJa zjj&YPNlXqlauav`I=Ldk?)irstlRw^8-ANhx0*i?hC$avlt#I ztm>H|_wUom`jeAXt*+lcvES&{jjX~%4vSCAFV3I%zcsP^V0bXcina3_f1jAyxHi(^ z)0wV2!P6GTm@xchlo4Z4`cP&lnxrpQuw~eMG*4(mNIgJH<2B?{++?{`2#~lx~Iz z@$YIr#4=ZGD4UtJ_kYcfQ{R6m3p_b?U~fL}stdi9|5W~47C(D&W0~ZisrkF3PU_1s zo-10ocy+<~|39D4pDwB$w&J0D`!UeSzCGw4g94xNB(Z&e7b_MV1f04SRH{* z=_B12M7HHf9pH+RXxuPaeo{T}o!{r?SO)jb&6!u9ct&Sykzm0S|L@n%o#fA!F8dT* zFt7fplhGDa<>eJ|i?{S;9cpP?-ZWApnU7OQXw{6plpVmiCIWlle-lx62JJ$JwMDx+Fy)zgC zp8G|`*l}Fg`(ETvNgj9QkH-3#7wEa-&nop>6Cs4qkC;C zS?6TGe>v{|vwZrULQ4*Yp9@5p=4Bd)uFq_n#U_@#@=x`f9Y+LburWS(IH%qI`IGk5 zzdkZ&T>GbbuOe)ZqhrI~|4#2}>pwKhuV|Kk{ga>TO>O$A#D&8n_fPlb89B_{N1Yos$9%f``_f_g zyT6MLYID0fDM+av-ywf|<{x2^&dgM0nUG7fMJ7ft1)H2=`>nM1;L@)VlkDgIDVSF; zwnX@#8-IOoZ?DzW^BpTJ-lpylXD_##>XaYQZB+iR(U$Y9=}Z2;pJ_Mpe+5NHuWs`@cWdVp z?Iczc7B&gSRp0O0)IYy{|3rO*fAc;~7bv$XLsa_ztK;@))b z-x5FhWxv(hX$ml8r5}>7b0)=4=AC!``Tf(L-Ddw|F7}^xWjMh;^SB<%^Q^2%tL817lD2S(phTzHqU!s4 zM?$_|KDs{mySzn#!zBS89|4U#VX1#dkI&!Vy4bz{l~2Q?X~*WR0y#k}Mgqt06xo)xs`KKr*<+T1HWeK{wCYo6<8 z&Gz8tGre+JDyY90i`Be+!v3H-#uDxA4E#MVX1M^maJib2< zX0-*HZaC}H;K~)7ovGT=z^h>=tb1IU-LU^{+kKV6)iexTXY?dnncTXD>19ow^EI!AvVZG6`UWWinCI^vq zn@^qJoEWb^VJWoBGewE%;*QG<6JC5iY4?AJNcM&3WksS4GAEWxD~K&-Q@9mveA^Jz z{9kZ_W5wKV$t_|#McMv*G+`={F?lePKeg@Y3L||Mn>(jm9~VqNI@P32$i6ykrh>pX z^8hv1ZAo!TOnGi6Tetj8kXZJLUE6$fYw__Kora@V|K+TDs%lnXn0I|9LjhY!n#El~ zTjRY?`cDNi6f9_CWjrVCJ&WPNf{iy6AJ}cu4qG!}-8#MBFRT)@Z2S^?JEQYRB7FzdEkH9GVh(rBFky8GqR z=lTC*-1_Bg6Ds*#e(LmdJ18vLe3t3n&W77wA1@UNGyFPcFk3gg`PjbKDd~Drj9d(V zI@ZVT4l8?iN7MfI&GRL9zAiG}B7K^#(c)T;q;cLHof+2QQBhG}Y9H)&FtQ83vAur( zn_F97?^$OX9#kM-{oXQ+7=`yMDnGZm;BZ z&h30Bi_hDtzu)(Jomi>nKP&ZnOJmBkZy!+D@VHYw-)n;hm=jNzJ~^6s;s z*e`9}_s_fP-a9ax=G-ulG|dXBpMHC1kwe34MwWw_OJZaAmfA1wdFnMQotba(E#s^- z_RwC2= zZc}>Xs^h=0V8xE-VscCtvnQWg@aU-)gTO6gMswu@MiqD4wsoxg?#B2aF=t8BxrMq- zwre{$0vI%&ElJ>FkSUV5cte9*Tz69Wy-IgJ8H)fHmp2!gn;Pz~W=tqc{}k|${llzD zCTwe3;)*XY?2G3t)%^1-;+3lMh2T~D4|uPenHrGAG2w^h>nBUau2XrVOnO-wn7I$h;0J%ikw@L%@LLTrb00-m0pq z6zjBw2J;#}*83Sgxe$_nz*IbG`i1KGZ$-o#JFds4Zx*l@-M;6qjqMk+Z^fa7{(=|w zIq)w3eqH0}+D6;EpfOc8#;TvnH}!Y_%6j`SKVpB}>wSff-Ddxf7tD8js$&(-$8_N5 z9-|8kGn5y6W<0gdkcFr5pku?UKkLr$l<4SVak*u{7n zgB%x3syaJ0WO`7g{Tdn2padU_Me2kn_jtoE=kNL0mh!MABDZsq1-bY5U0ps?`r zeU`OxcV;d=F8!U{oS#+*I-O>VuJn@&kYuARp zpZw*UIbXKGn?oBI+8JL=ICY|a!3F)3HK)QPR?RqXupbkBX0!!$rk1Tt7+ z&d*n|FTA9Z>2UtPNDD(2-hqb}DK5*Zh>dy5+ z&ilDeA9j@5E;>tKs(pvBo!#bx-qL#-U%c2|x6EG_6h5Z1hSq2Up^w`K_@OTS6)OitH%y6*T=shXOana^67-iaHxoPKob z;1->bBa&a3K0Yl!`SFCao`>6Pw-K~j*EQZIwh41@1?bz{t z*~zxm-%hAxFy`%fx$NH0za_smuY@ zA^K(_t3blz9pc@;L(bZC^1o2IP|n5KzOks7`I6gVBP%}TRo~Xv%eprf7;x`hp8Mm$ zvf|^D1=KS`dpBN@4PK_<8I+N*@8$%D1CJMSytAyGXcK=(T)xVq?qmJ`l_tj;nNHnW zUZ};&l5;$8|LT9A)<3zo|L?AXvrYFJsuyoCcy6pIv17;gJ#Trem{jWdnPi`T3pRM$ zvRFRq?|G(!!F$hdTidwQUiZJ{(|qZe|3zvH(-)X6w{N~@rnPv=s6-`~9-`KpLcgZ)`9jE=2M%?t3UPMuUdU2$+mL2?+1fxKE901hMNsMI2OG1_!IK8{Ndjx zKmO?mScm?U`TyL2;rQR#vuBqsl#lxVIcnAa>xpmXf4{Ngzrt4E%rxnLAyd*gxu>j} z!rH)e^sV~I9){nH=^y+*x<1l>;3)7v{;~4RCx&(%=M0)#<{dKZ4C<6WF6njIhxw-A zTo%8e$CdZYHN`*2O{(FxTP0%Pmvp=Tv1InO6LD{fYq#3&_8{V%9Z`j}AlFBHwyy-z(qIa@#VbIj`{Fy?Z7gS$}_SzuMZ`A$3d1eFqR*^L;YA58d zJYKE&WmaYGh5fuNjFVJ3=g$6iLg0Gx><-<=>SYRHT*pd3D+tUv)Lwb~#>Ppp8yqfq z?7rb}=y}zr_@4*)UB%9XGd3)l-@1Ie@(OWJyGGusd&VAfpDtA?VPkwyWj}f9V|M$3gSsrx^A zzC1K#v-SRuJMMhj|8F{<^c=&If{jzR{jL&J*m-${es|e|ssC4nuD-HXzjL10KWW2r z{>=7Sj5p%GeD^%(KC4xQEAH81T|GZE{KB#x$tz}x#y!Ra**?ljxYy0x2KV53c>rV-8B77b{R5D5q zUYRf8Z;DG7IUM>_wspJrrgdV4?N<)G&6X;C+1Su*z2WJiHTsfE${CrD z%~ijBwENi>_EX{~q;GLg^7IeieuZy!c%wSk!iMu|Zh>X|3rUX84kpWyieAj?Q*(di%#eti@rz9bB{$> zf0vBf7$~s9ao%JFk2y_d4;WWmb-!2KU-SR0`BE{ln~_``wJdd;$`3E9KK%8%H&4@H zp* zGE+@t&L2sfT36~Pu;AI#H;x?&+`pqG7$@1={@VNR*XvJf^J~4$4m(`+egD{!i>dm; z>-1aI9XDU|3tOGM&&kp{@4)XDf)|<;1GG3o_%f^ZWiqrqSUZbDZ8vv|OVQ8w3jf4p z<{v5)yF5Q*P8r+B$IaKhU#MhFl2{iSlzyhS@wvk)InS$Ke-vLoR(z-_uKmwu1yA`^ zH#N4h^61IOtY5_Nh^H#bRN;M9&4l+etU}k#wTZ0TR<_nbUND32%drRi?-%YpWcOuN zJ=@n`(()A{ZATXcb>EAXJuyG^or>aO_VWvDOE~0JGG$)YPdh01TXVw3wmAule(%g; z`)%>SlFO{}rHGb{+go=JKF1;%;-;D5#;%c%W7< zc24_Tci)w*jxG&P{-;j3-d?<jLKJ$mAM`urqbIF{bx zUHv~wAVSJ}aoWYrZEqW{UtZX9V%|1~UcX15vtKI+Jdm3-_cZ(Y?hWGppN<%ZSS(m@ z!F$DyiB3%K67ze0$4sAVyZvT(tSYux`>OgewcSNR_eTbh1Y z8ZUe;;xT_s_y6S{$6gd>FOWGf`=<|E_%<0e#z5oP^UwZ0I3T-u&s+hy0Q(m|nm_v# zAAEXV;(Ul>!}G5~S)5shXBr+(vUtUMDCt4S)~E?}x+Y5gP67$<>#r4`Klyk6@7+e4 z>MQ{Xn=jZiy;)dndEYSk*ooTjcd!3HI=y1rthNo`9tdsTe4Dqi+iAfZmIf!$C+Syf zqqyg8-@@pWz?Se&c*4E*jhXkQTiiwMtN*ULrS93Bp$9kUdF8Uqd*1xVGUY*|#Pqw>>({u?*{=Y*B)uE)&v)ni!5Y=?Y}j{j&eRT<6d8`e}v* zamJikxx!2$hwT1exOkqK-$sGo{!hXD>pWLDv&vSm7MQU!PhI~snIndS>8Tz=#(od& zHJcgyn;xI$Oj~}$!)ft^ z28&6>3m!R_u5Ib6p4spIDgA&UYukgUBRl-t*%r+DUKPYR@e#AsLPyyaK2g1-ULngm zB>@!!U;PUvS6)qE=@r}^$QM;oy~D1zcHfWpcM97l)!Uwublhnb@a)^+3n>$FBIEK} zo4nOK=QGW8wh)|TwUuvgOn5+>)7$=89UR%p%(G`q4a~ji~6{PFdD{ov#M)6bo+ag+P~fc+^04@>Y1 zOYNV^^{f6^XDsnp>rz*cTKM#_VecQmhc}gHyYx9{EHF4wlCx&|B0#sJ{$}BEZ=rX#$D5vYc%JsTG&-1EHmdJm!NdM@jK z`G4p+?y!Ma2X1qVBg!+{)b%F)q*W*mw;KNU+QvK?mC|MTzt=~wRZQ~mGMY`)@b zaO$egiPQh2nA#jdl>*K&F-Yqi;S0T4*BqAFr)h zpEK#>=xAp-6Q{;`NpQJxP|WMgtK^p~X_@8y-O-~j=WC7L-NorP&xH9@%-qkt;VhPK z{9gIuYOz^kzam@T@AM4khA$E_0zU-|rg#|Ue7JZ2-`Wx<=?jg2f_p32u1UVoU0p49 z`at^R82*Lq=L*ZL-YxW+*Z-ur(2hy5<;Zz~g=S5R&!?Q({GrgnvEjJH?*2KiCgj+* zFeI!rG*!DIwxIm|^-oqjtsCalm~hNb?V97z!(!LGW0hND>cYSz>v`_Cn*+~Q=`T-^ zYdoEDFP!_}Lb-|wFEm*KZg1qDC-k51SmXSb+6GR>91ZR^hf?JU-%Ho#8Laun$n++8 z(x3H=mrWaph*(<&+DjoFf5-SsRUNh+B}1@hN_xc7T}yWse-UnWfG+V4B2 zXOvkR86Urpvt=wYv#-9khyTf2=NBB?4o_|Haq5T z=DrY|9=TX0T}b_vV7|1r+?wa_58M3R{_mUgC-wjT-YW(4{x0~j=vai#dgZ^$0sDgk z5)=NZ{Cg~s#;|nK8QWE#B|WaaSvh%1;qH5fcWu<+@VfQlZnnd$EQX8+9ElEBe;w?6 zU}N+-asPze7B?1_`K^IV*v`yY;Hc8dmG1wbh4E+?(OVy>#naq zmtP=b>+y*7;=`I{nM+)@ruQcctnmM8a^?M&zVH3Aq3UK6mj%9r978;B6<(vX0V*E<+YM#e0pet z(=4~z8nI6&WLg9mm13AL?XP^uv{S73Y5JlXX}O;c1-#4ZUv94W@9|}oCENK=pMKt% z;IIEN=&aw=+I4b*5zk)R8C*W_si8$wna8@o{?etMO@}Jate7a!!S{OOE&B&@{S_Z2 zIpkWIuLOKPV>{iMQH#Oh!-FYaY+EG{d{%aE2bx}gZ~FWyz*^s!1_{BgCBP=_qvlzX2?x?G8PCx(ii;8F7taFndOWkWu|EPRd2sm^(37W?!31$Z2ObvAMtEt{QP_B2ah!;CY!O$ zyz|BW+4QBQHYX;8y%u3wq+-#caqNV##qo&0TocYncs#Ma(O%}TRnX&;4jGwT;IdQ|a!I+3uZMyBJtbM*Gp5oe~}|GV$|$wuw{1O{z$dbxc-rY(=majY2Clqte5`&T>0i>_g(&tO~>l?^fw+B)4ahPuw#Y1n%(i2 zhA9u;-xYpxJX=G;!F$p92VX67w(`it-Dr;#myo-#vSr2MES`?}*LX{hZD_Lcd&I-T z!DQDe%J$%L^HSzo3F~VNm!mlBx3E_{JO9sT-H&JHSF4lw9zLl0oy{S^6x!Ut$q;(^ z%HQxQPkt;{kezYSQ@o@9-rp%b9!V<7;tqOq{$01e=Pz{R#}>A8^UH1X1SX3+`i*Yf+SR0q}CFRy}4HZ(6VVm#mHc;Lp@%j&6STSVEX z=`cDr=U6Ve!1ySfks;;Wo}WH>mXB>3{h8*god31S-M^6`;^*!%w$I-zdkVN({MGF$ zmX(W4`(6@u((17Ag88jxO%VYBkBS$}{cyATxZ(4^zdyXzKhowMbHQUmutsJ8hvUh` zVho!ZUx;{G#2het^tpmBirrKvCDLXJXJxU5TI;VM?gNPpDm*H?4exw<#BQ(h{`b9d zRj-HO^=2WmOh2+BR+O=%F*MwEocCd=x~+;ZOX;V>_sl)}v+5@B@?N>|yHAF3<43D` z$_E>+gtYpuWiS^qI`>mSSxR7%gXLX4uSZG!Q;!^-XZk6$)beEaPsR5=!S$c(I5@R< z8aR~Suue{ql$fmZQ%08ifMGk6M~aTIe8+E1hYzfd-xS=ZP9B`oa;zQm^Z3PPt zvu|0K?l0$Zhk5ZHw+SESzTcxgyYAZ-8~$d8{w1e=epjiCdH()puTJ1|sVTy%YS>gu zSAF$-@PYM#^Vau?FAn%GirI1ewadQ)C-RR6Ftv!zFTEliSeGEsn3iB05>sy^2T=Vu+Zr;hoC$MFIo5NLw2K}zqEH{RdhdUys zUrs%5&vz+w`X&_>@jG_Od0xjlF6<8Ru3wgTXQna3CWU7_opURjEv`Dr+vfGJEAYHG zOPq!KPj`Zk6;pnNoX2GS#q5{*7hIqF@E3!^KZ|ECj^8+~<~WH*viXhWdHGhCdybVB zZ~b?l3EBMlpi1o%*{8-E{pWq>>VusHkl4i3#l`bMVTBY|hVl#T1d(N2=MEW5RmyVQ zweQ<=!+QCvxl){d|C=4>PLo|#vg(6ni^HSqMvm2w<~mf~JiPqXzXNpw_ASDzo_k&p zandL#XuivsD)Eacq9wh*{8;^-J{R6g*SH?ckz(KGEbQRReCojS%HxJMg*=xvt23Uk zPqi~;(pmh7*`{D`wscC%p9Z6Lwh8N^n5O+?S?6vWtZ{sQ&A-o^o^@%Tx}`kh+U0)| zOl=2Pl@p{IxZBoj%G<%7^2by_E5q~nqN#H{om47RU&YjVuHxCbMd#TUcQ+OnsR{h& z79O9?c(GW|s`mBrYil@nbbOx_@zQR_%|{dZayKa~=MX#5d2XJjq(CIslK;GWe z{(e=dU#IGvhPV$YU8;h414FiEU(W4f%PzD4)ETo%6CO<&gYD~0G+Xq{_$5^ZD7 zXwP6*4z~(dx!#xs&$)KYM@D;&!IQM$v%pyWW@{UUrZ@ z>=o|>7N0rW@;K8Z1@z@6cStT)mtz&P`KDOml6d{WhQ~ikyu1HMZ&5O-=xIK1_luW< zFh~3jHCJ}mGu)-+Y;9MjR1`=(DRuH#D0|2tBKN_~o6Iw&dD_gLeUa|~*Y_6&Y{n^a zI~UY(++ezLDPZ%aJi#RU{h8MIguav7#IPWx5Dy56i;~SGul0E7x*(Sr`Z7 zyGXsVnao;OqZqRP3v6MunE%jiP6T+aEWngw219_UZ*7_D&ENmE)||QdJKf_Q`@#+3 z97YeEta~iauDSk5{(5oNe5*H%4}ZTYoV>$fhiyRZ?~vKSrEllF|DbbX;u87U{O_3p zzV6?ZwKV6Dfg{)6tAEcfX0iLK!sp*GS3*mI+35~vv;8!6t|Z&Gj~`8{eyY4ne;{bU z`}$91z}553jEcS7$^rq4-b`E^qm#|@_;%Lh1JxF`6ISJMvD<}wkU4yQYWwvpE1iF( zZ)D2&Bfnh;Tqg1E?)Sg%y?-5+zw~JpKjYV1?Yj*1ZM3O0odU3f70e7$l_(%MS51MqI8nIDJHt zwLMXvVY=_X6=EmfwU@EHlw*;WEqiFHr(n;;>Ge${Zd?B3=V?CEAMSpBx_5PW_gVG= zhsYd`5IZI{hLAdG@imG0@8wmla9;9jVA#6dyC}s$rggiOyzM6)o);k;3KI)tHR3Tf6 zo310z&+iI#?C1RsWYrlRd%yTZ``*iL6GCNv+OuE%{f+na*5`NHK7NT_x0~-<&WvFH zO-J@-1*|aXs^t(UadY{8aMufgtwKAFWionnzlxSW@9R7v!#VPp-wchnx@$kB+Pqh> z{ZV*E?l52AmtTt&YPsBA2{)cUTr0w`>D2uSxeXyNCd?~1)UYh(hWxbdI0;LaMX5(N zUs-FoRkmVYR@x7pTQM@t%MM?ywJ_0>nDn9Tpn`xivxZv(C$H331&h7|#mQppW|#Id zXXvgwc;R@cv>C?{M$klUfGa5Rx%SGgd$m_#(*NFj_S1i;K7D;@U*DfX8CU&z+Ij}Q$}Q*J|14KE?}AjyMwPWu^P4wa(4Qvdv-fuU)%RgdYyLAQ z-+U{eqGT{9x^d$_J%Kv5mMff&Niv@rEax}eYPl?Uv;ACy&CaU0S!}IeJzq-Q*I6z# zJLSf=#g|wo&9hEjRg>{h>F4kHf1Yf4CH1wy#bc^PXV72a3k>T@dwvAGUR}^sBI@VS z5z<`jGxvK^_wNl?*xA;vk5m5t^ltf6{`%L(MNCl>C9eGAIkkMtlH;Z#X-vD0Cl?=9 zsS^CQo?)h4la1as^Siw^`)Y3IUYb1n(Q#7=g&@ZpPP-jA9=Itg9G)s%+{AJE{6dcP za!&lWCk6{y)^3np&06L#`|z(U)}p1$4k{i0muUP!Xp8Y#0fzir+uklZy{2@#J!nfv z7$_*i&YBjqK3!sRp=r*UiT5KdgM0fnmW%Ru7|l6+{$ijXPVP-+bI^ zEX^ex(d@r1S?>3>TPoKo+;VTTv)V~*P(XK1OZq7d38({$&SZA{PajTXmiY|*dVJ!yXvpR=XQN2 zb&C%+(_OCp(M&N|Fz0#_SL`Gw0e-_P2Hf-hwJG24o*8|9)$$KL(uqAc&bBsg_ZIYs&CC|NHoYFsRQF?g| ztC5|hPg=uEX|Y%}-tf5Am6-~+%_N@X-sEHB`E{;3JyuQA;zj4TlmwlMkZI*IQ;+QN z%u?S__cib5WA^vc@1D2Qj!kwuT*s)*>SVp}Nzd=h4Ib{6R&M@`4Q7mAk~o^4NHNV3 zJMlXBi?PG?y({=zCAkt_f7uK3q%(zW7@LHPFU_h zY3YvXObpEDSxqk-=Kkkg`d@j5qodQZsD0D;CN}&H>-nGmxXD$(Y{!iLY;!JFnME%W z|4P1CIKfVO1|vtD;ldAY`pqU%PcEEL)RSV7WIQYtd1dbOs2v6@7JHU56*S(qC`mmi zpi#==!=Uk1OseJ6S(ka=7qj1H4hm*uc(QP>t3cy7p{bS*oHo~LYhIMp%x}y7vEiv* zUQFis_C&e&3m3-m{QZAe;eWZC>8X>8_swAul()I4c~^kp9m7!@lh0YQ>*fEy-mi8@ zlI@Dpg`fN{}Kf&cd1XSipzdGIuGeG0EilgJ>!i#WH{^CO8S`dX&t(;mxp}`%;K2tG=Fa*nD*}yp-up*zJSYf~dVjaN z!heR`!h)r_m;9HNof6OxVp3xe;rx+g_f4y2f*lv*1D0(O`X`&sEOhx&mhY{t*)!#j z=cN~h)t&(YGxWIg%O!Vxe0r?9I4eykL_OlGuFvo2&V#Rn6>jRpu=%%h)hV5`EqK2E z)R)~3FWxLYH>2yG#(Rearq=UWA3MBc3p_i&_ee~A$o$?d%LFfdIAD9pAaT-`ygMr4 zId#sv_|{L&oqX)Xw_TM+l21J@Cko74>n!r(ZJN8Igu{6|rbAa|@~$XmDgK+eL!xn7 z(=CQo-)ztLEHGC3`kde9#q@-aTV8Gw?JIXXxbs5IiqF{vcWurTDSTXf?UmnjSNT;A zi4C`XI25}#tZi2KaAeZy6zdjYF0;ZY4hH9M&pK1vZt>l+TcDRUV+P~CD@_9ORXjGL zJhBB9?YDX}FJ$;MD~Jc&4!F8%&%DPcYX1EA==H)zt~+(A^ot2v`T@oQk3R?>65Mjq zljFt}ju{FQ*r&*f$ubHvblqcdj%SdaoyI=@RsEN`sV@R~WZ%2{EVh^Ze(vj+OokPw zA3u_)t^Im&{z6g9>IpvtF0IHj&tWTDbbOE4s^_&2W`7N^y>GE7($4y;(aSjoZnx^5 zZ*Gid5ZWhX?KSan<<+Ii^1N3}3_i$QelfNGSXQv2+nM>Ari*8%uDq|jRez7l`ZKc> z0v?<;h`G-3)xw#@S!B(0y~Es>zFS`9Z)+C`yHYjZ){IN9Mq>-FipN)h4h!$a&H_*M zI2_$4s(Y7Q?R#s)-_{rMB5A^+6^$o0@N8CK`NMVR`??t>l1tv6mhQP3rXW{p(XuIB z@kWNMql=1mmW_$qs&+-zxqBN5|Le5uR<$larF0`Gq2Pd%Jja9sp8tZE`B*;YN}45q zb!|QS5GP2VESb3MEdsF8G)7KE6`wL*rIznl0m{tr{tHHq@H^|PP6-#4>oXX|~Zs~iftypD~J-(8PuRL#A3x~hEhiHt85 zj^}RXT3^|H?_+wHL-s|z5Be)Ma|LbaI{&09CF_94!(*&dCcbO3)sb4VnK?tEo!`_m ze!Au{yQ|MCR^=QJIM8ERtimVc>!^L9w`$deC!e&6d~}cS_+0$6RaE=Q#qD8Uwk&ef zqTk921amA{ov63$h{L78Pv?EvzpUKL$;myZD8lROWvA&EPIvWa_q_|f6T6@9LDtI<3F}b_(IZ=l?xYqYii;-wQ?V~!PJR*Jy$ye zZ8SG-E7VY)rrgFg$Cz1YhI0MgmXDu)X|MMXpZi^5eGtzTwgTmE`#&Gz{`B1Zj>7TG zJM2cwpF5o6y700|$$2?Kv!WT@d`szM%GT#&M008v_Iwg(`LLHMY(uJoLBV z#;(%UZw?DgT=n~BwBrdTe=hEBG2Ni8_U{)mT)TFSt@S478k1THqtd(|+H+>Um1c5v zP`LA5>(Jx36Pn^4mD73@;YuW<@M} z(*OI%&BKv@Pt0v%yvLWpbnC&&cM~N~r@T6Dr}yDXbDXuu6x+NwpM#G3r~a9dbbDj; z6Lov>$j^LzGh05NaE`ra_q#~oeI5VZPri;bKN$8V%usBc_s{SBgf%~p>2EkCzl<|z zMgqe@SI1vo|8`9Cex7FF-Jr(jn>P&=Cty0@y4ghmDWb<7Z$WW(E0EAZ+H3oW3T5lCaq?FrgnFN>F$K4ON*2L zH?66h$L2Su`&>zlO8ogHDYh-`&Mz|i4j#`Fld!WZ zp5?M`r_kQ&6$?GBo>V{kefs)^!|_^00-M?I#i$zPZaT3iQfc+IBvo61zf-+k?m4{w zuX5%4^?2n^r(PFGH9TbNdHUL`O4+bF;ppwGxAxyJx~E>U|J%N2ij|u5=EJFKZm%9! zh&?~L{6nJOh3EGDfo9j#n^eoLatM?$L~_{QGCp=?M+Wn$tIQACXH-bssu0}!f33l^ z*NZL$v+XtQ($KY3e2{JKAk5J8@R6t0p6066(dpY5nQzPP4ZAk=9+&%pv_n4)IP^B` zPh_$9=D&UlkIMH@g)%NS%{|wx=JC&&yWz~ndbXt7efLjG=kHmV^8f1ky3lzQk2pnH z{1(pD5Qs2f@nUSeaDBf>S8}RE4olQWhFPaIWj{O?<@>QgGjhTM*~AYv-xkj?y3Q5< zd&{HaXJz!Cw}0p@@#=dtN!MaOpSqjO`)TdVVpVgu-;;ZCaGrff8(aCOOREi@FyGw2 z%_-$+)&#*z8>Qyv++COa+iG)ykMnv8tOR`v&5?_4bwk<4HSD7<=Tg}{e9#a^$pek|~l<4|wA$sObGVE*M#=kbCG7oJ~~ zHvObtmCkj{lO!nI8@7 zejLv~Iq@-j%A-E#NgfA3X#KA~#ho8`tFulO5DN?sSl|^2ESXeV} z-9A<-7xF3(W1}A}eNY{G#s}w*322hckC4ChMJYQ>9Pe->fgdr=hT=FX()kQ#6Crvx!Fx?CjIt)!h90tEe*h zuii`(Y1>u*a#nxXn6{wZ{@bssixmwLES1)npE}xFe`&*n_|4VRedb#PE=y25@Q+tI z#Nxv2(+~KwEqUIWO56TjSAI`0Hqam>Z{G4(^(yI{Ethh?n=py6Wp2HHLex<3#^?Lo zx?QW@6~CXjZ-3r=@sHad-7|a>?6H6?LI01t$>Z{3S+TW`N*w&SQ-1kx=sOx)ez*1Z zDfa^@rn(_wOlk}vVb$}(b4$1s?3@f&sMYorHgj0!>Tx@LH>mAzVwlb-Hi6~p(Kk0I zSiJNL-{o*ZAwG-Arf02u%k-Vh2LHT!rPY-U*V!-ER#aZMGb-g%%Yy6Yg+3~~o7%r+ z^my>FU#_2Dj*EpiPTH~ZhhpsSbtk@PN<`miG~wW>QDbJA5?uZL#KX6N@MSjN(^y{7+ zV%;SFJI{4rk&^e831^P=^!~i@i%X_eZ@Jai(EfuS>F?`J(t<8rEg;1FSEtf|!vk!D)pSt@ckk%4X1U)!oa=kpPJpJ{qFD_r>eaCzskI=iYLcFVp8 zroLX$NlDCHrxvx{yyKF zey>5Zcn_P?AI8(ReO>ld7cV12S;^+QX?K|h5e^mRk@kt%S zWv2Vq0vt?!90|)`>-zj$%y97eBj>7D4;XL$I$b}#dG_^$j|;7C3i+PCBQ16^V$CP_ z)8*mzy7BAco>a+e|E!cd_VXdPgLgx+F88a`axp0quW#ttN}I3VmSA>ji|`?aC~q?)FMC&=#md-m&$T7l5#ts!@^as$%V)g9kh&!x3% zA7i>o%jpAEg&NG?i#i{?;Ls6bk#5x3#_!;;RuMhX1 zDDRV-)~hc+CELAc+WDo0^+HE#S)YBloarwmZ~cq&T&>0LHAVk^elYA=%C{y~H~QX> zrIYGq{{ENKImP|A<;;s&I)?Lu8JhZ6)y4eW_>Apz9sjHzo>xxScl=^pp4RZyUDlFy z!}AAQc4o8KDrQC@bMw-7hrerl*W2~6PVTd9 zFt6aZmEZO=c?W;~an}6)l&9+tJ``no{=1l?;iaF%gS~0Y0kZD{S6;tl!m#w76LXB+ zjf1c6)J{s4N}2aatLlfxLvB^c2?=Q-#SXtzY9x;RoTKgct@(jK^TZgDRiDfhhqZYp}}rJDPkZ^p}q2j>0r*59kbzSE7Z&iQ@9E!DNZDrJ}R6csxi z3HG;D&Aztg;%#?FiNCk5?^||#mYPD(insixOlk}~rjJ}}bz)P`LMRy84p89M@(q*JWVpoZG!@jw(kBOLIy2^fkXO3SVk{ zS@rwc+Nt9EKR(~|=)L^(<_HxHEmJLql4Qn(yY0SBP;qxEWg7o|6H-ZAuruOSSy~)zrD@(_%C(eSt`j+msuD8xLcs85a;}sQI^y8^BLn; zVl$kWF26R^d0N90BDx~%<|NSc-=yqG2XzJhJm7pe=iURO3k*wMzF|?hE^QziaP_f| zf}-=*mj_?PUH;&BI!UkA{F#Nip}$q}6BZN3yPwW{dTPXE`!sDr+4L=^I#+&H6}_v? zUjHY!@@?n)6H~I+O)mBSyL!(z{{GbpAFc`CpL}+Ijo+pd^N;u@Hf;R%W93YT^O;}! z>otPc*Uew!xaZ-`^bdFPJh#rD5>mcAhv{#<{NDd>X1HbMWlUZf$K%X6A$r5tRT+^r zH3g-H3&b)^6?jtk9R(IVaO7oRn$Gy{;0E^UOqqKg$rBazWWG$i{hlN2L#+$p6_2 z7U$wOI9%sWko)q_-LdIm@cds>Y93494|sThbJf+hwO6;72pC8=T*~ZL)b0$=PKH5ncxi(8yM7^`qfqe@?9|B^HXBdH@@au;nkr=2d}|2uZ2yUnwA)hWKt zA+r`APkq#}gy;Y6`Uz9}YaOll_NaT;zkU4aow5JPKh^K1AHKcq#5D1L&Tc(&+Q+}Y zow|&3a?0Dw_7hY0|C5aT{iHwT+S%3eL~_x_Rm|*S#_Z#prP}_jF5B5QU8@o^6oF3#iuvxaPij1$4+V0 zteOAs-}k2+ZLVtX8YeL8IGuP=`)zrZfP&-X9Xp@A=QY2x;8>mf&lBz;$_202Za;P0 z?qA`FsfIV3u8Q3KQy=HwSj75<;ol?ue@^fD_5U4y*fOzVzlKPJ0ZUhJ11H1LyhbG( zdAom4SnTpb{{ILF3=%$|TH^Wam0`cU`kdzz7_L6r@~7RnWJ#lr;|!JhHj`twl4n>N z@Em3+R`+iUTOhhF-MHwLK^xPq%|YgcEhgsXr)Ko+$T|MC)0cfgUc1--yQY`;)UEGE zOi^dOerT>llE-CUeUIw*r_7fM2e0bOxuFqjaN%%=Rt=Af;}3~>4st(Kyu)*2gcfh? zb9`LTIq5)T*u3OQL5rh-dnJ=r#!E4-nw_L;yzc1nnO~RKI&YIb#QU1}cbksgnYAze z>K|0KzqdJhEBg&oMhC&Q_v}?Z&;7vT>0RHJEMw&SplE;o;mz^F$3APa1Vj|PW}EOK zzD6)f%f#p5frX8h1^T{g8(5tehzJ-kE)a=I>^Oa)xnET6ho|x*o~qAZI3$>7uD*EZ z0~-gkfS|{Z7k`5p9xSr7tG=ib_119lfg9oP8x;J7o|YCrTlIV&v%xj%XkhV%{mDPOEv8SH z+wt&;xb6RzH|<6Ct-Q-xH|;c2_Vs>tx}?VEb>f5*2N-$y)Kxwd_8lympZtGS9P7pE zHSFgu{^^ zGTHyzqm7K&E;XNL-@oEoH>Ya8y5+m`_x|eF|2%y!d#CfK`ZpVohcG;dVt@>`urvf^ zv?}Ty4zqb*nZuu)%x}>o=PAWjA1Gw!DYxX@g2yjk_*TdKXxBOa&%i&B5-RS1#-hR?g;N>r8=_TJ*6&fsRV!X1eER(r+J^NgBhrP=;lqx)) zIpc==^21-AOg|9+&pSDq-+fzg;<^fkkJdXTac_~CX&;~0o_j#_?Bk`1yva^ermw!E zy5d)RSYs4-mD!gCksmZpB+O@PkU4gtDxuFlU6kbzw}+hV9*$%Gk`E+){dE0l=Q_Sf zj@9ek#W9qEGx2Lk`aj&`5&+qJ0 z=4x{>sWFJKetTpm(*5ex_m7Fy0#BCf6c}?k`(yalzg_3T>gx?9{oLXQIVUXJ{APu;^9BZiRa4l0F1|C7O~P_fxS3#E?Dg$t zr%#HP3z>??rF8#mT1sLoYnBJTetd?>)VfiJJk2yfvq3OBhErt#1 zy|1VKv7FogTtg-xVL^2)7w?8y{Yii3J$`R1ppn#JC>gMqEp2wX=keIPo08v~?fkuV z<)(}FTGD;%rZP*HpXS!w!Na#h^6}>lx((6ye|$)sv`SJ_U;g!kHc8=>o4?mhd&qt( zRWRm@+UCqN%npJZR$h$n`%|i!{K#`r`p%vE7}A**l&|OFiTb~JkLC^mDuy zD?{IR`SyUEg8~|^pgF*!VUkToiOcr=;ocU{x^l9Q<-M7WtBj9r{3Nhb`{iW;ffT># z`&6p_OPrYegn!agCr7VsDzR)!Tnl7Bzg%{q!9giEaBH=bS>H@u>%7*+2OH!fcNl7& zm$T42DIC$eUR`vJ7e})bKU-aCu5Qtyt)ZJ%o1Ol$%xve@+%}UQztb5{u6BNM6bWox z!p77-$?Ejs2d557WWG81+rTK~u>m!VO$*@BbZgWYiL$NTZsp|8x> zv_EwWNIQG}p9E7S$Al|80|jWrW{?U_@Jz2 z&9O%dm*n>?w`K}`Us=NI^Vs3~XZ7Pj76+d7axG&xbx~PDtHIT_g~?z1&cUvl<9)BM z*gU)HT7HPtfP)6ohYSD#DEe~O%zbex%$IkUG`o{4Mj-wkKv?9SBen`FP-z{z?c zlULq5`|d@L|5C_;%P}p`$<>zM}V(Vh!kNwcwc%oBy&w(bz00G9$&-6LERi_Cu zsWD6mOy(^KjCW}Jug~$Na6+c_jhRslshM^iS|xqUliM2F@9p{aW#b>c&Nxr;BkQMM zoN5sAV&XEHi^>zfG4mMSvCsLQ_tL@Nj+1$>-{u;OXzkT*$>VnR zOJp=WE}d(TX1e@JQN-Zc-yY)%v$w*p?o`82dcOU0 zzS8$+SD+dn{}F?@>d4a?mE3Vm|7E2(racXEdZ9UelJEPySKJ~rWLbXbP5SXtKH=09 zO(UuIMweqARQuX9tbX`?zMNjA?Dl;utmX5MwmBFIocP@(wwUAFnIxqTB2_2)A2NTf z|L`!#k-@O~5>KGise=iATNzdASxmn%TV_kG>ppNpzx(HR5snpxA3l7%yt{bS51nJz zZF}Aq=hewp-P96!uusH<+jhn^_t1TP&$Hhx|G&dOODM1X<)!fX$N6*D<-GF>{Ts}E zFtyn<;m-WM|9M)(rkriBx_|!AzJ@ZMcX3BfZcJ9`UD(9)>iEj;t$X-paoc?l^4KF? z`PEK6d{K8_!2OolvnnsnywS_t%FsFA_P3_xqvc!eFMncA=ZWcCs59xG8OPM$3OPnC ztgU~l-`o(;U<1_~%wL77)Yjg8Ic17Iljgj4jdR5sRx?*AEa15EnmZ@A~gI|wD`h>iOnf9Mv z-Q4TG$YQ^&vs9)9`yw?3fxTqU919~CB5%V)V0cV zqI;J_xO6SK;V7WM(4uz<^9)~w!jf@XwRkD7%V_CH~GLB`E-D|Z8(KccZ zx#!P5+WEG0i@U7#{>-|&&%Zviy|Y>R`L*_&D|pt`CAl6X^QG}iSBO; zruKi4Q+*q((YNo1`(uy#Baig%UU2kvlRvOw{?&)OQq*MnXCK|UCuU)sqO8~fCFQi; z_J7vi@8X*)S-DUC!;Ie#nm2Z^rl;KTa(nQ!opX!IT=Hvt4E{Qkn_;>2x;h!;COjQ%w&wkC1?mKPf z;x$>sGH)j5t@S;#9p2bKV?V$0LiDPF^WRmj2xpviG9Ve*#aQ?F5WyYm5R{B~YS#M>; zWG`6!RbIk=J?8NOx8L`F|Gj_ym7n*4_%Da$kEI1&I+ta{l*MwzX3Enu0S*lFEsN96 z%rtJl{wTWRMz34;!0H@c=rG?U( z4d3OhrTCeaZ4g!O{U1J2`$s;*kNMT-s~@#)-=jM3*8z66S7i(4$zPoFzVH%%xjCEc zUEj}buaB2IH&0JyxOHajh4%R@kFy#JGuzeL)XEN6@Gj0(JvPN<=H<58d0nCA_hq^h zS+>=^j=r$iI`7wId*8J#CpkVWiaV}!mbLQW{Y8K8Pi5@?G<&k4z>m9J#}3?&`Iooz znRWHNp6TtC-!B_-*8V&l-?zU0@9U5H|BmkOFc;2SrM5svmGzt{s~6jYnEj24m-cTu zTmOjpo2OaLFX@?oLW-4ErpPfgT%F3ax@L#gigTZxmw#FRStgLtiaTsVieR}^!g6B; z`I99~C0A`3W}i=5Cc191l7G5m?(J*&VvX9oQRGlf}L!z06*c(QZ?y zL|2O1tVt2qigTF+rPGvTnN#BeZiaCrZuzq83qP~dTrn}>SMM@^Q^PG9gLd$-OB z|M_-vzdM}DxR=iO>gR3kx?+>q42DUbo3-y-F716D>+zz``rV1E%zM9`Q0`BOeqZz4 zy7>LpO;bcH!bLPB8;V_jD&AOc^v9853;zPioWp*md*w}S-p1NRq+2oG;g7Ytx$_0z z`KzASggrK?v0Taw5O#RRae=dc&L5^K(W!eS=B}!nA8z%nnzQQ~<4dj5?2r|5u7CM& zq}uFXRlVeqiROj_0a-FGu?M#?M4i)4z8GtAeCZc|rm{W%KPG0l-qqT5oB!tjsuzp7 zHhfFICSjZy<1^FVzD#-TN%IIF%|DCJ*W2|mtttOMyI%PC%jhpBE6?al3VuhP_Mi=PSYft=TMlJgO&@pSD+JJ*NjshHoxadwhR( zJX?6f#wmNhy<;ojJTvE`;gxyu50xX7H~ODG7yHVE-LCE=2SeP~+UgII4o&iIVRjBH zlQa^UlD(aimd{B0N`I_D)~6Yk#(d)zs{q5dOdSTKXb z>6RJ0EX2PselTV+_}!pC(_o&-ff-5(9=j&qTkbnwtXqGVM%e*|6AUL=WY|3R|Cayf zEEBY8+1`g9&+A^r+U<}RK625i_OT81Ei=MNu z=Y0Ne_*wqKIRhnQ6Tv0(8q-bImSk8heEI(0?|S*UJ>`OSOp60Uw@>jo;4Sz^biMXR z@sIyj{hJ@Zo$pifqKD=I9)HXxz54IiU|-P7{5t>UCRMT6BF{C4TfQXEG2i;P{L}3c z-^M_z<#juaz>8qp$~hC1;|)|S^=QcY`h{{H?T+^C+YS@KJd@H`_cG-@(;I&GyWUu1MVKX zD*nIJZ}Bmc7uvbUCj~pYA8S&xWV@Aezco3JOD1@Be*Qp3LvLyza4io$_C%60tMe{Aw#w&rV`mFU>kDe#7;( zdp9loJcsGjFRuyp^lw-r~+XEGezo~0xg@`(3B62HN76UTD=nOmeEp$Tgp?c`ZfJ*r_@;db^wTgV^@K7s~Dj*JuVmzO?f4qGJ(P zifsCB{pSx`-*?v|C-+Ra#&w>J`Jbmv`L*?^ygiR{gW8gZ@eaLAB7eTUchp{Vr0$H# z5d)S>F3((8rdcvb6jdg@nEm`+_haW3zxfYXIBveNZ)R>b%a_i(Ddt-k?=$xVFJ9U9 z{@}je*-7`W<#HG@$}8sbmtUS&`6t@OeeXO;hKZAceqEc$`(eFS<>I<^ z6SlakAJm$(>LybvOU~kL)#7SQO3YKLQrQ^lU#I>)yOnK{!j-?A2h3Ef=d$h1vo@0d z63YB$v;P6hT?Wn}FQV;Rba;Oh^X1(&(y!T}?eXkyO^g0qQ{#ENzE1nWH7V-<`9D4- z3mIQb*tziU-`m^NnFGS5wllnAz7(Z6b+y015_O-fo^HEM98a=1?)*7q^Bed2u4w9R$djr$I6TPyS~KXnV-d!Mm+ zk3{MI08Set%%g{_G~QnZTu8ovF`o>f!FbWeoS8=T9m4` z{o|e=2c8D7*M49-XSqW8p_)QxiP!489zVRkUpfDk$w%}|p`O%|BkS877@9pf=5Y9G zzBz8PwA_A!o5YQ+eYG_qmuCi?yjR2G@h@~qxpx*rK>PI`mkBQww&+jS34440ho1Tj zu0PBEpWUfY`kOI)?e5f@n{KElf5_f1b~@tng8m5)z6e{B7IE~+ zgT1d3U%JSbzRC)_v8t@0Zt476ydft{52VS@PcHrl!5;>Rl&xKJk5$fBF0C+V!%J%YUBv^mHfB2QCS=`Gvj=Tba(UkCl$zo+EjI zK_qwT?@3J0XECWV7l1?XzWkAR=Az;sXTGjrQx(}Dn;Cz;;`2}GY1f%F-H8}?~_OnH?sX)(u#rgYb@d!8{cPGxO9^LV}4!6!~Tug`Dz z-6nbMirRvS9v3b@Z|KiwPD!*#QPU`0%);Pa%fQCf{8~Y5_o~VTAB1moRmB!FCC8pV zUM*T}Drg&RcC_xwtCinM&s-}{W7^LxC;4$ht}qWngWiYti)3duIEDKE<%;U?5Cc#$sWb@$BDV>6B&Xoxw={%2A3yOT@Xv@`f#%@R6epJ39MEB2S`$~3jj6R+pW zKU<*m_+bp={}-uweV3~ZWOvFNCfE6#kvd&=p z95I7|%|3PRU4!G*g?ypR36m6Z|EKXyX^d&OThFrJyWf{1W$vO9(fvywIqlTfEa1~P z5WYl5l~qbapvs>4QV;WqDa)g`o@Sm>yXrZs(z=<8_pLM0*%8Q+wDjAQU#TJtw^%go zTC5(bYA{7uz0-UfKIIeZ7PT8+FT3wAtG@MG(K>#;C9_8Dssp+Vm3og3Zw_^goxSrw z<|ReO>AeRF{!E@<Td^Nt;+-KSg zd{UIB=Umb$d*fEL+*eY2E8Dr7yYhMr&7Wr|sZJ8({1f`yL~wHM>69173r{jGQ|r65 zP1>(xZ_nQqQY;SXru%r$PdYk5>{Jn#$Om)P71^7oGtRKDuWPD$y!~2+!d#Z0y^+UT z>(e%~9kFuqw2j+SQ8;h=@864c5C41Dcra#XQL3Fz@P~>0H7)ax_}6V-Zm?#PmuKVk zxlA>gr-FhOI5HmmSpU4)bSA&>1);eO8(00GbwIDd)IMV7#`EqeOgpBPRbRO{Q-!0! z|EqQ3o0lExH#FuOJ<&IKb|d=0*L5>k zj5mm=AASFU(cViUS+DU;?ZJD#z6}Z9yZii23%vehSthth30Zx9xs31c^BKJdufOx3 zf06fa^OiXCWB1EgUkYYurWi1AhWni{-1d0CLbI~7!r}$XT+NNRezD$uPwcvVLH!oX>6`Ybu(CXh-CeeH z`Myj0pBFzr*V}Bc+UsM}|8;Y%7YnCHysxxty8qPGfbsS9_5NxH9#?ayhrWHki}C*N zd*74P&qtU@*L>SN|LN4v(%#=snF+-*~>n7~$6?l;-Gt*Au1E0_Xj%lmjvet@!nK&_HzJ;MI*X3>N zYx1j)x`#fue9qu;{pI4mYYRWj5l{L1a1ZfdBkyM($~I4 zi7%UXTAjHkaEx40l zyDtlG@CRo~#Ix^rmu$JZI{djAyIP_wU%l>y{}w%m4DNl+*phyJO@txCzje$HHXU*k zKVboGR)O37-mmy4?px1z;9q`&+X?G+E{BhwmHB)iiuncGG0qn&R$V(6yW(qL`ZC^o z{gHxI?$OUSzgPX6xqs4{1!wl&^Nkjozlv$qffsHXF-w^>t1K?96Dl)aX5Tnv!X7P) zn-?S$N)M-8dAs{stAqYw$9+t1e;F|4&g^Db8R6g(8?P9ncUI`zLgPp49$z%eOkzrx ze=NDDDN#H*c1x=Fo__wX+^6Sv&J{n~RVTTyY2t;O{%wpeV|MQ~E4%Ht_5Z`QmFuc@ z=xv_N!>}cxPqaqa#B_;&gU`fozv5;v-db^mq4un*QE1P8zf(z)3w@U7+&`Rnz$`y& zi@Stmmgv2v#}0?`)8}QeuL#d%JasjP!JbxCx zdDSl-W=yS=u2}!{V5i83TCQKS&GY*V8-B?DIVgW*`o1qqZ}2}}`DOo;OWw)TyzLLC zXkL_m`h5YXL%{T%#&7Z^1=W`Qi#=Nyn78}wwjW31{~V3sSuy1w_o^wsi(MNhFgaw+Ix#99ex%7^M%rda!W(bCyK1{dSJEq zBcn**7r_9gb&3D|Kd?81&g3p?Ot0U|f6{%cg}ExyAiLJlmG zFY{@#`kvL3YZBGuofsCAnt%U%y-B!1PRo79FI)Z#voUze&aU6^&e7}j?(OQA6^(;0 z^5rk*6YKxKr1klVC&9@LV#<33`VPr3T&wz26lNlQVunHgly5tq+FZ6jQ2y{wih+)2y@__uNBMh&(J|bUjs5=jaqsca+kRQo z>T4$758KUJLI1Q@|B5{Gaev9nOIKJ{2x?4Xt6ZPJ^lr~*KY#YFe~i-(o@-z>Kixcu z>3IXF!N%8NH)U6ibn{R9n++ygPPLp?ysPrSlyMXP0dt`RbNS~z2%2j6VDXFwz6V!5 zk1hTcd)(peZ`MEO_Db-p7+%H%fBW z-25eeBE>!D-?!YE&+m!sxgNjKM6R+d)koQ`-oodQ-4@nx-Iy5(dh6tF?oxF-GvnO> z;dh~*Z|6_dXkdvC*D&dCXgKlp%(-?Z8%fq{3?9MliETRacbbpvd2llIEx!=qX&{F$%kY~Z;gq}9fgg>I!LRR=E_V|e;h@a7J;Y};lxfJoW!}Zwl%GJ4v z^R*44(#8GSW~qL0Ea+uBB=}mV?#ukTm!Chb|M$Z`N#a&}8h3A*-iH1EmQ^pgo2_Fs z@7SmH4#p``_YdCuEm!kmVaWUV+OJo4w0~K)?Lc12qqgL{olk@|c`lOFDB|Gww~V=t z|J;mik&v-#Rb~T`dxtEgny8Mo}5=UicB(TUwiA$-9Hn!0?q~<_O@c2 zP|Uc$`tq|CNuP7r*Hjl?;NJ82HT$=s$*v6yr~YY94!kYw)FJgxG3c3G_}p`wuf|Tj zasGJW>dLo2AM9E+*X)nf@$(Cr%wIo{`hEO6gGcxC@O2$!uX3Kw?B4m$%x=r#kkZ30 zKWfw%oxB$?C$`C3#ob!%=MbD26*seQ=Hob-8$#;qE7VoY{H`R<6u4l|uy>cSwhTi#*iJP>4X*u{Ce}2i5 z`EtJ1R1JoPo5i``XPKS}ToBT)@6u|@_3E*@bIrX8xf?^5`)2MDpQ$I&9`h(-mg(=+ zy-6#dseKM~H9q{{!nFsp5B{C=+~t;X)PlMf9x{(@zg%9n_@trr3SqBv-&?YuUtYQC zo2hHOHU4 z{a?KIi^%``(Ej;njl6p8syz`w58i+W#P#;JhvdI!SNSKvV$s)L%bUK;@6inQCD)Ud zFtlntTa{HD*v~(EL6F6*()V{{-`={m^ZNQ*^1M#6FN5{JicSAMRZ(H-JLTPFF5;yb zx^WIc@0e}AD|6;MGOgnZV%X^SiTA2S#B;;z&p#eCT|Kw*N43SgEg6A6hs+=BY?trL zuK$+)I6pG+t+ThDs`I*6r3}3rwKj$yFX%fwPqBSwU&W;*$DCY^*ci42ujKyF=c(J! z!{u=I*iRdV5)s8tBZg8R-W4tkfsL}uS_@w=Px#4iz^t+N`o$iV*bco6WgVYlXWt9U z=lwqr)hqVFvhVF~*3GTjTH6*yUAwtSTw(e{!&8SWmoI*_FII4JWKSAbl(6KcCDytL z|2%vfdIQb5&xbL7YyAG$^>%RbLbe0xrn`5v2WHhK7V{+M$udkiJ7(a$?i==}Tl z{$HNX-#6)#zwLW|J*uX>?dRXC@qa_xzWg=h*8Tf{-Ts8=-+^k_g{T+NafoYa6G7fJzsb~*JHABAoq9122Q&^_YIZ{ul$@bGxc0*Rqu2E zmrT(OX}V4Mmvtj z8yQ)OD(}iQPRuV+zcguC$LW=qk44O5Pw>svzER2?vH5s!uV%}u-V1H#YL~udY*-Rk zbu)T?-6YS2Yg4ptJio=bOyZd2`exOJ-|lzUOZ$mN5cK#j~iXgPgdRBob*(cdy)LH6>aYIuQ%|S2yOGcaxg9|cnW96w?uo+ zC;JxLNiswwTQFbWlQ&Upme`ET4kb;w8@5i|@-nvHPRclO$)>%>gvIaNH)Gh*dcTw5 zUA1kb(fn}Z%(D#B>i_irFZ}as{r{>g))W>$9pQwk{~!4O8~kND!?=J=LDJ!VY@`<# zk0RF;o&y3^lIhhNw>*Bk_wwi-oV((S@ws@1ugLjDEjX07{GXUy{j7ikel^#wDLh=q+SB(zuujC_?ZL3SO(APC6Rc{tCh;AxlIy;) zWp}u{e`nO|jtJ}27$d>O7j=9TAJ1BuJHPJF#~B;Hoch5d|6u*!?f=Ez|Nl9^f1;6U zhUBF%{mY8U2aI1NEKVwM_}p?!t?IP zT(5sT`{NhU>8|3H90}QvcARYZmB?nq)Ra8;w}#i>y=Ru{&y{vRYTEw&c<$->eWFXG z?;V;m{pAk#$V1!az2(|Av1jeu8570aAFYk@2lp==wf)|ItdP=P3a-%QgOdp6Vwf&u+2*ul4=D z<@Ha)lTCc?v_`c=H-^8gKitN0CVHgJ9KlQ~HG`TmHYhyd?Gl z$Av7F!;CX@7>cA7Ze{n_Z_7K(ymgxVgT>3W347&bv700c-u9kc^~U#?F^@2#Ad~-^3ZrfQIlb>5UbV36Z_)XhxUu~7 zGYbxmKDS-F=TyA9svUkT;*9v=$?*#VmliqtUVW2LpnV|F;lN|N>*6OYIr=z78`R|8 zUR>&nt+PpMXukD?^%aZY9GOIus*dmevpl$;MY+yiaO$7ZE5C%euc5D#j$M5B;%>Fd zEryq^=K>YfuRYpz`o4&{!bAUdu`KgdqR(z!l5@Y7pQ735dvSBN{~Nh`lERNG_GCU^ zC(+9JKc ziOFG!!>ut(c9~cm$S;BZhP|Y9jzO)&s@2| z{vvDhd)KvjOPWseU;nAFdntcIapTMf+J7dmW$@ng_6q(8ztiZP+W&dej4K}dS(N2uBp-i|U9t3HNN`I=S}glKg(KEleRrLA z-}9aQ=>N}S=8qO%kCT3T;o|A$(=TtFVc%Z7u77TOVolmdYuT6oQ$A}*G)}%Nopqh% zziIZhBjx)(&%NPW*C#$TB`v;WsZC{bz=9NpdkXr$j%0pgErSQ+-eel~mK;&K=9Xz3oGTYsnSiz)OE z-Ea6?B>diK1Iq*F9hZwS98>dU&5+hoxp#7jr4i?uQoZ86FE<{4d{KM4TYnvA%=;z$ z8iKJ)eylaBU(A?dk=H2rs`lAR3y#YLy5HB!SQ}3}7ca4RdYtUy{JmQR7b-X#_5bX3 zS#6Zh$HjP#v20@Hk2f{KqT$Y%Y+q{jV4EqN51<}{_dZnPMhB1#DrgS zzc2Vy)%CC#Vc%W{MD z;*=RvfBh88;99Xz$-h%bGtPZ`$a3X}v;Hhw6!O;Hd4b{OxeYF|;(S@GE**>=QyHEm zTWpfGEHGK;EbFIq^~ZzV_Hv)^f8FPh&c$%<+>h@ntmo=)ik+)vs?~AI%=;~-Dt!6L zA(fu`-@6|%_xJZNbvHkDKcw%--QCxY-OhV*cdsF=AIu<%HLwx9d#pK0Ne4{={3a|KbyEj=67m?k|2nXK|F!oWDXx z^!KX#E}C`8cH09FP6_`VfA1P5{+rZMdS2jSfl8Q8ysZ4*im*SWQ!TeRSCp*iB8w;d--MglleXjpEDed&KELId)ctmlG$x> zTi61w4ce07hTaz6wB%3l35iJZGK4s>KkF{J=RUX4fQ5TrmDV?(*|W5Mv_xGJmCmXV zjOzCO-G9t!(vh6odzJs4HGSW4aY_5!pQq1EHZv}q5VW=D(1S;RHY=(vXLH$LwtJz^ zp{Qq;O7a|1017f1pF+&tNtR`gA0C(QcHR8^z;d65R}HppiV+Z*&}htmaPRkf z(*8CdkNB_r>l>8P@rd2S`_87S&_A}%)@|DJQRBe%FC*~my5_n6 zmG+!7lXOeBnfG|-8vW_T9Tyh#RX)-x`tZN(|HK>ntBte%pPTXjT6B`yXCDXgma|97 zo1$WupS;8JJ3ZX=-TQmO8#BEndM7;KPo8AbH0|rTiG?q(yuA4D%&H%M?v)nSivQ%2 zi0TV=bNKz=!bfAD^dV{4&8vm~g%sMkew0=E`CG3y=7({RynUy=!|tdF;J}?}9(nQZ z8n+*R-`D?Ne&Byq$iFtDx<`}e_Xz%Rv#-6FQ^)s5@6M@DZHpS_@7}cMpvHqo_VVl^ zRjfP*oR4qR;=Y-(LY`x>yhGCxd6t9De;kC?FaC5sr(W&q!#Mr}t3J=|VKJ)M68x5< z|4Knnb@1&MGcGTCZj~^7)k`%F-hU@JI+~U&SpMbZ_w=7#SA33ina*5gZpxr073Axg zA?LmE=#1I-g}U>1>aLTx+c){aL&o1*ZBw`&EaJai_NPhuxTQT~d_A)S=X8m63#OiM zZB9tK#DCydUu#m4obWH6e+IYev>(fOUS7O0z~?Yaq3`h-J%9a!JI~LL5c;um#g=uE z%mw|+=RaiXeehOZKPM-{>cq+kJ`H};Pfv3%J$Y!yqf4ukuC2IsV|Ti*jOCum=`Zf+ z#aMLqG`{p!V4m=kbB8Gto5Fp`sY{#-&nW+lF|?Uyxbsq)#HQFihwHWqrtVbGc(DJh z?TnRjO0ge1UF#dZ?|onUap(EkzWK@J|JeF|y%&z3f9H?+XN2&7nV2} z;qiQ%luoJ{ANc#bPUPdcXhzRt$=hrX-@3&ZppxT!`D<@MP~Jg$Xj zp6Z#Xn!mM{F}@J;M^CCFetm!MYy1DFFaBD0TTGFD zS5Q;tKf_std-aL7|Cl_UdcCjf5I^(WuB4#vMrhgo4aQ-$UvJ*{skr3d(fsDqR&&h$ zUQv^n)^RxP+v}P;IhW5?{*ViP{4inG(ds39=L|giV@z-h&9 zjEpgtuV$Z=U+}74`qiKPKf3q-Sox9r-~OMo_e+{Tw#W`?`73iMX4{*6zm@)duFv~Z z7GX5&YnSx-Y5SY!FM8NowlIZ3Z;N>q*XNJS`F(%wWDee9D1ZAmiy??9{|{pT!%-%S zBSJZCwMT-ldpKQo)B9WJw0hmq!u4#%7n;4I7u@O8{jI@J8QQw0ZhDN&RrAk^7u)pb z{V){#^S)Z)(X!VJU-t^y*U2omZ}`9Jw31x(wStyv?eBFw&JQLX+l%|8S)5EEj6GpJXU;_d;?DWA)62Gn@|JbqCP zXyt7N&%9FtqR+jax81ai%V&I{VtA%MRloTC@qhPkM)z{M|4J4+aL=$RV#__g$w~{< zete$rC2I3F#kY?O<@=4z=O{gPJ0to1o_yi?W^=Si+ZkqX)-X8gnKi5Lje9P-#98+Kl)m2~JBwpnyWTn1 z{w;_%*X9gMvX*%obNu#_-ok`3pi)pE}IY~(OG+nMWXd-kKnTaL_3Ni1IVKkUMmce_}1W)yFF^hnR$uudYV~Mx(OcX9er8~SVdhIL7|7SqiSFN!RJkSobI70L-gzB@Gx+-+ z*pJ&sCNePuHg%Rhk@-!kqGlSC{e0 zo!RKaaG!Z@-skOAT*(@%=gbE!PyGCO@7`~LpZWJ*Rk3K<|MkIv>kG96-r1WncYBX@U;wa^FYi=K8246*TzEHX12cFQ}w z+COd9mj4Ho?GCslH&p0Nw=QN&xH;j?Vs_7#Ka8Az_z&^?dGPPp@st0yPTw3HW%m5v zru~22WSpkn53(1S{UL9DeCAQ{#yn|TQ@f0FCoj#JF25_KWJidh%>@31`*>^F`Q7zr zO*mz8tf_4A#B}@lIT{8QE_r>0?YkZe+4U_}XMVT)o7-xkZSwvzWsX<J3Ln(ITp;;C*O#}w`@6);4GD3F-5;);dZD?}+CO9VEMXx9&6)bYZ?C^xM$)iTl;b;?{f3` z3wuk#HuLtkGnQU4#>N(cXQJahbN6IT)X z=IQmCH^Ltu+y5{6Q(t~xdjHo>){A|2W4ZQFYgDSJa z)N`4YrVsQF{C|7@U#?E{Hl6z4&Fpq!Ywv{b|8+HmiKYHJqk+1^!q^JazdU){ZT1yt z1Q;=hpWAJ-btVJD%!lVA>Ks&(k580}Nl;TQdv~4HQKISBMzs~93m(SxKh%4r)R?E@ z>CYeZBF^bjU-EDHe&0Wi(+opfJ}#_V1ZjY|aZpVzz|$L|h283cKd_M{GUb)KHqzo$k%P%caOeC)=)Uy>gt8XA4$=b0^$-0}YU>bYV?-V4NUbRXIn)i+CM zx58W7FA1qsYFm-|N>-W|ociSW1q+aAT%)huMW25cuf(L6DB>e4|4=ffJ z{BgBtPDDyW3d(kvXxIqc3oN zVaet8)hcB(94{n=pW|dd*tL&^XC+_qqP_O(y_28KoylCDq^5BGz=Nbu%BpVZNty>2 zI<_zT6TbW3Ws8D+9}aQbv;MpH`%JpsVf)}S<$v@{bTz)dpZaq7l=tNt`)_VG-!_TS zqI!#*k?m9aI=dfCvmZ<-OF0l#Gnvza-8kfyXyb&}rMyS(ZEkWnczj8l%SOJH6CWJ7 z!9U|m!@TLTuRF^9cbT~9MGEOL&-wZHY_+~}Ld<^-2ltmhjx0JG#jxd_mqhDg1Bq4V zLY?EdjTH^n-M%qlOQi9R)+<|OSG+g3{UY!@RwkKJ1y?nz;q6MXgr+hwWO9M5GK zw{NMnW*Y{cGemZ?;_pNtYyzv|B8UEN_v(z#VcA03#G-uhZ`;Go{yX>tC=|@TlzmzmaTjjavC$y+!p8L9+&Wcgm|j z&17UVwG)^*wZFeHL0yEyj8ke(`nCN`B70Am?*0FJ!}isZ982zTUD~pb!R~gF=r{Kd zoHv@?|9Pn1x%*pc+nX(g%vCilLJ|IUt5}|x@K?ld*t#aJdvA5(V;jb)eGGTR%zOoM z4VXlgxcM&K=gT|$KyahK+JgCo-xk{CUq5!A*-6ZE_Z#d)=(wK*K4G|dR{x@g7TSS&wnZf=tXHtC9m(j`fTp< zGZ)|8ol~HAScdU`+I7)u{sE`*Q|GPSt8?>CSmX8wYX7x=em{6X=3%7jo}AORwdtoG zD_i7dO-rzuDJ0RhZrwEX`}$vJ&8>K1#dm&fr10?qF71c%O>@{?1+G78ouEFHiDLYFWm5Ol^VciJi~)%$RoI{j_s^ zXLqiCDWH)3MB+tw>ADo2$pMB+3o16;j5ALxF`Y5*@P(%b<}Ef%Wl_kJJ)XM!bhv55 z-H+DqCW}7Lzi(t_#C6o><5G@8nv=I}OSj!t%6~_AcHJN4U74No!r6sK-*_6)-Xyjs@Qk^V)DXLXWln&#n%1Y7plDfgH4Z5Q?J${*JHxBozEdtUCJ^5^{R>s4;-=cX^$$+zI*nBvR1lb7>G#7`^velg># znZ|lEmVGl+`13%?xuM>fY1x^c1)jUNK31WdCoxdb}{uINWAj_GOM?U_r`78Bs!@q^>Nq-mfFZz{lddNP^ z@O+@~@5S}^USya~G3YkQHj?fOUw71U*2@XS;T&gX)C;SBoVPaG@XW;5D@_;lHaTTp z%iI?A?wmc>j62VdN$2-`-~a!wBwL$juAUU#;RYJAImAYv(CMgxw+5#OqjNe=KP-R`JcIm z@nY+$8vW|Vpxrx8OV56;@b(XrV)EwyF?>5-gsCl;2>y1sH>u8buJHF2zh7TgKl);4 zv0<^v%vs`QE@CgHP$zbHW<3A4 zY01jB7xOasFSmU?&w|}*)rlpR_NL5YuSHAy56g(~#65nul6Pn1_B*_`Tp6GDzuk8G zQL_B+8xBkh9vjp|Z_Dv~;2%G6q4}F47iZ8q4Fi_ALy_`Ki}FMpa@5cLcQq??P+NMW zQ&{?Cz3++U>-Dy(r`S4HDXkZ7Q~NN(eL<-IXO@J(TNn;SQqT9#n$pG zYt`x53Qtnl<@aBCvhwosD_((zFI2xs@QK->A$Gq&I(*m9_2&De+Y2~yI$x{Bigia> zC-6ALA6U!%?1*Yzx50771Do%wXVXSgTZ!hPj^8W$- zylN?D`)WU4Fnd<^@kxjDy2n=M?LHK&`v3dPjpV%tKY#x5l-JNR;Ev0_V ze1BE`X9drDm0eAhb?b{P#Cm7S9pBd9IraRcjpxf7rYZ2sx&Ch26(z!5eBE40vhm>E z(`$TZOnSc~P_U@5z{|$_qr*=5AQ6E-^^eW#l=F5zo!0neU)qn$jvLNAHCPgNb%M+p z%@^A3Pj;MkoXf|`Ah7pIb*HddY@XPGgE^HmxfzTdSPRx?Prt^}5MCWy&v0Ow){cbD z>mGji{-P`W#G~p+oBr53#fB~0*D9Cg)am`2c2{_9@%=NWs%0;Je<8f_QQ!L`P0{)1 zpP1&VaKB1boUL`MRqU1@XP7|nB-t(R6)n#j|Nl_F@k#nU;ooNK`c1#zmz+EGT*iC% zxt(kcS8R9Iyl-E>&m`)2pWmC!oVkzn3hyWuKaNN&iL!WCzSaI<`~s6*3nt7d)@Rvd zx?a=J^b4oDz|7ax-{ksI%{SS6II{8LC-ZW*(-tcKwe`E-{g&?%{r_5e%-Bg`tT>_kMbtADJKj z_uG#5)5=|}%l`jecRb;aQt_Eh{F_flY?2Xse)PiJStX^(@238}GMR1O^rw54IjBqR z(Xad1z4DvjFr@v~_V#QHU*vF-VUJL&-htnoQ_j715y)tAS;p9AdE)mk4u)@Y zQqELgjrq#p@%@|Z8dd{4tE*xY>i-DO|KVcOyZ2+?)bq!TYjX=lJzLA}{|#C5_hW70 zOY3{$+WSARJ(E>_l-*uv_4_|@Ju}U0pWQF34q<#O#p5Zexo7?I*&DVeT5Ol?75)EV zf6~9+{O+gq-_Kf<707SPnZsAu@|yKuIAb^eL8hLA=O6qO3{EyoSlt@D+-0&zYLJZj z%Db0sSN#^-{F?I=LsqXStM)AO9r-EF{K;z{JXQ!(D`t?5x-co^N(qnFqg+|*-^seM zAGb1VKl&B=JNX^2y|Cz|Z|i=TJ+8fdJNf4QnqJeozGHJ%=l6t(xmmfb`~P$Moq4NS zzb*95bWPI!wl^bU8{@xu+aF)u|7@T2qE@}mPyW2_=20Ei7mCj0%onNOyUTiBgq7MY z&gpMLex+OMeO~s>^@6;=#L~da}4f`AFMbu(X?q~V0_+iqy$%<2W4pe?x6n8#xlB3-{q;Yh@)qgi7H?6ZF%F`v^D#l|4!Na z+k}Tns(E&P_w)Drl>6S?o%`({-;%l~KO-FP9b{+xZ}w}?*KN{|+OpTFZcMOFYm4GJ z{w(uFydJ}oJ1myAzf)L*B!mwx?piWOTjp8qvmQ-_;HO;6d>Kp^X4&U{d7(Zr_oUSa zn@EoBId8h<<4u&7)ucF`xm9Fh_5a_=9e?8gzK-~|`@dD6%pJ+%^?Nj~C=zDVhf6njkQGH(*zs5;<)05cur$zP$i^ZS%#Gw3mCwsj>?q6MtzdJV= zH41*n;%cQFn#gEmubYlSFZa zpV9wP#kb`?b9-EF%k3|C8v616`#r{KlNnyDiZp)w{@+9PkJ{69d(U+*cPTydBjT31 zrCjIPi=WmWci6_f@r`sn?**o19doL+wJ#^vpWl4mO*A3u-`4#u!574{_kYzD&A)H| zd@JpL>V6Z>%Ty~ZtABAUnk}crP2=A{NFu4YMT7#ZTrL)#Phla7KIi5eAJ!%R(zVdcX1`mTGw^|_k}rLma7!qKyj3$|0IXU{en7sEVG7? z4%=6)1r@%YH~9I2+?KJLxm>8ONeG#~eWB_LWxYDyo&z=#4aq8V4X5OB3Y`jEGPSm5 z%dI~7&P4kkW@bMh8|tgMM)N1;{3$n_#dwM9XxNq8CNn1a&P~nvTJfG)#Ph4O#^u5V z`&nPCXIiNf!*ZtoVGZ|b{$6QIv#MujoVAn`1ufW1mLHCP_J4X{;vCUAueSVOzUB1} z-LSO0KW87i{jt}aSh=k7s`VP47x6jY8x}=1aQRh=)`-U#ADqhE?{`!&|I3UQNh|Ny zo9C7NS-$VDVb9L84|h}z4c#7cR7!A7UMZi(>ejG1?%8C;T1)#sx;L!vTfMAnjeCAa z!y^3B_o6K_m(%+C>wmn^KeDgY+(><1+Jk+&O$rzEX0Dmqu=vT0jb}uIdplcZ6`$E_ zeD?ckxnRFmL$$}Lb0;nl_$FJtU%LHZE4TQuJ2N*=`kBeM&@S$`kD8>%j{jkz2x>J#vKlEPgc)$TXx)a(u?PZFD2FePcsbk zlhxdRD2lOkI`=fj1M&+N1+w6WE}-HhwVF+Jp7p#5whut{n;_CR5 z@t!mJm!JM`HiM<^TSHxM<@dy0E12djvn`XmR?V0HFZV`d{0wt_zPQp-uRD8>-H>N< zVEp$unB({ChM6r>zy0HW_50SBxgTfd*W0Ga-4@y`7IVsI-`&8QdzH6}wi`rRtP(pQ zx81$Z=9^ct{^Nz22Q8O(Hda2Cl4xJX-_LIMcjb=X#rtK}PG08N`tL>ZoV{nXw;H;6 z?D(_6M=IM$gY z^xZilR+jRszk-+h^|Eq{wS22Pzx&79S#`TLQmgJa2|fK+0vZll?!5Q&ugC{%1#jGU zotRPie9@9OX?uRJxVVCoq2}__BJImhAMNe;lRhc9;~jei<3rZqWvUr6DUCB9GrZNf z@;I4sR%b}Iq`6jA#NBoIa(#7gbuZQ(KQ-f`xz+~(2Q9mnDcmyx`IswspO(x^t6$^j zF=>ACpXKKkOrNl$s;6P&4pILfJBydQXN#8``2O&`@_hljnyMs2!^W=U__-}MrIO+^ zrB!21nP2`m?k^Wwp?^UC#p{jtyLtECYTD=MaKvQe#J}e(H$R?tzDDg^?B``G)>kvy zGx~5h)ZU%LF z^{>S(`0oq*FSShmzHUzZ(%A*x2j_iU9>&b;arbDuN#TowCv?^P&!tJQzPQBYd(Wyk zO(!7Qd3KXe;3P>czf*rDmp3Tr|L~u0Co5O%<8x&CF_V2(-{wY~`m#?wXo*ezTF^-K zb+4VD|5_F(EVVs&(f7mRD-*J!W8%U}&2KfHVOE&Hp!00X^{^O8HUTCN(MMN|RSg(| zRQJAdU7;hc7sV3uSz^+bgexZ}ZTosJ>&v|@27Qy1Dt^Y6AAkE-I7ytVF2Q=*!dG=H z6TV2gHwZ;XbZh2_Z_ah$Hpu^U<;REHc|DxQ%a2{TDE!brpe4JAf#veE^EYmv^*F(9 z?EL?N&yGiltB$bNEv^5=q4J4qPD73SEykHr#t%XnPKdpFlX|;L|G>AK;zv)tUf0c= zzkBCH?}m8irypK?k-osb;9Sx1(m#wj8=9`z@R+{suY33SqIGgs&F_O(3*XLr`*EVY zT^naYKGW_=d;fpzd@d=moK5KS^cU>g)?P?p-*ThsZ0X0v-}mZ&)14)_`rg-r5`2Fz zYctG}Pu>$ClFRl#g|$S?S*c~=Lxv8q1&RtiVT6D{^k=lksILNC6s zcrMK_tL&BR^^{5c=KrP`K56bKWaIy9p22nh=jZ3o_aFB(xUhKQFH^=7B0PFVsd1Md z=3ieI`}B}qb7!#Jel^fi%50_EKmSjV|E+Z({xZ)2_T{dg&Tb41YZ!|{ul{#xdcgF- zd`U)~p4WngeyukdR?4A2Bkmgfe{`cwW!IZd^+%UZ>mOgZUcZXbz`np#Y~#vno|(U| zsa`btlaXV8M=rVX*K4!2eRrkj_pN-pc+p#dou^-JOb?R2`L6Bwj%k4#Szem7Z9m46 z^R8H2zcWib`AG8qUHi3#C9g89FZs5ZKlFD~RMUJRBeU;angxG5R_U>SdDSAWCHZ~V zy9PntEva??wJLe1oNv8xwWh~BzB2XB|9Rit`ads=EqOfi#qz#m%FlHe9t#W1u=x?R zT&h-O*(6cBk$c+>bA8y?$hw`CXB@28qfa1Shl|mzbY8i8-tOlfsjah6nDu z_|CG}@KF8w5t&U4BAHANT-44PoHbxhu(J7dZ^?Ae2^HJL6Q4?vc}o^=x+Os9RG}1Ute3Refjr1k2#Jeth6a z;l-RxoTvY1IRgq+RD?C)s zH==5LADhDjIs0t4TTiS#+e#ixTK(vE@H1hdA0B&hU+)dvUF@8bv@f`9@|))#x^mBV zl!sLJ%rMehmEkt;&za*%KULqWtatS8N&RD~b|C8QDZ^U*NsJ5Z8RglOo~Ng?ro3x~U!5eC)2=dZHn0BnMnYG3#^)zVo2RHXGzq1r-`7|E z$#s;qw(HBj^#NP=#0EW>qH*ERrujj4H(g?NX{={psuNE5$tC|Uukp~LsyUaE*c|LV znmVqVFp4}kViEg(_W3V$K`Rc9xW3DmmSzZ7t-Q~lY*=)dZOQ*_FPzp!22XZ~UKeCG zPp$QhYW^;(X$+s*GqTtp2fUiY(-zCUctTc@!vz&fU4}CC1^1g*DklGtojiL%=o`r( z`<)4OfRv@tnF@tDTP*H;FAgXT9>hVoCwaEbiMDP0t=ToZV=svG3Md?!x%A_i=+$)1-ux zYA-kn{yz37_TFQe_m6jitCNU8jLM6p8F%c%Y{QqYew_PrF+! zq5bpA@<)~o3(QQ!e9qZ1cy5nb&v4n{`?R$d$5tAp@4J)VeDVfIhJABY{cq9mBVDKU zx>F4pYK<)V4)2}KGhrw9ls~fNg>#>$w!C^GzG7jjMTV2gG3%y}--Im-TJA7SE&G*p zz-DghhxJ#eMNagj`0y2-hE$#>6%(~|CVpSouyc5E*1u5uk-KE?jkF6vj7 zw1@8P-<-0JVaC@LujPDCaBR}3`&DZ%efSE4<@rrKo?JhquUc;Qd2g)}f4SkshnUn4r1(3|ePb%U+0F-`?WrtM2Jd7eQR%?e|9^R}AMZN7zQfK@Zn@iBmfnBNC#4Up4|^c7Y?9jI zBd@ewSbTh~u6S0IH2jmyBk(6>`1n7mAZQH zM(z3Si?&Mktz338XpX_EPbC@w2ky7+kE~_#E8&pgdaQlC;9u~ALx~LM{+AbCOJ5-Q z;JQPD{Zr+~{0pT+E7^t0?HjHp@z^#5HPrL8v#v;G z3flF&GW1N{5tjUeHZvJiKJeXoQFhgC218?9y323x<+cv%gw-521i#V`y1(pjyrb&7 znfLe0yB`ocV6|0D&oQT7L|otNeEpKT$v>W$9#}t{gZ*_#<-V!8$~p(MmV7aF(br-B zlWk;n#rv6id}E(misPa+uPQz}`h`(gzw)&-q zBL3(LN*cS~oyt1(&(@pO{=UrHQ(3f9G}p)+^JjmhzvYJ*rd;};@Q8PA^1=IOQ){RGGfql>!LwfGB&$;+r0bJClTAQ4 zo;}oxVfFeS8wCSc^cap$Wn`6*J+tZ;i-~I8(pOzt73X!|7?*BPXgziR4%0~%g;uo> z(dWx{&QCa3IQRKfo7-Q`E#GfqyJFSzUj`BaSKl1pu$?hT$`8m3KJ~vL2QRj72z8#jFVEAi+#@WQGR{`-GMZR`dW}XUoyx_{YD4t)e zGZt;=+q=JSzeDS5(V5Km!yS|7{^{DdAkgFL{?Ffcl`NXK?VsMW8*Y1rLgGHIowJ#1 zpY++xyrp02&&3^Pz5j86{xw$n>qSlK3mJ+MzjW$0%nK@%Pq@)la&M8z+EvjDBr?++ zLT)i7Gn#FCy0hWxo!NEQ(^)RAy7@Cf?9~k3RZkX~?`JTW@?ch0&iv&Sb8=plEF=MxV`2FOY zj}%x8Y(GT`D@cm^GP-*Ht||QFRn4$}!X?(imw6}Tw*&=GJn(+!>K_XQS4w?3Qu=+U*pJl$)gdh zkij)=jaEc(^aLT>2S+4U*=fH}>aFv-A5x4H#CwEvWhF^0_~`SkF@b*cz*StQ$ll zrXKO_dLrR2l$LH+C&qQE()!%N2T?N1cP_eF*0?t=`RIW;&7U{eo6l5!5#;VXv0?px z#^)y!Dq}BqWY$&Msn$G8U$$SS{qa`b_dn$pT%CQP>WaCrn4C}i13LDbhcsc5FjCeRTx2OkC zWN@v|j1n-Y{vi87^7i6=4?82*Gn{9Vn0kaY!E4*gA4P&PdJO+eZ@qKAt8X0O+VtMN z>z(rF`3|pwv((I(>iZuhZ;)}Qd1d>)Guc8tjY;vB1Wz^d&ac8dehQr4q2W8*FPzt{ zul4n+JF%JT6C_HkWZF8NF6bS5KX0QElUY~pDV7pv?)98Mj^2qWKDgRV-l2ST=z`L1 zuGXCYvREYi?}{97U%1x9#7S|hjPHdBju#>)mZg8@%Rh3m`03~Kmqlx*KJ5v1u!=7_ zsak0GO!e`PsV`0k1tn+%f@&-;=bNuT?f&J>kS720!++g|O*drzZ&{@qdvZ^!PT8v4 z!YmUrUbU=JEnu{osqC=f;o|AtPZ-)bC)n{jD=J9On)aI0Wa;-5fuNwJ;`4;(NGqH) zHWFn@Yf3B5nk6z}1=lmh>zWfjI{bR;x~r)3krel%FK_S4>;90@czd05t+3us7F#n{nX&o7;1f1G&n1W~r4NTKvRj>Xk3w z#9vtNSl^=G;<=$<@a-=kiF3?3jA(t7O63h9Dyg)r~gJSZZP`;I-+Nlh()|4 zgMD+VWwXc+-wDT_*c9JP+fbS?zr1ixr3?Fv3itE>+!#w3=1pn3x%Vt+1NQ`D?O2jvTDnkP*=L14E)Obn&i*c~5%Z}DvGsY!{8wzv>m)~|k|vY47JjdzXJ!38 zc5=b~o{g89RqnIo%JOHYB(0HZP1O8V>SN|>yM4=7@dx)!IywIRPT*`4$tP9LA?-M?P#cqDEwCqLK1a360%-OPQvE{I7u1{m)DHzP3cHed3g zy|12h@-l3XH{sFK32FRUm?!G|u|sD?uhJsNq{6tf9?ZX<+;mA|lyq|}ZmbhF_0`(8 z*wZ2NewEm9Zdsf2WxpBf`?41o?h$#DSd(R4ZZ0W2uW_S9$H(b<2F`w4^@7=)jpsa` zy&%2xXxEP9tE=W4nDpK|wO^Ihi))IA2iFuHho8(;MVSU&Uoe4W!Tx9Mx?nK>s7IddxRJ*|-z{qd4< zpKIK|n1$=u16UhaH(AO3=Im)+8g0V#*W%9Ag1l_u4%Psbf4lDeJDJc>qp-d{+JIT( z=6d(P`*g zVoN|e=MyC-B~$M95C7~L)^`0%m6{`w*7D`s^hSX{lF>~2D+L#vPFeELf1+Qd%$ckF zvdz(vprFyvED+*~@!)azxzze3x7}Uu1AaD4E9^Kg>kL|9!H0$}L zzW1-H{w}#;dPk3Y!PVtezYGqXEWSJ2)80Be%82>xWc8(2;v2G#xtTA0Xr-Aq+0la~ zyzu;ECi%bL7W2NCta;(#gl)g$D;7TFNRRy(>Bg9LAo$?U`jqsXw9tLO1s0Sa*zks> z;r{2{`=u8z_w!xb(*NakQsJ-|esglh^$WNf~!HnH%E8 zA{DEH)y*4raUL^bVP2qpIJsipEhYxr<2TnlH`sh4U`3=wgWD3$Yoha;Z?4?At}bqtmy6T+fUzPoOAa!>*Z&w7p)D;`6YXKnG64ed)<5Y7XRBb-+<$ed3k*n=ZoE< z!YvCMZL1Aj&dd$b_(-mF z$jz}-UdPzM=RaSt`+2;~eYTG0xpyRtH`x0hF1z15Yrnj~sn+HzEDD*+bN6fh4J#EDJ3bF+W5799I~Py8Bx&(0?C+PfnA7;0Kg_WXVF>AZ`@ie1tVYa5hiXuX(u zYDejx8#mmG=E*WV&6`&#ce~o&$DuV~zxn>ZZ<&^TlzkvDd6Tw$=Lt$B%C_H$Q6s zVV)EA_1xyRM@w6BSIq6KpKwb1cVYs^`_=sBj}9!C?pkibf569Lc}d3;i!X^53-{0e zQgbNqQn%d|lZ?~fEuW_q$={w-cExj7bz zhOlPAK4S*`f3xOW?EduU>r#eKmdCy!O7pa>GWF@rPvGip2{W zeC~#HayKkf%=>r!(2jY|QR^p#q)Q(^&+tXMW3OG=%Sk&bj-6TYaK??!FZ=scEH-=o zyq#8kMY~J;k?$eL_s-tajs(qNHh(y~;CgX(($?fgLr>$DN#;wP|glA0V4%x5!CVjlMx7xt>%Tcb7FYOGkWP_I< zd14+bJw3K6^G*3vr(bdV6P+jJsPQ$twYqEB@3?fjmGFsbgI3GCNA|WF2(Ip2xc~Rg z=LswfiINPzijE#)d6CRye0V`#)3!66#mS8e8KdhSpIZ>;XYu8rOdD_Er8B?MZzMmn zPOy=bUBGsr#Vyo?C1uKPnYL%L;qk)UoauYY&dsq%@_5SWJAFB{{7?n;iL?V(?D;=Q zq{8LE;u6L!$`ht6->~Fe$(6tS!uk8#KC3c(cFOr(%kf5-VSCuLjaPdVB7B+lr1eSn z7t722x7xLE*ZD1bZ>BkEE$}$XlJ)k^6IbycooXvq=`x61|Mt~||NH!m{NA;?Z$HYE z{S!1`HI_Wyvhs4o(+xuH2Kpwqu05u+Sm41Nup7l;YO*7 z;jZ=;D|Z9W9eIumer`yaF<(;9RJhN1X zURN>S`c}EFEA!|^DX*O=kCx2nFH4ep9N9AS>Dl7v#|lkE+pqFWSqds3CNZsVWKw1R zAk`6O_bG|XhDkv3k~yd8Z{6$n1&SH}K5lq$cy;*EqAL&8w#{@<+hvyY?D#{O?c&w{ zL>%4=ZP>JYv2Iqw?~Z-%B)qvEwH80)^LX)B<#nN|{oDW5opv|&WT$UAzLd>*jK!1E&X_a`?Vqehx6@!en~cEJWY#l+WT7l#F~_2b_ee#e{b$CeW5PNn0M00 z$K|x4o1@p3Gww_>fpROKXSdD5WvLir(!R1Ivh`nso zl=Jh{Sj(7w&NBsF7Y?rHkpAj;u78o0eBY^B?N@*7mi&!mcwu&+UcKjlpTpKft`!F) zz8qaM&CBO__de#!j=skjPj2_R5vP4%NB85Y)nyYOu2cW^(0_w$+Tj@H=+52i^&a*D(_s!oSWNBvu@m&x@0@^uk0%KW5uuM^~-vke!|of$?&u6 z(yzV+z7LGc&di*fS$p>N`YQW%d$hz9WM5w??^s&GU)`HDU(WR0r%RdtCk9&b6+bMK zwiL*V-JvLT$UTaW1#{pt(PKk;1gC{gJZLx%X*-8|@dLUL2k zf$zMzrif^07VH8|LSJ5*@bgc%#)JdsMH^RZSZ&%WaP0ZBkB3g{yMOkrxc@*&L+Pct z+@F(|<+d`k%sy$iqw4IeDZ6Snt@=ABoyGt3Ot!yoQZCFdIrlhbg8Z=v8CUgLJ@!A3 z#-Fi##xu*ubJaiFyuQ)}Gp{gI>@;LwFP_%z_pb7*dO6!XtMz;}T!^~-qW_>=lk)P?;qI3RlR~pYy{IT-)^NXyF^$!oV8kWC{iBUYa zj`Q%o@bz)B(q=ga&To2np;B(*I+-lb#?7FiTMO-!y2m9-7gTqcFMso~^J&Pz`_I{C zu=Rc38J-~F_hz+){GD{hGe`GczPUdpy1B9D!^hL#j{o6$_AK@F-XmwHOP}|)DLSUd z{pa)Z^ZuGKYVUHUtNv&&d2F&X_4KsOcS~=^dp3SKU@~s(O|-Gl*`!O_T(oo&&Eki>HSRI z9TR5woNF;`$(*;ME?l@^*%pzee-HkdoVVy(`=kHOVa?6p;M_BVNnC*W!=uir>7dZv zW5lYbxFoRpr{-*pxP_jK_r8khG#|Y2dfxh!m5&bPKN6i)b#?pP<44!LvAFSO$@|7x z9fE27HL~5GZ@Q$NXnwK{bQtsJsZ6TO1^f2xEV`r0>NlCGTU_5ydT+zeDnkaoOoI>A zdGp$GZ*M!=Cu^N#{MvQS${-6_zP$LfWF^fhrk;D|xz6fU^C>;rC8{d?p-O05&g(Ux z9U$klcAh@x*Uq$@J81duKQDV~HEdUZS@mT7M#u0N) zOF6mr+DPQ2SqMw9&z!@lbE-trQhHwPx0^Ti&!4J&IwyEi%Z|QMX_{s!isY$4yz``@2mM4$$R+o_D>%U^B*tO@z)hDSa!c$JyLIO zdZZWEoPH6D`}I4YwH6xBU-k0o>7vFUhY#~l9dZbcseNxMHnYK)vtoT=MEYODga5m< z*I7J%u;N(S`+Ivg*8TluoRwxVu_1OzQr)YS%OAbXudj|NK5MEIQkiDQJIilf;zG4z z-V-xGXBPi-Yy3QyQNrbYOk?eZ%F2p`feurPRvxndyIo7TWQuF|lnJS8&anhPsowPV zcHVB?+u>U86BU2iG+6VtW%|9{Ru{@nim&nv4quB}(MxHa$6##a@LpT6DB_n+|RV}JdhRmXm2 zY2RLd@8A62cb*q9YCR7*<88WkR{x_vSGUzB)jlu(eAZlD_Whp6eZu+EpR2N-kg}h35g$f9^$^Yjb%-+roQ>K>$lE5 z*eH^0J$2)rX;xX_OC^=|{WPzi?3c6L>V5D_Z_j$&(>AXssK3}Z@4)Y(zu83rpT7SU z+t2;_^amZ4SBVFkSby$|U)LMFcloy`-|OFhe62Dg?frE@^Bs5mk3-!urgP6P zogOzUv3PyuhUFg?@Eqv$tN+Ek=j+=1vr|?6v!yMs>*BemU3%RszTfuOi~slU&1|?C zI;C>I)!YdzLem%$IlY@XI5e8LJGc&tinz+|my~t2m;5V}E_3{2;g!PbG`IB1m}9c8 z?tzXjf-V6QWN(HjByzHF{Pz2{*Lv=f-TS|n=l#1|y83+VuHR+fZNKlE`h3Z&D=VvB zudScE?tk>@m9L+~b8FP!yTY-9@xqm}k54r+$Xd_drSQ(RTa35KDF5D`4X5>Xr?7B- zbegf`tg>;3h?3RkGscH^KA&f;(X7v`Q0LY;=he2nySv_~So5^nSf1E_)asw{ISb|A z|Dv0Ie98It=BA|Li^&Gd7JqiT_TrGnPwD$V+|;`BpA_nE<4v`Gzo+I{lG4&tHV4%m3X8h+ z_w9IN*rFQQ)3Nj0&Gh+Q^UDI&j^8Z$(JkY~XtYBik8e-nck9^~wJcA3-1GUI_H75X z*a^*x{REc3(>|HC?T3E-&(jZem(P>xv-|a8L&3qO0~wNU)GsA+7<@Xu;y3^7Rm;!b zv1ICVuw+`B%)qmQG2q^owWaJI!-~I7Qn5a)J=cT1GW&SN)=gP2gVxJT(_i&gVf}W$ zt0i+^q@T%&`7`@|OK2Ly-rrj;A3B}GVt4V0|J>!X1dlGSJoCfir~jAe2Tw&=8(;0s z3e0*~WyREYphNJ*95d5BpPKXejhDX{c=vXXs?Dywy6a=oW-I@<`Np4{x98)r4M|74 zJ{(%y#}$42rS+dI(X=o&*<+u#v#*-^{=7`1lEMQv2f?V5r6nxK7#rt)yJfrQiL837 zZ2DWNYktwPa(8d?G?a#2a4uUbQQi3cZh8EJqURhIOlLa}OnDY^dTSAjOyftV2GuUh z-)|-FecgM$P17v&-tLX+U%uw>CN7;?F{_mG`E9wDzq&EMf{ONBDcIT9plooGV+W(b zN!|xXt(k;-50qJ-;d%e--Sfk1EO)o`G2Z^3@c&KE(MeKo?4L|8KELSzpYYn5(?OOB zcQ)uV`l#HBo2Gn$h2zH0iiPRFeqFe~(Uj)~=dH_!dM;RBNM5d#$a3ST7{hzXSqqlN zu(~JI2xcs_|J>MVnNd@7`|wh0rpJ8;p7qTuxYl#Nz3=VY35wP~E`+f-{jbt4``UA9 zi~Z-O*Jrp+*sYQL-FBdG{RHs`92QKAofeexH0%kEc4O^KFJg(3VO0LJZ{|1dN}eC= zb4yv7mwsm7wBqHr`kS8*w#XH*$TW&M9{A3%#lyMERHkv4;D($3K8U*gIQAhp;b+Io zpDS6}{-)nrb|6mvue8uRnZ{|Z3rf=%qPBJJN$PWG7Tj>K{)gq0ywCsVZ!~0>{nui} z`pZ0xt9yT}-#+`a`nM-`+IQzFKj82&U~)BPsPQm5sNW%e{SZe2%a<8~3Euy2X3Xbh z+%Emm{#kvR?wwb0rtS#>jf*51n!BnG2o|tNH5_nNs;)6+0H@O13Kz7h8TNe7`WU|L zn%w!Q^Q`{&)_;B}S!Y`$HFeoF$)8`R2)}-p=nm59*5t5Sg2Alf<@TfAH0dP4c@w7;pLf>?}9CTt&js_=C>km*$mTi+p&9 zTc79ooMOM3dJ;-k-nZ)4B&KFvpR~OMwaxat*jH*qm-re86^~#qlj`FDqk* zq*IUQez{G4r&au|Z2e`H#IDa?qE}fe)u}hNq^+XtPT}zl@Av(_mU<;*(&LZG&I#Y% z+)NfWVBA^B-fsDOcER;uptAf|?wuf08Qz!68BCnmjAr}xz3PmUV9+Vu^Cne4d&ay; z@9X|@9AV4;yHib1_5I0RrGMB;p5$1bzIL?Y;9?K{ZAwge3|o>`SIxa8#rREg&!?&D zdDQ0=I7L6c;4?M<$Qr-JuMeN7KiVbw@XhA)dgem@Rka-F>+3f3>hRTU-6*vQ(vu-$S0%CPnVizUrX_hILpHBcJj)~ z;Lql(`w~3Y%zX7^R}W8Pni+#z*kr!nvBBlO{SNP{k}qe+%CH_R-~ad9X{)d5^C}iu zbZy_UY>T(?S*8Wt!T-bKDpPk(thf@WC{xfN%lp>dar+PLnW5`Tc^b+x);3+A==Xf0 zyWGjLi_7OOytY<4()E6L2ovaceq%k%H-owAa-O-eI(M{m1NO8@jbA1B#L)n3+T zQY)@!VB?&>NiS-Phi~+!`Natw)$b&mbd`5z*RpiwG5lDupW*!qE2|U#KOUDq@3E~} zaN^5*`Acr6%U;wge%7*g&Etj1vYp=6p-)}?{QdnSc9-SG2CqNyP}s5TT==BUHy2OL zHO&r7Ft1SE`B-r>U)|$ly*D-b3v}D_uE_Fez3iOBD{a>D_4W1Zy)XT&-%go3G2rY5 zCq1KyvFq1;J+buMiR2~RV!e}WrDlTa(z0*N78mZ#HqSrTllU@(cYai^`K9MIte5ZJ zm0h>%)vASSuDyF0s?KJ8L}^Bm^G7+UzJ^*|8=Flt3|-9`x;m@4v*-Rxy|B^t%LQjf zp_*qm(>KpbpF6L#Nq|@O@twQn{MI)<&+TcjSm3UFBg)|7#CN-1uiJU@MZ$Fb_<4f* zFN4I(ci23Cv_Qe?xMf<;lc$bu`T6fVo)#^V-!yUdb2nvSTi2#aqnjKjIQS1Muh*OU zN`KL*$(@czB{_Cfr3RJ1>Wx3?=(a`NNLq9HCzaXd>jF2qD+ROo|E&zKGVf3<)3PPZ?-sTwf%<8vdxPh&&*Qh7i4g8 zRQF1^xU0u8yV~u|RJZ>p1YTb5bTlYgB=DJWTPEksk_#suURIl@>9g;~$DIFvzn}kf z;pF|2%f2@^?wNDq`?>Oc#*>wel;gFgr?yVj4o~~Fq-gi9U7HSfO{hN1Yu+;d&lB~B zQ-b|C-&Y*BHnKEgFesZ>^=hS0eZfi<;ky^7)|}Y$ZrAHgi<>PSKm2`P|KDJyzunK2 zHe;ikmHV=;u1c&@61M%Qc*$FTuZi^}30X_7nZJ%zEi*E_6y)RCKW|dyN!95spgRd3 zuK)jQz46Q~!aGhIzIOb3adP^JGq*M8pK?{(bpP+W^7P}n%Znz?KgHI(XQ{$1iMbcK zb1bJx>fHN%@B6fe2a0)?ET3Oj6>#5X<`ve(VMYhPh423r3Oe&l{@(X}-&2i3>&-Ik zzTHT^8OdwE>G9f&t$!Xr%@Du0Gyeat>y7K3*<^D!{jXEp^W8S$aPvjE41Sh73>p1p za@V8YrCj=-|KA}&X7S#`C22~!%dDQh=y>r$f8UQs1@F$+iQW4=?|X}X{jbY6HF_u7 z&&{!7c2GY*^Y5PuKG`?(|9x5hMyAd!Wd6@H=|+niKPhNU6qmJ|zAPrxZeIsStbv+= zh=I+7gT^HXRs<~XjF}fKU!wlkIv__QitcO?>SZR=3jEeExmH-EPuE;l*$3 z|2?mlo72=@@#2TV&l@WrFI7%1Q9q@=id#L?UbjQ(&$sRS&$=BF z5LP+7#cHnU(~F6#Wl}c2J2&-t($1b=623-UEe;b-f7#{MH_3Bel+jA%lyfiScb;g8 zP)OczYBJ}|u7coL&B?nQUGD$7w%sW5gb1fo(upG-9ba447#;Fry=7~3RqVu)bCWvP zz3`OM+tB-Tlly{8|2STriu$>I|KGP~Djf7mm-C!lnv=3hH;UyB~^|8shOOZ>l2)0?X`4YGpWtvF_X zFJ9BP-|}CY-mVvm0^I&_lzo!d-qU*iz7`up*q4C!@jucu-B>@JkU#tKzz?y%JI~kV zUDI4`CUDOE-$Qw(YNmVtzHM(mU;C~&^0~|LlWLA`U#8BnI-0$1r`qhOv{Tb+CV2XM z=~?&kgO=r!3yRKiJ{OIb>NG!|7M;ggez!FI$Cc%FqU-kkdbQ^9bN70MJgby-UVcT2 zeXrN=x0}6eT1=YGgx{V1HA*qnZ?|r{{%S|gDak{knNLo-svSGADfRRr^Zh^1_IxqP z`g>UZ--N_tK@6AA%=vSiV^`eFEv!bK{+3Vn{`qv;cxI2^dHer=3jTaNo_?dpWf>3G z$s-(x4&1!F?*jw#iHWL$uLApHHl**8`Lz73%J=g9zhl#S-sDMp{G8HjwmkM=vr$HS z){RMQIfgn4S)W$#HDJ48Q+dYlcni1Q4h8GLiCFG(!Xzy{-x`4>)*`(r}_GdhkLr`^JVEr zLW@c|qJq=sh6Nv;;`;oo5RRKCatgC=+>pmLvAZGp<`PG~{b4`u|Nndcrb(5Sc3beCLBeRIxU8Kq%Y;bPnJ+%93g4?W+4JT`pWai7u_syj zPwVZ@nQ$g#-=7HfFD+k!W}bMkyw{K`a{qBbcEhEoZ8yezd0>(JWRl)A?>d90=?f-u z2X+@!wly})e||x-`LpQy3fCXEuJ4<+)H`)D|KXy4e|}1COX%`3I8}V&NQT9?8_C8q zmw2asihFtY=#8a0xAdo-tUhf0=Zx|Bl&8<8hWg9AXEv7n^T*U;!Tkl*XIDF0e3ST{ zeD-*{!CdwzxyCf}|1TsjcgIbzC{d4Db=dH@Om_WM{muK;x{J*3aqPKeHKlpYgdePn z7AM~N>2TYFt@5FQl9jES3wQ2uhqyiZsYkANvAYM;REczZ{+@ z*K}mQb$Q;ieiya3Ek3t&rg~bQa4}EWG%eQGzre+x!`NRfrF|pg%8e%l7A-kDGj6@R z-ph&Jw<5xCaqjGSlsQ{`?+e$++Y2{OWBOE}%IDmtJo)0=gY5D$YO^agBwp$J7})P~ zBHHNU^r9vD^~^o5W|lf#@2`E6{4l|IlBaUJU&4~VilFSnyd2qaJ!VCgWd!VS*5vB!DsF5zu!4{Zr-{6_?5}4rd+goq9@e1nqlJw zPG#oi#O-&>PIt_(ICa>O>(!I@d%xdXQ>?nT!}U|g@o)Rv{_ljd z*eiUB;;0qsM619CA*Pi@A1=8Czj|=V4k?pJn_RiHDTGz?3XLI zIkKNr;Z^bYtC;)5YrfYmrO7svyzf4lz`b*!_(uuOJ<1cbEk5s=wKz{=<%zTu{dS!% z$0t1b`LJDn-rdFeM!`EzEX+G1oaS==664#Y;E1Hu3EKH`et=&j0>g=>J>Wrt2JWP5JueDT)j7*6VEQFn8XYB)GM| zR4!xgVaZ2Xroj@Q>Nl50u+InznD~$D#furA(l<{%QC}_XcsEh``TYp@BO*qb3UzKF z%jZ>PnSDyya@daXgj(s6^eGy!gqY%}*X}wmH}_ zYm;Yt%s0jf=2t~$T3qrB|1!nr)C8XrSFye=paHDc(>iS?+NUZCGk2SoraV+o-LS&l z|4Tzn@XQmB53Q8>;HLLBXzjl%qOk^7K0R5a|CCGkm4bM?XnQ|j(FwL_y%I(K_X11K z_Xxdb{0?CA4w@j%1*l{ zTv=-LbAHN`eCzT#f83e#*V;JihpnCB`(@7wHiicNnLqz-Q+S(qM?m1``+U_S z%UdoN%B86AIbLSG*lAQ1mm<3bQmAqMW^K!v9z6|7jV^ys#)#V(;OclX6k=GUH-pmBQC+x2OGbyrEzF(%ZP1 zNhz&_-E;DML9OglN}^8$`}t0+Rgs=KXG2@ewWX1}Dtx;e^{OHpl;*v^XV@We*XfUdNTxwb!Hd(&HeESt^|{Api{OksZ*%icf3q~G zTK2Ce?qH3I(MsmZq?tJt%{D8I-!r{Gy6>Co3C3@kid8}N)4Y?!UwcaFm83jl-FrcF z=ZO?e*0~dXZ!5n)s$W;wrvA3~pjfixbZ3c4EfXr`6{`1Ld>#>#vJW(VJgq%M{+{8h z<2u}YbDvz8nEv9(KJl~#D#EolAAel2mp!NM$b-f|p3^7U8~aHdesIK8%6)HT_@|Tq zPh>oauZnjIZhJ1s#Oyq6*&?o2;x`!>iag@OpX%OX&7G4LSS|1TgV)VzLOs`}6Y@$6 zidzyQjMG00%02-NzxD*Yh=`oNbg_45f1k{u0~a4&x_Ei!-k)dl&vo=&6umsN6CfCkIN* z)k|S;G*(jW<6h+JDP{XPC3srOWcQ+(4;ywUilhYdrG`)H^)qTZ(0G~iWbvny>gl0J z3L0!&L?&o04*GDU;UU9(o4KC)JFhVAwBS*C)!g?ZW=pD$aO_pPNVVVn)g0_Pg?F4= zrZ7h?cGeNzl1%Ug-;0 zxmWJD7qGu)YisU1yfk)#W8E#@$OoQwmh%=$voZ7;%x3>-8T(D{1K-E*4fE!FU|*Rm z5VZVfnnKCU#-=+r7V^J*RP^Zi*Orssa}8#M%s*K3XVv}FeMeUvTP4%;?Z6Dd1U3i# z*?$bV=khSFO=kFV+tJ~jR2M^Xk=gIP_pJ8Ye5zmATlTW!rOe9^#WkOEOinnegZh_0 zo~YZ;%nf;Lxx_c!b-AoHN6Q{1#g4v`6H6yQHMa0*eO~g%%C!HSS?MI#I;$e9h*Qpd z;%uz<|6YDr%pmacM*RVe34S8Vt-Yl$4vX#%F*BObJ5NBkN@@1_4U z8KKLc=6HVa|K_=>N8(e1VMRhjljE&-Xh2 zT$E)O({Y|qzNK$Z!s#CF-vX!RNXk64U2getdgG-9vo-gzTu@Mv)<|2hICWX7RL7|m zu8#lSZ_X9%DNl*K$azWe^2@ykJSJ-fKYGz2vGjB7_nGPQX4c;O{_}jj-D{6ZH>qXQ zKg*ndA@Z{1WzGKIci*SYRc>kWal3IM;JByzYQbDB|0gc#e(wC4ryLxoeNmO4YpxtT zjp;=DpR7%x{wdC%-hApyy?k?WTer!CsVUy|ZmTQ(HeKu#RGqDMQ1UR-UP(^n$$oZs(+I zmlq|^)TuRC+_2Cg?n}z8_#%z=S}CcG$y*$ky_jHil2yIO(L=&g!bT_2;Y?B0{sS%A z=N0>lR{XAfK6kpV{zbPFuKp#?X5wwCrxW%lPcZ2-%5W}e{BtpNOP^KeAIZOqZ!c*6 zV|m-2eeyvQISE@PU6UI+^3QtYCY?NgbN|)nJEX2~RjU8Fc<@4_;}feV?y`?AoBjIr z!reY<+dl7fj-3Wo!Ov%{a<8-UxK!jM*WxteT(94h&CGVcZ=O$+e)*!rP)O^fli6IW zRHsEJE@e#K0h*?>ZWEn!U1PedcU0hP4b?tFkMpWMCjrOg9T^2B!cxXJt|fZexg6~jGu>^#R@;= zi6=YTlqg?dSruTo-fY7_Dqt0soGi9Y?XZ=rf_a5#T z@V97|Lh5S?2Ie}E0_A(lZ9ci{$%>`_?*7xcIQa4Hr}cl1*Ppp|yR*5)G$}P$$ol$c zxAY}fUrg?s5__Z2D#f|#$i+nE?z63hQYj}E-jDxtG(KharU?7C8AaHEH?Y_s*`C}(vMPSMYm|( zU1~mmp`)CVkXvnz%Nn)my%{}bmNjbrdM(Fy*%~Pxuzt5g`S8wJKKo`ZIIFlPMD43@ z>ZP<7vA$~7Pa@6Jm7}|KzouW|*(MQhaZ9SXxuWEJ@dTx}-N~L^d-;`eJmv_i{8ZF@ zG{N<5twlEsUNWE2_{b{9fnV!!vNn01-(uj>+I%7T<`GXb7cNeRh&KZ3(-=~eg5OCGjgl{onhyD<1f`?@vPZomPiC);B%o_=z_ix)^xrW8oqB;~R<& z@bA7`S=Ug@#J;iM{L1vqwA{Y+97u9nAbi}=*6+BdyWerQnU${@PraLJ%z46%PyFd)H|^QGCQtvh$oyB3 zT4D0k?z}6mMXj#7v7X0S_hspqIEAMOwfm$@=Bt!w-eaD*J9X-fZ}ORuMoPAyCM^AP z;>d@PIcZ`u&L*(v%t@+jxtjJwnSZvv`KPd(8K6W#{!S2dTzS$SE z=H)yIG+TabqP&u$ne-hFV_E*nApb9F^L}08+xo;QZBq9{R<<{+0+Amj7d`4D6^0c4atDcL;j#+p;$IKGNXSgQbK*a1-J$unvJcf%>mPD(&+IKa z#3j4GsVjkD$=2zP0dn`Rx4%5QA+sc{Z0DA3JA{9}&)>TCc}0B3H?7-={_GqdFF$lP zDk&;iP}uIn&JpMkRdTFkOUVMC)_Ez)Vs2kco~-%3sZd~1LhbawEE6Jhy8lSX3y93M zTCC8=(RRX8v)_V;o1@FZW7b6Z*T*IZENQ3{kZWU0ah0?v5xE)AC&SX{oX;V;S5f^{ zU*eHvrmq-0C-8rA-{#T&D_P>nNwJv=SEo5C1lRdV+?>LmXVbptX0X8N);|hvr+Q1L z#qj9&h+Mlo@w6oCn>p=g43?>g_e_zmyyC8>=JLd8+LhMQa<}`RpPxVf#866IZq9+Z zTM~}%vJJO-^;9nAgQDBqe1iF8@ySos@rL(32vfoNU79 zb5NuHN&b`k_lx#w*nN`c-I09q@^$g@>B$pKURHKzFf3VcG5fN00>c5BrSq(PpMFo} zIAeUp&ycC{PrI74x2Hn)-yEyyepAo&_|5H`DcHa4#mhU2u~v6yScGuQ)%^Kk;^7zb z=YBd;$bZmLqNJc?!J9MBs`FAVbxwBUlihLr!GgnW4HsJH-dw+Rv7aLUlMOF>4wv2N z?B`$UsPdFp*#lk>@s zT*NjR7F-Z*_bFQ%%ofqq*%4Lc{6nUed*XF%apiXZyBhtHVrAQs1roP-Jde=3{I&Ae zBIStW6o(iIi#K`ha?)Hg{nC|HKW-6y&y~x>*HU;w)izgXyYhLD?u)KAKQ;zVDNEnR z^2Xqk#K+ecq1qs6bbG<5sKpSzTOrW|zaiOv}hcR{t04@R;#%>c*!; zzMadlzIv_f*~$Qp-4;KubEYRx{+jwwu3R?@z-SS zyN$Qk?GgU>&B$q)@#5qq!p$)=;@)rLlRxy-SYzI29;Nk9PV_e$ob*@kJ$S%&-zO)Q zk~tIDWaY!(y!fM-c&a%>BG+-(i3Nw-9%R;)B`uZ~&r~$*kb2~7_te>JC1XR)tL8?< zxt4trwJY?0OP@F##IDkmCv3I}vOP^0M3yJ(y&bqAbon?FCcjCCO~5FVoF7**t%CsgP`r>>{M7PEpxWFWd_O1lP3Z6tkpC&cIbm_% z&!=*d0t?+f7g|11l(XHT;QPs$EoP2;f8oIw{S|sALexJsa&GdRZFN#DZj&Z=yWa%c zUy9P3l6rr2DEFOsWhk`sfxu~3dykftA10n~)!!f{X6PyGK36gD!+}7x?ANE5*<#aF zLW;7yr`cINX`jjR$%y&LQO>3%igH26HCDA~ziseaGJW2X)&*asnQWHxR`4H`bk-=f zaTlvfxD#MDL$JN^@ENY)|9k51%+EXid(#>r|KG~OF;bO#^o==F*Jb~|#95zqVaIG2 z7PI_w(M%dDFGa30NZk8%_wJWZ`*_PNjG7HUD%!ttdSUbOg+k7`Z_ArQWahql|8}!- z-}BUxBN?;KO%&7&{!r3TGHYe>5!Oz}OFre7S6&i4eR1NYox<)Ci@N4(%i8T)AZ_)@ zw!G?){I1$}#q&?63C~!Udfare$*J^L)6d0P88w|Pp5iF=Wx=@Yin>u1yV#Ju77e{K7|sglkDJv>758kwJ*Z;eU0rab+Zft9P?ugi5OSoKe~ zZVBGGruDhytB%Dv9#T66)W0Vj>X6yFzG(`%5N#UcAk|vAJS`w~R$` zk4f;aH_Zn=D9$rl{qkh-m&7B!vnTS$WExMapK!1>*{xao{7D7}dD)NMen*lU8uW7~ z&HeDbH$UaqvCIFq$X1zrs)$dEI3?pYRsMZ6+sP$&K77BpJN5ClO|HK_sk<)SC~`}S z&7uA5)LVIL5>MYuKDcb@C!@gsan?`L%|CBt@=Nz+=QMoPV*f~i-)e9Ft@5)a>yBJB z{C|7@-{@`0^H+um`oy*S%go(qR`BHNSzhJadT>U=0ge95 z$lfAj$8YjRFP0SMoJ%@2XNyG*&$NjW5(0v$3$$ge-8q8uJGhHn?fRYzu($=tu`N-I zGgj28u6bX5|FqlAC#>>ydeh>c9u8>SF+qLj)e|B+m#|B}>Wks%*mGt2dgB{1oG&N$ zeNmoxS|duiB#~XQNJ#$mqdodYrxbGUDW>@vTsYvfgqyAC#e$W^9%8nSOSULae>K5w zx=c;VMX?7*KOWT4znHegd`IGz578o5WdE){>BK%w(4&20m(DAHo7~?Y`|EAGnNP2; zd8#e>GuW=r`F}>B%=4OS_pUvNIm0kT=X9Z7(VnB?XBj+n zb>HoL(YPk?je&yH$yiAyg-`EV{&+gHA3YKJWWA44y;DW$pR-g~mQPv5{O=%t-2~s0mkTG$6*Vcmm=o#z zbhDKt>qfm6#lXIws`pE;$C~TN8qKgvb2)ip{>uCm=LbGNlcr>-%vP5!QrCUHEn@P@ z`3wx2>pfi@L%Nqt^pl062 z8fL-8(rk*xmRE229A{sCO!@tEGfAcH-jbX@rzgAalu(sXJbRtj$~Ne21LJ{9Jkmn- zDe8Y3HFMS2<9Ze9_p(bwq&~@yxY_;u_;0QcX&>HhIQ@oyvt&tT1K(ovNa=td9Iia? zL)%zNZUk&q|H8lJ%=ekjq1iqfZ{NM#Q?{KqoLze5(YaE}wtWwJPu81AT@YM-d8zWU z%}ZrG8q!NP9Vxu}*kitX)RXoNF8@xX2PdR~!GGIg;{N!oqJ z`ALOwjM?8N=*!yA-{3fDht19-iv8vptkh6h~#CqON@&yuACL~^3O{D zS}kJ_4R5}kHH-_^GbxnvDApYe__}(D{znOm`tRlS<`&fgr(MsnipNZNxpv~FFCn|4 z?A{7mmn5C7+b3E1CUU{utgSOYedwJ3ie;OGYW@H3_4BVbYF6@eR;3swAF^)HdBs|n zb1h}rEA9BduM9q^^Ts6_^otWRFevZHFnptq<)+0YYcRD2; z;G1)M&&*7R(v{Bj6;G`M;$KEqp7PwI{oi|zi|etNFTcKSW4Umi>FEsDt-Bbkyxcs0 z-&&qvsOUIv&WGE|7`py=}_0_XRV=n zzYLG+wELZK5lghn*E=!AM#*yN`e)%r1~2C9oY2o7XXNr~E%VEZ>ZOx<^$%w(vAV82 z{gb*{qStKwFkb-QJEVzN%h+^76@sYhNK zAK$TdCG&gp(^i!hsgkdM^zYdd{wGTLea_6yl8Up7wBCNxuYO=YxsBnD(S`jd*EmWt zXdYbtee$xby{zK7oC@p0dCU^qW@JBRkvr$!aIWW~#_UBeuIy~TF)w+3(O-G%_WvQj zZFJw=c(LFn$MF>%fueImb1a@rbz=8&Kb2_jBV5dPVE4VR>vFW_`c31T&#kmVtvkJE z%Zz!cRr(|auF)WGdtS<>y*nhMA z^d;L>HIhSM6eBW>B2F~YZq>A zj9ck5)v?YhC5=B~Rzg~1-wglFpFT~R_ch8+d$p>(?MnN0$&KF|H7nCBUwrr&pL&1F zalW9$v(k4DDzC3u>TWjs*^g~=Yb5+1^fEhtnLat@+RN--o#34k?oW<4o(2_;2LF3Q z^mZ9pvur$dqxs52X2oOiK}Vi&7dBO^GBd=wERx7wlI-cae}l&3ZrML?cCKjEey`=m z{Q9@RrdvI~HZO0kzQt~%eNyOU@`H)*K?^h3?E`I(PGgy|wQ8N@hE?KrPZuh`cTnAV zW$P?u`5U3O56_?6FV!;n^O<{^(vdbI=l=YQUZb3{;iSB5{e_s8oAGDW1Y@O^oZ9Yw z_UVJRw6aV5^H0+24k*VP|8Ob6)3t5X9VY`MVMGfep8AFT2RUv9zT0 z!pf$rR$onW*H)j(*s^EK8MjmJWj&`WPU_8yDadR&cW9g7rVE)m@4j62=YKx0Ixmf5 z&pAKgH``{m>Y7b%$&=8y_2Ky6jIT#89GHDt$y||l{~Jm&piL# zyWNMx|36+E#-S2yRlQ7P8e@YX!^32jjvr5>LyC9aa^Csu()LMastw!op1JSUUi$He z2&3}j#@x&EUoQR;H@8H_d|JWcr%QMBEdTRyQmo0&gnJ%yr8Tu{~u{o0AT3}>&zx9z*Gyild2h^|_ zSXI1#=^|ma;mF3_wN^Ltga7(`pWQk+H0b4wUH!dH6BQidrtuc_e}C#eBktFvOKtme zyEDS56Xd_GpR#kEp8dV;JQLLR zC6-m5o|f+GT*!Ayt7pBz$JPQ@V+ICO{**^nInS?088cXHpYr%T*F}c2i&SJ4=E}&% zEj_m(vZT~jrqNAd!r8KmD`!8Rt3KtcRN#Hb8Z&Q!qp6aw{`61Wf1>_I`9Gz4v*|mv z*_ig)N-(V9<=v-uG{7d_+w7|8=GDg@*>tbxlRmX>qiZhTy!>ZYrd#v;{`uauSr?-$ zc;H4VKTq~ww+}aW%M0#x`(MLrIP0SQ=4`)zy*V2^ryZ@{RQGt3jP9zBA%35pb!t80 zaZvqY^(Ndc>}Fmd3b&g=>fGibdhdRZqND*d-1;-9>Czv|9SA078 z^_qwF8HNpSx4e^KbUz>{;p7nf@3H5fDaTIC=dHiLA)fEbPoCzeGxO!&d|;0Dma{6V z`Y@AymU!bCh8w%i?faiDtYCA*sG-8MYWerB{HXmW)K+xFKPbvSUY}d(B>2vnsjop< zfn~-c`S+@NvY!rr+;?+2it_}*u48N}56r3Qz@L|~ryQd4c zn0ZYAv8nK*zNo(raa&oNsiLsjfY5`+bVE zwAGXJ?XlkTf1BYa`5H{9}y%NTVH+bOu@PLXS`n*f(QR}#8JFsl}`hQ>JhO)1Z!?L`z9?2a& zJ>P-VJw8M*ogwJJ%DoQnIlA9Ph;933o88XXD<^vXC5Hu5p93$;mfP}=^p)#B-Q>?{ z72j`h!(ZF#=k)^{U&<#lw6q%hxK& z+}5}^G5*Fc(M(Q;4TWiasea$HSnhsr=am+}-QSw;{Y;KygXhZ0;x}dHJ6&x2IQz@Z z?H420{0D9PFl73Z`@#IseXl>|PBR`iTHe0j|Gif*`=Y_$XVcE|w}!6XwYE+3{*mvG z793&-RAE+N3w3z@TYH+Fz_Yh|kN(SA{?o2OC`UW|=JVCHe{b@M?ekwIeEXoEs`OdG z<%P}_Hv}_6S$;@A)VL2?zUH?1)yZA|MZ;qrKGAoGx_g}A#)gM_tJ7@eDnD8uR{b$} ztI6bFYdY8%78p$lWnNO39`WhI;)ffQr?tMk{QPF7%w(Phr6lo zd(rz->Okq;gHdn);ks*il@?EX`ET>zIqxm}`>z0#sr9ynOXNU%y}USN>T5WT?>D;f zo;%#@;YU|j2Ihp<(?oAB*tCUlg5c5}Z1H}DyYyS)TYMWT9k|}?V4N{8uqOV-j>N{Z z#m}F9wE*uWl4@qS|I_|`rJGRQp8RBnTqDgI-))tr4<|l!s$;Ww&&^QiH(4`ozLl#X zL((Gu>}6~RFvM#PviGpjvH*#>)Yq-Gp~Ek(ZkCq`|0uV-+jEt)6UIZ`+xoZ zqajZe+7;_0rEb`?#(xGnV=F;mFWz_mv8qn)opdnInP*i$8Ql)IM{W)Hu2A*H;gBkLlzw0C)Kv2 z@52XY?%ecuRrX>Q{C54tEa2jFMc09@r`K;6m;F1eYq%0sHpX~#e0(}m?ESv8BpB>)%`+e$P`FSG8w@eWXP+@k+oi?dn zM&8_S|HS{xHe`Jb^?Cr+(4ZV3%*fL)Z{F?0z4cXhE*+X|xc!7g$4(8gNKHGx%OVez zq!^g|6pr^g&S(otF1>NSMkiwD`o%OXvR|(LFW)(}YLd z4?*jZ9!&X@%5Y-7(7L_f7H-J=EW3{iWRrW9JF` zXR;+v_f1%r!REkIBGo6YI*;{+%rxD-YbLCH>;pV z?x*4PBQ_=*tIQT`StQA@YLkP%w9?+?2bZ#?u*UlBe046=bv zrqPH+;&1+~Eh;g!Tg(0*R#mF_*!Aw|^iGXSzSC7j`?sql)J$K6_s7#TiTm^!G&^S0Zo z##BC4ioX7H^LeI}8$av8wSxtdA=A>c_1cGWxo`emKl%R=WzF*%%YS%$Z~fGr!SIA} zjoX3n=A-`_=5k(;o>%dx$-uzi!Dfa^fvP#+^pM-*ke7&z!*KW5<(@0=ABD1Jq zo}$2K|Ah=WqRb2zF1H0XKQykrEUCBu)3XbAi~IB0So9#Zn+203lh5D$o0}Bxlzwk5 z)BluzQ@P>lD_2v7q;751x_8N+!YdS_uUGzh`8lNWyDX>)0NOrjaJ5c6|Lv~qL!sfi zW+o{NJcaI^!ADG)d~BBdKJ?Sol;KlD*yAJnqyp;Fcf8r8?RplmRY!{Ar^_IIxej=q1tCFz074&{0O`ggkgF`6gkJL8R#G=tLL8{vde1VjWw-_1S{;v*;pH!2>vX?lM6o?VTiFutR@KHY>A2E`ur8J}Lb?pNaN`2kSIHto(4|@cnPfO~xjF?7_86 zlyqaxpQb?Y~+XPPqY z4n?OVZwyZe_{d+vB}eLnx{uv`Nhg~Ai@*TuNQ zmFlan%vyJqhapN+wfgANmiguR_gnRLYs(a!FibqwbN4Ps#@XrjvY&ETFy*!|-2eUk zYc2kNs_ARyWKO+Bog8h>9-F^F? zTK^9-VOVpwZK6%#4zDNc({1KU$yL30x#4|X_Tf2}>Oblj78F8aj!`h-RsGYh?nB?} zKg@lzJ-+SQ-{4REybKfT-vs}hX3P%hNadM_j*B@OLc8R`BioKhrg_w{ve9?eg!O|2yl+{U=jpW>>vUU^t?} zA65CiP$qGm=EHx#-*dIg?yH|+`r0y&g<-BWI1zF+Fev}`ojs3Zdi+Pv*T?4@_P)Hl z^`gEh)1}P+6-(A{_`?*kuTC`jCIdt3j2o?89C7DM_2WMVJLTucSG-!;x=r(g$8GTq z%cU8cF4TezoF&4@_xt9qQr{i92bUi%y?!@2>eBY*OV&@UxB0a`jl(1}_4u-|-4YCj zUVC_oxRyUz|KnWFtBmCDhYB378z%nxVwuOnVFd~C3?r5sAFkiuuX$(t5AJWy_Sa{Y zz4_7pB$Yv#~Dzn5Ri+`uL@^ZMiCnIiL~=2fQkzLnjp{bu+3 z!o*u;*1H4)etf^D4eCRzZDV-CztaBCh3SWHK95UD{NdZOUU2`P8Gj^yo@NlZxqP2$ zrtNh;HioroM$_jX3+)Q;_UG-l+h&tv{`cO7?|Y`VW?oL)DX5TfryN|zPZHFSy>~1B z@0aU``p;RN-*Qmu!V3FumnZH&5x?n*c`gDeE!%xjw{^gzr*;qO~JP} zs)_wO&4dkdtIe4j&VcsITQE)TV0dDmddi{V&&K@r|9>C)`wIVhJ>$#c!2LW7XBj#^ zJUuRYQO7~%deFl%LxzkkGcH{1s4T3^oSL`lZ`+s2iO1(oYuQ=cZ>XHWZqCHA^fx$- z_!uxr{j~q~qx=y6zwgJxtZGf4=w0fsZQXj)zs~0i*J<;>wXbiTWLO~T`s4@K@wL*& zkDnJk_I}HGuX!A|&qv67yYpFfn|i`FX-2~qxiYYanFKD(`mfwyXZzBaOzkvC`AJGuV*X!&32>t`L+|5rFBB;_V^Y?;mIz}$W2 z>WxpG{qr?-?ETz#7~6b0ap}VDpJBhP9vJ-oxWM)fhky&D{bS(AQE=k?wYAxY_kOQc zoKt-6XqeZpmGM@e{7>!|`nb5@_5}N>x$evjRoz#f3Wu-n{#??gK0iiwUfr{27q(BA#SFIN>TY_9@;KX8aZ@Tb5F`Yj-J3btGtz#}DCR``wcQQWsui-^)o%$9p zQS-{(QVd&Wbi~xjgs*meY%}-U?@Q8$_kO=8z-LpCHpBLH#~b#RKjAFdi7(EB+Yc-F z8O?q>{(F5*mm~b&zsnDA+26^P{Cpz*@_(hepSM0t@B4SV?@RK5+cy~)*aa>39Wt~l zjFAbGI_hhs4o}O4ik>eOI62vfuUOuCo-b$losAl2=IqmWWA{Da zw)lqC`kY4uDj`*zph7^@`}+y^f7C1gc~G6+7W%qc$NX=R&DHgR`#s|8eEwW@`y^ z=l?#O7X9D!&!<1yZ;sa}W_8%8{kK^2vaaUR$?{L;2A}3gGpL5VQY;I47THx zsosa%?C%PEyICK3qww3qvYrn<@j@r6S#8gOYhw;ZyN}I#rt9w4i23na|JJ2f&1LfM zzqH>-eiR)zn81I!N+LM&=$2bPB}rtz0O1b>Xb8Vdms1hKKx8~ zdyDP!ccN)$?wn6&{^a;M!u^0?Mlp-YtM_kfjdXVY_b%IX-#@px^t)Mz!cUt=;d4&N z%QHJHuKW3FdT{;hAK$**VbI9`9_7{$H}6x-(%oNXzOz0o?7wEq`LK1|zt2Pqrk%Aq zQWsWHeP4P4`@-X(6Ih~^4n+MwaNt_b;`{IQ{yOdWHS0Dn`>$jUoBltaJM7i|&-igw ze0g28lWh1c-Uf-@pdHf$1)g8vUb@5Ud+?hFUH=Mp=L+1}@$s2K`SzP;(ghAPtgfbU zR`}lqr`!u|92*YL*ZkirE#AIc{N~C!`+t!U+j90QI@-%juCX~QFU_*Vv-AGR{pZ3n zRZ_y2pP1$$_Snf{Z$$s4RzcSrJ~wiLQ+4H)7aH$*t9!iFd0u(djID=1zr7cicrOvs za^Awo4IE*^ii>A{10YfBoA zZQfR9cyX(#faTQwjh?&=?@}2~92dBts@zcB`c&ID{zmS0*~7E%|6z-ks#soYw8P&_ z`hhW%rSHQ)(1@N8N5>EI{Cf$ne@}0no%hdm$J=f0Yx2HyPuSsM+yBM%Q~%|TAByFN zluk<>*IEOJa#lp^OwV%6ZUF9y%KpCKsCh= z(Q_=f>y4O7-v2XWVcEwVB-tpT-1@P!^G|a8;+mg^FOMhAo6H|s`>@0LJD-02)02ts zGk&Nce@l~3QdpyaC-NpR;jM{)#{1+ zI^yjrUB9i&?>Bn>L|>(-MlkA}a(|aVM`4ge{B#c+Q>GpMoc8l1Cp0=(9ok{{+qcp7 zFsJ&SV|7_SM2uPHN&iqjB=F&IixVkIrK)K3*PNKU!6VMC!8O(IIi zH~ao0M(Sbri>Jrk8ZW(+{J!JghS%$?Tf^s9_`G;kdii3Rf;q?uKx{HX`! zB0d(ATlcfnKj+>0;}Eg$OIN||L)nK8wf5%+PuRyBB))KYqM+SAy``cryFWZVzC>QQ zPUc?No@z}drA;RH-hUSK_$c&qa@3LezozyyO!<+_>`*!3sQjU_hd&O?12z}TlowxmR!1bs#znp(nW z!>6x4-#>Ns>kHPsiJo*Yvccrc-rZar7cAbn^*Qv+KJ??`(RkMHKVp==-VlGeys)t9 z>GOVtl+8@XWy>opJ~V{4$d=n&OJn_ZwoYyGdiEVPX$s9J{};2!G!{BEysY*8s9ab4 z{?&!Mn=Neqo{>Ma$aQek_Dl)fXNqQr4%wL~lj)maP6MLmz9zQ=N?&rm6_Dy{o-p3Um3e>kUd2{`1((k>E z({FJ$|89G`ZT3t_MhT`ofrhD|CY^*Xli@?*dr6mnM{l>wW&eIBdCC9d8&Xc*O+477 z?qiev_0{jBM`|*Y>#OALgDuYKD?70@)MU9t=<#Wv`zyt9A>o}{zeCsje+&~=7}!10 zjdzg~t~Nb%eY3^uxjy=#RQadO|6XWkrTFgS<$#QI zvl0z%n|*#WLH4}oxf>DzJ0|&8fy!0`OAd#7MO@*ZeoEg;nWC>w@Y4s6gY5fG z3;n2H?5t2#?52L8nAch1SjfX0>T9@@)MS2ZUQFiD@SPX9ApO+x>OUqj{}*ch-BNJD z(Yk%__Zh-vw<^VdZ*|(8cAnQb{Y_pq*Rz(Dm!Hi@G|(>bnJKueBxic8Z1A?tg3YbV zOVaG0B(m}r8;P~qN~F3he%c$vd;S^6mEH!A9q)Kdg`S;!{C?5;`~y7S&Tf02?)}2N ze!=~9jrT6xzb?D&+gigz@uF2`YdP-TJ>7F7yruN@wH8tBuy%L3NZD)a?j|f<_Lu1| zTVF-2renC$N0WKKt2*MJF4_0xz;xx_-E0aA+VUDS#03>6JX%%#$3*9odR*ef;u`tM z`!79PdU^8=|HF4)JLUep`0;p`w!eMyv6A0+o8BHiw>holZTXzU-@Mymx9v~(^=0PG zV~1B>UUu8(&=-T!Q(p{JKN||1$(UheT2kW2Ez3MN&BaIeZt!_cvFTT*e_EDup5v*t z_f13H{}Yc}G5K~KXvpo6mT36%qq=LZ;I@fd{{~8U=5Jm8*X`c4X@MUc_CHmezm#*r z&Wq`8&-N}{zyG?~gQ@H4K5ze$%eD9J-NenZ>u+D)eRA1b^PA81#O*d~y}Ek$TjM=) z+EYFi{^|Yvy?6co+MmCEpZ`2n{ha?Cy`!(=>^>TPJpNMT*!kT$R^9!7K}DCL(u938 zl0}~16lO`PxxC@uj}uN2DeEilc0ZZw_WkAOA90z%k-OGE@fM$_y+_yL4gVzj7@4|R zao;1G<~;9`@0@>1#xu_UHHVKF(=TgD&!4B1<10(`=T{v1b-Sas_3@rl?d!XrbDeHK zB6{q4?Y#9CC*m?YgKK22eU2!T*_Jc2=Z1QZ^4#5Q$`kgf@QS^E#M3B}eD`>r)U&u2 zxpqPsVbsb(W zcJ1>G@kZh4ZJ*zXhM(+DU7mPruEm@`m+pS3KDzrp1Ir%eJcf?aE{~1ZYUlaKRD~*) z9zCrdzjQ;&E6Y{ddfy&bv?km0P1Y}aX?ywAAcZfGdq@|YouccSLA zkG6?-wPX7Aox*Q@nfGIl#Zvdw){lj|!Y$7CKjwHmWq*nJpSX`J=RfnF|9h|U1uc$_ zFRxbm$KA5f(_gd0#=cKE=6q=Hm6P-B)~ihZ^@(TtucbE@R@~if-^Wq0+`8|W0 ziC~HSQ5NraK6-N9`-4}1|K+`hD(wm_o@(Cx`CquHp?se(Q}I=&Pq!Qjuhz^vdcHLN zqw`<^WMSofY|3pdkOf%v#ta3`R-!#inRAnK65Gd<^Mf9e(Y>lXJCBa zq0aC`P%Lnz@1u&=*B?J$x+1N9_41cYo9|wW(?4k+eZBKf)n(1Szxx~l1tm0pK3(en z_|fk@8yA9wo~!CYqoV=);jms)9HZqT~DTc=aRIy`pe8051Uid6}%(PUcdj! zv>vbTg>g$)K3Tp=Yw70-_XSr4Bse9*yk;Le{=G8s=t=hA*4JM@e_D~N;{3hvmc_Zl zz6}lK`+P5Ol&%U`x%SeJAN#^~Tq_RgzI>%vK3x5*wEb#PIq!Q>oBr-pHn_;~L@;@; zRmkbt-*x)B4^LTM{j)G;X~CRrK~j%`r-Ks3UlrvCbKj_#AJFJte=YCj=81Q%dv)*1 zlnPxKv}fMw_2zRg?S9X(MVRU9q_nLi5NYq|C7F-Dt^B6r_xz!n!vX8ZY8fqts{&T@ zYTKUgUT^NF^?d2|%{SJY$Idx^xX)p?vVoA%+9_o!A1gCIKYCQQ@~e&C>xXL22dtl| zWlvyR5$r$vnwRml=T}z+dY5h8^Y4scMk&iNrxjnHtev*(mhrh*@RnZ_yNiK8W#AWOKtNpKva8$J46*+65>1DF(t+Z}_ zki$nO*~TV?3mHjyTlO>^xN$G5YWdxJZ{t^g`&W0x>BM|%rlSrAIQL1sHCY%{#csc_ zV0&ufzrL-ho2!>fw=@WsH#d|Rf`==>;{u>jno%BT{9$N@M1VTefB6cYRr58iW;!!4 zFfe$!`njxgN@&VVHZWyiVCQ!Xa(8;nAk1QsTv}CKQ&U@4S6fq4T~(TF$=bodWO?LY z?|-I$$86dd7%ksT{LlEoriFo#VJm% zW(J1Fss9;Tni&{c$fTR0`kJ6L%)ACDzh>%xhK6PahMcMY848*i7@Vg5XK-s~VC1$VG-++MJuLs*z_{6itapp^3=(O zQw%2?PBG55?qgtL)iY`{WHeR=1?6LgiT^tonE$V8ZSU@2Zf{-rzm0+Ee{Xw#6H|N7 z{}u+O|BKq2niv|}8yM;vnwZ)b{%>Yr{NLQv#8lrqtzl}@H1?^p+v}T}n!)1jjZMsr zb534rxY%%s^W3Sk`!Xw=o7zEAe>)nR*qV=RXs)YoX=vlzc;(QP_^Rfnj<3z2%B!J? zt+{1uuAr?!BLipE!On>ZAh|cq43cj;nwpyHLtWfw?cFnllYyaf+uErpk}dHj>47FP ziW!0o43*dSO@>Kwf^@dTM8?DjH#2b7?COPU;{nMumjwnmhR>dE-oU_Fes(Eb8^ppK zBM;Z~w&n9P3kp_mnL9nYrn#vD=9-ou&%Ai^^qTd_DJgMLF_Ec7El84C{@(UAE7nY| z2FGxJUJgW(@l8iVlSpHXYsmW5>->4aQ9UO+7b^K4Bw4>;%d|Bsw#8e3BYifS?Cw0!{~AaZuMX{_JRIV(nP~Nf6wi1koH{(bCk^@wu6S z`+s{=Q{(0%hmRgPdbH^X^W?aSmWC!qP+YP7Z*FR?%`0pxU@l6lXlZO>1Vt{>{~7Jw zO^nUWjZIAL)4(aC1Ds0Q|FLI6$6J*InfSUS_MyA)lH4>W$Kz0+hPo%X$vO#9xMq?TMP5mp=k>y`57cx4@q0l zGNvmQERN@z`())!W?W23=H+M+RY3M42;D=?oJHr&dI!F zU|?`bjqptK^<~gvU|`^2U~JC>YhYwxV2}b;w+ze+7#WyBniv=v7#1+WWLX#%FeBI? zm6z|nl7-!~Si$(_F8du7_uA+GU(Hm1v)OU?CAPI&qFg69q%@`osxZ`M|cBNOPRVCFw`&u<`)w)&d*434te;1rswJ2=$(+b4~1||*#B;r63x5>2MUo5Oy z1RNL`kqHAvHijMi=%Onc8JHPNcbu4`glY~06AwcHKeEXnivpM#*%-14CR(~8n+&o@ zg5iN2h()WMJYjU^rllh0nOcKG?mZ{I>5m29c&;nVJeWouz*c`X0QvIK@E%y?@)pXWOtUr0R{(N zJ)`9v$Yy{%!OU=n8AKxo))j{a#s;aF6hA?9gV-2$upoLi!F6$Bg@8lyN|{xpYozdqxsWMIxza^U&1 zpbG+^nyS%K@WK0!mOBMZn2{=ufTawwKeS9&a)Zn5#*eHL4ifh#NC~XyW?*J0-Faz_ zI#Vsni!0v`DneDL3MMQ_@YGXT-grQQiHD)5@%TCpoh}C1Kdw82wg^K^xyfbVVGv#4 z*LPqEs|3T0Ee2ne4OAJeeg-!^Gl0|_S3(*NHqMHx@T*?QBEb-`>h#HzR~#Gq>SWg$ zJ%>~{2Oe=47;Lb(-Zf1LQkxa)IHcG2>GSzIgQ^e*hDIkwHde086AlT>n0Oe@Oqt)T zd_i!*=KC8J+Q31=z;s&uz=8vxVuR0Rd<0ptC)=%ix=RD!|3fh+G7_V_oWXUh&jQxN zNgM_W8zioGhUrabU}iX7YHK;$Qf$HD`PGFlVxDiB0Co^4k7_k_pJ{MlIHblTERevE zz_cQyvw`!}7vz-ZhtD zgDB+W)H&|a3IeYf4>Cp|04Nv#&n{$_iMQp=mdw$s`l^KUw-m$HM)a(n28Y^E+Iqxj(bABh4$LY4rGE8g?3Sw2@fS``pEKp|ljw7TpcHphV8-in z>8&l3t6OIXyEYH>zZ`0Ypd~UJV z_rTXusrv)Jom{+P)x15s+P#tu5;XL<^cONPGk8}7S}y&>RD9{9{PxSHZ~h&gBEM|S zLH=mF_er6F?s0oB`$bRtJY$>maZqYgF)*L&W}4Bnp{rPOTVLWS|5Z71Hw})Ty1jpr z2^*7E;*v?MASW{FOZm$ACvaN*O|_nudTOd>@`KRn-1MQlkvMB{kJ~q z?7qLCX!5!3-Nr8@{;|p|TeE-uqsQ;oS8-IcZg^{|$l91HIHS@%J5piq=M{%aW>}q? zA{&x+>E|)y7ZP%b;U!o8?$VMhZEkD`e0n2)A}BK~S?wC_E;J+Yc>R>VkeRi=rb?>j zPpK`@{q@$`M{?@c4L)=0ej0uByb}3r$CR0S8LroTyPhBzZE)G|gi@1k;B58Mx9w}U z`~0j+eWrOnufOi?%ktknyW;m-u|G2uFqqK6#I19H;Q&*-&8&Oz32w6g1FfW+ziFPD zzrAF)f@|(4{jixvd!NdGnxLC^|DJB%^>w*GCr1o!{@#+6f3Kz9M+Lb52ys7c`wkZ3K(|1fa+*!c1 z_F8V?|Ig>vM4Zmub?sUC=G^X_W6v*T$$q+IcK6}o`=7VXwJv&MwteTztCy`FyE(<%cI>{NJN@>?$rTo*=PIF%I#Y|=PD!>f3|+-AtPt`DYpE2?Diej z?|!WN{jPlf>wiB_Z{ML`x6$~)h3ZGHvX2rkeLfX7H%<5a>dW?v9e>u{H2T{5^!Tkb zg#;bDvU$dgYz)udG+mf;kwt95Y)foxGTh^ zCN{I4W8=x|t6$e$pV!0Ao7ch4v#vi}^Uec4* zo9VCjiHcZuzihuvc5(T>vp4KNteJfG+uP+wWd8&|?)!W2$MYW*C;v3=NUm4V+h>1o zc~|Nc*SIChkOtm?7fjza@<=P}Q2V!2OHO5nnViZFqkkQT%pZxe{(oopd*|vq`~P_V znAo*}`ECC1!tAR%ZdaCyEREc?_fWFh%Afn&HD|{=pA2DR@^T8y(F4_|r%yXAX5;kP z`S||bz<2j|EZS80GWF6Qqq;j$5A%P2e6+`QxAeQ0{`RW>Wd7RTx%J96W^<*vxT#;K z^-uNVSC7v9v(9R*TpXkxR@flJ^lf9y>PPd}A8%&GHI zKK{G!bHi>W=1btRQNSUgkaeH9y~M}tkDEF6$?)_1@%|&zq`zbR-`C=I&mJgUXenaizVq?B^^3Ai z|H@21PT%)r!R_7O8S`r2{wqxXUsss^|KG>NK3#QhO;8;Os+kqs6(V&%u$Djh@V~TN z=2z42U)TR1{Cn^Jo}1b)%QuLIXB<6sW8cl6%m=qu~ zdnE%igYnbn4^ml{UHSOk`qAH6p&@!c@3+5w{`BbQOKW^Rf2~};W{0}%%YAvrzZKs- z^{P2`^GD~xYajng`O3jM)B%kS+W$BXUcd8f;`!ay?|(&qpZosL+TT<8>vh+K%jUF} zX&e>(m6`fDap#^~@6FTe=cp|GUOv-kZ#D1CLkM>qfG?dPeCpWRIeY(DO`7t@nz%{pi|Kivy7Zw>M?%HpwF>m_%Eq*_4U7z!^@7`CA?Yn+? zT+f&%Ze9=_sO;$uY1J{ZJab=ATKh+*@%#>J{@Poy#c!8iX6IS8IaVa<^I;qNwedD* zHs@Ba+?TTYNBPa7qo!X@CMqo8=ZiEJOkhY*dn2>OBcadw->W&RU;g{HV8{D=nbLTmu8sXZ3<$8;K9v^`Xb*yMEvM-kEoL zTKciM|J;xKUVFqI9<+=sLX6TpKa$ID=k9-N_jRRxdHmm7v4xvT4_xKcmyXKSx~-pA z`R&tbHO;&G*`JnAmn-USY*0L?5!cDU%rMm;=;Q__;WvL)8{b>+nK-lV_9@Ko2Pm2XPej#4P6d}3t~HN%Idj8#o&j0V$zVzPz z)b4Bh{Z8-I%6SXrw|BAS{!Tr#Blos+T{p?S_zY8>K1s4|5pl19=&Xo(+9AL5j z|EfXURP~Jht#6k_zdPIK9pCg;9uzRx7?(f<>6Q|DCZ4Ok*C!)&QqlT-FMPJ=-(P+A)T!b}Ci`}+f1x#@4;FDgJ`29; zmcKX`UmE}O)bTt2|2*;in0Q5U`v#4?wSn{G&wFpK+54wvspgyM%Z;4dd6;;7kMXIp zN-$_}x^8^PqITuucDEIq=Urd0$Hw0GqtU{6wa)!Nefi6+%lDbqPTK$J^DRdyM4Xkd zyenwu|37W_w_EWg@;|rMd-G?`E&3ZV$?BzR=F7ZD%li3yY?l69*!OUGuV}ges3oHZ z8bD=edvcLg?aEL2D-ZcT|IIxrdh29l%;K`2X$@yd{=Jt{a1^Q)rMLsB77CY zz2#A3!~g4dYd%-s(XW3X|7cp&@;m=G9$US5-4}zi+uklMO0>zped)`m@4>es6q^~6 zKW^Ntet@B&-Lb@`k+bCARmbz$5i_3WKR-G(EwS)U+MoFHkC*Rm%Y9!ESmJiC(G%1i zg0#LO7#fw`|6RFT@%aB^yB`bdyP{X0+vjB6Xs~X}o(uk)ckE>={lflKee0AzXB8Yg zHM+ivCNM0}=bxF%qITiq_QR_t&%54YaQ=RnjsBO*hbo@j`}Boc;ew`HOa!$BWe;`~PQ8 z^CZ}40f)kd4@~8|cE9`e{$n`%zn)wdW-X0H}`?}7sQW-hAoWu%S>+N zVd*&<{(7z?!-}s@<=;PfzU1?IzP)pM9(f+Ov)sFo+FHAbT)tfe;pp7@(mR`f?e&=PJYRbr$k*@x*!=nP_T8S(bw}2&-D~C-|GCdq z1XkEPED&Q_o4@n@{|CqK=>Prne%I~%`#t`VbBjy=9L^2?c=^v;gL&I?GrtANp1d|= zza)!<@P@YC#tZ?6yY1d-o?ij-j%oZyP&`(oS0^uic<;ln=STd%)u+$dQy;_r4PIFb zL=-fhJ-ffq{LTmEkIhW`1?GDOK98SU_Vl)=_Syd5nRUC49uAK%JEOn%tOBTTI0l+h zk)9&9V#nkBX??0{k&!5+&dgbDGXXZ=W9#t-!FLo^VcD*6TgKUBMT@1_&!HIEynnUjV3}?6H zKX(3fxAs~7!#i@-?fa|W=#_uFIepjFtJ9BW_U>Uuiuncyoe#O?xB2x-_y6#g@3$9Q zaIP*cBjVK_?f8beU6=lRs*BqHWy75VxnWE^DvKO+4lpomKj_e?S^Dp4XL$9W+@pUD zdTwv4Thn)9@7qbscgo(bSL>5o?Zt_Rb%7V!8+QJ@{_fT4`!DQ1WyklPUfI0X#ZwXzrPoiabC^#8l**JFzgh%qxVH)PE_%iwS}zrk_2{o`}{@1NYh?APtPbN~81 zw=X(h`R(Jo9^-rB_ILkxHlORSfmH|$j4VYgd^?@X|MdL+k^iS@_or36AJx2G&~CqN z_N7mcrlqalP%NLPzO?GJX6=g!jtvV>W^HC>X4ty(%HjDLt)LY4S?b~Qr=YAa5gw&p z^Sgh~h1}cU*6nz6Zcp<>L`G?F$ZWj!O#IIFb-Qo;J=OkS^PcB|~%1k73$#wy9M;_6eq`c1(v{;W1$@0J<8aOvvg_s6HM-=k9V>+-jq zzwbQ%`*F>G;SfbcQO3X|${|x!e&=KGJ7@W-{lCxYx9@owFI38Sb##G8JF=$#4DhZS~c6*YC{VzVGSByyt=M`!|38I){f7QK4~! zC?=d|`?0-#_ldv9^5Z1Kw@dzCaX5dg_PT(~zfPw&hXW&7W=3uRxudEQ#au~d7Wc+{-DYjWvbOOVIvgvz%v}nKj zv-A#>8^g43m-xz)K+VU=>)kS~ z^}k%!x%YST#)}2{RgaJ6B|qL|ksm55gs8R@3_=^jUeA8_>vjAiP$A#ZznZTuFvB<4 zJudZ1%+lYfQoaT-MZ20(!HK(NxBGX0|MR8&@vW;H&vU2g&gspUMXdk7dLljV(W?jAzPI;2%#JUfX8r9(|55LM{!wzZ=UCw7MS>;^pZvet z?>EoyyI1?G>;2K^$+BMy<%BdQE#j*W-1SXbVv|sU!o^FVmQbet+Xuq49iQKS|0A0D z>c#Jmy@GEPys!AJedpTR_g&m;qa9&AWl(Sa%v^`nU*Er*l^yq{?(6y)_?i+i**Us;WezKk^AU%Ge=?;x`Hr#JRuiVu4 z^8cpwakgWFkcW3z3uA-o?ggoS>F2Eezxq<%?qB&SuKZf0e0lG&=F@Y8QxSnIFhjU; z+V0O6e&5xve=zsmwD)qIw^L-l78o3uwTh9U^hvkV)U5_Jnez?yelcriSh{lBA_Zm! z??TDb^N+At|DSa-JbBC8_QX5es_Wyvp8CCuncYsX{@(uuTFQ{oW>DY4Az>j)pUltT z@6YT1aeWW3ug$)bw|{fI$o9*@?RGqWZMuK!PyKqit;?9hK;*iUcp5{(LjC&%z4Jex ztN*m*|Mq=PSLQuG$A2_^Tj`F?i%sCo83v|ewF|fYO!_^2z1{V{{r7hn9h`=`F{xb&T4$E+{c=Gr62r_MHq z)upw63J#<%;b-Tu=Xy{MD$r-m-9BH9eQ9QNV&JY%>}@s-J6rGLubXDUepmE5zPfu34RdFFy1J0xdFn=knw2>-;<9El zHU#-_M|UtbwC*iwmbQC7_kUaUo#g()=l?FK$1JXV_h9ov7Nnr&*1u4+{reb)a^ ze)^wo_qbvA_q}#67ae=)`rHB0J7Qq+)+~5FcmJzqpG3rc zK_zYM@2|Yz+_C|bTiz_y&iiqv{NMcVcP8JFOs~=UH*5douJcVYNdBJ|@nGFa~&J6*uqVD-B$L*iE09jEHZDoE+-FV)OotHM410K#o-wzw)-Tw8`=F59keY?AJi@a<;%gcVyR)_aR6dD}fvhdyiy8E57d~NUUZ?|?o zDoz(zP-cGMi~kJ9hL^MbzjPGe{aOF>^t-2iHW#h_|5odAc#2fV=yV-;c)0$F-N(-9 zJL`XccP^YP$r3T;^|l3XQy3B)^<&~TKi~Da{-U=013sA_dn*DD7*^)0^TNw8hQ?c5 zGM1mx-+ll8;OIN<_#L`t8&ZEavoZB_^)t_4TECDbC(~@bs=$oR=l0(XkNS4MVEv|Z z|2gX&p4W5cnfNin4O&punD+VNyF<(Wwe7y0`MU7wH^ZpEx@-Hdv@P7~nAsJbq3?aZ zT6F32sj9i2tP%_nP2AS)bL;;mUn$u3=6?(GeraR*tt?mOFd?Os$$}YX@=xb|-_yVI z^0Q)r1xQJR}W8JJrbrQ#NZ`b{qc&e@XBKP}ueqHvT-!HoB zt$ExNX~9mw(gUYXJ-+*S{`bV~>F2Xza({f^`tR8{XX{s05-~ONb_W$3tI~;Ou$8jC5ur@vs9`&-|%s=;+j{^#fn0Od`j+JU{ z?fd!c^Z&#Tx2-kqemX4wUw&y@^)Y_=g5~$`&ihusC*H6SDJ=?UC~nyGOQ!s!s=fIU zg@%7^{La=hF8yJCzVzqM+Q-S?oPS;OeU<_mwq5i7NY?xdv(No+cPQjOyyKG2n|FWg zzZvenyZ8NH>%!;%k95wp5rqyKgSx~U-Y{in>zC!%o?iMf^VR#@)_?aOCEf|qISX^S z)Wb>K1`Hb-#CJ5E+yB46k>!ucQC*(LUfhSQ1 z=i=VK?s{F{!=A?{{@A`_e=hsx+-gmp$8XOl#Ahx&#Pv&MX`l1LELI7I71xRdvp)Y9 z45Bd%i3C<)626|IA&t z|Kw*U>lI6HdnZcdr?dU^(iS!12Buy07PVOr3gsWsnncc&~6#C~|*Wv%mW8QU3ny*Z-vVd@kQrukiP6UgodeaSP+u zP5Lq8?_{rA4ysQJTeEa3*YP4yyNo#Xj5)oq6gsB%2ns$;?X z|Lj_&x>=9J+6tF`ZCgHP)4Ow)zaQ&$^@T5OK{nDrwejoM@Lk(uKP~!^ac#c#s~_$4 z$D<$r+5a7m&Ga?)Sy@5mN71&;Pc( zo-r@i`hyd={Q)5wB{|;Q_;~r9>H4~Ynv~zS_kP}9_3!?tU%&53WflGx&5MqUo3-CR zanGZF-VX~;Ncc7|He9^3Y}54_`Sa@Xqn`d;c$EFG$(`Hx%O*z0R=*2ju;4%{^*BU0 z*X;cJ+y0r}o(~Q&3tqghsE?l-I4k${)8oIFYW5d6f=bT|+~x~zrrtZCm7I9d|GUSd z)%w2_x99#&W$yDeLpICDS)uFOj^B5`U%#WNzW#Xo>wmZRe$TJj>QVpu_O_#6KRy0? zX-c?6pXJ2J2z|-N+y)E=`yRSvNj&y7e$o5-dGww8+lm9D%75HA{;u@6?DvTl^=G+0 zqJ)H{K!(}*!t>SltRGJ+`TsX=&sw+W%4$uYZCbx<-RhSu5)1I1$H2@`sb%c9`p4Nv z`xlCC4=A*b&i$R3&Qe&r_vJa;=Z9^+$!J-^{t#^!|n)42jI%DQIK`f+;?&5bw^~Y z-(h5UgwW_uEhD<+qU=}zyIj@oW08b z?)+ze{3Y!kqX$xtj-k;~D8uA@k$&|{)xz#K@2mdiuD|f_9)JCnim&`4T6g(>KmGZ1 z*CWyIg}Yv*C08)+maNd-=dj;=@h6>-JLhiP58Gp1b0+zoZ2i0Y(*#jt%T?gUjf%(PQ@ZOI$^_^R{KEK6>H1aOskdVj{c88PQ?#a9Q|8EPsf1myLyO#CnTb1rd z+{_Nn-Js%eTjUj)|Gcl~H!uDE`{kdKc0VGU%xOqa_530A2lIM zp`eBEXPphz=g;r_e13DM?N{bgJZvv|t}Ne>YrpQ#!o!AYcI|dz)=#(%7$&?o+IofS zK8tI<*WR1ITg&84?g-D{a9?)o<4Y^&+OVVKsgs;87xz^#JWzkctWy8JoQ>(vKF5lh zr;)pkcE|nw)b&lV7Bswd<_A+x#gDptv!{_OcJM9U^5?^v&2?7yQm1nXBf5GD4F{UI z*Q~X_zxUbI=SR~g-e-T|d!6(7SJf%Y4RjWNIke#r=Y>Pb69RP(FgR>Hd!*QH&(F{I zQb1A8?tR&RNA7j|lbe_STfffkA{S~2xKyy?&cEdQ&)-#^U;9z=Yc%HqyJjcG8{6XQ zVltiEmA^H&+3{I_;WA*jkZm+|3RnKGMdl0d?PxyKR{g@cY-e&`<@XT3InAI73|3wr zC}DjQ&8S!N>h`1NZ?C0Wa)Tnhw^v+T9UphmZpnF%2F3=-gZ&jZ>hksA9v1B1amMvx zov0d0yF*p@#*K>J>X+W{r00j$&0k<1%TQU%{j^sm%tFzsNczRKdp$2_|D&hryTAS@c0^6uGg-s#bgKXBiH^=brk?q?(Qm#(ZS$W1wZ!|* zFU7u{{(M?+{ze972IGAU&NBP%&pvg2bH&X0ZokjgKRDpO>}h)jmn%y8e#kQGEc>qR z_}^!C-2MBDyK?!`e{K@brs~cOdw3+{W%9MX3d{__`O<(@ZzaIN1 zC;dMMY6Mhqyt(x?{tolI{kC>D|JXUzRn7Cg@tSLQ6q0*oY&@D``Djczn`x3 z36FTlk{P}?2bz#4UJ=ZHSC_8@iifSSw<{ArsnvgBoqmM>-)-}W!b^jYTTwIO8+&`Z z?`)o58g=Kuo_|f3*8HuDxh?i8_2(WjP@J;vipUH;Y(8`U+x?EB?|J9{o^$!`wBB%? zdn+#|A)B+pA>r)Y!e37dZTHr;s+{GUIDNTubQ~ykyt7mGoAT_MYf?QU8^f>PXRNm0 zpMCuN=87N5x%`(Wz1@BHt^4CWq1p!^>k7d|HX}=x#)eJ5GRiNmmJ^#_SvOzN^L+Eh zPye*p6d9 zEdCvT{?;XvAGxYNdzP;Jl&tCpr*6McK?QN!a@9q7cYUe*a45`=DaKMK}s(1Hp@x32z ze%$!^x8U8ES&L5H+IIBqQiGdP56fMJmn+NcwA*dKVDK&A-1y%EC@vm%O#@ztonu(^c(2%PG>f;bID1)q;eXy075N#P|L-o_yE5MO39`c+d|4O0sQA8xJ6>S^-mm=CzlAxy19v@* zic?+Rr52!_dD+kv0MSOX7+PnXbc3fSe&F}hKEdEnhq2$VmtYvR1 z_FBKaqWe)(gqLZBz0kbW8Fm@gcjmv<1g$b~eIwM)bzeudEK_{r-!I9WUG8t!f3>K( zE`4k15Af1SSc2eq!s&9cuKZ!^`R>hY^e38gBvhCFlAOC^>Fv{>v?@bQCPsNiPg^U* z#_;TS*DK#A?XLN|4DPPWJ-qkT)c)dLwfTSNzkluX8hK1@?}0$;xaZ&ATr+2S!ppQG zUTB-CkNg(dcjv!N0ktdyzHlrKdpLVZ&gq=}AC`YkySw-I*;MUCGN@@mAxow}zv3YO zai+xoNf)+VSR=FE5;Q7Vr{8zarf$afW1EdXT(+M3|N6dX_B+!)@B3WcwS@`=jUCoNbN+fkQkW$vP$({zN;Po^Tv*VLVIO<|F5g^7YDp-DF)5x%EYwHQG0Rr zQM(v_ea>|Q-J5miHlHuh*5*ICa<&R`iQupRl*Gf2&iwheCq@6X^i$I-b;>?#`YtVt zdV84Rz@xZ#i_B9d)xBC-by@G7@^^J^ z>9=16&rkWW>t=EqXrXXV-Gj!%=2Py~Y+L+@Yxm`Iw%?By9uo6@f|_1xh7z4)eZ2+6ZRYhebEj@J z=y88{;N$DO+uNr1)Eb4r6CkKcEftF>em?K_A_<4TeTxFzUd26C0a{__j} zn)m;AyR7H6Irr$~4=?@eo4Oa(q7`f$Jt`Y=Ul-rKw)Skr{dacm>9<#f&a3C}{v6-D z?eC@|>KX?a4zLumhsf^ZJoKpY=d@+=+UqOSZK|$+KGb!?4XJg^$kHa(A;tchQ?$MhE zUi&Us{5<#h-o_BUGu?L#kFPm4|9s^%EfpmF42&#V0uiOp=X^f1W8OVGkNhas_S5SZ zHHlvTDSBOJDq{neUPY_+UE-UMKmxra5DD?)c#QWaNnZqd)w}E`|_6Ljoiq&Tj4_d zf{Qz5SD);bmk@vTwp}H2+y197pB~rMy%T16NE6hjOa1Vp;NjWzxvkffx?dmP_IByp zdmsLNzy0vqHMyB0kIhj`3)py|@V9G^JKw}MSI^x zp0DwU+4)PQY|fq?zw{<&vTyBEJ-~1vqGsybJMVoL+3el9>+t9E_g{yFzwJGNQqc>{ zm~&uXt$(-n`*-~%+urU-yziRnwLQ1G^|ohL=l$S_#@I!o-O(+K4L^65J)C`D+tg(h z`9Bu0+o|epH?m*u=nXFYpadw*T$g{}XMN7D>dtNbm+yAJ_;Pi=<}JA?>uL^lfu_)z zi%wizzG(J+|L^xbvSwa7^j4+z_cwLzW&z}~RA9yo2a&fW;&xvJ3;(`a{G_$4!uz>t zJ1BQPbp1GMiTM=OugA{Y=l4fPR!#_?r-2eZ29}MB`|EsScK%YUl&xL*GgajK?WIL^ zQ7eB;5Z<`-)f#U_Hil=9z1q#|f3RIFEC12JZex{acfG)Fo#I;1A_tgPezIP>F8|of zYz_aVyXG%*W;Z?+-P`r4>r(eC#ab3dtA6DLH}#zRtXj=CZxh|NdP~-2`PkM*c?T?>v{2L3Xj$?Q= zA+*hW@3y}e9{t-^++W#K`p>-0M(ikZ70%H3k;TmH5F^9t^Y1rj?0#YK>UPUd*O!Sq z6T?%!zlp!j!p5Lh|Mc+eh}&FiS;emRZxhwpYi;u^W7_}O0`P@SpmJ-*I)}xT<=>~M z&zF(kvb+D%-rU@veMi4;GKn(=EtY2ap=kf#{*B<5wt$S^uX`_ZUcWAHm~(Ur(%=QC zXb`k`yT$$J*A?e4yP%ZGS=KxTJke zTesA4-g=8~4h)U1qC38Pn7D44xm3^nvc?VI(Y^~}JJu|;mt}NJIK*^&+gx$^hl@Y< z-!1vqoBlEEPqM!Kyd@=d;!j1FmVZ+*+r&`s*ym$@sjtkqUElk1|NP}9t<%yApYzGp zWLQ5zi#zVdt5=Kf_Q{_8apBeaC#}~uE#WtAH1n%S{l*ey^II#D(corwK*?tDrP0}6 zj(v@6;3inJK9a^5Kz( zG&wggC3w8x`pV+(zME>TXca_`oO5l+FK6muJlp z1ZAuPEi8I_zg#LiJ3YRx(mF-;K+A%a+oBU*x7o5k5PvlP&pz)->qHrJ;@@1GeNs%D zLG5^6KGXlDxvh2c9#vLOTlVF|+qu4f^-H&#x>kC< zznk1Kg)2ORzwpXY-BSz){=``CWz_jnzovEW+uq*dXUk7+LCh>OFtTLnY9} z&+=c|dkY_Ltf~I_bkdY_`BPsm5m+75(9gi*81?W)P(^We^unmr+g{yw`ri6(-z8Mf z0?MB{iyiha{a^Ls{$jbWE7k>vSA{D{bNDzcIP{-c{esmhmj!W5&*#Vgv3c=fF~iqM z4|CF$3eFhvclH0?`D6Lz{Fg`8dQQ8S|Fb@@E^yb?li4neVGKPS=1=mfjDPHooK>e2 zn>yv%?!P~d-&fW<_WXaX>mx|14=oU^8+D^|7!=+dj;NlpY}?BE#kq$hIW{mQ7`<>c zFAv-m_3(Lg%x%v!;t-*|xS~(*Dxd%%L4<#qdrCk+%i@RhM2CT3=ZnC}DQifBTO8 zYd2M9p3>&|IU`EZ*Pl(Bp~^#T-h=yB{`IckAs>|-Vpo)%y=_mMI1`6XCxh{S?;=G@ zUKRm|ghNcqXa9W9o*c%yL1@8zp~}M?GWC1D2JaL4|D$%M!8%cfO5=ZFWi!4cM!84& zH;6LGx$S=;vDoX?f!|kOpIxwJkI}T{UryM*Sy&yrxX{5`0JXtfthk|cwOq)(m-|J` zeNwx;Cm0(thB1WrN0&JBdu{*o;ds>aC3ip1`@VAD$}1fVOq&HHOg_uk-MfG5MEbw< z!lf2!OdJXZ(T%6l{~f-ZsOq3`=-UdW?CkG-<)QV*`49i=P5Y^9t8bUZePjI+25kl} zC*Kt_?#WbM{hcrNyiD#WgTp+bOqBSIZcO`JQhtat`jOj;`o;TvZsW4~AWCx>dRyO8!*ciqi;?Zx4NyFUFE`tW8W z>@0w`ZxeIFe7>n>rEg+N*bsPCwdC{axZCHdHElKb@5(xzh1Qh#tiB<=Urpz4osa0- zklN5Ip}(yp7&HpGLq0GZa5P^#Kff?n{bTVtOSL+N2Om{uc?lx-7#tFQG2PyFi=p9u z|3o>ixr(d6aC~8T?r26^Q*(PgmT?>+C;_!({ zn6mW0PWmd~5^^8cM!GpQ%sYu4S>z87MDtZ34{o_Mv+=v{V9 z3yf~P)AjXQ3M$8@Y|c;JwKLS?Hdps0mnaQAh$FoPU?5ecFo`r`?o~pl$-gc)J(uh10&@l7A0rvKgdrDG!{NBtYPN=rF*x0wc99b?bpxvPv_ss z_t#Zk{yVdO>g8?n>$g8wNp)S-E4Ax%@0=-u$oU zWhOAgztPe7zj#c6qyOQ`TlM^$oS^8t#BK0-|Ci}I?y1kHDY0B1zu2U8*4Oi&HyKR> zhqp4<2Brj;9fD<-&*mlm_;gvs|CD^G$o&8OTT!}2jX#AqNeXDSAoqFqy zBcM{N@X;aWCwD)11;4oS>(|Lv(+Q0XOva)TCa?2*lb_Wuo8Hk38cZoxHpqDP|I=yx z`LnlO5@2x?@7T7h-L7Q*@74Qv>8*ACE7iK{*0%P!Pp{jpQZ|1wo1rLjlS>#wipW&A zl4fn4Rd+u9mDgTgJL${StHRx7YO<(}Q|-oJKReCb{$Hk9aW~$7y!`o*m-3o`2F3<1 z!}b+gHO3j?OJART7_<2#LqiD%auY0JA8XmWE&sZInO+OCf4BXv|NAfXe}s-`i$73i zxH{pN`TGS@pv(`QA4Q(HhDnQ?-BrlO6#y!EUNzs$t6^3HD9QOnYBeF|#?;|2Dbj`a+0g1yi8zMFnk`e40r zMBSvicRP@ zXps8*YVd8FFoux&m!-j4I#x|jU%RLNsa^C#o1s6PO_7P?j9zDEX};#@4sed>Dn2h443zR+V%6Wvi99W zD*JY2oo9G}I^dwwh*0--u-t@aWOLpDY+!DF*T?C)8Fx+X4lv^zRRT?t3ZcmvVZYBwF;;aOK?3 z6P`J@&R2cizy3o;Z@<6R44!9H%L0n#r>ZSe4JOmKS}$EtC}{K{GVA3PeP2?(}(myX2QS_r(uS z^HrD`Sg%(c;_v%#pQG+h)Z{&Zes-1lj+Z?^l^L{e#lXn&EIeVU7Al)IvALoxqCK!sV^=re(`t% zGgG&g!NbOnuBi*}nu4=~N5rrA!_v*c@5C}pz8~Ry^?pVFk_)G_&d2}C&%E{RaoD_Y zS5R1U7_B(Af9KydjxVRppK|lYjkoVTWDrRav^$5R(JlGPKA*t)OhvzHL8+5m4L|pI zO}xFSRg~d#Wp2jRNt`^!pVzPd5xgTsWDXywiR>WHnD+1Yg9)t;8W(bY)XqGovRuu2 z_vz?;Y5#Q9@4VAHdo6-#4TD6t{@k_t;q7jlMY8mBwS6vyhr7#~2Jc0gk8e1@!}6$o zro2s}cTK|n{>3|-vZu?>ceH+8?h(e|^KRDn-7|Il?d!O$GPSiIHXHvbIwI(h;M2Hh z=Ku12pXVlDJM#`)!;}g?F#cb<`_Y_y%|_$%HrHZHzh37)wd(%k^MAxeWOZ-Oi#@#R zY@Br%!`D?BM zB-Vx$l+>NDktHl_jeT;h%>Mb0kAFUQ{QURFm8qW6jtz_rGA3tvo~3;CzQns~LwuzD zdHwlE-j~};>t_FI?EqCk;8*|?+{zbnerYqTxmmYAJ<%`urqn5ShG*})+}`c@`*3#Z zzbMacfrx;{M7AI6c0B50we_CW>+qGSm#vuX>gph6P_8|~r0x4(lA-ST{eJEPm%aot zJk5?y<&5gv7fw zh%%&3anlyQ_u}r{KTFQ-+46&%VRq`Y(>>R;zBw&;#&qV@^*?M6zCi2e1S_UMlh2;M zzjx=)xH|uGewHt`KM`dfo}qCe>p2VMIXAAbtZ)ilncM26 zz6LZJ+2zO{^8EgVF6}GpCT5#$%R(F3ituPm{{EAhVej90tu`x<=9w@vT;5+-_PE`= zzFd3JF}HH2XmF~55eJ$$bMEd^%`FW4pI&f(#g8f7uXOG;%N%DoP;-anu6e%5+H>xk zGgv_h9^RZYSae{Tt{KCHyVqadeHUK2BY*#8x= zM3C2MFtR-JNqBuN@R#Y&+9j6OTU~Scm>I6d?JUd-yKR2czU$hmT(Palb4(0O!D127 z-1BqI{OU7L^~Rq&Y{+0xf8DewaEo32*+s4}Pk>!^K!8bGyNa#h?UV9Km;8K9#}I4zF7+qF=%Y*p8y+_}6-sQQ?=OlDW@sLY?A&gh>mIqM9ALxJexjHK^r zKf8W%I2455fDbzFVqN5R_$I$Ti@=QJ#;KyeIUEA*S7_As`Dc8beQf`%$@|+<^WMBO z3VfnJb!H8>CGtv24)78#)8bWc-u+f#{dB3QOf@s6acZG6tUAuUedfl z7#7kS)-bI-d-hK7 zKOR|?G(VsE;d9t$t_eunHyD^WbS605$miNF{vu@B;+1O{X1pyuQ_Xy1JHrQo12^Nu z`}z*t;eKMf{>kO}|4PDle?CmatjPVGJ!Y*X)x_9aaQAG}C6#I^whXll9lSJ$EMd-98`A zFm3W85ty$)gUV;NI$Sqq__J@KynZp8*7^-+?53O)Okhx8PhI9|UB340mme}RurdN% zN33vKaPh+CvoCgpKa6ygtzlWfbi{D=i#lTysk^t6!_K|qP}mT|^l;O^f}8v2=0>FL zWU-KD5#V6m5>g)|&&tuiUE_AtxA)tpv$On?IwCk@7Q^4!D+BrM1hg60q75`}}|1 z`!#ap<9Q=IoY|N_W9xhJ&4cf|KTPTKUAvQM4a14lnW;+rd*>{*JC59Lh812#f2wj=bc%Y_nvEVu2Qf2wt1p=O|HF|PU-?~cxF!5#{c`i$*|TS#+TT<> zx8eSo{{mM7L>O6CiF9mgXPCC~>Mv)rqy-z!*fF2Jk#%y>{>5zX_O!6R$T|0Hk(hq@ z&5gCUb7mb0gqB;N0a*uzMlRMx>((=F={j5&up{>2!IfH|5tK@;%ifRM=Fc;AcS=~v z^6TuM`h=C|rc4H9`Cr^E#{c_kt}MP~{pEN0ruts+=7-bT2e=wu#ztHHzP$OF2XZbn z$Zpj56mBm5wOwbgM*g+*4JF6ZSr2^C&-_1o_r)B){hl&{j4aa}8)p7b-O)9NnTcbH z=!G-;)BbFoe`%|42LqF_NXPtwX>xn(iDYc-e#-&2hIN-o3?gymdtTi zh)WW(Mxcn;FPE5;znLo-+j|AD^>*L)qEK$_$(L zKk11&`%mfu6SP{0U|_7T+&}G~w(o7O-?l6USt`W|y8FBe8P{3)x-7W0o^{P`b!~=c zZ}~DzB&N*Vp6yhPXrBr=B+O#+ndIj&``ojZguPkqyDP6>Guu;(G*SD6BjcI9dUk@4 z@qgw{jRpoLZ>Jtw1pI_%HBMJ2k#MBjD3k09qKA5x5KXjk+mBXNpRa0yU zvo_DBoA3fmV1<*z{P*8qbA>at+^&m!#Gzo2+t{(*V!qkWhQ}M35*RLsY@W>6;+9<6 zb^J*Has)LT&|#V3Ft^c4n<1^?-t!3)qa$x#QlGB_4GM<^W=s!r_U&gdZ4{*5vB^p^pI+XT3syU}8&CF0-<`}d2q%p&@ zx3ezD!5jyQdI{Htd`1b^+@{|j1RFRX1%Wy&pwdX8!J)o!PwHRS)4!+YnP%B9&D{O} z;t5xVMoF#>f9l(QSea-us2JW2FyDXZrQF=bsMQn46~6{ihR-STyr_h85Q)--5&+#5W1k zm`eVouauXWEy}=nqQz|IOLZ3SthIpJy^`_WQM&hQpmvfyND?`%b+JS+2B;YC{PK?P|C2uFvm6Q&xVE@W zxlretANBP2Rq?4`PYZyiV_vB&i2Pk}Ebe8h&Zkq)mQG#SZN#BqAkOsXq{-sb2e=v} z4;DwDo4ri)0K);3t*2#HU%U~tOagg#lLJGes!&4c0TDeldBzz`MV-zidEYdmbOYxp zaVQw{IB4f@tozAzXs>ntjeAxhVX0f*P7j$k-wjlm%qVZX_AKq%krflqC~ErN)|#;0 z#@>h9UT8t>-+&9Hdy}{E7WbW7KL0!~YeZ@PP3vF3rbO)89Lbv7$NBGl zo~LL2HoNor63hQ{)+v1Wtn>Pe$$fsi{}zL)`_DtC5TbHs4h8FPw0-VJZ0G zeMqiU;Ky#a&96<~Pp$iR#s5u>m8s{|H}7nV(`x?y)mgVGaaZnr?Yr@*`_@FJuaA3M z{w@B0sr4$O??G+iVrzv01Z9tJQ~$}|*JpksCb8+Mj*o`m*`c zp(@CLorKN-u7-ndmvseQc~1F+&q2$BTLl(uwydANvwBwXzgzCz0y9<}_|9c_UH;s+ z?b4!Wt~@urGC%hF_rRO;YEml}&QqQcZ8kSnFUC~hda>UIFNgC&KfHFmU&~(|QD!3R zYcj+@z%V1=~21`!N2}A+-3JaQTBKylO*dz zRUwY_zi+RYRLh_H(|)^>$MyHG)X-!8%HWxJgIx^T3~t*`-!A^MKT!JOwLM)(d+MRN zT?RC*v-o=b{g3R-zpnf1F?p*$s6Q9K`HkQF&Hm1NH-1XXGGDi6Q*P1kPW5ev3vLTd zy{0Gd|5bQc>Y?PX+0NJE-p*-@J+J7IKB=^CRs3qHb3a$_KlSa}W|q1KYq?GsrOR-p z|6FUi>15h3)9iWMLVr#*js4zUK1X`}u3fQz@0GaO-Fdgm?Oxrs;FaH&{(iCRt>^xk z2jVX-*pf5#fa&#Zx0i?t+So5RdvHCg*oXP-3Cjh~U3tEif#dXxFMmtkK3~34MiJDo zJMaTE`fz{4BdJB_zE2H}F}{jgN)~GbWbxGT-QHW^o5YZCPcKp=cjk7rizvl2=xi3y zFlBc=uO%~!SlokaUmWYBf^yZT)IOaxtzvn)q~61P_0>L7c`>D-K~{IRg-rGJ+A(ia zxcceiw{IT&R8Zf!{pst+%$cFFjrDrd9`a|WKcDt);iiY~Oghp093=;vng9P=UbkxR z_nY>=7H8^C=GU_=S@BxI_4J>$6YBTHTL1jFGJl7Q{cXFC3EN)xhA+Er;w>o?Xsace zr){f$XSUpJ`*n6f3#v7$H4@@jA0B79v|chK@ctxrHm}x#d#qnV>nG=^d;eEo>3x?& zp`oD|)XbB_uwNa{zwWe~&gJ4W+tvpB;F|My=9djC zwjGxIW%N7a{=S8`7G+=FUNC89`I`;3QK}O{rw7;fUrhV8!hNgey-0qZE2|j7SW*_b zJabuaQQ}|x5_3rX2<3(Z@V3L(cspe zcfWLAo+$jixx!lLnsDClrI+{QOl=4+b3QM5p=aZ#EpM++UY2>aVUtPMi~79}?rRnI z1Z=*rd#}}($Z}cZ7}tsB(eK{c)tH=j&OChm+Rfw{RwcTBYNt%Q7V&IPbr|Q8-)Ymf z$zIv5UK`i2&UKf!^@G>UwY-lei%FzDtG|@Hs18&gHGX7?U^JK)fAQYG`(<@|R@l5m z_n1#egDAt*&wRHZ%5SUrs=LgMMNQ#C`Lp};Lwo!0ezvU7KF=}VGPmyau5U9lp4r{m zcE-T>_FLJ<@wcw)OFzq$-@oQm%jU@9(eA#6AeMYrcLv&GOXGUD=cF zJofwGty(yhv-ne=>@v}}udj;Edb*Co8A8o7d>=G`F5aJtmiQko@APvG32?L}#ys?+|MZeF$FeB_t8wfx_` zUthLMEUS(_?voxp`}+M0n#=Z>s8-uK%&*$2<#7B;+44&jqE5f&Fg|Tf-J1JbWNKjT z>+sm6D=ud>e28YLN}KlB)@1UUxuI_Nj|iNLS$*e1V#1BB^%lne*RI~Z$vbz+SMzL3vHHHudt&OVIg#}C-> z$pViCQ3h9|%f8p|-}@$-8oj(aqYt%9tPsG?$j0#Oy_Wg&^`2WekbN%TkZ_Up2giXw zF$d3SHT=vJ)^%L4rD58?^wZ~$$NXBK`oY!v!PcIAcO7&$`}NO!n#sAt>3z*BdzzLNqK_)0j`Fc>7L8Jy?*ii^z4+`D-g$UfZEFr z2`5=27&kl-pK;ka;Sy+Izgq4`I`64SS%VF8U*=?(d9S;9anG+mdz!kU&F|ef*ZJ-3 zYpsjB7Je2uV6cAmg4`(k~W9BDR0q+Wip_ubvTI~89|_g1=U zzTA2;#$&XUOLvuj>UX~*8)wma^h&hDj|Vs^84_Fvwz|J7By zzo%YVrT%^)$!xXZ>gsg%CC?|w8tw4MATNCV(9loZgecEuy=bRgQV`aQ(`LYW%)2(jvf_y|-_GwdcAvSSA?@F0^}n}2 zUb-1@_D}Y;NaJ}`UX}NkE!{l*Z1%dhBGI1zD?g?6+@3j0_3f0BwXfG_=Wo4q^TLXm z?`8*wy**WS-)54_*7qBKZ(eha*K_a7ma3X{Czrq89Qkuiiuxt1q8)n$GmqJ=)n9$O zDA-}^_Kp8{ENKe+cJgD&?!VT)-psPQtDo6xuB*?ub~%)>{LgXoTax*AZd~KL|Lxv) zRo2J%&wAgRb!7jSqbhsKH&`7gx1S`H8TS82^GUl;zHe`JUXPplVU7ebj|ISiv_0Gb}+iw>x zP5rv`d;T`3174X^8_reVpZ9HFr0l)zVir4p^@UaaZ~SI=b5&!7_iCo9FeVk%xnWE< zmW45I5K=g*2x%EGFdpY($b*eAz{FUx6b^7fPTg-TWHtFb|LWuOeCeHcCx-dW%xQ}^ zKK@eAoloX|U#kC}_v=>e-CB8f`>lm(r?=*I&dLpsdwuNn?Nrmt>t_B|G5j(2+$-&^ zrI&rXj&0t-`rjpMS=efJtLhzVcwfF^+!~y_Wzobi)+NuUOpT1py?$kvV($Lj)?APN z+T;8GyYF6OuPnFpS$W;x*>Cr_?NWKrzkg^t~mT&&_tJ}F`_8PDBP2FOo;OSepd^OV+A&1DF+Ds+7A@f1Y&cHom zhg?v@>#p~D(Os8qwcJ7L9KcN(2(e->12eF>Z#4=kr|e&*)=eEXcTtleD&yI0>^#Je?^U;4|b)YIQDFa167b=`>tqE{`y%nAO* z;8-8IKfF}v>c(m#E6!h14ohu5J_){c@mlZ7;ytCua<^~4{O_Ol$xHt?zn@zpyWrc& zecR3peK9Tl7k)i**R&bgn)P$8cufD3zl?ux@#>SurM?8%>Mq`Xw>xh3eIGfM8y1?i zHxgnBKCgO^&2>3B?d7ijYu4EDO^8apearo49rGpjpQ-%sFCXW)v@IfVzwN(uR?Bm4 z?oVao7d-RnP&;qb%`I;uCB3`jZ@P0m$?5zR;qalsp;krVw}wN^mWlKB%bA@#%)mPV zy3X;dSOTlV-u3qB{oojY69K}EpnkT~^E0k~?;pr;HYTzhnpuA~VA@J&<9}5T=BNG5 zz5i_crS(@Y=d3-H@XhqS#Vph7&F_BM-tgc2YnA$Kb-#{Fkq?~X|GQaRd&x6Nyi1;$ zyjCdVy4-&*Iirk|fxkXDtQG6H)c)VnHpC!ZK6JT3PPBFG{qrkk-q)Tyv!r(C1I2u` zpS;$S*w5|#Uwbl~d0)+Ix7}TD7B>7l%wYO?{p%&|-&py7WQR{U_oIFD%~`79zjd$p z)Sv%5_1gTi@1hg$YKwi3&#WprYrZ+ea0j#c*2|0XRr%IFo+Qe8Yug!vwNu|sUMqFs zdf>6t%_f#hj-QjWnz1=*!HI>h6FV|(XTJ<*E~}lJP!qGi&(~HXK$~%km2&RnFs2(j zQ&%%y`hD;cZ0VH4Ue*Z4fcLM@-$b4E6_}^*s|9(#w`MZPb z*uu1bTZImsE;=_mbn6%2|Jm;^HO<<3KJEB!trPbz=HF{SZH~XL9>4JVy=y+-eea*!bX%}?-+t?@+1{If^ft5K zdU;c)YR}U1SAJ*yI~QyGb=KMaVb@JGS4vjbw>m75{8jQSzH*iS`Ar+7rYx&AiuRl^ zZ*v&Omeb2t^K431^L?>~=fk_~x#dwuUjErSce|3(?4SPkgKwUxza@4%JoDyf#w}LP zqOWfvP5bzv%z#lD=KI&;Jpt@xR&ORodKplDCw5rLX^-_H(LO?CdkIw)gSd zZJvMbSG4WLuP?VVm`vinamn1a=H>ib?U`@y-sQW!e~;wnZ)LlR6mJ##1Uvm0S?SmUWCcDGfSaMHTA*GK*@ z3!EBg`*Pb)L1;eYr1>xxfxku`=4)q zKkHo|{}erj3yQH3VYkB)-fnp!$xy!RzQh7i#@Cru_uf>0Q>m9#%$=R~T{qJB&&0Hp z%Qyd?v#kDa;_e<296qBwXX(jRQ|q4ZIp=8?b}{XjPK(lol zSC^K4vT4wmvGrWq*7cvm7&5NKJ+ICE_h#SK`L+A(Z2!O5rG2|S_oXD~|3639NdD6M zz32S7?c9}{f8F%!TJk+XTle#p{N-ux@ycl+GC-`cj@*M%~@jm@J@T}0P=BmC*U}ihr)I>+#$d#y1Z~8^JKj3$8@8V-sq~*@?99-Z z)cEFMeN>;EIPd;{>nrm0kKf)ucb1-S*)Okc7J=UXzFx4;e}6Ay7f;OTo134$eaQST z=X^qJ{p(e$Z+%UTzyExzVhrE@vLaCZ)mFar^xw5j{;`FwyXP&pdo1~OL+NGTw+7MA z)-QeKnf1w9U-#U_o#mo;>tm{eD~m2}OHGp(zQFvP>(%$yXV+Y6m)Mo_w{m&Nvk7W1 zE!N+!3z_t3@%s~8``<3VceyWrnLO)>X;YS8-|_lV{O!F@?!SE4dR_JUk^fwF%h`Xd zWZD{h`u)~i_wcA&tG4E=9pCwR$&+7eV`tXXESUTD{q$+u9a8PT{*_NznZ3PkzwC9} z_q9<==H5H8()(-5)Fl(A$;rG(b*U;y_!Y>Y-v0OA^?+s1=l@*xJ6)dh!>h@)Kc+VR zTIIYy%a>d@NUL-{Sp`WexD5P7UTJEUCy3a=JqSg zzV>RoTH0M{O{Xc&K7K6_i10!y15hIEc){;%u0J--Mzz; z&V1Q!cldq%*4QoO{?^~Mqs?zUw7q=3xjy%GRrPN<`yIM>Z|~I4zkRDOee>y;Yu1G^ z{ZL-v_4}s(f7ea>!`PQ-b8jl{D_&fCeB0@k&1X;co%^|(^~rLR-1PacuWx3|dG2_g z{e#{4ck9_U#BLU4eCgHjX3pb1+V{TOX+OFn9XGw@<*&}1vOoXR-}@eTvuf3r|Hbdt z8a8{LunA}4<2c8()`(?8Awv%1UzvH=@}7P!cDNnJa{JvslN)8)S%2m@yltG9^JP8L zEsF)Z0#3W;vWvJZTVfRctYzV(D+TBOzu9_i_xpXn=T!$!4QX3d^}5og`u*1H_nyzW zzfbhk?{$04`p#{>H|vnd|Ai}lJ$U$>S8dgl3#*Ua3VUGDl4WsCe(Lpvm=lb8PcsCR zm=0Ce&SR+lpL1M~=lUiEA*HQ<7&`BY99J>3HQG>i?a(y)b%wuc{p!lsf8YPe_Wi_P zrT^dmuawqSabSX=epkNOiudYkcSYw+kJ!hMxr4i=shr*T$C0-=+5EdEomLjF{ zujP5HwXQDu{isqkQEjjPeDO6mo!wLm2}~6SrsNiee|~bx>knU7U=+ec8cGK^ z8kDrQOgtc=Ch-2R{;mACqW3zOr_`_bw{G{H#gcCgkG&7vzHwnvZ|#SG6&s)1hb>-w z+e_Fh=k`qfDc{y=hgWTn_FZ_)d{*x7@1FPdudSVKbZgVw<2z5?ycU(Jdh6Phq=XBf zj@c(ZKOTMalge4;2Xnsdd6Dw5_JiGvLs9?s1utgX_od5zQeFAaE8+WJy$)(*;+ZOu zdz~}-Eyw)mg>Cu$a}P8aKVP`ZeWF<2sx$8xpUPjJuEWl7Yu%o&@2+0@vux`6J=AvclHaZBvao$FtF@+^FtasB?+SK(Lh2%VpM zb2l%``><^~|2tR?ILHe!G;444+n^|vu*+>$%iovNct1?q^lr248dr;TX%n6*zlh&* zV)p&oo2fznd6XG#gu^@Ps`L4$A5W$HTb3kiGk86338?4!@V2QsIc!SdqW$bT2j|aT zef7}I`i+&FeQJ*_U~}7lB5#Q%)7Fn|M-Hu8`~Hmf|3g{M`tRaC8kW{=v0C=FT58tb z->RFB{Fpg&RzaH#Kf6c%D>D>I<`@fg`>-4V+I`w_ux2-|H-ikaFV`wRH?@2nB z$8=-U+i4RF=cvDTH*$F1{Z_p2kz>pK@C|Pjzt^60;uX!ee_Ud2qWS-uo#tQFifxWp zavyG}`*8G6#_mrQ9Pjz(FAv;%vG`at^PL}#^*IZL4oqW^k(9W%xc*~OX3}m4c?l)S zgo2iY83G1#4qrFCCf(Gf`v35@N!Pyaay?dgB-*?waLpuGp6^j)>S2&@?mii=h?#I3 z-B=_TFLdy{RWS(Tbm3ZP|4)BQ`_~E16Yu8SGz*?<9D0A^3w@csU;jd9h4AIZvvIy( zAfx>9esh`1EoNbpk8#Hv|JL1jCAatc%(O~pqu{K+omu}|wd|L?@YcH$XkH(E+FO59 z^UqqmYq<}lCg3^LD z`{hi}GdIUo@ivrh`6L}lP?U{GdoXj0|uDP;Qh!@m0b#CxA-pS!g8{ec;|TWuJh z{;E&A)XIHSceC;%gJsX8J#X*-=NbG@dzpuS^_#-N{}0#2N=#e9H&-R!;{$GzT?fHE)HfYyr@qHV-Ud^vP zE*j)?bnTfr3*RREuMN}d*6ri^Ajqi8TI0+6?bQCWio&u_niAT-E$!a>{Pdb@n*x-D z<#ztByDuJY_q{i{J|_N;&+$dFpzvXs$nem3t4knb2ge6@wl+ZqGlRK>P1hzUGnEDZ zJ^XX>iMF4c6&@`+HlJ6>;t`deOngV_?2rx&z2oV|bB)HVl8-NV4y zBgypj(#08-ru#TJCmfi-A+n-7^^NO%YxiXzZocHM`FpRv-gxpp-=D|jieL79-*|h5 z2v_NXG^N+|S(n%5U#(yFuljYE&U&E zcXgNUUcx-&9BsksmR*$cvwdt(^bua$M{zp2f5 zer=m-?4|P8r=|v_T@J1NcX|Flms{s!*Q+adG*5S8>fmrtad^>^Ayczw16#nWS``O7 zjm>))EO-xWU;g@~*a_YT&)latWM%jMPS|%%f$6z%&mE5GEnfu{3N*CpH{TXJdwfMh z+L0UXpz8c6iv(l9nbt5Y^^Qa^iv**=vT2j`otb<&W}M>rxJ&PM{epM=vp&5~=bloz zk#*mV-|v+fmEtwd%@NVzfIcq3Qymk z`W5@;WS~mJYZns+B}T94uSb|&7*4S4h`85s%B*)%Mj4kwUC`bhrxv%a7mRb_^NTH) z=g<07e{yx4YI4|}twCNIS8qKi)nF0e6!^98_KsiuGuOJFyv8t*A&=+E?=wcfmQVb| zf7O1Dd?3?_fA@FQ?JZGOQuvZOmxXV-!^EKa9mQr+^7p$18GAi0`hmhKl&Obd#ioQ_ zSeAt(M=*Izhp~>)AZ_|IeK(Lw^HhJ7QV2*^)KUCjfN0w*^;U=3fq`e%<6w%Qr(gI$!qn0 zb)lnYXXw>No_asQcFExt3XJmGn0~B$Q@%O>qEh~$GKT%444#Z{BMumFE|70gWW)Eh+F3`*(Xm}g%8d2KYla))Qhx<3;}xzXK(l$ zklsGyd(M5mr_yh4*w6o?@AHTKq)e*CL}}S=hj+bh4!Xb0tD<)o|Lo7)^#*DofAe>R z+Uo6&I9-ubaDVq?_M^{_%m0`;<@}!u#w9+M1wq~W{f=C02xM`X!6PtHns+h-+w19( ziw+zSGX5nUnfia$)_Yefe`N;Mvrb}Ix99RNhC91A6-lr>@@VK)f{l(|b z$7XzzSO0(b@2s<@?Sw2O7+1Vw|6KfcqmjMHQ~A$HIh%h^U3C7xmv=&!Wdx-DRN+)+ z_@Rl}+*4>QbZ8J{c$_ftXV>HD2a=y2{w>EY>ZJ!Rz$}2o=mKX9pVB$vG zxhvoPb-!{Tm$~-Q?+<4rtFtnQ%tLsl!&gl`ek1nvbl*FKa!clpfx zS``B!mUnS`cRe%-`1iQ>Umn9R0|~ng%0di(*TrnhiM)|A7o6c1a5DbMy?LZH7A=xS&fy8EGZ*^a!fPklXSP9xxlBC#k42>N+Ml`HSEDX+Fyxx-zozlO!1Y>A z^}UFn{>>+v+$EoyDpXD00#HthoFrEGOX!pT@cZWMa+;3R4@51_wnu`)=#QR;Xdw3G;7y=SK znN$q!aT+is?5St^@edLZ$mHWD24#k0M~yzK9@lMj_{iE^TefV6Juic-W9Q!g9Sk30 zS(h^|F%A_y7WZk_n*RaM@2Z@z$p8J@@V)bm-~B&7_buP@+TQ=~-oFKxH+huwT`iyE z|DX5t8TmK+zn^cYUbyFt(p>pf`?EuH&fCxXy@~rO`{zX^VH=M9xFRQ#T)HGCeC>~j z3tp34_utZZD|^1mulH|(^uu}e=HXet|Ha;QXW+@oYyEro^<2w?_x}I2zbediByBl^ z!_W0~#WH&9c%DDy5a1B4e!^-o<#x+wnNt;gij4~e4&3`6Ft@#`U+D7z^)2nCKUz~) zJegm8ukzB?nxCI$8GT8Irj=<9U*GSDvW`X$4LCcwgJD0uX6p{t1%i^dJQI3^Uc~H= zyU(Nen)Q98_%HtXO@=qO<=)Efd~S8lF8G#(pC0$*DUmPgcb%AYuXMd={F0N0b7N+{ zt@W7|Y2rTY3=YHkQM)P+Ba6*$^=p|+>c&SKq#t9SWp48(4;$J|d9 z-<>__M@#d!h7VWccFxN^&hW3|C|73u@2~Qnl|MJ<^d0zKu*!pJM(*2*nTK>4GrhCV zUXh))XJdZvI?o$FJFVYOcvc<%J4%yZCqm)r{Mh=vQyvB}EHC+B^oT{`nEfLU%ZCOW zCfGSpN*KxX>G7%MoVvz8i+}ndH*=)o-^5>DTbg`xV@c=x-^QP-CXf+Khn!`=J(0m z5`AU2<(v20753&*)&Cwgr#F7;PiCB}|LxywqxmeS_Pjo}uReUgwH4ckw=etWT2=-x zvSe^_l`Y+~&*ItifS>Ja_hfDki~chIn+3Z=)As`nYN=MqZSQj}pS}!QAHj0q_Wf^V zne`97esbcdY< zpyI%ESp5J;!$af89H1~ntH2~mL5btlv>tvRCTDd4t<3@T*4Niw=3I~_{&w>E7biX~ z(|z^&`_}9Cr7tqv?32B;^Z!HlD%4eInPw^>5qP^L;uO zv@`pt`(DMZoxg=@r*HqWUfgSbkmkID>zA(lk$QTgfrLva&$;>PpQq@CJEwNLu{h*< zpZfa$$@}UTiISIpru6P`&};Z>@9NgH=eES%`!^N$eUGo7J0-$DK}cC&#ewPZEQWu3 zIsdC=T5PGe@oWhzw|seC^P@^x8Cg`Z|A1H zUSoTE-z$STv##Iz?8v(%*M;}W2i7O zgLn1?{A^FIG*&XxVPZPpF4X538T#*f*Ve_^6Q}&%ZC!m#N*Uo5~-z6%f&}itzkYzWeeoJ?pxZR7xb@f|fC0GAm_(}fPMsNdA#lQwsq{!)4 zO@<90Ao_0yR;V1%XK;JE>El9AaC;gwb^~W5RIuz|O{m!O!k1}r7lYHgyUx=WCBOXB z&9djNr{hzr|EsX%f9Qn=ic0hHJbUqj$L0`bKTw4 z@t*a&pIg7j?yg*PC48%$YpzAw`%T?hx7TgGf9ZK?OXIg!W^c3){cbnf(5dhA-_W=E zQeW1k=?Zt}&ziUOzsSlZlefsWU1=}1cZ~DQeeK4X_ z&Nkb_+wbnZ&~fj3<+KigyE>i?EXVX4E!NoQSsVSkuX0#q`&>)DugAj}rkG7(1r@Xt z4k!vGupCfqdTf9#H~E5c)2y)W^IlBK9t*aw_D-AKkj&V;vv7`#Pr#JfYK$!*xf9uh z-$d-RYQ5>3b^K!NuSMb~b?yFr?Dv*bW4u#6O^xx*`@8D3Yq$S#I`w2(^j02aDL1E| z*CXBERQ;POKVfIs`X4i<{B3;o|NOK+>$m#;=e(Ec$+P_C-NX55x~|DanP;Wm9{t!Q zwv+Md{nBfyj9Y$A3iF=SQ5KgJyTR}GwKY@kt%;wkx6I;|!S-!2H4DG|t=i|77gK)s z`O?2NJJ|%8uBACLsTi1Xu8G=uYX6O!>GR*dUe{FiBKYwHa{a1^jyK!SKag zd%Ax7y$!o>+Dh{!v4cXU$C2sb{h7%hzW(q+E`8zbJ_comAC?M@hCT^dVYUJ9F1qZ0 z-^^s3__wOI_|0p*Q>+_~_DwykR}eh^una?_fB)I!`|8uO_lLI}dNXH%m3lL?)v;&Q z_g}~Bzl~oRy6*ehe>11N3<}+MUSIdpz3F=+PTzia!D#=zf0}0%8Lr+fms!a5?R)$8 z-G}>rJ1ZPn;u88jO#3hggUz+4@>R=2e&_OLom?4S%DQ!~qI|P&5a0KQ$Fn>3{$KX0 zeIi4IxXkqq8NpgI{O@P0kmt<&uj@X4JGyK6pULL;G?MR^ ze!UvB>vY!XBKr*=>N|7aYnFRjKAnAk`loNN?KPL~cIa$3>hDvs&iNqe*ZI?sJ*3{8 zeae5c?rAT)O-?P;y*QaOZ$s_>bK6bIS7}c=cZx@I`nD^dj_#{}dF1Goza z`52;`Po;%^40b6uImy`YvT&6{*Bz$K=?k@g{t=a0`QhC8`g6A<6d8pi?z3#TE?@oM z@v+Ql-h%K6`V4`L0iPdoKegX-xJ_u^ht9Vz^tB#$G%Ly90u>Sodju0$4pc-J?$ZY) znhD5d%Yhv#2RIrEcfP5~6k4Hmt^M>OJ$45Z#gP9O?(9ohX!h2m;rsmZeOuOVz045v z_-J^n>b9%e^?FZRKF?Eo%KiW0=Ae21oBvO`6q~pI0e|h?&;=KcckO-Mo!fis?6XMG zx8KY6O`cR1e&uhC=1r|_0Z;y)KK(x?$2j_w>A!$~him^&p7{6vl%JQx&hBJ*dO!VN zx$#j;2BoL=J;x5r`+sB+%YqA~HvcO>`N(fy!E?PL;StNmxoOq^mmcH>d4q-J&wkA` zXBCGBlM>e3U8(uP>w2}F|Ji|vX^`Z9SQ%6Ue_Uh^QjFqf2F@NYraw#xA$rpCv%rlR zZ~_4Z6`0ZH-Vn{ucD(zZia{3VopjHyevTSD_j;~ZWu7CT#+-ApUW)DcdExb&TIZ^Z za{Fz6{5vK+R_K7^=gvOnEw?={?p_vsiql(c<;_DE3S|};%Q-MvSHIhxAFsbJIK9r4f&D3|9$v*FZno&ty00V?HNZ;xQ6AXd7Rr`&?xceV}0R` z`g`34|5U90>EG$w_+HTW$cy~6Z0n4Z|JQ9zm0!K4-XeMCpL~tgj`BhZjUT-j>Sy;||NguhTV;ei9HGu2D!wXjuX}R0|DWl* z6_^wpLl_pZNb&ot%~{e_`zGk!#g@u*eN(D#*4S!&@R?oyb;|M+8`iJ=vr7KoDdUhp z`}gYprn8q_e!czh&vX7IJ+J?GUedMmSE&v1+hYAy_3x!)8*A4I-u{*26TRsBWX3Yb zP5Za2t$O`Gxw8EW&z$wA{##FveRbF0t)w~f%ej5lA3OgS1z!uR)>rxa*^{C9vH0JQ z^|=d{7q^}KUobsrwVeNqudnZ37R&u!|9khNPdAT$J7ikuv{oZ@Y2%JnHR?hd3Llt) z4}W*z`g`Q->!a24pE4En`fa|t^4GFY)mQEJoPW@;O@PxNVb?az(+jhMHZs58r19^- zl@}MjXD*vIJ!k#z%WFUH^X%SxyN$af{?D<=|GaZf|4ZIK<+*xQ$%EOG<*V=8`z`bO zd-|lD=KWb`rWu9&dnj}J!n##|H$QlFTKd_od;in*g>PG*zog8SeD!{*S@6Hqf{RCs zloW&(ynA6kGh(r{kTsjZo!|YS(FyGf`&=r&t$iyt{l5Q;hHN>;2dmeBJmwJ02 zU=hHYa^8!|Whu}-z0Q=w7n!s@c`#_qUT=J&rVoUUCS`As)qsyv^?S%+J~r-I(p z{yM$n&wT#ZoQ#*>|IE+4UvT+l(5}<7C(r-2YxSK8A)ooKl!%xtxRI>?XZrFPm*)M> zv-@r$xp9T_XX!8Z_j=t@pI_^E*JlR1Y~A_&uGT5r?B)NOs&4wXn8&L2+kcH$iwxKs zewNJJ;gWV^f7;q9Kf-><|9c^1|9Sel-F~k+#18zfW(QA?E#Pd7SZP0{qoJZtZF{mf zxF~TDX8IAmzLR@5yud(axLJe3;G5`^&yx=raGIQA4d4p-`&Uf#!p6M0=j2wO?GPx~ zYsOc}m}F{yd*9k$EjK>jU-bWr0(0%vg@tR2AG^J*vFTzdaMQTtf7p6T$^8F&&sXp4 zseJM>^z7f&GY0S513gJoS}u$l17`=E1>F&ucILAjybwISoIp;IH{1CoLi zv~Y59Gib~}_VtnFm>pt;#=}YnbQ#)P`7dHIe`DP4CUmJMHO)R_UhO6 zPFZ?+HRr!a$^Q;q;Imo7xp@ATwBDZM-#X81b2;+<)to{O0fLgjqKV-6XGX4 zc=!2y-L_c)hZHsJzn?2-U3*Kb??khxAj6FNtN#_8@YeWmpm>TgH=OU>Z0)n3t|`n+ zdQfm-D_4!RU(};$cDa>Cg~$5uf6jhceP7dmy3wC9i#qed2dzlHNVp=%@&A}~DgSwP zNErb2G`KuaU=)&&VsvBR=@s7Vkq{&F;W*>1eZP-P`G4@{s$bR`Pjy%QSuV!O5D@VB zut&p8M9S2FtQ2 zu^+ZKw#?%{Y~I}aZTfWc%y0i@S+i6!I#n;+mCyG=yNAW#sP(uFUK` z=*j4LG>%KF>RopY<2R0fu@~k1ECp}=IqayqxZUVY_bb=;N_q!BCwZLVc)R93L(HTt zYwup~))JmqGs*mYbh0IbQE#lr+bgY}<@ev#f*N=VjT03LG`i|*?r%P4V{E3{!?nWM zi5cv}DGdM4*{@KRMJ{vTY&U&IH-?^jTOUuJd>~NyK`~>*v%d#_e*Uw!)`a28H${#6 z9XbtNy&eqqD_2MGF-!^gvv5}XzNKfQmvGKk**b&4#yjlp$M=hw4{^3de!uzKu-;B? zTZzN>ON)C~9)5nTcoEOqB>z zZdMSCQ?_<`S^CXJX8*+qizlj1UzsO|9KP_^&2B^cz8T9;Jo|Mh-Q~po?WUFYoXmDa z#Lsd8#WLiEH@ROUgfe z{$HB8eL;(U&7%$f511Y_F3@)HXe|Y$;uWe5``>4;&6$YYf`_qtG(lqr!KY77S8Po7 zVBq{Hz}T?K;cj2(+km5aU)VNg^=`esFif34>%8h6|fyl35n)l0TL0c(wghyovi8VK?C;7a3Ill%G(G z+F6u(amp5ue-G?X3-}%WXouUu>FTgz2T=+&ZuD*tWJoU0{h6jxaDrt5|AUJz`;}X) zF5kYYTI{#sF~ebLo^x}B%_e`ECYSsD=EahAsmE_0)iPr{)VFO)BiEZ-0k^Vi)-XPm zx65eXclOsD`CqYnGisErYYgvgU-*gr)b@V9g2_AQzmQ${ZnvI6BX92Y=XD9?U$?BS z*#EOdeg2bOlRrot;M*K(wrY_cpK?LwvLCx&E?m@JD&yI4+dTAZZqwUr-=F;IM_Aak zxsUz$sqlLC`7^5Ce{w3;z4R9AUYjyejQQZLs`L<@e22vy49}0*Fg6@5(h=nN{_wb# z-K~oI8+!lWYcczARP~*q$o&eP+o0rc5C_UBd)C?9pN*MQVnAKK9Z`AvbU1nX9gc3= zoE*PY-0$$4H`}JmEN6HS!r;QoWOFx;y=TOub2a5$Jjw7V}I$h z=t&0@1$W%Paw<5dWOF{x!atAQHb%XB^K|X)3$YPSSIg!G?0Wd(w-4jGnc5-OKQqSF zn(xlveX=WON2m5e1NKsTx$npJ{kw4eSx4>Jm}rrn)uk)89XPmuf9b({8Ta=WAHG-b z!W6=$UH52TyZppozvDhfY3?t%TN>nag^#tAr%UvI#M|;Z-HW?TLw?RJzUVtgwwOh$ zl4qk;AQ>ZBE)&(5<8`TS74zq|I(KkN59oZEEc_w8ABBnC9B=F!0NiqqtG^}c(v z#X#i;BELX#P-CEHLp(#zsno~L*!p-MI10EAe5klMo8_2jqqvGx_}>+KO(!uuvT#VB zcj0dC-u8HfHFwXpOent*aO~TK>-LOJTN68OpW~Bu+H>*Pj0@^pWE-vS@dhtvJ>Mpv-xx1*I!qPm1XW+7=3!;u4A7U*-rWS@lWIW`uxp}?hhs@9H~68 zjeP@Pn>TPWgo|M{uKE3KIi$o@_E`q zH{L~U^}6Ni$v9D9!bt{JLGaM^3{X?xOoS$+w*k`5g zpJxKEmj8TUVXMMCWw!gtUs9`X`OY)BeM@=oLa)9`1D&vw7t8+k))<<-;Xl5xeue6@ zgEASrKW@~`Q3-LNqCe8B8L0Y#P_ zE6cNjHX7E&Nx#1B+xBQ?*FE0%8Ha7Pt?e$)OxJr^wWinv8Sht zJ_}M!>}}@HW$}1$Lx7|7s`{>7PZZVGMXRUYT3>x>bJ*SfJ`aZLFZ)jjpI;@E=eu5L zr`eRe6^|p&ixqmOpPwj{d%c1G*aDH`e}uLr-&c~qA&}cpCZzG=o>*v?$l4P}?fw7g zWTf9-eO&d?&ApH0-~H@Y@4MB(;*qO+==uBj+q(DicR%9NoPY7A=F`jPY{O4|Xv*(e z_@`P_+V3Gd)3zNgR(xCUe@!IQukwz2;e+gW~ak3_T4hr9Ro`b8P<7W3w0-Ewrw z|HcQ!?dQdn8JQZ^$OSWf{8;~^=TY$+xpgO=y;<0w-ERM)`)ciqf9JMG##@NL29@2Q z^)9USmZ8>>%8;yxN=itxNH7|hU7MKi$mBl7Vew^#JH87q^&DY#P}Q1qdP>Opj@xya z&$*>VzPP=C=CN2W+?7=Wk!86Qi+BQS<-CM|W?jB`;iYeZ|v& zlUJ2@9LuV|_w@Nz8^#Z2)hpFIW*J=FXOzCI!tvvGySHy8=1yl0T7SmIv9|pE)qN!a zw|AFi-;VX2xc=hL?9cfKy~4!PR?J~!Y``Wb=X`^&Oe4t!$_ zJv=$#?orOysaacY6!_Pqy_!-G{C%$RuLX0C=f3%TKGyrTZ|?WsKgv(Oo#YsLezL<= zecN9v~X@xW2KNw$d=4~-C5@v{}h)U z3aMq=BYlncy@VUnmMtsZFZ&vGE_T7vLSAKN0bYiuA+nXKjgR{sR=kpb^I1ykN5H?w z=3KQG#BUpv{rvQ_0JJK?fk{O`aK+!%cCS(wy1`y{Pzy7w);KZ&S!pj)Oy8#`tes(lh;}O z&e8n;>$&~(O)@zLCGKS1);(o*@kr;R$u=hs-TA0=Zr9Cid}n5^w{w)(FL5aO_afyV z0#WY|e>nX3*Mv9cbL`ga*9ehU{2Hco#=i6Rx0awAVodL)zeUPMv+wDzz4q~r=WbP- zGk?8zo2*n45>%^rZ)dA!d~?UTD)yRb&-GW`lDe`%_5sW7LyZ?+Y0E__E3dOI%xs=$ zGWozn#e!=y(@z~)9k$l$1@EC;#&ec@5BYOBp1X6#Z*h(fFSq}2QEWXVfL&R>=-*!? z2OhbHbbFAt$Hf6LU9VWI$U z);pWf&V^ZvOOhAPNS|$fGUVl%ok5Fa)s}qD+PCuIzPY#T3sWVdDjK8uSgJDG&lSqw zTIe5p_sXX$UjKd08T!ncZvJsy#eV}yrJNb^`#O|P{Nh`1+THxY&u_MyuKjwmJMKey zn77yTNRjFFyy^yjaihi+U_@;)Md=Jtnq z9%eUGb}Hn>&Rpp!c5#}~<{La4*bhsoXP>$Jq<6PjX2`KEKR+)?eq~epZ;|4bi3dCc zIYR$!*3IH5UM%}-!TW?%<52nJhnIbx#_y}Kyz~0hRPFF(}2A}bHmiN zyWHhhm8~dS+-LjshIoJ3S?37mSGFPrTb%D-S$*)=U-iE0uVZ&=m8@R*eb%k6#h<%s zE>3TKRb=OVar1$;*;icH4`ieY&c3kpmtCm#J?UD>zW<-!&*T2O;`Zl#SBe;8KCJ(* zC;az;|NkXciD|R{OcZBGowU-w|0&0bXw7e5zi0L}ty%0`<5jI2b)fG|@v&1TXB7i( zB@41z6zK=tO)V&BbmD({uRPabi*sJ&jw7>|Hrd_So)yyhKX==&D1jo$IzfU)wEEz<2Ot%eu&0TW^cD+E0CX`AXhIvjVNRYx-6yEO+v} zp7Oo+`>NY3&rkT&wg106kN3LY_Wy5Rk5p`2?8@-_&&2skd-ShVulV_*`R>+>;6V{oX=1Fe3PkHS0DX(Bsce0Lcsj3p=WdMU(1`;q;zTr|5WQQKBs4W zt-CK3+Pv^xHLFeevE8c679`bh&b*PRp=F*YlAV_9EovVfv~lm3r|XVB3O3ZMm{wqA zv%8;V!``p17kN8cIF9eGy0-r26G26VZL-!!ct1a~TWK47;-L16wWoM?GTi&fze?e{ z3q!)*1s6`o-cjx1DNw6^U*hnYE#>z&>+GPJMxLjF)^CeFtbKdN{V8ACwCe5D?(T_u z_VJ0K*wWX3&#phJKDV-Iis$O5QX4i_p+2&rqw{?rl z^_X7Xbti-kig#K3C_f(^@Nc3#WA2lk2RhmF5-iSb)t+tIrFL`ERny5SyIu7%y2FJm zk|5K9g~}^Fma{HrayZ+*i$8wL#rJO#W$Sw1^wt>m{r>0JqzVf65KaT81*e)!v2+V0 zHiH@;kafC;l>@fyzyBrHUQmf~!}FWvA|Y(z8EyYRJ#(07bK_op%FOc5t&uO9e=f{o zU&i8PpA)%Vb4wb>{+Bu-hl}?sS?A0UU;6T7hL_}RuYkUVv!Y9yiu2-Ebrt^63wW2U zwvFxERk5!J+k_bfJR5#K`hDR3RMBpghPO+(OZ@+^{{QygK-IqDvGkU{a;GQFsq6g< zx7EIz`csCX?B3tTK5oObJc_|Zig0)G{l1%C>; zaymTauWwHZl|QwA`)wJc{5kT9HR8_&e#Ct=zkXuE>woXtmpo}@=~H3+pFi&|%R~m( z?>a&My8m?LoSv?)Z*&mWy+fs*3`@%l|y>`m_@NMtCSN6JjNl!}n z*FAl%_P2bt{W??C|5w0>9>;o2i{VLBzo4 zUwAqH8S&i39F`3;<+DA-jJ@yu_*VaW)B9b|cb=d4>sqjXX!J79f0G=!H}P*5w7I8k zck{9TiucK4oBq#``#Sww=yrybX*=|{K0mW9)56~A>*m<%629`Ig*88H7V7hLmhXGf zeLP}E&9>U*pC`?~GU?M#Ga=Snn^TL$7HA*b#xP$&;Pd0Z%`Ppf)><1jnceaV__F86 z-%Xd=|J|OOJ&EC#7{~k$fzJc3sh+2+dG_9_KeINo@Etv(QOa5{U(l#>r_ruhF8U$H1){lcu@ zM{<`jw6C(i^6`~n)vq}>f0dT@FSNbtQkQY~DXO zvM2q5zZwdCFV4N9J3-<0vXj4rRDLv1>fh*ib5q&cZ8^SdhSO)8b%jVq?6HuL3|;tW zwxw<2s%szgciYZ3PWvo2bGoPmcbRV=vx|zu!-p#%13)rusTg z@=bqzGsCu$vF`HM&EJ0>_F>~txhlP(Yz;?DqWQ7H#UG1#+^6;*m&>cZxhb{X`lw>R zeblM{7k8akZ0=y=Q_WKP`N8y}hM8vq3uny-XaAGw#Sfbw{=YNdXWiRVi~jHY&m{g= z-#pyEw5<1!`j7Qnr5J%dQEsNcGW52!O{ClQ%FL7_Z|NVKG#{ZjDwne>0KG9SvU*_WeMw`6}nS+NC$wncn_=zJBBTV$nOtt}guJ{PBEMmT3GJ z>-Zl_il6UHYm(u<)S>r)vuvMrM?=HgBY%G{jjH=%sL8(EZ=%s>OSV;l43Vy%nU{P^ zt$DUs?aS$(Zvw5w4CX5ywb`A!-rml5SGJ^$!xQzOEJ;RQ-FEmf11i7cVZXa@Co0H8VFjvfeyXDW+CZyO>>U zh1Z&0Tg#=3mYP)i_3HaEHwdn>zqO8~_=}OwoJb~%5R zsQFPmzxeEv_3QRUdF^lCU+-}H-LDyG|Ihz26*};|a>E+#ms3vOGv8eK*XCOD-@nZV z(=T0ryV*F|LD@NOYt;4pg!NAYPdvYIb+x)+giqIf35(133Qt|hayfBe%l(tF`#&v+e7`li0$FzL5~t!`MKP-Dc(_-#2iH@ufQZ}^7O0@8(W;COJJ?-8i^i#pr@ zn!!5^s`T5$r>}QoI?LhETc31MsqphehKCChH72E|OwAXwO?ai77r5L>{EmLuzx}o= zylS=8PM&5@KR@l-d!Lu`CZb>7)mA;Lk)HDGPIlAE9c#<({dL`T{{Q~m`M7XQdqxzpWa;l z|AX@W=|8LLmi@k2zjCv>{dS`cM~}FSZS8ApPM_M8`a1va%J+}YESzzHFHCuITh+|1YI0Z$yPJdpTp4-yDI2?3c#BmCrl+nmBq`&u4ud z|KWE-waF<)fn^LQ(q5eu>zL>9|CyBJyqlQ}JuD1oHwMd{e)IqELJ!k=i!Cp_L4zC0 z-U`1~C#R@C&jIBf)EO=n2d3lfjCG6!HEWpXH(}|s_h~TZFZ_AFWR0bP`zT%Ly|K7#_W8cECcQGFW z3u_J?9AezK+xBzkPZ%~@aEX^-(RVAa^4e`m9Lle zsaW2ux|i_!rR?WZJHz?vee>f#8qQ40@6LPw;~4)JNwYI+&)KAJ&x^14r@AZm*{35y zzjLpvbb8J(5I8LM;`yRWi%xPS9t)gtY1>!5#CZvS_tuAe^ki84m|?Re_v(53P3yjS zhx`hintru&>qdu!EiM20S+6aADLYL+-fouM^z&X!Dg{$G9^}7XTw;B%4NEk6JctnJ zP+5@tkzna!%6b^Clp|80KuTCh0(=R~!h*V{KfkE>i;FB5;z zGJkr^ieI>tH>{pyZ#B~elMDNb7!-kWQa93 zjeZ^!x}y4ewn*E2=8GIVO}U-s>f)n^vj>mM&fZTx$A@^p{N%EjmR$c$S&^$#faN?U=%6CUVbdfuM7x%EAMyx@7uf|-RpOq5-qjw*N@fO=6Uz-RlDfv2V1#U zZQB!eZ$seii2Zv+pL2V>nPIiTMUTPU;PyI8`5Ke9wT@|@!q}3hckWC1I~YY-x{cOT_WlM!kL$(pI{6)$a_xzGZWK{}P`XJFW?*?rKd- zWx6QQd~4l}i!~?rB&`3p?5mOfuUAEk3PDbLz63?BdHnb>!{(petK*{0Gygsb-V(Dr z>{OTR{RpmSYZWFfx0+=tq|g}X_F%%4|NQaBr|wPa_hwQl*um1YKa8(js}IYpFr$zK zXpZzjMXaQqIHyb^lknqUhHWc$z09*-viE<5U9jNhd9Nx;j;e0@_kCTAYOFxk-uMM7 zhuiWs-)CN~U-$0js#E{JMuy6+3o$YOGxNsr-h(?By>1*9s_hVSxc&10Tm6=YpY!7# z{U`1DSQ@q8NAyY9?fie|r|XOVp8YS-`?`m}Rd9~F|Ft=+GyHmfF5SMG`)W$l%5C=q zLfM{&UcREN#c+|y!csv>>1@fed3pv1MJipGt~?Pra3CX=@5U_quj2bf`tQ%Lld_rY zxO!^ftPs?v?!A|ILHyOisOs-#+ggxA4L#6ECvXeymz3yX$b9VZ`MO z+tiM=FX!+3t&{ohbNW7or~LlcYxwo&{aW(s%xAG|SwV&ujhFTX-j6+VV!J_rwCV$8 zMuTfp8?)qRb-&77R%kbKE}OxIi1{l^`rV>bp3iyRzVsW9MlCyNx#)4*M(4nP@1vIf zm$gfOI`{bB-ya!08(7??G5p&mcQevb8Z^29Y1tvj1BI>)f(*y67JW$ccyL1aL-qec z?Kg(=?fIwe+LU9-*tW=SS#jySoc1*9@286Fv^V{mp1a>NZ_2HE|MPFx)u*>N{W-yN z*ZTkOyVXbkvTj@dch2{H;)h>Z=OV`cKN@4tByhI|3zSALKk; zyX*b^tJn(~*f4tyXQ@Y~U>{l@xYu_x-yZ>&P$F)C?#Dm%d861>l52kKd^S-7w z-Zbb*_5Q#4A7>=j*=?@B82497<7dMT**mWnWJj5Z@%NebUcY=cKYP}VS!Hi7)`)+v z|Fyd4yY;_s`hSDxJkJh`+_2-CQA0%MojtzKJ)h|Z&DWLAuI2ybG_m^5oWiE4H{~45 z8EYQ3)qk27zV~NQeEHP0<&0M>HaRk>6!>t+biH~nSMv1K)K7b6x+<@=`7M*FA6+_q z%AN@foISOmk+k30XUwrJ#&c1XYy!3VKC{Se-Fq+YPs<_huac+oJr32dJwGFsy+WZq zFX;H6GA@Tpx75-!POsaTe>Q4k>ariozw47$mF?WWs_W71llO00zSUoo(f0qeT>hu? zVsU(`A+bAG$9Cnc<1U+WPHgo7^Lvlhcz&v~b&r)UYc1kQHu)x6v2ag))c5a4U#C~g zPyO^{W$+T05;iZxM@bVIGR(B4pD`Vn^}M-Ii9yNKAbwZI#*odvja4H!1CvI?JI<5*z_zQo@PuD-vuEZ#0@rtF%-n0ML z-b!bz!#s;!8sZsbR4?q|#gZdryqN-Z9&W4=xi_1|<3WbN3<25y(<34b`u=gxUzp?0 z{7a=l_v`A=cYk(& z&(9TVeDd-ZT0K9avHv|4|6 z#A&zW&-eb#{_)_F=eMH6Z*RQ&GpTk1+l@_)+dg;J8?a?dtzZ7R|M>P7+otq>Upx6`-Org> zL3^Lr$1N{EVA$}$CVk({uP5v?6@JPe`gv9P{FR6uk}P|pl=keu7Inuean-HsH`R4+ zgf+D^ysy4I`zZTy#v*SAL$4^$2N}W^K@0!aRUi2D^y~UB53^t8ZUJS6D$qWe#s5-& zfZEuYE$gE!ub%EnvX254WR{Ixnyq`gO)PJ=_*U`A#GPLK=Ul?cdy|CtmNkb@7CL!P z=xv_IV=O4V9<)(WazQzV*7vfEO*@|3tUCVxt1`Dt$fE<-!xyqG z?g@>3-mxTKg5{|AzC`;e$v4=(z1HYyyc?Muza{_IwmwIuZF@@Rxf;&-75#Si!$4oQ zik~9BY!Y1eFLc(b9JsaBD1OZ+>*T{v>H`+uHZff6)8M^$eWRh9+P3qK3nZ+IPYT^; z+`jqY&Fb=u66Z^+{?E*;jCo$Msd&?T=FYvbi%oge-DF>fY+;)rQTySjRif{OvVXnT zwww^(mf@>keN_7Cxy{$Ji`=jO*j<)eX10b1TTc+t53A-kD>3I&o|EUH!<#chd3H`@Z0HlChQUTko7aL=ArVs zKjzib`RhEYB{?tj2>td*xFVSGW%>OT)q-{gSaQS!hh(N6hKw_9wkih8I2;_lS~4tf zd9-5x&(D8;|H@#fam~n5{`Px$@w1BfD~}&Pd2r$Pg~Kb&t15^g~v5)KduM@A< z?^3e-xU*j6Y0pycC3iNat(~$}yt~Cgj`s=6jV*C^3tARr-+ZrhEc{yTg)GN9zLw+^ z3FF}U{ZVxvwPl-Q81inZzkDzGEY*`qB|z2S-IV{YR%iE4WH1!m=9v&8yyExmqLBT( z^7F7XXgwB8U{Ge@+IYc(DY>6v%71ko_5(-G&d!dzwEEvUuA>`{DU09o{pqga;9I`N zVb-ijzGqFJ{>ujc%T2Ge<6Uz9RnPf3R?$*_`)|h;m0aB&b~SOu*0;;9I3MK|jo0{i z<2+yK*G=7D_yQ_pv+L*Ivhvxx|BX{_a@>@2T^(HZ_vA#rU!GXBxAv%ebJ(PkZL5lE z@|V5(p*chQJJaHWvji)dB_B0&G~8g#eZuC^B*PH*bGrw_9Hxej-YbhtQ~2h{JapDI z*gVbEdy>TcrP0+#GoP(g_o{qw@0BJ)-Lwj(f}>Sd$KA5I_C@$VzYVS$z)|tw`ejS; z^)KJfzw|X{ruAvdlm0Io?`IuVVwiBgewiy%4!<(vhkqS48!Q8+l)ZB@)jzw^)n0Px zQSPPd4cHrM-3)Y<7}=&}m^gWtZ=e6&y4r;QXz{xphi^af()VWs^fWD72;(pp6%F{x^M zHA4hfL@9hjT!KBIb<`{69bb?fA0Uroz)ln-20@EFRE3}NdK76p6YY^wCTx5Kf~vR zTDY$@jPk$Uxz#1odV%BWgR_!s?`qi8>;VP({S0gNYa%SslV8oskB+x3y2yK!f71Wf zXod^Vx9c6)kh%BDp$-4LWS@%PI+A%{+Z>ktyKlz$3e5QPO>S;s*xPL^chq!dzR+KC z(27$gl8NW9{iYgAYt9J{hK&#Z_(s|=uf-bH$88xo#E<`N{sih2@bw?Cv;Mcf_%Pet z6O$&Xo}I)HC1j}bw_BOVd4)?4?@dFye*{HybtukVq{S@n5o*_HXyoh*gFePiEls5e^p=P`%n^X@10zjZnj zmWU|_&MDq|xR0?VuI8!#|JySs_s1>Lstk2q|7^2x`=3quFN0Q=-4e{ptT)X}ytc}? z>ZyD)*Qry_e3N`{-^#8&xbsDYDDcj?-j~ZtFHJpT;pp`sEZKAyOD<@?qI)~T)c=bQ&n#DD6w*)=_;)w# zjiWZUTJpdO(7^(M`&()lg(TD%S1g{GRB^(R!E2kh?bY|f-);YN*iG1ac=_jx4AYny zYEQ5>Y}5X~()syL88?p=7G1pGW(oP39(&en(aso>WX^Tj_0;<5>zw0driMRXy?y`b zkoxOcTlfCIHCaWz=3Hjb-s{(%O?fc$14nNWqr=zZG3(ZxW)vusYphzKlmGYX`loy= zUHfhBt;_!~Io?j;8+V+L4MW_zhqDeTN*GVcI^ch2qu-2m1-)-{A5>5HTJkx`_jZo0 z_CMyyD%0cs=dFng|)2vjjv7&q^XosR-;hMcvXa5jET zv(ys?4`#pA)$(0NlD3kwRUDXjAAu|2*xjq#_d>$mdf*@3br7#lnqmOKz?sCZxh-kJaOl$B2fJvO}x zULv|%JEZVV4ad`2bAKOs{nYcXCx2bVo@L6r=DpKfz}EHe+*Pl;v&_ErUKe@&^ZiLP z`}^^B*}K;7=9-tlu)o}N@8JxED2AoHYjZBl;qy!>znj@C!w~Sdy|8@OBnD0yRVMb} zul(2Qr^rp-4%#o=3L4z!67TKDwr%UMYJm1#-g1+_pw_Q!qxu_@hE5CK1vjN{*gejf ztu_0fNyFN!Xa2wR2`$?!8yanqnz~?>%Jf}g-r}FW*Ng9D*f8HxqT=iJ{mN_g?LPNr z?frQ>>euI6Yu~QG`O46mmEp6~SNGdf<9_n@wgSQf z7AiSpe!utP;Op7{L>SIQzkj5A^?p!3c(6}HSfXo{y~zBZ9I&y4Mo%(s< ze_LC#ZNKg&ZaeGrf3@1zjVeV~S?bTN@msr1RNA(8zu!cn``Ol(sZyj3j#ipiavuf9A+ea!5nXCLC3!C05EH#SkX8V@z!S>>P!&%0A z4-UV*Sp3+Q-|Kny_^|{__Uo2w$zhCIRCi1%SS4-=^yZio6og20PjL(mp z$HlkbeCM~Dp_?&%TlS+9OIT++KM09`ByphRblb0UcMfg%@1$cg=|G^m!ITaE7XFa= z%Kn@el&n-6KfFH^_>-w7152nXG&Tz-upBrjd9j)0m`G#oG?op*o(zRLkqdtCotv-z zKIUFh*M7|jc0vi+Uw3RS3Hz+l@KmVe-5-rDb-s1wpHEq*{_~zbSNo~@yZ>{i_`kiX z{5WRu?#<3QzxRLh)U=-WB}Q}d^eC4Dx#bzw`|tf*+3zLGwf4P*lc-8F_xtkWT(xW( z_a_U5-j81Urd#O$PWRof{@71Yzmw_7P*@N%(a5^;u2rpcG`GrsZsC6qf9zkB{J*4N za`xo)&B5!#l;swlw0U79Q2s4P{PaHk{ZXep6}EHz z7n`!~^0xm}^jyt;vwqF`DZy{PXTNXjz18T^5O9$FzVGX+>Hm~;b(!3y%W_LZk_A*5 z{=1#B{}lT^%^YreOCUpSn!J7eFwseb7ZUmW7+ z-vAwSPmZ^=;+W+x@1@Q`x!JBseQy>w2Ad^oq^1C(YS<_1)|3E0=t@ z$S{%r+rQ(#|J_ws<9REqMv$}VguwHZ`7?u7o$p-y&q(9?IrU$f(i0p%|IAn<$W#Am zb^D&@oBstYW}1}Ydr*AO--bOx-xtdM;#uBToglX+bI-iIb8gvHQLEQI7XO#sz5nYJ z?OjXyrrI9-6!#`-b671~Q|PfOM^LBbi}h1=`7G9pY`k^PKj!3F{rPQhW#vnECY6F0 zENzQk@gIGDVSa-$=r|JN#t-}dKc2~q{U8Yw&>GB_PoJKi=rHxb-(|Pv2buEjY}@<) zD&qzB&r9AHKkKl(owuCPLC!2)g$55zBMLi-mA$> zwa)2nvJ2tf{C{z=#nRey3-XnP9-O;9Z$hMAP4l|tCf8Q$Mt=0oOacv+&F#I$^t!d~ zx%6$Rt%oZgo91qrm&bEWM0?*qr?WFZZp^lSxa(>9tf{>FQ~9s+cG)X22o!F->nEha zD*0dfDZ_@}S4BE>4zlO8yDq%($6&XixZhkQ=l!9^jMAVcxc7r~p{xIhNG>Ycvvix& z)&0}hLFbOSw>cc%@7s6gtp)bR&PIg^*XCWU)scJnV`sYQ<(@R$Yh)3>n17y`_whe< zg{Dji*Oy&=WSYA>b#ML6pH{D$$~`Kp7iGVd`Z#OV;@wHAtEU|^wMj4Kx%Q=D?xhR& zQheEkdb59AcTv{#vw!@vXmz#yclMxvr#FZFh~8a)=kEEuH$ShZO;Y$>zv9(m{)r6V ztV3??l(xNk=}NVP)@!qjtq;EIy}h{aOp&>Y7~_Q`b+3>nLvjC0=bvx?_cY$n)LTfQ zF;ReH>c4^;2Se(gSKDa(KRsQaUw-$Fe-E>}-fo$6;2;Nh8Bgq;dY8lhciLCS+@9+C zzxe+}yBl{fApxJ3jsY9JcU5{*+a%*p?+KG#a{tb}Q{veaa2m5XgX9 z1v}U>_NK4hei^();42H;myF#i9J1d$846_-Cds%iJe6mp!gweDIAdM;z$u z-{t0HykB_KdTD-p>&)%?wVSp)ulqQ;j%VLV8~e&xH%&sUH+O8 znaxk?9X0C3uH22NzcN32$NX)_jx()tmQ#^G`|!<;zKdUe*!v{BIk;0)@xR8y>Ch|pADQRpS66x$U+vmPF^seUrdp+Y2W2aZiJkKI!r~mN_=5O9!^HKhY-P26a z25)|?2+#K239EUx>Eyil7JKrL-pc7^@274u3f}Jh<4FIHxvTnCTsv@8=jF1}ueB>@ zrp;L(dYef=t@nswgEJTNx_gbLLK4$irs+n9eZS|-`L&;2mVe>@kH#B)nN$qEabEe` zYxFICX1)iOvDU}^4jK_X`?o)ro_xSUZA1Pyy65;r_YV%bK?7$7$3~-|H}WxnpO|{nzp9lRv#y&);+LdhF9Z zt4#{;U0FFd>3-27tpn=}U$6HUiGJpqi;btE6mo-9Ap*7KjrMdn-k=DZQS z9X5nP$3ep8Kw+x>vU^%nYAe zFZ0t}k}KEZqroeWf76|0w;kzs4L)-Gzv54Mq5nG#@2~!H`U1Pyt6g_L9uoJee*OAi z#HlCWthbbecMD1OEMmT7DJ414ceNXXO4$5gb55uJ`I=w5cFK8=FBK<@&+qoQRkYJt zm}y>epq$4C4)zuQGInpWjk>&Jtz99D>)KEASp^xE@AH`YZ~LF6a^KmX%HLnIxa4zQ z{N`(-|BTo7{@IneH_Z3z^tPJ|{!B0UBd?UZp>L=0q<>T2l%H_te6hyUtbXIwPtp0E zb=%8drr+!5RN|huJ*2+v(c9LXE7M@p`rq!k5?|JoV=Su%#eUJ1NP0!oP zYre84{ad{~PUq>r_x}RC$}2yvHnmdtx$D+BKfg))cE4HS@Fcy!%_XbD`QcG}-?|_2 zucDH6|Jhd~_Wko(<5hy(^Z)n1@5((DQ|n&S_Q7{o_}{tWYFd%3TK}4k8o6&;7=8Lr z)UDq$t`)|}PpN+&xYhyGT$#~-xboo(d&$Q14Uhk?+MMyW`F!0rb4B(BbCD3QiuNYE zSsn>GLKffme15W(FSWj2kYDS+Yerefw?eO#aM26z$p7GZf?|Uf|>OI$Rv(EdMJa^^!uT~b! z`_*E}a4AE+=6zDApWt$a!pmo^Ej+)!pRV=G|JJeZ@vqLD++Y7Gf9anC3*Ox=>y;J? zeQ|&4AGcoy=O15Mwby5pn#rTfIsQMNxa_x%4Gv4ayL0cO+IrP{!Sk17RsPD-unJ$^2+&nGk-)2 z|5cf?xc1+1q`Rj}~XTK*KX4djGoKpKex8<}#QcBU4A2N~O{!fel z!rjMWB6`GW?)bC^l=D=3_f`r_X@VjX@^y zz?^w3edbJ|cLV3=#D`B0v2s2t`;)=vXiqU?Ncp4Z&c41bDh=nNYL4D3xu5NoUTLhv zz3RSaT=ns{kIIf-4fnP@IPd*N4WR?2kLG%9yI(bHuE>XU`JWvo2Hzo?kgDJ>ffNRo$ ze+xgc`_-+t5Bam;eCXa&^0yv#Z{4^r;4Az6oNRv!qnEWW5;K>tU6rugE%sZz^}@sh z_v#ar9?4Hi`ENW=@p1j6c^MCSZ@uf8f4_7b!GyipXc75I4t%>`u zsM{=DCVlB`Q0B}f7bS(Kh4|-Nd}zGxb>DuEgMapntlz)CuIZQ~d{6oNq2z(*dt{{`+d z*jjslf-W_sWPJN&$T#=zj-n|KO?Arru#z; z&r~Ch)n&OVj5_%%+t$T@oprq)a!7XUnoB%uaEO$@xz%0_S?L6lm%|Ge?L8Z!jJPeUu|Q) zv5lwYpYoggKMzfFd)=)3|J&M)28GXa>{Wl;q|97*C0F;?-Vb}vuapz~9>08!(!FM3 zwS*bdew_IdzCA+aat^n{YPrSjF7^L@?62frT^y2gxaI8T+PhURor4anN}l91bNT$$ zCKo@=_5V4gB>nW6*Y)l94zG`na-Kg!;C`R-o%pmZ7k<9=Sdj5X=uITYwuppkXVWkD z>x55P6|YQ>{;C+Q8>yU^Woz+@-~GR(@v9e~k29Rxt}7OubGo(oUfOYoTknh0=66r` zT_v~h<((hSOezLNEE2!$i*zi7IVT*Ls3`DvXJJa-A#AfV4J>`Spd1(dZ;v&nj4_i1 z--e#Yrw*xaeEed8-Y=DgfER^6Go_PPJqnn_(6(J;75}-=Qu8;>QFfBYU)=nxq;%lt zu|P)9Vy$2WCI&&qa~#rFsxPNbeqLIBT0-UhUYG?U=cWFwvY9npKI!yf6Hw`@5tNu_WvvHoj<>3 zlV9U`*A*qZ=LuX$p5=4Vok_tlPUu+JixSSh$w!`NZeDraLag9yRI$&bm)>IDd#Ah- z{_Y;Aa<6cP=pOrPA~9NK`@?^KuJqr)(rD@~x$8IYm)Eh|^RHftHC$-BzP%+wXwB3f z1_z!?nXj(YrMs2%P0gJ1N5AJ^!+O_fL`mb}d ze4JZ%fA9Bcr_L<(&f=}iK45p*`DdGSm%ZA`d$;rCY!2(4c4v&AfBgZcZN7o4N<;CA z6|3e;E%w^|cXQwQCH#UXYMZNn?7S-?ZRROFkzrln%`L7u|C%3~2^#hCvZtRv-iu}Kv4O>{0W>wqptM|} z@uEkYgE!|I7d{@)>f1)}-xV547+KuwJ?pMPf zm9Ngu=QTRwe%N{5I_+HJRLf7rz8e2;{N~?y^2?v z_Ir8ls(HJs4;{bS{x|uQ`Ms?gpZ_ar{x{SA_OH6|wynaHm;dMQEpMFuWYz21>-Q!z zD7vvK<@02nVC2_#J;>3b(ylDiSI5Wo>*J%}rC(nN?u^sF^Z4sAfv-O-+}GzjI>re( z$T@N{I~vbyVR$Ghq|~4CY1T;}qnRhqsLY&cTm9|c-R=KkzrOzW{Z{DJt9P&7y}Eb* z*Pmbh{l8xS_j=U-U+Y%QjO$-@uIcaUbom`=3Zr*RFFn?iaMgHpG_ja4-hs;{L zt^M+Tz1)W`W&ilAE7bRHSrhtCr7~-m^`fbNcR5A)mb>Y!U$%eSh1&AAsXDg;g^N97 zc5D9+JJ(n7^#0YSc`vV+|2}=HUY<`#V1>_t^?$b-w!ZHlKO&;+F2jqpG(htG~_Ix;^!F?)GW^G5YC-3?s@;;lwy7^c>bK+{qNISK3ufUd%Yy@WZl2_ zv*!QtoPPUp%CUDo8|4@;aKG7f+-_Q*%>~`tbw{o*-&M2qY5dD|>3vG_Q$Ol8Z~OJz zorUe^ud3u&!xQf=uL{4OIc@tAcV<7|_$3*xx2tSaCZ9gO`MB$o*Y&^kSNq%l7GJdX zf9>smrSoodF3>vy!$s?fkgo&GNf${V*V=Gv(wU^2+urAeC$Gx8J$v1@?Q;Kr^f_w3 zS*xCRPxnFYY%Qt78&;mJU~j%U_btPVe{bgA5@uiO`)bePsr7%4+&?_OsO)-mrsi!= zLEpEpR2yQCyZn5$SnjH4-G`<6FHc-GKKH^y*C2c2?&K@-YeVKw+^13SvvF}|Uw8G- zeaf=YuQ%SG^6c$y?Ww;q_p94l`rf{8TfSu1_L-{L>SxdVdv;UD`+8^jHP4FZiR*5J z_U~s~+w;jc{&d(!e%VbS5kWqYH@}^Hv$SE_&RuEshc~@r-n+&>;cL->Bg;$uzisZn zxcAcbPxn{q{uGX7zx!IbJ2i55h){UgKUQ8&XcBGUaETXAb#p>V$KWKr!Gq-nqru*L zS9YEM617B?qsQaHoe6R4_;r@sUoL;s>Hp@+mN{z!=1u#{Gf&c7?(>U%VN>4O9bO-L z>B#EZ{9TuB#{N9-we9`R<%@M~&2A?qXzu^?>hedfwNFnj3%yYNZMNx)$XBULKj(Dm zN1NU|QN}-Gb(#5$JoobH&2_&5Qgws1ze+C7o89Gmsb=%y+6N6+Lef&F%T4;%5>uZx zE9z!xwtM8MA8YQERiA%5rNpoN<+;1Ev(qZgS+ET_9xxg@=5+J&x@8xSG70lR{I~Hdh_$YwClyEs=mcv?>VKQxIu$O zZ`X@O=T^oPpEd0+@|wdADq1=PPyFpO-*|0Bg+XJP_3dP<8>0MZ1&lz0LnzZ5h812} zRdqfLKK-V;yb2$_-mGRc+beuveO^|nQFP)sBzm<9X&bhF+ z)8&58(3!j0dqKG4tI2N-0<7=8Q4DJrtzVwA#pw3*bUv%{%U9b@Y2;R3T=+SB&Rgc2 zv+snum8v}5@@T!5pY`wCRfOb=oGUYX4ok>P|(z*OyMhT}S2tgO%VkhK$1M8ZI)=@!17f|N zd;aX${By8aS8qSP+`VAAtk?am7fe(BE)V^`&NeXO=Xa9};++j)|HNO;u@DCZ z-ek1{d<~w$%j!TJaJq(-+78Sd8<-a`&UN4bmCk#G9|Yf=tut@hUf~0e>{O#)UiH?K zdlnvk)^YXBW#Y0oiyv1l+x2+coOSK5_A;(=U;TWa*4icBr10d2`p($3JTR zxK?hwtJR%zcgNKU=fyX_ku3VF^5@jrm!JPcJ@xPY_TPBz)cUpWR##2_J5RA@$=rXN zn(zJCpLz8@m#g;wt>?L3?=il4S1=*>_->{rtIeO!?(f@sQIB!$jnnJ4{5-vEQ|OXY zI_WIm-oKs_Wp^h!Gk@;S6I;{_PnR9ik@uhf{(bVwa^Vx(r`}Vndi?*A-S*86A6Mp{ zJaccK`EA9dm+td5-}l*kT~}g$=oY)(1<&|7C+*aQ1R?^M-Y`U5=zF?FfuXTeXvN>% z_goe)Ey4&Y1{OD^11twTZfLMTiw$^{Con^w>0{r;pI!4Z6d4*<3U$b{zA)Lh?V8|u zi?3Ju{v3)-FMU#8|L(Kw&W}6p`Tx$nJ^vq1g8JcqIVDT=*ZdlJYMb5brwxkL zE(h*Z-G2M~_2l*UzpX#c9J2TP>l=&SUjKCZ^yku*^LCtl$Ng`UxYo0)i^czDzW#qI z_a^thGnT)@t1eIbuXAo+{So6j`Mr;~`5FJ8v$w!6#LvEDMe=t0<8ohDtjp`F`PIWL zwAT7^?wix;srqNMKlg9{9Xodgbx;|8}f;eX=J#|G0D1Gm)F6=R7(0etCcT=Bs~?=YKroXM6v* z_Wnx~?SD;ZFM0jfF8o~2TK4{BmF}13zm2ZDB)n^1)XV7$cRyM$F=e91&$8Mn(|`U7 zE%~dmpp5Co(uRBPN6kIoYMdzJ*4Zsuv-Vc`>x-q+g!8w@UAK>oUR3hB;Fxb=dgWT% zm#g*^`)YZtf4j8e>HY<_+PAOme6h57-Jx#zj~#xm9@+mkPIqmEhu2k5&XrQ%gV`J? z_HB@5D85_E!rypP_(EQT{l(9Jer0ay?e#10zW;Sj-h}ff?{N#r{e985wpO9mE=v1R z-PQWk@Lw|3o8)Fq^$*|YZ~Z&kI&Hf7z`5KV7r-Y1p$_Yahf<{Cj17#O&*zVBrs=ghvf(P!(|j(m^W&HD>;(ysZj zKFuuMA8pWn{L($^-8W@blQOrxJOAh9UG_-Z)A2u&mY;AvUsvY-i5=cl?eT7qWq2&K z#0J)Ig%^wod>lD(VzZkUa0)UBWXLtf=VxbH^}Y>$TXOUtulc|fUII&C>EYU|XJ zpLb)KQs2uK{9Cr_ZPxkk>FP_jsYbti$GJM+vfBSZ(YBzyUzVuPvV7tD-+brxpV?3U zFTY=zdECAJRu%JJ9=~@rN42e1zVmBvcE5DTxO(;bhlTgwc&V&EJ z(YL*fEyC$N=Y>;MVX@o)*;R+-&p*qRqW!A&n+Dt3Pvx)A2mU%0T^CsG8CK5jvSrr$ z@ZYy@`gLv4ot=K&ZQ7h|&SigJ^Zq}*`?9Q}b=>D!ec#W`wf^jt*bGm2&cX@o2QHjY zi&=0tZf*g02tRsp7(Ic(nqk@Hm)pKg*8R$xvEilLjx(%`d!-*NkJ%D`?jHAt z>+^rP9IyJ;S+ei-{`CCS^)I&9d0(#%)&6^P?&V9X)|p9Vq?&48JU4G){KYA0+l+P> zy`CFctCe!j&wtWKy~cZ7|DNqxvuWLjeX+^czGeFRl`FqE`_DW5YuH86{EXDohi>vQ zx9*quvzzr&#rhj3{$=iXyv;9IzUI*5-M(I#`#;#MoVv7(JwyF~e9f1|b2rJ`R@}IH z@&EbjlO)n=FV(%7ylY<+>-%*L>6Uk6newjg**$6A&ll6#Q^Id;`kWKF@!+Bq(|GN_ zg{n*6zKrVO-nqphqrK@LdxpHtl&Yt1PW^b&|1U%R{S(iB(ghlUu##@Y#D;zO*CJFy z9Wk4k7fhIZ7);i>cOa4{tW#yc$YjH0z_=oWlab>K$DX$@|L>b!5w`8^&cA=eOLG2y zoO%AuiTS^0?|*mV{r%nRU;l1?9)IED^>-(>eOzw+aPsucOZB8b`af5F_U+#8OK0A+ zR%R+y{#%y+yY|`SRJrrFVyZ5gFBjYH8hiVDX#bL$+j?!saGYa{ok+I>`JoXd1E?AN|YlW$}N5 zetmBA-~WDJ-+S-q>Rr_~OzW#UT_MBETQ?>f)-l#T}r`HNB7rwqU$K2WaU37NwiNpIZ1$;ajS|R_mw086BZF_TP zZwjhZ*c)ce`F7F-_i5Yb#H#=5v_CDkEIvdQDYTpxeE(ZK<aY4SArhL2Id64 zU7ZSw8zNY?2rHzlK3MzythUoo|QYv}b;oBV=zGsR6e{m{;8&7>2ZddS>% z)#JNyr_Q|-nVXs)TA%s<-WE6A-LK~|c}3@KTb!^mx-iPce*N`qgU#V07uBZZt^C&b z=J~HpKddFA9!~dd{c5xS(zBRNkMeJpe(k+_6fq95O6Wzc@aiZgdn|3cXMGIT4A0h` z=8$0Oc3-etIpJ-}_a|Gl9~?9P<9oc!`&-$s*zosnmh7LiS9!tY6JbB*S3Pi;_2v)n z!rfN;CQ1r@j6b)3!Q>0;xl?AdPl{z)*?-^m!d%5tYYwCJAwNX#UlDTJ^635jP=)Dl z-$~YQuHE{;vi@}U{ICBnoa&m{TxMO8?2~hP_MK&Iw*_zAmK8f$U zF>!7Fzh`|seUZ`m$M%0unDzaIaq!H~+jmPYSncBH`t8KoNx566zwnNneJf%?)~>R( zzoHN3JpC^+ck<0UA19x$jx+yy`T4xtSA7$Y?&oLcgn2#9IeVAg!i1y$t>;brXVr8nsdez6|a?BMe8Rzz&iUERG9u%r%irzYuCmtw_kRo zz7~3L23BOl2DK8HSY|NHV7T&eRnB+0Cb{)WUe2(h1|E95SU#0aEHe%SHOEX^4=j9> z{{EcR^EtkXu{9r$%HE#;|Dk-@ldsp~?@x?>{m1v;j``w$qQ31oQ1op_L(Hw4W?!P^ z|GCU;k`w>XFA(v}^7v)(k9Uh+>&D(+e&XAbEqk`D(NBG=nalcRa^3xzxj(NfbI;!P zd-mpS$7j!z`D~QEdhP$rD~d5cv-e*M^tWF7-Qt+nw+iP!6%O|-*Uc{ti<-La&+Fyi zzbHB8J~h{WnrU4hwdu?I&qnwC-TQ@d>N9?6I4>`_=5}w||4XM%w!jMtUd0LDZC5KU z)XkBolM$Go5*hc#TMAwd!z!qNnGDtpT8j?}G6~F3W!!79F6Y{(tLv*{^E&GP{oa3n z>*{&Zo2LG(Xstc@mS@M)#FyRd(-*DW8NH=zt<|JkPj6Q}th~F;=VJF?zI1DeGs`6Q zoPATMBO9!qT=*~J>izi>%h)Ssztk_&=etw(eD2&gODjU_&(GU&jod8psLnIH%N3pZ9z6V~qA41CxLU=LY5mZAK=68Qe^d&xF~1 zzEf;I_i=g6`|o+1N_qDG=>GXl=Jm3xFOH-i?~|>aH#_X-iK!p ze(v}6H>;UnJ$rDw_x76Ix~~xJBVVNrSNG+cb=JywZ#ijkPK_6yMnGu;6l@Z68LS!H z(%n5lxsjPOW2$}rHq-NF8xFA+WxTBX{btUeQ#BVekJ&{X{9bmm>y^Zm_z=G8&m4Q+ zr0QqK1q63w{QmYfIHOe!Y+iyOXU^C6^Sf^>pCgRn)dXS2GKL(dCPpTK457xSPd`4_ ze7$0^*5u4>qQ^zHzYRZ{d|z$J>kj?(eKyg;=cY@%Qr-|6{?9ew`FTGEK}T>NaR_C4 zT)%nUEulJi#eqotXL=Zf8H}C%4`awRz7%{Q*zj_rUiQlG+zfBOWzAHsgeYoU>*WxA zfBUPS$DixU*>DL=R)mC*E6WYW0GG6|Z)MfFVZN93&^@E0$5_UolXt%;4QkF#^#!5t zcG?U2LEUqKf$0rHhJ(5Q6S`K1giD}tyv##appDfGg+|x-$ob!&KWcwDKe1+Zf#$jD z`zDQwhT!O#3W^?8cS}(8K;Q<-J1oi_mrD6-gLBqguOw}NN_0hv~^tDePzA$U< z`gM-Kvdd~6P75>~xTbo5uVL-&?{h5CU6Z58^oHSv)7-Nw!KNIzrn(^Xx~s~D4(*dx z%U$1@&z*g)RB*lTIZh^l28YX_ZeFIXlMRYPKzX#0Qy_sUfhk}mqP7RQ9#m*uFk!M` zy0Aq~QI5kQVIAk3`hP#?{wRNU$8z)M03KuRhBie5Ri@~~*E`My-hR5gWm*~}B{_o1 zeMjqQmzzN5L;Vb4RxrI`_+XN@c>C{Jxm&}3Us6$EXxyoCKxj}KsU1GGH10~o&?tUQ1unsIJ ztWfap=X3FEQCqfdU*nUQDr$7<)!g=oHzKFcEo5qPn!c#2dxwwFv_lH&Q$8;Gd~SBY z*{@;NXBKm%{te3yIlHQN`YY4b_8n}XR5h7%1M`BDd!2J&Aq=tzlyVpvXMqx&+63pY z!|PdiIC;uB&Tuy_5`C)m@%^2hn;)C`$?lt5_$p8*?7qcUjd_Ky18g2&3qJnyie&c> z1w{ic#;||x3*96^IVXBHgEhmpvj4^3&@I{E3bG?p_HN$%j3|#I%wXRM%n)V#zpg24 z^;OQtlf3n2hFbJyOrQGSt%TVTj{r7u< zG1wQ3966j!r%%7!b<|)#&xVeKBZ-3NdyB!zy78n?0{elKpF!5>(dw{3kmUyBg^oN0 z4v_l=8V;0j?)f%3|NfN+@^k+g|J|0J`(?TGq)+czGdw(6pzX>T+)Qs6W_0H%c|i0) zvJ1$?4F@V%W-v(f%P&Q5PcSeQJ2tp8q}}#?d(+JSH8^-ST;+I@`&U1u;PAG%FlTx8 z7pxs@kZ@@@puqHoLBge@2Ga&6fduvgOeIRoL1DnaBp~6Euwv@}J*T!vH_T+%5&%`u529zej-2z?*?x=@28>VG0`< zSmte=IPVDWZ8z(g?;k&{U);D@1QP!XEJ2YzXP<%)rUgep9i*g;l@btBE;uk9e#4S* zb$_F*hX=%=jTb@buB2=VD0ia<(-~gIG6tV@t8aN;^`5+X-YjS;NEW!@*RW5k;vAwm zexM0dtu&QtEQe+VL_iCiP(HxoASa3?qp~U=U^#$K)6|Q(-|qaca9_REDvotZ8z?ZL zDGI{OQ9HnLAWd!a)-BQM>Cy~q!G#$_3LKILl!OwP5(KNKLNX4DUKf@hk_R|Az%7`^ z0ylORr!W8U^Z9)H64S*~G_z9zlQtHwncTahCn|sL#wlOrp;bR4hr@zAPz5ks<0~|2 zB4uPLj|N!=-ZvsnO$;p0<~PKr&ii^(z`Ky&q|>)>$`i1YK(1@70+k+eeOH)JTm+KO zFkw_ufeUH{~**!X2Ka;qh|L;z@2sg)Uc3X z=*Yp)dq4@40hPWeJ%_}7bkhM>@z^b@=O#~XVPIM2{NPcyzTBM)s_W(7G_$iP7?^{q zCG%L<1(4K(ezFqFZ$H>8>aNzSLW`>E7RvTE+hNYm4;$3R4j?tZr z1~sPAu79?9Z*To=%bo`;r^5bCpLY7WZTycW@iVM*V|SPNnw;Bw-fs7`U(Z$J9{KFv zyYAn7@p-#$JlDNf*}a>y#=h?D)&>yeT2pi;H?62i0!e z`)#f)Au-h6ew*22&{ac&@*LQNfY+U`XyI|5B=gFKoy>Cr@-!*EOl`*(D zc!1k_kl2Gpi`Ya4VTQ9WL+^23z*78hyEnKqh^_OsROHZMYwV6be7^JQ#;@_w9?KmA zbEoEpPxY7apJ@B-^UFhueknUdHt{DwJ%q7F51!cCiSbI*1b&;r#^Khsh)cz z9%Rzc6>7?IW4#Y44wQ7<$KVPJj1y+4QGJ_mwWW8W*`I%YC0$b>y_?e_vgytuB0H zr=Pc8NB`Se<+a~xdQLOfF>UKBn;pci{onT`=c5J(V^CtA`PV4~oI)Yl1Hx>K0!f9< zF%8*v(JIhcH-xcqr;@>`Q~z1T<05{_JPxhbj@a^P{nW*$re1$w;WN9=b#>b^=X>W` zR(%cY+|Bt>D7~(~@7DLr&n&a%SiP?7E)Oe=-o1E3p3(iaTVCb=J$`C`;DZJR7B*0! zuHba}T>jQ;%kQeZg_bUeQst3wMAr89`pe%IB}GO>t*Xkp7r1NsvfIbiB2;|)?QaXs zwwtzH_s=Q)|1K40lIyH5S}JV#z%pygCwt8ssoGht?-^!<=w0Ss)<|W$8tHDQ{l7F|NnfX6#&&t0{k0#9C;c*CenETQ*IuY|kTXslDJt}?s&f7RN;b-`By#nvlj1>F&w+#hQ=D<^7>o!Mpg$fNR0 zeeUGl%?$hdTFtALSK)xu%PCd|x6LhvCt5_YyWs(7WG9Y&`q`|npQ6@IzRcY@4IV*| z%<9wAV0-`kMFmigYQeb|Et@uOytQRQ2Rl=#V8)|s|JCxs*J>}@asSU^w!=BmeUCf0 z|2y`xaQEV6$9v0f751H)V)1*uz}Md^Y(j7EDG1#&>9bJz>crMT2q{x5%&CC+~T1 zh+BL9>+W;b>#ux&Haq{`6#JKUly7eDt39tEc zooC7`g$=EsY>+wkyfTCDYr#i|N(7Wk)Z7<*x7%`ZtK(ToP`&Xs=*Eo)stvxcg&#?F z9?;PKU%K|!^R+*Ys|(uimwG;Zsryaa19=~G7SI2EXI*B1P4lPS zqM{n5N8Ucx%~&IRnq; zrm*lFJH7aHnZ-{v&sC%voxgtFl+(7)TEA^kMXgQc)0%%KU$hFf`XZ06meB3n@n3ZI z^v?p%*Cc(J)An@LrpbM^Gk#}_{m<(>yuiXXKJ1@y*7QAbKPG@C4!?e#eOPt>=f9o_ z(ie}{$z8~ayOq+o^lft0J$1wKH)^Fkb5at{XotLH*gD;5wr%6qt-_o6n>f(YpF_e$ zjt_hdH@|26@40&H*sV9tN=zI){t36V|EHe+`To|{>=(iozu#=;KK(;fz4%nL?B!Kc z!#*a>4@}y$t?N-&vR2pWH=%q-=RUXgdebeoy|8oU@!C1Z^|twTf8Oy?D82st(c1i- zi@(&@uT5O_erdq`SNB(0Oxskv>hpbuZ1rcBJf|zJ-hU9#d}f!oeayBe*Ky>KONfd>tSFrkAeAbTd5#u z;!^Rd{-3X<_ZSW4+AS1CYgRF3B|G(`r50X*mT&UQ&=1>3e{!7J93qpTz9GElbz@yfad<{om2cP3W zFKiVybTU{om?_TO`0&Tasgmvvp9M5jKvkN>>VK_`J_d_VblmiE0Lx zXMGN?^~*ABe#vo{VbbQ#rZB~Ti4MZy|Gpl3+qFF4#WGQ={Y;@RViXtm z?GTx4YVH@aYPpwBXpPpKy6=(C*UD@!)Or+|vi{Ju-z)N8KX~(cs^1)?z}Qv(uad&| zKF#{?_aaI&DslU_R~@l3SMC`+Puy4ad;h7}+OwvzTkmdiJ(9(){r{@PLsmwP9AD7* z&8)xYBAt;+R|Y15877STch5X}-t+Rh0DEf&Er(gFPA@!seEBW8UdIJ34#Hvo9&i7D zeWTOV@>5Zwt2bq-#>e{$KMJyO-I$T;SEtrpv-iBlE{V{GD}S9%>P*)E99p~h#I8s4 z+AAJQ^o9%XJm)8O6`34jH&AGW}T^JR+`qG^I#a;V< z@(6oRwVMC?&hxOs>^b~}{>#0ewH8mcaNl|V)v_4XbGvTGO!@U_YW?01=g;NetAE!& z{h#is&{LIH+!ox``^|g)-jC(m*j8o;FqSd!D4AHqi?4g~K&aW~*4pIem=o=gnjh9) zxRAm0`n9{X?0qqwyp?y?<=@%G@n_n!X{+YAy;-v5s$UfG=%J-TSd z8YichF78VBBf`(Pi#(CtbP0AR)^$EE4}W^pWbwwUUu!}pU^q3 zwf4O~lBQMWYWW3z{QvA^*!DBsr?*eMp8tGKabJ1ljQPJdPfmKee|@&6!vgn&|NpuV z$N&9mE!_O~(#-!i&M|n;?y)y>*xG;7G-9f*VQKEN+luo|rhcAon9twEYh$VAo$!El z=gOaDzn`c{v!RuLpIs7idu17TU+dpvys&}qWy|Hf!o?;VR;@d*}L$bf-N|>2H0rrmlN4=hM03klD8cPY1pZw7k0f%aSGe>2q$> z+D`7e`s(Z3GtPVLo&`So`dqp=_mXX-Sh~!2i_EQ$BfY}!E%~Rb*&Us$JLVx;fQ$oQlxMa2eMi@? zsJ#2CcfM=i>0jI2EvIj?>-;%wtrcI_?MFIYdsi0bKdo51ziVCZk6i}$f83h!?Q4SJ zmBJTw+OMj!lc!zJzG&GeH2JEjm%O;`?|JFhZ~v>jTpxHovHbv(P(*BMdhy|1Q)L-0 zznze^IsEN6i~Z9r?;0;MMGN;zmawp#nBZKVDdBY+awnDY=hgDr&S02Px14vM$L&2V z1;6e(b)yu!4r^Kb)?}p@+pu+A-fHHZdX%MtWx)*JyOw1WUq5F${W>pq1M`A80y~uj zW?Z}WU(iWf+`eneD#xzFM7Y&Dm(XzpB+MBkxU4-RQgf|LG*bwVB6L z-oA2O|FQd@$YjrL|Ei^42;4|w3G4e^&LG13>ulVV?MEAY|CQWiG^jk5s{17V#oBFY zr%s)kgf@n=U?ApHSFZO!=`Aa!#z4msm+tezmukHd!@H{N7t*bKYcsy9-l0}`TYF$inlT%pEW*SEB$-D(*N04Z&|ZK zt<~Oki#O=3-mc@H8}{+$zS`>fv%~&9uf2NTPwV}1p5K1g)b%R&`Y&{5U~*edGZVQR@9M;%L*6rj^6%%b=5JuNt=|HJ2c2LOm5B* z-*WHQ`_iouH3!$P$({_F8STx!)~xYI91DES<6DUgD#!@PAu>XW!pfYj-55_W8NFOMh-YmGZPc z>`7+%Lyj$N_ZT-6aLlT3dc!cIc74t~4vWGj&W4-cxdmaxJEY6HSSVv_j!$y(+_R78 z2EJZ$=LTrR!|V`e$cF>W{5}i9R<$_DH}0DE^Zn{6M?6?ot@-mi)GB*P-_-qk65Jzo zb-Pn<72dYw-P|R4+;2~1xNFwx-?udKGRrKj++79YwiW2 zR6VP|7yd8u>-TU8E0!#!3t2x6c_%ZNCdzJ?Dr4yJE-0?7FRZTJoIWx2|K9K7sfp-y zQU#N=bRE-yLtm4X*N0n*{`3yhZ1(44RAVSwaOTDpzU_Aou^i~JZhVF^me**=v1Yxz z)It;HKY|N*gInAg+7@2@yp=mx|Htdd)tUbmecLtF@AC2fd=>lIh4m3pzuK}wAF(#R z0=35XZ`=24?X6o%tKV)3-F78h-OTcQWoK~_%L>rY8aq>E^#Ay8o2HjK&Hq0Cck=81 zHZhGyEVi>;yZ%^~p-k)JkMunM{5a-x_5&r=>)tfIKcBtz2CKo{eG5?wx&?Yn>i%Jp z=Wj@?sFw)||9xdLXy9>Ygj!yY{wE9BroAS~x3_h&J24BKQ2ua8e9wa9ysc4{H+OD} z-Cg$e=GLJ5>2rb}E$Y^Lm95#gR)6!dmUH3O!jED(_su-5zyFT9_RGr_?Ou%*%e9^x z<`)XDfBnGlisSWTCKmj=)ITT9af?Y#m|JzR;%WTqe_|)HT%CYX+rdZ_Dm|m9XTU9@0ALs@L`?S971OpDNJCdS-|= zK0cmnlbpO@QDMNu+AzWV&a&xh1`p;|7kGP5m3#l)@6ukASozr*hIg0zzag}LsqeS? zxbL^@d6v)r_vy$v#>P`DdU?G6%D23bWr+H^{*FW+xTxPSfo0nCx2rwhU-19?Rp;dP zpN!T=X6<;D|8euD_tk>3Ou}jfZ@236%Kx4oJvq#5Q-7{*Z|UZj$?++^<}<&0o|&yC z%vSd^bx-zM124G za)!pLh9^H*D%cPF;Ca1fVfn@RHkAv`b*pDidAsH4UBmL=lK=f{xs&s)mb53$yW8rE3>$k){q_H3PV!iWLZ^8e+kI&5V z{l6vyGL;4Is5S`RxbdNT=Eon$`CmQWllbFjRh#DarL{8|X5@YU-5s)PiPFXr>o>Qb z=Sw|RM9FK694505{HnSap_YH=@|({Q2VPXLEQp+YYq#dUg1@y7pX%GsZ23MRt<}S% z+v~xs>~$~a-Ku;(_xe@v3L=Muj~q3BZe?fNu2kFmr+@ALt!27X9TQBL)cx-nr#SXD ztF-I%RYSMIRM_vX_{;jH^y;(RIRDS)X78pcqs{Xjh!LLW8)N77Ksa&FHqibrLxCFN82v+Ow{n{zudQ z<+6FsGUD3*4FxX=%usA(m*2w4ApQ7-@!^DwTfzzK4a)=PzhnOrxBiw>)#5d4#m~+O zUCVBd){?obTJXSO&*Yo^oqOIrmP*k-^}TcfKWGq{vB7K8Tc#MTllrGN75#hE`!(*@ zlasp-zg#YUwOJP4pyP2}aO%}R1MUC572oDh{l8F;agL&aEYtsQPb-)X+pM%=PrS#3G1G|MjP@a;5k+`6HDX%NU*<*fPI6B1-D%$A5mQWe53!E%x207OegEx%x17 z{0%Q2pDSNhEP$0X0Zs?j|I)wIwSTVB>VK-T{$eb%oD#l1nb#EXXUFmbte=-~8f;k8 z|6u`l)sH{U?bi<-YrF3h9KYoX+Gdsoc}&{c<*K2#Zn(?eKV*=+$Z_AkxG!BSGZ0ofH%cuE)A^ z&yf1d(Wx^Kjvh?_n;XVRwSpN_nGSI4Z0mcn{fHi+4Mul%i9 zEPeaM6eyZbsczU)py5|9AWF%yd6>uPDT@C$G|hQ}xYO%>fDl ztp|Snl1)raRW90E*vq&6beLNESN+x9ds-N*8Pv)pr^K$A_WX15-s$%?r(b{Kv?PrK zwJl*PXi@p;TGOnm$Ft`(Z?D|@{NiP{r{8Ui&(_`SO*RIt$VxNnIl6AuD(&B&rfw;F zwA#q8{lm)F@3@}t&oIq=w(u}Zn?5|D&Io5(^XGi_dBN|~)C(T9_%hs>ajd?@HCguQ z%viIZ3hF)$vJAp(F$=3=zf1~qF?Zd)xizi!?>DZm576dE6UtcRDireB9c<2ZKK}f( zQ10a{&JD~9(iSL(E$_a!(D-FaJ3)B2s^h>9ob(2B3p206Q* zC#^R%m|W{TZr>ID(`&ZQr>}M|l7$l39T**|Gml&fx_bOKx0a^a?W1c?l`gE#+-0X| z^WlJA9p?fGHA`?&1WG9SjA4JDZ-3t*!&J+1?fQG3@Aez+rF#oYJ=ZwBe5v=TNx3AHUOlE`Ht(Z6>x#m@ zC2vk>f|eCj9bk`rV|V|{z30O7?}*=8d-yW)haHtIjG$o5H&tlRTAw)@RJ z_PuIMHcSD+Cz`U}BwY*pf5X+>x#r;Ums{?foE*=|Uwh;Gv8fXfQ}LfY8rJ^*d?Wh^ zPooeMJKqs&hCQ3*AB*%h@7e!SOIh;yWVuGrTC@f+QORdbQ`Rq86%=*p&9d)y$HPCR zT?vtcZD56tS0se7+m}*qOC&$e zIKKSs;pKbfLcNP(K&x4%KX~!tAa1}9W(g*c*eaQZa=v^>n3fQeloG<^sAejDnVKNx_IoH zeWkHyCQVyj^mfC>i(Kkq`(JP`KuwAQGb|f-zu#xq<@i`)=3fbSvnM>D1qCd-Y^^tK zS>pOj==dj{-8Vuzudkhw$8%R8&g=cvx-T!jKHPHo+ZxO5_*sNY~ z@^!jAGpIk|ER?anZEpB&ZidGjd#@_bes#uM`@DB=t4gihF9}dYu-Sx{%-{~*H))ky zrsw9__kQ0g=C@{W;YN+fGxH9d+^XOH`<=BU>mtJ*^W%?Y=C|9af)*MHz34joV%dq^ ziB3kFzb*aHlfFi^bZ*o}yE}+#X*1`BSNGriQ?%mXQ7ZT|BlrLHAFe@5|NL+>^L!d< zrKc{Rau(EcHNLRMD)!8zLhVhjou-@EKlKccvzD>gAmumj$#sULSxZnVsm7ZEJKhJ} z(@X75)KTlrPYI6t_-o7csr_p}Q`n}5)-2SD{h+q=ch>EPKR)h}KJyzR$k`gpcKrJl zSjLdCMmaKi%{Mvoz9djaIkW7YOugzYZ${m<)0uy5+cW>=KjBHS4D)&K|LC=UiWGH? zJCzSy`@i$G5mVa%HKy0uyASooTTQv~SK`9;IsU8w_ey? ziMS{iFKw%(w;u}6{}GdPCx8vTRpi4VV_h~kd%JnsOJ9x|XZtqoxw82C_31AoFJ>to z;A>!%X#b(o7s<^usN-|qijc_cnr%rkUhVb78`YM*oL0(JE2{W~S`K=YF^6%E(J?pAnlZb8|}AOr_nQCYpkpHD?`SOUn$yZwfy6Tf!V+ z8u$HW*^bxivJWfE|Kv`4(%>M^7#8}gU;-!?g7Oe(U|XQ^>Q(8(vDN+RTeI&xT56h= zX{~ZOL_aoVx_l86$W@FhR71t?ii91x&u}UE|CU$%e^2)=ylWSAi7yhZz*KX8aFE^o z?!SD)%ss)T`@H`BVLFg7$A^I@Eo8cT%|)%;O&;5~O}#&v-)4iD-kh0y+tzd- zfTisHHI@ebWrp219~t(Y|D3w#-RTPJDqm1LgEJ+pSMNq)cBt*7u=y|dp090RC%Ikl z6j~;hnB}m#R3qpAiRqh)_8NNqTVTJ=F26_k_k?)@jA{&84YJAFoqBmEcbMMv{nh{T zXyv{f>zaq$^5u4R{D{URxC%J%ghR%@F89;vl(kD3?b}XD?|<@CTkmJ|t=FgA{TdjA z8H5|67JAh;R>!)YUDkhdiFezFo#*f0{%Pqj6~2oA7R+po)$jLOWx6E`Pqs?gyk-0E zKZ|UBDyVxja5iurI=gb$o3?;?OGM9KPR(xr{eHjJa$Xy*{nJId{ zc;=0H&;Guiy1nh|*W0=W(H0^lJYwOKyEAdi!{h3g*1oj4ds}2)j+*5%kng%S9G?-m zswnXJ&mXgu{I{QYYuL~qYQu^smLOGBk8^@<%+||gioZX0zM6dY(z4_2Ig?KHUk11D zI2$+})&?w%ee$cK{HBWT`4a1t&qgi!wVBnk&c>rPv4mAN6#WrSyuOZol9-9w#$!un zZ#jH=(Vi>CAL6f?-VpBh0;Qyum0`<&D1}8`GEXzBJ)^f*y*#G0IwJb_D*YC;kXlg2 z^!xqajG*Pct|ecNsm?yG^=aalrzw*|<}G=1Viu2ZIk=IraK z+3n8lc1e;l=n?3&;BFjecuZkvSb4tArph%*dWHM=Pd=~wed3oye|GR_u{Lx?En9)Q1dHQLMe6`IePpb{Mfkq@V#1XPuIW66HRizR#)Gd z_w=UX%w=ZFQ{DYK7=#&|8`c)4os9pnD^O>WO{|&z-hAtr?=N>Be)USc-9j`5&BPG( z4dwIST763vdKuz&R+n1D)csT!VyLqTS|Y9fv~%V${mRNpyG@GOY6n;xK!wylrSfO*67Jnz za@@S@X6ot5d;j#ueVlk9Pd?lgIy?YL77h$dTLpIf|Ht2|{C&R9tFGfJVS95n$}QhJ z|C3K&>6IPc)oU!CEj18kxcpjk_k+jI=8kiozdiN&((~xKZ#PtbzgY0)#qmdM9;i+f zkmx?ZYhI(E`Tn@V)8xr@@!3)Tl3N`gegt_^<*-!xj7PH_GCk#I-ejxK+xgTeo&&vL zh+qi|U(f&T^5dtE1+$$VPu*d;SzPwiFx zKg;#owr-6zJ?>J9k}M8{scxwM&ptU=UuyP|Z+o_!_-S))K6T)%E$#^O+dc z7?v^YT*7%*Tburr{dje~uZ3OiPr+xu?hX{E zHCifN;EUh$@UG{cIvb-k>n?wNnlkyy54X%GETC{^x}%sr>k)TUrl;$J%a?rl{_p(v zt32&#h&fta>`=<2?pI?MQ@M0+{F+l0M_zrc+b6sEx3b@Fn=hQ8_V}R&?U41-M`Mz0 z_166yFT7H+;v*)^{S|!YM=X*s^{r%lLF;p=w?C3^hu|%!?eYjn3`+PBdsp=!${j1F7cAt>*{&}?QQn11SmIERR{Wn_jcsxUs zGjA?AZnRg^zThUi^Xk(1T<9gs6rmmO_m#Krt^Vu(|0wgniZ=_lguX7FZ&qD%WSfQT z@AAve?~c8j=FHj1+3+%!^&{)rElXUJcG(q1eS7ukK%?-(1C8EmmH1FXkAZ0^%dNMM zA9iWqoBAU}vN$5NvhH5qF22uCXBdKV%Zr9t>GK{*JDE>*)!5thX8yw4`~L1-c($*=0ek&iG<0szh-81Q_sBCJbYwCvUpejcy(Qk!T{bZ55 z8Ard}eqW&=v*&!;M+=n1$;crhkg>i^Hhiz`NgcUpk>@M@dSgGmn$Yk0^Q74F)cY#g zaV>X4{x6cA!7w9_|G4$(xLsbPdG{MT z-MjZa4!>CY!TArV{QT(kvR~VqKr#BgsHXAx(p2NfuaEQn)-Qir{@zaN+xz;{U;L+wp;Q=+$AmVR z|F8ejwcr2Ih+}JlnAOo7qy;$2K?jn%o7Y5+zVc#&O$J zH2#H`_pH?~|0&O2a$ft=@BBxH+rtmfv#rk-EdaOKAcdj>15@-Iht;JkKCdYFzr#71 z+kV;v-DzwWZYM36cKo6OXixnL;~0%f^RAq@S#e)Jn&Ft`sO`1^rE!Hm!DmC`1K}U-Q`#JnOPZ^-!80v?eMzj|C^RwUM7W-GZN%D*Q|ffH+|o0X3rNNXB_O8 z-}COcY~1$E;kPCm%(iD+x>x^K3x@%tf#L?yRk9__PoADmE1Ke8#k~J@YVB(&q_GkZ?={&_xrzK^-=Z+zeN>GP6_hP(OJ&(`%j&2Om;+ET&sry=dJ z^wH(M>wkSTUw8fX!^`u3#(UbPJx1yrG%&Di6KZ^Xd_C{`y7R{;2X8BEl~)&e8G2ma zEpXqm*9NmeW#8>3*LU2m3ceeC_5h1RudUsoR>}Aum6hx03~Lx7N>@^X{49p=X?p6*>=(%ekGoBvb6tz}aB=N=JNEo=H8k z*h^RQGV7SSpZ8nBUU#e(7ln7OK%S0BVPb#3+a%_9=iQT1NB0`%tNX9cnaPk5*Z-Pr;ua2H`DcrzBQKrGyOzK2X~Cz>4SNJGaG{$(Qfgn0XwR-gMkZu3JL$W>Qv~zBSv^=~GqneLy*z(?HMe5YN>G z(hD@=%O*G5{bT!9WxeOG?0=E4@ckn5+0iC|4|3coJU+j@_IICZdg^2LUhY$0_7t`` z8t#@Ytjl`)RJ%8agHeq^>XIO9;)`RO-t3vJz3u0gycZF(`g7iH*tSj3uJrDE)orHP zEvO3`A{>~swXe5s-&64W#C;^=z)>u}p8ng3p zy^7<{k4?uoCQW-@`d<6)xzi=qDU*HH?yXrmkyq&ei$k;3Vg-@A3Defj_BJ}d%x3aO z-Zfi1*Ka>;{qNz~lX(r+Yn)IEsf0$3JGI}X52f2}Hn&_{(R0CG?M1J7%J<~%hazP=FvIbmp}UE{@l1$^xseCcpi7Y`UEGB6=EoXGDENNYr);+_2!i?zgJy)^X&cq zpW7;QCQk1=f2igUD9kS|2USa&ht^%VvOrq(+;*+AYP-KU8ohtE-DvHHdEfuJ-iX+L zTF1hn*x$Ky`suyZ{cY0uRkcCawwpV8h43P^I2bvu_&s=Xa=mK) z-}>U9{GZ?dpJo2FXJc!tdbLcJO`gP*zSEQELCW0SNx{u|Gc4k-&a!>KSo+?lCDTuz z*881fQS!oel>{e>nP-F>zeWAHvRsdk-)6%sm)KgF3HI|&NGG3A)0npI>559htiYlhf8MfiOlIv>_jx9}u{OYJJzq{RsI4TD$ba$50%`Sg;aAi2fBle- zG%wj`Q}My&#}oB>?Ui}HQv`^dS>}ECWAb%BMqyu2!G=f@i-j}V*VjCq^kM1jcfPAu{HwLEFTLL{+f~wi z<&(uTP;amJN~GtCT?h9}S!cYlWUBwvdXcEPHxGZWfABRiIeEVn+K>dVa>4!D_gwFP z9?zb%B1b3T{@1_XYnQ4%HO{z`p#HK}XKwk7eo*m#`l@@3$=S8s$)JW>*Uc-lj32Sa zem(ZlJayu_*|C@YED=9><@vN&_e0|A{?`lt{~EP0KoX_JW?! znDlGj`YlUt`kwcmeU|U(@|9oKZ?Cj}-+V6tR4MN$=5p%JH(8ooes_-AUtYc4+dcKC z$^W|WHSztu{XNpq{ot_r`OE}|)uk#mUl#wj{e5!(qxYZp9^5C-e`0^e8HMtN?^zI1w7nVszGvcs>J=}*qQcYp88*oQAJ$_Bf* z1;Y#nhrWYhW7v+D%kJ~d|9|LiXLs%O?eE{F-hZ7uzoO>B<;t~D`(!uzto@T~11hWU zyY6Is)fT+WfA+d9Um{+~v)-I~&0b=o$^Nj6t!9U;@Bg$;eEVc=7J8oPIAHtzPj1Ei z-}Y0ttb70d<@axKQDu`)U6x3QSUGu1k*j-TT;5DUanIt{hb(3=2s1QGUVUZwh&8TE zS@ZmolJ3aNn^V4-@BinxVNb+#UnAY^<@Yas(EtDIR*KPs4%0)ZEv+*R2b%foboM;# z&G(Gz+kgM{?`oZ7`~QFM*L>YLd178r`}MP8%b&LA7=Zk9$1*VEBd^%N?I!*@ zwKw-ZFE4aP8*Szk%E-MVuJ`{#_Tfh6%&p$Z|b2p%gbxyzgOjazW;IR^7r3PP2R%c`@Q|r#xHixuTAy3`0joS(>uU& zpr>m8G443?Mdywz_mzM4_`ly<+Vyej`~QZ9v;9wp zZ!@X?K9BuyyWW5ML&uKoH9q2b89AFo_%QL?6u4GAzQ51Za_7JI4>NbYu&$mLd;hua z`TCyOOaCq`(fM4nhj;Hm(5mEu=Tlmi&Azbvh}nEI+xNo%nI}x2c6Q1Ch}ykh#PfHk z#}uDk-(L251wR++po>KFfse`aec1l*7vB4E|E=;bS;-8&!a5%7wPQv0{N$^>vV+5_ z>{zDxBJfOjH?OGoH``Y{YJLdns{Jrq^ zxp~V^r)_#sy?1+bh}Z0OhjYq2maY7^Keh7jJiXAzJC0xNvf^P>1FgiexxYtRf174* z(S_sx7Yn`)3)`k-d$#_(eVlCGzMo%b)_-0hD2SZ8X89!4{#{paGj;#0n&oy=T3+t2 ze*L>*p3djZd-n8eXq;dEx#VWsG@gI$Ze|mid>DLKUVoU{SLl4>Y*dMce^A{&w&`-- ze-|t5zSNxZ>OcScJxX`VZp*9iM$JNPZmw`jsQo+d!+H5%`45-XTTj^WdiVC)<<{@uqV^ZIXEJZoVPW+=WC=-l=)|4Ia?sO>p=uCes7fea|n9-9WfH_YqVBW<`%Gk4RQMz)vHGjVUdTE@RBx+||8Dp1_wJIPKeoL5xUgpP^QXuE zEqM+qhk0M`nWfHHQnqWN>e+SDdp&O1YgAT#v^TMvyMF)2{QHvc?tN!tZAP8Fk!iek z?BRybui|;-_ka6#WYzlzAIq~hAKzy2wl?Iv!b*oT{_WRK=bX}>lH8Ne^;#vl1k|%Q zmnY}-OFDd)=gTraJKekg6hBt|;XiHga?8B^m5-wj$Cm%Cys~ZUdE}D5ajkbk^5cXZ zMaS2-%suI!^_~C2+v<{=-`_2&`EMI%x9RAm9kb8M7vB2xDQBP0x^oZg#ZUY6dY7E? z`6+I;Z_AdD8RiPg>lbXFxo*oBo6O11Y37ozr`>z@>51^|M_-D5+?@aO;D;yb|J}mO z1W}UsjYTYPTI<7OKCXUvdH&7G0w<*3Yg9$1I_L>CG>mSA2KfeAB`HyU^kq|Nddi`vp-7hUn%4zi!1o{PcD`U;K|l`<}FPvwiy5VDESQY0d_{*=)ZzWh%UX zdo1c(#P%(+cJ^CCew===pJ|EY4g*F5<`5pbFrM}Fb zUvhE}C&TI2yib0AtvDdR{P*d-pG5CV&->VOpWEA;|Fh#Fl!2i{&Nb`mEcblhyI(MG z-_wAiKB+CwPcAyRZ~JYAyVJLB$+?uAnQ=DFT_-sES9s;UFwgW4@tl`^=FDK2!TIe~ zZ=WG!Lhp?PTf05JyF6>p#P3pL(9yli|0vZw`eMTV6Z5WpzBJv&w&wizKkGN_`NMn7 z0A-v}Y}$d1$=6%A@A+zec<*;P|8p1l?|d$?zi|HacQffV(YL%WKlV>LCHrM|e9e=a zN%MU(+5XR-U~=jJi^Jkw%Jwrj{g`er+~d>t)&G_8A^+zk_LHAD8CE~PQ+%H5|Hq^C zGJcj%ImLKTZR|Vn_j|p{o`=2r<@;o@|zeoIKs2T$(q@~_uD>-EHKACE^Wz*4J zOW%I@xpL{Fcr^yCrdboEg&B;Q>~l8r&Scqea39?@bli<1?L{rD=eC6ZNO;oS#O2d0Ty)z9R}$$w;wKjSt)PNDeyXVGGntkqukdM z?XC0w-t0aknI3bYv&|m4;+&Dq^mglp*VpX1^6QVcPrfW+^5Xl?RAB})hw1A}CjW|< zC+jtP%VLjZJ732CtcX^fd$3;B$GAL+DdAacfNg`OAJY_HmW&Jec2XazW4GB@W(Xx{ zR*E0k_94FhWj%j?y^N;LdmE>sa_aDF&zrm--Cv9o>DVcyv+7g8FgS2EY?Go2Q!pZGW~lwD-7mp)8=8A=r5J>g>bqdiAk8J|3%{#F3L=n{i?NpG61jW7?Od zPM)XE+i>&kgr2W{X;bv0RZl+HFSN|f!Vq-I$_lw7GlUtg1>9S;YrChp6Y6M zQ`clK$h-7f>don8Use=p&M7{(_>gwpi}J&n%WZcHi`FC6Pzo1(nAR42-)G)#{_k$| z;^}{HHdNnf+&?wkHg1+&eNSJ`CEr_#-+r9feAI4dCfom=5mLD+ObagF4VJkxV={x8 z!+GnJ^ONtT?W)a5kbf=pMmzpx;L{+ZANHny?wtRZRPkkT{M4<}IZ#GROj;bWAA9V0 zc+C4ys{9_k&J%1`J~r5I6J7glbitb4fMS?d3w1 z=Kl)|OpndvY&ceO^h0BhC1V0_mce`J?`ALKX1%*C_2u-sEo{HjrrWLQIjz^4ZvVRQ zVXFRa6`MDS|L?K)@*#~ZG-`r!<@>!Rdw#yZFA)}YZSuCqjJq!#_L82lx~GKq%~`#> z-qxi{m(JdD_)VqzMBDS*&mViRpZ|D_>I{Y%tKZ#{dDElLX!4@}>5j<^9}mO}v#=>b3xas1FKrZBJOO#{F?bV6r=b5+cuRmRVH~L?$!CJ<>*Hg78 zRqoqVDfxQZwtm@-deQ2}r>E+Z>{+xM&d(AN1obU$uz+{?RU z?-hsmvZbe&e4jc`{p>S)&rP$Zy#slYZ*}sM=7axFypRf=z}etddi=-19!t)I=9ha8 z-v;g3whOz*_Q}ip)H26?H+*Kw`rHxn10;K zxJCYr_FVHB)6bs1VZUDQ^Thcj`noAgmsW#f;_#`S8iOD5lCjF%MvNCuZ57yQg;dxA*&#%k93N`M~`Dr|H9<_4^ZSW+5Nwb0di5P2~T* z)&K4GJeGaWr>*|wbDdeox8`pV*AwFFysBS*Uh>>?^V8Zj(r5DAb@r}(JmK%e`P)OU zN&X3UGd1t?VL0O(&MW?+N1ah8Lb~U7Kiij0nz3dJ!sks7+o!R1&%8em!}l4~{Jvag zn`8ZSwvGl$F(o2oQTK=Y;VJF^8a3aF%T?{_Cgd|`@;=-9u6BxkeP}eqM63%dYM2r#HxUv;B8|I7>QRjp5m{)o$Ed7EWf6TC<$_%ftJ;3qGX^ zGk$t`QrzZ$^dauJ4^nYL7Pq##Xu><(8yZ-y9d2ZP&oBRH`F1t?kKYrD>gq1!HD}E4 z`?{wjCs_8L-t3c(^3Hj7Wk)XEw&J@f|FiOTfEB2aJUi7`n4$P;>|)m24?G+0J=nAT zm45WSQ~S?LPtlLp5B}?3_hiq9EA`)B6`a!Sm+aL*_U5yB2R0_p_pH12UjLA~U14>R zo>|5f`roN<>~({@lb1&e+-S=FDW6v0G1C_kpAz zQ^WzY4{~2VGFRDW=tn<2e_DIByP;0IyWOY6hwgPh+z&sN`<|Sb`Etv}6+uX4O2Rvi zHEZAU#{a$*-(Fwy-qiDr)PmawqN?V7F}uvZ^z^IEHuKk)B)yaVP`&$;&#lDDj}z0o zYrQV>{PX^(?{i|=ye7IEq=g$uv z?thl6^nYg#**)b0Vzl+MdqVQ#f=y@t=bk+9fBxZ%i`6F!Z(!Wa_9?EP{l}^9x0RVc zpLymR->vUS2aTp#ozVx^gPF4q)@#mdJ(O}LU?hLpM+T@^0m$#R$9|NO4tX6k#+ z-|ubb&6&h@%eA@ww7&G6)iE>sU!BPIHq-Cja_JIy60@`4Ci+eAth5jDUFi#rW->&q zc(Y?wd=Vd*-iR^!)1bvdf?J>posSRJ`xA_@S4}>&s1N zA#WZsne0%lE3@Z)^TWgPb=5n*ZaeJRBbDI&t8vfGPnYh6xqkn8WY?|Ur4J|j?wYd7B+ zCagKQo9&j@bkF(WOMdU#+kb0f$h?b_e1o=uLiYFJQ~jj|KjgXZ$B3mdCFt$W{j(r@ z7Rv^QoC7lQ8+~8eWNy=vx8Gp?e@{thbX;Zr>!Za7e?D({|7+d+Q*yi;ejzV?ndPzI zuASh!-R}=ST(w%Sl(}A7CHuo##_g9vmwf-YYrXll<8L)|GruIon&~Isy=1lKPXv4O z|BWBc<|e8!JlppA7=O*7$qZr(c$buVoS!UJFnfK8C-1AzmrfbKEd8vzNmJjyYWB;$ z=eg(oU;D7~{O`^Wy!Q(d!^)MAR}rN7Ex2kW^=|L?O`rkSeFdj=+b30+>@Zt-aA%HJ z_{2)PjkIV)%iL`3d1yi@o4_hELu-BxpKc23-~f^q8-w)d5pPeUiV+J&wE z^y$`wvrA+vGr<%3Q@w-t?sxq*?>Iy6!T$^n(F(IU8+0$64D~BKHJL$d67RCNCnif} zXvb&jo35Dd`?7H9)#X-?c1?YEGT85?Slqw(bG-Mz<=W5qQ*@v_HB~nc*)6*`ZhZdh z-WMaeZvQ{##OGJHt6cr%xb^yJwr8iL!=tKK9o{~7xisU=rO!R{jcx7L^ljv0`=9(U zdd49i1|6U9zIr9zIV>9{zvA6?y3{^ndR%Cf^v3nuHQ9b@+|}Rz*;-Eiob7k^Lo?I= zE#HuPTlx5V!7NbS4yop&=NveBHTv+r-S#5ue%v^I=-ys;VJRt}>Y3&e-_2f53Ja?W zeR+Dy)?C?VpKGIbd0K-;ds2-fQ@-0Vm$Ln57R;4oS7X@b6CQ4TQPYPhLcy%y+QjAA z3AuKco<6^P>2c#ufA9XKQ+sp0e(#C+|Npl2ZMEH9j~V*Igq)lbW}0)}c2p5jk(jfD zr?v3joFnrm{drJR5IV<;RY={{Qk3iXjDQvi?f@nx6~!%4Ym1`7Wxt;Lc4nsK_cQl) zezyzWx;=jR`8nxdmR6Te!tH*0R=j?@U-sXW`}*y=+ZM`Q-nwwQjeq!jui4A(rkaVpPFlY2iLU9gT~jS% zlXfjRcB%VWeP)YvXanN`x7g=3`o%2G44E@ZD|h{RXMXMb?3}MlQ#_T|TW*{(Yu@=^ z!RKw?)PK8~-)8^&@_r6+y+0On?EYQ~h%Smi>X@)|+_}jezW%SypI_JQCHLL_U$vv? z=`(?AYP(#fnY^7P?7edS=cDJZ$9z29_4w6k&(4#Vq_|)IOFva_zt~~%PyL21shT_t z+uj_?j{Dxx&QN5M+gBVkJLhcpZLi!1SJQL-^}kkry)u1r_vX6y)z1%S+y6NI;mKrs zzU6+l`hH^YQP&$uOurwler?Y$U;F3s!|%WT+tqwHIGve0cNuHe zf4%gaLS3ZP_b=*Vz~uZco7mc0 zDc8M+{fCnK|9e(^ICy{e^kVaw zh+DBXY-D+N=O*v<_4_65em?2_(7*n_bH)3;+TZVmO25$Dv~8yT$?L^8V!oc77#hBE z-<&BkbZ$OgJLUfAv%fO_ZLZj6b%G&b_4@s9o`xH+OlZFO%rZ4Qd2QiVTS@bm*Yqwf zU3T_!&ikG7-an|EU;pmnhg%aen?EZc^w)gv`XOYtJ+0RSXYi{2c6+18W`;&QV4J%uxtTWVhovvEFXX>Zw zossfq>&4DrW0z#e`D@>3#9++F_@wcYNVWF2=;%`I-hTL6`oG}1nty2( z|NqwW)_=de{qVbYZ>yhQUlu7Hmwo+J;pM#C)!wn$(XsPi{xn$@6z5nvaZ}KxV@a_& zySKD`^}Uq&Pd)MWDqkLkZLfAsufC})#dJb(spYk&FJEmox^`6WuT=KC+&izL?tjkI zQGY6%d*>GS-&S!se*OCYQy>24t*HFb&7{v?ANRqKa|65q>k!UTR&LJ`U-vU@N6E{x zAAU(6e*d+;q}F1-**2xG-hFF#iErN+@qN~p8{yfnjUUy1v^4eqt95j}cj?rP@wwWM zW29GK%KW#wAUD^Dxnb?zUzz&*7AZE!gh{2wu8N*{S=H>@Q`3(d^|viu_FTGpn)vkc z;QFZguUGGLowxrURPpDd_~DzI_uKzzIdJ*=x07;+WNyL5RQ>Sv`un`$>-UM;{rj=@ z!~6WbviB;VUw(M-)|n{D*YkAu&04=BvOjmF=-M_NQ&_8^>`qAa_LGfRw_?Uj4cmH$d-58%@ms6Xz zJ-;k7)l9vmTU=hU&gsF@hv#|rS^Q}^@cD4P#*aTAf|;JH%w%PRwZqdCHTfG;Vrw=n zY15g?{d&XNI{oX%R+UKo*NRc$XOUp|a6Un(QIwDI$(~y*(Xq8*$9CP&oPW&anbeP! zhSB!dzS^$2|I5bq+e+C(-S=yi_Ix<>p3h$O!=1Ye54^m5zD-#DoHr9UyceFraffev zUMyF9t?Jo-yAPLtuQ#nJ{~!MSpUwQ7%WCH8xjrT5{eGI<_gcSFzq9}CX48=CnXdYKFDNf8wwv`o&_%_9MS{U1pkS)-ixdHc-pzVfx6TyXzx;WPl<>^#AExV7 z+>47Z%?tg!=KSTW(RC zIsA=#3$nil?fCe$zIFY&dI7uLpXzpexyb(Te%-(O4^OY&&DLzT#`5LSBk6y$me-ig zyL^1suZ=sxqvNjsTDx|a`da^z$RPEtMH{coTQdKdeP`PN4n{TxXKCk_@`ph4} zHPa92*L^(s!TL}2v!yx3tEzgp?A)kVc53-X%_6VO>(5UN5072?E2Jy_YxS%D``yp2 z-x-#r`+D}8%YXdcjvs4eU}pFydB$nMK>>$zOV4g7KW34Zd$st|F_-K5wd-yLKfN&_ z;f-bCom8bQ#%}2*B-zV0sF7;M)oyL8KY;rZUlmYK}2MVaD`H_SfIr;fLQk-rKkL$F1AD%}l;tKlE;0 z&G&y%J1Rfl`Y`v`>cj7!#7pn1{{QpC-QVXAwadpDuXw~}oPK-8^40!JZQM$>+Gf^* zBg=5=x5!tsgO7b(ySB>j){GaMp499#6+8ddR%G!<`xchtE=)WOYE8+}vkr*yGO;vW z-{JppY1YxY?CPp>>V}cGPOSF%xyJt5(P^pKIyU>xpSLYcQn&ef#rfgId^-~!wz5O! z=WJ#A-oI(NoG!({DvlP>)glAy@~6$_woK-^6yINn;Xo3P8|uUcmulkA;9N>--Kg3 z%ii+yZj1e0p4Vpm`+NQMzvnKT@f6ORe&qZ6JLfse-|^h9w4YJ@`r6fld+kkLUvDpd z%X{{B@5Aix@2;P{EA4!C@5Ayp?QZq;_B9_{O}#L1swR~%@<$$R`RuT%dTr(f3t4Ky!L)sxOdi`iu_aC>aJ!lIeYeH;hD|B`{u+a zZJP4-kk;=xo0hLJg6{lkJj}AptRne$P~my`-$mPcSFQ`X=l4}8v$&{AM)-E!%i^{A z%ln^J7ry>n@-=ei<;OE_l%4#U9&hr0v+~_vO*{^u=X6S8WD0&cc`1#Q_{-sm5 z&HHgBKXpy@wjV`xz5P#LR2Ka-JAS#?uD5ea>iNwd?tH&l;rIR9)0#rvvs;7Cr`D?e zx>BpU6?`~9L*rXjgRMKYZ%#k;@y|wmXkxmv?nPF$(bLU!7j3PdUjCE%=-$o8RkI$0 z^38d%`LVxrUPpT^{}|6DKiil^f+6LBz^wKIv-p^vJl)Eve{t)_E4E>`{s#Z~SeM=Z zQc8cK+47M7&o$)bN?#z@@Yi;n&~&<`kr6j z?4={Vy>iv_CA~*?-PrV{5>{wjTJ&>0i(8c`BOAlj6E`;SG@44VoOqpiI9w^$&#yoE z^sTCMJNkZ2pLj3swQ%e-yXwT=+xO(|T8n9S-j3QRH{Y}`89HM*E%%kzx93HBBHo<7 zX=b)8dym_#J3+S7)i+wm-Tt&b=yT4QU!nRF&D5_QowoFRWJJ6D@kj0DA{7~bxD_TE zaWk?pY))9>!Q0s8%wTyeVzKz~;%&#WmYkit==rxBGxn|i8X5ao>+y_VwwBK}7hX)w z{M%Z3<6BYDPN~yxH(Rbc{yd<5ebL=>x3%5Ru`+V3(Qi~cd*zJ9vN?r0{#x&TCePox zR&RZ7?$yv+JAP#?nVwy1S)1i^KIi-M8llOe&!gklbnAM5*I9FTe)7k|)?BtG|63P$ z%x-01ZiqApS~AVyv0{Tv`kIZO9$hnEmVIY(vYqt$t6%R1{We*5>DkKjUaODqG@Ew$ zaYU!C<)$w)p#f_guYPWB()Bs1UbWxAop?|znPz_P3lFZ>x!yhf$0Hd~xi!6O<$aKW z@owTzHr>A#5bt*@!f*NvowfTn@YVMn<$tg7<-!l~CZ*gkCLV^gqn;b1n0nb6Refhq zPp(bgbu1g?nK1DsN&1g3OIf}=x<-Hb@r^>!MJX?k zWYv!r`%f+Vx&DyrrydpwhBF+KgD!KfIjGv|H%+SAIVVKt+w~h} z*Fo7HYD$s(wfxe(t8Xmdc31lKyt$t`(yN{I zQuVU0Prq2GZPT&+edv?DchR4@t#PydI|VF} z+4?PhTI-L=KaaZo%IWs4d2z2V*G&B;`O5ob%sTPS`y%u=?v?p?)cd^j@AS=?f6|>j z7fNy(Fw78CTl!4BfW?`?w#3tU#;MM~mbZ_EglndMEcv=}OQmJJURt)##mBbuVjoYA ziTrkk`~1W6lja=WEjBOp+p?@j;A5*Azp8D>QI6PUKQ;VufAQMf(w&0Y{V(J8TnnEa zUv!TYrx4oGtdOfz{a$WE9Z?|Op{cSIwJ_%KshayMS@`sk1hW^rvzU% z#!p#smnDC%$^BZfzxV2km3J=v+G*2ya?|+_Z+3h7-J7xBWL>4!# zw%DdGs{i$PrRlb_u~YTFC(eI+Q#1aYzTxgi={IiVSb@{=l^G1o4aXWZ@3%R$H#1aT z4Eg->XL5XRZt+^V`3H{$Rpt51e10P}|H-LM>5&!h>YpWj-z*m8o43b2b^D5$Rbr4! zoGql7bfpi>y0!C8$eJtfpGMBV+PZ7&+Iih)=Putaf4%qof=bK%XIGx={vLYU2&-YVsk3Bqx8Ru2e9feN<(;7VIpN9MPhCCT_4@gZik&;Hq=IMOUT-;X&aU&T zTlv8qnr)LCuFtqOLF4B9)1F6d>fdzdT9&`ryzT1qGqS5y3nM>%7Qc5iT`%pk%lebO z-@|U2{0rUT@veh`xuH+5d9e>P!(8vF+9-5?%AAVxGv-=V@6n&CUKbhnPifN+nQs5H zTYm>to!uO4`T<;>9HB}-q0fWq-LxeCQUSI&4o|8jVg_V;~pynBzu=!6G=9I}4mS|j4Tjp7(r!KnsF4;!?bvEw-tP&lmE3>-p3Bp7!=| z{T(Xq#i4#T7gsMo6>3xbD)J^I(X(^PR4&etvwwP1wfb05(Z`TA*YwxVyk#t=-RbSO zr|5ilF)U-B<1k=&@y5x*Pntx2Hu#8#fl~ZVuNkT+{Y!<(jkCYb|ds zN_$s%1YCk87;|jNuv&ga=ce(r$=&|FCv~5Hd$qr5lFZqyMX&6llPCE-w&#?deGL@% zrn_|dcG)zF@-sbQotEk0{e9Y#-lsiBm+$fRJbOh|f3tb0Fr-9wNXTP4ZMM$zw|DXJ zPsbh|TA{LBP5)V3l>I&PZr{tGfL{YD0kew&Ws2*VWOsi zUh2*d-2CO{6Gza5^nq^z8CO^Mt&HBh++@3nf8HLo>%YY}y{TKDHnsoQelGEo(oPMG z2ijs()*H@sP;X|aZM2lSc}r^R&!TIZ)z50&*P5zLw|pLv`v}s=+sV?m%QE&^W$?Fa z?^d4u{x9`R;NjKLZx?@D?{=(>SLpylLbKlF@W^=%>4zCA7w(k0k@`w!bGUwLpH$T9 zuyvnqZcSH(oQfajpK!JJmCX71QOU3D-d}sR=IPb-pDun0f2dU1%xS=IsNKgT`m5)7rGXt(N}fDs%6!o=hyCXpY=~GMkU{nk&Pj` z=I5SYMJ(4cBogAcd}rJH{d45B7vR8RXbfW7YkqO>{PRzJF27GY$l0jF$i@(9!=f1A zmf+jYc<=PZhU$l zZ@Bj2m*qDF8V_t@kzmmAp72*-g~|bk1ws*4a}PSr;uQoBB4zj|te*YF^5dls=RGG! z37im4V3_dSS%m2xNz(s)sh60m0m0T>-)D8qBWVVRF<_#7oGS2$jR-nn-IFrMGVFss4 zs=@{>CLXph*LlyO3+%T|X6XG_cF#J0uOui^kJ)|_6R>b;ICwx&1wJ3OLcw8iJY#nV z2RvH{GZhObI2f1*zJi5qHv{j#s=MOLTMx*9nrw~}r37vyF!6Ai{V1x0oVIwwgURHZ zbmiJTA}nc&2N)8>dPEu-SacZM*ru^T5AjK`Vx0B!<(nIvj2tp*2N)h02-^rWIHa>k zXq1#G%0L1sg;K=~0Ad|e0pRv)^8yc`C)GG>81 z6A#0$o!owC$5b&e31ql6Fgh4-5kZ`j1W62x9ABIp7#-}(4|*co!2li>Jj-FgkkK~n z5KJj70vQ_XK&9PtJqu27BM>eQx{OGYk&WT(g&+w`ck?r{G5o#5s*X4%31+Z~@&Seg zl2KgX>I&)^h;M%>9$;87fA<3wm{Pc1jcF_r3?|OriQu#cOB5ho4)!b(3}1@H=dfV9 zp@)IFAuU6b2kbv&GhehbFgMh_YnlwV0Ip<~U;@Jh9^F=OYa3(%+=YJy5*RL=k1fEw z=gPsDiHBj48>JdUl!=jy&{n>!2jZl#-rF{m9x)Fr01-=RvmPbU#$#)sfg zPs0gIK5v*AYkIR_$&$4%TleIAQY_LqeLSS_%yD++gM|%0|K2{nEX;~U?LK4r(v_)Y z4c)#89~Q2xLiQY7s7+kKwFg`X*r>y;a_ zrB{UNy#9P*Q`T{lKO7;Uw|5`Yn{$VGWvN0P>zlXCiz{~(zm)Ia^-9jPCgb+y4&u|Uz`(%4z}TM2z{0@5z{tSBAO(tW2Brl}a1n(C%m_9} zw%^a;Bm)D}de9Qh2+pJ7wn52;JliDm4zX%X<~CS)WBR-{WrxkFS+fEH^EcPtE1ST* ztfqLg)c)J==c?(ae*0N@p*%0@_$@~H z-qa?Snw?W(e*JiM?8frt2IlVVANFy&ue-TPJze?E=O-TT~q|*NH~0E zu0&)~$JFPqG%V&fZTThi;omut%KbNal9w#FRNz<1uX2S ziRNs6z;Jwtu)yYvZG9JI6xY0KP_Uo#?}?g!VY6JnW8Vrx%e5Npzb_V8iKv&bFPiG| z&w4`c{d<4TBaH+8;gJ0u-Oh@q6F$DOw^v>C_w2VV zQ4G2v+e@^a6iyoGNhw`vu3-vaF*8l~#0l-SQ5$B&6q@ADanW-WN!r?(Z80^Oq43z& zuo$~fdMC^mhV=cMs`T&Qr>KCnaTAumo^f-hm_pE(&+i+rYK52|+A+Vs=gZ#Mqh699 zZ>sR#5?pZ7W!=@LOG3TEI}enrymybwUd&g~C%IMObE=|UycCs_J)3gfA5q&I`Cxl(YNh@hQeLhdI9_uN8m!*{`Ru(obOX zi`&2Vo6d8bJ#|*93MdJ~OSHVSd|7BlWvNBQnfZB< zDv3qO8JT6NMIkCB`2`Uw`AJ!+$tA@?42*3H;syBqg1u8KQ&SwFiY{_+h7{%JmozXg z=jIWYkd%@ORmm&O$+^tS$1fl(7Va0Umz`Q!9OW0R2Q?^6B{?UtxOkDEPykj&)#Jdl~vGGYrBG_YNg zS5Q=nf|vx-7y)6X7RUGnyJRMpWaj537F8}%RF3cq_6K`_Lr_XZ)5zS@ConiVF{7Zm qskObcr*Fcf=^M80*}Lz+(F-@9y#$360|O(dSO77>AqQeW@h1Rf!25du literal 217773 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�HSwEDAB>dhqi?XvaP<*s{7h4jM|SXvGo zY-M0sUJ`21*=W?Jm)_R;zWvpZ_`~o_V?UX#Mh{ zTlRCd?2|YCd$A%laL$X3&z=AH?6?|xY)gFI!+5pRhvylXp45DOO>JlK$w?~9*Kd?C zQvdUGO?|&+_#DH>oF{tf4^sc2x$MZV{w)&rat)^rv98=_cKzOZN%1-=z z*tYxlgUj)MJ&pE$*%m$N&xQH_6DO%xhW%5yKmWdH(%;`UW%GM}|2$Z|W(Rx2-@omD z()>65yRme-y5;9B&($rnH`T@+SSVHIud>*^K0t1!{p%8chrYj?-_Kw3|IWFpmY2_|&tJi#*}t4!(V&gvz>k@S0_?BPJ@zN^dW84C zcl}>&O!gsKp=z#?@F0Y$6?~4U5+q)h};r&y-^>ifTgep}1moc&~BwU6GvC+jEg z`yz3AQC!LFqXpkBH{Y&ma{c+<`p<`y?Ypa7CY`T)=jpl6*SzGc zKldZ}dH=tLkIlQo5Bxc(e{Z3{_rK<;|93x6+`qo~KhNjVH+8RqFLV6=tMr-SM?r1R zz1vs&3~WB!5UHzk-gv>r_-NbKYgcTUZ(pBbm+tAWWxn4t@J!XF%9MYPKHv9wdh{^A z+Ru9PdcBj+@BDO_WdG~TDwX~_8>~;h>{kh_S-8p8w&c9Y`O{xiw`nJz-yJvi)c=2$ z+qfSa^nbj4ub=sJq0LV>p3mnE>(9Mv-}(IO*Bb}coZs?iUePuCw-at`oizJSu<-4P zfBmcf+h!*D-BfN|c+%_6-U|`Bz8pQ8OwOr)eB#c?tNfb&XYcF%VM`Gi!?Dvr<;T+Q z6my1+?_b{Gy>R#Lg|=9Rod#Eq7c(jqpMA@8Se3nDH(Qo_R3C%-6WcfH7oSG#DtGCb zTc>--Td(4q|C8vuN($!F4OTp6ZtmJGu#A1#d7Dpvm=>Sj7^^0g5`5R6j{e*Ky?Xz2se2zLZC=BC?dGOnb9FD5of9ha6 zX@=!<+YgSPii((OB9F%9AOG!eiD&mhuWwBUesHH>x_xruir=$S6ZR`BR$Fb${igYY z$M&?n@qf>4)r$28?pPiB6UqM6cQ?bfh-vk6Z~y=Eebs5(c>PbC|La%%tt^?EviHen zZGH!4pCCRX&@^oPzM4wyCqFM=Kb05o^%DaRmzgQ7$6&BeFk{L4{>@@#%q0h(Y)Gx& zZairY^MSPuim!Ku@-f_h%2S3xmpi zWwzOGZ>2c$+&}wyT~W!K<(8lOd*)Y8Ir{6Rx^b<(!f*TI{|tGIjO*|9r~eiHeSFU5 z|A~8QnE#ZWUG(91-Q$xdzkCxu%lzSUa;?4ndr3B*c82d0-j~mRx|89^8E%Vh<{x4e z4c;bgHoV;w%eeZw%3HD%LcRTb4jYv{?5B#EUmK+VJ|6x5&-WEC-_+Z<#hw3?@Z+sf{WN7w7Ctvn z7`+#H^KWYdlkb9;du|6;HwkgZiXj)_0p3E+1cPU~E)h=DDG7 zQbbPNdiw)EBK0?&VP>eSU`S~DGTZ;p=i8zu|2<#g`exN;9r=H^&;K|Z^5y;V`FWuR z|EqO&?=z~c(t2)oG->~DA3n>Lbv}9bGKvl=O_shk%jVXMy_)QG=e8Cz7j4@c{6*H1 zZNBd1!*iB;OL2Ys{e0t9^GFH%-rvVQGsfO|z1wJm_P46O!^+#vE@)C;khYHhocIdg znMuAsVh;Y;d;iXS`zwF`G{52O`28>Q`QNK2f0g??Y_IRDf6mGH-C{zCVu66N!@A1_ zZ>20c7QQOaT>CHY+ij0lM27nTT8ecb@qMNLBbD#_zwiCOfA8krt!uR2|FBGFD_C-E zRmUf*D@vKtAC_vlbsu&RqasN8CK@9im^K<*f_&z0fiG%6ccjCmf08hLJKG+azSs73 z65v-P{*lKyo&YE%@0|5fodeADB$@I2^sG3~7HLr=-oF{dJ)cCoC86J*q^ zcV&C_PR!tU)$4gv_J4abb$aaG>+APS*{{SK`Q)I;{_oy@r~Ils^Yrc7uB`PTd#0S9 z_hUJecPX1g^?#vhyFUHCv@zu2IX_ST_y0fNzLfqc+pg=4&%7F=tv~j^to^Y#cI6|{ z>lZJ-+%4v&ztLDKea_r%+tVNQpEG*8-lL=N`pn)pxf51yu=~g1Ji8(2wB4%Ba?|21 zPQJO-kUTeZL&vep?Ln76xxZhv!IM}QzKm!Ad0z+e*kcKSdg*P=S z3GcWLP3cu)e6{@d_s!c6y)@ZuIwSaBD>>rr3!8Ii^ z7oLj0@2**I8oX*Z;}rGQ16slXELBsV-#B*X*}uB&h8oEZ3=nT$&}}>=$gp#@t%R+- zLbZE?t>OiH!2rR=MIH@r&M)2d|IU=qwBy=oyZ`^W5&80Ek!GeV$FWF*P#I|Z+*(#&|OZf`jwVv2pxk59psH)jU_*|qwBcG~CQ>VJ~uUq!t^8Bbh ze{-Fa+t;l1tCW_`Z`HW6FlklcRo}{9ZPxs!$*yc~Jll=$$|k&gGGShaM$)qdH!rUI zzf=9s%gFz;`q#dGlit5{o@UU3-G*oG-(I&r9jQCNfn2KfQKWU9@g`>pe)+ zGje?CI&es^;d%X!!<}hAkA1zaKI>)qk^rBNDgJMaSyy#9h;d$cS@w1ECBvGaeK&71 zXqspyXu7@Ks1@4ckk4;YZOymrRCU#}nVy{@-@m-6S>o_>SJ=h=#V49h86RC=nVE1l zyz=aM&3etcyYKDgZg2j7cj?@73@7f`>U-T!`f+soK2=Str0*ZSJG?kn@11wYyf&`N zE#XuBexKE6&Yyg2@BiuY^kwfeBwkuFRDJtz`F!bH`9FoTwB|qS+dt*t+q~awMgUH#rBsJen;%POIQdbL$$%WYW{7#KMm7?^5R0>bP?&-vzaUzyp^ zsW~sUN@?Dd>A_AnsWfk&M(w7AZ)^S}ms!Of|9##{J-6QAYw;3wwo~(teXQ(V zUG?;;-jrWuQsEOBzh3_SrLt_eu)Atb;#`MytQA%z8h6`>#w#k7T6{+qO;HvAO>LKexM=&O0w|Hp!@|t=)T~ zDz|>|b}5f~{%xxk^FXo;L!+qbh7Xbq=O15pPG?%OVo8aQq36$PR^6xe%R83JaU?rRgfFS?mAZ+aHkPSiR=vyw&eBDu2Gdo%;0E^Jg=+PEQK8_TGDcv-{gG+i%S- z`r1{0{pbFv5f*FGpWQb8na;ngt7`e)*!*WojOKBbsh8fLmj4xSPk4FA=c(#X_Dr%{ zsP!}B^L(33f1WLsDT0h&r!$4u&;KsSxHVYI`qb}`ua7i--+MQ+%jHHi=i2*E4$fa9 zrfY9&TFZC9<-GlczyBZoJN+e=aq{L%#%jU8>-uu;yfM1>CiOn|`|b07t}lufUtbdN zkI6+!m{IfpjG9B!4H%Ue63wnai;S>o4r)HH<|USuH)zh7yNqY+@tJ#FFPtiWv5ukG z<&?$e)3;J9HFvK$V7H@4UT{L})Zcr|r$0>%=kgO>SadadRpF+jn}M@Jm&h;qVZ5~d zL1PVf_g#;NtAiBhZgge%cJuE)tFQmB&;LDV*0Pns|9WEuyCyF!7G#{e?0oh1nUjm` zXSi8xGG;!NzfI@6=N;X-Hoqz^W(#C)0LuUomYN&Tj;CVv5(HrmjBxM zF=Wo&_w~OrGbi>|PkQ@T{_i32D^o<6E(%|eG_X7+$uRMTRcw6x{as0$w`|;h@jTzf z8}EPn{{P7WPW}Q74mm6;64~Eh^JZtCoZ79#xOnl)+RNfMCx6+uxw_ow+3S5@->O_K zX0B0Duy)nsU#c>7d-jZtni_L?C2k5cZvFm#ed(2R?o26RPfxLb&sq9r&B7`Bex2`K zY+E_{i%7(3x2MQ`?;v(m&2~~ zb>DBY-}Y9#9m{AXZBTi~?{xI>m))123#FtR{jriS>ALm2nJ=Q%b;6P_wZ*;f{|d$5 zkNdeY_@DCnKebOzS!oF^d+zk&%Kww!_H?BO{B!c*V&pJ!S@7!p-?lpkbYOWsSLj4b za&Yr6j|1Ozgcg)@%2eIWp1g4W@A>z=f?S!@zS%VR2+q1>|7Y=kzgwC4F?HwP)V;lU z?#tUot@A-|4gD`^=DYF8ottIzJ27}?xNf~lx_Y5NKoep{~9l<@iT-+%T7t@Y1b*L%F#^RZdp=TiCHnxaW@nsR2RzKDNI**|~z z^6%=;m-u^3xwJiPvCqfsn6Lb{18l&?SMfA;giFP)QS+DfPAowqkQcjlZ_&zm)kZ`Rzlmb_;F(^GV!69bb##uNs@ z2Dgt%GLXD2px$^)nPJv8CC2*i7yFmpo?q5gmGpk8{QhsIo|muRnAvdg<#P3(Hy6Kr znWdSk`TsEcrR_I+-ER5%ihf!5Ieyxg&u{-m-!O80Hzg`ek2SNa=$l7X{lByph0s5@ zKHm>{(a6zqb7ptKkB@Kn)fQfkWIJ1IV0M~=*&@#(*5 z^|k$P^5#ss_Wo+zXYP9CwN}~Xll=JqnVhx$ziIoe&VHV#IKgI}pa-v(Zh0=UO=RCW zt{ak!_w`o%xofd+z7p?cahrJE$tF+wPi-y@)i-~CNd5QAwRKjH6aK2-|GECiqg$)v zR8KDf)qhc{4lD~o@9?lOf{J{Bj%J5!K?dLN`gWfL-!`ec?(%-Hx%~dzC;3-qHssf< zpX|@oubzIlzV^sD1`omXa?Tl74}V{t&SG*ead&;)^`9#@&F$t{vCx0%mnl)TVu~Dd zO$*9Q=6!o3+BxI?+f55{@nk4e%`6dMd`<% zbM>d2-TTD-$edPpELWt(*89j-6AZf)YIoq-122&;~SoaHPQdq+Rq-QKI` z?H~Hz^-yGBV58gVU;l?j^>)nz6{b=0EeZuF@GRlcUybX1kW5 zqWb=H==zYiQ>H(lK^L-(EZ(v{H$=i>2nzwCG87+ijNp{=&N8EbJ z+Ps_hO-Zdr{@L!y4U6XAK0UoY?@kUw?fgwmf7s84zg|7tB5m21uPzQ>fBo8hZ)#1= zGs$TC&ljQ?f(CC$=dg6QMZt$&F{b7lUAAU zSK8bE_q^Tbmn#3aHS?>!lz+ch$Fu)cZiUc?GSA{ObC=DR{o{G*-h07(t-{s*(Y<^( zEgl!2^Y!*Q=yfo9vrgddnZI^!|0p}jKIk0(t%{qqe^+Y0{rLLSnfG6_4@~$}f1llM zftu&4^kVV7wtf>EUf=sPZOi|)+tps`25m_zUH1FBZh~RmkAqu|Dd|0K*V&Zx^=918 zuiw3Fx&q^tAHNc6E{lnK_YfKjz1E zE?wB8e>3j?k#E0B>;La9tN;Jz(%#P2>oFx0dDLI#ZofNiNzlLWm_pZe`__C4QF)-h z_WSW}C8nS=R@I4rH*p*^*TGQ-}AO5x39Wn@=Ok#^q3U% zx>z*UcQp9L-v7&AKR-lvL&t&d^MAQc+J9kQ$M^QKSN~SbGf;oJa&Lv?wohlZ7y2-- za@8}HovnR3HRgL~_=IfLKuc`-2r#V#4)ttb*X?0cnx?c{j zm^>p_-(2j!Wd7GBcA7O$uU`E2#r+h!$bKIE)3Ifc4C?AopFV3-e=N9UYG7bdQW3~y zIk1__mF3;PH|dj>eZTqgEA#ezm7nrABpK&g{m-pl-mtD>$qe`7mnQzpc%OQb{cdPN zWAntlEd@({f4v%CcKP1Ya?x}7 z6YEb-s($uqu?DXj%e*SBm#fn6`k&wWQ)>E5ztgWJe=eWD?P-9}uU-4=)&*WmSf>_l zu(@#4cKfKcyV9Tf{d~XWzoS(Z1B1Atr;B4q`q%XP!mq#2yT0G<=a+ltdlc>alvs8K z8G#DkN2&|@qeX%RcwQJXeUjB8e-hDS#?QXq>YR=E<_c!Lx znDD83r)}bgd(Yo_ohl7)JT`IDwY$vwv(vdnGy|-cR=GFM3t920{^pOYPl4f4!NGsN z@A+{wb8^F@`me4pU)FuCJ|j{uR=MHlPu4G8p>-y6wUj=XtIwUnQ~Kq_MU}tI-|K## zv0vLiWqYx~?MK(+_PqKU!(`j<@O0r7B_8A6WUty~9=$hrzPb`D%>Db!x%F{>Pkou( z`~B+n{kG;z)qgByQWO{(<%BNWpDwqn?=;L$I$j63Pq@A za@d{iPfgv{>hdh7uK4OVR?ZJZYRjzRnb|L0pZ)3ovTlVp)~dZRFY4;n|6qQm(Z;}{ za3PxM-}k(H^`^%#$4^n;U?j-!R=0g!hF!_s(&(U{SB~3Fo3i?UdFh|{>MPf>b0#+a ze&bn_>{+pT|9O#h=Xh4!y|Q<%fAw$wUBACiJwK=9ar?8WTl@bsPuYJbB*md}Y50wq zjk5eU6GYDLJ?!8g5yC!SD=6XV{!6hO)BZ1ewe?*8@_bvDkJS^NC^9sLs$clNUwidF zyEFWd*2x8q#;KhQI#sHlxytRoufG4|*jmT^|Nll$-yO6*;%iQw>1VI_I&G$fWm@5N zp+V=5&tLYR-`Y6fdX4Ek`Q>`QZ#05D8P2r&SNXE_uN&_}eAyVrvBrmGfoPN|kJ8fj z>-W^`Yg@R;>h9X~!+T{0-NGaZ4u=J7OhHFXXS|xq zd3Lsk!}@8tPv@#KZTRGUh6PlrJ1{VPX6ax!W4w@sNnpjy29biZX@=~K96F8-90!Cx zyx@Wu_(GdeiJ>;u@=x0VF_tjb%EQ2qj{l98W`?H0WTff>S%qim(V9c0qzSt2m?6OF~fn~wN)Em3Y z^NkK2JLYy+`RUp0J2je?97kLeu8J&srpziUp1Y^fVIG5EgAIQXG^QK{6qqhtGFp5h zn#p!UqTaqAkK)cpbnU!8`NpBjv)Q$^wcWRVbnET@^XZ7^S>?L^j|GBEE(~G|-Q*#~ zr^9(p0mc_UnI74({PJ<&ip-qZr#fADy7M+=l$)_{qAdu{`zd>fP{4i$jL9J zbFeE0_&A*U{O#}WZt3zHk5+HLd+p(iv%I?hQr$0T{@(QVc2@hR{O%H&#{!HU$+91q zpebC7QHeqKA)hU~!V(#$x8kMdDg7U>Z+DS;v^Di{2bccc&FV_|X0e*mGdXJI&2_*2 z7OsBtH*SCE=Xo3lR;|_e42_W~pzvi`k~&LgmCDz54X(dWKX?6Y{LihaAh7O{KUZTq z=Yl^!<&JnXa5(g=Zt{l)ZyP9*Bn+M@GBjTFNEcpqIkV~Uuh;A4S;VINSD3bQ`(zcS z3%8dZE`)^Ufk!MI3_9of<_R=7xH9cJzvoRXqv%=p>oK2u&l$=z9VldSVfY~h4NW$W z295&^;&V0E>osQY|JT3swzGPm$1g# zKYLx380T?Ra`5yq2sRwlwG;-Ga14wb1soIJgN8d9IUEuuuyio+6y2O@0&Xhs%w9i zoa5ZUalou#MUz85$CO@{1%IkHFR|ciTn37dSq9&rIbBdlfl1)uq6b1OVrmOK9MT&0 z{^MblS72zAVN_xO*FNABcv#^8>j8snGb5ocD`MHfaN?l?GgwkUf{js+p>5;2GeVFA zH$nLTs{BapT0E4dw6ec`1kH${U^gAPnzL%L2Zx8=!VQ10%CN z78d;f_jk3aVHz_dhl_s$hr<`|mS&J03Ji_EI0YD2%-0lyT2suDbo2N0WETdPCJ{(r z87MF{_cCmFZnYraGPo5Kca4@zE)35m1VDxh1tMyhn!6cVru?ti^mprp*?K!wPURnN zWM-H8`1;T1^Xrf1t@-ybeCyNRsngR0ch_(HeN%M5^}9X68AUI1j?U|lynSzfLjM17 z|Fz)8A1LcYXfmy}$z9=@bbS4qwA(kY*IvsCUh?It-jW}?cLhz0_nQ65`P)=IDb9|o z_J3B1-Rzt?ec$|zzr}aY-}vG4#D-0R4ZXd*ihV}93;#SVSFi8xWZ{_1L6=8BlFcDy(DKbw_ZrHrK1 zOOCFuvJY8tXM42S`ocZ+THn7pKizkCQ)O>+{8Nv%ij~`6O%0dQ3a^b_dF4;8g8PQ%lwrH1^#8t)IQ<#QAl94zK?c*|+Fx&(!IE z`tI((@wcZ}{#5;ylbQ9k{1+0wbl>>fefRv0AF%}oS)HbN zufBIaers*s1}Wp(+n>J&t1~_5oX`$RY>XT{4Gvq<8Eysr%UxSIaZ%`Aky+nQYZt`F zPnj-s!NT=z?cQJQe>kRATQA)6M*sEv?fvodJZ6dK$4hgspCG@m$i6=y?sMF?>aZv7 zfwd>>r(S=${Eg<@Tlzm2Zdo;H{jIpiSLS|;{n^bf$S_d>oVpn~csd+P(iwII{rk7? z|GITkYFQE@?Z3oMTNJQw4b!e4kGij_dhVSY@#paRqUHa$&fECu(sbRj|4HAC&FX%C zdn>$2W$mgbtGAu!4NFc7ow9#|07@EgDP~IuowEP`JCBRgL+|XfuLPxzTGfV6{nbx9 z7>?|KLjuP@c;`onp(+J0~St>59+`O9_ZNrnGAsXz7jBl)^a*HcRu zehqoQ>sskWk41ktmgd&}KkAtO+4|q_8t>_=>^82?`mM{pcAGPSPs_|R*K8r553VEvEhg#V7xRq(++*?7+q`&H{_Mra?tW4E@Ayx-WYH4swnPHFSf7ovwSo?Op8NEiaxse^oqs_o~&a zFZ^7ze?Rf}?ir~KbmVYOO?>4Ibx8?@6$HJvfzZd@B zVn1bnScYkk62t0^eP^JJ#(>TPm%yb$+{^Z~mD=wD_UgxnF#gsq$)9e+qHsZ;>EHKb zi}s5<8DD$fy=r2^guTm72mbRF?mKKJ*kEyuQ6JiXS}PP`!6Y#IQ~Z=!>;9aM`}o>x zUxv+1-K^!mHa%WltMRq^>cX5tQGwFR_~EA3zPujYz#wu#oK)$0m>WwAfKe|>87 znS3RN?!v|5kSb=ubr!ArtQWR?;(z-!yq2x}MQ3aszh9T#k^{HHv{FF*N%zLr?!b-zx83cXD0be~tL?SARd0?Tx?l{5>bHvOi0L z#OpIU&|2D(Y3X@}FRnkIr-dsn)=rAG)PC=4BHQ`lvF7p58Y7Z|GMh(`b9K7!-+R$3=C7MmTO0cH(eLSJe}61x zT^~~R=idJJ%gaLl@_qdF$H{Bi`?_Q2HfI076%}7wFYf#G^F`D3O8;m7`)Tv4C{8UYAf;L4enGSL|Ts~EQZ)%#?o}#adSJ*AdxN5hgCp6ydYDMa8 z@vW=9AByw}ue$ytPV(2ctmmg!Ybo5{pA+}E{ZGi=?d|oNf*)6&^0&GD@8`t*Qt_F$ zU#~2zy){jK*XmR6zn+$#vfqQpSe41(OlkTxu!RN%OvQo?>!#LwBu$_e`d`(mIDP&Y6Cx+IKKH2TC*?BxkNUBewf~)7-zcq|SikDKz5TuS5p{aIzA-<2 zzhCn38DU0=XS9d%-<$HIx^?v@*I-RX&E{2Q)4sZ&D!Tab>HAG} zC;YB%Igx+0yEycB>DKA;iq)&$pYrduH~By9@4ahZKMOzFmr<$nI`SI-ytn&bc=0cm z7i>seW4syK%6`J}CMWvmbGLql$5S6}I(5|F^IP}28(00`mdI~D)qN@TZ(La6%KC}& zu3ue0U$J-;a^>Fj)%7R(19ol~K6UzEz@N)CN0TG#HZ9)r>U{q%&Dd-5XY((9eRGO` z{U6c7+7}DkpIqAZ^4PIs+rH+8%KiTxQnupM`>mSU6;p2uGDbYTnwkd=JcdSw#y30; z3+%M_z4>%{^ZDDgJ4(*ad%J3-wnD&?KTADQ(jr@xt-V%jt-J7JUW*q`1H zUv|ZWzjNiiTsR26`+C0rMKd|AohvhF+>Pn>)?u(7bw0AMNWM90yM6Y6?R; z86u#>D>AdXvaRP_?d|WakGNJWJ*79Kb;|#(*W;qIY^H!LybZEY zPgl4Z(pYKX?CGAzEMUc~@KoN+mls?nm^daFoy<0$`|Wy!YxRGP`iW9yv;K?m&Su>V zYvHsxJd|XJ_3XPV`aFTdFc6fECJJ51{J-hl!at`cNx4}oF&vIaPve9%4NeGZ^f0X0 zs>FC|GPt|rV9xSq-u^uuf4`fY|90K$=tLpZ-gV<8L5BBN|NZ?vd6BKn@B53vjkg72 zOyzef({;;s-TUqS^ZKTqtv-8%!DHx5Hkb*U7dMxu^p2O!>i;@ zRZy4;G&tmQ2r#}l8}v{Eq{f0{!*luLRywa)1shU1FUdoUx!}y?!ces%V+Ri-hrE4I`@Yf@x4D%VN`;Tgf#cj^0Xs_v z!P z#BXSja&QVTb`%5_a3V~3pXZ~*aCc*R3e=QzmJWuJwt0=9y5Wc;!&CX=R$Jb(3N~!( zG={oGfr;tyW4kj-ADG3#)t*8e)A@gEAKdQ}RAAbW#C@s+EXu%?%2B|!fJgNfsDUG) z#yI6a*LrL0BV-B;jSqz!e)1>0?PTCdm^c&KwLKuL0Bg7##4u_6XIyJ5*ubc32I)64 za&#Q{&&<~&{86;QPnv;&fx*+&&t;ucLQ`h4fh7aO%$UvqKX+a(DJ}*E23}7OmmmfP zCI%4ZU}Iol_)>A@7Xt(1q)cb$08eLUg@B^`w9K4T1_q6ZwG&QzGX;tqv){VHg>#i_ zw-|GzHt%NN(^ni=m<^lPh@EwIKPcHgb0Sw1TW%DGZdFc|?yW8B)^=}m3=nbL@>>4I zR?eB{N_p0vU~d2Xc=z);)$iFYwpaLSm$5Lqntlz@IdnE%Y{$Cv9T%JJy!7>@qAX_m zG(6hV^x7)%`Nhv*e(6QXb*SvFjXM4C$??<+e4SxMf_fmCk*Bp!3 zurunt=ki5IwjY@@zn+x zk)?Ulz6SFtwppZ2U}0xW6$xnRWC)!q!mMf4KjUWTWL|ggTeIROd{z@zYu^+TBYON# zjE001`;7bhYjd)eIwyRREeM@8YXfsk4pTF~@7Z#OFO$NbPnTN%x%8y#%QH_KrU!4b zWd0J*{LWR`TyRtUlTL=Y{?oo%F_q*pZ|zF0m5U5}JEKj$aaC6J^&72|s}=V0sjO?* zTbmHF%zFC2k1KY+3q0Ju&6ZbwKZ9gX`KC+jn(s0&Fj%BUc&7RKGH5X{FmNz1wr4W1 zFfcGMGB7Ymfg+rNX#o>Vgo$ARGlC70)i9X8pMk-F0W^nF!T4q_=bpQvrSJbgzcbsC zqp?M$MaA54HBXjo!>R_xHKBpp3)X%OzO8jWU9>&yfL-oV%`W3>ob7zyzHa6Jy~=_= zgVm`+Im$bAg63xr4&#~cE%o1Q-S@lb+RplOJ3sH-X>TY0?$`Rg*XPy!FU~)gzjo{Q zbt1p=V-yQM9u>bXZ~ZW9>#vB=^N@9%25uZW@%#1|xjFM^Mf`njsBz`j9tM72B_^j`9y-`SNq-iu}0Oa=a|Zy44-z8ZQ1Y$>4$Q zoR)2Cuwjt>=Jco};op?QcP32n=4xzISaANl!-Yv}1uAM-_@1PxHhb&sTyk*3Wn0Ei z3?_T@G$AfhU{PaZx+|PK^Kt&vi9a_tRoyjXoKtvAQbg6W(s`kXVn9=a4TI`|6%ia; z8V_VHpL=b6=uGtm@sIg5rm!zyj%!*5zR6mE$thtA=uV$4g87DVlAo8~oS8oFWb&k> zf4l`A;1e=>B$!gq%x6sIJJ9&4tvH(Rh3wRFb$*6?Klr6pEKUw`4Sbb1lm5wmQZnHM z`OU!rbQaT>386MjvJW{Yuq*5rw*?=>)Y2d@!vb_|*Rl6eXX<<68`{K~oE$i&C>Zpd zvG2PeIFF%{;ZgQP*r5ptObQD82PF2U82&e8iaQKGFD6RCpy|y1qbC+e>+&CX@o4Qu z*wW+@7N$=OJ)g1#KFg;bFr5S1aK{yEXHZcA3phD&_$aVEVU$=nUH6&2 z(}7js8v+jq2+nwMM*hbWMg~s!E_q=N#!7~^pQ+tH`HdI6@&lzF10Rl#pXN-O{0_=; zmtfxT0bSW5vFy6eGkYJ0Rnnl~JYb-#@a(?*f=>)z`n$bg7Ry`#1>}+I+RyA=7_P>E z4Rqq@_-Svq;S+<6o!u%?P|$KPDi#DNDexaqh+jS9zd~cMG1x>7kcn~!J~3=*pS%WU zwM+=e!~@qgpV>PcNC8KJgeuFCKkRH=bUl|tbK7$ z!;JqA7^br)6zo_z6%_am92|{>pnD>9pz24GPi*0Rg7RLXDj786T`Y_~+v3Ctaf2r&fjNu^i)N zy1HuL@BZ1-mv(YB3OYH|v$}Cal)`QbT`*a2#s|5EvYGYj`(4iZ!d&P8%9RT`PJ*oi zIoYwH!G@tuJ8F0O&(p~T0yVF;vOuiWc*1z0-2tYL#U^vyTj81x|93=t^a?FovAAL@nhS}X|M#< zCdxRM#bQmtDoE-);<_Mi_1E1Mdzezc{xu7F*rBYzf1ty84I?aGO5~V6F_hf1mb}pO zNS5t-Ty?JV?}+;Wnywrije@QZ9(C*Iy{LbBYAWxqfT@@LtaDey_IUnY^_+7}#Kt6_ zW7ije%H3Zo@FJ-Jl&sN`Im>?mo$$#L+ zgLQ$hFznF;6*roHnB`@j#jn2}{P^{{-FlvL1agR@!ZQYg6CRaJ>*BX| zDO!2ORi8Eed(M3~)34UlD_l<*B}`YCPJkpdD24ss3WD#dfpvOJUTJ^Dvk=@KZj zIGouXw#mNkO}fPI6H^{QqKn&ZArNceQCgs3hg<0vSsK9?<{?0QoRxH?{ z%<#GWz5C2*0R~gCI;Kw2} z`+SQHLvr(OH(0r2unZKe%RXcmfD-C~gUt+Q>KABV>TFN*6VIZw_&Bq`>BV++;WY*4 zV&oc{Kkv;71sTMssK6oz3NJZvxlnNZ(Zayt;wC?{{z@k3QsNWL7iPY9-3;IPvk2tm zMITlbgPr`tmEjowX7`|Tr;;kKY@GZ?2XwK-n(qs5!cvZeC@ADbXP9K_U2gZwCCRE;kWS2#Um&LJC)Vjwy!ahQB|4=3_Ssu4G_qng+k8 zO-6;|1arZJJs!HwpsZ~W!jkZ7z^_Q^44XEf@!7q^aMqBmmisie`^i_fD zo&ynz44eDU%>5MhxvMNN|7zUVh&? z7ddqibew0Hi>q+jF@L-9qnh=)thD*ke|q+5FIx@uP1(v0k23aG`>s?$^HWj-P}Ij#u;Wi0B%%g^5VWOG_lpZ?#PnKi$v&HcxT7LWPju zpNsuL!LR!HWv5nh7$pBW)38z^y=XyCo!M*V@Gp(09u&^p`(VYD!}0I$-Ocx}Xj`!- z<&=n=YOBL>Wr5`XJ{3p1L|+O%^RpC6>+h4vuzag>oE=m!^nYIx2}y4a0uo^?$M&*6 zI5_D>UCJNVgg1h&Gs^V%efF)ilfK1l$>Ljf&f&BTn>s5$qb1Ass@?5=ma4oC`{%yn z)JXodIq}nphWHTos<{ttn&^H0{Jnqq1G)3E7D*2;uIw!0R4Te;&B&Pa_Y5l=C{1s4 zpSHF8>x)T`K`HOp^XkiMV8s;=XJg@WMultqkK1l4C-zNz=o`J?j&W=D#YHNoOD^ba zUTpU*-c0ZFB3Yy7au$zMY`=7~KVBmL&%ji%{ej?jjtl1_PBt3VevtfB^YM&D-fi<7 zpV)JSX>wnC?9bd&zffeCcmDT`x4Q*zv^LDMWtnZZeBRBi3+^;3?$0bWU|~7Ix`124 zw(1MRk*YTu$K^oj2GlTk{QGYv{G>#-)&n~}GHmFVcbm3(Yhug3ni;ij%~jJco8@d+ zB{a9pw@kV>^AN+vZmW6CG4J`$%r271h;!f2Eyq~I+%>_t;PCJJ^P}edcvpV;YsZQ1 z?{6|+Y}Z+KewS2_d}sy#+8MtWwXS^m?d!jJv#eh2XL#nHdquOq$WMabpXu{jmh+Bz z^0qAdb~jXg2wKO`;nBy&l=7SZdqmQ|!@U{lU)1>>()X~Rbpqu>P))o-DZuN7TdCMz z9=6BJxt7Hgs&OvXOZ{Ww!p6pR_%zSFsyB;UINf$f^!Zhn_L<>>qZ|B6 zcJ*5AW~&pjVQl`}7B2RfeZ7U<=TkeX4m!-Nd6&L{e~)~De2)D+K7Pk{%R=|ZoqsNB zQ_=s4BSl61%Hi36dj9QrF;zSK*doT4%jcFwZCc+}?9X=Pq=Xdz)nvmf-<0=$d3t*K zcBw^Q{4-a#9S*d=Q7_+?obwfQJ{PETa^UC@WRjiC9B}N1vEI2i%c{)kb@ZR6V0cbXUIq~A52Zx{D%oxc5y?tU8RO+|hJFw}CcQ+ZthQylI@>u5 zgQ#8dW^MAfvp)$`?CuGF(Lb5v;LOy_>kJ+qd@PM0PyJ!v zrc{zUNlKnx< z>oczR)ooxuzP9Xkyy1PnH-~%fw66K=@Y`r^-AaC=N0*)me)uL>{>*tD!+Xbh4GbHu z9CuxCIr%}qb!BLuCCG(8wJ(6`H^`xFc1+377&DUoHC{9~teYXViDmVPH{NGH?JIdR z`;EkL$(ZZgcAsr2%6G_P=&}9Q?%q&Ta%{2f(~Ik-`q>BnsbRKZOqm-jFR9UEd~Ne- zC8Ov!x27>JzoTdLMOV5wG@Acj{?~iICs*cPTX;>U&-_B&;|CQ2k7_m^Hg5RxsUv!& zJHz>g(=Rv^Bq~|J9hk<4ZVqw{58Xoka)K(hmIeU{c8;E1>tm`iFU6NUY|YDDq%z z&F=iNs`=&b`v2W6KJevpjpl;-Yu=Wx+4!edu*|YyyvOIyu<6-n)pX~13=Gpmn4A(; zfZ7KkELY*patoJ)Beo0%|9g6kXEmn%Jp86}=JSXh@87$he|+Ffk>g|L9=qvD?}hvw z)|`K8U~Qi9QgVUvF~{Ze1J3<E7QT7cq_1=hLhH zdYh~7D_#ZPJ$Lk@`jYmy(zX9IJcbFAKpxuxy3KOOgb;gJtLc~^lkzjhhM&iC>Sx%W5pi?7R;*ceu4R{5uG!?g z`Bpts+6;8BzrOv3<-jiERbJD#bC;cI&g+U=Z+j_k-Cf3j{kMM=H^qvCc5h2>n`iyu z+1}rmnSa05R{d+R|J9zK_cn-C72Rch{ME4DIDP+rk?$OD;`W+_?y0@iqoV)oMXG06 zY=z^bqrUr%DxE&?G-R)T%&^)1RG#sfih~vA`5Wqf+)UjOvi-e>>Q>9T-3(`}raYfv z^SJW2P2cy~ZzbCQCA|6RHZ@V|iV-uIa91Ve94lyll_DyLn%`dF)E2&$NB|wff!0<5`?3 z1~xYA_YC@9&ug|=|3>h`&*#71d9G~#b=U5`#k&6Ozt>$goAfxe(B}KP$myq6zZ3d# z&g$}cyN@?l{@L^S{+uWFasMQ<>p%Od*{UCy!fc=T$l$;4>$P3qn^XQ8{NH`>^uFXn zYl`dN9n4I6)iYf^fq&~)>C4Wg6X)g!+I$6(1Y^QG|X?`^5+9}mw+y!E2ervGO;Tl`1a zPb{bJ3aHtBow0PK%B!9GH?d1dTC(MdOV%vSIHQ}e&-e59JB<>|=MNjl>1EU;h%+or z|ElBJ|MhLzyn~a=-+BGwHJAKs|B>Z3Z$qseXTMI_rdx&$orf08{dnC*EY8P>->q-w zbc5<$tJiLpX?m4(+HgfK$8MoLwR+#r3(jLGIA!(ioo2$EL&-nin5}r^$niM6S}sEU zjQumdmZDit3s-#SDl`629q>RfW1@7x*YAGkI?l15@ObUW!O_SF8Z=>GoV*iOTs1Q` zDpoTneQy7_g^B%`{~3GZ|2x*p_d6!!ZLFVRVpy>0^J3XE^NQYRpZoA_P2}uVTJ!G8 zzh!@`nBeeUeCs1i<_az?x!>n^3pCljolt0Jxt(#@j(amqtGT{e6xZKYEbG3fuD>~! z@wxB(X}iu?GCpBC@aN$C8?_xD5C4ch`X%v~?|k9+=0-KwW-hIl)0(ZbT=Bh8U`LKm)Z41 z;EBIeZ8qpVYh-W!x?x{ZbLwUBedoCQto6SB*chFc`KEIA{Ot_P-~N8Q*&$J{mr>Jj zGF<#tUHOc%zK@5uNY56Xx$*D|^Uw3nYzr3^UEyeFf1sW};a^Yxykh1LdoC#MX8H5Cu>7#?y7}*SJL-Ku zuYML(8woI_a-3ieXzMuzYaq)U;o!N&JR$kNL3Ij?_LSqse=inqKJZ7gKl0O5<>$+^ zHr?v>dR#6!!{BY_$MDrY4`y6PL88dYsUIkx8#K zebbw+6VI7*zE5W7eAFJxw#K+Gyu6?3^*QC=JI>V4Prq%S**>@7dzHQX1Md2-*H?NT z{eD&W@%g_$n18=LdFcGtb9;=7kKLPDpSs!b_pd<3GXBr^pY3M&qtI-%+dS{r`zyh= zb981LFZFjl>i!0t*~04<$z<;fd#e< zg?}xd`L`N7T$#4%$h>TBndE4{y7?t1L!Iqj>~ ze|GJz4(czr`IB&%qtrf8znW=}nen}~^MW1D%=tRiu;%=^^tn^lz7Fm$EwjFpQ!c#W zyzQ||pPwXr+Ic|!PjSfiUz^`=-OaI2>TSmR-S(dyQfHbySBp5y=Ex#^Eh-G>TK z%;R5wLXJ_Q&O%(FPq>(Q#c{zYwrumH13p&H|Nk~${qpJaR^4ioKwfXG6P&=lAU+~Q z15^qMFgZPV;FfSeu0i5=|IPop50%n770=vHeqd0S^lygg$qoMY#`iZ#>@N?vpYZ!g zv6%hF?+1RUe~-x7Rj~8Cf;BE@dhK7QyPbn{8OoZqDLtF7xc z)lMzk+w$$^0r^)?cy`2njA`LgH{W!xa^LJD*JpnGTy|6W07IU5Irjt318b`47q>4f z@Mn6h!Lf&(AFvwS@jUmZa_z@r_v$w%<}9%NTKR8b{VVmI#~EwqSId2} zx|4js>LW|a-E!WP8jG9ft&b=NJmXBbqb6CfaG%~Yei2X_+0xly!;s6Q3Ldcp4gRtV zGv!t@B)yS;Hg)s=L^VC-&&QP=cAr@ybM{P5Y=7iG*Xgz4io54Z)ZO)WI<0?nrR>)` z|ID6V3Ep&aG5?WIC#%+zc=Q+-?Xt;X~4AG^K#v`r2uJJegc zAGjXbudX`j@`JyjHs%exr7S8plx%l6X`^{=x51(Jv4!1t-&OpZ|G&~`@1Okt)1cXf zjpfJpRSN^UpmimqVnKoOg>CE#hbGLl7c~$pnQl;T!xVe_joq(=X;)7aSYDQEKJ(^q zg~4Vnb*8GGKdWy2yYl7R>|V)_z0bq;m+!m%HgDhie<|Dl+gS^~Z~H4|yYAhF8~^lc znD&0Zaro@H54)E8`LZ6Dx6?j(PvCZ4SG7=H>G^}H=BDq8>mQwZ9lU$9ZTNvI`wx@X zl*Fs=2$28!%gowv!@l}>qlbG~-pnpyteIC4@PVVi?tr)0_a)0Fi{13>5Wgt6V{`xA z-<>}8#wl+i`@diAdidE+vTRAJO#jb^k}Gz&FF1YuVAW@x$OP*|I3Uc_PzAE zw^#e>|D?OWRGe2_uh#Cm{3mm%cL~q8-<;J)mA9Rjx%syx^W>9%&t+#nd24=H(f41~ ztV$lc|DW#rewF{dy?(Lx7Tk+Vu5js)MUvXxBo~5L~ z-`UsKd-cZ`|Loeo)8ggbIm;jPSk&pQirarb`RCMvy^8O<3mrKB2FGuT6??H*_5QC_ z;buHXZC>x|`@64C@BF9Z!VZhy2rgjw(;R1c$j0r@zbCi3?yh@T+{v!`&3*s8<_-B5 z7lnNKR(#&~lkg{&h6$k3gpu)IEYHy(SQX6C*euyNO|Ie6(dmX0FD%GjeRLWBn-}>j z8aEzFm}q(I{k2H`#}}oIj{VC2Eb(6@{lfkmIp1&3zmt9ERpq_?sT?9lv$@k#;_6PZ zmI=ijULxhD)%I9BK z&)%ENU9Z1)k9@u29`T-+;>f`)xvA3iyhHxIr3u+V`{2KA4XYwXSL%bx#o{J=~;p2;)*znvFaJNy0P`Mc7~vo>a}?me!_uwM6#%kJ9N z!vAW^_(N@P=Li2jwLRxaaa`6X?fYggKR;ixJvcnlto~!@tFv!@_0LRyP`mkz>4sO2 zQdd55J8!h(>P*`+_1`bLFaISOeWv)*?gtvLPt=#?8u`2FmDnWwn^HVm_UX;Tk1E{# z8Fs5{9eHD${$N#U_L|eY(~LjvYJGO{$MVVb+EcGr2tIfw{Nstl(GQXT3r@d~)cDMC zQf?viZvzL%=iAFXS038Gapi zT?)!QpiT#07K@iHgXQo0)9qsnkDi(+Cd?lCZT<7xkM}IvbRjSJ@i)6SpUuVkbL+3n ztUoLHT4(>)x9s0<)zv*->H5+A+#mma2a?`>2|w^fv*D!D`Lbv8zfP*Y=KbpJlmECc<=aJ8Q&&F9ZoIkWzmx^S3{Sp4^5b}w6|yS?it-TrIznP2_# z(u2Q#HYO*Zx^#5qx1)KN_g=6OEWcZoZNIkbQE=UL$Nf{;6BB2;FVHtXAa+;w($9|^ zPwp}`?hH@69V=vMet2W^&vcEu!VP}=fBLa$sk9zo5U_Z=~OhtJO)f`&?{=JxAXTkYFSon;xaie`z zbJQ<~nRPc6Hp*ABoSN|JOi?9+)n}C1lg1+c2IIhv{K#+i>3^O_S{a|*_1*c6eKk{4 zY}z8Z)9T;m&zyYxP~yMs=Sz(uSM*-ITz!-M15Spv?Z0LDe?C66jzvO@wQqB58P650a8G+S|MlD5?l0@=rK-MJ8J<71d6nhE_kHd1e$(c>`Of~( z#eUaG!`c-RJ+jR!ju*XB-u(ZQ`I%2s^_RDL+AvOOD_j1{#_#Wq@JUDQ{da4gO#W`C z>)DpPtN+WFB}H{-PFPfNs{gC(b4dC3;>|7v_k^sa+NBNZ4Khud-qV+S3g7XE&G6~X zvPp?^qs3=VNZHRJ(0yEZLhqmN8SCfYz5j$$f&D=8zb6b&zP%B9VAB}0kX`XYk3-6{ zvtnUFlGgJa-|Tc|*&Dk5%JI5PeQdLM4&M9+O!i;xjYyu8n)WY5K$>qJ)2fqA%l5Ba zK6lcpQ#OnSiMJNtf4KeC-Tk%ItFmrA_kSbL)w`tmMxsvpMt`%mm;)a!X7(SEdshF{ zeC@M4(`WX)t=aRs`*!eO|9hp*ll*_bUOuZfe9i>X^B-av4NA3b1ulLUX8w3$$}@%^ z)eo;7Jyfjsf_-Q8*I8dI-YyZIT(k4|CjIEbwX+#CbXDZ}8((m)_*vcXbNbe^8~?rd zSolmn`F~IFwfU#i#h45}gstx5*(>^ax&5uFy}`WmZ;Q?gcBwwO(bYk&VdK&G#oVB> z3p7A0%reV{;Umj|vUJwZEjP`#9#(!(bpF-WlS}p$E}r?x_hRx*-{1efzxORG|HWB3 zxi*|(WBs{r`Bpd2SH0ieBakF3X}z)LP2#5;f&JsH*1{QrAZ*|UFzed718lzscMMA9#QyPoGewgb!!=?ki!+zC1F+3JBH_fmy zIPl=&&)w3eSGphjwc;}Wx4=h|0eTKDX*ng849D2Yd$pjw!vr6}jBgAFTxz0r*UT@v z$1AYR`;9!m!#cj*jGrRE$Q9?E`qlnu^3->Rb-#8WPX1rPR+rr6TYLXp?Ti^cM@)}e zJ-P1u<@px_>>^rc*uTB`f4(il-m>Ed-few7nRDa+yY`!7IfHA(8P4o~FRiTKGf$Ph znc>XbISq~99Dg@%oBa2POT!I&A6d43mZ@Q1Zzv{ySw6qeO)F|&O=a^DzfGG3Ui_}U z7y0>84s5jrN28$2f}6|&Y}vb*6|R^Y*1t+Tu;zkf1TE;wjAf%yPuLj{Z0-N{l`b6#0WR)$tzKRKCm9mQ2e3eI|VpOWFgk)?bDREJvQO^URd`((DlV#y;)kWszn5_f82n z#OApF+Br>XP2Yd_{Jj0Sw?t;2(p;|gQ$75T!pZwp$E`n!{H{&7_k`)d zgNc95s&W+1*w%zAxifJ2tYf(O?+Me7w{^Abf)V!(zu7M}aQnCOSMj7q*9X7N^rslU z=}P~5-S)M7zt8l?^CkB`4)}JqcKiI(2Q2x5|ME3#ul#x3_V@p5l9zKC=UE4utv{}` zB3)5|Y4CamNtIj|6Uf&^Cjx*`gg_H?#%pH#v}g@@2hE3 z{Z?OlgZ0C*Q~r}qzUDg3*pR3ksrL84pNp1~8#uNzO=3Qv$MxoP%F*+TFYNy9NC_(D zKQQ~>7hli+Z=TyvSNWV+m-=^Q3JU&!^im&S5Ti9-H<+j&WaN z*xbPD-*5i=xBmCr;`(pT%+-H?es_1`lk3axOn;)icKSYn-*UIF`xQ>Bu9ZKy<(Tk~ zqS~5%+r%? z-)o-huk-@lrBlgq;Lp$M?!J^`f$a|u|Jdjp)F=CN(p=Eg_}ssBCf2YbRJqAPS+=Hx zBk8u?opRiQ#qK-H7rhzzPyY!&i<~g`-Nyf?YY$?)>1Zt{Pc$HILKe>4Ec_b!GP3fA|*HMm^s5 zJ?H*6<~zGvK0h)%@#AZL`BvllwBS&G}oUCsRH-?dE-dO21z7W&YoWqi62dJg!%*J^M`3bKRUT z(w<@|cc1_LaevdNyK=tsxt?!(#Q4AE;r6VEB=*nCe@;pAs=5;`@OJyG6_xrN!a6 zlEBQ`E1&Ok#yeh7zIP`PywV4ZrM8uUzqCUE90qH-EDK z-+I8tXnOp=msbvN-aG$|VuB248tfPk-j0kQLT>GyXVhZHfqihg_KK-1sP5BD(4&^WW@L-nhZsyjZIuJ?TW|B~UJ%B#FD zS8lo@@o{G8={WtkKTMldzzZ6+o4pcZP9Q*e3x16Mo->I>-l-SZb`o`)5rTW zH_q*aubNU|abs;%<9E2ZVz&)@!mV3d|IYr=+2Cr&xc;I}HPfGIyN=yj)bR7L&-Xi- zhA%a{b-(?&sJ+g^_uj8_`CFeXm;iHQjEON{>w2JTCq} z9Zz3e*{=O^`nQQc{rS}Y`hJW4f8%@n-1-Qqtf<_wN#47q7r#34?{m$a&p|iy)!83$ zcHI2G_3W`H+7&roMGP;d-(?Xk;(8`GbCq4~zDl)wpI-VWYH6~xIJ7G}teJnq{&MZV z%;iguzYbgHBh=5(BWFFs{^<*kH%YcnQ;n*mPQ3}SvjWX?TUlg_z{()mR)^bi3`sYe z=hg=EIlSO_=KpbuD)-xq<;;JMN~Wv*b>1iafVEEP!75RE|EHJFS9nc2|M$1QTII9v z|CLX!j{kAn^AqzjxtYHMzE1TutiS#I{Eidn#ml0VT>jsE{x@>ftjllJzwcB$Gylea z#gzZn&g+Y~A1iGB-}$rnn!QiLtIhMLrhQ2KzT=Kra@8gOFE{r4`-4_k7PdJ2tNm{I zm@|R%$eYA3Q{0dFTTZIF6|84z2b$Wd*`t0IJbn#YwX;F#fQ{gE zCi0QNrI$~bj^vc2FWae|-yYX*$&hHyP-dx~aB@*d$jtJPNqgmH-z)xd(R2URV#amf z@3L~s?NXk)KkKG^)Nb*}a|cY1#(LT>wlF(6_2~Mwc7JUOSeuT&Vq9|Pv14zfpXQm) zL!EV#ZBO6dUE5>ugdBf{&lAZ~mA znfVd_rMoRx-mibLOa0{EbUxwF`j)@#)BpRkEi}owmzo$A7@~gj&+Ff3t_Qp{tG&N{ z-((-VpBI=t?S9AYUOM5sKlo@e&BWYe3ifa z+_(GxuRr?Nvp(6-+;c{K5Z@n-%fBV|zny>lANOb7Z}ET6rmlRUyZqL=ma^o3UoNZI zeqZ?I&HqW0|G#LLVTgM-MYZkvJ=5&TC)Y3c_x*J98N-5^ps~-#5{)NLL|3w~?YeT~ zzr*d*btRw`-z6WfWxykfsWFJ3Ve{^*k~{7O#fwx|RRxLeW-QXVFKNG>xol&;%y|ac zZIdcknq)V=eHF+Z#C!AomC zRe%0^l`sQCE}H4zN(@Tx zS~*{ynK_wVp@KnHf|?|i>c zMLF+_GN|DE&C&DKlHu+7lA6e}UF?f`V?~pHsfU4DE|u5eYj%0KnRJU8BvhX^KQsXvP~40om$PnvSLWOecLrA0-IA6R5ImE~&HuUM|` zS$9LPe9Iz>gXR2pOwML$Rp)L$aQps`KD))t{`2>JJhmh}EOvg%+5F2@zk}yb`*K?U zf61ix6&K&DN7|lD`ZMukvvB&K&s+1=(*NvkZ@K;V(XOIx^-@m{@PFUZz<$*5+x*ji z7e*D{?_mG>x^#BrUpedL4-Q@5qZV0rF8TkK^nEWtb6TL?6#E1p-2eD-FV|Vv5~l_M z2>~W%wK7BTh8dqj((fI4H`BE*^!HDOi^3O!>&U<|29n<>wty(j$Su$?B+qUU7Xrs=Hj_V6NVT1P)u`FzF7%kq|zV}>W z@SN#KO)-zv8T zF>-7g=@YK{Tc5Lc2$D;gQ@*b4XSL%I#=ZN>{Wq;>iDoFa|7Y;m)8EH`_n#;G7v=5i z>UzIwM&;hOWgTyqa5E|vd{8t9I3_P>@pVeDRM!*1jE2RJMJpMs{)uKb!9uQ0zLBw- zA<9?rIn$4m4Igb9&g_XcNV4HFxO3*u%!cO-BDzJ4t7dOsB38j-k-R^l#(uv-HQS5& zhDm>af9a0juga<}}>%&t}MB7fW} z)t+4UO*?+7irnNSJqP>u-`Tpl@Jhixm*l4(GS}>W_uN_GzWvoaSDAeiuS^z@ux4pH z^&|SMO%+Snx-I+l*WOxLmjkN4a|*7nfI0k_NTXvlL)0@SmS@+Va5fyAey1#arnx;M zvvKpoLk%YxGo18~oJqWPVgAATl`_3!QYur^m;hue}m$Q9Pi-WpSz_CA_H;tdqINPs2txBcriu<#E*~h1Z8INEu+MjHywK)Gdi$6lativ*`9Of#FFTjseh*!mc2RsD!O<2`A_FxoBDBn zKL3?RuYQMW6ym2%(ZQOobzI>QX|g~=BY%mXLG_Hf9QoHDRb2cTw)bAzciI14@;qTzvwzx#fnjS)VN2L& zJmBED$?Twapm}=StP?`_CCa~jQOQ{TJCC8@-Q4``KNc1{B^;djZ{AlqNxg4V79XEs z>0@*Kw{zO9x=nIcWm~$RzP)z5?8V0WXTHp>Ota-bqRSd4AX#@M)2;HRCBvKl>EZ`M z?D-dLyC`AymnUqRVcoChNadTY4z-$_zq8%8yf~3Bqcg?!A7l6FI3WNzPp- za?Y1k)j{8W|IU)~lWSD-2)Xc+Ltt{hkKA0*1)s}h=l;@2-oG)fDqT^5-ywZ3|5-N< zNJc%dLct(~pJDTw$}n@o`96D2y!tl7Se<#3HbXyy&rHx|n-cas;+~d|-6bV0zHXG6 z`^%_P_H)kC%l_Lwf9B9Q|ND31G{tBAu`%jZM;Papc_jUR5u14Z=-bWx9--}bHY=a} zb1x%6DcbO#))|XAe>e`GyKAIi6#j#GM?>&cTa_D!pCs=#np@{o`;Dh!zxB0s#@!d{ z&nRYm;`y;_XYV8##u=A?Z^>3r&@WXHkjQv5|9txDoewxW%BEaC|JnPU2e$}_9>h|4`uiDDY$2y8^*njpl z6ikZi+gV+?((ky(j1{NvtaCYkHsRlvf+Kh@RI>i)9J}AADlJ>KWvm=D^Xt_aeRYets28;_w+?C-kvfze~0Hh!`H0^^A|G< zT^F@w`fYK)q3`eaMeqKeR%S4mw78QY@>dUMuzSCdn}6jN{nh)w&B_j%{Pgs6bB|vW z-{`QM`ZxF8n#e3OSaxqYumS9u=P@;fk38P6DX1&FXN%Zf7NI6L)4)ooP3EhO1y6sI zk*(1oqv})bo<{k*R=4~Nl)oPN=6<^GuH5K-fn5h?{yOvJZo%cM**6c#f$ofvd3FAVeAVi@nd@&q{krqqu9s}fw%Fg9 z?)NkP=gE#!ybOjX7b*mZ{eJ%0?fzS%s#}Vg{Y&I${0H4fw(7$A&$}6t{2GcF9SU-m z+At)e?ycdO&E9bH{u`c`73mee_YD#P;^uFDQd?hluJ1dax1>HZTjc$1rc)2h$?T6z zITzSp_To#k?bElXZtRPld&BVYCB8_p-|as)|F6Fun|&$7^6@{>^YPQZoR8Ul=+x!& z`{WIu-GBRj?cKk>4Oh>*)3fI^^RoT-i-fw)O6L^Ju<)^eRoS&es6ci>dh;aq?aTik zx}CariR9;wdE9pA@99*t)LcJ3N7Z&^+NAjnoReRvnjf%b{={O@Af(*I&@=bEqSd4# zmC2o7Q$8O4G0~vDU>&&vSmP zX>b4GYZW4%`q+5>ud>^sjj?Hej{He(cRVf}kobSU@%h^9Yig(MZU6sKnQxUFHOb%d z?-!My2hCk()Tix`_|SB5af{*MAFuB*9OK>G_jcBdo!eh0x!q&%zkKa&TmsL2v-c;K zgm1t7ldbiA-HCY}hin<+;$|m5SA3Gmk``|e&ojgP^|Uw3Tgj8fA2V-cx5Kj*B2hAln?7C|C@3-ZqsG~j(T6~?4nt{prsw)Etm#I z96Y<(7vz{T+?Q$J#j|gt+1JNDI>xE}I~N^Zar(=qqFWCG4;;R5%I?}_yJ?G+CHZCV zoI0hgU-iCrnYHoyvtR#hyO;cy&;H7*nc}ZEUfMUmu=aOuj16OL+qahV1=9G>+cfEI#*A+&ahD}oqBt>yHekA^PGK!#&uJk$k>Z#!_ESbGgv>zSDq*FpGbJo zo4aw|catwobv^cGkfP zkJR0_t8UM&d>-*{uUW}@!>k##Uk|pgy))BnV~q{t*2rUbR-gOvk>`mFqYdM|dFSQd za(|y8GWl&y>#FBcSNQDD980}-S|T6|xht^0RTP1f9oxq>OGmT%3*I{>m5^r=ivq2Gi2>gCf}ZIzEtyp<^j2Whilt!S2E6wv`%h+D1I&_@mK2WEG>TZ zk59jyi+OBy;*s%3jUHWkS$wl+7 zJW|@f_x1X^f1j6>?`&UMKD#<-*Pdp{y0izva~O>azkNI({lIv^q0mj=PjVJK|x5$`wF&8T5aZcp5O=4;^h%#`ztXXY18znFZ$;>_k5NjrJ3R_mrW-Dz(6`u3}^ zr1`qda(9zMbs|LEvO+$x$h?~;X~PKG#wQt9cjnSDwo5Gz(j0TDPHCRZS~~wk_%)V( zhOZM(EHk~I$FREj=i=uw3`wgD4lM2o zJXA4p=E=i9o}clLy&9{YHdk`5@sl;-H7{e&EC@WbpmXKoWYNa?W%Nmnqm+RW+?H<=wT)`{!f)CmR2`RW)D#X-~Ib z&b;%NnSRf?ux{6h*?v~$JIQas~oJ;4zf+4h3$$1qLRF!{J^B*hq}|6ne);&a37EqO}}*A*6r35<_BliK1=_7xFYe8hlKv` zHy0(vIh)%h7YCoe%V?0g>23MCh)&PuJ1>2DbADyGTc-cKY|+>6SNn}8;DOOP`w;Qk z&)cQ0xm(`+Kc^+US=0KQ{->A*@qeH9FX7wwU%fs@wy;Qkx88&~OSWH?$ZoyyFYdJG z3jevYZiUMi_&26syq*^M&f#m_cavbE$fdv_F<*_p@xgvvGaK2cjO-`7BMnDc0n>C>@$-l=Ow`-j|106 zGJnytXWn=0*WSvR=?fID`SHkA_kT35`ogimouA3#!Nn7=Rn^{Eg#49heP5|}K)bHO z)_G>j%I87xJN9qyx*lE@t>^U3z-RMkfmPP!=HHsx5B=6o{w13J<)>*&*-_gvJBOqG zKbk#0&)WP>w!vEdkChyYU46>i&2jblS5><|pZZ-}@VkbO@yxxM_Lc%`Z5Y4A-p-ge zwdUTTvde=o0lc1HfMtGm8ezy2Tl|C644|NmlZ*wZr$ z3;5Y@z7@UyJ?^|E!#@7H{`nWmw?AdM^6iHn>-o0xK6h-LK7Kx2^Xkp@@0)*i?|$2I z;7rfnJDhcaIh&&ywcV@C>Jq+)emA)K{MPezn=)mcRU_jQ-Y?#?^kZ?*V>8zoGIGri z6dPVXpTqc_<%#2m9RYsz2aTs)cX!@y{eN%$WUnWj3=${H1Wwe~-`Sz#)~}wh;LLvB zWw+0nq#B>%`0)O|2LI}Zh;+5l1+-3FKE9}PqV9|y?{B|1|F@ej_(}p?rZ{=cy4bl( zW^dlTuj1yW%fUad-}xuHuKwuP;+XswZyGlJ?z0XKO#AbM;f=YP?>4U7o|yVu@FBhtEG(v{>A}@%rDEy*1Yv=X0M@4qi4#r|!+%pV$AU9PFB} zk}+Ak>(sNa-(GxPd4BU}h7TN1?lAmHotqc`HI`|sX|Ej14Ex7V?z7j$C;ZEsP|SAc za$xlHdFtG-z)&-N+Xal9e>$c&c?Cthe)JnEA@`Dk0@HvK=H z-*4J|D31TRDkN@y_3W#jU^-+tGRlZo2JHMxB2q1-y32|s^SGVT<<)#!gRkHLn~cQi`P_5*v%AScGtU)hv|9s_Cj%i#amBb*eJg$ zW?Rn9fZY-SzbB^sQ@;DZLF{&aq4xO`jcUoiR-d^4yKdP!C3su?L4xaow=xXh{vHnb z^tLYh`nL97<9X|J%ednm#Y_#O-?v8CeYFmc{%=tCD)HZ(RC!6ejWtPk@0Tu<-~VyV zyt@@;zkScuoGg03F1kBz-}2VU_boK~=d=sku+5vf|9D;ECw=St76)^~V>0Jx^J$kKObwE#|I|)Q^`EPXWZRZzyGzP^~LqyH#kqu zw4ERPK>h#Exs0OriW7w8_)`jJ{B7Q*y};@B?>A<9o4&t4Q?|*t*6-Nsx7+@TR3tq5 z{`7Ahcl`ACPA@*)R;#`%EKquFX0hO&hFDHk!}9MePj)k9bfjEw?!SNJ&&KYJ_1Aye z9^#3-{or|0f;;OxwYvU)pZ5px&gU;rNYK5h$T7w6|HfHyDQ8Z%-BcF%Ex)=n>&`cU zj{kDou6x0caA-NO19YJ$Lyy_~H|)+IZ&Y}T+}U?M-}3av`h1S&vm5Krd$s=*{(YQT zU}k;l+g(?JuO=V<$}494cisG)h@O;1Ld+bQrubba) z_mI#r=f_)Ymyd_8y0hzf*c-M5g7X+lJ}i;( zcQ_*aTW0q6rdjXbufLOQ$vwU1Rq)DZ`uBhOZB|&eKY#yA{>X3jwe#N#HEjH4*LiAT zyUOle-^GtBAG?40xk~-MH!R0*{?@hrH+A)!y>IFd6sf+uo4K3+&iW&~tVd<$-(T21 zvpxO)n&?YE;%lzu->UhWo_6jD%Y?@dzaDwCx~@CH?s#L|w_m^1e{)XTxwrn&j|Us& zZcRP$%E@|uL*ZsgOXiAmG5c<&&i!=9f!}F?DbvJ_`qA6glrBCVapYV7%1e(e92)HX zA1ADuwFuF9is2A&%DH);89c_+v+|_y1+~L3m44e)@FlGIxTb!Fy>QBW`;FQA4j%Zk z|7x~j=Hp)1kFR$Y2Vah!^YXjZSdFNd0$tP#eEwTUlkYD}p+I9XPi-n5T zv7A}YqAy|hc-l#$n)0<~=RIpDSNhzjKVQ@BJb%KjKQrD}$Ctj@==uMt@w|CY;?A>H ztjMzKz1MELExz=*(C6ph?B^?N{C980)%UOeyxv_mS7-aZgpKe1e1g-al2- zm+v}q*l49ezu#5^|MOQ4J=tFM9WirCKsfT`N5)b*>7>Io1z%8A|W-D)>7vY;nGN@!Y@n z0TOLCYyG}EfQ~M^Ds}sx`HoQc=9TB`pR-?%$VF6HA3GZ^Z~1g`@?ZPj=)ZGzmgMfX zHa%rnoBl1eN>0&W{uv)<%Wp^47zguitlM{Ris66h7PQ3Ku zs)X%to$F%@BedEh=hgk&J;N#b)2-8X6W-)mSNct|x2`OlRDRyT?PhKN+wT2OpWElZ z;D6Sy{$SDl|Fx^t+urT?a?aLh>SXJ{xw(%`O1`aNGFEka&sM>8f>onPY`^q{bD?F- zAu`(^+wT4+f3B)<(*v1?m349lQqs4T-_Mtu`pDq$W)9Gt|VSb}+P5O8NcVn#s%V`Igh5xnhUf zdrrnbr#?I^IOS^mEfQIxOPn1eeWw1#F)1(iKff)f*j)*Ojy*OANTh>S zX5D#n^XT!SY5S|0KqoFlWJ!L`7d?G$ZpAfwtBwCRt@+Q?_N4N@;j{Y3DcV1G&NnH4 z#dO-K{&2tUwms)>&#gPyE^$f4lP`UK>aXy9sh{Rd-}Ntd^6tOac59lQd$~Gn>8H#4 zv%c29`djnknEsMaqPG5Co4y6TejaxGE4%zp53S?E36e~%hG!)!=f3%rQu=`1$JXG_ zvQI+R-*yXE%sQ6aGG~Fu{&$TGeTU97R&?JN{4mjcui@Dhk6ynhai*@KtJiJU{8_E_ zs_fiB@%^9QudF%uFwOpJpQ-2nPMmA=Z2A335qInSwbnentM+ET;q7I@ zjPjR{F7Ed&XRN5*x40pi@9&)!tsnDi%QpQvc>CTnU7smWSxP?6lU}nF)VUS`U09vo zi?&gX!DU0qN&c#D_BLs4@B7t{aURzH%y7Z5?1;Qxtbdis-@HEm>6vXYmp?dM`+rVUJGfFYt144Jy|? z74rGjRmt@4<({W2|CIhu*!0QeGmA`h$NVYjYd@W@dCs)`;nP{i+Ryx%d+@uSN!l!1 z#@=VHseNy?X1qINQyq6g_JG}ky~ibAPpT_qP$Z^{+#@fXvXsh{pmd)Rh z89OQ5^7DU(6R+f7e-HUl{cG~}`Lmw=^q>DDXOg|e$s&umf*I8eeNl5xZEiohh1s#@ z`_$YmrA1CE>Kxae$xPJQtlm(jI*(!1#HqW!#(%%daHlR}??oH2)@lZen?j!86%1|s zjg3bCUx(e=pMBo`tZmm}^Qn$skL;h{oVCUc-pD=h!)3uz_5(kC?!U4Trs7=Uz2Uc8@@hGlqvsq ze=_%knRN;O&Iq4puzGI(V%wDI|Q;(l2zKYv%R`5JZRcgx$`!QrdxKX$8pWY|!1 z%<=C&tA4!u&o;|_JMTRD z{b7Fe>}j{={w_E4<89nK?ipLZRiAv+ z#{Pz7S2F)*<5wT|D7FWc7hZTx@7j{kw`gFeSA$(COk-zQCY|B^qe z%;>QH^%>8TUSE^H-QjM%IK9T6eZh@A_q@cu1zgs!bzh(<-mqJEgW7b3s!Ipji|#d7 zckFxp+%)FN-;STmE0zdISTQxH{&SYEOsRTs|Kh}#v3p??cLGeZoerF_?`FULQozm- zdDf7$ARu+}xme^1XzZ-!A1C#Un5!eS1yX@?bduf5OI*6&xX^3CAC_Wn%M=ljm2c{^ED?e*e86f5z|EXT5^HTQA?Q zylvwxogX*-+28r|H%L@}tgoHUzFX};;k>u!&+icW-G0$}UFCL$swoe@D~F}e-OYLJ zr}|M_#wScMKXzSL4=!Uqp*&&YBfg?|DLeO%y9TO`Q_xyKhC$m@vx_#*stH5 zy%xE(@3LUxGW#@6({u&vzkCfZ=P9k|xz|*(JYChT*nryht@yJm;DDd=pDLSpIkD zf18pV-u7SM{^gze{}-D)y7P6~=8tvzQ#aknv}E#O=a0O0S}sYiVg8(s=PLKPcAP9W ze{sBUWySAZ+aKFBBu%T$E~q`eg~c9aX}nC>@0GJ7r2+~Qa`|d|)TBUz-?{~Ot$*@m)!M3yCo*uu;@aEVJ$?{5riDI7^zd!i%^KRMo1Gmnq z#fP8q)SX{`u(j9rL)?!83!CGQ?@_NlKl}YI`?LSog_h|ZFg*X~?vnFyyHrkA*NA)H zSGxPy@g27%fB}jA5Fh@rI>M*|AzbAzb1^<|_4$GP-@msR*LN$}TWQ31vO}PI1%IvNtwEQ8bt+DA7FQ|BOR-|L?z-Y^BNzK12~byV7IAv{bI)%pdc-EtUs*lKBpZ zb*molJSNky>wS2C*$dPET1=ZOGp8HAdH=NbrQ6cHd3nD#eZTh3)AzN(^5bCi!|BrjmPyTY*X|K-jcyLxXZhEj{(r1H;lz5aqn(x3jnJCS^uV_s&!fj<-9)+H-Hn_td)mDQ_fhx&Y(Wy=$rp*^2_}lE_;MA zd{+PFv#t8RxyX)XC&k}CaI1Vj;nn&U;~$CdQr=JRxgWxFSpE2eIh)U@JZG^mp8ZPT z(4U*44sYtkcQXGy{%`%qScWTcA2!P`E3_-vW|-cgJgM^Cr`?RpDzBNBGhb1U^q=|j zvcid5&wN)dF{<=R=CwE$%PQILR(y~D>;ENp zvgv2ikhuA6N_wZGUd12wO)EDx{k-hk@$z{LA6;X@y!qGcuS&a}Urdx~*E(hOCelH21{J&9~e8 z&RGQ9xFFQ;I3s<7R)^~4?zz9iMB+8xxa_!Y_cC+kNzZ%oJ@$Qle*Z=?iyiJC| zhH(zVjJM8j?B_Fds4vV@4z~~#>}QkRGGTT34c$t8O&f39$B%fAzpVZ>{m?tJitm@- z`f(*ZsD1PNdrMcD>hIqZ@2%T*u*h_i`oYuMs+J4}|I6B^&J_?~I?J&o>D$^@v#Z~n z5yITO>=t$Jd;n^DtXUvoO;UjKV5^&cCh58URDIPf9bRA*!J&&xG#i8sIh z=DM%?Ks0;VZO$s=IfnAD|31{5v8$?dQ_YET#tZUi_@{Z9ImW^mG$vC^EO=eXpRi~Dcn1n+slGx`3XeJ8d5 z$}qfXKlO((sbiAy|L~tP{~OdN{ZG-@^I*mEB@@#u?;SY0lf&S@^BrM<Mu47w1=Po~dtjndkV=YOBm$ zbB}!AtN&}?-(t{mFT3*8{rXp`jqk;m?!M3UVmo7ytmC{LbCY)q3Eu z(uJ;@+gH`!IcL3NQhmHtMc1rZh=I#HpfMeupDqV-rW`yYRn+BgWjxk0!^w{tWw@ z{|#U7f7<1}k89KVJsKYzx4bwhUi0?a+mi*?_wUm>IWvCODJi)}a-D_W<~2N@^L?+% z+T?eU?>#;Roc~pyaM&$cejdXNn|Tesuh-toXY5h`BbvHfr|I~Do}bare`&I`9B>fG zIQk~~Du2ovzb#MSN2#ClEry+!tia;N(HO+oF=gj~4 zh_gekVbcx!itro%{ol<0`{ta(>UpOfx7Ew0oj#zq`wsJk*I(r|&Ln?4zJHH$q|M*$ zXO#nbHh(X9q*84^|8Ku;rfmDX`;%4jUl*K@+*$s0R!H2N@8-v=n|?m#{4ht-Snhzo z4bMSi2mUkd_v2524nuz7yg+nwe(3${mw(hfdVlmsTx*&>bPuot2M;JH4y@hB|Mv%D zX}HK6rWe_1Qzm?}+Ro&pdRIWr3bb}t^>>(b@tXYGx2|7pT&^i?d+pWI^A)!yU%t%T z9)idJ(8obcBFn|D0sTD={w`& zW4Fum0b3{?|z@Q?g<3f4}X;|M&lnx~{A_=ks`0 z%3tO5P519x>-7H3zn3KTaIe7c@6TLS?=WuQ_CNirbcRag*EtQV>XZNFt$&(ur>y0z z|BoN@_uJkKo%1vQxBqV53Hej@a-VtpVT$tEf7iRuG8epG7P|88nz!9Kd&GbLWYDiE zzO-KN&EKQnQ;zljd&2v5>X-jl{#W06yjy?Sls(J;?z{bPKDYJuM@uHppSx@S%iwL^ zkL&IKZd$VW-0zN`#+;k}Cw`mqnDfK=+S22-S7z|+*WX&Y@4Wq=c_G`PD(@B>aeZef z`TcIftlRr@meuat_iz9IorN-)P7f5^7?#OTzp?U6{m)NN3s(i^f9H?OxjyaO{f*mt zQdQu|Q$~hEqE@zZ>yNi3DSw~KF!*t(hzZZ&w`AD;euwedSJtz8KF;}lD%|wUq?iWt z`TwVd)b$%*)byS|<;&0cn?E!DXe&iwnzkI35@A=>Qv@QIK=H8XP`R2vqw-aT0h2Ml7j{jVj9_{n%!>gAk-~C%v z$;5Ye&&l04CO?_^&(5NpLGJ&bL-(}bzf7$6e-ib@u)5m+?5@4b)1KukztKPQyomM8 zf6H%`m4~1Ivpf6x!g87ED*Fu{Je+L*V8(;)U8i}o*JdU9PYShvJm2_#u^#(=_O!d- zh41WH@{*6C?Q=9E_qp~DcctGjWi%&#>0PO=XmCydwD9(DPqg7*w#Uq;T)KZA|7!kM zwwvt|(&0t?j2ynFr<%^?kccYDy*0eNeH4gz*%+(%jB(|8BYua6pEjh=nXY5^`B=F6 z&nt(D-2E&cFTM6j>NIP`zUsUaH$UXfE{pWxe7`hu`*)Y>Jl&R`*Y7eH9Qxeza{t4- z)86ubem>i%==UqrYoTfX?tNbN_1l9p`wL{Boqt1v2~sf>k28bs4+0P2zgIGrN_V%^_DH; zy6^;B27}=53<8H0(|o_#KRzDIFlDl7|2gy7>)Lw{zI(sTnkDVuS@XL~PA@(BBtHI+ z&dU!^rX8rretmZ;^P!^k-H$4|>TV}J)VKM0C&Z}SO<8!Z)TTd)MRPv-n;SkmKl6V@ z)Q1TZj2(9GdB4BBUhCG*s@zFWqTa-86uPYPks;*HBBb-BQsYS<9yUq5l0Jn?g3dvA#X2=HTix#sM`i z+4C~rzqGoq8u0ZlgW>n4yx&WX{`g*bj{VI1@4HWzGuQl0i9Wyl|NZjd%g)cw`%gO0 zJb$^}v-ipm5*;^rCqCYl5>Wd<(O4yWe(j%oHe5E0H=Q4_rTkBhzyI*eeePZ6IUfG? zUrm1RnaJEwJ0*Ai2T5r!ai-*k1E96cZcp#GAM{&zc}BgorPZI6Qg0^7ZFe5a3eP1Uuc{8KNZoey zOyah^?vb{Z45FLn)jqQp*Z1>Jx%heO%JOAL->f!`esyfWh5F6Er``2^KgI49`~24_ z@yyG$N9>-LjvvWuLt9--{KgfpcDLeD3_mXUEmpV_V|u9>%MkK0MFB^rYtNYic`- zPfk)j)(tr{#9ShZ2xIry^U_%#_YFN z)t~M%)(E%!tUsRof4j}=BPrjnZjPJuWZz-F&1FY^^>2}|muon6h;`*Yv+MWPOUnP~ z+*>X7OlMm$!?xYWA6$uI$2%eLrAe=f}bpEyaqGVGtq{rUGrlm7m;DVyK(`{%*x zH9OcF{{C(Mljgta-;Jfy)h$17d9H4my{R_tz(T1qf0f1V^#O7-?O&JpJM{hC{C@tL z|98$+wfvmS9B?~jzj)=IxX*ZC>@Bb~n-$%{#ef|m_&Hm-=iUw^Q2Y$>v6kvaS z?y*0S*CV|Dz3cyKW3ms?3he^5LJusMae3Xmd0#Ae+1~Z=xlJi&{IRZqsqGmLt3ShE z*ON29?z|%zEUtdH(q4YovsWoa`|k5u+vY~NkwGUUb|w;eEa$gyL3-~E%W`JfoG~VRi^xV z^!dKe)1!y^)qd8S*Xx~pe&?sdB>P`yR;l#g*!jItf`xBS{Oe!+-!?PJ@1}C&!joQi_Fjn4_2uZ%WO7dZ;}dsAUgg*HKYL&A4_k`J z7>=C|DnFKXr@>J?yqHm``0QJz!>a5JyV zUn|$WsQh1VuDy-z>O_tjKtKlyq2`l-Btub&urxXespJqCk)f*DKR_iq*} zV=g)PWJ7BGcH>ENm=CONP<*{Jl#k)=w3GLKewJEwVw(Mt&94#{Jz+{Y_I9mY+%6N_ zRHx@pUl>&GE3?ghdn?6}=lxxR=EVumJ-!s2*%F$mh)s1WQ6@J?v|7XZ!WL$r* zKmD)p@8fee|4-ag!~Cc0?4l39>mHvx`Q@ANS>_L)lWXnm-%GOjv@?94@Vi6^S4?Pp^FnV1(S)KIP^u748`W?^N zp2TwZY`*Vbb0hD$$cDT76YA~fbJ(ctVLw&O{MsP>_wnfef4;AH`KI2+E$;lEgdcB> z>Zd7dvhcZq!sxxoo1eRHXnwwE1M4<(GzK~>$mM4!epz~K%kJgsqQ0eVK0aHrR~s$~ zo5%1=Ia}8D^qB=~mh?ypTOSv8@MF07b#I3hK@FP-x(-~%lx(bGbwlA~&|9rkJdh*}%C9ZE)ZPt}$jy}@5(E!pPlUOqf$skao@x8Kh@#ERo!7gKHfVpV>N~8w?d*ak z^#y6`_|J*2@SU0D`y=MykG=Qr%(uVt=TGw+&W_*zGN1pwdh%Dfzr*(WzWV2!jNdIL zlqePmC_AjXT<})PqGRE!^31jW^1j{nXhmeWAE2dJ2NK^``ae?nzW@8)|NHlD?%ldZ z>-`VQbhd&e*H(3Wvbv&_Dg9xomRt8>2SMJAnX7sY>o&})yKuzK!`>nK^;zD!fZq!p zqpz$t)0EHg$?N z;%OJlia0?=&3ae1XYa%eepkJoH)a2~H&ds_-o3tl&y@X2ypc~1itPXH{ddZ*$}>;j zuIF zf==75+AKFM-s0q&TMfx`LpO9ByWAdh`IGzmRU3?X9xrykROPC`7a7-g+ghaQ-^@+l z{r{Z)_U~<8Q)JmOg{@mIKU=?9>&;(w&ftxQSoVBMe_y}x=(YQeN2@M#L#|O}Xp9rm zkY&8^rbZ><9oL~Ly-JL)mjC{~dHbQ4CYw!X1pkXX9x~HYa&^S1_@}2<+b!9%^n&y9 zkD>akYfd!W(l%O9BNn*9_W#DWlB?tXP4Rnsrs3Js@Bg&5>o-q-`}eeFt2=bJZXUTS~4@5koc_wm*Lg8l`a$ouR5E|xV* zt$cGxmyPy{m(Aba`BwJ7@$6WdU^o{r7L>U0Xw|Np22m?r&zcZ4&Ql z*!eU4RQ%<_Q}OrRHS0}-SM6q;qTYHyOE`d~YU=YF$L>7)SGV0zBN=pOY6Am{!Uf&N zQ-TaTSKCV1$}3d6H`pp(uonyvY+U5g@aFu|UH|V)2~9h$owob`pBs@cUlwU*x^f)5 zHQU@(`c!)LHJoWD+`lW6<+nN?A2z?f12#d_Qtc__^xci%O?}& zb!a3#TX6H@%Ktmn|GbR+KdXQ3>o@8BOXq0@E!b^%=Kk$8JVK8E}k$lrVWL8rQqck<7~ziH=h%xqA8Ihj%Y*T1auaSz_) z9Qg8Z{!+P}@4w%fw?8`Ewc$u=(nPf>^%;$t?F=ldgbM1_R+TNch1?0uz*MUe5N0oW z&NrX?%FKpN&3Um^O7o^n4|cj4x3AaWcjT%Wf2^7RM6+^^pTji>!grFr`_YBwc(Tk|Km%qs5q@AFpbx%CELi}Td}c&_Sk z(fW7ssrzd;GjS+azrN3B9sF4|TK#Qh*8BO}e`Pv)Br9#$wr$#u&GrBPx!t{V-g$Ae zNk&a=?cNhrx%G>;OL^4uZ(FsP2Ub#us&4oo$#DMhb?0=ZB`cPc_!xTrtY+1HYQMZ= zsZ8#JnR|;9{#=@_qMEh--@W|-DUQ`^Zq8f%KBMyI>)WYMUp;>|bL;e^P;2kK_cy!0 z{j&Ym?4qw-_1AyypBiDYCjHrMVnEf{a^(wX9G54*B{>q=XqY|Ies7G~Iwvi6PPK3be=wo93YA^J-pVS$TuzjJeBrwjQ6k*Y(1w z@)zqEid{}wd_H|EwNi8Ungez_isS_+#7_Oa$9($J)Nn38(S=1mM}MaChJJc(^)9aqdP}hHp3j{K#U^9sQ~BF;zI)!$oon-};!=LqE$+!BkEZTe(=}Zwde(X6m$!w!njQP- z{A~HJogYKy+HLqZ}p_Nf93xk62CGgkLs7Pdgf6beneR68I664~7ok z?E7`Tcd>2V+^+J!&!_zF_xZ^#vj5L1u}eQ*c-H^Vs=l=AlJ(Vh`SqvfF)#SJGVbT1 zl3xzH(${^z$$r~g@pdeum9#>;Kd~Ic23KwCuUli!1+6e%sTP9`Mh}hl`QJ#AU&&_kY{&9MFN~ z^<1G7Ey=;nzdR0n*AZG!&M8xMH+%BJ`M>Ai_X=`lQu}7p;3GKelKr2>|NU-d=Eu~X ze^dAN;<+zx8@0{{y*2c|q?zx=BX@3=&F{qEo#DFmD(ULoHZ$yJ*5A5ln5uEKzUIl6 z{Zr+4{q38x*QYZo#rbWyR#U>~%YXmb8?@Fxb6xN8X3xiFd7n$=b8Ctw#c9f!o%$mF zEoJ}w<;%aTKVRbSG3ClkoPNV9vQxhPod4O+2fuVqnrSPYo_F5f;M|#WQax|hG`?AL+gkFP{ZCKPiB1em z0vS^n1RLBwCdokZwt#x$F=d8X+msmVzhCTMc6)wVS5?ycrSki~nR;Hneq(0C#h1&~ zf8JdD@@1B0s^~*{4>nr+Y-RJmeUp~M68-2sb_1%=HFg@1HuA*-qRrUYU zS`Y!zsZ|3>Dv3Nai6*CmDgHjmrwHJ|7UX6`v0cww>tZIqT&Rbb%GweTDs-A z$TpFE=eTZ2GTzr)@#n6^zWGYLm&I-3btjuV=|8o(G*sXG{UP<=FW1&tJx=(me*fqC zBad#aj#E9o1XTY;sXDMM2))C@#t2UH9nB8ef(*Xj_3b_hzHL%>-R1pYbNT(bPx7zK zY{;)yKiQwFUp@V9eeIER3?72%<(xCF9{#>OoyFu{;_mvo>pxd+n%m8@Vxj-iFH@pw z#S}T_niiCq%=`96v~$M&$J;qGY?gjA+uJ!;aK?-vx%tIqMw9%0*Wb7B{JH=8{Jc|@ zi_(uj=ju;4yZ5ngiAFcei+|rQzlr>pK4vU$(%315RN6Xxh#dZ?rj^vAe+N>AAh(=AMan^uRM=iQM0+yBkK zy1iG=+duTb>!HZN$YJ8!z~OMYWg|b-=Mx-W3o@K{NN4`{W$t?)lPmmhd=4z%|8eV* zmp}cN=STk5wmw^T>U5p4roGbA{6m#mtgH4G2B%d8-AjypHDi%=&41=+U8OTtCP%H= z%yun9MfLsZ(Dfm2r%Zozzcfy&al)tTlYc$ApOGbWNr}6t-00HGrYrlS`)w!B+NS=e z_TszG*DE%gzrA=oXr&T!7fa2bY0;DFw%aWG{e^c!q;&V>kMs7L)K2?1$7tKP$d&^; z(ofxbwRt!1o03|M{IlJY8y3yKeR_I*-kltV+WDKB{;;17f4zFPMcT42UtJu&{`$51 z-qf0!XOhwOp%XyK{zXT_zjGxfHitnRa66E-@tiWltS`^){{M8z+V^Quw~(gI@4w!Y zR+;Zt+S~v4yxr%QD*v}N^Q*p;f4^79v;S3Yh0upG&*C$4m(7>`<9X@cd%=9I!qxuK zy?i$<9v7eU_4YaFbufCfPT=mDzjki_C_BkM=p6s8ikr26S8Bff`1;hD_g}LQO!!oP zpWSYOn&+zYV)4DUeiIvB-}^Le%m208)n4ibZAmL#_WQbSf??f{gIkU%={;`O*_8D4 zX57xN-@Rz34=oa%euYxMVKKR9&!^7b8j zzux&gNo+HFQ0m^pnjd_A&favnVljI#t97wg%-7A$%L+mRuAF<7o>u_EncmKB(-UIMqMrZt1E0I`97|JOTO5#6RKld%w@ghD@-6eWE~z z9+QGz7mLRFjt0Nj`+xcC=ZDB{=s56w{x8=_`!CGv_}*Uj>fefa2I@~&?yZpA_UWwl zLLcT;u6m}jv$apB#(eJ#pYTrdk9FDnnXlLV{`K_yow)s)|LymGIJD&cetFOLlP1Im z{WIFNhUsdFh~SQMJoQQ6K$niH5et*(k+ z_siiGlV{}Wn~VLI%>TN?PP69e)r;T0xSwJd+0UbYI<^dwL0ui{(`Rk!j|G=Z4Gb(w zDgwDI2R3uLvb_8ECVkSf?>Aq5W!|2z@>BkXB;#DG|GCx68`f1Unc;r?(!_rm?^92* z-wjP@Y@WEcrC`bLuUF&CF5f%t!pe^ zE_yD1V*SZU)z3aH*5GwxnOCLta#i|W|MOdaN=={Xclx#D&*k&CJq-~0wQGOfy1;7* z>(s&xHWzN%ZXdOFSNc=GpYON)ceJWvU=UaIba4zx|C)YZ`1SXB*Z14~{BqBHkD`5_ z63fmYBT&KnNOi$}>5o+%=^zd$?ymSPFc)O7FLq_QcI}$b%fC+5yYI%T-L2P9&G}jV z{>JEdJ$0lyNc9(g7b~?9+W`On5D)+{DAuB%B-~5sFDKI=L zIQY-^JwJ|SPHuQq|JC*7%et@CXGH47DmVQ6$@--$w9aI%meL1v^|@1cO253gsPdQj zd)@Cd_G|m6Y%eyr{pfn!o>yOEm~8tUo-Vwi#ADo>>{YwWqxa^{S670CxqqKIw?6Lg zsV|dzzhB+H-`1R|`j4ediULEUoX~~))8%&cord{I$Lj$13D>tJ_ug|_^X~uM#9g#+ z&HDA~KmBVT342yuk1bby$v^pj|NnIVvfm3`xzxlo1Gc_%-v58+%iG^YGy|SEyw$Uq z^6upQ^8dA-7f(;!zWtl$#aAMGKJA+S|GUpeZ70E?KT`VFw9Pf^fBu}hdcB|ByIWJ; zqWGd!4!g7csj1sqU7qFC6<__v%K3pvZJAX(GyA3Mvp@Y`)~)cyTD3RkMP1$cAI#4* z+CY8bXr_PP^YYc39>W|zMSX*jAj4bT_H`L{C3j1sgMMB)ZZ~bp>i^}Xf8wjJT+7ax z*!cU6XHBwa#p?a%Mb@3;S#kHu-nstOzx{Xp{yz2moRY`w&!%qe|I<8W|DBK&hsvel zH)b}<^4m-hIlK3;gMUN_`+TjSgs1y2#d1vhzwFi4bN$QnZCyTAPk5rp&={(I;ro8= z)%)zu@IzWB7dRTHb~5Nxsea}vxBtHS{*Pm89ryqL8$Eq@(E5n4Id!I=z2fV%nHH95 zh1Z1!oj*Q**?)d(N>;1mb2=Zh&)9PR4%htbcybtkZV;IL8AC?88QKmdf zOW&{GQ?sva;UbfV_d^w0<%+Id_ddBg=4ZhFMZW^~!1S4=gW-(vLKY^06*C(|3eKh(vNLk%I5uz` z5c=?f3u534ZAK-A+E~j!Z3o0y!dx@I=dRzQ^L^9XZ4tM^x_%woE2^Pw!y(up8W*z+ z+6dwhRA3TNa<*ita#1KtjTBSm+M=^E?bgfcBUUDd&COQ3FeF6_{sDz210%;4hXxJ@ z?g^4iOum8>lCn?LMVI|vXYus^sx|G;7FKTkYMU^pj8lLyW4ifbM+R_AE>dt{S@1CR z#_sZbqeI7zxgA!1dN%t`jix2X5!ZyPBFmmBv&xF+?rC(G#~|2X!(RlADMtYXrVE#h z7N3Y_vfYrVx9`WJxbqQRJFic^aj5cac5Q8K_pKk@db|I8I^ua&xvu|XfgqC$gV;hh zc}Vf;aGq0u@x@Q3M|Lc~d>ptUGv_}qTJ(Ok*?i&W$DUtRbYMv+y*6nkxZlIT;w7xW z6d)zat0*APsOh`(V`aoS<)7=f#H{}j_4V%mty{OUyh>>@>v?}WbiezWqQ5>HIUr%( z0dn$-=^X5e0X`0=K7afByIZ>a#-r8S?_PWO;w-Q3zf|`Nn!h)_y`9zmDZjf!=CJ@{ zN3!e(CUCeYT+m`vV$glaXUndzM8@f@c&T|x|HtdwU8EjuO?}+KrGIy`x>CMbtfur# zj#_zh-LJoetKa;M+aLOQ9>;-IYc)PYV`K^_d|8&H&eB<>^7UPV>+jRgU4I+@b89LH ztb63o)tJt?;LlIFBOVPL4n3=z{Gq|y28tvJgJ+5ijTb%Ag_m8$>lg*=n;{b#BT+Q`*joJJE_3u3S_wCB}r=Pm7x0!ane9GmS4Sj9t5gZN=EEts- zYIvbJiCM*gC844F+?4SChVXv}CF{!FqeMMb6ke!{3N$!8X6axs>6^g_Rs0c@Wbe;< zAjsk+tg-gbURNc?c^s7-Jbes;4F`2Cg+V1810zQP$AtF`kfuSx1eOj4o}!yGO~8Df zxeVzHZU1-^{_RyWD4)N7{#j-9-$K*v-+W3@WN2I{pul7>Wop_yXkZC*6fhPr@z_Bd zkZn#4+zkuYn0#)57(U0L!I(k)zyoELDt8C}FPCform7dHR{u{8yvWD2+N*)%z^ZjR zpPL|xbDSGE4wx0JXmZHsn9|F#;7|4DB^F$b%Ruol%itR{rwa-xFbO|-63Ji@hj7kjP+6SBh4=WsCJz#KcW+c>QMJziQPCQg#21^P^urcZ}v~4_h zMhKGNCMX|Zb>L%{gvO}>M}fG*;n#aMZk*V&q5S2|KoB{ zN6}#osKDA~^n(>*XvPEv!3MU6^D?5m{v6q4W^eq@ZT1dH(7>|87nTkNm;Ejl(A=?N zK7%;JSL35f;1G9EsA7silTK%NmEPsbq2rTaHCOM>^gd8crZ}oLcT?zDOS-{tI1Jtf(VC4AH!ywo&PgmmI zIx$Au!h-+*{;oDPOk-x`aPe>8aQNcg(hRagfuZpirvT%M`I=%-Yl>NtZvLL0?84yE zBmxO60|ln$UWN_Ntrp~42DgIZuF;aoh2hzR0BEB+qL!(-o1taO|B6k2w_cd7w^QX* z{^3SucBzlA|9n2b{%GEse-FdAKJA@4Jxy?T{l?!nMfY33+Y_8o^fKq@ybj6R_x2~` z{}1@vQC61(^{L{6`o1Q*RM&tee-(lwXEPJU#{vc`LTOf(6o53*`J)hP1Td) z?6_+GXO-B^&Z*P)&ENQ2eE0l~A3jfP*d*A{+smuiXQaFE&(m`C`tD8!4tq^V&?h*s zR8_Mr@c8-Lv?uiEY5&;Hc9HF`uEu4qi1}*AdvpJ@S=mLt`8yuA#q84%{-hitw<&yk z{lbsVPk(IvI&;#x%FI}&x|UN{&o3{nKfmYi1p9?W_v3%=`peTRuQgrXZtd;$-rwJN zw(Y2Oo!23``_uI*Aw~htAZRLU;P|4)bYaS;>!K^J{kvEF{_63VTi>P@W$X#4Ja<#d zNJ_or==v)AkQH~fN1LrL+*7ah{hRaCeRnri_BO{q^=PYDx&77Da4D_u+SrxHKE8hW zc6IE{qWgI__Z<6Px9ZMq{;9vqPCqm4`!h@APU+S+6|rC6cYhL>S7K0dgw}@=0*&`v z7*=WhKdrZa&lMxHrGLD6_qi&^YUT${)xI>fWL-gH&;8%}*^5q`U-#$m`ah9&0?FSP|NLmSAXHvCeJVqq|!_-9NQF^^{ZB?pG^+ zr`A+#%Rj-NA6|F21=ihF!z?zh;V-Ry!46BWRzn~{U3!=WUdVOP+< zfBXKgTQ{YaB_Y!OOYF2o0sGc4?fUVk`>Lwv-nkKf4zDj-{(tMdjh`+}*Dd>>^xfF3 z?)SI1!kbjqu6nY1+j-uwe&c1DnpKt_whbHRpfQ}^G0{XOLGy_xIzpRRt_s%<2&Y5AvB|3bbxKmK8| zCH&3p(69b~r+*FpcXFP;_}A07SI#=VKI=$V#mT5OuQmVg@|yk2cF|9rU&URY#1HNW zR$?ez&wmfv9+6VKa5I)+qvrozFJ5)s)E1k|s8M}%-x~W*hi`NKd^&YT{`0q2rhc#c zRe1F5@8utBtEZaJ75lmL*S<>>U!68+G(1s@%N|6e_F3Gb^botx_b{M z=FIM&s$949^s{=t?XhQcwVY+PXY2}?_~!NZc5|Um`(Muwp0YoFW!)1DE0h>&ga360 zT@$TYQGZqY>x8+Bihe$v+H(H-QjM-ZoL8&u_txL~9d4b!Tz8&S_`j3-Q;$EAugi2j zwRGXvkoUW;m0t8%^oL_5jg@R7se`l)ztpZ`ci_5li z$4?3FKebmn@pY(duhXAfVRsb&hsd2ipBbtezjg1k=yI!&r}}-Ug>A1ZB&~-|{1jfB z;lEeU-qi2JyjQcoDVyv&^|bwyU8rqcmC?^V7Eis+i&y2(UVQBC7nT2>Uu!>WFZpA- zJ3?gppGdQ-R;_PV*lp;7J_>H4FwN`Kb=W06y){}TTh7;=B>{Ea`JTRxbsKIz%%y7$}O#qQnm;<@uz#iMtx zTD|(RKdt8XzrQDs-z-_RC^vY@|7{gkt5ujTNLH~yn;s?Z3$|5D?GF0)ue1JioMN`- z5}qm7r|$e@_ci=Y>`%r0fBrtu`u_RQ`J&}VZO=zoKDwUt`sS7M?bjB+_}+djTN7T{#E~Kt~h6#Xnk6}uJBhD`_uc^ zr$(R2S7PWcTr3W$VisIy(YnuiVaq4}w_n3+*~(vZ#@6xsb=fUBa63#Z6%@cCzQOePSHB_^xyNX^6qsf*VX;kh!21D_e0s<_&d+vbMh+t zvm{8oKBEJzr7fA3o@e;t`tx~OxZ+~%q*zPs_r4~wogW_S&f@>Me}(OR|8GZ6U!Q*V zwBOBdp|?-|TU58I{%YarZPWjTe)j+TNoLo-pPWCR{*5uw{~hJOR4d=>V|Bghykp&@U8Y-|+P=wT>X`e&=&!o4+Dr~CfB7rkQsx;eGAp-&(Eo__ZC z$5PhyA!UE=?SH?#Ec7qm$8Ud}yq3MMJ9chk_WxT^@wN5hzF$9IG+nRsfA+thHvfKC zdyCgt`v15sborFH5M#to)wCvPQ>2pVAcw={Q}y?zrg`lt`nq_9-I9!}c1wCfp$Woe|^h(etNZ*!u|a@agW>ogzVkkUau+mapft0o7?|>PTVgQ zpLzTB%EH=P)8u!pKK1_VY56JpJ$Q^&nGDX9re6bFXi&gZEZDGaYQ0C|lvwrHpV!xJ zIo&6p75=3ERjrEC=Z`TVa#HJakBWX$F0=orA8T3r-|6*@(#nbTtG?UY-+LcXr?=}H z^V9eHB@dqwW|Vlg%Qzcca7$P;>M&i{_UZb)DL<-PSATL1)@0OdUR5^jtNW>sNR@_2H&dNBup&b+5Z|)&FgY{N_{Lms0=6g%z%> zpD6G8)%Eigi$@_>?pd9Xqz|Yi_9A|KA~HD^9)Ns+nCe^|l~m#M7&(dEmffXk=)7 z!{e~PPJ7>*Pp3DZzg@ed)}R{_J(ZwfRro@BTYgC#b*mHOSu5Tk=oWiz?bqWDsl+&io(=ZFmYWwF)-u)2xsE z>HY9!S4{XjSFYWwOZ%^`UsqwE$D$B0uOa+jcx-9trAo88(~J(ytJn0=zTUxc;FPYW zFtn2)0!q9hGb=8uPFL|=rn=tbuknVZH@c6lTwRx&tDAo6_vFL{NH*#E;`F*3dq9S zAPe<$g_|Lbl@`vP?s?1tR?G@d<;{F~!DWJpV}jAiZ1cI_u1C05|JSIWC{;G=zZmaq z*3GaMPMgC+NrqU@zPqB&6F3Y5LFs6s(1pzZo8B$_b9$1Lo3#?d;fVA!PDs<>grG(b z!-}m+jHf1pyE_i%EPv+h-_!B;yUF=)*S(HT6hiG?H(nBCcz^ZZ-`|rL+1mWRzZl$j zTOh_%ey1{Bw`|wF-|j!JZ|d19t;iH$9mE4Rl7Z!s`i24)hu~lphe}8bc13%`{@-5J zf3(8)&Aa$&d()@&^E2m)buwJ>6pn@_iFpDMR!kQrS3Xi>QDA7iC!i7ZBXw$hc=dmc z|8+H2J5ZYjj7kh!A03eZseHw<;F*D%b)tMI;+cCK? zyh`p=1%;_VgF`-t0OO0ZK@T-RYAiT5JeNOirSqCqupyQ6l03wi3(ia~3{^WacJMHA zI4t01()h2p!rWXftcA{L+_FaY|Kut+!>0l^no7V`c8;&?KJe5CgwdF0V zV8gafW2jpcn3x_vwmYNrfms|}?J2}Do&UG?!Tl~l1*Q#2+^0&wq6|!_90hC(cvNqJ z8aNVaj8pz|t+&QLLZ-mb_)y5G zkbWa0N5_Hx%zQnDA#-^hT#O$^ijw}7p0 zVVK;|#=y`p@c`rhhE@iKhDrY!8yZ>|7#sdiIsj%dHT*x&-N5+&K*N8g10X4oKowiN-BSTXF!+|CS#sdf18yF9O1Bj*J|AB^v<^v23?F^uhY-nPD2{AS>v^Fp?faIGP zcpCm6V1U8~hSvWuac*RBxDkvE|Jx6=|A*Sq&>+U}zX1a=fFeku0gDVsZ9_AIC`hiM zfdLIQHZ*}#11NZ#L97D}4NDlPlU({37(k(goM0IGnz9-C8t*Xf{ND^pe9&~m)R*ni zz`)^=y)z(S=gx+JCR90whK(G39svvt0S%~f?0wk`8yOh-JQ^7o0|J`CsTGn68WWI zCjccq^<^_OY-H;52x!>I^uHkhnx^<*E(+Ml!0^8z0Gg;kZUL)h0IBU_U;`yAkf-~Y zJQ#L1{Ab$P5CBPIZJ;#Pzz_gRV{Hr!2buy#Qy3`kwJ?Cv5n6#Xn!-j?SOWw0GAuLM z(13yAlXPc*pF1y?6c+;n1FxrtOArGC3j+vqurV+&)XQo&GcYht%5-)P@N{-o2q?-= z%gjk-V9=OYJK?l9Q=rH(`>iWnI9IuLi!n!P^KSM%eZ_%=*|2$y*jZ=ygOcqtCvrux zDLgQLub>)cC1U^ak1IXOJ83q%3`KZ!=v5*dit#`BKC4_h^;?=yDj{bl+uF-9m`#O z%{!-ewuk%leq{UD;McEoFIDGu&9R6LJEPuvE?;zH`;j>_o~u4GPuf4@y6AzE-+rsO zD&4ir-F(X8d_=~~snHRd(~cgqzR7PJS(-QPYcQW;n?>3L7Iwx|k${#?hR~@Z%$ipH zGj4`X=5_bJH7jnyXEkxP_DwM{qR0QlXh=x0&$z$8HYaPTbHXRtg3wvBHZaHJFg5f0 zo-JqiGAaD|bgA{9OHaDKJoB_+dhjMo<}dNg?_8D51vk|{>13GeKkcg(Q%NrK)~?iA zxyZ1$Guq@ES7lXSztK9mT467r%DRTVwFx21tf&9`xMKIaz{Bm^YXaRw^b&4sxd|>-kKM@Go;b5<=U-gbC&4-_4D>c z)qag&*(&-WLbs5|Wunw;-H6-4zpd6^Zr-QW(G+nmvo%pj*Q<7GSd!NC6eHuA-fEnU z4o2JeUcY(q(v#nnM!&aTf3r7j{nqQZ>(6}u89VR(=YO`@XU`n|RX5-9`F{=piP;By z&F`AT7s!9LD(O=h(v$B<2fyCho6gJ2) z$uX>H-&HJx5OZi?Xyn#;z<2tTjQ43^Xe{LX@lSI4no3Rq1&0Jv zCiA-`!IE{K&zeuSU^Zn8O4)KlpTX_(rP&}SAeD@>|socuanM=O=5!Y=miGmz-&6U}rGia8hp~m<#u81;Yb5B#(o187nMc zJHV5($=jyBF|hdGXP@;|S66=u=zRJ|oR1M?9Z2(mDcn7?KF^%t&D7u3*^EXnuVuBDsLM8-S0Ij?7vym6fAA&?4|q5|&}3a^@ch5#`ojn9g+FjJ zlrzB{0%pu$WaMW^OPCz11m=Q*5X|_%aKIMTODt&)4!jMLH=ac9bFuutdC%{4b78Ja z2w}ARzqrdcyna8!jCFrEMWF^>K^&7D!yNJ1j^LPsJ1t=siwzFtSzzUpwG^J$2bCW~ zgt=Ov!@2(|?@s-=_C%cF@n%zFuv_7do*}`=&!Cp3tV z(;&qlyjfJN$d0M#-+A}55-@i+Mv6}OY`@z2fBN;e;tZSj{$Do_MQfVN0pt%0md*L!yJ_;eW|(0QoH$PW+%ItI zaxve2h8gqrZVH0A0OGNNd!UdrpWBEQa#f&^!>T-sVUGFSMsX*HbN^cd%J^W$HTEhg zJg;B;=1Il6!}<)z9%qHYWFQt91Tx7n_*^NA;DPXA?w9CqU}tz-XsV4WJVS%gltC@a zTF33&{%S-J95}`LmY0Ohy0HbKRF^ z+tx7}#Qsj*iW)Kx_ORG6Sm>KIqh-?)&I$(X%CCTxp9^<5_y6Z9Nq4wK-AqOQ(hIL2 zFF#wyXkZs@EDTR&AVy=S;0K0;q-}?s&@B4FV#6RYf9*`P0{95W3PuCN=#7TrO3&+) z->qJ)gcQPa{(syt>+5-zKTHSa!h}JVFfy^EIe-${jg;w#91V7%4MPDxG|@o=pixpF zfH{H9?59)QqB;M$SH6vbN-#2A)>C+1f2+J;*R}WJ441dYhk1j|fV=#h_W|aH&q>DM zY7Z{T;WNE~9lLS|UXbz^-b|0r{fv)^`EzOIpL$SwifBEMU=VRM!x`lJgtaVB{;Z$6 zr1G5m0eyyZNVyA=mJCusN$zG_q#lG1^SOmQBR_WKSqwfm+tz+Bx^DHn-a=-Y_o*Ew zTu9EH*)Zq7=Isr<`(pMp+;|}U<`Y5=6jTQuGs!XR;71eW0oB*cv)>4ToQw#T1}TPj zjj60|XMg^`DF63j>hsG;5pZB9Yu>(}&x*~n6gPM=?q`TlUGNYd*kDG26exqX#cpx~ z1q(DTIRq3ocro%bgmGqApn7=*8>1=1vc&0n52T*{iFe3Z4o@93Dj6;R8`pEk1TgGp z*sMxS9wdH-{Stkdf?XVS!ngU&zuH!2I1|hVlIfl0_E>(aR-^&)*s>;SbWBtzcmOeCB^CgIP@=6F7XfHtgs1`T8x=2Gxv+nGNg= z+Qpa9Dnp;GpeE4XS~0L;;9v)t$`YowfbGDkIc7QQx1RfXe?x#?57=~25@29t3f6ld z&Jet>aT>ZVr3Z`$yrz6ngoGq%dk=Xq?Kif^mb;Qr>R3ZSgyq$U>;RY zTFBfm`4?=#j2y9HY6de_|CfGRP*|AC{8hkRuGvi_<_4&2)>#|NT9^ZGHLUdA8NpsyU5I|LxrQYk%dt+uQS(t-F6z zsA7}DUlW_1N9$4j$H*k@c7VBock@&|w078>=mX3R#kVuiGMTiS120&4iWEzfU-4=EUEUp{mbaN{dN0}Sqz7d9(|*vwjq)A4^zV7ytUlQsHxna zqk`c>OY47lA*ukDmkt9tYWG&u@_>cIMsWe#0b#L!-3MlIr=0s=V4?H;#|wA+s7G)1 zm%qPvNe`l%W!Jl9v-6}n6K`cP-Kje+s~mfOP5HkQ?e;c8jdT7_+);8bfvJvh!$Gqv zPf?RW<8q-73=dX@$e_7W+6UyEZ433CANeYo*2Q51&R+C zv8v93s1DXP$U65wH@JGKm>)DXS=cv*o%^qyzh|S5&8z$CPbDxm@`B1x>6+$PIk08W z0OAm+h&jN_@SVtJUjXv~TZe=u)+c}bKRk<&f|z6=2I?Hk{I|*ccD~Gzk;$Lq2P-&k zP{SxEf{~xW?9H`Z2B=x+LrViYgMY*ieN^EMiL6%`ZfuBteF&a8IDGawJo}J-u70)c z@Ar3imoMp-J9G8FZ^@1w7MCjKa{5em*n4|<=F@A)g)PX5YjBm(2bddP-nG_7Y4|fT zX^RCgCmap25`u@3ft?~Dh~hzMISb@BaEKl8WhR~PlNaOh}15NA03DFeOx?F{NbZ|q+OX<5K?q>lCj z#siydAmtpyLTyaeNJ7?;lUlI zI>v%LXkhT5XAw)2)*?VAx z<@cg**X#JtcqGJtB1rK&=@IvV$R>NbG6^%*M?{B3;UgQKHsJ> zQtShFL*%{M>#zb266eOs4;T-e$=S+{l!Y1?K&lxMrj_5{ic-ZLI0Nd=8AsRlam#Mo z^ya+bI~)G(=ghMF>d#GoyxDg8+`pS+eV}2p;{wy+qeqKQ9gO*V|4r1})DJ-yPOZ$} zx;=~K$xowmKa2O}od1}_#B$AVLEY>%clV^B)mkiS9tW5kIB)TIqhzSCq?-dd5qt9!G5mqS3 zW8BYRvAtIeqzDq&pa|NK$YR5A!yx)4dJlRhs||MLR~Tk&So>%1_Wib(D^7E*@Be;a z+Oeez_L-VRPY-(Z_yV_-<&lef#h=ye)6kK7DeB7zmUINs{ilqeckq=KVO$_ zmG6miR!Beb`u)>}=L{bsSdYzJT<^Kg?)~)~`Er@(=YPMSG&g*j=${iOC#&YMMjEU9 zzQ3n5TTTcR`3Iypcpkm4p80tG@*CUp<1MFHeqZ`gv+2yu`Yyev7k2!fKADq4AR-vl z9SruHj5a8FQse_eg3=TgE?e=#NT%pxP_Nq~G)Pp6K)HCr|bDZHxBq zoWFGQ0!@P~zyGQm?PHIfHP*YIcS@9j?bo<9=EcGVa9=)|)-X@~YuI%eoRk^Ku zdE&U-=IS5ce$D>X*Ja`J^dF16@O?HYnp0d~v^TQ(q3Zt6)=x$1Wj@y$X0c2;XDrcU zz1;r&{8IJ4-@4gCb1X`B=zP3%VrKr<@9+Na_=H zYfsOhdcWa-6euFwW-LR?y_2;bFdkU)uBQ|&J(!9FFemUD%FllV&ZHYvBeLYv{0fe3 zoOkAC|Ffk_?wxqmTk(6LbLokWx1|NwO`luG6wfk#ZuvZWYx>#7dp|5D+`D+^bmP0X z?mQ=cMwv3jNj%7*k%VKv*UR~Mby-%g+Q1oy4^6#69 z|7RxOxo=soy?o#Gy07bs&Iz+W{u~k&F8}0b@v*S#Z}~^3o2}E&7JBmitit!rrH5Y3 zpTFL_EN-fI>ujjuB9=G4N`dPv9?<-8%J~2=JJ@f6(J7K?L3-`)r zUt!sC!T-a(4>Nb4R()E1tNOb5^~>4%n{8bud@nAMEcdIM^X^c4<==;u55+^y&oE`l zdL6Xo*4JY{{?wg)KmCu*D!~i41=%@rA{wvj>-Cl7{{H@6e&zqD@_U=p{bv^Cy>t5C z8RutTe6Z?zM8x~g{=eHmP06j(4L-$thF2f*lzM+VZBp6cC{UJy)&`)~#tcveD!e8W zQ6Gb=Iu+0mrRVNM^u~n`)9hm=@2~h-XZ6*;cT!F-zkRTIuijIKFZ#Lt>}$W>Yp}Q= zbw8{BWz@qz8y_z{eMr>W>kfC+^Zc#PTQ1iBURaS|y-nUOCcR_M<9YSlu3y|c=XqFf zqmM(CAt|<&uc9AO-;U+b6)1rv43XIyIJ${uS#_MTVD27 z%l+TI{{I!7@4LR%y=kvou_e8)@VG)?%SRi6JIBHg{6a6 zSV&<*8q+=I{b^IwlpGRV824lE+RLGJ?LnOh0g1o^%ngDEOV9%3vW7viDZ?zw|GhGQ z)B5V4OzE3tJkLB(JKg@b`QwQAbM~)(oLM>7zOH_*(z$Ty-Fg3Re5}&=wf)+3Q>IPz z+pbUkdVc=j=+A4n*wrw-|T#pfnGX5T2kcFx;5`DY(T_!s{R z;k93v zmd{&1{quZN&LoHIeJ}2rephC*`S$UDNMFw1w(#jcTEnk?Kfs^2bLp1)yR+}dJmN8W zZdv?ibGFW#0u=Wn#-%f-(w9RFEm`R9CP*v=-~Ibg5mk;rmRtK*Un;oIg>l%=hj>9YZWKF?%YvY|1FE!V85jNU zbZ$T0;az@Jig{_Fs^gjYme0AnhXeWyY6-$Rjfg@36qY@pL8C(M*=Q5G zKA;I`;SHSAAPEOv#vao(_-e{v^n5?NnB}b7{BmzfHQ9~SO&?#{DW7t#ZeO}x@wd(O z+rFPOcvMwX^Xx@>wf1t$Y^E*8zW+);m*=zL)htHC`1e(tY_DJb;JZI2|9w^RzJp7r zPZPEI_FG>6 z4foGt(A0vqx72(=VVCQ^25m5@$MFDjgW-Z%lTd@yXBH^;ZBxF6K4hq1PznyaG#7nN zSH6O0f6~vDJUhW>++Gs$57f>9)3(tJz-E3!v48%-?5st zpG&*BpVrJ=Y`vq#JyZT({B?27H{QQP@8{eo4L+$PPVUM=|d9qe@Uj66UUUzCA z^=JKg+B=J}a=+e@zY{Efhre6(`S`yle=o~ghWt)9iGM$Rr!fCCx$fz4F^~S(Wqf`A zbj$OvM}J1opMI~Vv~=(L)p7qnyxMC1>~+!KoA$TF^(*~e8h$_Etom+iI&b5Tf3L54 zbo^evU4D9O(7Ef@|Bs&6d%IUk=;PmTYkgPivTM#4?Xy`-vYD>jv@&I6a)FN0`^;&G zXYjc*EkXd4R^jEFKtweoKf|?qS9(ygvqQooP(I(GyHNo(pKtiaG*MySH}#0OJu^Sw zpRHfyRsFV?`S7tHaeVbpo;>@)ZM|Nn{aL@PexY`RP1%-`lQLg&&d>S&#@uvb(zW4r?oof;*>VIro zXTI+Jlk|6bpHuyQD!e;?`TL#dU*}yXHr(H}ecS$LNAFwQKckce| zl#2iV)byN2@gw8s|MxYQy42Mf@y*wJHh;JM`}MzgjEj#I*NB^1%(DDi_^-mD;qLbAvlDi%e)Zim`(M$fwh0?KCQ1+**^gOSbIeFjPo!6)8t^IcCXHC)i{M|2=n~@Bh}# zrJOtO-MZE9_Ez4QXSdFy0P8(f-?u(J@WExT{QpCX`=@^EuV3`+&;B2$r7i!vXZKZ? zyPhq4ziIEBTuqMuaeY-!e&`>oez^PWRyODNw%;dSp0_;zX!mzHt=MPlZiYTO>im7` z4)G&DtN%X!t&z=?a;|Eo9Dmovia$7P36Vi{^LpY}eYp2`wkgvlwF5CV_u32p-v<@k z|DUamM$8+o+1e1#ux9IupWxtx#tvvqh^vCZpmBDRCu;m8tYx)fh{z87jMgjS6j{Of zIsX?Qf2FDXe9QKIZs&66u8~jmtJ=rDZ+7>bfB!_D zdOUkG{n%24=khLm?^jmyO;K#NsL%e#9p}7YO_^rL*R;gvMefz&lezkpRU;TP*s^|U6i{FI)ufBaR^wGOtD+DK4 z{;&L>zbf9ac;e&xzyG-O)$6P8S-0%_yx%$J=KQ<&v&do1_Nj;GAFeK}iRXE@dwa>t z(2^UKzM1keYkynsS#(WBVyEr1_g5uOygo0*ymNnH?c!@95~cOetHm_^ep` z@AI$CwI40duUdX$miX4Kugk9d{^(NkPw#GNsN_e7E&CrDmrwt8`_b>sh}8to6(5K* zJa0_nKnrX$(9CV_@ik}z*mK$&*s&^aoHH>eVJ&J}fP`&a349?a4pu zP2Ro6%WWUU`Blo^u&$z@ za&LW``m4WJb&s`tK3#vL$UgeId5;w9&ijSmmP#+m%h)?>optexeMV1y@?ZPDrvA9} zzTI2?U$Xx>QHX!tu1!Z4Kl`CC*CWNc@t)PsAQ8*=d*^(XnDBPyX8S##W*I3Jzc6mE zFW6I6TKv#@hW_W$`9IdH%EeU`c7CqPdK@HTD#|w9W_elX_dEQ?>9)6a=h%NtnEU?V z`Dqr{Z}0xMLw@(ss`jPvudAv}nI6^6IQ@GqD7XHLe5_LZ%lP?zbGv7!rI@?V*QLcC z+_=Mj-3rV9>U{3iXYQx=_FCjB?#OQaB zfZbY|e~!Xe-)URh;&$g}KomQUt z|BAR>{3D*W_Wmi(duK5$-TJ!9^4{@9Y!3U-CqCoz7-d&sk_hf zT&ey4IeV?g?HlJ^tA2UG`<6a>cU``}NztACkBqU4O@a=e<4m zt3DqGm4}u6-|`;jSWem#dxt;rvZDR{y;6)HE8ji+Gkx=Vg^s@&XQ!(=R++Muz0pyZ zJ@RkQ!)AG%x7+vrx~eJ$Yv;I$e&B8hJo*K#0~-vQ_!h~Vr3x#&AoW5cXc47Es1JCp z5VY0LA)sK;$~5u7o^RnFPUvpGqVxI0Ng202&$Khn%3IEj-NSBI{O5UD%*I`+ZheK% zO1>BE`+k4ppPy2mzYjZ`KCiy8<6aow&uMo-weOL1rQ`qq{{A-gYyIWdap8|1GV@Q_ zG5xZ9+}6)QSF-vUch0|f=jp$+|6$eZ+Z?WGNEGhfx$oZJk27~?PmdES&3*SaKR3=R zaGm*;?>2wWUzM}}(yUr{x_|HDBi(_*3#NaT`5r%K-RnM``H$yY{<*ucs-8dj-#g*| zTi2}rUOPGNb0G7At8r=XcjOh0w0AL z)TKe$FO*lw@O}7hSB5;#>)9)d|J9d2 zn78T4oOk|@_P*erc-c<=x_!Op*^jmVtM3Ir`yaB!{(s{v<3H-+_RGKg=jOKyd6eHX zi)p{$=laL;L2OHi643J|3Mu&7$~M@xG<}4lnPYerO+eU-|wi&G&n+?>na8+fjitzn^!lF7i}8C&jq<8jHr{wJI5J-2Duve4eiYT15?7!rjaI z>i)j#6-Ad(TQ`hMlNBE@9!Po9916=lkf>v$A zM8|gbz8rmZvtQeb{%v-1$lrJ7W`FIAr#bGwKm40zeDCzldF#)I_#LahW&FIl;zhw6 z#X}yq&VG!2G9|zE=;`DpseSeL_Z2+|j$iS9rCdyvXXgIbi{7f%IqoU{Gg&-W_ig;Q zqwd~+j{EOkapdc>h^($T57ux7nC{lQ{r{!AUCguhi_#q4`Ma#c3ug-pcLI2#-j$MbIMrYsO+VQDo>!IT>(og(7EBQ=X{e%?b&V84A zr5F#hXZ7~m)URLWP$D5?9nybCf?9~G$ckC znHGbhWYvs+Xzf-m)@ys%98NEo{&_yL5xdcC<#TiXuMsq;|MO46FzUvshjJ!GTdFO8 z_r5+o=cePH=T^o4?6*{Gi@BiwevRegpDoYVWoPldS++v4;CZ^d-sic0bIzXp`{U-U z#dhBxG%x)xKV`*hF}W4&?|Nk3`QF|(mG8R!^P8%18GE+>J-tZnU~FLVgKPeO0%zt+ zSnfN2yS_TJ{w%1NixYTk+;0AUy3GA7c{%&AHlFkIG(RR>ekPQ@0n`z3UVLrA2`R>I z_H4he|BKGPGy4B*_3P^E_k*IQH|@D^|9j^xJ>^JYN5;WNU zxy$N)$HhDA=BB!=XFK>YN;%>4!e2jszx=*$dyhCQ#k+}~sF&}vibJab91^%d-Qp(S zO)hBN;waF1Nh~E=W9W5;iYL>ev!pVfJo$F-_gsyO_Op%ip8b)xj%z>i=jXg{w|2fZ za^L;^-j5Rp_J}T&+zGb@;A1xKQ^&>u7An4IW=p({BN%2pJowM=6ySu zwffP6e;u1`XYJn1y|vBZ`%(RCdV=}Cif?=WKCEBu*lAyxzW496dr#tS{lEP!D*1u< z{*SZ0e*6DDwSLMD@sz&8XByjYRSREZuC)L5Zhx}->xR~-&x*zKcDwm@C9W|q{`dOi zG&}zA>$3!J{%gGbUZcIv_EG-7i?h9cFFTPb=h9d4`gfAvvH5dX&!6EK{pD#{l4Y(1ry0A>HQ0oc9s&>-QGc&NQC=v0W^?@4Nc@KQ5M!=f?yWZ!&lH`z|kI8T4y^ z$-=a?`_^nJi?xlu{x?7N$qBdr)Azq*e|+Lr+xGjv`m7#4&))I${#BW~=l^{@?bSYi z=azlx)yE$lUHW(Tz5mjx|8AP^-+AQ!7xns0NACa6y&v}I=Nd!7e|I}953K!dc)MNw zo&M{WpZ;v!di&d**QX|~iM$wjeHa*Fn@Y$ zhjOdU;d>=J@4Yd|w)|81ck!{sRa>*zbX4*#aT-}2lm_g(9F{Qauj$LD9CHM4tHuXb~L314b!)7lWvV8hzwj8?=f z=B!}YaIx&lS6G&T#?o?u4-5}917y%97^Qs^zM3*fS@z#nZr}Jl?#ZzqauuuVxA4F3 zpYt;DY^QwAtvl97i`f0%t$%MDzwZ6~ZLWUl&;I0t@`0vZ<#YL|Km7G>#XZVh?lmR@V>~{UCYdjUdH)mgLu+H1HkmtwYJpa!3U331P`DtHyHFW9!%YD~o34?~P z-b$XiAD(TLQZ4@7{n?-N|A|i?r2miO?cT9J+LV!PqkQv;n{sE)PFJmcaj)9zj;vM0 zqy5`gUrYIMUH`B4(pp1%fy(_;@5O%Ky#Loc3#B`INx-^oA+#g+`KgJ^Hn!NPzwlDU4Lcz z8Xv!U{&^nMh-f�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 diff --git a/src/mac/icons/release/86Box.icns b/src/mac/icons/release/86Box.icns index 4f15661ed03c6ffbe15ed4bcc8359d9d64417f8a..8d375d4bf37aab6411ea9002df8dd000b682aae3 100644 GIT binary patch literal 314012 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±q~kZ#qzf~x@@8)o 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

    @75(!#)zA>N?4P=i69 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 A_y7O^ From d50b072cf8f45f354d412b6eea69ccb70c4625a0 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 15 Dec 2022 15:49:00 +0100 Subject: [PATCH 031/285] Bumped up maximum sectors for IDE, ATAPI, and SCSI to 255 for VHD compliance. --- src/config.c | 4 ++-- src/qt/qt_harddiskdialog.cpp | 4 ++-- src/win/win_settings.c | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/config.c b/src/config.c index 39826b3b5..8e2b5c292 100644 --- a/src/config.c +++ b/src/config.c @@ -998,13 +998,13 @@ load_hard_disks(void) break; case HDD_BUS_IDE: - max_spt = 63; + max_spt = 255; max_hpc = 255; max_tracks = 266305; break; case HDD_BUS_SCSI: - max_spt = 99; + max_spt = 255; max_hpc = 255; max_tracks = 266305; break; diff --git a/src/qt/qt_harddiskdialog.cpp b/src/qt/qt_harddiskdialog.cpp index 89de664d8..eb8b3fd1a 100644 --- a/src/qt/qt_harddiskdialog.cpp +++ b/src/qt/qt_harddiskdialog.cpp @@ -703,13 +703,13 @@ HarddiskDialog::on_comboBoxBus_currentIndexChanged(int index) max_cylinders = 266305; break; case HDD_BUS_IDE: - max_sectors = 63; + max_sectors = 255; max_heads = 255; max_cylinders = 266305; break; case HDD_BUS_ATAPI: case HDD_BUS_SCSI: - max_sectors = 99; + max_sectors = 255; max_heads = 255; max_cylinders = 266305; break; diff --git a/src/win/win_settings.c b/src/win/win_settings.c index afb283adc..34667ec39 100644 --- a/src/win/win_settings.c +++ b/src/win/win_settings.c @@ -3315,13 +3315,13 @@ hdd_add_file_open_error: max_tracks = 266305; break; case HDD_BUS_IDE: - max_spt = 63; + max_spt = 255; max_hpc = 255; max_tracks = 266305; break; case HDD_BUS_ATAPI: case HDD_BUS_SCSI: - max_spt = 99; + max_spt = 255; max_hpc = 255; max_tracks = 266305; break; From 5f332ccb53c837a2f5a95b63219b9a982b762162 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 15 Dec 2022 15:54:08 +0100 Subject: [PATCH 032/285] Forgotten bug fix. --- src/win/win_settings.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/win/win_settings.c b/src/win/win_settings.c index 34667ec39..d6e0c0693 100644 --- a/src/win/win_settings.c +++ b/src/win/win_settings.c @@ -2793,7 +2793,7 @@ win_settings_hard_disks_add_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM add_locations(hdlg); hdd_ptr->bus = HDD_BUS_IDE; - max_spt = 63; + max_spt = 255; max_hpc = 255; settings_set_cur_sel(hdlg, IDC_COMBO_HD_BUS, hdd_ptr->bus - 1); max_tracks = 266305; From 368462f23f6b3b884451fa0b96e9d1823a0fe180 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 15 Dec 2022 16:00:12 +0100 Subject: [PATCH 033/285] Fixed IBM PS/2 Model 55SX Planar ID. --- src/machine/m_ps2_mca.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/machine/m_ps2_mca.c b/src/machine/m_ps2_mca.c index e59fb1a19..cfe6ba6bd 100644 --- a/src/machine/m_ps2_mca.c +++ b/src/machine/m_ps2_mca.c @@ -1405,7 +1405,7 @@ machine_ps2_model_55sx_init(const machine_t *model) machine_ps2_common_init(model); - ps2.planar_id = 0xfffb; + ps2.planar_id = 0xfbff; ps2_mca_board_model_55sx_init(0, 4); return ret; From dc1dff8211982d91d1abd60ae53b3f33d11b2293 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 15 Dec 2022 22:23:43 +0100 Subject: [PATCH 034/285] GDB stub fixes so it compiles again. --- src/gdbstub.c | 17 +++++++++++------ src/include/86box/gdbstub.h | 10 +++++----- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/gdbstub.c b/src/gdbstub.c index efca53f74..dc638cd07 100644 --- a/src/gdbstub.c +++ b/src/gdbstub.c @@ -334,7 +334,7 @@ int gdbstub_step = 0, gdbstub_next_asap = 0; uint64_t gdbstub_watch_pages[(((uint32_t) -1) >> (MEM_GRANULARITY_BITS + 6)) + 1]; static void -gdbstub_break() +gdbstub_break(void) { /* Pause CPU execution as soon as possible. */ if (gdbstub_step <= GDBSTUB_EXEC) @@ -988,8 +988,13 @@ e14: /* Add our supported features to the end. */ if (client->response_pos < (sizeof(client->response) - 1)) +#if (defined __amd64__ || defined _M_X64 || defined __aarch64__ || defined _M_ARM64) client->response_pos += snprintf(&client->response[client->response_pos], sizeof(client->response) - client->response_pos, "PacketSize=%lX;swbreak+;hwbreak+;qXfer:features:read+", sizeof(client->packet) - 1); +#else + client->response_pos += snprintf(&client->response[client->response_pos], sizeof(client->response) - client->response_pos, + "PacketSize=%X;swbreak+;hwbreak+;qXfer:features:read+", sizeof(client->packet) - 1); +#endif break; } else if (!strcmp(client->response, "Xfer")) { /* Read the transfer object. */ @@ -1627,7 +1632,7 @@ gdbstub_server_thread(void *priv) } void -gdbstub_cpu_init() +gdbstub_cpu_init(void) { /* Replace cpu_exec with our own function if the GDB stub is active. */ if ((gdbstub_socket != -1) && (cpu_exec != gdbstub_cpu_exec)) { @@ -1637,7 +1642,7 @@ gdbstub_cpu_init() } int -gdbstub_instruction() +gdbstub_instruction(void) { /* Check hardware breakpoints if any are present. */ gdbstub_breakpoint_t *breakpoint = first_hwbreak; @@ -1667,7 +1672,7 @@ gdbstub_instruction() } int -gdbstub_int3() +gdbstub_int3(void) { /* Check software breakpoints if any are present. */ gdbstub_breakpoint_t *breakpoint = first_swbreak; @@ -1744,7 +1749,7 @@ gdbstub_mem_access(uint32_t *addrs, int access) } void -gdbstub_init() +gdbstub_init(void) { #ifdef _WIN32 WSAStartup(MAKEWORD(2, 2), &wsa); @@ -1790,7 +1795,7 @@ gdbstub_init() } void -gdbstub_close() +gdbstub_close(void) { /* Stop if the GDB server hasn't initialized. */ if (gdbstub_socket < 0) diff --git a/src/include/86box/gdbstub.h b/src/include/86box/gdbstub.h index 4b2f8630a..8ac83f625 100644 --- a/src/include/86box/gdbstub.h +++ b/src/include/86box/gdbstub.h @@ -53,12 +53,12 @@ enum { extern int gdbstub_step, gdbstub_next_asap; extern uint64_t gdbstub_watch_pages[(((uint32_t) -1) >> (MEM_GRANULARITY_BITS + 6)) + 1]; -extern void gdbstub_cpu_init(); -extern int gdbstub_instruction(); -extern int gdbstub_int3(); +extern void gdbstub_cpu_init(void); +extern int gdbstub_instruction(void); +extern int gdbstub_int3(void); extern void gdbstub_mem_access(uint32_t *addrs, int access); -extern void gdbstub_init(); -extern void gdbstub_close(); +extern void gdbstub_init(void); +extern void gdbstub_close(void); #else From 3c46b6becda1c6ec3d95c453e567f75a179511ad Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sun, 18 Dec 2022 22:40:00 -0500 Subject: [PATCH 035/285] Minitrace default was missing from the win32 makefile --- src/win/Makefile.mingw | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/win/Makefile.mingw b/src/win/Makefile.mingw index 61ed25f9b..a800dd957 100644 --- a/src/win/Makefile.mingw +++ b/src/win/Makefile.mingw @@ -200,6 +200,9 @@ endif ifndef RTMIDI RTMIDI := y endif +ifndef MINITRACE + MINITRACE := n +endif ifeq ($(DYNAREC), y) ifeq ($(ARM), y) ifeq ($(NEW_DYNAREC), n) From 137b327471d68880b5cd41f61c8e92f1a8cc2365 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sun, 18 Dec 2022 23:05:43 -0500 Subject: [PATCH 036/285] Minitrace fixes so it compiles again --- src/minitrace/minitrace.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/minitrace/minitrace.c b/src/minitrace/minitrace.c index d8f0e97a9..df68e7d79 100644 --- a/src/minitrace/minitrace.c +++ b/src/minitrace/minitrace.c @@ -95,16 +95,16 @@ void mtr_flush_with_state(int); // pthread basics #ifdef _WIN32 -static int get_cur_thread_id() { +static int get_cur_thread_id(void) { return (int)GetCurrentThreadId(); } -static int get_cur_process_id() { +static int get_cur_process_id(void) { return (int)GetCurrentProcessId(); } static uint64_t _frequency = 0; static uint64_t _starttime = 0; -double mtr_time_s() { +double mtr_time_s(void) { if (_frequency == 0) { QueryPerformanceFrequency((LARGE_INTEGER*)&_frequency); QueryPerformanceCounter((LARGE_INTEGER*)&_starttime); @@ -124,7 +124,7 @@ static BOOL WINAPI CtrlHandler(DWORD fdwCtrlType) { ExitProcess(1); } -void mtr_register_sigint_handler() { +void mtr_register_sigint_handler(void) { // For console apps: SetConsoleCtrlHandler(&CtrlHandler, TRUE); } @@ -154,10 +154,10 @@ static void join_flushing_thread(void) { #else -static inline int get_cur_thread_id() { +static inline int get_cur_thread_id(void) { return (int)(intptr_t)pthread_self(); } -static inline int get_cur_process_id() { +static inline int get_cur_process_id(void) { return (int)getpid(); } @@ -193,7 +193,7 @@ double mtr_time_s() { return time.tv_sec + time.tv_nsec / 1.0e9; } #else -double mtr_time_s() { +double mtr_time_s(void) { static time_t start; struct timeval tv; gettimeofday(&tv, NULL); @@ -217,7 +217,7 @@ static void termination_handler(int signum) { exit(1); } -void mtr_register_sigint_handler() { +void mtr_register_sigint_handler(void) { #ifndef MTR_ENABLED return; #endif @@ -251,7 +251,7 @@ void mtr_init(const char *json_file) { mtr_init_from_stream(fopen(json_file, "wb")); } -void mtr_shutdown() { +void mtr_shutdown(void) { int i; #ifndef MTR_ENABLED return; @@ -289,7 +289,7 @@ const char *mtr_pool_string(const char *str) { return "string pool full"; } -void mtr_start() { +void mtr_start(void) { #ifndef MTR_ENABLED return; #endif @@ -304,7 +304,7 @@ void mtr_start() { init_flushing_thread(); } -void mtr_stop() { +void mtr_stop(void) { #ifndef MTR_ENABLED return; #endif @@ -435,7 +435,7 @@ void mtr_flush_with_state(int is_last) { pthread_mutex_unlock(&mutex); } -void mtr_flush() { +void mtr_flush(void) { mtr_flush_with_state(FALSE); } From 5c0d5fc2d381cbe0e3a8a31a4af8927c085f0e44 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Mon, 19 Dec 2022 00:42:10 -0500 Subject: [PATCH 037/285] MSYS2 QT build support --- .github/workflows/c-cpp.yml | 4 +- .github/workflows/cmake.yml | 75 ++++++++++++++++++++++++++++++++++++- 2 files changed, 76 insertions(+), 3 deletions(-) diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index ead4d5dcc..7eafa3d12 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -15,8 +15,8 @@ on: - "!**/CMakeLists.txt" jobs: - build: - name: MSYS2 Makefile build ${{ matrix.build.name }} ${{ matrix.dynarec.name }} build (${{ matrix.environment.msystem }}) + msys2: + name: MSYS2 Makefile (Win32 GUI, ${{ matrix.build.name }}, ${{ matrix.dynarec.name }}, ${{ matrix.environment.msystem }}) runs-on: windows-latest diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index ed4bf39ed..af35910a6 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -25,7 +25,7 @@ on: jobs: msys2: - name: MSYS2 ${{ matrix.build.name }} ${{ matrix.dynarec.name }} build (${{ matrix.environment.msystem }}) + name: MSYS2 (Win32 GUI, ${{ matrix.build.name }}, ${{ matrix.dynarec.name }}, ${{ matrix.environment.msystem }}) runs-on: windows-2022 @@ -95,6 +95,79 @@ jobs: name: '86Box${{ matrix.dynarec.slug }}${{ matrix.build.slug }}-Windows-${{ matrix.environment.msystem }}-gha${{ github.run_number }}' path: build/artifacts/** + msys2-qt: + name: MSYS2 (Qt GUI, ${{ matrix.build.name }}, ${{ matrix.dynarec.name }}, ${{ matrix.environment.msystem }}) + + runs-on: windows-2022 + + defaults: + run: + shell: msys2 {0} + + strategy: + fail-fast: true + matrix: + build: + - name: Debug + preset: debug + slug: -Debug + - name: Dev + preset: experimental + slug: -Dev + dynarec: + - name: ODR + new: off + slug: -ODR + - name: NDR + new: on + slug: -NDR + environment: + - 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: UCRT64 + prefix: mingw-w64-ucrt-x86_64 + toolchain: ./cmake/flags-gcc-x86_64.cmake + + steps: + - uses: msys2/setup-msys2@v2 + with: + path-type: inherit + update: true + msystem: ${{ matrix.environment.msystem }} + install: >- + ${{ matrix.environment.prefix }}-ninja + ${{ matrix.environment.prefix }}-cc + ${{ matrix.environment.prefix }}-pkg-config + ${{ matrix.environment.prefix }}-freetype + ${{ matrix.environment.prefix }}-SDL2 + ${{ matrix.environment.prefix }}-zlib + ${{ matrix.environment.prefix }}-libpng + ${{ matrix.environment.prefix }}-libvncserver + ${{ matrix.environment.prefix }}-openal + ${{ matrix.environment.prefix }}-rtmidi + ${{ matrix.environment.prefix }}-qt5-base + ${{ matrix.environment.prefix }}-qt5-tools + - uses: actions/checkout@v3 + - name: Configure CMake + run: >- + cmake -G Ninja -S . -B build --preset ${{ matrix.build.preset }} + --toolchain ${{ matrix.environment.toolchain }} + -D NEW_DYNAREC=${{ matrix.dynarec.new }} + -D CMAKE_INSTALL_PREFIX=./build/artifacts + -D QT=ON + - name: Build + run: cmake --build build + - name: Generate package + run: cmake --install build + - uses: actions/upload-artifact@v3 + with: + name: '86Box-Qt${{ matrix.dynarec.slug }}${{ matrix.build.slug }}-Windows-${{ matrix.environment.msystem }}-gha${{ github.run_number }}' + path: build/artifacts/** + llvm-windows: name: "Windows vcpkg/LLVM (${{ matrix.ui.name }}, ${{ matrix.build.name }}, ${{ matrix.dynarec.name }}, ${{ matrix.target.name }})" From efa07a152a5d8fa875ef8fe3890654b861c0afe8 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Mon, 19 Dec 2022 00:36:25 -0500 Subject: [PATCH 038/285] Temporarily disable QT build on github till it's fixed --- .github/workflows/cmake.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index af35910a6..534d268b7 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -196,8 +196,8 @@ jobs: ui: - name: Win32 GUI qt: off - - name: Qt GUI - qt: on +# - name: Qt GUI +# qt: on slug: -Qt target: - name: x86 From ca8e9b70a85cc3311de0233b582b2a3e2d2eddc7 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Mon, 19 Dec 2022 13:30:51 +0600 Subject: [PATCH 039/285] Reset size of screen on 4:3 option toggling --- src/qt/qt_mainwindow.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index 102363414..3078ccde7 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -1835,6 +1835,7 @@ video_toggle_option(QAction *action, int *val) action->setChecked(*val > 0 ? true : false); endblit(); config_save(); + reset_screen_size(); device_force_redraw(); for (int i = 0; i < MONITORS_NUM; i++) { if (monitors[i].target_buffer) From b85ca5091b43148b4c91df191fc8626342bf7d44 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Mon, 19 Dec 2022 03:30:49 -0500 Subject: [PATCH 040/285] Try and work out what is causing packaging to fail --- .github/workflows/cmake.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index 534d268b7..c00b683fd 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -105,7 +105,7 @@ jobs: shell: msys2 {0} strategy: - fail-fast: true + fail-fast: false matrix: build: - name: Debug From 6ce4f2de03290e39bb742301c93227a678e30fea Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Mon, 19 Dec 2022 22:52:17 +0600 Subject: [PATCH 041/285] qt: Don't resize renderer screen beyond window size --- src/qt/qt_mainwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index 3078ccde7..d707fc7ea 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -261,7 +261,7 @@ MainWindow::MainWindow(QWidget *parent) + (statusBar()->height() * !hide_status_bar) + (ui->toolBar->height() * !hide_tool_bar); - ui->stackedWidget->resize(w, h); + ui->stackedWidget->resize(w, (h / (!dpi_scale ? util::screenOfWidget(this)->devicePixelRatio() : 1.))); setFixedSize(w, modifiedHeight); } }); From 10b52114208fd0ecec699c0c4514936ea1c49a43 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Mon, 19 Dec 2022 14:59:45 -0500 Subject: [PATCH 042/285] Disable Qt MINGW32 packaging for now --- .github/workflows/cmake.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index c00b683fd..eceb3f2d6 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -105,7 +105,7 @@ jobs: shell: msys2 {0} strategy: - fail-fast: false + fail-fast: true matrix: build: - name: Debug @@ -162,6 +162,7 @@ jobs: - name: Build run: cmake --build build - name: Generate package + if: matrix.environment.msystem != 'MINGW32' run: cmake --install build - uses: actions/upload-artifact@v3 with: From 561b6b1b0620a7269c128bbb05c843ab8c95f595 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Mon, 19 Dec 2022 14:37:01 +0100 Subject: [PATCH 043/285] vcpkg: fix Qt build --- .github/workflows/cmake.yml | 4 ++-- vcpkg.json | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index eceb3f2d6..c303f4631 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -197,8 +197,8 @@ jobs: ui: - name: Win32 GUI qt: off -# - name: Qt GUI -# qt: on + - name: Qt GUI + qt: on slug: -Qt target: - name: x86 diff --git a/vcpkg.json b/vcpkg.json index f3f420b33..46ab6bff3 100644 --- a/vcpkg.json +++ b/vcpkg.json @@ -21,6 +21,7 @@ "concurrent", "default-features", "gui", + "opengl", "harfbuzz", "network", "vulkan", From 82bdd54b203a960e2dfec236396e54fa799e998d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Mon, 19 Dec 2022 14:42:52 +0100 Subject: [PATCH 044/285] actions: combine the two MSYS2 jobs into one --- .github/workflows/cmake.yml | 114 ++++++++---------------------------- 1 file changed, 26 insertions(+), 88 deletions(-) diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index c303f4631..ec488eea5 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -25,7 +25,7 @@ on: jobs: msys2: - name: MSYS2 (Win32 GUI, ${{ matrix.build.name }}, ${{ matrix.dynarec.name }}, ${{ matrix.environment.msystem }}) + name: MSYS2 (${{ matrix.ui.name }}, ${{ matrix.build.name }}, ${{ matrix.dynarec.name }}, ${{ matrix.environment.msystem }}) runs-on: windows-2022 @@ -50,6 +50,17 @@ jobs: - name: NDR new: on slug: -NDR + ui: + - name: Win32 GUI + qt: off + static: on + - name: Qt GUI + qt: on + static: off + slug: -Qt + packages: >- + qt5-base:p + qt5-tools:p environment: - msystem: MINGW32 prefix: mingw-w64-i686 @@ -64,20 +75,20 @@ jobs: steps: - uses: msys2/setup-msys2@v2 with: - path-type: inherit update: true msystem: ${{ matrix.environment.msystem }} - install: >- - ${{ matrix.environment.prefix }}-ninja - ${{ matrix.environment.prefix }}-cc - ${{ matrix.environment.prefix }}-pkg-config - ${{ matrix.environment.prefix }}-freetype - ${{ matrix.environment.prefix }}-SDL2 - ${{ matrix.environment.prefix }}-zlib - ${{ matrix.environment.prefix }}-libpng - ${{ matrix.environment.prefix }}-libvncserver - ${{ matrix.environment.prefix }}-openal - ${{ matrix.environment.prefix }}-rtmidi + pacboy: >- + ninja:p + cmake:p + cc:p + pkg-config:p + freetype:p + SDL2:p + zlib:p + libpng:p + openal:p + rtmidi:p + ${{ matrix.ui.packages }} - uses: actions/checkout@v3 - name: Configure CMake run: >- @@ -85,7 +96,8 @@ jobs: --toolchain ${{ matrix.environment.toolchain }} -D NEW_DYNAREC=${{ matrix.dynarec.new }} -D CMAKE_INSTALL_PREFIX=./build/artifacts - -D QT=OFF + -D QT=${{ matrix.ui.qt }} + -D STATIC_BUILD=${{ matrix.ui.static }} - name: Build run: cmake --build build - name: Generate package @@ -95,80 +107,6 @@ jobs: name: '86Box${{ matrix.dynarec.slug }}${{ matrix.build.slug }}-Windows-${{ matrix.environment.msystem }}-gha${{ github.run_number }}' path: build/artifacts/** - msys2-qt: - name: MSYS2 (Qt GUI, ${{ matrix.build.name }}, ${{ matrix.dynarec.name }}, ${{ matrix.environment.msystem }}) - - runs-on: windows-2022 - - defaults: - run: - shell: msys2 {0} - - strategy: - fail-fast: true - matrix: - build: - - name: Debug - preset: debug - slug: -Debug - - name: Dev - preset: experimental - slug: -Dev - dynarec: - - name: ODR - new: off - slug: -ODR - - name: NDR - new: on - slug: -NDR - environment: - - 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: UCRT64 - prefix: mingw-w64-ucrt-x86_64 - toolchain: ./cmake/flags-gcc-x86_64.cmake - - steps: - - uses: msys2/setup-msys2@v2 - with: - path-type: inherit - update: true - msystem: ${{ matrix.environment.msystem }} - install: >- - ${{ matrix.environment.prefix }}-ninja - ${{ matrix.environment.prefix }}-cc - ${{ matrix.environment.prefix }}-pkg-config - ${{ matrix.environment.prefix }}-freetype - ${{ matrix.environment.prefix }}-SDL2 - ${{ matrix.environment.prefix }}-zlib - ${{ matrix.environment.prefix }}-libpng - ${{ matrix.environment.prefix }}-libvncserver - ${{ matrix.environment.prefix }}-openal - ${{ matrix.environment.prefix }}-rtmidi - ${{ matrix.environment.prefix }}-qt5-base - ${{ matrix.environment.prefix }}-qt5-tools - - uses: actions/checkout@v3 - - name: Configure CMake - run: >- - cmake -G Ninja -S . -B build --preset ${{ matrix.build.preset }} - --toolchain ${{ matrix.environment.toolchain }} - -D NEW_DYNAREC=${{ matrix.dynarec.new }} - -D CMAKE_INSTALL_PREFIX=./build/artifacts - -D QT=ON - - name: Build - run: cmake --build build - - name: Generate package - if: matrix.environment.msystem != 'MINGW32' - run: cmake --install build - - uses: actions/upload-artifact@v3 - with: - name: '86Box-Qt${{ matrix.dynarec.slug }}${{ matrix.build.slug }}-Windows-${{ matrix.environment.msystem }}-gha${{ github.run_number }}' - path: build/artifacts/** - llvm-windows: name: "Windows vcpkg/LLVM (${{ matrix.ui.name }}, ${{ matrix.build.name }}, ${{ matrix.dynarec.name }}, ${{ matrix.target.name }})" From f480e6b5cdcb480115dc86f6edcbeb81a7ec38da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Mon, 19 Dec 2022 21:10:47 +0100 Subject: [PATCH 045/285] actions: add frontend slug to MSYS2 --- .github/workflows/cmake.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index ec488eea5..e6da49cef 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -104,7 +104,7 @@ jobs: run: cmake --install build - uses: actions/upload-artifact@v3 with: - name: '86Box${{ matrix.dynarec.slug }}${{ matrix.build.slug }}-Windows-${{ matrix.environment.msystem }}-gha${{ github.run_number }}' + name: '86Box${{ matrix.ui.slug }}${{ matrix.dynarec.slug }}${{ matrix.build.slug }}-Windows-${{ matrix.environment.msystem }}-gha${{ github.run_number }}' path: build/artifacts/** llvm-windows: From 1ed1a5da3d50eafab45124b03c16489c5091a037 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Mon, 19 Dec 2022 18:41:09 -0500 Subject: [PATCH 046/285] Create llvm-win32-arm.cmake --- cmake/llvm-win32-arm.cmake | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 cmake/llvm-win32-arm.cmake diff --git a/cmake/llvm-win32-arm.cmake b/cmake/llvm-win32-arm.cmake new file mode 100644 index 000000000..9d3488124 --- /dev/null +++ b/cmake/llvm-win32-arm.cmake @@ -0,0 +1,30 @@ +# +# 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 toolchain file for Clang on Windows builds (ARM64 target). +# +# Authors: David Hrdlička, +# +# Copyright 2021 David Hrdlička. +# + +include(${CMAKE_CURRENT_LIST_DIR}/flags-gcc-armv7.cmake) + +# Use the GCC-compatible Clang executables in order to use our flags +set(CMAKE_C_COMPILER clang) +set(CMAKE_CXX_COMPILER clang++) + +# `llvm-rc` is barely usable as of LLVM 13, using MS' rc.exe for now +set(CMAKE_RC_COMPILER rc) + +set(CMAKE_C_COMPILER_TARGET arm-pc-windows-msvc) +set(CMAKE_CXX_COMPILER_TARGET arm-pc-windows-msvc) + +set(CMAKE_SYSTEM_PROCESSOR ARM) + +# TODO: set the vcpkg target triplet perhaps? From cfe3fec2baa2160fe6417dc4b4bdd077f8067f09 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Mon, 19 Dec 2022 19:45:39 -0500 Subject: [PATCH 047/285] Fix issues on non QT unix builds --- src/include/86box/unix_sdl.h | 6 +++--- src/unix/macOSXGlue.h | 2 +- src/unix/unix.c | 16 ++++++++-------- src/unix/unix_sdl.c | 16 ++++++++-------- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/include/86box/unix_sdl.h b/src/include/86box/unix_sdl.h index 0054ed938..27d7ec0aa 100644 --- a/src/include/86box/unix_sdl.h +++ b/src/include/86box/unix_sdl.h @@ -2,9 +2,9 @@ #define _UNIX_SDL_H extern void sdl_close(void); -extern int sdl_inits(); -extern int sdl_inith(); -extern int sdl_initho(); +extern int sdl_inits(void); +extern int sdl_inith(void); +extern int sdl_initho(void); extern int sdl_pause(void); extern void sdl_resize(int x, int y); extern void sdl_enable(int enable); diff --git a/src/unix/macOSXGlue.h b/src/unix/macOSXGlue.h index f49402805..44bf9e7f6 100644 --- a/src/unix/macOSXGlue.h +++ b/src/unix/macOSXGlue.h @@ -14,7 +14,7 @@ CF_IMPLICIT_BRIDGING_ENABLED CF_EXTERN_C_BEGIN void getDefaultROMPath(char *); -int toto(); +int toto(void); CF_EXTERN_C_END CF_IMPLICIT_BRIDGING_DISABLED diff --git a/src/unix/unix.c b/src/unix/unix.c index 4410118f3..296da5e14 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -468,12 +468,12 @@ ui_sb_update_tip(int arg) } void -ui_sb_update_panes() +ui_sb_update_panes(void) { } void -ui_sb_update_text() +ui_sb_update_text(void) { } @@ -699,7 +699,7 @@ typedef struct mouseinputdata { SDL_mutex *mousemutex; static mouseinputdata mousedata; void -mouse_poll() +mouse_poll(void) { SDL_LockMutex(mousemutex); mouse_x = mousedata.deltax; @@ -754,7 +754,7 @@ plat_pause(int p) } void -plat_init_rom_paths() +plat_init_rom_paths(void) { #ifndef __APPLE__ if (getenv("XDG_DATA_HOME")) { @@ -1202,7 +1202,7 @@ main(int argc, char **argv) case SDL_RENDER_DEVICE_RESET: case SDL_RENDER_TARGETS_RESET: { - extern void sdl_reinit_texture(); + extern void sdl_reinit_texture(void); sdl_reinit_texture(); break; } @@ -1238,7 +1238,7 @@ main(int argc, char **argv) sdl_blit(params.x, params.y, params.w, params.h); } if (title_set) { - extern void ui_window_title_real(); + extern void ui_window_title_real(void); ui_window_title_real(); } if (video_fullscreen && keyboard_isfsexit()) { @@ -1303,13 +1303,13 @@ joystick_process(void) { } void -startblit() +startblit(void) { SDL_LockMutex(blitmtx); } void -endblit() +endblit(void) { SDL_UnlockMutex(blitmtx); } diff --git a/src/unix/unix_sdl.c b/src/unix/unix_sdl.c index bd2f3937b..bc89c9290 100644 --- a/src/unix/unix_sdl.c +++ b/src/unix/unix_sdl.c @@ -46,7 +46,7 @@ double mouse_sensitivity = 1.0; /* Unused. */ double mouse_x_error = 0.0, mouse_y_error = 0.0; /* Unused. */ static uint8_t interpixels[17842176]; -extern void RenderImGui(); +extern void RenderImGui(void); static void sdl_integer_scale(double *d, double *g) { @@ -61,7 +61,7 @@ sdl_integer_scale(double *d, double *g) } } -void sdl_reinit_texture(); +void sdl_reinit_texture(void); static void sdl_stretch(int *w, int *h, int *x, int *y) @@ -141,7 +141,7 @@ sdl_blit_shim(int x, int y, int w, int h, int monitor_index) video_blit_complete_monitor(monitor_index); } -void ui_window_title_real(); +void ui_window_title_real(void); void sdl_real_blit(SDL_Rect *r_src) @@ -286,7 +286,7 @@ sdl_select_best_hw_driver(void) } void -sdl_reinit_texture() +sdl_reinit_texture(void) { sdl_destroy_texture(); @@ -416,19 +416,19 @@ sdl_init_common(int flags) } int -sdl_inits() +sdl_inits(void) { return sdl_init_common(0); } int -sdl_inith() +sdl_inith(void) { return sdl_init_common(RENDERER_HARDWARE); } int -sdl_initho() +sdl_initho(void) { return sdl_init_common(RENDERER_HARDWARE | RENDERER_OPENGL); } @@ -462,7 +462,7 @@ wchar_t sdl_win_title[512] = { L'8', L'6', L'B', L'o', L'x', 0 }; SDL_mutex *titlemtx = NULL; void -ui_window_title_real() +ui_window_title_real(void) { char *res; if (sizeof(wchar_t) == 1) { From 5ef744ab2d2aefe01900e367302c8b0ec00dbb7b Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Mon, 19 Dec 2022 19:07:03 -0500 Subject: [PATCH 048/285] Fix many inconsistencies in GHA cmake script --- .github/workflows/c-cpp.yml | 60 +++++++++++++++++++++---------------- .github/workflows/cmake.yml | 60 +++++++++++++++++++++++-------------- 2 files changed, 72 insertions(+), 48 deletions(-) diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index 7eafa3d12..0c4ecd6b7 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -16,9 +16,9 @@ on: jobs: msys2: - name: MSYS2 Makefile (Win32 GUI, ${{ matrix.build.name }}, ${{ matrix.dynarec.name }}, ${{ matrix.environment.msystem }}) + name: "Windows MSYS2 Makefile (Win32 GUI, ${{ matrix.build.name }}, ${{ matrix.dynarec.name }}, ${{ matrix.environment.msystem }})" - runs-on: windows-latest + runs-on: windows-2022 defaults: run: @@ -50,28 +50,38 @@ jobs: - msystem: MINGW64 prefix: mingw-w64-x86_64 x64: y + - msystem: UCRT64 + prefix: mingw-w64-ucrt-x86_64 + x64: y steps: - - uses: msys2/setup-msys2@v2 - with: - update: true - msystem: ${{ matrix.environment.msystem }} - install: >- - make - ${{ matrix.environment.prefix }}-gcc - ${{ matrix.environment.prefix }}-pkg-config - ${{ matrix.environment.prefix }}-openal - ${{ matrix.environment.prefix }}-freetype - ${{ matrix.environment.prefix }}-SDL2 - ${{ matrix.environment.prefix }}-zlib - ${{ matrix.environment.prefix }}-libpng - ${{ matrix.environment.prefix }}-libvncserver - ${{ matrix.environment.prefix }}-rtmidi - - uses: actions/checkout@v3 - - name: make - run: make -fwin/makefile.mingw -j DEV_BUILD=${{ matrix.build.dev }} DEBUG=${{ matrix.build.debug }} NEW_DYNAREC=${{ matrix.dynarec.new }} X64=${{ matrix.environment.x64 }} VNC=n - working-directory: ./src - - uses: actions/upload-artifact@v3 - with: - name: '86Box${{ matrix.dynarec.slug }}${{ matrix.build.slug }}-Windows-${{ matrix.environment.msystem }}-gha${{ github.run_number }}' - path: src/86Box.exe + - name: Prepare MSYS2 environment + uses: msys2/setup-msys2@v2 + with: + update: true + msystem: ${{ matrix.environment.msystem }} + install: >- + make + ${{ matrix.environment.prefix }}-gcc + ${{ matrix.environment.prefix }}-pkg-config + ${{ matrix.environment.prefix }}-freetype + ${{ matrix.environment.prefix }}-SDL2 + ${{ matrix.environment.prefix }}-zlib + ${{ matrix.environment.prefix }}-libpng + ${{ matrix.environment.prefix }}-openal + ${{ matrix.environment.prefix }}-rtmidi + ${{ matrix.environment.prefix }}-libvncserver + - uses: actions/checkout@v3 + - name: make + run: >- + make -fwin/makefile.mingw -j + DEV_BUILD=${{ matrix.build.dev }} + DEBUG=${{ matrix.build.debug }} + NEW_DYNAREC=${{ matrix.dynarec.new }} + X64=${{ matrix.environment.x64 }} + VNC=n + working-directory: ./src + - uses: actions/upload-artifact@v3 + with: + name: '86Box${{ matrix.dynarec.slug }}${{ matrix.build.slug }}-Windows-${{ matrix.environment.msystem }}-gha${{ github.run_number }}' + path: src/86Box.exe diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index e6da49cef..6876e83bc 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -25,7 +25,7 @@ on: jobs: msys2: - name: MSYS2 (${{ matrix.ui.name }}, ${{ matrix.build.name }}, ${{ matrix.dynarec.name }}, ${{ matrix.environment.msystem }}) + name: "Windows MSYS2 (${{ matrix.ui.name }}, ${{ matrix.build.name }}, ${{ matrix.dynarec.name }}, ${{ matrix.environment.msystem }})" runs-on: windows-2022 @@ -73,14 +73,15 @@ jobs: toolchain: ./cmake/flags-gcc-x86_64.cmake steps: - - uses: msys2/setup-msys2@v2 + - name: Prepare MSYS2 environment + uses: msys2/setup-msys2@v2 with: update: true msystem: ${{ matrix.environment.msystem }} pacboy: >- ninja:p cmake:p - cc:p + gcc:p pkg-config:p freetype:p SDL2:p @@ -88,6 +89,7 @@ jobs: libpng:p openal:p rtmidi:p + libvncserver:p ${{ matrix.ui.packages }} - uses: actions/checkout@v3 - name: Configure CMake @@ -98,6 +100,7 @@ jobs: -D CMAKE_INSTALL_PREFIX=./build/artifacts -D QT=${{ matrix.ui.qt }} -D STATIC_BUILD=${{ matrix.ui.static }} + -D VNC=n - name: Build run: cmake --build build - name: Generate package @@ -141,15 +144,15 @@ jobs: target: - name: x86 triplet: x86-windows-static - toolchain: cmake/llvm-win32-i686.cmake + toolchain: ./cmake/llvm-win32-i686.cmake vcvars: x64_x86 - name: x64 triplet: x64-windows-static - toolchain: cmake/llvm-win32-x86_64.cmake + toolchain: ./cmake/llvm-win32-x86_64.cmake vcvars: x64 - name: ARM64 triplet: arm64-windows-static - toolchain: cmake/llvm-win32-aarch64.cmake + toolchain: ./cmake/llvm-win32-aarch64.cmake vcvars: x64_arm64 exclude: - dynarec: @@ -158,7 +161,6 @@ jobs: name: ARM64 steps: - - uses: actions/checkout@v3 - name: Prepare VS environment uses: ilammy/msvc-dev-cmd@v1 with: @@ -180,11 +182,13 @@ jobs: -password "${{ secrets.GITHUB_TOKEN }}" - name: Fix MSVC atomic headers run: dir "C:/Program Files/Microsoft Visual Studio/2022/*/VC/Tools/MSVC/*/include" -include stdatomic.h -recurse | del + - uses: actions/checkout@v3 - name: Configure CMake run: > cmake -G Ninja -S . -B build --preset ${{ matrix.build.preset }} --toolchain C:/vcpkg/scripts/buildsystems/vcpkg.cmake -D NEW_DYNAREC=${{ matrix.dynarec.new }} -D QT=${{ matrix.ui.qt }} + -D CMAKE_INSTALL_PREFIX=./build/artifacts -D VCPKG_CHAINLOAD_TOOLCHAIN_FILE=${{ github.workspace }}/${{ matrix.target.toolchain }} -D VCPKG_TARGET_TRIPLET=${{ matrix.target.triplet }} -D VCPKG_HOST_TRIPLET=x64-windows @@ -200,14 +204,14 @@ jobs: - name: Build run: cmake --build build - name: Generate package - run: cmake --install build --prefix ./build/artifacts + run: cmake --install build - uses: actions/upload-artifact@v3 with: name: '86Box${{ matrix.ui.slug }}${{ matrix.dynarec.slug }}${{ matrix.build.slug }}-Windows-LLVM-${{ matrix.target.name }}-gha${{ github.run_number }}' path: build/artifacts/** linux: - name: "Linux GCC 11 (${{ matrix.build.name }} ${{ matrix.dynarec.name }} x86_64)" + name: "Linux GCC 11 (Qt GUI, ${{ matrix.build.name }}, ${{ matrix.dynarec.name }}, x86_64)" runs-on: ubuntu-22.04 @@ -230,7 +234,6 @@ jobs: slug: -NDR steps: - - uses: actions/checkout@v3 - name: Install dependencies run: >- sudo apt update && sudo apt install @@ -244,22 +247,24 @@ jobs: qtbase5-dev qttools5-dev libopenal-dev + - uses: actions/checkout@v3 - name: Configure CMake run: >- cmake -G Ninja -S . -B build --preset ${{ matrix.build.preset }} --toolchain ./cmake/flags-gcc-x86_64.cmake -D NEW_DYNAREC=${{ matrix.dynarec.new }} + -D CMAKE_INSTALL_PREFIX=./build/artifacts - name: Build run: cmake --build build -# - name: Generate package -# run: cmake --install build --prefix ./build/artifacts -# - uses: actions/upload-artifact@v3 -# with: -# name: '86Box${{ matrix.build.slug }}-UbuntuJammy-x86_64-gha${{ github.run_number }}' -# path: build/artifacts/** + - name: Generate package + run: cmake --install build + - uses: actions/upload-artifact@v3 + with: + name: '86Box-Qt${{ matrix.dynarec.slug }}${{ matrix.build.slug }}-UbuntuJammy-x86_64-gha${{ github.run_number }}' + path: build/artifacts/** macos11: - name: "macOS 11 (${{ matrix.build.name }} x86_64)" + name: "macOS 11 (Qt GUI, ${{ matrix.build.name }}, ${{ matrix.dynarec.name }}, x86_64)" runs-on: macos-11 @@ -282,22 +287,31 @@ jobs: slug: -NDR steps: - - uses: actions/checkout@v3 - name: Install dependencies - run: brew install freetype sdl2 libpng rtmidi qt@5 openal-soft ninja + run: >- + brew install + ninja + freetype + sdl2 + libpng + rtmidi + qt@5 + openal-soft + - uses: actions/checkout@v3 - name: Configure CMake run: >- cmake -G Ninja -S . -B build --preset ${{ matrix.build.preset }} - --toolchain cmake/flags-gcc-x86_64.cmake - -D NEW_DYNAREC=${{ matrix.build.new-dynarec }} + --toolchain ./cmake/flags-gcc-x86_64.cmake + -D NEW_DYNAREC=${{ matrix.dynarec.new }} + -D CMAKE_INSTALL_PREFIX=./build/artifacts -D Qt5_ROOT=$(brew --prefix qt@5) -D Qt5LinguistTools_ROOT=$(brew --prefix qt@5) -D OpenAL_ROOT=$(brew --prefix openal-soft) - name: Build run: cmake --build build - name: Generate package - run: cmake --install build --prefix ./build/artifacts + run: cmake --install build - uses: actions/upload-artifact@v3 with: - name: '86Box${{ matrix.build.slug }}-macOS-x86_64-gha${{ github.run_number }}' + name: '86Box-Qt${{ matrix.dynarec.slug }}${{ matrix.build.slug }}-macOS-x86_64-gha${{ github.run_number }}' path: build/artifacts/** From 6794e527c1c6aca24c9678cc7ea21a823f5db8cf Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Tue, 20 Dec 2022 22:40:40 +0600 Subject: [PATCH 049/285] Add Vendex HeadStart Turbo 888-XT RTC --- src/device/isartc.c | 38 +++++++++++++++++++++++++++++++++----- src/machine/m_xt.c | 3 +++ 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/src/device/isartc.c b/src/device/isartc.c index ad2b39f2f..2b723fc81 100644 --- a/src/device/isartc.c +++ b/src/device/isartc.c @@ -82,10 +82,11 @@ #include <86box/pic.h> #include <86box/isartc.h> -#define ISARTC_EV170 0 -#define ISARTC_DTK 1 -#define ISARTC_P5PAK 2 -#define ISARTC_A6PAK 3 +#define ISARTC_EV170 0 +#define ISARTC_DTK 1 +#define ISARTC_P5PAK 2 +#define ISARTC_A6PAK 3 +#define ISARTC_VENDEX 4 #define ISARTC_DEBUG 0 @@ -544,6 +545,18 @@ isartc_init(const device_t *info) dev->year = MM67_AL_DOM; /* year, NON STANDARD */ break; + case ISARTC_VENDEX: /* Vendex HeadStart Turbo 888-XT RTC */ + dev->flags |= FLAG_YEAR80; + dev->base_addr = 0x0300; + dev->base_addrsz = 32; + dev->f_rd = mm67_read; + dev->f_wr = mm67_write; + dev->nvr.reset = mm67_reset; + dev->nvr.start = mm67_start; + dev->nvr.tick = mm67_tick; + dev->year = MM67_AL_DOM; /* year, NON STANDARD */ + break; + default: break; } @@ -559,7 +572,7 @@ isartc_init(const device_t *info) dev->f_rd, NULL, NULL, dev->f_wr, NULL, NULL, dev); /* Hook into the NVR backend. */ - dev->nvr.fn = isartc_get_internal_name(isartc_type); + dev->nvr.fn = (char *)info->internal_name; dev->nvr.irq = dev->irq; if (!is_at) nvr_init(&dev->nvr); @@ -709,6 +722,21 @@ static const device_t a6pak_device = { .config = a6pak_config }; +/* Onboard RTC devices */ +const device_t vendex_xt_rtc_onboard_device = { + .name = "National Semiconductor MM58167 (Vendex)", + .internal_name = "vendex_xt_rtc", + .flags = DEVICE_ISA, + .local = ISARTC_VENDEX, + .init = isartc_init, + .close = isartc_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + static const device_t isartc_none_device = { .name = "None", .internal_name = "none", diff --git a/src/machine/m_xt.c b/src/machine/m_xt.c index 8f2bec8bd..b8d318438 100644 --- a/src/machine/m_xt.c +++ b/src/machine/m_xt.c @@ -20,6 +20,8 @@ #include <86box/chipset.h> #include <86box/port_6x.h> +extern const device_t vendex_xt_rtc_onboard_device; + static void machine_xt_common_init(const machine_t *model) { @@ -483,6 +485,7 @@ machine_xt_vendex_init(const machine_t *model) return ret; machine_xt_clone_init(model); + device_add(&vendex_xt_rtc_onboard_device); return ret; } From b0cdb2d64341e89944e4bace1cfed0de991925a3 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Wed, 21 Dec 2022 00:09:17 +0600 Subject: [PATCH 050/285] Time sync now works correctly with Vendex RTC --- src/device/isartc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/device/isartc.c b/src/device/isartc.c index 2b723fc81..bb0f928eb 100644 --- a/src/device/isartc.c +++ b/src/device/isartc.c @@ -546,7 +546,7 @@ isartc_init(const device_t *info) break; case ISARTC_VENDEX: /* Vendex HeadStart Turbo 888-XT RTC */ - dev->flags |= FLAG_YEAR80; + dev->flags |= FLAG_YEAR80 | FLAG_YEARBCD; dev->base_addr = 0x0300; dev->base_addrsz = 32; dev->f_rd = mm67_read; From 537fbad564312636c3361c76493ca1064f313008 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 20 Dec 2022 19:25:51 -0500 Subject: [PATCH 051/285] More bits of missed formatting --- src/86box.c | 4 +- src/codegen/codegen_ops_fpu.h | 8 +- src/codegen/codegen_x86-64.c | 67 +++++------ src/codegen/codegen_x86.c | 67 +++++------ src/codegen_new/codegen.c | 67 +++++------ src/codegen_new/codegen_ops_3dnow.c | 18 +-- src/codegen_new/codegen_ops_fpu_arith.c | 4 +- src/cpu/cpu.c | 2 +- src/cpu/x87_ops_arith.h | 16 +-- src/include/86box/config.h | 142 ++++++++++++------------ src/network/CMakeLists.txt | 2 +- src/qt/qt_newfloppydialog.cpp | 6 +- src/unix/CMakeLists.txt | 4 +- src/win/CMakeLists.txt | 2 +- 14 files changed, 213 insertions(+), 196 deletions(-) diff --git a/src/86box.c b/src/86box.c index 235a1fd5d..147233b21 100644 --- a/src/86box.c +++ b/src/86box.c @@ -17,8 +17,8 @@ * Copyright 2008-2020 Sarah Walker. * Copyright 2016-2020 Miran Grca. * Copyright 2017-2020 Fred N. van Kempen. - * Copyright 2021 Laci bá' - * Copyright 2021 dob205 + * Copyright 2021 Laci bá' + * Copyright 2021 dob205 */ #include #include diff --git a/src/codegen/codegen_ops_fpu.h b/src/codegen/codegen_ops_fpu.h index 58a5adf7d..4ffbb45a0 100644 --- a/src/codegen/codegen_ops_fpu.h +++ b/src/codegen/codegen_ops_fpu.h @@ -667,14 +667,16 @@ ropFCHS(uint8_t opcode, uint32_t fetchdat, uint32_t op_32, uint32_t op_pc, codeb return op_pc; \ } +// clang-format off opFLDimm(1, 1.0) - opFLDimm(L2T, 3.3219280948873623) - opFLDimm(L2E, 1.4426950408889634); +opFLDimm(L2T, 3.3219280948873623) +opFLDimm(L2E, 1.4426950408889634); opFLDimm(PI, 3.141592653589793); opFLDimm(EG2, 0.3010299956639812); opFLDimm(Z, 0.0) +// clang-format on - static uint32_t ropFLDLN2(uint8_t opcode, uint32_t fetchdat, uint32_t op_32, uint32_t op_pc, codeblock_t *block) +static uint32_t ropFLDLN2(uint8_t opcode, uint32_t fetchdat, uint32_t op_32, uint32_t op_pc, codeblock_t *block) { FP_ENTER(); FP_LOAD_IMM_Q(0x3fe62e42fefa39f0ull); diff --git a/src/codegen/codegen_x86-64.c b/src/codegen/codegen_x86-64.c index 6939819d4..4a184b981 100644 --- a/src/codegen/codegen_x86-64.c +++ b/src/codegen/codegen_x86-64.c @@ -485,48 +485,51 @@ codegen_flush(void) return; } +// clang-format off static int opcode_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*/ + 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*/ + 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, 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*/ + 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_0f_modrm[256] = { - 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, /*00*/ - 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, /*10*/ - 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*20*/ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, /*30*/ + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, /*00*/ + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, /*10*/ + 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*20*/ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, /*30*/ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*40*/ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*50*/ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, /*60*/ - 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, /*70*/ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*40*/ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*50*/ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, /*60*/ + 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, /*70*/ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*80*/ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*90*/ - 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, /*a0*/ - 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, /*b0*/ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*80*/ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*90*/ + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, /*a0*/ + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, /*b0*/ - 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, /*c0*/ - 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, /*d0*/ - 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, /*e0*/ - 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0 /*f0*/ + 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, /*c0*/ + 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, /*d0*/ + 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, /*e0*/ + 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0 /*f0*/ }; +// clang-format off void codegen_debug(void) diff --git a/src/codegen/codegen_x86.c b/src/codegen/codegen_x86.c index 61b473fe7..bd9793732 100644 --- a/src/codegen/codegen_x86.c +++ b/src/codegen/codegen_x86.c @@ -1627,48 +1627,51 @@ codegen_flush(void) return; } +// clang-format off static int opcode_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*/ + 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*/ + 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, 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*/ + 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_0f_modrm[256] = { - 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, /*00*/ - 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, /*10*/ - 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*20*/ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, /*30*/ + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, /*00*/ + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, /*10*/ + 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*20*/ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, /*30*/ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*40*/ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*50*/ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, /*60*/ - 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, /*70*/ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*40*/ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*50*/ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, /*60*/ + 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, /*70*/ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*80*/ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*90*/ - 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, /*a0*/ - 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, /*b0*/ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*80*/ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*90*/ + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, /*a0*/ + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, /*b0*/ - 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, /*c0*/ - 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, /*d0*/ - 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, /*e0*/ - 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0 /*f0*/ + 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, /*c0*/ + 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, /*d0*/ + 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, /*e0*/ + 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0 /*f0*/ }; +// clang-format on void codegen_debug(void) diff --git a/src/codegen_new/codegen.c b/src/codegen_new/codegen.c index 2f178bc74..bf6ad123c 100644 --- a/src/codegen_new/codegen.c +++ b/src/codegen_new/codegen.c @@ -322,48 +322,51 @@ codegen_generate_ea(ir_data_t *ir, x86seg *op_ea_seg, uint32_t fetchdat, int op_ return codegen_generate_ea_16_long(ir, op_ea_seg, fetchdat, op_ssegs, op_pc); } +// clang-format off static uint8_t opcode_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*/ + 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*/ + 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, 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*/ + 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*/ }; + static uint8_t opcode_0f_modrm[256] = { - 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, /*00*/ - 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, /*10*/ - 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*20*/ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, /*30*/ + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, /*00*/ + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, /*10*/ + 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*20*/ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, /*30*/ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*40*/ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*50*/ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, /*60*/ - 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, /*70*/ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*40*/ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*50*/ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, /*60*/ + 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, /*70*/ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*80*/ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*90*/ - 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, /*a0*/ - 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, /*b0*/ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*80*/ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*90*/ + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, /*a0*/ + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, /*b0*/ - 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, /*c0*/ - 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, /*d0*/ - 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, /*e0*/ - 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0 /*f0*/ + 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, /*c0*/ + 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, /*d0*/ + 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, /*e0*/ + 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0 /*f0*/ }; +// clang-format on void codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_pc, uint32_t old_pc) diff --git a/src/codegen_new/codegen_ops_3dnow.c b/src/codegen_new/codegen_ops_3dnow.c index ff0c136e2..c2b04584c 100644 --- a/src/codegen_new/codegen_ops_3dnow.c +++ b/src/codegen_new/codegen_ops_3dnow.c @@ -37,16 +37,18 @@ return op_pc + 2; \ } +// clang-format off ropParith(PFADD) - ropParith(PFCMPEQ) - ropParith(PFCMPGE) - ropParith(PFCMPGT) - ropParith(PFMAX) - ropParith(PFMIN) - ropParith(PFMUL) - ropParith(PFSUB) +ropParith(PFCMPEQ) +ropParith(PFCMPGE) +ropParith(PFCMPGT) +ropParith(PFMAX) +ropParith(PFMIN) +ropParith(PFMUL) +ropParith(PFSUB) +// clang-format on - uint32_t ropPF2ID(codeblock_t *block, ir_data_t *ir, uint8_t opcode, uint32_t fetchdat, uint32_t op_32, uint32_t op_pc) +uint32_t ropPF2ID(codeblock_t *block, ir_data_t *ir, uint8_t opcode, uint32_t fetchdat, uint32_t op_32, uint32_t op_pc) { int dest_reg = (fetchdat >> 3) & 7; diff --git a/src/codegen_new/codegen_ops_fpu_arith.c b/src/codegen_new/codegen_ops_fpu_arith.c index e9739f830..98d77250c 100644 --- a/src/codegen_new/codegen_ops_fpu_arith.c +++ b/src/codegen_new/codegen_ops_fpu_arith.c @@ -423,8 +423,10 @@ ropFUCOMPP(codeblock_t *block, ir_data_t *ir, uint8_t opcode, uint32_t fetchdat, return op_pc + 1; \ } +// clang-format off ropF_arith_mem(s, uop_MEM_LOAD_SINGLE) - ropF_arith_mem(d, uop_MEM_LOAD_DOUBLE) +ropF_arith_mem(d, uop_MEM_LOAD_DOUBLE) +// clang-format on #define ropFI_arith_mem(name, temp_reg) \ uint32_t ropFIADD##name(codeblock_t *block, ir_data_t *ir, uint8_t opcode, uint32_t fetchdat, uint32_t op_32, uint32_t op_pc) \ diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c index 5030d9ff7..1ab06205f 100644 --- a/src/cpu/cpu.c +++ b/src/cpu/cpu.c @@ -1170,7 +1170,7 @@ cpu_set(void) #endif if ((cpu_s->cpu_type == CPU_K6_2P) || (cpu_s->cpu_type == CPU_K6_3P)) { - x86_opcodes_3DNOW = ops_3DNOWE; + x86_opcodes_3DNOW = ops_3DNOWE; #ifdef USE_DYNAREC x86_dynarec_opcodes_3DNOW = dynarec_ops_3DNOWE; #endif diff --git a/src/cpu/x87_ops_arith.h b/src/cpu/x87_ops_arith.h index f5e5d7696..e2dbbdb8f 100644 --- a/src/cpu/x87_ops_arith.h +++ b/src/cpu/x87_ops_arith.h @@ -125,25 +125,27 @@ return 0; \ } +// clang-format off opFPU(s, x87_ts, 16, t.i, geteal, t.s, _32) #ifndef FPU_8087 opFPU(s, x87_ts, 32, t.i, geteal, t.s, _32) #endif - opFPU(d, x87_td, 16, t.i, geteaq, t.d, _64) + opFPU(d, x87_td, 16, t.i, geteaq, t.d, _64) #ifndef FPU_8087 - opFPU(d, x87_td, 32, t.i, geteaq, t.d, _64) + opFPU(d, x87_td, 32, t.i, geteaq, t.d, _64) #endif - opFPU(iw, uint16_t, 16, t, geteaw, (double) (int16_t) t, _i16) +opFPU(iw, uint16_t, 16, t, geteaw, (double) (int16_t) t, _i16) #ifndef FPU_8087 - opFPU(iw, uint16_t, 32, t, geteaw, (double) (int16_t) t, _i16) + opFPU(iw, uint16_t, 32, t, geteaw, (double) (int16_t) t, _i16) #endif - opFPU(il, uint32_t, 16, t, geteal, (double) (int32_t) t, _i32) + opFPU(il, uint32_t, 16, t, geteal, (double) (int32_t) t, _i32) #ifndef FPU_8087 - opFPU(il, uint32_t, 32, t, geteal, (double) (int32_t) t, _i32) + opFPU(il, uint32_t, 32, t, geteal, (double) (int32_t) t, _i32) #endif +// clang-format on - static int opFADD(uint32_t fetchdat) +static int opFADD(uint32_t fetchdat) { FP_ENTER(); cpu_state.pc++; diff --git a/src/include/86box/config.h b/src/include/86box/config.h index 9946a0da3..dd873d168 100644 --- a/src/include/86box/config.h +++ b/src/include/86box/config.h @@ -28,109 +28,109 @@ extern "C" { #if 0 typedef struct { - uint8_t id, - uint8_t bus_type, /* Bus type: IDE, SCSI, etc. */ - bus, :4, /* ID of the bus (for example, for IDE, - 0 = primary, 1 = secondary, etc. */ - bus_id, :4, /* ID of the device on the bus */ - uint8_t type, /* Type flags, interpretation depends - on the device */ - uint8_t is_image; /* This is only used for CD-ROM: - 0 = Image; - 1 = Host drive */ + uint8_t id, + uint8_t bus_type, /* Bus type: IDE, SCSI, etc. */ + bus, : 4, /* ID of the bus (for example, for IDE, + 0 = primary, 1 = secondary, etc. */ + bus_id, : 4, /* ID of the device on the bus */ + uint8_t type, /* Type flags, interpretation depends + on the device */ + uint8_t is_image; /* This is only used for CD-ROM: + 0 = Image; + 1 = Host drive */ - wchar_t path[1024]; /* Name of current image file or - host drive */ + wchar_t path[1024]; /* Name of current image file or + host drive */ - uint32_t spt, /* Physical geometry parameters */ - hpc, - tracks; + uint32_t spt, /* Physical geometry parameters */ + hpc, + tracks; } storage_cfg_t; typedef struct { /* General configuration */ - int vid_resize, /* Window is resizable or not */ - vid_renderer, /* Renderer */ - vid_fullscreen_scale, /* Full screen scale type */ - vid_fullscreen_start, /* Start emulator in full screen */ - vid_force_43, /* Force 4:3 display ratio in windowed mode */ - vid_scale, /* Windowed mode scale */ - vid_overscan, /* EGA/(S)VGA overscan enabled */ - vid_cga_contrast, /* CGA alternate contrast enabled */ - vid_grayscale, /* Video is grayscale */ - vid_grayscale_type, /* Video grayscale type */ - vid_invert_display, /* Invert display */ - rctrl_is_lalt, /* Right CTRL is left ALT */ - update_icons, /* Update status bar icons */ - window_remember, /* Remember window position and size */ - window_w, /* Window coordinates */ - window_h, - window_x, - window_y, - sound_gain; /* Sound gain */ + int vid_resize, /* Window is resizable or not */ + vid_renderer, /* Renderer */ + vid_fullscreen_scale, /* Full screen scale type */ + vid_fullscreen_start, /* Start emulator in full screen */ + vid_force_43, /* Force 4:3 display ratio in windowed mode */ + vid_scale, /* Windowed mode scale */ + vid_overscan, /* EGA/(S)VGA overscan enabled */ + vid_cga_contrast, /* CGA alternate contrast enabled */ + vid_grayscale, /* Video is grayscale */ + vid_grayscale_type, /* Video grayscale type */ + vid_invert_display, /* Invert display */ + rctrl_is_lalt, /* Right CTRL is left ALT */ + update_icons, /* Update status bar icons */ + window_remember, /* Remember window position and size */ + window_w, /* Window coordinates */ + window_h, + window_x, + window_y, + sound_gain; /* Sound gain */ # ifdef USE_LANGUAGE - uint16_t language_id; /* Language ID (0x0409 = English (US)) */ + uint16_t language_id; /* Language ID (0x0409 = English (US)) */ # endif /* Machine cateogory */ - int machine, /* Machine */ - cpu, /* CPU */ + int machine, /* Machine */ + cpu, /* CPU */ # ifdef USE_DYNAREC - cpu_use_dynarec, /* CPU recompiler enabled */ + cpu_use_dynarec, /* CPU recompiler enabled */ # endif - wait_states, /* CPU wait states */ - enable_external_fpu, /* FPU enabled */ - time_sync; /* Time sync enabled */ - uint32_t mem_size; /* Memory size */ + wait_states, /* CPU wait states */ + enable_external_fpu, /* FPU enabled */ + time_sync; /* Time sync enabled */ + uint32_t mem_size; /* Memory size */ /* Video category */ - int video_card, /* Video card */ - voodoo_enabled; /* Voodoo enabled */ + int video_card, /* Video card */ + voodoo_enabled; /* Voodoo enabled */ /* Input devices category */ - int mouse_type, /* Mouse type */ - joystick_type; /* Joystick type */ + int mouse_type, /* Mouse type */ + joystick_type; /* Joystick type */ /* Sound category */ - int sound_card, /* Sound card */ - midi_device, /* Midi device */ - mpu_401, /* Standalone MPU-401 enabled */ - ssi_2001_enabled, /* SSI-2001 enabled */ - game_blaster_enabled, /* Game blaster enabled */ - gus_enabled, /* Gravis Ultrasound enabled */ - opl_type, /* OPL emulation type */ - sound_is_float; /* Sound is 32-bit float or 16-bit integer */ + int sound_card, /* Sound card */ + midi_device, /* Midi device */ + mpu_401, /* Standalone MPU-401 enabled */ + ssi_2001_enabled, /* SSI-2001 enabled */ + game_blaster_enabled, /* Game blaster enabled */ + gus_enabled, /* Gravis Ultrasound enabled */ + opl_type, /* OPL emulation type */ + sound_is_float; /* Sound is 32-bit float or 16-bit integer */ /* Network category */ - int network_type, /* Network type (SLiRP or PCap) */ - network_card; /* Network card */ - char network_host[520]; /* PCap device */ + int network_type, /* Network type (SLiRP or PCap) */ + network_card; /* Network card */ + char network_host[520]; /* PCap device */ /* Ports category */ - char parallel_devices[PARALLEL_MAX][32]; /* LPT device names */ + char parallel_devices[PARALLEL_MAX][32]; /* LPT device names */ # ifdef USE_SERIAL_DEVICES - char serial_devices[SERIAL_MAX][32]; /* Serial device names */ + char serial_devices[SERIAL_MAX][32]; /* Serial device names */ # endif /* Other peripherals category */ - int fdc_type, /* Floppy disk controller type */ - hdc, /* Hard disk controller */ - scsi_card, /* SCSI controller */ - ide_ter_enabled, /* Tertiary IDE controller enabled */ - ide_qua_enabled, /* Quaternary IDE controller enabled */ - bugger_enabled, /* ISA bugger device enabled */ - isa_rtc_type, /* ISA RTC card */ - isa_mem_type[ISAMEM_MAX]; /* ISA memory boards */ + int fdc_type, /* Floppy disk controller type */ + hdc, /* Hard disk controller */ + scsi_card, /* SCSI controller */ + ide_ter_enabled, /* Tertiary IDE controller enabled */ + ide_qua_enabled, /* Quaternary IDE controller enabled */ + bugger_enabled, /* ISA bugger device enabled */ + isa_rtc_type, /* ISA RTC card */ + isa_mem_type[ISAMEM_MAX]; /* ISA memory boards */ /* Hard disks category */ - storage_cfg_t hdd[HDD_NUM]; /* Hard disk drives */ + storage_cfg_t hdd[HDD_NUM]; /* Hard disk drives */ /* Floppy drives category */ - storage_cfg_t fdd[FDD_NUM]; /* Floppy drives */ + storage_cfg_t fdd[FDD_NUM]; /* Floppy drives */ /* Other removable devices category */ - storage_cfg_t cdrom[CDROM_NUM], /* CD-ROM drives */ - storage_cfg_t rdisk[ZIP_NUM]; /* Removable disk drives */ + storage_cfg_t cdrom[CDROM_NUM], /* CD-ROM drives */ + storage_cfg_t rdisk[ZIP_NUM]; /* Removable disk drives */ } config_t; #endif diff --git a/src/network/CMakeLists.txt b/src/network/CMakeLists.txt index 98252d49e..dc03cb417 100644 --- a/src/network/CMakeLists.txt +++ b/src/network/CMakeLists.txt @@ -13,7 +13,7 @@ # Copyright 2020,2021 David Hrdlička. # -add_library(net OBJECT network.c net_pcap.c net_slirp.c net_dp8390.c net_3c501.c +add_library(net OBJECT 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) option(SLIRP_EXTERNAL "Link against the system-provided libslirp library" OFF) diff --git a/src/qt/qt_newfloppydialog.cpp b/src/qt/qt_newfloppydialog.cpp index a445c47d3..bad4fbf9e 100644 --- a/src/qt/qt_newfloppydialog.cpp +++ b/src/qt/qt_newfloppydialog.cpp @@ -548,7 +548,7 @@ NewFloppyDialog::createZipSectorImage(const QString &filename, const disk_size_t empty[0x5003] = empty[0x1D003] = 0xFF; /* Root directory = 0x35000 - Data = 0x39000 */ + Data = 0x39000 */ } else { /* ZIP 250 */ /* MBR */ @@ -570,7 +570,7 @@ NewFloppyDialog::createZipSectorImage(const QString &filename, const disk_size_t memset(&(empty[0x0200]), 0x48, 0x3E00); /* The second sector begins with some strange data - in my reference image. */ + in my reference image. */ *(uint64_t *) &(empty[0x0200]) = 0x3831393230334409LL; *(uint64_t *) &(empty[0x0208]) = 0x6A57766964483130LL; *(uint64_t *) &(empty[0x0210]) = 0x3C3A34676063653FLL; @@ -619,7 +619,7 @@ NewFloppyDialog::createZipSectorImage(const QString &filename, const disk_size_t empty[0x4203] = empty[0x22003] = 0xFF; /* Root directory = 0x3FE00 - Data = 0x38200 */ + Data = 0x38200 */ } pbar.setMaximum(pbar_max); diff --git a/src/unix/CMakeLists.txt b/src/unix/CMakeLists.txt index 5301c9268..5fbcf0329 100644 --- a/src/unix/CMakeLists.txt +++ b/src/unix/CMakeLists.txt @@ -11,8 +11,8 @@ # Authors: Cacodemon345 # David Hrdlička, # -# Copyright 2021 Cacodemon345. -# Copyright 2021 David Hrdlička. +# Copyright 2021 Cacodemon345. +# Copyright 2021 David Hrdlička. # add_library(plat OBJECT unix.c) diff --git a/src/win/CMakeLists.txt b/src/win/CMakeLists.txt index 34e6dde9b..a0a4c8e14 100644 --- a/src/win/CMakeLists.txt +++ b/src/win/CMakeLists.txt @@ -10,7 +10,7 @@ # # Authors: David Hrdlička, # -# Copyright 2020,2021 David Hrdlička. +# Copyright 2020-2021 David Hrdlička. # enable_language(RC) From f04f0f24cc32b5bad0096d607fac14fe3aa3805a Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 20 Dec 2022 19:26:10 -0500 Subject: [PATCH 052/285] Tidy up src/cpu/cpu.h --- src/cpu/cpu.h | 68 +++++++++++++++++++++++++-------------------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/src/cpu/cpu.h b/src/cpu/cpu.h index a28618fe1..307865629 100644 --- a/src/cpu/cpu.h +++ b/src/cpu/cpu.h @@ -172,36 +172,42 @@ typedef struct { const cpu_legacy_table_t **tables; } cpu_legacy_machine_t; -#define C_FLAG 0x0001 -#define P_FLAG 0x0004 -#define A_FLAG 0x0010 -#define Z_FLAG 0x0040 -#define N_FLAG 0x0080 -#define T_FLAG 0x0100 -#define I_FLAG 0x0200 -#define D_FLAG 0x0400 -#define V_FLAG 0x0800 -#define NT_FLAG 0x4000 -#define MD_FLAG 0x8000 +#define C_FLAG 0x0001 +#define P_FLAG 0x0004 +#define A_FLAG 0x0010 +#define Z_FLAG 0x0040 +#define N_FLAG 0x0080 +#define T_FLAG 0x0100 +#define I_FLAG 0x0200 +#define D_FLAG 0x0400 +#define V_FLAG 0x0800 +#define NT_FLAG 0x4000 +#define MD_FLAG 0x8000 -#define RF_FLAG 0x0001 /* in EFLAGS */ -#define VM_FLAG 0x0002 /* in EFLAGS */ -#define VIF_FLAG 0x0008 /* in EFLAGS */ -#define VIP_FLAG 0x0010 /* in EFLAGS */ -#define VID_FLAG 0x0020 /* in EFLAGS */ +#define RF_FLAG 0x0001 /* in EFLAGS */ +#define VM_FLAG 0x0002 /* in EFLAGS */ +#define VIF_FLAG 0x0008 /* in EFLAGS */ +#define VIP_FLAG 0x0010 /* in EFLAGS */ +#define VID_FLAG 0x0020 /* in EFLAGS */ -#define WP_FLAG 0x10000 /* in CR0 */ -#define CR4_VME (1 << 0) -#define CR4_PVI (1 << 1) -#define CR4_PSE (1 << 4) -#define CR4_PAE (1 << 5) -#define CR4_PGE (1 << 7) +#define WP_FLAG 0x10000 /* in CR0 */ -#define CPL ((cpu_state.seg_cs.access >> 5) & 3) +#define CR4_VME (1 << 0) /* Virtual 8086 Mode Extensions */ +#define CR4_PVI (1 << 1) /* Protected-mode Virtual Interrupts */ +#define CR4_TSD (1 << 2) /* Time Stamp Disable */ +#define CR4_DE (1 << 3) /* Debugging Extensions */ +#define CR4_PSE (1 << 4) /* Page Size Extension */ +#define CR4_PAE (1 << 5) /* Physical Address Extension */ +#define CR4_MCE (1 << 6) /* Machine Check Exception */ +#define CR4_PGE (1 << 7) /* Page Global Enabled */ +#define CR4_PCE (1 << 8) /* Performance-Monitoring Counter enable */ +#define CR4_OSFXSR (1 << 9) /* Operating system support for FXSAVE and FXRSTOR instructions */ -#define IOPL ((cpu_state.flags >> 12) & 3) +#define CPL ((cpu_state.seg_cs.access >> 5) & 3) -#define IOPLp ((!(msw & 1)) || (CPL <= IOPL)) +#define IOPL ((cpu_state.flags >> 12) & 3) + +#define IOPLp ((!(msw & 1)) || (CPL <= IOPL)) typedef union { uint32_t l; @@ -468,15 +474,9 @@ COMPILE_TIME_ASSERT(sizeof(cpu_state_t) <= 128) # define fpu_cycles cpu_state._fpu_cycles #endif -#define cpu_rm cpu_state.rm_data.rm_mod_reg.rm -#define cpu_mod cpu_state.rm_data.rm_mod_reg.mod -#define cpu_reg cpu_state.rm_data.rm_mod_reg.reg - -#define CR4_TSD (1 << 2) -#define CR4_DE (1 << 3) -#define CR4_MCE (1 << 6) -#define CR4_PCE (1 << 8) -#define CR4_OSFXSR (1 << 9) +#define cpu_rm cpu_state.rm_data.rm_mod_reg.rm +#define cpu_mod cpu_state.rm_data.rm_mod_reg.mod +#define cpu_reg cpu_state.rm_data.rm_mod_reg.reg /* Global variables. */ extern cpu_state_t cpu_state; From dd3959587b8ddf7a1ee9413e929563c7b7a0f0ad Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 20 Dec 2022 19:26:31 -0500 Subject: [PATCH 053/285] Improve a couple of comments --- src/include/86box/hdc.h | 1 + src/video/vid_voodoo_banshee.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/include/86box/hdc.h b/src/include/86box/hdc.h index 68b75b97b..8eb5134b8 100644 --- a/src/include/86box/hdc.h +++ b/src/include/86box/hdc.h @@ -28,6 +28,7 @@ * least 7 devices, with each device being \ * able to support 8 units, but hey... */ +/* Controller types. */ #define HDC_NONE 0 #define HDC_INTERNAL 1 diff --git a/src/video/vid_voodoo_banshee.c b/src/video/vid_voodoo_banshee.c index 4170dd345..386ac8575 100644 --- a/src/video/vid_voodoo_banshee.c +++ b/src/video/vid_voodoo_banshee.c @@ -1567,7 +1567,7 @@ banshee_reg_writel(uint32_t addr, uint32_t val, void *p) break; case 0x0600000: - case 0x0700000: /*Texture download*/ + case 0x0700000: /*TMU0 Texture download*/ voodoo->tex_count++; voodoo_queue_command(voodoo, (addr & 0x1ffffc) | FIFO_WRITEL_TEX, val); break; From 1615065007c657e9cba9a9e77521a3d8058e9a6b Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 20 Dec 2022 19:27:17 -0500 Subject: [PATCH 054/285] Fix issues from initial named initializers work --- src/machine/machine_table.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index df740ee2a..2807c1060 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -832,14 +832,14 @@ const machine_t machines[] = { .min_voltage = 0, .max_voltage = 0, .min_multi = 0, - .max_multi = 0, + .max_multi = 0 }, .bus_flags = MACHINE_PC, .flags = MACHINE_FLAGS_NONE, .ram = { .min = 128, .max = 640, - .step = 64, + .step = 64 }, .nvrmask = 0, .kbc = KBC_IBM_PC_XT, @@ -1231,7 +1231,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PC, - MACHINE_FLAGS_NONE, + .flags = MACHINE_FLAGS_NONE, .ram = { .min = 256, .max = 640, @@ -9585,7 +9585,7 @@ const machine_t machines[] = { .min_voltage = 2800, .max_voltage = 3520, .min_multi = 1.5, - .max_multi = 5.5, + .max_multi = 5.5 }, .bus_flags = MACHINE_PS2_PCI, .flags = MACHINE_IDE_DUAL, @@ -11831,7 +11831,7 @@ const machine_t machines[] = { .min_voltage = 1300, .max_voltage = 3500, .min_multi = MACHINE_MULTIPLIER_FIXED, - .max_multi = MACHINE_MULTIPLIER_FIXED, + .max_multi = MACHINE_MULTIPLIER_FIXED }, .bus_flags = MACHINE_PS2_A97, .flags = MACHINE_IDE_DUAL | MACHINE_AG, From 3d825ec6e322c26ade8c7de653a4917654dc623a Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 20 Dec 2022 19:29:16 -0500 Subject: [PATCH 055/285] Clean up disk sizes tables --- src/include/86box/disksizes.h | 70 +++++++++++++++++++++++++++++++++++ src/qt/qt_newfloppydialog.cpp | 38 +++++++++++-------- src/win/win_new_floppy.c | 38 +------------------ 3 files changed, 94 insertions(+), 52 deletions(-) create mode 100644 src/include/86box/disksizes.h diff --git a/src/include/86box/disksizes.h b/src/include/86box/disksizes.h new file mode 100644 index 000000000..e47b82943 --- /dev/null +++ b/src/include/86box/disksizes.h @@ -0,0 +1,70 @@ +/* + * 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. + * + * Header of the emulation of the PC speaker. + * + * + * + * Authors: Jasmine Iwanek + * + * Copyright 2022 Jasmine Iwanek + */ + +#ifndef DISK_SIZES_H +#define DISK_SIZES_H + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + int hole; + int sides; + int data_rate; + int encoding; + int rpm; + int tracks; + int sectors; /* For IMG and Japanese FDI only. */ + int sector_len; /* For IMG and Japanese FDI only. */ + int media_desc; + int spc; + int num_fats; + int spfat; + int root_dir_entries; +} disk_size_t; + +static const disk_size_t disk_sizes[14] = { +// clang-format off +// { 1, 1, 2, 1, 1, 77, 26, 0, 0, 4, 2, 6, 68 }, /* 250k 8" */ +// { 1, 2, 2, 1, 1, 77, 26, 0, 0, 4, 2, 6, 68 }, /* 500k 8" */ +// { 1, 1, 2, 1, 1, 77, 8, 3, 0, 1, 2, 2, 192 }, /* 616k 8" */ +// { 1, 2, 0, 1, 1, 77, 8, 3, 0, 1, 2, 2, 192 }, /* 1232k 8" */ + { 0, 1, 2, 1, 0, 40, 8, 2, 0xfe, 2, 2, 1, 64 }, /* 160k */ + { 0, 1, 2, 1, 0, 40, 9, 2, 0xfc, 2, 2, 1, 64 }, /* 180k */ + { 0, 2, 2, 1, 0, 40, 8, 2, 0xff, 2, 2, 1, 112 }, /* 320k */ + { 0, 2, 2, 1, 0, 40, 9, 2, 0xfd, 2, 2, 2, 112 }, /* 360k */ + { 0, 2, 2, 1, 0, 80, 8, 2, 0xfb, 2, 2, 2, 112 }, /* 640k */ + { 0, 2, 2, 1, 0, 80, 9, 2, 0xf9, 2, 2, 3, 112 }, /* 720k */ + { 1, 2, 0, 1, 1, 80, 15, 2, 0xf9, 1, 2, 7, 224 }, /* 1.2M */ + { 1, 2, 0, 1, 1, 77, 8, 3, 0xfe, 1, 2, 2, 192 }, /* 1.25M */ + { 1, 2, 0, 1, 0, 80, 18, 2, 0xf0, 1, 2, 9, 224 }, /* 1.44M */ + { 1, 2, 0, 1, 0, 80, 21, 2, 0xf0, 2, 2, 5, 16 }, /* DMF cluster 1024 */ + { 1, 2, 0, 1, 0, 80, 21, 2, 0xf0, 4, 2, 3, 16 }, /* DMF cluster 2048 */ + { 2, 2, 3, 1, 0, 80, 36, 2, 0xf0, 2, 2, 9, 240 }, /* 2.88M */ + { 0, 64, 0, 0, 0, 96, 32, 2, 0, 0, 0, 0, 0 }, /* ZIP 100 */ + { 0, 64, 0, 0, 0, 239, 32, 2, 0, 0, 0, 0, 0 }, /* ZIP 250 */ +// { 0, 8, 0, 0, 0, 963, 32, 2, 0, 0, 0, 0, 0 }, /* LS-120 */ +// { 0, 32, 0, 0, 0, 262, 56, 2, 0, 0, 0, 0, 0 } /* LS-240 */ +// clang-format on +}; + +#ifdef __cplusplus +} +#endif + +#endif /*DISK_SIZES_H*/ diff --git a/src/qt/qt_newfloppydialog.cpp b/src/qt/qt_newfloppydialog.cpp index bad4fbf9e..cbb021963 100644 --- a/src/qt/qt_newfloppydialog.cpp +++ b/src/qt/qt_newfloppydialog.cpp @@ -60,21 +60,29 @@ struct disk_size_t { }; static const disk_size_t disk_sizes[14] = { - {0, 1, 2, 1, 0, 40, 8, 2, 0xfe, 2, 2, 1, 64 }, /* 160k */ - { 0, 1, 2, 1, 0, 40, 9, 2, 0xfc, 2, 2, 1, 64 }, /* 180k */ - { 0, 2, 2, 1, 0, 40, 8, 2, 0xff, 2, 2, 1, 112}, /* 320k */ - { 0, 2, 2, 1, 0, 40, 9, 2, 0xfd, 2, 2, 2, 112}, /* 360k */ - { 0, 2, 2, 1, 0, 80, 8, 2, 0xfb, 2, 2, 2, 112}, /* 640k */ - { 0, 2, 2, 1, 0, 80, 9, 2, 0xf9, 2, 2, 3, 112}, /* 720k */ - { 1, 2, 0, 1, 1, 80, 15, 2, 0xf9, 1, 2, 7, 224}, /* 1.2M */ - { 1, 2, 0, 1, 1, 77, 8, 3, 0xfe, 1, 2, 2, 192}, /* 1.25M */ - { 1, 2, 0, 1, 0, 80, 18, 2, 0xf0, 1, 2, 9, 224}, /* 1.44M */ - { 1, 2, 0, 1, 0, 80, 21, 2, 0xf0, 2, 2, 5, 16 }, /* DMF cluster 1024 */ - { 1, 2, 0, 1, 0, 80, 21, 2, 0xf0, 4, 2, 3, 16 }, /* DMF cluster 2048 */ - { 2, 2, 3, 1, 0, 80, 36, 2, 0xf0, 2, 2, 9, 240}, /* 2.88M */ - { 0, 64, 0, 0, 0, 96, 32, 2, 0, 0, 0, 0, 0 }, /* ZIP 100 */ - { 0, 64, 0, 0, 0, 239, 32, 2, 0, 0, 0, 0, 0 } -}; /* ZIP 250 */ +// clang-format off +// { 1, 1, 2, 1, 1, 77, 26, 0, 0, 4, 2, 6, 68 }, /* 250k 8" */ +// { 1, 2, 2, 1, 1, 77, 26, 0, 0, 4, 2, 6, 68 }, /* 500k 8" */ +// { 1, 1, 2, 1, 1, 77, 8, 3, 0, 1, 2, 2, 192 }, /* 616k 8" */ +// { 1, 2, 0, 1, 1, 77, 8, 3, 0, 1, 2, 2, 192 }, /* 1232k 8" */ + { 0, 1, 2, 1, 0, 40, 8, 2, 0xfe, 2, 2, 1, 64 }, /* 160k */ + { 0, 1, 2, 1, 0, 40, 9, 2, 0xfc, 2, 2, 1, 64 }, /* 180k */ + { 0, 2, 2, 1, 0, 40, 8, 2, 0xff, 2, 2, 1, 112 }, /* 320k */ + { 0, 2, 2, 1, 0, 40, 9, 2, 0xfd, 2, 2, 2, 112 }, /* 360k */ + { 0, 2, 2, 1, 0, 80, 8, 2, 0xfb, 2, 2, 2, 112 }, /* 640k */ + { 0, 2, 2, 1, 0, 80, 9, 2, 0xf9, 2, 2, 3, 112 }, /* 720k */ + { 1, 2, 0, 1, 1, 80, 15, 2, 0xf9, 1, 2, 7, 224 }, /* 1.2M */ + { 1, 2, 0, 1, 1, 77, 8, 3, 0xfe, 1, 2, 2, 192 }, /* 1.25M */ + { 1, 2, 0, 1, 0, 80, 18, 2, 0xf0, 1, 2, 9, 224 }, /* 1.44M */ + { 1, 2, 0, 1, 0, 80, 21, 2, 0xf0, 2, 2, 5, 16 }, /* DMF cluster 1024 */ + { 1, 2, 0, 1, 0, 80, 21, 2, 0xf0, 4, 2, 3, 16 }, /* DMF cluster 2048 */ + { 2, 2, 3, 1, 0, 80, 36, 2, 0xf0, 2, 2, 9, 240 }, /* 2.88M */ + { 0, 64, 0, 0, 0, 96, 32, 2, 0, 0, 0, 0, 0 }, /* ZIP 100 */ + { 0, 64, 0, 0, 0, 239, 32, 2, 0, 0, 0, 0, 0 }, /* ZIP 250 */ +// { 0, 8, 0, 0, 0, 963, 32, 2, 0, 0, 0, 0, 0 }, /* LS-120 */ +// { 0, 32, 0, 0, 0, 262, 56, 2, 0, 0, 0, 0, 0 } /* LS-240 */ +// clang-format on +}; static const QStringList rpmModes = { "Perfect RPM", diff --git a/src/win/win_new_floppy.c b/src/win/win_new_floppy.c index 33807a78e..6e3f765f0 100644 --- a/src/win/win_new_floppy.c +++ b/src/win/win_new_floppy.c @@ -26,6 +26,7 @@ #include #include #include <86box/86box.h> +#include <86box/disksizes.h> #include <86box/plat.h> #include <86box/random.h> #include <86box/ui.h> @@ -34,43 +35,6 @@ #include <86box/zip.h> #include <86box/win.h> -typedef struct { - int hole; - int sides; - int data_rate; - int encoding; - int rpm; - int tracks; - int sectors; /* For IMG and Japanese FDI only. */ - int sector_len; /* For IMG and Japanese FDI only. */ - int media_desc; - int spc; - int num_fats; - int spfat; - int root_dir_entries; -} disk_size_t; - -static const disk_size_t disk_sizes[14] = { - // { 1, 1, 2, 1, 1, 77, 26, 0, 0, 4, 2, 6, 68 }, /* 250k 8" */ - // { 1, 2, 2, 1, 1, 77, 26, 0, 0, 4, 2, 6, 68 }, /* 500k 8" */ - // { 1, 1, 2, 1, 1, 77, 8, 3, 0, 1, 2, 2, 192 }, /* 616k 8" */ - // { 1, 2, 0, 1, 1, 77, 8, 3, 0, 1, 2, 2, 192 }, /* 1232k 8" */ - {0, 1, 2, 1, 0, 40, 8, 2, 0xfe, 1, 2, 1, 64 }, /* 160k */ - { 0, 1, 2, 1, 0, 40, 9, 2, 0xfc, 1, 2, 2, 64 }, /* 180k */ - { 0, 2, 2, 1, 0, 40, 8, 2, 0xff, 2, 2, 1, 112}, /* 320k */ - { 0, 2, 2, 1, 0, 40, 9, 2, 0xfd, 2, 2, 2, 112}, /* 360k */ - { 0, 2, 2, 1, 0, 80, 8, 2, 0xfb, 2, 2, 2, 112}, /* 640k */ - { 0, 2, 2, 1, 0, 80, 9, 2, 0xf9, 2, 2, 3, 112}, /* 720k */ - { 1, 2, 0, 1, 1, 80, 15, 2, 0xf9, 1, 2, 7, 224}, /* 1.2M */ - { 1, 2, 0, 1, 1, 77, 8, 3, 0xfe, 1, 2, 2, 192}, /* 1.25M */ - { 1, 2, 0, 1, 0, 80, 18, 2, 0xf0, 1, 2, 9, 224}, /* 1.44M */ - { 1, 2, 0, 1, 0, 80, 21, 2, 0xf0, 2, 2, 5, 16 }, /* DMF cluster 1024 */ - { 1, 2, 0, 1, 0, 80, 21, 2, 0xf0, 4, 2, 3, 16 }, /* DMF cluster 2048 */ - { 2, 2, 3, 1, 0, 80, 36, 2, 0xf0, 2, 2, 9, 240}, /* 2.88M */ - { 0, 64, 0, 0, 0, 96, 32, 2, 0, 0, 0, 0, 0 }, /* ZIP 100 */ - { 0, 64, 0, 0, 0, 239, 32, 2, 0, 0, 0, 0, 0 } -}; /* ZIP 250 */ - static unsigned char *empty; static int From 0bf0520bd527f424f10988ef18ce7b3db87b17cc Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 20 Dec 2022 19:29:54 -0500 Subject: [PATCH 056/285] slirp makefile & cmake tidying --- src/network/slirp/CMakeLists.txt | 9 ++++++--- src/win/Makefile.mingw | 11 ++++++++--- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/network/slirp/CMakeLists.txt b/src/network/slirp/CMakeLists.txt index f3fa9348b..a2c82e642 100644 --- a/src/network/slirp/CMakeLists.txt +++ b/src/network/slirp/CMakeLists.txt @@ -13,9 +13,12 @@ # Copyright 2020,2021 David Hrdlička. # -add_library(slirp STATIC arp_table.c bootp.c cksum.c dnssearch.c if.c ip_icmp.c - ip_input.c ip_output.c mbuf.c misc.c sbuf.c slirp.c socket.c tcp_input.c - tcp_output.c tcp_subr.c tcp_timer.c udp.c util.c version.c) +add_library(slirp STATIC arp_table.c bootp.c cksum.c dnssearch.c if.c + ip_icmp.c ip_input.c ip_output.c + mbuf.c misc.c sbuf.c slirp.c socket.c + tcp_input.c tcp_output.c tcp_subr.c tcp_timer.c + udp.c + util.c version.c) if(WIN32) target_link_libraries(slirp wsock32 iphlpapi) diff --git a/src/win/Makefile.mingw b/src/win/Makefile.mingw index a800dd957..4ac33d40f 100644 --- a/src/win/Makefile.mingw +++ b/src/win/Makefile.mingw @@ -644,12 +644,17 @@ SCSIOBJ := scsi.o scsi_device.o \ scsi_ncr5380.o scsi_ncr53c8xx.o \ scsi_pcscsi.o scsi_spock.o +SLIRPOBJ := arp_table.o bootp.o cksum.o dnssearch.o if.o \ + ip_icmp.o ip_input.o ip_output.o \ + mbuf.o misc.o sbuf.o slirp.o socket.o \ + tcp_input.o tcp_output.o tcp_subr.o tcp_timer.o \ + udp.o \ + util.o version.o \ + NETOBJ := network.o \ net_pcap.o \ net_slirp.o tinyglib.o \ - arp_table.o bootp.o cksum.o dnssearch.o if.o ip_icmp.o ip_input.o \ - ip_output.o mbuf.o misc.o sbuf.o slirp.o socket.o tcp_input.o \ - tcp_output.o tcp_subr.o tcp_timer.o udp.o util.o version.o \ + ${SLIRPOBJ} \ net_dp8390.o net_3c501.o \ net_3c503.o net_ne2000.o \ net_pcnet.o net_wd8003.o \ From 9acb39a02e87def48f0d0fd60b1c155f3e8d6ded Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 20 Dec 2022 19:30:18 -0500 Subject: [PATCH 057/285] Remove obsolete hook --- src/scsi/scsi.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/scsi/scsi.c b/src/scsi/scsi.c index 5f9abe8d6..4e82f67fa 100644 --- a/src/scsi/scsi.c +++ b/src/scsi/scsi.c @@ -41,9 +41,6 @@ #include <86box/scsi_ncr53c8xx.h> #include <86box/scsi_pcscsi.h> #include <86box/scsi_spock.h> -#ifdef WALTJE -# include "scsi_wd33c93.h" -#endif int scsi_card_current[SCSI_BUS_MAX] = { 0, 0 }; @@ -85,9 +82,6 @@ static SCSI_CARD scsi_cards[] = { { &scsi_rt1000mc_device, }, { &scsi_t128_device, }, { &scsi_t130b_device, }, -#ifdef WALTJE - { &scsi_wd33c93_device, }, -#endif { &aha1640_device, }, { &buslogic_640a_device, }, { &ncr53c90_mca_device, }, From 4cf7472ce2ea99961bb43d163c7b35966832a4b8 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 20 Dec 2022 19:33:23 -0500 Subject: [PATCH 058/285] Fix PCNet logging --- src/network/net_pcnet.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/net_pcnet.c b/src/network/net_pcnet.c index e1f62c874..7b48b063f 100644 --- a/src/network/net_pcnet.c +++ b/src/network/net_pcnet.c @@ -1486,7 +1486,7 @@ pcnetAsyncTransmit(nic_t *dev) */ if (tmd.tmd1.stp && tmd.tmd1.enp) { const int cb = 4096 - tmd.tmd1.bcnt; - pcnet_log("%s: pcnetAsyncTransmit: stp&enp: cb=%d xmtrc=%#x\n", dev->name, cb, CSR_XMTRC(dev)); + pcnet_log(3, "%s: pcnetAsyncTransmit: stp&enp: cb=%d xmtrc=%#x\n", dev->name, cb, CSR_XMTRC(dev)); if ((pcnetIsLinkUp(dev) || fLoopback)) { From aae9e1e408e01dacb2a594dacf6e47d5903b2037 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 20 Dec 2022 21:23:55 -0500 Subject: [PATCH 059/285] Initial Monster FDC support --- src/floppy/CMakeLists.txt | 5 +- src/floppy/fdc.c | 3 + src/floppy/fdc_monster.c | 193 ++++++++++++++++++++++++++++++++++++++ src/win/Makefile.mingw | 2 +- 4 files changed, 200 insertions(+), 3 deletions(-) create mode 100644 src/floppy/fdc_monster.c diff --git a/src/floppy/CMakeLists.txt b/src/floppy/CMakeLists.txt index 005e5bc57..70bae154e 100644 --- a/src/floppy/CMakeLists.txt +++ b/src/floppy/CMakeLists.txt @@ -13,5 +13,6 @@ # Copyright 2020,2021 David Hrdlička. # -add_library(fdd OBJECT fdd.c fdc.c fdc_magitronic.c fdc_pii15xb.c fdi2raw.c fdd_common.c - fdd_86f.c fdd_fdi.c fdd_imd.c fdd_img.c fdd_json.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_json.c + fdd_mfm.c fdd_td0.c) diff --git a/src/floppy/fdc.c b/src/floppy/fdc.c index fbc95be8a..cb4f34cf2 100644 --- a/src/floppy/fdc.c +++ b/src/floppy/fdc.c @@ -2276,6 +2276,9 @@ fdc_reset(void *priv) if (fdc->flags & FDC_FLAG_PCJR) { fdc->dma = 0; fdc->specify[1] = 1; + } else if (fdc->flags & FDC_FLAG_SEC) { + fdc->dma = 1; + fdc->specify[1] = 0; } else { fdc->dma = 1; fdc->specify[1] = 0; diff --git a/src/floppy/fdc_monster.c b/src/floppy/fdc_monster.c new file mode 100644 index 000000000..b98934f3e --- /dev/null +++ b/src/floppy/fdc_monster.c @@ -0,0 +1,193 @@ +/* + * 86Box A hypervisor and IBM PC system emulator that specializes in + * running old operating systems and software designed for IBM + * PC systems and compatibles from 1981 through fairly recent + * system designs based on the PCI bus. + * + * This file is part of the 86Box distribution. + * + * Emulation of Sergey Kiselev's Monster Floppy Disk Controller. + * + * + * + * Authors: Jasmine Iwanek, + * + * Copyright 2022 Jasmine Iwanek. + */ + +#include +#include +#include +#include +#include +#include +#define HAVE_STDARG_H +#include <86box/86box.h> +#include <86box/device.h> +#include <86box/io.h> +#include <86box/mem.h> +#include <86box/rom.h> +#include <86box/machine.h> +#include <86box/timer.h> +#include <86box/fdd.h> +#include <86box/fdc.h> +#include <86box/fdc_ext.h> + +#define BIOS_ADDR (uint32_t)(device_get_config_hex20("bios_addr") & 0x000fffff) +#define ROM_MONSTER_FDC "roms/floppy/monster-fdc/floppy_bios.rom" + +typedef struct +{ + rom_t bios_rom; +} monster_fdc_t; + +static void +monster_fdc_close(void *priv) +{ + monster_fdc_t *dev = (monster_fdc_t *)priv; + + free(dev); +} + +static void * +monster_fdc_init(const device_t *info) +{ + monster_fdc_t *dev; + + dev = (monster_fdc_t *)malloc(sizeof(monster_fdc_t)); + memset(dev, 0, sizeof(monster_fdc_t)); + + if (BIOS_ADDR != 0) + rom_init(&dev->bios_rom, ROM_MONSTER_FDC, BIOS_ADDR, 0x2000, 0x1ffff, 0, MEM_MAPPING_EXTERNAL); + + // Primary FDC + device_add(&fdc_at_device); + + // Secondary FDC + // device_add(&fdc_at_sec_device); + + return dev; +} + +static int monster_fdc_available(void) +{ + return rom_present(ROM_MONSTER_FDC); +} + +static const device_config_t monster_fdc_config[] = { +// clang-format off +/* + { + .name = "sec_irq", + .description = "Secondary Controller IRQ", + .type = CONFIG_SELECTION, + .default_string = "", + .default_int = 6, + .file_filter = "", + .spinner = { 0 }, + .selection = { + { + .description = "IRQ 2", + .value = 2 + }, + { + .description = "IRQ 3", + .value = 3 + }, + { + .description = "IRQ 4", + .value = 4 + }, + { + .description = "IRQ 5", + .value = 5 + }, + { + .description = "IRQ 6", + .value = 6 + }, + { + .description = "IRQ 7", + .value = 7 + }, + { .description = "" } + } + }, + { + .name = "sec_dma", + .description = "Secondary Controller DMA", + .type = CONFIG_SELECTION, + .default_string = "", + .default_int = 2, + .file_filter = "", + .spinner = { 0 }, + .selection = { + { + .description = "DMA 1", + .value = 1 + }, + { + .description = "DMA 2", + .value = 2 + }, + { + .description = "DMA 3", + .value = 3 + }, + { .description = "" } + } + }, +*/ + { + .name = "bios_addr", + .description = "BIOS Address:", + .type = CONFIG_HEX20, + .default_string = "", + .default_int = 0xc8000, + .file_filter = "", + .spinner = { 0 }, + .selection = { + { .description = "Disabled", .value = 0 }, + { .description = "C000H", .value = 0xc0000 }, + { .description = "C800H", .value = 0xc8000 }, + { .description = "D000H", .value = 0xd0000 }, + { .description = "D800H", .value = 0xd8000 }, + { .description = "E000H", .value = 0xe0000 }, + { .description = "E800H", .value = 0xe8000 }, + { .description = "" } + } + }, +/* + { + .name = "bios_size", + .description = "BIOS Size:", + .type = CONFIG_HEX20, + .default_string = "32", + .default_int = 0xc8000, + .file_filter = "", + .spinner = { 0 }, + .selection = { + { .description = "8K", .value = 8 }, + { .description = "32K", .value = 32 }, + { .description = "" } + } + }, +*/ + // BIOS extension ROM writes: Enabled/Disabled + { .name = "", .description = "", .type = CONFIG_END } +// clang-format on +}; + +const device_t fdc_monster_device = { + .name = "Monster FDC Floppy Drive Controller", + .internal_name = "monster_fdc", + .flags = DEVICE_ISA, + .local = 0, + .init = monster_fdc_init, + .close = monster_fdc_close, + .reset = NULL, + { .available = monster_fdc_available }, + .speed_changed = NULL, + .force_redraw = NULL, + .config =monster_fdc_config +}; diff --git a/src/win/Makefile.mingw b/src/win/Makefile.mingw index a800dd957..0a361c822 100644 --- a/src/win/Makefile.mingw +++ b/src/win/Makefile.mingw @@ -605,7 +605,7 @@ SIOOBJ := sio_acc3221.o sio_ali5123.o \ sio_um8669f.o \ sio_vt82c686.o -FDDOBJ := fdd.o fdc.o fdc_magitronic.o fdc_pii15xb.o \ +FDDOBJ := fdd.o fdc.o fdc_magitronic.o fdc_monster.o fdc_pii15xb.o \ fdi2raw.o \ fdd_common.o fdd_86f.o \ fdd_fdi.o fdd_imd.o fdd_img.o fdd_json.o \ From a93efb68e134b169cd525739840f8d72717bb60a Mon Sep 17 00:00:00 2001 From: Alexander Babikov <2708460+lemondrops@users.noreply.github.com> Date: Sun, 4 Dec 2022 22:45:51 +0500 Subject: [PATCH 060/285] Add a version of the XTIDE Universal BIOS for V20/V30 CPUs --- src/disk/hdc.c | 1 + src/disk/hdc_xtide.c | 30 ++++++++++++++++++++++++++++-- src/include/86box/hdc.h | 1 + 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/disk/hdc.c b/src/disk/hdc.c index 2a20d8987..8b75ac320 100644 --- a/src/disk/hdc.c +++ b/src/disk/hdc.c @@ -103,6 +103,7 @@ static const struct { { &xta_wdxt150_device }, { &xtide_acculogic_device }, { &xtide_device }, + { &xtide_plus_device }, { &esdi_ps2_device }, { &ide_pci_device }, { &ide_pci_2ch_device }, diff --git a/src/disk/hdc_xtide.c b/src/disk/hdc_xtide.c index 339547699..45b8dde54 100644 --- a/src/disk/hdc_xtide.c +++ b/src/disk/hdc_xtide.c @@ -45,6 +45,7 @@ #include <86box/hdc_ide.h> #define ROM_PATH_XT "roms/hdd/xtide/ide_xt.bin" +#define ROM_PATH_XTP "roms/hdd/xtide/ide_xtp.bin" #define ROM_PATH_AT "roms/hdd/xtide/ide_at.bin" #define ROM_PATH_PS2 "roms/hdd/xtide/SIDE1V12.BIN" #define ROM_PATH_PS2AT "roms/hdd/xtide/ide_at_1_1_5.bin" @@ -130,8 +131,13 @@ xtide_init(const device_t *info) memset(xtide, 0x00, sizeof(xtide_t)); - rom_init(&xtide->bios_rom, ROM_PATH_XT, - 0xc8000, 0x2000, 0x1fff, 0, MEM_MAPPING_EXTERNAL); + if (info->local == 1) { + rom_init(&xtide->bios_rom, ROM_PATH_XTP, + 0xc8000, 0x2000, 0x1fff, 0, MEM_MAPPING_EXTERNAL); + } else { + rom_init(&xtide->bios_rom, ROM_PATH_XT, + 0xc8000, 0x2000, 0x1fff, 0, MEM_MAPPING_EXTERNAL); + } xtide->ide_board = ide_xtide_init(); @@ -148,6 +154,12 @@ xtide_available(void) return (rom_present(ROM_PATH_XT)); } +static int +xtide_plus_available(void) +{ + return (rom_present(ROM_PATH_XTP)); +} + static void * xtide_at_init(const device_t *info) { @@ -258,6 +270,20 @@ const device_t xtide_device = { .config = NULL }; +const device_t xtide_plus_device = { + .name = "PC/XT XTIDE (V20/V30/8018x)", + .internal_name = "xtide_plus", + .flags = DEVICE_ISA, + .local = 1, + .init = xtide_init, + .close = xtide_close, + .reset = NULL, + { .available = xtide_plus_available }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + const device_t xtide_at_device = { .name = "PC/AT XTIDE", .internal_name = "xtide_at", diff --git a/src/include/86box/hdc.h b/src/include/86box/hdc.h index 8eb5134b8..6b54e15e8 100644 --- a/src/include/86box/hdc.h +++ b/src/include/86box/hdc.h @@ -79,6 +79,7 @@ extern const device_t xta_wdxt150_device; /* xta_wdxt150 */ extern const device_t xta_hd20_device; /* EuroPC internal */ extern const device_t xtide_device; /* xtide_xt */ +extern const device_t xtide_plus_device; /* xtide_xt_plus */ extern const device_t xtide_at_device; /* xtide_at */ extern const device_t xtide_at_386_device; /* xtide_at_386 */ extern const device_t xtide_acculogic_device; /* xtide_ps2 */ From b60d119ad8011b47769e3ef6f861fa75aaf52741 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 20 Dec 2022 23:12:41 -0500 Subject: [PATCH 061/285] Add Western Digital WDXT-GEN --- src/disk/hdc.c | 1 + src/disk/hdc_st506_xt.c | 31 ++++++++++++++++++++++++++++++- src/include/86box/hdc.h | 1 + 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/disk/hdc.c b/src/disk/hdc.c index 8b75ac320..0e58b6473 100644 --- a/src/disk/hdc.c +++ b/src/disk/hdc.c @@ -84,6 +84,7 @@ static const struct { { &hdc_none_device }, { &hdc_internal_device }, { &st506_xt_xebec_device }, + { &st506_xt_wdxt_gen_device }, { &st506_xt_dtc5150x_device }, { &st506_xt_st11_m_device }, { &st506_xt_wd1002a_wx1_device }, diff --git a/src/disk/hdc_st506_xt.c b/src/disk/hdc_st506_xt.c index f130a58d5..343e42853 100644 --- a/src/disk/hdc_st506_xt.c +++ b/src/disk/hdc_st506_xt.c @@ -88,7 +88,8 @@ #include <86box/hdd.h> #define ST506_XT_TYPE_XEBEC 0 -#define ST506_XT_TYPE_DTC_5150X 1 +#define ST506_XT_TYPE_WDXT_GEN 1 +#define ST506_XT_TYPE_DTC_5150X 2 #define ST506_XT_TYPE_ST11M 11 #define ST506_XT_TYPE_ST11R 12 #define ST506_XT_TYPE_WD1002A_WX1 21 @@ -101,6 +102,7 @@ #define ST506_XT_TYPE_TOSHIBA_T1200 28 #define XEBEC_BIOS_FILE "roms/hdd/st506/ibm_xebec_62x0822_1985.bin" +#define WDXT_GEN_BIOS_FILE "roms/hdd/st506/wdxt-gen/62-000128-000.bin" #define DTC_BIOS_FILE "roms/hdd/st506/dtc_cxd21a.bin" #define ST11_BIOS_FILE_OLD "roms/hdd/st506/st11_bios_vers_1.7.bin" #define ST11_BIOS_FILE_NEW "roms/hdd/st506/st11_bios_vers_2.0.bin" @@ -1335,6 +1337,15 @@ mem_read(uint32_t addr, void *priv) } break; + case ST506_XT_TYPE_WDXT_GEN /* WDXT-GEN */ + if (addr >= 0x002000) { +#ifdef ENABLE_ST506_XT_LOG + st506_xt_log("ST506: WDXT-GEN ROM access(0x%06lx)\n", addr); +#endif + return 0xff; + } + break; + case ST506_XT_TYPE_DTC_5150X: /* DTC */ default: if (addr >= 0x002000) { @@ -1519,6 +1530,10 @@ st506_init(const device_t *info) fn = XEBEC_BIOS_FILE; break; + case ST506_XT_TYPE_WDXT_GEN: /* WDXT-GEN (MFM) */ + fn = WDXT_GEN_BIOS_FILE; + break; + case ST506_XT_TYPE_DTC_5150X: /* DTC5150 (MFM) */ fn = DTC_BIOS_FILE; dev->switches = 0xff; @@ -2124,6 +2139,20 @@ const device_t st506_xt_xebec_device = { .config = NULL }; +const device_t st506_xt_wdxt_gen_device = { + .name = "Western Digital WDXT-GEN (MFM)", + .internal_name = "st506_xt", + .flags = DEVICE_ISA, + .local = (HDD_BUS_MFM << 8) | ST506_XT_TYPE_WDXT_GEN, + .init = st506_init, + .close = st506_close, + .reset = NULL, + { .available = xebec_available }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + const device_t st506_xt_dtc5150x_device = { .name = "DTC 5150X MFM Fixed Disk Adapter", .internal_name = "st506_xt_dtc5150x", diff --git a/src/include/86box/hdc.h b/src/include/86box/hdc.h index 6b54e15e8..4320d86e2 100644 --- a/src/include/86box/hdc.h +++ b/src/include/86box/hdc.h @@ -35,6 +35,7 @@ extern int hdc_current; extern const device_t st506_xt_xebec_device; /* st506_xt_xebec */ +extern const device_t st506_xt_wdxt_gen_device; /* st506_xt_wdxt_gen */ extern const device_t st506_xt_dtc5150x_device; /* st506_xt_dtc */ extern const device_t st506_xt_st11_m_device; /* st506_xt_st11_m */ extern const device_t st506_xt_st11_r_device; /* st506_xt_st11_m */ From e6a87f3c3f2e521ad718d82a743945a998c8778a Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Wed, 21 Dec 2022 01:39:34 +0600 Subject: [PATCH 062/285] cl54xx: clear only FLAG_EXT_WRITE and FLAG_ADDR_BY16 --- src/video/vid_cl54xx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video/vid_cl54xx.c b/src/video/vid_cl54xx.c index a1effc16a..f079bff9f 100644 --- a/src/video/vid_cl54xx.c +++ b/src/video/vid_cl54xx.c @@ -895,7 +895,7 @@ gd54xx_out(uint16_t addr, uint8_t val, void *p) else { svga->gdcreg[5] &= ~0x04; svga->writemode = svga->gdcreg[5] & 3; - svga->adv_flags = 0; + svga->adv_flags &= (FLAG_EXTRA_BANKS | FLAG_ADDR_BY8 | FLAG_LATCH8); svga->gdcreg[0] &= 0x0f; gd543x_mmio_write(0xb8000, svga->gdcreg[0], gd54xx); svga->gdcreg[1] &= 0x0f; From 261e20ba736b8c83de2bc97afe059a53f7d35dd0 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Wed, 21 Dec 2022 14:35:56 +0600 Subject: [PATCH 063/285] cl54xx: clear GR1 and GR0 when disabling enabled extensions --- src/video/vid_cl54xx.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/video/vid_cl54xx.c b/src/video/vid_cl54xx.c index f079bff9f..6b7223761 100644 --- a/src/video/vid_cl54xx.c +++ b/src/video/vid_cl54xx.c @@ -876,8 +876,6 @@ gd54xx_out(uint16_t addr, uint8_t val, void *p) svga_recalctimings(svga); } else { switch (svga->gdcaddr) { - case 0x09: - case 0x0a: case 0x0b: svga->adv_flags = 0; if (svga->gdcreg[0xb] & 0x01) @@ -888,11 +886,11 @@ gd54xx_out(uint16_t addr, uint8_t val, void *p) svga->adv_flags |= FLAG_EXT_WRITE; if (svga->gdcreg[0xb] & 0x08) svga->adv_flags |= FLAG_LATCH8; - if (svga->gdcreg[0xb] & 0x10) + if ((svga->gdcreg[0xb] & 0x10) && (svga->adv_flags & FLAG_EXT_WRITE)) svga->adv_flags |= FLAG_ADDR_BY16; if (svga->gdcreg[0xb] & 0x04) svga->writemode = svga->gdcreg[5] & 7; - else { + else if (o & 0x4) { svga->gdcreg[5] &= ~0x04; svga->writemode = svga->gdcreg[5] & 3; svga->adv_flags &= (FLAG_EXTRA_BANKS | FLAG_ADDR_BY8 | FLAG_LATCH8); @@ -902,6 +900,8 @@ gd54xx_out(uint16_t addr, uint8_t val, void *p) gd543x_mmio_write(0xb8004, svga->gdcreg[1], gd54xx); svga->seqregs[2] &= 0x0f; } + case 0x09: + case 0x0a: gd54xx_recalc_banking(gd54xx); break; From 611dc36f59375e938ca93355fcc27e79a5efb778 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Wed, 21 Dec 2022 03:55:00 -0500 Subject: [PATCH 064/285] FIx a silly mistake --- src/disk/hdc_st506_xt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/disk/hdc_st506_xt.c b/src/disk/hdc_st506_xt.c index 343e42853..88bf8c2c9 100644 --- a/src/disk/hdc_st506_xt.c +++ b/src/disk/hdc_st506_xt.c @@ -1337,7 +1337,7 @@ mem_read(uint32_t addr, void *priv) } break; - case ST506_XT_TYPE_WDXT_GEN /* WDXT-GEN */ + case ST506_XT_TYPE_WDXT_GEN: /* WDXT-GEN */ if (addr >= 0x002000) { #ifdef ENABLE_ST506_XT_LOG st506_xt_log("ST506: WDXT-GEN ROM access(0x%06lx)\n", addr); From 82c9ce1d210abe4e04c9fa44c2fe270d687c97b4 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Wed, 21 Dec 2022 15:10:19 +0600 Subject: [PATCH 065/285] CL-GD5436 leaves GR0 and GR1 untouched --- src/video/vid_cl54xx.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/video/vid_cl54xx.c b/src/video/vid_cl54xx.c index 6b7223761..8f145fc56 100644 --- a/src/video/vid_cl54xx.c +++ b/src/video/vid_cl54xx.c @@ -894,10 +894,12 @@ gd54xx_out(uint16_t addr, uint8_t val, void *p) svga->gdcreg[5] &= ~0x04; svga->writemode = svga->gdcreg[5] & 3; svga->adv_flags &= (FLAG_EXTRA_BANKS | FLAG_ADDR_BY8 | FLAG_LATCH8); - svga->gdcreg[0] &= 0x0f; - gd543x_mmio_write(0xb8000, svga->gdcreg[0], gd54xx); - svga->gdcreg[1] &= 0x0f; - gd543x_mmio_write(0xb8004, svga->gdcreg[1], gd54xx); + if (svga->crtc[0x27] != CIRRUS_ID_CLGD5436) { + svga->gdcreg[0] &= 0x0f; + gd543x_mmio_write(0xb8000, svga->gdcreg[0], gd54xx); + svga->gdcreg[1] &= 0x0f; + gd543x_mmio_write(0xb8004, svga->gdcreg[1], gd54xx); + } svga->seqregs[2] &= 0x0f; } case 0x09: From d4ed4a57dfbd0c079f5b7aee9f6442b4c9f6184f Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Wed, 21 Dec 2022 15:41:11 +0600 Subject: [PATCH 066/285] cl54xx: Device ID remains constant and read only --- src/video/vid_cl54xx.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/video/vid_cl54xx.c b/src/video/vid_cl54xx.c index 8f145fc56..c3fd19e58 100644 --- a/src/video/vid_cl54xx.c +++ b/src/video/vid_cl54xx.c @@ -1031,6 +1031,8 @@ gd54xx_out(uint16_t addr, uint8_t val, void *p) case 0x3d5: if (((svga->crtcreg == 0x19) || (svga->crtcreg == 0x1a) || (svga->crtcreg == 0x1b) || (svga->crtcreg == 0x1d) || (svga->crtcreg == 0x25) || (svga->crtcreg == 0x27)) && !gd54xx->unlocked) return; + if ((svga->crtcreg == 0x25) || (svga->crtcreg == 0x27)) + return; if ((svga->crtcreg < 7) && (svga->crtc[0x11] & 0x80)) return; if ((svga->crtcreg == 7) && (svga->crtc[0x11] & 0x80)) From 533004490a2d9e27e7e0710868562f83e1aa196f Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Wed, 21 Dec 2022 23:31:06 +0600 Subject: [PATCH 067/285] Backport commit e1e3475bd482e3350a2ec442a0a9fda8ba5cff06 from PCem --- src/sound/snd_audiopci.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sound/snd_audiopci.c b/src/sound/snd_audiopci.c index b02243855..ecac7f05a 100644 --- a/src/sound/snd_audiopci.c +++ b/src/sound/snd_audiopci.c @@ -1958,7 +1958,7 @@ generate_es1371_filter(void) for (n = 0; n < ES1371_NCoef; n++) gain += low_fir_es1371_coef[n] / (float) N; - gain /= 0.95; + gain /= 0.65; /* Normalise filter, to produce unity gain */ for (n = 0; n < ES1371_NCoef; n++) From 28baa5168f6ee8991779077b262717348faa5d11 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Wed, 21 Dec 2022 16:14:59 -0500 Subject: [PATCH 068/285] Correct mistakes --- src/floppy/fdc.c | 1 + src/floppy/fdc_monster.c | 2 +- src/include/86box/fdc_ext.h | 2 ++ 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/floppy/fdc.c b/src/floppy/fdc.c index cb4f34cf2..2abc4a8f5 100644 --- a/src/floppy/fdc.c +++ b/src/floppy/fdc.c @@ -135,6 +135,7 @@ static fdc_cards_t fdc_cards[] = { { &fdc_b215_device }, { &fdc_pii151b_device }, { &fdc_pii158b_device }, + { &fdc_monster_device }, { NULL } // clang-format on }; diff --git a/src/floppy/fdc_monster.c b/src/floppy/fdc_monster.c index b98934f3e..2cd1d9b05 100644 --- a/src/floppy/fdc_monster.c +++ b/src/floppy/fdc_monster.c @@ -34,7 +34,7 @@ #include <86box/fdc_ext.h> #define BIOS_ADDR (uint32_t)(device_get_config_hex20("bios_addr") & 0x000fffff) -#define ROM_MONSTER_FDC "roms/floppy/monster-fdc/floppy_bios.rom" +#define ROM_MONSTER_FDC "roms/floppy/monster-fdc/floppy_bios.bin" typedef struct { diff --git a/src/include/86box/fdc_ext.h b/src/include/86box/fdc_ext.h index 60d93efc6..2287978c1 100644 --- a/src/include/86box/fdc_ext.h +++ b/src/include/86box/fdc_ext.h @@ -31,6 +31,8 @@ extern const device_t fdc_b215_device; extern const device_t fdc_pii151b_device; extern const device_t fdc_pii158b_device; +extern const device_t fdc_monster_device; + extern void fdc_card_init(void); extern char *fdc_card_get_internal_name(int card); From e0c797a20fab5529f292d6aedfc76df01fd3f78e Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 22 Dec 2022 02:30:25 +0100 Subject: [PATCH 069/285] Added WD XTA BIOS revision selection using the new CONFIG_BIOS infrastructure and some related fixes in the Win32 code. --- src/device.c | 33 +++++++++++++++++++++++++++++++++ src/disk/hdc_xta.c | 31 ++++++++++++++++++++++--------- src/include/86box/device.h | 5 +++-- src/win/win_devconf.c | 7 +++++-- 4 files changed, 63 insertions(+), 13 deletions(-) diff --git a/src/device.c b/src/device.c index ef0b59b2b..a13825307 100644 --- a/src/device.c +++ b/src/device.c @@ -347,6 +347,39 @@ device_available(const device_t *d) return (0); } +const char * +device_get_bios_file(const device_t *d, const char *internal_name, int file_no) +{ + device_config_t *config = NULL; + device_config_bios_t *bios = NULL; + + if (d != NULL) { + config = (device_config_t *) d->config; + if (config != NULL) { + while (config->type != -1) { + if (config->type == CONFIG_BIOS) { + bios = (device_config_bios_t *) config->bios; + + /* Go through the ROM's in the device configuration. */ + while (bios->files_no != 0) { + if (!strcmp(internal_name, bios->internal_name)) { + if (file_no < bios->files_no) + return bios->files[file_no]; + else + return NULL; + } + bios++; + } + } + config++; + } + } + } + + /* A NULL device is never available. */ + return (NULL); +} + int device_has_config(const device_t *d) { diff --git a/src/disk/hdc_xta.c b/src/disk/hdc_xta.c index c6abf9adf..589ec2789 100644 --- a/src/disk/hdc_xta.c +++ b/src/disk/hdc_xta.c @@ -104,7 +104,8 @@ #define HDC_TIME (50 * TIMER_USEC) -#define WD_BIOS_FILE "roms/hdd/xta/idexywd2.bin" +#define WD_REV_1_BIOS_FILE "roms/hdd/xta/idexywd2.bin" +#define WD_REV_2_BIOS_FILE "roms/hdd/xta/infowdbios.rom" enum { STATE_IDLE = 0, @@ -962,16 +963,11 @@ hdc_write(uint16_t port, uint8_t val, void *priv) } } -static int -xta_available(void) -{ - return (rom_present(WD_BIOS_FILE)); -} - static void * xta_init(const device_t *info) { drive_t *drive; + char *bios_rev = NULL; char *fn = NULL; hdc_t *dev; int c, i; @@ -990,7 +986,8 @@ xta_init(const device_t *info) dev->irq = device_get_config_int("irq"); dev->rom_addr = device_get_config_hex20("bios_addr"); dev->dma = 3; - fn = WD_BIOS_FILE; + bios_rev = (char *) device_get_config_bios("bios_rev"); + fn = (char *) device_get_bios_file(info, (const char *) bios_rev, 0); max = 1; break; @@ -1123,6 +1120,22 @@ static const device_config_t wdxt150_config[] = { { .description = "" } }, }, + { + .name = "bios_rev", + .description = "BIOS Revision", + .type = CONFIG_BIOS, + .default_string = "rev_1", + .default_int = 0, + .file_filter = "", + .spinner = { 0 }, /*W1*/ + .bios = { + { .name = "Revision 1.0", .internal_name = "rev_1", .bios_type = BIOS_NORMAL, + .files_no = 1, .local = 0, .size = 8192, .files = { WD_REV_1_BIOS_FILE, "" } }, + { .name = "Revision 2.0", .internal_name = "rev_2", .bios_type = BIOS_NORMAL, + .files_no = 1, .local = 0, .size = 8192, .files = { WD_REV_2_BIOS_FILE, "" } }, + { .files_no = 0 } + }, + }, { .name = "", .description = "", .type = CONFIG_END } // clang-format off }; @@ -1135,7 +1148,7 @@ const device_t xta_wdxt150_device = { .init = xta_init, .close = xta_close, .reset = NULL, - { .available = xta_available }, + { .available = NULL /*xta_available*/ }, .speed_changed = NULL, .force_redraw = NULL, .config = wdxt150_config diff --git a/src/include/86box/device.h b/src/include/86box/device.h index a8d100acc..ca4e6bdf2 100644 --- a/src/include/86box/device.h +++ b/src/include/86box/device.h @@ -90,7 +90,7 @@ typedef struct { int files_no; uint32_t local, size; void *dev1, *dev2; - const char **files; + const char *files[9]; } device_config_bios_t; typedef struct { @@ -108,7 +108,7 @@ typedef struct { const char *file_filter; const device_config_spinner_t spinner; const device_config_selection_t selection[16]; - const device_config_bios_t *bios; + const device_config_bios_t bios[32]; } device_config_t; typedef struct _device_ { @@ -164,6 +164,7 @@ extern void device_speed_changed(void); extern void device_force_redraw(void); extern void device_get_name(const device_t *d, int bus, char *name); extern int device_has_config(const device_t *d); +extern const char *device_get_bios_file(const device_t *d, const char *internal_name, int file_no); extern int device_is_valid(const device_t *, int m); diff --git a/src/win/win_devconf.c b/src/win/win_devconf.c index fee446310..c867dab9f 100644 --- a/src/win/win_devconf.c +++ b/src/win/win_devconf.c @@ -108,7 +108,7 @@ deviceconfig_dlgproc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) c = 0; q = 0; - while (bios && bios->name && bios->name[0]) { + while (bios && (bios->files_no > 0)) { mbstowcs(lptsTemp, bios->name, strlen(bios->name) + 1); p = 0; for (d = 0; d < bios->files_no; d++) @@ -218,7 +218,6 @@ deviceconfig_dlgproc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) if (cid == IDOK) { id = IDC_CONFIG_BASE; config = config_device.dev->config; - bios = config->bios; changed = 0; char s[512]; @@ -251,6 +250,8 @@ deviceconfig_dlgproc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) id += 2; break; case CONFIG_BIOS: + bios = config->bios; + val_str = config_get_string((char *) config_device.name, (char *) config->name, (char *) config->default_string); @@ -375,6 +376,7 @@ deviceconfig_dlgproc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) id += 2; break; case CONFIG_BIOS: + bios = config->bios; c = combo_to_struct[SendMessage(h, CB_GETCURSEL, 0, 0)]; for (; c > 0; c--) bios++; @@ -551,6 +553,7 @@ deviceconfig_inst_open(HWND hwnd, const device_t *device, int inst) case CONFIG_MIDI_IN: case CONFIG_HEX16: case CONFIG_HEX20: + case CONFIG_BIOS: /*Combo box*/ item = (DLGITEMTEMPLATE *) data; item->x = 70; From cc4fa2418992698c815447b866ed2877210f59b2 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 22 Dec 2022 06:17:07 +0100 Subject: [PATCH 070/285] Minor SiS 50x initialization/reset fixes. --- src/chipset/sis_85c50x.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/chipset/sis_85c50x.c b/src/chipset/sis_85c50x.c index 1aa5daead..24fdd7788 100644 --- a/src/chipset/sis_85c50x.c +++ b/src/chipset/sis_85c50x.c @@ -359,10 +359,10 @@ sis_85c50x_reset(void *priv) dev->pci_conf_sb[0x09] = 0x00; dev->pci_conf_sb[0x0a] = 0x01; dev->pci_conf_sb[0x0b] = 0x06; - sis_85c50x_write(0, 0x41, 0x80, dev); - sis_85c50x_write(0, 0x42, 0x80, dev); - sis_85c50x_write(0, 0x43, 0x80, dev); - sis_85c50x_write(0, 0x44, 0x80, dev); + sis_85c50x_sb_write(0, 0x41, 0x80, dev); + sis_85c50x_sb_write(0, 0x42, 0x80, dev); + sis_85c50x_sb_write(0, 0x43, 0x80, dev); + sis_85c50x_sb_write(0, 0x44, 0x80, dev); } static void From e4ff9d87a58d0169612af7872d0a8d2f319aa877 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 22 Dec 2022 06:33:15 +0100 Subject: [PATCH 071/285] Win32 UI builds now correctly build with RTMIDI enabled. --- src/win/Makefile.mingw | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/win/Makefile.mingw b/src/win/Makefile.mingw index 869ccefd4..b20dd86db 100644 --- a/src/win/Makefile.mingw +++ b/src/win/Makefile.mingw @@ -765,6 +765,11 @@ else SNDOBJ += xaudio2.o endif +ifeq ($(RTMIDI), y) + SNDOBJ += midi_rtmidi.o + OPTS += -DUSE_RTMIDI +endif + OBJ := $(MAINOBJ) $(CPUOBJ) $(CHIPSETOBJ) $(MCHOBJ) $(DEVOBJ) $(MEMOBJ) \ $(FDDOBJ) $(GAMEOBJ) $(CDROMOBJ) $(ZIPOBJ) $(MOOBJ) $(HDDOBJ) $(MINIVHDOBJ) \ $(NETOBJ) $(PRINTOBJ) $(SCSIOBJ) $(SIOOBJ) $(SNDOBJ) $(VIDOBJ) $(VOODOOOBJ) \ @@ -784,9 +789,7 @@ else endif ifeq ($(RTMIDI), y) - SNDOBJ += midi_rtmidi.o - OPTS += -DUSE_RTMIDI - LIBS += -lrtmidi + LIBS += -lrtmidi -lwinmm endif ifeq ($(VNC), y) From fc74cd9656ce40654fdcdb176eacedf5ad7c9331 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 22 Dec 2022 06:46:52 +0100 Subject: [PATCH 072/285] And another fix for Win32 UI + RTMIDI. --- src/win/Makefile.mingw | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/win/Makefile.mingw b/src/win/Makefile.mingw index b20dd86db..040b14aee 100644 --- a/src/win/Makefile.mingw +++ b/src/win/Makefile.mingw @@ -511,6 +511,10 @@ ifeq ($(DEV_BRANCH), y) endif endif +ifeq ($(RTMIDI), y) + OPTS += -DUSE_RTMIDI +endif + # Final versions of the toolchain flags. CFLAGS := $(OPTS) $(DFLAGS) $(COPTIM) $(AOPTIM) \ @@ -767,7 +771,6 @@ endif ifeq ($(RTMIDI), y) SNDOBJ += midi_rtmidi.o - OPTS += -DUSE_RTMIDI endif OBJ := $(MAINOBJ) $(CPUOBJ) $(CHIPSETOBJ) $(MCHOBJ) $(DEVOBJ) $(MEMOBJ) \ From 522b06bd0885ee13143684daf2f30ad5f7e0f090 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Thu, 22 Dec 2022 13:21:28 +0600 Subject: [PATCH 073/285] qt_mcadevicelist: device IDs are always 4 hex digits long --- src/qt/qt_mcadevicelist.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qt/qt_mcadevicelist.cpp b/src/qt/qt_mcadevicelist.cpp index 95ae17f45..b8c3ed3c9 100644 --- a/src/qt/qt_mcadevicelist.cpp +++ b/src/qt/qt_mcadevicelist.cpp @@ -22,7 +22,7 @@ MCADeviceList::MCADeviceList(QWidget *parent) for (int i = 0; i < mca_get_nr_cards(); i++) { uint32_t deviceId = (mca_read_index(0x00, i) | (mca_read_index(0x01, i) << 8)); if (deviceId != 0xFFFF) { - QString hexRepresentation = QString::number(deviceId, 16).toUpper(); + QString hexRepresentation = QString::asprintf("%04X", deviceId); ui->listWidget->addItem(QString("Slot %1: 0x%2 (@%3.ADF)").arg(i + 1).arg(hexRepresentation, hexRepresentation)); } } From a2dcf9e12fd93473c7cc5621daada0d82183f2c8 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Fri, 23 Dec 2022 20:49:13 +0600 Subject: [PATCH 074/285] qt_settingsdisplay: Changes are not lost on machine switch anymore --- src/qt/qt_settingsdisplay.cpp | 16 ++++++++++------ src/qt/qt_settingsdisplay.hpp | 4 +++- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/qt/qt_settingsdisplay.cpp b/src/qt/qt_settingsdisplay.cpp index 6ed9e7094..f01d7fc4d 100644 --- a/src/qt/qt_settingsdisplay.cpp +++ b/src/qt/qt_settingsdisplay.cpp @@ -36,6 +36,8 @@ SettingsDisplay::SettingsDisplay(QWidget *parent) { ui->setupUi(this); + videoCard = gfxcard; + videoCard_2 = gfxcard_2; onCurrentMachineChanged(machine); } @@ -59,6 +61,7 @@ SettingsDisplay::onCurrentMachineChanged(int machineId) { // win_settings_video_proc, WM_INITDIALOG this->machineId = machineId; + auto curVideoCard = videoCard; auto *model = ui->comboBoxVideo->model(); auto removeRows = model->rowCount(); @@ -80,7 +83,7 @@ SettingsDisplay::onCurrentMachineChanged(int machineId) if (video_card_available(c) && device_is_valid(video_dev, machineId)) { int row = Models::AddEntry(model, name, c); - if (c == gfxcard) { + if (c == curVideoCard) { selectedRow = row - removeRows; } } @@ -133,7 +136,8 @@ SettingsDisplay::on_comboBoxVideo_currentIndexChanged(int index) if (index < 0) { return; } - int videoCard = ui->comboBoxVideo->currentData().toInt(); + auto curVideoCard_2 = videoCard_2; + videoCard = ui->comboBoxVideo->currentData().toInt(); ui->pushButtonConfigure->setEnabled(video_card_has_config(videoCard) > 0); bool machineHasPci = machine_has_bus(machineId, MACHINE_BUS_PCI) > 0; @@ -176,14 +180,14 @@ SettingsDisplay::on_comboBoxVideo_currentIndexChanged(int index) if (video_card_available(c) && device_is_valid(video_dev, machineId) && !(video_card_get_flags(c) == video_card_get_flags(videoCard))) { ui->comboBoxVideoSecondary->addItem(name, c); - if (c == gfxcard_2) + if (c == curVideoCard_2) ui->comboBoxVideoSecondary->setCurrentIndex(ui->comboBoxVideoSecondary->count() - 1); } c++; } - if (gfxcard_2 == 0 || (machine_has_flags(machineId, MACHINE_VIDEO_ONLY) > 0)) { + if (videoCard_2 == 0 || (machine_has_flags(machineId, MACHINE_VIDEO_ONLY) > 0)) { ui->comboBoxVideoSecondary->setCurrentIndex(0); ui->pushButtonConfigureSecondary->setEnabled(false); } @@ -208,8 +212,8 @@ SettingsDisplay::on_comboBoxVideoSecondary_currentIndexChanged(int index) ui->pushButtonConfigureSecondary->setEnabled(false); return; } - int videoCard = ui->comboBoxVideoSecondary->currentData().toInt(); - ui->pushButtonConfigureSecondary->setEnabled(index != 0 && video_card_has_config(videoCard) > 0); + videoCard_2 = ui->comboBoxVideoSecondary->currentData().toInt(); + ui->pushButtonConfigureSecondary->setEnabled(index != 0 && video_card_has_config(videoCard_2) > 0); } void diff --git a/src/qt/qt_settingsdisplay.hpp b/src/qt/qt_settingsdisplay.hpp index 0aab5c161..c02e55ce0 100644 --- a/src/qt/qt_settingsdisplay.hpp +++ b/src/qt/qt_settingsdisplay.hpp @@ -35,7 +35,9 @@ private slots: private: Ui::SettingsDisplay *ui; - int machineId = 0; + int machineId = 0; + int videoCard = 0; + int videoCard_2 = 0; }; #endif // QT_SETTINGSDISPLAY_HPP From c2af20302936d264802c8b06eb441ca3aff6028b Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Fri, 23 Dec 2022 21:53:22 +0600 Subject: [PATCH 075/285] gdbstub: explicitly define FS_BASE and GS_BASE in features description --- src/gdbstub.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/gdbstub.c b/src/gdbstub.c index dc638cd07..92aa93cf1 100644 --- a/src/gdbstub.c +++ b/src/gdbstub.c @@ -213,6 +213,9 @@ static char target_xml[] = /* QEMU gdb-xml/i386-32bit.xml with modificati "" "" "" + "" + "" + "" "" "" "" From 231cadb0a7ee74fc95191e746d899cea82e9a036 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Fri, 23 Dec 2022 14:22:17 -0500 Subject: [PATCH 076/285] Fix Multiplication result converted to larger type from CodeQL --- src/floppy/fdd_img.c | 4 ++-- src/printer/prt_escp.c | 12 ++++++------ src/video/vid_pgc.c | 4 ++-- src/video/vid_svga_render.c | 2 +- src/video/video.c | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/floppy/fdd_img.c b/src/floppy/fdd_img.c index 3ebfeefd9..e0847c010 100644 --- a/src/floppy/fdd_img.c +++ b/src/floppy/fdd_img.c @@ -486,9 +486,9 @@ img_seek(int drive, int track) for (side = 0; side < dev->sides; side++) { if (dev->disk_at_once) { cur_pos = (track * dev->sectors * ssize * dev->sides) + (side * dev->sectors * ssize); - memcpy(dev->track_data[side], dev->disk_data + cur_pos, dev->sectors * ssize); + memcpy(dev->track_data[side], dev->disk_data + cur_pos, (size_t) dev->sectors * ssize); } else { - read_bytes = fread(dev->track_data[side], 1, dev->sectors * ssize, dev->f); + read_bytes = fread(dev->track_data[side], 1, (size_t) dev->sectors * ssize, dev->f); if (read_bytes < (dev->sectors * ssize)) memset(dev->track_data[side] + read_bytes, 0xf6, (dev->sectors * ssize) - read_bytes); } diff --git a/src/printer/prt_escp.c b/src/printer/prt_escp.c index e0a83da31..b2827e3f9 100644 --- a/src/printer/prt_escp.c +++ b/src/printer/prt_escp.c @@ -407,7 +407,7 @@ new_page(escp_t *dev, int8_t save, int8_t resetx) dev->curr_y = dev->top_margin; if (dev->page) { dev->page->dirty = 0; - memset(dev->page->pixels, 0x00, dev->page->pitch * dev->page->h); + memset(dev->page->pixels, 0x00, (size_t) dev->page->pitch * dev->page->h); } /* Make the page's file name. */ @@ -451,9 +451,9 @@ fill_palette(uint8_t redmax, uint8_t greenmax, uint8_t bluemax, uint8_t colorID, colormask = colorID <<= 5; for (i = 0; i < 32; i++) { - dev->palcol[i + colormask].r = 255 - (uint8_t) floor(red * (float) i); - dev->palcol[i + colormask].g = 255 - (uint8_t) floor(green * (float) i); - dev->palcol[i + colormask].b = 255 - (uint8_t) floor(blue * (float) i); + dev->palcol[i + colormask].r = 255 - (uint8_t) floor((double) red * (float) i); + dev->palcol[i + colormask].g = 255 - (uint8_t) floor((double) green * (float) i); + dev->palcol[i + colormask].b = 255 - (uint8_t) floor((double) blue * (float) i); } } @@ -2043,8 +2043,8 @@ escp_init(void *lpt) dev->page->w = (int) (dev->dpi * dev->page_width); dev->page->h = (int) (dev->dpi * dev->page_height); dev->page->pitch = dev->page->w; - dev->page->pixels = (uint8_t *) malloc(dev->page->pitch * dev->page->h); - memset(dev->page->pixels, 0x00, dev->page->pitch * dev->page->h); + dev->page->pixels = (uint8_t *) malloc((size_t) dev->page->pitch * dev->page->h); + memset(dev->page->pixels, 0x00, (size_t) dev->page->pitch * dev->page->h); /* Initialize parameters. */ for (i = 0; i < 32; i++) { diff --git a/src/video/vid_pgc.c b/src/video/vid_pgc.c index 89d1505bb..eb28540fc 100644 --- a/src/video/vid_pgc.c +++ b/src/video/vid_pgc.c @@ -2663,8 +2663,8 @@ pgc_init(pgc_t *dev, int maxw, int maxh, int visw, int vish, dev->visw = visw; dev->vish = vish; - dev->vram = (uint8_t *) malloc(maxw * maxh); - memset(dev->vram, 0x00, maxw * maxh); + dev->vram = (uint8_t *) malloc((size_t) maxw * maxh); + memset(dev->vram, 0x00, (size_t) maxw * maxh); dev->cga_vram = (uint8_t *) malloc(16384); memset(dev->cga_vram, 0x00, 16384); diff --git a/src/video/vid_svga_render.c b/src/video/vid_svga_render.c index 30d2c93b0..c67a46e0d 100644 --- a/src/video/vid_svga_render.c +++ b/src/video/vid_svga_render.c @@ -68,7 +68,7 @@ svga_render_blank(svga_t *svga) } uint32_t *line_ptr = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; - uint32_t line_width = (svga->hdisp + svga->scrollcache) * char_width * sizeof(uint32_t); + uint32_t line_width = (uint32_t) (svga->hdisp + svga->scrollcache) * char_width * sizeof(uint32_t); memset(line_ptr, 0, line_width); } diff --git a/src/video/video.c b/src/video/video.c index 18f2e1427..096ea89e1 100644 --- a/src/video/video.c +++ b/src/video/video.c @@ -804,7 +804,7 @@ create_bitmap(int x, int y) bitmap_t *b = malloc(sizeof(bitmap_t) + (y * sizeof(uint32_t *))); int c; - b->dat = malloc(x * y * 4); + b->dat = malloc((size_t) x * y * 4); for (c = 0; c < y; c++) b->line[c] = &(b->dat[c * x]); b->w = x; From b2cf2a604975a6ac08ca644d099e1e5a598fd68f Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sun, 25 Dec 2022 11:25:15 +0600 Subject: [PATCH 077/285] RTMidi support is now available on Haiku --- CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d3f74da8f..74b2ad4b2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,7 +20,6 @@ cmake_policy(SET CMP0079 NEW) if(HAIKU) set(OPENAL ON) - set(RTMIDI OFF) endif() if(NOT DEFINED QT OR QT) From fd82e523a0cecdc841664b60412e561c8c365563 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 27 Dec 2022 05:27:13 +0100 Subject: [PATCH 078/285] Fixed hercules video_process_8() width, fixes #2997. --- src/video/vid_hercules.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video/vid_hercules.c b/src/video/vid_hercules.c index 401166f54..550f05338 100644 --- a/src/video/vid_hercules.c +++ b/src/video/vid_hercules.c @@ -367,7 +367,7 @@ hercules_poll(void *priv) else x = dev->crtc[1] * 9; - video_process_8(x, dev->displine + 14); + video_process_8(x + 16, dev->displine + 14); } dev->sc = oldsc; From cfa6f64716dd54f87aa25874021c3bf5cc8d3002 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 27 Dec 2022 13:49:10 -0500 Subject: [PATCH 079/285] Initial P2 Covington support --- src/cpu/cpu_table.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/cpu/cpu_table.c b/src/cpu/cpu_table.c index 6fc922b1e..6f4d06399 100644 --- a/src/cpu/cpu_table.c +++ b/src/cpu/cpu_table.c @@ -1066,6 +1066,16 @@ const cpu_family_t cpu_families[] = { {"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[]) { + {"266", CPU_PENTIUM2D, fpus_internal, 266666666, 4.0, 2050, 0x650, 0x650, 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}, + {"", 0} + } }, { .package = CPU_PKG_SLOT2, .manufacturer = "Intel", From bde453160606469de5a9313b544b8edb7c1e79d8 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 27 Dec 2022 14:03:16 -0500 Subject: [PATCH 080/285] Fix timings, as the Covington doesn't have L2 cache --- src/cpu/cpu_table.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cpu/cpu_table.c b/src/cpu/cpu_table.c index 6f4d06399..01576decb 100644 --- a/src/cpu/cpu_table.c +++ b/src/cpu/cpu_table.c @@ -1072,8 +1072,8 @@ const cpu_family_t cpu_families[] = { .name = "Celeron (Covington)", .internal_name = "celeron_covington", .cpus = (const CPU[]) { - {"266", CPU_PENTIUM2D, fpus_internal, 266666666, 4.0, 2050, 0x650, 0x650, 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}, + {"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} } }, { From 239294b6e39d2750b7ea4a6984de8469bfc9be12 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 27 Dec 2022 15:27:06 -0500 Subject: [PATCH 081/285] Add out of spec underclocked models Matches how we handle the Deschutes --- src/cpu/cpu_table.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/cpu/cpu_table.c b/src/cpu/cpu_table.c index 01576decb..f9e86541c 100644 --- a/src/cpu/cpu_table.c +++ b/src/cpu/cpu_table.c @@ -1072,6 +1072,12 @@ 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}, {"", 0} From 676569dfb29348bf285ae3f921ede3b8fd1c8b3e Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Thu, 29 Dec 2022 00:50:50 +0600 Subject: [PATCH 082/285] qt: Display architecture information in About box --- src/qt/qt_mainwindow.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index d707fc7ea..6b9c75ba4 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -75,6 +75,7 @@ extern int qt_nvr_save(void); #include #include #include +#include #if QT_CONFIG(vulkan) # include # include @@ -2098,6 +2099,7 @@ MainWindow::on_actionAbout_86Box_triggered() #ifdef EMU_GIT_HASH githash = QString(" [%1]").arg(EMU_GIT_HASH); #endif + githash.append(QString(" [%1]").arg(QSysInfo::buildCpuArchitecture()); msgBox.setText(QString("%3%1%2").arg(EMU_VERSION_FULL, githash, tr("86Box v"))); msgBox.setInformativeText(tr("An emulator of old computers\n\nAuthors: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, Tiseno100, reenigne, 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"); From ecd7694006d0ca392c46a44e90dcb1ff28310407 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Fri, 23 Dec 2022 15:14:30 -0500 Subject: [PATCH 083/285] Fix more warnings --- src/sound/midi_rtmidi.cpp | 8 ++++++++ src/sound/snd_opl_ymfm.cpp | 16 ++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/src/sound/midi_rtmidi.cpp b/src/sound/midi_rtmidi.cpp index 743b828ad..354c7f61b 100644 --- a/src/sound/midi_rtmidi.cpp +++ b/src/sound/midi_rtmidi.cpp @@ -39,6 +39,7 @@ extern "C" { // Disable c99-designator to avoid the warnings in rtmidi_*_device #ifdef __clang__ # if __has_warning("-Wc99-designator") +# pragma clang diagnostic push # pragma clang diagnostic ignored "-Wc99-designator" # endif #endif @@ -302,4 +303,11 @@ const device_t rtmidi_input_device = { .force_redraw = NULL, .config = midi_input_config }; + +#ifdef __clang__ +# if __has_warning("-Wc99-designator") +# pragma clang diagnostic pop +# endif +#endif + } diff --git a/src/sound/snd_opl_ymfm.cpp b/src/sound/snd_opl_ymfm.cpp index bb52f3c55..012e77bdb 100644 --- a/src/sound/snd_opl_ymfm.cpp +++ b/src/sound/snd_opl_ymfm.cpp @@ -29,6 +29,15 @@ extern "C" { #include <86box/snd_opl.h> #include <86box/mem.h> #include <86box/rom.h> + +// Disable c99-designator to avoid the warnings in *_ymfm_device +#ifdef __clang__ +# if __has_warning("-Wc99-designator") +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wc99-designator" +# endif +#endif + } #define RSM_FRAC 10 @@ -432,4 +441,11 @@ const fm_drv_t ymfm_drv { &ymfm_drv_set_do_cycles, NULL, }; + +#ifdef __clang__ +# if __has_warning("-Wc99-designator") +# pragma clang diagnostic pop +# endif +#endif + } From 5984270f0def98a5ceaa3dc8379eab8295e16226 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Wed, 28 Dec 2022 19:07:51 -0500 Subject: [PATCH 084/285] Minor formatting in cpu.c --- 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 1ab06205f..4d1abcd05 100644 --- a/src/cpu/cpu.c +++ b/src/cpu/cpu.c @@ -2848,7 +2848,7 @@ amd_k_invalid_wrmsr: break; case 0x1b: cpu_log("APIC_BASE write: %08X%08X\n", EDX, EAX); - // msr.apic_base = EAX | ((uint64_t)EDX << 32); + // msr.apic_base = EAX | ((uint64_t) EDX << 32); break; case 0x2a: break; From 74eaf6af255a3b463c669f4d98b88ad99aca8754 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Thu, 29 Dec 2022 11:54:29 +0600 Subject: [PATCH 085/285] Fix typo --- src/qt/qt_mainwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index 6b9c75ba4..1c2ae6097 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -2099,7 +2099,7 @@ MainWindow::on_actionAbout_86Box_triggered() #ifdef EMU_GIT_HASH githash = QString(" [%1]").arg(EMU_GIT_HASH); #endif - githash.append(QString(" [%1]").arg(QSysInfo::buildCpuArchitecture()); + githash.append(QString(" [%1]").arg(QSysInfo::buildCpuArchitecture())); msgBox.setText(QString("%3%1%2").arg(EMU_VERSION_FULL, githash, tr("86Box v"))); msgBox.setInformativeText(tr("An emulator of old computers\n\nAuthors: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, Tiseno100, reenigne, 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"); From 7ec2a1c1488196b095606f70da24a096d0a2625b Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Thu, 29 Dec 2022 21:59:00 -0500 Subject: [PATCH 086/285] Use doubles as requested --- src/printer/prt_escp.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/printer/prt_escp.c b/src/printer/prt_escp.c index b2827e3f9..e7c9e0442 100644 --- a/src/printer/prt_escp.c +++ b/src/printer/prt_escp.c @@ -444,16 +444,16 @@ fill_palette(uint8_t redmax, uint8_t greenmax, uint8_t bluemax, uint8_t colorID, uint8_t colormask; int i; - float red = (float) redmax / (float) 30.9; - float green = (float) greenmax / (float) 30.9; - float blue = (float) bluemax / (float) 30.9; + double red = (double) redmax / (double) 30.9; + double green = (double) greenmax / (double) 30.9; + double blue = (double) bluemax / (double) 30.9; colormask = colorID <<= 5; for (i = 0; i < 32; i++) { - dev->palcol[i + colormask].r = 255 - (uint8_t) floor((double) red * (float) i); - dev->palcol[i + colormask].g = 255 - (uint8_t) floor((double) green * (float) i); - dev->palcol[i + colormask].b = 255 - (uint8_t) floor((double) blue * (float) i); + dev->palcol[i + colormask].r = 255 - (uint8_t) floor(red * (double) i); + dev->palcol[i + colormask].g = 255 - (uint8_t) floor(green * (double) i); + dev->palcol[i + colormask].b = 255 - (uint8_t) floor(blue * (double) i); } } From a2568a6fea1b26c44fb74d1594e15d45514e14fd Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Thu, 29 Dec 2022 21:59:21 -0500 Subject: [PATCH 087/285] Fix building with libvncserver --- mingw32-cmake.log | 492 +++++++++++++++++++++++++++++++++++++++++ src/CMakeLists.txt | 13 +- src/win/Makefile.mingw | 2 +- 3 files changed, 501 insertions(+), 6 deletions(-) create mode 100644 mingw32-cmake.log diff --git a/mingw32-cmake.log b/mingw32-cmake.log new file mode 100644 index 000000000..112fd3327 --- /dev/null +++ b/mingw32-cmake.log @@ -0,0 +1,492 @@ +[1/492] Building C object src/CMakeFiles/86Box.dir/random.c.obj +[2/492] Building C object src/CMakeFiles/86Box.dir/nmi.c.obj +[3/492] Building C object src/CMakeFiles/86Box.dir/log.c.obj +[4/492] Building C object src/CMakeFiles/86Box.dir/apm.c.obj +[5/492] Building C object src/CMakeFiles/86Box.dir/ppi.c.obj +[6/492] Building C object src/CMakeFiles/86Box.dir/ddma.c.obj +[7/492] Building C object src/CMakeFiles/86Box.dir/timer.c.obj +[8/492] Building C object src/CMakeFiles/86Box.dir/mca.c.obj +[9/492] Building C object src/CMakeFiles/86Box.dir/port_6x.c.obj +[10/492] Building C object src/CMakeFiles/86Box.dir/fifo8.c.obj +[11/492] Building C object src/CMakeFiles/86Box.dir/port_92.c.obj +[12/492] Building C object src/CMakeFiles/86Box.dir/io.c.obj +[13/492] Building C object src/CMakeFiles/86Box.dir/usb.c.obj +[14/492] Building C object src/CMakeFiles/86Box.dir/nvr_ps2.c.obj +[15/492] Building C object src/CMakeFiles/86Box.dir/machine_status.c.obj +[16/492] Building C object src/CMakeFiles/vnc.dir/vnc_keymap.c.obj +[17/492] Building C object src/CMakeFiles/86Box.dir/pit_fast.c.obj +[18/492] Building C object src/CMakeFiles/86Box.dir/nvr.c.obj +[19/492] Building C object src/CMakeFiles/86Box.dir/pic.c.obj +[20/492] Building C object src/CMakeFiles/86Box.dir/86box.c.obj +[21/492] Building C object src/CMakeFiles/86Box.dir/pit.c.obj +[22/492] Building C object src/CMakeFiles/86Box.dir/pci.c.obj +[23/492] Building C object src/cdrom/CMakeFiles/cdrom.dir/cdrom_image.c.obj +[24/492] Building C object src/cdrom/CMakeFiles/cdrom.dir/cdrom_mitsumi.c.obj +[25/492] Building C object src/CMakeFiles/86Box.dir/device.c.obj +[26/492] Building C object src/chipset/CMakeFiles/chipset.dir/82c100.c.obj +[27/492] Building C object src/chipset/CMakeFiles/chipset.dir/acc2168.c.obj +[28/492] Building C object src/CMakeFiles/86Box.dir/ini.c.obj +[29/492] Building C object src/CMakeFiles/86Box.dir/nvr_at.c.obj +[30/492] Building C object src/chipset/CMakeFiles/chipset.dir/ali1429.c.obj +[31/492] Building C object src/chipset/CMakeFiles/chipset.dir/cs8230.c.obj +[32/492] Building C object src/CMakeFiles/86Box.dir/dma.c.obj +[33/492] Building C object src/chipset/CMakeFiles/chipset.dir/ali1531.c.obj +[34/492] Building C object src/CMakeFiles/86Box.dir/acpi.c.obj +[35/492] Building C object src/chipset/CMakeFiles/chipset.dir/ali1489.c.obj +[36/492] Building C object src/chipset/CMakeFiles/chipset.dir/intel_82335.c.obj +[37/492] Building C object src/chipset/CMakeFiles/chipset.dir/cs4031.c.obj +[38/492] Building C object src/chipset/CMakeFiles/chipset.dir/ali1541.c.obj +[39/492] Building C object src/chipset/CMakeFiles/chipset.dir/contaq_82c59x.c.obj +[40/492] Building C object src/chipset/CMakeFiles/chipset.dir/ali6117.c.obj +[41/492] Building C object src/CMakeFiles/86Box.dir/discord.c.obj +[42/492] Building C object src/chipset/CMakeFiles/chipset.dir/__/ioapic.c.obj +[43/492] Building C object src/chipset/CMakeFiles/chipset.dir/ims8848.c.obj +[44/492] Building C object src/chipset/CMakeFiles/chipset.dir/ali1621.c.obj +[45/492] Building C object src/cdrom/CMakeFiles/cdrom.dir/cdrom_image_backend.c.obj +[46/492] Building C object src/chipset/CMakeFiles/chipset.dir/intel_420ex.c.obj +[47/492] Building C object src/chipset/CMakeFiles/chipset.dir/headland.c.obj +[48/492] Building C object src/chipset/CMakeFiles/chipset.dir/intel_sio.c.obj +[49/492] Building C object src/cdrom/CMakeFiles/cdrom.dir/cdrom.c.obj +[50/492] Building CXX object src/CMakeFiles/86Box.dir/thread.cpp.obj +[51/492] Building C object src/chipset/CMakeFiles/chipset.dir/opti291.c.obj +[52/492] Building C object src/chipset/CMakeFiles/chipset.dir/opti391.c.obj +[53/492] Building C object src/chipset/CMakeFiles/chipset.dir/neat.c.obj +[54/492] Building C object src/chipset/CMakeFiles/chipset.dir/opti495.c.obj +[55/492] Building C object src/CMakeFiles/vnc.dir/vnc.c.obj +[56/492] Building C object src/chipset/CMakeFiles/chipset.dir/opti283.c.obj +[57/492] Building C object src/chipset/CMakeFiles/chipset.dir/ali1543.c.obj +[58/492] Building C object src/chipset/CMakeFiles/chipset.dir/opti5x7.c.obj +[59/492] Building C object src/chipset/CMakeFiles/chipset.dir/opti895.c.obj +[60/492] Building C object src/chipset/CMakeFiles/chipset.dir/sis_85c310.c.obj +[61/492] Building C object src/chipset/CMakeFiles/chipset.dir/intel_i450kx.c.obj +[62/492] Building C object src/CMakeFiles/86Box.dir/config.c.obj +[63/492] Building C object src/chipset/CMakeFiles/chipset.dir/opti822.c.obj +[64/492] Building C object src/cdrom/CMakeFiles/cdrom.dir/cdrom_image_viso.c.obj +[65/492] Building C object src/chipset/CMakeFiles/chipset.dir/sis_85c50x.c.obj +[66/492] Building C object src/chipset/CMakeFiles/chipset.dir/sis_85c4xx.c.obj +[67/492] Building C object src/chipset/CMakeFiles/chipset.dir/via_vt82c505.c.obj +[68/492] Building C object src/chipset/CMakeFiles/chipset.dir/intel_4x0.c.obj +[69/492] Building C object src/chipset/CMakeFiles/chipset.dir/gc100.c.obj +[70/492] Building C object src/chipset/CMakeFiles/chipset.dir/olivetti_eva.c.obj +[71/492] Building C object src/chipset/CMakeFiles/chipset.dir/via_vt82c49x.c.obj +[72/492] Building C object src/chipset/CMakeFiles/chipset.dir/vl82c480.c.obj +[73/492] Building C object src/chipset/CMakeFiles/chipset.dir/umc_8886.c.obj +[74/492] Building C object src/chipset/CMakeFiles/chipset.dir/sis_5571.c.obj +[75/492] Building C object src/cpu/CMakeFiles/cpu.dir/cpu_table.c.obj +[76/492] Building C object src/chipset/CMakeFiles/chipset.dir/sis_85c496.c.obj +[77/492] Building C object src/chipset/CMakeFiles/chipset.dir/umc_hb4.c.obj +[78/492] Building C object src/chipset/CMakeFiles/chipset.dir/scamp.c.obj +[79/492] Building C object src/chipset/CMakeFiles/chipset.dir/sis_5511.c.obj +[80/492] Building C object src/cpu/CMakeFiles/cpu.dir/fpu.c.obj +[81/492] Building C object src/chipset/CMakeFiles/chipset.dir/wd76c10.c.obj +[82/492] Building C object src/chipset/CMakeFiles/chipset.dir/intel_piix.c.obj +[83/492] Building C object src/cpu/CMakeFiles/cpu.dir/x87_timings.c.obj +[84/492] Building C object src/cpu/CMakeFiles/cpu.dir/x86.c.obj +[85/492] Building C object src/cpu/CMakeFiles/cpu.dir/x87.c.obj +[86/492] Building C object src/chipset/CMakeFiles/chipset.dir/via_apollo.c.obj +[87/492] Building C object src/cpu/CMakeFiles/cgt.dir/codegen_timing_common.c.obj +[88/492] Building C object src/cpu/CMakeFiles/cpu.dir/8080.c.obj +[89/492] Building C object src/chipset/CMakeFiles/chipset.dir/stpc.c.obj +[90/492] Building C object src/cpu/CMakeFiles/cgt.dir/codegen_timing_486.c.obj +[91/492] Building C object src/codegen/CMakeFiles/dynarec.dir/codegen.c.obj +[92/492] Building C object src/cpu/CMakeFiles/cpu.dir/386.c.obj +[93/492] Building C object src/cpu/CMakeFiles/cgt.dir/codegen_timing_686.c.obj +[94/492] Building C object src/chipset/CMakeFiles/chipset.dir/scat.c.obj +[95/492] Building C object src/cpu/CMakeFiles/cgt.dir/codegen_timing_winchip.c.obj +[96/492] Building C object src/codegen/CMakeFiles/dynarec.dir/codegen_accumulate_x86.c.obj +[97/492] Building C object src/device/CMakeFiles/dev.dir/bugger.c.obj +[98/492] Building C object src/cpu/CMakeFiles/cgt.dir/codegen_timing_k6.c.obj +[99/492] Building C object src/device/CMakeFiles/dev.dir/cartridge.c.obj +[100/492] Building C object src/device/CMakeFiles/dev.dir/hwm.c.obj +[101/492] Building C object src/cpu/CMakeFiles/cgt.dir/codegen_timing_winchip2.c.obj +[102/492] Building C object src/cpu/CMakeFiles/cgt.dir/codegen_timing_p6.c.obj +[103/492] Building C object src/device/CMakeFiles/dev.dir/hasp.c.obj +[104/492] Building C object src/cpu/CMakeFiles/cgt.dir/codegen_timing_pentium.c.obj +[105/492] Building C object src/chipset/CMakeFiles/chipset.dir/via_pipc.c.obj +[106/492] Building C object src/device/CMakeFiles/dev.dir/hwm_lm75.c.obj +[107/492] Building C object src/device/CMakeFiles/dev.dir/hwm_vt82c686.c.obj +[108/492] Building C object src/device/CMakeFiles/dev.dir/hwm_gl518sm.c.obj +[109/492] Building C object src/device/CMakeFiles/dev.dir/ibm_5161.c.obj +[110/492] Building C object src/device/CMakeFiles/dev.dir/cassette.c.obj +[111/492] Building C object src/device/CMakeFiles/dev.dir/postcard.c.obj +[112/492] Building C object src/device/CMakeFiles/dev.dir/__/lpt.c.obj +[113/492] Building C object src/device/CMakeFiles/dev.dir/pci_bridge.c.obj +[114/492] Building C object src/device/CMakeFiles/dev.dir/isamem.c.obj +[115/492] Building C object src/device/CMakeFiles/dev.dir/hwm_lm78.c.obj +[116/492] Building C object src/device/CMakeFiles/dev.dir/clock_ics9xxx.c.obj +[117/492] Building C object src/device/CMakeFiles/dev.dir/i2c.c.obj +[118/492] Building C object src/device/CMakeFiles/dev.dir/i2c_gpio.c.obj +[119/492] Building C object src/device/CMakeFiles/dev.dir/isartc.c.obj +[120/492] Building C object src/cpu/CMakeFiles/cpu.dir/386_common.c.obj +[121/492] Building C object src/device/CMakeFiles/dev.dir/smbus_ali7101.c.obj +[122/492] Building C object src/device/CMakeFiles/dev.dir/smbus_piix4.c.obj +[123/492] Building C object src/device/CMakeFiles/dev.dir/keyboard.c.obj +[124/492] Building C object src/device/CMakeFiles/dev.dir/serial.c.obj +[125/492] Building C object src/cpu/CMakeFiles/cpu.dir/cpu.c.obj +[126/492] Building C object src/disk/CMakeFiles/hdd.dir/hdd_table.c.obj +[127/492] Building C object src/device/CMakeFiles/dev.dir/mouse.c.obj +[128/492] Building C object src/device/CMakeFiles/dev.dir/phoenix_486_jumper.c.obj +[129/492] Building C object src/device/CMakeFiles/dev.dir/isapnp.c.obj +[130/492] Building C object src/device/CMakeFiles/dev.dir/keyboard_xt.c.obj +[131/492] Building C object src/disk/CMakeFiles/hdd.dir/hdc.c.obj +[132/492] Building C object src/device/CMakeFiles/dev.dir/mouse_ps2.c.obj +[133/492] Building C object src/device/CMakeFiles/dev.dir/mouse_bus.c.obj +[134/492] Building C object src/disk/CMakeFiles/hdd.dir/hdd.c.obj +[135/492] Building C object src/cpu/CMakeFiles/cpu.dir/x86seg.c.obj +[136/492] Building C object src/disk/CMakeFiles/hdd.dir/hdc_xtide.c.obj +[137/492] Building C object src/device/CMakeFiles/dev.dir/mouse_serial.c.obj +[138/492] Building C object src/disk/CMakeFiles/hdd.dir/hdc_st506_at.c.obj +[139/492] Building C object src/disk/CMakeFiles/hdd.dir/hdc_ide_opti611.c.obj +[140/492] Building C object src/disk/CMakeFiles/hdd.dir/hdd_image.c.obj +[141/492] Building C object src/disk/CMakeFiles/hdd.dir/hdc_ide_cmd646.c.obj +[142/492] Building C object src/disk/CMakeFiles/hdd.dir/hdc_esdi_at.c.obj +[143/492] Building C object src/disk/CMakeFiles/hdd.dir/hdc_ide_cmd640.c.obj +[144/492] Building C object src/disk/CMakeFiles/hdd.dir/hdc_ide_sff8038i.c.obj +[145/492] Building C object src/disk/CMakeFiles/hdd.dir/hdc_xta.c.obj +[146/492] Building C object src/disk/CMakeFiles/hdd.dir/hdc_esdi_mca.c.obj +[147/492] Building C object src/device/CMakeFiles/dev.dir/keyboard_at.c.obj +[148/492] Building C object src/disk/minivhd/CMakeFiles/minivhd.dir/minivhd_convert.c.obj +[149/492] Building C object src/disk/CMakeFiles/hdd.dir/hdc_st506_xt.c.obj +[150/492] Building C object src/disk/minivhd/CMakeFiles/minivhd.dir/libxml2_encoding.c.obj +[151/492] Building C object src/disk/minivhd/CMakeFiles/minivhd.dir/minivhd_io.c.obj +[152/492] Building C object src/floppy/CMakeFiles/fdd.dir/fdc_magitronic.c.obj +[153/492] Building C object src/disk/minivhd/CMakeFiles/minivhd.dir/minivhd_struct_rw.c.obj +[154/492] Building C object src/floppy/CMakeFiles/fdd.dir/fdc_monster.c.obj +[155/492] Building C object src/floppy/CMakeFiles/fdd.dir/fdc_pii15xb.c.obj +[156/492] Building C object src/disk/minivhd/CMakeFiles/minivhd.dir/minivhd_create.c.obj +[157/492] Building C object src/disk/minivhd/CMakeFiles/minivhd.dir/minivhd_manage.c.obj +[158/492] Building C object src/disk/minivhd/CMakeFiles/minivhd.dir/minivhd_util.c.obj +[159/492] Building C object src/floppy/CMakeFiles/fdd.dir/fdd_common.c.obj +[160/492] Building C object src/disk/minivhd/CMakeFiles/minivhd.dir/cwalk.c.obj +[161/492] Building C object src/floppy/CMakeFiles/fdd.dir/fdd.c.obj +[162/492] Building C object src/codegen/CMakeFiles/dynarec.dir/codegen_x86.c.obj +[163/492] Building C object src/floppy/CMakeFiles/fdd.dir/fdd_fdi.c.obj +[164/492] Building C object src/game/CMakeFiles/game.dir/joystick_ch_flightstick_pro.c.obj +[165/492] Building C object src/game/CMakeFiles/game.dir/joystick_standard.c.obj +[166/492] Building C object src/floppy/CMakeFiles/fdd.dir/fdd_mfm.c.obj +[167/492] Building C object src/game/CMakeFiles/game.dir/joystick_tm_fcs.c.obj +[168/492] Building C object src/game/CMakeFiles/game.dir/gameport.c.obj +[169/492] Building C object src/disk/CMakeFiles/zip.dir/zip.c.obj +[170/492] Linking C static library src\disk\minivhd\libminivhd.a +[171/492] Building C object src/game/CMakeFiles/game.dir/joystick_sw_pad.c.obj +[172/492] Building C object src/machine/CMakeFiles/mch.dir/machine.c.obj +[173/492] Building C object src/floppy/CMakeFiles/fdd.dir/fdd_json.c.obj +[174/492] Building C object src/machine/CMakeFiles/mch.dir/m_xt_compaq.c.obj +[175/492] Building C object src/floppy/CMakeFiles/fdd.dir/fdd_imd.c.obj +[176/492] Building C object src/machine/CMakeFiles/mch.dir/m_xt_philips.c.obj +[177/492] Building C object src/machine/CMakeFiles/mch.dir/machine_table.c.obj +[178/492] Building C object src/floppy/CMakeFiles/fdd.dir/fdd_img.c.obj +[179/492] Building C object src/machine/CMakeFiles/mch.dir/m_xt_xi8088.c.obj +[180/492] Building C object src/machine/CMakeFiles/mch.dir/m_xt_zenith.c.obj +[181/492] Building C object src/machine/CMakeFiles/mch.dir/m_xt.c.obj +[182/492] Building C object src/floppy/CMakeFiles/fdd.dir/fdd_td0.c.obj +[183/492] Building C object src/disk/CMakeFiles/hdd.dir/hdc_ide.c.obj +[184/492] Building C object src/machine/CMakeFiles/mch.dir/m_elt.c.obj +[185/492] Building C object src/machine/CMakeFiles/mch.dir/m_v86p.c.obj +[186/492] Building C object src/floppy/CMakeFiles/fdd.dir/fdc.c.obj +[187/492] Building C object src/machine/CMakeFiles/mch.dir/m_europc.c.obj +[188/492] Building C object src/machine/CMakeFiles/mch.dir/m_at_commodore.c.obj +[189/492] Building C object src/machine/CMakeFiles/mch.dir/m_at.c.obj +[190/492] Building C object src/machine/CMakeFiles/mch.dir/m_xt_t1000_vid.c.obj +[191/492] Building C object src/machine/CMakeFiles/mch.dir/m_xt_t1000.c.obj +[192/492] Building C object src/floppy/CMakeFiles/fdd.dir/fdi2raw.c.obj +[193/492] Building C object src/machine/CMakeFiles/mch.dir/m_ps2_isa.c.obj +[194/492] Building C object src/machine/CMakeFiles/mch.dir/m_ps1.c.obj +[195/492] Building C object src/disk/CMakeFiles/mo.dir/mo.c.obj +[196/492] Building C object src/machine/CMakeFiles/mch.dir/m_pcjr.c.obj +[197/492] Building C object src/machine/CMakeFiles/mch.dir/m_at_t3100e.c.obj +[198/492] Building C object src/cpu/CMakeFiles/cpu.dir/808x.c.obj +[199/492] Building C object src/machine/CMakeFiles/mch.dir/m_at_socket4.c.obj +[200/492] Building C object src/machine/CMakeFiles/mch.dir/m_xt_olivetti.c.obj +[201/492] Building C object src/machine/CMakeFiles/mch.dir/m_at_socket5.c.obj +[202/492] Building C object src/machine/CMakeFiles/mch.dir/m_ps1_hdc.c.obj +[203/492] Building C object src/machine/CMakeFiles/mch.dir/m_at_t3100e_vid.c.obj +[204/492] Building C object src/machine/CMakeFiles/mch.dir/m_at_286_386sx.c.obj +[205/492] Building C object src/machine/CMakeFiles/mch.dir/m_at_slot2.c.obj +[206/492] Building C object src/machine/CMakeFiles/mch.dir/m_at_sockets7.c.obj +[207/492] Building C object src/machine/CMakeFiles/mch.dir/m_at_socket8.c.obj +[208/492] Building C object src/machine/CMakeFiles/mch.dir/m_tandy.c.obj +[209/492] Building C object src/machine/CMakeFiles/mch.dir/m_at_socket7_3v.c.obj +[210/492] Building C object src/machine/CMakeFiles/mch.dir/m_at_misc.c.obj +[211/492] Building C object src/machine/CMakeFiles/mch.dir/m_at_socket370.c.obj +[212/492] Building C object src/machine/CMakeFiles/mch.dir/m_at_compaq.c.obj +[213/492] Building C object src/machine/CMakeFiles/mch.dir/m_ps2_mca.c.obj +[214/492] Building C object src/machine/CMakeFiles/mch.dir/m_xt_laserxt.c.obj +[215/492] Building C object src/mem/CMakeFiles/mem.dir/i2c_eeprom.c.obj +[216/492] Building C object src/mem/CMakeFiles/mem.dir/catalyst_flash.c.obj +[217/492] Building C object src/machine/CMakeFiles/mch.dir/m_at_slot1.c.obj +[218/492] Building C object src/machine/CMakeFiles/mch.dir/m_at_socket7.c.obj +[219/492] Building C object src/machine/CMakeFiles/mch.dir/m_amstrad.c.obj +[220/492] Building C object src/floppy/CMakeFiles/fdd.dir/fdd_86f.c.obj +[221/492] Building C object src/machine/CMakeFiles/mch.dir/m_at_386dx_486.c.obj +[222/492] Building C object src/mem/CMakeFiles/mem.dir/intel_flash.c.obj +[223/492] Building C object src/mem/CMakeFiles/mem.dir/smram.c.obj +[224/492] Building C object src/mem/CMakeFiles/mem.dir/sst_flash.c.obj +[225/492] Building C object src/mem/CMakeFiles/mem.dir/spd.c.obj +[226/492] Building C object src/network/CMakeFiles/net.dir/net_3c503.c.obj +[227/492] Building C object src/mem/CMakeFiles/mem.dir/rom.c.obj +[228/492] Building C object src/network/CMakeFiles/net.dir/net_plip.c.obj +[229/492] Building C object src/network/CMakeFiles/net.dir/net_pcap.c.obj +[230/492] Building C object src/network/CMakeFiles/net.dir/net_3c501.c.obj +[231/492] Building C object src/network/CMakeFiles/net.dir/net_event.c.obj +[232/492] Building C object src/network/CMakeFiles/net.dir/net_dp8390.c.obj +[233/492] Building C object src/network/CMakeFiles/net.dir/net_wd8003.c.obj +[234/492] Building C object src/network/CMakeFiles/net.dir/net_ne2000.c.obj +[235/492] Building C object src/network/CMakeFiles/net.dir/network.c.obj +[236/492] Building C object src/network/CMakeFiles/net.dir/net_slirp.c.obj +[237/492] Building C object src/network/slirp/CMakeFiles/slirp.dir/arp_table.c.obj +[238/492] Building C object src/mem/CMakeFiles/mem.dir/mem.c.obj +[239/492] Building C object src/network/slirp/CMakeFiles/slirp.dir/cksum.c.obj +[240/492] Building C object src/network/slirp/CMakeFiles/slirp.dir/bootp.c.obj +[241/492] Building C object src/network/slirp/CMakeFiles/slirp.dir/if.c.obj +[242/492] Building C object src/network/slirp/CMakeFiles/slirp.dir/ip_output.c.obj +[243/492] Building C object src/network/slirp/CMakeFiles/slirp.dir/dnssearch.c.obj +[244/492] Building C object src/network/slirp/CMakeFiles/slirp.dir/ip_icmp.c.obj +[245/492] Building C object src/network/slirp/CMakeFiles/slirp.dir/ip_input.c.obj +[246/492] Building C object src/network/slirp/CMakeFiles/slirp.dir/sbuf.c.obj +[247/492] Building C object src/network/slirp/CMakeFiles/slirp.dir/mbuf.c.obj +[248/492] Building C object src/network/slirp/CMakeFiles/slirp.dir/tinyglib.c.obj +[249/492] Building C object src/network/slirp/CMakeFiles/slirp.dir/misc.c.obj +[250/492] Building C object src/printer/CMakeFiles/print.dir/prt_cpmap.c.obj +[251/492] Building C object src/printer/CMakeFiles/print.dir/png.c.obj +[252/492] Building C object src/network/slirp/CMakeFiles/slirp.dir/tcp_output.c.obj +[253/492] Building C object src/codegen/CMakeFiles/dynarec.dir/codegen_ops.c.obj +[254/492] Building C object src/sio/CMakeFiles/sio.dir/sio_acc3221.c.obj +[255/492] Building C object src/printer/CMakeFiles/print.dir/prt_text.c.obj +[256/492] Building C object src/printer/CMakeFiles/print.dir/prt_ps.c.obj +[257/492] Building C object src/network/slirp/CMakeFiles/slirp.dir/socket.c.obj +[258/492] Building C object src/sio/CMakeFiles/sio.dir/sio_f82c710.c.obj +[259/492] Building C object src/sio/CMakeFiles/sio.dir/sio_ali5123.c.obj +[260/492] Building C object src/network/CMakeFiles/net.dir/net_pcnet.c.obj +[261/492] Building C object src/network/slirp/CMakeFiles/slirp.dir/tcp_input.c.obj +[262/492] Building C object src/sio/CMakeFiles/sio.dir/sio_fdc37c6xx.c.obj +[263/492] Building C object src/network/slirp/CMakeFiles/slirp.dir/slirp.c.obj +[264/492] Building C object src/sio/CMakeFiles/sio.dir/sio_82091aa.c.obj +[265/492] Building C object src/sio/CMakeFiles/sio.dir/sio_fdc37c669.c.obj +[266/492] Building C object src/network/slirp/CMakeFiles/slirp.dir/tcp_subr.c.obj +[267/492] Building C object src/sio/CMakeFiles/sio.dir/sio_fdc37c67x.c.obj +[268/492] Building C object src/sio/CMakeFiles/sio.dir/sio_fdc37m60x.c.obj +[269/492] Building C object src/sio/CMakeFiles/sio.dir/sio_it8661f.c.obj +[270/492] Building C object src/network/slirp/CMakeFiles/slirp.dir/version.c.obj +[271/492] Building C object src/network/slirp/CMakeFiles/slirp.dir/tcp_timer.c.obj +[272/492] Building C object src/sio/CMakeFiles/sio.dir/sio_pc87306.c.obj +[273/492] Building C object src/sio/CMakeFiles/sio.dir/sio_pc87310.c.obj +[274/492] Building C object src/sio/CMakeFiles/sio.dir/sio_pc87311.c.obj +[275/492] Building C object src/sio/CMakeFiles/sio.dir/sio_prime3b.c.obj +[276/492] Building C object src/sio/CMakeFiles/sio.dir/sio_pc87307.c.obj +[277/492] Building C object src/network/slirp/CMakeFiles/slirp.dir/udp.c.obj +[278/492] Building C object src/sio/CMakeFiles/sio.dir/sio_pc87332.c.obj +[279/492] Building C object src/sio/CMakeFiles/sio.dir/sio_pc87309.c.obj +[280/492] Building C object src/network/slirp/CMakeFiles/slirp.dir/util.c.obj +[281/492] Building C object src/sio/CMakeFiles/sio.dir/sio_detect.c.obj +[282/492] Building C object src/sio/CMakeFiles/sio.dir/sio_prime3c.c.obj +[283/492] Building C object src/sio/CMakeFiles/sio.dir/sio_fdc37c93x.c.obj +[284/492] Building C object src/scsi/CMakeFiles/scsi.dir/scsi.c.obj +[285/492] Building C object src/sio/CMakeFiles/sio.dir/sio_um8669f.c.obj +[286/492] Building C object src/sio/CMakeFiles/sio.dir/sio_w83787f.c.obj +[287/492] Building C object src/sio/CMakeFiles/sio.dir/sio_vt82c686.c.obj +[288/492] Building C object src/sio/CMakeFiles/sio.dir/sio_w83877f.c.obj +[289/492] Building C object src/scsi/CMakeFiles/scsi.dir/scsi_device.c.obj +[290/492] Building C object src/printer/CMakeFiles/print.dir/prt_escp.c.obj +[291/492] Building C object src/sio/CMakeFiles/sio.dir/sio_w83977f.c.obj +[292/492] Building C object src/sound/CMakeFiles/snd.dir/snd_opl.c.obj +[293/492] Linking C static library src\network\slirp\libslirp.a +[294/492] Building C object src/sound/CMakeFiles/snd.dir/snd_speaker.c.obj +[295/492] Building C object src/sound/CMakeFiles/snd.dir/snd_lpt_dac.c.obj +[296/492] Building C object src/sound/CMakeFiles/snd.dir/sound.c.obj +[297/492] Building CXX object src/sound/CMakeFiles/snd.dir/snd_resid.cc.obj +[298/492] Building C object src/sound/CMakeFiles/snd.dir/snd_pssj.c.obj +[299/492] Building C object src/scsi/CMakeFiles/scsi.dir/scsi_aha154x.c.obj +[300/492] Building C object src/sound/CMakeFiles/snd.dir/midi.c.obj +[301/492] Building C object src/sound/CMakeFiles/snd.dir/snd_lpt_dss.c.obj +[302/492] Building C object src/scsi/CMakeFiles/scsi.dir/scsi_disk.c.obj +[303/492] Building C object src/sound/CMakeFiles/snd.dir/snd_ps1.c.obj +[304/492] Building C object src/scsi/CMakeFiles/scsi.dir/scsi_spock.c.obj +[305/492] Building C object src/sound/CMakeFiles/snd.dir/snd_adlib.c.obj +[306/492] Building C object src/sound/CMakeFiles/snd.dir/snd_ac97_codec.c.obj +[307/492] Building C object src/sound/CMakeFiles/snd.dir/snd_ac97_via.c.obj +[308/492] Building C object src/scsi/CMakeFiles/scsi.dir/scsi_buslogic.c.obj +[309/492] Building C object src/sound/CMakeFiles/snd.dir/snd_opl_nuked.c.obj +[310/492] Building C object src/scsi/CMakeFiles/scsi.dir/scsi_ncr5380.c.obj +[311/492] Building C object src/sound/CMakeFiles/snd.dir/snd_cms.c.obj +[312/492] Building C object src/scsi/CMakeFiles/scsi.dir/scsi_x54x.c.obj +[313/492] Building C object src/scsi/CMakeFiles/scsi.dir/scsi_pcscsi.c.obj +[314/492] Building C object src/sound/CMakeFiles/snd.dir/snd_ad1848.c.obj +[315/492] Building C object src/sound/CMakeFiles/snd.dir/snd_ssi2001.c.obj +[316/492] Building C object src/sound/CMakeFiles/snd.dir/snd_ym7128.c.obj +[317/492] Building C object src/sound/CMakeFiles/snd.dir/snd_azt2316a.c.obj +[318/492] Building C object src/sound/CMakeFiles/snd.dir/snd_wss.c.obj +[319/492] Building C object src/sound/CMakeFiles/snd.dir/snd_adlibgold.c.obj +[320/492] Building C object src/sound/CMakeFiles/snd.dir/snd_sn76489.c.obj +[321/492] Building C object src/scsi/CMakeFiles/scsi.dir/scsi_cdrom.c.obj +[322/492] Building C object src/scsi/CMakeFiles/scsi.dir/scsi_ncr53c8xx.c.obj +[323/492] Building C object src/sound/CMakeFiles/snd.dir/snd_cs423x.c.obj +[324/492] Building C object src/sound/CMakeFiles/snd.dir/openal.c.obj +[325/492] Building C object src/sound/CMakeFiles/snd.dir/snd_optimc.c.obj +[326/492] Building C object src/sound/CMakeFiles/snd.dir/snd_gus.c.obj +[327/492] Building C object src/sound/CMakeFiles/snd.dir/snd_cmi8x38.c.obj +[328/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/LA32Ramp.cpp.obj +[329/492] Building C object src/sound/CMakeFiles/snd.dir/snd_audiopci.c.obj +[330/492] Building C object src/sound/CMakeFiles/snd.dir/midi_fluidsynth.c.obj +[331/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/File.cpp.obj +[332/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/Display.cpp.obj +[333/492] Building C object src/sound/CMakeFiles/snd.dir/midi_mt32.c.obj +[334/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/LA32FloatWaveGenerator.cpp.obj +[335/492] Building C object src/sound/CMakeFiles/snd.dir/snd_sb_dsp.c.obj +[336/492] Building C object src/sound/CMakeFiles/snd.dir/snd_pas16.c.obj +[337/492] Building C object src/sound/CMakeFiles/snd.dir/snd_mpu401.c.obj +[338/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/Analog.cpp.obj +[339/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/Poly.cpp.obj +[340/492] Building C object src/sound/CMakeFiles/snd.dir/snd_emu8k.c.obj +[341/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/LA32WaveGenerator.cpp.obj +[342/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/SampleRateConverter.cpp.obj +[343/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/PartialManager.cpp.obj +[344/492] Building C object src/sound/CMakeFiles/snd.dir/snd_sb.c.obj +[345/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/MidiStreamParser.cpp.obj +[346/492] Building CXX object src/sound/CMakeFiles/snd.dir/snd_opl_ymfm.cpp.obj +[347/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/srchelper/srctools/src/FIRResampler.cpp.obj +[348/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/Partial.cpp.obj +[349/492] Building CXX object src/sound/CMakeFiles/snd.dir/midi_rtmidi.cpp.obj +[350/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/srchelper/srctools/src/LinearResampler.cpp.obj +[351/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/ROMInfo.cpp.obj +[352/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/FileStream.cpp.obj +[353/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/srchelper/InternalResampler.cpp.obj +[354/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/srchelper/srctools/src/IIR2xResampler.cpp.obj +[355/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/srchelper/srctools/src/SincResampler.cpp.obj +[356/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/srchelper/srctools/src/ResamplerModel.cpp.obj +[357/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/Tables.cpp.obj +[358/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/BReverbModel.cpp.obj +[359/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/TVF.cpp.obj +[360/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/sha1/sha1.cpp.obj +[361/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/Part.cpp.obj +[362/492] Building CXX object src/sound/resid-fp/CMakeFiles/resid-fp.dir/envelope.cc.obj +[363/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/TVA.cpp.obj +[364/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/TVP.cpp.obj +[365/492] Building CXX object src/sound/resid-fp/CMakeFiles/resid-fp.dir/convolve.cc.obj +[366/492] Building CXX object src/sound/resid-fp/CMakeFiles/resid-fp.dir/pot.cc.obj +[367/492] Building CXX object src/sound/resid-fp/CMakeFiles/resid-fp.dir/convolve-sse.cc.obj +[368/492] Building CXX object src/sound/resid-fp/CMakeFiles/resid-fp.dir/extfilt.cc.obj +[369/492] Building CXX object src/sound/resid-fp/CMakeFiles/resid-fp.dir/wave6581_PST.cc.obj +[370/492] Building CXX object src/sound/resid-fp/CMakeFiles/resid-fp.dir/wave6581_P_T.cc.obj +[371/492] Building CXX object src/sound/resid-fp/CMakeFiles/resid-fp.dir/wave6581_PS_.cc.obj +[372/492] Building CXX object src/sound/resid-fp/CMakeFiles/resid-fp.dir/filter.cc.obj +[373/492] Building CXX object src/sound/resid-fp/CMakeFiles/resid-fp.dir/wave6581__ST.cc.obj +[374/492] Building CXX object src/sound/resid-fp/CMakeFiles/resid-fp.dir/wave8580_PS_.cc.obj +[375/492] Building CXX object src/sound/resid-fp/CMakeFiles/resid-fp.dir/wave8580_PST.cc.obj +[376/492] Building CXX object src/sound/resid-fp/CMakeFiles/resid-fp.dir/wave.cc.obj +[377/492] Building CXX object src/sound/resid-fp/CMakeFiles/resid-fp.dir/voice.cc.obj +[378/492] Building CXX object src/sound/resid-fp/CMakeFiles/resid-fp.dir/wave8580_P_T.cc.obj +[379/492] Building CXX object src/sound/resid-fp/CMakeFiles/resid-fp.dir/wave8580__ST.cc.obj +[380/492] Building C object src/video/CMakeFiles/vid.dir/agpgart.c.obj +[381/492] Building CXX object src/sound/ymfm/CMakeFiles/ymfm.dir/ymfm_misc.cpp.obj +[382/492] Building C object src/video/CMakeFiles/vid.dir/vid_table.c.obj +[383/492] Building C object src/video/CMakeFiles/vid.dir/vid_cga_comp.c.obj +[384/492] Building C object src/video/CMakeFiles/vid.dir/vid_mda.c.obj +[385/492] Building CXX object src/sound/resid-fp/CMakeFiles/resid-fp.dir/sid.cc.obj +[386/492] Building C object src/video/CMakeFiles/vid.dir/vid_compaq_cga.c.obj +[387/492] Building C object src/video/CMakeFiles/vid.dir/vid_cga.c.obj +[388/492] Building C object src/video/CMakeFiles/vid.dir/vid_hercules.c.obj +[389/492] Building C object src/video/CMakeFiles/vid.dir/vid_herculesplus.c.obj +[390/492] Building C object src/video/CMakeFiles/vid.dir/vid_colorplus.c.obj +[391/492] Building C object src/video/CMakeFiles/vid.dir/video.c.obj +[392/492] Building C object src/video/CMakeFiles/vid.dir/vid_genius.c.obj +[393/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/c_interface/c_interface.cpp.obj +[394/492] Building C object src/video/CMakeFiles/vid.dir/vid_incolor.c.obj +[395/492] Building CXX object src/sound/ymfm/CMakeFiles/ymfm.dir/ymfm_pcm.cpp.obj +[396/492] Linking CXX static library src\sound\resid-fp\libresid-fp.a +[397/492] Building CXX object src/sound/ymfm/CMakeFiles/ymfm.dir/ymfm_adpcm.cpp.obj +[398/492] Building C object src/video/CMakeFiles/vid.dir/vid_im1024.c.obj +[399/492] Building C object src/video/CMakeFiles/vid.dir/vid_ddc.c.obj +[400/492] Building C object src/video/CMakeFiles/vid.dir/vid_wy700.c.obj +[401/492] Building C object src/video/CMakeFiles/vid.dir/vid_sigma.c.obj +[402/492] Building C object src/video/CMakeFiles/vid.dir/vid_vga.c.obj +[403/492] Building C object src/video/CMakeFiles/vid.dir/vid_ati_eeprom.c.obj +[404/492] Building CXX object src/sound/ymfm/CMakeFiles/ymfm.dir/ymfm_opq.cpp.obj +[405/492] Building CXX object src/sound/ymfm/CMakeFiles/ymfm.dir/ymfm_opm.cpp.obj +[406/492] Building C object src/video/CMakeFiles/vid.dir/vid_ati18800.c.obj +[407/492] Building C object src/video/CMakeFiles/vid.dir/vid_ega_render.c.obj +[408/492] Building C object src/video/CMakeFiles/vid.dir/vid_av9194.c.obj +[409/492] Building C object src/video/CMakeFiles/vid.dir/vid_icd2061.c.obj +[410/492] Building C object src/video/CMakeFiles/vid.dir/vid_ega.c.obj +[411/492] Building C object src/video/CMakeFiles/vid.dir/vid_ati28800.c.obj +[412/492] Building C object src/video/CMakeFiles/vid.dir/vid_ati68860_ramdac.c.obj +[413/492] Building C object src/video/CMakeFiles/vid.dir/vid_ics2494.c.obj +[414/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/Synth.cpp.obj +[415/492] Building C object src/video/CMakeFiles/vid.dir/vid_ics2595.c.obj +[416/492] Building C object src/video/CMakeFiles/vid.dir/vid_bt48x_ramdac.c.obj +[417/492] Building CXX object src/sound/ymfm/CMakeFiles/ymfm.dir/ymfm_opz.cpp.obj +[418/492] Building C object src/video/CMakeFiles/vid.dir/vid_et3000.c.obj +[419/492] Building C object src/video/CMakeFiles/vid.dir/vid_sc1148x_ramdac.c.obj +[420/492] Building C object src/video/CMakeFiles/vid.dir/vid_sc1502x_ramdac.c.obj +[421/492] Building C object src/video/CMakeFiles/vid.dir/vid_svga.c.obj +[422/492] Building C object src/video/CMakeFiles/vid.dir/vid_stg_ramdac.c.obj +[423/492] Building C object src/video/CMakeFiles/vid.dir/vid_pgc.c.obj +[424/492] Building C object src/video/CMakeFiles/vid.dir/vid_ti_cf62011.c.obj +[425/492] Linking CXX static library src\sound\munt\libmt32emu.a +[426/492] Building C object src/video/CMakeFiles/vid.dir/vid_rtg310x.c.obj +[427/492] Building C object src/video/CMakeFiles/vid.dir/vid_et4000.c.obj +[428/492] Building C object src/video/CMakeFiles/vid.dir/vid_oak_oti.c.obj +[429/492] Building C object src/video/CMakeFiles/vid.dir/vid_tkd8001_ramdac.c.obj +[430/492] Building C object src/video/CMakeFiles/vid.dir/vid_att20c49x_ramdac.c.obj +[431/492] Building C object src/video/CMakeFiles/vid.dir/vid_paradise.c.obj +[432/492] Building C object src/video/CMakeFiles/vid.dir/vid_f82c425.c.obj +[433/492] Building C object src/video/CMakeFiles/vid.dir/vid_tvga.c.obj +[434/492] Building C object src/video/CMakeFiles/vid.dir/vid_sdac_ramdac.c.obj +[435/492] Building C object src/video/CMakeFiles/vid.dir/vid_att2xc498_ramdac.c.obj +[436/492] Building C object src/video/CMakeFiles/vid.dir/vid_ht216.c.obj +[437/492] Building C object src/video/CMakeFiles/vid.dir/vid_tvp3026_ramdac.c.obj +[438/492] Building C object src/video/CMakeFiles/vid.dir/vid_svga_render.c.obj +[439/492] Building C object src/video/CMakeFiles/vid.dir/vid_ogc.c.obj +[440/492] Building C object src/video/CMakeFiles/vid.dir/vid_nga.c.obj +[441/492] Building C object src/video/CMakeFiles/vid.dir/vid_ibm_rgb528_ramdac.c.obj +[442/492] Building C object src/video/CMakeFiles/voodoo.dir/vid_voodoo_fifo.c.obj +[443/492] Building C object src/video/CMakeFiles/voodoo.dir/vid_voodoo_blitter.c.obj +[444/492] Building C object src/video/CMakeFiles/voodoo.dir/vid_voodoo.c.obj +[445/492] Building C object src/video/CMakeFiles/voodoo.dir/vid_voodoo_display.c.obj +[446/492] Building C object src/video/CMakeFiles/voodoo.dir/vid_voodoo_fb.c.obj +[447/492] Building C object src/video/CMakeFiles/vid.dir/vid_tgui9440.c.obj +[448/492] Building C object src/video/CMakeFiles/vid.dir/vid_cl54xx.c.obj +[449/492] Building C object src/video/CMakeFiles/vid.dir/vid_et4000w32.c.obj +[450/492] Building C object src/video/CMakeFiles/voodoo.dir/vid_voodoo_reg.c.obj +[451/492] Building C object src/video/CMakeFiles/voodoo.dir/vid_voodoo_setup.c.obj +[452/492] Building C object src/video/CMakeFiles/voodoo.dir/vid_voodoo_banshee_blitter.c.obj +[453/492] Building C object src/video/CMakeFiles/vid.dir/vid_8514a.c.obj +[454/492] Building CXX object src/sound/ymfm/CMakeFiles/ymfm.dir/ymfm_opn.cpp.obj +[455/492] Building C object src/video/CMakeFiles/vid.dir/vid_ati_mach64.c.obj +[456/492] Building C object src/video/CMakeFiles/voodoo.dir/vid_voodoo_texture.c.obj +[457/492] Building C object src/video/CMakeFiles/vid.dir/vid_xga.c.obj +[458/492] Building C object src/video/CMakeFiles/voodoo.dir/vid_voodoo_banshee.c.obj +[459/492] Building C object src/win/CMakeFiles/plat.dir/win_dynld.c.obj +[460/492] Building C object src/video/CMakeFiles/vid.dir/vid_s3_virge.c.obj +[461/492] Building C object src/win/CMakeFiles/plat.dir/win_keyboard.c.obj +[462/492] Building C object src/win/CMakeFiles/plat.dir/win_mouse.c.obj +[463/492] Building C object src/win/CMakeFiles/plat.dir/win_cdrom.c.obj +[464/492] Building C object src/win/CMakeFiles/ui.dir/win_icon.c.obj +[465/492] Building C object src/win/CMakeFiles/ui.dir/win_about.c.obj +[466/492] Building C object src/win/CMakeFiles/plat.dir/win_joystick_rawinput.c.obj +[467/492] Building C object src/video/CMakeFiles/vid.dir/vid_mga.c.obj +[468/492] Building C object src/win/CMakeFiles/ui.dir/win_sdl.c.obj +[469/492] Building C object src/win/CMakeFiles/ui.dir/win_snd_gain.c.obj +[470/492] Building C object src/win/CMakeFiles/ui.dir/win_opengl_glslp.c.obj +[471/492] Building C object src/win/CMakeFiles/ui.dir/win_stbar.c.obj +[472/492] Building C object src/win/CMakeFiles/ui.dir/win_specify_dim.c.obj +[473/492] Building C object src/win/CMakeFiles/ui.dir/win_ui.c.obj +[474/492] Building C object src/win/CMakeFiles/ui.dir/win_devconf.c.obj +[475/492] Building RC object src/win/CMakeFiles/ui.dir/86Box.rc.obj +[476/492] Building C object src/win/CMakeFiles/ui.dir/win_new_floppy.c.obj +[477/492] Building C object src/win/CMakeFiles/ui.dir/win_preferences.c.obj +[478/492] Building C object src/win/CMakeFiles/ui.dir/win_dialog.c.obj +[479/492] Building C object src/win/CMakeFiles/ui.dir/win_jsconf.c.obj +[480/492] Building C object src/win/CMakeFiles/plat.dir/win.c.obj +[481/492] Building C object src/win/CMakeFiles/ui.dir/glad.c.obj +[482/492] Building C object src/win/CMakeFiles/ui.dir/win_toolbar.c.obj +[483/492] Building CXX object src/sound/ymfm/CMakeFiles/ymfm.dir/ymfm_opl.cpp.obj +[484/492] Linking CXX static library src\sound\ymfm\libymfm.a +[485/492] Building C object src/video/CMakeFiles/voodoo.dir/vid_voodoo_render.c.obj +[486/492] Building C object src/video/CMakeFiles/vid.dir/vid_s3.c.obj +[487/492] Building C object src/win/CMakeFiles/ui.dir/win_media_menu.c.obj +[488/492] Building C object src/win/CMakeFiles/ui.dir/win_opengl.c.obj +[489/492] Building C object src/win/CMakeFiles/ui.dir/win_settings.c.obj +[490/492] Building C object src/cpu/CMakeFiles/cpu.dir/386_dynarec_ops.c.obj +[491/492] Building C object src/cpu/CMakeFiles/cpu.dir/386_dynarec.c.obj +[492/492] Linking CXX executable src\86Box.exe diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 94a6f1821..476c27439 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -52,11 +52,14 @@ if(DEV_BRANCH) endif() if(VNC) - add_compile_definitions(USE_VNC) - add_library(vnc OBJECT vnc.c vnc_keymap.c) - target_link_libraries(86Box vnc vncserver) - if(WIN32) - target_link_libraries(86Box ws2_32) + find_package(LibVNCServer) + if(LibVNCServer_FOUND) + add_compile_definitions(USE_VNC) + add_library(vnc OBJECT vnc.c vnc_keymap.c) + target_link_libraries(86Box vnc LibVNCServer::vncserver) + if(WIN32) + target_link_libraries(86Box ws2_32) + endif() endif() endif() diff --git a/src/win/Makefile.mingw b/src/win/Makefile.mingw index 040b14aee..e39792966 100644 --- a/src/win/Makefile.mingw +++ b/src/win/Makefile.mingw @@ -416,7 +416,7 @@ ifeq ($(VNC), y) OPTS += -I$(VNC_PATH)\INCLUDE VNCLIB := -L$(VNC_PATH)\LIB endif - VNCLIB += -lvncserver + VNCLIB += -lvncserver.dll VNCOBJ := vnc.o vnc_keymap.o endif From 4e0f10969f8374ffb6a75d916459631b3bf9a6fb Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Thu, 29 Dec 2022 21:59:28 -0500 Subject: [PATCH 088/285] Use correct case --- .github/workflows/c-cpp.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index 0c4ecd6b7..8987941c1 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -74,7 +74,7 @@ jobs: - uses: actions/checkout@v3 - name: make run: >- - make -fwin/makefile.mingw -j + make -fwin/Makefile.mingw -j DEV_BUILD=${{ matrix.build.dev }} DEBUG=${{ matrix.build.debug }} NEW_DYNAREC=${{ matrix.dynarec.new }} From eb26c1658d25abce8314b8eb17790b51122e4107 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Thu, 29 Dec 2022 22:01:33 -0500 Subject: [PATCH 089/285] VNC=n not needed as it's off by default anyway --- .github/workflows/c-cpp.yml | 1 - .github/workflows/cmake.yml | 1 - 2 files changed, 2 deletions(-) diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index 8987941c1..8899d9943 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -79,7 +79,6 @@ jobs: DEBUG=${{ matrix.build.debug }} NEW_DYNAREC=${{ matrix.dynarec.new }} X64=${{ matrix.environment.x64 }} - VNC=n working-directory: ./src - uses: actions/upload-artifact@v3 with: diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index 6876e83bc..c03b6b2b4 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -100,7 +100,6 @@ jobs: -D CMAKE_INSTALL_PREFIX=./build/artifacts -D QT=${{ matrix.ui.qt }} -D STATIC_BUILD=${{ matrix.ui.static }} - -D VNC=n - name: Build run: cmake --build build - name: Generate package From 4cc21ee2dbb789203f27a03918333503520f62b7 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Thu, 29 Dec 2022 22:10:53 -0500 Subject: [PATCH 090/285] Delete mingw32-cmake.log It was an accidental upload --- mingw32-cmake.log | 492 ---------------------------------------------- 1 file changed, 492 deletions(-) delete mode 100644 mingw32-cmake.log diff --git a/mingw32-cmake.log b/mingw32-cmake.log deleted file mode 100644 index 112fd3327..000000000 --- a/mingw32-cmake.log +++ /dev/null @@ -1,492 +0,0 @@ -[1/492] Building C object src/CMakeFiles/86Box.dir/random.c.obj -[2/492] Building C object src/CMakeFiles/86Box.dir/nmi.c.obj -[3/492] Building C object src/CMakeFiles/86Box.dir/log.c.obj -[4/492] Building C object src/CMakeFiles/86Box.dir/apm.c.obj -[5/492] Building C object src/CMakeFiles/86Box.dir/ppi.c.obj -[6/492] Building C object src/CMakeFiles/86Box.dir/ddma.c.obj -[7/492] Building C object src/CMakeFiles/86Box.dir/timer.c.obj -[8/492] Building C object src/CMakeFiles/86Box.dir/mca.c.obj -[9/492] Building C object src/CMakeFiles/86Box.dir/port_6x.c.obj -[10/492] Building C object src/CMakeFiles/86Box.dir/fifo8.c.obj -[11/492] Building C object src/CMakeFiles/86Box.dir/port_92.c.obj -[12/492] Building C object src/CMakeFiles/86Box.dir/io.c.obj -[13/492] Building C object src/CMakeFiles/86Box.dir/usb.c.obj -[14/492] Building C object src/CMakeFiles/86Box.dir/nvr_ps2.c.obj -[15/492] Building C object src/CMakeFiles/86Box.dir/machine_status.c.obj -[16/492] Building C object src/CMakeFiles/vnc.dir/vnc_keymap.c.obj -[17/492] Building C object src/CMakeFiles/86Box.dir/pit_fast.c.obj -[18/492] Building C object src/CMakeFiles/86Box.dir/nvr.c.obj -[19/492] Building C object src/CMakeFiles/86Box.dir/pic.c.obj -[20/492] Building C object src/CMakeFiles/86Box.dir/86box.c.obj -[21/492] Building C object src/CMakeFiles/86Box.dir/pit.c.obj -[22/492] Building C object src/CMakeFiles/86Box.dir/pci.c.obj -[23/492] Building C object src/cdrom/CMakeFiles/cdrom.dir/cdrom_image.c.obj -[24/492] Building C object src/cdrom/CMakeFiles/cdrom.dir/cdrom_mitsumi.c.obj -[25/492] Building C object src/CMakeFiles/86Box.dir/device.c.obj -[26/492] Building C object src/chipset/CMakeFiles/chipset.dir/82c100.c.obj -[27/492] Building C object src/chipset/CMakeFiles/chipset.dir/acc2168.c.obj -[28/492] Building C object src/CMakeFiles/86Box.dir/ini.c.obj -[29/492] Building C object src/CMakeFiles/86Box.dir/nvr_at.c.obj -[30/492] Building C object src/chipset/CMakeFiles/chipset.dir/ali1429.c.obj -[31/492] Building C object src/chipset/CMakeFiles/chipset.dir/cs8230.c.obj -[32/492] Building C object src/CMakeFiles/86Box.dir/dma.c.obj -[33/492] Building C object src/chipset/CMakeFiles/chipset.dir/ali1531.c.obj -[34/492] Building C object src/CMakeFiles/86Box.dir/acpi.c.obj -[35/492] Building C object src/chipset/CMakeFiles/chipset.dir/ali1489.c.obj -[36/492] Building C object src/chipset/CMakeFiles/chipset.dir/intel_82335.c.obj -[37/492] Building C object src/chipset/CMakeFiles/chipset.dir/cs4031.c.obj -[38/492] Building C object src/chipset/CMakeFiles/chipset.dir/ali1541.c.obj -[39/492] Building C object src/chipset/CMakeFiles/chipset.dir/contaq_82c59x.c.obj -[40/492] Building C object src/chipset/CMakeFiles/chipset.dir/ali6117.c.obj -[41/492] Building C object src/CMakeFiles/86Box.dir/discord.c.obj -[42/492] Building C object src/chipset/CMakeFiles/chipset.dir/__/ioapic.c.obj -[43/492] Building C object src/chipset/CMakeFiles/chipset.dir/ims8848.c.obj -[44/492] Building C object src/chipset/CMakeFiles/chipset.dir/ali1621.c.obj -[45/492] Building C object src/cdrom/CMakeFiles/cdrom.dir/cdrom_image_backend.c.obj -[46/492] Building C object src/chipset/CMakeFiles/chipset.dir/intel_420ex.c.obj -[47/492] Building C object src/chipset/CMakeFiles/chipset.dir/headland.c.obj -[48/492] Building C object src/chipset/CMakeFiles/chipset.dir/intel_sio.c.obj -[49/492] Building C object src/cdrom/CMakeFiles/cdrom.dir/cdrom.c.obj -[50/492] Building CXX object src/CMakeFiles/86Box.dir/thread.cpp.obj -[51/492] Building C object src/chipset/CMakeFiles/chipset.dir/opti291.c.obj -[52/492] Building C object src/chipset/CMakeFiles/chipset.dir/opti391.c.obj -[53/492] Building C object src/chipset/CMakeFiles/chipset.dir/neat.c.obj -[54/492] Building C object src/chipset/CMakeFiles/chipset.dir/opti495.c.obj -[55/492] Building C object src/CMakeFiles/vnc.dir/vnc.c.obj -[56/492] Building C object src/chipset/CMakeFiles/chipset.dir/opti283.c.obj -[57/492] Building C object src/chipset/CMakeFiles/chipset.dir/ali1543.c.obj -[58/492] Building C object src/chipset/CMakeFiles/chipset.dir/opti5x7.c.obj -[59/492] Building C object src/chipset/CMakeFiles/chipset.dir/opti895.c.obj -[60/492] Building C object src/chipset/CMakeFiles/chipset.dir/sis_85c310.c.obj -[61/492] Building C object src/chipset/CMakeFiles/chipset.dir/intel_i450kx.c.obj -[62/492] Building C object src/CMakeFiles/86Box.dir/config.c.obj -[63/492] Building C object src/chipset/CMakeFiles/chipset.dir/opti822.c.obj -[64/492] Building C object src/cdrom/CMakeFiles/cdrom.dir/cdrom_image_viso.c.obj -[65/492] Building C object src/chipset/CMakeFiles/chipset.dir/sis_85c50x.c.obj -[66/492] Building C object src/chipset/CMakeFiles/chipset.dir/sis_85c4xx.c.obj -[67/492] Building C object src/chipset/CMakeFiles/chipset.dir/via_vt82c505.c.obj -[68/492] Building C object src/chipset/CMakeFiles/chipset.dir/intel_4x0.c.obj -[69/492] Building C object src/chipset/CMakeFiles/chipset.dir/gc100.c.obj -[70/492] Building C object src/chipset/CMakeFiles/chipset.dir/olivetti_eva.c.obj -[71/492] Building C object src/chipset/CMakeFiles/chipset.dir/via_vt82c49x.c.obj -[72/492] Building C object src/chipset/CMakeFiles/chipset.dir/vl82c480.c.obj -[73/492] Building C object src/chipset/CMakeFiles/chipset.dir/umc_8886.c.obj -[74/492] Building C object src/chipset/CMakeFiles/chipset.dir/sis_5571.c.obj -[75/492] Building C object src/cpu/CMakeFiles/cpu.dir/cpu_table.c.obj -[76/492] Building C object src/chipset/CMakeFiles/chipset.dir/sis_85c496.c.obj -[77/492] Building C object src/chipset/CMakeFiles/chipset.dir/umc_hb4.c.obj -[78/492] Building C object src/chipset/CMakeFiles/chipset.dir/scamp.c.obj -[79/492] Building C object src/chipset/CMakeFiles/chipset.dir/sis_5511.c.obj -[80/492] Building C object src/cpu/CMakeFiles/cpu.dir/fpu.c.obj -[81/492] Building C object src/chipset/CMakeFiles/chipset.dir/wd76c10.c.obj -[82/492] Building C object src/chipset/CMakeFiles/chipset.dir/intel_piix.c.obj -[83/492] Building C object src/cpu/CMakeFiles/cpu.dir/x87_timings.c.obj -[84/492] Building C object src/cpu/CMakeFiles/cpu.dir/x86.c.obj -[85/492] Building C object src/cpu/CMakeFiles/cpu.dir/x87.c.obj -[86/492] Building C object src/chipset/CMakeFiles/chipset.dir/via_apollo.c.obj -[87/492] Building C object src/cpu/CMakeFiles/cgt.dir/codegen_timing_common.c.obj -[88/492] Building C object src/cpu/CMakeFiles/cpu.dir/8080.c.obj -[89/492] Building C object src/chipset/CMakeFiles/chipset.dir/stpc.c.obj -[90/492] Building C object src/cpu/CMakeFiles/cgt.dir/codegen_timing_486.c.obj -[91/492] Building C object src/codegen/CMakeFiles/dynarec.dir/codegen.c.obj -[92/492] Building C object src/cpu/CMakeFiles/cpu.dir/386.c.obj -[93/492] Building C object src/cpu/CMakeFiles/cgt.dir/codegen_timing_686.c.obj -[94/492] Building C object src/chipset/CMakeFiles/chipset.dir/scat.c.obj -[95/492] Building C object src/cpu/CMakeFiles/cgt.dir/codegen_timing_winchip.c.obj -[96/492] Building C object src/codegen/CMakeFiles/dynarec.dir/codegen_accumulate_x86.c.obj -[97/492] Building C object src/device/CMakeFiles/dev.dir/bugger.c.obj -[98/492] Building C object src/cpu/CMakeFiles/cgt.dir/codegen_timing_k6.c.obj -[99/492] Building C object src/device/CMakeFiles/dev.dir/cartridge.c.obj -[100/492] Building C object src/device/CMakeFiles/dev.dir/hwm.c.obj -[101/492] Building C object src/cpu/CMakeFiles/cgt.dir/codegen_timing_winchip2.c.obj -[102/492] Building C object src/cpu/CMakeFiles/cgt.dir/codegen_timing_p6.c.obj -[103/492] Building C object src/device/CMakeFiles/dev.dir/hasp.c.obj -[104/492] Building C object src/cpu/CMakeFiles/cgt.dir/codegen_timing_pentium.c.obj -[105/492] Building C object src/chipset/CMakeFiles/chipset.dir/via_pipc.c.obj -[106/492] Building C object src/device/CMakeFiles/dev.dir/hwm_lm75.c.obj -[107/492] Building C object src/device/CMakeFiles/dev.dir/hwm_vt82c686.c.obj -[108/492] Building C object src/device/CMakeFiles/dev.dir/hwm_gl518sm.c.obj -[109/492] Building C object src/device/CMakeFiles/dev.dir/ibm_5161.c.obj -[110/492] Building C object src/device/CMakeFiles/dev.dir/cassette.c.obj -[111/492] Building C object src/device/CMakeFiles/dev.dir/postcard.c.obj -[112/492] Building C object src/device/CMakeFiles/dev.dir/__/lpt.c.obj -[113/492] Building C object src/device/CMakeFiles/dev.dir/pci_bridge.c.obj -[114/492] Building C object src/device/CMakeFiles/dev.dir/isamem.c.obj -[115/492] Building C object src/device/CMakeFiles/dev.dir/hwm_lm78.c.obj -[116/492] Building C object src/device/CMakeFiles/dev.dir/clock_ics9xxx.c.obj -[117/492] Building C object src/device/CMakeFiles/dev.dir/i2c.c.obj -[118/492] Building C object src/device/CMakeFiles/dev.dir/i2c_gpio.c.obj -[119/492] Building C object src/device/CMakeFiles/dev.dir/isartc.c.obj -[120/492] Building C object src/cpu/CMakeFiles/cpu.dir/386_common.c.obj -[121/492] Building C object src/device/CMakeFiles/dev.dir/smbus_ali7101.c.obj -[122/492] Building C object src/device/CMakeFiles/dev.dir/smbus_piix4.c.obj -[123/492] Building C object src/device/CMakeFiles/dev.dir/keyboard.c.obj -[124/492] Building C object src/device/CMakeFiles/dev.dir/serial.c.obj -[125/492] Building C object src/cpu/CMakeFiles/cpu.dir/cpu.c.obj -[126/492] Building C object src/disk/CMakeFiles/hdd.dir/hdd_table.c.obj -[127/492] Building C object src/device/CMakeFiles/dev.dir/mouse.c.obj -[128/492] Building C object src/device/CMakeFiles/dev.dir/phoenix_486_jumper.c.obj -[129/492] Building C object src/device/CMakeFiles/dev.dir/isapnp.c.obj -[130/492] Building C object src/device/CMakeFiles/dev.dir/keyboard_xt.c.obj -[131/492] Building C object src/disk/CMakeFiles/hdd.dir/hdc.c.obj -[132/492] Building C object src/device/CMakeFiles/dev.dir/mouse_ps2.c.obj -[133/492] Building C object src/device/CMakeFiles/dev.dir/mouse_bus.c.obj -[134/492] Building C object src/disk/CMakeFiles/hdd.dir/hdd.c.obj -[135/492] Building C object src/cpu/CMakeFiles/cpu.dir/x86seg.c.obj -[136/492] Building C object src/disk/CMakeFiles/hdd.dir/hdc_xtide.c.obj -[137/492] Building C object src/device/CMakeFiles/dev.dir/mouse_serial.c.obj -[138/492] Building C object src/disk/CMakeFiles/hdd.dir/hdc_st506_at.c.obj -[139/492] Building C object src/disk/CMakeFiles/hdd.dir/hdc_ide_opti611.c.obj -[140/492] Building C object src/disk/CMakeFiles/hdd.dir/hdd_image.c.obj -[141/492] Building C object src/disk/CMakeFiles/hdd.dir/hdc_ide_cmd646.c.obj -[142/492] Building C object src/disk/CMakeFiles/hdd.dir/hdc_esdi_at.c.obj -[143/492] Building C object src/disk/CMakeFiles/hdd.dir/hdc_ide_cmd640.c.obj -[144/492] Building C object src/disk/CMakeFiles/hdd.dir/hdc_ide_sff8038i.c.obj -[145/492] Building C object src/disk/CMakeFiles/hdd.dir/hdc_xta.c.obj -[146/492] Building C object src/disk/CMakeFiles/hdd.dir/hdc_esdi_mca.c.obj -[147/492] Building C object src/device/CMakeFiles/dev.dir/keyboard_at.c.obj -[148/492] Building C object src/disk/minivhd/CMakeFiles/minivhd.dir/minivhd_convert.c.obj -[149/492] Building C object src/disk/CMakeFiles/hdd.dir/hdc_st506_xt.c.obj -[150/492] Building C object src/disk/minivhd/CMakeFiles/minivhd.dir/libxml2_encoding.c.obj -[151/492] Building C object src/disk/minivhd/CMakeFiles/minivhd.dir/minivhd_io.c.obj -[152/492] Building C object src/floppy/CMakeFiles/fdd.dir/fdc_magitronic.c.obj -[153/492] Building C object src/disk/minivhd/CMakeFiles/minivhd.dir/minivhd_struct_rw.c.obj -[154/492] Building C object src/floppy/CMakeFiles/fdd.dir/fdc_monster.c.obj -[155/492] Building C object src/floppy/CMakeFiles/fdd.dir/fdc_pii15xb.c.obj -[156/492] Building C object src/disk/minivhd/CMakeFiles/minivhd.dir/minivhd_create.c.obj -[157/492] Building C object src/disk/minivhd/CMakeFiles/minivhd.dir/minivhd_manage.c.obj -[158/492] Building C object src/disk/minivhd/CMakeFiles/minivhd.dir/minivhd_util.c.obj -[159/492] Building C object src/floppy/CMakeFiles/fdd.dir/fdd_common.c.obj -[160/492] Building C object src/disk/minivhd/CMakeFiles/minivhd.dir/cwalk.c.obj -[161/492] Building C object src/floppy/CMakeFiles/fdd.dir/fdd.c.obj -[162/492] Building C object src/codegen/CMakeFiles/dynarec.dir/codegen_x86.c.obj -[163/492] Building C object src/floppy/CMakeFiles/fdd.dir/fdd_fdi.c.obj -[164/492] Building C object src/game/CMakeFiles/game.dir/joystick_ch_flightstick_pro.c.obj -[165/492] Building C object src/game/CMakeFiles/game.dir/joystick_standard.c.obj -[166/492] Building C object src/floppy/CMakeFiles/fdd.dir/fdd_mfm.c.obj -[167/492] Building C object src/game/CMakeFiles/game.dir/joystick_tm_fcs.c.obj -[168/492] Building C object src/game/CMakeFiles/game.dir/gameport.c.obj -[169/492] Building C object src/disk/CMakeFiles/zip.dir/zip.c.obj -[170/492] Linking C static library src\disk\minivhd\libminivhd.a -[171/492] Building C object src/game/CMakeFiles/game.dir/joystick_sw_pad.c.obj -[172/492] Building C object src/machine/CMakeFiles/mch.dir/machine.c.obj -[173/492] Building C object src/floppy/CMakeFiles/fdd.dir/fdd_json.c.obj -[174/492] Building C object src/machine/CMakeFiles/mch.dir/m_xt_compaq.c.obj -[175/492] Building C object src/floppy/CMakeFiles/fdd.dir/fdd_imd.c.obj -[176/492] Building C object src/machine/CMakeFiles/mch.dir/m_xt_philips.c.obj -[177/492] Building C object src/machine/CMakeFiles/mch.dir/machine_table.c.obj -[178/492] Building C object src/floppy/CMakeFiles/fdd.dir/fdd_img.c.obj -[179/492] Building C object src/machine/CMakeFiles/mch.dir/m_xt_xi8088.c.obj -[180/492] Building C object src/machine/CMakeFiles/mch.dir/m_xt_zenith.c.obj -[181/492] Building C object src/machine/CMakeFiles/mch.dir/m_xt.c.obj -[182/492] Building C object src/floppy/CMakeFiles/fdd.dir/fdd_td0.c.obj -[183/492] Building C object src/disk/CMakeFiles/hdd.dir/hdc_ide.c.obj -[184/492] Building C object src/machine/CMakeFiles/mch.dir/m_elt.c.obj -[185/492] Building C object src/machine/CMakeFiles/mch.dir/m_v86p.c.obj -[186/492] Building C object src/floppy/CMakeFiles/fdd.dir/fdc.c.obj -[187/492] Building C object src/machine/CMakeFiles/mch.dir/m_europc.c.obj -[188/492] Building C object src/machine/CMakeFiles/mch.dir/m_at_commodore.c.obj -[189/492] Building C object src/machine/CMakeFiles/mch.dir/m_at.c.obj -[190/492] Building C object src/machine/CMakeFiles/mch.dir/m_xt_t1000_vid.c.obj -[191/492] Building C object src/machine/CMakeFiles/mch.dir/m_xt_t1000.c.obj -[192/492] Building C object src/floppy/CMakeFiles/fdd.dir/fdi2raw.c.obj -[193/492] Building C object src/machine/CMakeFiles/mch.dir/m_ps2_isa.c.obj -[194/492] Building C object src/machine/CMakeFiles/mch.dir/m_ps1.c.obj -[195/492] Building C object src/disk/CMakeFiles/mo.dir/mo.c.obj -[196/492] Building C object src/machine/CMakeFiles/mch.dir/m_pcjr.c.obj -[197/492] Building C object src/machine/CMakeFiles/mch.dir/m_at_t3100e.c.obj -[198/492] Building C object src/cpu/CMakeFiles/cpu.dir/808x.c.obj -[199/492] Building C object src/machine/CMakeFiles/mch.dir/m_at_socket4.c.obj -[200/492] Building C object src/machine/CMakeFiles/mch.dir/m_xt_olivetti.c.obj -[201/492] Building C object src/machine/CMakeFiles/mch.dir/m_at_socket5.c.obj -[202/492] Building C object src/machine/CMakeFiles/mch.dir/m_ps1_hdc.c.obj -[203/492] Building C object src/machine/CMakeFiles/mch.dir/m_at_t3100e_vid.c.obj -[204/492] Building C object src/machine/CMakeFiles/mch.dir/m_at_286_386sx.c.obj -[205/492] Building C object src/machine/CMakeFiles/mch.dir/m_at_slot2.c.obj -[206/492] Building C object src/machine/CMakeFiles/mch.dir/m_at_sockets7.c.obj -[207/492] Building C object src/machine/CMakeFiles/mch.dir/m_at_socket8.c.obj -[208/492] Building C object src/machine/CMakeFiles/mch.dir/m_tandy.c.obj -[209/492] Building C object src/machine/CMakeFiles/mch.dir/m_at_socket7_3v.c.obj -[210/492] Building C object src/machine/CMakeFiles/mch.dir/m_at_misc.c.obj -[211/492] Building C object src/machine/CMakeFiles/mch.dir/m_at_socket370.c.obj -[212/492] Building C object src/machine/CMakeFiles/mch.dir/m_at_compaq.c.obj -[213/492] Building C object src/machine/CMakeFiles/mch.dir/m_ps2_mca.c.obj -[214/492] Building C object src/machine/CMakeFiles/mch.dir/m_xt_laserxt.c.obj -[215/492] Building C object src/mem/CMakeFiles/mem.dir/i2c_eeprom.c.obj -[216/492] Building C object src/mem/CMakeFiles/mem.dir/catalyst_flash.c.obj -[217/492] Building C object src/machine/CMakeFiles/mch.dir/m_at_slot1.c.obj -[218/492] Building C object src/machine/CMakeFiles/mch.dir/m_at_socket7.c.obj -[219/492] Building C object src/machine/CMakeFiles/mch.dir/m_amstrad.c.obj -[220/492] Building C object src/floppy/CMakeFiles/fdd.dir/fdd_86f.c.obj -[221/492] Building C object src/machine/CMakeFiles/mch.dir/m_at_386dx_486.c.obj -[222/492] Building C object src/mem/CMakeFiles/mem.dir/intel_flash.c.obj -[223/492] Building C object src/mem/CMakeFiles/mem.dir/smram.c.obj -[224/492] Building C object src/mem/CMakeFiles/mem.dir/sst_flash.c.obj -[225/492] Building C object src/mem/CMakeFiles/mem.dir/spd.c.obj -[226/492] Building C object src/network/CMakeFiles/net.dir/net_3c503.c.obj -[227/492] Building C object src/mem/CMakeFiles/mem.dir/rom.c.obj -[228/492] Building C object src/network/CMakeFiles/net.dir/net_plip.c.obj -[229/492] Building C object src/network/CMakeFiles/net.dir/net_pcap.c.obj -[230/492] Building C object src/network/CMakeFiles/net.dir/net_3c501.c.obj -[231/492] Building C object src/network/CMakeFiles/net.dir/net_event.c.obj -[232/492] Building C object src/network/CMakeFiles/net.dir/net_dp8390.c.obj -[233/492] Building C object src/network/CMakeFiles/net.dir/net_wd8003.c.obj -[234/492] Building C object src/network/CMakeFiles/net.dir/net_ne2000.c.obj -[235/492] Building C object src/network/CMakeFiles/net.dir/network.c.obj -[236/492] Building C object src/network/CMakeFiles/net.dir/net_slirp.c.obj -[237/492] Building C object src/network/slirp/CMakeFiles/slirp.dir/arp_table.c.obj -[238/492] Building C object src/mem/CMakeFiles/mem.dir/mem.c.obj -[239/492] Building C object src/network/slirp/CMakeFiles/slirp.dir/cksum.c.obj -[240/492] Building C object src/network/slirp/CMakeFiles/slirp.dir/bootp.c.obj -[241/492] Building C object src/network/slirp/CMakeFiles/slirp.dir/if.c.obj -[242/492] Building C object src/network/slirp/CMakeFiles/slirp.dir/ip_output.c.obj -[243/492] Building C object src/network/slirp/CMakeFiles/slirp.dir/dnssearch.c.obj -[244/492] Building C object src/network/slirp/CMakeFiles/slirp.dir/ip_icmp.c.obj -[245/492] Building C object src/network/slirp/CMakeFiles/slirp.dir/ip_input.c.obj -[246/492] Building C object src/network/slirp/CMakeFiles/slirp.dir/sbuf.c.obj -[247/492] Building C object src/network/slirp/CMakeFiles/slirp.dir/mbuf.c.obj -[248/492] Building C object src/network/slirp/CMakeFiles/slirp.dir/tinyglib.c.obj -[249/492] Building C object src/network/slirp/CMakeFiles/slirp.dir/misc.c.obj -[250/492] Building C object src/printer/CMakeFiles/print.dir/prt_cpmap.c.obj -[251/492] Building C object src/printer/CMakeFiles/print.dir/png.c.obj -[252/492] Building C object src/network/slirp/CMakeFiles/slirp.dir/tcp_output.c.obj -[253/492] Building C object src/codegen/CMakeFiles/dynarec.dir/codegen_ops.c.obj -[254/492] Building C object src/sio/CMakeFiles/sio.dir/sio_acc3221.c.obj -[255/492] Building C object src/printer/CMakeFiles/print.dir/prt_text.c.obj -[256/492] Building C object src/printer/CMakeFiles/print.dir/prt_ps.c.obj -[257/492] Building C object src/network/slirp/CMakeFiles/slirp.dir/socket.c.obj -[258/492] Building C object src/sio/CMakeFiles/sio.dir/sio_f82c710.c.obj -[259/492] Building C object src/sio/CMakeFiles/sio.dir/sio_ali5123.c.obj -[260/492] Building C object src/network/CMakeFiles/net.dir/net_pcnet.c.obj -[261/492] Building C object src/network/slirp/CMakeFiles/slirp.dir/tcp_input.c.obj -[262/492] Building C object src/sio/CMakeFiles/sio.dir/sio_fdc37c6xx.c.obj -[263/492] Building C object src/network/slirp/CMakeFiles/slirp.dir/slirp.c.obj -[264/492] Building C object src/sio/CMakeFiles/sio.dir/sio_82091aa.c.obj -[265/492] Building C object src/sio/CMakeFiles/sio.dir/sio_fdc37c669.c.obj -[266/492] Building C object src/network/slirp/CMakeFiles/slirp.dir/tcp_subr.c.obj -[267/492] Building C object src/sio/CMakeFiles/sio.dir/sio_fdc37c67x.c.obj -[268/492] Building C object src/sio/CMakeFiles/sio.dir/sio_fdc37m60x.c.obj -[269/492] Building C object src/sio/CMakeFiles/sio.dir/sio_it8661f.c.obj -[270/492] Building C object src/network/slirp/CMakeFiles/slirp.dir/version.c.obj -[271/492] Building C object src/network/slirp/CMakeFiles/slirp.dir/tcp_timer.c.obj -[272/492] Building C object src/sio/CMakeFiles/sio.dir/sio_pc87306.c.obj -[273/492] Building C object src/sio/CMakeFiles/sio.dir/sio_pc87310.c.obj -[274/492] Building C object src/sio/CMakeFiles/sio.dir/sio_pc87311.c.obj -[275/492] Building C object src/sio/CMakeFiles/sio.dir/sio_prime3b.c.obj -[276/492] Building C object src/sio/CMakeFiles/sio.dir/sio_pc87307.c.obj -[277/492] Building C object src/network/slirp/CMakeFiles/slirp.dir/udp.c.obj -[278/492] Building C object src/sio/CMakeFiles/sio.dir/sio_pc87332.c.obj -[279/492] Building C object src/sio/CMakeFiles/sio.dir/sio_pc87309.c.obj -[280/492] Building C object src/network/slirp/CMakeFiles/slirp.dir/util.c.obj -[281/492] Building C object src/sio/CMakeFiles/sio.dir/sio_detect.c.obj -[282/492] Building C object src/sio/CMakeFiles/sio.dir/sio_prime3c.c.obj -[283/492] Building C object src/sio/CMakeFiles/sio.dir/sio_fdc37c93x.c.obj -[284/492] Building C object src/scsi/CMakeFiles/scsi.dir/scsi.c.obj -[285/492] Building C object src/sio/CMakeFiles/sio.dir/sio_um8669f.c.obj -[286/492] Building C object src/sio/CMakeFiles/sio.dir/sio_w83787f.c.obj -[287/492] Building C object src/sio/CMakeFiles/sio.dir/sio_vt82c686.c.obj -[288/492] Building C object src/sio/CMakeFiles/sio.dir/sio_w83877f.c.obj -[289/492] Building C object src/scsi/CMakeFiles/scsi.dir/scsi_device.c.obj -[290/492] Building C object src/printer/CMakeFiles/print.dir/prt_escp.c.obj -[291/492] Building C object src/sio/CMakeFiles/sio.dir/sio_w83977f.c.obj -[292/492] Building C object src/sound/CMakeFiles/snd.dir/snd_opl.c.obj -[293/492] Linking C static library src\network\slirp\libslirp.a -[294/492] Building C object src/sound/CMakeFiles/snd.dir/snd_speaker.c.obj -[295/492] Building C object src/sound/CMakeFiles/snd.dir/snd_lpt_dac.c.obj -[296/492] Building C object src/sound/CMakeFiles/snd.dir/sound.c.obj -[297/492] Building CXX object src/sound/CMakeFiles/snd.dir/snd_resid.cc.obj -[298/492] Building C object src/sound/CMakeFiles/snd.dir/snd_pssj.c.obj -[299/492] Building C object src/scsi/CMakeFiles/scsi.dir/scsi_aha154x.c.obj -[300/492] Building C object src/sound/CMakeFiles/snd.dir/midi.c.obj -[301/492] Building C object src/sound/CMakeFiles/snd.dir/snd_lpt_dss.c.obj -[302/492] Building C object src/scsi/CMakeFiles/scsi.dir/scsi_disk.c.obj -[303/492] Building C object src/sound/CMakeFiles/snd.dir/snd_ps1.c.obj -[304/492] Building C object src/scsi/CMakeFiles/scsi.dir/scsi_spock.c.obj -[305/492] Building C object src/sound/CMakeFiles/snd.dir/snd_adlib.c.obj -[306/492] Building C object src/sound/CMakeFiles/snd.dir/snd_ac97_codec.c.obj -[307/492] Building C object src/sound/CMakeFiles/snd.dir/snd_ac97_via.c.obj -[308/492] Building C object src/scsi/CMakeFiles/scsi.dir/scsi_buslogic.c.obj -[309/492] Building C object src/sound/CMakeFiles/snd.dir/snd_opl_nuked.c.obj -[310/492] Building C object src/scsi/CMakeFiles/scsi.dir/scsi_ncr5380.c.obj -[311/492] Building C object src/sound/CMakeFiles/snd.dir/snd_cms.c.obj -[312/492] Building C object src/scsi/CMakeFiles/scsi.dir/scsi_x54x.c.obj -[313/492] Building C object src/scsi/CMakeFiles/scsi.dir/scsi_pcscsi.c.obj -[314/492] Building C object src/sound/CMakeFiles/snd.dir/snd_ad1848.c.obj -[315/492] Building C object src/sound/CMakeFiles/snd.dir/snd_ssi2001.c.obj -[316/492] Building C object src/sound/CMakeFiles/snd.dir/snd_ym7128.c.obj -[317/492] Building C object src/sound/CMakeFiles/snd.dir/snd_azt2316a.c.obj -[318/492] Building C object src/sound/CMakeFiles/snd.dir/snd_wss.c.obj -[319/492] Building C object src/sound/CMakeFiles/snd.dir/snd_adlibgold.c.obj -[320/492] Building C object src/sound/CMakeFiles/snd.dir/snd_sn76489.c.obj -[321/492] Building C object src/scsi/CMakeFiles/scsi.dir/scsi_cdrom.c.obj -[322/492] Building C object src/scsi/CMakeFiles/scsi.dir/scsi_ncr53c8xx.c.obj -[323/492] Building C object src/sound/CMakeFiles/snd.dir/snd_cs423x.c.obj -[324/492] Building C object src/sound/CMakeFiles/snd.dir/openal.c.obj -[325/492] Building C object src/sound/CMakeFiles/snd.dir/snd_optimc.c.obj -[326/492] Building C object src/sound/CMakeFiles/snd.dir/snd_gus.c.obj -[327/492] Building C object src/sound/CMakeFiles/snd.dir/snd_cmi8x38.c.obj -[328/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/LA32Ramp.cpp.obj -[329/492] Building C object src/sound/CMakeFiles/snd.dir/snd_audiopci.c.obj -[330/492] Building C object src/sound/CMakeFiles/snd.dir/midi_fluidsynth.c.obj -[331/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/File.cpp.obj -[332/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/Display.cpp.obj -[333/492] Building C object src/sound/CMakeFiles/snd.dir/midi_mt32.c.obj -[334/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/LA32FloatWaveGenerator.cpp.obj -[335/492] Building C object src/sound/CMakeFiles/snd.dir/snd_sb_dsp.c.obj -[336/492] Building C object src/sound/CMakeFiles/snd.dir/snd_pas16.c.obj -[337/492] Building C object src/sound/CMakeFiles/snd.dir/snd_mpu401.c.obj -[338/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/Analog.cpp.obj -[339/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/Poly.cpp.obj -[340/492] Building C object src/sound/CMakeFiles/snd.dir/snd_emu8k.c.obj -[341/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/LA32WaveGenerator.cpp.obj -[342/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/SampleRateConverter.cpp.obj -[343/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/PartialManager.cpp.obj -[344/492] Building C object src/sound/CMakeFiles/snd.dir/snd_sb.c.obj -[345/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/MidiStreamParser.cpp.obj -[346/492] Building CXX object src/sound/CMakeFiles/snd.dir/snd_opl_ymfm.cpp.obj -[347/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/srchelper/srctools/src/FIRResampler.cpp.obj -[348/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/Partial.cpp.obj -[349/492] Building CXX object src/sound/CMakeFiles/snd.dir/midi_rtmidi.cpp.obj -[350/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/srchelper/srctools/src/LinearResampler.cpp.obj -[351/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/ROMInfo.cpp.obj -[352/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/FileStream.cpp.obj -[353/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/srchelper/InternalResampler.cpp.obj -[354/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/srchelper/srctools/src/IIR2xResampler.cpp.obj -[355/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/srchelper/srctools/src/SincResampler.cpp.obj -[356/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/srchelper/srctools/src/ResamplerModel.cpp.obj -[357/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/Tables.cpp.obj -[358/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/BReverbModel.cpp.obj -[359/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/TVF.cpp.obj -[360/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/sha1/sha1.cpp.obj -[361/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/Part.cpp.obj -[362/492] Building CXX object src/sound/resid-fp/CMakeFiles/resid-fp.dir/envelope.cc.obj -[363/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/TVA.cpp.obj -[364/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/TVP.cpp.obj -[365/492] Building CXX object src/sound/resid-fp/CMakeFiles/resid-fp.dir/convolve.cc.obj -[366/492] Building CXX object src/sound/resid-fp/CMakeFiles/resid-fp.dir/pot.cc.obj -[367/492] Building CXX object src/sound/resid-fp/CMakeFiles/resid-fp.dir/convolve-sse.cc.obj -[368/492] Building CXX object src/sound/resid-fp/CMakeFiles/resid-fp.dir/extfilt.cc.obj -[369/492] Building CXX object src/sound/resid-fp/CMakeFiles/resid-fp.dir/wave6581_PST.cc.obj -[370/492] Building CXX object src/sound/resid-fp/CMakeFiles/resid-fp.dir/wave6581_P_T.cc.obj -[371/492] Building CXX object src/sound/resid-fp/CMakeFiles/resid-fp.dir/wave6581_PS_.cc.obj -[372/492] Building CXX object src/sound/resid-fp/CMakeFiles/resid-fp.dir/filter.cc.obj -[373/492] Building CXX object src/sound/resid-fp/CMakeFiles/resid-fp.dir/wave6581__ST.cc.obj -[374/492] Building CXX object src/sound/resid-fp/CMakeFiles/resid-fp.dir/wave8580_PS_.cc.obj -[375/492] Building CXX object src/sound/resid-fp/CMakeFiles/resid-fp.dir/wave8580_PST.cc.obj -[376/492] Building CXX object src/sound/resid-fp/CMakeFiles/resid-fp.dir/wave.cc.obj -[377/492] Building CXX object src/sound/resid-fp/CMakeFiles/resid-fp.dir/voice.cc.obj -[378/492] Building CXX object src/sound/resid-fp/CMakeFiles/resid-fp.dir/wave8580_P_T.cc.obj -[379/492] Building CXX object src/sound/resid-fp/CMakeFiles/resid-fp.dir/wave8580__ST.cc.obj -[380/492] Building C object src/video/CMakeFiles/vid.dir/agpgart.c.obj -[381/492] Building CXX object src/sound/ymfm/CMakeFiles/ymfm.dir/ymfm_misc.cpp.obj -[382/492] Building C object src/video/CMakeFiles/vid.dir/vid_table.c.obj -[383/492] Building C object src/video/CMakeFiles/vid.dir/vid_cga_comp.c.obj -[384/492] Building C object src/video/CMakeFiles/vid.dir/vid_mda.c.obj -[385/492] Building CXX object src/sound/resid-fp/CMakeFiles/resid-fp.dir/sid.cc.obj -[386/492] Building C object src/video/CMakeFiles/vid.dir/vid_compaq_cga.c.obj -[387/492] Building C object src/video/CMakeFiles/vid.dir/vid_cga.c.obj -[388/492] Building C object src/video/CMakeFiles/vid.dir/vid_hercules.c.obj -[389/492] Building C object src/video/CMakeFiles/vid.dir/vid_herculesplus.c.obj -[390/492] Building C object src/video/CMakeFiles/vid.dir/vid_colorplus.c.obj -[391/492] Building C object src/video/CMakeFiles/vid.dir/video.c.obj -[392/492] Building C object src/video/CMakeFiles/vid.dir/vid_genius.c.obj -[393/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/c_interface/c_interface.cpp.obj -[394/492] Building C object src/video/CMakeFiles/vid.dir/vid_incolor.c.obj -[395/492] Building CXX object src/sound/ymfm/CMakeFiles/ymfm.dir/ymfm_pcm.cpp.obj -[396/492] Linking CXX static library src\sound\resid-fp\libresid-fp.a -[397/492] Building CXX object src/sound/ymfm/CMakeFiles/ymfm.dir/ymfm_adpcm.cpp.obj -[398/492] Building C object src/video/CMakeFiles/vid.dir/vid_im1024.c.obj -[399/492] Building C object src/video/CMakeFiles/vid.dir/vid_ddc.c.obj -[400/492] Building C object src/video/CMakeFiles/vid.dir/vid_wy700.c.obj -[401/492] Building C object src/video/CMakeFiles/vid.dir/vid_sigma.c.obj -[402/492] Building C object src/video/CMakeFiles/vid.dir/vid_vga.c.obj -[403/492] Building C object src/video/CMakeFiles/vid.dir/vid_ati_eeprom.c.obj -[404/492] Building CXX object src/sound/ymfm/CMakeFiles/ymfm.dir/ymfm_opq.cpp.obj -[405/492] Building CXX object src/sound/ymfm/CMakeFiles/ymfm.dir/ymfm_opm.cpp.obj -[406/492] Building C object src/video/CMakeFiles/vid.dir/vid_ati18800.c.obj -[407/492] Building C object src/video/CMakeFiles/vid.dir/vid_ega_render.c.obj -[408/492] Building C object src/video/CMakeFiles/vid.dir/vid_av9194.c.obj -[409/492] Building C object src/video/CMakeFiles/vid.dir/vid_icd2061.c.obj -[410/492] Building C object src/video/CMakeFiles/vid.dir/vid_ega.c.obj -[411/492] Building C object src/video/CMakeFiles/vid.dir/vid_ati28800.c.obj -[412/492] Building C object src/video/CMakeFiles/vid.dir/vid_ati68860_ramdac.c.obj -[413/492] Building C object src/video/CMakeFiles/vid.dir/vid_ics2494.c.obj -[414/492] Building CXX object src/sound/munt/CMakeFiles/mt32emu.dir/Synth.cpp.obj -[415/492] Building C object src/video/CMakeFiles/vid.dir/vid_ics2595.c.obj -[416/492] Building C object src/video/CMakeFiles/vid.dir/vid_bt48x_ramdac.c.obj -[417/492] Building CXX object src/sound/ymfm/CMakeFiles/ymfm.dir/ymfm_opz.cpp.obj -[418/492] Building C object src/video/CMakeFiles/vid.dir/vid_et3000.c.obj -[419/492] Building C object src/video/CMakeFiles/vid.dir/vid_sc1148x_ramdac.c.obj -[420/492] Building C object src/video/CMakeFiles/vid.dir/vid_sc1502x_ramdac.c.obj -[421/492] Building C object src/video/CMakeFiles/vid.dir/vid_svga.c.obj -[422/492] Building C object src/video/CMakeFiles/vid.dir/vid_stg_ramdac.c.obj -[423/492] Building C object src/video/CMakeFiles/vid.dir/vid_pgc.c.obj -[424/492] Building C object src/video/CMakeFiles/vid.dir/vid_ti_cf62011.c.obj -[425/492] Linking CXX static library src\sound\munt\libmt32emu.a -[426/492] Building C object src/video/CMakeFiles/vid.dir/vid_rtg310x.c.obj -[427/492] Building C object src/video/CMakeFiles/vid.dir/vid_et4000.c.obj -[428/492] Building C object src/video/CMakeFiles/vid.dir/vid_oak_oti.c.obj -[429/492] Building C object src/video/CMakeFiles/vid.dir/vid_tkd8001_ramdac.c.obj -[430/492] Building C object src/video/CMakeFiles/vid.dir/vid_att20c49x_ramdac.c.obj -[431/492] Building C object src/video/CMakeFiles/vid.dir/vid_paradise.c.obj -[432/492] Building C object src/video/CMakeFiles/vid.dir/vid_f82c425.c.obj -[433/492] Building C object src/video/CMakeFiles/vid.dir/vid_tvga.c.obj -[434/492] Building C object src/video/CMakeFiles/vid.dir/vid_sdac_ramdac.c.obj -[435/492] Building C object src/video/CMakeFiles/vid.dir/vid_att2xc498_ramdac.c.obj -[436/492] Building C object src/video/CMakeFiles/vid.dir/vid_ht216.c.obj -[437/492] Building C object src/video/CMakeFiles/vid.dir/vid_tvp3026_ramdac.c.obj -[438/492] Building C object src/video/CMakeFiles/vid.dir/vid_svga_render.c.obj -[439/492] Building C object src/video/CMakeFiles/vid.dir/vid_ogc.c.obj -[440/492] Building C object src/video/CMakeFiles/vid.dir/vid_nga.c.obj -[441/492] Building C object src/video/CMakeFiles/vid.dir/vid_ibm_rgb528_ramdac.c.obj -[442/492] Building C object src/video/CMakeFiles/voodoo.dir/vid_voodoo_fifo.c.obj -[443/492] Building C object src/video/CMakeFiles/voodoo.dir/vid_voodoo_blitter.c.obj -[444/492] Building C object src/video/CMakeFiles/voodoo.dir/vid_voodoo.c.obj -[445/492] Building C object src/video/CMakeFiles/voodoo.dir/vid_voodoo_display.c.obj -[446/492] Building C object src/video/CMakeFiles/voodoo.dir/vid_voodoo_fb.c.obj -[447/492] Building C object src/video/CMakeFiles/vid.dir/vid_tgui9440.c.obj -[448/492] Building C object src/video/CMakeFiles/vid.dir/vid_cl54xx.c.obj -[449/492] Building C object src/video/CMakeFiles/vid.dir/vid_et4000w32.c.obj -[450/492] Building C object src/video/CMakeFiles/voodoo.dir/vid_voodoo_reg.c.obj -[451/492] Building C object src/video/CMakeFiles/voodoo.dir/vid_voodoo_setup.c.obj -[452/492] Building C object src/video/CMakeFiles/voodoo.dir/vid_voodoo_banshee_blitter.c.obj -[453/492] Building C object src/video/CMakeFiles/vid.dir/vid_8514a.c.obj -[454/492] Building CXX object src/sound/ymfm/CMakeFiles/ymfm.dir/ymfm_opn.cpp.obj -[455/492] Building C object src/video/CMakeFiles/vid.dir/vid_ati_mach64.c.obj -[456/492] Building C object src/video/CMakeFiles/voodoo.dir/vid_voodoo_texture.c.obj -[457/492] Building C object src/video/CMakeFiles/vid.dir/vid_xga.c.obj -[458/492] Building C object src/video/CMakeFiles/voodoo.dir/vid_voodoo_banshee.c.obj -[459/492] Building C object src/win/CMakeFiles/plat.dir/win_dynld.c.obj -[460/492] Building C object src/video/CMakeFiles/vid.dir/vid_s3_virge.c.obj -[461/492] Building C object src/win/CMakeFiles/plat.dir/win_keyboard.c.obj -[462/492] Building C object src/win/CMakeFiles/plat.dir/win_mouse.c.obj -[463/492] Building C object src/win/CMakeFiles/plat.dir/win_cdrom.c.obj -[464/492] Building C object src/win/CMakeFiles/ui.dir/win_icon.c.obj -[465/492] Building C object src/win/CMakeFiles/ui.dir/win_about.c.obj -[466/492] Building C object src/win/CMakeFiles/plat.dir/win_joystick_rawinput.c.obj -[467/492] Building C object src/video/CMakeFiles/vid.dir/vid_mga.c.obj -[468/492] Building C object src/win/CMakeFiles/ui.dir/win_sdl.c.obj -[469/492] Building C object src/win/CMakeFiles/ui.dir/win_snd_gain.c.obj -[470/492] Building C object src/win/CMakeFiles/ui.dir/win_opengl_glslp.c.obj -[471/492] Building C object src/win/CMakeFiles/ui.dir/win_stbar.c.obj -[472/492] Building C object src/win/CMakeFiles/ui.dir/win_specify_dim.c.obj -[473/492] Building C object src/win/CMakeFiles/ui.dir/win_ui.c.obj -[474/492] Building C object src/win/CMakeFiles/ui.dir/win_devconf.c.obj -[475/492] Building RC object src/win/CMakeFiles/ui.dir/86Box.rc.obj -[476/492] Building C object src/win/CMakeFiles/ui.dir/win_new_floppy.c.obj -[477/492] Building C object src/win/CMakeFiles/ui.dir/win_preferences.c.obj -[478/492] Building C object src/win/CMakeFiles/ui.dir/win_dialog.c.obj -[479/492] Building C object src/win/CMakeFiles/ui.dir/win_jsconf.c.obj -[480/492] Building C object src/win/CMakeFiles/plat.dir/win.c.obj -[481/492] Building C object src/win/CMakeFiles/ui.dir/glad.c.obj -[482/492] Building C object src/win/CMakeFiles/ui.dir/win_toolbar.c.obj -[483/492] Building CXX object src/sound/ymfm/CMakeFiles/ymfm.dir/ymfm_opl.cpp.obj -[484/492] Linking CXX static library src\sound\ymfm\libymfm.a -[485/492] Building C object src/video/CMakeFiles/voodoo.dir/vid_voodoo_render.c.obj -[486/492] Building C object src/video/CMakeFiles/vid.dir/vid_s3.c.obj -[487/492] Building C object src/win/CMakeFiles/ui.dir/win_media_menu.c.obj -[488/492] Building C object src/win/CMakeFiles/ui.dir/win_opengl.c.obj -[489/492] Building C object src/win/CMakeFiles/ui.dir/win_settings.c.obj -[490/492] Building C object src/cpu/CMakeFiles/cpu.dir/386_dynarec_ops.c.obj -[491/492] Building C object src/cpu/CMakeFiles/cpu.dir/386_dynarec.c.obj -[492/492] Linking CXX executable src\86Box.exe From 06a7e00af4b53eae996a14ba44d9b8448dd1f552 Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 30 Dec 2022 04:29:56 +0100 Subject: [PATCH 091/285] Fix video output via VNC. --- src/vnc.c | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/vnc.c b/src/vnc.c index 3bffdcd9d..ef2ac7639 100644 --- a/src/vnc.c +++ b/src/vnc.c @@ -160,20 +160,15 @@ vnc_display(rfbClientPtr cl) static void vnc_blit(int x, int y, int w, int h, int monitor_index) { - uint32_t *p; - int yy; + int row; if (monitor_index || (x < 0) || (y < 0) || (w <= 0) || (h <= 0) || (w > 2048) || (h > 2048) || (buffer32 == NULL)) { video_blit_complete_monitor(monitor_index); return; } - for (yy = 0; yy < h; yy++) { - p = (uint32_t *) &(((uint32_t *) rfb->frameBuffer)[yy * VNC_MAX_X]); - - if ((y + yy) >= 0 && (y + yy) < VNC_MAX_Y) - video_copy(p, &(buffer32->line[yy]), w * sizeof(uint32_t)); - } + for (row = 0; row < h; ++row) + video_copy(&(((uint8_t *) rfb->frameBuffer)[row * 2048 * sizeof(uint32_t)]), &(buffer32->line[y + row][x]), w * sizeof(uint32_t)); if (screenshots) video_screenshot((uint32_t *) rfb->frameBuffer, 0, 0, VNC_MAX_X); From 06d4ae5595a9cd36a8610d43e363bfaec5929a7c Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 30 Dec 2022 06:05:57 +0100 Subject: [PATCH 092/285] Fixed VNC mouse, but the correct scale factor for X and Y has to be figured out. --- src/device/mouse.c | 12 ++++++- src/include/86box/mouse.h | 1 + src/vnc.c | 72 ++++++++++++++++++++++++++------------- 3 files changed, 61 insertions(+), 24 deletions(-) diff --git a/src/device/mouse.c b/src/device/mouse.c index 422161a83..f628d1efa 100644 --- a/src/device/mouse.c +++ b/src/device/mouse.c @@ -88,6 +88,7 @@ static const device_t *mouse_curr; static void *mouse_priv; static int mouse_nbut; static int (*mouse_dev_poll)(int x, int y, int z, int b, void *priv); +static void (*mouse_poll_ex)(void) = NULL; #ifdef ENABLE_MOUSE_LOG int mouse_do_log = ENABLE_MOUSE_LOG; @@ -164,13 +165,22 @@ mouse_set_buttons(int buttons) mouse_nbut = buttons; } +void +mouse_set_poll_ex(void (*poll_ex)(void)) +{ + mouse_poll_ex = poll_ex; +} + void mouse_process(void) { if (mouse_curr == NULL) return; - mouse_poll(); + if (mouse_poll_ex) + mouse_poll_ex(); + else + mouse_poll(); if ((mouse_dev_poll != NULL) || (mouse_curr->poll != NULL)) { if (mouse_curr->poll != NULL) diff --git a/src/include/86box/mouse.h b/src/include/86box/mouse.h index 434360589..aa046b81c 100644 --- a/src/include/86box/mouse.h +++ b/src/include/86box/mouse.h @@ -65,6 +65,7 @@ extern void mouse_init(void); extern void mouse_close(void); extern void mouse_reset(void); extern void mouse_set_buttons(int buttons); +extern void mouse_set_poll_ex(void (*poll_ex)(void)); extern void mouse_process(void); extern void mouse_set_poll(int (*f)(int, int, int, int, void *), void *); extern void mouse_poll(void); diff --git a/src/vnc.c b/src/vnc.c index ef2ac7639..ef388939a 100644 --- a/src/vnc.c +++ b/src/vnc.c @@ -44,6 +44,15 @@ static int allowedX, allowedY; static int ptr_x, ptr_y, ptr_but; +typedef struct { + int buttons; + int dx; + int dy; + int dwheel; +} MOUSESTATE; + +static MOUSESTATE ms; + #ifdef ENABLE_VNC_LOG int vnc_do_log = ENABLE_VNC_LOG; @@ -71,29 +80,43 @@ vnc_kbdevent(rfbBool down, rfbKeySym k, rfbClientPtr cl) vnc_kbinput(down ? 1 : 0, (int) k); } +void +vnc_mouse_poll(void) +{ + static int b = 0; + if (ms.dx != 0 || ms.dy != 0) { + mouse_x += ms.dx; + mouse_y += ms.dy; + + ms.dx = 0; + ms.dy = 0; + + // pclog("dx=%d, dy=%d, dwheel=%d\n", mouse_x, mouse_y, mouse_z); + } + + if (b != ms.buttons) { + mouse_buttons = ms.buttons; + b = ms.buttons; + } +} + static void vnc_ptrevent(int but, int x, int y, rfbClientPtr cl) { - if (x >= 0 && x < allowedX && y >= 0 && y < allowedY) { - /* VNC uses absolute positions within the window, no deltas. */ - if (x != ptr_x || y != ptr_y) { - mouse_x += (x - ptr_x) / 100; - mouse_y += (y - ptr_y) / 100; - ptr_x = x; - ptr_y = y; - } + ms.buttons = 0; + if (but & 0x01) + ms.buttons |= 0x01; + if (but & 0x02) + ms.buttons |= 0x04; + if (but & 0x04) + ms.buttons |= 0x02; + ptr_but = but; - if (but != ptr_but) { - mouse_buttons = 0; - if (but & 0x01) - mouse_buttons |= 0x01; - if (but & 0x02) - mouse_buttons |= 0x04; - if (but & 0x04) - mouse_buttons |= 0x02; - ptr_but = but; - } - } + /* VNC uses absolute positions within the window, no deltas. */ + ms.dx += (x - ptr_x) / 0.96; /* TODO: Figure out the correct scale factor for X and Y. */ + ms.dy += (y - ptr_y) / 0.96; + ptr_x = x; + ptr_y = y; rfbDefaultPtrAddEvent(but, x, y, cl); } @@ -110,7 +133,8 @@ vnc_clientgone(rfbClientPtr cl) vnc_log("VNC: no clients, pausing..\n"); /* Disable the mouse. */ - plat_mouse_capture(0); + // plat_mouse_capture(0); + mouse_set_poll_ex(NULL); plat_pause(1); } @@ -129,12 +153,14 @@ vnc_newclient(rfbClientPtr cl) ptr_y = allowedY / 2; mouse_x = mouse_y = mouse_z = 0; mouse_buttons = 0x00; + memset(&ms, 0, sizeof(MOUSESTATE)); /* We now have clients, un-pause the emulator if needed. */ vnc_log("VNC: unpausing..\n"); /* Enable the mouse. */ - plat_mouse_capture(1); + // plat_mouse_capture(1); + mouse_set_poll_ex(vnc_mouse_poll); plat_pause(0); } @@ -162,7 +188,7 @@ vnc_blit(int x, int y, int w, int h, int monitor_index) { int row; - if (monitor_index || (x < 0) || (y < 0) || (w <= 0) || (h <= 0) || (w > 2048) || (h > 2048) || (buffer32 == NULL)) { + if (monitor_index || (x < 0) || (y < 0) || (w < VNC_MIN_X) || (h < VNC_MIN_Y) || (w > VNC_MAX_X) || (h > VNC_MAX_Y) || (buffer32 == NULL)) { video_blit_complete_monitor(monitor_index); return; } @@ -260,7 +286,7 @@ vnc_resize(int x, int y) return; /* TightVNC doesn't like certain sizes.. */ - if (x < VNC_MIN_X || x > VNC_MAX_X || y < VNC_MIN_Y || y > VNC_MAX_Y) { + if ((x < VNC_MIN_X) || (x > VNC_MAX_X) || (y < VNC_MIN_Y) || (y > VNC_MAX_Y)) { vnc_log("VNC: invalid resoltion %dx%d requested!\n", x, y); return; } From b73c442af0c8f2996a4840a18450bff994cc97a8 Mon Sep 17 00:00:00 2001 From: FreeFull Date: Fri, 30 Dec 2022 23:32:57 +0000 Subject: [PATCH 093/285] Fix keyboard input for British keyboard layout Before this change, the `\|` key would be treated the same as the `/?` on a UK keyboard layout. With this change, it should behave properly, assuming the guest is also set to use a UK keyboard. --- src/qt/qt_mainwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index d707fc7ea..c87348663 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -1070,7 +1070,7 @@ std::array x11_to_xt_2 { 0x53, 0x138, 0x55, - 0x35, + 0x56, 0x57, 0x58, 0x56, From 9d09a206b4a925660a48af807ea0525f8fe392a2 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sat, 31 Dec 2022 14:06:01 -0500 Subject: [PATCH 094/285] Update version of ninja used for github actions --- .github/workflows/cmake.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index c03b6b2b4..c1758ee50 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -168,7 +168,7 @@ jobs: run: echo "C:/Program Files/LLVM/bin" >> $env:GITHUB_PATH - name: Download Ninja run: > - Invoke-WebRequest https://github.com/ninja-build/ninja/releases/download/v1.10.2/ninja-win.zip -OutFile ninja-win.zip && + Invoke-WebRequest https://github.com/ninja-build/ninja/releases/download/v1.11.1/ninja-win.zip -OutFile ninja-win.zip && Expand-Archive ninja-win.zip -DestinationPath . - name: Setup NuGet Credentials run: > From 4112d1b0c23b85b6579db5716e1c913b79c7a76c Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sat, 31 Dec 2022 17:56:51 -0500 Subject: [PATCH 095/285] Add missing libvncserver dependencies --- .github/workflows/cmake.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index c1758ee50..1c1a58e32 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -246,6 +246,7 @@ jobs: qtbase5-dev qttools5-dev libopenal-dev + libvncserver-dev - uses: actions/checkout@v3 - name: Configure CMake run: >- @@ -296,6 +297,7 @@ jobs: rtmidi qt@5 openal-soft + libvncserver - uses: actions/checkout@v3 - name: Configure CMake run: >- From 3d5d37804e9ae105cc310a90567388e990ddf225 Mon Sep 17 00:00:00 2001 From: Dylan Morrison Date: Sat, 31 Dec 2022 21:50:40 -0500 Subject: [PATCH 096/285] Added support for bumpversion to bump version/date info for Debian changelog. --- bumpversion.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bumpversion.sh b/bumpversion.sh index ac6116bcc..ce3b7c4c8 100644 --- a/bumpversion.sh +++ b/bumpversion.sh @@ -73,3 +73,5 @@ patch_file src/unix/assets/*.spec '%global romver' 's/(^%global\ romver\s+)[0-9] patch_file src/unix/assets/*.spec 'changelog version' 's/(^[*]\s.*>\s+)[0-9].+/\1'"$newversion"-1'/' patch_file src/unix/assets/*.spec 'changelog date' 's/(^[*]\s)[a-zA-Z]{3}\s[a-zA-Z]{3}\s[0-9]{2}\s[0-9]{4}/\1'"$(pretty_date)"'/' patch_file src/unix/assets/*.metainfo.xml release 's/( .+/> '"$(date -R)"'/' +patch_file debian/changelog 'changelog version' 's/86box \(.+\)/86box \('"$newversion"'\)/' From 1e26ee7cdd447a85452f4d240e760067648a944e Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sun, 1 Jan 2023 17:32:01 -0500 Subject: [PATCH 097/285] Add CodeQL checking --- .github/workflows/codeql.yml | 51 ++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 .github/workflows/codeql.yml diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 000000000..2cc36c6a6 --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,51 @@ +name: "CodeQL" + +on: [ push, pull_request] + +jobs: + analyze: + name: Analyze + + runs-on: ubuntu-latest + + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: [ 'cpp' ] + + steps: + - name: Install dependencies + run: >- + sudo apt update && sudo apt install + build-essential + ninja-build + libfreetype-dev + libsdl2-dev + libpng-dev + libc6-dev + librtmidi-dev + qtbase5-dev + qttools5-dev + libopenal-dev + libvncserver-dev + + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Initialize CodeQL + uses: github/codeql-action/init@v2 + with: + languages: ${{ matrix.language }} + + - name: Autobuild + uses: github/codeql-action/autobuild@v2 + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v2 + with: + category: "/language:${{matrix.language}}" From 96f7b7aa14b3af9cf26b36d21c6ec0c2c0d19453 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Tue, 3 Jan 2023 15:42:57 +0600 Subject: [PATCH 098/285] Add Wacom SD-510C tablet emulation --- src/86box.c | 4 +- src/config.c | 8 + src/device.c | 2 +- src/device/CMakeLists.txt | 3 +- src/device/mouse.c | 13 +- src/device/mouse_bus.c | 2 +- src/device/mouse_ps2.c | 2 +- src/device/mouse_serial.c | 2 +- src/device/mouse_wacom_tablet.c | 392 ++++++++++++++++++++++++++++++++ src/include/86box/device.h | 2 +- src/include/86box/mouse.h | 6 + src/include/86box/ui.h | 1 + src/qt/qt_mainwindow.cpp | 31 ++- src/qt/qt_mainwindow.hpp | 7 + src/qt/qt_mainwindow.ui | 24 ++ src/qt/qt_rendererstack.cpp | 52 ++++- src/qt/qt_rendererstack.hpp | 7 + src/qt/qt_ui.cpp | 6 + src/unix/unix.c | 5 + src/win/Makefile.mingw | 1 + src/win/win_ui.c | 6 + 21 files changed, 558 insertions(+), 18 deletions(-) create mode 100644 src/device/mouse_wacom_tablet.c diff --git a/src/86box.c b/src/86box.c index 147233b21..c98b26185 100644 --- a/src/86box.c +++ b/src/86box.c @@ -1118,6 +1118,8 @@ pc_reset_hard_init(void) #endif update_mouse_msg(); + + ui_hard_reset_completed(); } void @@ -1265,7 +1267,7 @@ pc_run(void) } if (title_update) { - mouse_msg_idx = (mouse_type == MOUSE_TYPE_NONE) ? 2 : !!mouse_capture; + mouse_msg_idx = (mouse_type == MOUSE_TYPE_NONE || mouse_mode >= 1) ? 2 : !!mouse_capture; swprintf(temp, sizeof_w(temp), mouse_msg[mouse_msg_idx], fps); #ifdef __APPLE__ /* Needed due to modifying the UI on the non-main thread is a big no-no. */ diff --git a/src/config.c b/src/config.c index 8e2b5c292..49e6afca9 100644 --- a/src/config.c +++ b/src/config.c @@ -650,6 +650,8 @@ load_input_devices(void) } } } + + tablet_tool_type = !!ini_section_get_int(cat, "tablet_tool_type", 1); } /* Load "Sound" section. */ @@ -2287,6 +2289,12 @@ save_input_devices(void) } } + if (tablet_tool_type != 1) { + ini_section_set_int(cat, "tablet_tool_type", tablet_tool_type); + } else { + ini_section_delete_var(cat, "tablet_tool_type"); + } + ini_delete_section_if_empty(config, cat); } diff --git a/src/device.c b/src/device.c index a13825307..95c62624c 100644 --- a/src/device.c +++ b/src/device.c @@ -412,7 +412,7 @@ device_poll(const device_t *d, int x, int y, int z, int b) if (devices[c] != NULL) { if (devices[c] == d) { if (devices[c]->poll) - return (devices[c]->poll(x, y, z, b, device_priv[c])); + return (devices[c]->poll(x, y, z, b, 0, 0, device_priv[c])); } } } diff --git a/src/device/CMakeLists.txt b/src/device/CMakeLists.txt index 7fd0b20d0..27e854387 100644 --- a/src/device/CMakeLists.txt +++ b/src/device/CMakeLists.txt @@ -17,7 +17,8 @@ add_library(dev OBJECT bugger.c cassette.c cartridge.c hasp.c hwm.c hwm_lm75.c h hwm_vt82c686.c ibm_5161.c isamem.c isartc.c ../lpt.c pci_bridge.c postcard.c serial.c clock_ics9xxx.c isapnp.c i2c.c i2c_gpio.c smbus_piix4.c smbus_ali7101.c keyboard.c keyboard_xt.c keyboard_at.c - mouse.c mouse_bus.c mouse_serial.c mouse_ps2.c phoenix_486_jumper.c) + mouse.c mouse_bus.c mouse_serial.c mouse_ps2.c phoenix_486_jumper.c + mouse_wacom_tablet.c) if(ISAMEM_RAMPAGE) target_compile_definitions(dev PRIVATE USE_ISAMEM_RAMPAGE) diff --git a/src/device/mouse.c b/src/device/mouse.c index 422161a83..23046bdbc 100644 --- a/src/device/mouse.c +++ b/src/device/mouse.c @@ -37,7 +37,14 @@ int mouse_type = 0; int mouse_x, mouse_y, mouse_z, - mouse_buttons; + mouse_buttons, + mouse_mode, + mouse_tablet_in_proximity = 0, + tablet_tool_type = 0; /* 0 = Puck/Cursor, 1 = Pen */ + +double mouse_x_abs, + mouse_y_abs; + static const device_t mouse_none_device = { .name = "None", @@ -80,6 +87,7 @@ static mouse_t mouse_devices[] = { { &mouse_msserial_device }, { &mouse_ltserial_device }, { &mouse_ps2_device }, + { &mouse_wacom_device }, { NULL } // clang-format on }; @@ -146,6 +154,7 @@ mouse_reset(void) /* Clear local data. */ mouse_x = mouse_y = mouse_z = 0; mouse_buttons = 0x00; + mouse_mode = 0; /* If no mouse configured, we're done. */ if (mouse_type == 0) @@ -174,7 +183,7 @@ mouse_process(void) if ((mouse_dev_poll != NULL) || (mouse_curr->poll != NULL)) { if (mouse_curr->poll != NULL) - mouse_curr->poll(mouse_x, mouse_y, mouse_z, mouse_buttons, mouse_priv); + mouse_curr->poll(mouse_x, mouse_y, mouse_z, mouse_buttons, mouse_x_abs, mouse_y_abs, mouse_priv); else mouse_dev_poll(mouse_x, mouse_y, mouse_z, mouse_buttons, mouse_priv); diff --git a/src/device/mouse_bus.c b/src/device/mouse_bus.c index 802ae6d45..c0c57b7d0 100644 --- a/src/device/mouse_bus.c +++ b/src/device/mouse_bus.c @@ -449,7 +449,7 @@ ms_write(uint16_t port, uint8_t val, void *priv) /* The emulator calls us with an update on the host mouse device. */ static int -bm_poll(int x, int y, int z, int b, void *priv) +bm_poll(int x, int y, int z, int b, double abs_x, double abs_y, void *priv) { mouse_t *dev = (mouse_t *) priv; int xor ; diff --git a/src/device/mouse_ps2.c b/src/device/mouse_ps2.c index e7670b2fc..870d9ae5f 100644 --- a/src/device/mouse_ps2.c +++ b/src/device/mouse_ps2.c @@ -261,7 +261,7 @@ mouse_reset: } static int -ps2_poll(int x, int y, int z, int b, void *priv) +ps2_poll(int x, int y, int z, int b, double abs_x, double abs_y, void *priv) { mouse_t *dev = (mouse_t *) priv; diff --git a/src/device/mouse_serial.c b/src/device/mouse_serial.c index 2edc342e9..f5e532101 100644 --- a/src/device/mouse_serial.c +++ b/src/device/mouse_serial.c @@ -511,7 +511,7 @@ sermouse_command_timer(void *priv) } static int -sermouse_poll(int x, int y, int z, int b, void *priv) +sermouse_poll(int x, int y, int z, int b, double abs_x, double abs_y, void *priv) { mouse_t *dev = (mouse_t *) priv; diff --git a/src/device/mouse_wacom_tablet.c b/src/device/mouse_wacom_tablet.c new file mode 100644 index 000000000..0aaa4cf53 --- /dev/null +++ b/src/device/mouse_wacom_tablet.c @@ -0,0 +1,392 @@ +#include +#include +#include +#include +#include <86box/86box.h> +#include <86box/device.h> +#include <86box/timer.h> +#include <86box/mouse.h> +#include <86box/serial.h> +#include <86box/plat.h> + +#define FLAG_3BTN 0x20 /* enable 3-button mode */ + +enum wacom_modes +{ + WACOM_MODE_SUPPRESSED = 0, + WACOM_MODE_POINT = 1, + WACOM_MODE_STREAM = 2, + WACOM_MODE_SWITCH = 3, +}; + +enum { + REPORT_PHASE_PREPARE, + REPORT_PHASE_TRANSMIT +}; + +typedef struct { + const char *name; /* name of this device */ + int8_t type, /* type of this device */ + port; + uint8_t flags, but, /* device flags */ + status, format, + data_len, data[64], + data_rec[0x200]; + int abs_x, abs_y, + rel_x, rel_y, + oldb, lastb, b; + + int data_pos, data_rec_pos, mode, transmission_ongoing, transmission_format, interval; + int increment, suppressed_increment; + int transmission_stopped; + int reset; + int transmit_id, transmit_id_pending; + int pressure_mode; + int suppressed, measurement, always_report; + + int last_abs_x, last_abs_y; /* Suppressed/Increment Mode. */ + + double transmit_period, report_period; + double old_tsc; + pc_timer_t command_timer, report_timer; + + serial_t *serial; +} mouse_wacom_t; + +static double +wacom_transmit_period(mouse_wacom_t *dev, int bps, int rps) +{ + double dbps = (double) bps; + double temp = 0.0; + int word_len = 10; + + if (rps == -1) + temp = (double) word_len; + else { + temp = (double) rps; + temp = (9600.0 - (temp * 33.0)); + temp /= rps; + } + temp = (1000000.0 / dbps) * temp; + + return temp; +} + +static void +wacom_reset(mouse_wacom_t* wacom) +{ + wacom->transmit_period = wacom_transmit_period(wacom, 9600, -1); + wacom->mode = WACOM_MODE_POINT; + wacom->data_pos = 0; + wacom->transmission_ongoing = 0; + wacom->mode = 0; + wacom->transmission_stopped = 0; + wacom->interval = 0; + wacom->transmit_id = 0; + wacom->format = 0; /* ASCII */ + wacom->measurement = 1; + + mouse_mode = 1; +} + +static void +wacom_callback(struct serial_s *serial, void *priv) +{ + mouse_wacom_t* wacom = (mouse_wacom_t*)priv; + + wacom->transmit_period = wacom_transmit_period(wacom, 9600, -1); + timer_stop(&wacom->report_timer); + timer_on_auto(&wacom->report_timer, wacom->transmit_period); +} + +static void +wacom_write(struct serial_s *serial, void *priv, uint8_t data) +{ + mouse_wacom_t* wacom = (mouse_wacom_t*)priv; + static int special_command = 0; + + if (data == '~') { + special_command = 1; + return; + } + if (special_command) { + switch (data) { + case '#': + { + if (!wacom->transmission_ongoing) wacom->transmit_id++; + break; + } + } + special_command = 0; + return; + } + if (data == '$') { + wacom_reset(wacom); + } + if (data == 0x13) { + wacom->transmission_stopped = 1; + pclog("WACOM: transmission stopped\n"); + } + if (data == 0x11) { + wacom->transmission_stopped = 0; + pclog("WACOM: transmission started\n"); + } + wacom->data_rec[wacom->data_rec_pos++] = data; + if (data == '\r') { + wacom->data_rec[wacom->data_rec_pos] = 0; + wacom->data_rec_pos = 0; + + if (!memcmp(wacom->data_rec, "AS", 2)) { + wacom->format = (wacom->data_rec[2] == '1'); + wacom->transmission_ongoing = 0; + } else if (!memcmp(wacom->data_rec, "SR", 2)) { + wacom->mode = WACOM_MODE_STREAM; + wacom->suppressed_increment = 0; + } else if (!memcmp(wacom->data_rec, "IN", 2)) { + sscanf((const char*)wacom->data_rec, "IN%d", &wacom->increment); + } else if (!memcmp(wacom->data_rec, "RE", 2)) { + wacom_reset(wacom); + } else if (!memcmp(wacom->data_rec, "IT", 2)) { + sscanf((const char*)wacom->data_rec, "IT%d", &wacom->interval); + } else if (!memcmp(wacom->data_rec, "DE", 2)) { + sscanf((const char*)wacom->data_rec, "DE%d", &mouse_mode); + mouse_mode = !mouse_mode; + plat_mouse_capture(0); + } else if (!memcmp(wacom->data_rec, "SU", 2)) { + sscanf((const char*)wacom->data_rec, "SU%d", &wacom->suppressed_increment); + } else if (!memcmp(wacom->data_rec, "PH", 2)) { + sscanf((const char*)wacom->data_rec, "PH%d", &wacom->pressure_mode); + } else if (!memcmp(wacom->data_rec, "IC", 2)) { + sscanf((const char*)wacom->data_rec, "IC%d", &wacom->measurement); + } else if (!memcmp(wacom->data_rec, "AL", 2)) { + sscanf((const char*)wacom->data_rec, "AL%d", &wacom->always_report); + } else { + pclog("Unknown command: %s\n", wacom->data_rec); + } + } +} + +static int +wacom_poll(int x, int y, int z, int b, double abs_x, double abs_y, void *priv) +{ + mouse_wacom_t* wacom = (mouse_wacom_t*)priv; + if (abs_x > 1.0l) abs_x = 1.0l; + if (abs_y > 1.0l) abs_y = 1.0l; + if (abs_x < 0.l) abs_x = 0.l; + if (abs_y < 0.l) abs_y = 0.l; + wacom->abs_x = abs_x * (wacom->measurement ? 4566. : 5800.); + wacom->abs_y = abs_y * (wacom->measurement ? 2972. : 3774.); + wacom->rel_x = x; + wacom->rel_y = y; + if (wacom->b != b) wacom->oldb = wacom->b; + wacom->b = b; + return (0); +} + +static int +wacom_switch_off_to_on(int b, int oldb) +{ + if (!(oldb & 0x1) && (b & 1)) return 1; + if (!(oldb & 0x2) && (b & 2)) return 1; + if (!(oldb & 0x4) && (b & 4)) return 1; + + return 0; +} + +static uint8_t +wacom_get_switch(int b) +{ + if (b & 0x4) return 0x23; + if (b & 0x2) return 0x22; + if (b & 0x1) return 0x21; + + return 0x00; +} + +extern double cpuclock; +static void +sermouse_report_timer(void *priv) +{ + mouse_wacom_t* wacom = (mouse_wacom_t*)priv; + uint32_t transmitted = 0; + double milisecond_diff = ((double)(tsc - wacom->old_tsc)) / cpuclock * 1000.0; + int x = (mouse_mode == 0 ? wacom->rel_x : wacom->abs_x), y = (mouse_mode == 0 ? wacom->rel_y : wacom->abs_y); + + timer_on_auto(&wacom->report_timer, wacom->transmit_id ? (wacom->transmit_period / 8.0) : wacom->transmit_period); + if (wacom->transmit_id && !wacom->transmission_ongoing) + goto transmit_prepare; + if (wacom->transmission_ongoing) + goto transmit; + else { + int x_diff = (mouse_mode == 0 ? wacom->rel_x : (wacom->last_abs_x - wacom->abs_x)); + int y_diff = (mouse_mode == 0 ? wacom->rel_y : (wacom->last_abs_y - wacom->abs_y)); + + if (wacom->transmission_stopped || (!mouse_tablet_in_proximity && !wacom->always_report)) return; + if (milisecond_diff >= (wacom->interval * 5)) { + transmitted = 1; + wacom->old_tsc = tsc; + } else transmitted = 0; + if (!transmitted) + return; + if (wacom->increment && !(x_diff >= wacom->increment || y_diff >= wacom->increment || wacom_switch_off_to_on(wacom->b, wacom->oldb))) + return; + + if (wacom->suppressed_increment && !(x_diff >= wacom->suppressed_increment || y_diff >= wacom->suppressed_increment || (wacom->b != wacom->oldb))) + return; + + switch (wacom->mode) { + case WACOM_MODE_STREAM: + default: + break; + + case WACOM_MODE_POINT: + { + if (!(wacom_switch_off_to_on(wacom->b, wacom->oldb))) + return; + break; + } + + case WACOM_MODE_SWITCH: + { + if (!wacom->b) + return; + + break; + } + } + } + +transmit_prepare: + if (wacom->transmit_id) { + wacom->transmission_format = 0; + wacom->transmission_ongoing = 1; + wacom->data_pos = 0; + memset(wacom->data, 0, sizeof(wacom->data)); + strcat((char*)wacom->data, "~#SD51C V3.2.1.01\r"); + goto transmit; + } + wacom->transmission_ongoing = 1; + wacom->transmission_format = wacom->format; + wacom->data_pos = 0; + wacom->last_abs_x = wacom->abs_x; + wacom->last_abs_y = wacom->abs_y; + wacom->oldb = wacom->b; + if (wacom->format == 1) { + memset(wacom->data, 0, 7); + wacom->data[0] = 0xC0; + wacom->data[6] = wacom->pressure_mode ? ((wacom->b & 0x1) ? (uint8_t)31 : (uint8_t)-31) : wacom_get_switch(wacom->b); + + wacom->data[5] = (y & 0x7F); + wacom->data[4] = ((y & 0x3F80) >> 7) & 0x7F; + wacom->data[3] = (((y & 0xC000) >> 14) & 3); + + wacom->data[2] = (x & 0x7F); + wacom->data[1] = ((x & 0x3F80) >> 7) & 0x7F; + wacom->data[0] |= (((x & 0xC000) >> 14) & 3); + + if (mouse_mode == 0) { + wacom->data[0] |= (!!(x < 0)) << 2; + wacom->data[3] |= (!!(y < 0)) << 2; + } + if (wacom->pressure_mode) { + wacom->data[0] |= 0x10; + wacom->data[6] &= 0x7F; + } + if (tablet_tool_type == 1) { + wacom->data[0] |= 0x20; + } + + if (!mouse_tablet_in_proximity) { + wacom->data[0] &= ~0x40; + } + } else { + wacom->data[0] = 0; + snprintf((char*)wacom->data, sizeof(wacom->data), "*,%05d,%05d,%d\r\n", wacom->abs_x, wacom->abs_y, wacom->pressure_mode ? ((wacom->b & 0x1) ? (uint8_t)-31 : (uint8_t)15) : ((wacom->b & 0x1) ? 0x21 : 0x00)); + } +transmit: + serial_write_fifo(wacom->serial, wacom->data[wacom->data_pos++]); + if ((wacom->transmission_format == 0 && wacom->data[wacom->data_pos] == 0) + || (wacom->transmission_format == 1 && wacom->data_pos == 7)) { + wacom->transmission_ongoing = 0; + wacom->transmit_id = 0; + wacom->data_pos = 0; + wacom->old_tsc = tsc; + } + return; +} + +static void * +wacom_init(const device_t *info) +{ + mouse_wacom_t *dev; + + dev = (mouse_wacom_t *) calloc(1, sizeof(mouse_wacom_t)); + dev->name = info->name; + dev->but = 3; + + dev->port = device_get_config_int("port"); + + dev->serial = serial_attach(dev->port, wacom_callback, wacom_write, dev); + timer_add(&dev->report_timer, sermouse_report_timer, dev, 0); + mouse_set_buttons(dev->but); + + wacom_reset(dev); + + return dev; +} + +static void +wacom_speed_changed(void *priv) +{ + mouse_wacom_t *dev = (mouse_wacom_t *) priv; + + wacom_callback(dev->serial, dev); +} + +static void +wacom_close(void *priv) +{ + mouse_wacom_t *dev = (mouse_wacom_t *) 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); +} + +static const device_config_t wacom_config[] = { + // clang-format off + { + .name = "port", + .description = "Serial Port", + .type = CONFIG_SELECTION, + .default_string = "", + .default_int = 0, + .file_filter = "", + .spinner = { 0 }, + .selection = { + { .description = "COM1", .value = 0 }, + { .description = "COM2", .value = 1 }, + { .description = "COM3", .value = 2 }, + { .description = "COM4", .value = 3 }, + { .description = "" } + } + }, + { .name = "", .description = "", .type = CONFIG_END } + // clang-format on +}; + +const device_t mouse_wacom_device = { + .name = "Wacom SD-510C", + .internal_name = "wacom_serial", + .flags = DEVICE_COM, + .local = MOUSE_TYPE_WACOM, + .init = wacom_init, + .close = wacom_close, + .reset = NULL, + { .poll = wacom_poll }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = wacom_config +}; diff --git a/src/include/86box/device.h b/src/include/86box/device.h index ca4e6bdf2..18e2a4455 100644 --- a/src/include/86box/device.h +++ b/src/include/86box/device.h @@ -122,7 +122,7 @@ typedef struct _device_ { void (*reset)(void *priv); union { int (*available)(void); - int (*poll)(int x, int y, int z, int b, void *priv); + int (*poll)(int x, int y, int z, int b, double abs_x, double abs_y, void *priv); void (*register_pci_slot)(int device, int type, int inta, int intb, int intc, int intd, void *priv); }; void (*speed_changed)(void *priv); diff --git a/src/include/86box/mouse.h b/src/include/86box/mouse.h index 434360589..5e56a365e 100644 --- a/src/include/86box/mouse.h +++ b/src/include/86box/mouse.h @@ -34,6 +34,7 @@ #define MOUSE_TYPE_LOGITECH 9 /* Logitech 2-button Serial Mouse */ #define MOUSE_TYPE_LT3BUTTON 10 /* Logitech 3-button Serial Mouse */ #define MOUSE_TYPE_PS2 11 /* PS/2 series Bus Mouse */ +#define MOUSE_TYPE_WACOM 12 /* WACOM tablet */ #define MOUSE_TYPE_ONBOARD 0x80 /* Mouse is an on-board version of one of the above. */ @@ -43,7 +44,11 @@ extern "C" { extern int mouse_type; extern int mouse_x, mouse_y, mouse_z; +extern int mouse_mode; /* 1 = Absolute, 0 = Relative */ +extern int mouse_tablet_in_proximity; +extern double mouse_x_abs, mouse_y_abs; extern int mouse_buttons; +extern int tablet_tool_type; #ifdef EMU_DEVICE_H extern const device_t *mouse_get_device(int mouse); @@ -59,6 +64,7 @@ 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; +extern const device_t mouse_wacom_device; #endif extern void mouse_init(void); diff --git a/src/include/86box/ui.h b/src/include/86box/ui.h index 5eb15a08d..70971ce19 100644 --- a/src/include/86box/ui.h +++ b/src/include/86box/ui.h @@ -61,6 +61,7 @@ extern void ui_check_menu_item(int id, int checked); extern wchar_t *ui_window_title(wchar_t *s); extern void ui_status_update(void); +extern void ui_hard_reset_completed(void); extern void ui_init_monitor(int monitor_index); extern void ui_deinit_monitor(int monitor_index); extern int ui_sb_find_part(int tag); diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index 1c2ae6097..f3072706d 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -42,6 +42,7 @@ extern "C" { #include <86box/discord.h> #include <86box/device.h> #include <86box/video.h> +#include <86box/mouse.h> #include <86box/machine.h> #include <86box/vid_ega.h> #include <86box/version.h> @@ -188,6 +189,12 @@ MainWindow::MainWindow(QWidget *parent) vmname.truncate(vmname.size() - 1); this->setWindowTitle(QString("%1 - %2 %3").arg(vmname, EMU_NAME, EMU_VERSION_FULL)); + connect(this, &MainWindow::hardResetCompleted, this, [this]() { + ui->actionMCA_devices->setVisible(machine_has_bus(machine, MACHINE_BUS_MCA)); + QApplication::setOverrideCursor(Qt::ArrowCursor); + ui->menuTablet_tool->menuAction()->setVisible(mouse_mode >= 1); + }); + connect(this, &MainWindow::showMessageForNonQtThread, this, &MainWindow::showMessage_, Qt::BlockingQueuedConnection); connect(this, &MainWindow::setTitle, this, [this, toolbar_label](const QString &title) { @@ -622,6 +629,16 @@ MainWindow::MainWindow(QWidget *parent) } }); #endif + + actGroup = new QActionGroup(this); + actGroup->addAction(ui->actionCursor_Puck); + actGroup->addAction(ui->actionPen); + + if (tablet_tool_type == 1) { + ui->actionPen->setChecked(true); + } else { + ui->actionCursor_Puck->setChecked(true); + } } void @@ -1671,7 +1688,6 @@ MainWindow::refreshMediaMenu() { mm->refresh(ui->menuMedia); status->refresh(ui->statusbar); - ui->actionMCA_devices->setVisible(machine_has_bus(machine, MACHINE_BUS_MCA)); } void @@ -2411,3 +2427,16 @@ MainWindow::on_actionApply_fullscreen_stretch_mode_when_maximized_triggered(bool device_force_redraw(); config_save(); } + +void MainWindow::on_actionCursor_Puck_triggered() +{ + tablet_tool_type = 0; + config_save(); +} + +void MainWindow::on_actionPen_triggered() +{ + tablet_tool_type = 1; + config_save(); +} + diff --git a/src/qt/qt_mainwindow.hpp b/src/qt/qt_mainwindow.hpp index 6ad4c9beb..fb05a4588 100644 --- a/src/qt/qt_mainwindow.hpp +++ b/src/qt/qt_mainwindow.hpp @@ -50,6 +50,7 @@ signals: void destroyRendererMonitor(int monitor_index); void initRendererMonitorForNonQtThread(int monitor_index); void destroyRendererMonitorForNonQtThread(int monitor_index); + void hardResetCompleted(); void setTitle(const QString &title); void setFullscreen(bool state); @@ -134,6 +135,12 @@ protected: void closeEvent(QCloseEvent *event) override; void changeEvent(QEvent *event) override; +private slots: + void on_actionPen_triggered(); + +private slots: + void on_actionCursor_Puck_triggered(); + private slots: void on_actionShow_non_primary_monitors_triggered(); diff --git a/src/qt/qt_mainwindow.ui b/src/qt/qt_mainwindow.ui index 6a86b632e..1a00df27a 100644 --- a/src/qt/qt_mainwindow.ui +++ b/src/qt/qt_mainwindow.ui @@ -61,8 +61,16 @@ &Action + + + Tablet tool + + + + + @@ -851,6 +859,22 @@ Apply fullscreen stretch mode when maximized + + + true + + + Cursor/Puck + + + + + true + + + Pen + + diff --git a/src/qt/qt_rendererstack.cpp b/src/qt/qt_rendererstack.cpp index d36a88f86..0436112d1 100644 --- a/src/qt/qt_rendererstack.cpp +++ b/src/qt/qt_rendererstack.cpp @@ -58,8 +58,10 @@ double mouse_x_error = 0.0, mouse_y_error = 0.0; } struct mouseinputdata { - atomic_int deltax, deltay, deltaz; - atomic_int mousebuttons; + atomic_int deltax, deltay, deltaz; + atomic_int mousebuttons; + atomic_bool mouse_tablet_in_proximity; + std::atomic x_abs, y_abs; }; static mouseinputdata mousedata; @@ -116,6 +118,7 @@ RendererStack::RendererStack(QWidget *parent, int monitor_index) RendererStack::~RendererStack() { + QApplication::restoreOverrideCursor(); delete ui; } @@ -142,9 +145,12 @@ void RendererStack::mousePoll() { #ifndef __APPLE__ - mouse_x = mousedata.deltax; - mouse_y = mousedata.deltay; - mouse_z = mousedata.deltaz; + mouse_x = mousedata.deltax; + mouse_y = mousedata.deltay; + mouse_z = mousedata.deltaz; + mouse_x_abs = mousedata.x_abs; + mouse_y_abs = mousedata.y_abs; + mouse_tablet_in_proximity = mousedata.mouse_tablet_in_proximity; mousedata.deltax = mousedata.deltay = mousedata.deltaz = 0; mouse_buttons = mousedata.mousebuttons; @@ -166,7 +172,7 @@ int ignoreNextMouseEvent = 1; void RendererStack::mouseReleaseEvent(QMouseEvent *event) { - if (this->geometry().contains(event->pos()) && event->button() == Qt::LeftButton && !mouse_capture && (isMouseDown & 1) && (mouse_get_buttons() != 0)) { + if (this->geometry().contains(event->pos()) && event->button() == Qt::LeftButton && !mouse_capture && (isMouseDown & 1) && (mouse_get_buttons() != 0) && mouse_mode == 0) { plat_mouse_capture(1); this->setCursor(Qt::BlankCursor); if (!ignoreNextMouseEvent) @@ -180,7 +186,7 @@ RendererStack::mouseReleaseEvent(QMouseEvent *event) isMouseDown &= ~1; return; } - if (mouse_capture) { + if (mouse_capture || mouse_mode >= 1) { mousedata.mousebuttons &= ~event->button(); } isMouseDown &= ~1; @@ -190,7 +196,7 @@ void RendererStack::mousePressEvent(QMouseEvent *event) { isMouseDown |= 1; - if (mouse_capture) { + if (mouse_capture || mouse_mode >= 1) { mousedata.mousebuttons |= event->button(); } event->accept(); @@ -238,9 +244,26 @@ RendererStack::mouseMoveEvent(QMouseEvent *event) #endif } + +void +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) +RendererStack::enterEvent(QEnterEvent *event) +#else +RendererStack::enterEvent(QEvent *event) +#endif +{ + mousedata.mouse_tablet_in_proximity = 1; + + if (mouse_mode == 1) + QApplication::setOverrideCursor(Qt::BlankCursor); +} + void RendererStack::leaveEvent(QEvent *event) { + mousedata.mouse_tablet_in_proximity = 0; + if (mouse_mode == 1) + QApplication::setOverrideCursor(Qt::ArrowCursor); if (QApplication::platformName().contains("wayland")) { event->accept(); return; @@ -501,3 +524,16 @@ RendererStack::changeEvent(QEvent *event) config_save(); } } + +bool +RendererStack::event(QEvent* event) +{ + if (event->type() == QEvent::MouseMove) { + QMouseEvent* mouse_event = (QMouseEvent*)event; + if (mouse_mode >= 1) { + mousedata.x_abs = (mouse_event->localPos().x()) / (long double)width(); + mousedata.y_abs = (mouse_event->localPos().y()) / (long double)height(); + } + } + return QStackedWidget::event(event); +} diff --git a/src/qt/qt_rendererstack.hpp b/src/qt/qt_rendererstack.hpp index baee5ea9f..27e07747c 100644 --- a/src/qt/qt_rendererstack.hpp +++ b/src/qt/qt_rendererstack.hpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include @@ -30,6 +31,11 @@ public: void mouseReleaseEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; void wheelEvent(QWheelEvent *event) override; +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + void enterEvent(QEnterEvent *event) override; +#else + void enterEvent(QEvent *event) override; +#endif void leaveEvent(QEvent *event) override; void closeEvent(QCloseEvent *event) override; void changeEvent(QEvent *event) override; @@ -45,6 +51,7 @@ public: { event->ignore(); } + bool event(QEvent* event) override; enum class Renderer { Software, diff --git a/src/qt/qt_ui.cpp b/src/qt/qt_ui.cpp index a2864f3ea..305ec9ed5 100644 --- a/src/qt/qt_ui.cpp +++ b/src/qt/qt_ui.cpp @@ -74,6 +74,12 @@ ui_window_title(wchar_t *str) return str; } +void +ui_hard_reset_completed() +{ + emit main_window->hardResetCompleted(); +} + extern "C" void qt_blit(int x, int y, int w, int h, int monitor_index) { diff --git a/src/unix/unix.c b/src/unix/unix.c index 296da5e14..04c9de48b 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -1319,3 +1319,8 @@ void ui_sb_mt32lcd(char *str) { } + +void +ui_hard_reset_completed(void) +{ +} diff --git a/src/win/Makefile.mingw b/src/win/Makefile.mingw index 040b14aee..a743db40c 100644 --- a/src/win/Makefile.mingw +++ b/src/win/Makefile.mingw @@ -596,6 +596,7 @@ DEVOBJ := bugger.o cartridge.o cassette.o hasp.o hwm.o hwm_lm75.o hwm_lm78.o hwm mouse.o \ mouse_bus.o \ mouse_serial.o mouse_ps2.o \ + mouse_wacom_tablet.o \ phoenix_486_jumper.o SIOOBJ := sio_acc3221.o sio_ali5123.o \ diff --git a/src/win/win_ui.c b/src/win/win_ui.c index 38d7e161c..0e1ca6700 100644 --- a/src/win/win_ui.c +++ b/src/win/win_ui.c @@ -1582,7 +1582,13 @@ void ui_init_monitor(int monitor_index) { } + void ui_deinit_monitor(int monitor_index) { } + +void +ui_hard_reset_completed(void) +{ +} From 6bb26b7f7456398996ab4d2f83ad7843f5656440 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Tue, 3 Jan 2023 21:42:35 +0600 Subject: [PATCH 099/285] wacom: Clamp coordinates after conversion --- src/device/mouse_wacom_tablet.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/device/mouse_wacom_tablet.c b/src/device/mouse_wacom_tablet.c index 0aaa4cf53..099f9c5c8 100644 --- a/src/device/mouse_wacom_tablet.c +++ b/src/device/mouse_wacom_tablet.c @@ -170,12 +170,10 @@ static int wacom_poll(int x, int y, int z, int b, double abs_x, double abs_y, void *priv) { mouse_wacom_t* wacom = (mouse_wacom_t*)priv; - if (abs_x > 1.0l) abs_x = 1.0l; - if (abs_y > 1.0l) abs_y = 1.0l; - if (abs_x < 0.l) abs_x = 0.l; - if (abs_y < 0.l) abs_y = 0.l; wacom->abs_x = abs_x * (wacom->measurement ? 4566. : 5800.); wacom->abs_y = abs_y * (wacom->measurement ? 2972. : 3774.); + if (wacom->abs_x > (wacom->measurement ? 4566 : 5800)) wacom->abs_x = (wacom->measurement ? 4566 : 5800); + if (wacom->abs_y > (wacom->measurement ? 2972 : 3774)) wacom->abs_x = (wacom->measurement ? 2972 : 3774); wacom->rel_x = x; wacom->rel_y = y; if (wacom->b != b) wacom->oldb = wacom->b; From b9f8e09db0628bc89cc84d705021e96ccb59e6af Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Tue, 3 Jan 2023 21:42:49 +0600 Subject: [PATCH 100/285] Made absolute mouse coordinates work under macOS --- src/qt/macos_event_filter.mm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/qt/macos_event_filter.mm b/src/qt/macos_event_filter.mm index 6f84beee5..28c0e5de7 100644 --- a/src/qt/macos_event_filter.mm +++ b/src/qt/macos_event_filter.mm @@ -96,6 +96,8 @@ macos_poll_mouse() mouse_x = mousedata.deltax; mouse_y = mousedata.deltay; mouse_z = mousedata.deltaz; + mouse_abs_x = mousedata.x_abs; + mouse_abs_y = mousedata.y_abs; mousedata.deltax = mousedata.deltay = mousedata.deltaz = 0; mouse_buttons = mousedata.mousebuttons; } From ef18a27bc92137156b2a82335ef72c121e01d00e Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Tue, 3 Jan 2023 21:43:10 +0600 Subject: [PATCH 101/285] Made absolute mouse coordinates work under Windows as well --- src/qt/qt_main.cpp | 1 - src/qt/qt_rendererstack.cpp | 5 +++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/qt/qt_main.cpp b/src/qt/qt_main.cpp index 1ae545227..b162e6abc 100644 --- a/src/qt/qt_main.cpp +++ b/src/qt/qt_main.cpp @@ -246,7 +246,6 @@ main(int argc, char *argv[]) auto rawInputFilter = WindowsRawInputFilter::Register(main_window); if (rawInputFilter) { app.installNativeEventFilter(rawInputFilter.get()); - QObject::disconnect(main_window, &MainWindow::pollMouse, 0, 0); QObject::connect(main_window, &MainWindow::pollMouse, (WindowsRawInputFilter *) rawInputFilter.get(), &WindowsRawInputFilter::mousePoll, Qt::DirectConnection); main_window->setSendKeyboardInput(false); } diff --git a/src/qt/qt_rendererstack.cpp b/src/qt/qt_rendererstack.cpp index 0436112d1..bf9098592 100644 --- a/src/qt/qt_rendererstack.cpp +++ b/src/qt/qt_rendererstack.cpp @@ -144,6 +144,11 @@ qt_mouse_capture(int on) void RendererStack::mousePoll() { +#ifdef Q_OS_WINDOWS + mouse_x_abs = mousedata.x_abs; + mouse_y_abs = mousedata.y_abs; + return; +#endif #ifndef __APPLE__ mouse_x = mousedata.deltax; mouse_y = mousedata.deltay; From 3e1ef68a5fdd734e4a84533dffab13c6c1991657 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Tue, 3 Jan 2023 21:46:40 +0600 Subject: [PATCH 102/285] 86box.c: Parenthesis addition --- src/86box.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/86box.c b/src/86box.c index c98b26185..0e1e49fd2 100644 --- a/src/86box.c +++ b/src/86box.c @@ -1267,7 +1267,7 @@ pc_run(void) } if (title_update) { - mouse_msg_idx = (mouse_type == MOUSE_TYPE_NONE || mouse_mode >= 1) ? 2 : !!mouse_capture; + mouse_msg_idx = ((mouse_type == MOUSE_TYPE_NONE) || (mouse_mode >= 1)) ? 2 : !!mouse_capture; swprintf(temp, sizeof_w(temp), mouse_msg[mouse_msg_idx], fps); #ifdef __APPLE__ /* Needed due to modifying the UI on the non-main thread is a big no-no. */ From 0ea498d9ce10120245b5b5a5048c8f28ae9afa9f Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Tue, 3 Jan 2023 22:20:30 +0600 Subject: [PATCH 103/285] wacom: Account for negative coordinate overflows --- src/device/mouse_wacom_tablet.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/device/mouse_wacom_tablet.c b/src/device/mouse_wacom_tablet.c index 099f9c5c8..8ea807bd7 100644 --- a/src/device/mouse_wacom_tablet.c +++ b/src/device/mouse_wacom_tablet.c @@ -174,6 +174,8 @@ wacom_poll(int x, int y, int z, int b, double abs_x, double abs_y, void *priv) wacom->abs_y = abs_y * (wacom->measurement ? 2972. : 3774.); if (wacom->abs_x > (wacom->measurement ? 4566 : 5800)) wacom->abs_x = (wacom->measurement ? 4566 : 5800); if (wacom->abs_y > (wacom->measurement ? 2972 : 3774)) wacom->abs_x = (wacom->measurement ? 2972 : 3774); + if (wacom->abs_x < 0) wacom->abs_x = 0; + if (wacom->abs_y < 0) wacom->abs_y = 0; wacom->rel_x = x; wacom->rel_y = y; if (wacom->b != b) wacom->oldb = wacom->b; From e4180603e0498504bb10e5267a8f098503669e96 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Tue, 3 Jan 2023 22:22:33 +0600 Subject: [PATCH 104/285] Revert "Made absolute mouse coordinates work under macOS" This reverts commit b9f8e09db0628bc89cc84d705021e96ccb59e6af. --- src/qt/macos_event_filter.mm | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/qt/macos_event_filter.mm b/src/qt/macos_event_filter.mm index 28c0e5de7..6f84beee5 100644 --- a/src/qt/macos_event_filter.mm +++ b/src/qt/macos_event_filter.mm @@ -96,8 +96,6 @@ macos_poll_mouse() mouse_x = mousedata.deltax; mouse_y = mousedata.deltay; mouse_z = mousedata.deltaz; - mouse_abs_x = mousedata.x_abs; - mouse_abs_y = mousedata.y_abs; mousedata.deltax = mousedata.deltay = mousedata.deltaz = 0; mouse_buttons = mousedata.mousebuttons; } From efda203365e1d353adc0cce3de447b40e560cd43 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Tue, 3 Jan 2023 22:23:43 +0600 Subject: [PATCH 105/285] Process absolute coordinates on macOS --- src/qt/qt_rendererstack.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/qt/qt_rendererstack.cpp b/src/qt/qt_rendererstack.cpp index bf9098592..4ff1866a2 100644 --- a/src/qt/qt_rendererstack.cpp +++ b/src/qt/qt_rendererstack.cpp @@ -153,9 +153,6 @@ RendererStack::mousePoll() mouse_x = mousedata.deltax; mouse_y = mousedata.deltay; mouse_z = mousedata.deltaz; - mouse_x_abs = mousedata.x_abs; - mouse_y_abs = mousedata.y_abs; - mouse_tablet_in_proximity = mousedata.mouse_tablet_in_proximity; mousedata.deltax = mousedata.deltay = mousedata.deltaz = 0; mouse_buttons = mousedata.mousebuttons; @@ -163,6 +160,10 @@ RendererStack::mousePoll() #endif this->mouse_poll_func(); + mouse_x_abs = mousedata.x_abs; + mouse_y_abs = mousedata.y_abs; + mouse_tablet_in_proximity = mousedata.mouse_tablet_in_proximity; + double scaled_x = mouse_x * mouse_sensitivity + mouse_x_error; double scaled_y = mouse_y * mouse_sensitivity + mouse_y_error; From e229f9e22cfb3ca6bff8623cdb2e622b63f3e571 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Tue, 3 Jan 2023 23:27:12 +0600 Subject: [PATCH 106/285] wacom: Properly implement suppressed/increment mode --- src/device/mouse_wacom_tablet.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/device/mouse_wacom_tablet.c b/src/device/mouse_wacom_tablet.c index 8ea807bd7..5b52887e3 100644 --- a/src/device/mouse_wacom_tablet.c +++ b/src/device/mouse_wacom_tablet.c @@ -2,6 +2,7 @@ #include #include #include +#include #include <86box/86box.h> #include <86box/device.h> #include <86box/timer.h> @@ -85,6 +86,7 @@ wacom_reset(mouse_wacom_t* wacom) wacom->transmit_id = 0; wacom->format = 0; /* ASCII */ wacom->measurement = 1; + wacom->increment = wacom->suppressed_increment = 0; mouse_mode = 1; } @@ -211,6 +213,8 @@ sermouse_report_timer(void *priv) uint32_t transmitted = 0; double milisecond_diff = ((double)(tsc - wacom->old_tsc)) / cpuclock * 1000.0; int x = (mouse_mode == 0 ? wacom->rel_x : wacom->abs_x), y = (mouse_mode == 0 ? wacom->rel_y : wacom->abs_y); + int x_diff = abs(mouse_mode == 0 ? wacom->rel_x : (wacom->abs_x - wacom->last_abs_x)); + int y_diff = abs(mouse_mode == 0 ? wacom->rel_y : (wacom->abs_y - wacom->last_abs_y)); timer_on_auto(&wacom->report_timer, wacom->transmit_id ? (wacom->transmit_period / 8.0) : wacom->transmit_period); if (wacom->transmit_id && !wacom->transmission_ongoing) @@ -218,9 +222,6 @@ sermouse_report_timer(void *priv) if (wacom->transmission_ongoing) goto transmit; else { - int x_diff = (mouse_mode == 0 ? wacom->rel_x : (wacom->last_abs_x - wacom->abs_x)); - int y_diff = (mouse_mode == 0 ? wacom->rel_y : (wacom->last_abs_y - wacom->abs_y)); - if (wacom->transmission_stopped || (!mouse_tablet_in_proximity && !wacom->always_report)) return; if (milisecond_diff >= (wacom->interval * 5)) { transmitted = 1; @@ -228,12 +229,13 @@ sermouse_report_timer(void *priv) } else transmitted = 0; if (!transmitted) return; + if (wacom->increment && !(x_diff >= wacom->increment || y_diff >= wacom->increment || wacom_switch_off_to_on(wacom->b, wacom->oldb))) return; if (wacom->suppressed_increment && !(x_diff >= wacom->suppressed_increment || y_diff >= wacom->suppressed_increment || (wacom->b != wacom->oldb))) return; - + switch (wacom->mode) { case WACOM_MODE_STREAM: default: @@ -268,8 +270,11 @@ transmit_prepare: wacom->transmission_ongoing = 1; wacom->transmission_format = wacom->format; wacom->data_pos = 0; - wacom->last_abs_x = wacom->abs_x; - wacom->last_abs_y = wacom->abs_y; + if (!((wacom->increment && !(x_diff >= wacom->increment || y_diff >= wacom->increment || wacom_switch_off_to_on(wacom->b, wacom->oldb))) || + (wacom->suppressed_increment && !(x_diff >= wacom->suppressed_increment || y_diff >= wacom->suppressed_increment || (wacom->b != wacom->oldb))))) { + wacom->last_abs_x = wacom->abs_x; + wacom->last_abs_y = wacom->abs_y; + } wacom->oldb = wacom->b; if (wacom->format == 1) { memset(wacom->data, 0, 7); From 3cb903c29e87b33052d3a9fde1e2d079234c08b3 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Wed, 4 Jan 2023 00:10:43 +0600 Subject: [PATCH 107/285] wacom: Don't transmit anything for 10 miliseconds after reset --- src/device/mouse_wacom_tablet.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/device/mouse_wacom_tablet.c b/src/device/mouse_wacom_tablet.c index 5b52887e3..0a99d1d89 100644 --- a/src/device/mouse_wacom_tablet.c +++ b/src/device/mouse_wacom_tablet.c @@ -48,7 +48,7 @@ typedef struct { int last_abs_x, last_abs_y; /* Suppressed/Increment Mode. */ double transmit_period, report_period; - double old_tsc; + double old_tsc, reset_tsc; pc_timer_t command_timer, report_timer; serial_t *serial; @@ -87,6 +87,7 @@ wacom_reset(mouse_wacom_t* wacom) wacom->format = 0; /* ASCII */ wacom->measurement = 1; wacom->increment = wacom->suppressed_increment = 0; + wacom->reset_tsc = tsc; mouse_mode = 1; } @@ -217,6 +218,8 @@ sermouse_report_timer(void *priv) int y_diff = abs(mouse_mode == 0 ? wacom->rel_y : (wacom->abs_y - wacom->last_abs_y)); timer_on_auto(&wacom->report_timer, wacom->transmit_id ? (wacom->transmit_period / 8.0) : wacom->transmit_period); + if ((((double)(tsc - wacom->reset_tsc)) / cpuclock * 1000.0) <= 10) + return; if (wacom->transmit_id && !wacom->transmission_ongoing) goto transmit_prepare; if (wacom->transmission_ongoing) From 8e91b23e358e1c5955f519091516d23d45fa71ec Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Wed, 4 Jan 2023 01:42:14 +0600 Subject: [PATCH 108/285] Partial revert of suppressed/increment mode changes --- src/device/mouse_wacom_tablet.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/device/mouse_wacom_tablet.c b/src/device/mouse_wacom_tablet.c index 0a99d1d89..9183d5264 100644 --- a/src/device/mouse_wacom_tablet.c +++ b/src/device/mouse_wacom_tablet.c @@ -46,6 +46,7 @@ typedef struct { int suppressed, measurement, always_report; int last_abs_x, last_abs_y; /* Suppressed/Increment Mode. */ + uint32_t settings; /* Settings DWORD */ double transmit_period, report_period; double old_tsc, reset_tsc; @@ -273,11 +274,9 @@ transmit_prepare: wacom->transmission_ongoing = 1; wacom->transmission_format = wacom->format; wacom->data_pos = 0; - if (!((wacom->increment && !(x_diff >= wacom->increment || y_diff >= wacom->increment || wacom_switch_off_to_on(wacom->b, wacom->oldb))) || - (wacom->suppressed_increment && !(x_diff >= wacom->suppressed_increment || y_diff >= wacom->suppressed_increment || (wacom->b != wacom->oldb))))) { - wacom->last_abs_x = wacom->abs_x; - wacom->last_abs_y = wacom->abs_y; - } + wacom->last_abs_x = wacom->abs_x; + wacom->last_abs_y = wacom->abs_y; + wacom->oldb = wacom->b; if (wacom->format == 1) { memset(wacom->data, 0, 7); From 49795ce81f4aebd60dd094a55c44ed2a55199aac Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Wed, 4 Jan 2023 01:59:57 +0600 Subject: [PATCH 109/285] Transmit ID at normal speed --- src/device/mouse_wacom_tablet.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/device/mouse_wacom_tablet.c b/src/device/mouse_wacom_tablet.c index 9183d5264..5cce333be 100644 --- a/src/device/mouse_wacom_tablet.c +++ b/src/device/mouse_wacom_tablet.c @@ -218,7 +218,7 @@ sermouse_report_timer(void *priv) int x_diff = abs(mouse_mode == 0 ? wacom->rel_x : (wacom->abs_x - wacom->last_abs_x)); int y_diff = abs(mouse_mode == 0 ? wacom->rel_y : (wacom->abs_y - wacom->last_abs_y)); - timer_on_auto(&wacom->report_timer, wacom->transmit_id ? (wacom->transmit_period / 8.0) : wacom->transmit_period); + timer_on_auto(&wacom->report_timer, wacom->transmit_period); if ((((double)(tsc - wacom->reset_tsc)) / cpuclock * 1000.0) <= 10) return; if (wacom->transmit_id && !wacom->transmission_ongoing) From 5c5e26960afc1b60ce32f5f640f06217943559d7 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Wed, 4 Jan 2023 02:07:27 +0600 Subject: [PATCH 110/285] Properly process single-byte commands --- src/device/mouse_wacom_tablet.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/device/mouse_wacom_tablet.c b/src/device/mouse_wacom_tablet.c index 5cce333be..70463b2ea 100644 --- a/src/device/mouse_wacom_tablet.c +++ b/src/device/mouse_wacom_tablet.c @@ -126,14 +126,17 @@ wacom_write(struct serial_s *serial, void *priv, uint8_t data) } if (data == '$') { wacom_reset(wacom); + return; } if (data == 0x13) { wacom->transmission_stopped = 1; pclog("WACOM: transmission stopped\n"); + return; } if (data == 0x11) { wacom->transmission_stopped = 0; pclog("WACOM: transmission started\n"); + return; } wacom->data_rec[wacom->data_rec_pos++] = data; if (data == '\r') { From 3738a83980981439e9fafa08f07f7b6cbf1eb265 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 3 Jan 2023 16:01:45 -0500 Subject: [PATCH 111/285] Add Slot1 to Socket 8 slotket One such example is the ASUS C-P6S1 --- 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 4d1abcd05..380da450e 100644 --- a/src/cpu/cpu.c +++ b/src/cpu/cpu.c @@ -235,7 +235,7 @@ cpu_is_eligible(const cpu_family_t *cpu_family, int cpu, int machine) if (packages & CPU_PKG_SOCKET3) packages |= CPU_PKG_SOCKET1; else if (packages & CPU_PKG_SLOT1) - packages |= CPU_PKG_SOCKET370; + packages |= CPU_PKG_SOCKET370 | CPU_PKG_SOCKET8; /* Package type. */ if (!(cpu_family->package & packages)) From 6291ae01a3b81b74aebbd67aa9cf27f3dd2ea62b Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 3 Jan 2023 18:15:20 -0500 Subject: [PATCH 112/285] Even more missed formatting --- src/cpu/x87_ops_arith.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cpu/x87_ops_arith.h b/src/cpu/x87_ops_arith.h index e2dbbdb8f..d38d584a8 100644 --- a/src/cpu/x87_ops_arith.h +++ b/src/cpu/x87_ops_arith.h @@ -130,7 +130,7 @@ opFPU(s, x87_ts, 16, t.i, geteal, t.s, _32) #ifndef FPU_8087 opFPU(s, x87_ts, 32, t.i, geteal, t.s, _32) #endif - opFPU(d, x87_td, 16, t.i, geteaq, t.d, _64) +opFPU(d, x87_td, 16, t.i, geteaq, t.d, _64) #ifndef FPU_8087 opFPU(d, x87_td, 32, t.i, geteaq, t.d, _64) #endif @@ -139,7 +139,7 @@ opFPU(iw, uint16_t, 16, t, geteaw, (double) (int16_t) t, _i16) #ifndef FPU_8087 opFPU(iw, uint16_t, 32, t, geteaw, (double) (int16_t) t, _i16) #endif - opFPU(il, uint32_t, 16, t, geteal, (double) (int32_t) t, _i32) +opFPU(il, uint32_t, 16, t, geteal, (double) (int32_t) t, _i32) #ifndef FPU_8087 opFPU(il, uint32_t, 32, t, geteal, (double) (int32_t) t, _i32) #endif From 6c3680f268b01176619951c23f45ffc9343e150f Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 3 Jan 2023 19:22:34 -0500 Subject: [PATCH 113/285] Create dependabot.yml --- .github/dependabot.yml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..0d9f70d96 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,9 @@ +version: 2 + +updates: + + # Maintain dependencies for GitHub Actions + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" From 9f8bada8763fe4843cc7934979e93a646004580f Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 3 Jan 2023 23:38:02 -0500 Subject: [PATCH 114/285] Use pacboy in mingw makefile builds too --- .github/workflows/c-cpp.yml | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index 8899d9943..282bfc602 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -62,15 +62,16 @@ jobs: msystem: ${{ matrix.environment.msystem }} install: >- make - ${{ matrix.environment.prefix }}-gcc - ${{ matrix.environment.prefix }}-pkg-config - ${{ matrix.environment.prefix }}-freetype - ${{ matrix.environment.prefix }}-SDL2 - ${{ matrix.environment.prefix }}-zlib - ${{ matrix.environment.prefix }}-libpng - ${{ matrix.environment.prefix }}-openal - ${{ matrix.environment.prefix }}-rtmidi - ${{ matrix.environment.prefix }}-libvncserver + pacboy: >- + gcc:p + pkg-config:p + freetype:p + SDL2:p + zlib:p + libpng:p + openal:p + rtmidi:p + libvncserver:p - uses: actions/checkout@v3 - name: make run: >- From 7ac62e1ff87a21e0ffea824b417803f3b8ed44f2 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 3 Jan 2023 23:38:53 -0500 Subject: [PATCH 115/285] Preparations for alternate UI builds in GHA --- .github/workflows/cmake.yml | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index 1c1a58e32..24edc4073 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -210,7 +210,7 @@ jobs: path: build/artifacts/** linux: - name: "Linux GCC 11 (Qt GUI, ${{ matrix.build.name }}, ${{ matrix.dynarec.name }}, x86_64)" + name: "Linux GCC 11 (${{ matrix.ui.name }}, ${{ matrix.build.name }}, ${{ matrix.dynarec.name }}, x86_64)" runs-on: ubuntu-22.04 @@ -231,6 +231,13 @@ jobs: - name: NDR new: on slug: -NDR + ui: + - name: Qt GUI + qt: on + slug: -Qt + packages: >- + qtbase5-dev + qttools5-dev steps: - name: Install dependencies @@ -243,10 +250,9 @@ jobs: libpng-dev libc6-dev librtmidi-dev - qtbase5-dev - qttools5-dev libopenal-dev libvncserver-dev + ${{ matrix.ui.packages }} - uses: actions/checkout@v3 - name: Configure CMake run: >- @@ -260,11 +266,11 @@ jobs: run: cmake --install build - uses: actions/upload-artifact@v3 with: - name: '86Box-Qt${{ matrix.dynarec.slug }}${{ matrix.build.slug }}-UbuntuJammy-x86_64-gha${{ github.run_number }}' + name: '86Box-{{ matrix.ui.slug }}${{ matrix.dynarec.slug }}${{ matrix.build.slug }}-UbuntuJammy-x86_64-gha${{ github.run_number }}' path: build/artifacts/** macos11: - name: "macOS 11 (Qt GUI, ${{ matrix.build.name }}, ${{ matrix.dynarec.name }}, x86_64)" + name: "macOS 11 (${{ matrix.ui.name }}, ${{ matrix.build.name }}, ${{ matrix.dynarec.name }}, x86_64)" runs-on: macos-11 @@ -285,6 +291,12 @@ jobs: - name: NDR new: on slug: -NDR + ui: + - name: Qt GUI + qt: on + slug: -Qt + packages: >- + qt@5 steps: - name: Install dependencies @@ -295,9 +307,9 @@ jobs: sdl2 libpng rtmidi - qt@5 openal-soft libvncserver + ${{ matrix.ui.packages }} - uses: actions/checkout@v3 - name: Configure CMake run: >- @@ -314,5 +326,5 @@ jobs: run: cmake --install build - uses: actions/upload-artifact@v3 with: - name: '86Box-Qt${{ matrix.dynarec.slug }}${{ matrix.build.slug }}-macOS-x86_64-gha${{ github.run_number }}' + name: '86Box-{{ matrix.ui.slug }}${{ matrix.dynarec.slug }}${{ matrix.build.slug }}-macOS-x86_64-gha${{ github.run_number }}' path: build/artifacts/** From 0966e4bab0865209bea00acea335825dc60a43f0 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 3 Jan 2023 23:39:09 -0500 Subject: [PATCH 116/285] Use pkgconf, not pkg-config, fixes a warning --- .github/workflows/cmake.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index 24edc4073..e8fca5dd3 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -82,7 +82,7 @@ jobs: ninja:p cmake:p gcc:p - pkg-config:p + pkgconf:p freetype:p SDL2:p zlib:p From 62817b55c99511e9d44dc0dfb7a263cd0896c6db Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 3 Jan 2023 23:39:30 -0500 Subject: [PATCH 117/285] release: false should speed up the msys2 builds a little --- .github/workflows/c-cpp.yml | 1 + .github/workflows/cmake.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index 282bfc602..5b2573dde 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -58,6 +58,7 @@ jobs: - name: Prepare MSYS2 environment uses: msys2/setup-msys2@v2 with: + release: false update: true msystem: ${{ matrix.environment.msystem }} install: >- diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index e8fca5dd3..58f537d21 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -76,6 +76,7 @@ jobs: - name: Prepare MSYS2 environment uses: msys2/setup-msys2@v2 with: + release: false update: true msystem: ${{ matrix.environment.msystem }} pacboy: >- From d6b118a4fc89a6c5aa8be351dae0db8527f85335 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Wed, 4 Jan 2023 00:26:07 -0500 Subject: [PATCH 118/285] Fix another warning --- src/discord.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/discord.c b/src/discord.c index 55f6d1544..458688eaa 100644 --- a/src/discord.c +++ b/src/discord.c @@ -88,7 +88,7 @@ discord_update_activity(int paused) *(paren - 1) = '\0'; #pragma GCC diagnostic push -#if defined(__GNUC__) +#if defined(__GNUC__) && !defined (__clang__) # pragma GCC diagnostic ignored "-Wformat-truncation" #endif if (strlen(vm_name) < 100) { From e5dd58e23faef3c23a2b8a445b68ab75a0cd5f44 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Wed, 4 Jan 2023 13:46:06 +0600 Subject: [PATCH 119/285] wacom: Support Remote request mode and line feed-terminated commands --- src/device/mouse_wacom_tablet.c | 50 ++++++++++++++++++++++----------- 1 file changed, 34 insertions(+), 16 deletions(-) diff --git a/src/device/mouse_wacom_tablet.c b/src/device/mouse_wacom_tablet.c index 70463b2ea..62aeb6fc0 100644 --- a/src/device/mouse_wacom_tablet.c +++ b/src/device/mouse_wacom_tablet.c @@ -44,6 +44,7 @@ typedef struct { int transmit_id, transmit_id_pending; int pressure_mode; int suppressed, measurement, always_report; + int remote_req, remote_mode; int last_abs_x, last_abs_y; /* Suppressed/Increment Mode. */ uint32_t settings; /* Settings DWORD */ @@ -89,6 +90,7 @@ wacom_reset(mouse_wacom_t* wacom) wacom->measurement = 1; wacom->increment = wacom->suppressed_increment = 0; wacom->reset_tsc = tsc; + wacom->remote_mode = wacom->remote_req = 0; mouse_mode = 1; } @@ -124,22 +126,23 @@ wacom_write(struct serial_s *serial, void *priv, uint8_t data) special_command = 0; return; } - if (data == '$') { - wacom_reset(wacom); + + if (data == '@') { + wacom->remote_req = 1; + wacom->remote_mode = 1; + wacom->transmission_stopped = 0; return; } if (data == 0x13) { wacom->transmission_stopped = 1; - pclog("WACOM: transmission stopped\n"); return; } if (data == 0x11) { wacom->transmission_stopped = 0; - pclog("WACOM: transmission started\n"); return; } wacom->data_rec[wacom->data_rec_pos++] = data; - if (data == '\r') { + if (data == '\r' || data == '\n') { wacom->data_rec[wacom->data_rec_pos] = 0; wacom->data_rec_pos = 0; @@ -151,7 +154,7 @@ wacom_write(struct serial_s *serial, void *priv, uint8_t data) wacom->suppressed_increment = 0; } else if (!memcmp(wacom->data_rec, "IN", 2)) { sscanf((const char*)wacom->data_rec, "IN%d", &wacom->increment); - } else if (!memcmp(wacom->data_rec, "RE", 2)) { + } else if (!memcmp(wacom->data_rec, "RE", 2) || wacom->data_rec[0] == '$' || wacom->data_rec[0] == '#') { wacom_reset(wacom); } else if (!memcmp(wacom->data_rec, "IT", 2)) { sscanf((const char*)wacom->data_rec, "IT%d", &wacom->interval); @@ -167,8 +170,14 @@ wacom_write(struct serial_s *serial, void *priv, uint8_t data) sscanf((const char*)wacom->data_rec, "IC%d", &wacom->measurement); } else if (!memcmp(wacom->data_rec, "AL", 2)) { sscanf((const char*)wacom->data_rec, "AL%d", &wacom->always_report); - } else { - pclog("Unknown command: %s\n", wacom->data_rec); + } else if (!memcmp(wacom->data_rec, "RQ", 2)) { + wacom->transmission_stopped = 0; + sscanf((const char*)wacom->data_rec, "RQ%d", &wacom->remote_mode); + if (wacom->remote_mode) wacom->remote_req = 1; + } else if (!memcmp(wacom->data_rec, "SP", 2)) { + wacom->transmission_stopped = 1; + } else if (!memcmp(wacom->data_rec, "ST", 2)){ + wacom->transmission_stopped = 0; } } } @@ -228,6 +237,8 @@ sermouse_report_timer(void *priv) goto transmit_prepare; if (wacom->transmission_ongoing) goto transmit; + else if (wacom->remote_mode && !wacom->remote_req) + return; else { if (wacom->transmission_stopped || (!mouse_tablet_in_proximity && !wacom->always_report)) return; if (milisecond_diff >= (wacom->interval * 5)) { @@ -236,13 +247,7 @@ sermouse_report_timer(void *priv) } else transmitted = 0; if (!transmitted) return; - - if (wacom->increment && !(x_diff >= wacom->increment || y_diff >= wacom->increment || wacom_switch_off_to_on(wacom->b, wacom->oldb))) - return; - if (wacom->suppressed_increment && !(x_diff >= wacom->suppressed_increment || y_diff >= wacom->suppressed_increment || (wacom->b != wacom->oldb))) - return; - switch (wacom->mode) { case WACOM_MODE_STREAM: default: @@ -263,6 +268,11 @@ sermouse_report_timer(void *priv) break; } } + + if (wacom->increment && !(x_diff >= wacom->increment || y_diff >= wacom->increment || wacom_switch_off_to_on(wacom->b, wacom->oldb))) + return; + if (wacom->suppressed_increment && !(x_diff >= wacom->suppressed_increment || y_diff >= wacom->suppressed_increment || (wacom->b != wacom->oldb))) + return; } transmit_prepare: @@ -314,7 +324,15 @@ transmit_prepare: snprintf((char*)wacom->data, sizeof(wacom->data), "*,%05d,%05d,%d\r\n", wacom->abs_x, wacom->abs_y, wacom->pressure_mode ? ((wacom->b & 0x1) ? (uint8_t)-31 : (uint8_t)15) : ((wacom->b & 0x1) ? 0x21 : 0x00)); } transmit: - serial_write_fifo(wacom->serial, wacom->data[wacom->data_pos++]); + if (wacom->transmit_id) { + uint8_t i = 0; + + for (i = 0; i < 9; i++) { + serial_write_fifo(wacom->serial, wacom->data[wacom->data_pos++]); + if (wacom->data[wacom->data_pos] == 0) break; + } + } else + serial_write_fifo(wacom->serial, wacom->data[wacom->data_pos++]); if ((wacom->transmission_format == 0 && wacom->data[wacom->data_pos] == 0) || (wacom->transmission_format == 1 && wacom->data_pos == 7)) { wacom->transmission_ongoing = 0; @@ -396,7 +414,7 @@ const device_t mouse_wacom_device = { .close = wacom_close, .reset = NULL, { .poll = wacom_poll }, - .speed_changed = NULL, + .speed_changed = wacom_speed_changed, .force_redraw = NULL, .config = wacom_config }; From 48961b00a4046b9d90daca5394e00ffbfd3d2ff6 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Wed, 4 Jan 2023 06:25:33 -0500 Subject: [PATCH 120/285] Missed bits --- .github/workflows/cmake.yml | 6 ++++-- src/include/86box/device.h | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index 58f537d21..4596b51b8 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -261,13 +261,14 @@ jobs: --toolchain ./cmake/flags-gcc-x86_64.cmake -D NEW_DYNAREC=${{ matrix.dynarec.new }} -D CMAKE_INSTALL_PREFIX=./build/artifacts + -D QT=${{ matrix.ui.qt }} - name: Build run: cmake --build build - name: Generate package run: cmake --install build - uses: actions/upload-artifact@v3 with: - name: '86Box-{{ matrix.ui.slug }}${{ matrix.dynarec.slug }}${{ matrix.build.slug }}-UbuntuJammy-x86_64-gha${{ github.run_number }}' + name: '86Box${{ matrix.ui.slug }}${{ matrix.dynarec.slug }}${{ matrix.build.slug }}-UbuntuJammy-x86_64-gha${{ github.run_number }}' path: build/artifacts/** macos11: @@ -318,6 +319,7 @@ jobs: --toolchain ./cmake/flags-gcc-x86_64.cmake -D NEW_DYNAREC=${{ matrix.dynarec.new }} -D CMAKE_INSTALL_PREFIX=./build/artifacts + -D QT=${{ matrix.ui.qt }} -D Qt5_ROOT=$(brew --prefix qt@5) -D Qt5LinguistTools_ROOT=$(brew --prefix qt@5) -D OpenAL_ROOT=$(brew --prefix openal-soft) @@ -327,5 +329,5 @@ jobs: run: cmake --install build - uses: actions/upload-artifact@v3 with: - name: '86Box-{{ matrix.ui.slug }}${{ matrix.dynarec.slug }}${{ matrix.build.slug }}-macOS-x86_64-gha${{ github.run_number }}' + name: '86Box${{ matrix.ui.slug }}${{ matrix.dynarec.slug }}${{ matrix.build.slug }}-macOS-x86_64-gha${{ github.run_number }}' path: build/artifacts/** diff --git a/src/include/86box/device.h b/src/include/86box/device.h index ca4e6bdf2..9f0a5f864 100644 --- a/src/include/86box/device.h +++ b/src/include/86box/device.h @@ -108,7 +108,7 @@ typedef struct { const char *file_filter; const device_config_spinner_t spinner; const device_config_selection_t selection[16]; - const device_config_bios_t bios[32]; + const device_config_bios_t bios[32]; } device_config_t; typedef struct _device_ { From 695f5befa18b13f30b35989737aaf1029c457830 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Wed, 4 Jan 2023 19:30:14 +0600 Subject: [PATCH 121/285] ST cancels remote mode --- src/device/mouse_wacom_tablet.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/device/mouse_wacom_tablet.c b/src/device/mouse_wacom_tablet.c index 62aeb6fc0..6083eaa99 100644 --- a/src/device/mouse_wacom_tablet.c +++ b/src/device/mouse_wacom_tablet.c @@ -130,7 +130,6 @@ wacom_write(struct serial_s *serial, void *priv, uint8_t data) if (data == '@') { wacom->remote_req = 1; wacom->remote_mode = 1; - wacom->transmission_stopped = 0; return; } if (data == 0x13) { @@ -139,6 +138,7 @@ wacom_write(struct serial_s *serial, void *priv, uint8_t data) } if (data == 0x11) { wacom->transmission_stopped = 0; + wacom->remote_mode = wacom->remote_req = 0; return; } wacom->data_rec[wacom->data_rec_pos++] = data; @@ -171,13 +171,13 @@ wacom_write(struct serial_s *serial, void *priv, uint8_t data) } else if (!memcmp(wacom->data_rec, "AL", 2)) { sscanf((const char*)wacom->data_rec, "AL%d", &wacom->always_report); } else if (!memcmp(wacom->data_rec, "RQ", 2)) { - wacom->transmission_stopped = 0; sscanf((const char*)wacom->data_rec, "RQ%d", &wacom->remote_mode); if (wacom->remote_mode) wacom->remote_req = 1; } else if (!memcmp(wacom->data_rec, "SP", 2)) { wacom->transmission_stopped = 1; } else if (!memcmp(wacom->data_rec, "ST", 2)){ wacom->transmission_stopped = 0; + wacom->remote_mode = wacom->remote_req = 0; } } } From e538a28895a528eefe135ca8109b79ee7ee0ec5e Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Wed, 4 Jan 2023 19:43:15 +0600 Subject: [PATCH 122/285] Don't transmit coordinates continuously in remote mode --- src/device/mouse_wacom_tablet.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/device/mouse_wacom_tablet.c b/src/device/mouse_wacom_tablet.c index 6083eaa99..c3e8498bf 100644 --- a/src/device/mouse_wacom_tablet.c +++ b/src/device/mouse_wacom_tablet.c @@ -289,6 +289,7 @@ transmit_prepare: wacom->data_pos = 0; wacom->last_abs_x = wacom->abs_x; wacom->last_abs_y = wacom->abs_y; + wacom->remote_req = 0; wacom->oldb = wacom->b; if (wacom->format == 1) { From 6a78eca1ff20494de38053c26dc42215413a2770 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Wed, 4 Jan 2023 23:01:30 +0600 Subject: [PATCH 123/285] wacom: Cleanup and splits --- src/device/mouse_wacom_tablet.c | 140 ++++++++++++++++++-------------- 1 file changed, 78 insertions(+), 62 deletions(-) diff --git a/src/device/mouse_wacom_tablet.c b/src/device/mouse_wacom_tablet.c index c3e8498bf..951ec9c0e 100644 --- a/src/device/mouse_wacom_tablet.c +++ b/src/device/mouse_wacom_tablet.c @@ -35,7 +35,7 @@ typedef struct { data_rec[0x200]; int abs_x, abs_y, rel_x, rel_y, - oldb, lastb, b; + oldb, b; int data_pos, data_rec_pos, mode, transmission_ongoing, transmission_format, interval; int increment, suppressed_increment; @@ -49,9 +49,9 @@ typedef struct { int last_abs_x, last_abs_y; /* Suppressed/Increment Mode. */ uint32_t settings; /* Settings DWORD */ - double transmit_period, report_period; + double transmit_period; double old_tsc, reset_tsc; - pc_timer_t command_timer, report_timer; + pc_timer_t report_timer; serial_t *serial; } mouse_wacom_t; @@ -146,6 +146,8 @@ wacom_write(struct serial_s *serial, void *priv, uint8_t data) wacom->data_rec[wacom->data_rec_pos] = 0; wacom->data_rec_pos = 0; + if (data == '\n') pclog("Wacom: written %s", wacom->data_rec); + else pclog("Wacom: written %s\n", wacom->data_rec); if (!memcmp(wacom->data_rec, "AS", 2)) { wacom->format = (wacom->data_rec[2] == '1'); wacom->transmission_ongoing = 0; @@ -219,16 +221,72 @@ wacom_get_switch(int b) return 0x00; } +static void +wacom_transmit_prepare(mouse_wacom_t* wacom, int x, int y) +{ + wacom->transmission_ongoing = 1; + wacom->data_pos = 0; + memset(wacom->data, 0, sizeof(wacom->data)); + if (wacom->transmit_id) { + wacom->transmission_format = 0; + strcat((char*)wacom->data, "~#SD51C V3.2.1.01\r"); + return; + } + wacom->transmission_format = wacom->format; + wacom->last_abs_x = wacom->abs_x; + wacom->last_abs_y = wacom->abs_y; + wacom->remote_req = 0; + + wacom->oldb = wacom->b; + if (wacom->format == 1) { + wacom->data[0] = 0xC0; + wacom->data[6] = wacom->pressure_mode ? ((wacom->b & 0x1) ? (uint8_t)31 : (uint8_t)-31) : wacom_get_switch(wacom->b); + + wacom->data[5] = (y & 0x7F); + wacom->data[4] = ((y & 0x3F80) >> 7) & 0x7F; + wacom->data[3] = (((y & 0xC000) >> 14) & 3); + + wacom->data[2] = (x & 0x7F); + wacom->data[1] = ((x & 0x3F80) >> 7) & 0x7F; + wacom->data[0] |= (((x & 0xC000) >> 14) & 3); + + if (mouse_mode == 0) { + wacom->data[0] |= (!!(x < 0)) << 2; + wacom->data[3] |= (!!(y < 0)) << 2; + } + + if (wacom->pressure_mode) { + wacom->data[0] |= 0x10; + wacom->data[6] &= 0x7F; + } + + if (tablet_tool_type == 1) { + wacom->data[0] |= 0x20; + } + + if (!mouse_tablet_in_proximity) { + wacom->data[0] &= ~0x40; + } + } else { + wacom->data[0] = 0; + snprintf((char*)wacom->data, sizeof(wacom->data), "*,%05d,%05d,%d\r\n", + wacom->abs_x, wacom->abs_y, + wacom->pressure_mode ? ((wacom->b & 0x1) ? (uint8_t)-31 : (uint8_t)15) : ((wacom->b & 0x1) ? 21 : 00)); + } +} + extern double cpuclock; static void -sermouse_report_timer(void *priv) +wacom_report_timer(void *priv) { mouse_wacom_t* wacom = (mouse_wacom_t*)priv; - uint32_t transmitted = 0; double milisecond_diff = ((double)(tsc - wacom->old_tsc)) / cpuclock * 1000.0; - int x = (mouse_mode == 0 ? wacom->rel_x : wacom->abs_x), y = (mouse_mode == 0 ? wacom->rel_y : wacom->abs_y); - int x_diff = abs(mouse_mode == 0 ? wacom->rel_x : (wacom->abs_x - wacom->last_abs_x)); - int y_diff = abs(mouse_mode == 0 ? wacom->rel_y : (wacom->abs_y - wacom->last_abs_y)); + int relative_mode = (mouse_mode == 0); + int x = (relative_mode ? wacom->rel_x : wacom->abs_x); + int y = (relative_mode ? wacom->rel_y : wacom->abs_y); + int x_diff = abs(relative_mode ? wacom->rel_x : (wacom->abs_x - wacom->last_abs_x)); + int y_diff = abs(relative_mode ? wacom->rel_y : (wacom->abs_y - wacom->last_abs_y)); + int increment = wacom->suppressed_increment ? wacom->suppressed_increment : wacom->increment; timer_on_auto(&wacom->report_timer, wacom->transmit_period); if ((((double)(tsc - wacom->reset_tsc)) / cpuclock * 1000.0) <= 10) @@ -240,12 +298,12 @@ sermouse_report_timer(void *priv) else if (wacom->remote_mode && !wacom->remote_req) return; else { - if (wacom->transmission_stopped || (!mouse_tablet_in_proximity && !wacom->always_report)) return; + if (wacom->transmission_stopped || (!mouse_tablet_in_proximity && !wacom->always_report)) + return; + if (milisecond_diff >= (wacom->interval * 5)) { - transmitted = 1; wacom->old_tsc = tsc; - } else transmitted = 0; - if (!transmitted) + } else return; switch (wacom->mode) { @@ -269,61 +327,19 @@ sermouse_report_timer(void *priv) } } - if (wacom->increment && !(x_diff >= wacom->increment || y_diff >= wacom->increment || wacom_switch_off_to_on(wacom->b, wacom->oldb))) + if (increment && !(x_diff > increment || y_diff > increment)) return; - if (wacom->suppressed_increment && !(x_diff >= wacom->suppressed_increment || y_diff >= wacom->suppressed_increment || (wacom->b != wacom->oldb))) + + if (wacom->increment && !wacom_switch_off_to_on(wacom->b, wacom->oldb)) + return; + + if (wacom->suppressed_increment && (wacom->b == wacom->oldb)) return; } transmit_prepare: - if (wacom->transmit_id) { - wacom->transmission_format = 0; - wacom->transmission_ongoing = 1; - wacom->data_pos = 0; - memset(wacom->data, 0, sizeof(wacom->data)); - strcat((char*)wacom->data, "~#SD51C V3.2.1.01\r"); - goto transmit; - } - wacom->transmission_ongoing = 1; - wacom->transmission_format = wacom->format; - wacom->data_pos = 0; - wacom->last_abs_x = wacom->abs_x; - wacom->last_abs_y = wacom->abs_y; - wacom->remote_req = 0; + wacom_transmit_prepare(wacom, x, y); - wacom->oldb = wacom->b; - if (wacom->format == 1) { - memset(wacom->data, 0, 7); - wacom->data[0] = 0xC0; - wacom->data[6] = wacom->pressure_mode ? ((wacom->b & 0x1) ? (uint8_t)31 : (uint8_t)-31) : wacom_get_switch(wacom->b); - - wacom->data[5] = (y & 0x7F); - wacom->data[4] = ((y & 0x3F80) >> 7) & 0x7F; - wacom->data[3] = (((y & 0xC000) >> 14) & 3); - - wacom->data[2] = (x & 0x7F); - wacom->data[1] = ((x & 0x3F80) >> 7) & 0x7F; - wacom->data[0] |= (((x & 0xC000) >> 14) & 3); - - if (mouse_mode == 0) { - wacom->data[0] |= (!!(x < 0)) << 2; - wacom->data[3] |= (!!(y < 0)) << 2; - } - if (wacom->pressure_mode) { - wacom->data[0] |= 0x10; - wacom->data[6] &= 0x7F; - } - if (tablet_tool_type == 1) { - wacom->data[0] |= 0x20; - } - - if (!mouse_tablet_in_proximity) { - wacom->data[0] &= ~0x40; - } - } else { - wacom->data[0] = 0; - snprintf((char*)wacom->data, sizeof(wacom->data), "*,%05d,%05d,%d\r\n", wacom->abs_x, wacom->abs_y, wacom->pressure_mode ? ((wacom->b & 0x1) ? (uint8_t)-31 : (uint8_t)15) : ((wacom->b & 0x1) ? 0x21 : 0x00)); - } transmit: if (wacom->transmit_id) { uint8_t i = 0; @@ -356,7 +372,7 @@ wacom_init(const device_t *info) dev->port = device_get_config_int("port"); dev->serial = serial_attach(dev->port, wacom_callback, wacom_write, dev); - timer_add(&dev->report_timer, sermouse_report_timer, dev, 0); + timer_add(&dev->report_timer, wacom_report_timer, dev, 0); mouse_set_buttons(dev->but); wacom_reset(dev); From 95cf08611c0148c1ef8b6fb98ec811b267252952 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 5 Jan 2023 02:25:21 +0100 Subject: [PATCH 124/285] SCAT machines with PS/2 keyboard controller now actually have a PS/2 keyboard controller, fixes #3013. --- src/machine/m_at_286_386sx.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/machine/m_at_286_386sx.c b/src/machine/m_at_286_386sx.c index 7cfec3735..ee117fa33 100644 --- a/src/machine/m_at_286_386sx.c +++ b/src/machine/m_at_286_386sx.c @@ -259,10 +259,17 @@ machine_at_scat_init(const machine_t *model, int is_v4, int is_ami) { machine_at_common_init(model); - if (is_ami) - device_add(&keyboard_at_ami_device); - else - device_add(&keyboard_at_device); + if (machines[machine].bus_flags & MACHINE_BUS_PS2) { + if (is_ami) + device_add(&keyboard_ps2_ami_device); + else + device_add(&keyboard_ps2_device); + } else { + if (is_ami) + device_add(&keyboard_at_ami_device); + else + device_add(&keyboard_at_device); + } if (is_v4) device_add(&scat_4_device); From b0b92a84e6aedfd134805112bff5a8655cb12a43 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Fri, 6 Jan 2023 23:23:40 +0600 Subject: [PATCH 125/285] wacom: Fix increment modes --- src/device/mouse_wacom_tablet.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/device/mouse_wacom_tablet.c b/src/device/mouse_wacom_tablet.c index 951ec9c0e..03aa28bd5 100644 --- a/src/device/mouse_wacom_tablet.c +++ b/src/device/mouse_wacom_tablet.c @@ -327,14 +327,13 @@ wacom_report_timer(void *priv) } } - if (increment && !(x_diff > increment || y_diff > increment)) - return; + if (increment && !(x_diff > increment || y_diff > increment)) { + if (wacom->increment && !wacom_switch_off_to_on(wacom->b, wacom->oldb)) + return; - if (wacom->increment && !wacom_switch_off_to_on(wacom->b, wacom->oldb)) - return; - - if (wacom->suppressed_increment && (wacom->b == wacom->oldb)) - return; + if (wacom->suppressed_increment && (wacom->b == wacom->oldb)) + return; + } } transmit_prepare: From a91015fe0417345fe2e4dc21c0a948fdfd1a0027 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sat, 7 Jan 2023 00:04:48 +0600 Subject: [PATCH 126/285] wacom: Check suppressed increment first --- src/device/mouse_wacom_tablet.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/device/mouse_wacom_tablet.c b/src/device/mouse_wacom_tablet.c index 03aa28bd5..19e5b53cc 100644 --- a/src/device/mouse_wacom_tablet.c +++ b/src/device/mouse_wacom_tablet.c @@ -328,10 +328,10 @@ wacom_report_timer(void *priv) } if (increment && !(x_diff > increment || y_diff > increment)) { - if (wacom->increment && !wacom_switch_off_to_on(wacom->b, wacom->oldb)) + if (wacom->suppressed_increment && (wacom->b == wacom->oldb)) return; - if (wacom->suppressed_increment && (wacom->b == wacom->oldb)) + if (wacom->increment && !wacom_switch_off_to_on(wacom->b, wacom->oldb)) return; } } From 8a375722200936beef9c885e66eca99d647dbce3 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sat, 7 Jan 2023 16:55:55 +0600 Subject: [PATCH 127/285] snd_optimc: IRQs of 12, 14 and 15 are actually used --- src/sound/snd_optimc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sound/snd_optimc.c b/src/sound/snd_optimc.c index 7a76d3258..f83161bce 100644 --- a/src/sound/snd_optimc.c +++ b/src/sound/snd_optimc.c @@ -40,7 +40,7 @@ #include <86box/rom.h> static int optimc_wss_dma[4] = { 0, 0, 1, 3 }; -static int optimc_wss_irq[4] = { 7, 9, 10, 11 }; +static int optimc_wss_irq[8] = { 5, 7, 9, 10, 11, 12, 14, 15 }; enum optimc_local_flags { OPTIMC_CS4231 = 0x100, @@ -101,7 +101,7 @@ optimc_wss_write(uint16_t addr, uint8_t val, void *priv) return; optimc->wss_config = val; ad1848_setdma(&optimc->ad1848, optimc_wss_dma[val & 3]); - ad1848_setirq(&optimc->ad1848, optimc_wss_irq[val & 3]); + ad1848_setirq(&optimc->ad1848, optimc_wss_irq[(val >> 3) & 7]); } static void From a40630ba63a755be7abe082b5cccbdc902ede172 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Fri, 6 Jan 2023 15:36:05 -0500 Subject: [PATCH 128/285] Even more tabs to spaces --- .ci/AppImageBuilder.yml | 28 +- .ci/Jenkinsfile | 16 +- .ci/build.sh | 16 +- .ci/static2dll.sh | 16 +- bumpversion.sh | 16 +- cmake/flags-gcc-aarch64.cmake | 20 +- cmake/flags-gcc-armv7.cmake | 20 +- cmake/flags-gcc-i686.cmake | 18 +- cmake/flags-gcc-x86_64.cmake | 18 +- cmake/flags-gcc.cmake | 16 +- cmake/llvm-macos-aarch64.cmake | 24 +- cmake/llvm-win32-aarch64.cmake | 18 +- cmake/llvm-win32-arm.cmake | 16 +- cmake/llvm-win32-i686.cmake | 18 +- cmake/llvm-win32-x86_64.cmake | 18 +- src/Makefile.local | 64 +- src/codegen/codegen_ops_x86-64.h | 2 +- src/codegen_new/codegen_backend_arm_uops.c | 8 +- src/cpu/codegen_timing_686.c | 6 +- src/cpu/codegen_timing_p6.c | 54 +- src/cpu/cpu_table.c | 1997 ++++++++--------- src/device/keyboard_at.c | 4 +- src/device/keyboard_xt.c | 214 +- src/device/mouse_bus.c | 14 +- src/device/mouse_ps2.c | 2 +- src/disk/hdc_ide.c | 14 +- src/disk/hdc_st506_xt.c | 72 +- src/disk/zip.c | 3 +- src/floppy/fdc.c | 8 +- src/floppy/fdd.c | 52 +- src/floppy/fdd_86f.c | 50 +- src/floppy/fdd_common.c | 501 +++-- src/floppy/fdd_fdi.c | 2 +- src/floppy/fdd_img.c | 445 ++-- src/floppy/fdd_td0.c | 14 +- src/floppy/fdi2raw.c | 510 ++--- src/include/86box/apm.h | 16 +- src/include/86box/bugger.h | 28 +- src/include/86box/cartridge.h | 16 +- src/include/86box/cdrom.h | 16 +- src/include/86box/cdrom_image.h | 22 +- src/include/86box/cdrom_image_backend.h | 26 +- src/include/86box/cdrom_mitsumi.h | 16 +- src/include/86box/clock.h | 16 +- src/include/86box/ddma.h | 16 +- src/include/86box/discord.h | 16 +- src/include/86box/fdc_ext.h | 26 +- src/include/86box/fdd_86f.h | 20 +- src/include/86box/fdd_common.h | 16 +- src/include/86box/fdd_fdi.h | 26 +- src/include/86box/fdd_imd.h | 20 +- src/include/86box/fdd_img.h | 26 +- src/include/86box/fdd_mfm.h | 16 +- src/include/86box/fdd_td0.h | 20 +- src/include/86box/gameport.h | 24 +- src/include/86box/hdc_ide.h | 22 +- src/include/86box/hdc_ide_sff8038i.h | 21 +- src/include/86box/hdd.h | 21 +- src/include/86box/i2c.h | 16 +- src/include/86box/i8080.h | 18 +- src/include/86box/ibm_5161.h | 17 +- src/include/86box/io.h | 22 +- src/include/86box/isapnp.h | 16 +- .../86box/joystick_ch_flightstick_pro.h | 20 +- src/include/86box/joystick_sw_pad.h | 2 +- src/include/86box/joystick_tm_fcs.h | 2 +- src/include/86box/language.h | 20 +- src/include/86box/log.h | 20 +- src/include/86box/lpt.h | 8 +- src/include/86box/m_amstrad.h | 20 +- src/include/86box/mo.h | 20 +- src/include/86box/mouse.h | 20 +- src/include/86box/net_3c501.h | 21 +- src/include/86box/net_3c503.h | 43 + src/include/86box/net_dp8390.h | 22 +- src/include/86box/net_pcnet.h | 22 +- src/include/86box/net_plip.h | 17 +- src/include/86box/net_wd8003.h | 32 +- src/include/86box/pic.h | 22 +- src/include/86box/pit.h | 19 +- src/include/86box/pit_fast.h | 19 +- src/include/86box/plat_dir.h | 17 +- src/include/86box/plat_dynld.h | 17 +- src/include/86box/port_6x.h | 18 +- src/include/86box/port_92.h | 18 +- src/include/86box/postcard.h | 16 +- src/include/86box/random.h | 19 +- src/include/86box/resource.h | 28 +- src/include/86box/rom.h | 16 +- src/include/86box/scsi.h | 24 +- src/include/86box/scsi_buslogic.h | 23 +- src/include/86box/scsi_cdrom.h | 18 +- src/include/86box/scsi_device.h | 20 +- src/include/86box/scsi_disk.h | 15 +- src/include/86box/scsi_ncr5380.h | 28 +- src/include/86box/scsi_ncr53c8xx.h | 30 +- src/include/86box/scsi_pcscsi.h | 28 +- src/include/86box/scsi_spock.h | 22 +- src/include/86box/scsi_x54x.h | 28 +- src/include/86box/smram.h | 16 +- src/include/86box/snd_ac97.h | 16 +- src/include/86box/snd_ad1848.h | 24 +- src/include/86box/snd_mpu401.h | 29 +- src/include/86box/snd_opl.h | 20 +- src/include/86box/snd_opl_nuked.h | 22 +- src/include/86box/snd_speaker.h | 20 +- src/include/86box/ui.h | 20 +- src/include/86box/usb.h | 16 +- src/include/86box/vid_8514a.h | 18 +- src/include/86box/vid_cga.h | 21 +- src/include/86box/vid_cga_comp.h | 23 +- src/include/86box/vid_ddc.h | 20 +- src/include/86box/vid_ega.h | 22 +- src/include/86box/vid_hercules.h | 24 +- src/include/86box/vid_nga.h | 30 +- src/include/86box/vid_ogc.h | 30 +- src/include/86box/vid_pgc.h | 20 +- src/include/86box/vid_pgc_palette.h | 20 +- src/include/86box/vid_svga_render.h | 21 +- src/include/86box/vid_vga.h | 24 +- src/include/86box/vid_voodoo_banshee.h | 16 +- .../86box/vid_voodoo_banshee_blitter.h | 16 +- src/include/86box/vid_voodoo_common.h | 18 +- src/include/86box/vid_voodoo_display.h | 18 +- src/include/86box/vid_voodoo_dither.h | 18 +- src/include/86box/vid_voodoo_fb.h | 18 +- src/include/86box/vid_voodoo_fifo.h | 18 +- src/include/86box/vid_voodoo_reg.h | 18 +- src/include/86box/vid_voodoo_setup.h | 18 +- src/include/86box/vid_voodoo_texture.h | 18 +- src/include/86box/vnc.h | 16 +- src/include/86box/win.h | 26 +- src/include/86box/win_opengl.h | 16 +- src/include/86box/win_opengl_glslp.h | 16 +- src/include/86box/win_sdl.h | 48 +- src/include/86box/zip.h | 18 +- src/include/fdi2raw.h | 24 +- src/include/minitrace/minitrace.h | 80 +- src/mac/CMakeLists.txt | 4 +- src/machine/m_amstrad.c | 156 +- src/machine/m_at_386dx_486.c | 185 +- src/machine/m_at_compaq.c | 8 +- src/machine/m_at_slot1.c | 2 +- src/machine/m_at_socket370.c | 32 +- src/machine/m_at_socket4.c | 104 +- src/machine/m_at_socket5.c | 76 +- src/machine/m_at_socket7.c | 232 +- src/machine/m_at_socket7_3v.c | 137 +- src/machine/m_at_socket8.c | 80 +- src/machine/m_at_t3100e.c | 4 +- src/machine/m_elt.c | 2 - src/machine/m_europc.c | 86 +- src/machine/m_tandy.c | 214 +- src/machine/m_xt_olivetti.c | 428 ++-- src/minitrace/minitrace.c | 627 +++--- src/network/net_3c501.c | 23 +- src/network/net_3c503.c | 9 +- src/network/net_dp8390.c | 4 +- src/qt/evdev_mouse.cpp | 16 +- src/qt/qt.c | 14 +- src/qt/qt_cdrom.c | 22 +- src/qt/qt_deviceconfig.cpp | 18 +- src/qt/qt_filefield.cpp | 18 +- src/qt/qt_harddiskdialog.cpp | 18 +- src/qt/qt_harddrive_common.cpp | 16 +- src/qt/qt_hardwarerenderer.cpp | 20 +- src/qt/qt_joystickconfiguration.cpp | 16 +- src/qt/qt_machinestatus.cpp | 18 +- src/qt/qt_main.cpp | 20 +- src/qt/qt_mainwindow.cpp | 22 +- src/qt/qt_mediahistorymanager.cpp | 16 +- src/qt/qt_mediahistorymanager.hpp | 16 +- src/qt/qt_mediamenu.cpp | 20 +- src/qt/qt_models_common.cpp | 16 +- src/qt/qt_newfloppydialog.cpp | 20 +- src/qt/qt_opengloptions.cpp | 19 +- src/qt/qt_opengloptions.hpp | 19 +- src/qt/qt_opengloptionsdialog.cpp | 19 +- src/qt/qt_opengloptionsdialog.hpp | 17 +- src/qt/qt_openglrenderer.cpp | 19 +- src/qt/qt_openglrenderer.hpp | 19 +- src/qt/qt_platform.cpp | 21 +- src/qt/qt_progsettings.cpp | 14 +- src/qt/qt_renderercommon.cpp | 14 +- src/qt/qt_rendererstack.cpp | 18 +- src/qt/qt_sdl.c | 54 +- src/qt/qt_sdl.h | 48 +- src/qt/qt_settings.cpp | 16 +- src/qt/qt_settings_bus_tracking.cpp | 16 +- src/qt/qt_settingsdisplay.cpp | 16 +- src/qt/qt_settingsfloppycdrom.cpp | 18 +- src/qt/qt_settingsharddisks.cpp | 18 +- src/qt/qt_settingsinput.cpp | 16 +- src/qt/qt_settingsmachine.cpp | 16 +- src/qt/qt_settingsnetwork.cpp | 16 +- src/qt/qt_settingsotherperipherals.cpp | 16 +- src/qt/qt_settingsotherremovable.cpp | 18 +- src/qt/qt_settingsports.cpp | 20 +- src/qt/qt_settingssound.cpp | 16 +- src/qt/qt_settingsstoragecontrollers.cpp | 16 +- src/qt/qt_softwarerenderer.cpp | 20 +- src/qt/qt_soundgain.cpp | 16 +- src/qt/qt_specifydimensions.cpp | 16 +- src/qt/qt_styleoverride.cpp | 16 +- src/qt/qt_ui.cpp | 18 +- src/qt/qt_unixmanagerfilter.cpp | 23 +- src/qt/qt_unixmanagerfilter.hpp | 21 +- src/qt/qt_util.cpp | 16 +- src/qt/qt_winmanagerfilter.cpp | 19 +- src/qt/qt_winmanagerfilter.hpp | 19 +- src/qt/qt_winrawinputfilter.cpp | 23 +- src/qt/qt_winrawinputfilter.hpp | 19 +- src/qt/win_dynld.c | 16 +- src/qt/win_joystick_rawinput.c | 26 +- src/qt/wl_mouse.cpp | 16 +- src/qt/xinput2_mouse.cpp | 16 +- src/scsi/scsi_aha154x.c | 18 +- src/scsi/scsi_buslogic.c | 2 +- src/scsi/scsi_cdrom.c | 10 +- src/scsi/scsi_spock.c | 12 +- src/scsi/scsi_x54x.c | 16 +- src/sio/sio_82091aa.c | 17 +- src/sio/sio_acc3221.c | 204 +- src/sio/sio_ali5123.c | 17 +- src/sio/sio_detect.c | 16 +- src/sio/sio_f82c710.c | 38 +- src/sio/sio_fdc37c669.c | 17 +- src/sio/sio_fdc37c67x.c | 25 +- src/sio/sio_fdc37c93x.c | 19 +- src/sio/sio_fdc37m60x.c | 19 +- src/sio/sio_it8661f.c | 18 +- src/sio/sio_pc87306.c | 17 +- src/sio/sio_pc87307.c | 17 +- src/sio/sio_pc87309.c | 17 +- src/sio/sio_pc87310.c | 24 +- src/sio/sio_pc87311.c | 19 +- src/sio/sio_pc87332.c | 17 +- src/sio/sio_prime3b.c | 19 +- src/sio/sio_prime3c.c | 19 +- src/sio/sio_um8669f.c | 56 +- src/sio/sio_vt82c686.c | 16 +- src/sio/sio_w83787f.c | 20 +- src/sio/sio_w83877f.c | 20 +- src/sio/sio_w83977f.c | 20 +- src/video/agpgart.c | 16 +- src/video/vid_8514a.c | 18 +- src/video/vid_ati18800.c | 20 +- src/video/vid_ati28800.c | 24 +- src/video/vid_ati68860_ramdac.c | 52 +- src/video/vid_ati_eeprom.c | 20 +- src/video/vid_ati_mach64.c | 20 +- src/video/vid_att20c49x_ramdac.c | 20 +- src/video/vid_att2xc498_ramdac.c | 20 +- src/video/vid_av9194.c | 18 +- src/video/vid_bt48x_ramdac.c | 22 +- src/video/vid_cga.c | 20 +- src/video/vid_cga_comp.c | 22 +- src/video/vid_colorplus.c | 20 +- src/video/vid_compaq_cga.c | 24 +- src/video/vid_ddc.c | 16 +- src/video/vid_ega.c | 22 +- src/video/vid_ega_render.c | 20 +- src/video/vid_et3000.c | 18 +- src/video/vid_f82c425.c | 48 +- src/video/vid_genius.c | 20 +- src/video/vid_hercules.c | 20 +- src/video/vid_herculesplus.c | 20 +- src/video/vid_ht216.c | 20 +- src/video/vid_ibm_rgb528_ramdac.c | 16 +- src/video/vid_icd2061.c | 26 +- src/video/vid_ics2494.c | 18 +- src/video/vid_ics2595.c | 20 +- src/video/vid_im1024.c | 64 +- src/video/vid_incolor.c | 20 +- src/video/vid_mda.c | 20 +- src/video/vid_mga.c | 17 +- src/video/vid_nga.c | 28 +- src/video/vid_oak_oti.c | 20 +- src/video/vid_ogc.c | 30 +- src/video/vid_paradise.c | 24 +- src/video/vid_pgc.c | 74 +- src/video/vid_rtg310x.c | 16 +- src/video/vid_s3_virge.c | 20 +- src/video/vid_sc1148x_ramdac.c | 18 +- src/video/vid_sc1502x_ramdac.c | 22 +- src/video/vid_sdac_ramdac.c | 20 +- src/video/vid_sigma.c | 16 +- src/video/vid_stg_ramdac.c | 20 +- src/video/vid_svga_render.c | 20 +- src/video/vid_tgui9440.c | 84 +- src/video/vid_ti_cf62011.c | 82 +- src/video/vid_tkd8001_ramdac.c | 20 +- src/video/vid_tvga.c | 20 +- src/video/vid_tvp3026_ramdac.c | 20 +- src/video/vid_vga.c | 20 +- src/video/vid_voodoo.c | 18 +- src/video/vid_voodoo_banshee.c | 16 +- src/video/vid_voodoo_blitter.c | 16 +- src/video/vid_voodoo_display.c | 16 +- src/video/vid_voodoo_fb.c | 16 +- src/video/vid_voodoo_fifo.c | 16 +- src/video/vid_voodoo_reg.c | 16 +- src/video/vid_voodoo_render.c | 16 +- src/video/vid_voodoo_setup.c | 16 +- src/video/vid_voodoo_texture.c | 16 +- src/video/vid_wy700.c | 20 +- src/video/video.c | 70 +- src/win/win_icon.c | 1 + src/win/win_joystick_rawinput.c | 2 + src/win/win_opengl.c | 2 + src/win/win_opengl_glslp.c | 2 + 311 files changed, 6218 insertions(+), 6062 deletions(-) diff --git a/.ci/AppImageBuilder.yml b/.ci/AppImageBuilder.yml index 05a7b8fcb..69376b511 100644 --- a/.ci/AppImageBuilder.yml +++ b/.ci/AppImageBuilder.yml @@ -1,26 +1,26 @@ # -# 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. # -# Recipe file for appimage-builder. +# Recipe file for appimage-builder. # -# build.sh processes conditional comments based on CMakeCache -# options at the end of each line. For example, a line ending in: +# build.sh processes conditional comments based on CMakeCache +# options at the end of each line. For example, a line ending in: # -# # if QT:BOOL=ON +# # if QT:BOOL=ON # -# will be removed from the dynamically-generated copy of this -# file if "QT" is not a boolean option set to ON, either through -# a -D definition or the option's default value in CMakeLists. +# will be removed from the dynamically-generated copy of this +# file if "QT" is not a boolean option set to ON, either through +# a -D definition or the option's default value in CMakeLists. # # -# Authors: RichardG, +# Authors: RichardG, # -# Copyright 2022 RichardG. +# Copyright 2022 RichardG. # version: 1 diff --git a/.ci/Jenkinsfile b/.ci/Jenkinsfile index d7b2f94aa..6ab63ea30 100644 --- a/.ci/Jenkinsfile +++ b/.ci/Jenkinsfile @@ -1,18 +1,18 @@ /* - * 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. * - * Jenkins build pipeline definition. + * Jenkins build pipeline definition. * * * - * Authors: RichardG, + * Authors: RichardG, * - * Copyright 2021-2022 RichardG. + * Copyright 2021-2022 RichardG. */ /* ['main builds', 'branch builds'] */ diff --git a/.ci/build.sh b/.ci/build.sh index f0d91fe18..b2ff8cd83 100644 --- a/.ci/build.sh +++ b/.ci/build.sh @@ -1,18 +1,18 @@ #!/bin/sh # -# 86Box A hypervisor and IBM PC system emulator that specializes in -# running old operating systems and software designed for IBM -# PC systems and compatibles from 1981 through fairly recent -# system designs based on the PCI bus. +# 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. # -# Jenkins build script. +# Jenkins build script. # # -# Authors: RichardG, +# Authors: RichardG, # -# Copyright 2021-2022 RichardG. +# Copyright 2021-2022 RichardG. # # diff --git a/.ci/static2dll.sh b/.ci/static2dll.sh index f6e5b63b9..030898752 100644 --- a/.ci/static2dll.sh +++ b/.ci/static2dll.sh @@ -1,18 +1,18 @@ #!/bin/sh # -# 86Box A hypervisor and IBM PC system emulator that specializes in -# running old operating systems and software designed for IBM -# PC systems and compatibles from 1981 through fairly recent -# system designs based on the PCI bus. +# 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. # -# Script for converting MinGW static libraries into a DLL. +# Script for converting MinGW static libraries into a DLL. # # -# Authors: RichardG, +# Authors: RichardG, # -# Copyright 2021 RichardG. +# Copyright 2021 RichardG. # def_file="static2dll.def" diff --git a/bumpversion.sh b/bumpversion.sh index ce3b7c4c8..87728603c 100644 --- a/bumpversion.sh +++ b/bumpversion.sh @@ -1,18 +1,18 @@ #!/bin/sh # -# 86Box A hypervisor and IBM PC system emulator that specializes in -# running old operating systems and software designed for IBM -# PC systems and compatibles from 1981 through fairly recent -# system designs based on the PCI bus. +# 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. # -# Convenience script for changing the emulator's version. +# Convenience script for changing the emulator's version. # # -# Authors: RichardG, +# Authors: RichardG, # -# Copyright 2022 RichardG. +# Copyright 2022 RichardG. # # Parse arguments. diff --git a/cmake/flags-gcc-aarch64.cmake b/cmake/flags-gcc-aarch64.cmake index 34ddaf3e6..4344e2c81 100644 --- a/cmake/flags-gcc-aarch64.cmake +++ b/cmake/flags-gcc-aarch64.cmake @@ -1,20 +1,20 @@ # -# 86Box A hypervisor and IBM PC system emulator that specializes in -# running old operating systems and software designed for IBM -# PC systems and compatibles from 1981 through fairly recent -# system designs based on the PCI bus. +# 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 toolchain file defining GCC compiler flags -# for AArch64 (ARM64) targets. +# CMake toolchain file defining GCC compiler flags +# for AArch64 (ARM64) targets. # -# Authors: David Hrdlička, +# Authors: David Hrdlička, # -# Copyright 2021 David Hrdlička. +# Copyright 2021 David Hrdlička. # string(APPEND CMAKE_C_FLAGS_INIT " -march=armv8-a") string(APPEND CMAKE_CXX_FLAGS_INIT " -march=armv8-a") -include(${CMAKE_CURRENT_LIST_DIR}/flags-gcc.cmake) \ No newline at end of file +include(${CMAKE_CURRENT_LIST_DIR}/flags-gcc.cmake) diff --git a/cmake/flags-gcc-armv7.cmake b/cmake/flags-gcc-armv7.cmake index e73f55edd..828fb1a21 100644 --- a/cmake/flags-gcc-armv7.cmake +++ b/cmake/flags-gcc-armv7.cmake @@ -1,20 +1,20 @@ # -# 86Box A hypervisor and IBM PC system emulator that specializes in -# running old operating systems and software designed for IBM -# PC systems and compatibles from 1981 through fairly recent -# system designs based on the PCI bus. +# 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 toolchain file defining GCC compiler flags -# for ARMv7 targets. +# CMake toolchain file defining GCC compiler flags +# for ARMv7 targets. # -# Authors: David Hrdlička, +# Authors: David Hrdlička, # -# Copyright 2021 David Hrdlička. +# Copyright 2021 David Hrdlička. # string(APPEND CMAKE_C_FLAGS_INIT " -march=armv7-a -mfloat-abi=hard") string(APPEND CMAKE_CXX_FLAGS_INIT " -march=armv7-a -mfloat-abi=hard") -include(${CMAKE_CURRENT_LIST_DIR}/flags-gcc.cmake) \ No newline at end of file +include(${CMAKE_CURRENT_LIST_DIR}/flags-gcc.cmake) diff --git a/cmake/flags-gcc-i686.cmake b/cmake/flags-gcc-i686.cmake index 2d12b7937..3b3d72a16 100644 --- a/cmake/flags-gcc-i686.cmake +++ b/cmake/flags-gcc-i686.cmake @@ -1,17 +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 toolchain file defining GCC compiler flags -# for 32-bit x86 targets. +# CMake toolchain file defining GCC compiler flags +# for 32-bit x86 targets. # -# Authors: David Hrdlička, +# Authors: David Hrdlička, # -# Copyright 2021 David Hrdlička. +# Copyright 2021 David Hrdlička. # string(APPEND CMAKE_C_FLAGS_INIT " -m32 -march=i686 -msse2 -mfpmath=sse -mstackrealign") diff --git a/cmake/flags-gcc-x86_64.cmake b/cmake/flags-gcc-x86_64.cmake index f9f39eb97..47928df42 100644 --- a/cmake/flags-gcc-x86_64.cmake +++ b/cmake/flags-gcc-x86_64.cmake @@ -1,17 +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 toolchain file defining GCC compiler flags -# for 64-bit x86 targets. +# CMake toolchain file defining GCC compiler flags +# for 64-bit x86 targets. # -# Authors: David Hrdlička, +# Authors: David Hrdlička, # -# Copyright 2021 David Hrdlička. +# Copyright 2021 David Hrdlička. # string(APPEND CMAKE_C_FLAGS_INIT " -m64 -march=x86-64 -msse2 -mfpmath=sse -mstackrealign") diff --git a/cmake/flags-gcc.cmake b/cmake/flags-gcc.cmake index e1bf3650e..885353b87 100644 --- a/cmake/flags-gcc.cmake +++ b/cmake/flags-gcc.cmake @@ -1,16 +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. +# 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 toolchain file defining GCC compiler flags. +# CMake toolchain file defining GCC compiler flags. # -# Authors: David Hrdlička, +# Authors: David Hrdlička, # -# Copyright 2021 David Hrdlička. +# Copyright 2021 David Hrdlička. # # Define our flags diff --git a/cmake/llvm-macos-aarch64.cmake b/cmake/llvm-macos-aarch64.cmake index da9ccb449..df67ad45b 100644 --- a/cmake/llvm-macos-aarch64.cmake +++ b/cmake/llvm-macos-aarch64.cmake @@ -1,22 +1,22 @@ # -# 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 toolchain file defining Clang compiler flags -# for AArch64 (ARM64)-based Apple Silicon targets. +# CMake toolchain file defining Clang compiler flags +# for AArch64 (ARM64)-based Apple Silicon targets. # -# Authors: David Hrdlička, -# dob205 +# Authors: David Hrdlička, +# dob205 # -# Copyright 2021 David Hrdlička. -# Copyright 2022 dob205. +# Copyright 2021 David Hrdlička. +# Copyright 2022 dob205. # string(APPEND CMAKE_C_FLAGS_INIT " -march=armv8.5-a+simd") string(APPEND CMAKE_CXX_FLAGS_INIT " -march=armv8.5-a+simd") -include(${CMAKE_CURRENT_LIST_DIR}/flags-gcc.cmake) \ No newline at end of file +include(${CMAKE_CURRENT_LIST_DIR}/flags-gcc.cmake) diff --git a/cmake/llvm-win32-aarch64.cmake b/cmake/llvm-win32-aarch64.cmake index 4aacb248f..015a0dad0 100644 --- a/cmake/llvm-win32-aarch64.cmake +++ b/cmake/llvm-win32-aarch64.cmake @@ -1,16 +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. +# 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 toolchain file for Clang on Windows builds (ARM64 target). +# CMake toolchain file for Clang on Windows builds (ARM64 target). # -# Authors: David Hrdlička, +# Authors: David Hrdlička, # -# Copyright 2021 David Hrdlička. +# Copyright 2021 David Hrdlička. # include(${CMAKE_CURRENT_LIST_DIR}/flags-gcc-aarch64.cmake) @@ -27,4 +27,4 @@ set(CMAKE_CXX_COMPILER_TARGET aarch64-pc-windows-msvc) set(CMAKE_SYSTEM_PROCESSOR ARM64) -# TODO: set the vcpkg target triplet perhaps? \ No newline at end of file +# TODO: set the vcpkg target triplet perhaps? diff --git a/cmake/llvm-win32-arm.cmake b/cmake/llvm-win32-arm.cmake index 9d3488124..30c9877d4 100644 --- a/cmake/llvm-win32-arm.cmake +++ b/cmake/llvm-win32-arm.cmake @@ -1,16 +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. +# 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 toolchain file for Clang on Windows builds (ARM64 target). +# CMake toolchain file for Clang on Windows builds (ARM64 target). # -# Authors: David Hrdlička, +# Authors: David Hrdlička, # -# Copyright 2021 David Hrdlička. +# Copyright 2021 David Hrdlička. # include(${CMAKE_CURRENT_LIST_DIR}/flags-gcc-armv7.cmake) diff --git a/cmake/llvm-win32-i686.cmake b/cmake/llvm-win32-i686.cmake index 8221f8bc2..b69771407 100644 --- a/cmake/llvm-win32-i686.cmake +++ b/cmake/llvm-win32-i686.cmake @@ -1,16 +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. +# 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 toolchain file for Clang on Windows builds (x86 target). +# CMake toolchain file for Clang on Windows builds (x86 target). # -# Authors: David Hrdlička, +# Authors: David Hrdlička, # -# Copyright 2021 David Hrdlička. +# Copyright 2021 David Hrdlička. # include(${CMAKE_CURRENT_LIST_DIR}/flags-gcc-i686.cmake) @@ -27,4 +27,4 @@ set(CMAKE_CXX_COMPILER_TARGET i686-pc-windows-msvc) set(CMAKE_SYSTEM_PROCESSOR X86) -# TODO: set the vcpkg target triplet perhaps? \ No newline at end of file +# TODO: set the vcpkg target triplet perhaps? diff --git a/cmake/llvm-win32-x86_64.cmake b/cmake/llvm-win32-x86_64.cmake index 7caeb7836..da0cfd3f2 100644 --- a/cmake/llvm-win32-x86_64.cmake +++ b/cmake/llvm-win32-x86_64.cmake @@ -1,16 +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. +# 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 toolchain file for Clang on Windows builds (x64/AMD64 target). +# CMake toolchain file for Clang on Windows builds (x64/AMD64 target). # -# Authors: David Hrdlička, +# Authors: David Hrdlička, # -# Copyright 2021 David Hrdlička. +# Copyright 2021 David Hrdlička. # include(${CMAKE_CURRENT_LIST_DIR}/flags-gcc-x86_64.cmake) @@ -27,4 +27,4 @@ set(CMAKE_CXX_COMPILER_TARGET x86_64-pc-windows-msvc) set(CMAKE_SYSTEM_PROCESSOR AMD64) -# TODO: set the vcpkg target triplet perhaps? \ No newline at end of file +# TODO: set the vcpkg target triplet perhaps? diff --git a/src/Makefile.local b/src/Makefile.local index 4c6830afd..fdb2dcab3 100644 --- a/src/Makefile.local +++ b/src/Makefile.local @@ -1,32 +1,32 @@ # -# 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. # -# Prefix for localizing the general Makefile.mingw for local -# settings, so we can avoid changing the main one for all of -# our local setups. +# Prefix for localizing the general Makefile.mingw for local +# settings, so we can avoid changing the main one for all of +# our local setups. # -# Author: Fred N. van Kempen, +# Authors: Fred N. van Kempen, # ######################################################################### -# Anything here will override defaults in Makefile.MinGW. # +# Anything here will override defaults in Makefile.MinGW. # ######################################################################### # Name of the executable. -#PROG := yourexe +#PROG := 86box.exe # Various compile-time options. # -DROM_TRACE=0xc800 traces ROM access from segment C800 # -DIO_TRACE=0x66 traces I/O on port 0x66 # -DIO_CATCH enables I/O range catch logs -STUFF := +STUFF := # Add feature selections here. # -DANSI_CFG forces the config file to ANSI encoding. @@ -168,31 +168,31 @@ STUFF := # -DENABLE_JOYSTICK_LOG=N sets logging level at N. # -DENABLE_SDL_LOG=N sets logging level at N. # -DENABLE_SETTINGS_LOG=N sets logging level at N. -EXTRAS := +EXTRAS := -AUTODEP := n -DEBUG := n -OPTIM := n -X64 := n -RELEASE := n -USB := n -VNC := n -RDP := n -DEV_BUILD := n -DEV_BRANCH := n -CIRRUS := n -NE1000 := n -NV_RIVA := n -OPENAL := y -FLUIDSYNTH := y -MUNT := y -PAS16 := n -DYNAREC := y +AUTODEP := n +DEBUG := n +OPTIM := n +X64 := n +RELEASE := n +USB := n +VNC := n +RDP := n +DEV_BUILD := n +DEV_BRANCH := n +CIRRUS := n +NE1000 := n +NV_RIVA := n +OPENAL := y +FLUIDSYNTH := y +MUNT := y +PAS16 := n +DYNAREC := y ######################################################################### -# Include the master Makefile.MinGW for the rest. # +# Include the master Makefile.MinGW for the rest. # ######################################################################### include win/Makefile.mingw diff --git a/src/codegen/codegen_ops_x86-64.h b/src/codegen/codegen_ops_x86-64.h index 00518d9ba..77f7c02ab 100644 --- a/src/codegen/codegen_ops_x86-64.h +++ b/src/codegen/codegen_ops_x86-64.h @@ -82,7 +82,7 @@ load_param_1_reg_32(int reg) #if 0 static __inline void load_param_1_64(codeblock_t *block, uint64_t param) { - addbyte(0x48); + addbyte(0x48); # if _WIN64 addbyte(0xb9); /*MOVL $fetchdat,%ecx*/ # else diff --git a/src/codegen_new/codegen_backend_arm_uops.c b/src/codegen_new/codegen_backend_arm_uops.c index 4cc0ff38d..d0b8b86c1 100644 --- a/src/codegen_new/codegen_backend_arm_uops.c +++ b/src/codegen_new/codegen_backend_arm_uops.c @@ -119,8 +119,8 @@ codegen_ADD(codeblock_t *block, uop_t *uop) static int codegen_ADD_IMM(codeblock_t *block, uop_t *uop) { - // host_arm_ADD_IMM(block, uop->dest_reg_a_real, uop->src_reg_a_real, uop->imm_data); - // return 0; +// host_arm_ADD_IMM(block, uop->dest_reg_a_real, uop->src_reg_a_real, uop->imm_data); +// return 0; int dest_reg = HOST_REG_GET(uop->dest_reg_a_real), src_reg = HOST_REG_GET(uop->src_reg_a_real); int dest_size = IREG_GET_SIZE(uop->dest_reg_a_real), src_size = IREG_GET_SIZE(uop->src_reg_a_real); @@ -2597,8 +2597,8 @@ codegen_SUB(codeblock_t *block, uop_t *uop) return 0; - // host_arm_SUB_REG_LSL(block, uop->dest_reg_a_real, uop->src_reg_a_real, uop->src_reg_b_real, 0); - // return 0; +// host_arm_SUB_REG_LSL(block, uop->dest_reg_a_real, uop->src_reg_a_real, uop->src_reg_b_real, 0); +// return 0; } static int codegen_SUB_IMM(codeblock_t *block, uop_t *uop) diff --git a/src/cpu/codegen_timing_686.c b/src/cpu/codegen_timing_686.c index 9752b24c4..7d7f4042d 100644 --- a/src/cpu/codegen_timing_686.c +++ b/src/cpu/codegen_timing_686.c @@ -949,7 +949,7 @@ void codegen_timing_686_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, uin if (regmask & IMPL_ESP) regmask |= SRCDEP_ESP | DSTDEP_ESP; - agi_stall = check_agi(prev_deps, prev_opcode, prev_fetchdat, prev_op_32); + agi_stall = check_agi(prev_deps, prev_opcode, prev_fetchdat, prev_op_32); /*Second instruction in the pair*/ if ((timings[opcode] & PAIR_MASK) == PAIR_NP) @@ -992,7 +992,7 @@ void codegen_timing_686_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, uin if (!t_pair) fatal("Pairable 0 cycles! %02x %02x\n", opcode, prev_opcode); - agi_stall = check_agi(deps, opcode, fetchdat, op_32); + agi_stall = check_agi(deps, opcode, fetchdat, op_32); codegen_block_cycles += t_pair + agi_stall; decode_delay = (-t_pair) + 1 + agi_stall; @@ -1012,7 +1012,7 @@ void codegen_timing_686_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, uin /*Instruction not pairable*/ int agi_stall = 0; - agi_stall = check_agi(deps, opcode, fetchdat, op_32); + agi_stall = check_agi(deps, opcode, fetchdat, op_32); codegen_block_cycles += COUNT(timings[opcode], op_32) + decode_delay + agi_stall; decode_delay = (-COUNT(timings[opcode], op_32)) + 1 + agi_stall; diff --git a/src/cpu/codegen_timing_p6.c b/src/cpu/codegen_timing_p6.c index 19fa07de1..cf40e084e 100644 --- a/src/cpu/codegen_timing_p6.c +++ b/src/cpu/codegen_timing_p6.c @@ -23,10 +23,10 @@ typedef enum uop_type_t UOP_ALUP0, /*Executes in Port 0 ALU unit*/ UOP_LOAD, /*Executes in Load unit*/ UOP_STORED, /*Executes in Data Store unit*/ - UOP_STOREA, /*Executes in Address Store unit*/ + UOP_STOREA, /*Executes in Address Store unit*/ UOP_FLOAD, /*Executes in Load unit*/ UOP_FSTORED, /*Executes in Data Store unit*/ - UOP_FSTOREA, /*Executes in Address Store unit*/ + UOP_FSTOREA, /*Executes in Address Store unit*/ UOP_MLOAD, /*Executes in Load unit*/ UOP_MSTORED, /*Executes in Data Store unit*/ UOP_MSTOREA, /*Executes in Address Store unit*/ @@ -93,7 +93,7 @@ static const macro_op_t alu_store_op = .uop[1] = {.type = UOP_ALU, .latency = 1}, .uop[2] = {.type = UOP_STORED, .latency = 1}, .uop[3] = {.type = UOP_STOREA, .latency = 1} - }; +}; static const macro_op_t alup0_store_op = { .nr_uops = 4, @@ -162,8 +162,8 @@ static const macro_op_t loop_op = .decode_type = DECODE_COMPLEX, .uop[0] = {.type = UOP_ALU, .latency = 1}, .uop[1] = {.type = UOP_ALU, .latency = 1}, - .uop[2] = {.type = UOP_ALU, .latency = 1}, - .uop[3] = {.type = UOP_ALU, .latency = 1}, + .uop[2] = {.type = UOP_ALU, .latency = 1}, + .uop[3] = {.type = UOP_ALU, .latency = 1}, .uop[4] = {.type = UOP_BRANCH, .latency = 1} }; static const macro_op_t mov_reg_seg_op = @@ -219,7 +219,7 @@ static const macro_op_t push_seg_op = .uop[0] = {.type = UOP_LOAD, .latency = 1}, .uop[1] = {.type = UOP_STORED, .latency = 1}, .uop[2] = {.type = UOP_STOREA, .latency = 1}, - .uop[3] = {.type = UOP_ALU, .latency = 1} + .uop[3] = {.type = UOP_ALU, .latency = 1} }; static const macro_op_t stos_op = { @@ -1607,24 +1607,24 @@ static p6_unit_t *units; /*Pentium Pro has no MMX*/ static p6_unit_t ppro_units[] = { - {.uop_mask = (1 << UOP_ALU) | (1 << UOP_ALUP0) | (1 << UOP_FLOAT)}, /*Port 0*/ - {.uop_mask = (1 << UOP_ALU) | (1 << UOP_BRANCH)}, /*Port 1*/ - {.uop_mask = (1 << UOP_LOAD) | (1 << UOP_FLOAD)}, /*Port 2*/ - {.uop_mask = (1 << UOP_STORED) | (1 << UOP_FSTORED)}, /*Port 3*/ - {.uop_mask = (1 << UOP_STOREA) | (1 << UOP_FSTOREA)}, /*Port 4*/ + {.uop_mask = (1 << UOP_ALU) | (1 << UOP_ALUP0) | (1 << UOP_FLOAT)}, /*Port 0*/ + {.uop_mask = (1 << UOP_ALU) | (1 << UOP_BRANCH)}, /*Port 1*/ + {.uop_mask = (1 << UOP_LOAD) | (1 << UOP_FLOAD)}, /*Port 2*/ + {.uop_mask = (1 << UOP_STORED) | (1 << UOP_FSTORED)}, /*Port 3*/ + {.uop_mask = (1 << UOP_STOREA) | (1 << UOP_FSTOREA)}, /*Port 4*/ }; #define NR_PPRO_UNITS (sizeof(ppro_units) / sizeof(p6_unit_t)) /*Pentium II/Celeron assigns the multiplier to port 0, the shifter to port 1, and shares the MMX ALU*/ static p6_unit_t p2_units[] = { - {.uop_mask = (1 << UOP_ALU) | (1 << UOP_ALUP0) | (1 << UOP_FLOAT) | /*Port 0*/ - (1 << UOP_MMX) | (1 << UOP_MMX_MUL)}, - {.uop_mask = (1 << UOP_ALU) | (1 << UOP_BRANCH) | /*Port 1*/ - (1 << UOP_MMX) | (1 << UOP_MMX_SHIFT)}, - {.uop_mask = (1 << UOP_LOAD) | (1 << UOP_FLOAD) | (1 << UOP_MLOAD)}, /*Port 2*/ - {.uop_mask = (1 << UOP_STORED) | (1 << UOP_FSTORED) | (1 << UOP_MSTORED)}, /*Port 3*/ - {.uop_mask = (1 << UOP_STOREA) | (1 << UOP_FSTOREA) | (1 << UOP_MSTOREA)}, /*Port 4*/ + {.uop_mask = (1 << UOP_ALU) | (1 << UOP_ALUP0) | (1 << UOP_FLOAT) | /*Port 0*/ + (1 << UOP_MMX) | (1 << UOP_MMX_MUL)}, + {.uop_mask = (1 << UOP_ALU) | (1 << UOP_BRANCH) | /*Port 1*/ + (1 << UOP_MMX) | (1 << UOP_MMX_SHIFT)}, + {.uop_mask = (1 << UOP_LOAD) | (1 << UOP_FLOAD) | (1 << UOP_MLOAD)}, /*Port 2*/ + {.uop_mask = (1 << UOP_STORED) | (1 << UOP_FSTORED) | (1 << UOP_MSTORED)}, /*Port 3*/ + {.uop_mask = (1 << UOP_STOREA) | (1 << UOP_FSTOREA) | (1 << UOP_MSTOREA)}, /*Port 4*/ }; #define NR_P2_UNITS (sizeof(p2_units) / sizeof(p6_unit_t)) @@ -1790,7 +1790,7 @@ static void decode_instruction(const macro_op_t *ins, uint64_t deps, uint32_t fe uint32_t regmask_required; uint32_t regmask_modified; int c; - int d = 0; /*Complex decoder uOPs*/ + int d = 0; /*Complex decoder uOPs*/ int earliest_start = 0; decode_type_t decode_type = ins->decode_type; int instr_length = codegen_timing_instr_length(deps, fetchdat, op_32); @@ -1839,7 +1839,7 @@ static void decode_instruction(const macro_op_t *ins, uint64_t deps, uint32_t fe decode_buffer.uops[decode_buffer.nr_uops] = &ins->uop[0]; decode_buffer.earliest_start[decode_buffer.nr_uops] = earliest_start; decode_buffer.nr_uops = 2+d; - if (d) + if (d) decode_flush_p6(); } else if (decode_buffer.nr_uops) @@ -1869,7 +1869,7 @@ static void decode_instruction(const macro_op_t *ins, uint64_t deps, uint32_t fe decode_buffer.earliest_start[d] = earliest_start; else decode_buffer.earliest_start[d] = -1; - d++; + d++; if ((d == 3) && (ins->nr_uops > 4)) /*Ins. with >4 uOPs require the use of special units only present on 3 translate PLAs*/ { @@ -1878,10 +1878,10 @@ static void decode_instruction(const macro_op_t *ins, uint64_t deps, uint32_t fe decode_flush_p6(); /*The other two decoders are halted to preserve in-order issue*/ } } - if (d) - { - decode_buffer.nr_uops = d; - } + if (d) + { + decode_buffer.nr_uops = d; + } break; } @@ -1982,8 +1982,8 @@ void codegen_timing_p6_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, uint switch (last_prefix) { case 0x0f: - ins_table = mod3 ? opcode_timings_0f_mod3 : opcode_timings_0f; - deps = mod3 ? opcode_deps_0f_mod3 : opcode_deps_0f; + ins_table = mod3 ? opcode_timings_0f_mod3 : opcode_timings_0f; + deps = mod3 ? opcode_deps_0f_mod3 : opcode_deps_0f; break; case 0xd8: diff --git a/src/cpu/cpu_table.c b/src/cpu/cpu_table.c index f9e86541c..70c67f91e 100644 --- a/src/cpu/cpu_table.c +++ b/src/cpu/cpu_table.c @@ -21,8 +21,8 @@ * Copyright 2016-2019 leilei. * Copyright 2016-2019 Miran Grca. * Copyright 2017-2020 Fred N. van Kempen. - * Copyright 2020 RichardG. - * Copyright 2021 dob205. + * Copyright 2020 RichardG. + * Copyright 2021 dob205. */ #include #include @@ -71,1089 +71,1086 @@ 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[]) { - {"4.77", CPU_8088, fpus_8088, 4772728, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, - {"7.16", CPU_8088, fpus_8088, 7159092, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, - {"8", CPU_8088, fpus_8088, 8000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, -// {"9.54", CPU_8088, fpus_8088, 9545456, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, - {"10", CPU_8088, fpus_8088, 10000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, - {"12", CPU_8088, fpus_8088, 12000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, - {"16", CPU_8088, fpus_8088, 16000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, - {"", 0} - } + .package = CPU_PKG_8088, + .manufacturer = "Intel", + .name = "8088", + .internal_name = "8088", + .cpus = (const CPU[]) { + {"4.77", CPU_8088, fpus_8088, 4772728, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, + {"7.16", CPU_8088, fpus_8088, 7159092, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, + {"8", CPU_8088, fpus_8088, 8000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, +// {"9.54", CPU_8088, fpus_8088, 9545456, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, + {"10", CPU_8088, fpus_8088, 10000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, + {"12", CPU_8088, fpus_8088, 12000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, + {"16", CPU_8088, fpus_8088, 16000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, + {"", 0} + } }, { - .package = CPU_PKG_8088_EUROPC, - .manufacturer = "Intel", - .name = "8088", - .internal_name = "8088_europc", - .cpus = (const CPU[]) { - {"4.77", CPU_8088, fpus_8088, 4772728, 1, 5000, 0, 0, 0, CPU_ALTERNATE_XTAL, 0,0,0,0, 1}, - {"7.16", CPU_8088, fpus_8088, 7159092, 1, 5000, 0, 0, 0, CPU_ALTERNATE_XTAL, 0,0,0,0, 1}, - {"9.54", CPU_8088, fpus_8088, 9545456, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, - {"", 0} - } + .package = CPU_PKG_8088_EUROPC, + .manufacturer = "Intel", + .name = "8088", + .internal_name = "8088_europc", + .cpus = (const CPU[]) { + {"4.77", CPU_8088, fpus_8088, 4772728, 1, 5000, 0, 0, 0, CPU_ALTERNATE_XTAL, 0,0,0,0, 1}, + {"7.16", CPU_8088, fpus_8088, 7159092, 1, 5000, 0, 0, 0, CPU_ALTERNATE_XTAL, 0,0,0,0, 1}, + {"9.54", CPU_8088, fpus_8088, 9545456, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, + {"", 0} + } }, { - .package = CPU_PKG_8086, - .manufacturer = "Intel", - .name = "8086", - .internal_name = "8086", - .cpus = (const CPU[]) { - {"7.16", CPU_8086, fpus_8088, 7159092, 1, 5000, 0, 0, 0, CPU_ALTERNATE_XTAL, 0,0,0,0, 1}, - {"8", CPU_8086, fpus_8088, 8000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, - {"9.54", CPU_8086, fpus_8088, 9545456, 1, 5000, 0, 0, 0, CPU_ALTERNATE_XTAL, 0,0,0,0, 1}, - {"10", CPU_8086, fpus_8088, 10000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, - {"12", CPU_8086, fpus_8088, 12000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, - {"16", CPU_8086, fpus_8088, 16000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 2}, - {"", 0} - } + .package = CPU_PKG_8086, + .manufacturer = "Intel", + .name = "8086", + .internal_name = "8086", + .cpus = (const CPU[]) { + {"7.16", CPU_8086, fpus_8088, 7159092, 1, 5000, 0, 0, 0, CPU_ALTERNATE_XTAL, 0,0,0,0, 1}, + {"8", CPU_8086, fpus_8088, 8000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, + {"9.54", CPU_8086, fpus_8088, 9545456, 1, 5000, 0, 0, 0, CPU_ALTERNATE_XTAL, 0,0,0,0, 1}, + {"10", CPU_8086, fpus_8088, 10000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, + {"12", CPU_8086, fpus_8088, 12000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, + {"16", CPU_8086, fpus_8088, 16000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 2}, + {"", 0} + } }, { - .package = CPU_PKG_188, - .manufacturer = "Intel", - .name = "80188", - .internal_name = "80188", - .cpus = (const CPU[]) { - {"6", CPU_188, fpus_8088, 6000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, - {"7.16", CPU_188, fpus_8088, 7159092, 1, 5000, 0, 0, 0, CPU_ALTERNATE_XTAL, 0,0,0,0, 1}, - {"8", CPU_188, fpus_8088, 8000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, - {"9.54", CPU_188, fpus_8088, 9545456, 1, 5000, 0, 0, 0, CPU_ALTERNATE_XTAL, 0,0,0,0, 1}, - {"10", CPU_188, fpus_8088, 10000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, - {"12", CPU_188, fpus_8088, 12000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, - {"16", CPU_188, fpus_8088, 16000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 2}, - {"20", CPU_188, fpus_8088, 20000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 3}, - {"25", CPU_188, fpus_8088, 25000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 3}, - {"", 0} - } + .package = CPU_PKG_188, + .manufacturer = "Intel", + .name = "80188", + .internal_name = "80188", + .cpus = (const CPU[]) { + {"6", CPU_188, fpus_8088, 6000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, + {"7.16", CPU_188, fpus_8088, 7159092, 1, 5000, 0, 0, 0, CPU_ALTERNATE_XTAL, 0,0,0,0, 1}, + {"8", CPU_188, fpus_8088, 8000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, + {"9.54", CPU_188, fpus_8088, 9545456, 1, 5000, 0, 0, 0, CPU_ALTERNATE_XTAL, 0,0,0,0, 1}, + {"10", CPU_188, fpus_8088, 10000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, + {"12", CPU_188, fpus_8088, 12000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, + {"16", CPU_188, fpus_8088, 16000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 2}, + {"20", CPU_188, fpus_8088, 20000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 3}, + {"25", CPU_188, fpus_8088, 25000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 3}, + {"", 0} + } }, { - .package = CPU_PKG_8088, - .manufacturer = "NEC", - .name = "V20", - .internal_name = "necv20", - .cpus = (const CPU[]) { - {"4.77", CPU_V20, fpus_8088, 4772728, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, - {"7.16", CPU_V20, fpus_8088, 7159092, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, - {"10", CPU_V20, fpus_8088, 10000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, - {"12", CPU_V20, fpus_8088, 12000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, - {"16", CPU_V20, fpus_8088, 16000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 2}, - {"", 0} - } + .package = CPU_PKG_8088, + .manufacturer = "NEC", + .name = "V20", + .internal_name = "necv20", + .cpus = (const CPU[]) { + {"4.77", CPU_V20, fpus_8088, 4772728, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, + {"7.16", CPU_V20, fpus_8088, 7159092, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, + {"10", CPU_V20, fpus_8088, 10000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, + {"12", CPU_V20, fpus_8088, 12000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, + {"16", CPU_V20, fpus_8088, 16000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 2}, + {"", 0} + } }, { - .package = CPU_PKG_186, - .manufacturer = "Intel", - .name = "80186", - .internal_name = "80186", - .cpus = (const CPU[]) { - {"6", CPU_186, fpus_80186, 6000000, 1, 0, 0, 0, 0, 0, 0,0,0,0, 1}, - {"7.16", CPU_186, fpus_80186, 7159092, 1, 0, 0, 0, 0, CPU_ALTERNATE_XTAL, 0,0,0,0, 1}, - {"8", CPU_186, fpus_80186, 8000000, 1, 0, 0, 0, 0, 0, 0,0,0,0, 1}, - {"9.54", CPU_186, fpus_80186, 9545456, 1, 0, 0, 0, 0, CPU_ALTERNATE_XTAL, 0,0,0,0, 1}, - {"10", CPU_186, fpus_80186, 10000000, 1, 0, 0, 0, 0, 0, 0,0,0,0, 1}, - {"12", CPU_186, fpus_80186, 12000000, 1, 0, 0, 0, 0, 0, 0,0,0,0, 1}, - {"16", CPU_186, fpus_80186, 16000000, 1, 0, 0, 0, 0, 0, 0,0,0,0, 2}, - {"20", CPU_186, fpus_80186, 20000000, 1, 0, 0, 0, 0, 0, 0,0,0,0, 3}, - {"25", CPU_186, fpus_80186, 25000000, 1, 0, 0, 0, 0, 0, 0,0,0,0, 3}, - {"", 0} - } + .package = CPU_PKG_186, + .manufacturer = "Intel", + .name = "80186", + .internal_name = "80186", + .cpus = (const CPU[]) { + {"6", CPU_186, fpus_80186, 6000000, 1, 0, 0, 0, 0, 0, 0,0,0,0, 1}, + {"7.16", CPU_186, fpus_80186, 7159092, 1, 0, 0, 0, 0, CPU_ALTERNATE_XTAL, 0,0,0,0, 1}, + {"8", CPU_186, fpus_80186, 8000000, 1, 0, 0, 0, 0, 0, 0,0,0,0, 1}, + {"9.54", CPU_186, fpus_80186, 9545456, 1, 0, 0, 0, 0, CPU_ALTERNATE_XTAL, 0,0,0,0, 1}, + {"10", CPU_186, fpus_80186, 10000000, 1, 0, 0, 0, 0, 0, 0,0,0,0, 1}, + {"12", CPU_186, fpus_80186, 12000000, 1, 0, 0, 0, 0, 0, 0,0,0,0, 1}, + {"16", CPU_186, fpus_80186, 16000000, 1, 0, 0, 0, 0, 0, 0,0,0,0, 2}, + {"20", CPU_186, fpus_80186, 20000000, 1, 0, 0, 0, 0, 0, 0,0,0,0, 3}, + {"25", CPU_186, fpus_80186, 25000000, 1, 0, 0, 0, 0, 0, 0,0,0,0, 3}, + {"", 0} + } }, { - .package = CPU_PKG_8086, - .manufacturer = "NEC", - .name = "V30", - .internal_name = "necv30", - .cpus = (const CPU[]) { - {"5", CPU_V30, fpus_80186, 5000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, - {"8", CPU_V30, fpus_80186, 8000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, - {"10", CPU_V30, fpus_80186, 10000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, - {"12", CPU_V30, fpus_80186, 12000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, - {"16", CPU_V30, fpus_80186, 16000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 2}, - {"", 0} - } + .package = CPU_PKG_8086, + .manufacturer = "NEC", + .name = "V30", + .internal_name = "necv30", + .cpus = (const CPU[]) { + {"5", CPU_V30, fpus_80186, 5000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, + {"8", CPU_V30, fpus_80186, 8000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, + {"10", CPU_V30, fpus_80186, 10000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, + {"12", CPU_V30, fpus_80186, 12000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, + {"16", CPU_V30, fpus_80186, 16000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 2}, + {"", 0} + } }, { - .package = CPU_PKG_286, - .manufacturer = "Intel", - .name = "80286", - .internal_name = "286", - .cpus = (const CPU[]) { - {"6", CPU_286, fpus_80286, 6000000, 1, 5000, 0, 0, 0, 0, 2,2,2,2, 1}, - {"8", CPU_286, fpus_80286, 8000000, 1, 5000, 0, 0, 0, 0, 2,2,2,2, 1}, - {"10", CPU_286, fpus_80286, 10000000, 1, 5000, 0, 0, 0, 0, 2,2,2,2, 1}, - {"12", CPU_286, fpus_80286, 12500000, 1, 5000, 0, 0, 0, 0, 3,3,3,3, 2}, - {"16", CPU_286, fpus_80286, 16000000, 1, 5000, 0, 0, 0, 0, 3,3,3,3, 2}, - {"20", CPU_286, fpus_80286, 20000000, 1, 5000, 0, 0, 0, 0, 4,4,4,4, 3}, - {"25", CPU_286, fpus_80286, 25000000, 1, 5000, 0, 0, 0, 0, 4,4,4,4, 3}, - {"", 0} - } + .package = CPU_PKG_286, + .manufacturer = "Intel", + .name = "80286", + .internal_name = "286", + .cpus = (const CPU[]) { + {"6", CPU_286, fpus_80286, 6000000, 1, 5000, 0, 0, 0, 0, 2,2,2,2, 1}, + {"8", CPU_286, fpus_80286, 8000000, 1, 5000, 0, 0, 0, 0, 2,2,2,2, 1}, + {"10", CPU_286, fpus_80286, 10000000, 1, 5000, 0, 0, 0, 0, 2,2,2,2, 1}, + {"12", CPU_286, fpus_80286, 12500000, 1, 5000, 0, 0, 0, 0, 3,3,3,3, 2}, + {"16", CPU_286, fpus_80286, 16000000, 1, 5000, 0, 0, 0, 0, 3,3,3,3, 2}, + {"20", CPU_286, fpus_80286, 20000000, 1, 5000, 0, 0, 0, 0, 4,4,4,4, 3}, + {"25", CPU_286, fpus_80286, 25000000, 1, 5000, 0, 0, 0, 0, 4,4,4,4, 3}, + {"", 0} + } }, { - .package = CPU_PKG_386SX, - .manufacturer = "Intel", - .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} - } + .package = CPU_PKG_386SX, + .manufacturer = "Intel", + .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} + } }, { - .package = CPU_PKG_386SX, - .manufacturer = "AMD", - .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} - } + .package = CPU_PKG_386SX, + .manufacturer = "AMD", + .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} + } }, { - .package = CPU_PKG_386DX, - .manufacturer = "Intel", - .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} - } + .package = CPU_PKG_386DX, + .manufacturer = "Intel", + .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} + } }, { - .package = CPU_PKG_386DX, - .manufacturer = "Intel", - .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} - } + .package = CPU_PKG_386DX, + .manufacturer = "Intel", + .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} + } }, { - .package = CPU_PKG_386DX, - .manufacturer = "AMD", - .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} - } - }, - { - .package = CPU_PKG_M6117, - .manufacturer = "ALi", - .name = "M6117", - .internal_name = "m6117", - .cpus = (const CPU[]) { /* All timings and edx_reset values assumed. */ - {"33", CPU_386SX, fpus_none, 33333333, 1, 5000, 0x2308, 0, 0, 0, 6,6,3,3, 4}, - {"40", CPU_386SX, fpus_none, 40000000, 1, 5000, 0x2308, 0, 0, 0, 7,7,3,3, 5}, - {"", 0} - } - }, - { - .package = CPU_PKG_386SLC_IBM, - .manufacturer = "IBM", - .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} - } + .package = CPU_PKG_386DX, + .manufacturer = "AMD", + .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} + } }, { - .package = CPU_PKG_386SX, - .manufacturer = "Cyrix", - .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} - } + .package = CPU_PKG_M6117, + .manufacturer = "ALi", + .name = "M6117", + .internal_name = "m6117", + .cpus = (const CPU[]) { /* All timings and edx_reset values assumed. */ + {"33", CPU_386SX, fpus_none, 33333333, 1, 5000, 0x2308, 0, 0, 0, 6,6,3,3, 4}, + {"40", CPU_386SX, fpus_none, 40000000, 1, 5000, 0x2308, 0, 0, 0, 7,7,3,3, 5}, + {"", 0} + } }, { - .package = CPU_PKG_386SX, - .manufacturer = "Cyrix", - .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} - } + .package = CPU_PKG_386SLC_IBM, + .manufacturer = "IBM", + .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} + } }, { - .package = CPU_PKG_486SLC_IBM, - .manufacturer = "IBM", - .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} - } + .package = CPU_PKG_386SX, + .manufacturer = "Cyrix", + .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} + } }, { - .package = CPU_PKG_486SLC_IBM, - .manufacturer = "IBM", - .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} - } + .package = CPU_PKG_386SX, + .manufacturer = "Cyrix", + .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} + } }, { - .package = CPU_PKG_486SLC_IBM, - .manufacturer = "IBM", - .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} - } + .package = CPU_PKG_486SLC_IBM, + .manufacturer = "IBM", + .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} + } }, { - .package = CPU_PKG_486BL, - .manufacturer = "IBM", - .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} - } + .package = CPU_PKG_486SLC_IBM, + .manufacturer = "IBM", + .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} + } }, { - .package = CPU_PKG_486BL, - .manufacturer = "IBM", - .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} - } + .package = CPU_PKG_486SLC_IBM, + .manufacturer = "IBM", + .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} + } }, { - .package = CPU_PKG_386DX, - .manufacturer = "Cyrix", - .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} - } + .package = CPU_PKG_486BL, + .manufacturer = "IBM", + .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} + } }, { - .package = CPU_PKG_386DX, - .manufacturer = "Cyrix", - .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} - } + .package = CPU_PKG_486BL, + .manufacturer = "IBM", + .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} + } }, { - .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_386DX, + .manufacturer = "Cyrix", + .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} + } }, { - .package = CPU_PKG_SOCKET1, - .manufacturer = "Intel", - .name = "i486SX (SL-Enhanced)", - .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_386DX, + .manufacturer = "Cyrix", + .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} + } }, { - .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 = "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 = "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 = "i486SX (SL-Enhanced)", + .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 = "i486DX (SL-Enhanced)", - .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 = "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 = "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 = "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 = "i486DX2 (SL-Enhanced)", - .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, + .manufacturer = "Intel", + .name = "i486DX (SL-Enhanced)", + .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_SOCKET3_PC330, - .manufacturer = "Intel", - .name = "i486DX2", - .internal_name = "i486dx2_pc330", - .cpus = (const CPU[]) { - {"50", CPU_i486DX_SLENH, fpus_internal, 50000000, 2, 5000, 0x470, 0x470, 0, CPU_SUPPORTS_DYNAREC, 8, 8,6,6, 6}, - {"66", CPU_i486DX_SLENH, fpus_internal, 66666666, 2, 5000, 0x470, 0x470, 0, CPU_SUPPORTS_DYNAREC, 12,12,6,6, 8}, - {"", 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 | 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_SOCKET1, + .manufacturer = "Intel", + .name = "i486DX2 (SL-Enhanced)", + .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_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_SOCKET3_PC330, + .manufacturer = "Intel", + .name = "i486DX2", + .internal_name = "i486dx2_pc330", + .cpus = (const CPU[]) { + {"50", CPU_i486DX_SLENH, fpus_internal, 50000000, 2, 5000, 0x470, 0x470, 0, CPU_SUPPORTS_DYNAREC, 8, 8,6,6, 6}, + {"66", CPU_i486DX_SLENH, fpus_internal, 66666666, 2, 5000, 0x470, 0x470, 0, CPU_SUPPORTS_DYNAREC, 12,12,6,6, 8}, + {"", 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 | 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_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_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 = "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 = "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 = "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 = "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 = "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 = "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 = "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_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_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_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_SOCKET3, - .manufacturer = "AMD", - .name = "Am5x86", - .internal_name = "am5x86", - .cpus = (const CPU[]) { - {"P75", CPU_ENH_Am486DX, fpus_internal, 133333333, 4.0, 5000, 0x4e0, 0x4e0, 0, CPU_SUPPORTS_DYNAREC, 24,24,12,12, 16}, - {"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*/ - {"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 = "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_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_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_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_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_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 = "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 = "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 = "AMD", + .name = "Am5x86", + .internal_name = "am5x86", + .cpus = (const CPU[]) { + {"P75", CPU_ENH_Am486DX, fpus_internal, 133333333, 4.0, 5000, 0x4e0, 0x4e0, 0, CPU_SUPPORTS_DYNAREC, 24,24,12,12, 16}, + {"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*/ + {"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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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 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 = "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 = "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 = "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 = "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 = "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 = "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} - } + .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} + } }, #if defined(DEV_BRANCH) && defined(USE_AMD_K5) { - .package = CPU_PKG_SOCKET5_7, - .manufacturer = "AMD", - .name = "K5 (5k86)", - .internal_name = "k5_5k86", - .cpus = (const CPU[]) { - {"75 (P75)", CPU_K5, fpus_internal, 75000000, 1.5, 3520, 0x500, 0x500, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 7, 7,4,4, 9}, - {"90 (P90)", CPU_K5, fpus_internal, 90000000, 1.5, 3520, 0x500, 0x500, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9,4,4, 21/2}, - {"100 (P100)", CPU_K5, fpus_internal, 100000000, 1.5, 3520, 0x500, 0x500, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9,4,4, 12}, - {"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.5 (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 (5k86)", + .internal_name = "k5_5k86", + .cpus = (const CPU[]) { + {"75 (P75)", CPU_K5, fpus_internal, 75000000, 1.5, 3520, 0x500, 0x500, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 7, 7,4,4, 9}, + {"90 (P90)", CPU_K5, fpus_internal, 90000000, 1.5, 3520, 0x500, 0x500, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9,4,4, 21/2}, + {"100 (P100)", CPU_K5, fpus_internal, 100000000, 1.5, 3520, 0x500, 0x500, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9,4,4, 12}, + {"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.5 (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 (SSA/5)", - .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 (SSA/5)", + .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} + } }, #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}, + {"", 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}, + {"", 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_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}, - {"", 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_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_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} + } }, #if defined(DEV_BRANCH) && defined(USE_CYRIX_6X86) { - .package = CPU_PKG_SOCKET5_7, - .manufacturer = "Cyrix", - .name = "Cx6x86", - .internal_name = "cx6x86", - .cpus = (const CPU[]) { - {"P90", CPU_Cx6x86, fpus_internal, 80000000, 2.0, 3520, 0x520, 0x520, 0x1731, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 8, 8, 6, 6, 10}, - {"PR120+", CPU_Cx6x86, fpus_internal, 100000000, 2.0, 3520, 0x520, 0x520, 0x1731, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 10,10, 6, 6, 12}, - {"PR133+", CPU_Cx6x86, fpus_internal, 110000000, 2.0, 3520, 0x520, 0x520, 0x1731, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 10,10, 6, 6, 14}, - {"PR150+", CPU_Cx6x86, fpus_internal, 120000000, 2.0, 3520, 0x520, 0x520, 0x1731, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 14}, - {"PR166+", CPU_Cx6x86, fpus_internal, 133333333, 2.0, 3520, 0x520, 0x520, 0x1731, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 16}, - {"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 = "Cx6x86", + .internal_name = "cx6x86", + .cpus = (const CPU[]) { + {"P90", CPU_Cx6x86, fpus_internal, 80000000, 2.0, 3520, 0x520, 0x520, 0x1731, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 8, 8, 6, 6, 10}, + {"PR120+", CPU_Cx6x86, fpus_internal, 100000000, 2.0, 3520, 0x520, 0x520, 0x1731, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 10,10, 6, 6, 12}, + {"PR133+", CPU_Cx6x86, fpus_internal, 110000000, 2.0, 3520, 0x520, 0x520, 0x1731, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 10,10, 6, 6, 14}, + {"PR150+", CPU_Cx6x86, fpus_internal, 120000000, 2.0, 3520, 0x520, 0x520, 0x1731, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 14}, + {"PR166+", CPU_Cx6x86, fpus_internal, 133333333, 2.0, 3520, 0x520, 0x520, 0x1731, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 16}, + {"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[]) { - {"PR133+", CPU_Cx6x86L, fpus_internal, 110000000, 2.0, 2800, 0x540, 0x540, 0x2231, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 10,10, 6, 6, 14}, - {"PR150+", CPU_Cx6x86L, fpus_internal, 120000000, 2.0, 2800, 0x540, 0x540, 0x2231, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 14}, - {"PR166+", CPU_Cx6x86L, fpus_internal, 133333333, 2.0, 2800, 0x540, 0x540, 0x2231, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 16}, - {"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 = "Cx6x86L", + .internal_name = "cx6x86l", + .cpus = (const CPU[]) { + {"PR133+", CPU_Cx6x86L, fpus_internal, 110000000, 2.0, 2800, 0x540, 0x540, 0x2231, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 10,10, 6, 6, 14}, + {"PR150+", CPU_Cx6x86L, fpus_internal, 120000000, 2.0, 2800, 0x540, 0x540, 0x2231, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 14}, + {"PR166+", CPU_Cx6x86L, fpus_internal, 133333333, 2.0, 2800, 0x540, 0x540, 0x2231, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 16}, + {"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[]) { - {"PR166", CPU_Cx6x86MX, fpus_internal, 133333333, 2.0, 2900, 0x600, 0x600, 0x0451, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 16}, - {"PR200", CPU_Cx6x86MX, fpus_internal, 166666666, 2.5, 2900, 0x600, 0x600, 0x0452, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 20}, - {"PR233", CPU_Cx6x86MX, fpus_internal, 187500000, 2.5, 2900, 0x600, 0x600, 0x0452, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 45/2}, - {"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 = "Cx6x86MX", + .internal_name = "cx6x86mx", + .cpus = (const CPU[]) { + {"PR166", CPU_Cx6x86MX, fpus_internal, 133333333, 2.0, 2900, 0x600, 0x600, 0x0451, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 16}, + {"PR200", CPU_Cx6x86MX, fpus_internal, 166666666, 2.5, 2900, 0x600, 0x600, 0x0452, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 20}, + {"PR233", CPU_Cx6x86MX, fpus_internal, 187500000, 2.5, 2900, 0x600, 0x600, 0x0452, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 45/2}, + {"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[]) { - {"PR300", CPU_Cx6x86MX, fpus_internal, 233333333, 3.5, 2900, 0x601, 0x601, 0x0852, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 21,21,11,11, 28}, - {"PR333", CPU_Cx6x86MX, fpus_internal, 250000000, 3.0, 2900, 0x601, 0x601, 0x0853, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 23,23, 9, 9, 30}, - {"PR366", CPU_Cx6x86MX, fpus_internal, 250000000, 2.5, 2900, 0x601, 0x601, 0x0853, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 23,23, 7, 7, 30}, - {"PR400", CPU_Cx6x86MX, fpus_internal, 285000000, 3.0, 2900, 0x601, 0x601, 0x0853, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 27,27, 9, 9, 34}, - {"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 = "MII", + .internal_name = "mii", + .cpus = (const CPU[]) { + {"PR300", CPU_Cx6x86MX, fpus_internal, 233333333, 3.5, 2900, 0x601, 0x601, 0x0852, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 21,21,11,11, 28}, + {"PR333", CPU_Cx6x86MX, fpus_internal, 250000000, 3.0, 2900, 0x601, 0x601, 0x0853, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 23,23, 9, 9, 30}, + {"PR366", CPU_Cx6x86MX, fpus_internal, 250000000, 2.5, 2900, 0x601, 0x601, 0x0853, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 23,23, 7, 7, 30}, + {"PR400", CPU_Cx6x86MX, fpus_internal, 285000000, 3.0, 2900, 0x601, 0x601, 0x0853, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 27,27, 9, 9, 34}, + {"PR433", CPU_Cx6x86MX, fpus_internal, 300000000, 3.0, 2900, 0x601, 0x601, 0x0853, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 27,27, 9, 9, 36}, + {"", 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}, + {"", 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_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 (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 (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 = "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_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_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 = "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 = 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 = 0, } // clang-format on }; diff --git a/src/device/keyboard_at.c b/src/device/keyboard_at.c index 542be0a24..3f5e8e4be 100644 --- a/src/device/keyboard_at.c +++ b/src/device/keyboard_at.c @@ -1291,8 +1291,8 @@ write64_generic(void *priv, uint8_t val) } else { if (((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) && ((dev->flags & KBC_VEN_MASK) != KBC_VEN_INTEL_AMI)) #if 0 - add_to_kbc_queue_front(dev, (dev->input_port | fixed_bits) & - (((dev->flags & KBC_VEN_MASK) == KBC_VEN_ACER) ? 0xeb : 0xef), 0, 0x00); + add_to_kbc_queue_front(dev, (dev->input_port | fixed_bits) & + (((dev->flags & KBC_VEN_MASK) == KBC_VEN_ACER) ? 0xeb : 0xef), 0, 0x00); #else add_to_kbc_queue_front(dev, ((dev->input_port | fixed_bits) & 0xf0) | (((dev->flags & KBC_VEN_MASK) == KBC_VEN_ACER) ? 0x08 : 0x0c), 0, 0x00); #endif diff --git a/src/device/keyboard_xt.c b/src/device/keyboard_xt.c index f6d02a4d4..7c484af0d 100644 --- a/src/device/keyboard_xt.c +++ b/src/device/keyboard_xt.c @@ -126,219 +126,219 @@ const scancode scancode_xt[512] = { { {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} }, /*054*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*058*/ + { {0}, {0} }, { {0}, {0} }, /*058*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*05c*/ + { {0}, {0} }, { {0}, {0} }, /*05c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*060*/ + { {0}, {0} }, { {0}, {0} }, /*060*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*064*/ + { {0}, {0} }, { {0}, {0} }, /*064*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*068*/ + { {0}, {0} }, { {0}, {0} }, /*068*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*06c*/ + { {0}, {0} }, { {0}, {0} }, /*06c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*070*/ + { {0}, {0} }, { {0}, {0} }, /*070*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*074*/ + { {0}, {0} }, { {0}, {0} }, /*074*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*078*/ + { {0}, {0} }, { {0}, {0} }, /*078*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*07c*/ + { {0}, {0} }, { {0}, {0} }, /*07c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*080*/ + { {0}, {0} }, { {0}, {0} }, /*080*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*084*/ + { {0}, {0} }, { {0}, {0} }, /*084*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*088*/ + { {0}, {0} }, { {0}, {0} }, /*088*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*08c*/ + { {0}, {0} }, { {0}, {0} }, /*08c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*090*/ + { {0}, {0} }, { {0}, {0} }, /*090*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*094*/ + { {0}, {0} }, { {0}, {0} }, /*094*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*098*/ + { {0}, {0} }, { {0}, {0} }, /*098*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*09c*/ + { {0}, {0} }, { {0}, {0} }, /*09c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0a0*/ + { {0}, {0} }, { {0}, {0} }, /*0a0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0a4*/ + { {0}, {0} }, { {0}, {0} }, /*0a4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0a8*/ + { {0}, {0} }, { {0}, {0} }, /*0a8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0ac*/ + { {0}, {0} }, { {0}, {0} }, /*0ac*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0b0*/ + { {0}, {0} }, { {0}, {0} }, /*0b0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0b4*/ + { {0}, {0} }, { {0}, {0} }, /*0b4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0b8*/ + { {0}, {0} }, { {0}, {0} }, /*0b8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0bc*/ + { {0}, {0} }, { {0}, {0} }, /*0bc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0c0*/ + { {0}, {0} }, { {0}, {0} }, /*0c0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0c4*/ + { {0}, {0} }, { {0}, {0} }, /*0c4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0c8*/ + { {0}, {0} }, { {0}, {0} }, /*0c8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0cc*/ + { {0}, {0} }, { {0}, {0} }, /*0cc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0d0*/ + { {0}, {0} }, { {0}, {0} }, /*0d0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0d4*/ + { {0}, {0} }, { {0}, {0} }, /*0d4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0d8*/ + { {0}, {0} }, { {0}, {0} }, /*0d8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0dc*/ + { {0}, {0} }, { {0}, {0} }, /*0dc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0e0*/ + { {0}, {0} }, { {0}, {0} }, /*0e0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0e4*/ + { {0}, {0} }, { {0}, {0} }, /*0e4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0e8*/ + { {0}, {0} }, { {0}, {0} }, /*0e8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0ec*/ + { {0}, {0} }, { {0}, {0} }, /*0ec*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0f0*/ + { {0}, {0} }, { {0}, {0} }, /*0f0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0f4*/ + { {0}, {0} }, { {0}, {0} }, /*0f4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0f8*/ + { {0}, {0} }, { {0}, {0} }, /*0f8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0fc*/ + { {0}, {0} }, { {0}, {0} }, /*0fc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*100*/ + { {0}, {0} }, { {0}, {0} }, /*100*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*104*/ + { {0}, {0} }, { {0}, {0} }, /*104*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*108*/ + { {0}, {0} }, { {0}, {0} }, /*108*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*10c*/ + { {0}, {0} }, { {0}, {0} }, /*10c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*110*/ + { {0}, {0} }, { {0}, {0} }, /*110*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*114*/ + { {0}, {0} }, { {0}, {0} }, /*114*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*118*/ + { {0}, {0} }, { {0}, {0} }, /*118*/ { {0x1c, 0}, {0x9c, 0} }, { {0x1d, 0}, {0x9d, 0} }, - { {0}, {0} }, { {0}, {0} }, /*11c*/ + { {0}, {0} }, { {0}, {0} }, /*11c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*120*/ + { {0}, {0} }, { {0}, {0} }, /*120*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*124*/ + { {0}, {0} }, { {0}, {0} }, /*124*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*128*/ + { {0}, {0} }, { {0}, {0} }, /*128*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*12c*/ + { {0}, {0} }, { {0}, {0} }, /*12c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*130*/ + { {0}, {0} }, { {0}, {0} }, /*130*/ { {0}, {0} }, { {0x35, 0}, {0xb5, 0} }, - { {0}, {0} }, { {0x37, 0}, {0xb7, 0} }, /*134*/ + { {0}, {0} }, { {0x37, 0}, {0xb7, 0} }, /*134*/ { {0x38, 0}, {0xb8, 0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*138*/ + { {0}, {0} }, { {0}, {0} }, /*138*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*13c*/ + { {0}, {0} }, { {0}, {0} }, /*13c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*140*/ + { {0}, {0} }, { {0}, {0} }, /*140*/ { {0}, {0} }, { {0}, {0} }, - { {0x46, 0}, {0xc6, 0} }, { {0x47, 0}, {0xc7, 0} }, /*144*/ + { {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} }, { {0x4b, 0}, {0xcb, 0} }, /*148*/ { {0}, {0} }, { {0x4d, 0}, {0xcd, 0} }, - { {0}, {0} }, { {0x4f, 0}, {0xcf, 0} }, /*14c*/ + { {0}, {0} }, { {0x4f, 0}, {0xcf, 0} }, /*14c*/ { {0x50, 0}, {0xd0, 0} }, { {0x51, 0}, {0xd1, 0} }, - { {0x52, 0}, {0xd2, 0} }, { {0x53, 0}, {0xd3, 0} }, /*150*/ + { {0x52, 0}, {0xd2, 0} }, { {0x53, 0}, {0xd3, 0} }, /*150*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*154*/ + { {0}, {0} }, { {0}, {0} }, /*154*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*158*/ + { {0}, {0} }, { {0}, {0} }, /*158*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*15c*/ + { {0}, {0} }, { {0}, {0} }, /*15c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*160*/ + { {0}, {0} }, { {0}, {0} }, /*160*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*164*/ + { {0}, {0} }, { {0}, {0} }, /*164*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*168*/ + { {0}, {0} }, { {0}, {0} }, /*168*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*16c*/ + { {0}, {0} }, { {0}, {0} }, /*16c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*170*/ + { {0}, {0} }, { {0}, {0} }, /*170*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*174*/ + { {0}, {0} }, { {0}, {0} }, /*174*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*148*/ + { {0}, {0} }, { {0}, {0} }, /*148*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*17c*/ + { {0}, {0} }, { {0}, {0} }, /*17c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*180*/ + { {0}, {0} }, { {0}, {0} }, /*180*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*184*/ + { {0}, {0} }, { {0}, {0} }, /*184*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*88*/ + { {0}, {0} }, { {0}, {0} }, /*88*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*18c*/ + { {0}, {0} }, { {0}, {0} }, /*18c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*190*/ + { {0}, {0} }, { {0}, {0} }, /*190*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*194*/ + { {0}, {0} }, { {0}, {0} }, /*194*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*198*/ + { {0}, {0} }, { {0}, {0} }, /*198*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*19c*/ + { {0}, {0} }, { {0}, {0} }, /*19c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1a0*/ + { {0}, {0} }, { {0}, {0} }, /*1a0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1a4*/ + { {0}, {0} }, { {0}, {0} }, /*1a4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1a8*/ + { {0}, {0} }, { {0}, {0} }, /*1a8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1ac*/ + { {0}, {0} }, { {0}, {0} }, /*1ac*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1b0*/ + { {0}, {0} }, { {0}, {0} }, /*1b0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1b4*/ + { {0}, {0} }, { {0}, {0} }, /*1b4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1b8*/ + { {0}, {0} }, { {0}, {0} }, /*1b8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1bc*/ + { {0}, {0} }, { {0}, {0} }, /*1bc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1c0*/ + { {0}, {0} }, { {0}, {0} }, /*1c0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1c4*/ + { {0}, {0} }, { {0}, {0} }, /*1c4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1c8*/ + { {0}, {0} }, { {0}, {0} }, /*1c8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1cc*/ + { {0}, {0} }, { {0}, {0} }, /*1cc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1d0*/ + { {0}, {0} }, { {0}, {0} }, /*1d0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1d4*/ + { {0}, {0} }, { {0}, {0} }, /*1d4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1d8*/ + { {0}, {0} }, { {0}, {0} }, /*1d8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1dc*/ + { {0}, {0} }, { {0}, {0} }, /*1dc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1e0*/ + { {0}, {0} }, { {0}, {0} }, /*1e0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1e4*/ + { {0}, {0} }, { {0}, {0} }, /*1e4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1e8*/ + { {0}, {0} }, { {0}, {0} }, /*1e8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1ec*/ + { {0}, {0} }, { {0}, {0} }, /*1ec*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1f0*/ + { {0}, {0} }, { {0}, {0} }, /*1f0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1f4*/ + { {0}, {0} }, { {0}, {0} }, /*1f4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1f8*/ + { {0}, {0} }, { {0}, {0} }, /*1f8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} } /*1fc*/ + { {0}, {0} }, { {0}, {0} } /*1fc*/ // clang-format on }; diff --git a/src/device/mouse_bus.c b/src/device/mouse_bus.c index 802ae6d45..73104cc4a 100644 --- a/src/device/mouse_bus.c +++ b/src/device/mouse_bus.c @@ -317,14 +317,14 @@ lt_write(uint16_t port, uint8_t val, void *priv) * This indicates the mode of operation of D7: * 1 = Mode set, 0 = Bit set/reset * D6,D5 = Mode selection (port A) - * 00 = Mode 0 = Basic I/O - * 01 = Mode 1 = Strobed I/O - * 10 = Mode 2 = Bi-dir bus + * 00 = Mode 0 = Basic I/O + * 01 = Mode 1 = Strobed I/O + * 10 = Mode 2 = Bi-dir bus * D4 = Port A direction (1 = input) * D3 = Port C (upper 4 bits) direction. (1 = input) * D2 = Mode selection (port B & C) - * 0 = Mode 0 = Basic I/O - * 1 = Mode 1 = Strobed I/O + * 0 = Mode 0 = Basic I/O + * 1 = Mode 1 = Strobed I/O * D1 = Port B direction (1 = input) * D0 = Port C (lower 4 bits) direction. (1 = input) * @@ -333,8 +333,8 @@ lt_write(uint16_t port, uint8_t val, void *priv) * being an output port and lower 4 bits an input port, and * enable the sucker. Courtesy Intel 8255 databook. Lars * - * 1001 1011 9B 1111 Default state - * 1001 0001 91 1001 Driver-initialized state + * 1001 1011 9B 1111 Default state + * 1001 0001 91 1001 Driver-initialized state * The only difference is - port C upper and port B go from * input to output. */ diff --git a/src/device/mouse_ps2.c b/src/device/mouse_ps2.c index e7670b2fc..42e2211b9 100644 --- a/src/device/mouse_ps2.c +++ b/src/device/mouse_ps2.c @@ -270,7 +270,7 @@ ps2_poll(int x, int y, int z, int b, void *priv) #if 0 if (!(dev->flags & FLAG_ENABLED)) - return(0xff); + return(0xff); #endif if (!mouse_scan) diff --git a/src/disk/hdc_ide.c b/src/disk/hdc_ide.c index 2f544cfb9..062f0fde5 100644 --- a/src/disk/hdc_ide.c +++ b/src/disk/hdc_ide.c @@ -537,7 +537,7 @@ ide_hd_identify(ide_t *ide) /* Bit 0 = The fields reported in words 54-58 are valid; Bit 1 = The fields reported in words 64-70 are valid; - Bit 2 = The fields reported in word 88 are valid. */ + Bit 2 = The fields reported in word 88 are valid. */ ide->buffer[53] = 1; if (ide->cfg_spt != 0) { @@ -1946,12 +1946,12 @@ ide_readb(uint16_t addr, void *priv) Direction: To device if set; From device if clear. - IO DRQ CoD - 0 1 1 Ready to accept command packet - 1 1 1 Message - ready to send message to host - 1 1 0 Data to host - 0 1 0 Data from host - 1 0 1 Status. */ + IO DRQ CoD + 0 1 1 Ready to accept command packet + 1 1 1 Message - ready to send message to host + 1 1 0 Data to host + 0 1 0 Data from host + 1 0 1 Status. */ case 0x2: /* Sector count */ if (ide->type == IDE_ATAPI) temp = ide->sc->phase; diff --git a/src/disk/hdc_st506_xt.c b/src/disk/hdc_st506_xt.c index 88bf8c2c9..c7b62f127 100644 --- a/src/disk/hdc_st506_xt.c +++ b/src/disk/hdc_st506_xt.c @@ -180,28 +180,28 @@ #define ERR_CRC_FAIL 0x32 /* CRC circuit failed test */ /* Controller commands. */ -#define CMD_TEST_DRIVE_READY 0x00 -#define CMD_RECALIBRATE 0x01 -/* reserved 0x02 */ -#define CMD_STATUS 0x03 -#define CMD_FORMAT_DRIVE 0x04 -#define CMD_VERIFY 0x05 -#define CMD_FORMAT_TRACK 0x06 -#define CMD_FORMAT_BAD_TRACK 0x07 -#define CMD_READ 0x08 -#define CMD_REASSIGN 0x09 -#define CMD_WRITE 0x0a -#define CMD_SEEK 0x0b -#define CMD_SPECIFY 0x0c -#define CMD_READ_ECC_BURST_LEN 0x0d -#define CMD_READ_BUFFER 0x0e -#define CMD_WRITE_BUFFER 0x0f -#define CMD_ALT_TRACK 0x11 -#define CMD_INQUIRY_ST11 0x12 /* ST-11 BIOS */ -#define CMD_V86P_POWEROFF 0x1a /* Victor V86P */ -#define CMD_RAM_DIAGNOSTIC 0xe0 -/* reserved 0xe1 */ -/* reserved 0xe2 */ +#define CMD_TEST_DRIVE_READY 0x00 +#define CMD_RECALIBRATE 0x01 +/* reserved 0x02 */ +#define CMD_STATUS 0x03 +#define CMD_FORMAT_DRIVE 0x04 +#define CMD_VERIFY 0x05 +#define CMD_FORMAT_TRACK 0x06 +#define CMD_FORMAT_BAD_TRACK 0x07 +#define CMD_READ 0x08 +#define CMD_REASSIGN 0x09 +#define CMD_WRITE 0x0a +#define CMD_SEEK 0x0b +#define CMD_SPECIFY 0x0c +#define CMD_READ_ECC_BURST_LEN 0x0d +#define CMD_READ_BUFFER 0x0e +#define CMD_WRITE_BUFFER 0x0f +#define CMD_ALT_TRACK 0x11 +#define CMD_INQUIRY_ST11 0x12 /* ST-11 BIOS */ +#define CMD_V86P_POWEROFF 0x1a /* Victor V86P */ +#define CMD_RAM_DIAGNOSTIC 0xe0 +/* reserved 0xe1 */ +/* reserved 0xe2 */ #define CMD_DRIVE_DIAGNOSTIC 0xe3 #define CMD_CTRLR_DIAGNOSTIC 0xe4 #define CMD_READ_LONG 0xe5 @@ -295,19 +295,19 @@ typedef struct { hd_type_t hd_types[4] = { // clang-format off - { 306, 4, MFM_SECTORS}, /* type 0 */ - { 612, 4, MFM_SECTORS}, /* type 16 */ - { 615, 4, MFM_SECTORS}, /* type 2 */ - { 306, 8, MFM_SECTORS} /* type 13 */ + { 306, 4, MFM_SECTORS}, /* type 0 */ + { 612, 4, MFM_SECTORS}, /* type 16 */ + { 615, 4, MFM_SECTORS}, /* type 2 */ + { 306, 8, MFM_SECTORS} /* type 13 */ // clang-format on }; hd_type_t hd_types_olivetti[16] = { // clang-format off { 697, 5, MFM_SECTORS}, - { 612, 4, MFM_SECTORS}, /* type 16 */ - { 612, 4, MFM_SECTORS}, /* type 16 */ - { 306, 4, MFM_SECTORS}, /* type 0 */ + { 612, 4, MFM_SECTORS}, /* type 16 */ + { 612, 4, MFM_SECTORS}, /* type 16 */ + { 306, 4, MFM_SECTORS}, /* type 0 */ { 612, 8, MFM_SECTORS}, { 820, 6, MFM_SECTORS}, { 820, 6, MFM_SECTORS}, @@ -317,8 +317,8 @@ hd_type_t hd_types_olivetti[16] = { {1024, 8, MFM_SECTORS}, {1024, 9, MFM_SECTORS}, { 872, 5, MFM_SECTORS}, - { 612, 4, MFM_SECTORS}, /* type 16 */ - { 612, 4, MFM_SECTORS}, /* type 16 */ + { 612, 4, MFM_SECTORS}, /* type 16 */ + { 612, 4, MFM_SECTORS}, /* type 16 */ { 306, 4, MFM_SECTORS} /* "not present" with the second hard disk */ // clang-format on }; @@ -375,10 +375,10 @@ get_sector(hdc_t *dev, drive_t *drive, off64_t *addr) #if 0 if (drive->cylinder != dev->cylinder) { # ifdef ENABLE_ST506_XT_LOG - st506_xt_log("ST506: get_sector: wrong cylinder\n"); + st506_xt_log("ST506: get_sector: wrong cylinder\n"); # endif - dev->error = ERR_ILLEGAL_ADDR; - return(0); + dev->error = ERR_ILLEGAL_ADDR; + return(0); } #endif @@ -653,7 +653,7 @@ st506_callback(void *priv) } case CMD_READ: #if 0 - case CMD_READ_LONG: + case CMD_READ_LONG: #endif switch (dev->state) { case STATE_START_COMMAND: @@ -749,7 +749,7 @@ st506_callback(void *priv) } case CMD_WRITE: #if 0 - case CMD_WRITE_LONG: + case CMD_WRITE_LONG: #endif switch (dev->state) { case STATE_START_COMMAND: diff --git a/src/disk/zip.c b/src/disk/zip.c index 959a5fbbe..c79f5d3d6 100644 --- a/src/disk/zip.c +++ b/src/disk/zip.c @@ -199,7 +199,8 @@ static const mode_sense_pages_t zip_250_mode_sense_pages_default = { 0, 0 }, { 0, 0 }, { 0, 0 }, - { 0, 0 }, { 0, 0 }, + { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, diff --git a/src/floppy/fdc.c b/src/floppy/fdc.c index 2abc4a8f5..1f81f025e 100644 --- a/src/floppy/fdc.c +++ b/src/floppy/fdc.c @@ -637,7 +637,7 @@ fdc_io_command_phase1(fdc_t *fdc, int out) pclog_toggle_suppr(); pclog("%02X ", fdc->processed_cmd); for (i = 0; i < fdc->pnum; i++) - pclog("%02X ", fdc->params[i]); + pclog("%02X ", fdc->params[i]); pclog("\n"); pclog_toggle_suppr(); #endif @@ -1329,9 +1329,9 @@ fdc_read(uint16_t addr, void *priv) * fdc_t on one of the motherboard's support chips. * * Confirmed: 00=1.44M 3.5 - * 10=2.88M 3.5 - * 20=1.2M 5.25 - * 30=1.2M 5.25 + * 10=2.88M 3.5 + * 20=1.2M 5.25 + * 30=1.2M 5.25 * * as reported by Configur.exe. */ diff --git a/src/floppy/fdd.c b/src/floppy/fdd.c index a6ccb6da5..06b949ffb 100644 --- a/src/floppy/fdd.c +++ b/src/floppy/fdd.c @@ -40,17 +40,17 @@ #include <86box/fdc.h> /* Flags: - Bit 0: 300 rpm supported; - Bit 1: 360 rpm supported; - Bit 2: size (0 = 3.5", 1 = 5.25"); - Bit 3: sides (0 = 1, 1 = 2); - Bit 4: double density supported; - Bit 5: high density supported; - Bit 6: extended density supported; - Bit 7: double step for 40-track media; - Bit 8: invert DENSEL polarity; - Bit 9: ignore DENSEL; - Bit 10: drive is a PS/2 drive; + Bit 0: 300 rpm supported; + Bit 1: 360 rpm supported; + Bit 2: size (0 = 3.5", 1 = 5.25"); + Bit 3: sides (0 = 1, 1 = 2); + Bit 4: double density supported; + Bit 5: high density supported; + Bit 6: extended density supported; + Bit 7: double step for 40-track media; + Bit 8: invert DENSEL polarity; + Bit 9: ignore DENSEL; + Bit 10: drive is a PS/2 drive; */ #define FLAG_RPM_300 1 #define FLAG_RPM_360 2 @@ -146,49 +146,49 @@ static const struct } drive_types[] = { { /*None*/ - 0, 0, "None", "none" + 0, 0, "None", "none" }, { /*5.25" 1DD*/ - 43, FLAG_RPM_300 | FLAG_525 | FLAG_HOLE0, "5.25\" 180k", "525_1dd" + 43, FLAG_RPM_300 | FLAG_525 | FLAG_HOLE0, "5.25\" 180k", "525_1dd" }, { /*5.25" DD*/ - 43, FLAG_RPM_300 | FLAG_525 | FLAG_DS | FLAG_HOLE0, "5.25\" 360k", "525_2dd" + 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" + 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" + 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, "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" + 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" + 86, FLAG_RPM_300 | FLAG_HOLE0 | FLAG_DOUBLE_STEP, "3.5\" 360k", "35_1dd" }, { /*3.5" DD*/ - 86, FLAG_RPM_300 | FLAG_DS | FLAG_HOLE0 | FLAG_DOUBLE_STEP, "3.5\" 720k", "35_2dd" + 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" + 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*/ - 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, "3.5\" 1.44M", "35_2hd" }, { /*3.5" HD PC-98*/ - 86, FLAG_RPM_300 | FLAG_RPM_360 | FLAG_DS | FLAG_HOLE0 | FLAG_HOLE1 | FLAG_DOUBLE_STEP | FLAG_INVERT_DENSEL, "3.5\" 1.25M PC-98", "35_2hd_nec" + 86, FLAG_RPM_300 | FLAG_RPM_360 | FLAG_DS | FLAG_HOLE0 | FLAG_HOLE1 | FLAG_DOUBLE_STEP | FLAG_INVERT_DENSEL, "3.5\" 1.25M PC-98", "35_2hd_nec" }, { /*3.5" HD 3-Mode*/ - 86, FLAG_RPM_300 | FLAG_RPM_360 | FLAG_DS | FLAG_HOLE0 | FLAG_HOLE1 | FLAG_DOUBLE_STEP, "3.5\" 1.44M 300/360 RPM", "35_2hd_3mode" + 86, FLAG_RPM_300 | FLAG_RPM_360 | FLAG_DS | FLAG_HOLE0 | FLAG_HOLE1 | FLAG_DOUBLE_STEP, "3.5\" 1.44M 300/360 RPM", "35_2hd_3mode" }, { /*3.5" ED*/ - 86, FLAG_RPM_300 | FLAG_DS | FLAG_HOLE0 | FLAG_HOLE1 | FLAG_HOLE2 | FLAG_DOUBLE_STEP, "3.5\" 2.88M", "35_2ed" + 86, FLAG_RPM_300 | FLAG_DS | FLAG_HOLE0 | FLAG_HOLE1 | FLAG_HOLE2 | FLAG_DOUBLE_STEP, "3.5\" 2.88M", "35_2ed" }, { /*End of list*/ - -1, -1, "", "" + -1, -1, "", "" } }; diff --git a/src/floppy/fdd_86f.c b/src/floppy/fdd_86f.c index 7509dd3a5..0267cfe81 100644 --- a/src/floppy/fdd_86f.c +++ b/src/floppy/fdd_86f.c @@ -155,23 +155,23 @@ typedef struct { } sector_t; /* Disk flags: - * Bit 0 Has surface data (1 = yes, 0 = no) - * Bits 2, 1 Hole (3 = ED + 2000 kbps, 2 = ED, 1 = HD, 0 = DD) - * Bit 3 Sides (1 = 2 sides, 0 = 1 side) - * Bit 4 Write protect (1 = yes, 0 = no) - * Bits 6, 5 RPM slowdown (3 = 2%, 2 = 1.5%, 1 = 1%, 0 = 0%) - * Bit 7 Bitcell mode (1 = Extra bitcells count specified after - * disk flags, 0 = No extra bitcells) - * The maximum number of extra bitcells is 1024 (which - * after decoding translates to 64 bytes) - * Bit 8 Disk type (1 = Zoned, 0 = Fixed RPM) - * Bits 10, 9 Zone type (3 = Commodore 64 zoned, 2 = Apple zoned, - * 1 = Pre-Apple zoned #2, 0 = Pre-Apple zoned #1) - * Bit 11 Data and surface bits are stored in reverse byte endianness - * Bit 12 If bits 6, 5 are not 0, they specify % of speedup instead - * of slowdown; - * If bits 6, 5 are 0, and bit 7 is 1, the extra bitcell count - * specifies the entire bitcell count + * Bit 0 Has surface data (1 = yes, 0 = no) + * Bits 2, 1 Hole (3 = ED + 2000 kbps, 2 = ED, 1 = HD, 0 = DD) + * Bit 3 Sides (1 = 2 sides, 0 = 1 side) + * Bit 4 Write protect (1 = yes, 0 = no) + * Bits 6, 5 RPM slowdown (3 = 2%, 2 = 1.5%, 1 = 1%, 0 = 0%) + * Bit 7 Bitcell mode (1 = Extra bitcells count specified after + * disk flags, 0 = No extra bitcells) + * The maximum number of extra bitcells is 1024 (which + * after decoding translates to 64 bytes) + * Bit 8 Disk type (1 = Zoned, 0 = Fixed RPM) + * Bits 10, 9 Zone type (3 = Commodore 64 zoned, 2 = Apple zoned, + * 1 = Pre-Apple zoned #2, 0 = Pre-Apple zoned #1) + * Bit 11 Data and surface bits are stored in reverse byte endianness + * Bit 12 If bits 6, 5 are not 0, they specify % of speedup instead + * of slowdown; + * If bits 6, 5 are 0, and bit 7 is 1, the extra bitcell count + * specifies the entire bitcell count */ typedef struct { FILE *f; @@ -2732,14 +2732,14 @@ d86f_prepare_sector(int drive, int side, int prev_pos, uint8_t *id_buf, uint8_t * ((track << 1) + 1); * * - Any bits that differ are treated as thus: - * - Both are regular but contents differ -> Output is fuzzy; - * - One is regular and one is fuzzy -> Output is fuzzy; - * - Both are fuzzy -> Output is fuzzy; - * - Both are physical holes -> Output is a physical hole; - * - One is regular and one is a physical hole -> Output is fuzzy, - * the hole half is handled appropriately on writeback; - * - One is fuzzy and one is a physical hole -> Output is fuzzy, - * the hole half is handled appropriately on writeback; + * - Both are regular but contents differ -> Output is fuzzy; + * - One is regular and one is fuzzy -> Output is fuzzy; + * - Both are fuzzy -> Output is fuzzy; + * - Both are physical holes -> Output is a physical hole; + * - One is regular and one is a physical hole -> Output is fuzzy, + * the hole half is handled appropriately on writeback; + * - One is fuzzy and one is a physical hole -> Output is fuzzy, + * the hole half is handled appropriately on writeback; * - On write back, apart from the above notes, the final two tracks * are written; * - Destination ALWAYS has surface data even if the image does not. diff --git a/src/floppy/fdd_common.c b/src/floppy/fdd_common.c index 28dea0735..9c1f98c39 100644 --- a/src/floppy/fdd_common.c +++ b/src/floppy/fdd_common.c @@ -48,14 +48,14 @@ const double fdd_bit_rates_300[6] = { * single-RPM drive by setting the rate to 300 kbps. */ const uint8_t fdd_max_sectors[8][6] = { - { 26, 31, 38, 53, 64, 118 }, /* 128 */ - { 15, 19, 23, 32, 38, 73 }, /* 256 */ - { 7, 10, 12, 17, 22, 41 }, /* 512 */ - { 3, 5, 6, 9, 11, 22 }, /* 1024 */ - { 2, 2, 3, 4, 5, 11 }, /* 2048 */ - { 1, 1, 1, 2, 2, 5 }, /* 4096 */ - { 0, 0, 0, 1, 1, 3 }, /* 8192 */ - { 0, 0, 0, 0, 0, 1 } /* 16384 */ + { 26, 31, 38, 53, 64, 118 }, /* 128 */ + { 15, 19, 23, 32, 38, 73 }, /* 256 */ + { 7, 10, 12, 17, 22, 41 }, /* 512 */ + { 3, 5, 6, 9, 11, 22 }, /* 1024 */ + { 2, 2, 3, 4, 5, 11 }, /* 2048 */ + { 1, 1, 1, 2, 2, 5 }, /* 4096 */ + { 0, 0, 0, 1, 1, 3 }, /* 8192 */ + { 0, 0, 0, 0, 0, 1 } /* 16384 */ }; const uint8_t fdd_dmf_r[21] = { @@ -63,285 +63,290 @@ const uint8_t fdd_dmf_r[21] = { }; static const uint8_t fdd_gap3_sizes[5][8][48] = { - { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [0][0] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [0][0] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [0][1] */ - 0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [0][1] */ + 0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [0][2] */ - 0x00,0x00,0x6C,0x48,0x2A,0x08,0x02,0x01, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [0][2] */ + 0x00,0x00,0x6C,0x48,0x2A,0x08,0x02,0x01, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x83,0x26,0x00,0x00,0x00,0x00, /* [0][3] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x83,0x26,0x00,0x00,0x00,0x00, /* [0][3] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [0][4] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [0][4] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [0][5] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [0][5] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [0][6] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [0][6] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [0][7] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 } + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [0][7] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 } }, - { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [1][0] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [1][0] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [1][1] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [1][1] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x54,0x1C,0x0E,0x00,0x00, /* [1][2] */ - 0x00,0x00,0x6C,0x48,0x2A,0x08,0x02,0x01, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x54,0x1C,0x0E,0x00,0x00, /* [1][2] */ + 0x00,0x00,0x6C,0x48,0x2A,0x08,0x02,0x01, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x06, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [1][3] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x06, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [1][3] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [1][4] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [1][4] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [1][5] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [1][5] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [1][6] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [1][6] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [1][7] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 } + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [1][7] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 } }, - { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [2][0] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [2][0] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x32,0x0C,0x00,0x00,0x00,0x36, /* [2][1] */ - 0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x32,0x0C,0x00,0x00,0x00,0x36, /* [2][1] */ + 0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x58,0x50,0x2E,0x00,0x00,0x00,0x00,0x00, /* [2][2] */ - 0x00,0x00,0x00,0x00,0x00,0x1C,0x1C,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x58,0x50,0x2E,0x00,0x00,0x00,0x00,0x00, /* [2][2] */ + 0x00,0x00,0x00,0x00,0x00,0x1C,0x1C,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0xF0,0x74,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [2][3] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0xF0,0x74,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [2][3] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [2][4] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [2][4] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [2][5] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [2][5] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [2][6] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [2][6] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [2][7] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 } + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [2][7] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 } }, - { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [3][0] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [3][0] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [3][1] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [3][1] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [3][2] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x53,0x4E,0x3D,0x2C, - 0x1C,0x0D,0x02,0x00,0x00,0x00,0x01,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [3][2] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x53,0x4E,0x3D,0x2C, + 0x1C,0x0D,0x02,0x00,0x00,0x00,0x01,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [3][3] */ - 0x00,0x00,0xF7,0xAF,0x6F,0x55,0x1F,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [3][3] */ + 0x00,0x00,0xF7,0xAF,0x6F,0x55,0x1F,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [3][4] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [3][4] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [3][5] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [3][5] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [3][6] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [3][6] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [3][7] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 } + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [3][7] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 } }, - { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [4][0] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [4][0] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [4][1] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [4][1] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x54, /* [4][2] */ - 0x38,0x23,0x00,0x01,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x54, /* [4][2] */ + 0x38,0x23,0x00,0x01,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x74,0x24,0x00,0x00,0x00,0x00,0x00,0x00, /* [4][3] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x74,0x24,0x00,0x00,0x00,0x00,0x00,0x00, /* [4][3] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [4][4] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [4][4] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [4][5] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [4][5] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [4][6] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [4][6] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [4][7] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 } + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [4][7] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 } } }; diff --git a/src/floppy/fdd_fdi.c b/src/floppy/fdd_fdi.c index 5d09d8df2..2a1ef5ba4 100644 --- a/src/floppy/fdd_fdi.c +++ b/src/floppy/fdd_fdi.c @@ -298,7 +298,7 @@ fdi_seek(int drive, int track) #if 0 if (track > dev->lasttrack) - track = dev->lasttrack - 1; + track = dev->lasttrack - 1; #endif dev->track = track; diff --git a/src/floppy/fdd_img.c b/src/floppy/fdd_img.c index e0847c010..f7bad2922 100644 --- a/src/floppy/fdd_img.c +++ b/src/floppy/fdd_img.c @@ -66,21 +66,21 @@ typedef struct { } img_t; -static img_t *img[FDD_NUM]; -static fdc_t *img_fdc; +static img_t *img[FDD_NUM]; +static fdc_t *img_fdc; -static double bit_rate_300; -static char *ext; -static uint8_t first_byte, - second_byte, - third_byte, - fourth_byte; -static uint8_t fdf_suppress_final_byte = 0; /* This is hard-coded to 0 - - * if you really need to read - * those NT 3.1 Beta floppy - * images, change this to 1 - * and recompile. - */ +static double bit_rate_300; +static char *ext; +static uint8_t first_byte, + second_byte, + third_byte, + fourth_byte; +static uint8_t fdf_suppress_final_byte = 0; /* This is hard-coded to 0 - + * if you really need to read + * those NT 3.1 Beta floppy + * images, change this to 1 + * and recompile. + */ const uint8_t dmf_r[21] = { 12, 2, 13, 3, 14, 4, 15, 5, 16, 6, 17, 7, 18, 8, 19, 9, 20, 10, 21, 11, 1 }; @@ -90,197 +90,230 @@ const uint8_t xdf_gap3_sizes[2][2] = { { 60, 69 }, { 60, 50 } }; const uint16_t xdf_trackx_spos[2][8] = { { 0xA7F, 0xF02, 0x11B7, 0xB66, 0xE1B, 0x129E }, { 0x302, 0x7E2, 0xA52, 0x12DA, 0x572, 0xDFA, 0x106A, 0x154A } }; /* XDF: Layout of the sectors in the image. */ -const xdf_sector_t xdf_img_layout[2][2][46] = { { { {0x8100}, {0x8200}, {0x8300}, {0x8400}, {0x8500}, {0x8600}, {0x8700}, {0x8800}, - {0x8101}, {0x8201}, {0x0100}, {0x0200}, {0x0300}, {0x0400}, {0x0500}, {0x0600}, - {0x0700}, {0x0800}, { 0}, - {0x8301}, {0x8401}, {0x8501}, {0x8601}, {0x8701}, {0x8801}, {0x8901}, {0x8A01}, - {0x8B01}, {0x8C01}, {0x8D01}, {0x8E01}, {0x8F01}, {0x9001}, { 0}, { 0}, - { 0}, { 0}, { 0} }, - { {0x8300}, {0x8600}, {0x8201}, {0x8200}, {0x8601}, {0x8301} } - }, /* 5.25" 2HD */ - { { {0x8100}, {0x8200}, {0x8300}, {0x8400}, {0x8500}, {0x8600}, {0x8700}, {0x8800}, - {0x8900}, {0x8A00}, {0x8B00}, {0x8101}, {0x0100}, {0x0200}, {0x0300}, {0x0400}, - {0x0500}, {0x0600}, {0x0700}, {0x0800}, { 0}, { 0}, { 0}, - {0x8201}, {0x8301}, {0x8401}, {0x8501}, {0x8601}, {0x8701}, {0x8801}, {0x8901}, - {0x8A01}, {0x8B01}, {0x8C01}, {0x8D01}, {0x8E01}, {0x8F01}, { 0}, { 0}, - { 0}, { 0}, { 0}, {0x9001}, {0x9101}, {0x9201}, {0x9301} }, - { {0x8300}, {0x8400}, {0x8601}, {0x8200}, {0x8201}, {0x8600}, {0x8401}, {0x8301} } - } /* 3.5" 2HD */ - }; +const xdf_sector_t xdf_img_layout[2][2][46] = { + { + { + {0x8100}, {0x8200}, {0x8300}, {0x8400}, {0x8500}, {0x8600}, {0x8700}, {0x8800}, + {0x8101}, {0x8201}, {0x0100}, {0x0200}, {0x0300}, {0x0400}, {0x0500}, {0x0600}, + {0x0700}, {0x0800}, { 0}, + {0x8301}, {0x8401}, {0x8501}, {0x8601}, {0x8701}, {0x8801}, {0x8901}, {0x8A01}, + {0x8B01}, {0x8C01}, {0x8D01}, {0x8E01}, {0x8F01}, {0x9001}, { 0}, { 0}, + { 0}, { 0}, { 0} + }, + { {0x8300}, {0x8600}, {0x8201}, {0x8200}, {0x8601}, {0x8301} } + }, /* 5.25" 2HD */ + { + { + {0x8100}, {0x8200}, {0x8300}, {0x8400}, {0x8500}, {0x8600}, {0x8700}, {0x8800}, + {0x8900}, {0x8A00}, {0x8B00}, {0x8101}, {0x0100}, {0x0200}, {0x0300}, {0x0400}, + {0x0500}, {0x0600}, {0x0700}, {0x0800}, { 0}, { 0}, { 0}, + {0x8201}, {0x8301}, {0x8401}, {0x8501}, {0x8601}, {0x8701}, {0x8801}, {0x8901}, + {0x8A01}, {0x8B01}, {0x8C01}, {0x8D01}, {0x8E01}, {0x8F01}, { 0}, { 0}, + { 0}, { 0}, { 0}, {0x9001}, {0x9101}, {0x9201}, {0x9301} + }, + { {0x8300}, {0x8400}, {0x8601}, {0x8200}, {0x8201}, {0x8600}, {0x8401}, {0x8301} } + } /* 3.5" 2HD */ +}; /* XDF: Layout of the sectors on the disk's track. */ -const xdf_sector_t xdf_disk_layout[2][2][38] = { { { {0x0100}, {0x0200}, {0x8100}, {0x8800}, {0x8200}, {0x0300}, {0x8300}, {0x0400}, - {0x8400}, {0x0500}, {0x8500}, {0x0600}, {0x8600}, {0x0700}, {0x8700}, {0x0800}, - {0x8D01}, {0x8501}, {0x8E01}, {0x8601}, {0x8F01}, {0x8701}, {0x9001}, {0x8801}, - {0x8101}, {0x8901}, {0x8201}, {0x8A01}, {0x8301}, {0x8B01}, {0x8401}, {0x8C01} }, - { {0x8300}, {0x8200}, {0x8600}, {0x8201}, {0x8301}, {0x8601} } - }, /* 5.25" 2HD */ - { { {0x0100}, {0x8A00}, {0x8100}, {0x8B00}, {0x8200}, {0x0200}, {0x8300}, {0x0300}, - {0x8400}, {0x0400}, {0x8500}, {0x0500}, {0x8600}, {0x0600}, {0x8700}, {0x0700}, - {0x8800}, {0x0800}, {0x8900}, - {0x9001}, {0x8701}, {0x9101}, {0x8801}, {0x9201}, {0x8901}, {0x9301}, {0x8A01}, - {0x8101}, {0x8B01}, {0x8201}, {0x8C01}, {0x8301}, {0x8D01}, {0x8401}, {0x8E01}, - {0x8501}, {0x8F01}, {0x8601} }, - { {0x8300}, {0x8200}, {0x8400}, {0x8600}, {0x8401}, {0x8201}, {0x8301}, {0x8601} }, - }, /* 3.5" 2HD */ - }; +const xdf_sector_t xdf_disk_layout[2][2][38] = { + { + { + {0x0100}, {0x0200}, {0x8100}, {0x8800}, {0x8200}, {0x0300}, {0x8300}, {0x0400}, + {0x8400}, {0x0500}, {0x8500}, {0x0600}, {0x8600}, {0x0700}, {0x8700}, {0x0800}, + {0x8D01}, {0x8501}, {0x8E01}, {0x8601}, {0x8F01}, {0x8701}, {0x9001}, {0x8801}, + {0x8101}, {0x8901}, {0x8201}, {0x8A01}, {0x8301}, {0x8B01}, {0x8401}, {0x8C01} + }, + { {0x8300}, {0x8200}, {0x8600}, {0x8201}, {0x8301}, {0x8601} } + }, /* 5.25" 2HD */ + { + { + {0x0100}, {0x8A00}, {0x8100}, {0x8B00}, {0x8200}, {0x0200}, {0x8300}, {0x0300}, + {0x8400}, {0x0400}, {0x8500}, {0x0500}, {0x8600}, {0x0600}, {0x8700}, {0x0700}, + {0x8800}, {0x0800}, {0x8900}, + {0x9001}, {0x8701}, {0x9101}, {0x8801}, {0x9201}, {0x8901}, {0x9301}, {0x8A01}, + {0x8101}, {0x8B01}, {0x8201}, {0x8C01}, {0x8301}, {0x8D01}, {0x8401}, {0x8E01}, + {0x8501}, {0x8F01}, {0x8601} + }, + { {0x8300}, {0x8200}, {0x8400}, {0x8600}, {0x8401}, {0x8201}, {0x8301}, {0x8601} }, + }, /* 3.5" 2HD */ +}; /* First dimension is possible sector sizes (0 = 128, 7 = 16384), second is possible bit rates (250/360, 250, 300, 500/360, 500, 1000). */ /* Disks formatted at 250 kbps @ 360 RPM can be read with a 360 RPM single-RPM 5.25" drive by setting the rate to 250 kbps. Disks formatted at 300 kbps @ 300 RPM can be read with any 300 RPM single-RPM drive by setting the rate rate to 300 kbps. */ -static const uint8_t maximum_sectors[8][6] = { { 26, 31, 38, 53, 64, 118 }, /* 128 */ - { 15, 19, 23, 32, 38, 73 }, /* 256 */ - { 7, 10, 12, 17, 22, 41 }, /* 512 */ - { 3, 5, 6, 9, 11, 22 }, /* 1024 */ - { 2, 2, 3, 4, 5, 11 }, /* 2048 */ - { 1, 1, 1, 2, 2, 5 }, /* 4096 */ - { 0, 0, 0, 1, 1, 3 }, /* 8192 */ - { 0, 0, 0, 0, 0, 1 } }; /* 16384 */ +static const uint8_t maximum_sectors[8][6] = { + { 26, 31, 38, 53, 64, 118 }, /* 128 */ + { 15, 19, 23, 32, 38, 73 }, /* 256 */ + { 7, 10, 12, 17, 22, 41 }, /* 512 */ + { 3, 5, 6, 9, 11, 22 }, /* 1024 */ + { 2, 2, 3, 4, 5, 11 }, /* 2048 */ + { 1, 1, 1, 2, 2, 5 }, /* 4096 */ + { 0, 0, 0, 1, 1, 3 }, /* 8192 */ + { 0, 0, 0, 0, 0, 1 } /* 16384 */ +}; -static const uint8_t xdf_sectors[8][6] = { { 0, 0, 0, 0, 0, 0 }, /* 128 */ - { 0, 0, 0, 0, 0, 0 }, /* 256 */ - { 0, 0, 0, 19, 23, 0 }, /* 512 */ - { 0, 0, 0, 0, 0, 0 }, /* 1024 */ - { 0, 0, 0, 0, 0, 0 }, /* 2048 */ - { 0, 0, 0, 0, 0, 0 }, /* 4096 */ - { 0, 0, 0, 0, 0, 0 }, /* 8192 */ - { 0, 0, 0, 0, 0, 0 } }; /* 16384 */ +static const uint8_t xdf_sectors[8][6] = { + { 0, 0, 0, 0, 0, 0 }, /* 128 */ + { 0, 0, 0, 0, 0, 0 }, /* 256 */ + { 0, 0, 0, 19, 23, 0 }, /* 512 */ + { 0, 0, 0, 0, 0, 0 }, /* 1024 */ + { 0, 0, 0, 0, 0, 0 }, /* 2048 */ + { 0, 0, 0, 0, 0, 0 }, /* 4096 */ + { 0, 0, 0, 0, 0, 0 }, /* 8192 */ + { 0, 0, 0, 0, 0, 0 } /* 16384 */ +}; -static const uint8_t xdf_types[8][6] = { { 0, 0, 0, 0, 0, 0 }, /* 128 */ - { 0, 0, 0, 0, 0, 0 }, /* 256 */ - { 0, 0, 0, 1, 2, 0 }, /* 512 */ - { 0, 0, 0, 0, 0, 0 }, /* 1024 */ - { 0, 0, 0, 0, 0, 0 }, /* 2048 */ - { 0, 0, 0, 0, 0, 0 }, /* 4096 */ - { 0, 0, 0, 0, 0, 0 }, /* 8192 */ - { 0, 0, 0, 0, 0, 0 } }; /* 16384 */ +static const uint8_t xdf_types[8][6] = { + { 0, 0, 0, 0, 0, 0 }, /* 128 */ + { 0, 0, 0, 0, 0, 0 }, /* 256 */ + { 0, 0, 0, 1, 2, 0 }, /* 512 */ + { 0, 0, 0, 0, 0, 0 }, /* 1024 */ + { 0, 0, 0, 0, 0, 0 }, /* 2048 */ + { 0, 0, 0, 0, 0, 0 }, /* 4096 */ + { 0, 0, 0, 0, 0, 0 }, /* 8192 */ + { 0, 0, 0, 0, 0, 0 } /* 16384 */ +}; -static const double bit_rates_300[6] = { (250.0 * 300.0) / 360.0, 250.0, 300.0, (500.0 * 300.0) / 360.0, 500.0, 1000.0 }; +static const double bit_rates_300[6] = { (250.0 * 300.0) / 360.0, 250.0, 300.0, (500.0 * 300.0) / 360.0, 500.0, 1000.0 }; -static const uint8_t rates[6] = { 2, 2, 1, 4, 0, 3 }; +static const uint8_t rates[6] = { 2, 2, 1, 4, 0, 3 }; -static const uint8_t holes[6] = { 0, 0, 0, 1, 1, 2 }; +static const uint8_t holes[6] = { 0, 0, 0, 1, 1, 2 }; -const int gap3_sizes[5][8][48] = { { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [0][0] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [0][1] */ - 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [0][2] */ - 0x00, 0x00, 0x6C, 0x48, 0x2A, 0x08, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x26, 0x00, 0x00, 0x00, 0x00, /* [0][3] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [0][4] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [0][5] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [0][6] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [0][7] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, - { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [1][0] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [1][1] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x1C, 0x0E, 0x00, 0x00, /* [1][2] */ - 0x00, 0x00, 0x6C, 0x48, 0x2A, 0x08, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [1][3] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [1][4] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [1][5] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [1][6] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [1][7] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, - { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [2][0] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x0C, 0x00, 0x00, 0x00, 0x36, /* [2][1] */ - 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x50, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, /* [2][2] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0xF0, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [2][3] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [2][4] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [2][5] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [2][6] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [2][7] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, - { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [3][0] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [3][1] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [3][2] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x53, 0x4E, 0x3D, 0x2C, 0x1C, 0x0D, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [3][3] */ - 0x00, 0x00, 0xF7, 0xAF, 0x6F, 0x55, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [3][4] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [3][5] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [3][6] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [3][7] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, - { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [4][0] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [4][1] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0x54, /* [4][2] */ - 0x38, 0x23, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [4][3] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [4][4] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [4][5] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [4][6] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [4][7] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }; +const int gap3_sizes[5][8][48] = { + { + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [0][0] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [0][1] */ + 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [0][2] */ + 0x00, 0x00, 0x6C, 0x48, 0x2A, 0x08, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x26, 0x00, 0x00, 0x00, 0x00, /* [0][3] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [0][4] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [0][5] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [0][6] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [0][7] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } + }, + { + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [1][0] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [1][1] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x1C, 0x0E, 0x00, 0x00, /* [1][2] */ + 0x00, 0x00, 0x6C, 0x48, 0x2A, 0x08, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [1][3] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [1][4] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [1][5] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [1][6] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [1][7] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } + }, + { + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [2][0] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x0C, 0x00, 0x00, 0x00, 0x36, /* [2][1] */ + 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x50, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, /* [2][2] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0xF0, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [2][3] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [2][4] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [2][5] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [2][6] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [2][7] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } + }, + { + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [3][0] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [3][1] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [3][2] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x53, 0x4E, 0x3D, 0x2C, 0x1C, 0x0D, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [3][3] */ + 0x00, 0x00, 0xF7, 0xAF, 0x6F, 0x55, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [3][4] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [3][5] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [3][6] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [3][7] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } + }, + { + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [4][0] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [4][1] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0x54, /* [4][2] */ + 0x38, 0x23, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [4][3] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [4][4] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [4][5] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [4][6] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [4][7] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } + } +}; #ifdef ENABLE_IMG_LOG int img_do_log = ENABLE_IMG_LOG; @@ -856,8 +889,8 @@ img_load(int drive, char *fn) fseek(dev->f, 0x03, SEEK_SET); (void) !fread(&bpb_bps, 1, 2, dev->f); #if 0 - fseek(dev->f, 0x0B, SEEK_SET); - (void) !fread(&bpb_total, 1, 2, dev->f); + fseek(dev->f, 0x0B, SEEK_SET); + (void) !fread(&bpb_total, 1, 2, dev->f); #endif fseek(dev->f, 0x10, SEEK_SET); bpb_sectors = fgetc(dev->f); @@ -958,13 +991,13 @@ jump_if_fdf: img_log("BPB reports %i sides and %i bytes per sector (%i sectors total)\n", bpb_sides, bpb_bps, bpb_total); - /* Invalid conditions: */ - guess = (bpb_sides < 1); /* Sides < 1; */ - guess = guess || (bpb_sides > 2); /* Sides > 2; */ - guess = guess || !bps_is_valid(bpb_bps); /* Invalid number of bytes per sector; */ - guess = guess || !first_byte_is_valid(first_byte); /* Invalid first bytes; */ - guess = guess || !is_divisible(bpb_total, bpb_sectors); /* Total sectors not divisible by sectors per track; */ - guess = guess || !is_divisible(bpb_total, bpb_sides); /* Total sectors not divisible by sides. */ + /* Invalid conditions: */ + guess = (bpb_sides < 1); /* Sides < 1; */ + guess = guess || (bpb_sides > 2); /* Sides > 2; */ + guess = guess || !bps_is_valid(bpb_bps); /* Invalid number of bytes per sector; */ + guess = guess || !first_byte_is_valid(first_byte); /* Invalid first bytes; */ + guess = guess || !is_divisible(bpb_total, bpb_sectors); /* Total sectors not divisible by sectors per track; */ + guess = guess || !is_divisible(bpb_total, bpb_sides); /* Total sectors not divisible by sides. */ guess = guess || !fdd_get_check_bpb(drive); guess = guess && !fdi; guess = guess && !cqm; @@ -1069,10 +1102,10 @@ jump_if_fdf: dev->sectors = 42; dev->tracks = 80; #if 0 - } else if (size <= 3440640) { /*HD 1024 sector*/ - dev->sectors = 21; - dev->tracks = 80; - dev->sector_size = 3; + } else if (size <= 3440640) { /*HD 1024 sector*/ + dev->sectors = 21; + dev->tracks = 80; + dev->sector_size = 3; #endif } else if (size <= 3604480) { /*HD 1024 sector*/ dev->sectors = 22; diff --git a/src/floppy/fdd_td0.c b/src/floppy/fdd_td0.c index 4b478baba..bf2b643ff 100644 --- a/src/floppy/fdd_td0.c +++ b/src/floppy/fdd_td0.c @@ -668,27 +668,27 @@ td0_initialize(int drive) * from the CMOS. */ switch (header[6]) { - case 0: /* 5.25" 360k in 1.2M drive: 360 rpm + case 0: /* 5.25" 360k in 1.2M drive: 360 rpm CMOS Drive type: None, value probably reused by Teledisk */ - case 2: /* 5.25" 1.2M 360 rpm */ - case 5: /* 8"/5.25"/3.5" 1.25M 360 rpm */ + case 2: /* 5.25" 1.2M: 360 rpm */ + case 5: /* 8"/5.25"/3.5" 1.25M: 360 rpm */ dev->default_track_flags = (density == 1) ? 0x20 : 0x21; dev->max_sector_size = (density == 1) ? 6 : 5; /* 8192 or 4096 bytes. */ break; - case 1: /* 5.25" 360k: 300 rpm */ - case 3: /* 3.5" 720k: 300 rpm */ + case 1: /* 5.25" 360k: 300 rpm */ + case 3: /* 3.5" 720k: 300 rpm */ dev->default_track_flags = 0x02; dev->max_sector_size = 5; /* 4096 bytes. */ break; - case 4: /* 3.5" 1.44M: 300 rpm */ + case 4: /* 3.5" 1.44M: 300 rpm */ dev->default_track_flags = (density == 1) ? 0x00 : 0x02; dev->max_sector_size = (density == 1) ? 6 : 5; /* 8192 or 4096 bytes. */ break; - case 6: /* 3.5" 2.88M: 300 rpm */ + case 6: /* 3.5" 2.88M: 300 rpm */ dev->default_track_flags = (density == 1) ? 0x00 : ((density == 2) ? 0x03 : 0x02); dev->max_sector_size = (density == 1) ? 6 : ((density == 2) ? 7 : 5); /* 16384, 8192, or 4096 bytes. */ break; diff --git a/src/floppy/fdi2raw.c b/src/floppy/fdi2raw.c index b367db5c1..92d299caf 100644 --- a/src/floppy/fdi2raw.c +++ b/src/floppy/fdi2raw.c @@ -363,7 +363,7 @@ zxx(FDI *fdi) #if 0 static void zyy (FDI *fdi) { - fdi2raw_log("track %d: unsupported track type 0x%02.2X\n", fdi->current_track, fdi->track_type); + fdi2raw_log("track %d: unsupported track type 0x%02.2X\n", fdi->current_track, fdi->track_type); } #endif /* empty track */ @@ -676,157 +676,157 @@ s0d(FDI *fdi) #if 0 static int amiga_check_track (FDI *fdi) { - int i, j, secwritten = 0; - int fwlen = fdi->out / 8; - int length = 2 * fwlen; - int drvsec = 11; - uae_u32 odd, even, chksum, id, dlong; - uae_u8 *secdata; - uae_u8 secbuf[544]; - uae_u8 bigmfmbuf[60000]; - uae_u8 *mbuf, *mbuf2, *mend; - char sectable[22]; - uae_u8 *raw = fdi->track_dst_buffer; - int slabel, off; - int ok = 1; + int i, j, secwritten = 0; + int fwlen = fdi->out / 8; + int length = 2 * fwlen; + int drvsec = 11; + uae_u32 odd, even, chksum, id, dlong; + uae_u8 *secdata; + uae_u8 secbuf[544]; + uae_u8 bigmfmbuf[60000]; + uae_u8 *mbuf, *mbuf2, *mend; + char sectable[22]; + uae_u8 *raw = fdi->track_dst_buffer; + int slabel, off; + int ok = 1; - memset (bigmfmbuf, 0, sizeof (bigmfmbuf)); - mbuf = bigmfmbuf; - check_offset = 0; - for (i = 0; i < (fdi->out + 7) / 8; i++) - *mbuf++ = raw[i]; - off = fdi->out & 7; + memset (bigmfmbuf, 0, sizeof (bigmfmbuf)); + mbuf = bigmfmbuf; + check_offset = 0; + for (i = 0; i < (fdi->out + 7) / 8; i++) + *mbuf++ = raw[i]; + off = fdi->out & 7; # if 1 - if (off > 0) { - mbuf--; - *mbuf &= ~((1 << (8 - off)) - 1); - } - j = 0; - while (i < (fdi->out + 7) / 8 + 600) { - *mbuf++ |= (raw[j] >> off) | ((raw[j + 1]) << (8 - off)); - j++; - i++; - } + if (off > 0) { + mbuf--; + *mbuf &= ~((1 << (8 - off)) - 1); + } + j = 0; + while (i < (fdi->out + 7) / 8 + 600) { + *mbuf++ |= (raw[j] >> off) | ((raw[j + 1]) << (8 - off)); + j++; + i++; + } # endif - mbuf = bigmfmbuf; + mbuf = bigmfmbuf; - memset (sectable, 0, sizeof (sectable)); - mend = bigmfmbuf + length; - mend -= (4 + 16 + 8 + 512); + memset (sectable, 0, sizeof (sectable)); + mend = bigmfmbuf + length; + mend -= (4 + 16 + 8 + 512); - while (secwritten < drvsec) { - int trackoffs; + while (secwritten < drvsec) { + int trackoffs; - for (;;) { - rotateonebit (bigmfmbuf, mend, 1); - if (getmfmword (mbuf) == 0) - break; - if (secwritten == 10) { - mbuf[0] = 0x44; - mbuf[1] = 0x89; - } - if (check_offset > 7) { - check_offset = 0; - mbuf++; - if (mbuf >= mend || *mbuf == 0) - break; - } - if (getmfmword (mbuf) == 0x4489) - break; - } - if (mbuf >= mend || *mbuf == 0) - break; + for (;;) { + rotateonebit (bigmfmbuf, mend, 1); + if (getmfmword (mbuf) == 0) + break; + if (secwritten == 10) { + mbuf[0] = 0x44; + mbuf[1] = 0x89; + } + if (check_offset > 7) { + check_offset = 0; + mbuf++; + if (mbuf >= mend || *mbuf == 0) + break; + } + if (getmfmword (mbuf) == 0x4489) + break; + } + if (mbuf >= mend || *mbuf == 0) + break; - rotateonebit (bigmfmbuf, mend, check_offset); - check_offset = 0; + rotateonebit (bigmfmbuf, mend, check_offset); + check_offset = 0; - while (getmfmword (mbuf) == 0x4489) - mbuf+= 1 * 2; - mbuf2 = mbuf + 8; + while (getmfmword (mbuf) == 0x4489) + mbuf+= 1 * 2; + mbuf2 = mbuf + 8; - odd = getmfmlong (mbuf); - even = getmfmlong (mbuf + 2 * 2); - mbuf += 4 * 2; - id = (odd << 1) | even; + odd = getmfmlong (mbuf); + even = getmfmlong (mbuf + 2 * 2); + mbuf += 4 * 2; + id = (odd << 1) | even; - trackoffs = (id & 0xff00) >> 8; - if (trackoffs + 1 > drvsec) { - fdi2raw_log("illegal sector offset %d\n",trackoffs); - ok = 0; - mbuf = mbuf2; - continue; - } - if ((id >> 24) != 0xff) { - fdi2raw_log("sector %d format type %02.2X?\n", trackoffs, id >> 24); - ok = 0; - } - chksum = odd ^ even; - slabel = 0; - for (i = 0; i < 4; i++) { - odd = getmfmlong (mbuf); - even = getmfmlong (mbuf + 8 * 2); - mbuf += 2* 2; + trackoffs = (id & 0xff00) >> 8; + if (trackoffs + 1 > drvsec) { + fdi2raw_log("illegal sector offset %d\n",trackoffs); + ok = 0; + mbuf = mbuf2; + continue; + } + if ((id >> 24) != 0xff) { + fdi2raw_log("sector %d format type %02.2X?\n", trackoffs, id >> 24); + ok = 0; + } + chksum = odd ^ even; + slabel = 0; + for (i = 0; i < 4; i++) { + odd = getmfmlong (mbuf); + even = getmfmlong (mbuf + 8 * 2); + mbuf += 2* 2; - dlong = (odd << 1) | even; - if (dlong) slabel = 1; - chksum ^= odd ^ even; - } - mbuf += 8 * 2; - odd = getmfmlong (mbuf); - even = getmfmlong (mbuf + 2 * 2); - mbuf += 4 * 2; - if (((odd << 1) | even) != chksum) { - fdi2raw_log("sector %d header crc error\n", trackoffs); - ok = 0; - mbuf = mbuf2; - continue; - } - fdi2raw_log("sector %d header crc ok\n", trackoffs); - if (((id & 0x00ff0000) >> 16) != (uae_u32)fdi->current_track) { - fdi2raw_log("illegal track number %d <> %d\n",fdi->current_track,(id & 0x00ff0000) >> 16); - ok++; - mbuf = mbuf2; - continue; - } - odd = getmfmlong (mbuf); - even = getmfmlong (mbuf + 2 * 2); - mbuf += 4 * 2; - chksum = (odd << 1) | even; - secdata = secbuf + 32; - for (i = 0; i < 128; i++) { - odd = getmfmlong (mbuf); - even = getmfmlong (mbuf + 256 * 2); - mbuf += 2 * 2; - dlong = (odd << 1) | even; - *secdata++ = (uae_u8) (dlong >> 24); - *secdata++ = (uae_u8) (dlong >> 16); - *secdata++ = (uae_u8) (dlong >> 8); - *secdata++ = (uae_u8) dlong; - chksum ^= odd ^ even; - } - mbuf += 256 * 2; - if (chksum) { - fdi2raw_log("sector %d data checksum error\n",trackoffs); - ok = 0; - } else if (sectable[trackoffs]) { - fdi2raw_log("sector %d already found?\n", trackoffs); - mbuf = mbuf2; - } else { - fdi2raw_log("sector %d ok\n",trackoffs); - if (slabel) fdi2raw_log("(non-empty sector header)\n"); - sectable[trackoffs] = 1; - secwritten++; - if (trackoffs == 9) - mbuf += 0x228; - } - } - for (i = 0; i < drvsec; i++) { - if (!sectable[i]) { - fdi2raw_log("sector %d missing\n", i); - ok = 0; - } - } - return ok; + dlong = (odd << 1) | even; + if (dlong) slabel = 1; + chksum ^= odd ^ even; + } + mbuf += 8 * 2; + odd = getmfmlong (mbuf); + even = getmfmlong (mbuf + 2 * 2); + mbuf += 4 * 2; + if (((odd << 1) | even) != chksum) { + fdi2raw_log("sector %d header crc error\n", trackoffs); + ok = 0; + mbuf = mbuf2; + continue; + } + fdi2raw_log("sector %d header crc ok\n", trackoffs); + if (((id & 0x00ff0000) >> 16) != (uae_u32)fdi->current_track) { + fdi2raw_log("illegal track number %d <> %d\n",fdi->current_track,(id & 0x00ff0000) >> 16); + ok++; + mbuf = mbuf2; + continue; + } + odd = getmfmlong (mbuf); + even = getmfmlong (mbuf + 2 * 2); + mbuf += 4 * 2; + chksum = (odd << 1) | even; + secdata = secbuf + 32; + for (i = 0; i < 128; i++) { + odd = getmfmlong (mbuf); + even = getmfmlong (mbuf + 256 * 2); + mbuf += 2 * 2; + dlong = (odd << 1) | even; + *secdata++ = (uae_u8) (dlong >> 24); + *secdata++ = (uae_u8) (dlong >> 16); + *secdata++ = (uae_u8) (dlong >> 8); + *secdata++ = (uae_u8) dlong; + chksum ^= odd ^ even; + } + mbuf += 256 * 2; + if (chksum) { + fdi2raw_log("sector %d data checksum error\n",trackoffs); + ok = 0; + } else if (sectable[trackoffs]) { + fdi2raw_log("sector %d already found?\n", trackoffs); + mbuf = mbuf2; + } else { + fdi2raw_log("sector %d ok\n",trackoffs); + if (slabel) fdi2raw_log("(non-empty sector header)\n"); + sectable[trackoffs] = 1; + secwritten++; + if (trackoffs == 9) + mbuf += 0x228; + } + } + for (i = 0; i < drvsec; i++) { + if (!sectable[i]) { + fdi2raw_log("sector %d missing\n", i); + ok = 0; + } + } + return ok; } #endif @@ -1538,126 +1538,126 @@ init_array(uint32_t standard_MFM_2_bit_cell_size, int nb_of_bits) static void fdi2_decode (FDI *fdi, uint32_t totalavg, uae_u32 *avgp, uae_u32 *minp, uae_u32 *maxp, uae_u8 *idx, int maxidx, int *indexoffsetp, int pulses, int mfm) { - uint32_t adjust; - uint32_t adjusted_pulse; - uint32_t standard_MFM_2_bit_cell_size = totalavg / 50000; - uint32_t standard_MFM_8_bit_cell_size = totalavg / 12500; - int real_size, i, j, eodat, outstep; - int indexoffset = *indexoffsetp; - uae_u8 *d = fdi->track_dst_buffer; - uae_u16 *pt = fdi->track_dst_buffer_timing; - uae_u32 ref_pulse, pulse; + uint32_t adjust; + uint32_t adjusted_pulse; + uint32_t standard_MFM_2_bit_cell_size = totalavg / 50000; + uint32_t standard_MFM_8_bit_cell_size = totalavg / 12500; + int real_size, i, j, eodat, outstep; + int indexoffset = *indexoffsetp; + uae_u8 *d = fdi->track_dst_buffer; + uae_u16 *pt = fdi->track_dst_buffer_timing; + uae_u32 ref_pulse, pulse; - /* detects a long-enough stable pulse coming just after another stable pulse */ - i = 1; - while ( (i < pulses) && ( (idx[i] < maxidx) - || (idx[i - 1] < maxidx) - || (avgp[i] < (standard_MFM_2_bit_cell_size - (standard_MFM_2_bit_cell_size / 4))) ) ) - i++; - if (i == pulses) { - fdi2raw_log("No stable and long-enough pulse in track.\n"); - return; - } - i--; - eodat = i; - adjust = 0; - total = 0; - totaldiv = 0; - init_array(standard_MFM_2_bit_cell_size, 2); - bitoffset = 0; - ref_pulse = 0; - outstep = 0; - while (outstep < 2) { + /* detects a long-enough stable pulse coming just after another stable pulse */ + i = 1; + while ( (i < pulses) && ( (idx[i] < maxidx) + || (idx[i - 1] < maxidx) + || (avgp[i] < (standard_MFM_2_bit_cell_size - (standard_MFM_2_bit_cell_size / 4))) ) ) + i++; + if (i == pulses) { + fdi2raw_log("No stable and long-enough pulse in track.\n"); + return; + } + i--; + eodat = i; + adjust = 0; + total = 0; + totaldiv = 0; + init_array(standard_MFM_2_bit_cell_size, 2); + bitoffset = 0; + ref_pulse = 0; + outstep = 0; + while (outstep < 2) { - /* calculates the current average bitrate from previous decoded data */ - uae_u32 avg_size = (total << 3) / totaldiv; /* this is the new average size for one MFM bit */ - /* uae_u32 avg_size = (uae_u32)((((float)total)*8.0) / ((float)totaldiv)); */ - /* you can try tighter ranges than 25%, or wider ranges. I would probably go for tighter... */ - if ((avg_size < (standard_MFM_8_bit_cell_size - (pulse_limitval * standard_MFM_8_bit_cell_size / 100))) || - (avg_size > (standard_MFM_8_bit_cell_size + (pulse_limitval * standard_MFM_8_bit_cell_size / 100)))) { - avg_size = standard_MFM_8_bit_cell_size; - } - /* this is to prevent the average value from going too far - * from the theoretical value, otherwise it could progressively go to (2 * - * real value), or (real value / 2), etc. */ + /* calculates the current average bitrate from previous decoded data */ + uae_u32 avg_size = (total << 3) / totaldiv; /* this is the new average size for one MFM bit */ + /* uae_u32 avg_size = (uae_u32)((((float)total)*8.0) / ((float)totaldiv)); */ + /* you can try tighter ranges than 25%, or wider ranges. I would probably go for tighter... */ + if ((avg_size < (standard_MFM_8_bit_cell_size - (pulse_limitval * standard_MFM_8_bit_cell_size / 100))) || + (avg_size > (standard_MFM_8_bit_cell_size + (pulse_limitval * standard_MFM_8_bit_cell_size / 100)))) { + avg_size = standard_MFM_8_bit_cell_size; + } + /* this is to prevent the average value from going too far + * from the theoretical value, otherwise it could progressively go to (2 * + * real value), or (real value / 2), etc. */ - /* gets the next long-enough pulse (this may require more than one pulse) */ - pulse = 0; - while (pulse < ((avg_size / 4) - (avg_size / 16))) { - int indx; - i++; - if (i >= pulses) - i = 0; - indx = idx[i]; - if (rand() <= (indx * RAND_MAX) / maxidx) { - pulse += avgp[i] - ref_pulse; - if (indx >= maxidx) - ref_pulse = 0; - else - ref_pulse = avgp[i]; - } - if (i == eodat) - outstep++; - if (outstep == 1 && indexoffset == i) - *indexoffsetp = bitoffset; - } + /* gets the next long-enough pulse (this may require more than one pulse) */ + pulse = 0; + while (pulse < ((avg_size / 4) - (avg_size / 16))) { + int indx; + i++; + if (i >= pulses) + i = 0; + indx = idx[i]; + if (rand() <= (indx * RAND_MAX) / maxidx) { + pulse += avgp[i] - ref_pulse; + if (indx >= maxidx) + ref_pulse = 0; + else + ref_pulse = avgp[i]; + } + if (i == eodat) + outstep++; + if (outstep == 1 && indexoffset == i) + *indexoffsetp = bitoffset; + } - /* gets the size in bits from the pulse width, considering the current average bitrate */ - adjusted_pulse = pulse; - real_size = 0; - while (adjusted_pulse >= avg_size) { - real_size += 4; - adjusted_pulse -= avg_size / 2; - } - adjusted_pulse <<= 3; - while (adjusted_pulse >= ((avg_size * 4) + (avg_size / 4))) { - real_size += 2; - adjusted_pulse -= avg_size * 2; - } - if (adjusted_pulse >= ((avg_size * 3) + (avg_size / 4))) { - if (adjusted_pulse <= ((avg_size * 4) - (avg_size / 4))) { - if ((2 * ((adjusted_pulse >> 2) - adjust)) <= ((2 * avg_size) - (avg_size / 4))) - real_size += 3; - else - real_size += 4; - } else - real_size += 4; - } else { - if (adjusted_pulse > ((avg_size * 3) - (avg_size / 4))) { - real_size += 3; - } else { - if (adjusted_pulse >= ((avg_size * 2) + (avg_size / 4))) { - if ((2 * ((adjusted_pulse >> 2) - adjust)) < (avg_size + (avg_size / 4))) - real_size += 2; - else - real_size += 3; - } else - real_size += 2; - } - } + /* gets the size in bits from the pulse width, considering the current average bitrate */ + adjusted_pulse = pulse; + real_size = 0; + while (adjusted_pulse >= avg_size) { + real_size += 4; + adjusted_pulse -= avg_size / 2; + } + adjusted_pulse <<= 3; + while (adjusted_pulse >= ((avg_size * 4) + (avg_size / 4))) { + real_size += 2; + adjusted_pulse -= avg_size * 2; + } + if (adjusted_pulse >= ((avg_size * 3) + (avg_size / 4))) { + if (adjusted_pulse <= ((avg_size * 4) - (avg_size / 4))) { + if ((2 * ((adjusted_pulse >> 2) - adjust)) <= ((2 * avg_size) - (avg_size / 4))) + real_size += 3; + else + real_size += 4; + } else + real_size += 4; + } else { + if (adjusted_pulse > ((avg_size * 3) - (avg_size / 4))) { + real_size += 3; + } else { + if (adjusted_pulse >= ((avg_size * 2) + (avg_size / 4))) { + if ((2 * ((adjusted_pulse >> 2) - adjust)) < (avg_size + (avg_size / 4))) + real_size += 2; + else + real_size += 3; + } else + real_size += 2; + } + } - if (outstep == 1) { - for (j = real_size; j > 1; j--) - addbit (d, 0); - addbit (d, 1); - for (j = 0; j < real_size; j++) - *pt++ = (uae_u16)(pulse / real_size); - } + if (outstep == 1) { + for (j = real_size; j > 1; j--) + addbit (d, 0); + addbit (d, 1); + for (j = 0; j < real_size; j++) + *pt++ = (uae_u16)(pulse / real_size); + } - /* prepares for the next pulse */ - adjust = ((real_size * avg_size)/8) - pulse; - total -= psarray[array_index].size; - totaldiv -= psarray[array_index].number_of_bits; - psarray[array_index].size = pulse; - psarray[array_index].number_of_bits = real_size; - total += pulse; - totaldiv += real_size; - array_index++; - if (array_index >= FDI_MAX_ARRAY) - array_index = 0; - } + /* prepares for the next pulse */ + adjust = ((real_size * avg_size)/8) - pulse; + total -= psarray[array_index].size; + totaldiv -= psarray[array_index].number_of_bits; + psarray[array_index].size = pulse; + psarray[array_index].number_of_bits = real_size; + total += pulse; + totaldiv += real_size; + array_index++; + if (array_index >= FDI_MAX_ARRAY) + array_index = 0; + } - fdi->out = bitoffset; + fdi->out = bitoffset; } #else @@ -1704,7 +1704,7 @@ fdi2_decode(FDI *fdi, uint32_t totalavg, uae_u32 *avgp, uae_u32 *minp, uae_u32 * if ((avg_size < (standard_MFM_8_bit_cell_size - (pulse_limitval * standard_MFM_8_bit_cell_size / 100))) || (avg_size > (standard_MFM_8_bit_cell_size + (pulse_limitval * standard_MFM_8_bit_cell_size / 100)))) { avg_size = standard_MFM_8_bit_cell_size; } - /* this is to prevent the average value from going too far + /* this is to prevent the average value from going too far * from the theoretical value, otherwise it could progressively go to (2 * * real value), or (real value / 2), etc. */ diff --git a/src/include/86box/apm.h b/src/include/86box/apm.h index 2676fa198..854969f3d 100644 --- a/src/include/86box/apm.h +++ b/src/include/86box/apm.h @@ -1,18 +1,18 @@ /* - * 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. * - * Definitions for the Advanced Power Management emulation. + * Definitions for the Advanced Power Management emulation. * * * - * Authors: Miran Grca, + * Authors: Miran Grca, * - * Copyright 2019 Miran Grca. + * Copyright 2019 Miran Grca. */ #ifndef APM_H #define APM_H diff --git a/src/include/86box/bugger.h b/src/include/86box/bugger.h index b0a6a5469..57dabd172 100644 --- a/src/include/86box/bugger.h +++ b/src/include/86box/bugger.h @@ -1,25 +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. + * 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. * - * Implementation of the ISA Bus (de)Bugger expansion card - * sold as a DIY kit in the late 1980's in The Netherlands. - * This card was a assemble-yourself 8bit ISA addon card for - * PC and AT systems that had several tools to aid in low- - * level debugging (mostly for faulty BIOSes, bootloaders - * and system kernels...) + * Implementation of the ISA Bus (de)Bugger expansion card + * sold as a DIY kit in the late 1980's in The Netherlands. + * This card was a assemble-yourself 8bit ISA addon card for + * PC and AT systems that had several tools to aid in low- + * level debugging (mostly for faulty BIOSes, bootloaders + * and system kernels...) * - * Definitions for the BUGGER card. + * Definitions for the BUGGER card. * * * - * Author: Fred N. van Kempen, + * Authors: Fred N. van Kempen, * - * Copyright 1989-2018 Fred N. van Kempen. + * Copyright 1989-2018 Fred N. van Kempen. */ #ifndef BUGGER_H #define BUGGER_H diff --git a/src/include/86box/cartridge.h b/src/include/86box/cartridge.h index c07fe1cfd..2fa0a9358 100644 --- a/src/include/86box/cartridge.h +++ b/src/include/86box/cartridge.h @@ -1,18 +1,18 @@ /* - * 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. * - * Definitions for the PCjr cartridge emulation. + * Definitions for the PCjr cartridge emulation. * * * - * Authors: Miran Grca, + * Authors: Miran Grca, * - * Copyright 2021 Miran Grca. + * Copyright 2021 Miran Grca. */ #ifndef EMU_CARTRIDGE_H #define EMU_CARTRIDGE_H diff --git a/src/include/86box/cdrom.h b/src/include/86box/cdrom.h index f5bfc9026..ad57b3bad 100644 --- a/src/include/86box/cdrom.h +++ b/src/include/86box/cdrom.h @@ -1,16 +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. + * 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. * - * Generic CD-ROM drive core header. + * Generic CD-ROM drive core header. * - * Author: Miran Grca, + * Authors: Miran Grca, * - * Copyright 2016-2019 Miran Grca. + * Copyright 2016-2019 Miran Grca. */ #ifndef EMU_CDROM_H #define EMU_CDROM_H diff --git a/src/include/86box/cdrom_image.h b/src/include/86box/cdrom_image.h index b43e8cee3..c848af50d 100644 --- a/src/include/86box/cdrom_image.h +++ b/src/include/86box/cdrom_image.h @@ -1,19 +1,19 @@ /* - * 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. * - * CD-ROM image file handling module header, translated to C - * from cdrom_dosbox.h. + * CD-ROM image file handling module header, translated to C + * from cdrom_dosbox.h. * - * Authors: RichardG, - * Miran Grca, + * Authors: RichardG, + * Miran Grca, * - * Copyright 2016-2022 RichardG. - * Copyright 2016-2022 Miran Grca. + * Copyright 2016-2022 RichardG. + * Copyright 2016-2022 Miran Grca. */ #ifndef CDROM_IMAGE_H #define CDROM_IMAGE_H diff --git a/src/include/86box/cdrom_image_backend.h b/src/include/86box/cdrom_image_backend.h index 2a581624d..511ca68eb 100644 --- a/src/include/86box/cdrom_image_backend.h +++ b/src/include/86box/cdrom_image_backend.h @@ -1,21 +1,21 @@ /* - * 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. * - * CD-ROM image file handling module header , translated to C - * from cdrom_dosbox.h. + * CD-ROM image file handling module header , translated to C + * from cdrom_dosbox.h. * - * Authors: Miran Grca, - * Fred N. van Kempen, - * The DOSBox Team, + * Authors: Miran Grca, + * Fred N. van Kempen, + * The DOSBox Team, * - * Copyright 2016-2020 Miran Grca. - * Copyright 2017-2020 Fred N. van Kempen. - * Copyright 2002-2020 The DOSBox Team. + * Copyright 2016-2020 Miran Grca. + * Copyright 2017-2020 Fred N. van Kempen. + * Copyright 2002-2020 The DOSBox Team. */ #ifndef CDROM_IMAGE_BACKEND_H #define CDROM_IMAGE_BACKEND_H diff --git a/src/include/86box/cdrom_mitsumi.h b/src/include/86box/cdrom_mitsumi.h index 747668c5d..0b8a3a250 100644 --- a/src/include/86box/cdrom_mitsumi.h +++ b/src/include/86box/cdrom_mitsumi.h @@ -1,18 +1,18 @@ /* - * 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. * - * Mitsumi CD-ROM emulation for the ISA bus. + * Mitsumi CD-ROM emulation for the ISA bus. * * * - * Author: Miran Grca, + * Authors: Miran Grca, * - * Copyright 2022 Miran Grca. + * Copyright 2022 Miran Grca. */ #ifndef CDROM_MITSUMI_H #define CDROM_MITSUMI_H diff --git a/src/include/86box/clock.h b/src/include/86box/clock.h index 813c21af7..10155eabc 100644 --- a/src/include/86box/clock.h +++ b/src/include/86box/clock.h @@ -1,18 +1,18 @@ /* - * 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. * - * Definitions for clock generator chips. + * Definitions for clock generator chips. * * * - * Authors: RichardG, + * Authors: RichardG, * - * Copyright 2020 RichardG. + * Copyright 2020 RichardG. */ #ifndef EMU_CLOCK_H #define EMU_CLOCK_H diff --git a/src/include/86box/ddma.h b/src/include/86box/ddma.h index 1f422ab65..ccc423d27 100644 --- a/src/include/86box/ddma.h +++ b/src/include/86box/ddma.h @@ -1,18 +1,18 @@ /* - * 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. * - * Definitions for the Distributed DMA emulation. + * Definitions for the Distributed DMA emulation. * * * - * Authors: Miran Grca, + * Authors: Miran Grca, * - * Copyright 2020 Miran Grca. + * Copyright 2020 Miran Grca. */ #ifndef DDMA_H #define DDMA_H diff --git a/src/include/86box/discord.h b/src/include/86box/discord.h index 9a1467e08..358c95c9b 100644 --- a/src/include/86box/discord.h +++ b/src/include/86box/discord.h @@ -1,18 +1,18 @@ /* - * 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. * - * Definitions for the Discord integration module. + * Definitions for the Discord integration module. * * * - * Authors: David Hrdlička, + * Authors: David Hrdlička, * - * Copyright 2019 David Hrdlička. + * Copyright 2019 David Hrdlička. */ #ifndef WIN_DISCORD_H #define WIN_DISCORD_H diff --git a/src/include/86box/fdc_ext.h b/src/include/86box/fdc_ext.h index 2287978c1..3dc518f81 100644 --- a/src/include/86box/fdc_ext.h +++ b/src/include/86box/fdc_ext.h @@ -1,23 +1,23 @@ /* - * 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. * - * Implementation of the NEC uPD-765 and compatible floppy disk - * controller. + * Implementation of the NEC uPD-765 and compatible floppy disk + * controller. * * * - * Authors: Sarah Walker, - * Miran Grca, - * Fred N. van Kempen, + * Authors: Sarah Walker, + * Miran Grca, + * Fred N. van Kempen, * - * Copyright 2008-2020 Sarah Walker. - * Copyright 2016-2020 Miran Grca. - * Copyright 2018-2020 Fred N. van Kempen. + * Copyright 2008-2020 Sarah Walker. + * Copyright 2016-2020 Miran Grca. + * Copyright 2018-2020 Fred N. van Kempen. */ #ifndef EMU_FDC_EXT_H #define EMU_FDC_EXT_H diff --git a/src/include/86box/fdd_86f.h b/src/include/86box/fdd_86f.h index 88eeb035f..e20990b09 100644 --- a/src/include/86box/fdd_86f.h +++ b/src/include/86box/fdd_86f.h @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Definitions for the 86F floppy image format. + * Definitions for the 86F floppy image format. * * * - * Authors: Miran Grca, - * Fred N. van Kempen, + * Authors: Miran Grca, + * Fred N. van Kempen, * - * Copyright 2016-2019 Miran Grca. - * Copyright 2018,2019 Fred N. van Kempen. + * Copyright 2016-2019 Miran Grca. + * Copyright 2018,2019 Fred N. van Kempen. */ #ifndef EMU_FLOPPY_86F_H #define EMU_FLOPPY_86F_H diff --git a/src/include/86box/fdd_common.h b/src/include/86box/fdd_common.h index 9c6f8853c..9c10a4a9a 100644 --- a/src/include/86box/fdd_common.h +++ b/src/include/86box/fdd_common.h @@ -1,18 +1,18 @@ /* - * 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. * - * Shared code for all the floppy modules. + * Shared code for all the floppy modules. * * * - * Author: Fred N. van Kempen, + * Authors: Fred N. van Kempen, * - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017,2018 Fred N. van Kempen. */ #ifndef FDD_COMMON_H #define FDD_COMMON_H diff --git a/src/include/86box/fdd_fdi.h b/src/include/86box/fdd_fdi.h index b984a8154..4d4e551d6 100644 --- a/src/include/86box/fdd_fdi.h +++ b/src/include/86box/fdd_fdi.h @@ -1,23 +1,23 @@ /* - * 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. * - * Implementation of the FDI floppy stream image format - * interface to the FDI2RAW module. + * Implementation of the FDI floppy stream image format + * interface to the FDI2RAW module. * * * - * Authors: Sarah Walker, - * Miran Grca, - * Fred N. van Kempen, + * Authors: Sarah Walker, + * Miran Grca, + * Fred N. van Kempen, * - * Copyright 2008-2018 Sarah Walker. - * Copyright 2016-2018 Miran Grca. - * Copyright 2018 Fred N. van Kempen. + * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. + * Copyright 2018 Fred N. van Kempen. */ #ifndef EMU_FLOPPY_FDI_H #define EMU_FLOPPY_FDI_H diff --git a/src/include/86box/fdd_imd.h b/src/include/86box/fdd_imd.h index 806304093..f50ad865e 100644 --- a/src/include/86box/fdd_imd.h +++ b/src/include/86box/fdd_imd.h @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Definitions for the IMD floppy image format. + * Definitions for the IMD floppy image format. * * * - * Authors: Miran Grca, - * Fred N. van Kempen, + * Authors: Miran Grca, + * Fred N. van Kempen, * - * Copyright 2016-2018 Miran Grca. - * Copyright 2018 Fred N. van Kempen. + * Copyright 2016-2018 Miran Grca. + * Copyright 2018 Fred N. van Kempen. * * 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 diff --git a/src/include/86box/fdd_img.h b/src/include/86box/fdd_img.h index 7c36929c3..ec0e9df67 100644 --- a/src/include/86box/fdd_img.h +++ b/src/include/86box/fdd_img.h @@ -1,23 +1,23 @@ /* - * 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. * - * Implementation of the raw sector-based floppy image format, - * as well as the Japanese FDI, CopyQM, and FDF formats. + * Implementation of the raw sector-based floppy image format, + * as well as the Japanese FDI, CopyQM, and FDF formats. * * * - * Authors: Sarah Walker, - * Miran Grca, - * Fred N. van Kempen, + * Authors: Sarah Walker, + * Miran Grca, + * Fred N. van Kempen, * - * Copyright 2008-2018 Sarah Walker. - * Copyright 2016-2018 Miran Grca. - * Copyright 2018 Fred N. van Kempen. + * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. + * Copyright 2018 Fred N. van Kempen. */ #ifndef EMU_FLOPPY_IMG_H #define EMU_FLOPPY_IMG_H diff --git a/src/include/86box/fdd_mfm.h b/src/include/86box/fdd_mfm.h index 36c6e6b8f..3a8494a26 100644 --- a/src/include/86box/fdd_mfm.h +++ b/src/include/86box/fdd_mfm.h @@ -1,18 +1,18 @@ /* - * 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. * - * Implementation of the HxC MFM image format. + * Implementation of the HxC MFM image format. * * * - * Authors: Miran Grca, + * Authors: Miran Grca, * - * Copyright 2018 Miran Grca. + * Copyright 2018 Miran Grca. */ #ifndef EMU_FLOPPY_MFM_H #define EMU_FLOPPY_MFM_H diff --git a/src/include/86box/fdd_td0.h b/src/include/86box/fdd_td0.h index 56ff8f3c8..06938c66a 100644 --- a/src/include/86box/fdd_td0.h +++ b/src/include/86box/fdd_td0.h @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Definitions for the Teledisk floppy image format. + * Definitions for the Teledisk floppy image format. * * * - * Authors: Miran Grca, - * Fred N. van Kempen, + * Authors: Miran Grca, + * Fred N. van Kempen, * - * Copyright 2016-2018 Miran Grca. - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2016-2018 Miran Grca. + * Copyright 2017,2018 Fred N. van Kempen. */ #ifndef EMU_FLOPPY_TD0_H #define EMU_FLOPPY_TD0_H diff --git a/src/include/86box/gameport.h b/src/include/86box/gameport.h index 07a51edc4..66024867d 100644 --- a/src/include/86box/gameport.h +++ b/src/include/86box/gameport.h @@ -1,22 +1,22 @@ /* - * 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. * - * Definitions for the generic game port handlers. + * Definitions for the generic game port handlers. * * * - * Authors: Miran Grca, - * Sarah Walker, - * RichardG, + * Authors: Miran Grca, + * Sarah Walker, + * RichardG, * - * Copyright 2016-2018 Miran Grca. - * Copyright 2008-2018 Sarah Walker. - * Copyright 2021 RichardG. + * Copyright 2016-2018 Miran Grca. + * Copyright 2008-2018 Sarah Walker. + * Copyright 2021 RichardG. */ #ifndef EMU_GAMEPORT_H #define EMU_GAMEPORT_H diff --git a/src/include/86box/hdc_ide.h b/src/include/86box/hdc_ide.h index da5fe1b32..c1143af5b 100644 --- a/src/include/86box/hdc_ide.h +++ b/src/include/86box/hdc_ide.h @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Implementation of the IDE emulation for hard disks and ATAPI - * CD-ROM devices. + * Implementation of the IDE emulation for hard disks and ATAPI + * CD-ROM devices. * * * - * Authors: Sarah Walker, - * Miran Grca, - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 Miran Grca. + * Authors: Sarah Walker, + * Miran Grca, + * Copyright 2008-2019 Sarah Walker. + * Copyright 2016-2019 Miran Grca. */ #ifndef EMU_IDE_H #define EMU_IDE_H diff --git a/src/include/86box/hdc_ide_sff8038i.h b/src/include/86box/hdc_ide_sff8038i.h index 5533319e1..277e9b25a 100644 --- a/src/include/86box/hdc_ide_sff8038i.h +++ b/src/include/86box/hdc_ide_sff8038i.h @@ -1,19 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Emulation of the SFF-8038i IDE Bus Master. + * This file is part of the 86Box distribution. * - * Emulation core dispatcher. + * Emulation of the SFF-8038i IDE Bus Master. * * * - * Authors: Sarah Walker, - * Miran Grca, - * Copyright 2008-2020 Sarah Walker. - * Copyright 2016-2020 Miran Grca. + * Authors: Sarah Walker, + * Miran Grca, + * + * Copyright 2008-2020 Sarah Walker. + * Copyright 2016-2020 Miran Grca. */ #ifndef EMU_HDC_IDE_SFF8038I_H diff --git a/src/include/86box/hdd.h b/src/include/86box/hdd.h index abb2aa388..c4b3b0328 100644 --- a/src/include/86box/hdd.h +++ b/src/include/86box/hdd.h @@ -1,19 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Definitions for the hard disk image handler. + * Definitions for the hard disk image handler. * * * - * Authors: Miran Grca, - * Fred N. van Kempen, - * Copyright 2016-2018 Miran Grca. - * Copyright 2017,2018 Fred N. van Kempen. + * Authors: Miran Grca, + * Fred N. van Kempen, + * + * Copyright 2016-2018 Miran Grca. + * Copyright 2017,2018 Fred N. van Kempen. */ #ifndef EMU_HDD_H #define EMU_HDD_H diff --git a/src/include/86box/i2c.h b/src/include/86box/i2c.h index 071e57729..20e2f8b30 100644 --- a/src/include/86box/i2c.h +++ b/src/include/86box/i2c.h @@ -1,18 +1,18 @@ /* - * 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. * - * Definitions for the I2C handler. + * Definitions for the I2C handler. * * * - * Authors: RichardG, + * Authors: RichardG, * - * Copyright 2020 RichardG. + * Copyright 2020 RichardG. */ #ifndef EMU_I2C_H #define EMU_I2C_H diff --git a/src/include/86box/i8080.h b/src/include/86box/i8080.h index 9f85a85c0..a3f3fba64 100644 --- a/src/include/86box/i8080.h +++ b/src/include/86box/i8080.h @@ -1,16 +1,18 @@ /* - * 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. * - * 8080 CPU emulation (header). + * 8080 CPU emulation (header). * - * Authors: Cacodemon345 * - * Copyright 2022 Cacodemon345 + * + * Authors: Cacodemon345 + * + * Copyright 2022 Cacodemon345 */ #include diff --git a/src/include/86box/ibm_5161.h b/src/include/86box/ibm_5161.h index 711773d6d..e189826a8 100644 --- a/src/include/86box/ibm_5161.h +++ b/src/include/86box/ibm_5161.h @@ -1,15 +1,18 @@ /* - * 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. * - * Emulation of the IBM Expansion Unit (5161). + * This file is part of the 86Box distribution. + * + * Emulation of the IBM Expansion Unit (5161). * * * - * Author: Miran Grca, - * Copyright 2016-2018 Miran Grca. + * Authors: Miran Grca, + * + * Copyright 2016-2018 Miran Grca. */ #ifndef EMU_IBM_5161_H diff --git a/src/include/86box/io.h b/src/include/86box/io.h index 7e7b45912..20b493e7f 100644 --- a/src/include/86box/io.h +++ b/src/include/86box/io.h @@ -1,21 +1,21 @@ /* - * 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. * - * Definitions for the I/O handler. + * Definitions for the I/O handler. * * * - * Authors: Sarah Walker, - * Miran Grca, - * Fred N. van Kempen, + * Authors: Sarah Walker, + * Miran Grca, + * Fred N. van Kempen, * - * Copyright 2008-2017 Sarah Walker. - * Copyright 2016,2017 Miran Grca. + * Copyright 2008-2017 Sarah Walker. + * Copyright 2016,2017 Miran Grca. */ #ifndef EMU_IO_H #define EMU_IO_H diff --git a/src/include/86box/isapnp.h b/src/include/86box/isapnp.h index abf3eb10d..9fff876dc 100644 --- a/src/include/86box/isapnp.h +++ b/src/include/86box/isapnp.h @@ -1,18 +1,18 @@ /* - * 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. * - * Definitions for ISA Plug and Play. + * Definitions for ISA Plug and Play. * * * - * Author: RichardG, + * Authors: RichardG, * - * Copyright 2021 RichardG. + * Copyright 2021 RichardG. */ #ifndef EMU_ISAPNP_H diff --git a/src/include/86box/joystick_ch_flightstick_pro.h b/src/include/86box/joystick_ch_flightstick_pro.h index 5bdedede9..73e2d7c69 100644 --- a/src/include/86box/joystick_ch_flightstick_pro.h +++ b/src/include/86box/joystick_ch_flightstick_pro.h @@ -1,20 +1,20 @@ /* - * VARCem Virtual ARchaeological Computer EMulator. - * An emulator of (mostly) x86-based PC systems and devices, - * using the ISA,EISA,VLB,MCA and PCI system buses, roughly - * spanning the era between 1981 and 1995. + * 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 VARCem Project. + * This file is part of the 86Box distribution. * - * Definitions for the Flight Stick Pro driver. + * Definitions for the Flight Stick Pro driver. * * * - * Authors: Miran Grca, - * Sarah Walker, + * Authors: Miran Grca, + * Sarah Walker, * - * Copyright 2016-2018 Miran Grca. - * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. + * Copyright 2008-2018 Sarah Walker. * * 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 diff --git a/src/include/86box/joystick_sw_pad.h b/src/include/86box/joystick_sw_pad.h index d5aef7ccb..d22f337a8 100644 --- a/src/include/86box/joystick_sw_pad.h +++ b/src/include/86box/joystick_sw_pad.h @@ -6,7 +6,7 @@ * * This file is part of the 86Box distribution. * - * Definitions for the Sidewinder Pro driver. + * Definitions for the Sidewinder Pro driver. * * * diff --git a/src/include/86box/joystick_tm_fcs.h b/src/include/86box/joystick_tm_fcs.h index 74b3edd2e..2e875190e 100644 --- a/src/include/86box/joystick_tm_fcs.h +++ b/src/include/86box/joystick_tm_fcs.h @@ -6,7 +6,7 @@ * * This file is part of the 86Box distribution. * - * Definitions for the Flight Control System driver. + * Definitions for the Flight Control System driver. * * * diff --git a/src/include/86box/language.h b/src/include/86box/language.h index 90bfecc06..fbd1f6e2b 100644 --- a/src/include/86box/language.h +++ b/src/include/86box/language.h @@ -1,21 +1,19 @@ /* - * 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. * - * Definitions for the language management module. - * - * NOTE: FIXME: Strings 2176 and 2193 are same. + * Definitions for the language management module. * * * - * Author: Fred N. van Kempen, + * Authors: Fred N. van Kempen, * - * Copyright 2017,2018 Fred N. van Kempen. - * Copyright 2022 Jasmine Iwanek. + * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2022 Jasmine Iwanek. */ #ifndef LANG_UAGE_H diff --git a/src/include/86box/log.h b/src/include/86box/log.h index b736ef2b6..9d3568069 100644 --- a/src/include/86box/log.h +++ b/src/include/86box/log.h @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Main include file for the application. + * Main include file for the application. * * * - * Authors: Miran Grca, - * Fred N. van Kempen, + * Authors: Miran Grca, + * Fred N. van Kempen, * - * Copyright 2021 Miran Grca. - * Copyright 2021 Fred N. van Kempen. + * Copyright 2021 Miran Grca. + * Copyright 2021 Fred N. van Kempen. */ #ifndef EMU_LOG_H diff --git a/src/include/86box/lpt.h b/src/include/86box/lpt.h index 87bd90d48..cb8fc7cc6 100644 --- a/src/include/86box/lpt.h +++ b/src/include/86box/lpt.h @@ -11,10 +11,10 @@ #define LPT4_ADDR 0x0268 #define LPT4_IRQ 5 /* -#define LPT5_ADDR 0x027c -#define LPT5_IRQ 7 -#define LPT6_ADDR 0x026c -#define LPT6_IRQ 5 +#define LPT5_ADDR 0x027c +#define LPT5_IRQ 7 +#define LPT6_ADDR 0x026c +#define LPT6_IRQ 5 */ typedef struct diff --git a/src/include/86box/m_amstrad.h b/src/include/86box/m_amstrad.h index 1b99617ca..5d0350703 100644 --- a/src/include/86box/m_amstrad.h +++ b/src/include/86box/m_amstrad.h @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Header of the emulation of the Amstrad series of PC's: - * PC1512, PC1640 and PC200, including their keyboard, mouse and - * video devices, as well as the PC2086 and PC3086 systems. + * Header of the emulation of the Amstrad series of PC's: + * PC1512, PC1640 and PC200, including their keyboard, mouse and + * video devices, as well as the PC2086 and PC3086 systems. * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * - * Copyright 2008-2019 Sarah Walker. + * Copyright 2008-2019 Sarah Walker. */ #ifndef MACHINE_AMSTRAD_H diff --git a/src/include/86box/mo.h b/src/include/86box/mo.h index ea22f8f29..19c999ee3 100644 --- a/src/include/86box/mo.h +++ b/src/include/86box/mo.h @@ -1,21 +1,21 @@ /* - * 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. * - * Implementation of a generic Magneto-Optical Disk drive - * commands, for both ATAPI and SCSI usage. + * Implementation of a generic Magneto-Optical Disk drive + * commands, for both ATAPI and SCSI usage. * * * - * Authors: Natalia Portillo + * Authors: Natalia Portillo * Fred N. van Kempen, - * Miran Grca, + * Miran Grca, * - * Copyright 2020 Miran Grca. + * Copyright 2020 Miran Grca. */ #ifndef EMU_MO_H diff --git a/src/include/86box/mouse.h b/src/include/86box/mouse.h index aa046b81c..c260b3571 100644 --- a/src/include/86box/mouse.h +++ b/src/include/86box/mouse.h @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Definitions for the mouse driver. + * Definitions for the mouse driver. * * * - * Authors: Miran Grca, - * Fred N. van Kempen, + * Authors: Miran Grca, + * Fred N. van Kempen, * - * Copyright 2016-2019 Miran Grca. - * Copyright 2017-2019 Fred N. van Kempen. + * Copyright 2016-2019 Miran Grca. + * Copyright 2017-2019 Fred N. van Kempen. */ #ifndef EMU_MOUSE_H diff --git a/src/include/86box/net_3c501.h b/src/include/86box/net_3c501.h index e45f9a82a..996720f8f 100644 --- a/src/include/86box/net_3c501.h +++ b/src/include/86box/net_3c501.h @@ -1,22 +1,23 @@ /* - * 86Box An emulator of (mostly) x86-based PC systems and devices, - * using the ISA, EISA, VLB, MCA, and PCI system buses, - * roughly spanning the era between 1981 and 1995. + * 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 Project. + * This file is part of the 86Box Project. * - * Implementation of the following network controller: - * - 3Com Etherlink 3c500/3c501 (ISA 8-bit). + * Implementation of the following network controller: + * - 3Com Etherlink 3c500/3c501 (ISA 8-bit). * * * * Based on @(#)Dev3C501.cpp Oracle (VirtualBox) * - * Authors: TheCollector1995, - * Oracle + * Authors: TheCollector1995, + * Oracle * - * Copyright 2022 TheCollector1995. - * Portions Copyright (C) 2022 Oracle and/or its affilitates. + * Copyright 2022 TheCollector1995. + * Portions Copyright (C) 2022 Oracle and/or its affilitates. * * 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 diff --git a/src/include/86box/net_3c503.h b/src/include/86box/net_3c503.h index 147ae0f05..44024850f 100644 --- a/src/include/86box/net_3c503.h +++ b/src/include/86box/net_3c503.h @@ -1,3 +1,46 @@ +/* + * 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 following network controllers: + * - 3Com Etherlink II 3c503 (ISA 8-bit). + * + * + * + * Based on @(#)3c503.cpp Carl (MAME) + * + * Authors: TheCollector1995, + * Miran Grca, + * Fred N. van Kempen, + * Carl, + * + * Copyright 2018 TheCollector1995. + * Copyright 2018 Miran Grca. + * Copyright 2017-2018 Fred N. van Kempen. + * Portions Copyright (C) 2018 MAME Project + * + * 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 NET_3C503_H #define NET_3C503_H diff --git a/src/include/86box/net_dp8390.h b/src/include/86box/net_dp8390.h index 7cb91d30a..4a172d4fe 100644 --- a/src/include/86box/net_dp8390.h +++ b/src/include/86box/net_dp8390.h @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Header of the emulation of the DP8390 Network Interface - * Controller used by the WD family, NE1000/NE2000 family, and - * 3Com 3C503 NIC's. + * Header of the emulation of the DP8390 Network Interface + * Controller used by the WD family, NE1000/NE2000 family, and + * 3Com 3C503 NIC's. * * * - * Authors: Miran Grca, - * Bochs project, + * Authors: Miran Grca, + * Bochs project, * - * Copyright 2016-2018 Miran Grca. - * Copyright 2008-2018 Bochs project. + * Copyright 2016-2018 Miran Grca. + * Copyright 2008-2018 Bochs project. */ #ifndef NET_DP8390_H diff --git a/src/include/86box/net_pcnet.h b/src/include/86box/net_pcnet.h index f1db74045..ccdc7e832 100644 --- a/src/include/86box/net_pcnet.h +++ b/src/include/86box/net_pcnet.h @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Emulation of the AMD PCnet LANCE NIC controller for both the ISA - * and PCI buses. + * Emulation of the AMD PCnet LANCE NIC controller for both the ISA + * and PCI buses. * * * - * Authors: Miran Grca, - * TheCollector1995, - * Antony T Curtis + * Authors: Miran Grca, + * TheCollector1995, + * Antony T Curtis * - * Copyright 2004-2019 Antony T Curtis - * Copyright 2016-2019 Miran Grca. + * Copyright 2004-2019 Antony T Curtis + * Copyright 2016-2019 Miran Grca. */ #ifndef NET_PCNET_H diff --git a/src/include/86box/net_plip.h b/src/include/86box/net_plip.h index 890de3fd0..83c33e4c6 100644 --- a/src/include/86box/net_plip.h +++ b/src/include/86box/net_plip.h @@ -1,17 +1,18 @@ /* - * 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. * - * Definitions for the PLIP parallel port network device. + * Definitions for the PLIP parallel port network device. * * * - * Author: RichardG, - * Copyright 2020 RichardG. + * Authors: RichardG, + * + * Copyright 2020 RichardG. */ #ifndef NET_PLIP_H diff --git a/src/include/86box/net_wd8003.h b/src/include/86box/net_wd8003.h index ee313c1a9..deb4ce7b8 100644 --- a/src/include/86box/net_wd8003.h +++ b/src/include/86box/net_wd8003.h @@ -1,26 +1,26 @@ /* - * 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. * - * Implementation of the following network controllers: - * - SMC/WD 8003E (ISA 8-bit); - * - SMC/WD 8013EBT (ISA 16-bit); - * - SMC/WD 8013EP/A (MCA). + * Implementation of the following network controllers: + * - SMC/WD 8003E (ISA 8-bit); + * - SMC/WD 8013EBT (ISA 16-bit); + * - SMC/WD 8013EP/A (MCA). * * * - * Authors: Fred N. van Kempen, - * TheCollector1995, - * Miran Grca, - * Peter Grehan, + * Authors: Fred N. van Kempen, + * TheCollector1995, + * Miran Grca, + * Peter Grehan, * - * Copyright 2017,2018 Fred N. van Kempen. - * Copyright 2016-2018 Miran Grca. - * Portions Copyright (C) 2002 MandrakeSoft S.A. + * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2016-2018 Miran Grca. + * Portions Copyright (C) 2002 MandrakeSoft S.A. * * 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 diff --git a/src/include/86box/pic.h b/src/include/86box/pic.h index d1295be4b..318ce2fad 100644 --- a/src/include/86box/pic.h +++ b/src/include/86box/pic.h @@ -1,19 +1,19 @@ /* - * 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. * - * Header of the implementation of the Intel PIC chip emulation, - * partially ported from reenigne's XTCE. + * Header of the implementation of the Intel PIC chip emulation, + * partially ported from reenigne's XTCE. * - * Authors: Andrew Jenner, - * Miran Grca, + * Authors: Andrew Jenner, + * Miran Grca, * - * Copyright 2015-2020 Andrew Jenner. - * Copyright 2016-2020 Miran Grca. + * Copyright 2015-2020 Andrew Jenner. + * Copyright 2016-2020 Miran Grca. */ #ifndef EMU_PIC_H diff --git a/src/include/86box/pit.h b/src/include/86box/pit.h index f6eb4cc6d..292844d4f 100644 --- a/src/include/86box/pit.h +++ b/src/include/86box/pit.h @@ -1,18 +1,19 @@ /* - * 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. * - * Header of the implementation of the Intel 8253/8254 - * Programmable Interval Timer. + * Header of the implementation of the Intel 8253/8254 + * Programmable Interval Timer. * * * - * Author: Miran Grca, - * Copyright 2019,2020 Miran Grca. + * Authors: Miran Grca, + * + * Copyright 2019,2020 Miran Grca. */ #ifndef EMU_PIT_H diff --git a/src/include/86box/pit_fast.h b/src/include/86box/pit_fast.h index 317b8f13e..b306e63ec 100644 --- a/src/include/86box/pit_fast.h +++ b/src/include/86box/pit_fast.h @@ -1,18 +1,19 @@ /* - * 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. * - * Header of the implementation of the Intel 8253/8254 - * Programmable Interval Timer. + * Header of the implementation of the Intel 8253/8254 + * Programmable Interval Timer. * * * - * Author: Miran Grca, - * Copyright 2019,2020 Miran Grca. + * Authors: Miran Grca, + * + * Copyright 2019,2020 Miran Grca. */ #ifndef EMU_PIT_FAST_H diff --git a/src/include/86box/plat_dir.h b/src/include/86box/plat_dir.h index 74caac23f..f6c135001 100644 --- a/src/include/86box/plat_dir.h +++ b/src/include/86box/plat_dir.h @@ -1,17 +1,18 @@ /* - * 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. * - * Definitions for the platform OpenDir module. + * Definitions for the platform OpenDir module. * * * - * Author: Fred N. van Kempen, - * Copyright 2017 Fred N. van Kempen. + * Authors: Fred N. van Kempen, + * + * Copyright 2017 Fred N. van Kempen. */ #ifndef PLAT_DIR_H diff --git a/src/include/86box/plat_dynld.h b/src/include/86box/plat_dynld.h index 6e20f6e27..986e72424 100644 --- a/src/include/86box/plat_dynld.h +++ b/src/include/86box/plat_dynld.h @@ -1,17 +1,18 @@ /* - * 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. * - * Define the Dynamic Module Loader interface. + * Define the Dynamic Module Loader interface. * * * - * Author: Fred N. van Kempen, - * Copyright 2017 Fred N. van Kempen + * Authors: Fred N. van Kempen, + * + * Copyright 2017 Fred N. van Kempen */ #ifndef PLAT_DYNLD_H diff --git a/src/include/86box/port_6x.h b/src/include/86box/port_6x.h index 927a15efa..7eb0c9a56 100644 --- a/src/include/86box/port_6x.h +++ b/src/include/86box/port_6x.h @@ -1,19 +1,19 @@ /* - * 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. * - * Header for the implementation of Port 6x used by various - * machines. + * Header for the implementation of Port 6x used by various + * machines. * * * - * Authors: Miran Grca, + * Authors: Miran Grca, * - * Copyright 2021 Miran Grca. + * Copyright 2021 Miran Grca. */ #ifndef EMU_PORT_6X_H diff --git a/src/include/86box/port_92.h b/src/include/86box/port_92.h index 4d5aa031c..319b2b3ac 100644 --- a/src/include/86box/port_92.h +++ b/src/include/86box/port_92.h @@ -1,19 +1,19 @@ /* - * 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. * - * Header for the implementation of Port 92 used by PS/2 - * machines and 386+ clones. + * Header for the implementation of Port 92 used by PS/2 + * machines and 386+ clones. * * * - * Authors: Miran Grca, + * Authors: Miran Grca, * - * Copyright 2019 Miran Grca. + * Copyright 2019 Miran Grca. */ #ifndef EMU_PORT_92_H diff --git a/src/include/86box/postcard.h b/src/include/86box/postcard.h index 0db2d6187..5ceb64ae3 100644 --- a/src/include/86box/postcard.h +++ b/src/include/86box/postcard.h @@ -1,18 +1,18 @@ /* - * 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. * - * Implementation of a port 80h POST diagnostic card. + * Implementation of a port 80h POST diagnostic card. * * * - * Author: RichardG, + * Authors: RichardG, * - * Copyright 2020 RichardG. + * Copyright 2020 RichardG. */ #ifndef POSTCARD_H diff --git a/src/include/86box/random.h b/src/include/86box/random.h index 089a49c4a..1c3124d53 100644 --- a/src/include/86box/random.h +++ b/src/include/86box/random.h @@ -1,18 +1,19 @@ /* - * 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. * - * A better random number generation, used for floppy weak bits - * and network MAC address generation. + * A better random number generation, used for floppy weak bits + * and network MAC address generation. * * * - * Author: Miran Grca, - * Copyright 2016,2017 Miran Grca. + * Authors: Miran Grca, + * + * Copyright 2016,2017 Miran Grca. */ #ifndef EMU_RANDOM_H diff --git a/src/include/86box/resource.h b/src/include/86box/resource.h index dc54b504f..81c182980 100644 --- a/src/include/86box/resource.h +++ b/src/include/86box/resource.h @@ -1,24 +1,24 @@ /* - * 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. * - * Windows resource defines. + * Windows resource defines. * * * - * Authors: Sarah Walker, - * Miran Grca, - * Fred N. van Kempen, - * David Hrdlička, + * Authors: Sarah Walker, + * Miran Grca, + * Fred N. van Kempen, + * David Hrdlička, * - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 Miran Grca. - * Copyright 2018,2019 David Hrdlička. - * Copyright 2021-2022 Jasmine Iwanek. + * Copyright 2008-2019 Sarah Walker. + * Copyright 2016-2019 Miran Grca. + * Copyright 2018,2019 David Hrdlička. + * Copyright 2021-2022 Jasmine Iwanek. */ #ifndef WIN_RESOURCE_H diff --git a/src/include/86box/rom.h b/src/include/86box/rom.h index 82a1aef5f..e581e0744 100644 --- a/src/include/86box/rom.h +++ b/src/include/86box/rom.h @@ -1,17 +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. * - * Definitions for the ROM image handler. + * Definitions for the ROM image handler. * * * - * Author: Fred N. van Kempen, - * Copyright 2018,2019 Fred N. van Kempen. + * Authors: Fred N. van Kempen, + * Copyright 2018,2019 Fred N. van Kempen. */ #ifndef EMU_ROM_H diff --git a/src/include/86box/scsi.h b/src/include/86box/scsi.h index 93a7fd010..ce641712b 100644 --- a/src/include/86box/scsi.h +++ b/src/include/86box/scsi.h @@ -1,22 +1,22 @@ /* - * 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. * - * SCSI controller handler header. + * SCSI controller handler header. * * * - * Authors: TheCollector1995, - * Miran Grca, - * Fred N. van Kempen, + * Authors: TheCollector1995, + * Miran Grca, + * Fred N. van Kempen, * - * Copyright 2016-2018 TheCollector1995. - * Copyright 2016-2018 Miran Grca. - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2016-2018 TheCollector1995. + * Copyright 2016-2018 Miran Grca. + * Copyright 2017,2018 Fred N. van Kempen. */ #ifndef EMU_SCSI_H #define EMU_SCSI_H diff --git a/src/include/86box/scsi_buslogic.h b/src/include/86box/scsi_buslogic.h index be865ec57..021c4fa97 100644 --- a/src/include/86box/scsi_buslogic.h +++ b/src/include/86box/scsi_buslogic.h @@ -1,19 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Emulation of BusLogic BT-542B ISA and BT-958D PCI SCSI - * controllers. + * Emulation of BusLogic BT-542B ISA and BT-958D PCI SCSI + * controllers. * * * - * Authors: TheCollector1995, - * Miran Grca, - * Fred N. van Kempen, - * Copyright 2016-2018 Miran Grca. - * Copyright 2017,2018 Fred N. van Kempen. + * Authors: TheCollector1995, + * Miran Grca, + * Fred N. van Kempen, + * + * Copyright 2016-2018 Miran Grca. + * Copyright 2017,2018 Fred N. van Kempen. */ #ifndef SCSI_BUSLOGIC_H diff --git a/src/include/86box/scsi_cdrom.h b/src/include/86box/scsi_cdrom.h index e991ccc36..97ebb39bc 100644 --- a/src/include/86box/scsi_cdrom.h +++ b/src/include/86box/scsi_cdrom.h @@ -1,19 +1,19 @@ /* - * 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. * - * Implementation of the CD-ROM drive with SCSI(-like) - * commands, for both ATAPI and SCSI usage. + * Implementation of the CD-ROM drive with SCSI(-like) + * commands, for both ATAPI and SCSI usage. * * * - * Author: Miran Grca, + * Authors: Miran Grca, * - * Copyright 2018,2019 Miran Grca. + * Copyright 2018,2019 Miran Grca. */ #ifndef EMU_SCSI_CDROM_H diff --git a/src/include/86box/scsi_device.h b/src/include/86box/scsi_device.h index 650215cb5..70cfef69a 100644 --- a/src/include/86box/scsi_device.h +++ b/src/include/86box/scsi_device.h @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Definitions for the generic SCSI device command handler. + * Definitions for the generic SCSI device command handler. * * * - * Authors: Miran Grca, - * Fred N. van Kempen, + * Authors: Miran Grca, + * Fred N. van Kempen, * - * Copyright 2016-2019 Miran Grca. - * Copyright 2017-2019 Fred N. van Kempen. + * Copyright 2016-2019 Miran Grca. + * Copyright 2017-2019 Fred N. van Kempen. */ #ifndef SCSI_DEVICE_H diff --git a/src/include/86box/scsi_disk.h b/src/include/86box/scsi_disk.h index 94171e7ac..0ac78f8b5 100644 --- a/src/include/86box/scsi_disk.h +++ b/src/include/86box/scsi_disk.h @@ -1,15 +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. + * 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. * - * Emulation of SCSI fixed and removable disks. + * Emulation of SCSI fixed and removable disks. * * * - * Author: Miran Grca, - * Copyright 2017,2018 Miran Grca. + * Authors: Miran Grca, + * + * Copyright 2017,2018 Miran Grca. */ #ifndef SCSI_DISK_H diff --git a/src/include/86box/scsi_ncr5380.h b/src/include/86box/scsi_ncr5380.h index 045e6bbe7..314f9d082 100644 --- a/src/include/86box/scsi_ncr5380.h +++ b/src/include/86box/scsi_ncr5380.h @@ -1,24 +1,24 @@ /* - * 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. * - * Implementation of the NCR 5380 series of SCSI Host Adapters - * made by NCR. These controllers were designed for - * the ISA bus. + * Implementation of the NCR 5380 series of SCSI Host Adapters + * made by NCR. These controllers were designed for + * the ISA bus. * * * - * Authors: Sarah Walker, - * TheCollector1995, - * Fred N. van Kempen, + * Authors: Sarah Walker, + * TheCollector1995, + * Fred N. van Kempen, * - * Copyright 2017-2018 Sarah Walker. - * Copyright 2017-2018 TheCollector1995. - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Sarah Walker. + * Copyright 2017-2018 TheCollector1995. + * Copyright 2017,2018 Fred N. van Kempen. */ #ifndef SCSI_NCR5380_H diff --git a/src/include/86box/scsi_ncr53c8xx.h b/src/include/86box/scsi_ncr53c8xx.h index 37c5a72bf..e495925b0 100644 --- a/src/include/86box/scsi_ncr53c8xx.h +++ b/src/include/86box/scsi_ncr53c8xx.h @@ -1,25 +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. + * 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. * - * Implementation of the NCR 53C810 and 53C875 SCSI Host - * Adapters made by NCR and later Symbios and LSI. These - * controllers were designed for the PCI bus. + * Implementation of the NCR 53C810 and 53C875 SCSI Host + * Adapters made by NCR and later Symbios and LSI. These + * controllers were designed for the PCI bus. * * * - * Authors: TheCollector1995, - * Miran Grca, - * Paul Brook (QEMU), - * Artyom Tarasenko (QEMU), + * Authors: TheCollector1995, + * Miran Grca, + * Paul Brook (QEMU), + * Artyom Tarasenko (QEMU), * - * Copyright 2006-2018 Paul Brook. - * Copyright 2009-2018 Artyom Tarasenko. - * Copyright 2017,2018 Miran Grca. + * Copyright 2006-2018 Paul Brook. + * Copyright 2009-2018 Artyom Tarasenko. + * Copyright 2017,2018 Miran Grca. */ #ifndef SCSI_NCR53C8XX_H diff --git a/src/include/86box/scsi_pcscsi.h b/src/include/86box/scsi_pcscsi.h index d0b5baf04..3f56fb19d 100644 --- a/src/include/86box/scsi_pcscsi.h +++ b/src/include/86box/scsi_pcscsi.h @@ -1,25 +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. + * 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. * - * Implementation of the AMD PCscsi and Tekram DC-390 SCSI - * controllers using the NCR 53c9x series of chips. + * Implementation of the AMD PCscsi and Tekram DC-390 SCSI + * controllers using the NCR 53c9x series of chips. * * * * - * Authors: Fabrice Bellard (QEMU) - * Herve Poussineau (QEMU) - * TheCollector1995, - * Miran Grca, + * Authors: Fabrice Bellard (QEMU) + * Herve Poussineau (QEMU) + * TheCollector1995, + * Miran Grca, * - * Copyright 2005-2018 Fabrice Bellard. - * Copyright 2012-2018 Herve Poussineau. - * Copyright 2017,2018 Miran Grca. + * Copyright 2005-2018 Fabrice Bellard. + * Copyright 2012-2018 Herve Poussineau. + * Copyright 2017,2018 Miran Grca. */ #ifndef SCSI_PCSCSI_H diff --git a/src/include/86box/scsi_spock.h b/src/include/86box/scsi_spock.h index 3dae005db..6dfc87011 100644 --- a/src/include/86box/scsi_spock.h +++ b/src/include/86box/scsi_spock.h @@ -1,21 +1,21 @@ /* - * 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. * - * Implementation of the IBM PS/2 SCSI controller with - * cache for MCA only. + * Implementation of the IBM PS/2 SCSI controller with + * cache for MCA only. * * * - * Authors: Sarah Walker, - * TheCollector1995, + * Authors: Sarah Walker, + * TheCollector1995, * - * Copyright 2020 Sarah Walker. - * Copyright 2020 TheCollector1995. + * Copyright 2020 Sarah Walker. + * Copyright 2020 TheCollector1995. */ #ifndef SCSI_SPOCK_H diff --git a/src/include/86box/scsi_x54x.h b/src/include/86box/scsi_x54x.h index 68a31e651..e32a9369e 100644 --- a/src/include/86box/scsi_x54x.h +++ b/src/include/86box/scsi_x54x.h @@ -1,24 +1,24 @@ /* - * 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. * - * Header of the code common to the AHA-154x series of SCSI - * Host Adapters made by Adaptec, Inc. and the BusLogic series - * of SCSI Host Adapters made by Mylex. - * These controllers were designed for various buses. + * Header of the code common to the AHA-154x series of SCSI + * Host Adapters made by Adaptec, Inc. and the BusLogic series + * of SCSI Host Adapters made by Mylex. + * These controllers were designed for various buses. * * * - * Authors: TheCollector1995, - * Miran Grca, - * Fred N. van Kempen, + * Authors: TheCollector1995, + * Miran Grca, + * Fred N. van Kempen, * - * Copyright 2016-2018 Miran Grca. - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2016-2018 Miran Grca. + * Copyright 2017,2018 Fred N. van Kempen. */ #ifndef SCSI_X54X_H diff --git a/src/include/86box/smram.h b/src/include/86box/smram.h index 07537a7f6..84d1cbe8d 100644 --- a/src/include/86box/smram.h +++ b/src/include/86box/smram.h @@ -1,18 +1,18 @@ /* - * 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. * - * Definitions for the SMRAM interface. + * Definitions for the SMRAM interface. * * * - * Authors: Miran Grca, + * Authors: Miran Grca, * - * Copyright 2016-2020 Miran Grca. + * Copyright 2016-2020 Miran Grca. */ #ifndef EMU_SMRAM_H diff --git a/src/include/86box/snd_ac97.h b/src/include/86box/snd_ac97.h index 600dd84d8..14d31dc40 100644 --- a/src/include/86box/snd_ac97.h +++ b/src/include/86box/snd_ac97.h @@ -1,18 +1,18 @@ /* - * 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. * - * Definitions for AC'97 audio emulation. + * Definitions for AC'97 audio emulation. * * * - * Authors: RichardG, + * Authors: RichardG, * - * Copyright 2021 RichardG. + * Copyright 2021 RichardG. */ #ifndef SOUND_AC97_H #define SOUND_AC97_H diff --git a/src/include/86box/snd_ad1848.h b/src/include/86box/snd_ad1848.h index bdf5022e5..d954eaccb 100644 --- a/src/include/86box/snd_ad1848.h +++ b/src/include/86box/snd_ad1848.h @@ -1,22 +1,22 @@ /* - * 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. * - * Definitions for AD1848 / CS4248 / CS4231 (Windows Sound System) codec emulation. + * Definitions for AD1848 / CS4248 / CS4231 (Windows Sound System) codec emulation. * * * - * Authors: Sarah Walker, - * TheCollector1995, - * RichardG, + * Authors: Sarah Walker, + * TheCollector1995, + * RichardG, * - * Copyright 2008-2020 Sarah Walker. - * Copyright 2018-2020 TheCollector1995. - * Copyright 2021 RichardG. + * Copyright 2008-2020 Sarah Walker. + * Copyright 2018-2020 TheCollector1995. + * Copyright 2021 RichardG. */ #ifndef SOUND_AD1848_H diff --git a/src/include/86box/snd_mpu401.h b/src/include/86box/snd_mpu401.h index 96143b251..2fcf31d96 100644 --- a/src/include/86box/snd_mpu401.h +++ b/src/include/86box/snd_mpu401.h @@ -1,23 +1,24 @@ /* - * 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. * - * Roland MPU-401 emulation. + * Roland MPU-401 emulation. * * * - * Author: Sarah Walker, - * DOSBox Team, - * Miran Grca, - * TheCollector1995, - * Copyright 2008-2020 Sarah Walker. - * Copyright 2008-2020 DOSBox Team. - * Copyright 2016-2020 Miran Grca. - * Copyright 2016-2020 TheCollector1995. + * Authors: Sarah Walker, + * DOSBox Team, + * Miran Grca, + * TheCollector1995, + * + * Copyright 2008-2020 Sarah Walker. + * Copyright 2008-2020 DOSBox Team. + * Copyright 2016-2020 Miran Grca. + * Copyright 2016-2020 TheCollector1995. */ #ifndef SOUND_MPU401_H diff --git a/src/include/86box/snd_opl.h b/src/include/86box/snd_opl.h index 5caccf8fc..b4f26543d 100644 --- a/src/include/86box/snd_opl.h +++ b/src/include/86box/snd_opl.h @@ -1,18 +1,18 @@ /* - * 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. * - * Definitions for the OPL interface. + * Definitions for the OPL interface. * - * Authors: Fred N. van Kempen, - * Miran Grca, + * Authors: Fred N. van Kempen, + * Miran Grca, * - * Copyright 2017-2020 Fred N. van Kempen. - * Copyright 2016-2020 Miran Grca. + * Copyright 2017-2020 Fred N. van Kempen. + * Copyright 2016-2020 Miran Grca. */ #ifndef SOUND_OPL_H #define SOUND_OPL_H diff --git a/src/include/86box/snd_opl_nuked.h b/src/include/86box/snd_opl_nuked.h index 635863407..f82e85b0e 100644 --- a/src/include/86box/snd_opl_nuked.h +++ b/src/include/86box/snd_opl_nuked.h @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Definitions for the NukedOPL3 driver. + * Definitions for the NukedOPL3 driver. * - * Version: @(#)snd_opl_nuked.h 1.0.5 2020/07/16 + * Version: @(#)snd_opl_nuked.h 1.0.5 2020/07/16 * - * Authors: Fred N. van Kempen, - * Miran Grca, + * Authors: Fred N. van Kempen, + * Miran Grca, * - * Copyright 2017-2020 Fred N. van Kempen. - * Copyright 2016-2019 Miran Grca. + * Copyright 2017-2020 Fred N. van Kempen. + * Copyright 2016-2019 Miran Grca. */ #ifndef SOUND_OPL_NUKED_H diff --git a/src/include/86box/snd_speaker.h b/src/include/86box/snd_speaker.h index 922603d98..433accea8 100644 --- a/src/include/86box/snd_speaker.h +++ b/src/include/86box/snd_speaker.h @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Header of the emulation of the PC speaker. + * Header of the emulation of the PC speaker. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 Miran Grca. + * Copyright 2008-2019 Sarah Walker. + * Copyright 2016-2019 Miran Grca. */ #ifndef SOUND_SPEAKER_H diff --git a/src/include/86box/ui.h b/src/include/86box/ui.h index 5eb15a08d..58168ceb8 100644 --- a/src/include/86box/ui.h +++ b/src/include/86box/ui.h @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Define the various UI functions. + * Define the various UI functions. * * * - * Authors: Miran Grca, - * Fred N. van Kempen, + * Authors: Miran Grca, + * Fred N. van Kempen, * - * Copyright 2016-2019 Miran Grca. - * Copyright 2017-2019 Fred N. van Kempen. + * Copyright 2016-2019 Miran Grca. + * Copyright 2017-2019 Fred N. van Kempen. */ #ifndef EMU_UI_H #define EMU_UI_H diff --git a/src/include/86box/usb.h b/src/include/86box/usb.h index 893a9f501..d0b169b6c 100644 --- a/src/include/86box/usb.h +++ b/src/include/86box/usb.h @@ -1,18 +1,18 @@ /* - * 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. * - * Definitions for the Distributed DMA emulation. + * Definitions for the Distributed DMA emulation. * * * - * Authors: Miran Grca, + * Authors: Miran Grca, * - * Copyright 2020 Miran Grca. + * Copyright 2020 Miran Grca. */ #ifndef USB_H diff --git a/src/include/86box/vid_8514a.h b/src/include/86box/vid_8514a.h index be6c5d177..6463d0214 100644 --- a/src/include/86box/vid_8514a.h +++ b/src/include/86box/vid_8514a.h @@ -1,19 +1,19 @@ /* - * 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. * - * Emulation of the 8514/A card from IBM for the MCA bus and - * generic ISA bus clones without vendor extensions. + * Emulation of the 8514/A card from IBM for the MCA bus and + * generic ISA bus clones without vendor extensions. * * * - * Authors: TheCollector1995 + * Authors: TheCollector1995 * - * Copyright 2022 TheCollector1995. + * Copyright 2022 TheCollector1995. */ #ifndef VIDEO_8514A_H diff --git a/src/include/86box/vid_cga.h b/src/include/86box/vid_cga.h index 4421840d6..23c7e7b4a 100644 --- a/src/include/86box/vid_cga.h +++ b/src/include/86box/vid_cga.h @@ -1,19 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Emulation of the old and new IBM CGA graphics cards. + * Emulation of the old and new IBM CGA graphics cards. * * * - * Author: Sarah Walker, - * Miran Grca, - * Copyright 2008-2018 Sarah Walker. - * Copyright 2016-2018 Miran Grca. + * Authors: Sarah Walker, + * Miran Grca, + * + * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. */ #ifndef VIDEO_CGA_H diff --git a/src/include/86box/vid_cga_comp.h b/src/include/86box/vid_cga_comp.h index f4dd58b40..3c7916034 100644 --- a/src/include/86box/vid_cga_comp.h +++ b/src/include/86box/vid_cga_comp.h @@ -1,20 +1,21 @@ /* - * 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. * - * IBM CGA composite filter, borrowed from reenigne's DOSBox - * patch and ported to C. + * IBM CGA composite filter, borrowed from reenigne's DOSBox + * patch and ported to C. * * * - * Author: reenigne, - * Miran Grca, - * Copyright 2015-2018 reenigne. - * Copyright 2015-2018 Miran Grca. + * Authors: reenigne, + * Miran Grca, + * + * Copyright 2015-2018 reenigne. + * Copyright 2015-2018 Miran Grca. */ #ifndef VIDEO_CGA_COMP_H diff --git a/src/include/86box/vid_ddc.h b/src/include/86box/vid_ddc.h index b64759bac..0846cc32f 100644 --- a/src/include/86box/vid_ddc.h +++ b/src/include/86box/vid_ddc.h @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * DDC monitor emulation definitions. + * DDC monitor emulation definitions. * * * - * Authors: Sarah Walker, - * RichardG, + * Authors: Sarah Walker, + * RichardG, * - * Copyright 2008-2020 Sarah Walker. - * Copyright 2020 RichardG. + * Copyright 2008-2020 Sarah Walker. + * Copyright 2020 RichardG. */ #ifndef EMU_VID_DDC_H diff --git a/src/include/86box/vid_ega.h b/src/include/86box/vid_ega.h index 3b4797bf8..f49ad55b4 100644 --- a/src/include/86box/vid_ega.h +++ b/src/include/86box/vid_ega.h @@ -1,21 +1,21 @@ /* - * 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. * - * Emulation of the EGA and Chips & Technologies SuperEGA - * graphics cards. + * Emulation of the EGA and Chips & Technologies SuperEGA + * graphics cards. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2020 Sarah Walker. - * Copyright 2016-2020 Miran Grca. + * Copyright 2008-2020 Sarah Walker. + * Copyright 2016-2020 Miran Grca. */ #ifndef VIDEO_EGA_H diff --git a/src/include/86box/vid_hercules.h b/src/include/86box/vid_hercules.h index 109d721ae..949e45417 100644 --- a/src/include/86box/vid_hercules.h +++ b/src/include/86box/vid_hercules.h @@ -1,20 +1,22 @@ /* - * 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. * - * Emulation of the Hercules graphics cards. + * Emulation of the Hercules graphics cards. * * * - * Author: Sarah Walker, - * Miran Grca, - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 Miran Grca. - * Copyright 2021 Jasmine Iwanek. + * Authors: Sarah Walker, + * Miran Grca, + * Jasmine Iwanek, + * + * Copyright 2008-2019 Sarah Walker. + * Copyright 2016-2019 Miran Grca. + * Copyright 2021 Jasmine Iwanek. */ #ifndef VIDEO_HERCULES_H diff --git a/src/include/86box/vid_nga.h b/src/include/86box/vid_nga.h index 8dc0ad881..d91d852d7 100644 --- a/src/include/86box/vid_nga.h +++ b/src/include/86box/vid_nga.h @@ -1,25 +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. + * 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. * - * Emulation of the Olivetti OGC 8-bit ISA (GO708) and - * M21/M24/M28 16-bit bus (GO317/318/380/709) video cards. + * Emulation of the Olivetti OGC 8-bit ISA (GO708) and + * M21/M24/M28 16-bit bus (GO317/318/380/709) video cards. * * * - * Authors: Sarah Walker, - * Miran Grca, - * Fred N. van Kempen, - * EngiNerd, + * Authors: Sarah Walker, + * Miran Grca, + * Fred N. van Kempen, + * EngiNerd, * - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 Miran Grca. - * Copyright 2017-2019 Fred N. van Kempen. - * Copyright 2020 EngiNerd. + * Copyright 2008-2019 Sarah Walker. + * Copyright 2016-2019 Miran Grca. + * Copyright 2017-2019 Fred N. van Kempen. + * Copyright 2020 EngiNerd. */ #ifndef VIDEO_NGA_H diff --git a/src/include/86box/vid_ogc.h b/src/include/86box/vid_ogc.h index 6e6447694..45eedf8cf 100644 --- a/src/include/86box/vid_ogc.h +++ b/src/include/86box/vid_ogc.h @@ -1,25 +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. + * 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. * - * Emulation of the Olivetti OGC 8-bit ISA (GO708) and - * M21/M24/M28 16-bit bus (GO317/318/380/709) video cards. + * Emulation of the Olivetti OGC 8-bit ISA (GO708) and + * M21/M24/M28 16-bit bus (GO317/318/380/709) video cards. * * * - * Authors: Sarah Walker, - * Miran Grca, - * Fred N. van Kempen, - * EngiNerd, + * Authors: Sarah Walker, + * Miran Grca, + * Fred N. van Kempen, + * EngiNerd, * - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 Miran Grca. - * Copyright 2017-2019 Fred N. van Kempen. - * Copyright 2020 EngiNerd. + * Copyright 2008-2019 Sarah Walker. + * Copyright 2016-2019 Miran Grca. + * Copyright 2017-2019 Fred N. van Kempen. + * Copyright 2020 EngiNerd. */ #ifndef VIDEO_OGC_H diff --git a/src/include/86box/vid_pgc.h b/src/include/86box/vid_pgc.h index 3960598ab..12450c0d1 100644 --- a/src/include/86box/vid_pgc.h +++ b/src/include/86box/vid_pgc.h @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Definitions for the PGC driver. + * Definitions for the PGC driver. * * * - * Authors: Fred N. van Kempen, - * John Elliott, + * Authors: Fred N. van Kempen, + * John Elliott, * - * Copyright 2019 Fred N. van Kempen. - * Copyright 2019 John Elliott. + * Copyright 2019 Fred N. van Kempen. + * Copyright 2019 John Elliott. */ #ifndef VID_PGC_H #define VID_PGC_H diff --git a/src/include/86box/vid_pgc_palette.h b/src/include/86box/vid_pgc_palette.h index ffcf6a9f0..a242e0cbd 100644 --- a/src/include/86box/vid_pgc_palette.h +++ b/src/include/86box/vid_pgc_palette.h @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Palette definitions for the PGC core. + * Palette definitions for the PGC core. * * * - * Authors: Fred N. van Kempen, - * John Elliott, + * Authors: Fred N. van Kempen, + * John Elliott, * - * Copyright 2019 Fred N. van Kempen. - * Copyright 2019 John Elliott. + * Copyright 2019 Fred N. van Kempen. + * Copyright 2019 John Elliott. */ #ifndef VID_PGC_PALETTE_H diff --git a/src/include/86box/vid_svga_render.h b/src/include/86box/vid_svga_render.h index 04bd740b1..a8369ca42 100644 --- a/src/include/86box/vid_svga_render.h +++ b/src/include/86box/vid_svga_render.h @@ -1,19 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * SVGA renderers. + * SVGA renderers. * * * - * Author: Sarah Walker, - * Miran Grca, - * Copyright 2008-2018 Sarah Walker. - * Copyright 2016-2018 Miran Grca. + * Authors: Sarah Walker, + * Miran Grca, + * + * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. */ #ifndef VIDEO_SVGA_RENDER_H diff --git a/src/include/86box/vid_vga.h b/src/include/86box/vid_vga.h index 44cc6b7c3..9d9972be0 100644 --- a/src/include/86box/vid_vga.h +++ b/src/include/86box/vid_vga.h @@ -1,20 +1,22 @@ /* - * 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. * - * Emulation of the IBM MDA + VGA graphics cards. + * Emulation of the IBM MDA + VGA graphics cards. * * * - * Author: Sarah Walker, - * Miran Grca, - * Copyright 2008-2018 Sarah Walker. - * Copyright 2016-2018 Miran Grca. - * Copyright 2021 Jasmine Iwanek. + * Authors: Sarah Walker, + * Miran Grca, + * Jasmine Iwanek, + * + * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. + * Copyright 2021 Jasmine Iwanek. */ #ifndef VIDEO_VGA_H diff --git a/src/include/86box/vid_voodoo_banshee.h b/src/include/86box/vid_voodoo_banshee.h index 4d966ea3e..4cd26dc2a 100644 --- a/src/include/86box/vid_voodoo_banshee.h +++ b/src/include/86box/vid_voodoo_banshee.h @@ -1,18 +1,18 @@ /* - * 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. * - * Voodoo Banshee and 3 specific emulation. + * Voodoo Banshee and 3 specific emulation. * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * - * Copyright 2008-2020 Sarah Walker. + * Copyright 2008-2020 Sarah Walker. */ #ifndef VIDEO_VOODOO_BANSHEE_H diff --git a/src/include/86box/vid_voodoo_banshee_blitter.h b/src/include/86box/vid_voodoo_banshee_blitter.h index 9f7a1825e..ec6e214d5 100644 --- a/src/include/86box/vid_voodoo_banshee_blitter.h +++ b/src/include/86box/vid_voodoo_banshee_blitter.h @@ -1,18 +1,18 @@ /* - * 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. * - * Voodoo Banshee and 3 specific emulation. + * Voodoo Banshee and 3 specific emulation. * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * - * Copyright 2008-2020 Sarah Walker. + * Copyright 2008-2020 Sarah Walker. */ #ifndef VIDEO_VOODOO_BANSHEE_BLITTER_H diff --git a/src/include/86box/vid_voodoo_common.h b/src/include/86box/vid_voodoo_common.h index e6d4ad5e4..6dee9ca8f 100644 --- a/src/include/86box/vid_voodoo_common.h +++ b/src/include/86box/vid_voodoo_common.h @@ -1,19 +1,19 @@ /* - * 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. * - * Voodoo Graphics, 2, Banshee, 3 emulation. + * Voodoo Graphics, 2, Banshee, 3 emulation. * * * - * Authors: Sarah Walker, - * leilei + * Authors: Sarah Walker, + * leilei * - * Copyright 2008-2020 Sarah Walker. + * Copyright 2008-2020 Sarah Walker. */ #ifndef VIDEO_VOODOO_COMMON_H diff --git a/src/include/86box/vid_voodoo_display.h b/src/include/86box/vid_voodoo_display.h index e415f7824..53d4076e7 100644 --- a/src/include/86box/vid_voodoo_display.h +++ b/src/include/86box/vid_voodoo_display.h @@ -1,19 +1,19 @@ /* - * 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. * - * Voodoo Graphics, 2, Banshee, 3 emulation. + * Voodoo Graphics, 2, Banshee, 3 emulation. * * * - * Authors: Sarah Walker, - * leilei + * Authors: Sarah Walker, + * leilei * - * Copyright 2008-2020 Sarah Walker. + * Copyright 2008-2020 Sarah Walker. */ #ifndef VIDEO_VOODOO_DISPLAY_H diff --git a/src/include/86box/vid_voodoo_dither.h b/src/include/86box/vid_voodoo_dither.h index 2d674c5b4..dc87b293e 100644 --- a/src/include/86box/vid_voodoo_dither.h +++ b/src/include/86box/vid_voodoo_dither.h @@ -1,19 +1,19 @@ /* - * 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. * - * Voodoo Graphics and 2 specific emulation. + * Voodoo Graphics and 2 specific emulation. * * * - * Authors: Sarah Walker, - * leilei + * Authors: Sarah Walker, + * leilei * - * Copyright 2008-2020 Sarah Walker. + * Copyright 2008-2020 Sarah Walker. */ #ifndef VIDEO_VOODOO_DITHER_H diff --git a/src/include/86box/vid_voodoo_fb.h b/src/include/86box/vid_voodoo_fb.h index 374474cc5..b954048ff 100644 --- a/src/include/86box/vid_voodoo_fb.h +++ b/src/include/86box/vid_voodoo_fb.h @@ -1,19 +1,19 @@ /* - * 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. * - * Voodoo Graphics, 2, Banshee, 3 emulation. + * Voodoo Graphics, 2, Banshee, 3 emulation. * * * - * Authors: Sarah Walker, - * leilei + * Authors: Sarah Walker, + * leilei * - * Copyright 2008-2020 Sarah Walker. + * Copyright 2008-2020 Sarah Walker. */ #ifndef VIDEO_VOODOO_FB_H diff --git a/src/include/86box/vid_voodoo_fifo.h b/src/include/86box/vid_voodoo_fifo.h index 86956cc5a..088be1dae 100644 --- a/src/include/86box/vid_voodoo_fifo.h +++ b/src/include/86box/vid_voodoo_fifo.h @@ -1,19 +1,19 @@ /* - * 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. * - * Voodoo Graphics, 2, Banshee, 3 emulation. + * Voodoo Graphics, 2, Banshee, 3 emulation. * * * - * Authors: Sarah Walker, - * leilei + * Authors: Sarah Walker, + * leilei * - * Copyright 2008-2020 Sarah Walker. + * Copyright 2008-2020 Sarah Walker. */ #ifndef VIDEO_VOODOO_FIFO_H diff --git a/src/include/86box/vid_voodoo_reg.h b/src/include/86box/vid_voodoo_reg.h index 13f7ae932..1f1160804 100644 --- a/src/include/86box/vid_voodoo_reg.h +++ b/src/include/86box/vid_voodoo_reg.h @@ -1,19 +1,19 @@ /* - * 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. * - * Voodoo Graphics, 2, Banshee, 3 emulation. + * Voodoo Graphics, 2, Banshee, 3 emulation. * * * - * Authors: Sarah Walker, - * leilei + * Authors: Sarah Walker, + * leilei * - * Copyright 2008-2020 Sarah Walker. + * Copyright 2008-2020 Sarah Walker. */ #ifndef VIDEO_VOODOO_REG_H diff --git a/src/include/86box/vid_voodoo_setup.h b/src/include/86box/vid_voodoo_setup.h index be94f9533..8ff892f71 100644 --- a/src/include/86box/vid_voodoo_setup.h +++ b/src/include/86box/vid_voodoo_setup.h @@ -1,19 +1,19 @@ /* - * 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. * - * Voodoo Graphics, 2, Banshee, 3 emulation. + * Voodoo Graphics, 2, Banshee, 3 emulation. * * * - * Authors: Sarah Walker, - * leilei + * Authors: Sarah Walker, + * leilei * - * Copyright 2008-2020 Sarah Walker. + * Copyright 2008-2020 Sarah Walker. */ #ifndef VIDEO_VOODOO_SETUP_H diff --git a/src/include/86box/vid_voodoo_texture.h b/src/include/86box/vid_voodoo_texture.h index 2e0af97a3..a0bd4db44 100644 --- a/src/include/86box/vid_voodoo_texture.h +++ b/src/include/86box/vid_voodoo_texture.h @@ -1,19 +1,19 @@ /* - * 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. * - * Voodoo Graphics, 2, Banshee, 3 emulation. + * Voodoo Graphics, 2, Banshee, 3 emulation. * * * - * Authors: Sarah Walker, - * leilei + * Authors: Sarah Walker, + * leilei * - * Copyright 2008-2020 Sarah Walker. + * Copyright 2008-2020 Sarah Walker. */ #ifndef VIDEO_VOODOO_TEXTURE_H diff --git a/src/include/86box/vnc.h b/src/include/86box/vnc.h index 7b82ce5d1..a63c53403 100644 --- a/src/include/86box/vnc.h +++ b/src/include/86box/vnc.h @@ -1,18 +1,18 @@ /* - * 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. * - * Definitions for the VNC renderer. + * Definitions for the VNC renderer. * * * - * Author: Fred N. van Kempen, + * Authors: Fred N. van Kempen, * - * Copyright 2017 Fred N. van Kempen. + * Copyright 2017 Fred N. van Kempen. */ #ifndef EMU_VNC_H diff --git a/src/include/86box/win.h b/src/include/86box/win.h index 3174e24b2..c72b1e5c4 100644 --- a/src/include/86box/win.h +++ b/src/include/86box/win.h @@ -1,23 +1,23 @@ /* - * 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. * - * Platform support defintions for Win32. + * Platform support defintions for Win32. * * * - * Authors: Sarah Walker, - * Miran Grca, - * Fred N. van Kempen, + * Authors: Sarah Walker, + * Miran Grca, + * Fred N. van Kempen, * - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 Miran Grca. - * Copyright 2017-2019 Fred N. van Kempen. - * Copyright 2021 Laci bá' + * Copyright 2008-2019 Sarah Walker. + * Copyright 2016-2019 Miran Grca. + * Copyright 2017-2019 Fred N. van Kempen. + * Copyright 2021 Laci bá' */ #ifndef PLAT_WIN_H diff --git a/src/include/86box/win_opengl.h b/src/include/86box/win_opengl.h index 6192a68c1..80d3695ca 100644 --- a/src/include/86box/win_opengl.h +++ b/src/include/86box/win_opengl.h @@ -1,16 +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. + * 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. * - * Header file for OpenGL rendering module + * Header file for OpenGL rendering module * - * Authors: Teemu Korhonen + * Authors: Teemu Korhonen * - * Copyright 2021 Teemu Korhonen + * Copyright 2021 Teemu Korhonen */ #ifndef WIN_OPENGL_H diff --git a/src/include/86box/win_opengl_glslp.h b/src/include/86box/win_opengl_glslp.h index caf86a04f..6586cd526 100644 --- a/src/include/86box/win_opengl_glslp.h +++ b/src/include/86box/win_opengl_glslp.h @@ -1,16 +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. + * 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. * - * Header file for shader file parser. + * Header file for shader file parser. * - * Authors: Teemu Korhonen + * Authors: Teemu Korhonen * - * Copyright 2021 Teemu Korhonen + * Copyright 2021 Teemu Korhonen */ #ifndef WIN_OPENGL_GLSLP_H diff --git a/src/include/86box/win_sdl.h b/src/include/86box/win_sdl.h index 52902034d..72357aa9a 100644 --- a/src/include/86box/win_sdl.h +++ b/src/include/86box/win_sdl.h @@ -1,38 +1,38 @@ /* - * 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. * - * Definitions for the libSDL2 rendering module. + * Definitions for the libSDL2 rendering module. * * * - * Authors: Fred N. van Kempen, - * Michael Drüing, + * Authors: Fred N. van Kempen, + * Michael Drüing, * - * Copyright 2018,2019 Fred N. van Kempen. - * Copyright 2018,2019 Michael Drüing. + * Copyright 2018,2019 Fred N. van Kempen. + * Copyright 2018,2019 Michael Drüing. * - * Redistribution and use in source and binary forms, with - * or without modification, are permitted provided that the - * following conditions are met: + * Redistribution and use in source and binary forms, with + * or without modification, are permitted provided that the + * following conditions are met: * - * 1. Redistributions of source code must retain the entire - * above notice, this list of conditions and the following - * disclaimer. + * 1. Redistributions of source code must retain the entire + * above notice, this list of conditions and the following + * disclaimer. * - * 2. Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the - * following disclaimer in the documentation and/or other - * materials provided with the distribution. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other + * materials provided with the distribution. * - * 3. Neither the name of the copyright holder nor the names - * of its contributors may be used to endorse or promote - * products derived from this software without specific - * prior written permission. + * 3. Neither the name of the copyright holder nor the names + * of its contributors may be used to endorse or promote + * products derived from this software without specific + * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT diff --git a/src/include/86box/zip.h b/src/include/86box/zip.h index 910436410..6bff76e36 100644 --- a/src/include/86box/zip.h +++ b/src/include/86box/zip.h @@ -1,19 +1,19 @@ /* - * 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. * - * Implementation of the Iomega ZIP drive with SCSI(-like) - * commands, for both ATAPI and SCSI usage. + * Implementation of the Iomega ZIP drive with SCSI(-like) + * commands, for both ATAPI and SCSI usage. * * * - * Author: Miran Grca, + * Authors: Miran Grca, * - * Copyright 2018,2019 Miran Grca. + * Copyright 2018,2019 Miran Grca. */ #ifndef EMU_ZIP_H diff --git a/src/include/fdi2raw.h b/src/include/fdi2raw.h index 7a53d9d17..cfc1f84c3 100644 --- a/src/include/fdi2raw.h +++ b/src/include/fdi2raw.h @@ -1,22 +1,22 @@ /* - * 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. * - * Definitions for the FDI floppy file format. + * Definitions for the FDI floppy file format. * * * - * Authors: Toni Wilen, - * and Vincent Joguin, - * Thomas Harte, + * Authors: Toni Wilen, + * and Vincent Joguin, + * Thomas Harte, * - * Copyright 2001-2004 Toni Wilen. - * Copyright 2001-2004 Vincent Joguin. - * Copyright 2001 Thomas Harte. + * Copyright 2001-2004 Toni Wilen. + * Copyright 2001-2004 Vincent Joguin. + * Copyright 2001 Thomas Harte. */ #ifndef __FDI2RAW_H #define __FDI2RAW_H diff --git a/src/include/minitrace/minitrace.h b/src/include/minitrace/minitrace.h index 2047eedb7..8184f5873 100644 --- a/src/include/minitrace/minitrace.h +++ b/src/include/minitrace/minitrace.h @@ -71,13 +71,13 @@ const char *mtr_pool_string(const char *str); // Commented-out types will be supported in the future. typedef enum { - MTR_ARG_TYPE_NONE = 0, - MTR_ARG_TYPE_INT = 1, // I - // MTR_ARG_TYPE_FLOAT = 2, // TODO - // MTR_ARG_TYPE_DOUBLE = 3, // TODO - MTR_ARG_TYPE_STRING_CONST = 8, // C - MTR_ARG_TYPE_STRING_COPY = 9, - // MTR_ARG_TYPE_JSON_COPY = 10, + MTR_ARG_TYPE_NONE = 0, + MTR_ARG_TYPE_INT = 1, // I + // MTR_ARG_TYPE_FLOAT = 2, // TODO + // MTR_ARG_TYPE_DOUBLE = 3, // TODO + MTR_ARG_TYPE_STRING_CONST = 8, // C + MTR_ARG_TYPE_STRING_COPY = 9, + // MTR_ARG_TYPE_JSON_COPY = 10, } mtr_arg_type; // TODO: Add support for more than one argument (metadata) per event @@ -213,55 +213,55 @@ void internal_mtr_raw_event_arg(const char *category, const char *name, char ph, // These are optimized to use X events (combined B and E). Much easier to do in C++ than in C. class MTRScopedTrace { public: - MTRScopedTrace(const char *category, const char *name) - : category_(category), name_(name) { - start_time_ = mtr_time_s(); - } - ~MTRScopedTrace() { - internal_mtr_raw_event(category_, name_, 'X', &start_time_); - } + MTRScopedTrace(const char *category, const char *name) + : category_(category), name_(name) { + start_time_ = mtr_time_s(); + } + ~MTRScopedTrace() { + internal_mtr_raw_event(category_, name_, 'X', &start_time_); + } private: - const char *category_; - const char *name_; - double start_time_; + const char *category_; + const char *name_; + double start_time_; }; // Only outputs a block if execution time exceeded the limit. // TODO: This will effectively call mtr_time_s twice at the end, which is bad. class MTRScopedTraceLimit { public: - MTRScopedTraceLimit(const char *category, const char *name, double limit_s) - : category_(category), name_(name), limit_(limit_s) { - start_time_ = mtr_time_s(); - } - ~MTRScopedTraceLimit() { - double end_time = mtr_time_s(); - if (end_time - start_time_ >= limit_) { - internal_mtr_raw_event(category_, name_, 'X', &start_time_); - } - } + MTRScopedTraceLimit(const char *category, const char *name, double limit_s) + : category_(category), name_(name), limit_(limit_s) { + start_time_ = mtr_time_s(); + } + ~MTRScopedTraceLimit() { + double end_time = mtr_time_s(); + if (end_time - start_time_ >= limit_) { + internal_mtr_raw_event(category_, name_, 'X', &start_time_); + } + } private: - const char *category_; - const char *name_; - double start_time_; - double limit_; + const char *category_; + const char *name_; + double start_time_; + double limit_; }; class MTRScopedTraceArg { public: - MTRScopedTraceArg(const char *category, const char *name, mtr_arg_type arg_type, const char *arg_name, void *arg_value) - : category_(category), name_(name) { - internal_mtr_raw_event_arg(category, name, 'B', 0, arg_type, arg_name, arg_value); - } - ~MTRScopedTraceArg() { - internal_mtr_raw_event(category_, name_, 'E', 0); - } + MTRScopedTraceArg(const char *category, const char *name, mtr_arg_type arg_type, const char *arg_name, void *arg_value) + : category_(category), name_(name) { + internal_mtr_raw_event_arg(category, name, 'B', 0, arg_type, arg_name, arg_value); + } + ~MTRScopedTraceArg() { + internal_mtr_raw_event(category_, name_, 'E', 0); + } private: - const char *category_; - const char *name_; + const char *category_; + const char *name_; }; #endif diff --git a/src/mac/CMakeLists.txt b/src/mac/CMakeLists.txt index 9ad6206a8..bbdf1d5d5 100644 --- a/src/mac/CMakeLists.txt +++ b/src/mac/CMakeLists.txt @@ -38,9 +38,9 @@ set_source_files_properties(${APP_ICON_MACOSX} # Prepare long version string if(EMU_BUILD) - set(LONG_VER_STRING "${CMAKE_PROJECT_VERSION} [${EMU_BUILD}]") + set(LONG_VER_STRING "${CMAKE_PROJECT_VERSION} [${EMU_BUILD}]") else() - set(LONG_VER_STRING "${CMAKE_PROJECT_VERSION}") + set(LONG_VER_STRING "${CMAKE_PROJECT_VERSION}") endif() # Generate Info.plist diff --git a/src/machine/m_amstrad.c b/src/machine/m_amstrad.c index 5d64bda3b..98bf26c58 100644 --- a/src/machine/m_amstrad.c +++ b/src/machine/m_amstrad.c @@ -935,45 +935,45 @@ vid_speed_changed_200(void *priv) */ static unsigned char mapping1[256] = { // clang-format off -/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ -/*00*/ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -/*10*/ 2, 0, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, -/*20*/ 2, 2, 0, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, -/*30*/ 2, 2, 2, 0, 2, 2, 1, 1, 2, 2, 2, 1, 2, 2, 1, 1, -/*40*/ 2, 2, 1, 1, 0, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, -/*50*/ 2, 2, 1, 1, 2, 0, 1, 1, 2, 2, 1, 1, 2, 1, 1, 1, -/*60*/ 2, 2, 2, 2, 2, 2, 0, 1, 2, 2, 2, 2, 2, 2, 1, 1, -/*70*/ 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 1, -/*80*/ 2, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, -/*90*/ 2, 2, 1, 1, 1, 1, 1, 1, 2, 0, 1, 1, 1, 1, 1, 1, -/*A0*/ 2, 2, 2, 1, 2, 2, 1, 1, 2, 2, 0, 1, 2, 2, 1, 1, -/*B0*/ 2, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 0, 2, 2, 1, 1, -/*C0*/ 2, 2, 1, 1, 2, 1, 1, 1, 2, 2, 1, 1, 0, 1, 1, 1, -/*D0*/ 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 0, 1, 1, -/*E0*/ 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 0, 1, -/*F0*/ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, +/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ +/*00*/ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +/*10*/ 2, 0, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, +/*20*/ 2, 2, 0, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, +/*30*/ 2, 2, 2, 0, 2, 2, 1, 1, 2, 2, 2, 1, 2, 2, 1, 1, +/*40*/ 2, 2, 1, 1, 0, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, +/*50*/ 2, 2, 1, 1, 2, 0, 1, 1, 2, 2, 1, 1, 2, 1, 1, 1, +/*60*/ 2, 2, 2, 2, 2, 2, 0, 1, 2, 2, 2, 2, 2, 2, 1, 1, +/*70*/ 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 1, +/*80*/ 2, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, +/*90*/ 2, 2, 1, 1, 1, 1, 1, 1, 2, 0, 1, 1, 1, 1, 1, 1, +/*A0*/ 2, 2, 2, 1, 2, 2, 1, 1, 2, 2, 0, 1, 2, 2, 1, 1, +/*B0*/ 2, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 0, 2, 2, 1, 1, +/*C0*/ 2, 2, 1, 1, 2, 1, 1, 1, 2, 2, 1, 1, 0, 1, 1, 1, +/*D0*/ 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 0, 1, 1, +/*E0*/ 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 0, 1, +/*F0*/ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, // clang-format on }; static unsigned char mapping2[256] = { // clang-format off -/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ -/*00*/ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -/*10*/ 1, 3, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, -/*20*/ 1, 1, 3, 2, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, -/*30*/ 1, 1, 1, 3, 1, 1, 2, 2, 1, 1, 1, 2, 1, 1, 2, 2, -/*40*/ 1, 1, 2, 2, 3, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, -/*50*/ 1, 1, 2, 2, 1, 3, 2, 2, 1, 1, 2, 2, 1, 2, 2, 2, -/*60*/ 1, 1, 1, 1, 1, 1, 3, 2, 1, 1, 1, 1, 1, 1, 2, 2, -/*70*/ 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 2, -/*80*/ 2, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, -/*90*/ 1, 1, 2, 2, 2, 2, 2, 2, 1, 3, 2, 2, 2, 2, 2, 2, -/*A0*/ 1, 1, 1, 2, 1, 1, 2, 2, 1, 1, 3, 2, 1, 1, 2, 2, -/*B0*/ 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 3, 1, 1, 2, 2, -/*C0*/ 1, 1, 2, 2, 1, 2, 2, 2, 1, 1, 2, 2, 3, 2, 2, 2, -/*D0*/ 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 1, 3, 2, 2, -/*E0*/ 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 3, 2, -/*F0*/ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, +/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ +/*00*/ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +/*10*/ 1, 3, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, +/*20*/ 1, 1, 3, 2, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, +/*30*/ 1, 1, 1, 3, 1, 1, 2, 2, 1, 1, 1, 2, 1, 1, 2, 2, +/*40*/ 1, 1, 2, 2, 3, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, +/*50*/ 1, 1, 2, 2, 1, 3, 2, 2, 1, 1, 2, 2, 1, 2, 2, 2, +/*60*/ 1, 1, 1, 1, 1, 1, 3, 2, 1, 1, 1, 1, 1, 1, 2, 2, +/*70*/ 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 2, +/*80*/ 2, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, +/*90*/ 1, 1, 2, 2, 2, 2, 2, 2, 1, 3, 2, 2, 2, 2, 2, 2, +/*A0*/ 1, 1, 1, 2, 1, 1, 2, 2, 1, 1, 3, 2, 1, 1, 2, 2, +/*B0*/ 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 3, 1, 1, 2, 2, +/*C0*/ 1, 1, 2, 2, 1, 2, 2, 2, 1, 1, 2, 2, 3, 2, 2, 2, +/*D0*/ 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 1, 3, 2, 2, +/*E0*/ 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 3, 2, +/*F0*/ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, // clang-format on }; @@ -1054,7 +1054,7 @@ vid_out_200(uint16_t addr, uint8_t val, void *priv) uint8_t old; switch (addr) { - /* MDA writes ============================================================== */ + /* MDA writes ============================================================== */ case 0x3b1: case 0x3b3: case 0x3b5: @@ -1087,7 +1087,7 @@ vid_out_200(uint16_t addr, uint8_t val, void *priv) nmi_raise(); return; - /* CGA writes ============================================================== */ + /* CGA writes ============================================================== */ case 0x03d1: case 0x03d3: case 0x03d5: @@ -1122,12 +1122,12 @@ vid_out_200(uint16_t addr, uint8_t val, void *priv) set_lcd_cols(val); return; - /* PC200 control port writes ============================================== */ + /* PC200 control port writes ============================================== */ case 0x03de: vid->crtc_index = 0x1f; - /* NMI only seems to be triggered if the value being written has the high - * bit set (enable NMI). So it only protects writes to this port if you - * let it? */ + /* NMI only seems to be triggered if the value being written has the high + * bit set (enable NMI). So it only protects writes to this port if you + * let it? */ if (val & 0x80) { vid->operation_ctrl = val; vid->crtc_index |= 0x40; @@ -2032,14 +2032,14 @@ kbd_write(uint16_t port, uint8_t val, void *priv) /* * PortB - System Control. * - * 7 Enable Status-1/Disable Keyboard Code on Port A. - * 6 Enable incoming Keyboard Clock. - * 5 Prevent external parity errors from causing NMI. - * 4 Disable parity checking of on-board system Ram. - * 3 Undefined (Not Connected). - * 2 Enable Port C LSB / Disable MSB. (See 1.8.3) - * 1 Speaker Drive. - * 0 8253 GATE 2 (Speaker Modulate). + * 7 Enable Status-1/Disable Keyboard Code on Port A. + * 6 Enable incoming Keyboard Clock. + * 5 Prevent external parity errors from causing NMI. + * 4 Disable parity checking of on-board system Ram. + * 3 Undefined (Not Connected). + * 2 Enable Port C LSB / Disable MSB. (See 1.8.3) + * 1 Speaker Drive. + * 0 8253 GATE 2 (Speaker Modulate). * * This register is controlled by BIOS and/or ROS. */ @@ -2097,14 +2097,14 @@ kbd_read(uint16_t port, void *priv) /* * PortA - System Status 1 * - * 7 Always 0 (KBD7) - * 6 Second Floppy disk drive installed (KBD6) - * 5 DDM1 - Default Display Mode bit 1 (KBD5) - * 4 DDM0 - Default Display Mode bit 0 (KBD4) - * 3 Always 1 (KBD3) - * 2 Always 1 (KBD2) - * 1 8087 NDP installed (KBD1) - * 0 Always 1 (KBD0) + * 7 Always 0 (KBD7) + * 6 Second Floppy disk drive installed (KBD6) + * 5 DDM1 - Default Display Mode bit 1 (KBD5) + * 4 DDM0 - Default Display Mode bit 0 (KBD4) + * 3 Always 1 (KBD3) + * 2 Always 1 (KBD2) + * 1 8087 NDP installed (KBD1) + * 0 Always 1 (KBD0) * * DDM00 * 00 unknown, external color? @@ -2137,27 +2137,27 @@ kbd_read(uint16_t port, void *priv) /* * PortC - System Status 2. * - * 7 On-board system RAM parity error. - * 6 External parity error (I/OCHCK from expansion bus). - * 5 8253 PIT OUT2 output. - * 4 Undefined (Not Connected). + * 7 On-board system RAM parity error. + * 6 External parity error (I/OCHCK from expansion bus). + * 5 8253 PIT OUT2 output. + * 4 Undefined (Not Connected). *------------------------------------------- - * LSB MSB (depends on PB2) + * LSB MSB (depends on PB2) *------------------------------------------- - * 3 RAM3 Undefined - * 2 RAM2 Undefined - * 1 RAM1 Undefined - * 0 RAM0 RAM4 + * 3 RAM3 Undefined + * 2 RAM2 Undefined + * 1 RAM1 Undefined + * 0 RAM0 RAM4 * * PC7 is forced to 0 when on-board system RAM parity * checking is disabled by PB4. * * RAM4:0 - * 01110 512K bytes on-board. - * 01111 544K bytes (32K external). - * 10000 576K bytes (64K external). - * 10001 608K bytes (96K external). - * 10010 640K bytes (128K external or fitted on-board). + * 01110 512K bytes on-board. + * 01111 544K bytes (32K external). + * 10000 576K bytes (64K external). + * 10001 608K bytes (96K external). + * 10010 640K bytes (128K external or fitted on-board). */ if (ams->pb & 0x04) ret = ams->stat2 & 0x0f; @@ -2226,14 +2226,14 @@ ams_read(uint16_t port, void *priv) case 0x0379: /* printer control, also set LK1-3. * per John Elliott's site, this is xor'ed with 0x07 - * 7 English Language. - * 6 German Language. - * 5 French Language. - * 4 Spanish Language. - * 3 Danish Language. - * 2 Swedish Language. - * 1 Italian Language. - * 0 Diagnostic Mode. + * 7 English Language. + * 6 German Language. + * 5 French Language. + * 4 Spanish Language. + * 3 Danish Language. + * 2 Swedish Language. + * 1 Italian Language. + * 0 Diagnostic Mode. */ ret = (lpt_read(port, &lpt_ports[0]) & 0xf8) | ams->language; break; diff --git a/src/machine/m_at_386dx_486.c b/src/machine/m_at_386dx_486.c index 1343b38ad..6a2329dd6 100644 --- a/src/machine/m_at_386dx_486.c +++ b/src/machine/m_at_386dx_486.c @@ -635,10 +635,9 @@ machine_at_pc330_6573_init(const machine_t *model) /* doesn't like every CPU oth pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x10, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - - pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x12, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x12, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); device_add(&opti802g_pci_device); device_add(&opti822_device); @@ -1003,10 +1002,10 @@ machine_at_alfredo_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_2 | PCI_NO_IRQ_STEERING); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x01, PCI_CARD_IDE, 0, 0, 0, 0); - pci_register_slot(0x06, PCI_CARD_NORMAL, 3, 2, 1, 4); - pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 1, 3, 4); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 3, 2, 4); + pci_register_slot(0x01, PCI_CARD_IDE, 0, 0, 0, 0); + pci_register_slot(0x06, PCI_CARD_NORMAL, 3, 2, 1, 4); + pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 1, 3, 4); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 3, 2, 4); pci_register_slot(0x02, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&keyboard_ps2_pci_device); device_add(&sio_device); @@ -1033,9 +1032,9 @@ machine_at_ninja_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_1 | PCI_NO_IRQ_STEERING); pci_register_slot(0x05, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 1, 2); - pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 1, 2, 1); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 1, 2, 1); + pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 1, 2); + pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 1, 2, 1); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 1, 2, 1); device_add(&keyboard_ps2_intel_ami_pci_device); device_add(&intel_flash_bxt_ami_device); @@ -1061,13 +1060,13 @@ machine_at_486sp3_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_2 | PCI_NO_IRQ_STEERING); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x01, PCI_CARD_SCSI, 1, 2, 3, 4); /* 01 = SCSI */ - pci_register_slot(0x03, PCI_CARD_NORMAL, 1, 2, 3, 4); /* 03 = Slot 1 */ - pci_register_slot(0x04, PCI_CARD_NORMAL, 2, 3, 4, 1); /* 04 = Slot 2 */ - 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(0x01, PCI_CARD_SCSI, 1, 2, 3, 4); /* 01 = SCSI */ + pci_register_slot(0x03, PCI_CARD_NORMAL, 1, 2, 3, 4); /* 03 = Slot 1 */ + pci_register_slot(0x04, PCI_CARD_NORMAL, 2, 3, 4, 1); /* 04 = Slot 2 */ + 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_ps2_ami_pci_device); /* Uses the AMIKEY KBC */ device_add(&sio_device); device_add(&fdc37c663_ide_device); device_add(&sst_flash_29ee010_device); @@ -1095,12 +1094,12 @@ machine_at_pci400cb_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(0x0F, PCI_CARD_NORMAL, 4, 3, 2, 1); /* 0F = Slot 1 */ - pci_register_slot(0x0E, PCI_CARD_NORMAL, 3, 4, 1, 2); /* 0E = Slot 2 */ - pci_register_slot(0x0D, PCI_CARD_NORMAL, 2, 3, 4, 1); /* 0D = Slot 3 */ - pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); /* 0C = Slot 4 */ - device_add(&keyboard_ps2_ami_pci_device); /* Assume AMI Megakey 1993 standalone ('P') - because of the Tekram machine below. */ + pci_register_slot(0x0F, PCI_CARD_NORMAL, 4, 3, 2, 1); /* 0F = Slot 1 */ + pci_register_slot(0x0E, PCI_CARD_NORMAL, 3, 4, 1, 2); /* 0E = Slot 2 */ + pci_register_slot(0x0D, PCI_CARD_NORMAL, 2, 3, 4, 1); /* 0D = Slot 3 */ + pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); /* 0C = Slot 4 */ + device_add(&keyboard_ps2_ami_pci_device); /* Assume AMI Megakey 1993 standalone ('P') + because of the Tekram machine below. */ device_add(&ims8848_device); @@ -1127,10 +1126,10 @@ machine_at_g486ip_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(0x0F, PCI_CARD_NORMAL, 3, 4, 1, 2); /* 03 = Slot 1 */ - pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 3, 4, 1); /* 04 = Slot 2 */ - pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); /* 05 = Slot 3 */ - device_add(&keyboard_ps2_ami_pci_device); /* AMI Megakey 1993 stanalone ('P') */ + pci_register_slot(0x0F, PCI_CARD_NORMAL, 3, 4, 1, 2); /* 03 = Slot 1 */ + pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 3, 4, 1); /* 04 = Slot 2 */ + pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); /* 05 = Slot 3 */ + device_add(&keyboard_ps2_ami_pci_device); /* AMI Megakey 1993 stanalone ('P') */ device_add(&ims8848_device); @@ -1156,12 +1155,12 @@ machine_at_486sp3g_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_2); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x01, PCI_CARD_SCSI, 1, 2, 3, 4); /* 01 = SCSI */ - pci_register_slot(0x06, PCI_CARD_NORMAL, 1, 2, 3, 4); /* 06 = Slot 1 */ - pci_register_slot(0x05, PCI_CARD_NORMAL, 2, 3, 4, 1); /* 05 = Slot 2 */ - pci_register_slot(0x04, PCI_CARD_NORMAL, 3, 4, 1, 2); /* 04 = Slot 3 */ + pci_register_slot(0x01, PCI_CARD_SCSI, 1, 2, 3, 4); /* 01 = SCSI */ + pci_register_slot(0x06, PCI_CARD_NORMAL, 1, 2, 3, 4); /* 06 = Slot 1 */ + pci_register_slot(0x05, PCI_CARD_NORMAL, 2, 3, 4, 1); /* 05 = Slot 2 */ + pci_register_slot(0x04, PCI_CARD_NORMAL, 3, 4, 1, 2); /* 04 = Slot 3 */ 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_ps2_ami_pci_device); /* Uses the AMIKEY KBC */ device_add(&sio_zb_device); device_add(&pc87332_398_ide_device); device_add(&sst_flash_29ee010_device); @@ -1188,11 +1187,11 @@ machine_at_486ap4_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_1 | PCI_NO_IRQ_STEERING); /* Excluded: 5, 6, 7, 8 */ pci_register_slot(0x05, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x09, PCI_CARD_NORMAL, 1, 2, 3, 4); /* 09 = Slot 1 */ - pci_register_slot(0x0a, PCI_CARD_NORMAL, 2, 3, 4, 1); /* 0a = Slot 2 */ - pci_register_slot(0x0b, PCI_CARD_NORMAL, 3, 4, 1, 2); /* 0b = Slot 3 */ - 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 */ + pci_register_slot(0x09, PCI_CARD_NORMAL, 1, 2, 3, 4); /* 09 = Slot 1 */ + pci_register_slot(0x0a, PCI_CARD_NORMAL, 2, 3, 4, 1); /* 0a = Slot 2 */ + pci_register_slot(0x0b, PCI_CARD_NORMAL, 3, 4, 1, 2); /* 0b = Slot 3 */ + 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) device_add(&fdc_at_device); @@ -1217,10 +1216,10 @@ machine_at_g486vpa_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(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(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); device_add(&via_vt82c49x_pci_ide_device); device_add(&via_vt82c505_device); @@ -1246,10 +1245,10 @@ machine_at_486vipio2_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(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(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); device_add(&via_vt82c49x_pci_ide_device); device_add(&via_vt82c505_device); @@ -1275,9 +1274,9 @@ machine_at_abpb4_init(const machine_t *model) pci_init(PCI_CAN_SWITCH_TYPE); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x03, PCI_CARD_NORMAL, 1, 2, 3, 4); - 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(0x03, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x04, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x05, PCI_CARD_NORMAL, 3, 4, 1, 2); device_add(&ali1489_device); device_add(&w83787f_device); @@ -1303,9 +1302,9 @@ machine_at_win486pci_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(0x03, PCI_CARD_NORMAL, 1, 2, 3, 4); - 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(0x03, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x04, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x05, PCI_CARD_NORMAL, 3, 4, 1, 2); device_add(&ali1489_device); device_add(&prime3b_device); @@ -1329,10 +1328,10 @@ machine_at_ms4145_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(0x03, PCI_CARD_NORMAL, 1, 2, 3, 4); - 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(0x06, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x03, PCI_CARD_NORMAL, 1, 2, 3, 4); + 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(0x06, PCI_CARD_NORMAL, 4, 1, 2, 3); device_add(&ali1489_device); device_add(&w83787f_device); @@ -1357,11 +1356,11 @@ machine_at_sbc490_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(0x0F, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0E, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x01, PCI_CARD_VIDEO, 4, 1, 2, 3); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0E, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x01, PCI_CARD_VIDEO, 4, 1, 2, 3); device_add(&ali1489_device); device_add(&fdc37c665_device); @@ -1390,7 +1389,7 @@ machine_at_tf486_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(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); device_add(&ali1489_device); device_add(&w83977ef_device); @@ -1416,7 +1415,7 @@ machine_at_itoxstar_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x0B, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); pci_register_slot(0x0C, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x1F, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x1F, PCI_CARD_NORMAL, 1, 2, 3, 4); device_add(&w83977f_device); device_add(&keyboard_ps2_ami_pci_device); device_add(&stpc_client_device); @@ -1445,9 +1444,9 @@ machine_at_arb1423c_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x0B, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); pci_register_slot(0x0C, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x1F, PCI_CARD_NORMAL, 1, 0, 0, 0); - pci_register_slot(0x1E, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x1D, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x1F, PCI_CARD_NORMAL, 1, 0, 0, 0); + pci_register_slot(0x1E, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x1D, PCI_CARD_NORMAL, 3, 4, 1, 2); device_add(&w83977f_device); device_add(&keyboard_ps2_ami_pci_device); device_add(&stpc_consumer2_device); @@ -1472,9 +1471,9 @@ machine_at_arb1479_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x0B, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); pci_register_slot(0x0C, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x1F, PCI_CARD_NORMAL, 1, 0, 0, 0); - pci_register_slot(0x1E, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x1D, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x1F, PCI_CARD_NORMAL, 1, 0, 0, 0); + pci_register_slot(0x1E, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x1D, PCI_CARD_NORMAL, 3, 4, 1, 2); device_add(&w83977f_device); device_add(&keyboard_ps2_ami_pci_device); device_add(&stpc_consumer2_device); @@ -1499,9 +1498,9 @@ machine_at_pcm9340_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x0B, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); pci_register_slot(0x0C, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x1D, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x1E, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x1F, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x1D, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x1E, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x1F, PCI_CARD_NORMAL, 2, 3, 4, 1); device_add_inst(&w83977f_device, 1); device_add_inst(&w83977f_device, 2); device_add(&keyboard_ps2_ami_pci_device); @@ -1529,7 +1528,7 @@ machine_at_pcm5330_init(const machine_t *model) pci_register_slot(0x0C, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); pci_register_slot(0x0D, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); pci_register_slot(0x0E, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); - pci_register_slot(0x13, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x13, PCI_CARD_NORMAL, 1, 2, 3, 4); device_add(&stpc_serial_device); device_add(&w83977f_370_device); device_add(&keyboard_ps2_ami_pci_device); @@ -1555,10 +1554,10 @@ machine_at_ecs486_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x10, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); pci_register_slot(0x12, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); - pci_register_slot(0x0F, PCI_CARD_IDE, 0, 0, 0, 0); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0E, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0F, PCI_CARD_IDE, 0, 0, 0, 0); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0E, PCI_CARD_NORMAL, 3, 4, 1, 2); device_add(&umc_hb4_device); device_add(&umc_8886f_device); @@ -1586,10 +1585,10 @@ machine_at_hot433_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x10, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); pci_register_slot(0x12, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x0E, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x0F, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x0E, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 2, 3, 4, 1); device_add(&umc_hb4_device); device_add(&umc_8886af_device); @@ -1618,9 +1617,9 @@ machine_at_atc1415_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x10, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); pci_register_slot(0x12, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x13, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x14, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x13, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x14, PCI_CARD_NORMAL, 3, 4, 1, 2); device_add(&umc_hb4_device); device_add(&umc_8886af_device); @@ -1649,10 +1648,10 @@ machine_at_actionpc2600_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x10, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); pci_register_slot(0x12, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x0E, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x0F, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x0E, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 2, 3, 4, 1); device_add(&umc_hb4_device); device_add(&umc_8886af_device); @@ -1679,9 +1678,9 @@ machine_at_m919_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x10, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); pci_register_slot(0x12, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x0E, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x0E, PCI_CARD_NORMAL, 3, 4, 1, 2); device_add(&umc_hb4_device); device_add(&umc_8886af_device); @@ -1708,9 +1707,9 @@ machine_at_spc7700plw_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x10, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); pci_register_slot(0x12, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0E, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0E, PCI_CARD_NORMAL, 3, 4, 1, 2); device_add(&umc_hb4_device); device_add(&umc_8886af_device); diff --git a/src/machine/m_at_compaq.c b/src/machine/m_at_compaq.c index 74e853834..7840eb056 100644 --- a/src/machine/m_at_compaq.c +++ b/src/machine/m_at_compaq.c @@ -527,9 +527,9 @@ compaq_plasma_recalcattrs(compaq_plasma_t *self) * Bit 0: Attributes 01-06, 08-0E are inverse video * Bit 1: Attributes 01-06, 08-0E are bold * Bit 2: Attributes 11-16, 18-1F, 21-26, 28-2F ... F1-F6, F8-FF - * are inverse video + * are inverse video * Bit 3: Attributes 11-16, 18-1F, 21-26, 28-2F ... F1-F6, F8-FF - * are bold */ + * are bold */ /* Set up colours */ amber = makecol(0xff, 0x7D, 0x00); @@ -686,8 +686,8 @@ const device_config_t compaq_plasma_config[] = { }, { .name = "rgb_type", - .description = "RGB type", - .type = CONFIG_SELECTION, + .description = "RGB type", + .type = CONFIG_SELECTION, .default_string = "", .default_int = 0, .file_filter = "", diff --git a/src/machine/m_at_slot1.c b/src/machine/m_at_slot1.c index ec818871a..71aeeb7fb 100644 --- a/src/machine/m_at_slot1.c +++ b/src/machine/m_at_slot1.c @@ -654,7 +654,7 @@ machine_at_ms6168_common_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(0x14, PCI_CARD_SOUND, 3, 4, 1, 2); - pci_register_slot(0x0E, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0E, PCI_CARD_NORMAL, 1, 2, 3, 4); pci_register_slot(0x10, PCI_CARD_NORMAL, 2, 3, 4, 1); pci_register_slot(0x12, PCI_CARD_NORMAL, 3, 4, 1, 2); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); diff --git a/src/machine/m_at_socket370.c b/src/machine/m_at_socket370.c index 1388eec3a..66ef15e1d 100644 --- a/src/machine/m_at_socket370.c +++ b/src/machine/m_at_socket370.c @@ -96,7 +96,7 @@ machine_at_s1857_init(const machine_t *model) pci_register_slot(0x12, PCI_CARD_NORMAL, 3, 4, 1, 2); pci_register_slot(0x13, PCI_CARD_NORMAL, 4, 1, 2, 3); pci_register_slot(0x14, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); + pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); device_add(&i440bx_device); device_add(&piix4e_device); device_add(&keyboard_ps2_ami_pci_device); @@ -228,11 +228,11 @@ machine_at_ambx133_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(0x09, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0A, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x09, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0A, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 4, 1, 2, 3); pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); device_add(&i440bx_device); device_add(&piix4e_device); @@ -264,11 +264,11 @@ machine_at_awo671r_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(0x09, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0A, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x09, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0A, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 2, 3, 4, 1); pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); device_add(&i440bx_device); device_add(&piix4e_device); @@ -297,11 +297,11 @@ machine_at_63a1_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(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(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); /* Integrated Sound? */ + 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(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); /* Integrated Sound? */ pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); device_add(&i440zx_device); device_add(&piix4e_device); diff --git a/src/machine/m_at_socket4.c b/src/machine/m_at_socket4.c index d24933ff9..7ae87e120 100644 --- a/src/machine/m_at_socket4.c +++ b/src/machine/m_at_socket4.c @@ -51,10 +51,10 @@ machine_at_premiere_common_init(const machine_t *model, int pci_switch) pci_init(PCI_CONFIG_TYPE_2 | pci_switch); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x01, PCI_CARD_IDE, 0, 0, 0, 0); - pci_register_slot(0x06, PCI_CARD_NORMAL, 3, 2, 1, 4); - pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 1, 3, 4); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 3, 2, 4); + pci_register_slot(0x01, PCI_CARD_IDE, 0, 0, 0, 0); + pci_register_slot(0x06, PCI_CARD_NORMAL, 3, 2, 1, 4); + pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 1, 3, 4); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 3, 2, 4); pci_register_slot(0x02, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&keyboard_ps2_intel_ami_pci_device); device_add(&sio_zb_device); @@ -70,12 +70,12 @@ machine_at_award_common_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_2 | PCI_NO_IRQ_STEERING); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x01, PCI_CARD_IDE, 0, 0, 0, 0); - pci_register_slot(0x03, PCI_CARD_NORMAL, 1, 2, 3, 4); /* 03 = Slot 1 */ - pci_register_slot(0x04, PCI_CARD_NORMAL, 2, 3, 4, 1); /* 04 = Slot 2 */ - 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(0x07, PCI_CARD_SCSI, 1, 2, 3, 4); /* 07 = SCSI */ + pci_register_slot(0x01, PCI_CARD_IDE, 0, 0, 0, 0); + pci_register_slot(0x03, PCI_CARD_NORMAL, 1, 2, 3, 4); /* 03 = Slot 1 */ + pci_register_slot(0x04, PCI_CARD_NORMAL, 2, 3, 4, 1); /* 04 = Slot 2 */ + 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(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) @@ -97,10 +97,10 @@ machine_at_sp4_common_init(const machine_t *model) pci_register_slot(0x0D, PCI_CARD_IDE, 1, 2, 3, 4); /* Excluded: 02, 03*, 04*, 05*, 06*, 07*, 08* */ /* Slots: 09 (04), 0A (03), 0B (02), 0C (07) */ - pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x09, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x09, PCI_CARD_NORMAL, 4, 1, 2, 3); device_add(&sis_85c50x_device); device_add(&ide_cmd640_pci_device); device_add(&keyboard_ps2_ami_pci_device); @@ -123,10 +123,10 @@ machine_at_excaliburpci_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_2); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x03, PCI_CARD_IDE, 0, 0, 0, 0); - pci_register_slot(0x0F, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x03, PCI_CARD_IDE, 0, 0, 0, 0); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 3, 4, 1, 2); pci_register_slot(0x02, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&fdc37c665_device); device_add(&keyboard_ps2_ami_pci_device); @@ -155,9 +155,9 @@ machine_at_p5mp3_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_2 | PCI_NO_IRQ_STEERING); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x05, PCI_CARD_NORMAL, 1, 2, 3, 4); /* 05 = Slot 1 */ - pci_register_slot(0x04, PCI_CARD_NORMAL, 2, 3, 4, 1); /* 04 = Slot 2 */ - pci_register_slot(0x03, PCI_CARD_NORMAL, 3, 4, 1, 2); /* 03 = Slot 3 */ + pci_register_slot(0x05, PCI_CARD_NORMAL, 1, 2, 3, 4); /* 05 = Slot 1 */ + pci_register_slot(0x04, PCI_CARD_NORMAL, 2, 3, 4, 1); /* 04 = Slot 2 */ + pci_register_slot(0x03, PCI_CARD_NORMAL, 3, 4, 1, 2); /* 03 = Slot 3 */ pci_register_slot(0x02, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&fdc_at_device); device_add(&keyboard_ps2_pci_device); @@ -187,10 +187,10 @@ machine_at_dellxp60_init(const machine_t *model) pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); /* Not: 00, 02, 03, 04, 05, 06, 07, 08, 09, 0A, 0B, 0C, 0D, 0E, 0F. */ /* Yes: 01, 10, 11, 12, 13, 14. */ - pci_register_slot(0x01, PCI_CARD_NORMAL, 1, 3, 2, 4); - pci_register_slot(0x04, PCI_CARD_NORMAL, 4, 4, 3, 3); - pci_register_slot(0x05, PCI_CARD_NORMAL, 1, 4, 3, 2); - pci_register_slot(0x06, PCI_CARD_NORMAL, 2, 1, 3, 4); + pci_register_slot(0x01, PCI_CARD_NORMAL, 1, 3, 2, 4); + pci_register_slot(0x04, PCI_CARD_NORMAL, 4, 4, 3, 3); + pci_register_slot(0x05, PCI_CARD_NORMAL, 1, 4, 3, 2); + pci_register_slot(0x06, PCI_CARD_NORMAL, 2, 1, 3, 4); pci_register_slot(0x02, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&i430lx_device); device_add(&keyboard_ps2_intel_ami_pci_device); @@ -217,9 +217,9 @@ machine_at_opti560l_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_2); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x03, PCI_CARD_NORMAL, 4, 4, 3, 3); - pci_register_slot(0x07, PCI_CARD_NORMAL, 1, 4, 3, 2); - pci_register_slot(0x08, PCI_CARD_NORMAL, 2, 1, 3, 4); + pci_register_slot(0x03, PCI_CARD_NORMAL, 4, 4, 3, 3); + pci_register_slot(0x07, PCI_CARD_NORMAL, 1, 4, 3, 2); + pci_register_slot(0x08, PCI_CARD_NORMAL, 2, 1, 3, 4); pci_register_slot(0x02, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&i430lx_device); device_add(&keyboard_ps2_intel_ami_pci_device); @@ -236,7 +236,8 @@ machine_at_ambradp60_init(const machine_t *model) int ret; ret = bios_load_linear_combined("roms/machines/ambradp60/1004AF1P.BIO", - "roms/machines/ambradp60/1004AF1P.BI1", 0x1c000, 128); + "roms/machines/ambradp60/1004AF1P.BI1", + 0x1c000, 128); if (bios_only || !ret) return ret; @@ -254,7 +255,8 @@ machine_at_valuepointp60_init(const machine_t *model) int ret; ret = bios_load_linear_combined("roms/machines/valuepointp60/1006AV0M.BIO", - "roms/machines/valuepointp60/1006AV0M.BI1", 0x1d000, 128); + "roms/machines/valuepointp60/1006AV0M.BI1", + 0x1d000, 128); if (bios_only || !ret) return ret; @@ -264,10 +266,10 @@ machine_at_valuepointp60_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_2 | PCI_NO_IRQ_STEERING); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x01, PCI_CARD_IDE, 0, 0, 0, 0); - pci_register_slot(0x06, PCI_CARD_NORMAL, 3, 2, 1, 4); - pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 1, 3, 4); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 3, 2, 4); + pci_register_slot(0x01, PCI_CARD_IDE, 0, 0, 0, 0); + pci_register_slot(0x06, PCI_CARD_NORMAL, 3, 2, 1, 4); + pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 1, 3, 4); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 3, 2, 4); pci_register_slot(0x02, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&keyboard_ps2_ps1_pci_device); device_add(&sio_device); @@ -285,7 +287,8 @@ machine_at_revenge_init(const machine_t *model) int ret; ret = bios_load_linear_combined("roms/machines/revenge/1009af2_.bio", - "roms/machines/revenge/1009af2_.bi1", 0x1c000, 128); + "roms/machines/revenge/1009af2_.bi1", + 0x1c000, 128); if (bios_only || !ret) return ret; @@ -323,7 +326,8 @@ machine_at_pb520r_init(const machine_t *model) int ret; ret = bios_load_linear_combined("roms/machines/pb520r/1009bc0r.bio", - "roms/machines/pb520r/1009bc0r.bi1", 0x1d000, 128); + "roms/machines/pb520r/1009bc0r.bi1", + 0x1d000, 128); if (bios_only || !ret) return ret; @@ -332,11 +336,11 @@ machine_at_pb520r_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_2); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x01, PCI_CARD_IDE, 0, 0, 0, 0); - pci_register_slot(0x03, PCI_CARD_VIDEO, 3, 3, 3, 3); - pci_register_slot(0x06, PCI_CARD_NORMAL, 3, 2, 1, 4); - pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 1, 3, 4); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 3, 2, 4); + pci_register_slot(0x01, PCI_CARD_IDE, 0, 0, 0, 0); + pci_register_slot(0x03, PCI_CARD_VIDEO, 3, 3, 3, 3); + pci_register_slot(0x06, PCI_CARD_NORMAL, 3, 2, 1, 4); + pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 1, 3, 4); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 3, 2, 4); pci_register_slot(0x02, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&i430lx_device); device_add(&ide_cmd640_pci_single_channel_device); @@ -389,10 +393,10 @@ machine_at_p5vl_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x10, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x12, PCI_CARD_NORMAL, 5, 6, 7, 8); - pci_register_slot(0x13, PCI_CARD_NORMAL, 9, 10, 11, 12); - pci_register_slot(0x14, PCI_CARD_NORMAL, 13, 14, 15, 16); + pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x12, PCI_CARD_NORMAL, 5, 6, 7, 8); + pci_register_slot(0x13, PCI_CARD_NORMAL, 9, 10, 11, 12); + pci_register_slot(0x14, PCI_CARD_NORMAL, 13, 14, 15, 16); device_add(&opti5x7_pci_device); device_add(&opti822_device); @@ -422,11 +426,11 @@ machine_at_excaliburpci2_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(0x01, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x08, PCI_CARD_IDE, 0, 0, 0, 0); - 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(0x08, PCI_CARD_IDE, 0, 0, 0, 0); + 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); device_add(&fdc37c665_device); device_add(&keyboard_ps2_ami_pci_device); device_add(&ide_cmd640_pci_legacy_only_device); diff --git a/src/machine/m_at_socket5.c b/src/machine/m_at_socket5.c index 55751ae43..1bbeff550 100644 --- a/src/machine/m_at_socket5.c +++ b/src/machine/m_at_socket5.c @@ -48,7 +48,8 @@ machine_at_plato_init(const machine_t *model) int ret; ret = bios_load_linear_combined("roms/machines/plato/1016ax1_.bio", - "roms/machines/plato/1016ax1_.bi1", 0x1d000, 128); + "roms/machines/plato/1016ax1_.bi1", + 0x1d000, 128); if (bios_only || !ret) return ret; @@ -66,7 +67,8 @@ machine_at_ambradp90_init(const machine_t *model) int ret; ret = bios_load_linear_combined("roms/machines/ambradp90/1002AX1P.BIO", - "roms/machines/ambradp90/1002AX1P.BI1", 0x1d000, 128); + "roms/machines/ambradp90/1002AX1P.BI1", + 0x1d000, 128); if (bios_only || !ret) return ret; @@ -114,10 +116,10 @@ machine_at_acerv30_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, 0, 0, 0, 0); - pci_register_slot(0x12, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x11, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x14, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x13, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x12, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x11, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x14, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x13, PCI_CARD_NORMAL, 4, 1, 2, 3); device_add(&i430fx_device); device_add(&piix_device); device_add(&keyboard_ps2_acer_pci_device); @@ -144,10 +146,10 @@ machine_at_apollo_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(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(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(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&keyboard_ps2_ami_pci_device); device_add(&i430fx_device); @@ -173,10 +175,10 @@ machine_at_exp8551_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(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x14, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x12, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x11, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x14, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x12, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x11, 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); device_add(&i430fx_device); @@ -193,7 +195,8 @@ machine_at_zappa_init(const machine_t *model) int ret; ret = bios_load_linear_combined("roms/machines/zappa/1006bs0_.bio", - "roms/machines/zappa/1006bs0_.bi1", 0x20000, 128); + "roms/machines/zappa/1006bs0_.bi1", + 0x20000, 128); if (bios_only || !ret) return ret; @@ -202,9 +205,9 @@ machine_at_zappa_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(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0E, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x0F, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0E, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 2, 3, 4, 1); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&keyboard_ps2_intel_ami_pci_device); device_add(&i430fx_device); @@ -231,9 +234,9 @@ machine_at_powermatev_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, 0, 0, 0, 0); - pci_register_slot(0x08, PCI_CARD_NORMAL, 0, 0, 0, 0); - pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x08, PCI_CARD_NORMAL, 0, 0, 0, 0); + pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); device_add(&keyboard_ps2_ami_pci_device); device_add(&i430fx_device); device_add(&piix_device); @@ -258,10 +261,10 @@ machine_at_mb500n_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(0x14, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x12, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x11, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x14, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x12, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x11, PCI_CARD_NORMAL, 4, 1, 2, 3); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&keyboard_ps2_pci_device); device_add(&i430fx_device); @@ -288,9 +291,9 @@ machine_at_hawk_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(0x14, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x12, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x14, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x12, PCI_CARD_NORMAL, 3, 4, 1, 2); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&keyboard_ps2_ami_pci_device); device_add(&i430fx_device); @@ -338,10 +341,9 @@ machine_at_hot543_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x10, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - - pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x12, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x12, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); device_add(&opti5x7_pci_device); device_add(&opti822_device); @@ -387,11 +389,11 @@ machine_at_sq588_init(const machine_t *model) pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); pci_register_slot(0x01, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); /* Correct: 0D (01), 0F (02), 11 (03), 13 (04) */ - pci_register_slot(0x02, PCI_CARD_IDE, 1, 2, 3, 4); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0F, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x11, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x13, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x02, PCI_CARD_IDE, 1, 2, 3, 4); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x11, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x13, PCI_CARD_NORMAL, 4, 1, 2, 3); device_add(&sis_85c50x_device); device_add(&ide_cmd640_pci_single_channel_device); device_add(&keyboard_ps2_ami_pci_device); diff --git a/src/machine/m_at_socket7.c b/src/machine/m_at_socket7.c index a51c58b14..319c5930e 100644 --- a/src/machine/m_at_socket7.c +++ b/src/machine/m_at_socket7.c @@ -95,11 +95,11 @@ machine_at_ap5vm_init(const machine_t *model) /* It seems there were plans for an on-board NCR 53C810 according to some clues left in the manual, but were latter scrapped. The BIOS still support that PCI device, though, so why not. */ - pci_register_slot(0x06, PCI_CARD_SCSI, 1, 2, 3, 4); - pci_register_slot(0x09, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0A, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x06, PCI_CARD_SCSI, 1, 2, 3, 4); + pci_register_slot(0x09, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0A, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 4, 1, 2, 3); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&i430vx_device); device_add(&piix3_device); @@ -126,10 +126,10 @@ machine_at_p55t2p4_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(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x09, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x09, PCI_CARD_NORMAL, 4, 1, 2, 3); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&i430hx_device); device_add(&piix3_device); @@ -155,10 +155,10 @@ machine_at_m7shi_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x12, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x11, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x10, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0F, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x12, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x11, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x10, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 1, 2, 3, 4); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); device_add(&i430hx_device); device_add(&piix3_device); @@ -188,11 +188,11 @@ machine_at_tc430hx_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(0x08, PCI_CARD_VIDEO, 4, 0, 0, 0); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0F, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x10, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x08, PCI_CARD_VIDEO, 4, 0, 0, 0); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x10, PCI_CARD_NORMAL, 4, 1, 2, 3); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&i430hx_device); device_add(&piix3_device); @@ -223,12 +223,12 @@ machine_at_equium5200_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(0x08, PCI_CARD_VIDEO, 4, 0, 0, 0); - pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x08, PCI_CARD_VIDEO, 4, 0, 0, 0); + pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 4, 1, 2); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 0, 0, 0); // riser + pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 0, 0, 0); // riser device_add(&i430hx_device); device_add(&piix3_device); device_add(&keyboard_ps2_ami_pci_device); @@ -257,11 +257,11 @@ machine_at_pcv90_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(0x08, PCI_CARD_VIDEO, 4, 0, 0, 0); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0F, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x10, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x08, PCI_CARD_VIDEO, 4, 0, 0, 0); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x10, PCI_CARD_NORMAL, 4, 1, 2, 3); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&i430hx_device); device_add(&piix3_device); @@ -303,10 +303,10 @@ machine_at_p55tvp4_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(0x09, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x09, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&i430vx_device); device_add(&piix3_device); @@ -332,9 +332,9 @@ machine_at_5ivg_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(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x12, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x12, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&i430vx_device); device_add(&piix3_device); @@ -361,10 +361,10 @@ machine_at_8500tvxa_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, 0, 0, 0, 0); - 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, 2, 1); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 4, 3, 2, 1); + 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, 2, 1); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 4, 3, 2, 1); device_add(&i430vx_device); device_add(&piix3_device); device_add(&keyboard_ps2_ami_pci_device); @@ -390,8 +390,8 @@ machine_at_presario2240_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(0x14, PCI_CARD_VIDEO, 3, 0, 0, 0); - pci_register_slot(0x13, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x14, PCI_CARD_VIDEO, 3, 0, 0, 0); + pci_register_slot(0x13, PCI_CARD_NORMAL, 1, 2, 3, 4); if (gfxcard == VID_INTERNAL) device_add(&s3_trio64v2_dx_onboard_pci_device); @@ -421,8 +421,8 @@ machine_at_presario4500_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(0x14, PCI_CARD_VIDEO, 3, 0, 0, 0); - pci_register_slot(0x13, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x14, PCI_CARD_VIDEO, 3, 0, 0, 0); + pci_register_slot(0x13, PCI_CARD_NORMAL, 1, 2, 3, 4); if (gfxcard == VID_INTERNAL) device_add(&s3_trio64v2_dx_onboard_pci_device); @@ -451,10 +451,10 @@ machine_at_p55va_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(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(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(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&i430vx_device); device_add(&piix3_device); @@ -480,10 +480,10 @@ machine_at_brio80xx_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x14, PCI_CARD_VIDEO, 4, 0, 0, 0); - pci_register_slot(0x13, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x12, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x11, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x14, PCI_CARD_VIDEO, 4, 0, 0, 0); + pci_register_slot(0x13, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x12, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x11, PCI_CARD_NORMAL, 3, 4, 1, 2); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); device_add(&i430vx_device); device_add(&piix3_device); @@ -513,10 +513,10 @@ machine_at_pb680_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(0x08, PCI_CARD_VIDEO, 4, 0, 0, 0); - pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x08, PCI_CARD_VIDEO, 4, 0, 0, 0); + pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 4, 1, 2); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&i430vx_device); device_add(&piix3_device); @@ -542,10 +542,10 @@ machine_at_mb520n_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(0x14, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x12, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x11, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x14, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x12, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x11, PCI_CARD_NORMAL, 4, 1, 2, 3); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&i430vx_device); device_add(&piix3_device); @@ -571,10 +571,10 @@ machine_at_i430vx_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(0x11, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x12, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x14, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x13, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x11, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x12, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x14, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x13, PCI_CARD_NORMAL, 4, 1, 2, 3); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&i430vx_device); device_add(&piix3_device); @@ -600,12 +600,12 @@ machine_at_nupro592_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(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x12, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x14, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 4, 1, 2); /*Strongly suspect these are on-board slots*/ - pci_register_slot(0x0C, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x12, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x14, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 4, 1, 2); /*Strongly suspect these are on-board slots*/ + pci_register_slot(0x0C, PCI_CARD_NORMAL, 4, 1, 2, 3); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 4); /* PIIX4 */ device_add(&i430tx_device); device_add(&piix4_device); @@ -637,13 +637,13 @@ machine_at_tx97_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(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x09, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x09, PCI_CARD_NORMAL, 4, 1, 2, 3); pci_register_slot(0x01, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); /* PIIX4 */ - pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x08, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x08, PCI_CARD_NORMAL, 1, 2, 3, 4); device_add(&i430tx_device); device_add(&piix4_device); device_add(&keyboard_ps2_ami_pci_device); @@ -691,11 +691,11 @@ machine_at_an430tx_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); /* PIIX4 */ - // pci_register_slot(0x08, PCI_CARD_VIDEO, 4, 0, 0, 0); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0F, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x10, PCI_CARD_NORMAL, 4, 1, 2, 3); + // pci_register_slot(0x08, PCI_CARD_VIDEO, 4, 0, 0, 0); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x10, PCI_CARD_NORMAL, 4, 1, 2, 3); device_add(&i430tx_device); device_add(&piix4_device); device_add(&keyboard_ps2_ami_pci_device); @@ -722,13 +722,13 @@ machine_at_ym430tx_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(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x09, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x09, PCI_CARD_NORMAL, 4, 1, 2, 3); pci_register_slot(0x01, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); /* PIIX4 */ - pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x08, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x08, PCI_CARD_NORMAL, 1, 2, 3, 4); device_add(&i430tx_device); device_add(&piix4_device); device_add(&keyboard_ps2_pci_device); @@ -754,10 +754,10 @@ machine_at_mb540n_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(0x11, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x12, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x14, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x11, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x12, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x14, PCI_CARD_NORMAL, 1, 2, 3, 4); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); /* PIIX4 */ device_add(&i430tx_device); device_add(&piix4_device); @@ -784,12 +784,12 @@ machine_at_56a5_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(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x12, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x14, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x12, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x14, PCI_CARD_NORMAL, 4, 1, 2, 3); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); /* PIIX4 */ - pci_register_slot(0x10, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x10, PCI_CARD_NORMAL, 1, 2, 3, 4); device_add(&i430tx_device); device_add(&piix4_device); device_add(&keyboard_ps2_pci_device); @@ -816,10 +816,10 @@ machine_at_p5mms98_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); /* PIIX4 */ - pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x12, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x14, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x12, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x14, PCI_CARD_NORMAL, 4, 1, 2, 3); device_add(&i430tx_device); device_add(&piix4_device); device_add(&keyboard_ps2_ami_pci_device); @@ -847,10 +847,10 @@ machine_at_ficva502_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(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(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(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); device_add(&via_vpx_device); device_add(&via_vt82c586b_device); @@ -966,15 +966,15 @@ machine_at_m560_init(const machine_t *model) machine_at_common_init_ex(model, 2); pci_init(PCI_CONFIG_TYPE_1); - pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x02, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x02, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); pci_register_slot(0x0B, PCI_CARD_SOUTHBRIDGE_IDE, 1, 2, 3, 4); pci_register_slot(0x0C, PCI_CARD_SOUTHBRIDGE_PMU, 1, 2, 3, 4); pci_register_slot(0x0F, PCI_CARD_SOUTHBRIDGE_USB, 1, 2, 3, 4); - pci_register_slot(0x03, PCI_CARD_NORMAL, 1, 2, 3, 4); - 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(0x06, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x03, PCI_CARD_NORMAL, 1, 2, 3, 4); + 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(0x06, PCI_CARD_NORMAL, 4, 1, 2, 3); device_add(&ali1531_device); device_add(&ali1543_device); /* -5 */ device_add(&sst_flash_29ee010_device); @@ -997,16 +997,16 @@ machine_at_ms5164_init(const machine_t *model) machine_at_common_init_ex(model, 2); pci_init(PCI_CONFIG_TYPE_1); - pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x02, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x02, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); pci_register_slot(0x0B, PCI_CARD_SOUTHBRIDGE_IDE, 5, 6, 0, 0); pci_register_slot(0x0C, PCI_CARD_SOUTHBRIDGE_PMU, 1, 2, 3, 4); pci_register_slot(0x0F, PCI_CARD_SOUTHBRIDGE_USB, 1, 2, 3, 4); - pci_register_slot(0x03, PCI_CARD_NORMAL, 1, 2, 3, 4); - 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(0x06, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x07, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x03, PCI_CARD_NORMAL, 1, 2, 3, 4); + 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(0x06, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x07, PCI_CARD_NORMAL, 1, 2, 3, 4); device_add(&ali1531_device); device_add(&ali1543_device); /* -5 */ diff --git a/src/machine/m_at_socket7_3v.c b/src/machine/m_at_socket7_3v.c index 09b142c83..3973bd8cf 100644 --- a/src/machine/m_at_socket7_3v.c +++ b/src/machine/m_at_socket7_3v.c @@ -51,11 +51,11 @@ machine_at_thor_common_init(const machine_t *model, int mr) pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x08, PCI_CARD_VIDEO, 4, 0, 0, 0); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0F, PCI_CARD_NORMAL, 3, 4, 2, 1); - pci_register_slot(0x10, PCI_CARD_NORMAL, 4, 3, 2, 1); + pci_register_slot(0x08, PCI_CARD_VIDEO, 4, 0, 0, 0); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 3, 4, 2, 1); + pci_register_slot(0x10, PCI_CARD_NORMAL, 4, 3, 2, 1); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); if (gfxcard == VID_INTERNAL) @@ -76,10 +76,10 @@ machine_at_p54tp4xe_common_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(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x09, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x09, PCI_CARD_NORMAL, 4, 1, 2, 3); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&keyboard_ps2_pci_device); device_add(&i430fx_device); @@ -126,7 +126,8 @@ machine_at_gw2katx_init(const machine_t *model) int ret; ret = bios_load_linear_combined("roms/machines/gw2katx/1003CN0T.BIO", - "roms/machines/gw2katx/1003CN0T.BI1", 0x20000, 128); + "roms/machines/gw2katx/1003CN0T.BI1", + 0x20000, 128); if (bios_only || !ret) return ret; @@ -142,7 +143,8 @@ machine_at_thor_init(const machine_t *model) int ret; ret = bios_load_linear_combined("roms/machines/thor/1006cn0_.bio", - "roms/machines/thor/1006cn0_.bi1", 0x20000, 128); + "roms/machines/thor/1006cn0_.bi1", + 0x20000, 128); if (bios_only || !ret) return ret; @@ -174,7 +176,8 @@ machine_at_endeavor_init(const machine_t *model) int ret; ret = bios_load_linear_combined("roms/machines/endeavor/1006cb0_.bio", - "roms/machines/endeavor/1006cb0_.bi1", 0x1d000, 128); + "roms/machines/endeavor/1006cb0_.bi1", + 0x1d000, 128); if (bios_only || !ret) return ret; @@ -183,11 +186,11 @@ machine_at_endeavor_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(0x08, PCI_CARD_VIDEO, 4, 0, 0, 0); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0F, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x10, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x08, PCI_CARD_VIDEO, 4, 0, 0, 0); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x10, PCI_CARD_NORMAL, 4, 1, 2, 3); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); if (gfxcard == VID_INTERNAL) @@ -218,9 +221,9 @@ machine_at_ms5119_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, 0, 0, 0, 0); - pci_register_slot(0x0d, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0e, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0f, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0d, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0e, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0f, PCI_CARD_NORMAL, 3, 4, 1, 2); device_add(&i430fx_device); device_add(&piix_device); @@ -246,10 +249,10 @@ machine_at_pb640_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(0x08, PCI_CARD_VIDEO, 4, 0, 0, 0); - pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 1, 3, 4); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 2, 1, 4); + pci_register_slot(0x08, PCI_CARD_VIDEO, 4, 0, 0, 0); + pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 1, 3, 4); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 2, 1, 4); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&i430fx_rev02_device); device_add(&piix_rev02_device); @@ -280,10 +283,10 @@ machine_at_fmb_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, 0, 0, 0, 0); - pci_register_slot(0x14, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x12, PCI_CARD_NORMAL, 3, 4, 2, 1); - pci_register_slot(0x11, PCI_CARD_NORMAL, 4, 3, 2, 1); + pci_register_slot(0x14, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x12, PCI_CARD_NORMAL, 3, 4, 2, 1); + pci_register_slot(0x11, PCI_CARD_NORMAL, 4, 3, 2, 1); device_add(&i430fx_device); device_add(&piix_no_mirq_device); @@ -310,11 +313,11 @@ machine_at_acerm3a_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, 0, 0, 0, 0); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0E, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x0F, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x10, PCI_CARD_VIDEO, 4, 0, 0, 0); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0E, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x10, PCI_CARD_VIDEO, 4, 0, 0, 0); device_add(&i430hx_device); device_add(&piix3_device); device_add(&keyboard_ps2_pci_device); @@ -340,12 +343,12 @@ machine_at_ap53_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(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x12, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x14, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x12, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x14, PCI_CARD_NORMAL, 4, 1, 2, 3); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x06, PCI_CARD_VIDEO, 1, 2, 3, 4); + pci_register_slot(0x06, PCI_CARD_VIDEO, 1, 2, 3, 4); device_add(&i430hx_device); device_add(&piix3_device); device_add(&keyboard_ps2_ami_pci_device); @@ -370,10 +373,10 @@ machine_at_8500tuc_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(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(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(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); device_add(&i430hx_device); device_add(&piix3_device); @@ -399,10 +402,10 @@ machine_at_p55t2s_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(0x12, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x13, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x14, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x11, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x12, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x13, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x14, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x11, PCI_CARD_NORMAL, 2, 3, 4, 1); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&i430hx_device); device_add(&piix3_device); @@ -428,10 +431,10 @@ machine_at_p5vxb_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(0x05, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x06, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x08, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x09, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x05, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x06, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x08, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x09, PCI_CARD_NORMAL, 4, 1, 2, 3); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 4); device_add(&i430vx_device); device_add(&piix3_device); @@ -461,11 +464,11 @@ machine_at_gw2kte_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(0x08, PCI_CARD_VIDEO, 4, 0, 0, 0); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0F, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x10, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x08, PCI_CARD_VIDEO, 4, 0, 0, 0); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x10, PCI_CARD_NORMAL, 3, 4, 1, 2); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 4); device_add(&i430vx_device); device_add(&piix3_device); @@ -492,10 +495,10 @@ machine_at_ap5s_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(0x01, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0F, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x11, PCI_CARD_NORMAL, 3, 4, 2, 1); - pci_register_slot(0x13, PCI_CARD_NORMAL, 4, 3, 2, 1); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x11, PCI_CARD_NORMAL, 3, 4, 2, 1); + pci_register_slot(0x13, PCI_CARD_NORMAL, 4, 3, 2, 1); device_add(&sis_5511_device); device_add(&keyboard_ps2_ami_pci_device); @@ -521,10 +524,10 @@ machine_at_ms5124_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(0x01, PCI_CARD_SOUTHBRIDGE, 0xFE, 0xFF, 0, 0); - pci_register_slot(0x10, PCI_CARD_NORMAL, 0x41, 0x42, 0x43, 0x44); - pci_register_slot(0x11, PCI_CARD_NORMAL, 0x44, 0x41, 0x42, 0x43); - pci_register_slot(0x12, PCI_CARD_NORMAL, 0x43, 0x44, 0x41, 0x42); - pci_register_slot(0x0F, PCI_CARD_NORMAL, 0x42, 0x43, 0x44, 0x41); + pci_register_slot(0x10, PCI_CARD_NORMAL, 0x41, 0x42, 0x43, 0x44); + pci_register_slot(0x11, PCI_CARD_NORMAL, 0x44, 0x41, 0x42, 0x43); + pci_register_slot(0x12, PCI_CARD_NORMAL, 0x43, 0x44, 0x41, 0x42); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 0x42, 0x43, 0x44, 0x41); device_add(&sis_5511_device); device_add(&keyboard_ps2_ami_pci_device); @@ -550,10 +553,10 @@ machine_at_vectra54_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(0x0F, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x0D, PCI_CARD_VIDEO, 0, 0, 0, 0); - pci_register_slot(0x06, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x07, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x08, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0D, PCI_CARD_VIDEO, 0, 0, 0, 0); + pci_register_slot(0x06, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x07, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x08, PCI_CARD_NORMAL, 3, 4, 1, 2); if (gfxcard == VID_INTERNAL) device_add(&s3_phoenix_trio64_onboard_pci_device); diff --git a/src/machine/m_at_socket8.c b/src/machine/m_at_socket8.c index 5ffbec822..c1c95f197 100644 --- a/src/machine/m_at_socket8.c +++ b/src/machine/m_at_socket8.c @@ -55,13 +55,13 @@ machine_at_p6rp4_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x19, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x14, PCI_CARD_AGPBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x14, PCI_CARD_AGPBRIDGE, 0, 0, 0, 0); pci_register_slot(0x02, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x08, PCI_CARD_IDE, 0, 0, 0, 0); - pci_register_slot(0x07, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x06, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x05, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x04, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x08, PCI_CARD_IDE, 0, 0, 0, 0); + pci_register_slot(0x07, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x06, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x05, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x04, PCI_CARD_NORMAL, 4, 1, 2, 3); device_add(&i450kx_device); device_add(&sio_zb_device); device_add(&ide_cmd646_device); @@ -89,10 +89,10 @@ machine_at_686nx_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, 0, 0, 0, 0); - 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(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); device_add(&i440fx_device); device_add(&piix3_device); device_add(&keyboard_ps2_ami_pci_device); // Uses the AMIKEY keyboard controller @@ -118,10 +118,10 @@ machine_at_mb600n_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, 0, 0, 0, 0); - pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x12, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x14, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x12, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x14, PCI_CARD_NORMAL, 4, 1, 2, 3); device_add(&i440fx_device); device_add(&piix3_device); device_add(&keyboard_ps2_ami_pci_device); @@ -147,11 +147,11 @@ machine_at_acerv60n_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, 0, 0, 0, 0); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0F, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x10, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x12, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x10, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x12, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 2, 3, 4, 1); device_add(&i440fx_device); device_add(&piix3_device); device_add(&keyboard_ps2_pci_device); @@ -180,10 +180,10 @@ machine_at_vs440fx_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(0x0B, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0F, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x11, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x11, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&i440fx_device); device_add(&piix3_device); @@ -214,10 +214,10 @@ machine_at_ap440fx_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(0x08, PCI_CARD_VIDEO, 3, 0, 0, 0); - pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 3, 2, 4); - pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 1, 3, 4); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 2, 1, 4); + pci_register_slot(0x08, PCI_CARD_VIDEO, 3, 0, 0, 0); + pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 3, 2, 4); + pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 1, 3, 4); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 2, 1, 4); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 4); device_add(&i440fx_device); device_add(&piix3_device); @@ -244,10 +244,10 @@ machine_at_8600ttc_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, 0, 0, 0, 0); - 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(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); device_add(&i440fx_device); device_add(&piix3_device); device_add(&keyboard_ps2_ami_pci_device); @@ -273,10 +273,10 @@ machine_at_m6mi_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, 0, 0, 0, 0); - pci_register_slot(0x12, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x11, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x10, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x0F, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x12, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x11, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x10, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 4, 1, 2, 3); device_add(&i440fx_device); device_add(&piix3_device); device_add(&keyboard_ps2_ami_pci_device); @@ -294,11 +294,11 @@ machine_at_p65up5_common_init(const machine_t *model, const device_t *northbridg pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); pci_register_slot(0x01, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x09, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x09, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 4, 1, 2, 3); device_add(northbridge); device_add(&piix3_ioapic_device); device_add(&keyboard_ps2_ami_pci_device); diff --git a/src/machine/m_at_t3100e.c b/src/machine/m_at_t3100e.c index 6b09b1e02..451955ad1 100644 --- a/src/machine/m_at_t3100e.c +++ b/src/machine/m_at_t3100e.c @@ -55,8 +55,8 @@ * * Page mapped at 0xD000 0xD400 0xD800 0xDC00 * ------------------------------------------------------ - * Pages 0x00-0x7F 0x208 0x4208 0x8208 0xc208 - * Pages 0x80-0xFF 0x218 0x4218 0x8218 0xc218 + * Pages 0x00-0x7F 0x208 0x4208 0x8208 0xc208 + * Pages 0x80-0xFF 0x218 0x4218 0x8218 0xc218 * Pages 0x100-0x17F 0x258 0x4258 0x8258 0xc258 * Pages 0x180-0x1FF 0x268 0x4268 0x8268 0xc268 * diff --git a/src/machine/m_elt.c b/src/machine/m_elt.c index 47e6f145d..81647612c 100644 --- a/src/machine/m_elt.c +++ b/src/machine/m_elt.c @@ -31,7 +31,6 @@ * USA. */ -// clang-format off #include #include #include @@ -51,7 +50,6 @@ #include <86box/rom.h> #include <86box/video.h> #include <86box/vid_cga.h> -// clang-format on static void elt_vid_off_poll(void *p) diff --git a/src/machine/m_europc.c b/src/machine/m_europc.c index 3f78c8f49..116e10e5f 100644 --- a/src/machine/m_europc.c +++ b/src/machine/m_europc.c @@ -293,50 +293,50 @@ rtc_reset(nvr_t *nvr) /* * EuroPC System Configuration: * - * [A] unknown + * [A] unknown * - * [B] 7 1 bootdrive extern - * 0 bootdribe intern - * 6:5 11 invalid hard disk type - * 10 hard disk installed, type 2 - * 01 hard disk installed, type 1 - * 00 hard disk not installed - * 4:3 11 invalid external drive type - * 10 external drive 720K - * 01 external drive 360K - * 00 external drive disabled - * 2 unknown - * 1:0 11 invalid internal drive type - * 10 internal drive 360K - * 01 internal drive 720K - * 00 internal drive disabled + * [B] 7 1 bootdrive extern + * 0 bootdrive intern + * 6:5 11 invalid hard disk type + * 10 hard disk installed, type 2 + * 01 hard disk installed, type 1 + * 00 hard disk not installed + * 4:3 11 invalid external drive type + * 10 external drive 720K + * 01 external drive 360K + * 00 external drive disabled + * 2 unknown + * 1:0 11 invalid internal drive type + * 10 internal drive 360K + * 01 internal drive 720K + * 00 internal drive disabled * - * [C] 7:6 unknown - * 5 monitor detection OFF - * 4 unknown - * 3:2 11 illegal memory size - * 10 512K - * 01 256K - * 00 640K - * 1:0 11 illegal game port - * 10 gameport as mouse port - * 01 gameport as joysticks - * 00 gameport disabled + * [C] 7:6 unknown + * 5 monitor detection OFF + * 4 unknown + * 3:2 11 illegal memory size + * 10 512K + * 01 256K + * 00 640K + * 1:0 11 illegal game port + * 10 gameport as mouse port + * 01 gameport as joysticks + * 00 gameport disabled * - * [D] 7:6 10 9MHz CPU speed - * 01 7MHz CPU speed - * 00 4.77 MHz CPU - * 5 unknown - * 4 external: color, internal: mono - * 3 unknown - * 2 internal video ON - * 1:0 11 mono - * 10 color80 - * 01 color40 - * 00 special (EGA,VGA etc) + * [D] 7:6 10 9MHz CPU speed + * 01 7MHz CPU speed + * 00 4.77 MHz CPU + * 5 unknown + * 4 external: color, internal: mono + * 3 unknown + * 2 internal video ON + * 1:0 11 mono + * 10 color80 + * 01 color40 + * 00 special (EGA,VGA etc) * - * [E] 7:4 unknown - * 3:0 country (00=Deutschland, 0A=ASCII) + * [E] 7:4 unknown + * 3:0 country (00=Deutschland, 0A=ASCII) */ nvr->regs[MRTC_CONF_A] = 0x00; /* CONFIG A */ nvr->regs[MRTC_CONF_B] = 0x0A; /* CONFIG B */ @@ -400,15 +400,15 @@ jim_set(europc_t *sys, uint8_t reg, uint8_t val) case 4: /* CPU Speed control */ switch (val & 0xc0) { case 0x00: /* 4.77 MHz */ - // cpu_set_clockscale(0, 1.0/2); + // cpu_set_clockscale(0, 1.0/2); break; case 0x40: /* 7.16 MHz */ - // cpu_set_clockscale(0, 3.0/4); + // cpu_set_clockscale(0, 3.0/4); break; default: /* 9.54 MHz */ - // cpu_set_clockscale(0, 1);break; + // cpu_set_clockscale(0, 1);break; break; } break; diff --git a/src/machine/m_tandy.c b/src/machine/m_tandy.c index c7789de26..bd5e22d89 100644 --- a/src/machine/m_tandy.c +++ b/src/machine/m_tandy.c @@ -174,219 +174,219 @@ static const scancode scancode_tandy[512] = { { {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} }, /*054*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*058*/ + { {0}, {0} }, { {0}, {0} }, /*058*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*05c*/ + { {0}, {0} }, { {0}, {0} }, /*05c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*060*/ + { {0}, {0} }, { {0}, {0} }, /*060*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*064*/ + { {0}, {0} }, { {0}, {0} }, /*064*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*068*/ + { {0}, {0} }, { {0}, {0} }, /*068*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*06c*/ + { {0}, {0} }, { {0}, {0} }, /*06c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*070*/ + { {0}, {0} }, { {0}, {0} }, /*070*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*074*/ + { {0}, {0} }, { {0}, {0} }, /*074*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*078*/ + { {0}, {0} }, { {0}, {0} }, /*078*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*07c*/ + { {0}, {0} }, { {0}, {0} }, /*07c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*080*/ + { {0}, {0} }, { {0}, {0} }, /*080*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*084*/ + { {0}, {0} }, { {0}, {0} }, /*084*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*088*/ + { {0}, {0} }, { {0}, {0} }, /*088*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*08c*/ + { {0}, {0} }, { {0}, {0} }, /*08c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*090*/ + { {0}, {0} }, { {0}, {0} }, /*090*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*094*/ + { {0}, {0} }, { {0}, {0} }, /*094*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*098*/ + { {0}, {0} }, { {0}, {0} }, /*098*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*09c*/ + { {0}, {0} }, { {0}, {0} }, /*09c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0a0*/ + { {0}, {0} }, { {0}, {0} }, /*0a0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0a4*/ + { {0}, {0} }, { {0}, {0} }, /*0a4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0a8*/ + { {0}, {0} }, { {0}, {0} }, /*0a8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0ac*/ + { {0}, {0} }, { {0}, {0} }, /*0ac*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0b0*/ + { {0}, {0} }, { {0}, {0} }, /*0b0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0b4*/ + { {0}, {0} }, { {0}, {0} }, /*0b4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0b8*/ + { {0}, {0} }, { {0}, {0} }, /*0b8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0bc*/ + { {0}, {0} }, { {0}, {0} }, /*0bc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0c0*/ + { {0}, {0} }, { {0}, {0} }, /*0c0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0c4*/ + { {0}, {0} }, { {0}, {0} }, /*0c4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0c8*/ + { {0}, {0} }, { {0}, {0} }, /*0c8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0cc*/ + { {0}, {0} }, { {0}, {0} }, /*0cc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0d0*/ + { {0}, {0} }, { {0}, {0} }, /*0d0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0d4*/ + { {0}, {0} }, { {0}, {0} }, /*0d4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0d8*/ + { {0}, {0} }, { {0}, {0} }, /*0d8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0dc*/ + { {0}, {0} }, { {0}, {0} }, /*0dc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0e0*/ + { {0}, {0} }, { {0}, {0} }, /*0e0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0e4*/ + { {0}, {0} }, { {0}, {0} }, /*0e4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0e8*/ + { {0}, {0} }, { {0}, {0} }, /*0e8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0ec*/ + { {0}, {0} }, { {0}, {0} }, /*0ec*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0f0*/ + { {0}, {0} }, { {0}, {0} }, /*0f0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0f4*/ + { {0}, {0} }, { {0}, {0} }, /*0f4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0f8*/ + { {0}, {0} }, { {0}, {0} }, /*0f8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0fc*/ + { {0}, {0} }, { {0}, {0} }, /*0fc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*100*/ + { {0}, {0} }, { {0}, {0} }, /*100*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*104*/ + { {0}, {0} }, { {0}, {0} }, /*104*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*108*/ + { {0}, {0} }, { {0}, {0} }, /*108*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*10c*/ + { {0}, {0} }, { {0}, {0} }, /*10c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*110*/ + { {0}, {0} }, { {0}, {0} }, /*110*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*114*/ + { {0}, {0} }, { {0}, {0} }, /*114*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*118*/ + { {0}, {0} }, { {0}, {0} }, /*118*/ { {0x57, 0}, {0xd7, 0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*11c*/ + { {0}, {0} }, { {0}, {0} }, /*11c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*120*/ + { {0}, {0} }, { {0}, {0} }, /*120*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*124*/ + { {0}, {0} }, { {0}, {0} }, /*124*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*128*/ + { {0}, {0} }, { {0}, {0} }, /*128*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*12c*/ + { {0}, {0} }, { {0}, {0} }, /*12c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*130*/ + { {0}, {0} }, { {0}, {0} }, /*130*/ { {0}, {0} }, { {0x35, 0}, {0xb5, 0} }, - { {0}, {0} }, { {0x37, 0}, {0xb7, 0} }, /*134*/ + { {0}, {0} }, { {0x37, 0}, {0xb7, 0} }, /*134*/ { {0x38, 0}, {0xb8, 0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*138*/ + { {0}, {0} }, { {0}, {0} }, /*138*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*13c*/ + { {0}, {0} }, { {0}, {0} }, /*13c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*140*/ + { {0}, {0} }, { {0}, {0} }, /*140*/ { {0}, {0} }, { {0}, {0} }, - { {0x46, 0}, {0xc6, 0} }, { {0x47, 0}, {0xc7, 0} }, /*144*/ + { {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} }, { {0x2b, 0}, {0xab, 0} }, /*148*/ { {0}, {0} }, { {0x4e, 0}, {0xce, 0} }, - { {0}, {0} }, { {0x4f, 0}, {0xcf, 0} }, /*14c*/ + { {0}, {0} }, { {0x4f, 0}, {0xcf, 0} }, /*14c*/ { {0x4a, 0}, {0xca, 0} }, { {0x51, 0}, {0xd1, 0} }, - { {0x52, 0}, {0xd2, 0} }, { {0x53, 0}, {0xd3, 0} }, /*150*/ + { {0x52, 0}, {0xd2, 0} }, { {0x53, 0}, {0xd3, 0} }, /*150*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*154*/ + { {0}, {0} }, { {0}, {0} }, /*154*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*158*/ + { {0}, {0} }, { {0}, {0} }, /*158*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*15c*/ + { {0}, {0} }, { {0}, {0} }, /*15c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*160*/ + { {0}, {0} }, { {0}, {0} }, /*160*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*164*/ + { {0}, {0} }, { {0}, {0} }, /*164*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*168*/ + { {0}, {0} }, { {0}, {0} }, /*168*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*16c*/ + { {0}, {0} }, { {0}, {0} }, /*16c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*170*/ + { {0}, {0} }, { {0}, {0} }, /*170*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*174*/ + { {0}, {0} }, { {0}, {0} }, /*174*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*148*/ + { {0}, {0} }, { {0}, {0} }, /*148*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*17c*/ + { {0}, {0} }, { {0}, {0} }, /*17c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*180*/ + { {0}, {0} }, { {0}, {0} }, /*180*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*184*/ + { {0}, {0} }, { {0}, {0} }, /*184*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*88*/ + { {0}, {0} }, { {0}, {0} }, /*188*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*18c*/ + { {0}, {0} }, { {0}, {0} }, /*18c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*190*/ + { {0}, {0} }, { {0}, {0} }, /*190*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*194*/ + { {0}, {0} }, { {0}, {0} }, /*194*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*198*/ + { {0}, {0} }, { {0}, {0} }, /*198*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*19c*/ + { {0}, {0} }, { {0}, {0} }, /*19c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1a0*/ + { {0}, {0} }, { {0}, {0} }, /*1a0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1a4*/ + { {0}, {0} }, { {0}, {0} }, /*1a4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1a8*/ + { {0}, {0} }, { {0}, {0} }, /*1a8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1ac*/ + { {0}, {0} }, { {0}, {0} }, /*1ac*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1b0*/ + { {0}, {0} }, { {0}, {0} }, /*1b0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1b4*/ + { {0}, {0} }, { {0}, {0} }, /*1b4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1b8*/ + { {0}, {0} }, { {0}, {0} }, /*1b8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1bc*/ + { {0}, {0} }, { {0}, {0} }, /*1bc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1c0*/ + { {0}, {0} }, { {0}, {0} }, /*1c0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1c4*/ + { {0}, {0} }, { {0}, {0} }, /*1c4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1c8*/ + { {0}, {0} }, { {0}, {0} }, /*1c8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1cc*/ + { {0}, {0} }, { {0}, {0} }, /*1cc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1d0*/ + { {0}, {0} }, { {0}, {0} }, /*1d0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1d4*/ + { {0}, {0} }, { {0}, {0} }, /*1d4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1d8*/ + { {0}, {0} }, { {0}, {0} }, /*1d8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1dc*/ + { {0}, {0} }, { {0}, {0} }, /*1dc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1e0*/ + { {0}, {0} }, { {0}, {0} }, /*1e0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1e4*/ + { {0}, {0} }, { {0}, {0} }, /*1e4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1e8*/ + { {0}, {0} }, { {0}, {0} }, /*1e8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1ec*/ + { {0}, {0} }, { {0}, {0} }, /*1ec*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1f0*/ + { {0}, {0} }, { {0}, {0} }, /*1f0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1f4*/ + { {0}, {0} }, { {0}, {0} }, /*1f4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1f8*/ + { {0}, {0} }, { {0}, {0} }, /*1f8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} } /*1fc*/ + { {0}, {0} }, { {0}, {0} } /*1fc*/ // 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 c978e2caf..4bf24fc1d 100644 --- a/src/machine/m_xt_olivetti.c +++ b/src/machine/m_xt_olivetti.c @@ -889,219 +889,219 @@ const scancode scancode_olivetti_m24_deluxe[512] = { { {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*/ + { {0x5e, 0}, {0xde, 0} }, { {0x60, 0}, {0xe0, 0} }, /*054*/ { {0x61, 0}, {0xe1, 0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*058*/ + { {0}, {0} }, { {0}, {0} }, /*058*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*05c*/ + { {0}, {0} }, { {0}, {0} }, /*05c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*060*/ + { {0}, {0} }, { {0}, {0} }, /*060*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*064*/ + { {0}, {0} }, { {0}, {0} }, /*064*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*068*/ + { {0}, {0} }, { {0}, {0} }, /*068*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*06c*/ + { {0}, {0} }, { {0}, {0} }, /*06c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*070*/ + { {0}, {0} }, { {0}, {0} }, /*070*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*074*/ + { {0}, {0} }, { {0}, {0} }, /*074*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*078*/ + { {0}, {0} }, { {0}, {0} }, /*078*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*07c*/ + { {0}, {0} }, { {0}, {0} }, /*07c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*080*/ + { {0}, {0} }, { {0}, {0} }, /*080*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*084*/ + { {0}, {0} }, { {0}, {0} }, /*084*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*088*/ + { {0}, {0} }, { {0}, {0} }, /*088*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*08c*/ + { {0}, {0} }, { {0}, {0} }, /*08c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*090*/ + { {0}, {0} }, { {0}, {0} }, /*090*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*094*/ + { {0}, {0} }, { {0}, {0} }, /*094*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*098*/ + { {0}, {0} }, { {0}, {0} }, /*098*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*09c*/ + { {0}, {0} }, { {0}, {0} }, /*09c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0a0*/ + { {0}, {0} }, { {0}, {0} }, /*0a0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0a4*/ + { {0}, {0} }, { {0}, {0} }, /*0a4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0a8*/ + { {0}, {0} }, { {0}, {0} }, /*0a8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0ac*/ + { {0}, {0} }, { {0}, {0} }, /*0ac*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0b0*/ + { {0}, {0} }, { {0}, {0} }, /*0b0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0b4*/ + { {0}, {0} }, { {0}, {0} }, /*0b4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0b8*/ + { {0}, {0} }, { {0}, {0} }, /*0b8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0bc*/ + { {0}, {0} }, { {0}, {0} }, /*0bc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0c0*/ + { {0}, {0} }, { {0}, {0} }, /*0c0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0c4*/ + { {0}, {0} }, { {0}, {0} }, /*0c4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0c8*/ + { {0}, {0} }, { {0}, {0} }, /*0c8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0cc*/ + { {0}, {0} }, { {0}, {0} }, /*0cc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0d0*/ + { {0}, {0} }, { {0}, {0} }, /*0d0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0d4*/ + { {0}, {0} }, { {0}, {0} }, /*0d4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0d8*/ + { {0}, {0} }, { {0}, {0} }, /*0d8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0dc*/ + { {0}, {0} }, { {0}, {0} }, /*0dc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0e0*/ + { {0}, {0} }, { {0}, {0} }, /*0e0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0e4*/ + { {0}, {0} }, { {0}, {0} }, /*0e4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0e8*/ + { {0}, {0} }, { {0}, {0} }, /*0e8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0ec*/ + { {0}, {0} }, { {0}, {0} }, /*0ec*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0f0*/ + { {0}, {0} }, { {0}, {0} }, /*0f0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0f4*/ + { {0}, {0} }, { {0}, {0} }, /*0f4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0f8*/ + { {0}, {0} }, { {0}, {0} }, /*0f8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0fc*/ + { {0}, {0} }, { {0}, {0} }, /*0fc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*100*/ + { {0}, {0} }, { {0}, {0} }, /*100*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*104*/ + { {0}, {0} }, { {0}, {0} }, /*104*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*108*/ + { {0}, {0} }, { {0}, {0} }, /*108*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*10c*/ + { {0}, {0} }, { {0}, {0} }, /*10c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*110*/ + { {0}, {0} }, { {0}, {0} }, /*110*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*114*/ + { {0}, {0} }, { {0}, {0} }, /*114*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*118*/ + { {0}, {0} }, { {0}, {0} }, /*118*/ { {0x57, 0}, {0xd7, 0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*11c*/ + { {0}, {0} }, { {0}, {0} }, /*11c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*120*/ + { {0}, {0} }, { {0}, {0} }, /*120*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*124*/ + { {0}, {0} }, { {0}, {0} }, /*124*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*128*/ + { {0}, {0} }, { {0}, {0} }, /*128*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*12c*/ + { {0}, {0} }, { {0}, {0} }, /*12c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*130*/ + { {0}, {0} }, { {0}, {0} }, /*130*/ { {0}, {0} }, { {0x5f, 0}, {0xdf, 0} }, - { {0}, {0} }, { {0x37, 0}, {0xb7, 0} }, /*134*/ + { {0}, {0} }, { {0x37, 0}, {0xb7, 0} }, /*134*/ { {0x66, 0}, {0xe6, 0} }, { {0x55, 0}, {0xd5, 0} }, - { {0}, {0} }, { {0}, {0} }, /*138*/ + { {0}, {0} }, { {0}, {0} }, /*138*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*13c*/ + { {0}, {0} }, { {0}, {0} }, /*13c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*140*/ + { {0}, {0} }, { {0}, {0} }, /*140*/ { {0}, {0} }, { {0}, {0} }, - { {0x46, 0}, {0xc6, 0} }, { {0x63, 0}, {0xe3, 0} }, /*144*/ + { {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} }, { {0x58, 0}, {0xd8, 0} }, /*148*/ { {0}, {0} }, { {0x5a, 0}, {0xda, 0} }, - { {0}, {0} }, { {0x65, 0}, {0xe5, 0} }, /*14c*/ + { {0}, {0} }, { {0x65, 0}, {0xe5, 0} }, /*14c*/ { {0x59, 0}, {0xd9, 0} }, { {0x5d, 0}, {0xdd, 0} }, - { {0x62, 0}, {0xe2, 0} }, { {0x64, 0}, {0xe4, 0} }, /*150*/ + { {0x62, 0}, {0xe2, 0} }, { {0x64, 0}, {0xe4, 0} }, /*150*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*154*/ + { {0}, {0} }, { {0}, {0} }, /*154*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0x54, 0}, {0xd4, 0} }, /*158*/ + { {0}, {0} }, { {0x54, 0}, {0xd4, 0} }, /*158*/ { {0x67, 0}, {0xe7, 0} }, { {0x56, 0}, {0xd6, 0} }, - { {0}, {0} }, { {0}, {0} }, /*15c*/ + { {0}, {0} }, { {0}, {0} }, /*15c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*160*/ + { {0}, {0} }, { {0}, {0} }, /*160*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*164*/ + { {0}, {0} }, { {0}, {0} }, /*164*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*168*/ + { {0}, {0} }, { {0}, {0} }, /*168*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*16c*/ + { {0}, {0} }, { {0}, {0} }, /*16c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*170*/ + { {0}, {0} }, { {0}, {0} }, /*170*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*174*/ + { {0}, {0} }, { {0}, {0} }, /*174*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*148*/ + { {0}, {0} }, { {0}, {0} }, /*148*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*17c*/ + { {0}, {0} }, { {0}, {0} }, /*17c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*180*/ + { {0}, {0} }, { {0}, {0} }, /*180*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*184*/ + { {0}, {0} }, { {0}, {0} }, /*184*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*88*/ + { {0}, {0} }, { {0}, {0} }, /*188*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*18c*/ + { {0}, {0} }, { {0}, {0} }, /*18c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*190*/ + { {0}, {0} }, { {0}, {0} }, /*190*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*194*/ + { {0}, {0} }, { {0}, {0} }, /*194*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*198*/ + { {0}, {0} }, { {0}, {0} }, /*198*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*19c*/ + { {0}, {0} }, { {0}, {0} }, /*19c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1a0*/ + { {0}, {0} }, { {0}, {0} }, /*1a0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1a4*/ + { {0}, {0} }, { {0}, {0} }, /*1a4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1a8*/ + { {0}, {0} }, { {0}, {0} }, /*1a8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1ac*/ + { {0}, {0} }, { {0}, {0} }, /*1ac*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1b0*/ + { {0}, {0} }, { {0}, {0} }, /*1b0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1b4*/ + { {0}, {0} }, { {0}, {0} }, /*1b4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1b8*/ + { {0}, {0} }, { {0}, {0} }, /*1b8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1bc*/ + { {0}, {0} }, { {0}, {0} }, /*1bc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1c0*/ + { {0}, {0} }, { {0}, {0} }, /*1c0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1c4*/ + { {0}, {0} }, { {0}, {0} }, /*1c4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1c8*/ + { {0}, {0} }, { {0}, {0} }, /*1c8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1cc*/ + { {0}, {0} }, { {0}, {0} }, /*1cc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1d0*/ + { {0}, {0} }, { {0}, {0} }, /*1d0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1d4*/ + { {0}, {0} }, { {0}, {0} }, /*1d4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1d8*/ + { {0}, {0} }, { {0}, {0} }, /*1d8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1dc*/ + { {0}, {0} }, { {0}, {0} }, /*1dc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1e0*/ + { {0}, {0} }, { {0}, {0} }, /*1e0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1e4*/ + { {0}, {0} }, { {0}, {0} }, /*1e4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1e8*/ + { {0}, {0} }, { {0}, {0} }, /*1e8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1ec*/ + { {0}, {0} }, { {0}, {0} }, /*1ec*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1f0*/ + { {0}, {0} }, { {0}, {0} }, /*1f0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1f4*/ + { {0}, {0} }, { {0}, {0} }, /*1f4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1f8*/ + { {0}, {0} }, { {0}, {0} }, /*1f8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} } /*1fc*/ + { {0}, {0} }, { {0}, {0} } /*1fc*/ // clang-format on }; @@ -1156,219 +1156,219 @@ const scancode scancode_olivetti_m240[512] = { { {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} }, /*054*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*058*/ + { {0}, {0} }, { {0}, {0} }, /*058*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*05c*/ + { {0}, {0} }, { {0}, {0} }, /*05c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*060*/ + { {0}, {0} }, { {0}, {0} }, /*060*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*064*/ + { {0}, {0} }, { {0}, {0} }, /*064*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*068*/ + { {0}, {0} }, { {0}, {0} }, /*068*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*06c*/ + { {0}, {0} }, { {0}, {0} }, /*06c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*070*/ + { {0}, {0} }, { {0}, {0} }, /*070*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*074*/ + { {0}, {0} }, { {0}, {0} }, /*074*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*078*/ + { {0}, {0} }, { {0}, {0} }, /*078*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*07c*/ + { {0}, {0} }, { {0}, {0} }, /*07c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*080*/ + { {0}, {0} }, { {0}, {0} }, /*080*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*084*/ + { {0}, {0} }, { {0}, {0} }, /*084*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*088*/ + { {0}, {0} }, { {0}, {0} }, /*088*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*08c*/ + { {0}, {0} }, { {0}, {0} }, /*08c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*090*/ + { {0}, {0} }, { {0}, {0} }, /*090*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*094*/ + { {0}, {0} }, { {0}, {0} }, /*094*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*098*/ + { {0}, {0} }, { {0}, {0} }, /*098*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*09c*/ + { {0}, {0} }, { {0}, {0} }, /*09c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0a0*/ + { {0}, {0} }, { {0}, {0} }, /*0a0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0a4*/ + { {0}, {0} }, { {0}, {0} }, /*0a4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0a8*/ + { {0}, {0} }, { {0}, {0} }, /*0a8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0ac*/ + { {0}, {0} }, { {0}, {0} }, /*0ac*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0b0*/ + { {0}, {0} }, { {0}, {0} }, /*0b0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0b4*/ + { {0}, {0} }, { {0}, {0} }, /*0b4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0b8*/ + { {0}, {0} }, { {0}, {0} }, /*0b8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0bc*/ + { {0}, {0} }, { {0}, {0} }, /*0bc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0c0*/ + { {0}, {0} }, { {0}, {0} }, /*0c0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0c4*/ + { {0}, {0} }, { {0}, {0} }, /*0c4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0c8*/ + { {0}, {0} }, { {0}, {0} }, /*0c8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0cc*/ + { {0}, {0} }, { {0}, {0} }, /*0cc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0d0*/ + { {0}, {0} }, { {0}, {0} }, /*0d0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0d4*/ + { {0}, {0} }, { {0}, {0} }, /*0d4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0d8*/ + { {0}, {0} }, { {0}, {0} }, /*0d8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0dc*/ + { {0}, {0} }, { {0}, {0} }, /*0dc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0e0*/ + { {0}, {0} }, { {0}, {0} }, /*0e0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0e4*/ + { {0}, {0} }, { {0}, {0} }, /*0e4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0e8*/ + { {0}, {0} }, { {0}, {0} }, /*0e8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0ec*/ + { {0}, {0} }, { {0}, {0} }, /*0ec*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0f0*/ + { {0}, {0} }, { {0}, {0} }, /*0f0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0f4*/ + { {0}, {0} }, { {0}, {0} }, /*0f4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0f8*/ + { {0}, {0} }, { {0}, {0} }, /*0f8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0fc*/ + { {0}, {0} }, { {0}, {0} }, /*0fc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*100*/ + { {0}, {0} }, { {0}, {0} }, /*100*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*104*/ + { {0}, {0} }, { {0}, {0} }, /*104*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*108*/ + { {0}, {0} }, { {0}, {0} }, /*108*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*10c*/ + { {0}, {0} }, { {0}, {0} }, /*10c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*110*/ + { {0}, {0} }, { {0}, {0} }, /*110*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*114*/ + { {0}, {0} }, { {0}, {0} }, /*114*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*118*/ + { {0}, {0} }, { {0}, {0} }, /*118*/ { {0x1c, 0}, {0x9c, 0} }, { {0x1d, 0}, {0x9d, 0} }, - { {0}, {0} }, { {0}, {0} }, /*11c*/ + { {0}, {0} }, { {0}, {0} }, /*11c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*120*/ + { {0}, {0} }, { {0}, {0} }, /*120*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*124*/ + { {0}, {0} }, { {0}, {0} }, /*124*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*128*/ + { {0}, {0} }, { {0}, {0} }, /*128*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*12c*/ + { {0}, {0} }, { {0}, {0} }, /*12c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*130*/ + { {0}, {0} }, { {0}, {0} }, /*130*/ { {0}, {0} }, { {0x35, 0}, {0xb5, 0} }, - { {0}, {0} }, { {0x37, 0}, {0xb7, 0} }, /*134*/ + { {0}, {0} }, { {0x37, 0}, {0xb7, 0} }, /*134*/ { {0x38, 0}, {0xb8, 0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*138*/ + { {0}, {0} }, { {0}, {0} }, /*138*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*13c*/ + { {0}, {0} }, { {0}, {0} }, /*13c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*140*/ + { {0}, {0} }, { {0}, {0} }, /*140*/ { {0}, {0} }, { {0}, {0} }, - { {0x46, 0}, {0xc6, 0} }, { {0x47, 0}, {0xc7, 0} }, /*144*/ + { {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} }, { {0x4b, 0}, {0xcb, 0} }, /*148*/ { {0}, {0} }, { {0x4d, 0}, {0xcd, 0} }, - { {0}, {0} }, { {0x4f, 0}, {0xcf, 0} }, /*14c*/ + { {0}, {0} }, { {0x4f, 0}, {0xcf, 0} }, /*14c*/ { {0x50, 0}, {0xd0, 0} }, { {0x51, 0}, {0xd1, 0} }, - { {0x52, 0}, {0xd2, 0} }, { {0x53, 0}, {0xd3, 0} }, /*150*/ + { {0x52, 0}, {0xd2, 0} }, { {0x53, 0}, {0xd3, 0} }, /*150*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*154*/ + { {0}, {0} }, { {0}, {0} }, /*154*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*158*/ + { {0}, {0} }, { {0}, {0} }, /*158*/ { {0}, {0} }, { {0x54, 0}, {0xd4, 0} }, - { {0x56, 0}, {0xd6, 0} }, { {0x5c, 0}, {0xdc, 0} }, /*15c*/ + { {0x56, 0}, {0xd6, 0} }, { {0x5c, 0}, {0xdc, 0} }, /*15c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*160*/ + { {0}, {0} }, { {0}, {0} }, /*160*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*164*/ + { {0}, {0} }, { {0}, {0} }, /*164*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*168*/ + { {0}, {0} }, { {0}, {0} }, /*168*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*16c*/ + { {0}, {0} }, { {0}, {0} }, /*16c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*170*/ + { {0}, {0} }, { {0}, {0} }, /*170*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*174*/ + { {0}, {0} }, { {0}, {0} }, /*174*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*148*/ + { {0}, {0} }, { {0}, {0} }, /*148*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*17c*/ + { {0}, {0} }, { {0}, {0} }, /*17c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*180*/ + { {0}, {0} }, { {0}, {0} }, /*180*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*184*/ + { {0}, {0} }, { {0}, {0} }, /*184*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*88*/ + { {0}, {0} }, { {0}, {0} }, /*188*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*18c*/ + { {0}, {0} }, { {0}, {0} }, /*18c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*190*/ + { {0}, {0} }, { {0}, {0} }, /*190*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*194*/ + { {0}, {0} }, { {0}, {0} }, /*194*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*198*/ + { {0}, {0} }, { {0}, {0} }, /*198*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*19c*/ + { {0}, {0} }, { {0}, {0} }, /*19c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1a0*/ + { {0}, {0} }, { {0}, {0} }, /*1a0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1a4*/ + { {0}, {0} }, { {0}, {0} }, /*1a4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1a8*/ + { {0}, {0} }, { {0}, {0} }, /*1a8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1ac*/ + { {0}, {0} }, { {0}, {0} }, /*1ac*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1b0*/ + { {0}, {0} }, { {0}, {0} }, /*1b0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1b4*/ + { {0}, {0} }, { {0}, {0} }, /*1b4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1b8*/ + { {0}, {0} }, { {0}, {0} }, /*1b8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1bc*/ + { {0}, {0} }, { {0}, {0} }, /*1bc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1c0*/ + { {0}, {0} }, { {0}, {0} }, /*1c0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1c4*/ + { {0}, {0} }, { {0}, {0} }, /*1c4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1c8*/ + { {0}, {0} }, { {0}, {0} }, /*1c8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1cc*/ + { {0}, {0} }, { {0}, {0} }, /*1cc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1d0*/ + { {0}, {0} }, { {0}, {0} }, /*1d0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1d4*/ + { {0}, {0} }, { {0}, {0} }, /*1d4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1d8*/ + { {0}, {0} }, { {0}, {0} }, /*1d8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1dc*/ + { {0}, {0} }, { {0}, {0} }, /*1dc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1e0*/ + { {0}, {0} }, { {0}, {0} }, /*1e0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1e4*/ + { {0}, {0} }, { {0}, {0} }, /*1e4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1e8*/ + { {0}, {0} }, { {0}, {0} }, /*1e8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1ec*/ + { {0}, {0} }, { {0}, {0} }, /*1ec*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1f0*/ + { {0}, {0} }, { {0}, {0} }, /*1f0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1f4*/ + { {0}, {0} }, { {0}, {0} }, /*1f4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1f8*/ + { {0}, {0} }, { {0}, {0} }, /*1f8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} } /*1fc*/ + { {0}, {0} }, { {0}, {0} } /*1fc*/ // clang-format on }; diff --git a/src/minitrace/minitrace.c b/src/minitrace/minitrace.c index df68e7d79..40388c5f2 100644 --- a/src/minitrace/minitrace.c +++ b/src/minitrace/minitrace.c @@ -48,20 +48,20 @@ // Ugh, this struct is already pretty heavy. // Will probably need to move arguments to a second buffer to support more than one. typedef struct raw_event { - const char *name; - const char *cat; - void *id; - int64_t ts; - uint32_t pid; - uint32_t tid; - char ph; - mtr_arg_type arg_type; - const char *arg_name; - union { - const char *a_str; - int a_int; - double a_double; - }; + const char *name; + const char *cat; + void *id; + int64_t ts; + uint32_t pid; + uint32_t tid; + char ph; + mtr_arg_type arg_type; + const char *arg_name; + union { + const char *a_str; + int a_int; + double a_double; + }; } raw_event_t; static raw_event_t *event_buffer; @@ -74,7 +74,7 @@ static int events_in_progress = 0; static int64_t time_offset; static int first_line = 1; static FILE *f; -static __thread int cur_thread_id; // Thread local storage +static __thread int cur_thread_id; // Thread local storage static int cur_process_id; static pthread_mutex_t mutex; static pthread_mutex_t event_mutex; @@ -89,44 +89,44 @@ void mtr_flush_with_state(int); // Tiny portability layer. // Exposes: -// get_cur_thread_id() -// get_cur_process_id() -// mtr_time_s() -// pthread basics +// get_cur_thread_id() +// get_cur_process_id() +// mtr_time_s() +// pthread basics #ifdef _WIN32 static int get_cur_thread_id(void) { - return (int)GetCurrentThreadId(); + return (int)GetCurrentThreadId(); } static int get_cur_process_id(void) { - return (int)GetCurrentProcessId(); + return (int)GetCurrentProcessId(); } static uint64_t _frequency = 0; static uint64_t _starttime = 0; double mtr_time_s(void) { - if (_frequency == 0) { - QueryPerformanceFrequency((LARGE_INTEGER*)&_frequency); - QueryPerformanceCounter((LARGE_INTEGER*)&_starttime); - } - __int64 time; - QueryPerformanceCounter((LARGE_INTEGER*)&time); - return ((double) (time - _starttime) / (double) _frequency); + if (_frequency == 0) { + QueryPerformanceFrequency((LARGE_INTEGER*)&_frequency); + QueryPerformanceCounter((LARGE_INTEGER*)&_starttime); + } + __int64 time; + QueryPerformanceCounter((LARGE_INTEGER*)&time); + return ((double) (time - _starttime) / (double) _frequency); } // Ctrl+C handling for Windows console apps static BOOL WINAPI CtrlHandler(DWORD fdwCtrlType) { - if (atomic_load(&is_tracing) && fdwCtrlType == CTRL_C_EVENT) { - printf("Ctrl-C detected! Flushing trace and shutting down.\n\n"); - mtr_flush(); - mtr_shutdown(); - } - ExitProcess(1); + if (atomic_load(&is_tracing) && fdwCtrlType == CTRL_C_EVENT) { + printf("Ctrl-C detected! Flushing trace and shutting down.\n\n"); + mtr_flush(); + mtr_shutdown(); + } + ExitProcess(1); } void mtr_register_sigint_handler(void) { - // For console apps: - SetConsoleCtrlHandler(&CtrlHandler, TRUE); + // For console apps: + SetConsoleCtrlHandler(&CtrlHandler, TRUE); } HANDLE thread_handle; @@ -155,10 +155,10 @@ static void join_flushing_thread(void) { #else static inline int get_cur_thread_id(void) { - return (int)(intptr_t)pthread_self(); + return (int)(intptr_t)pthread_self(); } static inline int get_cur_process_id(void) { - return (int)getpid(); + return (int)getpid(); } static pthread_t thread_handle = 0; @@ -188,110 +188,110 @@ static void join_flushing_thread(void) { #if defined(BLACKBERRY) double mtr_time_s() { - struct timespec time; - clock_gettime(CLOCK_MONOTONIC, &time); // Linux must use CLOCK_MONOTONIC_RAW due to time warps - return time.tv_sec + time.tv_nsec / 1.0e9; + struct timespec time; + clock_gettime(CLOCK_MONOTONIC, &time); // Linux must use CLOCK_MONOTONIC_RAW due to time warps + return time.tv_sec + time.tv_nsec / 1.0e9; } #else double mtr_time_s(void) { - static time_t start; - struct timeval tv; - gettimeofday(&tv, NULL); - if (start == 0) { - start = tv.tv_sec; - } - tv.tv_sec -= start; - return (double)tv.tv_sec + (double)tv.tv_usec / 1000000.0; + static time_t start; + struct timeval tv; + gettimeofday(&tv, NULL); + if (start == 0) { + start = tv.tv_sec; + } + tv.tv_sec -= start; + return (double)tv.tv_sec + (double)tv.tv_usec / 1000000.0; } -#endif // !BLACKBERRY +#endif // !BLACKBERRY static void termination_handler(int signum) ATTR_NORETURN; static void termination_handler(int signum) { - (void) signum; - if (is_tracing) { - printf("Ctrl-C detected! Flushing trace and shutting down.\n\n"); - mtr_flush(); - fwrite("\n]}\n", 1, 4, f); - fclose(f); - } - exit(1); + (void) signum; + if (is_tracing) { + printf("Ctrl-C detected! Flushing trace and shutting down.\n\n"); + mtr_flush(); + fwrite("\n]}\n", 1, 4, f); + fclose(f); + } + exit(1); } void mtr_register_sigint_handler(void) { #ifndef MTR_ENABLED - return; + return; #endif - // Avoid altering set-to-be-ignored handlers while registering. - if (signal(SIGINT, &termination_handler) == SIG_IGN) - signal(SIGINT, SIG_IGN); + // Avoid altering set-to-be-ignored handlers while registering. + if (signal(SIGINT, &termination_handler) == SIG_IGN) + signal(SIGINT, SIG_IGN); } #endif void mtr_init_from_stream(void *stream) { #ifndef MTR_ENABLED - return; + return; #endif - event_buffer = (raw_event_t *)malloc(INTERNAL_MINITRACE_BUFFER_SIZE * sizeof(raw_event_t)); - flush_buffer = (raw_event_t *)malloc(INTERNAL_MINITRACE_BUFFER_SIZE * sizeof(raw_event_t)); - event_count = 0; - f = (FILE *)stream; - const char *header = "{\"traceEvents\":[\n"; - fwrite(header, 1, strlen(header), f); - time_offset = (uint64_t)(mtr_time_s() * 1000000); - first_line = 1; - pthread_mutex_init(&mutex, 0); - pthread_mutex_init(&event_mutex, 0); + event_buffer = (raw_event_t *)malloc(INTERNAL_MINITRACE_BUFFER_SIZE * sizeof(raw_event_t)); + flush_buffer = (raw_event_t *)malloc(INTERNAL_MINITRACE_BUFFER_SIZE * sizeof(raw_event_t)); + event_count = 0; + f = (FILE *)stream; + const char *header = "{\"traceEvents\":[\n"; + fwrite(header, 1, strlen(header), f); + time_offset = (uint64_t)(mtr_time_s() * 1000000); + first_line = 1; + pthread_mutex_init(&mutex, 0); + pthread_mutex_init(&event_mutex, 0); } void mtr_init(const char *json_file) { #ifndef MTR_ENABLED - return; + return; #endif - mtr_init_from_stream(fopen(json_file, "wb")); + mtr_init_from_stream(fopen(json_file, "wb")); } void mtr_shutdown(void) { - int i; + int i; #ifndef MTR_ENABLED - return; + return; #endif - mtr_flush_with_state(TRUE); + mtr_flush_with_state(TRUE); - fwrite("\n]}\n", 1, 4, f); - fclose(f); - pthread_mutex_destroy(&mutex); - pthread_mutex_destroy(&event_mutex); - f = 0; - free(event_buffer); - event_buffer = 0; - for (i = 0; i < STRING_POOL_SIZE; i++) { - if (str_pool[i]) { - free(str_pool[i]); - str_pool[i] = 0; - } - } + fwrite("\n]}\n", 1, 4, f); + fclose(f); + pthread_mutex_destroy(&mutex); + pthread_mutex_destroy(&event_mutex); + f = 0; + free(event_buffer); + event_buffer = 0; + for (i = 0; i < STRING_POOL_SIZE; i++) { + if (str_pool[i]) { + free(str_pool[i]); + str_pool[i] = 0; + } + } } const char *mtr_pool_string(const char *str) { - int i; - for (i = 0; i < STRING_POOL_SIZE; i++) { - if (!str_pool[i]) { - str_pool[i] = (char*)malloc(strlen(str) + 1); - strcpy(str_pool[i], str); - return str_pool[i]; - } else { - if (!strcmp(str, str_pool[i])) - return str_pool[i]; - } - } - return "string pool full"; + int i; + for (i = 0; i < STRING_POOL_SIZE; i++) { + if (!str_pool[i]) { + str_pool[i] = (char*)malloc(strlen(str) + 1); + strcpy(str_pool[i], str); + return str_pool[i]; + } else { + if (!strcmp(str, str_pool[i])) + return str_pool[i]; + } + } + return "string pool full"; } void mtr_start(void) { #ifndef MTR_ENABLED - return; + return; #endif #ifdef _WIN32 pthread_cond_init(&buffer_not_full_cond); @@ -301,19 +301,19 @@ void mtr_start(void) { pthread_cond_init(&buffer_full_cond, NULL); #endif atomic_store(&is_tracing, TRUE); - init_flushing_thread(); + init_flushing_thread(); } void mtr_stop(void) { #ifndef MTR_ENABLED - return; + return; #endif - atomic_store(&is_tracing, FALSE); - atomic_store(&stop_flushing_requested, TRUE); - pthread_cond_signal(&buffer_not_full_cond); - pthread_cond_signal(&buffer_full_cond); - join_flushing_thread(); - atomic_store(&stop_flushing_requested, FALSE); + atomic_store(&is_tracing, FALSE); + atomic_store(&stop_flushing_requested, TRUE); + pthread_cond_signal(&buffer_not_full_cond); + pthread_cond_signal(&buffer_full_cond); + join_flushing_thread(); + atomic_store(&stop_flushing_requested, FALSE); } // TODO: fwrite more than one line at a time. @@ -323,247 +323,248 @@ void mtr_stop(void) { // running at any point of time void mtr_flush_with_state(int is_last) { #ifndef MTR_ENABLED - return; + return; #endif - int i = 0; - char linebuf[1024]; - char arg_buf[1024]; - char id_buf[256]; - int event_count_copy = 0; - int events_in_progress_copy = 1; - raw_event_t *event_buffer_tmp = NULL; + int i = 0; + char linebuf[1024]; + char arg_buf[1024]; + char id_buf[256]; + int event_count_copy = 0; + int events_in_progress_copy = 1; + raw_event_t *event_buffer_tmp = NULL; - // small critical section to swap buffers - // - no any new events can be spawn while - // swapping since they tied to the same mutex - // - checks for any flushing in process - pthread_mutex_lock(&mutex); - // if not flushing already - if (is_flushing) { - pthread_mutex_unlock(&mutex); - return; - } - is_flushing = TRUE; - if(!is_last) { - while(event_count < INTERNAL_MINITRACE_BUFFER_SIZE && atomic_load(&is_tracing)) { - pthread_cond_wait(&buffer_full_cond, &mutex); - } - } - event_count_copy = event_count; - event_buffer_tmp = flush_buffer; - flush_buffer = event_buffer; - event_buffer = event_buffer_tmp; - event_count = 0; - // waiting for any unfinished events before swap - while (events_in_progress_copy != 0) { - pthread_mutex_lock(&event_mutex); - events_in_progress_copy = events_in_progress; - pthread_mutex_unlock(&event_mutex); - } - pthread_mutex_unlock(&mutex); - pthread_cond_signal(&buffer_not_full_cond); + // small critical section to swap buffers + // - no any new events can be spawn while + // swapping since they tied to the same mutex + // - checks for any flushing in process + pthread_mutex_lock(&mutex); + // if not flushing already + if (is_flushing) { + pthread_mutex_unlock(&mutex); + return; + } + is_flushing = TRUE; + if(!is_last) { + while(event_count < INTERNAL_MINITRACE_BUFFER_SIZE && atomic_load(&is_tracing)) { + pthread_cond_wait(&buffer_full_cond, &mutex); + } + } + event_count_copy = event_count; + event_buffer_tmp = flush_buffer; + flush_buffer = event_buffer; + event_buffer = event_buffer_tmp; + event_count = 0; + // waiting for any unfinished events before swap + while (events_in_progress_copy != 0) { + pthread_mutex_lock(&event_mutex); + events_in_progress_copy = events_in_progress; + pthread_mutex_unlock(&event_mutex); + } + pthread_mutex_unlock(&mutex); + pthread_cond_signal(&buffer_not_full_cond); - for (i = 0; i < event_count_copy; i++) { - raw_event_t *raw = &flush_buffer[i]; - int len; - switch (raw->arg_type) { - case MTR_ARG_TYPE_INT: - snprintf(arg_buf, ARRAY_SIZE(arg_buf), "\"%s\":%i", raw->arg_name, raw->a_int); - break; - case MTR_ARG_TYPE_STRING_CONST: - snprintf(arg_buf, ARRAY_SIZE(arg_buf), "\"%s\":\"%s\"", raw->arg_name, raw->a_str); - break; - case MTR_ARG_TYPE_STRING_COPY: - if (strlen(raw->a_str) > 700) { - snprintf(arg_buf, ARRAY_SIZE(arg_buf), "\"%s\":\"%.*s\"", raw->arg_name, 700, raw->a_str); - } else { - snprintf(arg_buf, ARRAY_SIZE(arg_buf), "\"%s\":\"%s\"", raw->arg_name, raw->a_str); - } - break; - case MTR_ARG_TYPE_NONE: - arg_buf[0] = '\0'; - break; - } - if (raw->id) { - switch (raw->ph) { - case 'S': - case 'T': - case 'F': - // TODO: Support full 64-bit pointers - snprintf(id_buf, ARRAY_SIZE(id_buf), ",\"id\":\"0x%08x\"", (uint32_t)(uintptr_t)raw->id); - break; - case 'X': - snprintf(id_buf, ARRAY_SIZE(id_buf), ",\"dur\":%i", (int)raw->a_double); - break; - } - } else { - id_buf[0] = 0; - } - const char *cat = raw->cat; + for (i = 0; i < event_count_copy; i++) { + raw_event_t *raw = &flush_buffer[i]; + int len; + switch (raw->arg_type) { + case MTR_ARG_TYPE_INT: + snprintf(arg_buf, ARRAY_SIZE(arg_buf), "\"%s\":%i", raw->arg_name, raw->a_int); + break; + case MTR_ARG_TYPE_STRING_CONST: + snprintf(arg_buf, ARRAY_SIZE(arg_buf), "\"%s\":\"%s\"", raw->arg_name, raw->a_str); + break; + case MTR_ARG_TYPE_STRING_COPY: + if (strlen(raw->a_str) > 700) { + snprintf(arg_buf, ARRAY_SIZE(arg_buf), "\"%s\":\"%.*s\"", raw->arg_name, 700, raw->a_str); + } else { + snprintf(arg_buf, ARRAY_SIZE(arg_buf), "\"%s\":\"%s\"", raw->arg_name, raw->a_str); + } + break; + case MTR_ARG_TYPE_NONE: + arg_buf[0] = '\0'; + break; + } + if (raw->id) { + switch (raw->ph) { + case 'S': + case 'T': + case 'F': + // TODO: Support full 64-bit pointers + snprintf(id_buf, ARRAY_SIZE(id_buf), ",\"id\":\"0x%08x\"", (uint32_t)(uintptr_t)raw->id); + break; + case 'X': + snprintf(id_buf, ARRAY_SIZE(id_buf), ",\"dur\":%i", (int)raw->a_double); + break; + } + } else { + id_buf[0] = 0; + } + const char *cat = raw->cat; #ifdef _WIN32 - // On Windows, we often end up with backslashes in category. - char temp[256]; - { - int len = (int)strlen(cat); - int i; - if (len > 255) len = 255; - for (i = 0; i < len; i++) { - temp[i] = cat[i] == '\\' ? '/' : cat[i]; - } - temp[len] = 0; - cat = temp; - } + // On Windows, we often end up with backslashes in category. + char temp[256]; + { + int len = (int)strlen(cat); + int i; + if (len > 255) len = 255; + for (i = 0; i < len; i++) { + temp[i] = cat[i] == '\\' ? '/' : cat[i]; + } + temp[len] = 0; + cat = temp; + } #endif - len = snprintf(linebuf, ARRAY_SIZE(linebuf), "%s{\"cat\":\"%s\",\"pid\":%i,\"tid\":%i,\"ts\":%" PRId64 ",\"ph\":\"%c\",\"name\":\"%s\",\"args\":{%s}%s}", - first_line ? "" : ",\n", - cat, raw->pid, raw->tid, raw->ts - time_offset, raw->ph, raw->name, arg_buf, id_buf); - fwrite(linebuf, 1, len, f); - first_line = 0; + len = snprintf(linebuf, ARRAY_SIZE(linebuf), "%s{\"cat\":\"%s\",\"pid\":%i,\"tid\":%i,\"ts\":%" PRId64 ",\"ph\":\"%c\",\"name\":\"%s\",\"args\":{%s}%s}", + first_line ? "" : ",\n", + cat, raw->pid, raw->tid, raw->ts - time_offset, raw->ph, raw->name, arg_buf, id_buf); + fwrite(linebuf, 1, len, f); + first_line = 0; - if (raw->arg_type == MTR_ARG_TYPE_STRING_COPY) { - free((void*)raw->a_str); - } - #ifdef MTR_COPY_EVENT_CATEGORY_AND_NAME - free(raw->name); - free(raw->cat); - #endif - } + if (raw->arg_type == MTR_ARG_TYPE_STRING_COPY) { + free((void*)raw->a_str); + } + #ifdef MTR_COPY_EVENT_CATEGORY_AND_NAME + free(raw->name); + free(raw->cat); + #endif + } - pthread_mutex_lock(&mutex); - is_flushing = is_last; - pthread_mutex_unlock(&mutex); + pthread_mutex_lock(&mutex); + is_flushing = is_last; + pthread_mutex_unlock(&mutex); } void mtr_flush(void) { - mtr_flush_with_state(FALSE); + mtr_flush_with_state(FALSE); } void internal_mtr_raw_event(const char *category, const char *name, char ph, void *id) { #ifndef MTR_ENABLED - return; + return; #endif - if (!atomic_load(&is_tracing)) { - return; - } - pthread_mutex_lock(&mutex); - while(event_count >= INTERNAL_MINITRACE_BUFFER_SIZE && atomic_load(&is_tracing)) { - pthread_cond_wait(&buffer_not_full_cond, &mutex); - } - raw_event_t *ev = &event_buffer[event_count]; - ++event_count; - pthread_mutex_lock(&event_mutex); - ++events_in_progress; - pthread_mutex_unlock(&event_mutex); - int local_event_count = event_count; - pthread_mutex_unlock(&mutex); - if(local_event_count >= INTERNAL_MINITRACE_BUFFER_SIZE) { - pthread_cond_signal(&buffer_full_cond); - } + if (!atomic_load(&is_tracing)) { + return; + } + pthread_mutex_lock(&mutex); + while(event_count >= INTERNAL_MINITRACE_BUFFER_SIZE && atomic_load(&is_tracing)) { + pthread_cond_wait(&buffer_not_full_cond, &mutex); - double ts = mtr_time_s(); + } + raw_event_t *ev = &event_buffer[event_count]; + ++event_count; + pthread_mutex_lock(&event_mutex); + ++events_in_progress; + pthread_mutex_unlock(&event_mutex); + int local_event_count = event_count; + pthread_mutex_unlock(&mutex); + if(local_event_count >= INTERNAL_MINITRACE_BUFFER_SIZE) { + pthread_cond_signal(&buffer_full_cond); + } - if (!cur_thread_id) { - cur_thread_id = get_cur_thread_id(); - } - if (!cur_process_id) { - cur_process_id = get_cur_process_id(); - } + double ts = mtr_time_s(); + + if (!cur_thread_id) { + cur_thread_id = get_cur_thread_id(); + } + if (!cur_process_id) { + cur_process_id = get_cur_process_id(); + } #ifdef MTR_COPY_EVENT_CATEGORY_AND_NAME - const size_t category_len = strlen(category); - ev->cat = malloc(category_len + 1); - strcpy(ev->cat, category); + const size_t category_len = strlen(category); + ev->cat = malloc(category_len + 1); + strcpy(ev->cat, category); - const size_t name_len = strlen(name); - ev->name = malloc(name_len + 1); - strcpy(ev->name, name); + const size_t name_len = strlen(name); + ev->name = malloc(name_len + 1); + strcpy(ev->name, name); #else - ev->cat = category; - ev->name = name; + ev->cat = category; + ev->name = name; #endif - ev->id = id; - ev->ph = ph; - if (ev->ph == 'X') { - double x; - memcpy(&x, id, sizeof(double)); - ev->ts = (int64_t)(x * 1000000); - ev->a_double = (ts - x) * 1000000; - } else { - ev->ts = (int64_t)(ts * 1000000); - } - ev->tid = cur_thread_id; - ev->pid = cur_process_id; - ev->arg_type = MTR_ARG_TYPE_NONE; + ev->id = id; + ev->ph = ph; + if (ev->ph == 'X') { + double x; + memcpy(&x, id, sizeof(double)); + ev->ts = (int64_t)(x * 1000000); + ev->a_double = (ts - x) * 1000000; + } else { + ev->ts = (int64_t)(ts * 1000000); + } + ev->tid = cur_thread_id; + ev->pid = cur_process_id; + ev->arg_type = MTR_ARG_TYPE_NONE; - pthread_mutex_lock(&event_mutex); - --events_in_progress; - pthread_mutex_unlock(&event_mutex); + pthread_mutex_lock(&event_mutex); + --events_in_progress; + pthread_mutex_unlock(&event_mutex); } void internal_mtr_raw_event_arg(const char *category, const char *name, char ph, void *id, mtr_arg_type arg_type, const char *arg_name, void *arg_value) { #ifndef MTR_ENABLED - return; + return; #endif - if (!atomic_load(&is_tracing)) { - return; - } - pthread_mutex_lock(&mutex); - while(event_count >= INTERNAL_MINITRACE_BUFFER_SIZE && atomic_load(&is_tracing)) { - pthread_cond_wait(&buffer_not_full_cond, &mutex); - } - raw_event_t *ev = &event_buffer[event_count]; - ++event_count; - pthread_mutex_lock(&event_mutex); - ++events_in_progress; - pthread_mutex_unlock(&event_mutex); - int local_event_count = event_count; - pthread_mutex_unlock(&mutex); - if(local_event_count >= INTERNAL_MINITRACE_BUFFER_SIZE) { - pthread_cond_signal(&buffer_full_cond); - } + if (!atomic_load(&is_tracing)) { + return; + } + pthread_mutex_lock(&mutex); + while(event_count >= INTERNAL_MINITRACE_BUFFER_SIZE && atomic_load(&is_tracing)) { + pthread_cond_wait(&buffer_not_full_cond, &mutex); + } + raw_event_t *ev = &event_buffer[event_count]; + ++event_count; + pthread_mutex_lock(&event_mutex); + ++events_in_progress; + pthread_mutex_unlock(&event_mutex); + int local_event_count = event_count; + pthread_mutex_unlock(&mutex); + if(local_event_count >= INTERNAL_MINITRACE_BUFFER_SIZE) { + pthread_cond_signal(&buffer_full_cond); + } - if (!cur_thread_id) { - cur_thread_id = get_cur_thread_id(); - } - if (!cur_process_id) { - cur_process_id = get_cur_process_id(); - } - double ts = mtr_time_s(); + if (!cur_thread_id) { + cur_thread_id = get_cur_thread_id(); + } + if (!cur_process_id) { + cur_process_id = get_cur_process_id(); + } + double ts = mtr_time_s(); #ifdef MTR_COPY_EVENT_CATEGORY_AND_NAME - const size_t category_len = strlen(category); - ev->cat = malloc(category_len + 1); - strcpy(ev->cat, category); + const size_t category_len = strlen(category); + ev->cat = malloc(category_len + 1); + strcpy(ev->cat, category); - const size_t name_len = strlen(name); - ev->name = malloc(name_len + 1); - strcpy(ev->name, name); + const size_t name_len = strlen(name); + ev->name = malloc(name_len + 1); + strcpy(ev->name, name); #else - ev->cat = category; - ev->name = name; + ev->cat = category; + ev->name = name; #endif - ev->id = id; - ev->ts = (int64_t)(ts * 1000000); - ev->ph = ph; - ev->tid = cur_thread_id; - ev->pid = cur_process_id; - ev->arg_type = arg_type; - ev->arg_name = arg_name; - switch (arg_type) { - case MTR_ARG_TYPE_INT: ev->a_int = (int)(uintptr_t)arg_value; break; - case MTR_ARG_TYPE_STRING_CONST: ev->a_str = (const char*)arg_value; break; - case MTR_ARG_TYPE_STRING_COPY: ev->a_str = strdup((const char*)arg_value); break; - case MTR_ARG_TYPE_NONE: break; - } + ev->id = id; + ev->ts = (int64_t)(ts * 1000000); + ev->ph = ph; + ev->tid = cur_thread_id; + ev->pid = cur_process_id; + ev->arg_type = arg_type; + ev->arg_name = arg_name; + switch (arg_type) { + case MTR_ARG_TYPE_INT: ev->a_int = (int)(uintptr_t)arg_value; break; + case MTR_ARG_TYPE_STRING_CONST: ev->a_str = (const char*)arg_value; break; + case MTR_ARG_TYPE_STRING_COPY: ev->a_str = strdup((const char*)arg_value); break; + case MTR_ARG_TYPE_NONE: break; + } - pthread_mutex_lock(&event_mutex); - --events_in_progress; - pthread_mutex_unlock(&event_mutex); + pthread_mutex_lock(&event_mutex); + --events_in_progress; + pthread_mutex_unlock(&event_mutex); } diff --git a/src/network/net_3c501.c b/src/network/net_3c501.c index 19ad587c2..736edb85b 100644 --- a/src/network/net_3c501.c +++ b/src/network/net_3c501.c @@ -1,22 +1,23 @@ /* - * 86Box An emulator of (mostly) x86-based PC systems and devices, - * using the ISA, EISA, VLB, MCA, and PCI system buses, - * roughly spanning the era between 1981 and 1995. + * 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 Project. + * This file is part of the 86Box distribution. * - * Implementation of the following network controller: - * - 3Com Etherlink 3c500/3c501 (ISA 8-bit). + * Implementation of the following network controller: + * - 3Com Etherlink 3c500/3c501 (ISA 8-bit). * * * - * Based on @(#)Dev3C501.cpp Oracle (VirtualBox) + * Based on @(#)Dev3C501.cpp Oracle (VirtualBox) * - * Authors: TheCollector1995, - * Oracle + * Authors: TheCollector1995, + * Oracle * - * Copyright 2022 TheCollector1995. - * Portions Copyright (C) 2022 Oracle and/or its affilitates. + * Copyright 2022 TheCollector1995. + * Portions Copyright (C) 2022 Oracle and/or its affilitates. * * 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 diff --git a/src/network/net_3c503.c b/src/network/net_3c503.c index 07dcc1a43..9e4f9c12b 100644 --- a/src/network/net_3c503.c +++ b/src/network/net_3c503.c @@ -1,9 +1,10 @@ /* - * 86Box An emulator of (mostly) x86-based PC systems and devices, - * using the ISA, EISA, VLB, MCA, and PCI system buses, - * roughly spanning the era between 1981 and 1995. + * 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 Project. + * This file is part of the 86Box distribution. * * Implementation of the following network controllers: * - 3Com Etherlink II 3c503 (ISA 8-bit). diff --git a/src/network/net_dp8390.c b/src/network/net_dp8390.c index 255749e4e..3b54fdb9d 100644 --- a/src/network/net_dp8390.c +++ b/src/network/net_dp8390.c @@ -44,11 +44,11 @@ dp8390_log(const char *fmt, ...) { va_list ap; - // if (dp8390_do_log >= lvl) { +// if (dp8390_do_log >= lvl) { va_start(ap, fmt); pclog_ex(fmt, ap); va_end(ap); - // } +// } } #else # define dp8390_log(lvl, fmt, ...) diff --git a/src/qt/evdev_mouse.cpp b/src/qt/evdev_mouse.cpp index c3d926285..4b487e65d 100644 --- a/src/qt/evdev_mouse.cpp +++ b/src/qt/evdev_mouse.cpp @@ -1,18 +1,18 @@ /* - * 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. * - * Linux/FreeBSD libevdev mouse input module. + * Linux/FreeBSD libevdev mouse input module. * * * - * Authors: Cacodemon345 + * Authors: Cacodemon345 * - * Copyright 2021-2022 Cacodemon345 + * Copyright 2021-2022 Cacodemon345 */ #include "evdev_mouse.hpp" #include diff --git a/src/qt/qt.c b/src/qt/qt.c index f1c6eee3f..c2a5396da 100644 --- a/src/qt/qt.c +++ b/src/qt/qt.c @@ -1,16 +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. + * 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. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * - * Copyright 2021 Joakim L. Gilje + * Copyright 2021 Joakim L. Gilje */ /* * C functionality for Qt platform, where the C equivalent is not easily diff --git a/src/qt/qt_cdrom.c b/src/qt/qt_cdrom.c index d0ab0113e..80310835b 100644 --- a/src/qt/qt_cdrom.c +++ b/src/qt/qt_cdrom.c @@ -1,21 +1,21 @@ /* - * 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. * - * Handle the platform-side of CDROM/ZIP/MO drives. + * Handle the platform-side of CDROM/ZIP/MO drives. * * * - * Authors: Sarah Walker, - * Miran Grca, - * Fred N. van Kempen, + * Authors: Sarah Walker, + * Miran Grca, + * Fred N. van Kempen, * - * Copyright 2016-2018 Miran Grca. - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2016-2018 Miran Grca. + * Copyright 2017,2018 Fred N. van Kempen. */ #include diff --git a/src/qt/qt_deviceconfig.cpp b/src/qt/qt_deviceconfig.cpp index 81f8b8493..2fecdc543 100644 --- a/src/qt/qt_deviceconfig.cpp +++ b/src/qt/qt_deviceconfig.cpp @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Device configuration UI code. + * Device configuration UI code. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * Cacodemon345 * - * Copyright 2021 Joakim L. Gilje - * Copyright 2022 Cacodemon345 + * Copyright 2021 Joakim L. Gilje + * Copyright 2022 Cacodemon345 */ #include "qt_deviceconfig.hpp" #include "ui_qt_deviceconfig.h" diff --git a/src/qt/qt_filefield.cpp b/src/qt/qt_filefield.cpp index 969d5ff29..9bdb6cd7f 100644 --- a/src/qt/qt_filefield.cpp +++ b/src/qt/qt_filefield.cpp @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * File field widget. + * File field widget. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * Cacodemon345 * - * Copyright 2021 Joakim L. Gilje - * Copyright 2022 Cacodemon345 + * Copyright 2021 Joakim L. Gilje + * Copyright 2022 Cacodemon345 */ #include "qt_filefield.hpp" #include "ui_qt_filefield.h" diff --git a/src/qt/qt_harddiskdialog.cpp b/src/qt/qt_harddiskdialog.cpp index eb8b3fd1a..943b13dc0 100644 --- a/src/qt/qt_harddiskdialog.cpp +++ b/src/qt/qt_harddiskdialog.cpp @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Hard disk dialog code. + * Hard disk dialog code. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * Cacodemon345 * - * Copyright 2021 Joakim L. Gilje - * Copyright 2022 Cacodemon345 + * Copyright 2021 Joakim L. Gilje + * Copyright 2022 Cacodemon345 */ #include "qt_harddiskdialog.hpp" #include "ui_qt_harddiskdialog.h" diff --git a/src/qt/qt_harddrive_common.cpp b/src/qt/qt_harddrive_common.cpp index 7d3beaa2b..3bfb62c09 100644 --- a/src/qt/qt_harddrive_common.cpp +++ b/src/qt/qt_harddrive_common.cpp @@ -1,18 +1,18 @@ /* - * 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. * - * Common storage devices module. + * Common storage devices module. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * - * Copyright 2021 Joakim L. Gilje + * Copyright 2021 Joakim L. Gilje */ #include "qt_harddrive_common.hpp" diff --git a/src/qt/qt_hardwarerenderer.cpp b/src/qt/qt_hardwarerenderer.cpp index f158e7d62..647827e85 100644 --- a/src/qt/qt_hardwarerenderer.cpp +++ b/src/qt/qt_hardwarerenderer.cpp @@ -1,22 +1,22 @@ /* - * 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. * - * Hardware renderer module. + * Hardware renderer module. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * Cacodemon345 * Teemu Korhonen * - * Copyright 2021 Joakim L. Gilje - * Copyright 2021-2022 Cacodemon345 - * Copyright 2021-2022 Teemu Korhonen + * Copyright 2021 Joakim L. Gilje + * Copyright 2021-2022 Cacodemon345 + * Copyright 2021-2022 Teemu Korhonen */ #include "qt_hardwarerenderer.hpp" #include diff --git a/src/qt/qt_joystickconfiguration.cpp b/src/qt/qt_joystickconfiguration.cpp index a9c53c07e..e91cb9086 100644 --- a/src/qt/qt_joystickconfiguration.cpp +++ b/src/qt/qt_joystickconfiguration.cpp @@ -1,18 +1,18 @@ /* - * 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. * - * Joystick configuration UI module. + * Joystick configuration UI module. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * - * Copyright 2021 Joakim L. Gilje + * Copyright 2021 Joakim L. Gilje */ #include "qt_joystickconfiguration.hpp" #include "ui_qt_joystickconfiguration.h" diff --git a/src/qt/qt_machinestatus.cpp b/src/qt/qt_machinestatus.cpp index 23df27150..69180f758 100644 --- a/src/qt/qt_machinestatus.cpp +++ b/src/qt/qt_machinestatus.cpp @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Joystick configuration UI module. + * Joystick configuration UI module. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * Cacodemon345 * - * Copyright 2021 Joakim L. Gilje - * Copyright 2021-2022 Cacodemon345 + * Copyright 2021 Joakim L. Gilje + * Copyright 2021-2022 Cacodemon345 */ #include "qt_machinestatus.hpp" diff --git a/src/qt/qt_main.cpp b/src/qt/qt_main.cpp index 1ae545227..e2d4c6c90 100644 --- a/src/qt/qt_main.cpp +++ b/src/qt/qt_main.cpp @@ -1,21 +1,21 @@ /* - * 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. * - * Main entry point module + * Main entry point module * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * Cacodemon345 * Teemu Korhonen * - * Copyright 2021 Joakim L. Gilje - * Copyright 2021-2022 Cacodemon345 - * Copyright 2021-2022 Teemu Korhonen + * Copyright 2021 Joakim L. Gilje + * Copyright 2021-2022 Cacodemon345 + * Copyright 2021-2022 Teemu Korhonen */ #include #include diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index 24c37d107..f0e8fdc34 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -1,24 +1,24 @@ /* - * 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. * - * Main window module. + * Main window module. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * Cacodemon345 * Teemu Korhonen * dob205 * - * Copyright 2021 Joakim L. Gilje - * Copyright 2021-2022 Cacodemon345 - * Copyright 2021-2022 Teemu Korhonen - * Copyright 2022 dob205 + * Copyright 2021 Joakim L. Gilje + * Copyright 2021-2022 Cacodemon345 + * Copyright 2021-2022 Teemu Korhonen + * Copyright 2022 dob205 */ #include diff --git a/src/qt/qt_mediahistorymanager.cpp b/src/qt/qt_mediahistorymanager.cpp index 5564afd46..b895b46aa 100644 --- a/src/qt/qt_mediahistorymanager.cpp +++ b/src/qt/qt_mediahistorymanager.cpp @@ -1,18 +1,18 @@ /* - * 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. * - * Media history management module + * Media history management module * * * - * Authors: cold-brewed + * Authors: cold-brewed * - * Copyright 2022 The 86Box development team + * Copyright 2022 The 86Box development team */ #include diff --git a/src/qt/qt_mediahistorymanager.hpp b/src/qt/qt_mediahistorymanager.hpp index 507cbdf7f..f1942b81c 100644 --- a/src/qt/qt_mediahistorymanager.hpp +++ b/src/qt/qt_mediahistorymanager.hpp @@ -1,18 +1,18 @@ /* - * 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. * - * Header for the media history management module + * Header for the media history management module * * * - * Authors: cold-brewed + * Authors: cold-brewed * - * Copyright 2022 The 86Box development team + * Copyright 2022 The 86Box development team */ #ifndef QT_MEDIAHISTORYMANAGER_HPP diff --git a/src/qt/qt_mediamenu.cpp b/src/qt/qt_mediamenu.cpp index e0c145981..7d230b095 100644 --- a/src/qt/qt_mediamenu.cpp +++ b/src/qt/qt_mediamenu.cpp @@ -1,22 +1,22 @@ /* - * 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. * - * Media menu UI module. + * Media menu UI module. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * Cacodemon345 * Teemu Korhonen * - * Copyright 2021 Joakim L. Gilje - * Copyright 2021-2022 Cacodemon345 - * Copyright 2021-2022 Teemu Korhonen + * Copyright 2021 Joakim L. Gilje + * Copyright 2021-2022 Cacodemon345 + * Copyright 2021-2022 Teemu Korhonen */ #include "qt_progsettings.hpp" #include "qt_machinestatus.hpp" diff --git a/src/qt/qt_models_common.cpp b/src/qt/qt_models_common.cpp index 0e9856a50..ed6aeaa7d 100644 --- a/src/qt/qt_models_common.cpp +++ b/src/qt/qt_models_common.cpp @@ -1,18 +1,18 @@ /* - * 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. * - * Common storage devices module. + * Common storage devices module. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * - * Copyright 2021 Joakim L. Gilje + * Copyright 2021 Joakim L. Gilje */ #include "qt_models_common.hpp" diff --git a/src/qt/qt_newfloppydialog.cpp b/src/qt/qt_newfloppydialog.cpp index cbb021963..479b6711f 100644 --- a/src/qt/qt_newfloppydialog.cpp +++ b/src/qt/qt_newfloppydialog.cpp @@ -1,22 +1,22 @@ /* - * 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. * - * Common storage devices module. + * Common storage devices module. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * Cacodemon345 * Teemu Korhonen * - * Copyright 2021 Joakim L. Gilje - * Copyright 2022 Cacodemon345 - * Copyright 2022 Teemu Korhonen + * Copyright 2021 Joakim L. Gilje + * Copyright 2022 Cacodemon345 + * Copyright 2022 Teemu Korhonen */ #include "qt_newfloppydialog.hpp" #include "ui_qt_newfloppydialog.h" diff --git a/src/qt/qt_opengloptions.cpp b/src/qt/qt_opengloptions.cpp index f90ba37c0..58030b467 100644 --- a/src/qt/qt_opengloptions.cpp +++ b/src/qt/qt_opengloptions.cpp @@ -1,17 +1,18 @@ /* - * 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. * - * OpenGL renderer options for Qt + * OpenGL renderer options for Qt * - * Authors: - * Teemu Korhonen * - * Copyright 2022 Teemu Korhonen + * + * Authors: Teemu Korhonen + * + * Copyright 2022 Teemu Korhonen */ #include diff --git a/src/qt/qt_opengloptions.hpp b/src/qt/qt_opengloptions.hpp index b88cf4b07..64f761670 100644 --- a/src/qt/qt_opengloptions.hpp +++ b/src/qt/qt_opengloptions.hpp @@ -1,17 +1,18 @@ /* - * 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. * - * Header for OpenGL renderer options + * Header for OpenGL renderer options * - * Authors: - * Teemu Korhonen * - * Copyright 2022 Teemu Korhonen + * + * Authors: Teemu Korhonen + * + * Copyright 2022 Teemu Korhonen */ #ifndef QT_OPENGLOPTIONS_HPP diff --git a/src/qt/qt_opengloptionsdialog.cpp b/src/qt/qt_opengloptionsdialog.cpp index c87989161..acb2ce9f2 100644 --- a/src/qt/qt_opengloptionsdialog.cpp +++ b/src/qt/qt_opengloptionsdialog.cpp @@ -1,17 +1,18 @@ /* - * 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. * - * OpenGL renderer options dialog for Qt + * OpenGL renderer options dialog for Qt * - * Authors: - * Teemu Korhonen * - * Copyright 2022 Teemu Korhonen + * + * Authors: Teemu Korhonen + * + * Copyright 2022 Teemu Korhonen */ #include diff --git a/src/qt/qt_opengloptionsdialog.hpp b/src/qt/qt_opengloptionsdialog.hpp index 6b1c673bd..f34d74d75 100644 --- a/src/qt/qt_opengloptionsdialog.hpp +++ b/src/qt/qt_opengloptionsdialog.hpp @@ -1,17 +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. + * 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. * - * Header for OpenGL renderer options dialog + * Header for OpenGL renderer options dialog * - * Authors: - * Teemu Korhonen + * Authors: Teemu Korhonen * - * Copyright 2022 Teemu Korhonen + * Copyright 2022 Teemu Korhonen */ #ifndef QT_OPENGLOPTIONSDIALOG_H diff --git a/src/qt/qt_openglrenderer.cpp b/src/qt/qt_openglrenderer.cpp index a2f1ecad0..60aa998a9 100644 --- a/src/qt/qt_openglrenderer.cpp +++ b/src/qt/qt_openglrenderer.cpp @@ -1,17 +1,18 @@ /* - * 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. * - * OpenGL renderer for Qt + * OpenGL renderer for Qt * - * Authors: - * Teemu Korhonen * - * Copyright 2022 Teemu Korhonen + * + * Authors: Teemu Korhonen + * + * Copyright 2022 Teemu Korhonen */ #include diff --git a/src/qt/qt_openglrenderer.hpp b/src/qt/qt_openglrenderer.hpp index c303ca614..27822600c 100644 --- a/src/qt/qt_openglrenderer.hpp +++ b/src/qt/qt_openglrenderer.hpp @@ -1,17 +1,18 @@ /* - * 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. * - * Header file for OpenGL renderer + * Header file for OpenGL renderer * - * Authors: - * Teemu Korhonen * - * Copyright 2022 Teemu Korhonen + * + * Authors: Teemu Korhonen + * + * Copyright 2022 Teemu Korhonen */ #ifndef QT_OPENGLRENDERER_HPP diff --git a/src/qt/qt_platform.cpp b/src/qt/qt_platform.cpp index 0fe611cbe..f1d56d061 100644 --- a/src/qt/qt_platform.cpp +++ b/src/qt/qt_platform.cpp @@ -1,21 +1,22 @@ /* - * 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. * - * Common platform functions. + * Common platform functions. * * - * Authors: Joakim L. Gilje + * + * Authors: Joakim L. Gilje * Cacodemon345 * Teemu Korhonen * - * Copyright 2021 Joakim L. Gilje - * Copyright 2021-2022 Cacodemon345 - * Copyright 2021-2022 Teemu Korhonen + * Copyright 2021 Joakim L. Gilje + * Copyright 2021-2022 Cacodemon345 + * Copyright 2021-2022 Teemu Korhonen */ #include diff --git a/src/qt/qt_progsettings.cpp b/src/qt/qt_progsettings.cpp index 3ee998002..4dda901d7 100644 --- a/src/qt/qt_progsettings.cpp +++ b/src/qt/qt_progsettings.cpp @@ -1,18 +1,18 @@ /* - * 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. * - * Program settings UI module. + * Program settings UI module. * * * * Authors: Cacodemon345 * - * Copyright 2021-2022 Cacodemon345 + * Copyright 2021-2022 Cacodemon345 */ #include diff --git a/src/qt/qt_renderercommon.cpp b/src/qt/qt_renderercommon.cpp index 98fb27ca0..47bc33d51 100644 --- a/src/qt/qt_renderercommon.cpp +++ b/src/qt/qt_renderercommon.cpp @@ -1,18 +1,18 @@ /* - * 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. * - * Program settings UI module. + * Program settings UI module. * * * * Authors: Joakim L. Gilje * - * Copyright 2021 Joakim L. Gilje + * Copyright 2021 Joakim L. Gilje */ #include "qt_renderercommon.hpp" diff --git a/src/qt/qt_rendererstack.cpp b/src/qt/qt_rendererstack.cpp index d36a88f86..885c97990 100644 --- a/src/qt/qt_rendererstack.cpp +++ b/src/qt/qt_rendererstack.cpp @@ -1,12 +1,12 @@ /* - * 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. * - * Program settings UI module. + * Program settings UI module. * * * @@ -14,9 +14,9 @@ * Cacodemon345 * Teemu Korhonen * - * Copyright 2021 Joakim L. Gilje - * Copyright 2021-2021 Teemu Korhonen - * Copyright 2021-2022 Cacodemon345 + * Copyright 2021 Joakim L. Gilje + * Copyright 2021-2021 Teemu Korhonen + * Copyright 2021-2022 Cacodemon345 */ #include "qt_rendererstack.hpp" #include "ui_qt_rendererstack.h" diff --git a/src/qt/qt_sdl.c b/src/qt/qt_sdl.c index 54eca952b..857ccf381 100644 --- a/src/qt/qt_sdl.c +++ b/src/qt/qt_sdl.c @@ -1,42 +1,42 @@ /* - * 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. * - * Rendering module for libSDL2 + * Rendering module for libSDL2 * - * NOTE: Given all the problems reported with FULLSCREEN use of SDL, - * we will not use that, but, instead, use a new window which - * coverrs the entire desktop. + * NOTE: Given all the problems reported with FULLSCREEN use of SDL, + * we will not use that, but, instead, use a new window which + * covers the entire desktop. * * * - * Authors: Fred N. van Kempen, - * Michael Drüing, + * Authors: Fred N. van Kempen, + * Michael Drüing, * - * Copyright 2018-2020 Fred N. van Kempen. - * Copyright 2018-2020 Michael Drüing. + * Copyright 2018-2020 Fred N. van Kempen. + * Copyright 2018-2020 Michael Drüing. * - * Redistribution and use in source and binary forms, with - * or without modification, are permitted provided that the - * following conditions are met: + * Redistribution and use in source and binary forms, with + * or without modification, are permitted provided that the + * following conditions are met: * - * 1. Redistributions of source code must retain the entire - * above notice, this list of conditions and the following - * disclaimer. + * 1. Redistributions of source code must retain the entire + * above notice, this list of conditions and the following + * disclaimer. * - * 2. Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the - * following disclaimer in the documentation and/or other - * materials provided with the distribution. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other + * materials provided with the distribution. * - * 3. Neither the name of the copyright holder nor the names - * of its contributors may be used to endorse or promote - * products derived from this software without specific - * prior written permission. + * 3. Neither the name of the copyright holder nor the names + * of its contributors may be used to endorse or promote + * products derived from this software without specific + * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT diff --git a/src/qt/qt_sdl.h b/src/qt/qt_sdl.h index 684e6ccd0..8b691c78c 100644 --- a/src/qt/qt_sdl.h +++ b/src/qt/qt_sdl.h @@ -1,38 +1,38 @@ /* - * 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. * - * Definitions for the libSDL2 rendering module. + * Definitions for the libSDL2 rendering module. * * * - * Authors: Fred N. van Kempen, - * Michael Drüing, + * Authors: Fred N. van Kempen, + * Michael Drüing, * - * Copyright 2018,2019 Fred N. van Kempen. - * Copyright 2018,2019 Michael Drüing. + * Copyright 2018,2019 Fred N. van Kempen. + * Copyright 2018,2019 Michael Drüing. * - * Redistribution and use in source and binary forms, with - * or without modification, are permitted provided that the - * following conditions are met: + * Redistribution and use in source and binary forms, with + * or without modification, are permitted provided that the + * following conditions are met: * - * 1. Redistributions of source code must retain the entire - * above notice, this list of conditions and the following - * disclaimer. + * 1. Redistributions of source code must retain the entire + * above notice, this list of conditions and the following + * disclaimer. * - * 2. Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the - * following disclaimer in the documentation and/or other - * materials provided with the distribution. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other + * materials provided with the distribution. * - * 3. Neither the name of the copyright holder nor the names - * of its contributors may be used to endorse or promote - * products derived from this software without specific - * prior written permission. + * 3. Neither the name of the copyright holder nor the names + * of its contributors may be used to endorse or promote + * products derived from this software without specific + * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT diff --git a/src/qt/qt_settings.cpp b/src/qt/qt_settings.cpp index b42b20786..f9a6b8e14 100644 --- a/src/qt/qt_settings.cpp +++ b/src/qt/qt_settings.cpp @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Program settings UI module. + * Program settings UI module. * * * * Authors: Joakim L. Gilje * Cacodemon345 * - * Copyright 2021 Joakim L. Gilje - * Copyright 2021-2022 Cacodemon345 + * Copyright 2021 Joakim L. Gilje + * Copyright 2021-2022 Cacodemon345 */ #include "qt_settings.hpp" #include "ui_qt_settings.h" diff --git a/src/qt/qt_settings_bus_tracking.cpp b/src/qt/qt_settings_bus_tracking.cpp index c22b8b10b..c6069e99e 100644 --- a/src/qt/qt_settings_bus_tracking.cpp +++ b/src/qt/qt_settings_bus_tracking.cpp @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Program settings UI module. + * Program settings UI module. * * * * Authors: Miran Grca * Cacodemon345 * - * Copyright 2022 Miran Grca - * Copyright 2022 Cacodemon345 + * Copyright 2022 Miran Grca + * Copyright 2022 Cacodemon345 */ #include #include diff --git a/src/qt/qt_settingsdisplay.cpp b/src/qt/qt_settingsdisplay.cpp index f01d7fc4d..d459b0e53 100644 --- a/src/qt/qt_settingsdisplay.cpp +++ b/src/qt/qt_settingsdisplay.cpp @@ -1,18 +1,18 @@ /* - * 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. * - * Display settings UI module. + * Display settings UI module. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * - * Copyright 2021 Joakim L. Gilje + * Copyright 2021 Joakim L. Gilje */ #include "qt_settingsdisplay.hpp" #include "ui_qt_settingsdisplay.h" diff --git a/src/qt/qt_settingsfloppycdrom.cpp b/src/qt/qt_settingsfloppycdrom.cpp index 2eabe80ab..63a7e4cb5 100644 --- a/src/qt/qt_settingsfloppycdrom.cpp +++ b/src/qt/qt_settingsfloppycdrom.cpp @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Floppy/CD-ROM devices configuration UI module. + * Floppy/CD-ROM devices configuration UI module. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * Cacodemon345 * - * Copyright 2021-2022 Cacodemon345 - * Copyright 2021 Joakim L. Gilje + * Copyright 2021-2022 Cacodemon345 + * Copyright 2021 Joakim L. Gilje */ #include "qt_settingsfloppycdrom.hpp" #include "ui_qt_settingsfloppycdrom.h" diff --git a/src/qt/qt_settingsharddisks.cpp b/src/qt/qt_settingsharddisks.cpp index 1883797e5..1b6964898 100644 --- a/src/qt/qt_settingsharddisks.cpp +++ b/src/qt/qt_settingsharddisks.cpp @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Hard disk configuration UI module. + * Hard disk configuration UI module. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * Cacodemon345 * - * Copyright 2021-2022 Cacodemon345 - * Copyright 2021 Joakim L. Gilje + * Copyright 2021-2022 Cacodemon345 + * Copyright 2021 Joakim L. Gilje */ #include "qt_settingsharddisks.hpp" #include "ui_qt_settingsharddisks.h" diff --git a/src/qt/qt_settingsinput.cpp b/src/qt/qt_settingsinput.cpp index 49d84037f..630fc705d 100644 --- a/src/qt/qt_settingsinput.cpp +++ b/src/qt/qt_settingsinput.cpp @@ -1,18 +1,18 @@ /* - * 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. * - * Mouse/Joystick configuration UI module. + * Mouse/Joystick configuration UI module. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * - * Copyright 2021 Joakim L. Gilje + * Copyright 2021 Joakim L. Gilje */ #include "qt_settingsinput.hpp" #include "ui_qt_settingsinput.h" diff --git a/src/qt/qt_settingsmachine.cpp b/src/qt/qt_settingsmachine.cpp index 0d2ffa129..b88397e30 100644 --- a/src/qt/qt_settingsmachine.cpp +++ b/src/qt/qt_settingsmachine.cpp @@ -1,18 +1,18 @@ /* - * 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. * - * Machine selection and configuration UI module. + * Machine selection and configuration UI module. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * - * Copyright 2021 Joakim L. Gilje + * Copyright 2021 Joakim L. Gilje */ #include "qt_settingsmachine.hpp" #include "ui_qt_settingsmachine.h" diff --git a/src/qt/qt_settingsnetwork.cpp b/src/qt/qt_settingsnetwork.cpp index cbddfab72..014e82ab3 100644 --- a/src/qt/qt_settingsnetwork.cpp +++ b/src/qt/qt_settingsnetwork.cpp @@ -1,18 +1,18 @@ /* - * 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. * - * Network devices configuration UI module. + * Network devices configuration UI module. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * - * Copyright 2021 Joakim L. Gilje + * Copyright 2021 Joakim L. Gilje */ #include "qt_settingsnetwork.hpp" #include "ui_qt_settingsnetwork.h" diff --git a/src/qt/qt_settingsotherperipherals.cpp b/src/qt/qt_settingsotherperipherals.cpp index edffd360a..e0edd7358 100644 --- a/src/qt/qt_settingsotherperipherals.cpp +++ b/src/qt/qt_settingsotherperipherals.cpp @@ -1,18 +1,18 @@ /* - * 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. * - * Other peripherals configuration UI module. + * Other peripherals configuration UI module. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * - * Copyright 2021 Joakim L. Gilje + * Copyright 2021 Joakim L. Gilje */ #include "qt_settingsotherperipherals.hpp" #include "ui_qt_settingsotherperipherals.h" diff --git a/src/qt/qt_settingsotherremovable.cpp b/src/qt/qt_settingsotherremovable.cpp index f625388ea..bb77046d2 100644 --- a/src/qt/qt_settingsotherremovable.cpp +++ b/src/qt/qt_settingsotherremovable.cpp @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Other removable devices configuration UI module. + * Other removable devices configuration UI module. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * Cacodemon345 * - * Copyright 2021-2022 Cacodemon345 - * Copyright 2021 Joakim L. Gilje + * Copyright 2021-2022 Cacodemon345 + * Copyright 2021 Joakim L. Gilje */ #include "qt_settingsotherremovable.hpp" #include "ui_qt_settingsotherremovable.h" diff --git a/src/qt/qt_settingsports.cpp b/src/qt/qt_settingsports.cpp index dfa2c8853..a4be440e5 100644 --- a/src/qt/qt_settingsports.cpp +++ b/src/qt/qt_settingsports.cpp @@ -1,21 +1,21 @@ /* - * 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. * - * Serial/Parallel ports configuration UI module. + * Serial/Parallel ports configuration UI module. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * Cacodemon345 * - * Copyright 2022 Cacodemon345 - * Copyright 2022 Jasmine Iwanek - * Copyright 2021 Joakim L. Gilje + * Copyright 2022 Cacodemon345 + * Copyright 2022 Jasmine Iwanek + * Copyright 2021 Joakim L. Gilje */ #include "qt_settingsports.hpp" #include "ui_qt_settingsports.h" diff --git a/src/qt/qt_settingssound.cpp b/src/qt/qt_settingssound.cpp index 57686f7df..e17ec5ed1 100644 --- a/src/qt/qt_settingssound.cpp +++ b/src/qt/qt_settingssound.cpp @@ -1,18 +1,18 @@ /* - * 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. * - * Sound/MIDI devices configuration UI module. + * Sound/MIDI devices configuration UI module. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * - * Copyright 2021 Joakim L. Gilje + * Copyright 2021 Joakim L. Gilje */ #include "qt_settingssound.hpp" #include "ui_qt_settingssound.h" diff --git a/src/qt/qt_settingsstoragecontrollers.cpp b/src/qt/qt_settingsstoragecontrollers.cpp index 2aecab568..5b85739f7 100644 --- a/src/qt/qt_settingsstoragecontrollers.cpp +++ b/src/qt/qt_settingsstoragecontrollers.cpp @@ -1,18 +1,18 @@ /* - * 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. * - * Storage devices configuration UI module. + * Storage devices configuration UI module. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * - * Copyright 2021 Joakim L. Gilje + * Copyright 2021 Joakim L. Gilje */ #include "qt_settingsstoragecontrollers.hpp" #include "ui_qt_settingsstoragecontrollers.h" diff --git a/src/qt/qt_softwarerenderer.cpp b/src/qt/qt_softwarerenderer.cpp index cd27e1c0e..a8c0229d3 100644 --- a/src/qt/qt_softwarerenderer.cpp +++ b/src/qt/qt_softwarerenderer.cpp @@ -1,22 +1,22 @@ /* - * 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. * - * Software renderer module. + * Software renderer module. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * Cacodemon345 * Teemu Korhonen * - * Copyright 2021 Joakim L. Gilje - * Copyright 2021-2022 Cacodemon345 - * Copyright 2021-2022 Teemu Korhonen + * Copyright 2021 Joakim L. Gilje + * Copyright 2021-2022 Cacodemon345 + * Copyright 2021-2022 Teemu Korhonen */ #include "qt_softwarerenderer.hpp" #include diff --git a/src/qt/qt_soundgain.cpp b/src/qt/qt_soundgain.cpp index 9283ae42e..725a5b115 100644 --- a/src/qt/qt_soundgain.cpp +++ b/src/qt/qt_soundgain.cpp @@ -1,18 +1,18 @@ /* - * 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. * - * Sound gain dialog UI module. + * Sound gain dialog UI module. * * * - * Authors: Cacodemon345 + * Authors: Cacodemon345 * - * Copyright 2021-2022 Cacodemon345 + * Copyright 2021-2022 Cacodemon345 */ #include "qt_soundgain.hpp" #include "ui_qt_soundgain.h" diff --git a/src/qt/qt_specifydimensions.cpp b/src/qt/qt_specifydimensions.cpp index e2aa24a9b..c01ef2ae4 100644 --- a/src/qt/qt_specifydimensions.cpp +++ b/src/qt/qt_specifydimensions.cpp @@ -1,18 +1,18 @@ /* - * 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. * - * Specify dimensions UI module. + * Specify dimensions UI module. * * * - * Authors: Cacodemon345 + * Authors: Cacodemon345 * - * Copyright 2021-2022 Cacodemon345 + * Copyright 2021-2022 Cacodemon345 */ #include "qt_specifydimensions.h" #include "ui_qt_specifydimensions.h" diff --git a/src/qt/qt_styleoverride.cpp b/src/qt/qt_styleoverride.cpp index 6efe523d9..7ec5a341c 100644 --- a/src/qt/qt_styleoverride.cpp +++ b/src/qt/qt_styleoverride.cpp @@ -1,18 +1,18 @@ /* - * 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. * - * Style override class. + * Style override class. * * * - * Authors: Teemu Korhonen + * Authors: Teemu Korhonen * - * Copyright 2022 Teemu Korhonen + * Copyright 2022 Teemu Korhonen */ #include "qt_styleoverride.hpp" diff --git a/src/qt/qt_ui.cpp b/src/qt/qt_ui.cpp index a2864f3ea..05a2e8f6c 100644 --- a/src/qt/qt_ui.cpp +++ b/src/qt/qt_ui.cpp @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Common UI functions. + * Common UI functions. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * Cacodemon345 * - * Copyright 2021 Joakim L. Gilje - * Copyright 2021-2022 Cacodemon345 + * Copyright 2021 Joakim L. Gilje + * Copyright 2021-2022 Cacodemon345 */ #include diff --git a/src/qt/qt_unixmanagerfilter.cpp b/src/qt/qt_unixmanagerfilter.cpp index d1091198d..5d94584e6 100644 --- a/src/qt/qt_unixmanagerfilter.cpp +++ b/src/qt/qt_unixmanagerfilter.cpp @@ -1,19 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Source file for Unix VM-managers (client-side) + * Source file for Unix VM-managers (client-side) * - * Authors: - * Teemu Korhonen - Cacodemon345 * - * Copyright 2022 Teemu Korhonen - * Copyright 2022 Cacodemon345 + * + * Authors: Teemu Korhonen + * Cacodemon345 + * + * Copyright 2022 Teemu Korhonen + * Copyright 2022 Cacodemon345 */ #include "qt_unixmanagerfilter.hpp" diff --git a/src/qt/qt_unixmanagerfilter.hpp b/src/qt/qt_unixmanagerfilter.hpp index eca373b47..0587e06ee 100644 --- a/src/qt/qt_unixmanagerfilter.hpp +++ b/src/qt/qt_unixmanagerfilter.hpp @@ -1,19 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * * Header file for Unix VM-managers (client-side) * - * Authors: - * Teemu Korhonen - Cacodemon345 * - * Copyright 2022 Teemu Korhonen - * Copyright 2022 Cacodemon345 + * + * Authors: Teemu Korhonen + * Cacodemon345 + * + * Copyright 2022 Teemu Korhonen + * Copyright 2022 Cacodemon345 */ #ifndef QT_UNIXMANAGERFILTER_HPP diff --git a/src/qt/qt_util.cpp b/src/qt/qt_util.cpp index 876a4b047..b05b656bb 100644 --- a/src/qt/qt_util.cpp +++ b/src/qt/qt_util.cpp @@ -1,18 +1,18 @@ /* - * 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. * - * Utility functions. + * Utility functions. * * * - * Authors: Teemu Korhonen + * Authors: Teemu Korhonen * - * Copyright 2022 Teemu Korhonen + * Copyright 2022 Teemu Korhonen */ #include #include diff --git a/src/qt/qt_winmanagerfilter.cpp b/src/qt/qt_winmanagerfilter.cpp index d9a6208b1..0218ae5ba 100644 --- a/src/qt/qt_winmanagerfilter.cpp +++ b/src/qt/qt_winmanagerfilter.cpp @@ -1,17 +1,18 @@ /* - * 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. * - * Windows VM-managers native messages filter + * Windows VM-managers native messages filter * - * Authors: - * Teemu Korhonen * - * Copyright 2022 Teemu Korhonen + * + * Authors: Teemu Korhonen + * + * Copyright 2022 Teemu Korhonen */ #include "qt_winmanagerfilter.hpp" diff --git a/src/qt/qt_winmanagerfilter.hpp b/src/qt/qt_winmanagerfilter.hpp index cd141e93f..e8fb06d90 100644 --- a/src/qt/qt_winmanagerfilter.hpp +++ b/src/qt/qt_winmanagerfilter.hpp @@ -1,17 +1,18 @@ /* - * 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. * - * Header file for Windows VM-managers native messages filter + * Header file for Windows VM-managers native messages filter * - * Authors: - * Teemu Korhonen * - * Copyright 2022 Teemu Korhonen + * + * Authors: Teemu Korhonen + * + * Copyright 2022 Teemu Korhonen */ #ifndef QT_WINDOWSMANAGERFILTER_HPP diff --git a/src/qt/qt_winrawinputfilter.cpp b/src/qt/qt_winrawinputfilter.cpp index 56d8c9ec9..88b723d4c 100644 --- a/src/qt/qt_winrawinputfilter.cpp +++ b/src/qt/qt_winrawinputfilter.cpp @@ -1,19 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Windows raw input native filter for QT + * Windows raw input native filter for QT * - * Authors: - * Teemu Korhonen - * Miran Grca, * - * Copyright 2021 Teemu Korhonen - * Copyright 2016-2018 Miran Grca. + * + * Authors: Teemu Korhonen + * Miran Grca, + * + * Copyright 2021 Teemu Korhonen + * Copyright 2016-2018 Miran Grca. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/qt/qt_winrawinputfilter.hpp b/src/qt/qt_winrawinputfilter.hpp index 252f7206c..6d23b83b7 100644 --- a/src/qt/qt_winrawinputfilter.hpp +++ b/src/qt/qt_winrawinputfilter.hpp @@ -1,17 +1,18 @@ /* - * 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. * - * Header file for windows raw input native filter for QT + * Header file for windows raw input native filter for QT * - * Authors: - * Teemu Korhonen * - * Copyright 2021 Teemu Korhonen + * + * Authors: Teemu Korhonen + * + * Copyright 2021 Teemu Korhonen * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/qt/win_dynld.c b/src/qt/win_dynld.c index 66fd0503d..fd0064d7f 100644 --- a/src/qt/win_dynld.c +++ b/src/qt/win_dynld.c @@ -1,18 +1,18 @@ /* - * 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. * - * Try to load a support DLL. + * Try to load a support DLL. * * * - * Author: Fred N. van Kempen, + * Authors: Fred N. van Kempen, * - * Copyright 2017,2018 Fred N. van Kempen + * Copyright 2017,2018 Fred N. van Kempen */ #include #include diff --git a/src/qt/win_joystick_rawinput.c b/src/qt/win_joystick_rawinput.c index f41131b28..efa7714df 100644 --- a/src/qt/win_joystick_rawinput.c +++ b/src/qt/win_joystick_rawinput.c @@ -1,20 +1,22 @@ /* - * 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. * - * RawInput joystick interface. + * RawInput joystick interface. * - * Authors: Sarah Walker, - * Miran Grca, - * GH Cao, * - * Copyright 2008-2018 Sarah Walker. - * Copyright 2016-2018 Miran Grca. - * Copyright 2020 GH Cao. + * + * Authors: Sarah Walker, + * Miran Grca, + * GH Cao, + * + * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. + * Copyright 2020 GH Cao. */ #include #include diff --git a/src/qt/wl_mouse.cpp b/src/qt/wl_mouse.cpp index 4cc1b3169..9b23792c8 100644 --- a/src/qt/wl_mouse.cpp +++ b/src/qt/wl_mouse.cpp @@ -1,18 +1,18 @@ /* - * 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. * - * Wayland mouse input module. + * Wayland mouse input module. * * * - * Authors: Cacodemon345 + * Authors: Cacodemon345 * - * Copyright 2021-2022 Cacodemon345 + * Copyright 2021-2022 Cacodemon345 */ #include "wl_mouse.hpp" #include diff --git a/src/qt/xinput2_mouse.cpp b/src/qt/xinput2_mouse.cpp index 5017c78d2..7e49c2694 100644 --- a/src/qt/xinput2_mouse.cpp +++ b/src/qt/xinput2_mouse.cpp @@ -1,18 +1,18 @@ /* - * 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. * - * X11 Xinput2 mouse input module. + * X11 Xinput2 mouse input module. * * * - * Authors: Cacodemon345 + * Authors: Cacodemon345 * - * Copyright 2022 Cacodemon345 + * Copyright 2022 Cacodemon345 */ /* Valuator parsing and duplicate event checking code from SDL2. */ diff --git a/src/scsi/scsi_aha154x.c b/src/scsi/scsi_aha154x.c index 669d050bf..aec89d588 100644 --- a/src/scsi/scsi_aha154x.c +++ b/src/scsi/scsi_aha154x.c @@ -641,8 +641,8 @@ aha_pnp_config_changed(uint8_t ld, isapnp_device_config_t *config, void *priv) * their way of handling issues like these at the time.. * * Patch 1: emulate the I/O ADDR SW setting by patching a - * byte in the BIOS that indicates the I/O ADDR - * switch setting on the board. + * byte in the BIOS that indicates the I/O ADDR + * switch setting on the board. */ if (dev->rom_ioaddr != 0x0000) { /* Look up the I/O address in the table. */ @@ -789,8 +789,8 @@ aha_setbios(x54x_t *dev) * their way of handling issues like these at the time.. * * Patch 1: emulate the I/O ADDR SW setting by patching a - * byte in the BIOS that indicates the I/O ADDR - * switch setting on the board. + * byte in the BIOS that indicates the I/O ADDR + * switch setting on the board. */ if (dev->rom_ioaddr != 0x0000) { /* Look up the I/O address in the table. */ @@ -880,11 +880,11 @@ aha_initnvr(x54x_t *dev) dev->nvr[0] |= EE0_ALTFLOP; dev->nvr[1] = dev->Irq - 9; /* IRQ15 */ dev->nvr[1] |= (dev->DmaChannel << 4); /* DMA6 */ - dev->nvr[2] = (EE2_HABIOS | /* BIOS enabled */ - EE2_DYNSCAN | /* scan bus */ - EE2_EXT1G | EE2_RMVOK); /* Imm return on seek */ - dev->nvr[3] = SPEED_50; /* speed 5.0 MB/s */ - dev->nvr[6] = (EE6_TERM | /* host term enable */ + dev->nvr[2] = (EE2_HABIOS | /* BIOS enabled */ + EE2_DYNSCAN | /* scan bus */ + EE2_EXT1G | EE2_RMVOK); /* Imm return on seek */ + dev->nvr[3] = SPEED_50; /* speed 5.0 MB/s */ + dev->nvr[6] = (EE6_TERM | /* host term enable */ EE6_RSTBUS); /* reset SCSI bus on boot*/ } diff --git a/src/scsi/scsi_buslogic.c b/src/scsi/scsi_buslogic.c index c0b0575df..1e0f74d0f 100644 --- a/src/scsi/scsi_buslogic.c +++ b/src/scsi/scsi_buslogic.c @@ -1152,7 +1152,7 @@ BuslogicPCIRead(int func, int addr, void *p) case 0x13: return buslogic_pci_bar[0].addr_regs[3]; case 0x14: - // return (buslogic_pci_bar[1].addr_regs[0] & 0xe0); /*Memory space*/ + // return (buslogic_pci_bar[1].addr_regs[0] & 0xe0); /*Memory space*/ return 0x00; case 0x15: return buslogic_pci_bar[1].addr_regs[1] & 0xc0; diff --git a/src/scsi/scsi_cdrom.c b/src/scsi/scsi_cdrom.c index e736b879d..dbae39be9 100644 --- a/src/scsi/scsi_cdrom.c +++ b/src/scsi/scsi_cdrom.c @@ -980,10 +980,10 @@ scsi_cdrom_read_data(scsi_cdrom_t *dev, int msf, int type, int flags, int32_t *l data than that. */ #if 0 if ((dev->sector_pos + dev->sector_len - 1) >= cdsize) { - scsi_cdrom_log("CD-ROM %i: Trying to read to beyond the end of disc (%i >= %i)\n", dev->id, - (dev->sector_pos + dev->sector_len - 1), cdsize); - scsi_cdrom_lba_out_of_range(dev); - return -1; + scsi_cdrom_log("CD-ROM %i: Trying to read to beyond the end of disc (%i >= %i)\n", dev->id, + (dev->sector_pos + dev->sector_len - 1), cdsize); + scsi_cdrom_lba_out_of_range(dev); + return -1; } #endif @@ -2488,7 +2488,7 @@ atapi_out: break; #if 0 - case GPCMD_PAUSE_RESUME_ALT: + case GPCMD_PAUSE_RESUME_ALT: #endif case GPCMD_PAUSE_RESUME: scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS); diff --git a/src/scsi/scsi_spock.c b/src/scsi/scsi_spock.c index ab970f17a..acfb1ea27 100644 --- a/src/scsi/scsi_spock.c +++ b/src/scsi/scsi_spock.c @@ -1162,12 +1162,12 @@ static const device_config_t spock_rom_config[] = { // clang-format off { .name = "bios_ver", - .description = "BIOS Version", - .type = CONFIG_SELECTION, - .default_string = "", - .default_int = 1, - .file_filter = "", - .spinner = { 0 }, + .description = "BIOS Version", + .type = CONFIG_SELECTION, + .default_string = "", + .default_int = 1, + .file_filter = "", + .spinner = { 0 }, .selection = { { .description = "1991 BIOS (>1GB)", .value = 1 }, { .description = "1990 BIOS", .value = 0 }, diff --git a/src/scsi/scsi_x54x.c b/src/scsi/scsi_x54x.c index 45854a0ba..ae049d921 100644 --- a/src/scsi/scsi_x54x.c +++ b/src/scsi/scsi_x54x.c @@ -1312,14 +1312,14 @@ x54x_in(uint16_t port, void *priv) case 3: /* Bits according to ASPI4DOS.SYS v3.36: - 0 Not checked - 1 Must be 0 - 2 Must be 0-0-0-1 - 3 Must be 0 - 4 Must be 0-1-0-0 - 5 Must be 0 - 6 Not checked - 7 Not checked + 0 Not checked + 1 Must be 0 + 2 Must be 0-0-0-1 + 3 Must be 0 + 4 Must be 0-1-0-0 + 5 Must be 0 + 6 Not checked + 7 Not checked */ if (dev->flags & X54X_INT_GEOM_WRITABLE) ret = dev->Geometry; diff --git a/src/sio/sio_82091aa.c b/src/sio/sio_82091aa.c index 1a7910cab..52a8809e9 100644 --- a/src/sio/sio_82091aa.c +++ b/src/sio/sio_82091aa.c @@ -1,17 +1,18 @@ /* - * 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. * - * Emulation of the Intel 82091AA Super I/O chip. + * Emulation of the Intel 82091AA Super I/O chip. * * * - * Author: Miran Grca, - * Copyright 2020 Miran Grca. + * Authors: Miran Grca, + * + * Copyright 2020 Miran Grca. */ #include #include diff --git a/src/sio/sio_acc3221.c b/src/sio/sio_acc3221.c index dd0c247f0..9aaf802f3 100644 --- a/src/sio/sio_acc3221.c +++ b/src/sio/sio_acc3221.c @@ -1,18 +1,18 @@ /* - * 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. * - * Implementation of the ACC 3221-SP Super I/O Chip. + * Implementation of the ACC 3221-SP Super I/O Chip. * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * - * Copyright 2019 Sarah Walker. + * Copyright 2019 Sarah Walker. */ #include #include @@ -40,31 +40,31 @@ typedef struct acc3221_t { } acc3221_t; /* Configuration Register Index, BE (R/W): - Bit Function - 7 PIRQ 5 polarity. + Bit Function + 7 PIRQ 5 polarity. 1 = active high, default 0 = active low - 6 PIRQ 7 polarity. + 6 PIRQ 7 polarity. 1 = active high, default 0 = active low - 5 Primary Parallel Port Extended Mode + 5 Primary Parallel Port Extended Mode 0 = Compatible mode, default 1 = Extended/Bidirectional mode. - 4 Primary Parallel Port Disable + 4 Primary Parallel Port Disable 1 = Disable, 0 = Enable Power Up Default is set by pin 120 (3221-DP)/pin 96 (3221-SP) - 3 Primary Parallel Port Power Down + 3 Primary Parallel Port Power Down 1 = Power Down, default = 0 - 2** Secondary Parallel Port Extended + 2** Secondary Parallel Port Extended Mode 0 = Compatible mode, default 1 = Extended/Bidirectional mode. - 1** Secondary Parallel Port Disable + 1** Secondary Parallel Port Disable 1 = Disable, 0 = Enable Power Up Default is set by pin 77 (3221-DP) - 0** Secondary Parallel Port Power Down + 0** Secondary Parallel Port Power Down 1 = Power Down 0 = Enable, default Note: Power Up not applicable to 3221-EP. */ @@ -72,41 +72,41 @@ typedef struct acc3221_t { #define REG_BE_LPT2_DISABLE (3 << 0) /* 3221-DP/EP only */ /* Configuration Register Index, BF (R/W): - Bit Function - 7-0 The 8 most significant address bits of + Bit Function + 7-0 The 8 most significant address bits of the primary parallel port (A9-2) Default 9E (LPT2, at 278-27B) */ /* Configuration Register Index, DA (R/W)**: - Bit Function - 7-0 The 8 most significant address bits of + Bit Function + 7-0 The 8 most significant address bits of the secondary parallel port (A9-2) Default DE (LPT1, at 378-37B) */ /* Configuration Register Index, DB (R/W): - Bit Function - 7 SIRQ4 polarity. + Bit Function + 7 SIRQ4 polarity. 1 = active high; default 0 = active low - 6 SIRQ3 polarity. + 6 SIRQ3 polarity. 1 = active high; default 0 = active low - 5 SXTAL clock off. 1 = SCLK off, + 5 SXTAL clock off. 1 = SCLK off, 0 = SCKL on, default - 4 Primary serial port disable + 4 Primary serial port disable 1 = Disable, 0 = Enable Power Up default is set by pin 116 (3221-DP)/pin 93 (3221-SP) - 3 Primary serial port power down + 3 Primary serial port power down 1 = Power down, 0 = Enable Power Up default is set by pin 116 (3221-DP)/pin 93 (3221-SP) - 2 Reserved - 1 Secondary serial port disable + 2 Reserved + 1 Secondary serial port disable 1 = Disable, 0 = Enable Power Up default is set by pin 121 (3221-DP)/pin 97 (3221-SP) - 0 Secondary serial port power down + 0 Secondary serial port power down 1 = Power down, 0 = Enable Power Up default is set by pin 121 (3221-DP)/pin 97 (3221-SP) @@ -115,57 +115,57 @@ typedef struct acc3221_t { #define REG_DB_SERIAL2_DISABLE (3 << 0) /* Configuration Register Index, DC (R/W): - Bit Function - 7-1 The MSB of the Primary Serial Port + Bit Function + 7-1 The MSB of the Primary Serial Port Address (bits A9-3). Default = 7F (COM1, at 3F8-3FF). - 0 When this bit is set to 1, bit A2 of + 0 When this bit is set to 1, bit A2 of primary parallel port is decoded. Default is 0. */ /* Configuration Register Index, DD (R/W): - Bit Function - 7-1 The MSB of the Secondary Serial Port + Bit Function + 7-1 The MSB of the Secondary Serial Port Address (bits A9-3). Default = 5F (COM2, at 2F8-2FF). - 0** When this bit is set to 1, bit A2 of + 0** When this bit is set to 1, bit A2 of secondary parallel port is decoded. Default is 0. */ /* Configuration Register Index, DE (R/W): - Bit Function - 7-6 SIRQ3 source - b7 b6 - 0 0 Disabled, tri-stated - 0 1 Disabled, tri-stated** - 1 0 Primary serial port - 1 1 Secondary serial port, + Bit Function + 7-6 SIRQ3 source + b7 b6 + 0 0 Disabled, tri-stated + 0 1 Disabled, tri-stated** + 1 0 Primary serial port + 1 1 Secondary serial port, default - 5-4 SIRQ4 source - b5 b4 - 0 0 Disabled, tri-stated - 0 1 Disabled, tri-stated** - 1 0 Primary serial port, + 5-4 SIRQ4 source + b5 b4 + 0 0 Disabled, tri-stated + 0 1 Disabled, tri-stated** + 1 0 Primary serial port, default - 1 1 Secondary serial port + 1 1 Secondary serial port - 3-2** PIRQ7 source - b3 b2 - 0 0 Diabled, tri-stated, + 3-2** PIRQ7 source + b3 b2 + 0 0 Diabled, tri-stated, default - 0 1 Primary serial port - 1 0 Primary parallel port - 1 1 Secondary parallel + 0 1 Primary serial port + 1 0 Primary parallel port + 1 1 Secondary parallel port Note: Bits 3-2 are reserved in 3221-SP. - 1-0 PIRQ5 source - b1 b0 - 0 0 Disabled, tri-stated - 0 1 Secondary serial port - 1 0 Primary parallel port, + 1-0 PIRQ5 source + b1 b0 + 0 0 Disabled, tri-stated + 0 1 Secondary serial port + 1 0 Primary parallel port, default - 1 1 Secondary parallel + 1 1 Secondary parallel port** */ #define REG_DE_SIRQ3_SOURCE (3 << 6) #define REG_DE_SIRQ3_SERIAL1 (1 << 6) @@ -183,48 +183,48 @@ typedef struct acc3221_t { #define REG_DE_PIRQ5_LPT2 (3 << 0) /* Configuration Register Index, DF (R/W)**: - Bit Function - 7-6 Reserved - 5 RTC interface disable + Bit Function + 7-6 Reserved + 5 RTC interface disable 1 = /RTCCS disabled 0 = /RTCCS enabled, default - 4 Disable Modem Select + 4 Disable Modem Select 1 = Moden CS disabled, default 0 = Modem CS enabled 3-2 - b3 b2 - 1 1 Reserved - 1 0 Modem port address + b3 b2 + 1 1 Reserved + 1 0 Modem port address = 3E8-3EF (default) - 0 1 Modem port address: + 0 1 Modem port address: 2F8-2FF - 0 0 Modem port address: + 0 0 Modem port address: 3F8-3FF 1-0 - b1 b0 - 1 1 Reserved - 1 0 Mode 2, EISA Mode - 0 1 Mode 1, AT BUS, - 0 0 Mode 0, Two parallel + b1 b0 + 1 1 Reserved + 1 0 Mode 2, EISA Mode + 0 1 Mode 1, AT BUS, + 0 0 Mode 0, Two parallel ports, default */ /* Configuration Register Index, FA (R/W)**: - Bit Function - 7 General purpose I/O register, Bit 7 - 6 General purpose I/O register, Bit 6 - 5 General purpose I/O register, Bit 5 - 4 General purpose I/O register, Bit 4 - 3 General purpose I/O register, Bit 3 - 2 General purpose I/O register, Bit 2 - 1 General purpose I/O register, Bit 1 - 0 General purpose I/O register, Bit 0 */ + Bit Function + 7 General purpose I/O register, Bit 7 + 6 General purpose I/O register, Bit 6 + 5 General purpose I/O register, Bit 5 + 4 General purpose I/O register, Bit 4 + 3 General purpose I/O register, Bit 3 + 2 General purpose I/O register, Bit 2 + 1 General purpose I/O register, Bit 1 + 0 General purpose I/O register, Bit 0 */ /* Configuration Register Index, FB (R/W)**: - Bit Function - 7 Reserved - 6** 0/2 EXG (Read Only) + Bit Function + 7 Reserved + 6** 0/2 EXG (Read Only) In mode 1 and mode 2 operation, when the third floppy drive is installed, pin @@ -234,7 +234,7 @@ typedef struct acc3221_t { disable the third floppy drive. 1 = Third floppy drive enabled 0 = Third floppy drive disabled - 5** EXTFDD (Read Only) + 5** EXTFDD (Read Only) In mode 1 and mode 2 operation, when the third floppy drive is installed and @@ -246,7 +246,7 @@ typedef struct acc3221_t { drive 2. 1 = Third floppy drive as drive 0 (bootable) 0 = Third floppy drive as drive 2 - 4** MS + 4** MS In mode 1 and mode 2, t his bit is to control the output pin MS to support a special 3 1/2", 1.2M drive. When this @@ -254,45 +254,45 @@ typedef struct acc3221_t { a low signal. When this bit is set to low (0), the MS pin sends a high signal to support a 3 1/2", 1.2M drive. - 3 FDC, Clock disable + 3 FDC, Clock disable 0 = enable, default 1 = disable - 2 Reserved - 1 FDC disable + 2 Reserved + 1 FDC disable 0 = enable, 1= disable Power Upd efault set by pin 117 (3221- DP)/pin 94 (3221-SP) - 0 FDC address + 0 FDC address 0 = Primary, default 1 = Secondary Note: Bits 6-4 are reserved in 3221-SP. */ #define REG_FB_FDC_DISABLE (1 << 1) /* Configuration Register Index, FB (R/W)**: - Bit Function - 7** Disable general chip select 1 + Bit Function + 7** Disable general chip select 1 1 = disable, default 0 = enable - 6** Disable general chip select 2 + 6** Disable general chip select 2 1 = disable, default 0 = enable - 5** Enable SA2 decoding for general chip + 5** Enable SA2 decoding for general chip select 1 1 = enable 0 = disable, default - 4** Enable SA2 decoding for general chip + 4** Enable SA2 decoding for general chip select 2 1 = enable 0 = disable, default - 3 Reserved - 2 IDE XT selected + 3 Reserved + 2 IDE XT selected 0 = IDE AT interface, default 1 = IDE XT interface - 1 IDE disable, 1 = IDE disable + 1 IDE disable, 1 = IDE disable 0 = IDE enable Power Up default set by pin 13 (3221- DP)/pin 13 (3221-SP) - 0 Secondary IDE + 0 Secondary IDE 1 = secondary 0 = primary, default Note: Bits 6-4 are reserved in 3221-SP. */ diff --git a/src/sio/sio_ali5123.c b/src/sio/sio_ali5123.c index 5c52bbc88..310a09ab0 100644 --- a/src/sio/sio_ali5123.c +++ b/src/sio/sio_ali5123.c @@ -1,17 +1,18 @@ /* - * 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. * - * Implementation of the ALi M5123/1543C Super I/O Chip. + * Implementation of the ALi M5123/1543C Super I/O Chip. * * * - * Author: Miran Grca, - * Copyright 2016-2018 Miran Grca. + * Authors: Miran Grca, + * + * Copyright 2016-2018 Miran Grca. */ #include #include diff --git a/src/sio/sio_detect.c b/src/sio/sio_detect.c index 871ad1a0a..36c12cd54 100644 --- a/src/sio/sio_detect.c +++ b/src/sio/sio_detect.c @@ -1,18 +1,18 @@ /* - * 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. * - * Super I/O chip detection code. + * Super I/O chip detection code. * * * - * Authors: Miran Grca, + * Authors: Miran Grca, * - * Copyright 2016-2018 Miran Grca. + * Copyright 2016-2018 Miran Grca. */ #include #include diff --git a/src/sio/sio_f82c710.c b/src/sio/sio_f82c710.c index eccf799f4..123232d7e 100644 --- a/src/sio/sio_f82c710.c +++ b/src/sio/sio_f82c710.c @@ -1,28 +1,30 @@ /* - * 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. * - * Implementation of the Chips & Technologies F82C710 Universal Peripheral - * Controller (UPC) and 82C606 CHIPSpak Multifunction Controller. + * Implementation of the Chips & Technologies F82C710 Universal Peripheral + * Controller (UPC) and 82C606 CHIPSpak Multifunction Controller. * - * Relevant literature: + * Relevant literature: * - * [1] Chips and Technologies, Inc., - * 82C605/82C606 CHIPSpak/CHIPSport MULTIFUNCTION CONTROLLERS, - * PRELIMINARY Data Sheet, Revision 1, May 1987. - * + * [1] Chips and Technologies, Inc., + * 82C605/82C606 CHIPSpak/CHIPSport MULTIFUNCTION CONTROLLERS, + * PRELIMINARY Data Sheet, Revision 1, May 1987. + * * - * Authors: Sarah Walker, - * Eluan Costa Miranda - * Lubomir Rintel * - * Copyright 2020 Sarah Walker. - * Copyright 2020 Eluan Costa Miranda. - * Copyright 2021 Lubomir Rintel. + * + * Authors: Sarah Walker, + * Eluan Costa Miranda + * Lubomir Rintel + * + * Copyright 2020 Sarah Walker. + * Copyright 2020 Eluan Costa Miranda. + * Copyright 2021 Lubomir Rintel. */ #include #include diff --git a/src/sio/sio_fdc37c669.c b/src/sio/sio_fdc37c669.c index 81d9647c0..a8bc4d700 100644 --- a/src/sio/sio_fdc37c669.c +++ b/src/sio/sio_fdc37c669.c @@ -1,17 +1,18 @@ /* - * 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. * - * Implementation of the SMC FDC37C669 Super I/O Chip. + * Implementation of the SMC FDC37C669 Super I/O Chip. * * * - * Author: Miran Grca, - * Copyright 2016-2018 Miran Grca. + * Authors: Miran Grca, + * + * Copyright 2016-2018 Miran Grca. */ #include #include diff --git a/src/sio/sio_fdc37c67x.c b/src/sio/sio_fdc37c67x.c index e728a8ffb..af8a89bf5 100644 --- a/src/sio/sio_fdc37c67x.c +++ b/src/sio/sio_fdc37c67x.c @@ -1,17 +1,18 @@ /* - * 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. * - * Implementation of the SMC FDC37C67X Super I/O Chip. + * Implementation of the SMC FDC37C67X Super I/O Chip. * * * - * Author: Miran Grca, - * Copyright 2016-2018 Miran Grca. + * Authors: Miran Grca, + * + * Copyright 2016-2018 Miran Grca. */ #include #include @@ -171,13 +172,13 @@ fdc37c67x_sio_handler(fdc37c67x_t *dev) { #if 0 if (dev->sio_base) { - io_removehandler(dev->sio_base, 0x0002, - fdc37c67x_read, NULL, NULL, fdc37c67x_write, NULL, NULL, dev); + io_removehandler(dev->sio_base, 0x0002, + fdc37c67x_read, NULL, NULL, fdc37c67x_write, NULL, NULL, dev); } dev->sio_base = (((uint16_t) dev->regs[0x27]) << 8) | dev->regs[0x26]; if (dev->sio_base) { - io_sethandler(dev->sio_base, 0x0002, - fdc37c67x_read, NULL, NULL, fdc37c67x_write, NULL, NULL, dev); + io_sethandler(dev->sio_base, 0x0002, + fdc37c67x_read, NULL, NULL, fdc37c67x_write, NULL, NULL, dev); } #endif } diff --git a/src/sio/sio_fdc37c93x.c b/src/sio/sio_fdc37c93x.c index afc1642a5..55464ec98 100644 --- a/src/sio/sio_fdc37c93x.c +++ b/src/sio/sio_fdc37c93x.c @@ -1,18 +1,19 @@ /* - * 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. * - * Implementation of the SMC FDC37C932FR and FDC37C935 Super - * I/O Chips. + * Implementation of the SMC FDC37C932FR and FDC37C935 Super + * I/O Chips. * * * - * Author: Miran Grca, - * Copyright 2016-2018 Miran Grca. + * Authors: Miran Grca, + * + * Copyright 2016-2018 Miran Grca. */ #include #include diff --git a/src/sio/sio_fdc37m60x.c b/src/sio/sio_fdc37m60x.c index d74db6207..e29734c51 100644 --- a/src/sio/sio_fdc37m60x.c +++ b/src/sio/sio_fdc37m60x.c @@ -1,15 +1,18 @@ /* - * 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. * - * Emulation of the SMSC FDC37M60x Super I/O + * Emulation of the SMSC FDC37M60x Super I/O * - * Authors: Tiseno100 - * Copyright 2020 Tiseno100 + * + * + * Authors: Tiseno100 + * + * Copyright 2020 Tiseno100 */ #include #include diff --git a/src/sio/sio_it8661f.c b/src/sio/sio_it8661f.c index 98340aaa5..c7d4110be 100644 --- a/src/sio/sio_it8661f.c +++ b/src/sio/sio_it8661f.c @@ -1,18 +1,18 @@ /* - * 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. * - * Implementation of the ITE IT8661F chipset. + * Implementation of the ITE IT8661F chipset. * - * Note: This Super I/O is partially incomplete and intended only for having the intended machine to function + * Note: This Super I/O is partially incomplete and intended only for having the intended machine to function * - * Authors: Tiseno100 + * Authors: Tiseno100 * - * Copyright 2021 Tiseno100 + * Copyright 2021 Tiseno100 * */ #include diff --git a/src/sio/sio_pc87306.c b/src/sio/sio_pc87306.c index 18b9a9357..68d0383b0 100644 --- a/src/sio/sio_pc87306.c +++ b/src/sio/sio_pc87306.c @@ -1,17 +1,18 @@ /* - * 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. * - * Emulation of the NatSemi PC87306 Super I/O chip. + * Emulation of the NatSemi PC87306 Super I/O chip. * * * - * Author: Miran Grca, - * Copyright 2016-2018 Miran Grca. + * Authors: Miran Grca, + * + * Copyright 2016-2018 Miran Grca. */ #include #include diff --git a/src/sio/sio_pc87307.c b/src/sio/sio_pc87307.c index ecdb13c5b..ae376f659 100644 --- a/src/sio/sio_pc87307.c +++ b/src/sio/sio_pc87307.c @@ -1,17 +1,18 @@ /* - * 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. * - * Emulation of the NatSemi PC87307 Super I/O chip. + * Emulation of the NatSemi PC87307 Super I/O chip. * * * - * Author: Miran Grca, - * Copyright 2020 Miran Grca. + * Authors: Miran Grca, + * + * Copyright 2020 Miran Grca. */ #include #include diff --git a/src/sio/sio_pc87309.c b/src/sio/sio_pc87309.c index 8d7ff7065..db6b78848 100644 --- a/src/sio/sio_pc87309.c +++ b/src/sio/sio_pc87309.c @@ -1,17 +1,18 @@ /* - * 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. * - * Emulation of the NatSemi PC87309 Super I/O chip. + * Emulation of the NatSemi PC87309 Super I/O chip. * * * - * Author: Miran Grca, - * Copyright 2020 Miran Grca. + * Authors: Miran Grca, + * + * Copyright 2020 Miran Grca. */ #include #include diff --git a/src/sio/sio_pc87310.c b/src/sio/sio_pc87310.c index 5b5267191..f7d5ced71 100644 --- a/src/sio/sio_pc87310.c +++ b/src/sio/sio_pc87310.c @@ -1,22 +1,22 @@ /* - * 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. * - * Emulation of the NatSemi PC87310 Super I/O chip. + * Emulation of the NatSemi PC87310 Super I/O chip. * * * - * Author: Miran Grca, - * Tiseno100 - * EngiNerd + * Authors: Miran Grca, + * Tiseno100 + * EngiNerd * - * Copyright 2020 Miran Grca. - * Copyright 2020 Tiseno100 - * Copyright 2021 EngiNerd. + * Copyright 2020 Miran Grca. + * Copyright 2020 Tiseno100 + * Copyright 2021 EngiNerd. */ #include #include diff --git a/src/sio/sio_pc87311.c b/src/sio/sio_pc87311.c index 2c098d5ab..c795da8a9 100644 --- a/src/sio/sio_pc87311.c +++ b/src/sio/sio_pc87311.c @@ -1,15 +1,18 @@ /* - * 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. * - * Emulation of the National Semiconductor PC87311 Super I/O + * Emulation of the National Semiconductor PC87311 Super I/O * - * Authors: Tiseno100 - * Copyright 2020 Tiseno100 + * + * + * Authors: Tiseno100 + * + * Copyright 2020 Tiseno100 */ #include #include diff --git a/src/sio/sio_pc87332.c b/src/sio/sio_pc87332.c index 71f7584f4..1ea0e1255 100644 --- a/src/sio/sio_pc87332.c +++ b/src/sio/sio_pc87332.c @@ -1,17 +1,18 @@ /* - * 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. * - * Emulation of the NatSemi PC87332 Super I/O chip. + * Emulation of the NatSemi PC87332 Super I/O chip. * * * - * Author: Miran Grca, - * Copyright 2020 Miran Grca. + * Authors: Miran Grca, + * + * Copyright 2020 Miran Grca. */ #include #include diff --git a/src/sio/sio_prime3b.c b/src/sio/sio_prime3b.c index b0267f0a0..a204fde5b 100644 --- a/src/sio/sio_prime3b.c +++ b/src/sio/sio_prime3b.c @@ -1,15 +1,18 @@ /* - * 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. * - * Emulation of the Goldstar Prime3B Super I/O + * Emulation of the Goldstar Prime3B Super I/O * - * Authors: Tiseno100 - * Copyright 2021 Tiseno100 + * + * + * Authors: Tiseno100 + * + * Copyright 2021 Tiseno100 */ #include #include diff --git a/src/sio/sio_prime3c.c b/src/sio/sio_prime3c.c index 303a10967..eae3fe1b2 100644 --- a/src/sio/sio_prime3c.c +++ b/src/sio/sio_prime3c.c @@ -1,15 +1,18 @@ /* - * 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. * - * Emulation of the LG Prime3C Super I/O + * Emulation of the LG Prime3C Super I/O * - * Authors: Tiseno100 - * Copyright 2020 Tiseno100 + * + * + * Authors: Tiseno100 + * + * Copyright 2020 Tiseno100 */ #include #include diff --git a/src/sio/sio_um8669f.c b/src/sio/sio_um8669f.c index 954e7c45c..f50832040 100644 --- a/src/sio/sio_um8669f.c +++ b/src/sio/sio_um8669f.c @@ -1,22 +1,22 @@ /* - * 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. * - * Emulation of the UMC UM8669F Super I/O chip. + * Emulation of the UMC UM8669F Super I/O chip. * * * - * Authors: Sarah Walker, - * Miran Grca, - * RichardG, + * Authors: Sarah Walker, + * Miran Grca, + * RichardG, * - * Copyright 2008-2021 Sarah Walker. - * Copyright 2016-2021 Miran Grca. - * Copyright 2021 RichardG. + * Copyright 2008-2021 Sarah Walker. + * Copyright 2016-2021 Miran Grca. + * Copyright 2021 RichardG. */ #include #include @@ -69,27 +69,27 @@ static uint8_t um8669f_pnp_rom[] = { }; static const isapnp_device_config_t um8669f_pnp_defaults[] = { { - .activate = 1, - .io = { { .base = FDC_PRIMARY_ADDR }, }, - .irq = { { .irq = FDC_PRIMARY_IRQ }, }, - .dma = { { .dma = FDC_PRIMARY_DMA }, } + .activate = 1, + .io = { { .base = FDC_PRIMARY_ADDR }, }, + .irq = { { .irq = FDC_PRIMARY_IRQ }, }, + .dma = { { .dma = FDC_PRIMARY_DMA }, } }, { - .activate = 1, - .io = { { .base = COM1_ADDR }, }, - .irq = { { .irq = COM1_IRQ }, } + .activate = 1, + .io = { { .base = COM1_ADDR }, }, + .irq = { { .irq = COM1_IRQ }, } }, { - .activate = 1, - .io = { { .base = COM2_ADDR }, }, - .irq = { { .irq = COM2_IRQ }, } + .activate = 1, + .io = { { .base = COM2_ADDR }, }, + .irq = { { .irq = COM2_IRQ }, } }, { - .activate = 1, - .io = { { .base = LPT1_ADDR }, }, - .irq = { { .irq = LPT1_IRQ }, } + .activate = 1, + .io = { { .base = LPT1_ADDR }, }, + .irq = { { .irq = LPT1_IRQ }, } }, { - .activate = 0 + .activate = 0 }, { - .activate = 0, - .io = { { .base = 0x200 }, } + .activate = 0, + .io = { { .base = 0x200 }, } } }; diff --git a/src/sio/sio_vt82c686.c b/src/sio/sio_vt82c686.c index 00617e4ea..c7f9c28bc 100644 --- a/src/sio/sio_vt82c686.c +++ b/src/sio/sio_vt82c686.c @@ -1,18 +1,18 @@ /* - * 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. * - * Emulation of the VIA VT82C686A/B integrated Super I/O. + * Emulation of the VIA VT82C686A/B integrated Super I/O. * * * - * Author: RichardG, + * Authors: RichardG, * - * Copyright 2020 RichardG. + * Copyright 2020 RichardG. */ #include #include diff --git a/src/sio/sio_w83787f.c b/src/sio/sio_w83787f.c index ce6c20386..722f1eef8 100644 --- a/src/sio/sio_w83787f.c +++ b/src/sio/sio_w83787f.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Emulation of the Winbond W83787F/IF Super I/O Chip. + * Emulation of the Winbond W83787F/IF Super I/O Chip. * - * Winbond W83787F Super I/O Chip - * Used by the Award 430HX + * Winbond W83787F Super I/O Chip + * Used by the Award 430HX * * * - * Author: Miran Grca, - * Copyright 2020 Miran Grca. + * Authors: Miran Grca, + * Copyright 2020 Miran Grca. */ #include #include diff --git a/src/sio/sio_w83877f.c b/src/sio/sio_w83877f.c index 28ab95f46..4f8b45118 100644 --- a/src/sio/sio_w83877f.c +++ b/src/sio/sio_w83877f.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Emulation of the Winbond W83877F Super I/O Chip. + * Emulation of the Winbond W83877F Super I/O Chip. * - * Winbond W83877F Super I/O Chip - * Used by the Award 430HX + * Winbond W83877F Super I/O Chip + * Used by the Award 430HX * * * - * Author: Miran Grca, - * Copyright 2016-2020 Miran Grca. + * Authors: Miran Grca, + * Copyright 2016-2020 Miran Grca. */ #include #include diff --git a/src/sio/sio_w83977f.c b/src/sio/sio_w83977f.c index e214f883d..1b6105840 100644 --- a/src/sio/sio_w83977f.c +++ b/src/sio/sio_w83977f.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Emulation of the Winbond W83977F Super I/O Chip. + * Emulation of the Winbond W83977F Super I/O Chip. * - * Winbond W83977F Super I/O Chip - * Used by the Award 430TX + * Winbond W83977F Super I/O Chip + * Used by the Award 430TX * * * - * Author: Miran Grca, - * Copyright 2016-2020 Miran Grca. + * Authors: Miran Grca, + * Copyright 2016-2020 Miran Grca. */ #include #include diff --git a/src/video/agpgart.c b/src/video/agpgart.c index 0a594a8d3..523fcc996 100644 --- a/src/video/agpgart.c +++ b/src/video/agpgart.c @@ -1,18 +1,18 @@ /* - * 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. * - * AGP Graphics Address Remapping Table remapping emulation. + * AGP Graphics Address Remapping Table remapping emulation. * * * - * Authors: RichardG, + * Authors: RichardG, * - * Copyright 2021 RichardG. + * Copyright 2021 RichardG. */ #include #include diff --git a/src/video/vid_8514a.c b/src/video/vid_8514a.c index 88dcee020..f7f3ce607 100644 --- a/src/video/vid_8514a.c +++ b/src/video/vid_8514a.c @@ -1,19 +1,19 @@ /* - * 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. * - * Emulation of the 8514/A card from IBM for the MCA bus and - * generic ISA bus clones without vendor extensions. + * Emulation of the 8514/A card from IBM for the MCA bus and + * generic ISA bus clones without vendor extensions. * * * - * Authors: TheCollector1995. + * Authors: TheCollector1995. * - * Copyright 2022 TheCollector1995. + * Copyright 2022 TheCollector1995. */ #include #include diff --git a/src/video/vid_ati18800.c b/src/video/vid_ati18800.c index 2fb58aa5b..c9cd8bfcd 100644 --- a/src/video/vid_ati18800.c +++ b/src/video/vid_ati18800.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * ATI 18800 emulation (VGA Edge-16) + * ATI 18800 emulation (VGA Edge-16) * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2020 Sarah Walker. - * Copyright 2016-2020 Miran Grca. + * Copyright 2008-2020 Sarah Walker. + * Copyright 2016-2020 Miran Grca. */ #include #include diff --git a/src/video/vid_ati28800.c b/src/video/vid_ati28800.c index 06b61d41f..1824d7fdc 100644 --- a/src/video/vid_ati28800.c +++ b/src/video/vid_ati28800.c @@ -1,22 +1,22 @@ /* - * 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. * - * ATI 28800 emulation (VGA Charger and Korean VGA) + * ATI 28800 emulation (VGA Charger and Korean VGA) * * * - * Authors: Sarah Walker, - * Miran Grca, - * greatpsycho, + * Authors: Sarah Walker, + * Miran Grca, + * greatpsycho, * - * Copyright 2008-2018 Sarah Walker. - * Copyright 2016-2018 Miran Grca. - * Copyright 2018 greatpsycho. + * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. + * Copyright 2018 greatpsycho. */ #include #include diff --git a/src/video/vid_ati68860_ramdac.c b/src/video/vid_ati68860_ramdac.c index 1bf74067a..43811ce68 100644 --- a/src/video/vid_ati68860_ramdac.c +++ b/src/video/vid_ati68860_ramdac.c @@ -1,40 +1,40 @@ /* - * 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. * - * ATI 68860 RAMDAC emulation (for Mach64) + * ATI 68860 RAMDAC emulation (for Mach64) * - * ATI 68860/68880 Truecolor DACs: - * REG08 (R/W): - * bit 0-? Always 2 ?? + * ATI 68860/68880 Truecolor DACs: + * REG08 (R/W): + * bit 0-? Always 2 ?? * - * REG0A (R/W): - * bit 0-? Always 1Dh ?? + * REG0A (R/W): + * bit 0-? Always 1Dh ?? * - * REG0B (R/W): (GMR ?) - * bit 0-7 Mode. 82h: 4bpp, 83h: 8bpp, - * A0h: 15bpp, A1h: 16bpp, C0h: 24bpp, - * E3h: 32bpp (80h for VGA modes ?) + * REG0B (R/W): (GMR ?) + * bit 0-7 Mode. 82h: 4bpp, 83h: 8bpp, + * A0h: 15bpp, A1h: 16bpp, C0h: 24bpp, + * E3h: 32bpp (80h for VGA modes ?) * - * REG0C (R/W): Device Setup Register A - * bit 0 Controls 6/8bit DAC. 0: 8bit DAC/LUT, 1: 6bit DAC/LUT - * 2-3 Depends on Video memory (= VRAM width ?) . - * 1: Less than 1Mb, 2: 1Mb, 3: > 1Mb - * 5-6 Always set ? - * 7 If set can remove "snow" in some cases - * (A860_Delay_L ?) ?? + * REG0C (R/W): Device Setup Register A + * bit 0 Controls 6/8bit DAC. 0: 8bit DAC/LUT, 1: 6bit DAC/LUT + * 2-3 Depends on Video memory (= VRAM width ?) . + * 1: Less than 1Mb, 2: 1Mb, 3: > 1Mb + * 5-6 Always set ? + * 7 If set can remove "snow" in some cases + * (A860_Delay_L ?) ?? * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2018 Sarah Walker. - * Copyright 2016-2018 Miran Grca. + * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. */ #include #include diff --git a/src/video/vid_ati_eeprom.c b/src/video/vid_ati_eeprom.c index 15696be63..c09d03846 100644 --- a/src/video/vid_ati_eeprom.c +++ b/src/video/vid_ati_eeprom.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Emulation of the EEPROM on select ATI cards. + * Emulation of the EEPROM on select ATI cards. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2020 Sarah Walker. - * Copyright 2016-2020 Miran Grca. + * Copyright 2008-2020 Sarah Walker. + * Copyright 2016-2020 Miran Grca. */ #include #include diff --git a/src/video/vid_ati_mach64.c b/src/video/vid_ati_mach64.c index c2aa2b6ad..0bd3b3843 100644 --- a/src/video/vid_ati_mach64.c +++ b/src/video/vid_ati_mach64.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * ATi Mach64 graphics card emulation. + * ATi Mach64 graphics card emulation. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 Miran Grca. + * Copyright 2008-2019 Sarah Walker. + * Copyright 2016-2019 Miran Grca. */ #include #include diff --git a/src/video/vid_att20c49x_ramdac.c b/src/video/vid_att20c49x_ramdac.c index 81cde31a4..4269f8b33 100644 --- a/src/video/vid_att20c49x_ramdac.c +++ b/src/video/vid_att20c49x_ramdac.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Emulation of a AT&T 20c490/491 and 492/493 RAMDAC. + * Emulation of a AT&T 20c490/491 and 492/493 RAMDAC. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2018 Sarah Walker. - * Copyright 2016-2018 Miran Grca. + * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. */ #include #include diff --git a/src/video/vid_att2xc498_ramdac.c b/src/video/vid_att2xc498_ramdac.c index 5983677db..32a91a490 100644 --- a/src/video/vid_att2xc498_ramdac.c +++ b/src/video/vid_att2xc498_ramdac.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Emulation of a AT&T 2xc498 RAMDAC. + * Emulation of a AT&T 2xc498 RAMDAC. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2018 Sarah Walker. - * Copyright 2016-2018 Miran Grca. + * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. */ #include #include diff --git a/src/video/vid_av9194.c b/src/video/vid_av9194.c index 20d39f247..f8ebc89de 100644 --- a/src/video/vid_av9194.c +++ b/src/video/vid_av9194.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * AV9194 clock generator emulation. + * AV9194 clock generator emulation. * - * Used by the S3 86c801 (V7-Mirage) card. + * Used by the S3 86c801 (V7-Mirage) card. * * * - * Authors: Miran Grca, + * Authors: Miran Grca, * - * Copyright 2016-2018 Miran Grca. + * Copyright 2016-2018 Miran Grca. */ #include #include diff --git a/src/video/vid_bt48x_ramdac.c b/src/video/vid_bt48x_ramdac.c index 05ade0cc3..daf840df8 100644 --- a/src/video/vid_bt48x_ramdac.c +++ b/src/video/vid_bt48x_ramdac.c @@ -1,21 +1,21 @@ /* - * 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. * - * Emulation of the Brooktree BT484-485A true colour RAMDAC - * family. + * Emulation of the Brooktree BT484-485A true colour RAMDAC + * family. * * * - * Authors: Miran Grca, - * TheCollector1995, + * Authors: Miran Grca, + * TheCollector1995, * - * Copyright 2016-2018 Miran Grca. - * Copyright 2018 TheCollector1995. + * Copyright 2016-2018 Miran Grca. + * Copyright 2018 TheCollector1995. */ #include #include diff --git a/src/video/vid_cga.c b/src/video/vid_cga.c index 8dba373df..80bf3bc85 100644 --- a/src/video/vid_cga.c +++ b/src/video/vid_cga.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Emulation of the old and new IBM CGA graphics cards. + * Emulation of the old and new IBM CGA graphics cards. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 Miran Grca. + * Copyright 2008-2019 Sarah Walker. + * Copyright 2016-2019 Miran Grca. */ #include #include diff --git a/src/video/vid_cga_comp.c b/src/video/vid_cga_comp.c index 077084000..ad9f673fb 100644 --- a/src/video/vid_cga_comp.c +++ b/src/video/vid_cga_comp.c @@ -1,21 +1,21 @@ /* - * 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. * - * IBM CGA composite filter, borrowed from reenigne's DOSBox - * patch and ported to C. + * IBM CGA composite filter, borrowed from reenigne's DOSBox + * patch and ported to C. * * * - * Authors: reenigne, - * Miran Grca, + * Authors: reenigne, + * Miran Grca, * - * Copyright 2015-2019 reenigne. - * Copyright 2015-2019 Miran Grca. + * Copyright 2015-2019 reenigne. + * Copyright 2015-2019 Miran Grca. */ #include #include diff --git a/src/video/vid_colorplus.c b/src/video/vid_colorplus.c index a343087d4..b460c15dd 100644 --- a/src/video/vid_colorplus.c +++ b/src/video/vid_colorplus.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Plantronics ColorPlus emulation. + * Plantronics ColorPlus emulation. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2018 Sarah Walker. - * Copyright 2016-2018 Miran Grca. + * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. */ #include #include diff --git a/src/video/vid_compaq_cga.c b/src/video/vid_compaq_cga.c index da4006339..e1295d629 100644 --- a/src/video/vid_compaq_cga.c +++ b/src/video/vid_compaq_cga.c @@ -1,22 +1,22 @@ /* - * 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. * - * Emulation of the Compaq CGA graphics cards. + * Emulation of the Compaq CGA graphics cards. * * * - * Authors: John Elliott, - * Sarah Walker, - * Miran Grca, + * Authors: John Elliott, + * Sarah Walker, + * Miran Grca, * - * Copyright 2016-2019 John Elliott. - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 Miran Grca. + * Copyright 2016-2019 John Elliott. + * Copyright 2008-2019 Sarah Walker. + * Copyright 2016-2019 Miran Grca. */ #include #include diff --git a/src/video/vid_ddc.c b/src/video/vid_ddc.c index b263448fc..f6c4d4dac 100644 --- a/src/video/vid_ddc.c +++ b/src/video/vid_ddc.c @@ -1,18 +1,18 @@ /* - * 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. * - * DDC monitor emulation. + * DDC monitor emulation. * * * - * Authors: RichardG, + * Authors: RichardG, * - * Copyright 2020 RichardG. + * Copyright 2020 RichardG. */ #include #include diff --git a/src/video/vid_ega.c b/src/video/vid_ega.c index af1c06335..c50c0a7b7 100644 --- a/src/video/vid_ega.c +++ b/src/video/vid_ega.c @@ -1,21 +1,21 @@ /* - * 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. * - * Emulation of the EGA and Chips & Technologies SuperEGA - * graphics cards. + * Emulation of the EGA and Chips & Technologies SuperEGA + * graphics cards. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 Miran Grca. + * Copyright 2008-2019 Sarah Walker. + * Copyright 2016-2019 Miran Grca. */ #include #include diff --git a/src/video/vid_ega_render.c b/src/video/vid_ega_render.c index a9699dbf9..ac5c65546 100644 --- a/src/video/vid_ega_render.c +++ b/src/video/vid_ega_render.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * EGA renderers. + * EGA renderers. * * * - * Author: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 Miran Grca. + * Copyright 2008-2019 Sarah Walker. + * Copyright 2016-2019 Miran Grca. */ #include #include diff --git a/src/video/vid_et3000.c b/src/video/vid_et3000.c index 1d6288d9c..d107afe5c 100644 --- a/src/video/vid_et3000.c +++ b/src/video/vid_et3000.c @@ -1,16 +1,18 @@ /* - * 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. * - * Emulation of the Tseng Labs ET3000. + * Emulation of the Tseng Labs ET3000. * - * Authors: Miran Grca, * - * Copyright 2016-2018 Miran Grca. + * + * Authors: Miran Grca, + * + * Copyright 2016-2018 Miran Grca. */ #include #include diff --git a/src/video/vid_f82c425.c b/src/video/vid_f82c425.c index 3fea0c1bd..1fda74630 100644 --- a/src/video/vid_f82c425.c +++ b/src/video/vid_f82c425.c @@ -1,36 +1,36 @@ /* - * 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. * - * Chips & Technologies 82C425 display controller emulation, - * with support for 640x200 LCD and SMARTMAP text contrast - * enhancement. + * Chips & Technologies 82C425 display controller emulation, + * with support for 640x200 LCD and SMARTMAP text contrast + * enhancement. * - * Relevant literature: + * Relevant literature: * - * [1] Chips and Technologies, Inc., 82C425 CGA LCD/CRT Controller, - * Data Sheet, Revision No. 2.2, September 1991. - * + * [1] Chips and Technologies, Inc., 82C425 CGA LCD/CRT Controller, + * Data Sheet, Revision No. 2.2, September 1991. + * * - * [2] Pleva et al., COLOR TO MONOCHROME CONVERSION, - * U.S. Patent 4,977,398, Dec. 11, 1990. - * + * [2] Pleva et al., COLOR TO MONOCHROME CONVERSION, + * U.S. Patent 4,977,398, Dec. 11, 1990. + * * - * Based on Toshiba T1000 plasma display emulation code. + * Based on Toshiba T1000 plasma display emulation code. * - * Authors: Fred N. van Kempen, - * Miran Grca, - * Sarah Walker, - * Lubomir Rintel, + * Authors: Fred N. van Kempen, + * Miran Grca, + * Sarah Walker, + * Lubomir Rintel, * - * Copyright 2018,2019 Fred N. van Kempen. - * Copyright 2018,2019 Miran Grca. - * Copyright 2018,2019 Sarah Walker. - * Copyright 2021 Lubomir Rintel. + * Copyright 2018,2019 Fred N. van Kempen. + * Copyright 2018,2019 Miran Grca. + * Copyright 2018,2019 Sarah Walker. + * Copyright 2021 Lubomir Rintel. * * 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 diff --git a/src/video/vid_genius.c b/src/video/vid_genius.c index 5c13e3415..9d2cbb947 100644 --- a/src/video/vid_genius.c +++ b/src/video/vid_genius.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * MDSI Genius VHR emulation. + * MDSI Genius VHR emulation. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 Miran Grca. + * Copyright 2008-2019 Sarah Walker. + * Copyright 2016-2019 Miran Grca. */ #include #include diff --git a/src/video/vid_hercules.c b/src/video/vid_hercules.c index 550f05338..e9fab0a16 100644 --- a/src/video/vid_hercules.c +++ b/src/video/vid_hercules.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Hercules emulation. + * Hercules emulation. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 Miran Grca. + * Copyright 2008-2019 Sarah Walker. + * Copyright 2016-2019 Miran Grca. */ #include #include diff --git a/src/video/vid_herculesplus.c b/src/video/vid_herculesplus.c index ea569cd3e..cf762365a 100644 --- a/src/video/vid_herculesplus.c +++ b/src/video/vid_herculesplus.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Hercules Plus emulation. + * Hercules Plus emulation. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2018 Sarah Walker. - * Copyright 2016-2018 Miran Grca. + * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. */ #include #include diff --git a/src/video/vid_ht216.c b/src/video/vid_ht216.c index 72d101e2b..ad5bf7af0 100644 --- a/src/video/vid_ht216.c +++ b/src/video/vid_ht216.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Video 7 VGA 1024i emulation. + * Video 7 VGA 1024i emulation. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2019 Sarah Walker. - * Copyright 2019 Miran Grca. + * Copyright 2019 Sarah Walker. + * Copyright 2019 Miran Grca. */ #include #include diff --git a/src/video/vid_ibm_rgb528_ramdac.c b/src/video/vid_ibm_rgb528_ramdac.c index 2f050e7c7..adfc6ea39 100644 --- a/src/video/vid_ibm_rgb528_ramdac.c +++ b/src/video/vid_ibm_rgb528_ramdac.c @@ -1,18 +1,18 @@ /* - * 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. * - * Emulation of the IBM RGB 528 true colour RAMDAC. + * Emulation of the IBM RGB 528 true colour RAMDAC. * * * - * Authors: Miran Grca, + * Authors: Miran Grca, * - * Copyright 2020 Miran Grca. + * Copyright 2020 Miran Grca. */ #include #include diff --git a/src/video/vid_icd2061.c b/src/video/vid_icd2061.c index 85740144c..3fafb65d9 100644 --- a/src/video/vid_icd2061.c +++ b/src/video/vid_icd2061.c @@ -1,24 +1,24 @@ /* - * 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. * - * ICD2061 clock generator emulation. - * Also emulates the ICS9161 which is the same as the ICD2016, - * but without the need for tuning (which is irrelevant in - * emulation anyway). + * ICD2061 clock generator emulation. + * Also emulates the ICS9161 which is the same as the ICD2016, + * but without the need for tuning (which is irrelevant in + * emulation anyway). * - * Used by ET4000w32/p (Diamond Stealth 32) and the S3 - * Vision964 family. + * Used by ET4000w32/p (Diamond Stealth 32) and the S3 + * Vision964 family. * * * - * Authors: Miran Grca, + * Authors: Miran Grca, * - * Copyright 2016-2018 Miran Grca. + * Copyright 2016-2018 Miran Grca. */ #include #include diff --git a/src/video/vid_ics2494.c b/src/video/vid_ics2494.c index d3a40cc8b..8bb4b0cb8 100644 --- a/src/video/vid_ics2494.c +++ b/src/video/vid_ics2494.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * ICS2494 clock generator emulation. + * ICS2494 clock generator emulation. * - * Used by the AMI S3 924. + * Used by the AMI S3 924. * * * - * Authors: Miran Grca, + * Authors: Miran Grca, * - * Copyright 2020 Miran Grca. + * Copyright 2020 Miran Grca. */ #include #include diff --git a/src/video/vid_ics2595.c b/src/video/vid_ics2595.c index 77c46b6c3..157987083 100644 --- a/src/video/vid_ics2595.c +++ b/src/video/vid_ics2595.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * ICS2595 clock chip emulation. Used by ATI Mach64. + * ICS2595 clock chip emulation. Used by ATI Mach64. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2018 Sarah Walker. - * Copyright 2016-2018 Miran Grca. + * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. */ #include #include diff --git a/src/video/vid_im1024.c b/src/video/vid_im1024.c index 9e08ce583..12d884127 100644 --- a/src/video/vid_im1024.c +++ b/src/video/vid_im1024.c @@ -1,50 +1,50 @@ /* - * 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. * - * Emulation of the ImageManager 1024 video controller. + * Emulation of the ImageManager 1024 video controller. * - * Just enough of the Vermont Microsystems IM-1024 is implemented - * to support the Windows 1.03 driver. Functions are partially - * implemented or hardwired to the behavior expected by the - * Windows driver. + * Just enough of the Vermont Microsystems IM-1024 is implemented + * to support the Windows 1.03 driver. Functions are partially + * implemented or hardwired to the behavior expected by the + * Windows driver. * - * One major difference seems to be that in hex mode, coordinates - * are passed as 2-byte integer words rather than 4-byte - * fixed-point fractions. + * One major difference seems to be that in hex mode, coordinates + * are passed as 2-byte integer words rather than 4-byte + * fixed-point fractions. * - * It is unknown what triggers this, so for now it's always on. + * It is unknown what triggers this, so for now it's always on. * - * As well as the usual PGC ring buffer at 0xC6000, the IM1024 - * appears to have an alternate method of passing commands. This - * is enabled by setting 0xC6330 to 1, and then: + * As well as the usual PGC ring buffer at 0xC6000, the IM1024 + * appears to have an alternate method of passing commands. This + * is enabled by setting 0xC6330 to 1, and then: * - * CX = count to write - * SI -> bytes to write + * CX = count to write + * SI -> bytes to write * - * Set pending bytes to 0 - * Read [C6331]. This gives number of bytes that can be written: - * 0xFF => 0, 0xFE => 1, 0xFD => 2 etc. - * Write that number of bytes to C6000. - * If there are more to come, go back to reading [C6331]. + * Set pending bytes to 0 + * Read [C6331]. This gives number of bytes that can be written: + * 0xFF => 0, 0xFE => 1, 0xFD => 2 etc. + * Write that number of bytes to C6000. + * If there are more to come, go back to reading [C6331]. * - * As far as can be determined, at least one byte is always - * written; there is no provision to pause if the queue is full. + * As far as can be determined, at least one byte is always + * written; there is no provision to pause if the queue is full. * - * This is implemented by holding a FIFO of unlimited depth in - * the IM1024 to receive the data. + * This is implemented by holding a FIFO of unlimited depth in + * the IM1024 to receive the data. * * * - * Authors: Fred N. van Kempen, - * John Elliott, + * Authors: Fred N. van Kempen, + * John Elliott, * - * Copyright 2019 Fred N. van Kempen. - * Copyright 2019 John Elliott. + * Copyright 2019 Fred N. van Kempen. + * Copyright 2019 John Elliott. */ #include #include diff --git a/src/video/vid_incolor.c b/src/video/vid_incolor.c index 6bf98ab86..652dc79ab 100644 --- a/src/video/vid_incolor.c +++ b/src/video/vid_incolor.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Hercules InColor emulation. + * Hercules InColor emulation. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2018 Sarah Walker. - * Copyright 2016-2018 Miran Grca. + * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. */ #include #include diff --git a/src/video/vid_mda.c b/src/video/vid_mda.c index 5ace70058..019dc4885 100644 --- a/src/video/vid_mda.c +++ b/src/video/vid_mda.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * MDA emulation. + * MDA emulation. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 Miran Grca. + * Copyright 2008-2019 Sarah Walker. + * Copyright 2016-2019 Miran Grca. */ #include #include diff --git a/src/video/vid_mga.c b/src/video/vid_mga.c index 6da9a7c0f..1532ae116 100644 --- a/src/video/vid_mga.c +++ b/src/video/vid_mga.c @@ -1,17 +1,18 @@ /* - * 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. * - * Matrox MGA graphics card emulation. + * Matrox MGA graphics card emulation. * * * - * Author: Sarah Walker, - * Copyright 2008-2020 Sarah Walker. + * Authors: Sarah Walker, + * + * Copyright 2008-2020 Sarah Walker. */ #include #include diff --git a/src/video/vid_nga.c b/src/video/vid_nga.c index 86173f198..331b0f70b 100644 --- a/src/video/vid_nga.c +++ b/src/video/vid_nga.c @@ -1,24 +1,24 @@ /* - * 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. * - * Emulation of the NCR NGA (K511, K201) video cards. + * Emulation of the NCR NGA (K511, K201) video cards. * * * - * Authors: Sarah Walker, - * Miran Grca, - * Fred N. van Kempen, - * EngiNerd, + * Authors: Sarah Walker, + * Miran Grca, + * Fred N. van Kempen, + * EngiNerd, * - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 Miran Grca. - * Copyright 2017-2019 Fred N. van Kempen. - * Copyright 2020 EngiNerd. + * Copyright 2008-2019 Sarah Walker. + * Copyright 2016-2019 Miran Grca. + * Copyright 2017-2019 Fred N. van Kempen. + * Copyright 2020 EngiNerd. */ #include diff --git a/src/video/vid_oak_oti.c b/src/video/vid_oak_oti.c index 742bbafb0..936ef158a 100644 --- a/src/video/vid_oak_oti.c +++ b/src/video/vid_oak_oti.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Oak OTI037C/67/077 emulation. + * Oak OTI037C/67/077 emulation. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2018 Sarah Walker. - * Copyright 2016-2018 Miran Grca. + * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. */ #include #include diff --git a/src/video/vid_ogc.c b/src/video/vid_ogc.c index eddc6da8d..a3ca21ad9 100644 --- a/src/video/vid_ogc.c +++ b/src/video/vid_ogc.c @@ -1,25 +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. + * 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. * - * Emulation of the Olivetti OGC 8-bit ISA (GO708) and - * M21/M24/M28 16-bit bus (GO317/318/380/709) video cards. + * Emulation of the Olivetti OGC 8-bit ISA (GO708) and + * M21/M24/M28 16-bit bus (GO317/318/380/709) video cards. * * * - * Authors: Sarah Walker, - * Miran Grca, - * Fred N. van Kempen, - * EngiNerd, + * Authors: Sarah Walker, + * Miran Grca, + * Fred N. van Kempen, + * EngiNerd, * - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 Miran Grca. - * Copyright 2017-2019 Fred N. van Kempen. - * Copyright 2020 EngiNerd. + * Copyright 2008-2019 Sarah Walker. + * Copyright 2016-2019 Miran Grca. + * Copyright 2017-2019 Fred N. van Kempen. + * Copyright 2020 EngiNerd. */ #include diff --git a/src/video/vid_paradise.c b/src/video/vid_paradise.c index 3d82d459a..a60d61eb8 100644 --- a/src/video/vid_paradise.c +++ b/src/video/vid_paradise.c @@ -1,22 +1,22 @@ /* - * 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. * - * Paradise VGA emulation - * PC2086, PC3086 use PVGA1A - * MegaPC uses W90C11A + * Paradise VGA emulation + * PC2086, PC3086 use PVGA1A + * MegaPC uses W90C11A * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 Miran Grca. + * Copyright 2008-2019 Sarah Walker. + * Copyright 2016-2019 Miran Grca. */ #include #include diff --git a/src/video/vid_pgc.c b/src/video/vid_pgc.c index eb28540fc..74a20145c 100644 --- a/src/video/vid_pgc.c +++ b/src/video/vid_pgc.c @@ -1,56 +1,56 @@ /* - * 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. * - * This implements just enough of the Professional Graphics - * Controller to act as a basis for the Vermont Microsystems - * IM-1024. + * This implements just enough of the Professional Graphics + * Controller to act as a basis for the Vermont Microsystems + * IM-1024. * - * PGC features implemented include: - * > The CGA-compatible display modes - * > Switching to and from native mode - * > Communicating with the host PC + * PGC features implemented include: + * > The CGA-compatible display modes + * > Switching to and from native mode + * > Communicating with the host PC * - * Numerous features are implemented partially or not at all, - * such as: - * > 2D drawing - * > 3D drawing - * > Command lists - * Some of these are marked TODO. + * Numerous features are implemented partially or not at all, + * such as: + * > 2D drawing + * > 3D drawing + * > Command lists + * Some of these are marked TODO. * - * The PGC has two display modes: CGA (in which it appears in - * the normal CGA memory and I/O ranges) and native (in which - * all functions are accessed through reads and writes to 1K - * of memory at 0xC6000). + * The PGC has two display modes: CGA (in which it appears in + * the normal CGA memory and I/O ranges) and native (in which + * all functions are accessed through reads and writes to 1K + * of memory at 0xC6000). * - * The PGC's 8088 processor monitors this buffer and executes - * instructions left there for it. We simulate this behavior - * with a separate thread. + * The PGC's 8088 processor monitors this buffer and executes + * instructions left there for it. We simulate this behavior + * with a separate thread. * - * **NOTE** This driver is not finished yet: + * **NOTE** This driver is not finished yet: * - * - cursor will blink at very high speed if used on a machine - * with clock greater than 4.77MHz. We should "scale down" - * this speed, to become relative to a 4.77MHz-based system. + * - cursor will blink at very high speed if used on a machine + * with clock greater than 4.77MHz. We should "scale down" + * this speed, to become relative to a 4.77MHz-based system. * - * - pgc_plot() should be overloaded by clones if they support - * modes other than WRITE and INVERT, like the IM-1024. + * - pgc_plot() should be overloaded by clones if they support + * modes other than WRITE and INVERT, like the IM-1024. * - * - test it with the Windows 1.x driver? + * - test it with the Windows 1.x driver? * - * This is expected to be done shortly. + * This is expected to be done shortly. * * * - * Authors: Fred N. van Kempen, - * John Elliott, + * Authors: Fred N. van Kempen, + * John Elliott, * - * Copyright 2019 Fred N. van Kempen. - * Copyright 2019 John Elliott. + * Copyright 2019 Fred N. van Kempen. + * Copyright 2019 John Elliott. * * 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 diff --git a/src/video/vid_rtg310x.c b/src/video/vid_rtg310x.c index 10f97cf4f..6f317426b 100644 --- a/src/video/vid_rtg310x.c +++ b/src/video/vid_rtg310x.c @@ -1,18 +1,18 @@ /* - * 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. * - * Emulation of the Realtek RTG series of VGA ISA chips. + * Emulation of the Realtek RTG series of VGA ISA chips. * * * - * Authors: TheCollector1995, + * Authors: TheCollector1995, * - * Copyright 2021 TheCollector1995. + * Copyright 2021 TheCollector1995. */ #include #include diff --git a/src/video/vid_s3_virge.c b/src/video/vid_s3_virge.c index 99661d309..94c0f575c 100644 --- a/src/video/vid_s3_virge.c +++ b/src/video/vid_s3_virge.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * S3 ViRGE emulation. + * S3 ViRGE emulation. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2018 Sarah Walker. - * Copyright 2016-2018 Miran Grca. + * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. */ #include #include diff --git a/src/video/vid_sc1148x_ramdac.c b/src/video/vid_sc1148x_ramdac.c index 936ff308d..873f66e92 100644 --- a/src/video/vid_sc1148x_ramdac.c +++ b/src/video/vid_sc1148x_ramdac.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Emulation of Sierra SC1148x RAMDACs and clones (e.g.: Winbond). + * Emulation of Sierra SC1148x RAMDACs and clones (e.g.: Winbond). * - * Used by the S3 911 and 924 chips. + * Used by the S3 911 and 924 chips. * * * - * Authors: TheCollector1995, + * Authors: TheCollector1995, * - * Copyright 2020 TheCollector1995. + * Copyright 2020 TheCollector1995. */ #include #include diff --git a/src/video/vid_sc1502x_ramdac.c b/src/video/vid_sc1502x_ramdac.c index 202091449..625788efe 100644 --- a/src/video/vid_sc1502x_ramdac.c +++ b/src/video/vid_sc1502x_ramdac.c @@ -1,22 +1,22 @@ /* - * 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. * - * Emulation of a Sierra SC1502X RAMDAC. + * Emulation of a Sierra SC1502X RAMDAC. * - * Used by the TLIVESA1 driver for ET4000. + * Used by the TLIVESA1 driver for ET4000. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2018 Sarah Walker. - * Copyright 2016-2018 Miran Grca. + * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. */ #include #include diff --git a/src/video/vid_sdac_ramdac.c b/src/video/vid_sdac_ramdac.c index 58d6b164c..4c97924bd 100644 --- a/src/video/vid_sdac_ramdac.c +++ b/src/video/vid_sdac_ramdac.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * 87C716 'SDAC' true colour RAMDAC emulation. + * 87C716 'SDAC' true colour RAMDAC emulation. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 Miran Grca. + * Copyright 2008-2019 Sarah Walker. + * Copyright 2016-2019 Miran Grca. */ #include #include diff --git a/src/video/vid_sigma.c b/src/video/vid_sigma.c index d8fa55ce3..0e1833b1e 100644 --- a/src/video/vid_sigma.c +++ b/src/video/vid_sigma.c @@ -1,18 +1,18 @@ /* - * 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. * - * Sigma Color 400 emulation. + * Sigma Color 400 emulation. * * * - * Authors: John Elliott, + * Authors: John Elliott, * - * Copyright 2018 John Elliott. + * Copyright 2018 John Elliott. */ #include #include diff --git a/src/video/vid_stg_ramdac.c b/src/video/vid_stg_ramdac.c index 161cf1177..592cc275e 100644 --- a/src/video/vid_stg_ramdac.c +++ b/src/video/vid_stg_ramdac.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * STG1702 true colour RAMDAC emulation. + * STG1702 true colour RAMDAC emulation. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2018 Sarah Walker. - * Copyright 2016-2018 Miran Grca. + * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. */ #include #include diff --git a/src/video/vid_svga_render.c b/src/video/vid_svga_render.c index c67a46e0d..36e25771b 100644 --- a/src/video/vid_svga_render.c +++ b/src/video/vid_svga_render.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * SVGA renderers. + * SVGA renderers. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 Miran Grca. + * Copyright 2008-2019 Sarah Walker. + * Copyright 2016-2019 Miran Grca. */ #include #include diff --git a/src/video/vid_tgui9440.c b/src/video/vid_tgui9440.c index dd39daf8e..8b67bb23e 100644 --- a/src/video/vid_tgui9440.c +++ b/src/video/vid_tgui9440.c @@ -1,59 +1,59 @@ /* - * 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. * - * Trident TGUI9400CXi and TGUI9440 emulation. + * Trident TGUI9400CXi and TGUI9440 emulation. * - * TGUI9400CXi has extended write modes, controlled by extended - * GDC registers : + * TGUI9400CXi has extended write modes, controlled by extended + * GDC registers : * - * GDC[0x10] - Control - * bit 0 - pixel width (1 = 16 bit, 0 = 8 bit) - * bit 1 - mono->colour expansion (1 = enabled, - * 0 = disabled) - * bit 2 - mono->colour expansion transparency - * (1 = transparent, 0 = opaque) - * bit 3 - extended latch copy - * GDC[0x11] - Background colour (low byte) - * GDC[0x12] - Background colour (high byte) - * GDC[0x14] - Foreground colour (low byte) - * GDC[0x15] - Foreground colour (high byte) - * GDC[0x17] - Write mask (low byte) - * GDC[0x18] - Write mask (high byte) + * GDC[0x10] - Control + * bit 0 - pixel width (1 = 16 bit, 0 = 8 bit) + * bit 1 - mono->colour expansion (1 = enabled, + * 0 = disabled) + * bit 2 - mono->colour expansion transparency + * (1 = transparent, 0 = opaque) + * bit 3 - extended latch copy + * GDC[0x11] - Background colour (low byte) + * GDC[0x12] - Background colour (high byte) + * GDC[0x14] - Foreground colour (low byte) + * GDC[0x15] - Foreground colour (high byte) + * GDC[0x17] - Write mask (low byte) + * GDC[0x18] - Write mask (high byte) * - * Mono->colour expansion will expand written data 8:1 to 8/16 - * consecutive bytes. - * MSB is processed first. On word writes, low byte is processed - * first. 1 bits write foreground colour, 0 bits write background - * colour unless transparency is enabled. - * If the relevant bit is clear in the write mask then the data - * is not written. + * Mono->colour expansion will expand written data 8:1 to 8/16 + * consecutive bytes. + * MSB is processed first. On word writes, low byte is processed + * first. 1 bits write foreground colour, 0 bits write background + * colour unless transparency is enabled. + * If the relevant bit is clear in the write mask then the data + * is not written. * - * With 16-bit pixel width, each bit still expands to one byte, - * so the TGUI driver doubles up monochrome data. + * With 16-bit pixel width, each bit still expands to one byte, + * so the TGUI driver doubles up monochrome data. * - * While there is room in the register map for three byte colours, - * I don't believe 24-bit colour is supported. The TGUI9440 - * blitter has the same limitation. + * While there is room in the register map for three byte colours, + * I don't believe 24-bit colour is supported. The TGUI9440 + * blitter has the same limitation. * - * I don't think double word writes are supported. + * I don't think double word writes are supported. * - * Extended latch copy uses an internal 16 byte latch. Reads load - * the latch, writing writes out 16 bytes. I don't think the - * access size or host data has any affect, but the Windows 3.1 - * driver always reads bytes and write words of 0xffff. + * Extended latch copy uses an internal 16 byte latch. Reads load + * the latch, writing writes out 16 bytes. I don't think the + * access size or host data has any affect, but the Windows 3.1 + * driver always reads bytes and write words of 0xffff. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 Miran Grca. + * Copyright 2008-2019 Sarah Walker. + * Copyright 2016-2019 Miran Grca. */ #include #include diff --git a/src/video/vid_ti_cf62011.c b/src/video/vid_ti_cf62011.c index 417f85861..1ceaf169e 100644 --- a/src/video/vid_ti_cf62011.c +++ b/src/video/vid_ti_cf62011.c @@ -1,56 +1,56 @@ /* - * 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. * - * Emulation of the TI CF62011 SVGA chip. + * Emulation of the TI CF62011 SVGA chip. * - * This chip was used in several of IBM's later machines, such - * as the PS/1 Model 2121, and a number of PS/2 models. As noted - * in an article on Usenet: + * This chip was used in several of IBM's later machines, such + * as the PS/1 Model 2121, and a number of PS/2 models. As noted + * in an article on Usenet: * - * "In the early 90s IBM looked for some cheap VGA card to - * substitute the (relatively) expensive XGA-2 adapter for - * *servers*, where the primary purpose is supervision of the - * machine rather than real *work* with it in Hi-Res. It was - * just to supply a base video, where a XGA-2 were a waste of - * potential. They had a contract with TI for some DSPs in - * multimedia already (the MWave for instance is based on - * TI-DSPs as well as many Thinkpad internal chipsets) and TI - * offered them a rather cheap – and inexpensive – chipset - * and combined it with a cheap clock oscillator and an Inmos - * RAMDAC. That chipset was already pretty much outdated at - * that time but IBM decided it would suffice for that low - * end purpose. + * "In the early 90s IBM looked for some cheap VGA card to + * substitute the (relatively) expensive XGA-2 adapter for + * *servers*, where the primary purpose is supervision of the + * machine rather than real *work* with it in Hi-Res. It was + * just to supply a base video, where a XGA-2 were a waste of + * potential. They had a contract with TI for some DSPs in + * multimedia already (the MWave for instance is based on + * TI-DSPs as well as many Thinkpad internal chipsets) and TI + * offered them a rather cheap – and inexpensive – chipset + * and combined it with a cheap clock oscillator and an Inmos + * RAMDAC. That chipset was already pretty much outdated at + * that time but IBM decided it would suffice for that low + * end purpose. * - * Driver support was given under DOS and OS/2 only for base - * functions like selection of the vertical refresh and few - * different modes only. Not even the Win 3.x support has - * been finalized. Technically the adapter could do better - * than VGA, but its video BIOS is largely undocumented and - * intentionally crippled down to a few functions." + * Driver support was given under DOS and OS/2 only for base + * functions like selection of the vertical refresh and few + * different modes only. Not even the Win 3.x support has + * been finalized. Technically the adapter could do better + * than VGA, but its video BIOS is largely undocumented and + * intentionally crippled down to a few functions." * - * This chip is reportedly the same one as used in the MCA - * IBM SVGA Adapter/A (ID 090EEh), which mostly had faster - * VRAM and RAMDAC. The VESA DOS graphics driver for that - * card can be used: m95svga.exe + * This chip is reportedly the same one as used in the MCA + * IBM SVGA Adapter/A (ID 090EEh), which mostly had faster + * VRAM and RAMDAC. The VESA DOS graphics driver for that + * card can be used: m95svga.exe * - * The controller responds at ports in the range 0x2100-0x210F, - * which are the same as the XGA. It supports up to 1MB of VRAM, - * but we lock it down to 512K. The PS/1 2122 had 256K. + * The controller responds at ports in the range 0x2100-0x210F, + * which are the same as the XGA. It supports up to 1MB of VRAM, + * but we lock it down to 512K. The PS/1 2122 had 256K. * * * - * Authors: Sarah Walker, - * Miran Grca, - * Fred N. van Kempen, + * Authors: Sarah Walker, + * Miran Grca, + * Fred N. van Kempen, * - * Copyright 2008-2018 Sarah Walker. - * Copyright 2016-2018 Miran Grca. - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. + * Copyright 2017,2018 Fred N. van Kempen. */ #include #include diff --git a/src/video/vid_tkd8001_ramdac.c b/src/video/vid_tkd8001_ramdac.c index 225c91c4b..1d1668d25 100644 --- a/src/video/vid_tkd8001_ramdac.c +++ b/src/video/vid_tkd8001_ramdac.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Trident TKD8001 RAMDAC emulation. + * Trident TKD8001 RAMDAC emulation. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2018 Sarah Walker. - * Copyright 2016-2018 Miran Grca. + * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. */ #include #include diff --git a/src/video/vid_tvga.c b/src/video/vid_tvga.c index ed249f618..491dc24a9 100644 --- a/src/video/vid_tvga.c +++ b/src/video/vid_tvga.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Trident TVGA (8900D) emulation. + * Trident TVGA (8900D) emulation. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2018 Sarah Walker. - * Copyright 2016-2018 Miran Grca. + * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. */ #include #include diff --git a/src/video/vid_tvp3026_ramdac.c b/src/video/vid_tvp3026_ramdac.c index cde953b01..2ea60d520 100644 --- a/src/video/vid_tvp3026_ramdac.c +++ b/src/video/vid_tvp3026_ramdac.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Emulation of the Texas Instruments TVP3026 true colour RAMDAC - * family. + * Emulation of the Texas Instruments TVP3026 true colour RAMDAC + * family. * * - * TODO: Clock and other parts. + * TODO: Clock and other parts. * - * Authors: TheCollector1995, + * Authors: TheCollector1995, * - * Copyright 2021 TheCollector1995. + * Copyright 2021 TheCollector1995. */ #include #include diff --git a/src/video/vid_vga.c b/src/video/vid_vga.c index e581f237c..de3943ec0 100644 --- a/src/video/vid_vga.c +++ b/src/video/vid_vga.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * IBM VGA emulation. + * IBM VGA emulation. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2018 Sarah Walker. - * Copyright 2016-2018 Miran Grca. + * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. */ #include #include diff --git a/src/video/vid_voodoo.c b/src/video/vid_voodoo.c index 326ff9879..346e33755 100644 --- a/src/video/vid_voodoo.c +++ b/src/video/vid_voodoo.c @@ -1,19 +1,19 @@ /* - * 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. * - * Voodoo Graphics, 2, Banshee, 3 emulation. + * Voodoo Graphics, 2, Banshee, 3 emulation. * * * - * Authors: Sarah Walker, - * leilei + * Authors: Sarah Walker, + * leilei * - * Copyright 2008-2020 Sarah Walker. + * Copyright 2008-2020 Sarah Walker. */ #include #include diff --git a/src/video/vid_voodoo_banshee.c b/src/video/vid_voodoo_banshee.c index 386ac8575..956176180 100644 --- a/src/video/vid_voodoo_banshee.c +++ b/src/video/vid_voodoo_banshee.c @@ -1,18 +1,18 @@ /* - * 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. * - * Voodoo Banshee and 3 specific emulation. + * Voodoo Banshee and 3 specific emulation. * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * - * Copyright 2008-2020 Sarah Walker. + * Copyright 2008-2020 Sarah Walker. */ #include #include diff --git a/src/video/vid_voodoo_blitter.c b/src/video/vid_voodoo_blitter.c index 00847554a..a0f8109f0 100644 --- a/src/video/vid_voodoo_blitter.c +++ b/src/video/vid_voodoo_blitter.c @@ -1,18 +1,18 @@ /* - * 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. * - * 3DFX Voodoo emulation. + * 3DFX Voodoo emulation. * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * - * Copyright 2008-2020 Sarah Walker. + * Copyright 2008-2020 Sarah Walker. */ #include #include diff --git a/src/video/vid_voodoo_display.c b/src/video/vid_voodoo_display.c index 40e0b2ce9..7ab72dabe 100644 --- a/src/video/vid_voodoo_display.c +++ b/src/video/vid_voodoo_display.c @@ -1,18 +1,18 @@ /* - * 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. * - * 3DFX Voodoo emulation. + * 3DFX Voodoo emulation. * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * - * Copyright 2008-2020 Sarah Walker. + * Copyright 2008-2020 Sarah Walker. */ #include #include diff --git a/src/video/vid_voodoo_fb.c b/src/video/vid_voodoo_fb.c index 705c16853..267949cde 100644 --- a/src/video/vid_voodoo_fb.c +++ b/src/video/vid_voodoo_fb.c @@ -1,18 +1,18 @@ /* - * 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. * - * 3DFX Voodoo emulation. + * 3DFX Voodoo emulation. * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * - * Copyright 2008-2020 Sarah Walker. + * Copyright 2008-2020 Sarah Walker. */ #include #include diff --git a/src/video/vid_voodoo_fifo.c b/src/video/vid_voodoo_fifo.c index d90c12bb5..5b2ef1bb2 100644 --- a/src/video/vid_voodoo_fifo.c +++ b/src/video/vid_voodoo_fifo.c @@ -1,18 +1,18 @@ /* - * 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. * - * 3DFX Voodoo emulation. + * 3DFX Voodoo emulation. * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * - * Copyright 2008-2020 Sarah Walker. + * Copyright 2008-2020 Sarah Walker. */ #include #include diff --git a/src/video/vid_voodoo_reg.c b/src/video/vid_voodoo_reg.c index 3d5580d04..1822e3070 100644 --- a/src/video/vid_voodoo_reg.c +++ b/src/video/vid_voodoo_reg.c @@ -1,18 +1,18 @@ /* - * 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. * - * 3DFX Voodoo emulation. + * 3DFX Voodoo emulation. * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * - * Copyright 2008-2020 Sarah Walker. + * Copyright 2008-2020 Sarah Walker. */ #include #include diff --git a/src/video/vid_voodoo_render.c b/src/video/vid_voodoo_render.c index ec16b3a32..d419d1891 100644 --- a/src/video/vid_voodoo_render.c +++ b/src/video/vid_voodoo_render.c @@ -1,18 +1,18 @@ /* - * 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. * - * 3DFX Voodoo emulation. + * 3DFX Voodoo emulation. * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * - * Copyright 2008-2020 Sarah Walker. + * Copyright 2008-2020 Sarah Walker. */ #include #include diff --git a/src/video/vid_voodoo_setup.c b/src/video/vid_voodoo_setup.c index f98ddb450..7a09dffcc 100644 --- a/src/video/vid_voodoo_setup.c +++ b/src/video/vid_voodoo_setup.c @@ -1,18 +1,18 @@ /* - * 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. * - * 3DFX Voodoo emulation. + * 3DFX Voodoo emulation. * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * - * Copyright 2008-2020 Sarah Walker. + * Copyright 2008-2020 Sarah Walker. */ #include #include diff --git a/src/video/vid_voodoo_texture.c b/src/video/vid_voodoo_texture.c index 9d1149c65..8e1cd71db 100644 --- a/src/video/vid_voodoo_texture.c +++ b/src/video/vid_voodoo_texture.c @@ -1,18 +1,18 @@ /* - * 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. * - * 3DFX Voodoo emulation. + * 3DFX Voodoo emulation. * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * - * Copyright 2008-2020 Sarah Walker. + * Copyright 2008-2020 Sarah Walker. */ #include #include diff --git a/src/video/vid_wy700.c b/src/video/vid_wy700.c index e492523db..9fb5b9ee4 100644 --- a/src/video/vid_wy700.c +++ b/src/video/vid_wy700.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Wyse-700 emulation. + * Wyse-700 emulation. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2018 Sarah Walker. - * Copyright 2016-2018 Miran Grca. + * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. */ #include #include diff --git a/src/video/video.c b/src/video/video.c index 096ea89e1..5d5f2f37b 100644 --- a/src/video/video.c +++ b/src/video/video.c @@ -1,52 +1,52 @@ /* - * 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. * - * Main video-rendering module. + * Main video-rendering module. * - * Video timing settings - + * Video timing settings - * - * 8-bit - 1mb/sec - * B = 8 ISA clocks - * W = 16 ISA clocks - * L = 32 ISA clocks + * 8-bit - 1mb/sec + * B = 8 ISA clocks + * W = 16 ISA clocks + * L = 32 ISA clocks * - * Slow 16-bit - 2mb/sec - * B = 6 ISA clocks - * W = 8 ISA clocks - * L = 16 ISA clocks + * Slow 16-bit - 2mb/sec + * B = 6 ISA clocks + * W = 8 ISA clocks + * L = 16 ISA clocks * - * Fast 16-bit - 4mb/sec - * B = 3 ISA clocks - * W = 3 ISA clocks - * L = 6 ISA clocks + * Fast 16-bit - 4mb/sec + * B = 3 ISA clocks + * W = 3 ISA clocks + * L = 6 ISA clocks * - * Slow VLB/PCI - 8mb/sec (ish) - * B = 4 bus clocks - * W = 8 bus clocks - * L = 16 bus clocks + * Slow VLB/PCI - 8mb/sec (ish) + * B = 4 bus clocks + * W = 8 bus clocks + * L = 16 bus clocks * - * Mid VLB/PCI - - * B = 4 bus clocks - * W = 5 bus clocks - * L = 10 bus clocks + * Mid VLB/PCI - + * B = 4 bus clocks + * W = 5 bus clocks + * L = 10 bus clocks * - * Fast VLB/PCI - - * B = 3 bus clocks - * W = 3 bus clocks - * L = 4 bus clocks + * Fast VLB/PCI - + * B = 3 bus clocks + * W = 3 bus clocks + * L = 4 bus clocks * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 Miran Grca. + * Copyright 2008-2019 Sarah Walker. + * Copyright 2016-2019 Miran Grca. */ #include #define PNG_DEBUG 0 diff --git a/src/win/win_icon.c b/src/win/win_icon.c index d23a325ff..64acc44b0 100644 --- a/src/win/win_icon.c +++ b/src/win/win_icon.c @@ -9,6 +9,7 @@ * Implement the application's icon changing system. * * + * * Authors: Laci bá' * * Copyright 2021 Laci bá'. diff --git a/src/win/win_joystick_rawinput.c b/src/win/win_joystick_rawinput.c index efaf76f01..efa7714df 100644 --- a/src/win/win_joystick_rawinput.c +++ b/src/win/win_joystick_rawinput.c @@ -8,6 +8,8 @@ * * RawInput joystick interface. * + * + * * Authors: Sarah Walker, * Miran Grca, * GH Cao, diff --git a/src/win/win_opengl.c b/src/win/win_opengl.c index d9a492927..05d7eb72c 100644 --- a/src/win/win_opengl.c +++ b/src/win/win_opengl.c @@ -15,6 +15,8 @@ * (UI) options * More error handling * + * + * * Authors: Teemu Korhonen * * Copyright 2021 Teemu Korhonen diff --git a/src/win/win_opengl_glslp.c b/src/win/win_opengl_glslp.c index c3d40a56e..47cc755dc 100644 --- a/src/win/win_opengl_glslp.c +++ b/src/win/win_opengl_glslp.c @@ -11,6 +11,8 @@ * * TODO: Read .glslp files for multipass shaders and settings. * + * + * * Authors: Teemu Korhonen * * Copyright 2021 Teemu Korhonen From 1860700eabe7b86c2a9acbf961d941e56e883769 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Fri, 6 Jan 2023 15:36:29 -0500 Subject: [PATCH 129/285] Fix some small issues --- CMakeLists.txt | 2 +- README.md | 2 +- debian/changelog | 2 +- src/86box.c | 2 +- src/cdrom/CMakeLists.txt | 2 +- src/chipset/CMakeLists.txt | 2 +- src/chipset/acc2168.c | 2 +- src/chipset/ali1429.c | 4 ++-- src/chipset/ali1489.c | 4 ++-- src/chipset/cs8230.c | 2 +- src/chipset/headland.c | 2 +- src/chipset/scamp.c | 2 +- src/chipset/sis_85c4xx.c | 2 +- src/chipset/via_apollo.c | 2 +- src/chipset/via_pipc.c | 2 +- src/codegen/CMakeLists.txt | 2 +- src/codegen/codegen.h | 2 +- src/codegen/codegen_x86.c | 2 +- src/codegen_new/CMakeLists.txt | 2 +- src/config.c | 4 ++-- src/cpu/386_common.h | 2 +- src/cpu/386_ops.h | 2 +- src/cpu/CMakeLists.txt | 2 +- src/cpu/codegen_timing_k6.c | 2 +- src/cpu/cpu.c | 2 +- src/cpu/cpu.h | 2 +- src/cpu/cpu_table.c | 2 +- src/cpu/fpu.c | 2 +- src/cpu/x86_ops.h | 2 +- src/cpu/x86seg.c | 2 +- src/cpu/x87_ops.h | 2 +- src/cpu/x87_ops_loadstore.h | 2 +- src/device.c | 2 +- src/device/CMakeLists.txt | 2 +- src/device/keyboard.c | 2 +- src/device/keyboard_at.c | 4 ++-- src/device/keyboard_xt.c | 2 +- src/device/phoenix_486_jumper.c | 2 ++ src/device/serial.c | 2 +- src/disk/CMakeLists.txt | 2 +- src/disk/hdc.c | 2 +- src/disk/hdc_esdi_at.c | 2 +- src/disk/hdc_esdi_mca.c | 4 ++-- src/disk/hdc_ide.c | 2 +- src/disk/hdc_ide_sff8038i.c | 2 +- src/disk/hdc_st506_at.c | 2 +- src/disk/hdc_st506_xt.c | 2 +- src/disk/hdc_xta.c | 2 +- src/disk/hdc_xtide.c | 2 +- src/disk/hdd_image.c | 2 +- src/disk/hdd_table.c | 2 +- src/disk/zip.c | 2 +- src/dma.c | 2 +- src/floppy/CMakeLists.txt | 2 +- src/floppy/fdc.c | 2 +- src/floppy/fdd.c | 4 ++-- src/floppy/fdd_fdi.c | 2 +- src/floppy/fdd_img.c | 2 +- src/game/CMakeLists.txt | 2 +- src/game/gameport.c | 2 +- src/game/joystick_ch_flightstick_pro.c | 2 +- src/game/joystick_standard.c | 2 +- src/game/joystick_sw_pad.c | 2 +- src/game/joystick_tm_fcs.c | 2 +- src/include/86box/bswap.h | 2 +- src/include/86box/chipset.h | 2 +- src/include/86box/config.h | 2 +- src/include/86box/device.h | 2 +- src/include/86box/dma.h | 2 +- src/include/86box/fdc.h | 2 +- src/include/86box/fdc_ext.h | 2 +- src/include/86box/fdd.h | 2 +- src/include/86box/fdd_86f.h | 2 +- src/include/86box/fdd_common.h | 2 +- src/include/86box/fdd_fdi.h | 2 +- src/include/86box/fdd_img.h | 2 +- src/include/86box/fdd_json.h | 2 +- src/include/86box/fdd_td0.h | 2 +- src/include/86box/gameport.h | 2 +- src/include/86box/hdc_ide.h | 2 +- src/include/86box/hdc_ide_sff8038i.h | 2 +- src/include/86box/hdd.h | 2 +- src/include/86box/ini.h | 4 ++-- src/include/86box/io.h | 4 ++-- src/include/86box/joystick_ch_flightstick_pro.h | 2 +- src/include/86box/joystick_standard.h | 2 +- src/include/86box/joystick_sw_pad.h | 2 +- src/include/86box/joystick_tm_fcs.h | 2 +- src/include/86box/keyboard.h | 2 +- src/include/86box/language.h | 2 +- src/include/86box/m_amstrad.h | 2 +- src/include/86box/m_at_t3100e.h | 4 ++-- src/include/86box/m_xt_t1000.h | 4 ++-- src/include/86box/machine.h | 2 +- src/include/86box/mem.h | 2 +- src/include/86box/net_ne2000.h | 2 +- src/include/86box/net_wd8003.h | 2 +- src/include/86box/nvr_ps2.h | 4 ++-- src/include/86box/pci.h | 2 +- src/include/86box/pit.h | 2 +- src/include/86box/pit_fast.h | 2 +- src/include/86box/random.h | 2 +- src/include/86box/resource.h | 4 ++-- src/include/86box/rom.h | 3 ++- src/include/86box/scsi.h | 2 +- src/include/86box/scsi_buslogic.h | 2 +- src/include/86box/scsi_cdrom.h | 2 +- src/include/86box/scsi_disk.h | 2 +- src/include/86box/scsi_ncr5380.h | 4 ++-- src/include/86box/scsi_ncr53c8xx.h | 2 +- src/include/86box/scsi_pcscsi.h | 2 +- src/include/86box/scsi_spock.h | 2 +- src/include/86box/scsi_x54x.h | 2 +- src/include/86box/serial.h | 2 +- src/include/86box/snd_ad1848.h | 2 +- src/include/86box/snd_mpu401.h | 2 +- src/include/86box/snd_sb.h | 2 +- src/include/86box/snd_speaker.h | 2 +- src/include/86box/sound.h | 2 +- src/include/86box/vid_cga.h | 2 +- src/include/86box/vid_ddc.h | 2 +- src/include/86box/vid_ega.h | 2 +- src/include/86box/vid_hercules.h | 2 +- src/include/86box/vid_nga.h | 2 +- src/include/86box/vid_ogc.h | 2 +- src/include/86box/vid_svga.h | 2 +- src/include/86box/vid_svga_render.h | 2 +- src/include/86box/vid_vga.h | 2 +- src/include/86box/vid_voodoo_banshee.h | 2 +- src/include/86box/vid_voodoo_banshee_blitter.h | 2 +- src/include/86box/vid_voodoo_blitter.h | 2 +- src/include/86box/vid_voodoo_common.h | 2 +- src/include/86box/vid_voodoo_display.h | 2 +- src/include/86box/vid_voodoo_dither.h | 2 +- src/include/86box/vid_voodoo_fb.h | 2 +- src/include/86box/vid_voodoo_fifo.h | 2 +- src/include/86box/vid_voodoo_reg.h | 2 +- src/include/86box/vid_voodoo_setup.h | 2 +- src/include/86box/vid_voodoo_texture.h | 2 +- src/include/86box/video.h | 2 +- src/include/86box/win.h | 2 +- src/include/86box/win_sdl.h | 4 ++-- src/include/86box/zip.h | 2 +- src/include/minitrace/minitrace.h | 2 +- src/ini.c | 4 ++-- src/io.c | 2 +- src/machine/CMakeLists.txt | 2 +- src/machine/m_amstrad.c | 2 +- src/machine/m_at.c | 2 +- src/machine/m_at_286_386sx.c | 2 +- src/machine/m_at_386dx_486.c | 2 +- src/machine/m_at_commodore.c | 4 ++-- src/machine/m_at_compaq.c | 2 +- src/machine/m_at_socket4.c | 2 +- src/machine/m_at_socket5.c | 2 +- src/machine/m_at_socket7.c | 2 +- src/machine/m_at_socket7_3v.c | 2 +- src/machine/m_at_sockets7.c | 2 +- src/machine/m_at_t3100e.c | 4 ++-- src/machine/m_at_t3100e_vid.c | 2 +- src/machine/m_pcjr.c | 2 +- src/machine/m_ps1.c | 2 +- src/machine/m_ps2_mca.c | 2 +- src/machine/m_tandy.c | 2 +- src/machine/m_xt_compaq.c | 2 +- src/machine/m_xt_olivetti.c | 2 +- src/machine/m_xt_t1000.c | 6 +++--- src/machine/m_xt_t1000_vid.c | 2 +- src/machine/m_xt_zenith.c | 2 +- src/machine/machine.c | 2 +- src/machine/machine_table.c | 2 +- src/mem/CMakeLists.txt | 2 +- src/mem/catalyst_flash.c | 2 +- src/mem/intel_flash.c | 2 +- src/mem/mem.c | 2 +- src/mem/rom.c | 2 +- src/mem/sst_flash.c | 2 +- src/minitrace/minitrace.c | 2 +- src/network/CMakeLists.txt | 2 +- src/network/net_ne2000.c | 2 +- src/network/pcap_if.c | 2 +- src/network/slirp/CMakeLists.txt | 2 +- src/nvr.c | 2 +- src/nvr_at.c | 2 +- src/nvr_ps2.c | 4 ++-- src/pci.c | 2 +- src/printer/CMakeLists.txt | 2 +- src/printer/prt_escp.c | 4 ++-- src/printer/prt_text.c | 2 +- src/qt/qt_cdrom.c | 4 ++-- src/qt/qt_sdl.h | 4 ++-- src/qt/win_dynld.c | 2 +- src/qt/win_joystick_rawinput.c | 2 +- src/scsi/CMakeLists.txt | 2 +- src/scsi/scsi_ncr5380.c | 2 +- src/scsi/scsi_spock.c | 2 +- src/sio/CMakeLists.txt | 2 +- src/sio/sio_acc3221.c | 2 +- src/sio/sio_f82c710.c | 2 +- src/sio/sio_fdc37c6xx.c | 2 +- src/sio/sio_pc87306.c | 2 +- src/sio/sio_pc87307.c | 2 +- src/sio/sio_pc87309.c | 2 +- src/sio/sio_pc87310.c | 2 +- src/sio/sio_pc87332.c | 2 +- src/sio/sio_um8669f.c | 2 +- src/sound/CMakeLists.txt | 2 +- src/sound/midi.c | 2 +- src/sound/openal.c | 2 +- src/sound/resid-fp/CMakeLists.txt | 2 +- src/sound/snd_ad1848.c | 2 +- src/sound/snd_audiopci.c | 2 +- src/sound/snd_mpu401.c | 2 +- src/sound/snd_sb.c | 2 +- src/sound/snd_speaker.c | 2 +- src/sound/snd_wss.c | 2 +- src/sound/sound.c | 2 +- src/unix/assets/86Box.spec | 2 +- src/unix/unix_cdrom.c | 4 ++-- src/video/CMakeLists.txt | 2 +- src/video/vid_ati18800.c | 2 +- src/video/vid_ati28800.c | 2 +- src/video/vid_ati68860_ramdac.c | 2 +- src/video/vid_ati_eeprom.c | 2 +- src/video/vid_ati_mach64.c | 2 +- src/video/vid_att20c49x_ramdac.c | 2 +- src/video/vid_att2xc498_ramdac.c | 2 +- src/video/vid_cga.c | 2 +- src/video/vid_cl54xx.c | 2 +- src/video/vid_colorplus.c | 2 +- src/video/vid_compaq_cga.c | 2 +- src/video/vid_ega.c | 2 +- src/video/vid_ega_render.c | 2 +- src/video/vid_et4000.c | 4 ++-- src/video/vid_et4000w32.c | 2 +- src/video/vid_f82c425.c | 10 +++++----- src/video/vid_genius.c | 2 +- src/video/vid_hercules.c | 2 +- src/video/vid_herculesplus.c | 2 +- src/video/vid_ht216.c | 2 +- src/video/vid_ics2595.c | 2 +- src/video/vid_incolor.c | 2 +- src/video/vid_mda.c | 2 +- src/video/vid_mga.c | 2 +- src/video/vid_nga.c | 4 ++-- src/video/vid_oak_oti.c | 2 +- src/video/vid_ogc.c | 4 ++-- src/video/vid_paradise.c | 2 +- src/video/vid_s3.c | 2 +- src/video/vid_s3_virge.c | 2 +- src/video/vid_sc1502x_ramdac.c | 2 +- src/video/vid_sdac_ramdac.c | 2 +- src/video/vid_stg_ramdac.c | 2 +- src/video/vid_svga.c | 2 +- src/video/vid_svga_render.c | 2 +- src/video/vid_tgui9440.c | 2 +- src/video/vid_ti_cf62011.c | 4 ++-- src/video/vid_tkd8001_ramdac.c | 2 +- src/video/vid_tvga.c | 2 +- src/video/vid_vga.c | 2 +- src/video/vid_voodoo.c | 2 +- src/video/vid_voodoo_banshee.c | 2 +- src/video/vid_voodoo_blitter.c | 2 +- src/video/vid_voodoo_display.c | 2 +- src/video/vid_voodoo_fb.c | 2 +- src/video/vid_voodoo_fifo.c | 2 +- src/video/vid_voodoo_reg.c | 2 +- src/video/vid_voodoo_render.c | 2 +- src/video/vid_voodoo_setup.c | 2 +- src/video/vid_voodoo_texture.c | 2 +- src/video/vid_wy700.c | 2 +- src/video/video.c | 2 +- src/win/win.c | 2 +- src/win/win_cdrom.c | 2 +- src/win/win_devconf.c | 2 +- src/win/win_joystick.cpp | 2 +- src/win/win_joystick_rawinput.c | 2 +- src/win/win_joystick_xinput.c | 2 +- src/win/win_mouse.c | 2 +- src/win/win_opengl.c | 2 +- src/win/win_settings.c | 2 +- src/win/win_thread.c | 2 +- src/win/win_ui.c | 2 +- vcpkg.json | 2 +- 284 files changed, 318 insertions(+), 315 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 74b2ad4b2..b067bedbe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,7 +10,7 @@ # # Authors: David Hrdlička, # -# Copyright 2020,2021 David Hrdlička. +# Copyright 2020-2021 David Hrdlička. # cmake_minimum_required(VERSION 3.16) diff --git a/README.md b/README.md index 46a7f08bb..05a2a9ed2 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ 86Box ===== -[![Build Status](http://ci.86box.net/job/86Box/badge/icon)](http://ci.86box.net/job/86Box) +[![Build Status](https://ci.86box.net/job/86Box/badge/icon)](https://ci.86box.net/job/86Box/) **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. diff --git a/debian/changelog b/debian/changelog index 0ec15e546..45b701f83 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,5 +1,5 @@ 86box (3.11.0-1) UNRELEASED; urgency=medium - * Initial release. + * Bump release. -- Jasmine Iwanek Sun, 18 Nov 2022 23:27:00 -0500 diff --git a/src/86box.c b/src/86box.c index 147233b21..8df527c0d 100644 --- a/src/86box.c +++ b/src/86box.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/cdrom/CMakeLists.txt b/src/cdrom/CMakeLists.txt index c09a040bd..201cee7f6 100644 --- a/src/cdrom/CMakeLists.txt +++ b/src/cdrom/CMakeLists.txt @@ -10,7 +10,7 @@ # # Authors: David Hrdlička, # -# Copyright 2020,2021 David Hrdlička. +# Copyright 2020-2021 David Hrdlička. # add_library(cdrom OBJECT cdrom.c cdrom_image_backend.c cdrom_image_viso.c cdrom_image.c cdrom_mitsumi.c) diff --git a/src/chipset/CMakeLists.txt b/src/chipset/CMakeLists.txt index 47b9b30ce..d93f86219 100644 --- a/src/chipset/CMakeLists.txt +++ b/src/chipset/CMakeLists.txt @@ -10,7 +10,7 @@ # # Authors: David Hrdlička, # -# Copyright 2020,2021 David Hrdlička. +# Copyright 2020-2021 David Hrdlička. # add_library(chipset OBJECT 82c100.c acc2168.c cs8230.c ali1429.c ali1489.c ali1531.c ali1541.c ali1543.c diff --git a/src/chipset/acc2168.c b/src/chipset/acc2168.c index 7332a28a3..765913672 100644 --- a/src/chipset/acc2168.c +++ b/src/chipset/acc2168.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Tiseno100 * * Copyright 2019 Sarah Walker. diff --git a/src/chipset/ali1429.c b/src/chipset/ali1429.c index 699769fa2..36ac2fdf9 100644 --- a/src/chipset/ali1429.c +++ b/src/chipset/ali1429.c @@ -16,8 +16,8 @@ * Authors: Tiseno100, * Miran Grca, * - * Copyright 2020,2021 Tiseno100. - * Copyright 2021,2021 Miran Grca. + * Copyright 2020-2021 Tiseno100. + * Copyright 2021-2021 Miran Grca. */ /* diff --git a/src/chipset/ali1489.c b/src/chipset/ali1489.c index 8a0cfd89a..70ff509ab 100644 --- a/src/chipset/ali1489.c +++ b/src/chipset/ali1489.c @@ -13,8 +13,8 @@ * Authors: Tiseno100, * Miran Grca, * - * Copyright 2020,2021 Tiseno100. - * Copyright 2020,2021 Miran Grca. + * Copyright 2020-2021 Tiseno100. + * Copyright 2020-2021 Miran Grca. */ #include #include diff --git a/src/chipset/cs8230.c b/src/chipset/cs8230.c index 49e7d71b6..edf4ac8c2 100644 --- a/src/chipset/cs8230.c +++ b/src/chipset/cs8230.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * * Copyright 2020 Sarah Walker. */ diff --git a/src/chipset/headland.c b/src/chipset/headland.c index c1881bede..8b8ee1562 100644 --- a/src/chipset/headland.c +++ b/src/chipset/headland.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Fred N. van Kempen, * Original by GreatPsycho for PCem. * Miran Grca, diff --git a/src/chipset/scamp.c b/src/chipset/scamp.c index ec7381cec..6e61db681 100644 --- a/src/chipset/scamp.c +++ b/src/chipset/scamp.c @@ -15,7 +15,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * * Copyright 2020 Sarah Walker. */ diff --git a/src/chipset/sis_85c4xx.c b/src/chipset/sis_85c4xx.c index ade5573f1..670a2cc83 100644 --- a/src/chipset/sis_85c4xx.c +++ b/src/chipset/sis_85c4xx.c @@ -13,7 +13,7 @@ * * Authors: Miran Grca, * - * Copyright 2019,2020 Miran Grca. + * Copyright 2019-2020 Miran Grca. */ #include #include diff --git a/src/chipset/via_apollo.c b/src/chipset/via_apollo.c index 99802b2b5..6ed6f21fe 100644 --- a/src/chipset/via_apollo.c +++ b/src/chipset/via_apollo.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Melissa Goad, * Tiseno100, diff --git a/src/chipset/via_pipc.c b/src/chipset/via_pipc.c index e6701ebfc..4f640920e 100644 --- a/src/chipset/via_pipc.c +++ b/src/chipset/via_pipc.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Melissa Goad, * RichardG, diff --git a/src/codegen/CMakeLists.txt b/src/codegen/CMakeLists.txt index 23936959e..3cb9de6ca 100644 --- a/src/codegen/CMakeLists.txt +++ b/src/codegen/CMakeLists.txt @@ -10,7 +10,7 @@ # # Authors: David Hrdlička, # -# Copyright 2020,2021 David Hrdlička. +# Copyright 2020-2021 David Hrdlička. # if(DYNAREC) diff --git a/src/codegen/codegen.h b/src/codegen/codegen.h index af602427d..cb9df495b 100644 --- a/src/codegen/codegen.h +++ b/src/codegen/codegen.h @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2018 Sarah Walker. diff --git a/src/codegen/codegen_x86.c b/src/codegen/codegen_x86.c index bd9793732..dbf76c2e4 100644 --- a/src/codegen/codegen_x86.c +++ b/src/codegen/codegen_x86.c @@ -11,7 +11,7 @@ * * * Authors: Fred N. van Kempen, - * Sarah Walker, + * Sarah Walker, * Miran Grca, * * Copyright 2018 Fred N. van Kempen. diff --git a/src/codegen_new/CMakeLists.txt b/src/codegen_new/CMakeLists.txt index 8c02060e4..038f1edd1 100644 --- a/src/codegen_new/CMakeLists.txt +++ b/src/codegen_new/CMakeLists.txt @@ -10,7 +10,7 @@ # # Authors: David Hrdlička, # -# Copyright 2020,2021 David Hrdlička. +# Copyright 2020-2021 David Hrdlička. # if(DYNAREC) diff --git a/src/config.c b/src/config.c index 8e2b5c292..6942d1af9 100644 --- a/src/config.c +++ b/src/config.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * Overdoze, @@ -19,7 +19,7 @@ * Copyright 2008-2019 Sarah Walker. * Copyright 2016-2019 Miran Grca. * Copyright 2017-2019 Fred N. van Kempen. - * Copyright 2018,2019 David Hrdlička. + * Copyright 2018-2019 David Hrdlička. * * NOTE: Forcing config files to be in Unicode encoding breaks * it on Windows XP, and possibly also Vista. Use the diff --git a/src/cpu/386_common.h b/src/cpu/386_common.h index 6310ae642..f26eb7f98 100644 --- a/src/cpu/386_common.h +++ b/src/cpu/386_common.h @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2019 Sarah Walker. diff --git a/src/cpu/386_ops.h b/src/cpu/386_ops.h index ec46ba0ae..e345ee8d8 100644 --- a/src/cpu/386_ops.h +++ b/src/cpu/386_ops.h @@ -11,7 +11,7 @@ * * * Authors: Fred N. van Kempen, - * Sarah Walker, + * Sarah Walker, * leilei, * Miran Grca, * diff --git a/src/cpu/CMakeLists.txt b/src/cpu/CMakeLists.txt index e61d4bfcf..68baaf293 100644 --- a/src/cpu/CMakeLists.txt +++ b/src/cpu/CMakeLists.txt @@ -10,7 +10,7 @@ # # Authors: David Hrdlička, # -# Copyright 2020,2021 David Hrdlička. +# Copyright 2020-2021 David Hrdlička. # add_library(cpu OBJECT cpu.c cpu_table.c fpu.c x86.c 808x.c 386.c 386_common.c diff --git a/src/cpu/codegen_timing_k6.c b/src/cpu/codegen_timing_k6.c index 6bb472144..6a59fc157 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://users.atw.hu/instlatx64/AuthenticAMD0000562_K6_InstLatX86.txt*/ + Some of the timings are based on http://http://web.archive.org/web/20181122095446/http://users.atw.hu/instlatx64/AuthenticAMD0000562_K6_InstLatX86.txt*/ #include #include #include diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c index 380da450e..d48ebe194 100644 --- a/src/cpu/cpu.c +++ b/src/cpu/cpu.c @@ -8,7 +8,7 @@ * * CPU type handler. * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * leilei, * Miran Grca, * Fred N. van Kempen, diff --git a/src/cpu/cpu.h b/src/cpu/cpu.h index 307865629..25ff141a7 100644 --- a/src/cpu/cpu.h +++ b/src/cpu/cpu.h @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * leilei, * Miran Grca, * diff --git a/src/cpu/cpu_table.c b/src/cpu/cpu_table.c index 70c67f91e..3afaf055e 100644 --- a/src/cpu/cpu_table.c +++ b/src/cpu/cpu_table.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * leilei, * Miran Grca, * Fred N. van Kempen, diff --git a/src/cpu/fpu.c b/src/cpu/fpu.c index f75d07231..0af010760 100644 --- a/src/cpu/fpu.c +++ b/src/cpu/fpu.c @@ -8,7 +8,7 @@ * * FPU type handler. * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2018 Sarah Walker. diff --git a/src/cpu/x86_ops.h b/src/cpu/x86_ops.h index a5e82d78e..ca4d83d69 100644 --- a/src/cpu/x86_ops.h +++ b/src/cpu/x86_ops.h @@ -11,7 +11,7 @@ * * * Authors: Fred N. van Kempen, - * Sarah Walker, + * Sarah Walker, * Miran Grca, * * Copyright 2018 Fred N. van Kempen. diff --git a/src/cpu/x86seg.c b/src/cpu/x86seg.c index c1e9e5b3d..5b0d8b73a 100644 --- a/src/cpu/x86seg.c +++ b/src/cpu/x86seg.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2018 Sarah Walker. diff --git a/src/cpu/x87_ops.h b/src/cpu/x87_ops.h index ce4a4becc..c00cdff16 100644 --- a/src/cpu/x87_ops.h +++ b/src/cpu/x87_ops.h @@ -11,7 +11,7 @@ * * * Authors: Fred N. van Kempen, - * Sarah Walker, + * Sarah Walker, * leilei, * Miran Grca, * diff --git a/src/cpu/x87_ops_loadstore.h b/src/cpu/x87_ops_loadstore.h index 8d3c3f700..9cec01490 100644 --- a/src/cpu/x87_ops_loadstore.h +++ b/src/cpu/x87_ops_loadstore.h @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2019 Sarah Walker. diff --git a/src/device.c b/src/device.c index a13825307..81e19e2dc 100644 --- a/src/device.c +++ b/src/device.c @@ -13,7 +13,7 @@ * * Authors: Fred N. van Kempen, * Miran Grca, - * Sarah Walker, + * Sarah Walker, * * Copyright 2017-2019 Fred N. van Kempen. * Copyright 2016-2019 Miran Grca. diff --git a/src/device/CMakeLists.txt b/src/device/CMakeLists.txt index 7fd0b20d0..ed8464647 100644 --- a/src/device/CMakeLists.txt +++ b/src/device/CMakeLists.txt @@ -10,7 +10,7 @@ # # Authors: David Hrdlička, # -# Copyright 2020,2021 David Hrdlička. +# Copyright 2020-2021 David Hrdlička. # add_library(dev OBJECT bugger.c cassette.c cartridge.c hasp.c hwm.c hwm_lm75.c hwm_lm78.c hwm_gl518sm.c diff --git a/src/device/keyboard.c b/src/device/keyboard.c index a5503cc3b..74bf3f67e 100644 --- a/src/device/keyboard.c +++ b/src/device/keyboard.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/device/keyboard_at.c b/src/device/keyboard_at.c index 3f5e8e4be..5b777eaf3 100644 --- a/src/device/keyboard_at.c +++ b/src/device/keyboard_at.c @@ -10,10 +10,10 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, - * EngiNerd + * EngiNerd, * * Copyright 2008-2020 Sarah Walker. * Copyright 2016-2020 Miran Grca. diff --git a/src/device/keyboard_xt.c b/src/device/keyboard_xt.c index 7c484af0d..676f99f54 100644 --- a/src/device/keyboard_xt.c +++ b/src/device/keyboard_xt.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * EngiNerd, diff --git a/src/device/phoenix_486_jumper.c b/src/device/phoenix_486_jumper.c index bb1957690..357240ba7 100644 --- a/src/device/phoenix_486_jumper.c +++ b/src/device/phoenix_486_jumper.c @@ -8,6 +8,8 @@ * * Implementation of the Phoenix 486 Jumper Readout * + * + * * Authors: Tiseno100 * * Copyright 2020 Tiseno100 diff --git a/src/device/serial.c b/src/device/serial.c index 2434ca17c..dad2ed7f5 100644 --- a/src/device/serial.c +++ b/src/device/serial.c @@ -12,7 +12,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/disk/CMakeLists.txt b/src/disk/CMakeLists.txt index 6d3abfc83..7771a0b72 100644 --- a/src/disk/CMakeLists.txt +++ b/src/disk/CMakeLists.txt @@ -10,7 +10,7 @@ # # Authors: David Hrdlička, # -# Copyright 2020,2021 David Hrdlička. +# Copyright 2020-2021 David Hrdlička. # add_library(hdd OBJECT hdd.c hdd_image.c hdd_table.c hdc.c hdc_st506_xt.c diff --git a/src/disk/hdc.c b/src/disk/hdc.c index 0e58b6473..bae818b9a 100644 --- a/src/disk/hdc.c +++ b/src/disk/hdc.c @@ -14,7 +14,7 @@ * Fred N. van Kempen, * * Copyright 2016-2018 Miran Grca. - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. */ #include #include diff --git a/src/disk/hdc_esdi_at.c b/src/disk/hdc_esdi_at.c index 9df7725f1..66c7a0231 100644 --- a/src/disk/hdc_esdi_at.c +++ b/src/disk/hdc_esdi_at.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/disk/hdc_esdi_mca.c b/src/disk/hdc_esdi_mca.c index 80290c745..f9af1e864 100644 --- a/src/disk/hdc_esdi_mca.c +++ b/src/disk/hdc_esdi_mca.c @@ -54,11 +54,11 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Fred N. van Kempen, * * Copyright 2008-2018 Sarah Walker. - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. */ #include diff --git a/src/disk/hdc_ide.c b/src/disk/hdc_ide.c index 062f0fde5..c2595e3e4 100644 --- a/src/disk/hdc_ide.c +++ b/src/disk/hdc_ide.c @@ -11,7 +11,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2020 Sarah Walker. diff --git a/src/disk/hdc_ide_sff8038i.c b/src/disk/hdc_ide_sff8038i.c index 3809359b2..b5c75a756 100644 --- a/src/disk/hdc_ide_sff8038i.c +++ b/src/disk/hdc_ide_sff8038i.c @@ -12,7 +12,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2020 Sarah Walker. diff --git a/src/disk/hdc_st506_at.c b/src/disk/hdc_st506_at.c index d4edc4847..2eee8d294 100644 --- a/src/disk/hdc_st506_at.c +++ b/src/disk/hdc_st506_at.c @@ -14,7 +14,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Fred N. van Kempen, * * Copyright 2008-2019 Sarah Walker. diff --git a/src/disk/hdc_st506_xt.c b/src/disk/hdc_st506_xt.c index c7b62f127..08f1329be 100644 --- a/src/disk/hdc_st506_xt.c +++ b/src/disk/hdc_st506_xt.c @@ -44,7 +44,7 @@ * * * Authors: Fred N. van Kempen, - * Sarah Walker, + * Sarah Walker, * * Copyright 2017-2019 Fred N. van Kempen. * Copyright 2008-2019 Sarah Walker. diff --git a/src/disk/hdc_xta.c b/src/disk/hdc_xta.c index 589ec2789..ca7f01b9d 100644 --- a/src/disk/hdc_xta.c +++ b/src/disk/hdc_xta.c @@ -50,7 +50,7 @@ * * Based on my earlier HD20 driver for the EuroPC. * - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. * * Redistribution and use in source and binary forms, with * or without modification, are permitted provided that the diff --git a/src/disk/hdc_xtide.c b/src/disk/hdc_xtide.c index 45b8dde54..72ad580ae 100644 --- a/src/disk/hdc_xtide.c +++ b/src/disk/hdc_xtide.c @@ -23,7 +23,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/disk/hdd_image.c b/src/disk/hdd_image.c index 1b59ac570..ba7cf18ba 100644 --- a/src/disk/hdd_image.c +++ b/src/disk/hdd_image.c @@ -14,7 +14,7 @@ * Fred N. van Kempen, * * Copyright 2016-2018 Miran Grca. - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. */ #define _GNU_SOURCE #include diff --git a/src/disk/hdd_table.c b/src/disk/hdd_table.c index d75dc7e8d..12a0040ef 100644 --- a/src/disk/hdd_table.c +++ b/src/disk/hdd_table.c @@ -15,7 +15,7 @@ * Fred N. van Kempen, * * Copyright 2016-2018 Miran Grca. - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. */ #include #include diff --git a/src/disk/zip.c b/src/disk/zip.c index c79f5d3d6..a0107d1ef 100644 --- a/src/disk/zip.c +++ b/src/disk/zip.c @@ -2073,7 +2073,7 @@ zip_phase_data_out(scsi_common_t *sc) dev->buffer[2] = (i >> 8) & 0xff; dev->buffer[3] = i & 0xff; } else if (dev->current_cdb[1] & 4) { - /* CHS are 96,1,2048 (ZIP 100) and 239,1,2048 (ZIP 250) */ + /* CHS are 96, 1, 2048 (ZIP 100) and 239, 1, 2048 (ZIP 250) */ s = (i % 2048); h = ((i - s) / 2048) % 1; c = ((i - s) / 2048) / 1; diff --git a/src/dma.c b/src/dma.c index d8c4ea674..ecdc393ff 100644 --- a/src/dma.c +++ b/src/dma.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/floppy/CMakeLists.txt b/src/floppy/CMakeLists.txt index 70bae154e..89fbbf76f 100644 --- a/src/floppy/CMakeLists.txt +++ b/src/floppy/CMakeLists.txt @@ -10,7 +10,7 @@ # # Authors: David Hrdlička, # -# Copyright 2020,2021 David Hrdlička. +# Copyright 2020-2021 David Hrdlička. # add_library(fdd OBJECT fdd.c fdc.c fdc_magitronic.c fdc_monster.c fdc_pii15xb.c diff --git a/src/floppy/fdc.c b/src/floppy/fdc.c index 1f81f025e..9981a72a2 100644 --- a/src/floppy/fdc.c +++ b/src/floppy/fdc.c @@ -11,7 +11,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2020 Sarah Walker. diff --git a/src/floppy/fdd.c b/src/floppy/fdd.c index 06b949ffb..ee43256a4 100644 --- a/src/floppy/fdd.c +++ b/src/floppy/fdd.c @@ -10,13 +10,13 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * * Copyright 2008-2019 Sarah Walker. * Copyright 2016-2019 Miran Grca. - * Copyright 2018,2019 Fred N. van Kempen. + * Copyright 2018-2019 Fred N. van Kempen. */ #include #include diff --git a/src/floppy/fdd_fdi.c b/src/floppy/fdd_fdi.c index 2a1ef5ba4..64279c173 100644 --- a/src/floppy/fdd_fdi.c +++ b/src/floppy/fdd_fdi.c @@ -11,7 +11,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/floppy/fdd_img.c b/src/floppy/fdd_img.c index f7bad2922..a9fc73a24 100644 --- a/src/floppy/fdd_img.c +++ b/src/floppy/fdd_img.c @@ -15,7 +15,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/game/CMakeLists.txt b/src/game/CMakeLists.txt index 5ed136de5..83dcd4836 100644 --- a/src/game/CMakeLists.txt +++ b/src/game/CMakeLists.txt @@ -10,7 +10,7 @@ # # Authors: David Hrdlička, # -# Copyright 2020,2021 David Hrdlička. +# Copyright 2020-2021 David Hrdlička. # add_library(game OBJECT gameport.c joystick_standard.c diff --git a/src/game/gameport.c b/src/game/gameport.c index ab8422070..f3557d158 100644 --- a/src/game/gameport.c +++ b/src/game/gameport.c @@ -11,7 +11,7 @@ * * * Authors: Miran Grca, - * Sarah Walker, + * Sarah Walker, * RichardG, * * Copyright 2016-2018 Miran Grca. diff --git a/src/game/joystick_ch_flightstick_pro.c b/src/game/joystick_ch_flightstick_pro.c index 0741e0360..f5785d6f4 100644 --- a/src/game/joystick_ch_flightstick_pro.c +++ b/src/game/joystick_ch_flightstick_pro.c @@ -11,7 +11,7 @@ * * * Authors: Miran Grca, - * Sarah Walker, + * Sarah Walker, * * Copyright 2016-2018 Miran Grca. * Copyright 2008-2018 Sarah Walker. diff --git a/src/game/joystick_standard.c b/src/game/joystick_standard.c index 71c354945..55a28acee 100644 --- a/src/game/joystick_standard.c +++ b/src/game/joystick_standard.c @@ -11,7 +11,7 @@ * * * Authors: Miran Grca, - * Sarah Walker, + * Sarah Walker, * * Copyright 2016-2018 Miran Grca. * Copyright 2008-2018 Sarah Walker. diff --git a/src/game/joystick_sw_pad.c b/src/game/joystick_sw_pad.c index 647ca6a74..26e26474b 100644 --- a/src/game/joystick_sw_pad.c +++ b/src/game/joystick_sw_pad.c @@ -32,7 +32,7 @@ * * * Authors: Miran Grca, - * Sarah Walker, + * Sarah Walker, * * Copyright 2016-2018 Miran Grca. * Copyright 2008-2018 Sarah Walker. diff --git a/src/game/joystick_tm_fcs.c b/src/game/joystick_tm_fcs.c index 4364a432f..7bcb15742 100644 --- a/src/game/joystick_tm_fcs.c +++ b/src/game/joystick_tm_fcs.c @@ -11,7 +11,7 @@ * * * Authors: Miran Grca, - * Sarah Walker, + * Sarah Walker, * * Copyright 2016-2018 Miran Grca. * Copyright 2008-2018 Sarah Walker. diff --git a/src/include/86box/bswap.h b/src/include/86box/bswap.h index 22d25cf4a..9f3c51917 100644 --- a/src/include/86box/bswap.h +++ b/src/include/86box/bswap.h @@ -13,7 +13,7 @@ * Authors: Fred N. van Kempen, * neozeed, * - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. * Copyright 2016-2018 neozeed. * * This program is free software; you can redistribute it and/or modify diff --git a/src/include/86box/chipset.h b/src/include/86box/chipset.h index f76028d78..0a3e988f6 100644 --- a/src/include/86box/chipset.h +++ b/src/include/86box/chipset.h @@ -12,7 +12,7 @@ * * Authors: Miran Grca, * - * Copyright 2019,2020 Miran Grca. + * Copyright 2019-2020 Miran Grca. */ #ifndef EMU_CHIPSET_H #define EMU_CHIPSET_H diff --git a/src/include/86box/config.h b/src/include/86box/config.h index dd873d168..9738b049b 100644 --- a/src/include/86box/config.h +++ b/src/include/86box/config.h @@ -16,7 +16,7 @@ * Overdoze, * * Copyright 2008-2017 Sarah Walker. - * Copyright 2016,2017 Miran Grca. + * Copyright 2016-2017 Miran Grca. * Copyright 2017 Fred N. van Kempen. */ #ifndef EMU_CONFIG_H diff --git a/src/include/86box/device.h b/src/include/86box/device.h index 9f0a5f864..79cbf4d2a 100644 --- a/src/include/86box/device.h +++ b/src/include/86box/device.h @@ -12,7 +12,7 @@ * * Authors: Fred N. van Kempen, * Miran Grca, - * Sarah Walker, + * Sarah Walker, * * Copyright 2017-2019 Fred N. van Kempen. * Copyright 2016-2019 Miran Grca. diff --git a/src/include/86box/dma.h b/src/include/86box/dma.h index f7a516a61..904d0b13b 100644 --- a/src/include/86box/dma.h +++ b/src/include/86box/dma.h @@ -12,7 +12,7 @@ * * Authors: Fred N. van Kempen, * Miran Grca, - * Sarah Walker, + * Sarah Walker, * * Copyright 2017-2020 Fred N. van Kempen. * Copyright 2016-2020 Miran Grca. diff --git a/src/include/86box/fdc.h b/src/include/86box/fdc.h index ec3136baa..e68c5d463 100644 --- a/src/include/86box/fdc.h +++ b/src/include/86box/fdc.h @@ -11,7 +11,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/include/86box/fdc_ext.h b/src/include/86box/fdc_ext.h index 3dc518f81..106235658 100644 --- a/src/include/86box/fdc_ext.h +++ b/src/include/86box/fdc_ext.h @@ -11,7 +11,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/include/86box/fdd.h b/src/include/86box/fdd.h index f612466b3..19a2141d3 100644 --- a/src/include/86box/fdd.h +++ b/src/include/86box/fdd.h @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/include/86box/fdd_86f.h b/src/include/86box/fdd_86f.h index e20990b09..cc8035965 100644 --- a/src/include/86box/fdd_86f.h +++ b/src/include/86box/fdd_86f.h @@ -14,7 +14,7 @@ * Fred N. van Kempen, * * Copyright 2016-2019 Miran Grca. - * Copyright 2018,2019 Fred N. van Kempen. + * Copyright 2018-2019 Fred N. van Kempen. */ #ifndef EMU_FLOPPY_86F_H #define EMU_FLOPPY_86F_H diff --git a/src/include/86box/fdd_common.h b/src/include/86box/fdd_common.h index 9c10a4a9a..7673d9684 100644 --- a/src/include/86box/fdd_common.h +++ b/src/include/86box/fdd_common.h @@ -12,7 +12,7 @@ * * Authors: Fred N. van Kempen, * - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. */ #ifndef FDD_COMMON_H #define FDD_COMMON_H diff --git a/src/include/86box/fdd_fdi.h b/src/include/86box/fdd_fdi.h index 4d4e551d6..6b9461bad 100644 --- a/src/include/86box/fdd_fdi.h +++ b/src/include/86box/fdd_fdi.h @@ -11,7 +11,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/include/86box/fdd_img.h b/src/include/86box/fdd_img.h index ec0e9df67..f0a639d88 100644 --- a/src/include/86box/fdd_img.h +++ b/src/include/86box/fdd_img.h @@ -11,7 +11,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/include/86box/fdd_json.h b/src/include/86box/fdd_json.h index e86aad01a..7f3c9adb4 100644 --- a/src/include/86box/fdd_json.h +++ b/src/include/86box/fdd_json.h @@ -10,7 +10,7 @@ * * Authors: Fred N. van Kempen, * - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. * * Redistribution and use in source and binary forms, with * or without modification, are permitted provided that the diff --git a/src/include/86box/fdd_td0.h b/src/include/86box/fdd_td0.h index 06938c66a..add6a07dd 100644 --- a/src/include/86box/fdd_td0.h +++ b/src/include/86box/fdd_td0.h @@ -14,7 +14,7 @@ * Fred N. van Kempen, * * Copyright 2016-2018 Miran Grca. - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. */ #ifndef EMU_FLOPPY_TD0_H #define EMU_FLOPPY_TD0_H diff --git a/src/include/86box/gameport.h b/src/include/86box/gameport.h index 66024867d..905130da0 100644 --- a/src/include/86box/gameport.h +++ b/src/include/86box/gameport.h @@ -11,7 +11,7 @@ * * * Authors: Miran Grca, - * Sarah Walker, + * Sarah Walker, * RichardG, * * Copyright 2016-2018 Miran Grca. diff --git a/src/include/86box/hdc_ide.h b/src/include/86box/hdc_ide.h index c1143af5b..e7bd8d7cf 100644 --- a/src/include/86box/hdc_ide.h +++ b/src/include/86box/hdc_ide.h @@ -11,7 +11,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Copyright 2008-2019 Sarah Walker. * Copyright 2016-2019 Miran Grca. diff --git a/src/include/86box/hdc_ide_sff8038i.h b/src/include/86box/hdc_ide_sff8038i.h index 277e9b25a..b411ecf5d 100644 --- a/src/include/86box/hdc_ide_sff8038i.h +++ b/src/include/86box/hdc_ide_sff8038i.h @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2020 Sarah Walker. diff --git a/src/include/86box/hdd.h b/src/include/86box/hdd.h index c4b3b0328..58fff9ffd 100644 --- a/src/include/86box/hdd.h +++ b/src/include/86box/hdd.h @@ -14,7 +14,7 @@ * Fred N. van Kempen, * * Copyright 2016-2018 Miran Grca. - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. */ #ifndef EMU_HDD_H #define EMU_HDD_H diff --git a/src/include/86box/ini.h b/src/include/86box/ini.h index d754d645b..5eca9ab8c 100644 --- a/src/include/86box/ini.h +++ b/src/include/86box/ini.h @@ -10,13 +10,13 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * Overdoze, * * Copyright 2008-2017 Sarah Walker. - * Copyright 2016,2017 Miran Grca. + * Copyright 2016-2017 Miran Grca. * */ #ifndef EMU_INI_H diff --git a/src/include/86box/io.h b/src/include/86box/io.h index 20b493e7f..b80b37a39 100644 --- a/src/include/86box/io.h +++ b/src/include/86box/io.h @@ -10,12 +10,12 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * * Copyright 2008-2017 Sarah Walker. - * Copyright 2016,2017 Miran Grca. + * Copyright 2016-2017 Miran Grca. */ #ifndef EMU_IO_H #define EMU_IO_H diff --git a/src/include/86box/joystick_ch_flightstick_pro.h b/src/include/86box/joystick_ch_flightstick_pro.h index 73e2d7c69..b49800ecb 100644 --- a/src/include/86box/joystick_ch_flightstick_pro.h +++ b/src/include/86box/joystick_ch_flightstick_pro.h @@ -11,7 +11,7 @@ * * * Authors: Miran Grca, - * Sarah Walker, + * Sarah Walker, * * Copyright 2016-2018 Miran Grca. * Copyright 2008-2018 Sarah Walker. diff --git a/src/include/86box/joystick_standard.h b/src/include/86box/joystick_standard.h index ac2b7ea3f..c874677ea 100644 --- a/src/include/86box/joystick_standard.h +++ b/src/include/86box/joystick_standard.h @@ -11,7 +11,7 @@ * * * Authors: Miran Grca, - * Sarah Walker, + * Sarah Walker, * * Copyright 2016-2018 Miran Grca. * Copyright 2008-2018 Sarah Walker. diff --git a/src/include/86box/joystick_sw_pad.h b/src/include/86box/joystick_sw_pad.h index d22f337a8..a75d802de 100644 --- a/src/include/86box/joystick_sw_pad.h +++ b/src/include/86box/joystick_sw_pad.h @@ -11,7 +11,7 @@ * * * Authors: Miran Grca, - * Sarah Walker, + * Sarah Walker, * * Copyright 2016-2018 Miran Grca. * Copyright 2008-2018 Sarah Walker. diff --git a/src/include/86box/joystick_tm_fcs.h b/src/include/86box/joystick_tm_fcs.h index 2e875190e..65e734a40 100644 --- a/src/include/86box/joystick_tm_fcs.h +++ b/src/include/86box/joystick_tm_fcs.h @@ -11,7 +11,7 @@ * * * Authors: Miran Grca, - * Sarah Walker, + * Sarah Walker, * * Copyright 2016-2018 Miran Grca. * Copyright 2008-2018 Sarah Walker. diff --git a/src/include/86box/keyboard.h b/src/include/86box/keyboard.h index 0e384b39b..db18ac789 100644 --- a/src/include/86box/keyboard.h +++ b/src/include/86box/keyboard.h @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/include/86box/language.h b/src/include/86box/language.h index fbd1f6e2b..8db604efc 100644 --- a/src/include/86box/language.h +++ b/src/include/86box/language.h @@ -12,7 +12,7 @@ * * Authors: Fred N. van Kempen, * - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. * Copyright 2022 Jasmine Iwanek. */ diff --git a/src/include/86box/m_amstrad.h b/src/include/86box/m_amstrad.h index 5d0350703..ef4e8b9ea 100644 --- a/src/include/86box/m_amstrad.h +++ b/src/include/86box/m_amstrad.h @@ -12,7 +12,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * * Copyright 2008-2019 Sarah Walker. */ diff --git a/src/include/86box/m_at_t3100e.h b/src/include/86box/m_at_t3100e.h index aa545fc45..c25d171b9 100644 --- a/src/include/86box/m_at_t3100e.h +++ b/src/include/86box/m_at_t3100e.h @@ -12,9 +12,9 @@ * * Authors: Fred N. van Kempen, * Miran Grca, - * Sarah Walker, + * Sarah Walker, * - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. * Copyright 2016-2018 Miran Grca. * Copyright 2008-2018 Sarah Walker. * diff --git a/src/include/86box/m_xt_t1000.h b/src/include/86box/m_xt_t1000.h index 452decc21..d8e8cd56b 100644 --- a/src/include/86box/m_xt_t1000.h +++ b/src/include/86box/m_xt_t1000.h @@ -12,9 +12,9 @@ * * Authors: Fred N. van Kempen, * Miran Grca, - * Sarah Walker, + * Sarah Walker, * - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. * Copyright 2016-2018 Miran Grca. * Copyright 2008-2018 Sarah Walker. * diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index 052e55abd..9137da5d3 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/include/86box/mem.h b/src/include/86box/mem.h index f6252be09..f109776a6 100644 --- a/src/include/86box/mem.h +++ b/src/include/86box/mem.h @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Fred N. van Kempen, * Miran Grca, * diff --git a/src/include/86box/net_ne2000.h b/src/include/86box/net_ne2000.h index 73b5bd67d..350668ccb 100644 --- a/src/include/86box/net_ne2000.h +++ b/src/include/86box/net_ne2000.h @@ -12,7 +12,7 @@ * * Authors: Fred N. van Kempen, * - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. * * 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 diff --git a/src/include/86box/net_wd8003.h b/src/include/86box/net_wd8003.h index deb4ce7b8..a0ea13287 100644 --- a/src/include/86box/net_wd8003.h +++ b/src/include/86box/net_wd8003.h @@ -18,7 +18,7 @@ * Miran Grca, * Peter Grehan, * - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. * Copyright 2016-2018 Miran Grca. * Portions Copyright (C) 2002 MandrakeSoft S.A. * diff --git a/src/include/86box/nvr_ps2.h b/src/include/86box/nvr_ps2.h index 9fd0a7897..478d1be44 100644 --- a/src/include/86box/nvr_ps2.h +++ b/src/include/86box/nvr_ps2.h @@ -11,9 +11,9 @@ * * * Authors: Fred N. van Kempen, - * Sarah Walker, + * Sarah Walker, * - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. * Copyright 2008-2018 Sarah Walker. * * This program is free software; you can redistribute it and/or modify diff --git a/src/include/86box/pci.h b/src/include/86box/pci.h index 5c24bebf2..c16d5a7e8 100644 --- a/src/include/86box/pci.h +++ b/src/include/86box/pci.h @@ -12,7 +12,7 @@ * * Authors: Miran Grca, * Fred N. van Kempen, - * Sarah Walker, + * Sarah Walker, * * Copyright 2016-2020 Miran Grca. * Copyright 2017-2020 Fred N. van Kempen. diff --git a/src/include/86box/pit.h b/src/include/86box/pit.h index 292844d4f..d50e45967 100644 --- a/src/include/86box/pit.h +++ b/src/include/86box/pit.h @@ -13,7 +13,7 @@ * * Authors: Miran Grca, * - * Copyright 2019,2020 Miran Grca. + * Copyright 2019-2020 Miran Grca. */ #ifndef EMU_PIT_H diff --git a/src/include/86box/pit_fast.h b/src/include/86box/pit_fast.h index b306e63ec..242fb4207 100644 --- a/src/include/86box/pit_fast.h +++ b/src/include/86box/pit_fast.h @@ -13,7 +13,7 @@ * * Authors: Miran Grca, * - * Copyright 2019,2020 Miran Grca. + * Copyright 2019-2020 Miran Grca. */ #ifndef EMU_PIT_FAST_H diff --git a/src/include/86box/random.h b/src/include/86box/random.h index 1c3124d53..021969a54 100644 --- a/src/include/86box/random.h +++ b/src/include/86box/random.h @@ -13,7 +13,7 @@ * * Authors: Miran Grca, * - * Copyright 2016,2017 Miran Grca. + * Copyright 2016-2017 Miran Grca. */ #ifndef EMU_RANDOM_H diff --git a/src/include/86box/resource.h b/src/include/86box/resource.h index 81c182980..17af95ca4 100644 --- a/src/include/86box/resource.h +++ b/src/include/86box/resource.h @@ -10,14 +10,14 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * David Hrdlička, * * Copyright 2008-2019 Sarah Walker. * Copyright 2016-2019 Miran Grca. - * Copyright 2018,2019 David Hrdlička. + * Copyright 2018-2019 David Hrdlička. * Copyright 2021-2022 Jasmine Iwanek. */ diff --git a/src/include/86box/rom.h b/src/include/86box/rom.h index e581e0744..91f813a95 100644 --- a/src/include/86box/rom.h +++ b/src/include/86box/rom.h @@ -11,7 +11,8 @@ * * * Authors: Fred N. van Kempen, - * Copyright 2018,2019 Fred N. van Kempen. + * + * Copyright 2018-2019 Fred N. van Kempen. */ #ifndef EMU_ROM_H diff --git a/src/include/86box/scsi.h b/src/include/86box/scsi.h index ce641712b..d19497101 100644 --- a/src/include/86box/scsi.h +++ b/src/include/86box/scsi.h @@ -16,7 +16,7 @@ * * Copyright 2016-2018 TheCollector1995. * Copyright 2016-2018 Miran Grca. - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. */ #ifndef EMU_SCSI_H #define EMU_SCSI_H diff --git a/src/include/86box/scsi_buslogic.h b/src/include/86box/scsi_buslogic.h index 021c4fa97..12bff6fdf 100644 --- a/src/include/86box/scsi_buslogic.h +++ b/src/include/86box/scsi_buslogic.h @@ -14,7 +14,7 @@ * Fred N. van Kempen, * * Copyright 2016-2018 Miran Grca. - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. */ #ifndef SCSI_BUSLOGIC_H diff --git a/src/include/86box/scsi_cdrom.h b/src/include/86box/scsi_cdrom.h index 97ebb39bc..0acdf1b25 100644 --- a/src/include/86box/scsi_cdrom.h +++ b/src/include/86box/scsi_cdrom.h @@ -13,7 +13,7 @@ * * Authors: Miran Grca, * - * Copyright 2018,2019 Miran Grca. + * Copyright 2018-2019 Miran Grca. */ #ifndef EMU_SCSI_CDROM_H diff --git a/src/include/86box/scsi_disk.h b/src/include/86box/scsi_disk.h index 0ac78f8b5..bff40a396 100644 --- a/src/include/86box/scsi_disk.h +++ b/src/include/86box/scsi_disk.h @@ -10,7 +10,7 @@ * * Authors: Miran Grca, * - * Copyright 2017,2018 Miran Grca. + * Copyright 2017-2018 Miran Grca. */ #ifndef SCSI_DISK_H diff --git a/src/include/86box/scsi_ncr5380.h b/src/include/86box/scsi_ncr5380.h index 314f9d082..ecf5660ef 100644 --- a/src/include/86box/scsi_ncr5380.h +++ b/src/include/86box/scsi_ncr5380.h @@ -12,13 +12,13 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * TheCollector1995, * Fred N. van Kempen, * * Copyright 2017-2018 Sarah Walker. * Copyright 2017-2018 TheCollector1995. - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. */ #ifndef SCSI_NCR5380_H diff --git a/src/include/86box/scsi_ncr53c8xx.h b/src/include/86box/scsi_ncr53c8xx.h index e495925b0..5149c2203 100644 --- a/src/include/86box/scsi_ncr53c8xx.h +++ b/src/include/86box/scsi_ncr53c8xx.h @@ -19,7 +19,7 @@ * * Copyright 2006-2018 Paul Brook. * Copyright 2009-2018 Artyom Tarasenko. - * Copyright 2017,2018 Miran Grca. + * Copyright 2017-2018 Miran Grca. */ #ifndef SCSI_NCR53C8XX_H diff --git a/src/include/86box/scsi_pcscsi.h b/src/include/86box/scsi_pcscsi.h index 3f56fb19d..0ce353d33 100644 --- a/src/include/86box/scsi_pcscsi.h +++ b/src/include/86box/scsi_pcscsi.h @@ -19,7 +19,7 @@ * * Copyright 2005-2018 Fabrice Bellard. * Copyright 2012-2018 Herve Poussineau. - * Copyright 2017,2018 Miran Grca. + * Copyright 2017-2018 Miran Grca. */ #ifndef SCSI_PCSCSI_H diff --git a/src/include/86box/scsi_spock.h b/src/include/86box/scsi_spock.h index 6dfc87011..bfa579c82 100644 --- a/src/include/86box/scsi_spock.h +++ b/src/include/86box/scsi_spock.h @@ -11,7 +11,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * TheCollector1995, * * Copyright 2020 Sarah Walker. diff --git a/src/include/86box/scsi_x54x.h b/src/include/86box/scsi_x54x.h index e32a9369e..a20f1e788 100644 --- a/src/include/86box/scsi_x54x.h +++ b/src/include/86box/scsi_x54x.h @@ -18,7 +18,7 @@ * Fred N. van Kempen, * * Copyright 2016-2018 Miran Grca. - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. */ #ifndef SCSI_X54X_H diff --git a/src/include/86box/serial.h b/src/include/86box/serial.h index 1394a1c53..ae48ee09f 100644 --- a/src/include/86box/serial.h +++ b/src/include/86box/serial.h @@ -11,7 +11,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/include/86box/snd_ad1848.h b/src/include/86box/snd_ad1848.h index d954eaccb..76fc775db 100644 --- a/src/include/86box/snd_ad1848.h +++ b/src/include/86box/snd_ad1848.h @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * TheCollector1995, * RichardG, * diff --git a/src/include/86box/snd_mpu401.h b/src/include/86box/snd_mpu401.h index 2fcf31d96..4afbc6b53 100644 --- a/src/include/86box/snd_mpu401.h +++ b/src/include/86box/snd_mpu401.h @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * DOSBox Team, * Miran Grca, * TheCollector1995, diff --git a/src/include/86box/snd_sb.h b/src/include/86box/snd_sb.h index 577335976..88f2c74f1 100644 --- a/src/include/86box/snd_sb.h +++ b/src/include/86box/snd_sb.h @@ -8,7 +8,7 @@ * * Sound Blaster emulation. * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * TheCollector1995, * diff --git a/src/include/86box/snd_speaker.h b/src/include/86box/snd_speaker.h index 433accea8..516d20588 100644 --- a/src/include/86box/snd_speaker.h +++ b/src/include/86box/snd_speaker.h @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2019 Sarah Walker. diff --git a/src/include/86box/sound.h b/src/include/86box/sound.h index 10303c3ca..a38d213da 100644 --- a/src/include/86box/sound.h +++ b/src/include/86box/sound.h @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2018 Sarah Walker. diff --git a/src/include/86box/vid_cga.h b/src/include/86box/vid_cga.h index 23c7e7b4a..39e1c24ef 100644 --- a/src/include/86box/vid_cga.h +++ b/src/include/86box/vid_cga.h @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2018 Sarah Walker. diff --git a/src/include/86box/vid_ddc.h b/src/include/86box/vid_ddc.h index 0846cc32f..144cca406 100644 --- a/src/include/86box/vid_ddc.h +++ b/src/include/86box/vid_ddc.h @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * RichardG, * * Copyright 2008-2020 Sarah Walker. diff --git a/src/include/86box/vid_ega.h b/src/include/86box/vid_ega.h index f49ad55b4..784f0c596 100644 --- a/src/include/86box/vid_ega.h +++ b/src/include/86box/vid_ega.h @@ -11,7 +11,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2020 Sarah Walker. diff --git a/src/include/86box/vid_hercules.h b/src/include/86box/vid_hercules.h index 949e45417..bbb4239aa 100644 --- a/src/include/86box/vid_hercules.h +++ b/src/include/86box/vid_hercules.h @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Jasmine Iwanek, * diff --git a/src/include/86box/vid_nga.h b/src/include/86box/vid_nga.h index d91d852d7..93786b15e 100644 --- a/src/include/86box/vid_nga.h +++ b/src/include/86box/vid_nga.h @@ -11,7 +11,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * EngiNerd, diff --git a/src/include/86box/vid_ogc.h b/src/include/86box/vid_ogc.h index 45eedf8cf..6b80f5859 100644 --- a/src/include/86box/vid_ogc.h +++ b/src/include/86box/vid_ogc.h @@ -11,7 +11,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * EngiNerd, diff --git a/src/include/86box/vid_svga.h b/src/include/86box/vid_svga.h index 3781d5530..7f987a2b7 100644 --- a/src/include/86box/vid_svga.h +++ b/src/include/86box/vid_svga.h @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2020 Sarah Walker. diff --git a/src/include/86box/vid_svga_render.h b/src/include/86box/vid_svga_render.h index a8369ca42..13ff527e0 100644 --- a/src/include/86box/vid_svga_render.h +++ b/src/include/86box/vid_svga_render.h @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2018 Sarah Walker. diff --git a/src/include/86box/vid_vga.h b/src/include/86box/vid_vga.h index 9d9972be0..08a1a2591 100644 --- a/src/include/86box/vid_vga.h +++ b/src/include/86box/vid_vga.h @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Jasmine Iwanek, * diff --git a/src/include/86box/vid_voodoo_banshee.h b/src/include/86box/vid_voodoo_banshee.h index 4cd26dc2a..56fd47eeb 100644 --- a/src/include/86box/vid_voodoo_banshee.h +++ b/src/include/86box/vid_voodoo_banshee.h @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * * Copyright 2008-2020 Sarah Walker. */ diff --git a/src/include/86box/vid_voodoo_banshee_blitter.h b/src/include/86box/vid_voodoo_banshee_blitter.h index ec6e214d5..2d36f1566 100644 --- a/src/include/86box/vid_voodoo_banshee_blitter.h +++ b/src/include/86box/vid_voodoo_banshee_blitter.h @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * * Copyright 2008-2020 Sarah Walker. */ diff --git a/src/include/86box/vid_voodoo_blitter.h b/src/include/86box/vid_voodoo_blitter.h index 2802c7d1e..981c0856d 100644 --- a/src/include/86box/vid_voodoo_blitter.h +++ b/src/include/86box/vid_voodoo_blitter.h @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * * Copyright 2008-2020 Sarah Walker. */ diff --git a/src/include/86box/vid_voodoo_common.h b/src/include/86box/vid_voodoo_common.h index 6dee9ca8f..0fd4155ef 100644 --- a/src/include/86box/vid_voodoo_common.h +++ b/src/include/86box/vid_voodoo_common.h @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * leilei * * Copyright 2008-2020 Sarah Walker. diff --git a/src/include/86box/vid_voodoo_display.h b/src/include/86box/vid_voodoo_display.h index 53d4076e7..25b3e9b1a 100644 --- a/src/include/86box/vid_voodoo_display.h +++ b/src/include/86box/vid_voodoo_display.h @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * leilei * * Copyright 2008-2020 Sarah Walker. diff --git a/src/include/86box/vid_voodoo_dither.h b/src/include/86box/vid_voodoo_dither.h index dc87b293e..3580cada2 100644 --- a/src/include/86box/vid_voodoo_dither.h +++ b/src/include/86box/vid_voodoo_dither.h @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * leilei * * Copyright 2008-2020 Sarah Walker. diff --git a/src/include/86box/vid_voodoo_fb.h b/src/include/86box/vid_voodoo_fb.h index b954048ff..2138e83da 100644 --- a/src/include/86box/vid_voodoo_fb.h +++ b/src/include/86box/vid_voodoo_fb.h @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * leilei * * Copyright 2008-2020 Sarah Walker. diff --git a/src/include/86box/vid_voodoo_fifo.h b/src/include/86box/vid_voodoo_fifo.h index 088be1dae..0073a295c 100644 --- a/src/include/86box/vid_voodoo_fifo.h +++ b/src/include/86box/vid_voodoo_fifo.h @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * leilei * * Copyright 2008-2020 Sarah Walker. diff --git a/src/include/86box/vid_voodoo_reg.h b/src/include/86box/vid_voodoo_reg.h index 1f1160804..62738a8c5 100644 --- a/src/include/86box/vid_voodoo_reg.h +++ b/src/include/86box/vid_voodoo_reg.h @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * leilei * * Copyright 2008-2020 Sarah Walker. diff --git a/src/include/86box/vid_voodoo_setup.h b/src/include/86box/vid_voodoo_setup.h index 8ff892f71..d8820a7cb 100644 --- a/src/include/86box/vid_voodoo_setup.h +++ b/src/include/86box/vid_voodoo_setup.h @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * leilei * * Copyright 2008-2020 Sarah Walker. diff --git a/src/include/86box/vid_voodoo_texture.h b/src/include/86box/vid_voodoo_texture.h index a0bd4db44..65eec54e4 100644 --- a/src/include/86box/vid_voodoo_texture.h +++ b/src/include/86box/vid_voodoo_texture.h @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * leilei * * Copyright 2008-2020 Sarah Walker. diff --git a/src/include/86box/video.h b/src/include/86box/video.h index abba64574..6f35dc5ee 100644 --- a/src/include/86box/video.h +++ b/src/include/86box/video.h @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/include/86box/win.h b/src/include/86box/win.h index c72b1e5c4..99620cbeb 100644 --- a/src/include/86box/win.h +++ b/src/include/86box/win.h @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/include/86box/win_sdl.h b/src/include/86box/win_sdl.h index 72357aa9a..69340e8b6 100644 --- a/src/include/86box/win_sdl.h +++ b/src/include/86box/win_sdl.h @@ -13,8 +13,8 @@ * Authors: Fred N. van Kempen, * Michael Drüing, * - * Copyright 2018,2019 Fred N. van Kempen. - * Copyright 2018,2019 Michael Drüing. + * Copyright 2018-2019 Fred N. van Kempen. + * Copyright 2018-2019 Michael Drüing. * * Redistribution and use in source and binary forms, with * or without modification, are permitted provided that the diff --git a/src/include/86box/zip.h b/src/include/86box/zip.h index 6bff76e36..3981465ce 100644 --- a/src/include/86box/zip.h +++ b/src/include/86box/zip.h @@ -13,7 +13,7 @@ * * Authors: Miran Grca, * - * Copyright 2018,2019 Miran Grca. + * Copyright 2018-2019 Miran Grca. */ #ifndef EMU_ZIP_H diff --git a/src/include/minitrace/minitrace.h b/src/include/minitrace/minitrace.h index 8184f5873..0335c9ac3 100644 --- a/src/include/minitrace/minitrace.h +++ b/src/include/minitrace/minitrace.h @@ -1,7 +1,7 @@ // Minitrace // // Copyright 2014 by Henrik Rydgård -// http://www.github.com/hrydgard/minitrace +// https://www.github.com/hrydgard/minitrace // Released under the MIT license. // // Ultra-light dependency free library for performance tracing C/C++ applications. diff --git a/src/ini.c b/src/ini.c index 59a3dc629..009d21c0b 100644 --- a/src/ini.c +++ b/src/ini.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * Overdoze, @@ -19,7 +19,7 @@ * Copyright 2008-2019 Sarah Walker. * Copyright 2016-2019 Miran Grca. * Copyright 2017-2019 Fred N. van Kempen. - * Copyright 2018,2019 David Hrdlička. + * Copyright 2018-2019 David Hrdlička. * * NOTE: Forcing config files to be in Unicode encoding breaks * it on Windows XP, and possibly also Vista. Use the diff --git a/src/io.c b/src/io.c index cf934b895..0cd7cd87b 100644 --- a/src/io.c +++ b/src/io.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/machine/CMakeLists.txt b/src/machine/CMakeLists.txt index 1f356a91d..e88631044 100644 --- a/src/machine/CMakeLists.txt +++ b/src/machine/CMakeLists.txt @@ -10,7 +10,7 @@ # # Authors: David Hrdlička, # -# Copyright 2020,2021 David Hrdlička. +# Copyright 2020-2021 David Hrdlička. # add_library(mch OBJECT machine.c machine_table.c m_xt.c m_xt_compaq.c diff --git a/src/machine/m_amstrad.c b/src/machine/m_amstrad.c index 98bf26c58..89f8f5670 100644 --- a/src/machine/m_amstrad.c +++ b/src/machine/m_amstrad.c @@ -31,7 +31,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * John Elliott, diff --git a/src/machine/m_at.c b/src/machine/m_at.c index ccee2f1e7..92f8c0f5f 100644 --- a/src/machine/m_at.c +++ b/src/machine/m_at.c @@ -12,7 +12,7 @@ * * Authors: Fred N. van Kempen, * Miran Grca, - * Sarah Walker, + * Sarah Walker, * * Copyright 2017-2020 Fred N. van Kempen. * Copyright 2016-2020 Miran Grca. diff --git a/src/machine/m_at_286_386sx.c b/src/machine/m_at_286_386sx.c index ee117fa33..253ce804d 100644 --- a/src/machine/m_at_286_386sx.c +++ b/src/machine/m_at_286_386sx.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * EngiNerd * diff --git a/src/machine/m_at_386dx_486.c b/src/machine/m_at_386dx_486.c index 6a2329dd6..b9583f72e 100644 --- a/src/machine/m_at_386dx_486.c +++ b/src/machine/m_at_386dx_486.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2010-2020 Sarah Walker. diff --git a/src/machine/m_at_commodore.c b/src/machine/m_at_commodore.c index 8eeabab19..3587db44a 100644 --- a/src/machine/m_at_commodore.c +++ b/src/machine/m_at_commodore.c @@ -12,9 +12,9 @@ * * Authors: Fred N. van Kempen, * Miran Grca, - * Sarah Walker, + * Sarah Walker, * - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. * Copyright 2016-2018 Miran Grca. * Copyright 2008-2018 Sarah Walker. * diff --git a/src/machine/m_at_compaq.c b/src/machine/m_at_compaq.c index 7840eb056..0b3a901b5 100644 --- a/src/machine/m_at_compaq.c +++ b/src/machine/m_at_compaq.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * TheCollector1995, * diff --git a/src/machine/m_at_socket4.c b/src/machine/m_at_socket4.c index 7ae87e120..2aa94cce5 100644 --- a/src/machine/m_at_socket4.c +++ b/src/machine/m_at_socket4.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2010-2019 Sarah Walker. diff --git a/src/machine/m_at_socket5.c b/src/machine/m_at_socket5.c index 1bbeff550..fa562a62c 100644 --- a/src/machine/m_at_socket5.c +++ b/src/machine/m_at_socket5.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2010-2019 Sarah Walker. diff --git a/src/machine/m_at_socket7.c b/src/machine/m_at_socket7.c index 319c5930e..0ead2972a 100644 --- a/src/machine/m_at_socket7.c +++ b/src/machine/m_at_socket7.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Melissa Goad, * diff --git a/src/machine/m_at_socket7_3v.c b/src/machine/m_at_socket7_3v.c index 3973bd8cf..7616d8a4a 100644 --- a/src/machine/m_at_socket7_3v.c +++ b/src/machine/m_at_socket7_3v.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Melissa Goad, * diff --git a/src/machine/m_at_sockets7.c b/src/machine/m_at_sockets7.c index 381940a10..2813e7275 100644 --- a/src/machine/m_at_sockets7.c +++ b/src/machine/m_at_sockets7.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Melissa Goad, * diff --git a/src/machine/m_at_t3100e.c b/src/machine/m_at_t3100e.c index 451955ad1..080f22977 100644 --- a/src/machine/m_at_t3100e.c +++ b/src/machine/m_at_t3100e.c @@ -121,9 +121,9 @@ * * Authors: Fred N. van Kempen, * Miran Grca, - * Sarah Walker, + * Sarah Walker, * - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. * Copyright 2016-2018 Miran Grca. * Copyright 2008-2018 Sarah Walker. * diff --git a/src/machine/m_at_t3100e_vid.c b/src/machine/m_at_t3100e_vid.c index 30bbc488b..53571c49e 100644 --- a/src/machine/m_at_t3100e_vid.c +++ b/src/machine/m_at_t3100e_vid.c @@ -26,7 +26,7 @@ * * Authors: Fred N. van Kempen, * Miran Grca, - * Sarah Walker, + * Sarah Walker, * * Copyright 2017-2019 Fred N. van Kempen. * Copyright 2016-2019 Miran Grca. diff --git a/src/machine/m_pcjr.c b/src/machine/m_pcjr.c index 6446d5852..b03272f3d 100644 --- a/src/machine/m_pcjr.c +++ b/src/machine/m_pcjr.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/machine/m_ps1.c b/src/machine/m_ps1.c index 53e6928e8..209b5d7a4 100644 --- a/src/machine/m_ps1.c +++ b/src/machine/m_ps1.c @@ -24,7 +24,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/machine/m_ps2_mca.c b/src/machine/m_ps2_mca.c index cfe6ba6bd..f77b6f4a0 100644 --- a/src/machine/m_ps2_mca.c +++ b/src/machine/m_ps2_mca.c @@ -12,7 +12,7 @@ * * Authors: Fred N. van Kempen, * Miran Grca, - * Sarah Walker, + * Sarah Walker, * * Copyright 2017-2019 Fred N. van Kempen. * Copyright 2016-2019 Miran Grca. diff --git a/src/machine/m_tandy.c b/src/machine/m_tandy.c index bd5e22d89..0eddc1e19 100644 --- a/src/machine/m_tandy.c +++ b/src/machine/m_tandy.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2019 Sarah Walker. diff --git a/src/machine/m_xt_compaq.c b/src/machine/m_xt_compaq.c index 733063306..f5dca48a7 100644 --- a/src/machine/m_xt_compaq.c +++ b/src/machine/m_xt_compaq.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * TheCollector1995, * diff --git a/src/machine/m_xt_olivetti.c b/src/machine/m_xt_olivetti.c index 4bf24fc1d..bb52c2049 100644 --- a/src/machine/m_xt_olivetti.c +++ b/src/machine/m_xt_olivetti.c @@ -11,7 +11,7 @@ * - Supports MM58174 real-time clock emulation (M24) * - Supports MM58274 real-time clock emulation (M240) * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * EngiNerd diff --git a/src/machine/m_xt_t1000.c b/src/machine/m_xt_t1000.c index f61ce639b..f6f2e5322 100644 --- a/src/machine/m_xt_t1000.c +++ b/src/machine/m_xt_t1000.c @@ -55,7 +55,7 @@ * * Authors: Fred N. van Kempen, * Miran Grca, - * Sarah Walker, + * Sarah Walker, * * Copyright 2018-2019 Fred N. van Kempen. * Copyright 2018-2019 Miran Grca. @@ -687,8 +687,8 @@ t1000_read_nvram(uint16_t addr, void *priv) tmp = fdc_read(0x03f7, t1000.fdc); tmp = (tmp & 0x80) >> 3; /* Bit 4 is changeline */ - tmp |= (sys->nvr_active & 0xc0); /* Bits 6,7 are r/w mode */ - tmp |= 0x2e; /* Bits 5,3,2,1 always 1 */ + tmp |= (sys->nvr_active & 0xc0); /* Bits 6, 7 are r/w mode */ + tmp |= 0x2e; /* Bits 5, 3, 2, 1 always 1 */ tmp |= (sys->nvr_active & 0x40) >> 6; /* Ready state */ break; } diff --git a/src/machine/m_xt_t1000_vid.c b/src/machine/m_xt_t1000_vid.c index 60fb59082..48c00d3c3 100644 --- a/src/machine/m_xt_t1000_vid.c +++ b/src/machine/m_xt_t1000_vid.c @@ -13,7 +13,7 @@ * * Authors: Fred N. van Kempen, * Miran Grca, - * Sarah Walker, + * Sarah Walker, * * Copyright 2018-2019 Fred N. van Kempen. * Copyright 2018-2019 Miran Grca. diff --git a/src/machine/m_xt_zenith.c b/src/machine/m_xt_zenith.c index 9e05f3077..e5cebe552 100644 --- a/src/machine/m_xt_zenith.c +++ b/src/machine/m_xt_zenith.c @@ -11,7 +11,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * TheCollector1995, * EngiNerd diff --git a/src/machine/machine.c b/src/machine/machine.c index 6b496b06a..f7970d4f1 100644 --- a/src/machine/machine.c +++ b/src/machine/machine.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 2807c1060..c2db92654 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -13,7 +13,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/mem/CMakeLists.txt b/src/mem/CMakeLists.txt index 1739d4807..6aad80544 100644 --- a/src/mem/CMakeLists.txt +++ b/src/mem/CMakeLists.txt @@ -10,7 +10,7 @@ # # Authors: David Hrdlička, # -# Copyright 2020,2021 David Hrdlička. +# Copyright 2020-2021 David Hrdlička. # add_library(mem OBJECT catalyst_flash.c i2c_eeprom.c intel_flash.c mem.c rom.c diff --git a/src/mem/catalyst_flash.c b/src/mem/catalyst_flash.c index 043a24b37..5e473f540 100644 --- a/src/mem/catalyst_flash.c +++ b/src/mem/catalyst_flash.c @@ -11,7 +11,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2019 Sarah Walker. diff --git a/src/mem/intel_flash.c b/src/mem/intel_flash.c index 18b8a4b3d..f06b2426d 100644 --- a/src/mem/intel_flash.c +++ b/src/mem/intel_flash.c @@ -11,7 +11,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2020 Sarah Walker. diff --git a/src/mem/mem.c b/src/mem/mem.c index 4d5a5238b..1af83c844 100644 --- a/src/mem/mem.c +++ b/src/mem/mem.c @@ -8,7 +8,7 @@ * * Memory handling and MMU. * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/mem/rom.c b/src/mem/rom.c index 6c964f2c3..25ca1db71 100644 --- a/src/mem/rom.c +++ b/src/mem/rom.c @@ -14,7 +14,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/mem/sst_flash.c b/src/mem/sst_flash.c index 5ad110fa5..a58aa6895 100644 --- a/src/mem/sst_flash.c +++ b/src/mem/sst_flash.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Melissa Goad, * diff --git a/src/minitrace/minitrace.c b/src/minitrace/minitrace.c index 40388c5f2..0b2208605 100644 --- a/src/minitrace/minitrace.c +++ b/src/minitrace/minitrace.c @@ -1,6 +1,6 @@ // minitrace // Copyright 2014 by Henrik Rydgård -// http://www.github.com/hrydgard/minitrace +// https://www.github.com/hrydgard/minitrace // Released under the MIT license. // See minitrace.h for basic documentation. diff --git a/src/network/CMakeLists.txt b/src/network/CMakeLists.txt index dc03cb417..e14f979d3 100644 --- a/src/network/CMakeLists.txt +++ b/src/network/CMakeLists.txt @@ -10,7 +10,7 @@ # # Authors: David Hrdlička, # -# Copyright 2020,2021 David Hrdlička. +# Copyright 2020-2021 David Hrdlička. # add_library(net OBJECT network.c net_pcap.c net_slirp.c net_dp8390.c net_3c501.c diff --git a/src/network/net_ne2000.c b/src/network/net_ne2000.c index 66681206b..9a598538d 100644 --- a/src/network/net_ne2000.c +++ b/src/network/net_ne2000.c @@ -22,7 +22,7 @@ * Miran Grca, * Peter Grehan, * - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. * Copyright 2016-2018 Miran Grca. * Portions Copyright (C) 2002 MandrakeSoft S.A. * diff --git a/src/network/pcap_if.c b/src/network/pcap_if.c index 69110cb34..56fa3eaf1 100644 --- a/src/network/pcap_if.c +++ b/src/network/pcap_if.c @@ -12,7 +12,7 @@ * * Authors: Fred N. van Kempen, * - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. * * Redistribution and use in source and binary forms, with * or without modification, are permitted provided that the diff --git a/src/network/slirp/CMakeLists.txt b/src/network/slirp/CMakeLists.txt index a2c82e642..29da352e9 100644 --- a/src/network/slirp/CMakeLists.txt +++ b/src/network/slirp/CMakeLists.txt @@ -10,7 +10,7 @@ # # Authors: David Hrdlička, # -# Copyright 2020,2021 David Hrdlička. +# Copyright 2020-2021 David Hrdlička. # add_library(slirp STATIC arp_table.c bootp.c cksum.c dnssearch.c if.c diff --git a/src/nvr.c b/src/nvr.c index dccc6be40..4b073c48f 100644 --- a/src/nvr.c +++ b/src/nvr.c @@ -12,7 +12,7 @@ * David Hrdlička, * * Copyright 2017-2019 Fred N. van Kempen. - * Copyright 2018,2019 David Hrdlička. + * Copyright 2018-2019 David Hrdlička. * * Redistribution and use in source and binary forms, with * or without modification, are permitted provided that the diff --git a/src/nvr_at.c b/src/nvr_at.c index a881444c2..bd0bbe34e 100644 --- a/src/nvr_at.c +++ b/src/nvr_at.c @@ -194,7 +194,7 @@ * Authors: Fred N. van Kempen, * Miran Grca, * Mahod, - * Sarah Walker, + * Sarah Walker, * * Copyright 2017-2020 Fred N. van Kempen. * Copyright 2016-2020 Miran Grca. diff --git a/src/nvr_ps2.c b/src/nvr_ps2.c index b137cb81b..1ab97d8a3 100644 --- a/src/nvr_ps2.c +++ b/src/nvr_ps2.c @@ -11,9 +11,9 @@ * * * Authors: Fred N. van Kempen, - * Sarah Walker, + * Sarah Walker, * - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. * Copyright 2008-2018 Sarah Walker. * * This program is free software; you can redistribute it and/or modify diff --git a/src/pci.c b/src/pci.c index 7b4464407..f9155e2e3 100644 --- a/src/pci.c +++ b/src/pci.c @@ -12,7 +12,7 @@ * * Authors: Miran Grca, * Fred N. van Kempen, - * Sarah Walker, + * Sarah Walker, * * Copyright 2016-2020 Miran Grca. * Copyright 2017-2020 Fred N. van Kempen. diff --git a/src/printer/CMakeLists.txt b/src/printer/CMakeLists.txt index dd07121df..ef7b1d5ec 100644 --- a/src/printer/CMakeLists.txt +++ b/src/printer/CMakeLists.txt @@ -10,7 +10,7 @@ # # Authors: David Hrdlička, # -# Copyright 2020,2021 David Hrdlička. +# Copyright 2020-2021 David Hrdlička. # add_library(print OBJECT png.c prt_cpmap.c prt_escp.c prt_text.c prt_ps.c) diff --git a/src/printer/prt_escp.c b/src/printer/prt_escp.c index e7c9e0442..1cca57da0 100644 --- a/src/printer/prt_escp.c +++ b/src/printer/prt_escp.c @@ -13,8 +13,8 @@ * * Based on code by Frederic Weymann (originally for DosBox.) * - * Copyright 2018,2019 Michael Drüing. - * Copyright 2019,2019 Fred N. van Kempen. + * Copyright 2018-2019 Michael Drüing. + * Copyright 2019 Fred N. van Kempen. * * Redistribution and use in source and binary forms, with * or without modification, are permitted provided that the diff --git a/src/printer/prt_text.c b/src/printer/prt_text.c index b67d859b9..506261ccf 100644 --- a/src/printer/prt_text.c +++ b/src/printer/prt_text.c @@ -17,7 +17,7 @@ * * Authors: Fred N. van Kempen, * - * Copyright 2018,2019 Fred N. van Kempen. + * Copyright 2018-2019 Fred N. van Kempen. * * Redistribution and use in source and binary forms, with * or without modification, are permitted provided that the diff --git a/src/qt/qt_cdrom.c b/src/qt/qt_cdrom.c index 80310835b..6e28966b0 100644 --- a/src/qt/qt_cdrom.c +++ b/src/qt/qt_cdrom.c @@ -10,12 +10,12 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * * Copyright 2016-2018 Miran Grca. - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. */ #include diff --git a/src/qt/qt_sdl.h b/src/qt/qt_sdl.h index 8b691c78c..29804c278 100644 --- a/src/qt/qt_sdl.h +++ b/src/qt/qt_sdl.h @@ -13,8 +13,8 @@ * Authors: Fred N. van Kempen, * Michael Drüing, * - * Copyright 2018,2019 Fred N. van Kempen. - * Copyright 2018,2019 Michael Drüing. + * Copyright 2018-2019 Fred N. van Kempen. + * Copyright 2018-2019 Michael Drüing. * * Redistribution and use in source and binary forms, with * or without modification, are permitted provided that the diff --git a/src/qt/win_dynld.c b/src/qt/win_dynld.c index fd0064d7f..88fb632bc 100644 --- a/src/qt/win_dynld.c +++ b/src/qt/win_dynld.c @@ -12,7 +12,7 @@ * * Authors: Fred N. van Kempen, * - * Copyright 2017,2018 Fred N. van Kempen + * Copyright 2017-2018 Fred N. van Kempen */ #include #include diff --git a/src/qt/win_joystick_rawinput.c b/src/qt/win_joystick_rawinput.c index efa7714df..2976a54b9 100644 --- a/src/qt/win_joystick_rawinput.c +++ b/src/qt/win_joystick_rawinput.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * GH Cao, * diff --git a/src/scsi/CMakeLists.txt b/src/scsi/CMakeLists.txt index 467affd5a..addde844e 100644 --- a/src/scsi/CMakeLists.txt +++ b/src/scsi/CMakeLists.txt @@ -10,7 +10,7 @@ # # Authors: David Hrdlička, # -# Copyright 2020,2021 David Hrdlička. +# Copyright 2020-2021 David Hrdlička. # add_library(scsi OBJECT scsi.c scsi_device.c scsi_cdrom.c scsi_disk.c diff --git a/src/scsi/scsi_ncr5380.c b/src/scsi/scsi_ncr5380.c index 668f9ea9f..e094f0b1a 100644 --- a/src/scsi/scsi_ncr5380.c +++ b/src/scsi/scsi_ncr5380.c @@ -11,7 +11,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * TheCollector1995, * Fred N. van Kempen, * diff --git a/src/scsi/scsi_spock.c b/src/scsi/scsi_spock.c index acfb1ea27..66fcc20c6 100644 --- a/src/scsi/scsi_spock.c +++ b/src/scsi/scsi_spock.c @@ -11,7 +11,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * TheCollector1995, * * Copyright 2020 Sarah Walker. diff --git a/src/sio/CMakeLists.txt b/src/sio/CMakeLists.txt index bf38efe57..15411d3e6 100644 --- a/src/sio/CMakeLists.txt +++ b/src/sio/CMakeLists.txt @@ -10,7 +10,7 @@ # # Authors: David Hrdlička, # -# Copyright 2020,2021 David Hrdlička. +# Copyright 2020-2021 David Hrdlička. # add_library(sio OBJECT sio_acc3221.c sio_ali5123.c sio_f82c710.c sio_82091aa.c diff --git a/src/sio/sio_acc3221.c b/src/sio/sio_acc3221.c index 9aaf802f3..f5c671c3a 100644 --- a/src/sio/sio_acc3221.c +++ b/src/sio/sio_acc3221.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * * Copyright 2019 Sarah Walker. */ diff --git a/src/sio/sio_f82c710.c b/src/sio/sio_f82c710.c index 123232d7e..ad347fb03 100644 --- a/src/sio/sio_f82c710.c +++ b/src/sio/sio_f82c710.c @@ -18,7 +18,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Eluan Costa Miranda * Lubomir Rintel * diff --git a/src/sio/sio_fdc37c6xx.c b/src/sio/sio_fdc37c6xx.c index 9484ae680..f9c911402 100644 --- a/src/sio/sio_fdc37c6xx.c +++ b/src/sio/sio_fdc37c6xx.c @@ -11,7 +11,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2020 Sarah Walker. diff --git a/src/sio/sio_pc87306.c b/src/sio/sio_pc87306.c index 68d0383b0..8755775de 100644 --- a/src/sio/sio_pc87306.c +++ b/src/sio/sio_pc87306.c @@ -366,7 +366,7 @@ pc87306_reset(pc87306_t *dev) /* 0 = 360 rpm @ 500 kbps for 3.5" - 1 = Default, 300 rpm @ 500,300,250,1000 kbps for 3.5" + 1 = Default, 300 rpm @ 500, 300, 250, 1000 kbps for 3.5" */ lpt1_remove(); lpt1_handler(dev); diff --git a/src/sio/sio_pc87307.c b/src/sio/sio_pc87307.c index ae376f659..6f773a8e1 100644 --- a/src/sio/sio_pc87307.c +++ b/src/sio/sio_pc87307.c @@ -535,7 +535,7 @@ pc87307_reset(pc87307_t *dev) /* 0 = 360 rpm @ 500 kbps for 3.5" - 1 = Default, 300 rpm @ 500,300,250,1000 kbps for 3.5" + 1 = Default, 300 rpm @ 500, 300, 250, 1000 kbps for 3.5" */ lpt1_remove(); serial_remove(dev->uart[0]); diff --git a/src/sio/sio_pc87309.c b/src/sio/sio_pc87309.c index db6b78848..70ed57229 100644 --- a/src/sio/sio_pc87309.c +++ b/src/sio/sio_pc87309.c @@ -422,7 +422,7 @@ pc87309_reset(pc87309_t *dev) /* 0 = 360 rpm @ 500 kbps for 3.5" - 1 = Default, 300 rpm @ 500,300,250,1000 kbps for 3.5" + 1 = Default, 300 rpm @ 500, 300, 250, 1000 kbps for 3.5" */ lpt1_remove(); serial_remove(dev->uart[0]); diff --git a/src/sio/sio_pc87310.c b/src/sio/sio_pc87310.c index f7d5ced71..eacbadf89 100644 --- a/src/sio/sio_pc87310.c +++ b/src/sio/sio_pc87310.c @@ -210,7 +210,7 @@ pc87310_reset(pc87310_t *dev) dev->tries = 0; /* 0 = 360 rpm @ 500 kbps for 3.5" - 1 = Default, 300 rpm @ 500,300,250,1000 kbps for 3.5" + 1 = Default, 300 rpm @ 500, 300, 250, 1000 kbps for 3.5" */ lpt1_remove(); lpt1_handler(dev); diff --git a/src/sio/sio_pc87332.c b/src/sio/sio_pc87332.c index 1ea0e1255..64dd86665 100644 --- a/src/sio/sio_pc87332.c +++ b/src/sio/sio_pc87332.c @@ -277,7 +277,7 @@ pc87332_reset(pc87332_t *dev) /* 0 = 360 rpm @ 500 kbps for 3.5" - 1 = Default, 300 rpm @ 500,300,250,1000 kbps for 3.5" + 1 = Default, 300 rpm @ 500, 300, 250, 1000 kbps for 3.5" */ lpt1_remove(); lpt1_handler(dev); diff --git a/src/sio/sio_um8669f.c b/src/sio/sio_um8669f.c index f50832040..bd153a9e4 100644 --- a/src/sio/sio_um8669f.c +++ b/src/sio/sio_um8669f.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * RichardG, * diff --git a/src/sound/CMakeLists.txt b/src/sound/CMakeLists.txt index 66672d547..10b8903bc 100644 --- a/src/sound/CMakeLists.txt +++ b/src/sound/CMakeLists.txt @@ -10,7 +10,7 @@ # # Authors: David Hrdlička, # -# Copyright 2020,2021 David Hrdlička. +# 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 diff --git a/src/sound/midi.c b/src/sound/midi.c index 93fa62891..0cc8f2b38 100644 --- a/src/sound/midi.c +++ b/src/sound/midi.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Bit, * DOSBox Team, diff --git a/src/sound/openal.c b/src/sound/openal.c index 2153d4c2b..48e4ee818 100644 --- a/src/sound/openal.c +++ b/src/sound/openal.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2019 Sarah Walker. diff --git a/src/sound/resid-fp/CMakeLists.txt b/src/sound/resid-fp/CMakeLists.txt index 5ec9130d7..699fcae54 100644 --- a/src/sound/resid-fp/CMakeLists.txt +++ b/src/sound/resid-fp/CMakeLists.txt @@ -10,7 +10,7 @@ # # Authors: David Hrdlička, # -# Copyright 2020,2021 David Hrdlička. +# Copyright 2020-2021 David Hrdlička. # add_library(resid-fp STATIC convolve-sse.cc convolve.cc envelope.cc extfilt.cc diff --git a/src/sound/snd_ad1848.c b/src/sound/snd_ad1848.c index 558024fb5..f9bc337c1 100644 --- a/src/sound/snd_ad1848.c +++ b/src/sound/snd_ad1848.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * TheCollector1995, * RichardG, * diff --git a/src/sound/snd_audiopci.c b/src/sound/snd_audiopci.c index ecac7f05a..7d029a169 100644 --- a/src/sound/snd_audiopci.c +++ b/src/sound/snd_audiopci.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * RichardG, * Miran Grca, * diff --git a/src/sound/snd_mpu401.c b/src/sound/snd_mpu401.c index a31c48a7b..328c3c688 100644 --- a/src/sound/snd_mpu401.c +++ b/src/sound/snd_mpu401.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * DOSBox Team, * Miran Grca, * TheCollector1995, diff --git a/src/sound/snd_sb.c b/src/sound/snd_sb.c index 7660ace90..d67701180 100644 --- a/src/sound/snd_sb.c +++ b/src/sound/snd_sb.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * TheCollector1995, * diff --git a/src/sound/snd_speaker.c b/src/sound/snd_speaker.c index 34d32c110..774e4d650 100644 --- a/src/sound/snd_speaker.c +++ b/src/sound/snd_speaker.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2019 Sarah Walker. diff --git a/src/sound/snd_wss.c b/src/sound/snd_wss.c index 8a325e5c3..9e37dd745 100644 --- a/src/sound/snd_wss.c +++ b/src/sound/snd_wss.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * TheCollector1995, * * Copyright 2012-2018 Sarah Walker. diff --git a/src/sound/sound.c b/src/sound/sound.c index cda851137..ab75af4f0 100644 --- a/src/sound/sound.c +++ b/src/sound/sound.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2020 Sarah Walker. diff --git a/src/unix/assets/86Box.spec b/src/unix/assets/86Box.spec index 414a38a96..9fac0dde4 100644 --- a/src/unix/assets/86Box.spec +++ b/src/unix/assets/86Box.spec @@ -12,7 +12,7 @@ # After a successful build, you can install the RPMs as follows: # sudo dnf install RPMS/$(uname -m)/86Box-3* RPMS/noarch/86Box-roms* -%global romver v3.7 +%global romver v3.11 Name: 86Box Version: 3.11 diff --git a/src/unix/unix_cdrom.c b/src/unix/unix_cdrom.c index bbeed0149..79a649eb5 100644 --- a/src/unix/unix_cdrom.c +++ b/src/unix/unix_cdrom.c @@ -10,12 +10,12 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * * Copyright 2016-2018 Miran Grca. - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. */ #include diff --git a/src/video/CMakeLists.txt b/src/video/CMakeLists.txt index a5ea1059a..b37e81134 100644 --- a/src/video/CMakeLists.txt +++ b/src/video/CMakeLists.txt @@ -10,7 +10,7 @@ # # Authors: David Hrdlička, # -# Copyright 2020,2021 David Hrdlička. +# Copyright 2020-2021 David Hrdlička. # add_library(vid OBJECT agpgart.c video.c vid_table.c vid_cga.c vid_cga_comp.c diff --git a/src/video/vid_ati18800.c b/src/video/vid_ati18800.c index c9cd8bfcd..3781ef567 100644 --- a/src/video/vid_ati18800.c +++ b/src/video/vid_ati18800.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2020 Sarah Walker. diff --git a/src/video/vid_ati28800.c b/src/video/vid_ati28800.c index 1824d7fdc..352ce2f7d 100644 --- a/src/video/vid_ati28800.c +++ b/src/video/vid_ati28800.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * greatpsycho, * diff --git a/src/video/vid_ati68860_ramdac.c b/src/video/vid_ati68860_ramdac.c index 43811ce68..49fad5815 100644 --- a/src/video/vid_ati68860_ramdac.c +++ b/src/video/vid_ati68860_ramdac.c @@ -30,7 +30,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2018 Sarah Walker. diff --git a/src/video/vid_ati_eeprom.c b/src/video/vid_ati_eeprom.c index c09d03846..f1840a698 100644 --- a/src/video/vid_ati_eeprom.c +++ b/src/video/vid_ati_eeprom.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2020 Sarah Walker. diff --git a/src/video/vid_ati_mach64.c b/src/video/vid_ati_mach64.c index 0bd3b3843..d67ff876b 100644 --- a/src/video/vid_ati_mach64.c +++ b/src/video/vid_ati_mach64.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2019 Sarah Walker. diff --git a/src/video/vid_att20c49x_ramdac.c b/src/video/vid_att20c49x_ramdac.c index 4269f8b33..1874afce9 100644 --- a/src/video/vid_att20c49x_ramdac.c +++ b/src/video/vid_att20c49x_ramdac.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2018 Sarah Walker. diff --git a/src/video/vid_att2xc498_ramdac.c b/src/video/vid_att2xc498_ramdac.c index 32a91a490..2dab4b903 100644 --- a/src/video/vid_att2xc498_ramdac.c +++ b/src/video/vid_att2xc498_ramdac.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2018 Sarah Walker. diff --git a/src/video/vid_cga.c b/src/video/vid_cga.c index 80bf3bc85..6ed81f616 100644 --- a/src/video/vid_cga.c +++ b/src/video/vid_cga.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2019 Sarah Walker. diff --git a/src/video/vid_cl54xx.c b/src/video/vid_cl54xx.c index c3fd19e58..e29d95232 100644 --- a/src/video/vid_cl54xx.c +++ b/src/video/vid_cl54xx.c @@ -16,7 +16,7 @@ * TheCollector1995, * * Copyright 2016-2020 Miran Grca. - * Copyright 2020 tonioni. + * Copyright 2020 tonioni. * Copyright 2016-2020 TheCollector1995. */ #include diff --git a/src/video/vid_colorplus.c b/src/video/vid_colorplus.c index b460c15dd..ae24d8ff0 100644 --- a/src/video/vid_colorplus.c +++ b/src/video/vid_colorplus.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2018 Sarah Walker. diff --git a/src/video/vid_compaq_cga.c b/src/video/vid_compaq_cga.c index e1295d629..68255e746 100644 --- a/src/video/vid_compaq_cga.c +++ b/src/video/vid_compaq_cga.c @@ -11,7 +11,7 @@ * * * Authors: John Elliott, - * Sarah Walker, + * Sarah Walker, * Miran Grca, * * Copyright 2016-2019 John Elliott. diff --git a/src/video/vid_ega.c b/src/video/vid_ega.c index c50c0a7b7..bfac7d503 100644 --- a/src/video/vid_ega.c +++ b/src/video/vid_ega.c @@ -11,7 +11,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2019 Sarah Walker. diff --git a/src/video/vid_ega_render.c b/src/video/vid_ega_render.c index ac5c65546..b2d5cb5c1 100644 --- a/src/video/vid_ega_render.c +++ b/src/video/vid_ega_render.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2019 Sarah Walker. diff --git a/src/video/vid_et4000.c b/src/video/vid_et4000.c index 5d0691514..4020c0523 100644 --- a/src/video/vid_et4000.c +++ b/src/video/vid_et4000.c @@ -13,9 +13,9 @@ * Authors: Fred N. van Kempen, * Miran Grca, * GreatPsycho, - * Sarah Walker, + * Sarah Walker, * - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. * Copyright 2016-2018 Miran Grca. * Copyright 2008-2018 Sarah Walker. * diff --git a/src/video/vid_et4000w32.c b/src/video/vid_et4000w32.c index eb604f4ea..2f6e6497c 100644 --- a/src/video/vid_et4000w32.c +++ b/src/video/vid_et4000w32.c @@ -12,7 +12,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2019 Sarah Walker. diff --git a/src/video/vid_f82c425.c b/src/video/vid_f82c425.c index 1fda74630..15f4ce496 100644 --- a/src/video/vid_f82c425.c +++ b/src/video/vid_f82c425.c @@ -24,13 +24,13 @@ * * Authors: Fred N. van Kempen, * Miran Grca, - * Sarah Walker, + * Sarah Walker, * Lubomir Rintel, * - * Copyright 2018,2019 Fred N. van Kempen. - * Copyright 2018,2019 Miran Grca. - * Copyright 2018,2019 Sarah Walker. - * Copyright 2021 Lubomir Rintel. + * Copyright 2018-2019 Fred N. van Kempen. + * Copyright 2018-2019 Miran Grca. + * Copyright 2018-2019 Sarah Walker. + * Copyright 2021 Lubomir Rintel. * * 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 diff --git a/src/video/vid_genius.c b/src/video/vid_genius.c index 9d2cbb947..cbf4eabfe 100644 --- a/src/video/vid_genius.c +++ b/src/video/vid_genius.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2019 Sarah Walker. diff --git a/src/video/vid_hercules.c b/src/video/vid_hercules.c index e9fab0a16..5920ff27d 100644 --- a/src/video/vid_hercules.c +++ b/src/video/vid_hercules.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2019 Sarah Walker. diff --git a/src/video/vid_herculesplus.c b/src/video/vid_herculesplus.c index cf762365a..6561f9429 100644 --- a/src/video/vid_herculesplus.c +++ b/src/video/vid_herculesplus.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2018 Sarah Walker. diff --git a/src/video/vid_ht216.c b/src/video/vid_ht216.c index ad5bf7af0..255a9e8b8 100644 --- a/src/video/vid_ht216.c +++ b/src/video/vid_ht216.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2019 Sarah Walker. diff --git a/src/video/vid_ics2595.c b/src/video/vid_ics2595.c index 157987083..10fc5ba39 100644 --- a/src/video/vid_ics2595.c +++ b/src/video/vid_ics2595.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2018 Sarah Walker. diff --git a/src/video/vid_incolor.c b/src/video/vid_incolor.c index 652dc79ab..68673c061 100644 --- a/src/video/vid_incolor.c +++ b/src/video/vid_incolor.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2018 Sarah Walker. diff --git a/src/video/vid_mda.c b/src/video/vid_mda.c index 019dc4885..57e91637c 100644 --- a/src/video/vid_mda.c +++ b/src/video/vid_mda.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2019 Sarah Walker. diff --git a/src/video/vid_mga.c b/src/video/vid_mga.c index 1532ae116..ef7a2b366 100644 --- a/src/video/vid_mga.c +++ b/src/video/vid_mga.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * * Copyright 2008-2020 Sarah Walker. */ diff --git a/src/video/vid_nga.c b/src/video/vid_nga.c index 331b0f70b..e2e8fdc9c 100644 --- a/src/video/vid_nga.c +++ b/src/video/vid_nga.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * EngiNerd, @@ -18,7 +18,7 @@ * Copyright 2008-2019 Sarah Walker. * Copyright 2016-2019 Miran Grca. * Copyright 2017-2019 Fred N. van Kempen. - * Copyright 2020 EngiNerd. + * Copyright 2020 EngiNerd. */ #include diff --git a/src/video/vid_oak_oti.c b/src/video/vid_oak_oti.c index 936ef158a..cc07dc0a4 100644 --- a/src/video/vid_oak_oti.c +++ b/src/video/vid_oak_oti.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2018 Sarah Walker. diff --git a/src/video/vid_ogc.c b/src/video/vid_ogc.c index a3ca21ad9..38d993216 100644 --- a/src/video/vid_ogc.c +++ b/src/video/vid_ogc.c @@ -11,7 +11,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * EngiNerd, @@ -19,7 +19,7 @@ * Copyright 2008-2019 Sarah Walker. * Copyright 2016-2019 Miran Grca. * Copyright 2017-2019 Fred N. van Kempen. - * Copyright 2020 EngiNerd. + * Copyright 2020 EngiNerd. */ #include diff --git a/src/video/vid_paradise.c b/src/video/vid_paradise.c index a60d61eb8..f2ec8aeb2 100644 --- a/src/video/vid_paradise.c +++ b/src/video/vid_paradise.c @@ -12,7 +12,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2019 Sarah Walker. diff --git a/src/video/vid_s3.c b/src/video/vid_s3.c index b17f0e50b..e6630a6c3 100644 --- a/src/video/vid_s3.c +++ b/src/video/vid_s3.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2019 Sarah Walker. diff --git a/src/video/vid_s3_virge.c b/src/video/vid_s3_virge.c index 94c0f575c..376abb68c 100644 --- a/src/video/vid_s3_virge.c +++ b/src/video/vid_s3_virge.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2018 Sarah Walker. diff --git a/src/video/vid_sc1502x_ramdac.c b/src/video/vid_sc1502x_ramdac.c index 625788efe..3a3b3a863 100644 --- a/src/video/vid_sc1502x_ramdac.c +++ b/src/video/vid_sc1502x_ramdac.c @@ -12,7 +12,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2018 Sarah Walker. diff --git a/src/video/vid_sdac_ramdac.c b/src/video/vid_sdac_ramdac.c index 4c97924bd..45fe714ec 100644 --- a/src/video/vid_sdac_ramdac.c +++ b/src/video/vid_sdac_ramdac.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2019 Sarah Walker. diff --git a/src/video/vid_stg_ramdac.c b/src/video/vid_stg_ramdac.c index 592cc275e..78a477acb 100644 --- a/src/video/vid_stg_ramdac.c +++ b/src/video/vid_stg_ramdac.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2018 Sarah Walker. diff --git a/src/video/vid_svga.c b/src/video/vid_svga.c index 21d0b50ee..0d493a59e 100644 --- a/src/video/vid_svga.c +++ b/src/video/vid_svga.c @@ -13,7 +13,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2019 Sarah Walker. diff --git a/src/video/vid_svga_render.c b/src/video/vid_svga_render.c index 36e25771b..ca843ac74 100644 --- a/src/video/vid_svga_render.c +++ b/src/video/vid_svga_render.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2019 Sarah Walker. diff --git a/src/video/vid_tgui9440.c b/src/video/vid_tgui9440.c index 8b67bb23e..f2475888b 100644 --- a/src/video/vid_tgui9440.c +++ b/src/video/vid_tgui9440.c @@ -49,7 +49,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2019 Sarah Walker. diff --git a/src/video/vid_ti_cf62011.c b/src/video/vid_ti_cf62011.c index 1ceaf169e..f804a6dde 100644 --- a/src/video/vid_ti_cf62011.c +++ b/src/video/vid_ti_cf62011.c @@ -44,13 +44,13 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * * Copyright 2008-2018 Sarah Walker. * Copyright 2016-2018 Miran Grca. - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. */ #include #include diff --git a/src/video/vid_tkd8001_ramdac.c b/src/video/vid_tkd8001_ramdac.c index 1d1668d25..66c2ca922 100644 --- a/src/video/vid_tkd8001_ramdac.c +++ b/src/video/vid_tkd8001_ramdac.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2018 Sarah Walker. diff --git a/src/video/vid_tvga.c b/src/video/vid_tvga.c index 491dc24a9..384770ba4 100644 --- a/src/video/vid_tvga.c +++ b/src/video/vid_tvga.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2018 Sarah Walker. diff --git a/src/video/vid_vga.c b/src/video/vid_vga.c index de3943ec0..ac26c2b5d 100644 --- a/src/video/vid_vga.c +++ b/src/video/vid_vga.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2018 Sarah Walker. diff --git a/src/video/vid_voodoo.c b/src/video/vid_voodoo.c index 346e33755..cb5491c03 100644 --- a/src/video/vid_voodoo.c +++ b/src/video/vid_voodoo.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * leilei * * Copyright 2008-2020 Sarah Walker. diff --git a/src/video/vid_voodoo_banshee.c b/src/video/vid_voodoo_banshee.c index 956176180..f1c1347fe 100644 --- a/src/video/vid_voodoo_banshee.c +++ b/src/video/vid_voodoo_banshee.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * * Copyright 2008-2020 Sarah Walker. */ diff --git a/src/video/vid_voodoo_blitter.c b/src/video/vid_voodoo_blitter.c index a0f8109f0..f60d9e184 100644 --- a/src/video/vid_voodoo_blitter.c +++ b/src/video/vid_voodoo_blitter.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * * Copyright 2008-2020 Sarah Walker. */ diff --git a/src/video/vid_voodoo_display.c b/src/video/vid_voodoo_display.c index 7ab72dabe..68be3b26d 100644 --- a/src/video/vid_voodoo_display.c +++ b/src/video/vid_voodoo_display.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * * Copyright 2008-2020 Sarah Walker. */ diff --git a/src/video/vid_voodoo_fb.c b/src/video/vid_voodoo_fb.c index 267949cde..f4a4edca6 100644 --- a/src/video/vid_voodoo_fb.c +++ b/src/video/vid_voodoo_fb.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * * Copyright 2008-2020 Sarah Walker. */ diff --git a/src/video/vid_voodoo_fifo.c b/src/video/vid_voodoo_fifo.c index 5b2ef1bb2..646e5876c 100644 --- a/src/video/vid_voodoo_fifo.c +++ b/src/video/vid_voodoo_fifo.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * * Copyright 2008-2020 Sarah Walker. */ diff --git a/src/video/vid_voodoo_reg.c b/src/video/vid_voodoo_reg.c index 1822e3070..51b9568b8 100644 --- a/src/video/vid_voodoo_reg.c +++ b/src/video/vid_voodoo_reg.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * * Copyright 2008-2020 Sarah Walker. */ diff --git a/src/video/vid_voodoo_render.c b/src/video/vid_voodoo_render.c index d419d1891..4b09cfadb 100644 --- a/src/video/vid_voodoo_render.c +++ b/src/video/vid_voodoo_render.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * * Copyright 2008-2020 Sarah Walker. */ diff --git a/src/video/vid_voodoo_setup.c b/src/video/vid_voodoo_setup.c index 7a09dffcc..40018ddf8 100644 --- a/src/video/vid_voodoo_setup.c +++ b/src/video/vid_voodoo_setup.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * * Copyright 2008-2020 Sarah Walker. */ diff --git a/src/video/vid_voodoo_texture.c b/src/video/vid_voodoo_texture.c index 8e1cd71db..4f81f6d00 100644 --- a/src/video/vid_voodoo_texture.c +++ b/src/video/vid_voodoo_texture.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * * Copyright 2008-2020 Sarah Walker. */ diff --git a/src/video/vid_wy700.c b/src/video/vid_wy700.c index 9fb5b9ee4..1a4babb99 100644 --- a/src/video/vid_wy700.c +++ b/src/video/vid_wy700.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2018 Sarah Walker. diff --git a/src/video/video.c b/src/video/video.c index 5d5f2f37b..d0e9ebb2c 100644 --- a/src/video/video.c +++ b/src/video/video.c @@ -42,7 +42,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2019 Sarah Walker. diff --git a/src/win/win.c b/src/win/win.c index 3d46054a6..3dd41fca9 100644 --- a/src/win/win.c +++ b/src/win/win.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/win/win_cdrom.c b/src/win/win_cdrom.c index 00195bcda..bfd62383a 100644 --- a/src/win/win_cdrom.c +++ b/src/win/win_cdrom.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/win/win_devconf.c b/src/win/win_devconf.c index c867dab9f..5a833d5e5 100644 --- a/src/win/win_devconf.c +++ b/src/win/win_devconf.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2018 Sarah Walker. diff --git a/src/win/win_joystick.cpp b/src/win/win_joystick.cpp index ab9a2907e..42ab8bd69 100644 --- a/src/win/win_joystick.cpp +++ b/src/win/win_joystick.cpp @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2019 Sarah Walker. diff --git a/src/win/win_joystick_rawinput.c b/src/win/win_joystick_rawinput.c index efa7714df..2976a54b9 100644 --- a/src/win/win_joystick_rawinput.c +++ b/src/win/win_joystick_rawinput.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * GH Cao, * diff --git a/src/win/win_joystick_xinput.c b/src/win/win_joystick_xinput.c index caf8f3452..2f98e5241 100644 --- a/src/win/win_joystick_xinput.c +++ b/src/win/win_joystick_xinput.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * GH Cao, * diff --git a/src/win/win_mouse.c b/src/win/win_mouse.c index 4490328a9..1a914aa9b 100644 --- a/src/win/win_mouse.c +++ b/src/win/win_mouse.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * GH Cao, * diff --git a/src/win/win_opengl.c b/src/win/win_opengl.c index 05d7eb72c..586632aaa 100644 --- a/src/win/win_opengl.c +++ b/src/win/win_opengl.c @@ -65,7 +65,7 @@ typedef LONG atomic_flag; static const int INIT_WIDTH = 640; static const int INIT_HEIGHT = 400; -static const int BUFFERPIXELS = 4194304; /* Same size as render_buffer, pow(2048+64,2). */ +static const int BUFFERPIXELS = 4194304; /* Same size as render_buffer, pow(2048 + 64, 2). */ static const int BUFFERBYTES = 16777216; /* Pixel is 4 bytes. */ static const int BUFFERCOUNT = 3; /* How many buffers to use for pixel transfer (2-3 is commonly recommended). */ static const int ROW_LENGTH = 2048; /* Source buffer row lenght (including padding) */ diff --git a/src/win/win_settings.c b/src/win/win_settings.c index d6e0c0693..af91fe8d3 100644 --- a/src/win/win_settings.c +++ b/src/win/win_settings.c @@ -14,7 +14,7 @@ * David Hrdlička, * * Copyright 2016-2019 Miran Grca. - * Copyright 2018,2019 David Hrdlička. + * Copyright 2018-2019 David Hrdlička. * Copyright 2021 Laci bá' * Copyright 2021-2022 Jasmine Iwanek. */ diff --git a/src/win/win_thread.c b/src/win/win_thread.c index 97ea3a56c..c110779f2 100644 --- a/src/win/win_thread.c +++ b/src/win/win_thread.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Fred N. van Kempen, * * Copyright 2008-2018 Sarah Walker. diff --git a/src/win/win_ui.c b/src/win/win_ui.c index 38d7e161c..6107c0609 100644 --- a/src/win/win_ui.c +++ b/src/win/win_ui.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/vcpkg.json b/vcpkg.json index 46ab6bff3..c9fd8eceb 100644 --- a/vcpkg.json +++ b/vcpkg.json @@ -2,7 +2,7 @@ "name": "86box", "version-string": "3.11", "homepage": "https://86box.net/", - "documentation": "http://86box.readthedocs.io/", + "documentation": "https://86box.readthedocs.io/", "license": "GPL-2.0-or-later", "dependencies": [ "freetype", From ca0ff1ab89f0e9870ffff74b7a3b0f199f7bebe4 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Fri, 6 Jan 2023 16:33:28 -0500 Subject: [PATCH 130/285] crcspeed Compatibility With C++ --- src/crcspeed/crc64speed.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/crcspeed/crc64speed.c b/src/crcspeed/crc64speed.c index b1a7bbb94..e4cccdc69 100644 --- a/src/crcspeed/crc64speed.c +++ b/src/crcspeed/crc64speed.c @@ -124,7 +124,7 @@ static inline uint_fast64_t crc_reflect(uint_fast64_t data, size_t data_len) { * \return The updated crc value. ******************************************************************************/ uint64_t crc64(uint_fast64_t crc, const void *in_data, const uint64_t len) { - const uint8_t *data = in_data; + const uint8_t *data = (uint8_t *) in_data; bool bit; for (uint64_t offset = 0; offset < len; offset++) { @@ -152,7 +152,7 @@ uint64_t crc64(uint_fast64_t crc, const void *in_data, const uint64_t len) { /* Only for testing; doesn't support DUAL */ uint64_t crc64_lookup(uint64_t crc, const void *in_data, const uint64_t len) { - const uint8_t *data = in_data; + const uint8_t *data = (uint8_t *) in_data; for (size_t i = 0; i < len; i++) { crc = crc64_table[0][(uint8_t)crc ^ data[i]] ^ (crc >> 8); } @@ -167,7 +167,7 @@ bool crc64speed_init(void) { #else should_init(crc64_table_little, LITTLE1); #endif - crcspeed64little_init(crc64, dual ? crc64_table_little : crc64_table); + crcspeed64little_init(crc64, dual ? (uint64_t (*)[256]) crc64_table_little : crc64_table); return true; } @@ -178,7 +178,7 @@ bool crc64speed_init_big(void) { #else should_init(crc64_table_big, BIG1); #endif - crcspeed64big_init(crc64, dual ? crc64_table_big : crc64_table); + crcspeed64big_init(crc64, dual ? (uint64_t (*)[256]) crc64_table_big : crc64_table); return true; } @@ -189,7 +189,7 @@ uint64_t crc64speed(uint64_t crc, const void *s, const uint64_t l) { #else check_init(crc64_table_little, LITTLE1); #endif - return crcspeed64little(dual ? crc64_table_little : crc64_table, crc, + return crcspeed64little(dual ? (uint64_t (*)[256]) crc64_table_little : crc64_table, crc, (void *)s, l); } @@ -200,7 +200,7 @@ uint64_t crc64speed_big(uint64_t crc, const void *s, const uint64_t l) { #else check_init(crc64_table_big, BIG1); #endif - return crcspeed64big(dual ? crc64_table_big : crc64_table, crc, (void *)s, + return crcspeed64big(dual ? (uint64_t (*)[256]) crc64_table_big : crc64_table, crc, (void *)s, l); } From 3ba87a5e353834be235f391355c6e3f1bcf79156 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sat, 7 Jan 2023 00:04:47 -0500 Subject: [PATCH 131/285] Update fdi2raw --- src/floppy/fdi2raw.c | 463 +++++++++++++++++++++--------------------- src/include/fdi2raw.h | 64 ++++-- 2 files changed, 281 insertions(+), 246 deletions(-) diff --git a/src/floppy/fdi2raw.c b/src/floppy/fdi2raw.c index 92d299caf..dcda6afc1 100644 --- a/src/floppy/fdi2raw.c +++ b/src/floppy/fdi2raw.c @@ -20,7 +20,7 @@ * * Copyright 2001-2004 Toni Wilen. * Copyright 2001-2004 Vincent Joguin. - * Copyright 2001 Thomas Harte. + * Copyright 2001-2016 Thomas Harte. */ #define STATIC_INLINE #include @@ -65,7 +65,7 @@ fdi2raw_log(const char *fmt, ...) #ifdef ENABLE_FDI2RAW_LOG # ifdef DEBUG static char * -datalog(uae_u8 *src, int len) +datalog(uint8_t *src, int len) { static char buf[1000]; static int offset; @@ -88,7 +88,7 @@ datalog(uae_u8 *src, int len) } # else static char * -datalog(uae_u8 *src, int len) +datalog(uint8_t *src, int len) { return ""; } @@ -130,37 +130,38 @@ fdi_malloc(int size) #define MAX_TRACKS 166 struct fdi_cache { - uae_u32 *avgp, *minp, *maxp; - uae_u8 *idxp; - int avg_free, idx_free, min_free, max_free; - uae_u32 totalavg, pulses, maxidx, indexoffset; - int weakbits; - int lowlevel; + uint32_t *avgp, *minp, *maxp; + uint8_t *idxp; + int avg_free, idx_free, min_free, max_free; + uint32_t totalavg, pulses, maxidx, indexoffset; + int weakbits; + int lowlevel; }; struct fdi { - uae_u8 *track_src_buffer; - uae_u8 *track_src; - int track_src_len; - uae_u8 *track_dst_buffer; - uae_u8 *track_dst; - uae_u16 *track_dst_buffer_timing; - uae_u8 track_len; - uae_u8 track_type; - int current_track; - int last_track; - int last_head; - int rotation_speed; - int bit_rate; - int disk_type; - int write_protect; - int err; - uae_u8 header[2048]; - int track_offsets[MAX_TRACKS]; - FILE *file; - int out; - int mfmsync_offset; - int *mfmsync_buffer; + uint8_t *track_src_buffer; + uint8_t *track_src; + int32_t track_src_len; + uint8_t *track_dst_buffer; + uint8_t *track_dst; + uint16_t *track_dst_buffer_timing; + uint8_t track_len; + uint8_t track_type; + int current_track; + int last_track; + int last_head; + int rotation_speed; + int bit_rate; + int disk_type; + bool write_protect; + int reversed_side; + int err; + uint8_t header[2048]; + int32_t track_offsets[MAX_TRACKS]; + FILE *file; + int out; + int mfmsync_offset; + int *mfmsync_buffer; /* sector described only */ int index_offset; int encoding_type; @@ -172,7 +173,7 @@ struct fdi { #define get_u32(x) ((((x)[0]) << 24) | (((x)[1]) << 16) | (((x)[2]) << 8) | ((x)[3])) #define get_u24(x) ((((x)[0]) << 16) | (((x)[1]) << 8) | ((x)[2])) STATIC_INLINE void -put_u32(uae_u8 *d, uae_u32 v) +put_u32(uint8_t *d, uint32_t v) { d[0] = v >> 24; d[1] = v >> 16; @@ -181,16 +182,16 @@ put_u32(uae_u8 *d, uae_u32 v) } struct node { - uae_u16 v; + uint16_t v; struct node *left; struct node *right; }; typedef struct node NODE; -static uae_u8 temp, temp2; +static uint8_t temp, temp2; -static uae_u8 * -expand_tree(uae_u8 *stream, NODE *node) +static uint8_t * +expand_tree(uint8_t *stream, NODE *node) { if (temp & temp2) { if (node->left) { @@ -208,7 +209,7 @@ expand_tree(uae_u8 *stream, NODE *node) } return stream; } else { - uae_u8 *stream_temp; + uint8_t *stream_temp; temp2 >>= 1; if (!temp2) { temp = *stream++; @@ -223,27 +224,27 @@ expand_tree(uae_u8 *stream, NODE *node) } } -static uae_u8 * -values_tree8(uae_u8 *stream, NODE *node) +static uint8_t * +values_tree8(uint8_t *stream, NODE *node) { if (node->left == 0) { node->v = *stream++; return stream; } else { - uae_u8 *stream_temp = values_tree8(stream, node->left); + uint8_t *stream_temp = values_tree8(stream, node->left); return values_tree8(stream_temp, node->right); } } -static uae_u8 * -values_tree16(uae_u8 *stream, NODE *node) +static uint8_t * +values_tree16(uint8_t *stream, NODE *node) { if (node->left == 0) { - uae_u16 high_8_bits = (*stream++) << 8; - node->v = high_8_bits | (*stream++); + uint16_t high_8_bits = (*stream++) << 8; + node->v = high_8_bits | (*stream++); return stream; } else { - uae_u8 *stream_temp = values_tree16(stream, node->left); + uint8_t *stream_temp = values_tree16(stream, node->left); return values_tree16(stream_temp, node->right); } } @@ -258,16 +259,18 @@ free_nodes(NODE *node) } } -static uae_u32 -sign_extend16(uae_u32 v) +/// @returns the 32-bit sign extended version of the 16-bit value in the low part of @c v. +static uint32_t +sign_extend16(uint32_t v) { if (v & 0x8000) v |= 0xffff0000; return v; } -static uae_u32 -sign_extend8(uae_u32 v) +/// @returns the 32-bit sign extended version of the 8-bit value in the low part of @c v. +static uint32_t +sign_extend8(uint32_t v) { if (v & 0x80) v |= 0xffffff00; @@ -275,12 +278,12 @@ sign_extend8(uae_u32 v) } static void -fdi_decode(uae_u8 *stream, int size, uae_u8 *out) +fdi_decode(uint8_t *stream, int size, uint8_t *out) { - int i; - uae_u8 sign_extend, sixteen_bit, sub_stream_shift; - NODE root; - NODE *current_node; + int i; + uint8_t sign_extend, sixteen_bit, sub_stream_shift; + NODE root; + NODE *current_node; memset(out, 0, size * 4); sub_stream_shift = 1; @@ -308,9 +311,9 @@ fdi_decode(uae_u8 *stream, int size, uae_u8 *out) /* sub-stream data decode */ temp2 = 0; for (i = 0; i < size; i++) { - uae_u32 v; - uae_u8 decode = 1; - current_node = &root; + uint32_t v; + uint8_t decode = 1; + current_node = &root; while (decode) { if (current_node->left == 0) { decode = 0; @@ -326,7 +329,7 @@ fdi_decode(uae_u8 *stream, int size, uae_u8 *out) current_node = current_node->left; } } - v = ((uae_u32 *) out)[i]; + v = ((uint32_t *) out)[i]; if (sign_extend) { if (sixteen_bit) v |= sign_extend16(current_node->v) << sub_stream_shift; @@ -335,7 +338,7 @@ fdi_decode(uae_u8 *stream, int size, uae_u8 *out) } else { v |= current_node->v << sub_stream_shift; } - ((uae_u32 *) out)[i] = v; + ((uint32_t *) out)[i] = v; } free_nodes(root.left); root.left = 0; @@ -457,7 +460,7 @@ bit_dedrop(FDI *fdi) /* add one byte */ static void -byte_add(FDI *fdi, uae_u8 v) +byte_add(FDI *fdi, uint8_t v) { int i; for (i = 7; i >= 0; i--) @@ -465,14 +468,14 @@ byte_add(FDI *fdi, uae_u8 v) } /* add one word */ static void -word_add(FDI *fdi, uae_u16 v) +word_add(FDI *fdi, uint16_t v) { - byte_add(fdi, (uae_u8) (v >> 8)); - byte_add(fdi, (uae_u8) v); + byte_add(fdi, (uint8_t) (v >> 8)); + byte_add(fdi, (uint8_t) v); } /* add one byte and mfm encode it */ static void -byte_mfm_add(FDI *fdi, uae_u8 v) +byte_mfm_add(FDI *fdi, uint8_t v) { int i; for (i = 7; i >= 0; i--) @@ -480,7 +483,7 @@ byte_mfm_add(FDI *fdi, uae_u8 v) } /* add multiple bytes and mfm encode them */ static void -bytes_mfm_add(FDI *fdi, uae_u8 v, int len) +bytes_mfm_add(FDI *fdi, uint8_t v, int len) { int i; for (i = 0; i < len; i++) @@ -488,7 +491,7 @@ bytes_mfm_add(FDI *fdi, uae_u8 v, int len) } /* add one mfm encoded word and re-mfm encode it */ static void -word_post_mfm_add(FDI *fdi, uae_u16 v) +word_post_mfm_add(FDI *fdi, uint16_t v) { int i; for (i = 14; i >= 0; i -= 2) @@ -529,8 +532,8 @@ s04(FDI *fdi) static void s08(FDI *fdi) { - int bytes = *fdi->track_src++; - uae_u8 byte = *fdi->track_src++; + int bytes = *fdi->track_src++; + uint8_t byte = *fdi->track_src++; if (bytes == 0) bytes = 256; fdi2raw_log("s08:len=%d,data=%02.2X", bytes, byte); @@ -541,8 +544,8 @@ s08(FDI *fdi) static void s09(FDI *fdi) { - int bytes = *fdi->track_src++; - uae_u8 byte = *fdi->track_src++; + int bytes = *fdi->track_src++; + uint8_t byte = *fdi->track_src++; if (bytes == 0) bytes = 256; bit_drop_next(fdi); @@ -554,8 +557,8 @@ s09(FDI *fdi) static void s0a(FDI *fdi) { - int i, bits = (fdi->track_src[0] << 8) | fdi->track_src[1]; - uae_u8 b; + int i, bits = (fdi->track_src[0] << 8) | fdi->track_src[1]; + uint8_t b; fdi->track_src += 2; fdi2raw_log("s0a:bits=%d,data=%s", bits, datalog(fdi->track_src, (bits + 7) / 8)); while (bits >= 8) { @@ -575,8 +578,8 @@ s0a(FDI *fdi) static void s0b(FDI *fdi) { - int i, bits = ((fdi->track_src[0] << 8) | fdi->track_src[1]) + 65536; - uae_u8 b; + int i, bits = ((fdi->track_src[0] << 8) | fdi->track_src[1]) + 65536; + uint8_t b; fdi->track_src += 2; fdi2raw_log("s0b:bits=%d,data=%s", bits, datalog(fdi->track_src, (bits + 7) / 8)); while (bits >= 8) { @@ -596,8 +599,8 @@ s0b(FDI *fdi) static void s0c(FDI *fdi) { - int i, bits = (fdi->track_src[0] << 8) | fdi->track_src[1]; - uae_u8 b; + int i, bits = (fdi->track_src[0] << 8) | fdi->track_src[1]; + uint8_t b; fdi->track_src += 2; bit_drop_next(fdi); fdi2raw_log("s0c:bits=%d,data=%s", bits, datalog(fdi->track_src, (bits + 7) / 8)); @@ -618,8 +621,8 @@ s0c(FDI *fdi) static void s0d(FDI *fdi) { - int i, bits = ((fdi->track_src[0] << 8) | fdi->track_src[1]) + 65536; - uae_u8 b; + int i, bits = ((fdi->track_src[0] << 8) | fdi->track_src[1]) + 65536; + uint8_t b; fdi->track_src += 2; bit_drop_next(fdi); fdi2raw_log("s0d:bits=%d,data=%s", bits, datalog(fdi->track_src, (bits + 7) / 8)); @@ -643,7 +646,7 @@ s0d(FDI *fdi) /* just for testing integrity of Amiga sectors */ -/*static void rotateonebit (uae_u8 *start, uae_u8 *end, int shift) +/*static void rotateonebit (uint8_t *start, uint8_t *end, int shift) { if (shift == 0) return; @@ -654,21 +657,21 @@ s0d(FDI *fdi) } }*/ -/*static uae_u16 getmfmword (uae_u8 *mbuf) +/*static uint16_t getmfmword (uint8_t *mbuf) { - uae_u32 v; + uint32_t v; v = (mbuf[0] << 8) | (mbuf[1] << 0); if (check_offset == 0) - return v; + return (uint16_t)v; v <<= 8; v |= mbuf[2]; v >>= check_offset; - return v; + return (uint16_t)v; }*/ #define MFMMASK 0x55555555 -/*static uae_u32 getmfmlong (uae_u8 * mbuf) +/*static uint32_t getmfmlong (uint8_t * mbuf) { return ((getmfmword (mbuf) << 16) | getmfmword (mbuf + 2)) & MFMMASK; }*/ @@ -680,13 +683,13 @@ static int amiga_check_track (FDI *fdi) int fwlen = fdi->out / 8; int length = 2 * fwlen; int drvsec = 11; - uae_u32 odd, even, chksum, id, dlong; - uae_u8 *secdata; - uae_u8 secbuf[544]; - uae_u8 bigmfmbuf[60000]; - uae_u8 *mbuf, *mbuf2, *mend; + uint32_t odd, even, chksum, id, dlong; + uint8_t *secdata; + uint8_t secbuf[544]; + uint8_t bigmfmbuf[60000]; + uint8_t *mbuf, *mbuf2, *mend; char sectable[22]; - uae_u8 *raw = fdi->track_dst_buffer; + uint8_t *raw = fdi->track_dst_buffer; int slabel, off; int ok = 1; @@ -782,7 +785,7 @@ static int amiga_check_track (FDI *fdi) continue; } fdi2raw_log("sector %d header crc ok\n", trackoffs); - if (((id & 0x00ff0000) >> 16) != (uae_u32)fdi->current_track) { + if (((id & 0x00ff0000) >> 16) != (uint32_t)fdi->current_track) { fdi2raw_log("illegal track number %d <> %d\n",fdi->current_track,(id & 0x00ff0000) >> 16); ok++; mbuf = mbuf2; @@ -798,10 +801,10 @@ static int amiga_check_track (FDI *fdi) even = getmfmlong (mbuf + 256 * 2); mbuf += 2 * 2; dlong = (odd << 1) | even; - *secdata++ = (uae_u8) (dlong >> 24); - *secdata++ = (uae_u8) (dlong >> 16); - *secdata++ = (uae_u8) (dlong >> 8); - *secdata++ = (uae_u8) dlong; + *secdata++ = (uint8_t) (dlong >> 24); + *secdata++ = (uint8_t) (dlong >> 16); + *secdata++ = (uint8_t) (dlong >> 8); + *secdata++ = (uint8_t) dlong; chksum ^= odd ^ even; } mbuf += 256 * 2; @@ -831,10 +834,10 @@ static int amiga_check_track (FDI *fdi) #endif static void -amiga_data_raw(FDI *fdi, uae_u8 *secbuf, uae_u8 *crc, int len) +amiga_data_raw(FDI *fdi, uint8_t *secbuf, uint8_t *crc, int len) { - int i; - uae_u8 crcbuf[4]; + int i; + uint8_t crcbuf[4]; if (!crc) { memset(crcbuf, 0, 4); @@ -848,11 +851,11 @@ amiga_data_raw(FDI *fdi, uae_u8 *secbuf, uae_u8 *crc, int len) } static void -amiga_data(FDI *fdi, uae_u8 *secbuf) +amiga_data(FDI *fdi, uint8_t *secbuf) { - uae_u16 mfmbuf[4 + 512]; - uae_u32 dodd, deven, dck; - int i; + uint16_t mfmbuf[4 + 512]; + uint32_t dodd, deven, dck; + int i; for (i = 0; i < 512; i += 4) { deven = ((secbuf[i + 0] << 24) | (secbuf[i + 1] << 16) @@ -860,10 +863,10 @@ amiga_data(FDI *fdi, uae_u8 *secbuf) dodd = deven >> 1; deven &= 0x55555555; dodd &= 0x55555555; - mfmbuf[(i >> 1) + 4] = (uae_u16) (dodd >> 16); - mfmbuf[(i >> 1) + 5] = (uae_u16) dodd; - mfmbuf[(i >> 1) + 256 + 4] = (uae_u16) (deven >> 16); - mfmbuf[(i >> 1) + 256 + 5] = (uae_u16) deven; + mfmbuf[(i >> 1) + 4] = (uint16_t) (dodd >> 16); + mfmbuf[(i >> 1) + 5] = (uint16_t) dodd; + mfmbuf[(i >> 1) + 256 + 4] = (uint16_t) (deven >> 16); + mfmbuf[(i >> 1) + 256 + 5] = (uint16_t) deven; } dck = 0; for (i = 4; i < 4 + 512; i += 2) @@ -872,22 +875,22 @@ amiga_data(FDI *fdi, uae_u8 *secbuf) dodd >>= 1; deven &= 0x55555555; dodd &= 0x55555555; - mfmbuf[0] = (uae_u16) (dodd >> 16); - mfmbuf[1] = (uae_u16) dodd; - mfmbuf[2] = (uae_u16) (deven >> 16); - mfmbuf[3] = (uae_u16) deven; + mfmbuf[0] = (uint16_t) (dodd >> 16); + mfmbuf[1] = (uint16_t) dodd; + mfmbuf[2] = (uint16_t) (deven >> 16); + mfmbuf[3] = (uint16_t) deven; for (i = 0; i < 4 + 512; i++) word_post_mfm_add(fdi, mfmbuf[i]); } static void -amiga_sector_header(FDI *fdi, uae_u8 *header, uae_u8 *data, int sector, int untilgap) +amiga_sector_header(FDI *fdi, uint8_t *header, uint8_t *data, int sector, int untilgap) { - uae_u8 headerbuf[4], databuf[16]; - uae_u32 deven, dodd, hck; - uae_u16 mfmbuf[24]; - int i; + uint8_t headerbuf[4], databuf[16]; + uint32_t deven, dodd, hck; + uint16_t mfmbuf[24]; + int i; byte_mfm_add(fdi, 0); byte_mfm_add(fdi, 0); @@ -897,9 +900,9 @@ amiga_sector_header(FDI *fdi, uae_u8 *header, uae_u8 *data, int sector, int unti memcpy(headerbuf, header, 4); } else { headerbuf[0] = 0xff; - headerbuf[1] = (uae_u8) fdi->current_track; - headerbuf[2] = (uae_u8) sector; - headerbuf[3] = (uae_u8) untilgap; + headerbuf[1] = (uint8_t) fdi->current_track; + headerbuf[2] = (uint8_t) sector; + headerbuf[3] = (uint8_t) untilgap; } if (data) memcpy(databuf, data, 16); @@ -911,20 +914,20 @@ amiga_sector_header(FDI *fdi, uae_u8 *header, uae_u8 *data, int sector, int unti dodd = deven >> 1; deven &= 0x55555555; dodd &= 0x55555555; - mfmbuf[0] = (uae_u16) (dodd >> 16); - mfmbuf[1] = (uae_u16) dodd; - mfmbuf[2] = (uae_u16) (deven >> 16); - mfmbuf[3] = (uae_u16) deven; + mfmbuf[0] = (uint16_t) (dodd >> 16); + mfmbuf[1] = (uint16_t) dodd; + mfmbuf[2] = (uint16_t) (deven >> 16); + mfmbuf[3] = (uint16_t) deven; for (i = 0; i < 16; i += 4) { deven = ((databuf[i] << 24) | (databuf[i + 1] << 16) | (databuf[i + 2] << 8) | (databuf[i + 3])); dodd = deven >> 1; deven &= 0x55555555; dodd &= 0x55555555; - mfmbuf[(i >> 1) + 0 + 4] = (uae_u16) (dodd >> 16); - mfmbuf[(i >> 1) + 0 + 5] = (uae_u16) dodd; - mfmbuf[(i >> 1) + 8 + 4] = (uae_u16) (deven >> 16); - mfmbuf[(i >> 1) + 8 + 5] = (uae_u16) deven; + mfmbuf[(i >> 1) + 0 + 4] = (uint16_t) (dodd >> 16); + mfmbuf[(i >> 1) + 0 + 5] = (uint16_t) dodd; + mfmbuf[(i >> 1) + 8 + 4] = (uint16_t) (deven >> 16); + mfmbuf[(i >> 1) + 8 + 5] = (uint16_t) deven; } hck = 0; for (i = 0; i < 4 + 16; i += 2) @@ -933,10 +936,10 @@ amiga_sector_header(FDI *fdi, uae_u8 *header, uae_u8 *data, int sector, int unti dodd >>= 1; deven &= 0x55555555; dodd &= 0x55555555; - mfmbuf[20] = (uae_u16) (dodd >> 16); - mfmbuf[21] = (uae_u16) dodd; - mfmbuf[22] = (uae_u16) (deven >> 16); - mfmbuf[23] = (uae_u16) deven; + mfmbuf[20] = (uint16_t) (dodd >> 16); + mfmbuf[21] = (uint16_t) dodd; + mfmbuf[22] = (uint16_t) (deven >> 16); + mfmbuf[23] = (uint16_t) deven; for (i = 0; i < 4 + 16 + 4; i++) word_post_mfm_add(fdi, mfmbuf[i]); @@ -1018,11 +1021,11 @@ s27(FDI *fdi) /* IBM */ /* *** */ -static uae_u16 -ibm_crc(uae_u8 byte, int reset) +static uint16_t +ibm_crc(uint8_t byte, int reset) { - static uae_u16 crc; - int i; + static uint16_t crc; + int i; if (reset) crc = 0xcdb4; @@ -1042,11 +1045,11 @@ ibm_crc(uae_u8 byte, int reset) } static void -ibm_data(FDI *fdi, uae_u8 *data, uae_u8 *crc, int len) +ibm_data(FDI *fdi, uint8_t *data, uint8_t *crc, int len) { - int i; - uae_u8 crcbuf[2]; - uae_u16 crcv = 0; + int i; + uint8_t crcbuf[2]; + uint16_t crcv = 0; word_add(fdi, 0x4489); word_add(fdi, 0x4489); @@ -1059,20 +1062,20 @@ ibm_data(FDI *fdi, uae_u8 *data, uae_u8 *crc, int len) } if (!crc) { crc = crcbuf; - crc[0] = (uae_u8) (crcv >> 8); - crc[1] = (uae_u8) crcv; + crc[0] = (uint8_t) (crcv >> 8); + crc[1] = (uint8_t) crcv; } byte_mfm_add(fdi, crc[0]); byte_mfm_add(fdi, crc[1]); } static void -ibm_sector_header(FDI *fdi, uae_u8 *data, uae_u8 *crc, int secnum, int pre) +ibm_sector_header(FDI *fdi, uint8_t *data, uint8_t *crc, int secnum, int pre) { - uae_u8 secbuf[5]; - uae_u8 crcbuf[2]; - uae_u16 crcv; - int i; + uint8_t secbuf[5]; + uint8_t crcbuf[2]; + uint16_t crcv; + int i; if (pre) bytes_mfm_add(fdi, 0, 12); @@ -1081,9 +1084,9 @@ ibm_sector_header(FDI *fdi, uae_u8 *data, uae_u8 *crc, int secnum, int pre) word_add(fdi, 0x4489); secbuf[0] = 0xfe; if (secnum >= 0) { - secbuf[1] = (uae_u8) (fdi->current_track / 2); - secbuf[2] = (uae_u8) (fdi->current_track % 2); - secbuf[3] = (uae_u8) secnum; + secbuf[1] = (uint8_t) (fdi->current_track / 2); + secbuf[2] = (uint8_t) (fdi->current_track % 2); + secbuf[3] = (uint8_t) secnum; secbuf[4] = 2; } else { memcpy(secbuf + 1, data, 4); @@ -1096,8 +1099,8 @@ ibm_sector_header(FDI *fdi, uae_u8 *data, uae_u8 *crc, int secnum, int pre) if (crc) { memcpy(crcbuf, crc, 2); } else { - crcbuf[0] = (uae_u8) (crcv >> 8); - crcbuf[1] = (uae_u8) crcv; + crcbuf[0] = (uint8_t) (crcv >> 8); + crcbuf[1] = (uint8_t) crcv; } /* data */ for (i = 0; i < 5; i++) @@ -1276,8 +1279,8 @@ track_amiga(struct fdi *fdi, int first_sector, int max_sector) static void track_atari_st(struct fdi *fdi, int max_sector) { - int i, gap3 = 0; - uae_u8 *p = fdi->track_src; + int i, gap3 = 0; + uint8_t *p = fdi->track_src; switch (max_sector) { case 9: @@ -1301,8 +1304,8 @@ track_atari_st(struct fdi *fdi, int max_sector) static void track_pc(struct fdi *fdi, int max_sector) { - int i, gap3; - uae_u8 *p = fdi->track_src; + int i, gap3; + uint8_t *p = fdi->track_src; switch (max_sector) { case 8: @@ -1331,7 +1334,7 @@ track_pc(struct fdi *fdi, int max_sector) static void track_amiga_dd(struct fdi *fdi) { - uae_u8 *p = fdi->track_src; + uint8_t *p = fdi->track_src; track_amiga(fdi, fdi->track_len >> 4, 11); fdi->track_src = p + (fdi->track_len & 15) * 512; } @@ -1339,7 +1342,7 @@ track_amiga_dd(struct fdi *fdi) static void track_amiga_hd(struct fdi *fdi) { - uae_u8 *p = fdi->track_src; + uint8_t *p = fdi->track_src; track_amiga(fdi, 0, 22); fdi->track_src = p + fdi->track_len * 256; } @@ -1420,8 +1423,8 @@ static int handle_sectors_described_track(FDI *fdi) { #ifdef ENABLE_FDI2RAW_LOG - int oldout; - uae_u8 *start_src = fdi->track_src; + int oldout; + uint8_t *start_src = fdi->track_src; #endif fdi->encoding_type = *fdi->track_src++; fdi->index_offset = get_u32(fdi->track_src); @@ -1454,20 +1457,20 @@ handle_sectors_described_track(FDI *fdi) return fdi->out; } -static uae_u8 * -fdi_decompress(int pulses, uae_u8 *sizep, uae_u8 *src, int *dofree) +static uint8_t * +fdi_decompress(int pulses, uint8_t *sizep, uint8_t *src, int *dofree) { - uae_u32 size = get_u24(sizep); - uae_u32 *dst2; - int len = size & 0x3fffff; - uae_u8 *dst; - int mode = size >> 22, i; + uint32_t size = get_u24(sizep); + uint32_t *dst2; + int len = size & 0x3fffff; + uint8_t *dst; + int mode = size >> 22, i; *dofree = 0; if (mode == 0 && pulses * 2 > len) mode = 1; if (mode == 0) { - dst2 = (uae_u32 *) src; + dst2 = (uint32_t *) src; dst = src; for (i = 0; i < pulses; i++) { *dst2++ = get_u32(src); @@ -1484,7 +1487,7 @@ fdi_decompress(int pulses, uae_u8 *sizep, uae_u8 *src, int *dofree) } static void -dumpstream(int track, uae_u8 *stream, int len) +dumpstream(int track, uint8_t *stream, int len) { #if 0 char name[100]; @@ -1499,8 +1502,8 @@ dumpstream(int track, uae_u8 *stream, int len) static int bitoffset; -STATIC_INLINE void -addbit(uae_u8 *p, int bit) +static inline void +addbit(uint8_t *p, int bit) { int off1 = bitoffset / 8; int off2 = bitoffset % 8; @@ -1517,7 +1520,7 @@ struct pulse_sample { static int pulse_limitval = 15; /* tolerance of 15% */ static struct pulse_sample psarray[FDI_MAX_ARRAY]; static int array_index; -static unsigned long total; +static uint32_t total; static int totaldiv; static void @@ -1536,7 +1539,7 @@ init_array(uint32_t standard_MFM_2_bit_cell_size, int nb_of_bits) #if 0 -static void fdi2_decode (FDI *fdi, uint32_t totalavg, uae_u32 *avgp, uae_u32 *minp, uae_u32 *maxp, uae_u8 *idx, int maxidx, int *indexoffsetp, int pulses, int mfm) +static void fdi2_decode (FDI *fdi, uint32_t totalavg, uint32_t *avgp, uint32_t *minp, uint32_t *maxp, uint8_t *idx, int maxidx, int *indexoffsetp, int pulses, int mfm) { uint32_t adjust; uint32_t adjusted_pulse; @@ -1544,9 +1547,9 @@ static void fdi2_decode (FDI *fdi, uint32_t totalavg, uae_u32 *avgp, uae_u32 *mi uint32_t standard_MFM_8_bit_cell_size = totalavg / 12500; int real_size, i, j, eodat, outstep; int indexoffset = *indexoffsetp; - uae_u8 *d = fdi->track_dst_buffer; - uae_u16 *pt = fdi->track_dst_buffer_timing; - uae_u32 ref_pulse, pulse; + uint8_t *d = fdi->track_dst_buffer; + uint16_t *pt = fdi->track_dst_buffer_timing; + uint32_t ref_pulse, pulse; /* detects a long-enough stable pulse coming just after another stable pulse */ i = 1; @@ -1570,8 +1573,8 @@ static void fdi2_decode (FDI *fdi, uint32_t totalavg, uae_u32 *avgp, uae_u32 *mi while (outstep < 2) { /* calculates the current average bitrate from previous decoded data */ - uae_u32 avg_size = (total << 3) / totaldiv; /* this is the new average size for one MFM bit */ - /* uae_u32 avg_size = (uae_u32)((((float)total)*8.0) / ((float)totaldiv)); */ + uint32_t avg_size = (total << 3) / totaldiv; /* this is the new average size for one MFM bit */ + /* uint32_t avg_size = (uint32_t)((((float)total)*8.0) / ((float)totaldiv)); */ /* you can try tighter ranges than 25%, or wider ranges. I would probably go for tighter... */ if ((avg_size < (standard_MFM_8_bit_cell_size - (pulse_limitval * standard_MFM_8_bit_cell_size / 100))) || (avg_size > (standard_MFM_8_bit_cell_size + (pulse_limitval * standard_MFM_8_bit_cell_size / 100)))) { @@ -1641,7 +1644,7 @@ static void fdi2_decode (FDI *fdi, uint32_t totalavg, uae_u32 *avgp, uae_u32 *mi addbit (d, 0); addbit (d, 1); for (j = 0; j < real_size; j++) - *pt++ = (uae_u16)(pulse / real_size); + *pt++ = (uint16_t)(pulse / real_size); } /* prepares for the next pulse */ @@ -1663,18 +1666,18 @@ static void fdi2_decode (FDI *fdi, uint32_t totalavg, uae_u32 *avgp, uae_u32 *mi #else static void -fdi2_decode(FDI *fdi, uint32_t totalavg, uae_u32 *avgp, uae_u32 *minp, uae_u32 *maxp, uae_u8 *idx, int maxidx, int *indexoffsetp, int pulses, int mfm) +fdi2_decode(FDI *fdi, uint32_t totalavg, uint32_t *avgp, uint32_t *minp, uint32_t *maxp, uint8_t *idx, int maxidx, int *indexoffsetp, int pulses, int mfm) { - uint32_t adjust; - uint32_t adjusted_pulse; - uint32_t standard_MFM_2_bit_cell_size = totalavg / 50000; - uint32_t standard_MFM_8_bit_cell_size = totalavg / 12500; - int real_size, i, j, nexti, eodat, outstep, randval; - int indexoffset = *indexoffsetp; - uae_u8 *d = fdi->track_dst_buffer; - uae_u16 *pt = fdi->track_dst_buffer_timing; - uae_u32 ref_pulse, pulse; - long jitter; + uint32_t adjust; + uint32_t adjusted_pulse; + uint32_t standard_MFM_2_bit_cell_size = totalavg / 50000; + uint32_t standard_MFM_8_bit_cell_size = totalavg / 12500; + int real_size, i, j, nexti, eodat, outstep, randval; + int indexoffset = *indexoffsetp; + uint8_t *d = fdi->track_dst_buffer; + uint16_t *pt = fdi->track_dst_buffer_timing; + uint32_t ref_pulse, pulse; + int32_t jitter; /* detects a long-enough stable pulse coming just after another stable pulse */ i = 1; @@ -1698,8 +1701,8 @@ fdi2_decode(FDI *fdi, uint32_t totalavg, uae_u32 *avgp, uae_u32 *minp, uae_u32 * while (outstep < 2) { /* calculates the current average bitrate from previous decoded data */ - uae_u32 avg_size = (total << (2 + mfm)) / totaldiv; /* this is the new average size for one MFM bit */ - /* uae_u32 avg_size = (uae_u32)((((float)total)*((float)(mfm+1))*4.0) / ((float)totaldiv)); */ + uint32_t avg_size = (uint32_t) ((total << (2 + mfm)) / totaldiv); /* this is the new average size for one MFM bit */ + /* uint32_t avg_size = (uint32_t)((((float)total)*((float)(mfm+1))*4.0) / ((float)totaldiv)); */ /* you can try tighter ranges than 25%, or wider ranges. I would probably go for tighter... */ if ((avg_size < (standard_MFM_8_bit_cell_size - (pulse_limitval * standard_MFM_8_bit_cell_size / 100))) || (avg_size > (standard_MFM_8_bit_cell_size + (pulse_limitval * standard_MFM_8_bit_cell_size / 100)))) { avg_size = standard_MFM_8_bit_cell_size; @@ -1711,7 +1714,7 @@ fdi2_decode(FDI *fdi, uint32_t totalavg, uae_u32 *avgp, uae_u32 *minp, uae_u32 * /* gets the next long-enough pulse (this may require more than one pulse) */ pulse = 0; while (pulse < ((avg_size / 4) - (avg_size / 16))) { - uae_u32 avg_pulse, min_pulse, max_pulse; + uint32_t avg_pulse, min_pulse, max_pulse; i++; if (i >= pulses) i = 0; @@ -1739,7 +1742,7 @@ fdi2_decode(FDI *fdi, uint32_t totalavg, uae_u32 *avgp, uae_u32 *minp, uae_u32 * randval = rand(); if (randval < (RAND_MAX / 2)) { if (randval > (RAND_MAX / 4)) { - if (randval <= (((3LL * RAND_MAX) / 8))) + if (randval <= (((3LL * (uint64_t) RAND_MAX) / 8))) randval = (2 * randval) - (RAND_MAX / 4); else randval = (4 * randval) - RAND_MAX; @@ -1748,7 +1751,7 @@ fdi2_decode(FDI *fdi, uint32_t totalavg, uae_u32 *avgp, uae_u32 *minp, uae_u32 * } else { randval -= RAND_MAX / 2; if (randval > (RAND_MAX / 4)) { - if (randval <= (((3LL * RAND_MAX) / 8))) + if (randval <= (((3LL * (uint64_t) RAND_MAX) / 8))) randval = (2 * randval) - (RAND_MAX / 4); else randval = (4 * randval) - RAND_MAX; @@ -1774,7 +1777,7 @@ fdi2_decode(FDI *fdi, uint32_t totalavg, uae_u32 *avgp, uae_u32 *minp, uae_u32 * randval = rand(); if (randval < (RAND_MAX / 2)) { if (randval > (RAND_MAX / 4)) { - if (randval <= (((3LL * RAND_MAX) / 8))) + if (randval <= (((3LL * (uint64_t) RAND_MAX) / 8))) randval = (2 * randval) - (RAND_MAX / 4); else randval = (4 * randval) - RAND_MAX; @@ -1783,7 +1786,7 @@ fdi2_decode(FDI *fdi, uint32_t totalavg, uae_u32 *avgp, uae_u32 *minp, uae_u32 * } else { randval -= RAND_MAX / 2; if (randval > (RAND_MAX / 4)) { - if (randval <= (((3LL * RAND_MAX) / 8))) + if (randval <= (((3LL * (uint64_t) RAND_MAX) / 8))) randval = (2 * randval) - (RAND_MAX / 4); else randval = (4 * randval) - RAND_MAX; @@ -1872,7 +1875,7 @@ fdi2_decode(FDI *fdi, uint32_t totalavg, uae_u32 *avgp, uae_u32 *minp, uae_u32 * addbit(d, 0); addbit(d, 1); for (j = 0; j < real_size; j++) - *pt++ = (uae_u16) (pulse / real_size); + *pt++ = (uint16_t) (pulse / real_size); } /* prepares for the next pulse */ @@ -1894,11 +1897,11 @@ fdi2_decode(FDI *fdi, uint32_t totalavg, uae_u32 *avgp, uae_u32 *minp, uae_u32 * #endif static void -fdi2_celltiming(FDI *fdi, uint32_t totalavg, int bitoffset, uae_u16 *out) +fdi2_celltiming(FDI *fdi, uint32_t totalavg, int bitoffset, uint16_t *out) { - uae_u16 *pt2, *pt; - double avg_bit_len; - int i; + uint16_t *pt2, *pt; + double avg_bit_len; + int i; avg_bit_len = (double) totalavg / (double) bitoffset; pt2 = fdi->track_dst_buffer_timing; @@ -1906,7 +1909,7 @@ fdi2_celltiming(FDI *fdi, uint32_t totalavg, int bitoffset, uae_u16 *out) for (i = 0; i < bitoffset / 8; i++) { double v = (pt2[0] + pt2[1] + pt2[2] + pt2[3] + pt2[4] + pt2[5] + pt2[6] + pt2[7]) / 8.0; v = 1000.0 * v / avg_bit_len; - *pt++ = (uae_u16) v; + *pt++ = (uint16_t) v; pt2 += 8; } *pt++ = out[0]; @@ -1916,14 +1919,14 @@ fdi2_celltiming(FDI *fdi, uint32_t totalavg, int bitoffset, uae_u16 *out) static int decode_lowlevel_track(FDI *fdi, int track, struct fdi_cache *cache) { - uae_u8 *p1; - uae_u32 *p2; - uae_u32 *avgp, *minp = 0, *maxp = 0; - uae_u8 *idxp = 0; - uae_u32 maxidx, totalavg, weakbits; - int i, j, len, pulses, indexoffset; - int avg_free, min_free = 0, max_free = 0, idx_free; - int idx_off1 = 0, idx_off2 = 0, idx_off3 = 0; + uint8_t *p1; + uint32_t *p2; + uint32_t *avgp, *minp = 0, *maxp = 0; + uint8_t *idxp = 0; + uint32_t maxidx, totalavg, weakbits; + int i, j, len, pulses, indexoffset; + int avg_free, min_free = 0, max_free = 0, idx_free; + int idx_off1 = 0, idx_off2 = 0, idx_off3 = 0; p1 = fdi->track_src; pulses = get_u32(p1); @@ -1931,15 +1934,15 @@ decode_lowlevel_track(FDI *fdi, int track, struct fdi_cache *cache) return -1; p1 += 4; len = 12; - avgp = (uae_u32 *) fdi_decompress(pulses, p1 + 0, p1 + len, &avg_free); - dumpstream(track, (uae_u8 *) avgp, pulses); + avgp = (uint32_t *) fdi_decompress(pulses, p1 + 0, p1 + len, &avg_free); + dumpstream(track, (uint8_t *) avgp, pulses); len += get_u24(p1 + 0) & 0x3fffff; if (!avgp) return -1; if (get_u24(p1 + 3) && get_u24(p1 + 6)) { - minp = (uae_u32 *) fdi_decompress(pulses, p1 + 3, p1 + len, &min_free); + minp = (uint32_t *) fdi_decompress(pulses, p1 + 3, p1 + len, &min_free); len += get_u24(p1 + 3) & 0x3fffff; - maxp = (uae_u32 *) fdi_decompress(pulses, p1 + 6, p1 + len, &max_free); + maxp = (uint32_t *) fdi_decompress(pulses, p1 + 6, p1 + len, &max_free); len += get_u24(p1 + 6) & 0x3fffff; /* Computes the real min and max values */ for (i = 0; i < pulses; i++) { @@ -2048,7 +2051,7 @@ decode_lowlevel_track(FDI *fdi, int track, struct fdi_cache *cache) } static unsigned char fdiid[] = { "Formatted Disk Image file" }; -static int bit_rate_table[16] = { 125, 150, 250, 300, 500, 1000 }; +static int bit_rate_table[16] = { 125, 150, 250, 300, 500, 1000 }; void fdi2raw_header_free(FDI *fdi) @@ -2106,13 +2109,13 @@ fdi2raw_get_bit_rate(FDI *fdi) return fdi->bit_rate; } -int +FDI2RawDiskType fdi2raw_get_type(FDI *fdi) { return fdi->disk_type; } -int +bool fdi2raw_get_write_protect(FDI *fdi) { return fdi->write_protect; @@ -2127,9 +2130,9 @@ fdi2raw_get_tpi(FDI *fdi) FDI * fdi2raw_header(FILE *f) { - int i, offset, oldseek; - uae_u8 type, size; - FDI *fdi; + long i, offset, oldseek; + uint8_t type, size; + FDI *fdi; fdi2raw_log("ALLOC: memory allocated %d\n", fdi_allocated); fdi = fdi_malloc(sizeof(FDI)); @@ -2167,7 +2170,7 @@ fdi2raw_header(FILE *f) fdi->last_head = fdi->header[144]; fdi->disk_type = fdi->header[145]; fdi->rotation_speed = fdi->header[146] + 128; - fdi->write_protect = fdi->header[147] & 1; + fdi->write_protect = !!(fdi->header[147] & 1); fdi2raw_log("FDI version %d.%d\n", fdi->header[140], fdi->header[141]); fdi2raw_log("last_track=%d rotation_speed=%d\n", fdi->last_track, fdi->rotation_speed); @@ -2197,8 +2200,8 @@ fdi2raw_header(FILE *f) return fdi; } -int -fdi2raw_loadrevolution_2(FDI *fdi, uae_u16 *mfmbuf, uae_u16 *tracktiming, int track, int *tracklength, int *indexoffsetp, int *multirev, int mfm) +static int +fdi2raw_loadrevolution_2(FDI *fdi, uint16_t *mfmbuf, uint16_t *tracktiming, int track, int *tracklength, int *indexoffsetp, int *multirev, int mfm) { struct fdi_cache *cache = &fdi->cache[track]; int len, i, idx; @@ -2216,8 +2219,8 @@ fdi2raw_loadrevolution_2(FDI *fdi, uae_u16 *mfmbuf, uae_u16 *tracktiming, int tr *tracklength = len; for (i = 0; i < (len + 15) / (2 * 8); i++) { - uae_u8 *data = fdi->track_dst_buffer + i * 2; - *mfmbuf++ = 256 * *data + *(data + 1); + uint8_t *data = fdi->track_dst_buffer + i * 2; + *mfmbuf++ = 256 * *data + *(data + 1); } fdi2_celltiming(fdi, cache->totalavg, len, tracktiming); if (indexoffsetp) @@ -2226,18 +2229,20 @@ fdi2raw_loadrevolution_2(FDI *fdi, uae_u16 *mfmbuf, uae_u16 *tracktiming, int tr } int -fdi2raw_loadrevolution(FDI *fdi, uae_u16 *mfmbuf, uae_u16 *tracktiming, int track, int *tracklength, int mfm) +fdi2raw_loadrevolution(FDI *fdi, uint16_t *mfmbuf, uint16_t *tracktiming, int track, int *tracklength, int mfm) { + track ^= fdi->reversed_side; return fdi2raw_loadrevolution_2(fdi, mfmbuf, tracktiming, track, tracklength, 0, 0, mfm); } int -fdi2raw_loadtrack(FDI *fdi, uae_u16 *mfmbuf, uae_u16 *tracktiming, int track, int *tracklength, int *indexoffsetp, int *multirev, int mfm) +fdi2raw_loadtrack(FDI *fdi, uint16_t *mfmbuf, uint16_t *tracktiming, int track, int *tracklength, int *indexoffsetp, int *multirev, int mfm) { - uae_u8 *p; + uint8_t *p; int outlen, i; struct fdi_cache *cache = &fdi->cache[track]; + track ^= fdi->reversed_side; if (cache->lowlevel) return fdi2raw_loadrevolution_2(fdi, mfmbuf, tracktiming, track, tracklength, indexoffsetp, multirev, mfm); @@ -2305,8 +2310,8 @@ fdi2raw_loadtrack(FDI *fdi, uae_u16 *mfmbuf, uae_u16 *tracktiming, int track, in return fdi2raw_loadrevolution_2(fdi, mfmbuf, tracktiming, track, tracklength, indexoffsetp, multirev, mfm); *tracklength = fdi->out; for (i = 0; i < ((*tracklength) + 15) / (2 * 8); i++) { - uae_u8 *data = fdi->track_dst_buffer + i * 2; - *mfmbuf++ = 256 * *data + *(data + 1); + uint8_t *data = fdi->track_dst_buffer + i * 2; + *mfmbuf++ = 256 * *data + *(data + 1); } } return outlen; diff --git a/src/include/fdi2raw.h b/src/include/fdi2raw.h index cfc1f84c3..b848b26f2 100644 --- a/src/include/fdi2raw.h +++ b/src/include/fdi2raw.h @@ -16,36 +16,66 @@ * * Copyright 2001-2004 Toni Wilen. * Copyright 2001-2004 Vincent Joguin. - * Copyright 2001 Thomas Harte. + * Copyright 2001-2016 Thomas Harte. */ #ifndef __FDI2RAW_H #define __FDI2RAW_H -#define uae_u8 uint8_t -#define uae_u16 uint16_t -#define uae_u32 uint32_t - +#include +#include #include + typedef struct fdi FDI; #ifdef __cplusplus extern "C" { #endif -extern int fdi2raw_loadtrack(FDI *, uae_u16 *mfmbuf, uae_u16 *tracktiming, int track, int *tracklength, int *indexoffset, int *multirev, int mfm); +/*! + Attempts to parse and return an FDI header from the file @c file. -extern int fdi2raw_loadrevolution(FDI *, uae_u16 *mfmbuf, uae_u16 *tracktiming, int track, int *tracklength, int mfm); + @parameter file the file from which to attempt to read the FDI. + @returns a newly-allocated `FDI` if parsing succeeded; @c NULL otherwise. +*/ +extern FDI *fdi2raw_header(FILE *file); -extern FDI *fdi2raw_header(FILE *f); -extern void fdi2raw_header_free(FDI *); -extern int fdi2raw_get_last_track(FDI *); -extern int fdi2raw_get_num_sector(FDI *); -extern int fdi2raw_get_last_head(FDI *); -extern int fdi2raw_get_type(FDI *); -extern int fdi2raw_get_bit_rate(FDI *); -extern int fdi2raw_get_rotation(FDI *); -extern int fdi2raw_get_write_protect(FDI *); -extern int fdi2raw_get_tpi(FDI *); +/*! + Release all memory associated with @c file. +*/ +extern void fdi2raw_header_free(FDI *file); + +extern int fdi2raw_loadtrack(FDI *, uint16_t *mfmbuf, uint16_t *tracktiming, int track, int *tracklength, int *indexoffset, int *multirev, int mfm); +extern int fdi2raw_loadrevolution(FDI *, uint16_t *mfmbuf, uint16_t *tracktiming, int track, int *tracklength, int mfm); + +typedef enum { + FDI2RawDiskType8Inch = 0, + FDI2RawDiskType5_25Inch = 1, + FDI2RawDiskType3_5Inch = 2, + FDI2RawDiskType3Inch = 3, +} FDI2RawDiskType; + +/// @returns the disk type described by @c fdi. +extern FDI2RawDiskType fdi2raw_get_type(FDI *fdi); + +/// @returns the bit rate at which @c fdi is sampled if spinning at the intended rate, in Kbit/s. +extern int fdi2raw_get_bit_rate(FDI *fdi); + +/// @returns the intended rotation speed of @c fdi, in rotations per minute. +extern int fdi2raw_get_rotation(FDI *fdi); + +/// @returns whether the imaged disk was write protected. +extern bool fdi2raw_get_write_protect(FDI *fdi); + +/// @returns the final enumerated track represented in @c fdi. +extern int fdi2raw_get_last_track(FDI *fdi); + +/// @returns the final enumerated head represented in @c fdi. +extern int fdi2raw_get_last_head(FDI *fdi); + +/// @returns @c 22 if track 0 is a standard Amiga high-density; @c 11 otherwise. +extern int fdi2raw_get_num_sector(FDI *fdi); + +extern int fdi2raw_get_tpi(FDI *fdi); #ifdef __cplusplus } From e75e39d95c28fe8966721eb50e638ac734e3be2f Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sat, 7 Jan 2023 13:41:04 -0500 Subject: [PATCH 132/285] Update glad to 0.1.36 --- src/include/glad/glad.h | 2 +- src/win/glad.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/include/glad/glad.h b/src/include/glad/glad.h index 0b4d36656..5b2fd13f4 100644 --- a/src/include/glad/glad.h +++ b/src/include/glad/glad.h @@ -1,6 +1,6 @@ /* - OpenGL loader generated by glad 0.1.34 on Sat Dec 4 18:46:02 2021. + OpenGL loader generated by glad 0.1.36 on Sat Jan 7 18:24:33 2023. Language/Generator: C/C++ Specification: gl diff --git a/src/win/glad.c b/src/win/glad.c index f3ceb1148..7c282ebee 100644 --- a/src/win/glad.c +++ b/src/win/glad.c @@ -1,6 +1,6 @@ /* - OpenGL loader generated by glad 0.1.34 on Sat Dec 4 18:46:02 2021. + OpenGL loader generated by glad 0.1.36 on Sat Jan 7 18:24:33 2023. Language/Generator: C/C++ Specification: gl @@ -21,10 +21,10 @@ https://glad.dav1d.de/#profile=core&language=c&specification=gl&loader=on&api=gl%3D3.0&extensions=GL_ARB_buffer_storage&extensions=GL_ARB_debug_output&extensions=GL_ARB_sync */ -#include #include #include #include +#include static void *get_proc(const char *namez); From 40bd782aeb1329cb00f4280882d0f4a33fe1fa59 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 7 Jan 2023 23:16:00 +0100 Subject: [PATCH 133/285] Win32 settings dialog secondary display selection fixes. --- src/win/win_settings.c | 57 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 52 insertions(+), 5 deletions(-) diff --git a/src/win/win_settings.c b/src/win/win_settings.c index d6e0c0693..1853c6b57 100644 --- a/src/win/win_settings.c +++ b/src/win/win_settings.c @@ -1103,7 +1103,7 @@ win_settings_video_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) settings_enable_window(hdlg, IDC_CONFIGURE_VID, video_card_has_config(e)); // Secondary Video Card - c = 0; + c = d = 0; settings_reset_content(hdlg, IDC_COMBO_VIDEO_2); while (1) { @@ -1118,12 +1118,17 @@ win_settings_video_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) if (!device_name[0]) break; + if ((c > 1) && (video_card_get_flags(c) == video_card_get_flags(temp_gfxcard))) { + c++; + continue; + } + if (video_card_available(c) && device_is_valid(video_card_getdevice(c), temp_machine)) { if (c == 0) // "None" settings_add_string(hdlg, IDC_COMBO_VIDEO_2, win_get_string(IDS_2104)); else if (c == 1) // "Internal" settings_add_string(hdlg, IDC_COMBO_VIDEO_2, win_get_string(IDS_2119)); - else if (video_card_get_flags(c) != video_card_get_flags(gfxcard)) + else settings_add_string(hdlg, IDC_COMBO_VIDEO_2, (LPARAM) device_name); settings_list_to_device[1][d] = c; if ((c == 0) || (c == temp_gfxcard_2)) @@ -1158,6 +1163,49 @@ win_settings_video_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) case IDC_COMBO_VIDEO: temp_gfxcard = settings_list_to_device[0][settings_get_cur_sel(hdlg, IDC_COMBO_VIDEO)]; settings_enable_window(hdlg, IDC_CONFIGURE_VID, video_card_has_config(temp_gfxcard)); + + // Secondary Video Card + c = d = 0; + settings_reset_content(hdlg, IDC_COMBO_VIDEO_2); + + while (1) { + /* Skip "internal" if machine doesn't have it. */ + if ((c == 1) && !machine_has_flags(temp_machine, MACHINE_VIDEO)) { + c++; + continue; + } + + generate_device_name(video_card_getdevice(c), video_get_internal_name(c), 1); + + if (!device_name[0]) + break; + + if ((c > 1) && (video_card_get_flags(c) == video_card_get_flags(temp_gfxcard))) { + c++; + continue; + } + + if (video_card_available(c) && device_is_valid(video_card_getdevice(c), temp_machine)) { + if (c == 0) // "None" + settings_add_string(hdlg, IDC_COMBO_VIDEO_2, win_get_string(IDS_2104)); + else if (c == 1) // "Internal" + settings_add_string(hdlg, IDC_COMBO_VIDEO_2, win_get_string(IDS_2119)); + else + settings_add_string(hdlg, IDC_COMBO_VIDEO_2, (LPARAM) device_name); + settings_list_to_device[1][d] = c; + if ((c == 0) || (c == temp_gfxcard_2)) + settings_set_cur_sel(hdlg, IDC_COMBO_VIDEO_2, d); + d++; + } + + c++; + + settings_process_messages(); + } + + settings_enable_window(hdlg, IDC_COMBO_VIDEO_2, !machine_has_flags(temp_machine, MACHINE_VIDEO_ONLY)); + e = settings_list_to_device[1][settings_get_cur_sel(hdlg, IDC_COMBO_VIDEO_2)]; + settings_enable_window(hdlg, IDC_CONFIGURE_VID_2, video_card_has_config(e)); break; case IDC_COMBO_VIDEO_2: @@ -1184,11 +1232,10 @@ win_settings_video_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) break; case IDC_BUTTON_XGA: - if (machine_has_bus(temp_machine, MACHINE_BUS_MCA) > 0) { + if (machine_has_bus(temp_machine, MACHINE_BUS_MCA) > 0) temp_deviceconfig |= deviceconfig_open(hdlg, (void *) &xga_device); - } else { + else temp_deviceconfig |= deviceconfig_open(hdlg, (void *) &xga_isa_device); - } break; case IDC_CONFIGURE_VID: From e5496e2638235e5ddff50f5721d17548a9c370c7 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Sat, 7 Jan 2023 23:48:45 +0100 Subject: [PATCH 134/285] Overhauled CD-ROM selection for SCSI and ATAPI, including model and vendor specific commands. Fixed the Spock SCSI ID selection. Fixed CD Audio on NCR 5380-based SCSI controllers. Added a proprietary CD-ROM controller selection (not hooked up yet). All on qt only. --- src/86box.c | 4 + src/cdrom/cdrom.c | 535 ++++++++-- src/config.c | 41 +- src/include/86box/cdrom.h | 69 +- src/include/86box/cdrom_interface.h | 31 + src/include/86box/scsi_cdrom.h | 4 + src/include/86box/scsi_device.h | 54 +- src/qt/qt_harddrive_common.cpp | 8 +- src/qt/qt_machinestatus.cpp | 3 + src/qt/qt_mediamenu.cpp | 3 + src/qt/qt_settingsfloppycdrom.cpp | 113 +- src/qt/qt_settingsfloppycdrom.hpp | 3 +- src/qt/qt_settingsfloppycdrom.ui | 29 +- src/qt/qt_settingsstoragecontrollers.cpp | 49 +- src/qt/qt_settingsstoragecontrollers.hpp | 2 + src/qt/qt_settingsstoragecontrollers.ui | 25 +- src/scsi/scsi_cdrom.c | 1236 ++++++++++++++++++---- src/scsi/scsi_ncr5380.c | 55 +- src/scsi/scsi_spock.c | 150 +-- 19 files changed, 1941 insertions(+), 473 deletions(-) create mode 100644 src/include/86box/cdrom_interface.h diff --git a/src/86box.c b/src/86box.c index 147233b21..7beef9333 100644 --- a/src/86box.c +++ b/src/86box.c @@ -1068,6 +1068,10 @@ pc_reset_hard_init(void) /* Reset the Hard Disk Controller module. */ hdc_reset(); + + /* Reset the CD-ROM Controller module. */ + cdrom_interface_reset(); + /* Reset and reconfigure the SCSI layer. */ scsi_card_init(); diff --git a/src/cdrom/cdrom.c b/src/cdrom/cdrom.c index dd1604801..37795b845 100644 --- a/src/cdrom/cdrom.c +++ b/src/cdrom/cdrom.c @@ -23,9 +23,12 @@ #include #define HAVE_STDARG_H #include <86box/86box.h> +#include <86box/device.h> #include <86box/config.h> #include <86box/cdrom.h> #include <86box/cdrom_image.h> +#include <86box/cdrom_interface.h> +#include <86box/cdrom_mitsumi.h> #include <86box/plat.h> #include <86box/scsi.h> #include <86box/scsi_device.h> @@ -43,9 +46,6 @@ #define MIN_SEEK 2000 #define MAX_SEEK 333333 -#define CD_BCD(x) (((x) % 10) | (((x) / 10) << 4)) -#define CD_DCB(x) ((((x) &0xf0) >> 4) * 10 + ((x) &0x0f)) - #pragma pack(push, 1) typedef struct { uint8_t user_data[2048], @@ -94,6 +94,8 @@ static uint8_t extra_buffer[296]; cdrom_t cdrom[CDROM_NUM]; +int cdrom_interface_current; + #ifdef ENABLE_CDROM_LOG int cdrom_do_log = ENABLE_CDROM_LOG; @@ -112,6 +114,145 @@ cdrom_log(const char *fmt, ...) # define cdrom_log(fmt, ...) #endif +static const device_t cdrom_interface_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 *device; +} controllers[] = { + // clang-format off + { &cdrom_interface_none_device }, + { NULL } + // clang-format on +}; + +/* Reset the CD-ROM Interface, whichever one that is. */ +void +cdrom_interface_reset(void) +{ + cdrom_log("CD-ROM Interface: reset(current=%d)\n", + cdrom_interface_current); + + /* If we have a valid controller, add its device. */ + if (!controllers[cdrom_interface_current].device) + return; + + device_add(controllers[cdrom_interface_current].device); +} + +char * +cdrom_interface_get_internal_name(int cdinterface) +{ + return device_get_internal_name(controllers[cdinterface].device); +} + +int +cdrom_interface_get_from_internal_name(char *s) +{ + int c = 0; + + while (controllers[c].device != NULL) { + if (!strcmp((char *) controllers[c].device->internal_name, s)) + return c; + c++; + } + + return 0; +} + +const device_t * +cdrom_interface_get_device(int cdinterface) +{ + return (controllers[cdinterface].device); +} + +int +cdrom_interface_has_config(int cdinterface) +{ + const device_t *dev = cdrom_interface_get_device(cdinterface); + + if (dev == NULL) + return (0); + + if (!device_has_config(dev)) + return (0); + + return (1); +} + +int +cdrom_interface_get_flags(int cdinterface) +{ + return (controllers[cdinterface].device->flags); +} + +int +cdrom_interface_available(int cdinterface) +{ + return (device_available(controllers[cdinterface].device)); +} + +char * +cdrom_getname(int type) +{ + return (char *) cdrom_drive_types[type].name; +} + +char * +cdrom_get_internal_name(int type) +{ + return (char *) cdrom_drive_types[type].internal_name; +} + +int +cdrom_get_from_internal_name(char *s) +{ + int c = 0; + + while (strlen(cdrom_drive_types[c].internal_name)) { + if (!strcmp((char *) cdrom_drive_types[c].internal_name, s)) + return c; + c++; + } + + return 0; +} + +void +cdrom_set_type(int model, int type) +{ + cdrom[model].type = type; +} + +int +cdrom_get_type(int model) +{ + return cdrom[model].type; +} + +static __inline int +bin2bcd(int x) +{ + return (x % 10) | ((x / 10) << 4); +} + +static __inline int +bcd2bin(int x) +{ + return (x >> 4) * 10 + (x & 0x0f); +} + int cdrom_lba_to_msf_accurate(int lba) { @@ -258,12 +399,26 @@ cdrom_stop(cdrom_t *dev) } void -cdrom_seek(cdrom_t *dev, uint32_t pos) +cdrom_seek(cdrom_t *dev, uint32_t pos, uint8_t vendor_type) { + int m, s, f; + if (!dev) return; - cdrom_log("CD-ROM %i: Seek to LBA %08X\n", dev->id, pos); + cdrom_log("CD-ROM %i: Seek to LBA %08X, vendor type = %02x.\n", dev->id, pos, vendor_type); + + switch (vendor_type) { + case 0x40: + m = bcd2bin((pos >> 24) & 0xff); + s = bcd2bin((pos >> 16) & 0xff); + f = bcd2bin((pos >> 8) & 0xff); + pos = MSFtoLBA(m, s, f) - 150; + break; + case 0x80: + pos = bcd2bin((pos >> 24) & 0xff); + break; + } dev->seek_pos = pos; cdrom_stop(dev); @@ -323,18 +478,6 @@ cdrom_audio_callback(cdrom_t *dev, int16_t *output, int len) return ret; } -static __inline int -bin2bcd(int x) -{ - return (x % 10) | ((x / 10) << 4); -} - -static __inline int -bcd2bin(int x) -{ - return (x >> 4) * 10 + (x & 0x0f); -} - static void msf_from_bcd(int *m, int *s, int *f) { @@ -365,20 +508,22 @@ cdrom_audio_play(cdrom_t *dev, uint32_t pos, uint32_t len, int ismsf) /* Track-relative audio play. */ dev->ops->get_track_info(dev, ismsf & 0xff, 0, &ti); pos += MSFtoLBA(ti.m, ti.s, ti.f) - 150; - } else if (ismsf == 2) { + } else if ((ismsf == 2) || (ismsf == 3)) { dev->ops->get_track_info(dev, pos, 0, &ti); pos = MSFtoLBA(ti.m, ti.s, ti.f) - 150; - /* We have to end at the *end* of the specified track, - not at the beginning. */ - dev->ops->get_track_info(dev, len, 1, &ti); - len = MSFtoLBA(ti.m, ti.s, ti.f) - 150; + if (ismsf == 2) { + /* We have to end at the *end* of the specified track, + not at the beginning. */ + dev->ops->get_track_info(dev, len, 1, &ti); + len = MSFtoLBA(ti.m, ti.s, ti.f) - 150; + } } else if (ismsf == 1) { m = (pos >> 16) & 0xff; s = (pos >> 8) & 0xff; f = pos & 0xff; /* NEC CDR-260 speaks BCD. */ - if ((dev->bus_type == CDROM_BUS_ATAPI) && dev->early) + if (!strcmp(cdrom_drive_types[dev->type].internal_name, "NEC_CD-ROM_DRIVE260_1.01") || (!strcmp(cdrom_drive_types[dev->type].internal_name, "NEC_CD-ROM_DRIVE260_1.00"))) /*NEC*/ msf_from_bcd(&m, &s, &f); if (pos == 0xffffff) { @@ -392,7 +537,7 @@ cdrom_audio_play(cdrom_t *dev, uint32_t pos, uint32_t len, int ismsf) f = len & 0xff; /* NEC CDR-260 speaks BCD. */ - if ((dev->bus_type == CDROM_BUS_ATAPI) && dev->early) + if (!strcmp(cdrom_drive_types[dev->type].internal_name, "NEC_CD-ROM_DRIVE260_1.01") || (!strcmp(cdrom_drive_types[dev->type].internal_name, "NEC_CD-ROM_DRIVE260_1.00"))) /*NEC*/ msf_from_bcd(&m, &s, &f); len = MSFtoLBA(m, s, f) - 150; @@ -434,33 +579,41 @@ cdrom_audio_track_search(cdrom_t *dev, uint32_t pos, int type, uint8_t playbit) switch (type) { case 0x00: if (pos == 0xffffffff) { - cdrom_log("CD-ROM %i: Search from current position\n", dev->id); + cdrom_log("CD-ROM %i: (type 0) Search from current position\n", dev->id); pos = dev->seek_pos; } + dev->seek_pos = pos; break; case 0x40: - m = CD_DCB((pos >> 24) & 0xff); - s = CD_DCB((pos >> 16) & 0xff); - f = CD_DCB((pos >> 8) & 0xff); + m = bcd2bin((pos >> 24) & 0xff); + s = bcd2bin((pos >> 16) & 0xff); + f = bcd2bin((pos >> 8) & 0xff); if (pos == 0xffffffff) { - cdrom_log("CD-ROM %i: Search from current position\n", dev->id); + cdrom_log("CD-ROM %i: (type 1) Search from current position\n", dev->id); pos = dev->seek_pos; } else pos = MSFtoLBA(m, s, f) - 150; + + dev->seek_pos = pos; + break; + case 0x80: + if (pos == 0xffffffff) { + cdrom_log("CD-ROM %i: (type 2) Search from current position\n", dev->id); + pos = dev->seek_pos; + } + dev->seek_pos = (pos >> 24) & 0xff; break; } /* Unlike standard commands, if there's a data track on an Audio CD (mixed mode) the playback continues with the audio muted (Toshiba CD-ROM SCSI-2 manual reference). */ - - dev->seek_pos = pos; dev->cd_buflen = 0; dev->cd_status = playbit ? CD_STATUS_PLAYING : CD_STATUS_PAUSED; return 1; } uint8_t -cdrom_toshiba_audio_play(cdrom_t *dev, uint32_t pos, int type) +cdrom_audio_play_toshiba(cdrom_t *dev, uint32_t pos, int type) { int m = 0, s = 0, f = 0; @@ -468,31 +621,85 @@ cdrom_toshiba_audio_play(cdrom_t *dev, uint32_t pos, int type) return 0; /*Preliminary support, revert if too incomplete*/ - cdrom_log("Toshiba Play Audio: MSF = %06x, cdstatus = %02x\n", pos, dev->cd_status); switch (type) { + case 0x00: + dev->cd_end = pos; + break; case 0x40: - m = CD_DCB((pos >> 24) & 0xff); - s = CD_DCB((pos >> 16) & 0xff); - f = CD_DCB((pos >> 8) & 0xff); + m = bcd2bin((pos >> 24) & 0xff); + s = bcd2bin((pos >> 16) & 0xff); + f = bcd2bin((pos >> 8) & 0xff); pos = MSFtoLBA(m, s, f) - 150; + dev->cd_end = pos; + break; + case 0x80: + dev->cd_end = (pos >> 24) & 0xff; break; case 0xc0: if (pos == 0xffffffff) { cdrom_log("CD-ROM %i: Playing from current position\n", dev->id); pos = dev->cd_end; } + dev->cd_end = pos; break; } + cdrom_log("Toshiba/NEC Play Audio: MSF = %06x, type = %02x, cdstatus = %02x\n", pos, type, dev->cd_status); + /* Unlike standard commands, if there's a data track on an Audio CD (mixed mode) the playback continues with the audio muted (Toshiba CD-ROM SCSI-2 manual reference). */ - dev->cd_end = pos; dev->cd_buflen = 0; dev->cd_status = CD_STATUS_PLAYING; return 1; } +uint8_t +cdrom_audio_scan(cdrom_t *dev, uint32_t pos, int type) +{ + int m = 0, s = 0, f = 0; + + if (dev->cd_status == CD_STATUS_DATA_ONLY) + return 0; + + cdrom_log("Audio Scan: MSF = %06x, type = %02x\n", pos, type); + switch (type) { + case 0x00: + if (pos == 0xffffffff) { + cdrom_log("CD-ROM %i: (type 0) Search from current position\n", dev->id); + pos = dev->seek_pos; + } + dev->seek_pos = pos; + break; + case 0x40: + m = bcd2bin((pos >> 24) & 0xff); + s = bcd2bin((pos >> 16) & 0xff); + f = bcd2bin((pos >> 8) & 0xff); + if (pos == 0xffffffff) { + cdrom_log("CD-ROM %i: (type 1) Search from current position\n", dev->id); + pos = dev->seek_pos; + } else + pos = MSFtoLBA(m, s, f) - 150; + + dev->seek_pos = pos; + break; + case 0x80: + dev->seek_pos = (pos >> 24) & 0xff; + break; + } + + /* Do this at this point, since it's at this point that we know the + actual LBA position to start playing from. */ + if (!(dev->ops->track_type(dev, pos) & CD_TRACK_AUDIO)) { + cdrom_log("CD-ROM %i: LBA %08X not on an audio track\n", dev->id, pos); + cdrom_stop(dev); + return 0; + } + + dev->cd_buflen = 0; + return 1; +} + void cdrom_audio_pause_resume(cdrom_t *dev, uint8_t resume) { @@ -509,7 +716,6 @@ cdrom_get_current_subchannel(cdrom_t *dev, uint8_t *b, int msf) uint32_t dat; dev->ops->get_subchannel(dev, dev->seek_pos, &subc); - cdrom_log("CD-ROM %i: Returned subchannel at %02i:%02i.%02i\n", subc.abs_m, subc.abs_s, subc.abs_f); if (dev->cd_status == CD_STATUS_DATA_ONLY) ret = 0x15; @@ -522,8 +728,12 @@ cdrom_get_current_subchannel(cdrom_t *dev, uint8_t *b, int msf) ret = 0x13; } - if (b[pos] > 1) + cdrom_log("CD-ROM %i: Returned subchannel at %02i:%02i.%02i, ret = %02x, seek pos = %08x, cd_end = %08x.\n", dev->id, subc.abs_m, subc.abs_s, subc.abs_f, ret, dev->seek_pos, dev->cd_end); + + if (b[pos] > 1) { + cdrom_log("B[%i] = %02x, ret = %02x.\n", pos, b[pos], ret); return ret; + } b[pos++] = subc.attr; b[pos++] = subc.track; @@ -533,7 +743,7 @@ cdrom_get_current_subchannel(cdrom_t *dev, uint8_t *b, int msf) b[pos] = 0; /* NEC CDR-260 speaks BCD. */ - if ((dev->bus_type == CDROM_BUS_ATAPI) && dev->early) { + if (!strcmp(cdrom_drive_types[dev->type].internal_name, "NEC_CD-ROM_DRIVE260_1.01") || (!strcmp(cdrom_drive_types[dev->type].internal_name, "NEC_CD-ROM_DRIVE260_1.00"))) /*NEC*/ { m = subc.abs_m; s = subc.abs_s; f = subc.abs_f; @@ -552,7 +762,7 @@ cdrom_get_current_subchannel(cdrom_t *dev, uint8_t *b, int msf) b[pos] = 0; /* NEC CDR-260 speaks BCD. */ - if ((dev->bus_type == CDROM_BUS_ATAPI) && dev->early) { + if (!strcmp(cdrom_drive_types[dev->type].internal_name, "NEC_CD-ROM_DRIVE260_1.01") || (!strcmp(cdrom_drive_types[dev->type].internal_name, "NEC_CD-ROM_DRIVE260_1.00"))) /*NEC*/ { m = subc.rel_m; s = subc.rel_s; f = subc.rel_f; @@ -583,6 +793,78 @@ cdrom_get_current_subchannel(cdrom_t *dev, uint8_t *b, int msf) return ret; } +void +cdrom_get_current_subchannel_sony(cdrom_t *dev, uint8_t *b, int msf) +{ + subchannel_t subc; + int pos = 0, m, s, f; + uint32_t dat; + + dev->ops->get_subchannel(dev, dev->seek_pos, &subc); + + cdrom_log("CD-ROM %i: Returned subchannel at %02i:%02i.%02i, ret = %02x, seek pos = %08x, cd_end = %08x.\n", dev->id, subc.abs_m, subc.abs_s, subc.abs_f, ret, dev->seek_pos, dev->cd_end); + + b[pos++] = subc.attr; + b[pos++] = subc.track; + b[pos++] = subc.index; + + if (msf) { + b[pos++] = subc.rel_m; + b[pos++] = subc.rel_s; + b[pos++] = subc.rel_f; + b[pos++] = subc.abs_m; + b[pos++] = subc.abs_s; + b[pos++] = subc.abs_f; + } else { + dat = MSFtoLBA(subc.rel_m, subc.rel_s, subc.rel_f); + b[pos++] = (dat >> 16) & 0xff; + b[pos++] = (dat >> 8) & 0xff; + b[pos++] = dat & 0xff; + dat = MSFtoLBA(subc.abs_m, subc.abs_s, subc.abs_f) - 150; + b[pos++] = (dat >> 16) & 0xff; + b[pos++] = (dat >> 8) & 0xff; + b[pos++] = dat & 0xff; + } +} + + +uint8_t +cdrom_get_audio_status_sony(cdrom_t *dev, uint8_t *b, int msf) +{ + uint8_t ret; + subchannel_t subc; + int m, s, f; + uint32_t dat; + + dev->ops->get_subchannel(dev, dev->seek_pos, &subc); + + if (dev->cd_status == CD_STATUS_DATA_ONLY) + ret = 0x05; + else { + if (dev->cd_status == CD_STATUS_PLAYING) + ret = dev->sound_on ? 0x00 : 0x02; + else if (dev->cd_status == CD_STATUS_PAUSED) + ret = 0x01; + else + ret = 0x03; + } + + if (msf) { + b[0] = 0; + b[1] = subc.abs_m; + b[2] = subc.abs_s; + b[3] = subc.abs_f; + } else { + dat = MSFtoLBA(subc.abs_m, subc.abs_s, subc.abs_f) - 150; + b[0] = (dat >> 24) & 0xff; + b[1] = (dat >> 16) & 0xff; + b[2] = (dat >> 8) & 0xff; + b[3] = dat & 0xff; + } + + return ret; +} + uint8_t cdrom_get_current_subcodeq_playstatus(cdrom_t *dev, uint8_t *b) { @@ -599,16 +881,14 @@ cdrom_get_current_subcodeq_playstatus(cdrom_t *dev, uint8_t *b) ret = (dev->cd_status == CD_STATUS_PLAYING) ? 0x00 : dev->audio_op; b[0] = subc.attr; - b[1] = CD_BCD(subc.track); - b[2] = CD_BCD(subc.index); - b[3] = CD_BCD(subc.rel_m); - b[4] = CD_BCD(subc.rel_s); - b[5] = CD_BCD(subc.rel_f); - b[6] = CD_BCD(subc.abs_m); - b[7] = CD_BCD(subc.abs_s); - b[8] = CD_BCD(subc.abs_f); - cdrom_log("CD-ROM %i: Returned subcode-q at %02i:%02i.%02i, track=%02x\n", dev->id, b[3], b[4], b[5], b[1]); - + b[1] = bin2bcd(subc.track); + b[2] = bin2bcd(subc.index); + b[3] = bin2bcd(subc.rel_m); + b[4] = bin2bcd(subc.rel_s); + b[5] = bin2bcd(subc.rel_f); + b[6] = bin2bcd(subc.abs_m); + b[7] = bin2bcd(subc.abs_s); + b[8] = bin2bcd(subc.abs_f); return ret; } @@ -670,7 +950,7 @@ read_toc_normal(cdrom_t *dev, unsigned char *b, unsigned char start_track, int m b[len++] = 0; /* NEC CDR-260 speaks BCD. */ - if ((dev->bus_type == CDROM_BUS_ATAPI) && dev->early) { + if (!strcmp(cdrom_drive_types[dev->type].internal_name, "NEC_CD-ROM_DRIVE260_1.01") || (!strcmp(cdrom_drive_types[dev->type].internal_name, "NEC_CD-ROM_DRIVE260_1.00"))) { /*NEC*/ m = ti.m; s = ti.s; f = ti.f; @@ -720,7 +1000,7 @@ read_toc_session(cdrom_t *dev, unsigned char *b, int msf) b[len++] = 0; /* NEC CDR-260 speaks BCD. */ - if ((dev->bus_type == CDROM_BUS_ATAPI) && dev->early) { + if (!strcmp(cdrom_drive_types[dev->type].internal_name, "NEC_CD-ROM_DRIVE260_1.01") || (!strcmp(cdrom_drive_types[dev->type].internal_name, "NEC_CD-ROM_DRIVE260_1.00"))) { /*NEC*/ m = ti.m; s = ti.s; f = ti.f; @@ -778,6 +1058,75 @@ read_toc_raw(cdrom_t *dev, unsigned char *b) return len; } +static int +read_toc_sony(cdrom_t *dev, unsigned char *b, unsigned char start_track, int msf) +{ + track_info_t ti; + int i, len = 4; + int m, s, f; + int first_track, last_track; + uint32_t temp; + + cdrom_log("read_toc_sony(%08X, %08X, %02X, %i)\n", dev, b, start_track, msf); + + dev->ops->get_tracks(dev, &first_track, &last_track); + + /* Byte 2 = Number of the first track */ + dev->ops->get_track_info(dev, 1, 0, &ti); + b[2] = ti.number; + cdrom_log(" b[2] = %02X\n", b[2]); + + /* Byte 3 = Number of the last track before the lead-out track */ + dev->ops->get_track_info(dev, last_track, 0, &ti); + b[3] = ti.number; + cdrom_log(" b[3] = %02X\n", b[2]); + + if (start_track == 0x00) + first_track = 0; + else { + first_track = -1; + for (i = 0; i <= last_track; i++) { + dev->ops->get_track_info(dev, i + 1, 0, &ti); + if (ti.number >= start_track) { + first_track = i; + break; + } + } + } + cdrom_log(" first_track = %i, last_track = %i\n", first_track, last_track); + + /* No suitable starting track, return with error. */ + if (first_track == -1) { +#ifdef ENABLE_CDROM_LOG + cdrom_log(" [ERROR] No suitable track found\n"); +#endif + return -1; + } + + 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); + dev->ops->get_track_info(dev, i + 1, 0, &ti); + + b[len++] = ti.attr; + b[len++] = ti.number; /* track number */ + + if (msf) { + b[len++] = 0; + b[len++] = ti.m; + b[len++] = ti.s; + b[len++] = ti.f; + } else { + temp = MSFtoLBA(ti.m, ti.s, ti.f) - 150; + b[len++] = temp >> 24; + b[len++] = temp >> 16; + b[len++] = temp >> 8; + b[len++] = temp; + } + } + + return len; +} + int cdrom_read_toc(cdrom_t *dev, unsigned char *b, int type, unsigned char start_track, int msf, int max_len) { @@ -806,6 +1155,21 @@ cdrom_read_toc(cdrom_t *dev, unsigned char *b, int type, unsigned char start_tra return len; } +int +cdrom_read_toc_sony(cdrom_t *dev, unsigned char *b, unsigned char start_track, int msf, int max_len) +{ + int len; + + len = read_toc_sony(dev, b, start_track, msf); + + len = MIN(len, max_len); + + b[0] = (uint8_t) (((len - 2) >> 8) & 0xff); + b[1] = (uint8_t) ((len - 2) & 0xff); + + return len; +} + /* New API calls for Mitsumi CD-ROM. */ void cdrom_get_track_buffer(cdrom_t *dev, uint8_t *buf) @@ -841,7 +1205,7 @@ cdrom_get_q(cdrom_t *dev, uint8_t *buf, int *curtoctrk, uint8_t mode) dev->ops->get_track_info(dev, *curtoctrk, 0, &ti); buf[0] = (ti.attr << 4) & 0xf0; buf[1] = ti.number; - buf[2] = CD_BCD(*curtoctrk + 1); + buf[2] = bin2bcd(*curtoctrk + 1); buf[3] = ti.m; buf[4] = ti.s; buf[5] = ti.f; @@ -888,36 +1252,50 @@ cdrom_mitsumi_audio_play(cdrom_t *dev, uint32_t pos, uint32_t len) return 1; } -void +uint8_t cdrom_read_disc_info_toc(cdrom_t *dev, unsigned char *b, unsigned char track, int type) { track_info_t ti; int first_track, last_track; + int m = 0, s = 0, f = 0; dev->ops->get_tracks(dev, &first_track, &last_track); - cdrom_log("Read DISC Info TOC Type = %d.\n", type); + cdrom_log("Read DISC Info TOC Type = %d, track = %d, first_track = %d, last_track = %d.\n", type, track, first_track, last_track); switch (type) { case 0: - b[0] = CD_BCD(first_track); - b[1] = CD_BCD(last_track); + b[0] = bin2bcd(first_track); + b[1] = bin2bcd(last_track); b[2] = 0; b[3] = 0; + cdrom_log("CD-ROM %i: Returned Toshiba/NEC disc information (type 0) at %02i:%02i\n", dev->id, b[0], b[1]); break; case 1: - dev->ops->get_track_info(dev, 0xAA, 0, &ti); - b[0] = CD_BCD(ti.m); - b[1] = CD_BCD(ti.s); - b[2] = CD_BCD(ti.f); + dev->ops->get_track_info(dev, 0xaa, 0, &ti); + m = ti.m; + s = ti.s; + f = ti.f; + msf_to_bcd(&m, &s, &f); + b[0] = m; + b[1] = s; + b[2] = f; b[3] = 0; + cdrom_log("CD-ROM %i: Returned Toshiba/NEC disc information (type 1) at %02i:%02i.%02i, track=%d\n", dev->id, b[0], b[1], b[2], bcd2bin(track)); break; case 2: - dev->ops->get_track_info(dev, CD_DCB(track), 0, &ti); - b[0] = CD_BCD(ti.m); - b[1] = CD_BCD(ti.s); - b[2] = CD_BCD(ti.f); + if (track > bin2bcd(last_track)) + return 0; + + dev->ops->get_track_info(dev, bcd2bin(track), 0, &ti); + m = ti.m; + s = ti.s; + f = ti.f; + msf_to_bcd(&m, &s, &f); + b[0] = m; + b[1] = s; + b[2] = f; b[3] = ti.attr; - cdrom_log("CD-ROM %i: Returned Toshiba disc information at %02i:%02i.%02i, track=%d\n", dev->id, b[0], b[1], b[2], CD_DCB(track)); + cdrom_log("CD-ROM %i: Returned Toshiba/NEC disc information (type 2) at %02i:%02i.%02i, track=%d, m=%02i,s=%02i,f=%02i, tno=%02x.\n", dev->id, b[0], b[1], b[2], bcd2bin(track), m, s, f, ti.attr); break; case 3: b[0] = 0x00; /*TODO: correct it further, mark it as CD-Audio/CD-ROM disc for now*/ @@ -926,6 +1304,8 @@ cdrom_read_disc_info_toc(cdrom_t *dev, unsigned char *b, unsigned char track, in b[3] = 0; break; } + + return 1; } static int @@ -1203,7 +1583,7 @@ read_mode2_xa_form2(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t int cdrom_readsector_raw(cdrom_t *dev, uint8_t *buffer, int sector, int ismsf, int cdrom_sector_type, - int cdrom_sector_flags, int *len) + int cdrom_sector_flags, int *len, uint8_t vendor_type) { uint8_t *b, *temp_b; uint32_t msf, lba; @@ -1224,8 +1604,23 @@ cdrom_readsector_raw(cdrom_t *dev, uint8_t *buffer, int sector, int ismsf, int c lba = MSFtoLBA(m, s, f) - 150; msf = sector; } else { - lba = sector; - msf = cdrom_lba_to_msf_accurate(sector); + switch (vendor_type) { + case 0x00: + lba = sector; + msf = cdrom_lba_to_msf_accurate(sector); + break; + case 0x40: + m = bcd2bin((sector >> 24) & 0xff); + s = bcd2bin((sector >> 16) & 0xff); + f = bcd2bin((sector >> 8) & 0xff); + lba = MSFtoLBA(m, s, f) - 150; + msf = sector; + break; + case 0x80: + lba = bcd2bin((sector >> 24) & 0xff); + msf = sector; + break; + } } if (dev->ops->track_type) diff --git a/src/config.c b/src/config.c index 8e2b5c292..a552408c0 100644 --- a/src/config.c +++ b/src/config.c @@ -61,6 +61,7 @@ #include <86box/scsi.h> #include <86box/scsi_device.h> #include <86box/cdrom.h> +#include <86box/cdrom_interface.h> #include <86box/zip.h> #include <86box/mo.h> #include <86box/sound.h> @@ -904,6 +905,15 @@ load_storage_controllers(void) p = NULL; } + p = ini_section_get_string(cat, "cdrom_interface", NULL); + if (p != NULL) + cdrom_interface_current = cdrom_interface_get_from_internal_name(p); + + if (free_p) { + free(p); + p = NULL; + } + ide_ter_enabled = !!ini_section_get_int(cat, "ide_ter", 0); ide_qua_enabled = !!ini_section_get_int(cat, "ide_qua", 0); @@ -1321,8 +1331,13 @@ load_floppy_and_cdrom_drives(void) sprintf(temp, "cdrom_%02i_speed", c + 1); cdrom[c].speed = ini_section_get_int(cat, temp, 8); - sprintf(temp, "cdrom_%02i_early", c + 1); - cdrom[c].early = ini_section_get_int(cat, temp, 0); + + sprintf(temp, "cdrom_%02i_type", c + 1); + p = ini_section_get_string(cat, temp, (c == 1) ? "86BOX_CD-ROM_1.00" : "none"); + 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); /* Default values, needed for proper operation of the Settings dialog. */ cdrom[c].ide_channel = cdrom[c].scsi_device_id = c + 2; @@ -2470,6 +2485,12 @@ save_storage_controllers(void) ini_section_set_string(cat, "hdc", hdc_get_internal_name(hdc_current)); + if (cdrom_interface_current == 0) + ini_section_delete_var(cat, "cdrom_interface"); + else + ini_section_set_string(cat, "cdrom_interface", + cdrom_interface_get_internal_name(cdrom_interface_current)); + if (ide_ter_enabled == 0) ini_section_delete_var(cat, "ide_ter"); else @@ -2717,17 +2738,25 @@ save_floppy_and_cdrom_drives(void) ini_section_set_int(cat, temp, cdrom[c].speed); } - sprintf(temp, "cdrom_%02i_early", c + 1); - if ((cdrom[c].bus_type == 0) || (cdrom[c].early == 0)) { + sprintf(temp, "cdrom_%02i_type", c + 1); + if ((cdrom[c].bus_type == 0) || (cdrom[c].bus_type == CDROM_BUS_MITSUMI)) { ini_section_delete_var(cat, temp); } else { - ini_section_set_int(cat, temp, cdrom[c].early); + ini_section_set_string(cat, temp, + cdrom_get_internal_name(cdrom_get_type(c))); } sprintf(temp, "cdrom_%02i_parameters", c + 1); if (cdrom[c].bus_type == 0) { ini_section_delete_var(cat, temp); - } else { + } else { /*In case one wants an ATAPI drive on SCSI and vice-versa.*/ + if (cdrom[c].bus_type == CDROM_BUS_ATAPI) { + if (cdrom_drive_types[cdrom_get_type(c)].bus_type == BUS_TYPE_SCSI) + cdrom[c].bus_type = CDROM_BUS_SCSI; + } else if (cdrom[c].bus_type == CDROM_BUS_SCSI) { + if (cdrom_drive_types[cdrom_get_type(c)].bus_type == BUS_TYPE_IDE) + cdrom[c].bus_type = CDROM_BUS_ATAPI; + } sprintf(tmp2, "%u, %s", cdrom[c].sound_on, hdd_bus_to_string(cdrom[c].bus_type, 1)); ini_section_set_string(cat, temp, tmp2); diff --git a/src/include/86box/cdrom.h b/src/include/86box/cdrom.h index f5bfc9026..ca7bcb2a1 100644 --- a/src/include/86box/cdrom.h +++ b/src/include/86box/cdrom.h @@ -60,6 +60,54 @@ enum { CDROM_BUS_USB }; +#define KNOWN_CDROM_DRIVE_TYPES 30 +#define BUS_TYPE_ALL 0 +#define BUS_TYPE_IDE 1 +#define BUS_TYPE_SCSI 2 + +static const struct +{ + const char vendor[9]; + const char model[17]; + const char revision[5]; + const char *name; + const char *internal_name; + const int bus_type; +} cdrom_drive_types[] = +{ + { "86BOX", "CD-ROM", "1.00", "(ATAPI/SCSI) 86BOX CD-ROM 1.00", "86BOX_CD-ROM_1.00", BUS_TYPE_ALL}, + { "AZT", "CDA46802I", "1.15", "(ATAPI) AZT CDA46802I 1.15", "AZT_CDA46802I_1.15", BUS_TYPE_IDE}, + { "BTC", "CD-ROM BCD36XH", "U1.0", "(ATAPI) BTC CD-ROM BCD36XH U1.0", "BTC_CD-ROM_BCD36XH_U1.0", BUS_TYPE_IDE}, + { "GOLDSTAR", "CRD-8160B", "3.14", "(ATAPI) GOLDSTAR CRD-8160B 3.14", "GOLDSTAR_CRD-8160B_3.14", BUS_TYPE_IDE}, + { "HITACHI", "CDR-8130", "0020", "(ATAPI) HITACHI CDR-8130 0020", "HITACHI_CDR-8130_0020", BUS_TYPE_IDE}, + { "KENWOOD", "CD-ROM UCR-421", "208E", "(ATAPI) KENWOOD CD-ROM UCR-421 208E", "KENWOOD_CD-ROM_UCR-421_208E", BUS_TYPE_IDE}, + { "MATSHITA", "CD-ROM CR-587", "7S13", "(ATAPI) MATSHITA CD-ROM CR-587 7S13", "MATSHITA_CD-ROM_CR-587_7S13", BUS_TYPE_IDE}, + { "MATSHITA", "CD-ROM CR-588", "LS15", "(ATAPI) MATSHITA CD-ROM CR-588 LS15", "MATSHITA_CD-ROM_CR-588_LS15", BUS_TYPE_IDE}, + { "MITSUMI", "CRMC-FX4820T", "D02A", "(ATAPI) MITSUMI CRMC-FX4820T D02A", "MITSUMI_CRMC-FX4820T_D02A", BUS_TYPE_IDE}, + { "NEC", "CD-ROM DRIVE:260", "1.00", "(ATAPI) NEC CD-ROM DRIVE:260 1.00", "NEC_CD-ROM_DRIVE260_1.00", BUS_TYPE_IDE}, + { "NEC", "CD-ROM DRIVE:260", "1.01", "(ATAPI) NEC CD-ROM DRIVE:260 1.01", "NEC_CD-ROM_DRIVE260_1.01", BUS_TYPE_IDE}, + { "NEC", "CDR-1300A", "1.05", "(ATAPI) NEC CDR-1300A 1.05", "NEC_CDR-1300A_1.05", BUS_TYPE_IDE}, + { "PHILIPS", "CD-ROM PCA403CD", "U31P", "(ATAPI) PHILIPS CD-ROM PCA403CD U31P", "PHILIPS_CD-ROM_PCA403CD_U31P", BUS_TYPE_IDE}, + { "SONY", "CD-ROM CDU76", "1.0i", "(ATAPI) SONY CD-ROM CDU76 1.0i", "SONY_CD-ROM_CDU76_1.0i", BUS_TYPE_IDE}, + { "SONY", "CD-ROM CDU311", "3.0h", "(ATAPI) SONY CD-ROM CDU311 3.0h", "SONY_CD-ROM_CDU311_3.0h", BUS_TYPE_IDE}, + { "TOSHIBA", "CD-ROM XM-5702B", "TA70", "(ATAPI) TOSHIBA CD-ROM XM-5702B TA70", "TOSHIBA_CD-ROM_XM-5702B_TA70", BUS_TYPE_IDE}, + { "CHINON", "CD-ROM CDS-431", "H42 ", "(SCSI) CHINON CD-ROM CDS-431 H42", "CHINON_CD-ROM_CDS-431_H42", BUS_TYPE_SCSI}, + { "DEC", "RRD45 (C) DEC", "0436", "(SCSI) DEC RRD45 0436", "DEC_RRD45_0436", BUS_TYPE_SCSI}, + { "MATSHITA", "CD-ROM CR-501", "1.0b", "(SCSI) MATSHITA CD-ROM CR-501 1.0b", "MATSHITA_CD-ROM_CR-501_1.0b", BUS_TYPE_SCSI}, + { "NEC", "CD-ROM DRIVE:74", "1.00", "(SCSI) NEC CD-ROM DRIVE:74 1.00", "NEC_CD-ROM_DRIVE74_1.00", BUS_TYPE_SCSI}, + { "NEC", "CD-ROM DRIVE:464", "1.05", "(SCSI) NEC CD-ROM DRIVE:464 1.05", "NEC_CD-ROM_DRIVE464_1.05", BUS_TYPE_SCSI}, + { "SONY", "CD-ROM CDU-541", "1.0i", "(SCSI) SONY CD-ROM CDU-541 1.0i", "SONY_CD-ROM_CDU-541_1.0i", BUS_TYPE_SCSI}, + { "SONY", "CD-ROM CDU-76S", "1.00", "(SCSI) SONY CD-ROM CDU-76S 1.00", "SONY_CD-ROM_CDU-76S_1.00", BUS_TYPE_SCSI}, + { "PHILIPS", "CDD2600", "1.07", "(SCSI) PHILIPS CDD2600 1.07", "PHILIPS_CDD2600_1.07", BUS_TYPE_SCSI}, + { "PIONEER", "CD-ROM DRM-604X", "2403", "(SCSI) PIONEER CD-ROM DRM-604X 2403", "PIONEER_CD-ROM_DRM-604X_2403", BUS_TYPE_SCSI}, + { "PLEXTOR", "CD-ROM PX-32TS", "1.03", "(SCSI) PLEXTOR CD-ROM PX-32TS 1.03", "PLEXTOR_CD-ROM_PX-32TS_1.03", BUS_TYPE_SCSI}, + { "TEAC", "CD-R55S", "1.0R", "(SCSI) TEAC CD-R55S 1.0R", "TEAC_CD-R55S_1.0R", BUS_TYPE_SCSI}, + { "TOSHIBA", "CD-ROM DRIVE:XM", "3433", "(SCSI) TOSHIBA CD-ROM DRIVE:XM 3433", "TOSHIBA_CD-ROM_DRIVEXM_3433", BUS_TYPE_SCSI}, + { "TOSHIBA", "CD-ROM XM-3301TA", "0272", "(SCSI) TOSHIBA CD-ROM XM-3301TA 0272", "TOSHIBA_CD-ROM_XM-3301TA_0272", BUS_TYPE_SCSI}, + { "TOSHIBA", "CD-ROM XM-5701TA", "3136", "(SCSI) TOSHIBA CD-ROM XM-5701TA 3136", "TOSHIBA_CD-ROM_XM-5701TA_3136", BUS_TYPE_SCSI}, + { "", "", "", "", "", -1}, +}; + /* To shut up the GCC compilers. */ struct cdrom; @@ -113,7 +161,7 @@ typedef struct cdrom { uint32_t sound_on, cdrom_capacity, early, seek_pos, - seek_diff, cd_end; + seek_diff, cd_end, type; int host_drive, prev_host_drive, cd_buflen, audio_op; @@ -132,6 +180,13 @@ typedef struct cdrom { extern cdrom_t cdrom[CDROM_NUM]; +extern char *cdrom_getname(int type); + +extern char *cdrom_get_internal_name(int type); +extern int cdrom_get_from_internal_name(char *s); +extern void cdrom_set_type(int model, int type); +extern int cdrom_get_type(int model); + extern int cdrom_lba_to_msf_accurate(int lba); extern double cdrom_seek_time(cdrom_t *dev); extern void cdrom_stop(cdrom_t *dev); @@ -139,20 +194,24 @@ extern int cdrom_is_pre(cdrom_t *dev, uint32_t lba); extern int cdrom_audio_callback(cdrom_t *dev, int16_t *output, int len); extern uint8_t cdrom_audio_play(cdrom_t *dev, uint32_t pos, uint32_t len, int ismsf); extern uint8_t cdrom_audio_track_search(cdrom_t *dev, uint32_t pos, int type, uint8_t playbit); -extern uint8_t cdrom_toshiba_audio_play(cdrom_t *dev, uint32_t pos, int type); +extern uint8_t cdrom_audio_play_toshiba(cdrom_t *dev, uint32_t pos, int type); extern void cdrom_audio_pause_resume(cdrom_t *dev, uint8_t resume); +extern uint8_t cdrom_audio_scan(cdrom_t *dev, uint32_t pos, int type); +extern uint8_t cdrom_get_audio_status_sony(cdrom_t *dev, uint8_t *b, int msf); extern uint8_t cdrom_get_current_subchannel(cdrom_t *dev, uint8_t *b, int msf); +extern void cdrom_get_current_subchannel_sony(cdrom_t *dev, uint8_t *b, int msf); extern uint8_t cdrom_get_current_subcodeq_playstatus(cdrom_t *dev, uint8_t *b); extern int cdrom_read_toc(cdrom_t *dev, unsigned char *b, int type, unsigned char start_track, int msf, int max_len); +extern int cdrom_read_toc_sony(cdrom_t *dev, unsigned char *b, unsigned char start_track, int msf, int max_len); extern void cdrom_get_track_buffer(cdrom_t *dev, uint8_t *buf); extern void cdrom_get_q(cdrom_t *dev, uint8_t *buf, int *curtoctrk, uint8_t mode); extern uint8_t cdrom_mitsumi_audio_play(cdrom_t *dev, uint32_t pos, uint32_t len); extern int cdrom_readsector_raw(cdrom_t *dev, uint8_t *buffer, int sector, int ismsf, - int cdrom_sector_type, int cdrom_sector_flags, int *len); -extern void cdrom_read_disc_info_toc(cdrom_t *dev, unsigned char *b, unsigned char track, int type); + int cdrom_sector_type, int cdrom_sector_flags, int *len, uint8_t vendor_type); +extern uint8_t cdrom_read_disc_info_toc(cdrom_t *dev, unsigned char *b, unsigned char track, int type); -extern void cdrom_seek(cdrom_t *dev, uint32_t pos); +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); diff --git a/src/include/86box/cdrom_interface.h b/src/include/86box/cdrom_interface.h new file mode 100644 index 000000000..860a436e0 --- /dev/null +++ b/src/include/86box/cdrom_interface.h @@ -0,0 +1,31 @@ +/* + * 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. + * + * Definitions for the common CD-ROM interface controller handler. + * + * + * + * Authors: TheCollector1995 + * + * Copyright 2022 TheCollector1995. + */ +#ifndef EMU_CDROM_INTERFACE_H +#define EMU_CDROM_INTERFACE_H + +extern int cdrom_interface_current; + +extern void cdrom_interface_reset(void); + +extern char *cdrom_interface_get_internal_name(int cdinterface); +extern int cdrom_interface_get_from_internal_name(char *s); +extern int cdrom_interface_has_config(int cdinterface); +extern const device_t *cdrom_interface_get_device(int cdinterface); +extern int cdrom_interface_get_flags(int cdinterface); +extern int cdrom_interface_available(int cdinterface); + +#endif /*EMU_CDROM_INTERFACE_H*/ diff --git a/src/include/86box/scsi_cdrom.h b/src/include/86box/scsi_cdrom.h index e991ccc36..42d4412d1 100644 --- a/src/include/86box/scsi_cdrom.h +++ b/src/include/86box/scsi_cdrom.h @@ -49,6 +49,10 @@ typedef struct { packet_len, pos; double callback; + + mode_sense_pages_t ms_pages_saved_sony; + mode_sense_pages_t ms_drive_status_pages_saved; + int sony_vendor; } scsi_cdrom_t; #endif diff --git a/src/include/86box/scsi_device.h b/src/include/86box/scsi_device.h index 650215cb5..8cb2f3877 100644 --- a/src/include/86box/scsi_device.h +++ b/src/include/86box/scsi_device.h @@ -53,6 +53,8 @@ #define GPCMD_SEEK_6 0x0b #define GPCMD_IOMEGA_SET_PROTECTION_MODE 0x0c #define GPCMD_IOMEGA_EJECT 0x0d /* ATAPI only? */ +#define GPCMD_NO_OPERATION_TOSHIBA 0x0d /* Toshiba Vendor Unique command */ +#define GPCMD_NO_OPERATION_NEC 0x0d /* NEC Vendor Unique command */ #define GPCMD_INQUIRY 0x12 #define GPCMD_VERIFY_6 0x13 #define GPCMD_MODE_SELECT_6 0x15 @@ -64,7 +66,7 @@ #define GPCMD_PREVENT_REMOVAL 0x1e #define GPCMD_READ_FORMAT_CAPACITIES 0x23 #define GPCMD_READ_CDROM_CAPACITY 0x25 -#define GPCMD_CHINON_UNKNOWN 0x26 +#define GPCMD_UNKNOWN_CHINON 0x26 /*Chinon Vendor Unique command*/ #define GPCMD_READ_10 0x28 #define GPCMD_READ_GENERATION 0x29 #define GPCMD_WRITE_10 0x2a @@ -100,23 +102,51 @@ #define GPCMD_PLAY_CD_OLD 0xb4 #define GPCMD_READ_CD_OLD 0xb8 #define GPCMD_READ_CD_MSF 0xb9 -#define GPCMD_SCAN 0xba +#define GPCMD_AUDIO_SCAN 0xba #define GPCMD_SET_SPEED 0xbb #define GPCMD_PLAY_CD 0xbc #define GPCMD_MECHANISM_STATUS 0xbd #define GPCMD_READ_CD 0xbe #define GPCMD_SEND_DVD_STRUCTURE 0xbf /* This is for writing only, irrelevant to 86Box. */ -#define GPCMD_CHINON_EJECT 0xc0 /* Chinon Vendor Unique command */ -#define GPCMD_AUDIO_TRACK_SEARCH 0xc0 /* Toshiba Vendor Unique command */ -#define GPCMD_TOSHIBA_PLAY_AUDIO 0xc1 /* Toshiba Vendor Unique command */ +#define GPCMD_EJECT_CHINON 0xc0 /* Chinon Vendor Unique command */ +#define GPCMD_AUDIO_TRACK_SEARCH_TOSHIBA 0xc0 /* Toshiba Vendor Unique command */ +#define GPCMD_UNKNOWN_SONY 0xc0 /* Sony Vendor Unique command */ +#define GPCMD_PLAY_AUDIO_TOSHIBA 0xc1 /* Toshiba Vendor Unique command */ +#define GPCMD_READ_TOC_SONY 0xc1 /* Sony Vendor Unique command */ #define GPCMD_PAUSE_RESUME_ALT 0xc2 -#define GPCMD_STILL 0xc2 /* Toshiba Vendor Unique command */ -#define GPCMD_CADDY_EJECT 0xc4 /* Toshiba Vendor Unique command */ -#define GPCMD_CHINON_STOP 0xc6 /* Chinon Vendor Unique command */ -#define GPCMD_READ_SUBCODEQ_PLAYING_STATUS 0xc6 /* Toshiba Vendor Unique command */ +#define GPCMD_READ_SUBCHANNEL_MATSUSHITA 0xc2 /* Matsushita Vendor Unique command */ +#define GPCMD_READ_SUBCHANNEL_SONY 0xc2 /* Sony Vendor Unique command */ +#define GPCMD_STILL_TOSHIBA 0xc2 /* Toshiba Vendor Unique command */ +#define GPCMD_READ_TOC_MATSUSHITA 0xc3 /* Matsushita Vendor Unique command */ +#define GPCMD_READ_HEADER_SONY 0xc3 /* Sony Vendor Unique command */ +#define GPCMD_SET_STOP_TIME_TOSHIBA 0xc3 /* Toshiba Vendor Unique command */ +#define GPCMD_READ_HEADER_MATSUSHITA 0xc4 /* Matsushita Vendor Unique command */ +#define GPCMD_PLAYBACK_STATUS_TOSHIBA 0xc4 /* Sony Vendor Unique command */ +#define GPCMD_CADDY_EJECT_TOSHIBA 0xc4 /* Toshiba Vendor Unique command */ +#define GPCMD_PAUSE_SONY 0xc5 /* Sony Vendor Unique command */ +#define GPCMD_PLAY_AUDIO_MATSUSHITA 0xc5 /* Matsushita Vendor Unique command */ +#define GPCMD_STOP_CHINON 0xc6 /* Chinon Vendor Unique command */ +#define GPCMD_PLAT_TRACK_SONY 0xc6 /* Sony Vendor Unique command */ +#define GPCMD_READ_SUBCODEQ_PLAYING_STATUS_TOSHIBA 0xc6 /* Toshiba Vendor Unique command */ +#define GPCMD_PLAY_AUDIO_MSF_MATSUSHITA 0xc7 /* Matsushita Vendor Unique command*/ +#define GPCMD_PLAY_MSF_SONY 0xc7 /* Sony Vendor Unique command*/ #define GPCMD_READ_DISC_INFORMATION_TOSHIBA 0xc7 /* Toshiba Vendor Unique command */ -#define GPCMD_SCAN_ALT 0xcd /* Should be equivalent to 0xba */ +#define GPCMD_PLAY_AUDIO_TRACK_INDEX_MATSUSHITA 0xc8 /* Matsushita Vendor Unique command */ +#define GPCMD_PLAY_AUDIO_SONY 0xc8 /* Sony Vendor Unique command */ +#define GPCMD_PLAY_AUDIO_TRACK_RELATIVE_10_MATSUSHITA 0xc9 /*Matsushita Vendor Unique command */ +#define GPCMD_PLAYBACK_CONTROL_SONY 0xc9 /* Sony Vendor Unique command */ +#define GPCMD_PAUSE_RESUME_MATSUSHITA 0xcb /* Matsushita Vendor Unique command */ +#define GPCMD_SCAN_PIONEER 0xcd /* Should be equivalent to 0xba */ +#define GPCMD_AUDIO_TRACK_SEARCH_NEC 0xd8 /* NEC Vendor Unique command */ +#define GPCMD_PLAY_AUDIO_NEC 0xd9 /* NEC Vendor Unique command */ +#define GPCMD_STILL_NEC 0xda /* NEC Vendor Unique command */ #define GPCMD_SET_SPEED_ALT 0xda /* Should be equivalent to 0xbb */ +#define GPCMD_SET_STOP_TIME_NEC 0xdb /* NEC Vendor Unique command */ +#define GPCMD_CADDY_EJECT_NEC 0xdc /* NEC Vendor Unique command */ +#define GPCMD_READ_SUBCODEQ_PLAYING_STATUS_NEC 0xdd /* NEC Vendor Unique command */ +#define GPCMD_READ_DISC_INFORMATION_NEC 0xde /* NEC Vendor Unique command */ +#define GPCMD_PLAY_AUDIO_12_MATSUSHITA 0xe5 /* Matsushita Vendor Unique command */ +#define GPCMD_PLAY_AUDIO_TRACK_RELATIVE_12_MATSUSHITA 0xe9 /* Matsushita Vendor Unique command */ /* Mode page codes for mode sense/set */ #define GPMODE_R_W_ERROR_PAGE 0x01 @@ -125,6 +155,8 @@ #define GPMODE_RIGID_DISK_PAGE 0x04 /* Rigid disk geometry page */ #define GPMODE_FLEXIBLE_DISK_PAGE 0x05 #define GPMODE_CACHING_PAGE 0x08 +#define GPMODE_CDROM_PAGE_SONY 0x08 +#define GPMODE_CDROM_AUDIO_PAGE_SONY 0x09 #define GPMODE_CDROM_PAGE 0x0d #define GPMODE_CDROM_AUDIO_PAGE 0x0e #define GPMODE_CAPABILITIES_PAGE 0x2a @@ -139,6 +171,8 @@ #define GPMODEP_RIGID_DISK_PAGE 0x0000000000000010LL #define GPMODEP_FLEXIBLE_DISK_PAGE 0x0000000000000020LL #define GPMODEP_CACHING_PAGE 0x0000000000000100LL +#define GPMODEP_CDROM_PAGE_SONY 0x0000000000000200LL +#define GPMODEP_CDROM_AUDIO_PAGE_SONY 0x0000000000000400LL #define GPMODEP_CDROM_PAGE 0x0000000000002000LL #define GPMODEP_CDROM_AUDIO_PAGE 0x0000000000004000LL #define GPMODEP_CAPABILITIES_PAGE 0x0000040000000000LL diff --git a/src/qt/qt_harddrive_common.cpp b/src/qt/qt_harddrive_common.cpp index 7d3beaa2b..2b415f6f4 100644 --- a/src/qt/qt_harddrive_common.cpp +++ b/src/qt/qt_harddrive_common.cpp @@ -20,6 +20,7 @@ extern "C" { #include <86box/hdd.h> +#include <86box/cdrom.h> } #include @@ -48,14 +49,16 @@ void Harddrives::populateRemovableBuses(QAbstractItemModel *model) { model->removeRows(0, model->rowCount()); - model->insertRows(0, 3); + model->insertRows(0, 4); model->setData(model->index(0, 0), QObject::tr("Disabled")); model->setData(model->index(1, 0), QObject::tr("ATAPI")); model->setData(model->index(2, 0), QObject::tr("SCSI")); + model->setData(model->index(3, 0), QObject::tr("Mitsumi")); model->setData(model->index(0, 0), HDD_BUS_DISABLED, Qt::UserRole); model->setData(model->index(1, 0), HDD_BUS_ATAPI, Qt::UserRole); model->setData(model->index(2, 0), HDD_BUS_SCSI, Qt::UserRole); + model->setData(model->index(3, 0), CDROM_BUS_MITSUMI, Qt::UserRole); } void @@ -143,6 +146,9 @@ Harddrives::BusChannelName(uint8_t bus, uint8_t channel) case HDD_BUS_SCSI: busName = QString("SCSI (%1:%2)").arg(channel >> 4).arg(channel & 15, 2, 10, QChar('0')); break; + case CDROM_BUS_MITSUMI: + busName = QString("Mitsumi"); + break; } return busName; diff --git a/src/qt/qt_machinestatus.cpp b/src/qt/qt_machinestatus.cpp index 23df27150..d095eadb7 100644 --- a/src/qt/qt_machinestatus.cpp +++ b/src/qt/qt_machinestatus.cpp @@ -29,6 +29,7 @@ extern uint64_t tsc; #include <86box/cartridge.h> #include <86box/cassette.h> #include <86box/cdrom.h> +#include <86box/cdrom_interface.h> #include <86box/fdd.h> #include <86box/hdc.h> #include <86box/scsi.h> @@ -300,6 +301,8 @@ MachineStatus::iterateCDROM(const std::function &cb) continue; if ((cdrom[i].bus_type == CDROM_BUS_SCSI) && !hasSCSI() && (scsi_card_current[0] == 0) && (scsi_card_current[1] == 0) && (scsi_card_current[2] == 0) && (scsi_card_current[3] == 0)) continue; + if ((cdrom[i].bus_type == CDROM_BUS_MITSUMI) && (cdrom_interface_current == 0)) + continue; if (cdrom[i].bus_type != 0) { cb(i); } diff --git a/src/qt/qt_mediamenu.cpp b/src/qt/qt_mediamenu.cpp index e0c145981..f6f091bdc 100644 --- a/src/qt/qt_mediamenu.cpp +++ b/src/qt/qt_mediamenu.cpp @@ -593,6 +593,9 @@ MediaMenu::cdromUpdateMenu(int i) case CDROM_BUS_SCSI: busName = "SCSI"; break; + case CDROM_BUS_MITSUMI: + busName = "Mitsumi"; + break; } // menu->setTitle(tr("CD-ROM %1 (%2): %3").arg(QString::number(i+1), busName, name.isEmpty() ? tr("(empty)") : name)); diff --git a/src/qt/qt_settingsfloppycdrom.cpp b/src/qt/qt_settingsfloppycdrom.cpp index 2eabe80ab..751bb829a 100644 --- a/src/qt/qt_settingsfloppycdrom.cpp +++ b/src/qt/qt_settingsfloppycdrom.cpp @@ -20,6 +20,15 @@ #include "ui_qt_settingsfloppycdrom.h" extern "C" { +#include +#include +#include +#include +#include +#include +#include +#define HAVE_STDARG_H +#include <86box/86box.h> #include <86box/timer.h> #include <86box/fdd.h> #include <86box/cdrom.h> @@ -59,6 +68,7 @@ setCDROMBus(QAbstractItemModel *model, const QModelIndex &idx, uint8_t bus, uint break; case CDROM_BUS_ATAPI: case CDROM_BUS_SCSI: + case CDROM_BUS_MITSUMI: icon = ProgSettings::loadIcon("/cdrom.ico"); break; } @@ -88,6 +98,18 @@ setCDROMEarly(QAbstractItemModel *model, const QModelIndex &idx, bool early) model->setData(i, early, Qt::UserRole); } +static void +setCDROMType(QAbstractItemModel *model, const QModelIndex &idx, int type) +{ + auto i = idx.siblingAtColumn(2); + if (idx.siblingAtColumn(0).data(Qt::UserRole).toUInt() == CDROM_BUS_DISABLED) { + model->setData(i, QCoreApplication::translate("", "None")); + } else if (idx.siblingAtColumn(0).data(Qt::UserRole).toUInt() != CDROM_BUS_MITSUMI) { + model->setData(i, QObject::tr(cdrom_getname(type))); + } + model->setData(i, type, Qt::UserRole); +} + SettingsFloppyCDROM::SettingsFloppyCDROM(QWidget *parent) : QWidget(parent) , ui(new Ui::SettingsFloppyCDROM) @@ -134,18 +156,36 @@ SettingsFloppyCDROM::SettingsFloppyCDROM(QWidget *parent) Models::AddEntry(model, QString("%1x").arg(i + 1), i + 1); } + model = ui->comboBoxCDROMType->model(); + i = 0; + while (true) { + QString name = tr(cdrom_getname(i)); + if (name.isEmpty()) { + break; + } + + Models::AddEntry(model, name, i); + ++i; + } + model = new QStandardItemModel(0, 3, this); ui->tableViewCDROM->setModel(model); model->setHeaderData(0, Qt::Horizontal, tr("Bus")); model->setHeaderData(1, Qt::Horizontal, tr("Speed")); - model->setHeaderData(2, Qt::Horizontal, tr("Earlier drive")); + model->setHeaderData(2, Qt::Horizontal, tr("Type")); model->insertRows(0, CDROM_NUM); for (int i = 0; i < CDROM_NUM; i++) { auto idx = model->index(i, 0); + int type = cdrom_get_type(i); setCDROMBus(model, idx, cdrom[i].bus_type, cdrom[i].res); setCDROMSpeed(model, idx.siblingAtColumn(1), cdrom[i].speed); - setCDROMEarly(model, idx.siblingAtColumn(2), cdrom[i].early); - Harddrives::busTrackClass->device_track(1, DEV_CDROM, cdrom[i].bus_type, cdrom[i].bus_type == CDROM_BUS_ATAPI ? cdrom[i].ide_channel : cdrom[i].scsi_device_id); + setCDROMType(model, idx.siblingAtColumn(2), type); + if (cdrom[i].bus_type == CDROM_BUS_ATAPI) + Harddrives::busTrackClass->device_track(1, DEV_CDROM, cdrom[i].bus_type, cdrom[i].ide_channel); + else if (cdrom[i].bus_type == CDROM_BUS_SCSI) + Harddrives::busTrackClass->device_track(1, DEV_CDROM, cdrom[i].bus_type, cdrom[i].scsi_device_id); + else if (cdrom[i].bus_type == CDROM_BUS_MITSUMI) + Harddrives::busTrackClass->device_track(1, DEV_CDROM, cdrom[i].bus_type, 0); } ui->tableViewCDROM->resizeColumnsToContents(); ui->tableViewCDROM->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch); @@ -172,18 +212,18 @@ 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; - cdrom[i].insert = NULL; - cdrom[i].close = NULL; - cdrom[i].get_volume = NULL; + cdrom[i].is_dir = 0; + cdrom[i].priv = NULL; + cdrom[i].ops = NULL; + cdrom[i].image = NULL; + cdrom[i].insert = NULL; + cdrom[i].close = NULL; + cdrom[i].get_volume = NULL; cdrom[i].get_channel = NULL; - cdrom[i].bus_type = model->index(i, 0).data(Qt::UserRole).toUInt(); - cdrom[i].res = model->index(i, 0).data(Qt::UserRole + 1).toUInt(); - cdrom[i].speed = model->index(i, 1).data(Qt::UserRole).toUInt(); - cdrom[i].early = model->index(i, 2).data(Qt::UserRole).toUInt(); + cdrom[i].bus_type = model->index(i, 0).data(Qt::UserRole).toUInt(); + cdrom[i].res = model->index(i, 0).data(Qt::UserRole + 1).toUInt(); + cdrom[i].speed = model->index(i, 1).data(Qt::UserRole).toUInt(); + cdrom_set_type(i, model->index(i, 2).data(Qt::UserRole).toInt()); } } @@ -202,12 +242,12 @@ SettingsFloppyCDROM::onCDROMRowChanged(const QModelIndex ¤t) uint8_t bus = current.siblingAtColumn(0).data(Qt::UserRole).toUInt(); uint8_t channel = current.siblingAtColumn(0).data(Qt::UserRole + 1).toUInt(); uint8_t speed = current.siblingAtColumn(1).data(Qt::UserRole).toUInt(); - bool early = current.siblingAtColumn(2).data(Qt::UserRole).toBool(); + int type = current.siblingAtColumn(2).data(Qt::UserRole).toInt(); ui->comboBoxBus->setCurrentIndex(-1); - auto *model = ui->comboBoxBus->model(); - auto match = model->match(model->index(0, 0), Qt::UserRole, bus); - if (!match.isEmpty()) { + auto* model = ui->comboBoxBus->model(); + auto match = model->match(model->index(0, 0), Qt::UserRole, bus); + if (! match.isEmpty()) { ui->comboBoxBus->setCurrentIndex(match.first().row()); } @@ -218,7 +258,7 @@ SettingsFloppyCDROM::onCDROMRowChanged(const QModelIndex ¤t) } ui->comboBoxSpeed->setCurrentIndex(speed == 0 ? 7 : speed - 1); - ui->checkBoxEarlierDrive->setChecked(early); + ui->comboBoxCDROMType->setCurrentIndex(type); } void @@ -250,9 +290,10 @@ SettingsFloppyCDROM::on_comboBoxBus_currentIndexChanged(int index) int bus = ui->comboBoxBus->currentData().toInt(); bool enabled = (bus != CDROM_BUS_DISABLED); - ui->comboBoxChannel->setEnabled(enabled); - ui->comboBoxSpeed->setEnabled(enabled); - ui->checkBoxEarlierDrive->setEnabled(enabled); + ui->comboBoxChannel->setEnabled((bus == CDROM_BUS_MITSUMI) ? 0 : enabled); + ui->comboBoxSpeed->setEnabled((bus == CDROM_BUS_MITSUMI) ? 0 : enabled); + ui->comboBoxCDROMType->setEnabled((bus == CDROM_BUS_MITSUMI) ? 0 : enabled); + Harddrives::populateBusChannels(ui->comboBoxChannel->model(), bus); } @@ -266,14 +307,26 @@ SettingsFloppyCDROM::on_comboBoxSpeed_activated(int index) void SettingsFloppyCDROM::on_comboBoxBus_activated(int) { - auto i = ui->tableViewCDROM->selectionModel()->currentIndex().siblingAtColumn(0); + auto i = ui->tableViewCDROM->selectionModel()->currentIndex().siblingAtColumn(0); + uint8_t bus_type = ui->comboBoxBus->currentData().toUInt(); + Harddrives::busTrackClass->device_track(0, DEV_CDROM, ui->tableViewCDROM->model()->data(i, Qt::UserRole).toInt(), ui->tableViewCDROM->model()->data(i, Qt::UserRole + 1).toInt()); - ui->comboBoxChannel->setCurrentIndex(ui->comboBoxBus->currentData().toUInt() == CDROM_BUS_ATAPI ? Harddrives::busTrackClass->next_free_ide_channel() : Harddrives::busTrackClass->next_free_scsi_id()); + if (bus_type == CDROM_BUS_ATAPI) + ui->comboBoxChannel->setCurrentIndex(Harddrives::busTrackClass->next_free_ide_channel()); + else if (bus_type == CDROM_BUS_SCSI) + ui->comboBoxChannel->setCurrentIndex(Harddrives::busTrackClass->next_free_scsi_id()); + else if (bus_type == CDROM_BUS_MITSUMI) + ui->comboBoxChannel->setCurrentIndex(0); + setCDROMBus( ui->tableViewCDROM->model(), ui->tableViewCDROM->selectionModel()->currentIndex(), - ui->comboBoxBus->currentData().toUInt(), + bus_type, ui->comboBoxChannel->currentData().toUInt()); + setCDROMType( + ui->tableViewCDROM->model(), + ui->tableViewCDROM->selectionModel()->currentIndex(), + ui->comboBoxCDROMType->currentData().toUInt()); Harddrives::busTrackClass->device_track(1, DEV_CDROM, ui->tableViewCDROM->model()->data(i, Qt::UserRole).toInt(), ui->tableViewCDROM->model()->data(i, Qt::UserRole + 1).toInt()); } @@ -291,8 +344,12 @@ SettingsFloppyCDROM::on_comboBoxChannel_activated(int) } void -SettingsFloppyCDROM::on_checkBoxEarlierDrive_stateChanged(int arg1) +SettingsFloppyCDROM::on_comboBoxCDROMType_activated(int) { - auto idx = ui->tableViewCDROM->selectionModel()->currentIndex(); - setCDROMEarly(ui->tableViewCDROM->model(), idx.siblingAtColumn(2), (arg1 == Qt::Checked) ? true : false); + setCDROMType( + ui->tableViewCDROM->model(), + ui->tableViewCDROM->selectionModel()->currentIndex(), + ui->comboBoxCDROMType->currentData().toUInt()); + ui->tableViewCDROM->resizeColumnsToContents(); + ui->tableViewCDROM->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch); } diff --git a/src/qt/qt_settingsfloppycdrom.hpp b/src/qt/qt_settingsfloppycdrom.hpp index 5c2920199..3d6dd0e45 100644 --- a/src/qt/qt_settingsfloppycdrom.hpp +++ b/src/qt/qt_settingsfloppycdrom.hpp @@ -17,6 +17,7 @@ public: void save(); private slots: + void on_comboBoxCDROMType_activated(int index); void on_comboBoxChannel_activated(int index); void on_comboBoxBus_activated(int index); void on_comboBoxSpeed_activated(int index); @@ -27,8 +28,6 @@ private slots: void onFloppyRowChanged(const QModelIndex ¤t); void onCDROMRowChanged(const QModelIndex ¤t); - void on_checkBoxEarlierDrive_stateChanged(int arg1); - private: Ui::SettingsFloppyCDROM *ui; }; diff --git a/src/qt/qt_settingsfloppycdrom.ui b/src/qt/qt_settingsfloppycdrom.ui index 6233e9e7b..30be29153 100644 --- a/src/qt/qt_settingsfloppycdrom.ui +++ b/src/qt/qt_settingsfloppycdrom.ui @@ -115,16 +115,20 @@ + + + + Bus: + + + - + Channel: - - - @@ -132,25 +136,24 @@ - - + + - Bus: + Type: + + + - - - - Earlier drive - - + + diff --git a/src/qt/qt_settingsstoragecontrollers.cpp b/src/qt/qt_settingsstoragecontrollers.cpp index 2aecab568..ac406853c 100644 --- a/src/qt/qt_settingsstoragecontrollers.cpp +++ b/src/qt/qt_settingsstoragecontrollers.cpp @@ -25,6 +25,7 @@ extern "C" { #include <86box/hdc.h> #include <86box/hdc_ide.h> #include <86box/fdc_ext.h> +#include <86box/cdrom_interface.h> #include <86box/scsi.h> #include <86box/scsi_device.h> #include <86box/cassette.h> @@ -57,11 +58,12 @@ SettingsStorageControllers::save() auto *cbox = findChild(QString("comboBoxSCSI%1").arg(i + 1)); scsi_card_current[i] = cbox->currentData().toInt(); } - hdc_current = ui->comboBoxHD->currentData().toInt(); - fdc_type = ui->comboBoxFD->currentData().toInt(); - ide_ter_enabled = ui->checkBoxTertiaryIDE->isChecked() ? 1 : 0; - ide_qua_enabled = ui->checkBoxQuaternaryIDE->isChecked() ? 1 : 0; - cassette_enable = ui->checkBoxCassette->isChecked() ? 1 : 0; + hdc_current = ui->comboBoxHD->currentData().toInt(); + fdc_type = 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; + cassette_enable = ui->checkBoxCassette->isChecked() ? 1 : 0; } void @@ -131,6 +133,35 @@ SettingsStorageControllers::onCurrentMachineChanged(int machineId) ui->comboBoxFD->setCurrentIndex(-1); ui->comboBoxFD->setCurrentIndex(selectedRow); + /*CD interface controller config*/ + model = ui->comboBoxCDInterface->model(); + removeRows = model->rowCount(); + c = 0; + selectedRow = 0; + while (true) { + /* Skip "internal" if machine doesn't have it. */ + QString name = DeviceConfig::DeviceName(cdrom_interface_get_device(c), cdrom_interface_get_internal_name(c), 1); + if (name.isEmpty()) { + break; + } + + if (cdrom_interface_available(c)) { + auto *cdrom_interface_dev = cdrom_interface_get_device(c); + + if (device_is_valid(cdrom_interface_dev, machineId)) { + int row = Models::AddEntry(model, name, c); + if (c == cdrom_interface_current) { + selectedRow = row - removeRows; + } + } + } + c++; + } + model->removeRows(0, removeRows); + ui->comboBoxCDInterface->setEnabled(model->rowCount() > 0); + ui->comboBoxCDInterface->setCurrentIndex(-1); + ui->comboBoxCDInterface->setCurrentIndex(selectedRow); + for (int i = 0; i < SCSI_BUS_MAX; ++i) { auto *cbox = findChild(QString("comboBoxSCSI%1").arg(i + 1)); model = cbox->model(); @@ -187,6 +218,14 @@ SettingsStorageControllers::on_comboBoxFD_currentIndexChanged(int index) ui->pushButtonFD->setEnabled(hdc_has_config(ui->comboBoxFD->currentData().toInt()) > 0); } +void SettingsStorageControllers::on_comboBoxCDInterface_currentIndexChanged(int index) +{ + if (index < 0) { + return; + } + ui->pushButtonCDInterface->setEnabled(cdrom_interface_has_config(ui->comboBoxCDInterface->currentData().toInt()) > 0); +} + void SettingsStorageControllers::on_checkBoxTertiaryIDE_stateChanged(int arg1) { diff --git a/src/qt/qt_settingsstoragecontrollers.hpp b/src/qt/qt_settingsstoragecontrollers.hpp index 7e9cd9d6c..5641889e4 100644 --- a/src/qt/qt_settingsstoragecontrollers.hpp +++ b/src/qt/qt_settingsstoragecontrollers.hpp @@ -32,10 +32,12 @@ private slots: void on_pushButtonTertiaryIDE_clicked(); void on_pushButtonFD_clicked(); void on_pushButtonHD_clicked(); + void on_pushButtonCDInterface_clicked(); void on_checkBoxQuaternaryIDE_stateChanged(int arg1); void on_checkBoxTertiaryIDE_stateChanged(int arg1); void on_comboBoxFD_currentIndexChanged(int index); void on_comboBoxHD_currentIndexChanged(int index); + void on_comboBoxCDInterface_currentIndexChanged(int index); private: Ui::SettingsStorageControllers *ui; diff --git a/src/qt/qt_settingsstoragecontrollers.ui b/src/qt/qt_settingsstoragecontrollers.ui index 30a59f982..558d4c441 100644 --- a/src/qt/qt_settingsstoragecontrollers.ui +++ b/src/qt/qt_settingsstoragecontrollers.ui @@ -49,6 +49,23 @@ + + + + CD-ROM Controller: + + + + + + + + + + Configure + + + @@ -69,21 +86,21 @@ - + Tertiary IDE Controller - + Quaternary IDE Controller - + false @@ -93,7 +110,7 @@ - + false diff --git a/src/scsi/scsi_cdrom.c b/src/scsi/scsi_cdrom.c index e736b879d..d2cf4c4e5 100644 --- a/src/scsi/scsi_cdrom.c +++ b/src/scsi/scsi_cdrom.c @@ -62,7 +62,7 @@ typedef struct #pragma pack(pop) /* Table of all SCSI commands and their flags, needed for the new disc change / not ready handler. */ -const uint8_t scsi_cdrom_command_flags[0x100] = { +uint8_t scsi_cdrom_command_flags[0x100] = { IMPLEMENTED | CHECK_READY | NONDATA, /* 0x00 */ IMPLEMENTED | ALLOW_UA | NONDATA | SCSI_ONLY, /* 0x01 */ 0, /* 0x02 */ @@ -71,7 +71,9 @@ const uint8_t scsi_cdrom_command_flags[0x100] = { IMPLEMENTED | CHECK_READY, /* 0x08 */ 0, 0, /* 0x09-0x0A */ IMPLEMENTED | CHECK_READY | NONDATA, /* 0x0B */ - 0, 0, 0, 0, 0, 0, /* 0x0C-0x11 */ + 0, /* 0x0C */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0x0D */ + 0, 0, 0, 0, /* 0x0E-0x11 */ IMPLEMENTED | ALLOW_UA, /* 0x12 */ IMPLEMENTED | CHECK_READY | NONDATA | SCSI_ONLY, /* 0x13 */ 0, /* 0x14 */ @@ -81,9 +83,11 @@ const uint8_t scsi_cdrom_command_flags[0x100] = { IMPLEMENTED | CHECK_READY, /* 0x1B */ 0, 0, /* 0x1C-0x1D */ IMPLEMENTED | CHECK_READY, /* 0x1E */ - 0, 0, 0, 0, 0, 0, /* 0x1F-0x24 */ + 0, 0, 0, /* 0x1F-0x21*/ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0x22*/ + 0, 0, /* 0x23-0x24 */ IMPLEMENTED | CHECK_READY, /* 0x25 */ - IMPLEMENTED | CHECK_READY | SCSI_ONLY | EARLY_ONLY, /* 0x26 */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0x26 */ 0, /* 0x27 */ IMPLEMENTED | CHECK_READY, /* 0x28 */ 0, 0, /* 0x29-0x2A */ @@ -143,21 +147,94 @@ const uint8_t scsi_cdrom_command_flags[0x100] = { IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xC0 */ IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xC1 */ IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xC2 */ - 0, /* 0xC3 */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xC3 */ IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xC4 */ - 0, /* 0xC5 */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xC5 */ IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xC6 */ IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xC7 */ - 0, 0, 0, 0, 0, /* 0xC8-0xCC */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xC8 */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xC9 */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xCA */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xCB */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xCC */ IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xCD */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xCE-0xD9 */ - IMPLEMENTED | SCSI_ONLY, /* 0xDA */ - 0, 0, 0, 0, 0, /* 0xDB-0xDF */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0-0xEF */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xCE-0xD7 */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xD8 */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xD9 */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xDA */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xDB */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xDC */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xDD */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xDE */ + 0, /* 0xDF */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xE0 */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xE1 */ + 0, /* 0xE2 */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xE3 */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xE4 */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xE5 */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xE6 */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xE7 */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xE8 */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xE9 */ + 0, /* 0xEA */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xEB */ + 0, /* 0xEC */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xED */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xEE */ + 0, /* 0xEF */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 /* 0xF0-0xFF */ }; static uint64_t scsi_cdrom_mode_sense_page_flags = (GPMODEP_R_W_ERROR_PAGE | GPMODEP_DISCONNECT_PAGE | GPMODEP_CDROM_PAGE | GPMODEP_CDROM_AUDIO_PAGE | (1ULL << 0x0fULL) | GPMODEP_CAPABILITIES_PAGE | GPMODEP_ALL_PAGES); +static uint64_t scsi_cdrom_mode_sense_page_flags_sony = (GPMODEP_R_W_ERROR_PAGE | GPMODEP_DISCONNECT_PAGE | GPMODEP_CDROM_PAGE_SONY | GPMODEP_CDROM_AUDIO_PAGE_SONY | (1ULL << 0x0fULL) | GPMODEP_CAPABILITIES_PAGE | GPMODEP_ALL_PAGES); +static uint64_t scsi_cdrom_drive_status_page_flags = ((1ULL << 0x01ULL) | (1ULL << 0x02ULL) | (1ULL << 0x0fULL) | GPMODEP_ALL_PAGES); + +static const mode_sense_pages_t scsi_cdrom_drive_status_pages = { + {{ 0, 0 }, + { 0x01, 0, 2, 0x0f, 0xbf }, /*Drive Status Data Format*/ + { 0x02, 0, 1, 0}, /*Audio Play Status Format*/ + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }} +}; static const mode_sense_pages_t scsi_cdrom_mode_sense_pages_default = { {{ 0, 0 }, @@ -174,7 +251,7 @@ static const mode_sense_pages_t scsi_cdrom_mode_sense_pages_default = { { 0, 0 }, { 0, 0 }, { GPMODE_CDROM_PAGE, 6, 0, 1, 0, 60, 0, 75 }, - { 0x8E, 0xE, 4, 0, 0, 0, 0, 75, 1, 255, 2, 255, 0, 0, 0, 0 }, + { GPMODE_CDROM_AUDIO_PAGE | 0x80, 0xE, 4, 0, 0, 0, 0, 75, 1, 255, 2, 255, 0, 0, 0, 0 }, { 0x0F, 0x14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0 }, { 0, 0 }, @@ -220,7 +297,53 @@ static const mode_sense_pages_t scsi_cdrom_mode_sense_pages_default_scsi = { { 0, 0 }, { 0, 0 }, { GPMODE_CDROM_PAGE, 6, 0, 1, 0, 60, 0, 75 }, - { 0x8E, 0xE, 5, 4, 0, 128, 0, 75, 1, 255, 2, 255, 0, 0, 0, 0 }, + { GPMODE_CDROM_AUDIO_PAGE | 0x80, 0xE, 5, 4, 0, 128, 0, 75, 1, 255, 2, 255, 0, 0, 0, 0 }, + { 0x0F, 0x14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 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 }} +}; + +static const mode_sense_pages_t scsi_cdrom_mode_sense_pages_default_sony_scsi = { + {{ 0, 0 }, + { GPMODE_R_W_ERROR_PAGE, 6, 0, 5, 0, 0, 0, 0 }, + { GPMODE_DISCONNECT_PAGE, 0x0e, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { GPMODE_CDROM_PAGE_SONY, 2, 1, 0 }, + { GPMODE_CDROM_AUDIO_PAGE_SONY | 0x80, 0xE, 5, 0, 0, 0, 0, 0, 1, 255, 2, 255, 0, 0, 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { GPMODE_CDROM_PAGE, 6, 0, 1, 0, 60, 0, 75 }, + { GPMODE_CDROM_AUDIO_PAGE | 0x80, 0xE, 5, 4, 0, 128, 0, 75, 1, 255, 2, 255, 0, 0, 0, 0 }, { 0x0F, 0x14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0 }, { 0, 0 }, @@ -266,7 +389,53 @@ static const mode_sense_pages_t scsi_cdrom_mode_sense_pages_changeable = { { 0, 0 }, { 0, 0 }, { GPMODE_CDROM_PAGE, 6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, - { 0x8E, 0xE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, + { GPMODE_CDROM_AUDIO_PAGE | 0x80, 0xE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, + { 0x0F, 0x14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { GPMODE_CAPABILITIES_PAGE, 0x12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }} +}; + +static const mode_sense_pages_t scsi_cdrom_mode_sense_pages_changeable_sony = { + {{ 0, 0 }, + { GPMODE_R_W_ERROR_PAGE, 6, 0xFF, 0xFF, 0, 0, 0, 0 }, + { GPMODE_DISCONNECT_PAGE, 0x0E, 0xFF, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0, 0, 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { GPMODE_CDROM_PAGE_SONY, 2, 0xFF, 0xFF }, + { GPMODE_CDROM_AUDIO_PAGE_SONY | 0x80, 0xE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { GPMODE_CDROM_PAGE, 6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, + { GPMODE_CDROM_AUDIO_PAGE | 0x80, 0xE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, { 0x0F, 0x14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0 }, { 0, 0 }, @@ -303,6 +472,7 @@ static gesn_event_header_t *gesn_event_header; static void scsi_cdrom_command_complete(scsi_cdrom_t *dev); static void scsi_cdrom_mode_sense_load(scsi_cdrom_t *dev); +static void scsi_cdrom_drive_status_load(scsi_cdrom_t *dev); static void scsi_cdrom_init(scsi_cdrom_t *dev); @@ -352,7 +522,7 @@ scsi_cdrom_init(scsi_cdrom_t *dev) dev->sense[0] = 0xf0; dev->sense[7] = 10; - if (dev->early) + if (!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "NEC_CD-ROM_DRIVE260_1.01") || !strcmp(cdrom_drive_types[dev->drv->type].internal_name, "NEC_CD-ROM_DRIVE260_1.00")) /*NEC only*/ dev->status = READY_STAT | DSC_STAT; else dev->status = 0; @@ -361,6 +531,8 @@ scsi_cdrom_init(scsi_cdrom_t *dev) scsi_cdrom_sense_key = scsi_cdrom_asc = scsi_cdrom_ascq = dev->unit_attention = 0; dev->drv->cur_speed = dev->drv->speed; scsi_cdrom_mode_sense_load(dev); + if (!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "PIONEER_CD-ROM_DRM-604X_2403")) + scsi_cdrom_drive_status_load(dev); } /* Returns: 0 for none, 1 for PIO, 2 for DMA. */ @@ -411,7 +583,11 @@ scsi_cdrom_get_channel(void *p, int channel) if (!dev) return channel + 1; - return dev->ms_pages_saved.pages[GPMODE_CDROM_AUDIO_PAGE][channel ? 10 : 8]; + if (!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-541_1.0i") || + !strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-76S_1.00")) + return dev->ms_pages_saved_sony.pages[dev->sony_vendor ? GPMODE_CDROM_AUDIO_PAGE_SONY : GPMODE_CDROM_AUDIO_PAGE][channel ? 10 : 8]; + else + return dev->ms_pages_saved.pages[GPMODE_CDROM_AUDIO_PAGE][channel ? 10 : 8]; } static uint32_t @@ -421,7 +597,11 @@ scsi_cdrom_get_volume(void *p, int channel) if (!dev) return 255; - return dev->ms_pages_saved.pages[GPMODE_CDROM_AUDIO_PAGE][channel ? 11 : 9]; + if (!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-541_1.0i") || + !strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-76S_1.00")) + return dev->ms_pages_saved_sony.pages[dev->sony_vendor ? GPMODE_CDROM_AUDIO_PAGE_SONY : GPMODE_CDROM_AUDIO_PAGE][channel ? 11 : 9]; + else + return dev->ms_pages_saved.pages[GPMODE_CDROM_AUDIO_PAGE][channel ? 11 : 9]; } static void @@ -430,22 +610,37 @@ scsi_cdrom_mode_sense_load(scsi_cdrom_t *dev) FILE *f; char file_name[512]; - memset(&dev->ms_pages_saved, 0, sizeof(mode_sense_pages_t)); - if (dev->drv->bus_type == CDROM_BUS_SCSI) - memcpy(&dev->ms_pages_saved, &scsi_cdrom_mode_sense_pages_default_scsi, sizeof(mode_sense_pages_t)); - else - memcpy(&dev->ms_pages_saved, &scsi_cdrom_mode_sense_pages_default, sizeof(mode_sense_pages_t)); + if (!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-541_1.0i") || + !strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-76S_1.00")) { + memset(&dev->ms_pages_saved_sony, 0, sizeof(mode_sense_pages_t)); + memcpy(&dev->ms_pages_saved_sony, &scsi_cdrom_mode_sense_pages_default_sony_scsi, sizeof(mode_sense_pages_t)); - memset(file_name, 0, 512); - if (dev->drv->bus_type == CDROM_BUS_SCSI) - sprintf(file_name, "scsi_cdrom_%02i_mode_sense_bin", dev->id); - else - sprintf(file_name, "cdrom_%02i_mode_sense_bin", dev->id); - f = plat_fopen(nvr_path(file_name), "rb"); - if (f) { - if (fread(dev->ms_pages_saved.pages[GPMODE_CDROM_AUDIO_PAGE], 1, 0x10, f) != 0x10) - fatal("scsi_cdrom_mode_sense_load(): Error reading data\n"); - fclose(f); + memset(file_name, 0, 512); + sprintf(file_name, "scsi_cdrom_%02i_mode_sense_sony_bin", dev->id); + f = plat_fopen(nvr_path(file_name), "rb"); + if (f) { + if (fread(dev->ms_pages_saved_sony.pages[GPMODE_CDROM_AUDIO_PAGE_SONY], 1, 0x10, f) != 0x10) + fatal("scsi_cdrom_mode_sense_load(): Error reading data\n"); + fclose(f); + } + } else { + memset(&dev->ms_pages_saved, 0, sizeof(mode_sense_pages_t)); + if (dev->drv->bus_type == CDROM_BUS_SCSI) + memcpy(&dev->ms_pages_saved, &scsi_cdrom_mode_sense_pages_default_scsi, sizeof(mode_sense_pages_t)); + else + memcpy(&dev->ms_pages_saved, &scsi_cdrom_mode_sense_pages_default, sizeof(mode_sense_pages_t)); + + memset(file_name, 0, 512); + if (dev->drv->bus_type == CDROM_BUS_SCSI) + sprintf(file_name, "scsi_cdrom_%02i_mode_sense_bin", dev->id); + else + sprintf(file_name, "cdrom_%02i_mode_sense_bin", dev->id); + f = plat_fopen(nvr_path(file_name), "rb"); + if (f) { + if (fread(dev->ms_pages_saved.pages[GPMODE_CDROM_AUDIO_PAGE], 1, 0x10, f) != 0x10) + fatal("scsi_cdrom_mode_sense_load(): Error reading data\n"); + fclose(f); + } } } @@ -456,35 +651,116 @@ scsi_cdrom_mode_sense_save(scsi_cdrom_t *dev) char file_name[512]; memset(file_name, 0, 512); - if (dev->drv->bus_type == CDROM_BUS_SCSI) - sprintf(file_name, "scsi_cdrom_%02i_mode_sense_bin", dev->id); - else - sprintf(file_name, "cdrom_%02i_mode_sense_bin", dev->id); - f = plat_fopen(nvr_path(file_name), "wb"); - if (f) { - fwrite(dev->ms_pages_saved.pages[GPMODE_CDROM_AUDIO_PAGE], 1, 0x10, f); - fclose(f); + + if (!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-541_1.0i") || + !strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-76S_1.00")) { + sprintf(file_name, "scsi_cdrom_%02i_mode_sense_sony_bin", dev->id); + f = plat_fopen(nvr_path(file_name), "wb"); + if (f) { + fwrite(dev->ms_pages_saved_sony.pages[GPMODE_CDROM_AUDIO_PAGE_SONY], 1, 0x10, f); + fclose(f); + } + } else { + if (dev->drv->bus_type == CDROM_BUS_SCSI) + sprintf(file_name, "scsi_cdrom_%02i_mode_sense_bin", dev->id); + else + sprintf(file_name, "cdrom_%02i_mode_sense_bin", dev->id); + f = plat_fopen(nvr_path(file_name), "wb"); + if (f) { + fwrite(dev->ms_pages_saved.pages[GPMODE_CDROM_AUDIO_PAGE], 1, 0x10, f); + fclose(f); + } } } +/*SCSI Drive Status (Pioneer only)*/ +static void +scsi_cdrom_drive_status_load(scsi_cdrom_t *dev) +{ + memset(&dev->ms_drive_status_pages_saved, 0, sizeof(mode_sense_pages_t)); + memcpy(&dev->ms_drive_status_pages_saved, &scsi_cdrom_drive_status_pages, sizeof(mode_sense_pages_t)); +} + +static uint8_t +scsi_cdrom_drive_status_read(scsi_cdrom_t *dev, uint8_t page_control, uint8_t page, uint8_t pos) +{ + return dev->ms_drive_status_pages_saved.pages[page][pos]; +} + +static uint32_t +scsi_cdrom_drive_status(scsi_cdrom_t *dev, uint8_t *buf, uint32_t pos, uint8_t page) +{ + uint8_t page_control = (page >> 6) & 3; + int i = 0, j = 0; + + uint16_t msplen; + + page &= 0x3f; + + for (i = 0; i < 0x40; i++) { + if (page == i) { + if (scsi_cdrom_drive_status_page_flags & (1LL << ((uint64_t) (page & 0x3f)))) { + buf[pos++] = scsi_cdrom_drive_status_read(dev, page_control, i, 0); + msplen = (scsi_cdrom_drive_status_read(dev, page_control, i, 1) << 8); + msplen |= scsi_cdrom_drive_status_read(dev, page_control, i, 2); + buf[pos++] = (msplen >> 8) & 0xff; + buf[pos++] = msplen & 0xff; + scsi_cdrom_log("CD-ROM %i: DRIVE STATUS: Page [%02X] length %i\n", dev->id, i, msplen); + for (j = 0; j < msplen; j++) { + if (i == 0x01) { + buf[pos++] = scsi_cdrom_drive_status_read(dev, page_control, i, 3 + j); + if (!(j & 1)) { /*MSB of Drive Status*/ + if (dev->drv->ops) /*Bit 11 of Drive Status, */ + buf[pos] &= ~0x08; /*Disc is present*/ + else + buf[pos] |= 0x08; /*Disc not present*/ + } + } else if ((i == 0x02) && (j == 0)) { + buf[pos++] = ((dev->drv->cd_status == CD_STATUS_PLAYING) ? 0x01 : 0x00); + } else + buf[pos++] = scsi_cdrom_drive_status_read(dev, page_control, i, 3 + j); + } + } + } + } + + return pos; +} + /*SCSI Mode Sense 6/10*/ static uint8_t scsi_cdrom_mode_sense_read(scsi_cdrom_t *dev, uint8_t page_control, uint8_t page, uint8_t pos) { - switch (page_control) { - case 0: - case 3: - return dev->ms_pages_saved.pages[page][pos]; - break; - case 1: - return scsi_cdrom_mode_sense_pages_changeable.pages[page][pos]; - break; - case 2: - if (dev->drv->bus_type == CDROM_BUS_SCSI) - return scsi_cdrom_mode_sense_pages_default_scsi.pages[page][pos]; - else - return scsi_cdrom_mode_sense_pages_default.pages[page][pos]; - break; + if (!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-541_1.0i") || + !strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-76S_1.00")) { + switch (page_control) { + case 0: + case 3: + return dev->ms_pages_saved_sony.pages[page][pos]; + break; + case 1: + return scsi_cdrom_mode_sense_pages_changeable_sony.pages[page][pos]; + break; + case 2: + return scsi_cdrom_mode_sense_pages_default_sony_scsi.pages[page][pos]; + break; + } + } else { + switch (page_control) { + case 0: + case 3: + return dev->ms_pages_saved.pages[page][pos]; + break; + case 1: + return scsi_cdrom_mode_sense_pages_changeable.pages[page][pos]; + break; + case 2: + if (dev->drv->bus_type == CDROM_BUS_SCSI) + return scsi_cdrom_mode_sense_pages_default_scsi.pages[page][pos]; + else + return scsi_cdrom_mode_sense_pages_default.pages[page][pos]; + break; + } } return 0; @@ -526,14 +802,25 @@ scsi_cdrom_mode_sense(scsi_cdrom_t *dev, uint8_t *buf, uint32_t pos, uint8_t pag else { if ((i == GPMODE_CAPABILITIES_PAGE) && (j == 4)) { buf[pos] = scsi_cdrom_mode_sense_read(dev, page_control, i, 2 + j) & 0x1f; - /* The early CD-ROM drives we emulate (NEC CDR-260 for ATAPI and Toshiba CDS-431) are + /* 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. */ - buf[pos++] |= (dev->early ? 0x00 : 0x20); + if (dev->drv->bus_type == CDROM_BUS_SCSI) { + buf[pos++] |= ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "86BOX_CD-ROM_1.00")) ? 0x20 : 0x00); + } else { + buf[pos++] |= ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "NEC_CD-ROM_DRIVE260_1.01") || + !strcmp(cdrom_drive_types[dev->drv->type].internal_name, "NEC_CD-ROM_DRIVE260_1.00")) ? 0x00 : 0x20); + } } else if ((i == GPMODE_CAPABILITIES_PAGE) && (j >= 6) && (j <= 7)) { if (j & 1) buf[pos++] = ((dev->drv->speed * 176) & 0xff); else buf[pos++] = ((dev->drv->speed * 176) >> 8); + } else if ((i == GPMODE_CAPABILITIES_PAGE) && (j >= 8) && (j <= 9) && + (!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "PIONEER_CD-ROM_DRM-604X_2403"))) { + if (j & 1) + buf[pos++] = ((dev->drv->speed * 176) & 0xff); + else + buf[pos++] = ((dev->drv->speed * 176) >> 8); } else if ((i == GPMODE_CAPABILITIES_PAGE) && (j >= 12) && (j <= 13)) { if (j & 1) buf[pos++] = ((dev->drv->cur_speed * 176) & 0xff); @@ -684,14 +971,44 @@ scsi_cdrom_command_common(scsi_cdrom_t *dev) case 0xb8: case 0xb9: case 0xbe: - case 0xc6: - case 0xc7: if (dev->current_cdb[0] == 0x42) dev->callback += 40.0; /* Account for seek time. */ bytes_per_second = 176.0 * 1024.0; bytes_per_second *= (double) dev->drv->cur_speed; break; + case 0xc6: + case 0xc7: + if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "TOSHIBA_CD-ROM_DRIVEXM_3433"))) { + bytes_per_second = 176.0 * 1024.0; + bytes_per_second *= (double) dev->drv->cur_speed; + } + break; + case 0xc1: + if (!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-541_1.0i") || + !strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-76S_1.00") || + !strcmp(cdrom_drive_types[dev->drv->type].internal_name, "PIONEER_CD-ROM_DRM-604X_2403")) { + bytes_per_second = 176.0 * 1024.0; + bytes_per_second *= (double) dev->drv->cur_speed; + } + break; + case 0xc2: + if (!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-541_1.0i") || + !strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-76S_1.00") || + !strcmp(cdrom_drive_types[dev->drv->type].internal_name, "PIONEER_CD-ROM_DRM-604X_2403")) { + dev->callback += 40.0; + bytes_per_second = 176.0 * 1024.0; + bytes_per_second *= (double) dev->drv->cur_speed; + } + break; + case 0xc3: + if (!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-541_1.0i") || + !strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-76S_1.00")) { + bytes_per_second = 176.0 * 1024.0; + bytes_per_second *= (double) dev->drv->cur_speed; + } + break; + default: bytes_per_second = scsi_cdrom_bus_speed(dev); if (bytes_per_second == 0.0) { @@ -846,9 +1163,9 @@ scsi_cdrom_unit_attention(scsi_cdrom_t *dev) static void scsi_cdrom_buf_alloc(scsi_cdrom_t *dev, uint32_t len) { - scsi_cdrom_log("CD-ROM %i: Allocated buffer length: %i\n", dev->id, len); if (!dev->buffer) dev->buffer = (uint8_t *) malloc(len); + scsi_cdrom_log("CD-ROM %i: Allocated buffer length: %i, buffer = %p\n", dev->id, len, dev->buffer); } static void @@ -955,7 +1272,7 @@ scsi_cdrom_data_phase_error(scsi_cdrom_t *dev) } static int -scsi_cdrom_read_data(scsi_cdrom_t *dev, int msf, int type, int flags, int32_t *len) +scsi_cdrom_read_data(scsi_cdrom_t *dev, int msf, int type, int flags, int32_t *len, int vendor_type) { int ret = 0, data_pos = 0; int i = 0, temp_len = 0; @@ -992,7 +1309,7 @@ scsi_cdrom_read_data(scsi_cdrom_t *dev, int msf, int type, int flags, int32_t *l for (i = 0; i < dev->requested_blocks; i++) { ret = cdrom_readsector_raw(dev->drv, dev->buffer + data_pos, - dev->sector_pos + i, msf, type, flags, &temp_len); + dev->sector_pos + i, msf, type, flags, &temp_len, vendor_type); data_pos += temp_len; dev->old_len += temp_len; @@ -1009,7 +1326,7 @@ scsi_cdrom_read_data(scsi_cdrom_t *dev, int msf, int type, int flags, int32_t *l } static int -scsi_cdrom_read_blocks(scsi_cdrom_t *dev, int32_t *len, int first_batch) +scsi_cdrom_read_blocks(scsi_cdrom_t *dev, int32_t *len, int first_batch, int vendor_type) { int ret = 0, msf = 0; int type = 0, flags = 0; @@ -1032,7 +1349,7 @@ scsi_cdrom_read_blocks(scsi_cdrom_t *dev, int32_t *len, int first_batch) scsi_cdrom_log("Reading %i blocks starting from %i...\n", dev->requested_blocks, dev->sector_pos); - ret = scsi_cdrom_read_data(dev, msf, type, flags, len); + ret = scsi_cdrom_read_data(dev, msf, type, flags, len, vendor_type); scsi_cdrom_log("Read %i bytes of blocks...\n", *len); @@ -1201,12 +1518,6 @@ scsi_cdrom_pre_execution_check(scsi_cdrom_t *dev, uint8_t *cdb) return 0; } - if (!dev->early && (scsi_cdrom_command_flags[cdb[0]] & EARLY_ONLY)) { - scsi_cdrom_log("CD-ROM %i: Attempting to execute SCSI-only command %02X over ATAPI\n", dev->id, cdb[0]); - scsi_cdrom_illegal_opcode(dev); - return 0; - } - if ((dev->drv->bus_type < CDROM_BUS_SCSI) && (scsi_cdrom_command_flags[cdb[0]] & SCSI_ONLY)) { scsi_cdrom_log("CD-ROM %i: Attempting to execute SCSI-only command %02X over ATAPI\n", dev->id, cdb[0]); scsi_cdrom_illegal_opcode(dev); @@ -1281,7 +1592,7 @@ static void scsi_cdrom_rezero(scsi_cdrom_t *dev) { dev->sector_pos = dev->sector_len = 0; - cdrom_seek(dev->drv, 0); + cdrom_seek(dev->drv, 0, 0); } void @@ -1392,10 +1703,8 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb) int toc_format, block_desc = 0; int ret, format = 0; int real_pos, track = 0; -#ifdef USE_86BOX_CD - char device_identify[9] = { '8', '6', 'B', '_', 'C', 'D', '0', '0', 0 }; - char device_identify_ex[15] = { '8', '6', 'B', '_', 'C', 'D', '0', '0', ' ', 'v', '1', '.', '0', '0', 0 }; -#endif + char device_identify[9] = { '8', '6', 'B', '_', 'C', 'D', '0', '0', 0 }; + char device_identify_ex[15] = { '8', '6', 'B', '_', 'C', 'D', '0', '0', ' ', 'v', '1', '.', '0', '0', 0 }; int32_t blen = 0, *BufLen; uint8_t *b; uint32_t profiles[2] = { MMC_PROFILE_CD_ROM, MMC_PROFILE_DVD_ROM }; @@ -1413,16 +1722,15 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb) dev->packet_len = 0; dev->request_pos = 0; -#ifdef USE_86BOX_CD device_identify[7] = dev->id + 0x30; device_identify_ex[7] = dev->id + 0x30; device_identify_ex[10] = EMU_VERSION_EX[0]; device_identify_ex[12] = EMU_VERSION_EX[2]; device_identify_ex[13] = EMU_VERSION_EX[3]; -#endif memcpy(dev->current_cdb, cdb, 12); + dev->sony_vendor = 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", @@ -1443,6 +1751,7 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb) if (scsi_cdrom_pre_execution_check(dev, cdb) == 0) return; +begin: switch (cdb[0]) { case GPCMD_TEST_UNIT_READY: scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS); @@ -1453,7 +1762,7 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb) scsi_cdrom_stop(sc); dev->sector_pos = dev->sector_len = 0; dev->drv->seek_diff = dev->drv->seek_pos; - cdrom_seek(dev->drv, 0); + cdrom_seek(dev->drv, 0, 0); scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS); break; @@ -1477,8 +1786,16 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb) scsi_cdrom_data_command_finish(dev, 18, 18, cdb[4], 0); break; + case 0xDA: /*GPCMD_SPEED_ALT*/ + if (!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "NEC_CD-ROM_DRIVE74_1.00") || + !strcmp(cdrom_drive_types[dev->drv->type].internal_name, "NEC_CD-ROM_DRIVE464_1.05")) { /*GPCMD_STILL_NEC*/ + scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS); + cdrom_audio_pause_resume(dev->drv, 0x00); + dev->drv->audio_op = 0x01; + scsi_cdrom_command_complete(dev); + break; + } case GPCMD_SET_SPEED: - case GPCMD_SET_SPEED_ALT: dev->drv->cur_speed = (cdb[3] | (cdb[2] << 8)) / 176; if (dev->drv->cur_speed < 1) dev->drv->cur_speed = 1; @@ -1488,6 +1805,24 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb) scsi_cdrom_command_complete(dev); break; + case 0xCD: + case GPCMD_AUDIO_SCAN: + scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS); + + if ((dev->drv->host_drive < 1) || (dev->drv->cd_status <= CD_STATUS_DATA_ONLY)) { + scsi_cdrom_illegal_mode(dev); + break; + } + + pos = (cdb[2] << 24) | (cdb[3] << 16) | (cdb[4] << 8) | cdb[5]; + ret = cdrom_audio_scan(dev->drv, pos, 0); + + if (ret) + scsi_cdrom_command_complete(dev); + else + scsi_cdrom_illegal_mode(dev); + break; + case GPCMD_MECHANISM_STATUS: scsi_cdrom_set_phase(dev, SCSI_PHASE_DATA_IN); len = (cdb[7] << 16) | (cdb[8] << 8) | cdb[9]; @@ -1538,34 +1873,47 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb) scsi_cdrom_set_buf_len(dev, BufLen, &len); scsi_cdrom_data_command_finish(dev, len, len, len, 0); - /* scsi_cdrom_log("CD-ROM %i: READ_TOC_PMA_ATIP format %02X, length %i (%i)\n", dev->id, - toc_format, ide->cylinder, dev->buffer[1]); */ return; - case GPCMD_READ_DISC_INFORMATION_TOSHIBA: + case 0xC7: + if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "MATSHITA_CD-ROM_CR-501_1.0b"))) { /*GPCMD_PLAY_AUDIO_MSF_MATSUSHITA*/ + cdb[0] = GPCMD_PLAY_AUDIO_MSF; + dev->current_cdb[0] = cdb[0]; + goto begin; + break; + } else if (!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-541_1.0i") || + !strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-76S_1.00")) { /*GPCMD_PLAY_MSF_SONY*/ + cdb[0] = GPCMD_PLAY_AUDIO_MSF; + dev->current_cdb[0] = cdb[0]; + dev->sony_vendor = 1; + goto begin; + break; + } /*GPCMD_READ_DISC_INFORMATION_TOSHIBA*/ + case 0xDE: /*GPCMD_READ_DISC_INFORMATION_NEC*/ scsi_cdrom_set_phase(dev, SCSI_PHASE_DATA_IN); + scsi_cdrom_buf_alloc(dev, 4); - scsi_cdrom_buf_alloc(dev, 65536); - - if ((!dev->drv->ops) && ((cdb[1] & 3) == 2)) { + if (!dev->drv->ops) { scsi_cdrom_not_ready(dev); return; } - memset(dev->buffer, 0, 4); - - cdrom_read_disc_info_toc(dev->drv, dev->buffer, cdb[2], cdb[1] & 3); - + ret = cdrom_read_disc_info_toc(dev->drv, dev->buffer, cdb[2], cdb[1] & 3); len = 4; - scsi_cdrom_set_buf_len(dev, BufLen, &len); + if (!ret) { + scsi_cdrom_invalid_field(dev); + scsi_cdrom_buf_free(dev); + return; + } + scsi_cdrom_set_buf_len(dev, BufLen, &len); scsi_cdrom_data_command_finish(dev, len, len, len, 0); return; case GPCMD_READ_CD_OLD: /* IMPORTANT: Convert the command to new read CD for pass through purposes. */ - dev->current_cdb[0] = 0xbe; + dev->current_cdb[0] = GPCMD_READ_CD; /*FALLTHROUGH*/ case GPCMD_READ_6: @@ -1665,7 +2013,18 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb) dev->drv->seek_diff = ABS((int) (pos - dev->sector_pos)); - ret = scsi_cdrom_read_blocks(dev, &alloc_length, 1); + if ((cdb[0] == GPCMD_READ_10) || (cdb[0] == GPCMD_READ_12)) { + if (!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "NEC_CD-ROM_DRIVE74_1.00") || + !strcmp(cdrom_drive_types[dev->drv->type].internal_name, "NEC_CD-ROM_DRIVE464_1.05") || + !strcmp(cdrom_drive_types[dev->drv->type].internal_name, "TOSHIBA_CD-ROM_DRIVEXM_3433") || + !strcmp(cdrom_drive_types[dev->drv->type].internal_name, "TOSHIBA_CD-ROM_XM-3301TA_0272") || + !strcmp(cdrom_drive_types[dev->drv->type].internal_name, "TOSHIBA_CD-ROM_XM-5701TA_3136")) + ret = scsi_cdrom_read_blocks(dev, &alloc_length, 1, cdb[9] & 0xc0); + else + ret = scsi_cdrom_read_blocks(dev, &alloc_length, 1, 0); + } else + ret = scsi_cdrom_read_blocks(dev, &alloc_length, 1, 0); + if (ret <= 0) { scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS); dev->packet_status = PHASE_COMPLETE; @@ -1733,10 +2092,19 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb) scsi_cdrom_buf_alloc(dev, 65536); } - if (!(scsi_cdrom_mode_sense_page_flags & (1LL << (uint64_t) (cdb[2] & 0x3f)))) { - scsi_cdrom_invalid_field(dev); - scsi_cdrom_buf_free(dev); - return; + if (!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-541_1.0i") || + !strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-76S_1.00")) { + if (!(scsi_cdrom_mode_sense_page_flags_sony & (1LL << (uint64_t) (cdb[2] & 0x3f)))) { + scsi_cdrom_invalid_field(dev); + scsi_cdrom_buf_free(dev); + return; + } + } else { + if (!(scsi_cdrom_mode_sense_page_flags & (1LL << (uint64_t) (cdb[2] & 0x3f)))) { + scsi_cdrom_invalid_field(dev); + scsi_cdrom_buf_free(dev); + return; + } } memset(dev->buffer, 0, len); @@ -2031,9 +2399,16 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb) scsi_cdrom_data_command_finish(dev, len, len, max_len, 0); break; - /* GPCMD_CHINON_EJECT on Chinon */ - case GPCMD_AUDIO_TRACK_SEARCH: - if (dev->early) { + case 0xC0: /*GPCMD_UNKNOWN_SONY*/ + if (!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-541_1.0i") || + !strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-76S_1.00")) { + scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS); + scsi_cdrom_command_complete(dev); + dev->sony_vendor = 1; + break; + } /*GPCMD_AUDIO_TRACK_SEARCH_TOSHIBA and GPCMD_EJECT_CHINON*/ + case 0xD8: /*GPCMD_AUDIO_TRACK_SEARCH_NEC*/ + if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "CHINON_CD-ROM_CDS-431_H42"))) { scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS); scsi_cdrom_stop(sc); cdrom_eject(dev->id); @@ -2055,14 +2430,51 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb) } break; - case GPCMD_TOSHIBA_PLAY_AUDIO: + case 0xC1: /*GPCMD_READ_TOC_SONY*/ + if (!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-541_1.0i") || + !strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-76S_1.00") || + !strcmp(cdrom_drive_types[dev->drv->type].internal_name, "PIONEER_CD-ROM_DRM-604X_2403")) { + scsi_cdrom_set_phase(dev, SCSI_PHASE_DATA_IN); + + if (strcmp(cdrom_drive_types[dev->drv->type].internal_name, "PIONEER_CD-ROM_DRM-604X_2403")) { + dev->sony_vendor = 0; + } else { + msf = dev->ms_pages_saved_sony.pages[GPMODE_CDROM_PAGE_SONY][2] & 0x01; + dev->sony_vendor = 1; + } + + max_len = cdb[7]; + max_len <<= 8; + max_len |= cdb[8]; + + scsi_cdrom_buf_alloc(dev, 65536); + + if (!dev->drv->ops) { + scsi_cdrom_not_ready(dev); + return; + } + + len = cdrom_read_toc_sony(dev->drv, dev->buffer, cdb[5], msf, max_len); + if (len == -1) { + /* If the returned length is -1, this means cdrom_read_toc_sony() has encountered an error. */ + scsi_cdrom_invalid_field(dev); + scsi_cdrom_buf_free(dev); + return; + } + + scsi_cdrom_set_buf_len(dev, BufLen, &len); + + scsi_cdrom_data_command_finish(dev, len, len, len, 0); + return; + } /*GPCMD_PLAY_AUDIO_TOSHIBA*/ + case 0xD9: /*GPCMD_PLAY_AUDIO_NEC*/ scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS); if ((dev->drv->host_drive < 1) || (dev->drv->cd_status <= CD_STATUS_DATA_ONLY)) { scsi_cdrom_illegal_mode(dev); break; } pos = (cdb[2] << 24) | (cdb[3] << 16) | (cdb[4] << 8) | cdb[5]; - ret = cdrom_toshiba_audio_play(dev->drv, pos, cdb[9] & 0xc0); + ret = cdrom_audio_play_toshiba(dev->drv, pos, cdb[9] & 0xc0); if (ret) scsi_cdrom_command_complete(dev); @@ -2134,6 +2546,7 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb) case GPCMD_READ_SUBCHANNEL: scsi_cdrom_set_phase(dev, SCSI_PHASE_DATA_IN); + dev->sony_vendor = 0; max_len = cdb[7]; max_len <<= 8; @@ -2191,13 +2604,13 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb) dev->buffer[1] = 0x11; break; case CD_STATUS_PAUSED: - dev->buffer[1] = ((dev->drv->bus_type == CDROM_BUS_SCSI) && dev->early) ? 0x15 : 0x12; + dev->buffer[1] = ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "CHINON_CD-ROM_CDS-431_H42"))) ? 0x15 : 0x12; break; case CD_STATUS_DATA_ONLY: - dev->buffer[1] = ((dev->drv->bus_type == CDROM_BUS_SCSI) && dev->early) ? 0x00 : 0x15; + dev->buffer[1] = ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "CHINON_CD-ROM_CDS-431_H42"))) ? 0x00 : 0x15; break; default: - dev->buffer[1] = ((dev->drv->bus_type == CDROM_BUS_SCSI) && dev->early) ? 0x00 : 0x13; + dev->buffer[1] = ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "CHINON_CD-ROM_CDS-431_H42"))) ? 0x00 : 0x13; break; } @@ -2210,9 +2623,34 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb) scsi_cdrom_data_command_finish(dev, len, len, len, 0); break; - /* GPCMD_CHINON_STOP on Chinon */ - case GPCMD_READ_SUBCODEQ_PLAYING_STATUS: - if (dev->early) { + case 0xC6: + if (!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-541_1.0i") || + !strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-76S_1.00")) { + scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS); + dev->sony_vendor = 1; + + msf = 3; + if ((cdb[5] != 1) || (cdb[8] != 1)) { + scsi_cdrom_illegal_mode(dev); + break; + } + pos = cdb[4]; + + if ((dev->drv->host_drive < 1) || (dev->drv->cd_status <= CD_STATUS_DATA_ONLY)) { + scsi_cdrom_illegal_mode(dev); + break; + } + + ret = cdrom_audio_play(dev->drv, pos, len, msf); + + if (ret) + scsi_cdrom_command_complete(dev); + else + scsi_cdrom_illegal_mode(dev); + break; + } /*GPCMD_READ_SUBCODEQ_PLAYING_STATUS_TOSHIBA and GPCMD_STOP_CHINON*/ + case 0xDD: /*GPCMD_READ_SUBCODEQ_PLAYING_STATUS_NEC*/ + if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "CHINON_CD-ROM_CDS-431_H42"))) { scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS); scsi_cdrom_stop(sc); scsi_cdrom_command_complete(dev); @@ -2220,8 +2658,7 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb) scsi_cdrom_set_phase(dev, SCSI_PHASE_DATA_IN); alloc_length = cdb[1] & 0x1f; - - scsi_cdrom_buf_alloc(dev, alloc_length); + len = 10; if (!dev->drv->ops) { scsi_cdrom_not_ready(dev); @@ -2230,14 +2667,15 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb) if (!alloc_length) { scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS); - scsi_cdrom_log("CD-ROM %i: All done - callback set\n", dev->id); + scsi_cdrom_log("CD-ROM %i: Subcode Q All done - callback set\n", dev->id); dev->packet_status = PHASE_COMPLETE; dev->callback = 20.0 * CDROM_TIME; scsi_cdrom_set_callback(dev); break; } - len = alloc_length; + scsi_cdrom_buf_alloc(dev, len); + len = MIN(len, alloc_length); memset(dev->buffer, 0, len); dev->buffer[0] = cdrom_get_current_subcodeq_playstatus(dev->drv, &dev->buffer[1]); @@ -2284,7 +2722,7 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb) } break; - case GPCMD_CHINON_UNKNOWN: + case 0x26: /*GPCMD_UNKNOWN_CHINON*/ scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS); scsi_cdrom_stop(sc); scsi_cdrom_command_complete(dev); @@ -2313,7 +2751,43 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb) scsi_cdrom_command_complete(dev); break; - case GPCMD_CADDY_EJECT: + case 0xC4: + if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "MATSHITA_CD-ROM_CR-501_1.0b"))) { /*GPCMD_READ_HEADER_MATSUSHITA*/ + cdb[0] = GPCMD_READ_HEADER; + dev->current_cdb[0] = cdb[0]; + goto begin; + break; + } else if (!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-541_1.0i") || + !strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-76S_1.00")) { /*GPCMD_PLAYBACK_STATUS_SONY*/ + scsi_cdrom_set_phase(dev, SCSI_PHASE_DATA_IN); + dev->sony_vendor = 1; + + max_len = cdb[7]; + max_len <<= 8; + max_len |= cdb[8]; + msf = dev->ms_pages_saved_sony.pages[GPMODE_CDROM_PAGE_SONY][2] & 0x01; + + scsi_cdrom_buf_alloc(dev, 18); + + len = max_len; + + memset(dev->buffer, 0, 10); + dev->buffer[0] = 0x00; /*Reserved*/ + dev->buffer[1] = 0x00; /*Reserved*/ + dev->buffer[2] = cdb[7]; /*Audio Status data length*/ + dev->buffer[3] = cdb[8]; /*Audio Status data length*/ + dev->buffer[4] = cdrom_get_audio_status_sony(dev->drv, &dev->buffer[6], msf); /*Audio status*/ + dev->buffer[5] = 0x00; + + scsi_cdrom_log("Audio Status = %02x\n", dev->buffer[4]); + + len = MIN(len, max_len); + scsi_cdrom_set_buf_len(dev, BufLen, &len); + + scsi_cdrom_data_command_finish(dev, len, len, len, 0); + break; + } /*GPCMD_CADDY_EJECT_TOSHIBA and GPCMD_CADDY_EJECT_NEC*/ + case 0xDC: scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS); scsi_cdrom_stop(sc); cdrom_eject(dev->id); @@ -2333,7 +2807,7 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb) preamble_len = 4; size_idx = 3; - dev->buffer[idx++] = 05; + dev->buffer[idx++] = 5; dev->buffer[idx++] = cdb[2]; dev->buffer[idx++] = 0; @@ -2364,41 +2838,20 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb) dev->buffer[idx++] = 0x01; dev->buffer[idx++] = 0x00; dev->buffer[idx++] = 68; -#ifdef USE_86BOX_CD - ide_padstr8(dev->buffer + idx, 8, EMU_NAME); /* Vendor */ -#else - if (dev->drv->bus_type == CDROM_BUS_SCSI) { - if (dev->early) - ide_padstr8(dev->buffer + idx, 8, "CHINON"); /* Vendor */ - else - ide_padstr8(dev->buffer + idx, 8, "TOSHIBA"); /* Vendor */ - } else { - if (dev->early) - ide_padstr8(dev->buffer + idx, 8, "NEC"); /* Vendor */ - else if (machine_is_sony()) - ide_padstr8(dev->buffer + idx, 8, "SONY"); /* Vendor */ - else - ide_padstr8(dev->buffer + idx, 8, "HITACHI"); /* Vendor */ - } -#endif + + if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "86BOX_CD-ROM_1.00"))) + ide_padstr8(dev->buffer + idx, 8, EMU_NAME); /* Vendor */ + else + ide_padstr8(dev->buffer + idx, 8, cdrom_drive_types[dev->drv->type].vendor); /* Vendor */ + idx += 8; -#ifdef USE_86BOX_CD - ide_padstr8(dev->buffer + idx, 40, device_identify_ex); /* Product */ -#else - if (dev->drv->bus_type == CDROM_BUS_SCSI) { - if (dev->early) - ide_padstr8(dev->buffer + idx, 40, "CD-ROM CDS-431"); /* Product */ - else - ide_padstr8(dev->buffer + idx, 40, "CD-ROM DRIVE:XM"); /* Product */ - } else { - if (dev->early) - ide_padstr8(dev->buffer + idx, 40, "CD-ROM DRIVE:260"); /* Product */ - else if (machine_is_sony()) - ide_padstr8(dev->buffer + idx, 40, "CD-ROM CDU76"); /* Product */ - else - ide_padstr8(dev->buffer + idx, 40, "CDR-8130"); /* Product */ - } -#endif + + if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "86BOX_CD-ROM_1.00"))) + ide_padstr8(dev->buffer + idx, 40, device_identify_ex); /* Product */ + else + ide_padstr8(dev->buffer + idx, 40, cdrom_drive_types[dev->drv->type].model); /* Product */ + + idx += 40; ide_padstr8(dev->buffer + idx, 20, "53R141"); /* Serial */ idx += 20; @@ -2419,8 +2872,37 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb) dev->buffer[1] = 0x80; /*Removable*/ if (dev->drv->bus_type == CDROM_BUS_SCSI) { - dev->buffer[2] = 0x02; dev->buffer[3] = 0x02; + if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "86BOX_CD-ROM_1.00"))) { + dev->buffer[2] = 0x05; + } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "TOSHIBA_CD-ROM_DRIVEXM_3433"))) { + dev->buffer[2] = 0x02; + } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "TOSHIBA_CD-ROM_XM-3301TA_0272"))) { + dev->buffer[2] = 0x02; + } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "TOSHIBA_CD-ROM_XM-5701TA_3136"))) { + dev->buffer[2] = 0x02; + } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "CHINON_CD-ROM_CDS-431_H42"))) { + dev->buffer[3] = 0x01; + dev->buffer[2] = 0x02; + } else if (!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-541_1.0i")) { + dev->buffer[3] = 0x01; + dev->buffer[2] = 0x02; + } else if (!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-76S_1.00")) { + dev->buffer[3] = 0x01; + dev->buffer[2] = 0x02; + } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "MATSHITA_CD-ROM_CR-501_1.0b"))) { + dev->buffer[3] = 0x01; + dev->buffer[2] = 0x02; + } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "NEC_CD-ROM_DRIVE74_1.00"))) { + dev->buffer[3] = 0x01; + dev->buffer[2] = 0x02; + } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "DEC_RRD45_0436"))) { + dev->buffer[2] = 0x02; + } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "NEC_CD-ROM_DRIVE464_1.05"))) { + dev->buffer[2] = 0x02; + } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "PIONEER_CD-ROM_DRM-604X_2403"))) { + dev->buffer[2] = 0x02; + } } else { dev->buffer[2] = 0x00; dev->buffer[3] = 0x21; @@ -2428,47 +2910,57 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb) dev->buffer[4] = 31; if (dev->drv->bus_type == CDROM_BUS_SCSI) { - dev->buffer[6] = 1; /* 16-bit transfers supported */ - dev->buffer[7] = 0x20; /* Wide bus supported */ + if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "86BOX_CD-ROM_1.00"))) { + dev->buffer[6] = 0x01; /* 16-bit transfers supported */ + dev->buffer[7] = 0x20; /* Wide bus supported */ + } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "PLEXTOR_CD-ROM_PX-32TS_1.03"))) { + dev->buffer[6] = 0x01; /* 16-bit transfers supported */ + dev->buffer[7] = 0x20; /* Wide bus supported */ + } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "TEAC_CD-R55S_1.0R"))) { + dev->buffer[6] = 0x01; /* 16-bit transfers supported */ + dev->buffer[7] = 0x20; /* Wide bus supported */ + } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "DEC_RRD45_0436"))) { + dev->buffer[7] = 0x98; /* Linked Command and Relative Addressing supported */ + } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "TOSHIBA_CD-ROM_DRIVEXM_3433"))) { + dev->buffer[4] = 91; /* Always 91 on Toshiba SCSI-2 CD-ROM drives from 1990*/ + dev->buffer[7] = 0x88; /* Linked Command and Relative Addressing supported */ + } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "TOSHIBA_CD-ROM_XM-3301TA_0272"))) { + dev->buffer[4] = 91; /* Always 91 on Toshiba SCSI-2 CD-ROM drives from 1990*/ + dev->buffer[7] = 0x88; /* Linked Command and Relative Addressing supported */ + } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "TOSHIBA_CD-ROM_XM-5701TA_3136"))) { + dev->buffer[4] = 91; /* Always 91 on Toshiba SCSI-2 CD-ROM drives from 1990*/ + dev->buffer[7] = 0x88; /* Linked Command and Relative Addressing supported */ + } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "PIONEER_CD-ROM_DRM-604X_2403"))) { + dev->buffer[4] = 42; + } } -#ifdef USE_86BOX_CD - ide_padstr8(dev->buffer + 8, 8, EMU_NAME); /* Vendor */ - ide_padstr8(dev->buffer + 16, 16, device_identify); /* Product */ - ide_padstr8(dev->buffer + 32, 4, EMU_VERSION_EX); /* Revision */ -#else - if (dev->drv->bus_type == CDROM_BUS_SCSI) { - if (dev->early) { - ide_padstr8(dev->buffer + 8, 8, "CHINON"); /* Vendor */ - ide_padstr8(dev->buffer + 16, 16, "CD-ROM CDS-431"); /* Product */ - ide_padstr8(dev->buffer + 32, 4, "H42"); /* Revision */ - } else { - ide_padstr8(dev->buffer + 8, 8, "TOSHIBA"); /* Vendor */ - ide_padstr8(dev->buffer + 16, 16, "CD-ROM DRIVE:XM"); /* Product */ - ide_padstr8(dev->buffer + 32, 4, "3433"); /* Revision */ - } + if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "86BOX_CD-ROM_1.00"))) { + ide_padstr8(dev->buffer + 8, 8, EMU_NAME); /* Vendor */ + ide_padstr8(dev->buffer + 16, 16, device_identify); /* Product */ + ide_padstr8(dev->buffer + 32, 4, EMU_VERSION_EX); /* Revision */ } else { - if (dev->early) { - ide_padstr8(dev->buffer + 8, 8, "NEC"); /* Vendor */ - ide_padstr8(dev->buffer + 16, 16, "CD-ROM DRIVE:260"); /* Product */ - ide_padstr8(dev->buffer + 32, 4, "1.01"); /* Revision */ - } else if (machine_is_sony()) { - ide_padstr8(dev->buffer + 8, 8, "SONY"); /* Vendor */ - ide_padstr8(dev->buffer + 16, 16, "CD-ROM CDU76"); /* Product */ - ide_padstr8(dev->buffer + 32, 4, "1.0i"); /* Revision */ - } else { - ide_padstr8(dev->buffer + 8, 8, "HITACHI"); /* Vendor */ - ide_padstr8(dev->buffer + 16, 16, "CDR-8130"); /* Product */ - ide_padstr8(dev->buffer + 32, 4, "0020"); /* Revision */ + ide_padstr8(dev->buffer + 8, 8, cdrom_drive_types[dev->drv->type].vendor); /* Vendor */ + ide_padstr8(dev->buffer + 16, 16, cdrom_drive_types[dev->drv->type].model); /* Product */ + ide_padstr8(dev->buffer + 32, 4, cdrom_drive_types[dev->drv->type].revision); /* Revision */ + if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "PIONEER_CD-ROM_DRM-604X_2403"))) { + dev->buffer[36] = 0x20; + ide_padstr8(dev->buffer + 37, 10, "1993/01/01"); /* Date */ } } -#endif idx = 36; - - if (max_len == 96) { - dev->buffer[4] = 91; - idx = 96; + if (!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "TOSHIBA_CD-ROM_DRIVEXM_3433") || + !strcmp(cdrom_drive_types[dev->drv->type].internal_name, "TOSHIBA_CD-ROM_XM-3301TA_0272") || + !strcmp(cdrom_drive_types[dev->drv->type].internal_name, "TOSHIBA_CD-ROM_XM-5701TA_3136")) /*Toshiba only*/ + idx = 96; + else if (!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "PIONEER_CD-ROM_DRM-604X_2403")) /*Pioneer only*/ + idx = 47; + else { + if (max_len == 96) { + dev->buffer[4] = 91; + idx = 96; + } } } @@ -2477,19 +2969,23 @@ atapi_out: len = idx; len = MIN(len, max_len); + scsi_cdrom_set_buf_len(dev, BufLen, &len); + scsi_cdrom_log("Inquiry = %d, max = %d, BufLen = %d.\n", len, max_len, *BufLen); scsi_cdrom_data_command_finish(dev, len, len, max_len, 0); break; + case 0x0D: /*GPCMD_NO_OPERATION_TOSHIBA and GPCMD_NO_OPERATION_NEC*/ + scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS); + scsi_cdrom_command_complete(dev); + break; + case GPCMD_PREVENT_REMOVAL: scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS); scsi_cdrom_command_complete(dev); break; -#if 0 - case GPCMD_PAUSE_RESUME_ALT: -#endif case GPCMD_PAUSE_RESUME: scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS); cdrom_audio_pause_resume(dev->drv, cdb[8] & 0x01); @@ -2497,7 +2993,81 @@ atapi_out: scsi_cdrom_command_complete(dev); break; - case GPCMD_STILL: + case 0xC3: + if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "MATSHITA_CD-ROM_CR-501_1.0b"))) { /*GPCMD_READ_TOC_MATSUSHITA*/ + cdb[0] = GPCMD_READ_TOC_PMA_ATIP; + dev->current_cdb[0] = cdb[0]; + goto begin; + break; + } else if (!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-541_1.0i") || + !strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-76S_1.00")) { /*GPCMD_READ_HEADER_SONY*/ + scsi_cdrom_set_phase(dev, SCSI_PHASE_DATA_IN); + dev->sony_vendor = 1; + + alloc_length = ((cdb[7] << 8) | cdb[8]); + scsi_cdrom_buf_alloc(dev, 4); + + dev->sector_len = 1; + dev->sector_pos = (cdb[2] << 24) | (cdb[3] << 16) | (cdb[4] << 8) | cdb[5]; + real_pos = cdrom_lba_to_msf_accurate(dev->sector_pos); + dev->buffer[0] = ((real_pos >> 16) & 0xff); + dev->buffer[1] = ((real_pos >> 8) & 0xff); + dev->buffer[2] = real_pos & 0xff; + dev->buffer[3] = 1; /*2048 bytes user data*/ + + len = 4; + len = MIN(len, alloc_length); + + scsi_cdrom_set_buf_len(dev, BufLen, &len); + + scsi_cdrom_data_command_finish(dev, len, len, len, 0); + return; + } /*GPCMD_SET_STOP_TIME_TOSHIBA and GPCMD_SET_STOP_TIME_NEC*/ + case 0xDB: + scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS); + scsi_cdrom_command_complete(dev); + break; + + case 0xC2: + if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "MATSHITA_CD-ROM_CR-501_1.0b"))) { /*GPCMD_READ_SUBCHANNEL_MATSUSHITA*/ + cdb[0] = GPCMD_READ_SUBCHANNEL; + dev->current_cdb[0] = cdb[0]; + goto begin; + break; + } else if (!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-541_1.0i") || + !strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-76S_1.00") || + !strcmp(cdrom_drive_types[dev->drv->type].internal_name, "PIONEER_CD-ROM_DRM-604X_2403")) { /*GPCMD_READ_SUBCHANNEL_SONY*/ + scsi_cdrom_set_phase(dev, SCSI_PHASE_DATA_IN); + + dev->sony_vendor = !strcmp(cdrom_drive_types[dev->drv->type].internal_name, "PIONEER_CD-ROM_DRM-604X_2403") ? 0 : 1; + + max_len = cdb[7]; + max_len <<= 8; + max_len |= cdb[8]; + if (strcmp(cdrom_drive_types[dev->drv->type].internal_name, "PIONEER_CD-ROM_DRM-604X_2403")) + msf = dev->ms_pages_saved_sony.pages[GPMODE_CDROM_PAGE_SONY][2] & 0x01; + + scsi_cdrom_buf_alloc(dev, 32); + + scsi_cdrom_log("CD-ROM %i: Getting sub-channel type (%s)\n", dev->id, msf ? "MSF" : "LBA"); + + if (!(cdb[2] & 0x40)) + alloc_length = 4; + else + alloc_length = 24; + + len = alloc_length; + + memset(dev->buffer, 0, 24); + cdrom_get_current_subchannel_sony(dev->drv, dev->buffer, msf); + + len = MIN(len, max_len); + scsi_cdrom_set_buf_len(dev, BufLen, &len); + + scsi_cdrom_data_command_finish(dev, len, len, len, 0); + break; + } + /*GPCMD_STILL_TOSHIBA*/ scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS); cdrom_audio_pause_resume(dev->drv, 0x00); dev->drv->audio_op = 0x01; @@ -2517,7 +3087,18 @@ atapi_out: break; } dev->drv->seek_diff = ABS((int) (pos - dev->drv->seek_pos)); - cdrom_seek(dev->drv, pos); + if (cdb[0] == GPCMD_SEEK_10) { + if (!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "NEC_CD-ROM_DRIVE74_1.00") || + !strcmp(cdrom_drive_types[dev->drv->type].internal_name, "NEC_CD-ROM_DRIVE464_1.05") || + !strcmp(cdrom_drive_types[dev->drv->type].internal_name, "TOSHIBA_CD-ROM_DRIVEXM_3433") || + !strcmp(cdrom_drive_types[dev->drv->type].internal_name, "TOSHIBA_CD-ROM_XM-3301TA_0272") || + !strcmp(cdrom_drive_types[dev->drv->type].internal_name, "TOSHIBA_CD-ROM_XM-5701TA_3136")) + cdrom_seek(dev->drv, pos, cdb[9] & 0xc0); + else + cdrom_seek(dev->drv, pos, 0); + } else + cdrom_seek(dev->drv, pos, 0); + scsi_cdrom_command_complete(dev); break; @@ -2552,6 +3133,143 @@ atapi_out: scsi_cdrom_command_complete(dev); break; + case 0xC5: + if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "MATSHITA_CD-ROM_CR-501_1.0b"))) { /*GPCMD_PLAY_AUDIO_MATSUSHITA*/ + cdb[0] = GPCMD_PLAY_AUDIO_10; + dev->current_cdb[0] = cdb[0]; + goto begin; + break; + } else if (!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-541_1.0i") || + !strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-76S_1.00")) { /*GPCMD_PAUSE_SONY*/ + scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS); + dev->sony_vendor = 1; + cdrom_audio_pause_resume(dev->drv, !(cdb[1] & 0x10)); + scsi_cdrom_command_complete(dev); + break; + } + case 0xC8: + if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "MATSHITA_CD-ROM_CR-501_1.0b"))) { /*GPCMD_PLAY_AUDIO_TRACK_INDEX_MATSUSHITA*/ + cdb[0] = GPCMD_PLAY_AUDIO_TRACK_INDEX; + dev->current_cdb[0] = cdb[0]; + goto begin; + break; + } else if (!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-541_1.0i") || + !strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-76S_1.00")) { /*GPCMD_PLAY_AUDIO_SONY*/ + cdb[0] = GPCMD_PLAY_AUDIO_10; + dev->current_cdb[0] = cdb[0]; + dev->sony_vendor = 1; + goto begin; + break; + } + case 0xC9: + if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "MATSHITA_CD-ROM_CR-501_1.0b"))) { /*GPCMD_PLAY_AUDIO_TRACK_RELATIVE_10_MATSUSHITA*/ + cdb[0] = GPCMD_PLAY_AUDIO_TRACK_RELATIVE_10; + dev->current_cdb[0] = cdb[0]; + goto begin; + break; + } else if (!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-541_1.0i") || + !strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-76S_1.00")) { /*GPCMD_PLAYBACK_CONTROL_SONY*/ + scsi_cdrom_set_phase(dev, SCSI_PHASE_DATA_OUT); + dev->sony_vendor = 1; + + len = (cdb[7] << 8) | cdb[8]; + scsi_cdrom_buf_alloc(dev, 65536); + + scsi_cdrom_set_buf_len(dev, BufLen, &len); + scsi_cdrom_data_command_finish(dev, len, len, len, 1); + break; + } + case 0xCA: + if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "PIONEER_CD-ROM_DRM-604X_2403"))) { /*GPCMD_PAUSE_PIONEER*/ + scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS); + cdrom_audio_pause_resume(dev->drv, !(cdb[1] & 0x10)); + scsi_cdrom_command_complete(dev); + break; + } + case 0xCB: + if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "MATSHITA_CD-ROM_CR-501_1.0b"))) { /*GPCMD_PAUSE_RESUME_MATSUSHITA*/ + cdb[0] = GPCMD_PAUSE_RESUME; + dev->current_cdb[0] = cdb[0]; + goto begin; + break; + } + case 0xCC: + if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "PIONEER_CD-ROM_DRM-604X_2403"))) { + scsi_cdrom_set_phase(dev, SCSI_PHASE_DATA_IN); + + max_len = cdb[7]; + max_len <<= 8; + max_len |= cdb[8]; + + scsi_cdrom_buf_alloc(dev, 18); + + len = max_len; + + memset(dev->buffer, 0, 10); + dev->buffer[0] = 0x00; /*Reserved*/ + dev->buffer[1] = 0x00; /*Reserved*/ + dev->buffer[2] = cdb[7]; /*Audio Status data length*/ + dev->buffer[3] = cdb[8]; /*Audio Status data length*/ + dev->buffer[4] = cdrom_get_audio_status_sony(dev->drv, &dev->buffer[6], msf); /*Audio status*/ + dev->buffer[5] = 0x00; + + scsi_cdrom_log("Audio Status = %02x\n", dev->buffer[4]); + + len = MIN(len, max_len); + scsi_cdrom_set_buf_len(dev, BufLen, &len); + + scsi_cdrom_data_command_finish(dev, len, len, len, 0); + break; + } + case 0xE0: + if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "PIONEER_CD-ROM_DRM-604X_2403"))) { /*GPCMD_DRIVE_STATUS_PIONEER*/ + scsi_cdrom_set_phase(dev, SCSI_PHASE_DATA_IN); + + len = (cdb[9] | (cdb[8] << 8)); + scsi_cdrom_buf_alloc(dev, 65536); + + if (!(scsi_cdrom_drive_status_page_flags & (1LL << (uint64_t) (cdb[2] & 0x3f)))) { + scsi_cdrom_invalid_field(dev); + scsi_cdrom_buf_free(dev); + return; + } + + if (!len) { + scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS); + scsi_cdrom_log("CD-ROM %i: Drive Status All done - callback set\n", dev->id); + dev->packet_status = PHASE_COMPLETE; + dev->callback = 20.0 * CDROM_TIME; + scsi_cdrom_set_callback(dev); + break; + } + + memset(dev->buffer, 0, len); + alloc_length = len; + + len = scsi_cdrom_drive_status(dev, dev->buffer, 0, cdb[2]); + len = MIN(len, alloc_length); + + scsi_cdrom_set_buf_len(dev, BufLen, &len); + + scsi_cdrom_log("CD-ROM %i: Reading drive status page: %02X...\n", dev->id, cdb[2]); + + scsi_cdrom_data_command_finish(dev, len, len, alloc_length, 0); + return; + } + case 0xE5: + if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "MATSHITA_CD-ROM_CR-501_1.0b"))) { /*GPCMD_PLAY_AUDIO_12_MATSUSHITA*/ + cdb[0] = GPCMD_PLAY_AUDIO_12; + dev->current_cdb[0] = cdb[0]; + goto begin; + break; + } + case 0xE9: + if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "MATSHITA_CD-ROM_CR-501_1.0b"))) { /*GPCMD_PLAY_AUDIO_TRACK_RELATIVE_12_MATSUSHITA*/ + cdb[0] = GPCMD_PLAY_AUDIO_TRACK_RELATIVE_12; + dev->current_cdb[0] = cdb[0]; + goto begin; + break; + } default: scsi_cdrom_illegal_opcode(dev); break; @@ -2623,20 +3341,42 @@ scsi_cdrom_phase_data_out(scsi_common_t *sc) pos += 2; - if (!(scsi_cdrom_mode_sense_page_flags & (1LL << ((uint64_t) page)))) { - scsi_cdrom_log("CD-ROM %i: Unimplemented page %02X\n", dev->id, page); - error |= 1; + if (!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-541_1.0i") || + !strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-76S_1.00")) { + if (!(scsi_cdrom_mode_sense_page_flags_sony & (1LL << ((uint64_t) page)))) { + scsi_cdrom_log("CD-ROM %i: Unimplemented page %02X\n", dev->id, page); + error |= 1; + } else { + for (i = 0; i < page_len; i++) { + ch = scsi_cdrom_mode_sense_pages_changeable_sony.pages[page][i + 2]; + val = dev->buffer[pos + i]; + old_val = dev->ms_pages_saved_sony.pages[page][i + 2]; + if (val != old_val) { + if (ch) + dev->ms_pages_saved_sony.pages[page][i + 2] = val; + else { + scsi_cdrom_log("CD-ROM %i: Unchangeable value on position %02X on page %02X\n", dev->id, i + 2, page); + error |= 1; + } + } + } + } } else { - for (i = 0; i < page_len; i++) { - ch = scsi_cdrom_mode_sense_pages_changeable.pages[page][i + 2]; - val = dev->buffer[pos + i]; - old_val = dev->ms_pages_saved.pages[page][i + 2]; - if (val != old_val) { - if (ch) - dev->ms_pages_saved.pages[page][i + 2] = val; - else { - scsi_cdrom_log("CD-ROM %i: Unchangeable value on position %02X on page %02X\n", dev->id, i + 2, page); - error |= 1; + if (!(scsi_cdrom_mode_sense_page_flags & (1LL << ((uint64_t) page)))) { + scsi_cdrom_log("CD-ROM %i: Unimplemented page %02X\n", dev->id, page); + error |= 1; + } else { + for (i = 0; i < page_len; i++) { + ch = scsi_cdrom_mode_sense_pages_changeable.pages[page][i + 2]; + val = dev->buffer[pos + i]; + old_val = dev->ms_pages_saved.pages[page][i + 2]; + if (val != old_val) { + if (ch) + dev->ms_pages_saved.pages[page][i + 2] = val; + else { + scsi_cdrom_log("CD-ROM %i: Unchangeable value on position %02X on page %02X\n", dev->id, i + 2, page); + error |= 1; + } } } } @@ -2644,7 +3384,10 @@ scsi_cdrom_phase_data_out(scsi_common_t *sc) pos += page_len; - if (dev->drv->bus_type == CDROM_BUS_SCSI) + if (!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-541_1.0i") || + !strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-76S_1.00")) + val = scsi_cdrom_mode_sense_pages_default_sony_scsi.pages[page][0] & 0x80; + else if (dev->drv->bus_type == CDROM_BUS_SCSI) val = scsi_cdrom_mode_sense_pages_default_scsi.pages[page][0] & 0x80; else val = scsi_cdrom_mode_sense_pages_default.pages[page][0] & 0x80; @@ -2662,6 +3405,14 @@ scsi_cdrom_phase_data_out(scsi_common_t *sc) return 0; } break; + case 0xC9: + if (!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-541_1.0i") || + !strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-76S_1.00")) { + for (i = 0; i < 18; i++) { + dev->ms_pages_saved_sony.pages[GPMODE_CDROM_AUDIO_PAGE_SONY][i] = dev->buffer[i]; + } + } + break; } scsi_cdrom_command_stop((scsi_common_t *) dev); @@ -2732,43 +3483,72 @@ scsi_cdrom_get_timings(int ide_has_dma, int type) static void scsi_cdrom_identify(ide_t *ide, int ide_has_dma) { -#ifdef USE_86BOX_CD scsi_cdrom_t *dev; - char device_identify[9] = { '8', '6', 'B', '_', 'C', 'D', '0', '0', 0 }; + char device_identify[9] = { '8', '6', 'B', '_', 'C', 'D', '0', '0', 0 }; dev = (scsi_cdrom_t *) ide->sc; device_identify[7] = dev->id + 0x30; scsi_cdrom_log("ATAPI Identify: %s\n", device_identify); -#else - scsi_cdrom_t *dev = (scsi_cdrom_t *) ide->sc; -#endif - if (dev->early) + if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "NEC_CD-ROM_DRIVE260_1.01")) || (!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "NEC_CD-ROM_DRIVE260_1.00"))) /*NEC only*/ ide->buffer[0] = 0x8000 | (5 << 8) | 0x80 | (1 << 5); /* ATAPI device, CD-ROM drive, removable media, interrupt DRQ */ else ide->buffer[0] = 0x8000 | (5 << 8) | 0x80 | (2 << 5); /* ATAPI device, CD-ROM drive, removable media, accelerated DRQ */ - ide_padstr((char *) (ide->buffer + 10), "", 20); /* Serial Number */ -#ifdef USE_86BOX_CD - ide_padstr((char *) (ide->buffer + 23), EMU_VERSION_EX, 8); /* Firmware */ - ide_padstr((char *) (ide->buffer + 27), device_identify, 40); /* Model */ -#else - if (dev->early) { -# ifdef WRONG - ide_padstr((char *) (ide->buffer + 23), "1.01 ", 8); /* Firmware */ - ide_padstr((char *) (ide->buffer + 27), "NEC CD-ROM DRIVE:260 ", 40); /* Model */ -# else - ide_padstr((char *) (ide->buffer + 23), ".110 ", 8); /* Firmware */ - ide_padstr((char *) (ide->buffer + 27), "EN C DCR-MOD IREV2:06 ", 40); /* Model */ -# endif - } else if (machine_is_sony()) { - ide_padstr((char *) (ide->buffer + 23), "1.0i ", 8); /* Firmware */ - ide_padstr((char *) (ide->buffer + 27), "CD-ROM CDU76 ", 40); /* Model */ + ide_padstr((char *) (ide->buffer + 10), "", 20); /* Serial Number */ + + if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "86BOX_CD-ROM_1.00"))) { + ide_padstr((char *) (ide->buffer + 23), EMU_VERSION_EX, 8); /* Firmware */ + ide_padstr((char *) (ide->buffer + 27), device_identify, 40); /* Model */ } else { - ide_padstr((char *) (ide->buffer + 23), "0020 ", 8); /* Firmware */ - ide_padstr((char *) (ide->buffer + 27), "HITACHI CDR-8130 ", 40); /* Model */ + if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "NEC_CD-ROM_DRIVE260_1.01"))) { + ide_padstr((char *) (ide->buffer + 23), ".110 ", 8); /* Firmware */ + ide_padstr((char *) (ide->buffer + 27), "EN C DCR-MOD IREV2:06 ", 40); /* Model */ + } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "NEC_CD-ROM_DRIVE260_1.00"))) { + ide_padstr((char *) (ide->buffer + 23), ".100 ", 8); /* Firmware */ + ide_padstr((char *) (ide->buffer + 27), "EN C DCR-MOD IREV2:06 ", 40); /* Model */ + } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "AZT_CDA46802I_1.15"))) { + ide_padstr((char *) (ide->buffer + 23), "1.15 ", 8); /* Firmware */ + ide_padstr((char *) (ide->buffer + 27), "AZT CDA46802I ", 40); /* Model */ + } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "HITACHI_CDR-8130_0020"))) { + ide_padstr((char *) (ide->buffer + 23), "0020 ", 8); /* Firmware */ + ide_padstr((char *) (ide->buffer + 27), "HITACHI CDR-8130 ", 40); /* Model */ + } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU76_1.0i"))) { + ide_padstr((char *) (ide->buffer + 23), "1.0i ", 8); /* Firmware */ + ide_padstr((char *) (ide->buffer + 27), "SONY CD-ROM CDU76 ", 40); /* Model */ + } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU311_3.0h"))) { + ide_padstr((char *) (ide->buffer + 23), "3.0h ", 8); /* Firmware */ + ide_padstr((char *) (ide->buffer + 27), "SONY CD-ROM CDU311 ", 40); /* Model */ + } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "NEC_CDR-1300A_1.05"))) { + ide_padstr((char *) (ide->buffer + 23), "1.05 ", 8); /* Firmware */ + ide_padstr((char *) (ide->buffer + 27), "NEC CDR-1300A ", 40); /* Model */ + } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "TOSHIBA_CD-ROM_XM-5702B_TA70"))) { + ide_padstr((char *) (ide->buffer + 23), "TA70 ", 8); /* Firmware */ + ide_padstr((char *) (ide->buffer + 27), "TOSHIBA CD-ROM XM-5702B ", 40); /* Model */ + } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "GOLDSTAR_CRD-8160B_3.14"))) { + ide_padstr((char *) (ide->buffer + 23), "3.14 ", 8); /* Firmware */ + ide_padstr((char *) (ide->buffer + 27), "GOLDSTAR CRD-8160B ", 40); /* Model */ + } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "MATSHITA_CD-ROM_CR-587_7S13"))) { + ide_padstr((char *) (ide->buffer + 23), "7S13 ", 8); /* Firmware */ + ide_padstr((char *) (ide->buffer + 27), "MATSHITA CD-ROM CR-587 ", 40); /* Model */ + } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "MATSHITA_CD-ROM_CR-588_LS15"))) { + ide_padstr((char *) (ide->buffer + 23), "LS15 ", 8); /* Firmware */ + ide_padstr((char *) (ide->buffer + 27), "MATSHITA CD-ROM CR-588 ", 40); /* Model */ + } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "MITSUMI_CRMC-FX4820T_D02A"))) { + ide_padstr((char *) (ide->buffer + 23), "D02A ", 8); /* Firmware */ + ide_padstr((char *) (ide->buffer + 27), "MITSUMI CRMC-FX4820T ", 40); /* Model */ + } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "PHILIPS_CD-ROM_PCA403CD_U31P"))) { + ide_padstr((char *) (ide->buffer + 23), "U31P ", 8); /* Firmware */ + ide_padstr((char *) (ide->buffer + 27), "PHILIPS CD-ROM PCA403CD ", 40); /* Model */ + } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "BTC_CD-ROM_BCD36XH_U1.0"))) { + ide_padstr((char *) (ide->buffer + 23), "U1.0 ", 8); /* Firmware */ + ide_padstr((char *) (ide->buffer + 27), "BTC CD-ROM BCD36XH ", 40); /* Model */ + } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "KENWOOD_CD-ROM_UCR-421_208E"))) { + ide_padstr((char *) (ide->buffer + 23), "208E ", 8); /* Firmware */ + ide_padstr((char *) (ide->buffer + 27), "KENWOOD CD-ROM UCR-421 ", 40); /* Model */ + } } -#endif + ide->buffer[49] = 0x200; /* LBA supported */ ide->buffer[126] = 0xfffe; /* Interpret zero byte count limit as maximum length */ @@ -2815,7 +3595,6 @@ scsi_cdrom_drive_reset(int c) dev->drv = drv; dev->cur_lun = SCSI_LUN_USE_CDB; - dev->early = dev->drv->early; drv->insert = scsi_cdrom_insert; drv->get_volume = scsi_cdrom_get_volume; @@ -2854,7 +3633,8 @@ scsi_cdrom_drive_reset(int c) id->phase_data_out = scsi_cdrom_phase_data_out; id->command_stop = scsi_cdrom_command_stop; id->bus_master_error = scsi_cdrom_bus_master_error; - id->interrupt_drq = dev->early; + id->interrupt_drq = (!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "NEC_CD-ROM_DRIVE260_1.01") || + (!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "NEC_CD-ROM_DRIVE260_1.00"))); ide_atapi_attach(id); } diff --git a/src/scsi/scsi_ncr5380.c b/src/scsi/scsi_ncr5380.c index 668f9ea9f..54875963d 100644 --- a/src/scsi/scsi_ncr5380.c +++ b/src/scsi/scsi_ncr5380.c @@ -1,23 +1,23 @@ /* - * 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. * - * Implementation of the NCR 5380 series of SCSI Host Adapters - * made by NCR. These controllers were designed for the ISA bus. + * Implementation of the NCR 5380 series of SCSI Host Adapters + * made by NCR. These controllers were designed for the ISA bus. * * * - * Authors: Sarah Walker, - * TheCollector1995, - * Fred N. van Kempen, + * Authors: Sarah Walker, + * TheCollector1995, + * Fred N. van Kempen, * - * Copyright 2017-2019 Sarah Walker. - * Copyright 2017-2019 TheCollector1995. - * Copyright 2017-2019 Fred N. van Kempen. + * Copyright 2017-2019 Sarah Walker. + * Copyright 2017-2019 TheCollector1995. + * Copyright 2017-2019 Fred N. van Kempen. */ #include #include @@ -598,7 +598,7 @@ ncr_write(uint16_t port, uint8_t val, void *priv) break; case 2: /* Mode register */ - ncr_log("Write: Mode register, val=%02x\n", val & MODE_DMA); + ncr_log("Write: Mode register, val=%02x.\n", val); if ((val & MODE_ARBITRATE) && !(ncr->mode & MODE_ARBITRATE)) { ncr->icr &= ~ICR_ARB_LOST; ncr->icr |= ICR_ARB_IN_PROGRESS; @@ -741,12 +741,7 @@ ncr_read(uint16_t port, void *priv) break; case 2: /* Mode register */ - if (((ncr->mode & 0x30) == 0x30) && ((ncr_dev->type == 1) && (ncr_dev->bios_ver == 1))) - ncr->mode = 0; - if (((ncr->mode & 0x20) == 0x20) && (ncr_dev->type == 0)) - ncr->mode = 0; - - ncr_log("Read: Mode register\n"); + ncr_log("Read: Mode register = %02x.\n", ncr->mode); ret = ncr->mode; break; @@ -761,10 +756,10 @@ ncr_read(uint16_t port, void *priv) ncr_bus_read(ncr_dev); ncr_log("NCR cur bus stat=%02x\n", ncr->cur_bus & 0xff); ret |= (ncr->cur_bus & 0xff); - if ((ncr->icr & ICR_SEL) && ((ncr_dev->type == 1) && (ncr_dev->bios_ver == 1))) - ret |= 0x02; - if ((ncr->icr & ICR_BSY) && ((ncr_dev->type == 1) && (ncr_dev->bios_ver == 1))) - ret |= 0x40; + if (ncr->icr & ICR_SEL) + ret |= BUS_SEL; + if (ncr->icr & ICR_BSY) + ret |= BUS_BSY; break; case 5: /* Bus and Status register */ @@ -783,9 +778,9 @@ ncr_read(uint16_t port, void *priv) ncr_bus_read(ncr_dev); bus = ncr->cur_bus; - if ((bus & BUS_ACK) || ((ncr->icr & ICR_ACK) && ((ncr_dev->type == 1) && (ncr_dev->bios_ver == 1)))) + if ((bus & BUS_ACK) || (ncr->icr & ICR_ACK)) ret |= STATUS_ACK; - if ((bus & BUS_ATN) || ((ncr->icr & ICR_ATN) && ((ncr_dev->type == 1) && (ncr_dev->bios_ver == 1)))) + if ((bus & BUS_ATN) || (ncr->icr & ICR_ATN)) ret |= 0x02; if ((bus & BUS_REQ) && (ncr->mode & MODE_DMA)) { @@ -885,6 +880,13 @@ memio_read(uint32_t addr, void *priv) ncr_log("NCR status ctrl read=%02x\n", ncr_dev->status_ctrl & STATUS_BUFFER_NOT_READY); if (!ncr_dev->ncr_busy) ret |= STATUS_53C80_ACCESSIBLE; + if (ncr->mode & 0x30) { /*Parity bits*/ + if (!(ncr->mode & MODE_DMA)) { /*This is to avoid RTBios 8.10R BIOS problems with the hard disk and detection.*/ + ret |= 0x01; /*If the parity bits are set, bit 0 of the 53c400 status port should be set as well.*/ + ncr->mode = 0; /*Required by RTASPI10.SYS otherwise it won't initialize.*/ + } + } + ncr_log("NCR 53c400 status = %02x.\n", ret); break; case 0x3981: /* block counter register*/ @@ -948,6 +950,7 @@ memio_write(uint32_t addr, uint8_t val, void *priv) case 0x3980: switch (addr) { case 0x3980: /* Control */ + ncr_log("NCR 53c400 control = %02x, mode = %02x.\n", val, ncr->mode); if ((val & CTRL_DATA_DIR) && !(ncr_dev->status_ctrl & CTRL_DATA_DIR)) { ncr_dev->buffer_host_pos = MIN(128, dev->buffer_length); ncr_dev->status_ctrl |= STATUS_BUFFER_NOT_READY; diff --git a/src/scsi/scsi_spock.c b/src/scsi/scsi_spock.c index ab970f17a..af37d63a4 100644 --- a/src/scsi/scsi_spock.c +++ b/src/scsi/scsi_spock.c @@ -1,21 +1,21 @@ /* - * 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. * - * Implementation of the IBM PS/2 SCSI controller with - * cache for MCA only. + * Implementation of the IBM PS/2 SCSI controller with + * cache for MCA only. * * * - * Authors: Sarah Walker, - * TheCollector1995, + * Authors: Sarah Walker, + * TheCollector1995, * - * Copyright 2020 Sarah Walker. - * Copyright 2020 TheCollector1995. + * Copyright 2020 Sarah Walker. + * Copyright 2020 TheCollector1995. */ #include #include @@ -126,9 +126,10 @@ typedef struct { get_pos_info_t get_pos_info; scb_t scb; - int adapter_reset; int scb_id; int adapter_id; + int assign; + int present[8]; int cmd_status; int cir_status; @@ -380,7 +381,7 @@ spock_read(uint16_t port, void *p) break; } - spock_log("spock_read: port=%04x val=%02x %04x(%05x):%04x %02x\n", port, temp, CS, cs, cpu_state.pc, BH); + spock_log("spock_read: port=%04x val=%02x %04x(%05x):%04x.\n", port, temp, CS, cs, cpu_state.pc); return temp; } @@ -436,11 +437,14 @@ spock_get_len(spock_t *scsi, scb_t *scb) static void spock_process_imm_cmd(spock_t *scsi) { - int i; + int i, j = 0; int adapter_id, phys_id, 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; @@ -458,10 +462,10 @@ spock_process_imm_cmd(spock_t *scsi) if (phys_id != scsi->adapter_id) { scsi->dev_id[adapter_id].phys_id = phys_id; scsi->dev_id[adapter_id].lun_id = lun_id; - spock_log("Assign: adapter dev=%x scsi ID=%i LUN=%i\n", adapter_id, scsi->dev_id[adapter_id].phys_id, scsi->dev_id[adapter_id].lun_id); + spock_log("Assign: adapter dev=%x scsi ID=%i LUN=%i.\n", adapter_id, scsi->dev_id[adapter_id].phys_id, scsi->dev_id[adapter_id].lun_id); spock_set_irq(scsi, scsi->attention & 0x0f, IRQ_TYPE_IMM_CMD_COMPLETE); } else { /*Can not assign adapter*/ - spock_log("Assign: PUN=%d, cannot assign adapter\n", phys_id); + spock_log("Assign: PUN=%d, cannot assign adapter.\n", phys_id); spock_set_irq(scsi, scsi->attention & 0x0f, IRQ_TYPE_COMMAND_FAIL); } } @@ -481,18 +485,25 @@ spock_process_imm_cmd(spock_t *scsi) spock_set_irq(scsi, scsi->attention & 0x0f, IRQ_TYPE_IMM_CMD_COMPLETE); break; case CMD_RESET: - spock_log("Reset Command\n"); + spock_log("Reset Command, attention = %d.\n", scsi->attention & 0x0f); if ((scsi->attention & 0x0f) == 0x0f) { /*Adapter reset*/ - for (i = 0; i < 8; i++) + for (i = 0; i < 8; i++) { scsi_device_reset(&scsi_devices[scsi->bus][i]); - spock_log("Adapter Reset\n"); + } - if (!scsi->adapter_reset) /*The early 1990 bios must have its boot drive - set to ID 6 according https://www.ardent-tool.com/IBM_SCSI/SCSI-A.html */ - scsi->adapter_reset = 1; + for (i = 6; i > -1; i--) { + if (scsi_device_present(&scsi_devices[scsi->bus][i])) { + spock_log("Adapter Reset, SCSI reset present devices=%d, phys ID=%d, type=%04x.\n", j, scsi->dev_id[i].phys_id, scsi_devices[scsi->bus][i].type); + scsi->present[j] = i; + j++; + } else { + 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); + } + } scsi->scb_state = 0; } + spock_set_irq(scsi, scsi->attention & 0x0f, IRQ_TYPE_IMM_CMD_COMPLETE); break; @@ -505,7 +516,7 @@ spock_process_imm_cmd(spock_t *scsi) static void spock_execute_cmd(spock_t *scsi, scb_t *scb) { - int c; + int c, j; int old_scb_state; if (scsi->in_reset) { @@ -519,9 +530,9 @@ spock_execute_cmd(spock_t *scsi, scb_t *scb) if (scsi->in_reset == 1) { scsi->basic_ctrl |= CTRL_IRQ_ENA; - spock_set_irq(scsi, 0x0f, IRQ_TYPE_RESET_COMPLETE); - } else - spock_set_irq(scsi, 0x0f, IRQ_TYPE_RESET_COMPLETE); + } + + spock_set_irq(scsi, 0x0f, IRQ_TYPE_RESET_COMPLETE); /*Reset device mappings*/ for (c = 0; c < 7; c++) { @@ -532,6 +543,16 @@ spock_execute_cmd(spock_t *scsi, scb_t *scb) scsi->dev_id[c].phys_id = -1; scsi->in_reset = 0; + + for (c = 6; c > -1; c--) { + if (scsi_device_present(&scsi_devices[scsi->bus][c])) { + spock_log("Reset, SCSI reset present devices=%d, phys ID=%d, type=%04x.\n", j, scsi->dev_id[c].phys_id, scsi_devices[scsi->bus][c].type); + scsi->present[j] = c; + j++; + } else { + 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); + } + } return; } @@ -584,11 +605,11 @@ spock_execute_cmd(spock_t *scsi, scb_t *scb) " SCB chain address = %08x\n" " Block count = %04x\n" " Block length = %04x\n" - " SCB id = %d, Phys id = %d\n", + " SCB id = %d, Phys id = %d, Spock CMD = %08x, CMD Mask = %02x.\n", scb->command, scb->enable, scb->lba_addr, scb->sge.sys_buf_addr, scb->sge.sys_buf_byte_count, scb->term_status_block_addr, scb->scb_chain_addr, - scb->block_count, scb->block_length, scsi->scb_id, scsi->dev_id[scsi->scb_id].phys_id); + scb->block_count, scb->block_length, scsi->scb_id, scsi->dev_id[scsi->scb_id].phys_id, scsi->command, scb->command & 0xc0); switch (scb->command & CMD_MASK) { case CMD_GET_COMPLETE_STATUS: @@ -662,10 +683,7 @@ spock_execute_cmd(spock_t *scsi, scb_t *scb) break; case CMD_DEVICE_INQUIRY: - if (scb->command != CMD_DEVICE_INQUIRY) - scsi->cdb_id = scsi->scb_id; - else - scsi->cdb_id = scsi->dev_id[scsi->scb_id].phys_id; + scsi->cdb_id = scsi->assign ? scsi->dev_id[scsi->scb_id].phys_id : scsi->present[scsi->scb_id]; 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*/ @@ -681,12 +699,9 @@ spock_execute_cmd(spock_t *scsi, scb_t *scb) return; case CMD_SEND_OTHER_SCSI: - if (scb->command != CMD_SEND_OTHER_SCSI) - scsi->cdb_id = scsi->scb_id; - else - scsi->cdb_id = scsi->dev_id[scsi->scb_id].phys_id; - spock_log("Send Other SCSI, SCB ID=%d, PHYS ID=%d, reset=%d\n", scsi->scb_id, scsi->dev_id[scsi->scb_id].phys_id, scsi->adapter_reset); + scsi->cdb_id = scsi->assign ? scsi->dev_id[scsi->scb_id].phys_id : scsi->present[scsi->scb_id]; dma_bm_read(scsi->scb_addr + 0x18, scsi->cdb, 12, 2); + spock_log("Send Other SCSI, SCB ID=%d, PHYS ID=%d\n", scsi->scb_id, scsi->dev_id[scsi->scb_id].phys_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; @@ -694,11 +709,8 @@ spock_execute_cmd(spock_t *scsi, scb_t *scb) return; case CMD_READ_DEVICE_CAPACITY: - if (scb->command != CMD_READ_DEVICE_CAPACITY) - scsi->cdb_id = scsi->scb_id; - else - scsi->cdb_id = scsi->dev_id[scsi->scb_id].phys_id; - spock_log("Device Capacity, SCB ID=%d, PHYS ID=%d, reset=%d\n", scsi->scb_id, scsi->dev_id[scsi->scb_id].phys_id, scsi->adapter_reset); + scsi->cdb_id = scsi->assign ? scsi->dev_id[scsi->scb_id].phys_id : scsi->present[scsi->scb_id]; + 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*/ scsi->cdb[2] = 0; /*LBA*/ @@ -715,11 +727,8 @@ spock_execute_cmd(spock_t *scsi, scb_t *scb) return; case CMD_READ_DATA: - if (scb->command != CMD_READ_DATA) - scsi->cdb_id = scsi->scb_id; - else - scsi->cdb_id = scsi->dev_id[scsi->scb_id].phys_id; - spock_log("Device Read Data, SCB ID=%d, PHYS ID=%d, reset=%d\n", scsi->scb_id, scsi->dev_id[scsi->scb_id].phys_id, scsi->adapter_reset); + scsi->cdb_id = scsi->assign ? scsi->dev_id[scsi->scb_id].phys_id : scsi->present[scsi->scb_id]; + 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*/ scsi->cdb[2] = (scb->lba_addr >> 24) & 0xff; /*LBA*/ @@ -736,10 +745,7 @@ spock_execute_cmd(spock_t *scsi, scb_t *scb) return; case CMD_WRITE_DATA: - if (scb->command != CMD_WRITE_DATA) - scsi->cdb_id = scsi->scb_id; - else - scsi->cdb_id = scsi->dev_id[scsi->scb_id].phys_id; + scsi->cdb_id = scsi->assign ? scsi->dev_id[scsi->scb_id].phys_id : scsi->present[scsi->scb_id]; 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*/ @@ -757,10 +763,7 @@ spock_execute_cmd(spock_t *scsi, scb_t *scb) return; case CMD_VERIFY: - if (scb->command != CMD_VERIFY) - scsi->cdb_id = scsi->scb_id; - else - scsi->cdb_id = scsi->dev_id[scsi->scb_id].phys_id; + scsi->cdb_id = scsi->assign ? scsi->dev_id[scsi->scb_id].phys_id : scsi->present[scsi->scb_id]; spock_log("Device Verify\n"); scsi->cdb[0] = GPCMD_VERIFY_10; scsi->cdb[1] = scsi->dev_id[scsi->scb_id].lun_id << 5; /*LUN*/ @@ -779,10 +782,7 @@ spock_execute_cmd(spock_t *scsi, scb_t *scb) return; case CMD_REQUEST_SENSE: - if (scb->command != CMD_REQUEST_SENSE) - scsi->cdb_id = scsi->scb_id; - else - scsi->cdb_id = scsi->dev_id[scsi->scb_id].phys_id; + scsi->cdb_id = scsi->assign ? scsi->dev_id[scsi->scb_id].phys_id : scsi->present[scsi->scb_id]; 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*/ @@ -802,7 +802,7 @@ spock_execute_cmd(spock_t *scsi, scb_t *scb) if (scsi_device_present(&scsi_devices[scsi->bus][scsi->cdb_id])) { if (scsi->last_status == SCSI_STATUS_OK) { scsi->scb_state = 3; - spock_log("Status is Good on device ID %d, reset = %d\n", scsi->scb_id, scsi->adapter_reset); + spock_log("Status is Good on device ID %d, cdb id = %d.\n", scsi->scb_id, scsi->cdb_id); } else if (scsi->last_status == SCSI_STATUS_CHECK_CONDITION) { uint16_t term_stat_block_addr7 = (0xc << 8) | 2; uint16_t term_stat_block_addr8 = 0x20; @@ -811,7 +811,7 @@ spock_execute_cmd(spock_t *scsi, scb_t *scb) spock_set_irq(scsi, scsi->scb_id, IRQ_TYPE_COMMAND_FAIL); scsi->scb_state = 0; - spock_log("Status Check Condition on device ID %d, reset = %d\n", scsi->scb_id, scsi->adapter_reset); + spock_log("Status Check Condition on device ID %d, cdb id = %d.\n", scsi->attention & 0x0f, scsi->cdb_id); dma_bm_write(scb->term_status_block_addr + 0x7 * 2, (uint8_t *) &term_stat_block_addr7, 2, 2); dma_bm_write(scb->term_status_block_addr + 0x8 * 2, (uint8_t *) &term_stat_block_addr8, 2, 2); dma_bm_write(scb->term_status_block_addr + 0xb * 2, (uint8_t *) &term_stat_block_addrb, 2, 2); @@ -822,7 +822,7 @@ spock_execute_cmd(spock_t *scsi, scb_t *scb) uint16_t term_stat_block_addr8 = 0x10; spock_set_irq(scsi, scsi->scb_id, IRQ_TYPE_COMMAND_FAIL); scsi->scb_state = 0; - spock_log("Status Check Condition on device ID %d on no device, reset = %d\n", scsi->scb_id, scsi->adapter_reset); + spock_log("Status Check Condition on device ID %d on no device\n", scsi->scb_id); dma_bm_write(scb->term_status_block_addr + 0x7 * 2, (uint8_t *) &term_stat_block_addr7, 2, 2); dma_bm_write(scb->term_status_block_addr + 0x8 * 2, (uint8_t *) &term_stat_block_addr8, 2, 2); } @@ -837,7 +837,7 @@ spock_execute_cmd(spock_t *scsi, scb_t *scb) } else { spock_set_irq(scsi, scsi->scb_id, IRQ_TYPE_SCB_COMPLETE); scsi->scb_state = 0; - spock_log("Complete SCB\n"); + spock_log("Complete SCB ID = %d.\n", scsi->attention & 0x0f); } break; } @@ -856,12 +856,12 @@ spock_process_scsi(spock_t *scsi, scb_t *scb) break; case SCSI_STATE_SELECT: - spock_log("Selecting ID %d\n", scsi->cdb_id); + 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])) { scsi->scsi_state = SCSI_STATE_SEND_COMMAND; - spock_log("Device selected at ID %i\n", scsi->cdb_id); + spock_log("Device selected at ID %i.\n", scsi->cdb_id); } else { - spock_log("Device selection failed at ID %i\n", scsi->cdb_id); + spock_log("Device selection failed at ID %i.\n", scsi->cdb_id); scsi->scsi_state = SCSI_STATE_IDLE; if (!scsi->cmd_timer) { spock_log("Callback to reset\n"); @@ -985,6 +985,7 @@ spock_callback(void *priv) scsi->cir[3] = scsi->cir_pending[3]; scsi->cir_status = 0; + spock_log("SCSI attention = %02x.\n", scsi->attention_pending); switch (scsi->attention >> 4) { case 1: /*Immediate command*/ scsi->cmd_status = 0x0a; @@ -1007,7 +1008,7 @@ spock_callback(void *priv) scsi->scb_addr = scsi->cir[0] | (scsi->cir[1] << 8) | (scsi->cir[2] << 16) | (scsi->cir[3] << 24); scsi->scb_id = scsi->attention & 0x0f; scsi->cmd_timer = SPOCK_TIME * 2; - spock_log("Start SCB at ID = %d\n", scsi->scb_id); + spock_log("Start SCB at ID = %d, attention = %02x\n", scsi->scb_id, scsi->attention >> 4); scsi->scb_state = 1; break; @@ -1019,7 +1020,7 @@ spock_callback(void *priv) case 0x0e: /*EOI*/ scsi->irq_status = 0; - spock_clear_irq(scsi, scsi->attention & 0xf); + spock_clear_irq(scsi, scsi->attention & 0x0f); break; } } @@ -1049,10 +1050,9 @@ 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] >> 4) == 0x0f) - mem_mapping_disable(&scsi->bios_rom.mapping); - else { + 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); } } } @@ -1089,10 +1089,10 @@ spock_mca_reset(void *priv) scsi->basic_ctrl = 0; /* Reset all devices on controller reset. */ - for (i = 0; i < 8; i++) + for (i = 0; i < 8; i++) { scsi_device_reset(&scsi_devices[scsi->bus][i]); - - scsi->adapter_reset = 0; + scsi->present[i] = 0; + } } static void * @@ -1175,7 +1175,7 @@ static const device_config_t spock_rom_config[] = { }, }, { .name = "", .description = "", .type = CONFIG_END } - // clang-format on +// clang-format on }; const device_t spock_device = { From 5c0fa85d87e50387e95d1e501795fd82b30cad99 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Sun, 8 Jan 2023 00:05:58 +0100 Subject: [PATCH 135/285] QT: Fix compile. --- src/qt/qt_settingsstoragecontrollers.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/qt/qt_settingsstoragecontrollers.cpp b/src/qt/qt_settingsstoragecontrollers.cpp index ac406853c..14b0fb1dc 100644 --- a/src/qt/qt_settingsstoragecontrollers.cpp +++ b/src/qt/qt_settingsstoragecontrollers.cpp @@ -250,6 +250,12 @@ SettingsStorageControllers::on_pushButtonFD_clicked() DeviceConfig::ConfigureDevice(fdc_card_getdevice(ui->comboBoxFD->currentData().toInt()), 0, qobject_cast(Settings::settings)); } +void +SettingsStorageControllers::on_pushButtonCDInterface_clicked() +{ + DeviceConfig::ConfigureDevice(cdrom_interface_get_device(ui->comboBoxCDInterface->currentData().toInt()), 0, qobject_cast(Settings::settings)); +} + void SettingsStorageControllers::on_pushButtonTertiaryIDE_clicked() { From c4ce53c91f793f2fff87ad7ebe1890d351857f1f Mon Sep 17 00:00:00 2001 From: TC1995 Date: Sun, 8 Jan 2023 14:19:28 +0100 Subject: [PATCH 136/285] Fix compile again for github. --- src/86box.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/86box.c b/src/86box.c index 7beef9333..c3b66db05 100644 --- a/src/86box.c +++ b/src/86box.c @@ -80,6 +80,7 @@ #include <86box/scsi.h> #include <86box/scsi_device.h> #include <86box/cdrom.h> +#include <86box/cdrom_interface.h> #include <86box/zip.h> #include <86box/mo.h> #include <86box/scsi_disk.h> From 1064c697e29525264f4418d0dce0b31f7c9ffc2a Mon Sep 17 00:00:00 2001 From: TC1995 Date: Sun, 8 Jan 2023 14:25:18 +0100 Subject: [PATCH 137/285] Darn git. --- .ci/AppImageBuilder.yml | 28 +- .ci/Jenkinsfile | 16 +- .ci/build.sh | 16 +- .ci/static2dll.sh | 16 +- CMakeLists.txt | 2 +- README.md | 2 +- bumpversion.sh | 16 +- cmake/flags-gcc-aarch64.cmake | 20 +- cmake/flags-gcc-armv7.cmake | 20 +- cmake/flags-gcc-i686.cmake | 18 +- cmake/flags-gcc-x86_64.cmake | 18 +- cmake/flags-gcc.cmake | 16 +- cmake/llvm-macos-aarch64.cmake | 24 +- cmake/llvm-win32-aarch64.cmake | 18 +- cmake/llvm-win32-arm.cmake | 16 +- cmake/llvm-win32-i686.cmake | 18 +- cmake/llvm-win32-x86_64.cmake | 18 +- debian/changelog | 2 +- src/86box.c | 2 +- src/Makefile.local | 64 +- src/cdrom/CMakeLists.txt | 2 +- src/chipset/CMakeLists.txt | 2 +- src/chipset/acc2168.c | 2 +- src/chipset/ali1429.c | 4 +- src/chipset/ali1489.c | 4 +- src/chipset/cs8230.c | 2 +- src/chipset/headland.c | 2 +- src/chipset/scamp.c | 2 +- src/chipset/sis_85c4xx.c | 2 +- src/chipset/via_apollo.c | 2 +- src/chipset/via_pipc.c | 2 +- src/codegen/CMakeLists.txt | 2 +- src/codegen/codegen.h | 2 +- src/codegen/codegen_ops_x86-64.h | 2 +- src/codegen/codegen_x86.c | 2 +- src/codegen_new/CMakeLists.txt | 2 +- src/codegen_new/codegen_backend_arm_uops.c | 8 +- src/config.c | 4 +- src/cpu/386_common.h | 2 +- src/cpu/386_ops.h | 2 +- src/cpu/CMakeLists.txt | 2 +- src/cpu/codegen_timing_686.c | 6 +- src/cpu/codegen_timing_k6.c | 2 +- src/cpu/codegen_timing_p6.c | 54 +- src/cpu/cpu.c | 2 +- src/cpu/cpu.h | 2 +- src/cpu/cpu_table.c | 1999 ++++++++--------- src/cpu/fpu.c | 2 +- src/cpu/x86_ops.h | 2 +- src/cpu/x86seg.c | 2 +- src/cpu/x87_ops.h | 2 +- src/cpu/x87_ops_loadstore.h | 2 +- src/crcspeed/crc64speed.c | 12 +- src/device.c | 2 +- src/device/CMakeLists.txt | 2 +- src/device/keyboard.c | 2 +- src/device/keyboard_at.c | 8 +- src/device/keyboard_xt.c | 216 +- src/device/mouse_bus.c | 14 +- src/device/mouse_ps2.c | 2 +- src/device/phoenix_486_jumper.c | 2 + src/device/serial.c | 2 +- src/disk/CMakeLists.txt | 2 +- src/disk/hdc.c | 2 +- src/disk/hdc_esdi_at.c | 2 +- src/disk/hdc_esdi_mca.c | 4 +- src/disk/hdc_ide.c | 16 +- src/disk/hdc_ide_sff8038i.c | 2 +- src/disk/hdc_st506_at.c | 2 +- src/disk/hdc_st506_xt.c | 74 +- src/disk/hdc_xta.c | 2 +- src/disk/hdc_xtide.c | 2 +- src/disk/hdd_image.c | 2 +- src/disk/hdd_table.c | 2 +- src/disk/zip.c | 5 +- src/dma.c | 2 +- src/floppy/CMakeLists.txt | 2 +- src/floppy/fdc.c | 10 +- src/floppy/fdd.c | 56 +- src/floppy/fdd_86f.c | 50 +- src/floppy/fdd_common.c | 501 +++-- src/floppy/fdd_fdi.c | 4 +- src/floppy/fdd_img.c | 447 ++-- src/floppy/fdd_td0.c | 14 +- src/floppy/fdi2raw.c | 957 ++++---- src/game/CMakeLists.txt | 2 +- src/game/gameport.c | 2 +- src/game/joystick_ch_flightstick_pro.c | 2 +- src/game/joystick_standard.c | 2 +- src/game/joystick_sw_pad.c | 2 +- src/game/joystick_tm_fcs.c | 2 +- src/include/86box/apm.h | 16 +- src/include/86box/bswap.h | 2 +- src/include/86box/bugger.h | 28 +- src/include/86box/cartridge.h | 16 +- src/include/86box/cdrom.h | 16 +- src/include/86box/cdrom_image.h | 22 +- src/include/86box/cdrom_image_backend.h | 26 +- src/include/86box/cdrom_mitsumi.h | 16 +- src/include/86box/chipset.h | 2 +- src/include/86box/clock.h | 16 +- src/include/86box/config.h | 2 +- src/include/86box/ddma.h | 16 +- src/include/86box/device.h | 2 +- src/include/86box/discord.h | 16 +- src/include/86box/dma.h | 2 +- src/include/86box/fdc.h | 2 +- src/include/86box/fdc_ext.h | 26 +- src/include/86box/fdd.h | 2 +- src/include/86box/fdd_86f.h | 20 +- src/include/86box/fdd_common.h | 16 +- src/include/86box/fdd_fdi.h | 26 +- src/include/86box/fdd_imd.h | 20 +- src/include/86box/fdd_img.h | 26 +- src/include/86box/fdd_json.h | 2 +- src/include/86box/fdd_mfm.h | 16 +- src/include/86box/fdd_td0.h | 20 +- src/include/86box/gameport.h | 24 +- src/include/86box/hdc_ide.h | 22 +- src/include/86box/hdc_ide_sff8038i.h | 21 +- src/include/86box/hdd.h | 21 +- src/include/86box/i2c.h | 16 +- src/include/86box/i8080.h | 18 +- src/include/86box/ibm_5161.h | 17 +- src/include/86box/ini.h | 4 +- src/include/86box/io.h | 22 +- src/include/86box/isapnp.h | 16 +- .../86box/joystick_ch_flightstick_pro.h | 20 +- src/include/86box/joystick_standard.h | 2 +- src/include/86box/joystick_sw_pad.h | 4 +- src/include/86box/joystick_tm_fcs.h | 4 +- src/include/86box/keyboard.h | 2 +- src/include/86box/language.h | 20 +- src/include/86box/log.h | 20 +- src/include/86box/lpt.h | 8 +- src/include/86box/m_amstrad.h | 20 +- src/include/86box/m_at_t3100e.h | 4 +- src/include/86box/m_xt_t1000.h | 4 +- src/include/86box/machine.h | 2 +- src/include/86box/mem.h | 2 +- src/include/86box/mo.h | 20 +- src/include/86box/mouse.h | 20 +- src/include/86box/net_3c501.h | 21 +- src/include/86box/net_3c503.h | 43 + src/include/86box/net_dp8390.h | 22 +- src/include/86box/net_ne2000.h | 2 +- src/include/86box/net_pcnet.h | 22 +- src/include/86box/net_plip.h | 17 +- src/include/86box/net_wd8003.h | 32 +- src/include/86box/nvr_ps2.h | 4 +- src/include/86box/pci.h | 2 +- src/include/86box/pic.h | 22 +- src/include/86box/pit.h | 19 +- src/include/86box/pit_fast.h | 19 +- src/include/86box/plat_dir.h | 17 +- src/include/86box/plat_dynld.h | 17 +- src/include/86box/port_6x.h | 18 +- src/include/86box/port_92.h | 18 +- src/include/86box/postcard.h | 16 +- src/include/86box/random.h | 19 +- src/include/86box/resource.h | 28 +- src/include/86box/rom.h | 17 +- src/include/86box/scsi.h | 24 +- src/include/86box/scsi_buslogic.h | 23 +- src/include/86box/scsi_cdrom.h | 18 +- src/include/86box/scsi_device.h | 20 +- src/include/86box/scsi_disk.h | 15 +- src/include/86box/scsi_ncr5380.h | 28 +- src/include/86box/scsi_ncr53c8xx.h | 30 +- src/include/86box/scsi_pcscsi.h | 28 +- src/include/86box/scsi_spock.h | 22 +- src/include/86box/scsi_x54x.h | 28 +- src/include/86box/serial.h | 2 +- src/include/86box/smram.h | 16 +- src/include/86box/snd_ac97.h | 16 +- src/include/86box/snd_ad1848.h | 24 +- src/include/86box/snd_mpu401.h | 29 +- src/include/86box/snd_opl.h | 20 +- src/include/86box/snd_opl_nuked.h | 22 +- src/include/86box/snd_sb.h | 2 +- src/include/86box/snd_speaker.h | 20 +- src/include/86box/sound.h | 2 +- src/include/86box/ui.h | 20 +- src/include/86box/usb.h | 16 +- src/include/86box/vid_8514a.h | 18 +- src/include/86box/vid_cga.h | 21 +- src/include/86box/vid_cga_comp.h | 23 +- src/include/86box/vid_ddc.h | 20 +- src/include/86box/vid_ega.h | 22 +- src/include/86box/vid_hercules.h | 24 +- src/include/86box/vid_nga.h | 30 +- src/include/86box/vid_ogc.h | 30 +- src/include/86box/vid_pgc.h | 20 +- src/include/86box/vid_pgc_palette.h | 20 +- src/include/86box/vid_svga.h | 2 +- src/include/86box/vid_svga_render.h | 21 +- src/include/86box/vid_vga.h | 24 +- src/include/86box/vid_voodoo_banshee.h | 16 +- .../86box/vid_voodoo_banshee_blitter.h | 16 +- src/include/86box/vid_voodoo_blitter.h | 2 +- src/include/86box/vid_voodoo_common.h | 18 +- src/include/86box/vid_voodoo_display.h | 18 +- src/include/86box/vid_voodoo_dither.h | 18 +- src/include/86box/vid_voodoo_fb.h | 18 +- src/include/86box/vid_voodoo_fifo.h | 18 +- src/include/86box/vid_voodoo_reg.h | 18 +- src/include/86box/vid_voodoo_setup.h | 18 +- src/include/86box/vid_voodoo_texture.h | 18 +- src/include/86box/video.h | 2 +- src/include/86box/vnc.h | 16 +- src/include/86box/win.h | 26 +- src/include/86box/win_opengl.h | 16 +- src/include/86box/win_opengl_glslp.h | 16 +- src/include/86box/win_sdl.h | 48 +- src/include/86box/zip.h | 18 +- src/include/fdi2raw.h | 86 +- src/include/glad/glad.h | 2 +- src/include/minitrace/minitrace.h | 82 +- src/ini.c | 4 +- src/io.c | 2 +- src/mac/CMakeLists.txt | 4 +- src/machine/CMakeLists.txt | 2 +- src/machine/m_amstrad.c | 158 +- src/machine/m_at.c | 2 +- src/machine/m_at_286_386sx.c | 2 +- src/machine/m_at_386dx_486.c | 187 +- src/machine/m_at_commodore.c | 4 +- src/machine/m_at_compaq.c | 10 +- src/machine/m_at_slot1.c | 2 +- src/machine/m_at_socket370.c | 32 +- src/machine/m_at_socket4.c | 106 +- src/machine/m_at_socket5.c | 78 +- src/machine/m_at_socket7.c | 234 +- src/machine/m_at_socket7_3v.c | 139 +- src/machine/m_at_socket8.c | 80 +- src/machine/m_at_sockets7.c | 2 +- src/machine/m_at_t3100e.c | 8 +- src/machine/m_at_t3100e_vid.c | 2 +- src/machine/m_elt.c | 2 - src/machine/m_europc.c | 86 +- src/machine/m_pcjr.c | 2 +- src/machine/m_ps1.c | 2 +- src/machine/m_ps2_mca.c | 2 +- src/machine/m_tandy.c | 216 +- src/machine/m_xt_compaq.c | 2 +- src/machine/m_xt_olivetti.c | 430 ++-- src/machine/m_xt_t1000.c | 6 +- src/machine/m_xt_t1000_vid.c | 2 +- src/machine/m_xt_zenith.c | 2 +- src/machine/machine.c | 2 +- src/machine/machine_table.c | 2 +- src/mem/CMakeLists.txt | 2 +- src/mem/catalyst_flash.c | 2 +- src/mem/intel_flash.c | 2 +- src/mem/mem.c | 2 +- src/mem/rom.c | 2 +- src/mem/sst_flash.c | 2 +- src/minitrace/minitrace.c | 629 +++--- src/network/CMakeLists.txt | 2 +- src/network/net_3c501.c | 23 +- src/network/net_3c503.c | 9 +- src/network/net_dp8390.c | 4 +- src/network/net_ne2000.c | 2 +- src/network/pcap_if.c | 2 +- src/network/slirp/CMakeLists.txt | 2 +- src/nvr.c | 2 +- src/nvr_at.c | 2 +- src/nvr_ps2.c | 4 +- src/pci.c | 2 +- src/printer/CMakeLists.txt | 2 +- src/printer/prt_escp.c | 4 +- src/printer/prt_text.c | 2 +- src/qt/evdev_mouse.cpp | 16 +- src/qt/qt.c | 14 +- src/qt/qt_cdrom.c | 22 +- src/qt/qt_deviceconfig.cpp | 18 +- src/qt/qt_filefield.cpp | 18 +- src/qt/qt_harddiskdialog.cpp | 18 +- src/qt/qt_harddrive_common.cpp | 16 +- src/qt/qt_hardwarerenderer.cpp | 20 +- src/qt/qt_joystickconfiguration.cpp | 16 +- src/qt/qt_machinestatus.cpp | 18 +- src/qt/qt_main.cpp | 20 +- src/qt/qt_mainwindow.cpp | 22 +- src/qt/qt_mediahistorymanager.cpp | 16 +- src/qt/qt_mediahistorymanager.hpp | 16 +- src/qt/qt_mediamenu.cpp | 20 +- src/qt/qt_models_common.cpp | 16 +- src/qt/qt_newfloppydialog.cpp | 20 +- src/qt/qt_opengloptions.cpp | 19 +- src/qt/qt_opengloptions.hpp | 19 +- src/qt/qt_opengloptionsdialog.cpp | 19 +- src/qt/qt_opengloptionsdialog.hpp | 17 +- src/qt/qt_openglrenderer.cpp | 19 +- src/qt/qt_openglrenderer.hpp | 19 +- src/qt/qt_platform.cpp | 21 +- src/qt/qt_progsettings.cpp | 14 +- src/qt/qt_renderercommon.cpp | 14 +- src/qt/qt_rendererstack.cpp | 18 +- src/qt/qt_sdl.c | 54 +- src/qt/qt_sdl.h | 48 +- src/qt/qt_settings.cpp | 16 +- src/qt/qt_settings_bus_tracking.cpp | 16 +- src/qt/qt_settingsdisplay.cpp | 16 +- src/qt/qt_settingsfloppycdrom.cpp | 18 +- src/qt/qt_settingsharddisks.cpp | 18 +- src/qt/qt_settingsinput.cpp | 16 +- src/qt/qt_settingsmachine.cpp | 16 +- src/qt/qt_settingsnetwork.cpp | 16 +- src/qt/qt_settingsotherperipherals.cpp | 16 +- src/qt/qt_settingsotherremovable.cpp | 18 +- src/qt/qt_settingsports.cpp | 20 +- src/qt/qt_settingssound.cpp | 16 +- src/qt/qt_settingsstoragecontrollers.cpp | 16 +- src/qt/qt_softwarerenderer.cpp | 20 +- src/qt/qt_soundgain.cpp | 16 +- src/qt/qt_specifydimensions.cpp | 16 +- src/qt/qt_styleoverride.cpp | 16 +- src/qt/qt_ui.cpp | 18 +- src/qt/qt_unixmanagerfilter.cpp | 23 +- src/qt/qt_unixmanagerfilter.hpp | 21 +- src/qt/qt_util.cpp | 16 +- src/qt/qt_winmanagerfilter.cpp | 19 +- src/qt/qt_winmanagerfilter.hpp | 19 +- src/qt/qt_winrawinputfilter.cpp | 23 +- src/qt/qt_winrawinputfilter.hpp | 19 +- src/qt/win_dynld.c | 16 +- src/qt/win_joystick_rawinput.c | 26 +- src/qt/wl_mouse.cpp | 16 +- src/qt/xinput2_mouse.cpp | 16 +- src/scsi/CMakeLists.txt | 2 +- src/scsi/scsi_aha154x.c | 18 +- src/scsi/scsi_buslogic.c | 2 +- src/scsi/scsi_cdrom.c | 8 +- src/scsi/scsi_spock.c | 12 +- src/scsi/scsi_x54x.c | 16 +- src/sio/CMakeLists.txt | 2 +- src/sio/sio_82091aa.c | 17 +- src/sio/sio_acc3221.c | 204 +- src/sio/sio_ali5123.c | 17 +- src/sio/sio_detect.c | 16 +- src/sio/sio_f82c710.c | 38 +- src/sio/sio_fdc37c669.c | 17 +- src/sio/sio_fdc37c67x.c | 25 +- src/sio/sio_fdc37c6xx.c | 2 +- src/sio/sio_fdc37c93x.c | 19 +- src/sio/sio_fdc37m60x.c | 19 +- src/sio/sio_it8661f.c | 18 +- src/sio/sio_pc87306.c | 19 +- src/sio/sio_pc87307.c | 19 +- src/sio/sio_pc87309.c | 19 +- src/sio/sio_pc87310.c | 26 +- src/sio/sio_pc87311.c | 19 +- src/sio/sio_pc87332.c | 19 +- src/sio/sio_prime3b.c | 19 +- src/sio/sio_prime3c.c | 19 +- src/sio/sio_um8669f.c | 56 +- src/sio/sio_vt82c686.c | 16 +- src/sio/sio_w83787f.c | 20 +- src/sio/sio_w83877f.c | 20 +- src/sio/sio_w83977f.c | 20 +- src/sound/CMakeLists.txt | 2 +- src/sound/midi.c | 2 +- src/sound/openal.c | 2 +- src/sound/resid-fp/CMakeLists.txt | 2 +- src/sound/snd_ad1848.c | 2 +- src/sound/snd_audiopci.c | 2 +- src/sound/snd_mpu401.c | 2 +- src/sound/snd_sb.c | 2 +- src/sound/snd_speaker.c | 2 +- src/sound/snd_wss.c | 2 +- src/sound/sound.c | 2 +- src/unix/assets/86Box.spec | 2 +- src/unix/unix_cdrom.c | 4 +- src/video/CMakeLists.txt | 2 +- src/video/agpgart.c | 16 +- src/video/vid_8514a.c | 18 +- src/video/vid_ati18800.c | 20 +- src/video/vid_ati28800.c | 24 +- src/video/vid_ati68860_ramdac.c | 52 +- src/video/vid_ati_eeprom.c | 20 +- src/video/vid_ati_mach64.c | 20 +- src/video/vid_att20c49x_ramdac.c | 20 +- src/video/vid_att2xc498_ramdac.c | 20 +- src/video/vid_av9194.c | 18 +- src/video/vid_bt48x_ramdac.c | 22 +- src/video/vid_cga.c | 20 +- src/video/vid_cga_comp.c | 22 +- src/video/vid_cl54xx.c | 2 +- src/video/vid_colorplus.c | 20 +- src/video/vid_compaq_cga.c | 24 +- src/video/vid_ddc.c | 16 +- src/video/vid_ega.c | 22 +- src/video/vid_ega_render.c | 20 +- src/video/vid_et3000.c | 18 +- src/video/vid_et4000.c | 4 +- src/video/vid_et4000w32.c | 2 +- src/video/vid_f82c425.c | 48 +- src/video/vid_genius.c | 20 +- src/video/vid_hercules.c | 20 +- src/video/vid_herculesplus.c | 20 +- src/video/vid_ht216.c | 20 +- src/video/vid_ibm_rgb528_ramdac.c | 16 +- src/video/vid_icd2061.c | 26 +- src/video/vid_ics2494.c | 18 +- src/video/vid_ics2595.c | 20 +- src/video/vid_im1024.c | 64 +- src/video/vid_incolor.c | 20 +- src/video/vid_mda.c | 20 +- src/video/vid_mga.c | 17 +- src/video/vid_nga.c | 28 +- src/video/vid_oak_oti.c | 20 +- src/video/vid_ogc.c | 30 +- src/video/vid_paradise.c | 24 +- src/video/vid_pgc.c | 74 +- src/video/vid_rtg310x.c | 16 +- src/video/vid_s3.c | 2 +- src/video/vid_s3_virge.c | 20 +- src/video/vid_sc1148x_ramdac.c | 18 +- src/video/vid_sc1502x_ramdac.c | 22 +- src/video/vid_sdac_ramdac.c | 20 +- src/video/vid_sigma.c | 16 +- src/video/vid_stg_ramdac.c | 20 +- src/video/vid_svga.c | 2 +- src/video/vid_svga_render.c | 20 +- src/video/vid_tgui9440.c | 84 +- src/video/vid_ti_cf62011.c | 82 +- src/video/vid_tkd8001_ramdac.c | 20 +- src/video/vid_tvga.c | 20 +- src/video/vid_tvp3026_ramdac.c | 20 +- src/video/vid_vga.c | 20 +- src/video/vid_voodoo.c | 18 +- src/video/vid_voodoo_banshee.c | 16 +- src/video/vid_voodoo_blitter.c | 16 +- src/video/vid_voodoo_display.c | 16 +- src/video/vid_voodoo_fb.c | 16 +- src/video/vid_voodoo_fifo.c | 16 +- src/video/vid_voodoo_reg.c | 16 +- src/video/vid_voodoo_render.c | 16 +- src/video/vid_voodoo_setup.c | 16 +- src/video/vid_voodoo_texture.c | 16 +- src/video/vid_wy700.c | 20 +- src/video/video.c | 70 +- src/win/glad.c | 4 +- src/win/win.c | 2 +- src/win/win_cdrom.c | 2 +- src/win/win_devconf.c | 2 +- src/win/win_icon.c | 1 + src/win/win_joystick.cpp | 2 +- src/win/win_joystick_rawinput.c | 4 +- src/win/win_joystick_xinput.c | 2 +- src/win/win_mouse.c | 2 +- src/win/win_opengl.c | 4 +- src/win/win_opengl_glslp.c | 2 + src/win/win_settings.c | 59 +- src/win/win_thread.c | 2 +- src/win/win_ui.c | 2 +- vcpkg.json | 2 +- 458 files changed, 6746 insertions(+), 6505 deletions(-) diff --git a/.ci/AppImageBuilder.yml b/.ci/AppImageBuilder.yml index 05a7b8fcb..69376b511 100644 --- a/.ci/AppImageBuilder.yml +++ b/.ci/AppImageBuilder.yml @@ -1,26 +1,26 @@ # -# 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. # -# Recipe file for appimage-builder. +# Recipe file for appimage-builder. # -# build.sh processes conditional comments based on CMakeCache -# options at the end of each line. For example, a line ending in: +# build.sh processes conditional comments based on CMakeCache +# options at the end of each line. For example, a line ending in: # -# # if QT:BOOL=ON +# # if QT:BOOL=ON # -# will be removed from the dynamically-generated copy of this -# file if "QT" is not a boolean option set to ON, either through -# a -D definition or the option's default value in CMakeLists. +# will be removed from the dynamically-generated copy of this +# file if "QT" is not a boolean option set to ON, either through +# a -D definition or the option's default value in CMakeLists. # # -# Authors: RichardG, +# Authors: RichardG, # -# Copyright 2022 RichardG. +# Copyright 2022 RichardG. # version: 1 diff --git a/.ci/Jenkinsfile b/.ci/Jenkinsfile index d7b2f94aa..6ab63ea30 100644 --- a/.ci/Jenkinsfile +++ b/.ci/Jenkinsfile @@ -1,18 +1,18 @@ /* - * 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. * - * Jenkins build pipeline definition. + * Jenkins build pipeline definition. * * * - * Authors: RichardG, + * Authors: RichardG, * - * Copyright 2021-2022 RichardG. + * Copyright 2021-2022 RichardG. */ /* ['main builds', 'branch builds'] */ diff --git a/.ci/build.sh b/.ci/build.sh index f0d91fe18..b2ff8cd83 100644 --- a/.ci/build.sh +++ b/.ci/build.sh @@ -1,18 +1,18 @@ #!/bin/sh # -# 86Box A hypervisor and IBM PC system emulator that specializes in -# running old operating systems and software designed for IBM -# PC systems and compatibles from 1981 through fairly recent -# system designs based on the PCI bus. +# 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. # -# Jenkins build script. +# Jenkins build script. # # -# Authors: RichardG, +# Authors: RichardG, # -# Copyright 2021-2022 RichardG. +# Copyright 2021-2022 RichardG. # # diff --git a/.ci/static2dll.sh b/.ci/static2dll.sh index f6e5b63b9..030898752 100644 --- a/.ci/static2dll.sh +++ b/.ci/static2dll.sh @@ -1,18 +1,18 @@ #!/bin/sh # -# 86Box A hypervisor and IBM PC system emulator that specializes in -# running old operating systems and software designed for IBM -# PC systems and compatibles from 1981 through fairly recent -# system designs based on the PCI bus. +# 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. # -# Script for converting MinGW static libraries into a DLL. +# Script for converting MinGW static libraries into a DLL. # # -# Authors: RichardG, +# Authors: RichardG, # -# Copyright 2021 RichardG. +# Copyright 2021 RichardG. # def_file="static2dll.def" diff --git a/CMakeLists.txt b/CMakeLists.txt index 74b2ad4b2..b067bedbe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,7 +10,7 @@ # # Authors: David Hrdlička, # -# Copyright 2020,2021 David Hrdlička. +# Copyright 2020-2021 David Hrdlička. # cmake_minimum_required(VERSION 3.16) diff --git a/README.md b/README.md index 46a7f08bb..05a2a9ed2 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ 86Box ===== -[![Build Status](http://ci.86box.net/job/86Box/badge/icon)](http://ci.86box.net/job/86Box) +[![Build Status](https://ci.86box.net/job/86Box/badge/icon)](https://ci.86box.net/job/86Box/) **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. diff --git a/bumpversion.sh b/bumpversion.sh index ce3b7c4c8..87728603c 100644 --- a/bumpversion.sh +++ b/bumpversion.sh @@ -1,18 +1,18 @@ #!/bin/sh # -# 86Box A hypervisor and IBM PC system emulator that specializes in -# running old operating systems and software designed for IBM -# PC systems and compatibles from 1981 through fairly recent -# system designs based on the PCI bus. +# 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. # -# Convenience script for changing the emulator's version. +# Convenience script for changing the emulator's version. # # -# Authors: RichardG, +# Authors: RichardG, # -# Copyright 2022 RichardG. +# Copyright 2022 RichardG. # # Parse arguments. diff --git a/cmake/flags-gcc-aarch64.cmake b/cmake/flags-gcc-aarch64.cmake index 34ddaf3e6..4344e2c81 100644 --- a/cmake/flags-gcc-aarch64.cmake +++ b/cmake/flags-gcc-aarch64.cmake @@ -1,20 +1,20 @@ # -# 86Box A hypervisor and IBM PC system emulator that specializes in -# running old operating systems and software designed for IBM -# PC systems and compatibles from 1981 through fairly recent -# system designs based on the PCI bus. +# 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 toolchain file defining GCC compiler flags -# for AArch64 (ARM64) targets. +# CMake toolchain file defining GCC compiler flags +# for AArch64 (ARM64) targets. # -# Authors: David Hrdlička, +# Authors: David Hrdlička, # -# Copyright 2021 David Hrdlička. +# Copyright 2021 David Hrdlička. # string(APPEND CMAKE_C_FLAGS_INIT " -march=armv8-a") string(APPEND CMAKE_CXX_FLAGS_INIT " -march=armv8-a") -include(${CMAKE_CURRENT_LIST_DIR}/flags-gcc.cmake) \ No newline at end of file +include(${CMAKE_CURRENT_LIST_DIR}/flags-gcc.cmake) diff --git a/cmake/flags-gcc-armv7.cmake b/cmake/flags-gcc-armv7.cmake index e73f55edd..828fb1a21 100644 --- a/cmake/flags-gcc-armv7.cmake +++ b/cmake/flags-gcc-armv7.cmake @@ -1,20 +1,20 @@ # -# 86Box A hypervisor and IBM PC system emulator that specializes in -# running old operating systems and software designed for IBM -# PC systems and compatibles from 1981 through fairly recent -# system designs based on the PCI bus. +# 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 toolchain file defining GCC compiler flags -# for ARMv7 targets. +# CMake toolchain file defining GCC compiler flags +# for ARMv7 targets. # -# Authors: David Hrdlička, +# Authors: David Hrdlička, # -# Copyright 2021 David Hrdlička. +# Copyright 2021 David Hrdlička. # string(APPEND CMAKE_C_FLAGS_INIT " -march=armv7-a -mfloat-abi=hard") string(APPEND CMAKE_CXX_FLAGS_INIT " -march=armv7-a -mfloat-abi=hard") -include(${CMAKE_CURRENT_LIST_DIR}/flags-gcc.cmake) \ No newline at end of file +include(${CMAKE_CURRENT_LIST_DIR}/flags-gcc.cmake) diff --git a/cmake/flags-gcc-i686.cmake b/cmake/flags-gcc-i686.cmake index 2d12b7937..3b3d72a16 100644 --- a/cmake/flags-gcc-i686.cmake +++ b/cmake/flags-gcc-i686.cmake @@ -1,17 +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 toolchain file defining GCC compiler flags -# for 32-bit x86 targets. +# CMake toolchain file defining GCC compiler flags +# for 32-bit x86 targets. # -# Authors: David Hrdlička, +# Authors: David Hrdlička, # -# Copyright 2021 David Hrdlička. +# Copyright 2021 David Hrdlička. # string(APPEND CMAKE_C_FLAGS_INIT " -m32 -march=i686 -msse2 -mfpmath=sse -mstackrealign") diff --git a/cmake/flags-gcc-x86_64.cmake b/cmake/flags-gcc-x86_64.cmake index f9f39eb97..47928df42 100644 --- a/cmake/flags-gcc-x86_64.cmake +++ b/cmake/flags-gcc-x86_64.cmake @@ -1,17 +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 toolchain file defining GCC compiler flags -# for 64-bit x86 targets. +# CMake toolchain file defining GCC compiler flags +# for 64-bit x86 targets. # -# Authors: David Hrdlička, +# Authors: David Hrdlička, # -# Copyright 2021 David Hrdlička. +# Copyright 2021 David Hrdlička. # string(APPEND CMAKE_C_FLAGS_INIT " -m64 -march=x86-64 -msse2 -mfpmath=sse -mstackrealign") diff --git a/cmake/flags-gcc.cmake b/cmake/flags-gcc.cmake index e1bf3650e..885353b87 100644 --- a/cmake/flags-gcc.cmake +++ b/cmake/flags-gcc.cmake @@ -1,16 +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. +# 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 toolchain file defining GCC compiler flags. +# CMake toolchain file defining GCC compiler flags. # -# Authors: David Hrdlička, +# Authors: David Hrdlička, # -# Copyright 2021 David Hrdlička. +# Copyright 2021 David Hrdlička. # # Define our flags diff --git a/cmake/llvm-macos-aarch64.cmake b/cmake/llvm-macos-aarch64.cmake index da9ccb449..df67ad45b 100644 --- a/cmake/llvm-macos-aarch64.cmake +++ b/cmake/llvm-macos-aarch64.cmake @@ -1,22 +1,22 @@ # -# 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 toolchain file defining Clang compiler flags -# for AArch64 (ARM64)-based Apple Silicon targets. +# CMake toolchain file defining Clang compiler flags +# for AArch64 (ARM64)-based Apple Silicon targets. # -# Authors: David Hrdlička, -# dob205 +# Authors: David Hrdlička, +# dob205 # -# Copyright 2021 David Hrdlička. -# Copyright 2022 dob205. +# Copyright 2021 David Hrdlička. +# Copyright 2022 dob205. # string(APPEND CMAKE_C_FLAGS_INIT " -march=armv8.5-a+simd") string(APPEND CMAKE_CXX_FLAGS_INIT " -march=armv8.5-a+simd") -include(${CMAKE_CURRENT_LIST_DIR}/flags-gcc.cmake) \ No newline at end of file +include(${CMAKE_CURRENT_LIST_DIR}/flags-gcc.cmake) diff --git a/cmake/llvm-win32-aarch64.cmake b/cmake/llvm-win32-aarch64.cmake index 4aacb248f..015a0dad0 100644 --- a/cmake/llvm-win32-aarch64.cmake +++ b/cmake/llvm-win32-aarch64.cmake @@ -1,16 +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. +# 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 toolchain file for Clang on Windows builds (ARM64 target). +# CMake toolchain file for Clang on Windows builds (ARM64 target). # -# Authors: David Hrdlička, +# Authors: David Hrdlička, # -# Copyright 2021 David Hrdlička. +# Copyright 2021 David Hrdlička. # include(${CMAKE_CURRENT_LIST_DIR}/flags-gcc-aarch64.cmake) @@ -27,4 +27,4 @@ set(CMAKE_CXX_COMPILER_TARGET aarch64-pc-windows-msvc) set(CMAKE_SYSTEM_PROCESSOR ARM64) -# TODO: set the vcpkg target triplet perhaps? \ No newline at end of file +# TODO: set the vcpkg target triplet perhaps? diff --git a/cmake/llvm-win32-arm.cmake b/cmake/llvm-win32-arm.cmake index 9d3488124..30c9877d4 100644 --- a/cmake/llvm-win32-arm.cmake +++ b/cmake/llvm-win32-arm.cmake @@ -1,16 +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. +# 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 toolchain file for Clang on Windows builds (ARM64 target). +# CMake toolchain file for Clang on Windows builds (ARM64 target). # -# Authors: David Hrdlička, +# Authors: David Hrdlička, # -# Copyright 2021 David Hrdlička. +# Copyright 2021 David Hrdlička. # include(${CMAKE_CURRENT_LIST_DIR}/flags-gcc-armv7.cmake) diff --git a/cmake/llvm-win32-i686.cmake b/cmake/llvm-win32-i686.cmake index 8221f8bc2..b69771407 100644 --- a/cmake/llvm-win32-i686.cmake +++ b/cmake/llvm-win32-i686.cmake @@ -1,16 +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. +# 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 toolchain file for Clang on Windows builds (x86 target). +# CMake toolchain file for Clang on Windows builds (x86 target). # -# Authors: David Hrdlička, +# Authors: David Hrdlička, # -# Copyright 2021 David Hrdlička. +# Copyright 2021 David Hrdlička. # include(${CMAKE_CURRENT_LIST_DIR}/flags-gcc-i686.cmake) @@ -27,4 +27,4 @@ set(CMAKE_CXX_COMPILER_TARGET i686-pc-windows-msvc) set(CMAKE_SYSTEM_PROCESSOR X86) -# TODO: set the vcpkg target triplet perhaps? \ No newline at end of file +# TODO: set the vcpkg target triplet perhaps? diff --git a/cmake/llvm-win32-x86_64.cmake b/cmake/llvm-win32-x86_64.cmake index 7caeb7836..da0cfd3f2 100644 --- a/cmake/llvm-win32-x86_64.cmake +++ b/cmake/llvm-win32-x86_64.cmake @@ -1,16 +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. +# 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 toolchain file for Clang on Windows builds (x64/AMD64 target). +# CMake toolchain file for Clang on Windows builds (x64/AMD64 target). # -# Authors: David Hrdlička, +# Authors: David Hrdlička, # -# Copyright 2021 David Hrdlička. +# Copyright 2021 David Hrdlička. # include(${CMAKE_CURRENT_LIST_DIR}/flags-gcc-x86_64.cmake) @@ -27,4 +27,4 @@ set(CMAKE_CXX_COMPILER_TARGET x86_64-pc-windows-msvc) set(CMAKE_SYSTEM_PROCESSOR AMD64) -# TODO: set the vcpkg target triplet perhaps? \ No newline at end of file +# TODO: set the vcpkg target triplet perhaps? diff --git a/debian/changelog b/debian/changelog index 0ec15e546..45b701f83 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,5 +1,5 @@ 86box (3.11.0-1) UNRELEASED; urgency=medium - * Initial release. + * Bump release. -- Jasmine Iwanek Sun, 18 Nov 2022 23:27:00 -0500 diff --git a/src/86box.c b/src/86box.c index c3b66db05..075727387 100644 --- a/src/86box.c +++ b/src/86box.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/Makefile.local b/src/Makefile.local index 4c6830afd..fdb2dcab3 100644 --- a/src/Makefile.local +++ b/src/Makefile.local @@ -1,32 +1,32 @@ # -# 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. # -# Prefix for localizing the general Makefile.mingw for local -# settings, so we can avoid changing the main one for all of -# our local setups. +# Prefix for localizing the general Makefile.mingw for local +# settings, so we can avoid changing the main one for all of +# our local setups. # -# Author: Fred N. van Kempen, +# Authors: Fred N. van Kempen, # ######################################################################### -# Anything here will override defaults in Makefile.MinGW. # +# Anything here will override defaults in Makefile.MinGW. # ######################################################################### # Name of the executable. -#PROG := yourexe +#PROG := 86box.exe # Various compile-time options. # -DROM_TRACE=0xc800 traces ROM access from segment C800 # -DIO_TRACE=0x66 traces I/O on port 0x66 # -DIO_CATCH enables I/O range catch logs -STUFF := +STUFF := # Add feature selections here. # -DANSI_CFG forces the config file to ANSI encoding. @@ -168,31 +168,31 @@ STUFF := # -DENABLE_JOYSTICK_LOG=N sets logging level at N. # -DENABLE_SDL_LOG=N sets logging level at N. # -DENABLE_SETTINGS_LOG=N sets logging level at N. -EXTRAS := +EXTRAS := -AUTODEP := n -DEBUG := n -OPTIM := n -X64 := n -RELEASE := n -USB := n -VNC := n -RDP := n -DEV_BUILD := n -DEV_BRANCH := n -CIRRUS := n -NE1000 := n -NV_RIVA := n -OPENAL := y -FLUIDSYNTH := y -MUNT := y -PAS16 := n -DYNAREC := y +AUTODEP := n +DEBUG := n +OPTIM := n +X64 := n +RELEASE := n +USB := n +VNC := n +RDP := n +DEV_BUILD := n +DEV_BRANCH := n +CIRRUS := n +NE1000 := n +NV_RIVA := n +OPENAL := y +FLUIDSYNTH := y +MUNT := y +PAS16 := n +DYNAREC := y ######################################################################### -# Include the master Makefile.MinGW for the rest. # +# Include the master Makefile.MinGW for the rest. # ######################################################################### include win/Makefile.mingw diff --git a/src/cdrom/CMakeLists.txt b/src/cdrom/CMakeLists.txt index c09a040bd..201cee7f6 100644 --- a/src/cdrom/CMakeLists.txt +++ b/src/cdrom/CMakeLists.txt @@ -10,7 +10,7 @@ # # Authors: David Hrdlička, # -# Copyright 2020,2021 David Hrdlička. +# Copyright 2020-2021 David Hrdlička. # add_library(cdrom OBJECT cdrom.c cdrom_image_backend.c cdrom_image_viso.c cdrom_image.c cdrom_mitsumi.c) diff --git a/src/chipset/CMakeLists.txt b/src/chipset/CMakeLists.txt index 47b9b30ce..d93f86219 100644 --- a/src/chipset/CMakeLists.txt +++ b/src/chipset/CMakeLists.txt @@ -10,7 +10,7 @@ # # Authors: David Hrdlička, # -# Copyright 2020,2021 David Hrdlička. +# Copyright 2020-2021 David Hrdlička. # add_library(chipset OBJECT 82c100.c acc2168.c cs8230.c ali1429.c ali1489.c ali1531.c ali1541.c ali1543.c diff --git a/src/chipset/acc2168.c b/src/chipset/acc2168.c index 7332a28a3..765913672 100644 --- a/src/chipset/acc2168.c +++ b/src/chipset/acc2168.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Tiseno100 * * Copyright 2019 Sarah Walker. diff --git a/src/chipset/ali1429.c b/src/chipset/ali1429.c index 699769fa2..36ac2fdf9 100644 --- a/src/chipset/ali1429.c +++ b/src/chipset/ali1429.c @@ -16,8 +16,8 @@ * Authors: Tiseno100, * Miran Grca, * - * Copyright 2020,2021 Tiseno100. - * Copyright 2021,2021 Miran Grca. + * Copyright 2020-2021 Tiseno100. + * Copyright 2021-2021 Miran Grca. */ /* diff --git a/src/chipset/ali1489.c b/src/chipset/ali1489.c index 8a0cfd89a..70ff509ab 100644 --- a/src/chipset/ali1489.c +++ b/src/chipset/ali1489.c @@ -13,8 +13,8 @@ * Authors: Tiseno100, * Miran Grca, * - * Copyright 2020,2021 Tiseno100. - * Copyright 2020,2021 Miran Grca. + * Copyright 2020-2021 Tiseno100. + * Copyright 2020-2021 Miran Grca. */ #include #include diff --git a/src/chipset/cs8230.c b/src/chipset/cs8230.c index 49e7d71b6..edf4ac8c2 100644 --- a/src/chipset/cs8230.c +++ b/src/chipset/cs8230.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * * Copyright 2020 Sarah Walker. */ diff --git a/src/chipset/headland.c b/src/chipset/headland.c index c1881bede..8b8ee1562 100644 --- a/src/chipset/headland.c +++ b/src/chipset/headland.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Fred N. van Kempen, * Original by GreatPsycho for PCem. * Miran Grca, diff --git a/src/chipset/scamp.c b/src/chipset/scamp.c index ec7381cec..6e61db681 100644 --- a/src/chipset/scamp.c +++ b/src/chipset/scamp.c @@ -15,7 +15,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * * Copyright 2020 Sarah Walker. */ diff --git a/src/chipset/sis_85c4xx.c b/src/chipset/sis_85c4xx.c index ade5573f1..670a2cc83 100644 --- a/src/chipset/sis_85c4xx.c +++ b/src/chipset/sis_85c4xx.c @@ -13,7 +13,7 @@ * * Authors: Miran Grca, * - * Copyright 2019,2020 Miran Grca. + * Copyright 2019-2020 Miran Grca. */ #include #include diff --git a/src/chipset/via_apollo.c b/src/chipset/via_apollo.c index 99802b2b5..6ed6f21fe 100644 --- a/src/chipset/via_apollo.c +++ b/src/chipset/via_apollo.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Melissa Goad, * Tiseno100, diff --git a/src/chipset/via_pipc.c b/src/chipset/via_pipc.c index e6701ebfc..4f640920e 100644 --- a/src/chipset/via_pipc.c +++ b/src/chipset/via_pipc.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Melissa Goad, * RichardG, diff --git a/src/codegen/CMakeLists.txt b/src/codegen/CMakeLists.txt index 23936959e..3cb9de6ca 100644 --- a/src/codegen/CMakeLists.txt +++ b/src/codegen/CMakeLists.txt @@ -10,7 +10,7 @@ # # Authors: David Hrdlička, # -# Copyright 2020,2021 David Hrdlička. +# Copyright 2020-2021 David Hrdlička. # if(DYNAREC) diff --git a/src/codegen/codegen.h b/src/codegen/codegen.h index af602427d..cb9df495b 100644 --- a/src/codegen/codegen.h +++ b/src/codegen/codegen.h @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2018 Sarah Walker. diff --git a/src/codegen/codegen_ops_x86-64.h b/src/codegen/codegen_ops_x86-64.h index 00518d9ba..77f7c02ab 100644 --- a/src/codegen/codegen_ops_x86-64.h +++ b/src/codegen/codegen_ops_x86-64.h @@ -82,7 +82,7 @@ load_param_1_reg_32(int reg) #if 0 static __inline void load_param_1_64(codeblock_t *block, uint64_t param) { - addbyte(0x48); + addbyte(0x48); # if _WIN64 addbyte(0xb9); /*MOVL $fetchdat,%ecx*/ # else diff --git a/src/codegen/codegen_x86.c b/src/codegen/codegen_x86.c index bd9793732..dbf76c2e4 100644 --- a/src/codegen/codegen_x86.c +++ b/src/codegen/codegen_x86.c @@ -11,7 +11,7 @@ * * * Authors: Fred N. van Kempen, - * Sarah Walker, + * Sarah Walker, * Miran Grca, * * Copyright 2018 Fred N. van Kempen. diff --git a/src/codegen_new/CMakeLists.txt b/src/codegen_new/CMakeLists.txt index 8c02060e4..038f1edd1 100644 --- a/src/codegen_new/CMakeLists.txt +++ b/src/codegen_new/CMakeLists.txt @@ -10,7 +10,7 @@ # # Authors: David Hrdlička, # -# Copyright 2020,2021 David Hrdlička. +# Copyright 2020-2021 David Hrdlička. # if(DYNAREC) diff --git a/src/codegen_new/codegen_backend_arm_uops.c b/src/codegen_new/codegen_backend_arm_uops.c index 4cc0ff38d..d0b8b86c1 100644 --- a/src/codegen_new/codegen_backend_arm_uops.c +++ b/src/codegen_new/codegen_backend_arm_uops.c @@ -119,8 +119,8 @@ codegen_ADD(codeblock_t *block, uop_t *uop) static int codegen_ADD_IMM(codeblock_t *block, uop_t *uop) { - // host_arm_ADD_IMM(block, uop->dest_reg_a_real, uop->src_reg_a_real, uop->imm_data); - // return 0; +// host_arm_ADD_IMM(block, uop->dest_reg_a_real, uop->src_reg_a_real, uop->imm_data); +// return 0; int dest_reg = HOST_REG_GET(uop->dest_reg_a_real), src_reg = HOST_REG_GET(uop->src_reg_a_real); int dest_size = IREG_GET_SIZE(uop->dest_reg_a_real), src_size = IREG_GET_SIZE(uop->src_reg_a_real); @@ -2597,8 +2597,8 @@ codegen_SUB(codeblock_t *block, uop_t *uop) return 0; - // host_arm_SUB_REG_LSL(block, uop->dest_reg_a_real, uop->src_reg_a_real, uop->src_reg_b_real, 0); - // return 0; +// host_arm_SUB_REG_LSL(block, uop->dest_reg_a_real, uop->src_reg_a_real, uop->src_reg_b_real, 0); +// return 0; } static int codegen_SUB_IMM(codeblock_t *block, uop_t *uop) diff --git a/src/config.c b/src/config.c index a552408c0..cbccf115f 100644 --- a/src/config.c +++ b/src/config.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * Overdoze, @@ -19,7 +19,7 @@ * Copyright 2008-2019 Sarah Walker. * Copyright 2016-2019 Miran Grca. * Copyright 2017-2019 Fred N. van Kempen. - * Copyright 2018,2019 David Hrdlička. + * Copyright 2018-2019 David Hrdlička. * * NOTE: Forcing config files to be in Unicode encoding breaks * it on Windows XP, and possibly also Vista. Use the diff --git a/src/cpu/386_common.h b/src/cpu/386_common.h index 6310ae642..f26eb7f98 100644 --- a/src/cpu/386_common.h +++ b/src/cpu/386_common.h @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2019 Sarah Walker. diff --git a/src/cpu/386_ops.h b/src/cpu/386_ops.h index ec46ba0ae..e345ee8d8 100644 --- a/src/cpu/386_ops.h +++ b/src/cpu/386_ops.h @@ -11,7 +11,7 @@ * * * Authors: Fred N. van Kempen, - * Sarah Walker, + * Sarah Walker, * leilei, * Miran Grca, * diff --git a/src/cpu/CMakeLists.txt b/src/cpu/CMakeLists.txt index e61d4bfcf..68baaf293 100644 --- a/src/cpu/CMakeLists.txt +++ b/src/cpu/CMakeLists.txt @@ -10,7 +10,7 @@ # # Authors: David Hrdlička, # -# Copyright 2020,2021 David Hrdlička. +# Copyright 2020-2021 David Hrdlička. # add_library(cpu OBJECT cpu.c cpu_table.c fpu.c x86.c 808x.c 386.c 386_common.c diff --git a/src/cpu/codegen_timing_686.c b/src/cpu/codegen_timing_686.c index 9752b24c4..7d7f4042d 100644 --- a/src/cpu/codegen_timing_686.c +++ b/src/cpu/codegen_timing_686.c @@ -949,7 +949,7 @@ void codegen_timing_686_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, uin if (regmask & IMPL_ESP) regmask |= SRCDEP_ESP | DSTDEP_ESP; - agi_stall = check_agi(prev_deps, prev_opcode, prev_fetchdat, prev_op_32); + agi_stall = check_agi(prev_deps, prev_opcode, prev_fetchdat, prev_op_32); /*Second instruction in the pair*/ if ((timings[opcode] & PAIR_MASK) == PAIR_NP) @@ -992,7 +992,7 @@ void codegen_timing_686_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, uin if (!t_pair) fatal("Pairable 0 cycles! %02x %02x\n", opcode, prev_opcode); - agi_stall = check_agi(deps, opcode, fetchdat, op_32); + agi_stall = check_agi(deps, opcode, fetchdat, op_32); codegen_block_cycles += t_pair + agi_stall; decode_delay = (-t_pair) + 1 + agi_stall; @@ -1012,7 +1012,7 @@ void codegen_timing_686_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, uin /*Instruction not pairable*/ int agi_stall = 0; - agi_stall = check_agi(deps, opcode, fetchdat, op_32); + agi_stall = check_agi(deps, opcode, fetchdat, op_32); codegen_block_cycles += COUNT(timings[opcode], op_32) + decode_delay + agi_stall; decode_delay = (-COUNT(timings[opcode], op_32)) + 1 + agi_stall; diff --git a/src/cpu/codegen_timing_k6.c b/src/cpu/codegen_timing_k6.c index 6bb472144..6a59fc157 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://users.atw.hu/instlatx64/AuthenticAMD0000562_K6_InstLatX86.txt*/ + Some of the timings are based on http://http://web.archive.org/web/20181122095446/http://users.atw.hu/instlatx64/AuthenticAMD0000562_K6_InstLatX86.txt*/ #include #include #include diff --git a/src/cpu/codegen_timing_p6.c b/src/cpu/codegen_timing_p6.c index 19fa07de1..cf40e084e 100644 --- a/src/cpu/codegen_timing_p6.c +++ b/src/cpu/codegen_timing_p6.c @@ -23,10 +23,10 @@ typedef enum uop_type_t UOP_ALUP0, /*Executes in Port 0 ALU unit*/ UOP_LOAD, /*Executes in Load unit*/ UOP_STORED, /*Executes in Data Store unit*/ - UOP_STOREA, /*Executes in Address Store unit*/ + UOP_STOREA, /*Executes in Address Store unit*/ UOP_FLOAD, /*Executes in Load unit*/ UOP_FSTORED, /*Executes in Data Store unit*/ - UOP_FSTOREA, /*Executes in Address Store unit*/ + UOP_FSTOREA, /*Executes in Address Store unit*/ UOP_MLOAD, /*Executes in Load unit*/ UOP_MSTORED, /*Executes in Data Store unit*/ UOP_MSTOREA, /*Executes in Address Store unit*/ @@ -93,7 +93,7 @@ static const macro_op_t alu_store_op = .uop[1] = {.type = UOP_ALU, .latency = 1}, .uop[2] = {.type = UOP_STORED, .latency = 1}, .uop[3] = {.type = UOP_STOREA, .latency = 1} - }; +}; static const macro_op_t alup0_store_op = { .nr_uops = 4, @@ -162,8 +162,8 @@ static const macro_op_t loop_op = .decode_type = DECODE_COMPLEX, .uop[0] = {.type = UOP_ALU, .latency = 1}, .uop[1] = {.type = UOP_ALU, .latency = 1}, - .uop[2] = {.type = UOP_ALU, .latency = 1}, - .uop[3] = {.type = UOP_ALU, .latency = 1}, + .uop[2] = {.type = UOP_ALU, .latency = 1}, + .uop[3] = {.type = UOP_ALU, .latency = 1}, .uop[4] = {.type = UOP_BRANCH, .latency = 1} }; static const macro_op_t mov_reg_seg_op = @@ -219,7 +219,7 @@ static const macro_op_t push_seg_op = .uop[0] = {.type = UOP_LOAD, .latency = 1}, .uop[1] = {.type = UOP_STORED, .latency = 1}, .uop[2] = {.type = UOP_STOREA, .latency = 1}, - .uop[3] = {.type = UOP_ALU, .latency = 1} + .uop[3] = {.type = UOP_ALU, .latency = 1} }; static const macro_op_t stos_op = { @@ -1607,24 +1607,24 @@ static p6_unit_t *units; /*Pentium Pro has no MMX*/ static p6_unit_t ppro_units[] = { - {.uop_mask = (1 << UOP_ALU) | (1 << UOP_ALUP0) | (1 << UOP_FLOAT)}, /*Port 0*/ - {.uop_mask = (1 << UOP_ALU) | (1 << UOP_BRANCH)}, /*Port 1*/ - {.uop_mask = (1 << UOP_LOAD) | (1 << UOP_FLOAD)}, /*Port 2*/ - {.uop_mask = (1 << UOP_STORED) | (1 << UOP_FSTORED)}, /*Port 3*/ - {.uop_mask = (1 << UOP_STOREA) | (1 << UOP_FSTOREA)}, /*Port 4*/ + {.uop_mask = (1 << UOP_ALU) | (1 << UOP_ALUP0) | (1 << UOP_FLOAT)}, /*Port 0*/ + {.uop_mask = (1 << UOP_ALU) | (1 << UOP_BRANCH)}, /*Port 1*/ + {.uop_mask = (1 << UOP_LOAD) | (1 << UOP_FLOAD)}, /*Port 2*/ + {.uop_mask = (1 << UOP_STORED) | (1 << UOP_FSTORED)}, /*Port 3*/ + {.uop_mask = (1 << UOP_STOREA) | (1 << UOP_FSTOREA)}, /*Port 4*/ }; #define NR_PPRO_UNITS (sizeof(ppro_units) / sizeof(p6_unit_t)) /*Pentium II/Celeron assigns the multiplier to port 0, the shifter to port 1, and shares the MMX ALU*/ static p6_unit_t p2_units[] = { - {.uop_mask = (1 << UOP_ALU) | (1 << UOP_ALUP0) | (1 << UOP_FLOAT) | /*Port 0*/ - (1 << UOP_MMX) | (1 << UOP_MMX_MUL)}, - {.uop_mask = (1 << UOP_ALU) | (1 << UOP_BRANCH) | /*Port 1*/ - (1 << UOP_MMX) | (1 << UOP_MMX_SHIFT)}, - {.uop_mask = (1 << UOP_LOAD) | (1 << UOP_FLOAD) | (1 << UOP_MLOAD)}, /*Port 2*/ - {.uop_mask = (1 << UOP_STORED) | (1 << UOP_FSTORED) | (1 << UOP_MSTORED)}, /*Port 3*/ - {.uop_mask = (1 << UOP_STOREA) | (1 << UOP_FSTOREA) | (1 << UOP_MSTOREA)}, /*Port 4*/ + {.uop_mask = (1 << UOP_ALU) | (1 << UOP_ALUP0) | (1 << UOP_FLOAT) | /*Port 0*/ + (1 << UOP_MMX) | (1 << UOP_MMX_MUL)}, + {.uop_mask = (1 << UOP_ALU) | (1 << UOP_BRANCH) | /*Port 1*/ + (1 << UOP_MMX) | (1 << UOP_MMX_SHIFT)}, + {.uop_mask = (1 << UOP_LOAD) | (1 << UOP_FLOAD) | (1 << UOP_MLOAD)}, /*Port 2*/ + {.uop_mask = (1 << UOP_STORED) | (1 << UOP_FSTORED) | (1 << UOP_MSTORED)}, /*Port 3*/ + {.uop_mask = (1 << UOP_STOREA) | (1 << UOP_FSTOREA) | (1 << UOP_MSTOREA)}, /*Port 4*/ }; #define NR_P2_UNITS (sizeof(p2_units) / sizeof(p6_unit_t)) @@ -1790,7 +1790,7 @@ static void decode_instruction(const macro_op_t *ins, uint64_t deps, uint32_t fe uint32_t regmask_required; uint32_t regmask_modified; int c; - int d = 0; /*Complex decoder uOPs*/ + int d = 0; /*Complex decoder uOPs*/ int earliest_start = 0; decode_type_t decode_type = ins->decode_type; int instr_length = codegen_timing_instr_length(deps, fetchdat, op_32); @@ -1839,7 +1839,7 @@ static void decode_instruction(const macro_op_t *ins, uint64_t deps, uint32_t fe decode_buffer.uops[decode_buffer.nr_uops] = &ins->uop[0]; decode_buffer.earliest_start[decode_buffer.nr_uops] = earliest_start; decode_buffer.nr_uops = 2+d; - if (d) + if (d) decode_flush_p6(); } else if (decode_buffer.nr_uops) @@ -1869,7 +1869,7 @@ static void decode_instruction(const macro_op_t *ins, uint64_t deps, uint32_t fe decode_buffer.earliest_start[d] = earliest_start; else decode_buffer.earliest_start[d] = -1; - d++; + d++; if ((d == 3) && (ins->nr_uops > 4)) /*Ins. with >4 uOPs require the use of special units only present on 3 translate PLAs*/ { @@ -1878,10 +1878,10 @@ static void decode_instruction(const macro_op_t *ins, uint64_t deps, uint32_t fe decode_flush_p6(); /*The other two decoders are halted to preserve in-order issue*/ } } - if (d) - { - decode_buffer.nr_uops = d; - } + if (d) + { + decode_buffer.nr_uops = d; + } break; } @@ -1982,8 +1982,8 @@ void codegen_timing_p6_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, uint switch (last_prefix) { case 0x0f: - ins_table = mod3 ? opcode_timings_0f_mod3 : opcode_timings_0f; - deps = mod3 ? opcode_deps_0f_mod3 : opcode_deps_0f; + ins_table = mod3 ? opcode_timings_0f_mod3 : opcode_timings_0f; + deps = mod3 ? opcode_deps_0f_mod3 : opcode_deps_0f; break; case 0xd8: diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c index 380da450e..d48ebe194 100644 --- a/src/cpu/cpu.c +++ b/src/cpu/cpu.c @@ -8,7 +8,7 @@ * * CPU type handler. * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * leilei, * Miran Grca, * Fred N. van Kempen, diff --git a/src/cpu/cpu.h b/src/cpu/cpu.h index 307865629..25ff141a7 100644 --- a/src/cpu/cpu.h +++ b/src/cpu/cpu.h @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * leilei, * Miran Grca, * diff --git a/src/cpu/cpu_table.c b/src/cpu/cpu_table.c index f9e86541c..3afaf055e 100644 --- a/src/cpu/cpu_table.c +++ b/src/cpu/cpu_table.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * leilei, * Miran Grca, * Fred N. van Kempen, @@ -21,8 +21,8 @@ * Copyright 2016-2019 leilei. * Copyright 2016-2019 Miran Grca. * Copyright 2017-2020 Fred N. van Kempen. - * Copyright 2020 RichardG. - * Copyright 2021 dob205. + * Copyright 2020 RichardG. + * Copyright 2021 dob205. */ #include #include @@ -71,1089 +71,1086 @@ 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[]) { - {"4.77", CPU_8088, fpus_8088, 4772728, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, - {"7.16", CPU_8088, fpus_8088, 7159092, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, - {"8", CPU_8088, fpus_8088, 8000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, -// {"9.54", CPU_8088, fpus_8088, 9545456, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, - {"10", CPU_8088, fpus_8088, 10000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, - {"12", CPU_8088, fpus_8088, 12000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, - {"16", CPU_8088, fpus_8088, 16000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, - {"", 0} - } + .package = CPU_PKG_8088, + .manufacturer = "Intel", + .name = "8088", + .internal_name = "8088", + .cpus = (const CPU[]) { + {"4.77", CPU_8088, fpus_8088, 4772728, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, + {"7.16", CPU_8088, fpus_8088, 7159092, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, + {"8", CPU_8088, fpus_8088, 8000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, +// {"9.54", CPU_8088, fpus_8088, 9545456, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, + {"10", CPU_8088, fpus_8088, 10000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, + {"12", CPU_8088, fpus_8088, 12000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, + {"16", CPU_8088, fpus_8088, 16000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, + {"", 0} + } }, { - .package = CPU_PKG_8088_EUROPC, - .manufacturer = "Intel", - .name = "8088", - .internal_name = "8088_europc", - .cpus = (const CPU[]) { - {"4.77", CPU_8088, fpus_8088, 4772728, 1, 5000, 0, 0, 0, CPU_ALTERNATE_XTAL, 0,0,0,0, 1}, - {"7.16", CPU_8088, fpus_8088, 7159092, 1, 5000, 0, 0, 0, CPU_ALTERNATE_XTAL, 0,0,0,0, 1}, - {"9.54", CPU_8088, fpus_8088, 9545456, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, - {"", 0} - } + .package = CPU_PKG_8088_EUROPC, + .manufacturer = "Intel", + .name = "8088", + .internal_name = "8088_europc", + .cpus = (const CPU[]) { + {"4.77", CPU_8088, fpus_8088, 4772728, 1, 5000, 0, 0, 0, CPU_ALTERNATE_XTAL, 0,0,0,0, 1}, + {"7.16", CPU_8088, fpus_8088, 7159092, 1, 5000, 0, 0, 0, CPU_ALTERNATE_XTAL, 0,0,0,0, 1}, + {"9.54", CPU_8088, fpus_8088, 9545456, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, + {"", 0} + } }, { - .package = CPU_PKG_8086, - .manufacturer = "Intel", - .name = "8086", - .internal_name = "8086", - .cpus = (const CPU[]) { - {"7.16", CPU_8086, fpus_8088, 7159092, 1, 5000, 0, 0, 0, CPU_ALTERNATE_XTAL, 0,0,0,0, 1}, - {"8", CPU_8086, fpus_8088, 8000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, - {"9.54", CPU_8086, fpus_8088, 9545456, 1, 5000, 0, 0, 0, CPU_ALTERNATE_XTAL, 0,0,0,0, 1}, - {"10", CPU_8086, fpus_8088, 10000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, - {"12", CPU_8086, fpus_8088, 12000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, - {"16", CPU_8086, fpus_8088, 16000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 2}, - {"", 0} - } + .package = CPU_PKG_8086, + .manufacturer = "Intel", + .name = "8086", + .internal_name = "8086", + .cpus = (const CPU[]) { + {"7.16", CPU_8086, fpus_8088, 7159092, 1, 5000, 0, 0, 0, CPU_ALTERNATE_XTAL, 0,0,0,0, 1}, + {"8", CPU_8086, fpus_8088, 8000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, + {"9.54", CPU_8086, fpus_8088, 9545456, 1, 5000, 0, 0, 0, CPU_ALTERNATE_XTAL, 0,0,0,0, 1}, + {"10", CPU_8086, fpus_8088, 10000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, + {"12", CPU_8086, fpus_8088, 12000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, + {"16", CPU_8086, fpus_8088, 16000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 2}, + {"", 0} + } }, { - .package = CPU_PKG_188, - .manufacturer = "Intel", - .name = "80188", - .internal_name = "80188", - .cpus = (const CPU[]) { - {"6", CPU_188, fpus_8088, 6000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, - {"7.16", CPU_188, fpus_8088, 7159092, 1, 5000, 0, 0, 0, CPU_ALTERNATE_XTAL, 0,0,0,0, 1}, - {"8", CPU_188, fpus_8088, 8000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, - {"9.54", CPU_188, fpus_8088, 9545456, 1, 5000, 0, 0, 0, CPU_ALTERNATE_XTAL, 0,0,0,0, 1}, - {"10", CPU_188, fpus_8088, 10000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, - {"12", CPU_188, fpus_8088, 12000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, - {"16", CPU_188, fpus_8088, 16000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 2}, - {"20", CPU_188, fpus_8088, 20000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 3}, - {"25", CPU_188, fpus_8088, 25000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 3}, - {"", 0} - } + .package = CPU_PKG_188, + .manufacturer = "Intel", + .name = "80188", + .internal_name = "80188", + .cpus = (const CPU[]) { + {"6", CPU_188, fpus_8088, 6000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, + {"7.16", CPU_188, fpus_8088, 7159092, 1, 5000, 0, 0, 0, CPU_ALTERNATE_XTAL, 0,0,0,0, 1}, + {"8", CPU_188, fpus_8088, 8000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, + {"9.54", CPU_188, fpus_8088, 9545456, 1, 5000, 0, 0, 0, CPU_ALTERNATE_XTAL, 0,0,0,0, 1}, + {"10", CPU_188, fpus_8088, 10000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, + {"12", CPU_188, fpus_8088, 12000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, + {"16", CPU_188, fpus_8088, 16000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 2}, + {"20", CPU_188, fpus_8088, 20000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 3}, + {"25", CPU_188, fpus_8088, 25000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 3}, + {"", 0} + } }, { - .package = CPU_PKG_8088, - .manufacturer = "NEC", - .name = "V20", - .internal_name = "necv20", - .cpus = (const CPU[]) { - {"4.77", CPU_V20, fpus_8088, 4772728, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, - {"7.16", CPU_V20, fpus_8088, 7159092, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, - {"10", CPU_V20, fpus_8088, 10000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, - {"12", CPU_V20, fpus_8088, 12000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, - {"16", CPU_V20, fpus_8088, 16000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 2}, - {"", 0} - } + .package = CPU_PKG_8088, + .manufacturer = "NEC", + .name = "V20", + .internal_name = "necv20", + .cpus = (const CPU[]) { + {"4.77", CPU_V20, fpus_8088, 4772728, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, + {"7.16", CPU_V20, fpus_8088, 7159092, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, + {"10", CPU_V20, fpus_8088, 10000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, + {"12", CPU_V20, fpus_8088, 12000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, + {"16", CPU_V20, fpus_8088, 16000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 2}, + {"", 0} + } }, { - .package = CPU_PKG_186, - .manufacturer = "Intel", - .name = "80186", - .internal_name = "80186", - .cpus = (const CPU[]) { - {"6", CPU_186, fpus_80186, 6000000, 1, 0, 0, 0, 0, 0, 0,0,0,0, 1}, - {"7.16", CPU_186, fpus_80186, 7159092, 1, 0, 0, 0, 0, CPU_ALTERNATE_XTAL, 0,0,0,0, 1}, - {"8", CPU_186, fpus_80186, 8000000, 1, 0, 0, 0, 0, 0, 0,0,0,0, 1}, - {"9.54", CPU_186, fpus_80186, 9545456, 1, 0, 0, 0, 0, CPU_ALTERNATE_XTAL, 0,0,0,0, 1}, - {"10", CPU_186, fpus_80186, 10000000, 1, 0, 0, 0, 0, 0, 0,0,0,0, 1}, - {"12", CPU_186, fpus_80186, 12000000, 1, 0, 0, 0, 0, 0, 0,0,0,0, 1}, - {"16", CPU_186, fpus_80186, 16000000, 1, 0, 0, 0, 0, 0, 0,0,0,0, 2}, - {"20", CPU_186, fpus_80186, 20000000, 1, 0, 0, 0, 0, 0, 0,0,0,0, 3}, - {"25", CPU_186, fpus_80186, 25000000, 1, 0, 0, 0, 0, 0, 0,0,0,0, 3}, - {"", 0} - } + .package = CPU_PKG_186, + .manufacturer = "Intel", + .name = "80186", + .internal_name = "80186", + .cpus = (const CPU[]) { + {"6", CPU_186, fpus_80186, 6000000, 1, 0, 0, 0, 0, 0, 0,0,0,0, 1}, + {"7.16", CPU_186, fpus_80186, 7159092, 1, 0, 0, 0, 0, CPU_ALTERNATE_XTAL, 0,0,0,0, 1}, + {"8", CPU_186, fpus_80186, 8000000, 1, 0, 0, 0, 0, 0, 0,0,0,0, 1}, + {"9.54", CPU_186, fpus_80186, 9545456, 1, 0, 0, 0, 0, CPU_ALTERNATE_XTAL, 0,0,0,0, 1}, + {"10", CPU_186, fpus_80186, 10000000, 1, 0, 0, 0, 0, 0, 0,0,0,0, 1}, + {"12", CPU_186, fpus_80186, 12000000, 1, 0, 0, 0, 0, 0, 0,0,0,0, 1}, + {"16", CPU_186, fpus_80186, 16000000, 1, 0, 0, 0, 0, 0, 0,0,0,0, 2}, + {"20", CPU_186, fpus_80186, 20000000, 1, 0, 0, 0, 0, 0, 0,0,0,0, 3}, + {"25", CPU_186, fpus_80186, 25000000, 1, 0, 0, 0, 0, 0, 0,0,0,0, 3}, + {"", 0} + } }, { - .package = CPU_PKG_8086, - .manufacturer = "NEC", - .name = "V30", - .internal_name = "necv30", - .cpus = (const CPU[]) { - {"5", CPU_V30, fpus_80186, 5000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, - {"8", CPU_V30, fpus_80186, 8000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, - {"10", CPU_V30, fpus_80186, 10000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, - {"12", CPU_V30, fpus_80186, 12000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, - {"16", CPU_V30, fpus_80186, 16000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 2}, - {"", 0} - } + .package = CPU_PKG_8086, + .manufacturer = "NEC", + .name = "V30", + .internal_name = "necv30", + .cpus = (const CPU[]) { + {"5", CPU_V30, fpus_80186, 5000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, + {"8", CPU_V30, fpus_80186, 8000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, + {"10", CPU_V30, fpus_80186, 10000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, + {"12", CPU_V30, fpus_80186, 12000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 1}, + {"16", CPU_V30, fpus_80186, 16000000, 1, 5000, 0, 0, 0, 0, 0,0,0,0, 2}, + {"", 0} + } }, { - .package = CPU_PKG_286, - .manufacturer = "Intel", - .name = "80286", - .internal_name = "286", - .cpus = (const CPU[]) { - {"6", CPU_286, fpus_80286, 6000000, 1, 5000, 0, 0, 0, 0, 2,2,2,2, 1}, - {"8", CPU_286, fpus_80286, 8000000, 1, 5000, 0, 0, 0, 0, 2,2,2,2, 1}, - {"10", CPU_286, fpus_80286, 10000000, 1, 5000, 0, 0, 0, 0, 2,2,2,2, 1}, - {"12", CPU_286, fpus_80286, 12500000, 1, 5000, 0, 0, 0, 0, 3,3,3,3, 2}, - {"16", CPU_286, fpus_80286, 16000000, 1, 5000, 0, 0, 0, 0, 3,3,3,3, 2}, - {"20", CPU_286, fpus_80286, 20000000, 1, 5000, 0, 0, 0, 0, 4,4,4,4, 3}, - {"25", CPU_286, fpus_80286, 25000000, 1, 5000, 0, 0, 0, 0, 4,4,4,4, 3}, - {"", 0} - } + .package = CPU_PKG_286, + .manufacturer = "Intel", + .name = "80286", + .internal_name = "286", + .cpus = (const CPU[]) { + {"6", CPU_286, fpus_80286, 6000000, 1, 5000, 0, 0, 0, 0, 2,2,2,2, 1}, + {"8", CPU_286, fpus_80286, 8000000, 1, 5000, 0, 0, 0, 0, 2,2,2,2, 1}, + {"10", CPU_286, fpus_80286, 10000000, 1, 5000, 0, 0, 0, 0, 2,2,2,2, 1}, + {"12", CPU_286, fpus_80286, 12500000, 1, 5000, 0, 0, 0, 0, 3,3,3,3, 2}, + {"16", CPU_286, fpus_80286, 16000000, 1, 5000, 0, 0, 0, 0, 3,3,3,3, 2}, + {"20", CPU_286, fpus_80286, 20000000, 1, 5000, 0, 0, 0, 0, 4,4,4,4, 3}, + {"25", CPU_286, fpus_80286, 25000000, 1, 5000, 0, 0, 0, 0, 4,4,4,4, 3}, + {"", 0} + } }, { - .package = CPU_PKG_386SX, - .manufacturer = "Intel", - .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} - } + .package = CPU_PKG_386SX, + .manufacturer = "Intel", + .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} + } }, { - .package = CPU_PKG_386SX, - .manufacturer = "AMD", - .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} - } + .package = CPU_PKG_386SX, + .manufacturer = "AMD", + .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} + } }, { - .package = CPU_PKG_386DX, - .manufacturer = "Intel", - .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} - } + .package = CPU_PKG_386DX, + .manufacturer = "Intel", + .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} + } }, { - .package = CPU_PKG_386DX, - .manufacturer = "Intel", - .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} - } + .package = CPU_PKG_386DX, + .manufacturer = "Intel", + .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} + } }, { - .package = CPU_PKG_386DX, - .manufacturer = "AMD", - .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} - } - }, - { - .package = CPU_PKG_M6117, - .manufacturer = "ALi", - .name = "M6117", - .internal_name = "m6117", - .cpus = (const CPU[]) { /* All timings and edx_reset values assumed. */ - {"33", CPU_386SX, fpus_none, 33333333, 1, 5000, 0x2308, 0, 0, 0, 6,6,3,3, 4}, - {"40", CPU_386SX, fpus_none, 40000000, 1, 5000, 0x2308, 0, 0, 0, 7,7,3,3, 5}, - {"", 0} - } - }, - { - .package = CPU_PKG_386SLC_IBM, - .manufacturer = "IBM", - .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} - } + .package = CPU_PKG_386DX, + .manufacturer = "AMD", + .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} + } }, { - .package = CPU_PKG_386SX, - .manufacturer = "Cyrix", - .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} - } + .package = CPU_PKG_M6117, + .manufacturer = "ALi", + .name = "M6117", + .internal_name = "m6117", + .cpus = (const CPU[]) { /* All timings and edx_reset values assumed. */ + {"33", CPU_386SX, fpus_none, 33333333, 1, 5000, 0x2308, 0, 0, 0, 6,6,3,3, 4}, + {"40", CPU_386SX, fpus_none, 40000000, 1, 5000, 0x2308, 0, 0, 0, 7,7,3,3, 5}, + {"", 0} + } }, { - .package = CPU_PKG_386SX, - .manufacturer = "Cyrix", - .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} - } + .package = CPU_PKG_386SLC_IBM, + .manufacturer = "IBM", + .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} + } }, { - .package = CPU_PKG_486SLC_IBM, - .manufacturer = "IBM", - .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} - } + .package = CPU_PKG_386SX, + .manufacturer = "Cyrix", + .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} + } }, { - .package = CPU_PKG_486SLC_IBM, - .manufacturer = "IBM", - .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} - } + .package = CPU_PKG_386SX, + .manufacturer = "Cyrix", + .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} + } }, { - .package = CPU_PKG_486SLC_IBM, - .manufacturer = "IBM", - .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} - } + .package = CPU_PKG_486SLC_IBM, + .manufacturer = "IBM", + .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} + } }, { - .package = CPU_PKG_486BL, - .manufacturer = "IBM", - .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} - } + .package = CPU_PKG_486SLC_IBM, + .manufacturer = "IBM", + .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} + } }, { - .package = CPU_PKG_486BL, - .manufacturer = "IBM", - .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} - } + .package = CPU_PKG_486SLC_IBM, + .manufacturer = "IBM", + .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} + } }, { - .package = CPU_PKG_386DX, - .manufacturer = "Cyrix", - .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} - } + .package = CPU_PKG_486BL, + .manufacturer = "IBM", + .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} + } }, { - .package = CPU_PKG_386DX, - .manufacturer = "Cyrix", - .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} - } + .package = CPU_PKG_486BL, + .manufacturer = "IBM", + .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} + } }, { - .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_386DX, + .manufacturer = "Cyrix", + .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} + } }, { - .package = CPU_PKG_SOCKET1, - .manufacturer = "Intel", - .name = "i486SX (SL-Enhanced)", - .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_386DX, + .manufacturer = "Cyrix", + .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} + } }, { - .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 = "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 = "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 = "i486SX (SL-Enhanced)", + .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 = "i486DX (SL-Enhanced)", - .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 = "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 = "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 = "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 = "i486DX2 (SL-Enhanced)", - .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, + .manufacturer = "Intel", + .name = "i486DX (SL-Enhanced)", + .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_SOCKET3_PC330, - .manufacturer = "Intel", - .name = "i486DX2", - .internal_name = "i486dx2_pc330", - .cpus = (const CPU[]) { - {"50", CPU_i486DX_SLENH, fpus_internal, 50000000, 2, 5000, 0x470, 0x470, 0, CPU_SUPPORTS_DYNAREC, 8, 8,6,6, 6}, - {"66", CPU_i486DX_SLENH, fpus_internal, 66666666, 2, 5000, 0x470, 0x470, 0, CPU_SUPPORTS_DYNAREC, 12,12,6,6, 8}, - {"", 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 | 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_SOCKET1, + .manufacturer = "Intel", + .name = "i486DX2 (SL-Enhanced)", + .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_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_SOCKET3_PC330, + .manufacturer = "Intel", + .name = "i486DX2", + .internal_name = "i486dx2_pc330", + .cpus = (const CPU[]) { + {"50", CPU_i486DX_SLENH, fpus_internal, 50000000, 2, 5000, 0x470, 0x470, 0, CPU_SUPPORTS_DYNAREC, 8, 8,6,6, 6}, + {"66", CPU_i486DX_SLENH, fpus_internal, 66666666, 2, 5000, 0x470, 0x470, 0, CPU_SUPPORTS_DYNAREC, 12,12,6,6, 8}, + {"", 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 | 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_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_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 = "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 = "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 = "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 = "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 = "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 = "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 = "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_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_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_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_SOCKET3, - .manufacturer = "AMD", - .name = "Am5x86", - .internal_name = "am5x86", - .cpus = (const CPU[]) { - {"P75", CPU_ENH_Am486DX, fpus_internal, 133333333, 4.0, 5000, 0x4e0, 0x4e0, 0, CPU_SUPPORTS_DYNAREC, 24,24,12,12, 16}, - {"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*/ - {"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 = "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_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_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_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_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_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 = "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 = "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 = "AMD", + .name = "Am5x86", + .internal_name = "am5x86", + .cpus = (const CPU[]) { + {"P75", CPU_ENH_Am486DX, fpus_internal, 133333333, 4.0, 5000, 0x4e0, 0x4e0, 0, CPU_SUPPORTS_DYNAREC, 24,24,12,12, 16}, + {"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*/ + {"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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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 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 = "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 = "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 = "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 = "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 = "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 = "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} - } + .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} + } }, #if defined(DEV_BRANCH) && defined(USE_AMD_K5) { - .package = CPU_PKG_SOCKET5_7, - .manufacturer = "AMD", - .name = "K5 (5k86)", - .internal_name = "k5_5k86", - .cpus = (const CPU[]) { - {"75 (P75)", CPU_K5, fpus_internal, 75000000, 1.5, 3520, 0x500, 0x500, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 7, 7,4,4, 9}, - {"90 (P90)", CPU_K5, fpus_internal, 90000000, 1.5, 3520, 0x500, 0x500, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9,4,4, 21/2}, - {"100 (P100)", CPU_K5, fpus_internal, 100000000, 1.5, 3520, 0x500, 0x500, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9,4,4, 12}, - {"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.5 (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 (5k86)", + .internal_name = "k5_5k86", + .cpus = (const CPU[]) { + {"75 (P75)", CPU_K5, fpus_internal, 75000000, 1.5, 3520, 0x500, 0x500, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 7, 7,4,4, 9}, + {"90 (P90)", CPU_K5, fpus_internal, 90000000, 1.5, 3520, 0x500, 0x500, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9,4,4, 21/2}, + {"100 (P100)", CPU_K5, fpus_internal, 100000000, 1.5, 3520, 0x500, 0x500, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9,4,4, 12}, + {"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.5 (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 (SSA/5)", - .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 (SSA/5)", + .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} + } }, #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}, + {"", 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}, + {"", 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_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}, - {"", 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_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_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} + } }, #if defined(DEV_BRANCH) && defined(USE_CYRIX_6X86) { - .package = CPU_PKG_SOCKET5_7, - .manufacturer = "Cyrix", - .name = "Cx6x86", - .internal_name = "cx6x86", - .cpus = (const CPU[]) { - {"P90", CPU_Cx6x86, fpus_internal, 80000000, 2.0, 3520, 0x520, 0x520, 0x1731, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 8, 8, 6, 6, 10}, - {"PR120+", CPU_Cx6x86, fpus_internal, 100000000, 2.0, 3520, 0x520, 0x520, 0x1731, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 10,10, 6, 6, 12}, - {"PR133+", CPU_Cx6x86, fpus_internal, 110000000, 2.0, 3520, 0x520, 0x520, 0x1731, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 10,10, 6, 6, 14}, - {"PR150+", CPU_Cx6x86, fpus_internal, 120000000, 2.0, 3520, 0x520, 0x520, 0x1731, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 14}, - {"PR166+", CPU_Cx6x86, fpus_internal, 133333333, 2.0, 3520, 0x520, 0x520, 0x1731, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 16}, - {"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 = "Cx6x86", + .internal_name = "cx6x86", + .cpus = (const CPU[]) { + {"P90", CPU_Cx6x86, fpus_internal, 80000000, 2.0, 3520, 0x520, 0x520, 0x1731, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 8, 8, 6, 6, 10}, + {"PR120+", CPU_Cx6x86, fpus_internal, 100000000, 2.0, 3520, 0x520, 0x520, 0x1731, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 10,10, 6, 6, 12}, + {"PR133+", CPU_Cx6x86, fpus_internal, 110000000, 2.0, 3520, 0x520, 0x520, 0x1731, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 10,10, 6, 6, 14}, + {"PR150+", CPU_Cx6x86, fpus_internal, 120000000, 2.0, 3520, 0x520, 0x520, 0x1731, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 14}, + {"PR166+", CPU_Cx6x86, fpus_internal, 133333333, 2.0, 3520, 0x520, 0x520, 0x1731, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 16}, + {"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[]) { - {"PR133+", CPU_Cx6x86L, fpus_internal, 110000000, 2.0, 2800, 0x540, 0x540, 0x2231, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 10,10, 6, 6, 14}, - {"PR150+", CPU_Cx6x86L, fpus_internal, 120000000, 2.0, 2800, 0x540, 0x540, 0x2231, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 14}, - {"PR166+", CPU_Cx6x86L, fpus_internal, 133333333, 2.0, 2800, 0x540, 0x540, 0x2231, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 16}, - {"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 = "Cx6x86L", + .internal_name = "cx6x86l", + .cpus = (const CPU[]) { + {"PR133+", CPU_Cx6x86L, fpus_internal, 110000000, 2.0, 2800, 0x540, 0x540, 0x2231, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 10,10, 6, 6, 14}, + {"PR150+", CPU_Cx6x86L, fpus_internal, 120000000, 2.0, 2800, 0x540, 0x540, 0x2231, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 14}, + {"PR166+", CPU_Cx6x86L, fpus_internal, 133333333, 2.0, 2800, 0x540, 0x540, 0x2231, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 16}, + {"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[]) { - {"PR166", CPU_Cx6x86MX, fpus_internal, 133333333, 2.0, 2900, 0x600, 0x600, 0x0451, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 16}, - {"PR200", CPU_Cx6x86MX, fpus_internal, 166666666, 2.5, 2900, 0x600, 0x600, 0x0452, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 20}, - {"PR233", CPU_Cx6x86MX, fpus_internal, 187500000, 2.5, 2900, 0x600, 0x600, 0x0452, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 45/2}, - {"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 = "Cx6x86MX", + .internal_name = "cx6x86mx", + .cpus = (const CPU[]) { + {"PR166", CPU_Cx6x86MX, fpus_internal, 133333333, 2.0, 2900, 0x600, 0x600, 0x0451, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 16}, + {"PR200", CPU_Cx6x86MX, fpus_internal, 166666666, 2.5, 2900, 0x600, 0x600, 0x0452, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 20}, + {"PR233", CPU_Cx6x86MX, fpus_internal, 187500000, 2.5, 2900, 0x600, 0x600, 0x0452, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 45/2}, + {"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[]) { - {"PR300", CPU_Cx6x86MX, fpus_internal, 233333333, 3.5, 2900, 0x601, 0x601, 0x0852, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 21,21,11,11, 28}, - {"PR333", CPU_Cx6x86MX, fpus_internal, 250000000, 3.0, 2900, 0x601, 0x601, 0x0853, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 23,23, 9, 9, 30}, - {"PR366", CPU_Cx6x86MX, fpus_internal, 250000000, 2.5, 2900, 0x601, 0x601, 0x0853, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 23,23, 7, 7, 30}, - {"PR400", CPU_Cx6x86MX, fpus_internal, 285000000, 3.0, 2900, 0x601, 0x601, 0x0853, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 27,27, 9, 9, 34}, - {"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 = "MII", + .internal_name = "mii", + .cpus = (const CPU[]) { + {"PR300", CPU_Cx6x86MX, fpus_internal, 233333333, 3.5, 2900, 0x601, 0x601, 0x0852, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 21,21,11,11, 28}, + {"PR333", CPU_Cx6x86MX, fpus_internal, 250000000, 3.0, 2900, 0x601, 0x601, 0x0853, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 23,23, 9, 9, 30}, + {"PR366", CPU_Cx6x86MX, fpus_internal, 250000000, 2.5, 2900, 0x601, 0x601, 0x0853, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 23,23, 7, 7, 30}, + {"PR400", CPU_Cx6x86MX, fpus_internal, 285000000, 3.0, 2900, 0x601, 0x601, 0x0853, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 27,27, 9, 9, 34}, + {"PR433", CPU_Cx6x86MX, fpus_internal, 300000000, 3.0, 2900, 0x601, 0x601, 0x0853, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 27,27, 9, 9, 36}, + {"", 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}, + {"", 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_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 (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 (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 = "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_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_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 = "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 = 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 = 0, } // clang-format on }; diff --git a/src/cpu/fpu.c b/src/cpu/fpu.c index f75d07231..0af010760 100644 --- a/src/cpu/fpu.c +++ b/src/cpu/fpu.c @@ -8,7 +8,7 @@ * * FPU type handler. * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2018 Sarah Walker. diff --git a/src/cpu/x86_ops.h b/src/cpu/x86_ops.h index a5e82d78e..ca4d83d69 100644 --- a/src/cpu/x86_ops.h +++ b/src/cpu/x86_ops.h @@ -11,7 +11,7 @@ * * * Authors: Fred N. van Kempen, - * Sarah Walker, + * Sarah Walker, * Miran Grca, * * Copyright 2018 Fred N. van Kempen. diff --git a/src/cpu/x86seg.c b/src/cpu/x86seg.c index c1e9e5b3d..5b0d8b73a 100644 --- a/src/cpu/x86seg.c +++ b/src/cpu/x86seg.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2018 Sarah Walker. diff --git a/src/cpu/x87_ops.h b/src/cpu/x87_ops.h index ce4a4becc..c00cdff16 100644 --- a/src/cpu/x87_ops.h +++ b/src/cpu/x87_ops.h @@ -11,7 +11,7 @@ * * * Authors: Fred N. van Kempen, - * Sarah Walker, + * Sarah Walker, * leilei, * Miran Grca, * diff --git a/src/cpu/x87_ops_loadstore.h b/src/cpu/x87_ops_loadstore.h index 8d3c3f700..9cec01490 100644 --- a/src/cpu/x87_ops_loadstore.h +++ b/src/cpu/x87_ops_loadstore.h @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2019 Sarah Walker. diff --git a/src/crcspeed/crc64speed.c b/src/crcspeed/crc64speed.c index b1a7bbb94..e4cccdc69 100644 --- a/src/crcspeed/crc64speed.c +++ b/src/crcspeed/crc64speed.c @@ -124,7 +124,7 @@ static inline uint_fast64_t crc_reflect(uint_fast64_t data, size_t data_len) { * \return The updated crc value. ******************************************************************************/ uint64_t crc64(uint_fast64_t crc, const void *in_data, const uint64_t len) { - const uint8_t *data = in_data; + const uint8_t *data = (uint8_t *) in_data; bool bit; for (uint64_t offset = 0; offset < len; offset++) { @@ -152,7 +152,7 @@ uint64_t crc64(uint_fast64_t crc, const void *in_data, const uint64_t len) { /* Only for testing; doesn't support DUAL */ uint64_t crc64_lookup(uint64_t crc, const void *in_data, const uint64_t len) { - const uint8_t *data = in_data; + const uint8_t *data = (uint8_t *) in_data; for (size_t i = 0; i < len; i++) { crc = crc64_table[0][(uint8_t)crc ^ data[i]] ^ (crc >> 8); } @@ -167,7 +167,7 @@ bool crc64speed_init(void) { #else should_init(crc64_table_little, LITTLE1); #endif - crcspeed64little_init(crc64, dual ? crc64_table_little : crc64_table); + crcspeed64little_init(crc64, dual ? (uint64_t (*)[256]) crc64_table_little : crc64_table); return true; } @@ -178,7 +178,7 @@ bool crc64speed_init_big(void) { #else should_init(crc64_table_big, BIG1); #endif - crcspeed64big_init(crc64, dual ? crc64_table_big : crc64_table); + crcspeed64big_init(crc64, dual ? (uint64_t (*)[256]) crc64_table_big : crc64_table); return true; } @@ -189,7 +189,7 @@ uint64_t crc64speed(uint64_t crc, const void *s, const uint64_t l) { #else check_init(crc64_table_little, LITTLE1); #endif - return crcspeed64little(dual ? crc64_table_little : crc64_table, crc, + return crcspeed64little(dual ? (uint64_t (*)[256]) crc64_table_little : crc64_table, crc, (void *)s, l); } @@ -200,7 +200,7 @@ uint64_t crc64speed_big(uint64_t crc, const void *s, const uint64_t l) { #else check_init(crc64_table_big, BIG1); #endif - return crcspeed64big(dual ? crc64_table_big : crc64_table, crc, (void *)s, + return crcspeed64big(dual ? (uint64_t (*)[256]) crc64_table_big : crc64_table, crc, (void *)s, l); } diff --git a/src/device.c b/src/device.c index a13825307..81e19e2dc 100644 --- a/src/device.c +++ b/src/device.c @@ -13,7 +13,7 @@ * * Authors: Fred N. van Kempen, * Miran Grca, - * Sarah Walker, + * Sarah Walker, * * Copyright 2017-2019 Fred N. van Kempen. * Copyright 2016-2019 Miran Grca. diff --git a/src/device/CMakeLists.txt b/src/device/CMakeLists.txt index 7fd0b20d0..ed8464647 100644 --- a/src/device/CMakeLists.txt +++ b/src/device/CMakeLists.txt @@ -10,7 +10,7 @@ # # Authors: David Hrdlička, # -# Copyright 2020,2021 David Hrdlička. +# Copyright 2020-2021 David Hrdlička. # add_library(dev OBJECT bugger.c cassette.c cartridge.c hasp.c hwm.c hwm_lm75.c hwm_lm78.c hwm_gl518sm.c diff --git a/src/device/keyboard.c b/src/device/keyboard.c index a5503cc3b..74bf3f67e 100644 --- a/src/device/keyboard.c +++ b/src/device/keyboard.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/device/keyboard_at.c b/src/device/keyboard_at.c index 542be0a24..5b777eaf3 100644 --- a/src/device/keyboard_at.c +++ b/src/device/keyboard_at.c @@ -10,10 +10,10 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, - * EngiNerd + * EngiNerd, * * Copyright 2008-2020 Sarah Walker. * Copyright 2016-2020 Miran Grca. @@ -1291,8 +1291,8 @@ write64_generic(void *priv, uint8_t val) } else { if (((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) && ((dev->flags & KBC_VEN_MASK) != KBC_VEN_INTEL_AMI)) #if 0 - add_to_kbc_queue_front(dev, (dev->input_port | fixed_bits) & - (((dev->flags & KBC_VEN_MASK) == KBC_VEN_ACER) ? 0xeb : 0xef), 0, 0x00); + add_to_kbc_queue_front(dev, (dev->input_port | fixed_bits) & + (((dev->flags & KBC_VEN_MASK) == KBC_VEN_ACER) ? 0xeb : 0xef), 0, 0x00); #else add_to_kbc_queue_front(dev, ((dev->input_port | fixed_bits) & 0xf0) | (((dev->flags & KBC_VEN_MASK) == KBC_VEN_ACER) ? 0x08 : 0x0c), 0, 0x00); #endif diff --git a/src/device/keyboard_xt.c b/src/device/keyboard_xt.c index f6d02a4d4..676f99f54 100644 --- a/src/device/keyboard_xt.c +++ b/src/device/keyboard_xt.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * EngiNerd, @@ -126,219 +126,219 @@ const scancode scancode_xt[512] = { { {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} }, /*054*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*058*/ + { {0}, {0} }, { {0}, {0} }, /*058*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*05c*/ + { {0}, {0} }, { {0}, {0} }, /*05c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*060*/ + { {0}, {0} }, { {0}, {0} }, /*060*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*064*/ + { {0}, {0} }, { {0}, {0} }, /*064*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*068*/ + { {0}, {0} }, { {0}, {0} }, /*068*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*06c*/ + { {0}, {0} }, { {0}, {0} }, /*06c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*070*/ + { {0}, {0} }, { {0}, {0} }, /*070*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*074*/ + { {0}, {0} }, { {0}, {0} }, /*074*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*078*/ + { {0}, {0} }, { {0}, {0} }, /*078*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*07c*/ + { {0}, {0} }, { {0}, {0} }, /*07c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*080*/ + { {0}, {0} }, { {0}, {0} }, /*080*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*084*/ + { {0}, {0} }, { {0}, {0} }, /*084*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*088*/ + { {0}, {0} }, { {0}, {0} }, /*088*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*08c*/ + { {0}, {0} }, { {0}, {0} }, /*08c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*090*/ + { {0}, {0} }, { {0}, {0} }, /*090*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*094*/ + { {0}, {0} }, { {0}, {0} }, /*094*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*098*/ + { {0}, {0} }, { {0}, {0} }, /*098*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*09c*/ + { {0}, {0} }, { {0}, {0} }, /*09c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0a0*/ + { {0}, {0} }, { {0}, {0} }, /*0a0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0a4*/ + { {0}, {0} }, { {0}, {0} }, /*0a4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0a8*/ + { {0}, {0} }, { {0}, {0} }, /*0a8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0ac*/ + { {0}, {0} }, { {0}, {0} }, /*0ac*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0b0*/ + { {0}, {0} }, { {0}, {0} }, /*0b0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0b4*/ + { {0}, {0} }, { {0}, {0} }, /*0b4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0b8*/ + { {0}, {0} }, { {0}, {0} }, /*0b8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0bc*/ + { {0}, {0} }, { {0}, {0} }, /*0bc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0c0*/ + { {0}, {0} }, { {0}, {0} }, /*0c0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0c4*/ + { {0}, {0} }, { {0}, {0} }, /*0c4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0c8*/ + { {0}, {0} }, { {0}, {0} }, /*0c8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0cc*/ + { {0}, {0} }, { {0}, {0} }, /*0cc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0d0*/ + { {0}, {0} }, { {0}, {0} }, /*0d0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0d4*/ + { {0}, {0} }, { {0}, {0} }, /*0d4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0d8*/ + { {0}, {0} }, { {0}, {0} }, /*0d8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0dc*/ + { {0}, {0} }, { {0}, {0} }, /*0dc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0e0*/ + { {0}, {0} }, { {0}, {0} }, /*0e0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0e4*/ + { {0}, {0} }, { {0}, {0} }, /*0e4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0e8*/ + { {0}, {0} }, { {0}, {0} }, /*0e8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0ec*/ + { {0}, {0} }, { {0}, {0} }, /*0ec*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0f0*/ + { {0}, {0} }, { {0}, {0} }, /*0f0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0f4*/ + { {0}, {0} }, { {0}, {0} }, /*0f4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0f8*/ + { {0}, {0} }, { {0}, {0} }, /*0f8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0fc*/ + { {0}, {0} }, { {0}, {0} }, /*0fc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*100*/ + { {0}, {0} }, { {0}, {0} }, /*100*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*104*/ + { {0}, {0} }, { {0}, {0} }, /*104*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*108*/ + { {0}, {0} }, { {0}, {0} }, /*108*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*10c*/ + { {0}, {0} }, { {0}, {0} }, /*10c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*110*/ + { {0}, {0} }, { {0}, {0} }, /*110*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*114*/ + { {0}, {0} }, { {0}, {0} }, /*114*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*118*/ + { {0}, {0} }, { {0}, {0} }, /*118*/ { {0x1c, 0}, {0x9c, 0} }, { {0x1d, 0}, {0x9d, 0} }, - { {0}, {0} }, { {0}, {0} }, /*11c*/ + { {0}, {0} }, { {0}, {0} }, /*11c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*120*/ + { {0}, {0} }, { {0}, {0} }, /*120*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*124*/ + { {0}, {0} }, { {0}, {0} }, /*124*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*128*/ + { {0}, {0} }, { {0}, {0} }, /*128*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*12c*/ + { {0}, {0} }, { {0}, {0} }, /*12c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*130*/ + { {0}, {0} }, { {0}, {0} }, /*130*/ { {0}, {0} }, { {0x35, 0}, {0xb5, 0} }, - { {0}, {0} }, { {0x37, 0}, {0xb7, 0} }, /*134*/ + { {0}, {0} }, { {0x37, 0}, {0xb7, 0} }, /*134*/ { {0x38, 0}, {0xb8, 0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*138*/ + { {0}, {0} }, { {0}, {0} }, /*138*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*13c*/ + { {0}, {0} }, { {0}, {0} }, /*13c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*140*/ + { {0}, {0} }, { {0}, {0} }, /*140*/ { {0}, {0} }, { {0}, {0} }, - { {0x46, 0}, {0xc6, 0} }, { {0x47, 0}, {0xc7, 0} }, /*144*/ + { {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} }, { {0x4b, 0}, {0xcb, 0} }, /*148*/ { {0}, {0} }, { {0x4d, 0}, {0xcd, 0} }, - { {0}, {0} }, { {0x4f, 0}, {0xcf, 0} }, /*14c*/ + { {0}, {0} }, { {0x4f, 0}, {0xcf, 0} }, /*14c*/ { {0x50, 0}, {0xd0, 0} }, { {0x51, 0}, {0xd1, 0} }, - { {0x52, 0}, {0xd2, 0} }, { {0x53, 0}, {0xd3, 0} }, /*150*/ + { {0x52, 0}, {0xd2, 0} }, { {0x53, 0}, {0xd3, 0} }, /*150*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*154*/ + { {0}, {0} }, { {0}, {0} }, /*154*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*158*/ + { {0}, {0} }, { {0}, {0} }, /*158*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*15c*/ + { {0}, {0} }, { {0}, {0} }, /*15c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*160*/ + { {0}, {0} }, { {0}, {0} }, /*160*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*164*/ + { {0}, {0} }, { {0}, {0} }, /*164*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*168*/ + { {0}, {0} }, { {0}, {0} }, /*168*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*16c*/ + { {0}, {0} }, { {0}, {0} }, /*16c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*170*/ + { {0}, {0} }, { {0}, {0} }, /*170*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*174*/ + { {0}, {0} }, { {0}, {0} }, /*174*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*148*/ + { {0}, {0} }, { {0}, {0} }, /*148*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*17c*/ + { {0}, {0} }, { {0}, {0} }, /*17c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*180*/ + { {0}, {0} }, { {0}, {0} }, /*180*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*184*/ + { {0}, {0} }, { {0}, {0} }, /*184*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*88*/ + { {0}, {0} }, { {0}, {0} }, /*88*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*18c*/ + { {0}, {0} }, { {0}, {0} }, /*18c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*190*/ + { {0}, {0} }, { {0}, {0} }, /*190*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*194*/ + { {0}, {0} }, { {0}, {0} }, /*194*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*198*/ + { {0}, {0} }, { {0}, {0} }, /*198*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*19c*/ + { {0}, {0} }, { {0}, {0} }, /*19c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1a0*/ + { {0}, {0} }, { {0}, {0} }, /*1a0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1a4*/ + { {0}, {0} }, { {0}, {0} }, /*1a4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1a8*/ + { {0}, {0} }, { {0}, {0} }, /*1a8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1ac*/ + { {0}, {0} }, { {0}, {0} }, /*1ac*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1b0*/ + { {0}, {0} }, { {0}, {0} }, /*1b0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1b4*/ + { {0}, {0} }, { {0}, {0} }, /*1b4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1b8*/ + { {0}, {0} }, { {0}, {0} }, /*1b8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1bc*/ + { {0}, {0} }, { {0}, {0} }, /*1bc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1c0*/ + { {0}, {0} }, { {0}, {0} }, /*1c0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1c4*/ + { {0}, {0} }, { {0}, {0} }, /*1c4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1c8*/ + { {0}, {0} }, { {0}, {0} }, /*1c8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1cc*/ + { {0}, {0} }, { {0}, {0} }, /*1cc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1d0*/ + { {0}, {0} }, { {0}, {0} }, /*1d0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1d4*/ + { {0}, {0} }, { {0}, {0} }, /*1d4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1d8*/ + { {0}, {0} }, { {0}, {0} }, /*1d8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1dc*/ + { {0}, {0} }, { {0}, {0} }, /*1dc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1e0*/ + { {0}, {0} }, { {0}, {0} }, /*1e0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1e4*/ + { {0}, {0} }, { {0}, {0} }, /*1e4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1e8*/ + { {0}, {0} }, { {0}, {0} }, /*1e8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1ec*/ + { {0}, {0} }, { {0}, {0} }, /*1ec*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1f0*/ + { {0}, {0} }, { {0}, {0} }, /*1f0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1f4*/ + { {0}, {0} }, { {0}, {0} }, /*1f4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1f8*/ + { {0}, {0} }, { {0}, {0} }, /*1f8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} } /*1fc*/ + { {0}, {0} }, { {0}, {0} } /*1fc*/ // clang-format on }; diff --git a/src/device/mouse_bus.c b/src/device/mouse_bus.c index 802ae6d45..73104cc4a 100644 --- a/src/device/mouse_bus.c +++ b/src/device/mouse_bus.c @@ -317,14 +317,14 @@ lt_write(uint16_t port, uint8_t val, void *priv) * This indicates the mode of operation of D7: * 1 = Mode set, 0 = Bit set/reset * D6,D5 = Mode selection (port A) - * 00 = Mode 0 = Basic I/O - * 01 = Mode 1 = Strobed I/O - * 10 = Mode 2 = Bi-dir bus + * 00 = Mode 0 = Basic I/O + * 01 = Mode 1 = Strobed I/O + * 10 = Mode 2 = Bi-dir bus * D4 = Port A direction (1 = input) * D3 = Port C (upper 4 bits) direction. (1 = input) * D2 = Mode selection (port B & C) - * 0 = Mode 0 = Basic I/O - * 1 = Mode 1 = Strobed I/O + * 0 = Mode 0 = Basic I/O + * 1 = Mode 1 = Strobed I/O * D1 = Port B direction (1 = input) * D0 = Port C (lower 4 bits) direction. (1 = input) * @@ -333,8 +333,8 @@ lt_write(uint16_t port, uint8_t val, void *priv) * being an output port and lower 4 bits an input port, and * enable the sucker. Courtesy Intel 8255 databook. Lars * - * 1001 1011 9B 1111 Default state - * 1001 0001 91 1001 Driver-initialized state + * 1001 1011 9B 1111 Default state + * 1001 0001 91 1001 Driver-initialized state * The only difference is - port C upper and port B go from * input to output. */ diff --git a/src/device/mouse_ps2.c b/src/device/mouse_ps2.c index e7670b2fc..42e2211b9 100644 --- a/src/device/mouse_ps2.c +++ b/src/device/mouse_ps2.c @@ -270,7 +270,7 @@ ps2_poll(int x, int y, int z, int b, void *priv) #if 0 if (!(dev->flags & FLAG_ENABLED)) - return(0xff); + return(0xff); #endif if (!mouse_scan) diff --git a/src/device/phoenix_486_jumper.c b/src/device/phoenix_486_jumper.c index bb1957690..357240ba7 100644 --- a/src/device/phoenix_486_jumper.c +++ b/src/device/phoenix_486_jumper.c @@ -8,6 +8,8 @@ * * Implementation of the Phoenix 486 Jumper Readout * + * + * * Authors: Tiseno100 * * Copyright 2020 Tiseno100 diff --git a/src/device/serial.c b/src/device/serial.c index 2434ca17c..dad2ed7f5 100644 --- a/src/device/serial.c +++ b/src/device/serial.c @@ -12,7 +12,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/disk/CMakeLists.txt b/src/disk/CMakeLists.txt index 6d3abfc83..7771a0b72 100644 --- a/src/disk/CMakeLists.txt +++ b/src/disk/CMakeLists.txt @@ -10,7 +10,7 @@ # # Authors: David Hrdlička, # -# Copyright 2020,2021 David Hrdlička. +# Copyright 2020-2021 David Hrdlička. # add_library(hdd OBJECT hdd.c hdd_image.c hdd_table.c hdc.c hdc_st506_xt.c diff --git a/src/disk/hdc.c b/src/disk/hdc.c index 0e58b6473..bae818b9a 100644 --- a/src/disk/hdc.c +++ b/src/disk/hdc.c @@ -14,7 +14,7 @@ * Fred N. van Kempen, * * Copyright 2016-2018 Miran Grca. - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. */ #include #include diff --git a/src/disk/hdc_esdi_at.c b/src/disk/hdc_esdi_at.c index 9df7725f1..66c7a0231 100644 --- a/src/disk/hdc_esdi_at.c +++ b/src/disk/hdc_esdi_at.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/disk/hdc_esdi_mca.c b/src/disk/hdc_esdi_mca.c index 80290c745..f9af1e864 100644 --- a/src/disk/hdc_esdi_mca.c +++ b/src/disk/hdc_esdi_mca.c @@ -54,11 +54,11 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Fred N. van Kempen, * * Copyright 2008-2018 Sarah Walker. - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. */ #include diff --git a/src/disk/hdc_ide.c b/src/disk/hdc_ide.c index 2f544cfb9..c2595e3e4 100644 --- a/src/disk/hdc_ide.c +++ b/src/disk/hdc_ide.c @@ -11,7 +11,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2020 Sarah Walker. @@ -537,7 +537,7 @@ ide_hd_identify(ide_t *ide) /* Bit 0 = The fields reported in words 54-58 are valid; Bit 1 = The fields reported in words 64-70 are valid; - Bit 2 = The fields reported in word 88 are valid. */ + Bit 2 = The fields reported in word 88 are valid. */ ide->buffer[53] = 1; if (ide->cfg_spt != 0) { @@ -1946,12 +1946,12 @@ ide_readb(uint16_t addr, void *priv) Direction: To device if set; From device if clear. - IO DRQ CoD - 0 1 1 Ready to accept command packet - 1 1 1 Message - ready to send message to host - 1 1 0 Data to host - 0 1 0 Data from host - 1 0 1 Status. */ + IO DRQ CoD + 0 1 1 Ready to accept command packet + 1 1 1 Message - ready to send message to host + 1 1 0 Data to host + 0 1 0 Data from host + 1 0 1 Status. */ case 0x2: /* Sector count */ if (ide->type == IDE_ATAPI) temp = ide->sc->phase; diff --git a/src/disk/hdc_ide_sff8038i.c b/src/disk/hdc_ide_sff8038i.c index 3809359b2..b5c75a756 100644 --- a/src/disk/hdc_ide_sff8038i.c +++ b/src/disk/hdc_ide_sff8038i.c @@ -12,7 +12,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2020 Sarah Walker. diff --git a/src/disk/hdc_st506_at.c b/src/disk/hdc_st506_at.c index d4edc4847..2eee8d294 100644 --- a/src/disk/hdc_st506_at.c +++ b/src/disk/hdc_st506_at.c @@ -14,7 +14,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Fred N. van Kempen, * * Copyright 2008-2019 Sarah Walker. diff --git a/src/disk/hdc_st506_xt.c b/src/disk/hdc_st506_xt.c index 88bf8c2c9..08f1329be 100644 --- a/src/disk/hdc_st506_xt.c +++ b/src/disk/hdc_st506_xt.c @@ -44,7 +44,7 @@ * * * Authors: Fred N. van Kempen, - * Sarah Walker, + * Sarah Walker, * * Copyright 2017-2019 Fred N. van Kempen. * Copyright 2008-2019 Sarah Walker. @@ -180,28 +180,28 @@ #define ERR_CRC_FAIL 0x32 /* CRC circuit failed test */ /* Controller commands. */ -#define CMD_TEST_DRIVE_READY 0x00 -#define CMD_RECALIBRATE 0x01 -/* reserved 0x02 */ -#define CMD_STATUS 0x03 -#define CMD_FORMAT_DRIVE 0x04 -#define CMD_VERIFY 0x05 -#define CMD_FORMAT_TRACK 0x06 -#define CMD_FORMAT_BAD_TRACK 0x07 -#define CMD_READ 0x08 -#define CMD_REASSIGN 0x09 -#define CMD_WRITE 0x0a -#define CMD_SEEK 0x0b -#define CMD_SPECIFY 0x0c -#define CMD_READ_ECC_BURST_LEN 0x0d -#define CMD_READ_BUFFER 0x0e -#define CMD_WRITE_BUFFER 0x0f -#define CMD_ALT_TRACK 0x11 -#define CMD_INQUIRY_ST11 0x12 /* ST-11 BIOS */ -#define CMD_V86P_POWEROFF 0x1a /* Victor V86P */ -#define CMD_RAM_DIAGNOSTIC 0xe0 -/* reserved 0xe1 */ -/* reserved 0xe2 */ +#define CMD_TEST_DRIVE_READY 0x00 +#define CMD_RECALIBRATE 0x01 +/* reserved 0x02 */ +#define CMD_STATUS 0x03 +#define CMD_FORMAT_DRIVE 0x04 +#define CMD_VERIFY 0x05 +#define CMD_FORMAT_TRACK 0x06 +#define CMD_FORMAT_BAD_TRACK 0x07 +#define CMD_READ 0x08 +#define CMD_REASSIGN 0x09 +#define CMD_WRITE 0x0a +#define CMD_SEEK 0x0b +#define CMD_SPECIFY 0x0c +#define CMD_READ_ECC_BURST_LEN 0x0d +#define CMD_READ_BUFFER 0x0e +#define CMD_WRITE_BUFFER 0x0f +#define CMD_ALT_TRACK 0x11 +#define CMD_INQUIRY_ST11 0x12 /* ST-11 BIOS */ +#define CMD_V86P_POWEROFF 0x1a /* Victor V86P */ +#define CMD_RAM_DIAGNOSTIC 0xe0 +/* reserved 0xe1 */ +/* reserved 0xe2 */ #define CMD_DRIVE_DIAGNOSTIC 0xe3 #define CMD_CTRLR_DIAGNOSTIC 0xe4 #define CMD_READ_LONG 0xe5 @@ -295,19 +295,19 @@ typedef struct { hd_type_t hd_types[4] = { // clang-format off - { 306, 4, MFM_SECTORS}, /* type 0 */ - { 612, 4, MFM_SECTORS}, /* type 16 */ - { 615, 4, MFM_SECTORS}, /* type 2 */ - { 306, 8, MFM_SECTORS} /* type 13 */ + { 306, 4, MFM_SECTORS}, /* type 0 */ + { 612, 4, MFM_SECTORS}, /* type 16 */ + { 615, 4, MFM_SECTORS}, /* type 2 */ + { 306, 8, MFM_SECTORS} /* type 13 */ // clang-format on }; hd_type_t hd_types_olivetti[16] = { // clang-format off { 697, 5, MFM_SECTORS}, - { 612, 4, MFM_SECTORS}, /* type 16 */ - { 612, 4, MFM_SECTORS}, /* type 16 */ - { 306, 4, MFM_SECTORS}, /* type 0 */ + { 612, 4, MFM_SECTORS}, /* type 16 */ + { 612, 4, MFM_SECTORS}, /* type 16 */ + { 306, 4, MFM_SECTORS}, /* type 0 */ { 612, 8, MFM_SECTORS}, { 820, 6, MFM_SECTORS}, { 820, 6, MFM_SECTORS}, @@ -317,8 +317,8 @@ hd_type_t hd_types_olivetti[16] = { {1024, 8, MFM_SECTORS}, {1024, 9, MFM_SECTORS}, { 872, 5, MFM_SECTORS}, - { 612, 4, MFM_SECTORS}, /* type 16 */ - { 612, 4, MFM_SECTORS}, /* type 16 */ + { 612, 4, MFM_SECTORS}, /* type 16 */ + { 612, 4, MFM_SECTORS}, /* type 16 */ { 306, 4, MFM_SECTORS} /* "not present" with the second hard disk */ // clang-format on }; @@ -375,10 +375,10 @@ get_sector(hdc_t *dev, drive_t *drive, off64_t *addr) #if 0 if (drive->cylinder != dev->cylinder) { # ifdef ENABLE_ST506_XT_LOG - st506_xt_log("ST506: get_sector: wrong cylinder\n"); + st506_xt_log("ST506: get_sector: wrong cylinder\n"); # endif - dev->error = ERR_ILLEGAL_ADDR; - return(0); + dev->error = ERR_ILLEGAL_ADDR; + return(0); } #endif @@ -653,7 +653,7 @@ st506_callback(void *priv) } case CMD_READ: #if 0 - case CMD_READ_LONG: + case CMD_READ_LONG: #endif switch (dev->state) { case STATE_START_COMMAND: @@ -749,7 +749,7 @@ st506_callback(void *priv) } case CMD_WRITE: #if 0 - case CMD_WRITE_LONG: + case CMD_WRITE_LONG: #endif switch (dev->state) { case STATE_START_COMMAND: diff --git a/src/disk/hdc_xta.c b/src/disk/hdc_xta.c index 589ec2789..ca7f01b9d 100644 --- a/src/disk/hdc_xta.c +++ b/src/disk/hdc_xta.c @@ -50,7 +50,7 @@ * * Based on my earlier HD20 driver for the EuroPC. * - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. * * Redistribution and use in source and binary forms, with * or without modification, are permitted provided that the diff --git a/src/disk/hdc_xtide.c b/src/disk/hdc_xtide.c index 45b8dde54..72ad580ae 100644 --- a/src/disk/hdc_xtide.c +++ b/src/disk/hdc_xtide.c @@ -23,7 +23,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/disk/hdd_image.c b/src/disk/hdd_image.c index 1b59ac570..ba7cf18ba 100644 --- a/src/disk/hdd_image.c +++ b/src/disk/hdd_image.c @@ -14,7 +14,7 @@ * Fred N. van Kempen, * * Copyright 2016-2018 Miran Grca. - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. */ #define _GNU_SOURCE #include diff --git a/src/disk/hdd_table.c b/src/disk/hdd_table.c index d75dc7e8d..12a0040ef 100644 --- a/src/disk/hdd_table.c +++ b/src/disk/hdd_table.c @@ -15,7 +15,7 @@ * Fred N. van Kempen, * * Copyright 2016-2018 Miran Grca. - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. */ #include #include diff --git a/src/disk/zip.c b/src/disk/zip.c index 959a5fbbe..a0107d1ef 100644 --- a/src/disk/zip.c +++ b/src/disk/zip.c @@ -199,7 +199,8 @@ static const mode_sense_pages_t zip_250_mode_sense_pages_default = { 0, 0 }, { 0, 0 }, { 0, 0 }, - { 0, 0 }, { 0, 0 }, + { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, @@ -2072,7 +2073,7 @@ zip_phase_data_out(scsi_common_t *sc) dev->buffer[2] = (i >> 8) & 0xff; dev->buffer[3] = i & 0xff; } else if (dev->current_cdb[1] & 4) { - /* CHS are 96,1,2048 (ZIP 100) and 239,1,2048 (ZIP 250) */ + /* CHS are 96, 1, 2048 (ZIP 100) and 239, 1, 2048 (ZIP 250) */ s = (i % 2048); h = ((i - s) / 2048) % 1; c = ((i - s) / 2048) / 1; diff --git a/src/dma.c b/src/dma.c index d8c4ea674..ecdc393ff 100644 --- a/src/dma.c +++ b/src/dma.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/floppy/CMakeLists.txt b/src/floppy/CMakeLists.txt index 70bae154e..89fbbf76f 100644 --- a/src/floppy/CMakeLists.txt +++ b/src/floppy/CMakeLists.txt @@ -10,7 +10,7 @@ # # Authors: David Hrdlička, # -# Copyright 2020,2021 David Hrdlička. +# Copyright 2020-2021 David Hrdlička. # add_library(fdd OBJECT fdd.c fdc.c fdc_magitronic.c fdc_monster.c fdc_pii15xb.c diff --git a/src/floppy/fdc.c b/src/floppy/fdc.c index 2abc4a8f5..9981a72a2 100644 --- a/src/floppy/fdc.c +++ b/src/floppy/fdc.c @@ -11,7 +11,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2020 Sarah Walker. @@ -637,7 +637,7 @@ fdc_io_command_phase1(fdc_t *fdc, int out) pclog_toggle_suppr(); pclog("%02X ", fdc->processed_cmd); for (i = 0; i < fdc->pnum; i++) - pclog("%02X ", fdc->params[i]); + pclog("%02X ", fdc->params[i]); pclog("\n"); pclog_toggle_suppr(); #endif @@ -1329,9 +1329,9 @@ fdc_read(uint16_t addr, void *priv) * fdc_t on one of the motherboard's support chips. * * Confirmed: 00=1.44M 3.5 - * 10=2.88M 3.5 - * 20=1.2M 5.25 - * 30=1.2M 5.25 + * 10=2.88M 3.5 + * 20=1.2M 5.25 + * 30=1.2M 5.25 * * as reported by Configur.exe. */ diff --git a/src/floppy/fdd.c b/src/floppy/fdd.c index a6ccb6da5..ee43256a4 100644 --- a/src/floppy/fdd.c +++ b/src/floppy/fdd.c @@ -10,13 +10,13 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * * Copyright 2008-2019 Sarah Walker. * Copyright 2016-2019 Miran Grca. - * Copyright 2018,2019 Fred N. van Kempen. + * Copyright 2018-2019 Fred N. van Kempen. */ #include #include @@ -40,17 +40,17 @@ #include <86box/fdc.h> /* Flags: - Bit 0: 300 rpm supported; - Bit 1: 360 rpm supported; - Bit 2: size (0 = 3.5", 1 = 5.25"); - Bit 3: sides (0 = 1, 1 = 2); - Bit 4: double density supported; - Bit 5: high density supported; - Bit 6: extended density supported; - Bit 7: double step for 40-track media; - Bit 8: invert DENSEL polarity; - Bit 9: ignore DENSEL; - Bit 10: drive is a PS/2 drive; + Bit 0: 300 rpm supported; + Bit 1: 360 rpm supported; + Bit 2: size (0 = 3.5", 1 = 5.25"); + Bit 3: sides (0 = 1, 1 = 2); + Bit 4: double density supported; + Bit 5: high density supported; + Bit 6: extended density supported; + Bit 7: double step for 40-track media; + Bit 8: invert DENSEL polarity; + Bit 9: ignore DENSEL; + Bit 10: drive is a PS/2 drive; */ #define FLAG_RPM_300 1 #define FLAG_RPM_360 2 @@ -146,49 +146,49 @@ static const struct } drive_types[] = { { /*None*/ - 0, 0, "None", "none" + 0, 0, "None", "none" }, { /*5.25" 1DD*/ - 43, FLAG_RPM_300 | FLAG_525 | FLAG_HOLE0, "5.25\" 180k", "525_1dd" + 43, FLAG_RPM_300 | FLAG_525 | FLAG_HOLE0, "5.25\" 180k", "525_1dd" }, { /*5.25" DD*/ - 43, FLAG_RPM_300 | FLAG_525 | FLAG_DS | FLAG_HOLE0, "5.25\" 360k", "525_2dd" + 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" + 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" + 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, "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" + 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" + 86, FLAG_RPM_300 | FLAG_HOLE0 | FLAG_DOUBLE_STEP, "3.5\" 360k", "35_1dd" }, { /*3.5" DD*/ - 86, FLAG_RPM_300 | FLAG_DS | FLAG_HOLE0 | FLAG_DOUBLE_STEP, "3.5\" 720k", "35_2dd" + 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" + 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*/ - 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, "3.5\" 1.44M", "35_2hd" }, { /*3.5" HD PC-98*/ - 86, FLAG_RPM_300 | FLAG_RPM_360 | FLAG_DS | FLAG_HOLE0 | FLAG_HOLE1 | FLAG_DOUBLE_STEP | FLAG_INVERT_DENSEL, "3.5\" 1.25M PC-98", "35_2hd_nec" + 86, FLAG_RPM_300 | FLAG_RPM_360 | FLAG_DS | FLAG_HOLE0 | FLAG_HOLE1 | FLAG_DOUBLE_STEP | FLAG_INVERT_DENSEL, "3.5\" 1.25M PC-98", "35_2hd_nec" }, { /*3.5" HD 3-Mode*/ - 86, FLAG_RPM_300 | FLAG_RPM_360 | FLAG_DS | FLAG_HOLE0 | FLAG_HOLE1 | FLAG_DOUBLE_STEP, "3.5\" 1.44M 300/360 RPM", "35_2hd_3mode" + 86, FLAG_RPM_300 | FLAG_RPM_360 | FLAG_DS | FLAG_HOLE0 | FLAG_HOLE1 | FLAG_DOUBLE_STEP, "3.5\" 1.44M 300/360 RPM", "35_2hd_3mode" }, { /*3.5" ED*/ - 86, FLAG_RPM_300 | FLAG_DS | FLAG_HOLE0 | FLAG_HOLE1 | FLAG_HOLE2 | FLAG_DOUBLE_STEP, "3.5\" 2.88M", "35_2ed" + 86, FLAG_RPM_300 | FLAG_DS | FLAG_HOLE0 | FLAG_HOLE1 | FLAG_HOLE2 | FLAG_DOUBLE_STEP, "3.5\" 2.88M", "35_2ed" }, { /*End of list*/ - -1, -1, "", "" + -1, -1, "", "" } }; diff --git a/src/floppy/fdd_86f.c b/src/floppy/fdd_86f.c index 7509dd3a5..0267cfe81 100644 --- a/src/floppy/fdd_86f.c +++ b/src/floppy/fdd_86f.c @@ -155,23 +155,23 @@ typedef struct { } sector_t; /* Disk flags: - * Bit 0 Has surface data (1 = yes, 0 = no) - * Bits 2, 1 Hole (3 = ED + 2000 kbps, 2 = ED, 1 = HD, 0 = DD) - * Bit 3 Sides (1 = 2 sides, 0 = 1 side) - * Bit 4 Write protect (1 = yes, 0 = no) - * Bits 6, 5 RPM slowdown (3 = 2%, 2 = 1.5%, 1 = 1%, 0 = 0%) - * Bit 7 Bitcell mode (1 = Extra bitcells count specified after - * disk flags, 0 = No extra bitcells) - * The maximum number of extra bitcells is 1024 (which - * after decoding translates to 64 bytes) - * Bit 8 Disk type (1 = Zoned, 0 = Fixed RPM) - * Bits 10, 9 Zone type (3 = Commodore 64 zoned, 2 = Apple zoned, - * 1 = Pre-Apple zoned #2, 0 = Pre-Apple zoned #1) - * Bit 11 Data and surface bits are stored in reverse byte endianness - * Bit 12 If bits 6, 5 are not 0, they specify % of speedup instead - * of slowdown; - * If bits 6, 5 are 0, and bit 7 is 1, the extra bitcell count - * specifies the entire bitcell count + * Bit 0 Has surface data (1 = yes, 0 = no) + * Bits 2, 1 Hole (3 = ED + 2000 kbps, 2 = ED, 1 = HD, 0 = DD) + * Bit 3 Sides (1 = 2 sides, 0 = 1 side) + * Bit 4 Write protect (1 = yes, 0 = no) + * Bits 6, 5 RPM slowdown (3 = 2%, 2 = 1.5%, 1 = 1%, 0 = 0%) + * Bit 7 Bitcell mode (1 = Extra bitcells count specified after + * disk flags, 0 = No extra bitcells) + * The maximum number of extra bitcells is 1024 (which + * after decoding translates to 64 bytes) + * Bit 8 Disk type (1 = Zoned, 0 = Fixed RPM) + * Bits 10, 9 Zone type (3 = Commodore 64 zoned, 2 = Apple zoned, + * 1 = Pre-Apple zoned #2, 0 = Pre-Apple zoned #1) + * Bit 11 Data and surface bits are stored in reverse byte endianness + * Bit 12 If bits 6, 5 are not 0, they specify % of speedup instead + * of slowdown; + * If bits 6, 5 are 0, and bit 7 is 1, the extra bitcell count + * specifies the entire bitcell count */ typedef struct { FILE *f; @@ -2732,14 +2732,14 @@ d86f_prepare_sector(int drive, int side, int prev_pos, uint8_t *id_buf, uint8_t * ((track << 1) + 1); * * - Any bits that differ are treated as thus: - * - Both are regular but contents differ -> Output is fuzzy; - * - One is regular and one is fuzzy -> Output is fuzzy; - * - Both are fuzzy -> Output is fuzzy; - * - Both are physical holes -> Output is a physical hole; - * - One is regular and one is a physical hole -> Output is fuzzy, - * the hole half is handled appropriately on writeback; - * - One is fuzzy and one is a physical hole -> Output is fuzzy, - * the hole half is handled appropriately on writeback; + * - Both are regular but contents differ -> Output is fuzzy; + * - One is regular and one is fuzzy -> Output is fuzzy; + * - Both are fuzzy -> Output is fuzzy; + * - Both are physical holes -> Output is a physical hole; + * - One is regular and one is a physical hole -> Output is fuzzy, + * the hole half is handled appropriately on writeback; + * - One is fuzzy and one is a physical hole -> Output is fuzzy, + * the hole half is handled appropriately on writeback; * - On write back, apart from the above notes, the final two tracks * are written; * - Destination ALWAYS has surface data even if the image does not. diff --git a/src/floppy/fdd_common.c b/src/floppy/fdd_common.c index 28dea0735..9c1f98c39 100644 --- a/src/floppy/fdd_common.c +++ b/src/floppy/fdd_common.c @@ -48,14 +48,14 @@ const double fdd_bit_rates_300[6] = { * single-RPM drive by setting the rate to 300 kbps. */ const uint8_t fdd_max_sectors[8][6] = { - { 26, 31, 38, 53, 64, 118 }, /* 128 */ - { 15, 19, 23, 32, 38, 73 }, /* 256 */ - { 7, 10, 12, 17, 22, 41 }, /* 512 */ - { 3, 5, 6, 9, 11, 22 }, /* 1024 */ - { 2, 2, 3, 4, 5, 11 }, /* 2048 */ - { 1, 1, 1, 2, 2, 5 }, /* 4096 */ - { 0, 0, 0, 1, 1, 3 }, /* 8192 */ - { 0, 0, 0, 0, 0, 1 } /* 16384 */ + { 26, 31, 38, 53, 64, 118 }, /* 128 */ + { 15, 19, 23, 32, 38, 73 }, /* 256 */ + { 7, 10, 12, 17, 22, 41 }, /* 512 */ + { 3, 5, 6, 9, 11, 22 }, /* 1024 */ + { 2, 2, 3, 4, 5, 11 }, /* 2048 */ + { 1, 1, 1, 2, 2, 5 }, /* 4096 */ + { 0, 0, 0, 1, 1, 3 }, /* 8192 */ + { 0, 0, 0, 0, 0, 1 } /* 16384 */ }; const uint8_t fdd_dmf_r[21] = { @@ -63,285 +63,290 @@ const uint8_t fdd_dmf_r[21] = { }; static const uint8_t fdd_gap3_sizes[5][8][48] = { - { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [0][0] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [0][0] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [0][1] */ - 0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [0][1] */ + 0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [0][2] */ - 0x00,0x00,0x6C,0x48,0x2A,0x08,0x02,0x01, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [0][2] */ + 0x00,0x00,0x6C,0x48,0x2A,0x08,0x02,0x01, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x83,0x26,0x00,0x00,0x00,0x00, /* [0][3] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x83,0x26,0x00,0x00,0x00,0x00, /* [0][3] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [0][4] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [0][4] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [0][5] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [0][5] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [0][6] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [0][6] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [0][7] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 } + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [0][7] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 } }, - { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [1][0] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [1][0] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [1][1] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [1][1] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x54,0x1C,0x0E,0x00,0x00, /* [1][2] */ - 0x00,0x00,0x6C,0x48,0x2A,0x08,0x02,0x01, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x54,0x1C,0x0E,0x00,0x00, /* [1][2] */ + 0x00,0x00,0x6C,0x48,0x2A,0x08,0x02,0x01, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x06, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [1][3] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x06, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [1][3] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [1][4] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [1][4] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [1][5] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [1][5] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [1][6] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [1][6] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [1][7] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 } + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [1][7] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 } }, - { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [2][0] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [2][0] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x32,0x0C,0x00,0x00,0x00,0x36, /* [2][1] */ - 0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x32,0x0C,0x00,0x00,0x00,0x36, /* [2][1] */ + 0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x58,0x50,0x2E,0x00,0x00,0x00,0x00,0x00, /* [2][2] */ - 0x00,0x00,0x00,0x00,0x00,0x1C,0x1C,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x58,0x50,0x2E,0x00,0x00,0x00,0x00,0x00, /* [2][2] */ + 0x00,0x00,0x00,0x00,0x00,0x1C,0x1C,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0xF0,0x74,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [2][3] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0xF0,0x74,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [2][3] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [2][4] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [2][4] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [2][5] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [2][5] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [2][6] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [2][6] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [2][7] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 } + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [2][7] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 } }, - { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [3][0] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [3][0] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [3][1] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [3][1] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [3][2] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x53,0x4E,0x3D,0x2C, - 0x1C,0x0D,0x02,0x00,0x00,0x00,0x01,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [3][2] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x53,0x4E,0x3D,0x2C, + 0x1C,0x0D,0x02,0x00,0x00,0x00,0x01,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [3][3] */ - 0x00,0x00,0xF7,0xAF,0x6F,0x55,0x1F,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [3][3] */ + 0x00,0x00,0xF7,0xAF,0x6F,0x55,0x1F,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [3][4] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [3][4] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [3][5] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [3][5] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [3][6] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [3][6] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [3][7] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 } + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [3][7] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 } }, - { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [4][0] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [4][0] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [4][1] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [4][1] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x54, /* [4][2] */ - 0x38,0x23,0x00,0x01,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x54, /* [4][2] */ + 0x38,0x23,0x00,0x01,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x74,0x24,0x00,0x00,0x00,0x00,0x00,0x00, /* [4][3] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x74,0x24,0x00,0x00,0x00,0x00,0x00,0x00, /* [4][3] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [4][4] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [4][4] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [4][5] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [4][5] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [4][6] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [4][6] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [4][7] */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 } + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* [4][7] */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 } } }; diff --git a/src/floppy/fdd_fdi.c b/src/floppy/fdd_fdi.c index 5d09d8df2..64279c173 100644 --- a/src/floppy/fdd_fdi.c +++ b/src/floppy/fdd_fdi.c @@ -11,7 +11,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * @@ -298,7 +298,7 @@ fdi_seek(int drive, int track) #if 0 if (track > dev->lasttrack) - track = dev->lasttrack - 1; + track = dev->lasttrack - 1; #endif dev->track = track; diff --git a/src/floppy/fdd_img.c b/src/floppy/fdd_img.c index e0847c010..a9fc73a24 100644 --- a/src/floppy/fdd_img.c +++ b/src/floppy/fdd_img.c @@ -15,7 +15,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * @@ -66,21 +66,21 @@ typedef struct { } img_t; -static img_t *img[FDD_NUM]; -static fdc_t *img_fdc; +static img_t *img[FDD_NUM]; +static fdc_t *img_fdc; -static double bit_rate_300; -static char *ext; -static uint8_t first_byte, - second_byte, - third_byte, - fourth_byte; -static uint8_t fdf_suppress_final_byte = 0; /* This is hard-coded to 0 - - * if you really need to read - * those NT 3.1 Beta floppy - * images, change this to 1 - * and recompile. - */ +static double bit_rate_300; +static char *ext; +static uint8_t first_byte, + second_byte, + third_byte, + fourth_byte; +static uint8_t fdf_suppress_final_byte = 0; /* This is hard-coded to 0 - + * if you really need to read + * those NT 3.1 Beta floppy + * images, change this to 1 + * and recompile. + */ const uint8_t dmf_r[21] = { 12, 2, 13, 3, 14, 4, 15, 5, 16, 6, 17, 7, 18, 8, 19, 9, 20, 10, 21, 11, 1 }; @@ -90,197 +90,230 @@ const uint8_t xdf_gap3_sizes[2][2] = { { 60, 69 }, { 60, 50 } }; const uint16_t xdf_trackx_spos[2][8] = { { 0xA7F, 0xF02, 0x11B7, 0xB66, 0xE1B, 0x129E }, { 0x302, 0x7E2, 0xA52, 0x12DA, 0x572, 0xDFA, 0x106A, 0x154A } }; /* XDF: Layout of the sectors in the image. */ -const xdf_sector_t xdf_img_layout[2][2][46] = { { { {0x8100}, {0x8200}, {0x8300}, {0x8400}, {0x8500}, {0x8600}, {0x8700}, {0x8800}, - {0x8101}, {0x8201}, {0x0100}, {0x0200}, {0x0300}, {0x0400}, {0x0500}, {0x0600}, - {0x0700}, {0x0800}, { 0}, - {0x8301}, {0x8401}, {0x8501}, {0x8601}, {0x8701}, {0x8801}, {0x8901}, {0x8A01}, - {0x8B01}, {0x8C01}, {0x8D01}, {0x8E01}, {0x8F01}, {0x9001}, { 0}, { 0}, - { 0}, { 0}, { 0} }, - { {0x8300}, {0x8600}, {0x8201}, {0x8200}, {0x8601}, {0x8301} } - }, /* 5.25" 2HD */ - { { {0x8100}, {0x8200}, {0x8300}, {0x8400}, {0x8500}, {0x8600}, {0x8700}, {0x8800}, - {0x8900}, {0x8A00}, {0x8B00}, {0x8101}, {0x0100}, {0x0200}, {0x0300}, {0x0400}, - {0x0500}, {0x0600}, {0x0700}, {0x0800}, { 0}, { 0}, { 0}, - {0x8201}, {0x8301}, {0x8401}, {0x8501}, {0x8601}, {0x8701}, {0x8801}, {0x8901}, - {0x8A01}, {0x8B01}, {0x8C01}, {0x8D01}, {0x8E01}, {0x8F01}, { 0}, { 0}, - { 0}, { 0}, { 0}, {0x9001}, {0x9101}, {0x9201}, {0x9301} }, - { {0x8300}, {0x8400}, {0x8601}, {0x8200}, {0x8201}, {0x8600}, {0x8401}, {0x8301} } - } /* 3.5" 2HD */ - }; +const xdf_sector_t xdf_img_layout[2][2][46] = { + { + { + {0x8100}, {0x8200}, {0x8300}, {0x8400}, {0x8500}, {0x8600}, {0x8700}, {0x8800}, + {0x8101}, {0x8201}, {0x0100}, {0x0200}, {0x0300}, {0x0400}, {0x0500}, {0x0600}, + {0x0700}, {0x0800}, { 0}, + {0x8301}, {0x8401}, {0x8501}, {0x8601}, {0x8701}, {0x8801}, {0x8901}, {0x8A01}, + {0x8B01}, {0x8C01}, {0x8D01}, {0x8E01}, {0x8F01}, {0x9001}, { 0}, { 0}, + { 0}, { 0}, { 0} + }, + { {0x8300}, {0x8600}, {0x8201}, {0x8200}, {0x8601}, {0x8301} } + }, /* 5.25" 2HD */ + { + { + {0x8100}, {0x8200}, {0x8300}, {0x8400}, {0x8500}, {0x8600}, {0x8700}, {0x8800}, + {0x8900}, {0x8A00}, {0x8B00}, {0x8101}, {0x0100}, {0x0200}, {0x0300}, {0x0400}, + {0x0500}, {0x0600}, {0x0700}, {0x0800}, { 0}, { 0}, { 0}, + {0x8201}, {0x8301}, {0x8401}, {0x8501}, {0x8601}, {0x8701}, {0x8801}, {0x8901}, + {0x8A01}, {0x8B01}, {0x8C01}, {0x8D01}, {0x8E01}, {0x8F01}, { 0}, { 0}, + { 0}, { 0}, { 0}, {0x9001}, {0x9101}, {0x9201}, {0x9301} + }, + { {0x8300}, {0x8400}, {0x8601}, {0x8200}, {0x8201}, {0x8600}, {0x8401}, {0x8301} } + } /* 3.5" 2HD */ +}; /* XDF: Layout of the sectors on the disk's track. */ -const xdf_sector_t xdf_disk_layout[2][2][38] = { { { {0x0100}, {0x0200}, {0x8100}, {0x8800}, {0x8200}, {0x0300}, {0x8300}, {0x0400}, - {0x8400}, {0x0500}, {0x8500}, {0x0600}, {0x8600}, {0x0700}, {0x8700}, {0x0800}, - {0x8D01}, {0x8501}, {0x8E01}, {0x8601}, {0x8F01}, {0x8701}, {0x9001}, {0x8801}, - {0x8101}, {0x8901}, {0x8201}, {0x8A01}, {0x8301}, {0x8B01}, {0x8401}, {0x8C01} }, - { {0x8300}, {0x8200}, {0x8600}, {0x8201}, {0x8301}, {0x8601} } - }, /* 5.25" 2HD */ - { { {0x0100}, {0x8A00}, {0x8100}, {0x8B00}, {0x8200}, {0x0200}, {0x8300}, {0x0300}, - {0x8400}, {0x0400}, {0x8500}, {0x0500}, {0x8600}, {0x0600}, {0x8700}, {0x0700}, - {0x8800}, {0x0800}, {0x8900}, - {0x9001}, {0x8701}, {0x9101}, {0x8801}, {0x9201}, {0x8901}, {0x9301}, {0x8A01}, - {0x8101}, {0x8B01}, {0x8201}, {0x8C01}, {0x8301}, {0x8D01}, {0x8401}, {0x8E01}, - {0x8501}, {0x8F01}, {0x8601} }, - { {0x8300}, {0x8200}, {0x8400}, {0x8600}, {0x8401}, {0x8201}, {0x8301}, {0x8601} }, - }, /* 3.5" 2HD */ - }; +const xdf_sector_t xdf_disk_layout[2][2][38] = { + { + { + {0x0100}, {0x0200}, {0x8100}, {0x8800}, {0x8200}, {0x0300}, {0x8300}, {0x0400}, + {0x8400}, {0x0500}, {0x8500}, {0x0600}, {0x8600}, {0x0700}, {0x8700}, {0x0800}, + {0x8D01}, {0x8501}, {0x8E01}, {0x8601}, {0x8F01}, {0x8701}, {0x9001}, {0x8801}, + {0x8101}, {0x8901}, {0x8201}, {0x8A01}, {0x8301}, {0x8B01}, {0x8401}, {0x8C01} + }, + { {0x8300}, {0x8200}, {0x8600}, {0x8201}, {0x8301}, {0x8601} } + }, /* 5.25" 2HD */ + { + { + {0x0100}, {0x8A00}, {0x8100}, {0x8B00}, {0x8200}, {0x0200}, {0x8300}, {0x0300}, + {0x8400}, {0x0400}, {0x8500}, {0x0500}, {0x8600}, {0x0600}, {0x8700}, {0x0700}, + {0x8800}, {0x0800}, {0x8900}, + {0x9001}, {0x8701}, {0x9101}, {0x8801}, {0x9201}, {0x8901}, {0x9301}, {0x8A01}, + {0x8101}, {0x8B01}, {0x8201}, {0x8C01}, {0x8301}, {0x8D01}, {0x8401}, {0x8E01}, + {0x8501}, {0x8F01}, {0x8601} + }, + { {0x8300}, {0x8200}, {0x8400}, {0x8600}, {0x8401}, {0x8201}, {0x8301}, {0x8601} }, + }, /* 3.5" 2HD */ +}; /* First dimension is possible sector sizes (0 = 128, 7 = 16384), second is possible bit rates (250/360, 250, 300, 500/360, 500, 1000). */ /* Disks formatted at 250 kbps @ 360 RPM can be read with a 360 RPM single-RPM 5.25" drive by setting the rate to 250 kbps. Disks formatted at 300 kbps @ 300 RPM can be read with any 300 RPM single-RPM drive by setting the rate rate to 300 kbps. */ -static const uint8_t maximum_sectors[8][6] = { { 26, 31, 38, 53, 64, 118 }, /* 128 */ - { 15, 19, 23, 32, 38, 73 }, /* 256 */ - { 7, 10, 12, 17, 22, 41 }, /* 512 */ - { 3, 5, 6, 9, 11, 22 }, /* 1024 */ - { 2, 2, 3, 4, 5, 11 }, /* 2048 */ - { 1, 1, 1, 2, 2, 5 }, /* 4096 */ - { 0, 0, 0, 1, 1, 3 }, /* 8192 */ - { 0, 0, 0, 0, 0, 1 } }; /* 16384 */ +static const uint8_t maximum_sectors[8][6] = { + { 26, 31, 38, 53, 64, 118 }, /* 128 */ + { 15, 19, 23, 32, 38, 73 }, /* 256 */ + { 7, 10, 12, 17, 22, 41 }, /* 512 */ + { 3, 5, 6, 9, 11, 22 }, /* 1024 */ + { 2, 2, 3, 4, 5, 11 }, /* 2048 */ + { 1, 1, 1, 2, 2, 5 }, /* 4096 */ + { 0, 0, 0, 1, 1, 3 }, /* 8192 */ + { 0, 0, 0, 0, 0, 1 } /* 16384 */ +}; -static const uint8_t xdf_sectors[8][6] = { { 0, 0, 0, 0, 0, 0 }, /* 128 */ - { 0, 0, 0, 0, 0, 0 }, /* 256 */ - { 0, 0, 0, 19, 23, 0 }, /* 512 */ - { 0, 0, 0, 0, 0, 0 }, /* 1024 */ - { 0, 0, 0, 0, 0, 0 }, /* 2048 */ - { 0, 0, 0, 0, 0, 0 }, /* 4096 */ - { 0, 0, 0, 0, 0, 0 }, /* 8192 */ - { 0, 0, 0, 0, 0, 0 } }; /* 16384 */ +static const uint8_t xdf_sectors[8][6] = { + { 0, 0, 0, 0, 0, 0 }, /* 128 */ + { 0, 0, 0, 0, 0, 0 }, /* 256 */ + { 0, 0, 0, 19, 23, 0 }, /* 512 */ + { 0, 0, 0, 0, 0, 0 }, /* 1024 */ + { 0, 0, 0, 0, 0, 0 }, /* 2048 */ + { 0, 0, 0, 0, 0, 0 }, /* 4096 */ + { 0, 0, 0, 0, 0, 0 }, /* 8192 */ + { 0, 0, 0, 0, 0, 0 } /* 16384 */ +}; -static const uint8_t xdf_types[8][6] = { { 0, 0, 0, 0, 0, 0 }, /* 128 */ - { 0, 0, 0, 0, 0, 0 }, /* 256 */ - { 0, 0, 0, 1, 2, 0 }, /* 512 */ - { 0, 0, 0, 0, 0, 0 }, /* 1024 */ - { 0, 0, 0, 0, 0, 0 }, /* 2048 */ - { 0, 0, 0, 0, 0, 0 }, /* 4096 */ - { 0, 0, 0, 0, 0, 0 }, /* 8192 */ - { 0, 0, 0, 0, 0, 0 } }; /* 16384 */ +static const uint8_t xdf_types[8][6] = { + { 0, 0, 0, 0, 0, 0 }, /* 128 */ + { 0, 0, 0, 0, 0, 0 }, /* 256 */ + { 0, 0, 0, 1, 2, 0 }, /* 512 */ + { 0, 0, 0, 0, 0, 0 }, /* 1024 */ + { 0, 0, 0, 0, 0, 0 }, /* 2048 */ + { 0, 0, 0, 0, 0, 0 }, /* 4096 */ + { 0, 0, 0, 0, 0, 0 }, /* 8192 */ + { 0, 0, 0, 0, 0, 0 } /* 16384 */ +}; -static const double bit_rates_300[6] = { (250.0 * 300.0) / 360.0, 250.0, 300.0, (500.0 * 300.0) / 360.0, 500.0, 1000.0 }; +static const double bit_rates_300[6] = { (250.0 * 300.0) / 360.0, 250.0, 300.0, (500.0 * 300.0) / 360.0, 500.0, 1000.0 }; -static const uint8_t rates[6] = { 2, 2, 1, 4, 0, 3 }; +static const uint8_t rates[6] = { 2, 2, 1, 4, 0, 3 }; -static const uint8_t holes[6] = { 0, 0, 0, 1, 1, 2 }; +static const uint8_t holes[6] = { 0, 0, 0, 1, 1, 2 }; -const int gap3_sizes[5][8][48] = { { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [0][0] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [0][1] */ - 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [0][2] */ - 0x00, 0x00, 0x6C, 0x48, 0x2A, 0x08, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x26, 0x00, 0x00, 0x00, 0x00, /* [0][3] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [0][4] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [0][5] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [0][6] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [0][7] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, - { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [1][0] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [1][1] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x1C, 0x0E, 0x00, 0x00, /* [1][2] */ - 0x00, 0x00, 0x6C, 0x48, 0x2A, 0x08, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [1][3] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [1][4] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [1][5] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [1][6] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [1][7] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, - { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [2][0] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x0C, 0x00, 0x00, 0x00, 0x36, /* [2][1] */ - 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x50, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, /* [2][2] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0xF0, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [2][3] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [2][4] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [2][5] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [2][6] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [2][7] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, - { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [3][0] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [3][1] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [3][2] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x53, 0x4E, 0x3D, 0x2C, 0x1C, 0x0D, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [3][3] */ - 0x00, 0x00, 0xF7, 0xAF, 0x6F, 0x55, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [3][4] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [3][5] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [3][6] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [3][7] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, - { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [4][0] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [4][1] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0x54, /* [4][2] */ - 0x38, 0x23, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [4][3] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [4][4] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [4][5] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [4][6] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [4][7] */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }; +const int gap3_sizes[5][8][48] = { + { + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [0][0] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [0][1] */ + 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [0][2] */ + 0x00, 0x00, 0x6C, 0x48, 0x2A, 0x08, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x26, 0x00, 0x00, 0x00, 0x00, /* [0][3] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [0][4] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [0][5] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [0][6] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [0][7] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } + }, + { + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [1][0] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [1][1] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x1C, 0x0E, 0x00, 0x00, /* [1][2] */ + 0x00, 0x00, 0x6C, 0x48, 0x2A, 0x08, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [1][3] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [1][4] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [1][5] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [1][6] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [1][7] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } + }, + { + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [2][0] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x0C, 0x00, 0x00, 0x00, 0x36, /* [2][1] */ + 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x50, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, /* [2][2] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0xF0, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [2][3] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [2][4] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [2][5] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [2][6] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [2][7] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } + }, + { + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [3][0] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [3][1] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [3][2] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x53, 0x4E, 0x3D, 0x2C, 0x1C, 0x0D, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [3][3] */ + 0x00, 0x00, 0xF7, 0xAF, 0x6F, 0x55, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [3][4] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [3][5] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [3][6] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [3][7] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } + }, + { + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [4][0] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [4][1] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0x54, /* [4][2] */ + 0x38, 0x23, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [4][3] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [4][4] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [4][5] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [4][6] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* [4][7] */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } + } +}; #ifdef ENABLE_IMG_LOG int img_do_log = ENABLE_IMG_LOG; @@ -856,8 +889,8 @@ img_load(int drive, char *fn) fseek(dev->f, 0x03, SEEK_SET); (void) !fread(&bpb_bps, 1, 2, dev->f); #if 0 - fseek(dev->f, 0x0B, SEEK_SET); - (void) !fread(&bpb_total, 1, 2, dev->f); + fseek(dev->f, 0x0B, SEEK_SET); + (void) !fread(&bpb_total, 1, 2, dev->f); #endif fseek(dev->f, 0x10, SEEK_SET); bpb_sectors = fgetc(dev->f); @@ -958,13 +991,13 @@ jump_if_fdf: img_log("BPB reports %i sides and %i bytes per sector (%i sectors total)\n", bpb_sides, bpb_bps, bpb_total); - /* Invalid conditions: */ - guess = (bpb_sides < 1); /* Sides < 1; */ - guess = guess || (bpb_sides > 2); /* Sides > 2; */ - guess = guess || !bps_is_valid(bpb_bps); /* Invalid number of bytes per sector; */ - guess = guess || !first_byte_is_valid(first_byte); /* Invalid first bytes; */ - guess = guess || !is_divisible(bpb_total, bpb_sectors); /* Total sectors not divisible by sectors per track; */ - guess = guess || !is_divisible(bpb_total, bpb_sides); /* Total sectors not divisible by sides. */ + /* Invalid conditions: */ + guess = (bpb_sides < 1); /* Sides < 1; */ + guess = guess || (bpb_sides > 2); /* Sides > 2; */ + guess = guess || !bps_is_valid(bpb_bps); /* Invalid number of bytes per sector; */ + guess = guess || !first_byte_is_valid(first_byte); /* Invalid first bytes; */ + guess = guess || !is_divisible(bpb_total, bpb_sectors); /* Total sectors not divisible by sectors per track; */ + guess = guess || !is_divisible(bpb_total, bpb_sides); /* Total sectors not divisible by sides. */ guess = guess || !fdd_get_check_bpb(drive); guess = guess && !fdi; guess = guess && !cqm; @@ -1069,10 +1102,10 @@ jump_if_fdf: dev->sectors = 42; dev->tracks = 80; #if 0 - } else if (size <= 3440640) { /*HD 1024 sector*/ - dev->sectors = 21; - dev->tracks = 80; - dev->sector_size = 3; + } else if (size <= 3440640) { /*HD 1024 sector*/ + dev->sectors = 21; + dev->tracks = 80; + dev->sector_size = 3; #endif } else if (size <= 3604480) { /*HD 1024 sector*/ dev->sectors = 22; diff --git a/src/floppy/fdd_td0.c b/src/floppy/fdd_td0.c index 4b478baba..bf2b643ff 100644 --- a/src/floppy/fdd_td0.c +++ b/src/floppy/fdd_td0.c @@ -668,27 +668,27 @@ td0_initialize(int drive) * from the CMOS. */ switch (header[6]) { - case 0: /* 5.25" 360k in 1.2M drive: 360 rpm + case 0: /* 5.25" 360k in 1.2M drive: 360 rpm CMOS Drive type: None, value probably reused by Teledisk */ - case 2: /* 5.25" 1.2M 360 rpm */ - case 5: /* 8"/5.25"/3.5" 1.25M 360 rpm */ + case 2: /* 5.25" 1.2M: 360 rpm */ + case 5: /* 8"/5.25"/3.5" 1.25M: 360 rpm */ dev->default_track_flags = (density == 1) ? 0x20 : 0x21; dev->max_sector_size = (density == 1) ? 6 : 5; /* 8192 or 4096 bytes. */ break; - case 1: /* 5.25" 360k: 300 rpm */ - case 3: /* 3.5" 720k: 300 rpm */ + case 1: /* 5.25" 360k: 300 rpm */ + case 3: /* 3.5" 720k: 300 rpm */ dev->default_track_flags = 0x02; dev->max_sector_size = 5; /* 4096 bytes. */ break; - case 4: /* 3.5" 1.44M: 300 rpm */ + case 4: /* 3.5" 1.44M: 300 rpm */ dev->default_track_flags = (density == 1) ? 0x00 : 0x02; dev->max_sector_size = (density == 1) ? 6 : 5; /* 8192 or 4096 bytes. */ break; - case 6: /* 3.5" 2.88M: 300 rpm */ + case 6: /* 3.5" 2.88M: 300 rpm */ dev->default_track_flags = (density == 1) ? 0x00 : ((density == 2) ? 0x03 : 0x02); dev->max_sector_size = (density == 1) ? 6 : ((density == 2) ? 7 : 5); /* 16384, 8192, or 4096 bytes. */ break; diff --git a/src/floppy/fdi2raw.c b/src/floppy/fdi2raw.c index b367db5c1..dcda6afc1 100644 --- a/src/floppy/fdi2raw.c +++ b/src/floppy/fdi2raw.c @@ -20,7 +20,7 @@ * * Copyright 2001-2004 Toni Wilen. * Copyright 2001-2004 Vincent Joguin. - * Copyright 2001 Thomas Harte. + * Copyright 2001-2016 Thomas Harte. */ #define STATIC_INLINE #include @@ -65,7 +65,7 @@ fdi2raw_log(const char *fmt, ...) #ifdef ENABLE_FDI2RAW_LOG # ifdef DEBUG static char * -datalog(uae_u8 *src, int len) +datalog(uint8_t *src, int len) { static char buf[1000]; static int offset; @@ -88,7 +88,7 @@ datalog(uae_u8 *src, int len) } # else static char * -datalog(uae_u8 *src, int len) +datalog(uint8_t *src, int len) { return ""; } @@ -130,37 +130,38 @@ fdi_malloc(int size) #define MAX_TRACKS 166 struct fdi_cache { - uae_u32 *avgp, *minp, *maxp; - uae_u8 *idxp; - int avg_free, idx_free, min_free, max_free; - uae_u32 totalavg, pulses, maxidx, indexoffset; - int weakbits; - int lowlevel; + uint32_t *avgp, *minp, *maxp; + uint8_t *idxp; + int avg_free, idx_free, min_free, max_free; + uint32_t totalavg, pulses, maxidx, indexoffset; + int weakbits; + int lowlevel; }; struct fdi { - uae_u8 *track_src_buffer; - uae_u8 *track_src; - int track_src_len; - uae_u8 *track_dst_buffer; - uae_u8 *track_dst; - uae_u16 *track_dst_buffer_timing; - uae_u8 track_len; - uae_u8 track_type; - int current_track; - int last_track; - int last_head; - int rotation_speed; - int bit_rate; - int disk_type; - int write_protect; - int err; - uae_u8 header[2048]; - int track_offsets[MAX_TRACKS]; - FILE *file; - int out; - int mfmsync_offset; - int *mfmsync_buffer; + uint8_t *track_src_buffer; + uint8_t *track_src; + int32_t track_src_len; + uint8_t *track_dst_buffer; + uint8_t *track_dst; + uint16_t *track_dst_buffer_timing; + uint8_t track_len; + uint8_t track_type; + int current_track; + int last_track; + int last_head; + int rotation_speed; + int bit_rate; + int disk_type; + bool write_protect; + int reversed_side; + int err; + uint8_t header[2048]; + int32_t track_offsets[MAX_TRACKS]; + FILE *file; + int out; + int mfmsync_offset; + int *mfmsync_buffer; /* sector described only */ int index_offset; int encoding_type; @@ -172,7 +173,7 @@ struct fdi { #define get_u32(x) ((((x)[0]) << 24) | (((x)[1]) << 16) | (((x)[2]) << 8) | ((x)[3])) #define get_u24(x) ((((x)[0]) << 16) | (((x)[1]) << 8) | ((x)[2])) STATIC_INLINE void -put_u32(uae_u8 *d, uae_u32 v) +put_u32(uint8_t *d, uint32_t v) { d[0] = v >> 24; d[1] = v >> 16; @@ -181,16 +182,16 @@ put_u32(uae_u8 *d, uae_u32 v) } struct node { - uae_u16 v; + uint16_t v; struct node *left; struct node *right; }; typedef struct node NODE; -static uae_u8 temp, temp2; +static uint8_t temp, temp2; -static uae_u8 * -expand_tree(uae_u8 *stream, NODE *node) +static uint8_t * +expand_tree(uint8_t *stream, NODE *node) { if (temp & temp2) { if (node->left) { @@ -208,7 +209,7 @@ expand_tree(uae_u8 *stream, NODE *node) } return stream; } else { - uae_u8 *stream_temp; + uint8_t *stream_temp; temp2 >>= 1; if (!temp2) { temp = *stream++; @@ -223,27 +224,27 @@ expand_tree(uae_u8 *stream, NODE *node) } } -static uae_u8 * -values_tree8(uae_u8 *stream, NODE *node) +static uint8_t * +values_tree8(uint8_t *stream, NODE *node) { if (node->left == 0) { node->v = *stream++; return stream; } else { - uae_u8 *stream_temp = values_tree8(stream, node->left); + uint8_t *stream_temp = values_tree8(stream, node->left); return values_tree8(stream_temp, node->right); } } -static uae_u8 * -values_tree16(uae_u8 *stream, NODE *node) +static uint8_t * +values_tree16(uint8_t *stream, NODE *node) { if (node->left == 0) { - uae_u16 high_8_bits = (*stream++) << 8; - node->v = high_8_bits | (*stream++); + uint16_t high_8_bits = (*stream++) << 8; + node->v = high_8_bits | (*stream++); return stream; } else { - uae_u8 *stream_temp = values_tree16(stream, node->left); + uint8_t *stream_temp = values_tree16(stream, node->left); return values_tree16(stream_temp, node->right); } } @@ -258,16 +259,18 @@ free_nodes(NODE *node) } } -static uae_u32 -sign_extend16(uae_u32 v) +/// @returns the 32-bit sign extended version of the 16-bit value in the low part of @c v. +static uint32_t +sign_extend16(uint32_t v) { if (v & 0x8000) v |= 0xffff0000; return v; } -static uae_u32 -sign_extend8(uae_u32 v) +/// @returns the 32-bit sign extended version of the 8-bit value in the low part of @c v. +static uint32_t +sign_extend8(uint32_t v) { if (v & 0x80) v |= 0xffffff00; @@ -275,12 +278,12 @@ sign_extend8(uae_u32 v) } static void -fdi_decode(uae_u8 *stream, int size, uae_u8 *out) +fdi_decode(uint8_t *stream, int size, uint8_t *out) { - int i; - uae_u8 sign_extend, sixteen_bit, sub_stream_shift; - NODE root; - NODE *current_node; + int i; + uint8_t sign_extend, sixteen_bit, sub_stream_shift; + NODE root; + NODE *current_node; memset(out, 0, size * 4); sub_stream_shift = 1; @@ -308,9 +311,9 @@ fdi_decode(uae_u8 *stream, int size, uae_u8 *out) /* sub-stream data decode */ temp2 = 0; for (i = 0; i < size; i++) { - uae_u32 v; - uae_u8 decode = 1; - current_node = &root; + uint32_t v; + uint8_t decode = 1; + current_node = &root; while (decode) { if (current_node->left == 0) { decode = 0; @@ -326,7 +329,7 @@ fdi_decode(uae_u8 *stream, int size, uae_u8 *out) current_node = current_node->left; } } - v = ((uae_u32 *) out)[i]; + v = ((uint32_t *) out)[i]; if (sign_extend) { if (sixteen_bit) v |= sign_extend16(current_node->v) << sub_stream_shift; @@ -335,7 +338,7 @@ fdi_decode(uae_u8 *stream, int size, uae_u8 *out) } else { v |= current_node->v << sub_stream_shift; } - ((uae_u32 *) out)[i] = v; + ((uint32_t *) out)[i] = v; } free_nodes(root.left); root.left = 0; @@ -363,7 +366,7 @@ zxx(FDI *fdi) #if 0 static void zyy (FDI *fdi) { - fdi2raw_log("track %d: unsupported track type 0x%02.2X\n", fdi->current_track, fdi->track_type); + fdi2raw_log("track %d: unsupported track type 0x%02.2X\n", fdi->current_track, fdi->track_type); } #endif /* empty track */ @@ -457,7 +460,7 @@ bit_dedrop(FDI *fdi) /* add one byte */ static void -byte_add(FDI *fdi, uae_u8 v) +byte_add(FDI *fdi, uint8_t v) { int i; for (i = 7; i >= 0; i--) @@ -465,14 +468,14 @@ byte_add(FDI *fdi, uae_u8 v) } /* add one word */ static void -word_add(FDI *fdi, uae_u16 v) +word_add(FDI *fdi, uint16_t v) { - byte_add(fdi, (uae_u8) (v >> 8)); - byte_add(fdi, (uae_u8) v); + byte_add(fdi, (uint8_t) (v >> 8)); + byte_add(fdi, (uint8_t) v); } /* add one byte and mfm encode it */ static void -byte_mfm_add(FDI *fdi, uae_u8 v) +byte_mfm_add(FDI *fdi, uint8_t v) { int i; for (i = 7; i >= 0; i--) @@ -480,7 +483,7 @@ byte_mfm_add(FDI *fdi, uae_u8 v) } /* add multiple bytes and mfm encode them */ static void -bytes_mfm_add(FDI *fdi, uae_u8 v, int len) +bytes_mfm_add(FDI *fdi, uint8_t v, int len) { int i; for (i = 0; i < len; i++) @@ -488,7 +491,7 @@ bytes_mfm_add(FDI *fdi, uae_u8 v, int len) } /* add one mfm encoded word and re-mfm encode it */ static void -word_post_mfm_add(FDI *fdi, uae_u16 v) +word_post_mfm_add(FDI *fdi, uint16_t v) { int i; for (i = 14; i >= 0; i -= 2) @@ -529,8 +532,8 @@ s04(FDI *fdi) static void s08(FDI *fdi) { - int bytes = *fdi->track_src++; - uae_u8 byte = *fdi->track_src++; + int bytes = *fdi->track_src++; + uint8_t byte = *fdi->track_src++; if (bytes == 0) bytes = 256; fdi2raw_log("s08:len=%d,data=%02.2X", bytes, byte); @@ -541,8 +544,8 @@ s08(FDI *fdi) static void s09(FDI *fdi) { - int bytes = *fdi->track_src++; - uae_u8 byte = *fdi->track_src++; + int bytes = *fdi->track_src++; + uint8_t byte = *fdi->track_src++; if (bytes == 0) bytes = 256; bit_drop_next(fdi); @@ -554,8 +557,8 @@ s09(FDI *fdi) static void s0a(FDI *fdi) { - int i, bits = (fdi->track_src[0] << 8) | fdi->track_src[1]; - uae_u8 b; + int i, bits = (fdi->track_src[0] << 8) | fdi->track_src[1]; + uint8_t b; fdi->track_src += 2; fdi2raw_log("s0a:bits=%d,data=%s", bits, datalog(fdi->track_src, (bits + 7) / 8)); while (bits >= 8) { @@ -575,8 +578,8 @@ s0a(FDI *fdi) static void s0b(FDI *fdi) { - int i, bits = ((fdi->track_src[0] << 8) | fdi->track_src[1]) + 65536; - uae_u8 b; + int i, bits = ((fdi->track_src[0] << 8) | fdi->track_src[1]) + 65536; + uint8_t b; fdi->track_src += 2; fdi2raw_log("s0b:bits=%d,data=%s", bits, datalog(fdi->track_src, (bits + 7) / 8)); while (bits >= 8) { @@ -596,8 +599,8 @@ s0b(FDI *fdi) static void s0c(FDI *fdi) { - int i, bits = (fdi->track_src[0] << 8) | fdi->track_src[1]; - uae_u8 b; + int i, bits = (fdi->track_src[0] << 8) | fdi->track_src[1]; + uint8_t b; fdi->track_src += 2; bit_drop_next(fdi); fdi2raw_log("s0c:bits=%d,data=%s", bits, datalog(fdi->track_src, (bits + 7) / 8)); @@ -618,8 +621,8 @@ s0c(FDI *fdi) static void s0d(FDI *fdi) { - int i, bits = ((fdi->track_src[0] << 8) | fdi->track_src[1]) + 65536; - uae_u8 b; + int i, bits = ((fdi->track_src[0] << 8) | fdi->track_src[1]) + 65536; + uint8_t b; fdi->track_src += 2; bit_drop_next(fdi); fdi2raw_log("s0d:bits=%d,data=%s", bits, datalog(fdi->track_src, (bits + 7) / 8)); @@ -643,7 +646,7 @@ s0d(FDI *fdi) /* just for testing integrity of Amiga sectors */ -/*static void rotateonebit (uae_u8 *start, uae_u8 *end, int shift) +/*static void rotateonebit (uint8_t *start, uint8_t *end, int shift) { if (shift == 0) return; @@ -654,21 +657,21 @@ s0d(FDI *fdi) } }*/ -/*static uae_u16 getmfmword (uae_u8 *mbuf) +/*static uint16_t getmfmword (uint8_t *mbuf) { - uae_u32 v; + uint32_t v; v = (mbuf[0] << 8) | (mbuf[1] << 0); if (check_offset == 0) - return v; + return (uint16_t)v; v <<= 8; v |= mbuf[2]; v >>= check_offset; - return v; + return (uint16_t)v; }*/ #define MFMMASK 0x55555555 -/*static uae_u32 getmfmlong (uae_u8 * mbuf) +/*static uint32_t getmfmlong (uint8_t * mbuf) { return ((getmfmword (mbuf) << 16) | getmfmword (mbuf + 2)) & MFMMASK; }*/ @@ -676,165 +679,165 @@ s0d(FDI *fdi) #if 0 static int amiga_check_track (FDI *fdi) { - int i, j, secwritten = 0; - int fwlen = fdi->out / 8; - int length = 2 * fwlen; - int drvsec = 11; - uae_u32 odd, even, chksum, id, dlong; - uae_u8 *secdata; - uae_u8 secbuf[544]; - uae_u8 bigmfmbuf[60000]; - uae_u8 *mbuf, *mbuf2, *mend; - char sectable[22]; - uae_u8 *raw = fdi->track_dst_buffer; - int slabel, off; - int ok = 1; + int i, j, secwritten = 0; + int fwlen = fdi->out / 8; + int length = 2 * fwlen; + int drvsec = 11; + uint32_t odd, even, chksum, id, dlong; + uint8_t *secdata; + uint8_t secbuf[544]; + uint8_t bigmfmbuf[60000]; + uint8_t *mbuf, *mbuf2, *mend; + char sectable[22]; + uint8_t *raw = fdi->track_dst_buffer; + int slabel, off; + int ok = 1; - memset (bigmfmbuf, 0, sizeof (bigmfmbuf)); - mbuf = bigmfmbuf; - check_offset = 0; - for (i = 0; i < (fdi->out + 7) / 8; i++) - *mbuf++ = raw[i]; - off = fdi->out & 7; + memset (bigmfmbuf, 0, sizeof (bigmfmbuf)); + mbuf = bigmfmbuf; + check_offset = 0; + for (i = 0; i < (fdi->out + 7) / 8; i++) + *mbuf++ = raw[i]; + off = fdi->out & 7; # if 1 - if (off > 0) { - mbuf--; - *mbuf &= ~((1 << (8 - off)) - 1); - } - j = 0; - while (i < (fdi->out + 7) / 8 + 600) { - *mbuf++ |= (raw[j] >> off) | ((raw[j + 1]) << (8 - off)); - j++; - i++; - } + if (off > 0) { + mbuf--; + *mbuf &= ~((1 << (8 - off)) - 1); + } + j = 0; + while (i < (fdi->out + 7) / 8 + 600) { + *mbuf++ |= (raw[j] >> off) | ((raw[j + 1]) << (8 - off)); + j++; + i++; + } # endif - mbuf = bigmfmbuf; + mbuf = bigmfmbuf; - memset (sectable, 0, sizeof (sectable)); - mend = bigmfmbuf + length; - mend -= (4 + 16 + 8 + 512); + memset (sectable, 0, sizeof (sectable)); + mend = bigmfmbuf + length; + mend -= (4 + 16 + 8 + 512); - while (secwritten < drvsec) { - int trackoffs; + while (secwritten < drvsec) { + int trackoffs; - for (;;) { - rotateonebit (bigmfmbuf, mend, 1); - if (getmfmword (mbuf) == 0) - break; - if (secwritten == 10) { - mbuf[0] = 0x44; - mbuf[1] = 0x89; - } - if (check_offset > 7) { - check_offset = 0; - mbuf++; - if (mbuf >= mend || *mbuf == 0) - break; - } - if (getmfmword (mbuf) == 0x4489) - break; - } - if (mbuf >= mend || *mbuf == 0) - break; + for (;;) { + rotateonebit (bigmfmbuf, mend, 1); + if (getmfmword (mbuf) == 0) + break; + if (secwritten == 10) { + mbuf[0] = 0x44; + mbuf[1] = 0x89; + } + if (check_offset > 7) { + check_offset = 0; + mbuf++; + if (mbuf >= mend || *mbuf == 0) + break; + } + if (getmfmword (mbuf) == 0x4489) + break; + } + if (mbuf >= mend || *mbuf == 0) + break; - rotateonebit (bigmfmbuf, mend, check_offset); - check_offset = 0; + rotateonebit (bigmfmbuf, mend, check_offset); + check_offset = 0; - while (getmfmword (mbuf) == 0x4489) - mbuf+= 1 * 2; - mbuf2 = mbuf + 8; + while (getmfmword (mbuf) == 0x4489) + mbuf+= 1 * 2; + mbuf2 = mbuf + 8; - odd = getmfmlong (mbuf); - even = getmfmlong (mbuf + 2 * 2); - mbuf += 4 * 2; - id = (odd << 1) | even; + odd = getmfmlong (mbuf); + even = getmfmlong (mbuf + 2 * 2); + mbuf += 4 * 2; + id = (odd << 1) | even; - trackoffs = (id & 0xff00) >> 8; - if (trackoffs + 1 > drvsec) { - fdi2raw_log("illegal sector offset %d\n",trackoffs); - ok = 0; - mbuf = mbuf2; - continue; - } - if ((id >> 24) != 0xff) { - fdi2raw_log("sector %d format type %02.2X?\n", trackoffs, id >> 24); - ok = 0; - } - chksum = odd ^ even; - slabel = 0; - for (i = 0; i < 4; i++) { - odd = getmfmlong (mbuf); - even = getmfmlong (mbuf + 8 * 2); - mbuf += 2* 2; + trackoffs = (id & 0xff00) >> 8; + if (trackoffs + 1 > drvsec) { + fdi2raw_log("illegal sector offset %d\n",trackoffs); + ok = 0; + mbuf = mbuf2; + continue; + } + if ((id >> 24) != 0xff) { + fdi2raw_log("sector %d format type %02.2X?\n", trackoffs, id >> 24); + ok = 0; + } + chksum = odd ^ even; + slabel = 0; + for (i = 0; i < 4; i++) { + odd = getmfmlong (mbuf); + even = getmfmlong (mbuf + 8 * 2); + mbuf += 2* 2; - dlong = (odd << 1) | even; - if (dlong) slabel = 1; - chksum ^= odd ^ even; - } - mbuf += 8 * 2; - odd = getmfmlong (mbuf); - even = getmfmlong (mbuf + 2 * 2); - mbuf += 4 * 2; - if (((odd << 1) | even) != chksum) { - fdi2raw_log("sector %d header crc error\n", trackoffs); - ok = 0; - mbuf = mbuf2; - continue; - } - fdi2raw_log("sector %d header crc ok\n", trackoffs); - if (((id & 0x00ff0000) >> 16) != (uae_u32)fdi->current_track) { - fdi2raw_log("illegal track number %d <> %d\n",fdi->current_track,(id & 0x00ff0000) >> 16); - ok++; - mbuf = mbuf2; - continue; - } - odd = getmfmlong (mbuf); - even = getmfmlong (mbuf + 2 * 2); - mbuf += 4 * 2; - chksum = (odd << 1) | even; - secdata = secbuf + 32; - for (i = 0; i < 128; i++) { - odd = getmfmlong (mbuf); - even = getmfmlong (mbuf + 256 * 2); - mbuf += 2 * 2; - dlong = (odd << 1) | even; - *secdata++ = (uae_u8) (dlong >> 24); - *secdata++ = (uae_u8) (dlong >> 16); - *secdata++ = (uae_u8) (dlong >> 8); - *secdata++ = (uae_u8) dlong; - chksum ^= odd ^ even; - } - mbuf += 256 * 2; - if (chksum) { - fdi2raw_log("sector %d data checksum error\n",trackoffs); - ok = 0; - } else if (sectable[trackoffs]) { - fdi2raw_log("sector %d already found?\n", trackoffs); - mbuf = mbuf2; - } else { - fdi2raw_log("sector %d ok\n",trackoffs); - if (slabel) fdi2raw_log("(non-empty sector header)\n"); - sectable[trackoffs] = 1; - secwritten++; - if (trackoffs == 9) - mbuf += 0x228; - } - } - for (i = 0; i < drvsec; i++) { - if (!sectable[i]) { - fdi2raw_log("sector %d missing\n", i); - ok = 0; - } - } - return ok; + dlong = (odd << 1) | even; + if (dlong) slabel = 1; + chksum ^= odd ^ even; + } + mbuf += 8 * 2; + odd = getmfmlong (mbuf); + even = getmfmlong (mbuf + 2 * 2); + mbuf += 4 * 2; + if (((odd << 1) | even) != chksum) { + fdi2raw_log("sector %d header crc error\n", trackoffs); + ok = 0; + mbuf = mbuf2; + continue; + } + fdi2raw_log("sector %d header crc ok\n", trackoffs); + if (((id & 0x00ff0000) >> 16) != (uint32_t)fdi->current_track) { + fdi2raw_log("illegal track number %d <> %d\n",fdi->current_track,(id & 0x00ff0000) >> 16); + ok++; + mbuf = mbuf2; + continue; + } + odd = getmfmlong (mbuf); + even = getmfmlong (mbuf + 2 * 2); + mbuf += 4 * 2; + chksum = (odd << 1) | even; + secdata = secbuf + 32; + for (i = 0; i < 128; i++) { + odd = getmfmlong (mbuf); + even = getmfmlong (mbuf + 256 * 2); + mbuf += 2 * 2; + dlong = (odd << 1) | even; + *secdata++ = (uint8_t) (dlong >> 24); + *secdata++ = (uint8_t) (dlong >> 16); + *secdata++ = (uint8_t) (dlong >> 8); + *secdata++ = (uint8_t) dlong; + chksum ^= odd ^ even; + } + mbuf += 256 * 2; + if (chksum) { + fdi2raw_log("sector %d data checksum error\n",trackoffs); + ok = 0; + } else if (sectable[trackoffs]) { + fdi2raw_log("sector %d already found?\n", trackoffs); + mbuf = mbuf2; + } else { + fdi2raw_log("sector %d ok\n",trackoffs); + if (slabel) fdi2raw_log("(non-empty sector header)\n"); + sectable[trackoffs] = 1; + secwritten++; + if (trackoffs == 9) + mbuf += 0x228; + } + } + for (i = 0; i < drvsec; i++) { + if (!sectable[i]) { + fdi2raw_log("sector %d missing\n", i); + ok = 0; + } + } + return ok; } #endif static void -amiga_data_raw(FDI *fdi, uae_u8 *secbuf, uae_u8 *crc, int len) +amiga_data_raw(FDI *fdi, uint8_t *secbuf, uint8_t *crc, int len) { - int i; - uae_u8 crcbuf[4]; + int i; + uint8_t crcbuf[4]; if (!crc) { memset(crcbuf, 0, 4); @@ -848,11 +851,11 @@ amiga_data_raw(FDI *fdi, uae_u8 *secbuf, uae_u8 *crc, int len) } static void -amiga_data(FDI *fdi, uae_u8 *secbuf) +amiga_data(FDI *fdi, uint8_t *secbuf) { - uae_u16 mfmbuf[4 + 512]; - uae_u32 dodd, deven, dck; - int i; + uint16_t mfmbuf[4 + 512]; + uint32_t dodd, deven, dck; + int i; for (i = 0; i < 512; i += 4) { deven = ((secbuf[i + 0] << 24) | (secbuf[i + 1] << 16) @@ -860,10 +863,10 @@ amiga_data(FDI *fdi, uae_u8 *secbuf) dodd = deven >> 1; deven &= 0x55555555; dodd &= 0x55555555; - mfmbuf[(i >> 1) + 4] = (uae_u16) (dodd >> 16); - mfmbuf[(i >> 1) + 5] = (uae_u16) dodd; - mfmbuf[(i >> 1) + 256 + 4] = (uae_u16) (deven >> 16); - mfmbuf[(i >> 1) + 256 + 5] = (uae_u16) deven; + mfmbuf[(i >> 1) + 4] = (uint16_t) (dodd >> 16); + mfmbuf[(i >> 1) + 5] = (uint16_t) dodd; + mfmbuf[(i >> 1) + 256 + 4] = (uint16_t) (deven >> 16); + mfmbuf[(i >> 1) + 256 + 5] = (uint16_t) deven; } dck = 0; for (i = 4; i < 4 + 512; i += 2) @@ -872,22 +875,22 @@ amiga_data(FDI *fdi, uae_u8 *secbuf) dodd >>= 1; deven &= 0x55555555; dodd &= 0x55555555; - mfmbuf[0] = (uae_u16) (dodd >> 16); - mfmbuf[1] = (uae_u16) dodd; - mfmbuf[2] = (uae_u16) (deven >> 16); - mfmbuf[3] = (uae_u16) deven; + mfmbuf[0] = (uint16_t) (dodd >> 16); + mfmbuf[1] = (uint16_t) dodd; + mfmbuf[2] = (uint16_t) (deven >> 16); + mfmbuf[3] = (uint16_t) deven; for (i = 0; i < 4 + 512; i++) word_post_mfm_add(fdi, mfmbuf[i]); } static void -amiga_sector_header(FDI *fdi, uae_u8 *header, uae_u8 *data, int sector, int untilgap) +amiga_sector_header(FDI *fdi, uint8_t *header, uint8_t *data, int sector, int untilgap) { - uae_u8 headerbuf[4], databuf[16]; - uae_u32 deven, dodd, hck; - uae_u16 mfmbuf[24]; - int i; + uint8_t headerbuf[4], databuf[16]; + uint32_t deven, dodd, hck; + uint16_t mfmbuf[24]; + int i; byte_mfm_add(fdi, 0); byte_mfm_add(fdi, 0); @@ -897,9 +900,9 @@ amiga_sector_header(FDI *fdi, uae_u8 *header, uae_u8 *data, int sector, int unti memcpy(headerbuf, header, 4); } else { headerbuf[0] = 0xff; - headerbuf[1] = (uae_u8) fdi->current_track; - headerbuf[2] = (uae_u8) sector; - headerbuf[3] = (uae_u8) untilgap; + headerbuf[1] = (uint8_t) fdi->current_track; + headerbuf[2] = (uint8_t) sector; + headerbuf[3] = (uint8_t) untilgap; } if (data) memcpy(databuf, data, 16); @@ -911,20 +914,20 @@ amiga_sector_header(FDI *fdi, uae_u8 *header, uae_u8 *data, int sector, int unti dodd = deven >> 1; deven &= 0x55555555; dodd &= 0x55555555; - mfmbuf[0] = (uae_u16) (dodd >> 16); - mfmbuf[1] = (uae_u16) dodd; - mfmbuf[2] = (uae_u16) (deven >> 16); - mfmbuf[3] = (uae_u16) deven; + mfmbuf[0] = (uint16_t) (dodd >> 16); + mfmbuf[1] = (uint16_t) dodd; + mfmbuf[2] = (uint16_t) (deven >> 16); + mfmbuf[3] = (uint16_t) deven; for (i = 0; i < 16; i += 4) { deven = ((databuf[i] << 24) | (databuf[i + 1] << 16) | (databuf[i + 2] << 8) | (databuf[i + 3])); dodd = deven >> 1; deven &= 0x55555555; dodd &= 0x55555555; - mfmbuf[(i >> 1) + 0 + 4] = (uae_u16) (dodd >> 16); - mfmbuf[(i >> 1) + 0 + 5] = (uae_u16) dodd; - mfmbuf[(i >> 1) + 8 + 4] = (uae_u16) (deven >> 16); - mfmbuf[(i >> 1) + 8 + 5] = (uae_u16) deven; + mfmbuf[(i >> 1) + 0 + 4] = (uint16_t) (dodd >> 16); + mfmbuf[(i >> 1) + 0 + 5] = (uint16_t) dodd; + mfmbuf[(i >> 1) + 8 + 4] = (uint16_t) (deven >> 16); + mfmbuf[(i >> 1) + 8 + 5] = (uint16_t) deven; } hck = 0; for (i = 0; i < 4 + 16; i += 2) @@ -933,10 +936,10 @@ amiga_sector_header(FDI *fdi, uae_u8 *header, uae_u8 *data, int sector, int unti dodd >>= 1; deven &= 0x55555555; dodd &= 0x55555555; - mfmbuf[20] = (uae_u16) (dodd >> 16); - mfmbuf[21] = (uae_u16) dodd; - mfmbuf[22] = (uae_u16) (deven >> 16); - mfmbuf[23] = (uae_u16) deven; + mfmbuf[20] = (uint16_t) (dodd >> 16); + mfmbuf[21] = (uint16_t) dodd; + mfmbuf[22] = (uint16_t) (deven >> 16); + mfmbuf[23] = (uint16_t) deven; for (i = 0; i < 4 + 16 + 4; i++) word_post_mfm_add(fdi, mfmbuf[i]); @@ -1018,11 +1021,11 @@ s27(FDI *fdi) /* IBM */ /* *** */ -static uae_u16 -ibm_crc(uae_u8 byte, int reset) +static uint16_t +ibm_crc(uint8_t byte, int reset) { - static uae_u16 crc; - int i; + static uint16_t crc; + int i; if (reset) crc = 0xcdb4; @@ -1042,11 +1045,11 @@ ibm_crc(uae_u8 byte, int reset) } static void -ibm_data(FDI *fdi, uae_u8 *data, uae_u8 *crc, int len) +ibm_data(FDI *fdi, uint8_t *data, uint8_t *crc, int len) { - int i; - uae_u8 crcbuf[2]; - uae_u16 crcv = 0; + int i; + uint8_t crcbuf[2]; + uint16_t crcv = 0; word_add(fdi, 0x4489); word_add(fdi, 0x4489); @@ -1059,20 +1062,20 @@ ibm_data(FDI *fdi, uae_u8 *data, uae_u8 *crc, int len) } if (!crc) { crc = crcbuf; - crc[0] = (uae_u8) (crcv >> 8); - crc[1] = (uae_u8) crcv; + crc[0] = (uint8_t) (crcv >> 8); + crc[1] = (uint8_t) crcv; } byte_mfm_add(fdi, crc[0]); byte_mfm_add(fdi, crc[1]); } static void -ibm_sector_header(FDI *fdi, uae_u8 *data, uae_u8 *crc, int secnum, int pre) +ibm_sector_header(FDI *fdi, uint8_t *data, uint8_t *crc, int secnum, int pre) { - uae_u8 secbuf[5]; - uae_u8 crcbuf[2]; - uae_u16 crcv; - int i; + uint8_t secbuf[5]; + uint8_t crcbuf[2]; + uint16_t crcv; + int i; if (pre) bytes_mfm_add(fdi, 0, 12); @@ -1081,9 +1084,9 @@ ibm_sector_header(FDI *fdi, uae_u8 *data, uae_u8 *crc, int secnum, int pre) word_add(fdi, 0x4489); secbuf[0] = 0xfe; if (secnum >= 0) { - secbuf[1] = (uae_u8) (fdi->current_track / 2); - secbuf[2] = (uae_u8) (fdi->current_track % 2); - secbuf[3] = (uae_u8) secnum; + secbuf[1] = (uint8_t) (fdi->current_track / 2); + secbuf[2] = (uint8_t) (fdi->current_track % 2); + secbuf[3] = (uint8_t) secnum; secbuf[4] = 2; } else { memcpy(secbuf + 1, data, 4); @@ -1096,8 +1099,8 @@ ibm_sector_header(FDI *fdi, uae_u8 *data, uae_u8 *crc, int secnum, int pre) if (crc) { memcpy(crcbuf, crc, 2); } else { - crcbuf[0] = (uae_u8) (crcv >> 8); - crcbuf[1] = (uae_u8) crcv; + crcbuf[0] = (uint8_t) (crcv >> 8); + crcbuf[1] = (uint8_t) crcv; } /* data */ for (i = 0; i < 5; i++) @@ -1276,8 +1279,8 @@ track_amiga(struct fdi *fdi, int first_sector, int max_sector) static void track_atari_st(struct fdi *fdi, int max_sector) { - int i, gap3 = 0; - uae_u8 *p = fdi->track_src; + int i, gap3 = 0; + uint8_t *p = fdi->track_src; switch (max_sector) { case 9: @@ -1301,8 +1304,8 @@ track_atari_st(struct fdi *fdi, int max_sector) static void track_pc(struct fdi *fdi, int max_sector) { - int i, gap3; - uae_u8 *p = fdi->track_src; + int i, gap3; + uint8_t *p = fdi->track_src; switch (max_sector) { case 8: @@ -1331,7 +1334,7 @@ track_pc(struct fdi *fdi, int max_sector) static void track_amiga_dd(struct fdi *fdi) { - uae_u8 *p = fdi->track_src; + uint8_t *p = fdi->track_src; track_amiga(fdi, fdi->track_len >> 4, 11); fdi->track_src = p + (fdi->track_len & 15) * 512; } @@ -1339,7 +1342,7 @@ track_amiga_dd(struct fdi *fdi) static void track_amiga_hd(struct fdi *fdi) { - uae_u8 *p = fdi->track_src; + uint8_t *p = fdi->track_src; track_amiga(fdi, 0, 22); fdi->track_src = p + fdi->track_len * 256; } @@ -1420,8 +1423,8 @@ static int handle_sectors_described_track(FDI *fdi) { #ifdef ENABLE_FDI2RAW_LOG - int oldout; - uae_u8 *start_src = fdi->track_src; + int oldout; + uint8_t *start_src = fdi->track_src; #endif fdi->encoding_type = *fdi->track_src++; fdi->index_offset = get_u32(fdi->track_src); @@ -1454,20 +1457,20 @@ handle_sectors_described_track(FDI *fdi) return fdi->out; } -static uae_u8 * -fdi_decompress(int pulses, uae_u8 *sizep, uae_u8 *src, int *dofree) +static uint8_t * +fdi_decompress(int pulses, uint8_t *sizep, uint8_t *src, int *dofree) { - uae_u32 size = get_u24(sizep); - uae_u32 *dst2; - int len = size & 0x3fffff; - uae_u8 *dst; - int mode = size >> 22, i; + uint32_t size = get_u24(sizep); + uint32_t *dst2; + int len = size & 0x3fffff; + uint8_t *dst; + int mode = size >> 22, i; *dofree = 0; if (mode == 0 && pulses * 2 > len) mode = 1; if (mode == 0) { - dst2 = (uae_u32 *) src; + dst2 = (uint32_t *) src; dst = src; for (i = 0; i < pulses; i++) { *dst2++ = get_u32(src); @@ -1484,7 +1487,7 @@ fdi_decompress(int pulses, uae_u8 *sizep, uae_u8 *src, int *dofree) } static void -dumpstream(int track, uae_u8 *stream, int len) +dumpstream(int track, uint8_t *stream, int len) { #if 0 char name[100]; @@ -1499,8 +1502,8 @@ dumpstream(int track, uae_u8 *stream, int len) static int bitoffset; -STATIC_INLINE void -addbit(uae_u8 *p, int bit) +static inline void +addbit(uint8_t *p, int bit) { int off1 = bitoffset / 8; int off2 = bitoffset % 8; @@ -1517,7 +1520,7 @@ struct pulse_sample { static int pulse_limitval = 15; /* tolerance of 15% */ static struct pulse_sample psarray[FDI_MAX_ARRAY]; static int array_index; -static unsigned long total; +static uint32_t total; static int totaldiv; static void @@ -1536,145 +1539,145 @@ init_array(uint32_t standard_MFM_2_bit_cell_size, int nb_of_bits) #if 0 -static void fdi2_decode (FDI *fdi, uint32_t totalavg, uae_u32 *avgp, uae_u32 *minp, uae_u32 *maxp, uae_u8 *idx, int maxidx, int *indexoffsetp, int pulses, int mfm) -{ - uint32_t adjust; - uint32_t adjusted_pulse; - uint32_t standard_MFM_2_bit_cell_size = totalavg / 50000; - uint32_t standard_MFM_8_bit_cell_size = totalavg / 12500; - int real_size, i, j, eodat, outstep; - int indexoffset = *indexoffsetp; - uae_u8 *d = fdi->track_dst_buffer; - uae_u16 *pt = fdi->track_dst_buffer_timing; - uae_u32 ref_pulse, pulse; - - /* detects a long-enough stable pulse coming just after another stable pulse */ - i = 1; - while ( (i < pulses) && ( (idx[i] < maxidx) - || (idx[i - 1] < maxidx) - || (avgp[i] < (standard_MFM_2_bit_cell_size - (standard_MFM_2_bit_cell_size / 4))) ) ) - i++; - if (i == pulses) { - fdi2raw_log("No stable and long-enough pulse in track.\n"); - return; - } - i--; - eodat = i; - adjust = 0; - total = 0; - totaldiv = 0; - init_array(standard_MFM_2_bit_cell_size, 2); - bitoffset = 0; - ref_pulse = 0; - outstep = 0; - while (outstep < 2) { - - /* calculates the current average bitrate from previous decoded data */ - uae_u32 avg_size = (total << 3) / totaldiv; /* this is the new average size for one MFM bit */ - /* uae_u32 avg_size = (uae_u32)((((float)total)*8.0) / ((float)totaldiv)); */ - /* you can try tighter ranges than 25%, or wider ranges. I would probably go for tighter... */ - if ((avg_size < (standard_MFM_8_bit_cell_size - (pulse_limitval * standard_MFM_8_bit_cell_size / 100))) || - (avg_size > (standard_MFM_8_bit_cell_size + (pulse_limitval * standard_MFM_8_bit_cell_size / 100)))) { - avg_size = standard_MFM_8_bit_cell_size; - } - /* this is to prevent the average value from going too far - * from the theoretical value, otherwise it could progressively go to (2 * - * real value), or (real value / 2), etc. */ - - /* gets the next long-enough pulse (this may require more than one pulse) */ - pulse = 0; - while (pulse < ((avg_size / 4) - (avg_size / 16))) { - int indx; - i++; - if (i >= pulses) - i = 0; - indx = idx[i]; - if (rand() <= (indx * RAND_MAX) / maxidx) { - pulse += avgp[i] - ref_pulse; - if (indx >= maxidx) - ref_pulse = 0; - else - ref_pulse = avgp[i]; - } - if (i == eodat) - outstep++; - if (outstep == 1 && indexoffset == i) - *indexoffsetp = bitoffset; - } - - /* gets the size in bits from the pulse width, considering the current average bitrate */ - adjusted_pulse = pulse; - real_size = 0; - while (adjusted_pulse >= avg_size) { - real_size += 4; - adjusted_pulse -= avg_size / 2; - } - adjusted_pulse <<= 3; - while (adjusted_pulse >= ((avg_size * 4) + (avg_size / 4))) { - real_size += 2; - adjusted_pulse -= avg_size * 2; - } - if (adjusted_pulse >= ((avg_size * 3) + (avg_size / 4))) { - if (adjusted_pulse <= ((avg_size * 4) - (avg_size / 4))) { - if ((2 * ((adjusted_pulse >> 2) - adjust)) <= ((2 * avg_size) - (avg_size / 4))) - real_size += 3; - else - real_size += 4; - } else - real_size += 4; - } else { - if (adjusted_pulse > ((avg_size * 3) - (avg_size / 4))) { - real_size += 3; - } else { - if (adjusted_pulse >= ((avg_size * 2) + (avg_size / 4))) { - if ((2 * ((adjusted_pulse >> 2) - adjust)) < (avg_size + (avg_size / 4))) - real_size += 2; - else - real_size += 3; - } else - real_size += 2; - } - } - - if (outstep == 1) { - for (j = real_size; j > 1; j--) - addbit (d, 0); - addbit (d, 1); - for (j = 0; j < real_size; j++) - *pt++ = (uae_u16)(pulse / real_size); - } - - /* prepares for the next pulse */ - adjust = ((real_size * avg_size)/8) - pulse; - total -= psarray[array_index].size; - totaldiv -= psarray[array_index].number_of_bits; - psarray[array_index].size = pulse; - psarray[array_index].number_of_bits = real_size; - total += pulse; - totaldiv += real_size; - array_index++; - if (array_index >= FDI_MAX_ARRAY) - array_index = 0; - } - - fdi->out = bitoffset; -} - -#else - -static void -fdi2_decode(FDI *fdi, uint32_t totalavg, uae_u32 *avgp, uae_u32 *minp, uae_u32 *maxp, uae_u8 *idx, int maxidx, int *indexoffsetp, int pulses, int mfm) +static void fdi2_decode (FDI *fdi, uint32_t totalavg, uint32_t *avgp, uint32_t *minp, uint32_t *maxp, uint8_t *idx, int maxidx, int *indexoffsetp, int pulses, int mfm) { uint32_t adjust; uint32_t adjusted_pulse; uint32_t standard_MFM_2_bit_cell_size = totalavg / 50000; uint32_t standard_MFM_8_bit_cell_size = totalavg / 12500; - int real_size, i, j, nexti, eodat, outstep, randval; - int indexoffset = *indexoffsetp; - uae_u8 *d = fdi->track_dst_buffer; - uae_u16 *pt = fdi->track_dst_buffer_timing; - uae_u32 ref_pulse, pulse; - long jitter; + int real_size, i, j, eodat, outstep; + int indexoffset = *indexoffsetp; + uint8_t *d = fdi->track_dst_buffer; + uint16_t *pt = fdi->track_dst_buffer_timing; + uint32_t ref_pulse, pulse; + + /* detects a long-enough stable pulse coming just after another stable pulse */ + i = 1; + while ( (i < pulses) && ( (idx[i] < maxidx) + || (idx[i - 1] < maxidx) + || (avgp[i] < (standard_MFM_2_bit_cell_size - (standard_MFM_2_bit_cell_size / 4))) ) ) + i++; + if (i == pulses) { + fdi2raw_log("No stable and long-enough pulse in track.\n"); + return; + } + i--; + eodat = i; + adjust = 0; + total = 0; + totaldiv = 0; + init_array(standard_MFM_2_bit_cell_size, 2); + bitoffset = 0; + ref_pulse = 0; + outstep = 0; + while (outstep < 2) { + + /* calculates the current average bitrate from previous decoded data */ + uint32_t avg_size = (total << 3) / totaldiv; /* this is the new average size for one MFM bit */ + /* uint32_t avg_size = (uint32_t)((((float)total)*8.0) / ((float)totaldiv)); */ + /* you can try tighter ranges than 25%, or wider ranges. I would probably go for tighter... */ + if ((avg_size < (standard_MFM_8_bit_cell_size - (pulse_limitval * standard_MFM_8_bit_cell_size / 100))) || + (avg_size > (standard_MFM_8_bit_cell_size + (pulse_limitval * standard_MFM_8_bit_cell_size / 100)))) { + avg_size = standard_MFM_8_bit_cell_size; + } + /* this is to prevent the average value from going too far + * from the theoretical value, otherwise it could progressively go to (2 * + * real value), or (real value / 2), etc. */ + + /* gets the next long-enough pulse (this may require more than one pulse) */ + pulse = 0; + while (pulse < ((avg_size / 4) - (avg_size / 16))) { + int indx; + i++; + if (i >= pulses) + i = 0; + indx = idx[i]; + if (rand() <= (indx * RAND_MAX) / maxidx) { + pulse += avgp[i] - ref_pulse; + if (indx >= maxidx) + ref_pulse = 0; + else + ref_pulse = avgp[i]; + } + if (i == eodat) + outstep++; + if (outstep == 1 && indexoffset == i) + *indexoffsetp = bitoffset; + } + + /* gets the size in bits from the pulse width, considering the current average bitrate */ + adjusted_pulse = pulse; + real_size = 0; + while (adjusted_pulse >= avg_size) { + real_size += 4; + adjusted_pulse -= avg_size / 2; + } + adjusted_pulse <<= 3; + while (adjusted_pulse >= ((avg_size * 4) + (avg_size / 4))) { + real_size += 2; + adjusted_pulse -= avg_size * 2; + } + if (adjusted_pulse >= ((avg_size * 3) + (avg_size / 4))) { + if (adjusted_pulse <= ((avg_size * 4) - (avg_size / 4))) { + if ((2 * ((adjusted_pulse >> 2) - adjust)) <= ((2 * avg_size) - (avg_size / 4))) + real_size += 3; + else + real_size += 4; + } else + real_size += 4; + } else { + if (adjusted_pulse > ((avg_size * 3) - (avg_size / 4))) { + real_size += 3; + } else { + if (adjusted_pulse >= ((avg_size * 2) + (avg_size / 4))) { + if ((2 * ((adjusted_pulse >> 2) - adjust)) < (avg_size + (avg_size / 4))) + real_size += 2; + else + real_size += 3; + } else + real_size += 2; + } + } + + if (outstep == 1) { + for (j = real_size; j > 1; j--) + addbit (d, 0); + addbit (d, 1); + for (j = 0; j < real_size; j++) + *pt++ = (uint16_t)(pulse / real_size); + } + + /* prepares for the next pulse */ + adjust = ((real_size * avg_size)/8) - pulse; + total -= psarray[array_index].size; + totaldiv -= psarray[array_index].number_of_bits; + psarray[array_index].size = pulse; + psarray[array_index].number_of_bits = real_size; + total += pulse; + totaldiv += real_size; + array_index++; + if (array_index >= FDI_MAX_ARRAY) + array_index = 0; + } + + fdi->out = bitoffset; +} + +#else + +static void +fdi2_decode(FDI *fdi, uint32_t totalavg, uint32_t *avgp, uint32_t *minp, uint32_t *maxp, uint8_t *idx, int maxidx, int *indexoffsetp, int pulses, int mfm) +{ + uint32_t adjust; + uint32_t adjusted_pulse; + uint32_t standard_MFM_2_bit_cell_size = totalavg / 50000; + uint32_t standard_MFM_8_bit_cell_size = totalavg / 12500; + int real_size, i, j, nexti, eodat, outstep, randval; + int indexoffset = *indexoffsetp; + uint8_t *d = fdi->track_dst_buffer; + uint16_t *pt = fdi->track_dst_buffer_timing; + uint32_t ref_pulse, pulse; + int32_t jitter; /* detects a long-enough stable pulse coming just after another stable pulse */ i = 1; @@ -1698,20 +1701,20 @@ fdi2_decode(FDI *fdi, uint32_t totalavg, uae_u32 *avgp, uae_u32 *minp, uae_u32 * while (outstep < 2) { /* calculates the current average bitrate from previous decoded data */ - uae_u32 avg_size = (total << (2 + mfm)) / totaldiv; /* this is the new average size for one MFM bit */ - /* uae_u32 avg_size = (uae_u32)((((float)total)*((float)(mfm+1))*4.0) / ((float)totaldiv)); */ + uint32_t avg_size = (uint32_t) ((total << (2 + mfm)) / totaldiv); /* this is the new average size for one MFM bit */ + /* uint32_t avg_size = (uint32_t)((((float)total)*((float)(mfm+1))*4.0) / ((float)totaldiv)); */ /* you can try tighter ranges than 25%, or wider ranges. I would probably go for tighter... */ if ((avg_size < (standard_MFM_8_bit_cell_size - (pulse_limitval * standard_MFM_8_bit_cell_size / 100))) || (avg_size > (standard_MFM_8_bit_cell_size + (pulse_limitval * standard_MFM_8_bit_cell_size / 100)))) { avg_size = standard_MFM_8_bit_cell_size; } - /* this is to prevent the average value from going too far + /* this is to prevent the average value from going too far * from the theoretical value, otherwise it could progressively go to (2 * * real value), or (real value / 2), etc. */ /* gets the next long-enough pulse (this may require more than one pulse) */ pulse = 0; while (pulse < ((avg_size / 4) - (avg_size / 16))) { - uae_u32 avg_pulse, min_pulse, max_pulse; + uint32_t avg_pulse, min_pulse, max_pulse; i++; if (i >= pulses) i = 0; @@ -1739,7 +1742,7 @@ fdi2_decode(FDI *fdi, uint32_t totalavg, uae_u32 *avgp, uae_u32 *minp, uae_u32 * randval = rand(); if (randval < (RAND_MAX / 2)) { if (randval > (RAND_MAX / 4)) { - if (randval <= (((3LL * RAND_MAX) / 8))) + if (randval <= (((3LL * (uint64_t) RAND_MAX) / 8))) randval = (2 * randval) - (RAND_MAX / 4); else randval = (4 * randval) - RAND_MAX; @@ -1748,7 +1751,7 @@ fdi2_decode(FDI *fdi, uint32_t totalavg, uae_u32 *avgp, uae_u32 *minp, uae_u32 * } else { randval -= RAND_MAX / 2; if (randval > (RAND_MAX / 4)) { - if (randval <= (((3LL * RAND_MAX) / 8))) + if (randval <= (((3LL * (uint64_t) RAND_MAX) / 8))) randval = (2 * randval) - (RAND_MAX / 4); else randval = (4 * randval) - RAND_MAX; @@ -1774,7 +1777,7 @@ fdi2_decode(FDI *fdi, uint32_t totalavg, uae_u32 *avgp, uae_u32 *minp, uae_u32 * randval = rand(); if (randval < (RAND_MAX / 2)) { if (randval > (RAND_MAX / 4)) { - if (randval <= (((3LL * RAND_MAX) / 8))) + if (randval <= (((3LL * (uint64_t) RAND_MAX) / 8))) randval = (2 * randval) - (RAND_MAX / 4); else randval = (4 * randval) - RAND_MAX; @@ -1783,7 +1786,7 @@ fdi2_decode(FDI *fdi, uint32_t totalavg, uae_u32 *avgp, uae_u32 *minp, uae_u32 * } else { randval -= RAND_MAX / 2; if (randval > (RAND_MAX / 4)) { - if (randval <= (((3LL * RAND_MAX) / 8))) + if (randval <= (((3LL * (uint64_t) RAND_MAX) / 8))) randval = (2 * randval) - (RAND_MAX / 4); else randval = (4 * randval) - RAND_MAX; @@ -1872,7 +1875,7 @@ fdi2_decode(FDI *fdi, uint32_t totalavg, uae_u32 *avgp, uae_u32 *minp, uae_u32 * addbit(d, 0); addbit(d, 1); for (j = 0; j < real_size; j++) - *pt++ = (uae_u16) (pulse / real_size); + *pt++ = (uint16_t) (pulse / real_size); } /* prepares for the next pulse */ @@ -1894,11 +1897,11 @@ fdi2_decode(FDI *fdi, uint32_t totalavg, uae_u32 *avgp, uae_u32 *minp, uae_u32 * #endif static void -fdi2_celltiming(FDI *fdi, uint32_t totalavg, int bitoffset, uae_u16 *out) +fdi2_celltiming(FDI *fdi, uint32_t totalavg, int bitoffset, uint16_t *out) { - uae_u16 *pt2, *pt; - double avg_bit_len; - int i; + uint16_t *pt2, *pt; + double avg_bit_len; + int i; avg_bit_len = (double) totalavg / (double) bitoffset; pt2 = fdi->track_dst_buffer_timing; @@ -1906,7 +1909,7 @@ fdi2_celltiming(FDI *fdi, uint32_t totalavg, int bitoffset, uae_u16 *out) for (i = 0; i < bitoffset / 8; i++) { double v = (pt2[0] + pt2[1] + pt2[2] + pt2[3] + pt2[4] + pt2[5] + pt2[6] + pt2[7]) / 8.0; v = 1000.0 * v / avg_bit_len; - *pt++ = (uae_u16) v; + *pt++ = (uint16_t) v; pt2 += 8; } *pt++ = out[0]; @@ -1916,14 +1919,14 @@ fdi2_celltiming(FDI *fdi, uint32_t totalavg, int bitoffset, uae_u16 *out) static int decode_lowlevel_track(FDI *fdi, int track, struct fdi_cache *cache) { - uae_u8 *p1; - uae_u32 *p2; - uae_u32 *avgp, *minp = 0, *maxp = 0; - uae_u8 *idxp = 0; - uae_u32 maxidx, totalavg, weakbits; - int i, j, len, pulses, indexoffset; - int avg_free, min_free = 0, max_free = 0, idx_free; - int idx_off1 = 0, idx_off2 = 0, idx_off3 = 0; + uint8_t *p1; + uint32_t *p2; + uint32_t *avgp, *minp = 0, *maxp = 0; + uint8_t *idxp = 0; + uint32_t maxidx, totalavg, weakbits; + int i, j, len, pulses, indexoffset; + int avg_free, min_free = 0, max_free = 0, idx_free; + int idx_off1 = 0, idx_off2 = 0, idx_off3 = 0; p1 = fdi->track_src; pulses = get_u32(p1); @@ -1931,15 +1934,15 @@ decode_lowlevel_track(FDI *fdi, int track, struct fdi_cache *cache) return -1; p1 += 4; len = 12; - avgp = (uae_u32 *) fdi_decompress(pulses, p1 + 0, p1 + len, &avg_free); - dumpstream(track, (uae_u8 *) avgp, pulses); + avgp = (uint32_t *) fdi_decompress(pulses, p1 + 0, p1 + len, &avg_free); + dumpstream(track, (uint8_t *) avgp, pulses); len += get_u24(p1 + 0) & 0x3fffff; if (!avgp) return -1; if (get_u24(p1 + 3) && get_u24(p1 + 6)) { - minp = (uae_u32 *) fdi_decompress(pulses, p1 + 3, p1 + len, &min_free); + minp = (uint32_t *) fdi_decompress(pulses, p1 + 3, p1 + len, &min_free); len += get_u24(p1 + 3) & 0x3fffff; - maxp = (uae_u32 *) fdi_decompress(pulses, p1 + 6, p1 + len, &max_free); + maxp = (uint32_t *) fdi_decompress(pulses, p1 + 6, p1 + len, &max_free); len += get_u24(p1 + 6) & 0x3fffff; /* Computes the real min and max values */ for (i = 0; i < pulses; i++) { @@ -2048,7 +2051,7 @@ decode_lowlevel_track(FDI *fdi, int track, struct fdi_cache *cache) } static unsigned char fdiid[] = { "Formatted Disk Image file" }; -static int bit_rate_table[16] = { 125, 150, 250, 300, 500, 1000 }; +static int bit_rate_table[16] = { 125, 150, 250, 300, 500, 1000 }; void fdi2raw_header_free(FDI *fdi) @@ -2106,13 +2109,13 @@ fdi2raw_get_bit_rate(FDI *fdi) return fdi->bit_rate; } -int +FDI2RawDiskType fdi2raw_get_type(FDI *fdi) { return fdi->disk_type; } -int +bool fdi2raw_get_write_protect(FDI *fdi) { return fdi->write_protect; @@ -2127,9 +2130,9 @@ fdi2raw_get_tpi(FDI *fdi) FDI * fdi2raw_header(FILE *f) { - int i, offset, oldseek; - uae_u8 type, size; - FDI *fdi; + long i, offset, oldseek; + uint8_t type, size; + FDI *fdi; fdi2raw_log("ALLOC: memory allocated %d\n", fdi_allocated); fdi = fdi_malloc(sizeof(FDI)); @@ -2167,7 +2170,7 @@ fdi2raw_header(FILE *f) fdi->last_head = fdi->header[144]; fdi->disk_type = fdi->header[145]; fdi->rotation_speed = fdi->header[146] + 128; - fdi->write_protect = fdi->header[147] & 1; + fdi->write_protect = !!(fdi->header[147] & 1); fdi2raw_log("FDI version %d.%d\n", fdi->header[140], fdi->header[141]); fdi2raw_log("last_track=%d rotation_speed=%d\n", fdi->last_track, fdi->rotation_speed); @@ -2197,8 +2200,8 @@ fdi2raw_header(FILE *f) return fdi; } -int -fdi2raw_loadrevolution_2(FDI *fdi, uae_u16 *mfmbuf, uae_u16 *tracktiming, int track, int *tracklength, int *indexoffsetp, int *multirev, int mfm) +static int +fdi2raw_loadrevolution_2(FDI *fdi, uint16_t *mfmbuf, uint16_t *tracktiming, int track, int *tracklength, int *indexoffsetp, int *multirev, int mfm) { struct fdi_cache *cache = &fdi->cache[track]; int len, i, idx; @@ -2216,8 +2219,8 @@ fdi2raw_loadrevolution_2(FDI *fdi, uae_u16 *mfmbuf, uae_u16 *tracktiming, int tr *tracklength = len; for (i = 0; i < (len + 15) / (2 * 8); i++) { - uae_u8 *data = fdi->track_dst_buffer + i * 2; - *mfmbuf++ = 256 * *data + *(data + 1); + uint8_t *data = fdi->track_dst_buffer + i * 2; + *mfmbuf++ = 256 * *data + *(data + 1); } fdi2_celltiming(fdi, cache->totalavg, len, tracktiming); if (indexoffsetp) @@ -2226,18 +2229,20 @@ fdi2raw_loadrevolution_2(FDI *fdi, uae_u16 *mfmbuf, uae_u16 *tracktiming, int tr } int -fdi2raw_loadrevolution(FDI *fdi, uae_u16 *mfmbuf, uae_u16 *tracktiming, int track, int *tracklength, int mfm) +fdi2raw_loadrevolution(FDI *fdi, uint16_t *mfmbuf, uint16_t *tracktiming, int track, int *tracklength, int mfm) { + track ^= fdi->reversed_side; return fdi2raw_loadrevolution_2(fdi, mfmbuf, tracktiming, track, tracklength, 0, 0, mfm); } int -fdi2raw_loadtrack(FDI *fdi, uae_u16 *mfmbuf, uae_u16 *tracktiming, int track, int *tracklength, int *indexoffsetp, int *multirev, int mfm) +fdi2raw_loadtrack(FDI *fdi, uint16_t *mfmbuf, uint16_t *tracktiming, int track, int *tracklength, int *indexoffsetp, int *multirev, int mfm) { - uae_u8 *p; + uint8_t *p; int outlen, i; struct fdi_cache *cache = &fdi->cache[track]; + track ^= fdi->reversed_side; if (cache->lowlevel) return fdi2raw_loadrevolution_2(fdi, mfmbuf, tracktiming, track, tracklength, indexoffsetp, multirev, mfm); @@ -2305,8 +2310,8 @@ fdi2raw_loadtrack(FDI *fdi, uae_u16 *mfmbuf, uae_u16 *tracktiming, int track, in return fdi2raw_loadrevolution_2(fdi, mfmbuf, tracktiming, track, tracklength, indexoffsetp, multirev, mfm); *tracklength = fdi->out; for (i = 0; i < ((*tracklength) + 15) / (2 * 8); i++) { - uae_u8 *data = fdi->track_dst_buffer + i * 2; - *mfmbuf++ = 256 * *data + *(data + 1); + uint8_t *data = fdi->track_dst_buffer + i * 2; + *mfmbuf++ = 256 * *data + *(data + 1); } } return outlen; diff --git a/src/game/CMakeLists.txt b/src/game/CMakeLists.txt index 5ed136de5..83dcd4836 100644 --- a/src/game/CMakeLists.txt +++ b/src/game/CMakeLists.txt @@ -10,7 +10,7 @@ # # Authors: David Hrdlička, # -# Copyright 2020,2021 David Hrdlička. +# Copyright 2020-2021 David Hrdlička. # add_library(game OBJECT gameport.c joystick_standard.c diff --git a/src/game/gameport.c b/src/game/gameport.c index ab8422070..f3557d158 100644 --- a/src/game/gameport.c +++ b/src/game/gameport.c @@ -11,7 +11,7 @@ * * * Authors: Miran Grca, - * Sarah Walker, + * Sarah Walker, * RichardG, * * Copyright 2016-2018 Miran Grca. diff --git a/src/game/joystick_ch_flightstick_pro.c b/src/game/joystick_ch_flightstick_pro.c index 0741e0360..f5785d6f4 100644 --- a/src/game/joystick_ch_flightstick_pro.c +++ b/src/game/joystick_ch_flightstick_pro.c @@ -11,7 +11,7 @@ * * * Authors: Miran Grca, - * Sarah Walker, + * Sarah Walker, * * Copyright 2016-2018 Miran Grca. * Copyright 2008-2018 Sarah Walker. diff --git a/src/game/joystick_standard.c b/src/game/joystick_standard.c index 71c354945..55a28acee 100644 --- a/src/game/joystick_standard.c +++ b/src/game/joystick_standard.c @@ -11,7 +11,7 @@ * * * Authors: Miran Grca, - * Sarah Walker, + * Sarah Walker, * * Copyright 2016-2018 Miran Grca. * Copyright 2008-2018 Sarah Walker. diff --git a/src/game/joystick_sw_pad.c b/src/game/joystick_sw_pad.c index 647ca6a74..26e26474b 100644 --- a/src/game/joystick_sw_pad.c +++ b/src/game/joystick_sw_pad.c @@ -32,7 +32,7 @@ * * * Authors: Miran Grca, - * Sarah Walker, + * Sarah Walker, * * Copyright 2016-2018 Miran Grca. * Copyright 2008-2018 Sarah Walker. diff --git a/src/game/joystick_tm_fcs.c b/src/game/joystick_tm_fcs.c index 4364a432f..7bcb15742 100644 --- a/src/game/joystick_tm_fcs.c +++ b/src/game/joystick_tm_fcs.c @@ -11,7 +11,7 @@ * * * Authors: Miran Grca, - * Sarah Walker, + * Sarah Walker, * * Copyright 2016-2018 Miran Grca. * Copyright 2008-2018 Sarah Walker. diff --git a/src/include/86box/apm.h b/src/include/86box/apm.h index 2676fa198..854969f3d 100644 --- a/src/include/86box/apm.h +++ b/src/include/86box/apm.h @@ -1,18 +1,18 @@ /* - * 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. * - * Definitions for the Advanced Power Management emulation. + * Definitions for the Advanced Power Management emulation. * * * - * Authors: Miran Grca, + * Authors: Miran Grca, * - * Copyright 2019 Miran Grca. + * Copyright 2019 Miran Grca. */ #ifndef APM_H #define APM_H diff --git a/src/include/86box/bswap.h b/src/include/86box/bswap.h index 22d25cf4a..9f3c51917 100644 --- a/src/include/86box/bswap.h +++ b/src/include/86box/bswap.h @@ -13,7 +13,7 @@ * Authors: Fred N. van Kempen, * neozeed, * - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. * Copyright 2016-2018 neozeed. * * This program is free software; you can redistribute it and/or modify diff --git a/src/include/86box/bugger.h b/src/include/86box/bugger.h index b0a6a5469..57dabd172 100644 --- a/src/include/86box/bugger.h +++ b/src/include/86box/bugger.h @@ -1,25 +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. + * 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. * - * Implementation of the ISA Bus (de)Bugger expansion card - * sold as a DIY kit in the late 1980's in The Netherlands. - * This card was a assemble-yourself 8bit ISA addon card for - * PC and AT systems that had several tools to aid in low- - * level debugging (mostly for faulty BIOSes, bootloaders - * and system kernels...) + * Implementation of the ISA Bus (de)Bugger expansion card + * sold as a DIY kit in the late 1980's in The Netherlands. + * This card was a assemble-yourself 8bit ISA addon card for + * PC and AT systems that had several tools to aid in low- + * level debugging (mostly for faulty BIOSes, bootloaders + * and system kernels...) * - * Definitions for the BUGGER card. + * Definitions for the BUGGER card. * * * - * Author: Fred N. van Kempen, + * Authors: Fred N. van Kempen, * - * Copyright 1989-2018 Fred N. van Kempen. + * Copyright 1989-2018 Fred N. van Kempen. */ #ifndef BUGGER_H #define BUGGER_H diff --git a/src/include/86box/cartridge.h b/src/include/86box/cartridge.h index c07fe1cfd..2fa0a9358 100644 --- a/src/include/86box/cartridge.h +++ b/src/include/86box/cartridge.h @@ -1,18 +1,18 @@ /* - * 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. * - * Definitions for the PCjr cartridge emulation. + * Definitions for the PCjr cartridge emulation. * * * - * Authors: Miran Grca, + * Authors: Miran Grca, * - * Copyright 2021 Miran Grca. + * Copyright 2021 Miran Grca. */ #ifndef EMU_CARTRIDGE_H #define EMU_CARTRIDGE_H diff --git a/src/include/86box/cdrom.h b/src/include/86box/cdrom.h index ca7bcb2a1..28e9cf14b 100644 --- a/src/include/86box/cdrom.h +++ b/src/include/86box/cdrom.h @@ -1,16 +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. + * 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. * - * Generic CD-ROM drive core header. + * Generic CD-ROM drive core header. * - * Author: Miran Grca, + * Authors: Miran Grca, * - * Copyright 2016-2019 Miran Grca. + * Copyright 2016-2019 Miran Grca. */ #ifndef EMU_CDROM_H #define EMU_CDROM_H diff --git a/src/include/86box/cdrom_image.h b/src/include/86box/cdrom_image.h index b43e8cee3..c848af50d 100644 --- a/src/include/86box/cdrom_image.h +++ b/src/include/86box/cdrom_image.h @@ -1,19 +1,19 @@ /* - * 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. * - * CD-ROM image file handling module header, translated to C - * from cdrom_dosbox.h. + * CD-ROM image file handling module header, translated to C + * from cdrom_dosbox.h. * - * Authors: RichardG, - * Miran Grca, + * Authors: RichardG, + * Miran Grca, * - * Copyright 2016-2022 RichardG. - * Copyright 2016-2022 Miran Grca. + * Copyright 2016-2022 RichardG. + * Copyright 2016-2022 Miran Grca. */ #ifndef CDROM_IMAGE_H #define CDROM_IMAGE_H diff --git a/src/include/86box/cdrom_image_backend.h b/src/include/86box/cdrom_image_backend.h index 2a581624d..511ca68eb 100644 --- a/src/include/86box/cdrom_image_backend.h +++ b/src/include/86box/cdrom_image_backend.h @@ -1,21 +1,21 @@ /* - * 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. * - * CD-ROM image file handling module header , translated to C - * from cdrom_dosbox.h. + * CD-ROM image file handling module header , translated to C + * from cdrom_dosbox.h. * - * Authors: Miran Grca, - * Fred N. van Kempen, - * The DOSBox Team, + * Authors: Miran Grca, + * Fred N. van Kempen, + * The DOSBox Team, * - * Copyright 2016-2020 Miran Grca. - * Copyright 2017-2020 Fred N. van Kempen. - * Copyright 2002-2020 The DOSBox Team. + * Copyright 2016-2020 Miran Grca. + * Copyright 2017-2020 Fred N. van Kempen. + * Copyright 2002-2020 The DOSBox Team. */ #ifndef CDROM_IMAGE_BACKEND_H #define CDROM_IMAGE_BACKEND_H diff --git a/src/include/86box/cdrom_mitsumi.h b/src/include/86box/cdrom_mitsumi.h index 747668c5d..0b8a3a250 100644 --- a/src/include/86box/cdrom_mitsumi.h +++ b/src/include/86box/cdrom_mitsumi.h @@ -1,18 +1,18 @@ /* - * 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. * - * Mitsumi CD-ROM emulation for the ISA bus. + * Mitsumi CD-ROM emulation for the ISA bus. * * * - * Author: Miran Grca, + * Authors: Miran Grca, * - * Copyright 2022 Miran Grca. + * Copyright 2022 Miran Grca. */ #ifndef CDROM_MITSUMI_H #define CDROM_MITSUMI_H diff --git a/src/include/86box/chipset.h b/src/include/86box/chipset.h index f76028d78..0a3e988f6 100644 --- a/src/include/86box/chipset.h +++ b/src/include/86box/chipset.h @@ -12,7 +12,7 @@ * * Authors: Miran Grca, * - * Copyright 2019,2020 Miran Grca. + * Copyright 2019-2020 Miran Grca. */ #ifndef EMU_CHIPSET_H #define EMU_CHIPSET_H diff --git a/src/include/86box/clock.h b/src/include/86box/clock.h index 813c21af7..10155eabc 100644 --- a/src/include/86box/clock.h +++ b/src/include/86box/clock.h @@ -1,18 +1,18 @@ /* - * 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. * - * Definitions for clock generator chips. + * Definitions for clock generator chips. * * * - * Authors: RichardG, + * Authors: RichardG, * - * Copyright 2020 RichardG. + * Copyright 2020 RichardG. */ #ifndef EMU_CLOCK_H #define EMU_CLOCK_H diff --git a/src/include/86box/config.h b/src/include/86box/config.h index dd873d168..9738b049b 100644 --- a/src/include/86box/config.h +++ b/src/include/86box/config.h @@ -16,7 +16,7 @@ * Overdoze, * * Copyright 2008-2017 Sarah Walker. - * Copyright 2016,2017 Miran Grca. + * Copyright 2016-2017 Miran Grca. * Copyright 2017 Fred N. van Kempen. */ #ifndef EMU_CONFIG_H diff --git a/src/include/86box/ddma.h b/src/include/86box/ddma.h index 1f422ab65..ccc423d27 100644 --- a/src/include/86box/ddma.h +++ b/src/include/86box/ddma.h @@ -1,18 +1,18 @@ /* - * 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. * - * Definitions for the Distributed DMA emulation. + * Definitions for the Distributed DMA emulation. * * * - * Authors: Miran Grca, + * Authors: Miran Grca, * - * Copyright 2020 Miran Grca. + * Copyright 2020 Miran Grca. */ #ifndef DDMA_H #define DDMA_H diff --git a/src/include/86box/device.h b/src/include/86box/device.h index 9f0a5f864..79cbf4d2a 100644 --- a/src/include/86box/device.h +++ b/src/include/86box/device.h @@ -12,7 +12,7 @@ * * Authors: Fred N. van Kempen, * Miran Grca, - * Sarah Walker, + * Sarah Walker, * * Copyright 2017-2019 Fred N. van Kempen. * Copyright 2016-2019 Miran Grca. diff --git a/src/include/86box/discord.h b/src/include/86box/discord.h index 9a1467e08..358c95c9b 100644 --- a/src/include/86box/discord.h +++ b/src/include/86box/discord.h @@ -1,18 +1,18 @@ /* - * 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. * - * Definitions for the Discord integration module. + * Definitions for the Discord integration module. * * * - * Authors: David Hrdlička, + * Authors: David Hrdlička, * - * Copyright 2019 David Hrdlička. + * Copyright 2019 David Hrdlička. */ #ifndef WIN_DISCORD_H #define WIN_DISCORD_H diff --git a/src/include/86box/dma.h b/src/include/86box/dma.h index f7a516a61..904d0b13b 100644 --- a/src/include/86box/dma.h +++ b/src/include/86box/dma.h @@ -12,7 +12,7 @@ * * Authors: Fred N. van Kempen, * Miran Grca, - * Sarah Walker, + * Sarah Walker, * * Copyright 2017-2020 Fred N. van Kempen. * Copyright 2016-2020 Miran Grca. diff --git a/src/include/86box/fdc.h b/src/include/86box/fdc.h index ec3136baa..e68c5d463 100644 --- a/src/include/86box/fdc.h +++ b/src/include/86box/fdc.h @@ -11,7 +11,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/include/86box/fdc_ext.h b/src/include/86box/fdc_ext.h index 2287978c1..106235658 100644 --- a/src/include/86box/fdc_ext.h +++ b/src/include/86box/fdc_ext.h @@ -1,23 +1,23 @@ /* - * 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. * - * Implementation of the NEC uPD-765 and compatible floppy disk - * controller. + * Implementation of the NEC uPD-765 and compatible floppy disk + * controller. * * * - * Authors: Sarah Walker, - * Miran Grca, - * Fred N. van Kempen, + * Authors: Sarah Walker, + * Miran Grca, + * Fred N. van Kempen, * - * Copyright 2008-2020 Sarah Walker. - * Copyright 2016-2020 Miran Grca. - * Copyright 2018-2020 Fred N. van Kempen. + * Copyright 2008-2020 Sarah Walker. + * Copyright 2016-2020 Miran Grca. + * Copyright 2018-2020 Fred N. van Kempen. */ #ifndef EMU_FDC_EXT_H #define EMU_FDC_EXT_H diff --git a/src/include/86box/fdd.h b/src/include/86box/fdd.h index f612466b3..19a2141d3 100644 --- a/src/include/86box/fdd.h +++ b/src/include/86box/fdd.h @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/include/86box/fdd_86f.h b/src/include/86box/fdd_86f.h index 88eeb035f..cc8035965 100644 --- a/src/include/86box/fdd_86f.h +++ b/src/include/86box/fdd_86f.h @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Definitions for the 86F floppy image format. + * Definitions for the 86F floppy image format. * * * - * Authors: Miran Grca, - * Fred N. van Kempen, + * Authors: Miran Grca, + * Fred N. van Kempen, * - * Copyright 2016-2019 Miran Grca. - * Copyright 2018,2019 Fred N. van Kempen. + * Copyright 2016-2019 Miran Grca. + * Copyright 2018-2019 Fred N. van Kempen. */ #ifndef EMU_FLOPPY_86F_H #define EMU_FLOPPY_86F_H diff --git a/src/include/86box/fdd_common.h b/src/include/86box/fdd_common.h index 9c6f8853c..7673d9684 100644 --- a/src/include/86box/fdd_common.h +++ b/src/include/86box/fdd_common.h @@ -1,18 +1,18 @@ /* - * 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. * - * Shared code for all the floppy modules. + * Shared code for all the floppy modules. * * * - * Author: Fred N. van Kempen, + * Authors: Fred N. van Kempen, * - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. */ #ifndef FDD_COMMON_H #define FDD_COMMON_H diff --git a/src/include/86box/fdd_fdi.h b/src/include/86box/fdd_fdi.h index b984a8154..6b9461bad 100644 --- a/src/include/86box/fdd_fdi.h +++ b/src/include/86box/fdd_fdi.h @@ -1,23 +1,23 @@ /* - * 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. * - * Implementation of the FDI floppy stream image format - * interface to the FDI2RAW module. + * Implementation of the FDI floppy stream image format + * interface to the FDI2RAW module. * * * - * Authors: Sarah Walker, - * Miran Grca, - * Fred N. van Kempen, + * Authors: Sarah Walker, + * Miran Grca, + * Fred N. van Kempen, * - * Copyright 2008-2018 Sarah Walker. - * Copyright 2016-2018 Miran Grca. - * Copyright 2018 Fred N. van Kempen. + * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. + * Copyright 2018 Fred N. van Kempen. */ #ifndef EMU_FLOPPY_FDI_H #define EMU_FLOPPY_FDI_H diff --git a/src/include/86box/fdd_imd.h b/src/include/86box/fdd_imd.h index 806304093..f50ad865e 100644 --- a/src/include/86box/fdd_imd.h +++ b/src/include/86box/fdd_imd.h @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Definitions for the IMD floppy image format. + * Definitions for the IMD floppy image format. * * * - * Authors: Miran Grca, - * Fred N. van Kempen, + * Authors: Miran Grca, + * Fred N. van Kempen, * - * Copyright 2016-2018 Miran Grca. - * Copyright 2018 Fred N. van Kempen. + * Copyright 2016-2018 Miran Grca. + * Copyright 2018 Fred N. van Kempen. * * 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 diff --git a/src/include/86box/fdd_img.h b/src/include/86box/fdd_img.h index 7c36929c3..f0a639d88 100644 --- a/src/include/86box/fdd_img.h +++ b/src/include/86box/fdd_img.h @@ -1,23 +1,23 @@ /* - * 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. * - * Implementation of the raw sector-based floppy image format, - * as well as the Japanese FDI, CopyQM, and FDF formats. + * Implementation of the raw sector-based floppy image format, + * as well as the Japanese FDI, CopyQM, and FDF formats. * * * - * Authors: Sarah Walker, - * Miran Grca, - * Fred N. van Kempen, + * Authors: Sarah Walker, + * Miran Grca, + * Fred N. van Kempen, * - * Copyright 2008-2018 Sarah Walker. - * Copyright 2016-2018 Miran Grca. - * Copyright 2018 Fred N. van Kempen. + * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. + * Copyright 2018 Fred N. van Kempen. */ #ifndef EMU_FLOPPY_IMG_H #define EMU_FLOPPY_IMG_H diff --git a/src/include/86box/fdd_json.h b/src/include/86box/fdd_json.h index e86aad01a..7f3c9adb4 100644 --- a/src/include/86box/fdd_json.h +++ b/src/include/86box/fdd_json.h @@ -10,7 +10,7 @@ * * Authors: Fred N. van Kempen, * - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. * * Redistribution and use in source and binary forms, with * or without modification, are permitted provided that the diff --git a/src/include/86box/fdd_mfm.h b/src/include/86box/fdd_mfm.h index 36c6e6b8f..3a8494a26 100644 --- a/src/include/86box/fdd_mfm.h +++ b/src/include/86box/fdd_mfm.h @@ -1,18 +1,18 @@ /* - * 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. * - * Implementation of the HxC MFM image format. + * Implementation of the HxC MFM image format. * * * - * Authors: Miran Grca, + * Authors: Miran Grca, * - * Copyright 2018 Miran Grca. + * Copyright 2018 Miran Grca. */ #ifndef EMU_FLOPPY_MFM_H #define EMU_FLOPPY_MFM_H diff --git a/src/include/86box/fdd_td0.h b/src/include/86box/fdd_td0.h index 56ff8f3c8..add6a07dd 100644 --- a/src/include/86box/fdd_td0.h +++ b/src/include/86box/fdd_td0.h @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Definitions for the Teledisk floppy image format. + * Definitions for the Teledisk floppy image format. * * * - * Authors: Miran Grca, - * Fred N. van Kempen, + * Authors: Miran Grca, + * Fred N. van Kempen, * - * Copyright 2016-2018 Miran Grca. - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2016-2018 Miran Grca. + * Copyright 2017-2018 Fred N. van Kempen. */ #ifndef EMU_FLOPPY_TD0_H #define EMU_FLOPPY_TD0_H diff --git a/src/include/86box/gameport.h b/src/include/86box/gameport.h index 07a51edc4..905130da0 100644 --- a/src/include/86box/gameport.h +++ b/src/include/86box/gameport.h @@ -1,22 +1,22 @@ /* - * 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. * - * Definitions for the generic game port handlers. + * Definitions for the generic game port handlers. * * * - * Authors: Miran Grca, - * Sarah Walker, - * RichardG, + * Authors: Miran Grca, + * Sarah Walker, + * RichardG, * - * Copyright 2016-2018 Miran Grca. - * Copyright 2008-2018 Sarah Walker. - * Copyright 2021 RichardG. + * Copyright 2016-2018 Miran Grca. + * Copyright 2008-2018 Sarah Walker. + * Copyright 2021 RichardG. */ #ifndef EMU_GAMEPORT_H #define EMU_GAMEPORT_H diff --git a/src/include/86box/hdc_ide.h b/src/include/86box/hdc_ide.h index da5fe1b32..e7bd8d7cf 100644 --- a/src/include/86box/hdc_ide.h +++ b/src/include/86box/hdc_ide.h @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Implementation of the IDE emulation for hard disks and ATAPI - * CD-ROM devices. + * Implementation of the IDE emulation for hard disks and ATAPI + * CD-ROM devices. * * * - * Authors: Sarah Walker, - * Miran Grca, - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 Miran Grca. + * Authors: Sarah Walker, + * Miran Grca, + * Copyright 2008-2019 Sarah Walker. + * Copyright 2016-2019 Miran Grca. */ #ifndef EMU_IDE_H #define EMU_IDE_H diff --git a/src/include/86box/hdc_ide_sff8038i.h b/src/include/86box/hdc_ide_sff8038i.h index 5533319e1..b411ecf5d 100644 --- a/src/include/86box/hdc_ide_sff8038i.h +++ b/src/include/86box/hdc_ide_sff8038i.h @@ -1,19 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Emulation of the SFF-8038i IDE Bus Master. + * This file is part of the 86Box distribution. * - * Emulation core dispatcher. + * Emulation of the SFF-8038i IDE Bus Master. * * * - * Authors: Sarah Walker, - * Miran Grca, - * Copyright 2008-2020 Sarah Walker. - * Copyright 2016-2020 Miran Grca. + * Authors: Sarah Walker, + * Miran Grca, + * + * Copyright 2008-2020 Sarah Walker. + * Copyright 2016-2020 Miran Grca. */ #ifndef EMU_HDC_IDE_SFF8038I_H diff --git a/src/include/86box/hdd.h b/src/include/86box/hdd.h index abb2aa388..58fff9ffd 100644 --- a/src/include/86box/hdd.h +++ b/src/include/86box/hdd.h @@ -1,19 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Definitions for the hard disk image handler. + * Definitions for the hard disk image handler. * * * - * Authors: Miran Grca, - * Fred N. van Kempen, - * Copyright 2016-2018 Miran Grca. - * Copyright 2017,2018 Fred N. van Kempen. + * Authors: Miran Grca, + * Fred N. van Kempen, + * + * Copyright 2016-2018 Miran Grca. + * Copyright 2017-2018 Fred N. van Kempen. */ #ifndef EMU_HDD_H #define EMU_HDD_H diff --git a/src/include/86box/i2c.h b/src/include/86box/i2c.h index 071e57729..20e2f8b30 100644 --- a/src/include/86box/i2c.h +++ b/src/include/86box/i2c.h @@ -1,18 +1,18 @@ /* - * 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. * - * Definitions for the I2C handler. + * Definitions for the I2C handler. * * * - * Authors: RichardG, + * Authors: RichardG, * - * Copyright 2020 RichardG. + * Copyright 2020 RichardG. */ #ifndef EMU_I2C_H #define EMU_I2C_H diff --git a/src/include/86box/i8080.h b/src/include/86box/i8080.h index 9f85a85c0..a3f3fba64 100644 --- a/src/include/86box/i8080.h +++ b/src/include/86box/i8080.h @@ -1,16 +1,18 @@ /* - * 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. * - * 8080 CPU emulation (header). + * 8080 CPU emulation (header). * - * Authors: Cacodemon345 * - * Copyright 2022 Cacodemon345 + * + * Authors: Cacodemon345 + * + * Copyright 2022 Cacodemon345 */ #include diff --git a/src/include/86box/ibm_5161.h b/src/include/86box/ibm_5161.h index 711773d6d..e189826a8 100644 --- a/src/include/86box/ibm_5161.h +++ b/src/include/86box/ibm_5161.h @@ -1,15 +1,18 @@ /* - * 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. * - * Emulation of the IBM Expansion Unit (5161). + * This file is part of the 86Box distribution. + * + * Emulation of the IBM Expansion Unit (5161). * * * - * Author: Miran Grca, - * Copyright 2016-2018 Miran Grca. + * Authors: Miran Grca, + * + * Copyright 2016-2018 Miran Grca. */ #ifndef EMU_IBM_5161_H diff --git a/src/include/86box/ini.h b/src/include/86box/ini.h index d754d645b..5eca9ab8c 100644 --- a/src/include/86box/ini.h +++ b/src/include/86box/ini.h @@ -10,13 +10,13 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * Overdoze, * * Copyright 2008-2017 Sarah Walker. - * Copyright 2016,2017 Miran Grca. + * Copyright 2016-2017 Miran Grca. * */ #ifndef EMU_INI_H diff --git a/src/include/86box/io.h b/src/include/86box/io.h index 7e7b45912..b80b37a39 100644 --- a/src/include/86box/io.h +++ b/src/include/86box/io.h @@ -1,21 +1,21 @@ /* - * 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. * - * Definitions for the I/O handler. + * Definitions for the I/O handler. * * * - * Authors: Sarah Walker, - * Miran Grca, - * Fred N. van Kempen, + * Authors: Sarah Walker, + * Miran Grca, + * Fred N. van Kempen, * - * Copyright 2008-2017 Sarah Walker. - * Copyright 2016,2017 Miran Grca. + * Copyright 2008-2017 Sarah Walker. + * Copyright 2016-2017 Miran Grca. */ #ifndef EMU_IO_H #define EMU_IO_H diff --git a/src/include/86box/isapnp.h b/src/include/86box/isapnp.h index abf3eb10d..9fff876dc 100644 --- a/src/include/86box/isapnp.h +++ b/src/include/86box/isapnp.h @@ -1,18 +1,18 @@ /* - * 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. * - * Definitions for ISA Plug and Play. + * Definitions for ISA Plug and Play. * * * - * Author: RichardG, + * Authors: RichardG, * - * Copyright 2021 RichardG. + * Copyright 2021 RichardG. */ #ifndef EMU_ISAPNP_H diff --git a/src/include/86box/joystick_ch_flightstick_pro.h b/src/include/86box/joystick_ch_flightstick_pro.h index 5bdedede9..b49800ecb 100644 --- a/src/include/86box/joystick_ch_flightstick_pro.h +++ b/src/include/86box/joystick_ch_flightstick_pro.h @@ -1,20 +1,20 @@ /* - * VARCem Virtual ARchaeological Computer EMulator. - * An emulator of (mostly) x86-based PC systems and devices, - * using the ISA,EISA,VLB,MCA and PCI system buses, roughly - * spanning the era between 1981 and 1995. + * 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 VARCem Project. + * This file is part of the 86Box distribution. * - * Definitions for the Flight Stick Pro driver. + * Definitions for the Flight Stick Pro driver. * * * - * Authors: Miran Grca, - * Sarah Walker, + * Authors: Miran Grca, + * Sarah Walker, * - * Copyright 2016-2018 Miran Grca. - * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. + * Copyright 2008-2018 Sarah Walker. * * 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 diff --git a/src/include/86box/joystick_standard.h b/src/include/86box/joystick_standard.h index ac2b7ea3f..c874677ea 100644 --- a/src/include/86box/joystick_standard.h +++ b/src/include/86box/joystick_standard.h @@ -11,7 +11,7 @@ * * * Authors: Miran Grca, - * Sarah Walker, + * Sarah Walker, * * Copyright 2016-2018 Miran Grca. * Copyright 2008-2018 Sarah Walker. diff --git a/src/include/86box/joystick_sw_pad.h b/src/include/86box/joystick_sw_pad.h index d5aef7ccb..a75d802de 100644 --- a/src/include/86box/joystick_sw_pad.h +++ b/src/include/86box/joystick_sw_pad.h @@ -6,12 +6,12 @@ * * This file is part of the 86Box distribution. * - * Definitions for the Sidewinder Pro driver. + * Definitions for the Sidewinder Pro driver. * * * * Authors: Miran Grca, - * Sarah Walker, + * Sarah Walker, * * Copyright 2016-2018 Miran Grca. * Copyright 2008-2018 Sarah Walker. diff --git a/src/include/86box/joystick_tm_fcs.h b/src/include/86box/joystick_tm_fcs.h index 74b3edd2e..65e734a40 100644 --- a/src/include/86box/joystick_tm_fcs.h +++ b/src/include/86box/joystick_tm_fcs.h @@ -6,12 +6,12 @@ * * This file is part of the 86Box distribution. * - * Definitions for the Flight Control System driver. + * Definitions for the Flight Control System driver. * * * * Authors: Miran Grca, - * Sarah Walker, + * Sarah Walker, * * Copyright 2016-2018 Miran Grca. * Copyright 2008-2018 Sarah Walker. diff --git a/src/include/86box/keyboard.h b/src/include/86box/keyboard.h index 0e384b39b..db18ac789 100644 --- a/src/include/86box/keyboard.h +++ b/src/include/86box/keyboard.h @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/include/86box/language.h b/src/include/86box/language.h index 90bfecc06..8db604efc 100644 --- a/src/include/86box/language.h +++ b/src/include/86box/language.h @@ -1,21 +1,19 @@ /* - * 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. * - * Definitions for the language management module. - * - * NOTE: FIXME: Strings 2176 and 2193 are same. + * Definitions for the language management module. * * * - * Author: Fred N. van Kempen, + * Authors: Fred N. van Kempen, * - * Copyright 2017,2018 Fred N. van Kempen. - * Copyright 2022 Jasmine Iwanek. + * Copyright 2017-2018 Fred N. van Kempen. + * Copyright 2022 Jasmine Iwanek. */ #ifndef LANG_UAGE_H diff --git a/src/include/86box/log.h b/src/include/86box/log.h index b736ef2b6..9d3568069 100644 --- a/src/include/86box/log.h +++ b/src/include/86box/log.h @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Main include file for the application. + * Main include file for the application. * * * - * Authors: Miran Grca, - * Fred N. van Kempen, + * Authors: Miran Grca, + * Fred N. van Kempen, * - * Copyright 2021 Miran Grca. - * Copyright 2021 Fred N. van Kempen. + * Copyright 2021 Miran Grca. + * Copyright 2021 Fred N. van Kempen. */ #ifndef EMU_LOG_H diff --git a/src/include/86box/lpt.h b/src/include/86box/lpt.h index 87bd90d48..cb8fc7cc6 100644 --- a/src/include/86box/lpt.h +++ b/src/include/86box/lpt.h @@ -11,10 +11,10 @@ #define LPT4_ADDR 0x0268 #define LPT4_IRQ 5 /* -#define LPT5_ADDR 0x027c -#define LPT5_IRQ 7 -#define LPT6_ADDR 0x026c -#define LPT6_IRQ 5 +#define LPT5_ADDR 0x027c +#define LPT5_IRQ 7 +#define LPT6_ADDR 0x026c +#define LPT6_IRQ 5 */ typedef struct diff --git a/src/include/86box/m_amstrad.h b/src/include/86box/m_amstrad.h index 1b99617ca..ef4e8b9ea 100644 --- a/src/include/86box/m_amstrad.h +++ b/src/include/86box/m_amstrad.h @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Header of the emulation of the Amstrad series of PC's: - * PC1512, PC1640 and PC200, including their keyboard, mouse and - * video devices, as well as the PC2086 and PC3086 systems. + * Header of the emulation of the Amstrad series of PC's: + * PC1512, PC1640 and PC200, including their keyboard, mouse and + * video devices, as well as the PC2086 and PC3086 systems. * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * - * Copyright 2008-2019 Sarah Walker. + * Copyright 2008-2019 Sarah Walker. */ #ifndef MACHINE_AMSTRAD_H diff --git a/src/include/86box/m_at_t3100e.h b/src/include/86box/m_at_t3100e.h index aa545fc45..c25d171b9 100644 --- a/src/include/86box/m_at_t3100e.h +++ b/src/include/86box/m_at_t3100e.h @@ -12,9 +12,9 @@ * * Authors: Fred N. van Kempen, * Miran Grca, - * Sarah Walker, + * Sarah Walker, * - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. * Copyright 2016-2018 Miran Grca. * Copyright 2008-2018 Sarah Walker. * diff --git a/src/include/86box/m_xt_t1000.h b/src/include/86box/m_xt_t1000.h index 452decc21..d8e8cd56b 100644 --- a/src/include/86box/m_xt_t1000.h +++ b/src/include/86box/m_xt_t1000.h @@ -12,9 +12,9 @@ * * Authors: Fred N. van Kempen, * Miran Grca, - * Sarah Walker, + * Sarah Walker, * - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. * Copyright 2016-2018 Miran Grca. * Copyright 2008-2018 Sarah Walker. * diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index 052e55abd..9137da5d3 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/include/86box/mem.h b/src/include/86box/mem.h index f6252be09..f109776a6 100644 --- a/src/include/86box/mem.h +++ b/src/include/86box/mem.h @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Fred N. van Kempen, * Miran Grca, * diff --git a/src/include/86box/mo.h b/src/include/86box/mo.h index ea22f8f29..19c999ee3 100644 --- a/src/include/86box/mo.h +++ b/src/include/86box/mo.h @@ -1,21 +1,21 @@ /* - * 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. * - * Implementation of a generic Magneto-Optical Disk drive - * commands, for both ATAPI and SCSI usage. + * Implementation of a generic Magneto-Optical Disk drive + * commands, for both ATAPI and SCSI usage. * * * - * Authors: Natalia Portillo + * Authors: Natalia Portillo * Fred N. van Kempen, - * Miran Grca, + * Miran Grca, * - * Copyright 2020 Miran Grca. + * Copyright 2020 Miran Grca. */ #ifndef EMU_MO_H diff --git a/src/include/86box/mouse.h b/src/include/86box/mouse.h index aa046b81c..c260b3571 100644 --- a/src/include/86box/mouse.h +++ b/src/include/86box/mouse.h @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Definitions for the mouse driver. + * Definitions for the mouse driver. * * * - * Authors: Miran Grca, - * Fred N. van Kempen, + * Authors: Miran Grca, + * Fred N. van Kempen, * - * Copyright 2016-2019 Miran Grca. - * Copyright 2017-2019 Fred N. van Kempen. + * Copyright 2016-2019 Miran Grca. + * Copyright 2017-2019 Fred N. van Kempen. */ #ifndef EMU_MOUSE_H diff --git a/src/include/86box/net_3c501.h b/src/include/86box/net_3c501.h index e45f9a82a..996720f8f 100644 --- a/src/include/86box/net_3c501.h +++ b/src/include/86box/net_3c501.h @@ -1,22 +1,23 @@ /* - * 86Box An emulator of (mostly) x86-based PC systems and devices, - * using the ISA, EISA, VLB, MCA, and PCI system buses, - * roughly spanning the era between 1981 and 1995. + * 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 Project. + * This file is part of the 86Box Project. * - * Implementation of the following network controller: - * - 3Com Etherlink 3c500/3c501 (ISA 8-bit). + * Implementation of the following network controller: + * - 3Com Etherlink 3c500/3c501 (ISA 8-bit). * * * * Based on @(#)Dev3C501.cpp Oracle (VirtualBox) * - * Authors: TheCollector1995, - * Oracle + * Authors: TheCollector1995, + * Oracle * - * Copyright 2022 TheCollector1995. - * Portions Copyright (C) 2022 Oracle and/or its affilitates. + * Copyright 2022 TheCollector1995. + * Portions Copyright (C) 2022 Oracle and/or its affilitates. * * 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 diff --git a/src/include/86box/net_3c503.h b/src/include/86box/net_3c503.h index 147ae0f05..44024850f 100644 --- a/src/include/86box/net_3c503.h +++ b/src/include/86box/net_3c503.h @@ -1,3 +1,46 @@ +/* + * 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 following network controllers: + * - 3Com Etherlink II 3c503 (ISA 8-bit). + * + * + * + * Based on @(#)3c503.cpp Carl (MAME) + * + * Authors: TheCollector1995, + * Miran Grca, + * Fred N. van Kempen, + * Carl, + * + * Copyright 2018 TheCollector1995. + * Copyright 2018 Miran Grca. + * Copyright 2017-2018 Fred N. van Kempen. + * Portions Copyright (C) 2018 MAME Project + * + * 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 NET_3C503_H #define NET_3C503_H diff --git a/src/include/86box/net_dp8390.h b/src/include/86box/net_dp8390.h index 7cb91d30a..4a172d4fe 100644 --- a/src/include/86box/net_dp8390.h +++ b/src/include/86box/net_dp8390.h @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Header of the emulation of the DP8390 Network Interface - * Controller used by the WD family, NE1000/NE2000 family, and - * 3Com 3C503 NIC's. + * Header of the emulation of the DP8390 Network Interface + * Controller used by the WD family, NE1000/NE2000 family, and + * 3Com 3C503 NIC's. * * * - * Authors: Miran Grca, - * Bochs project, + * Authors: Miran Grca, + * Bochs project, * - * Copyright 2016-2018 Miran Grca. - * Copyright 2008-2018 Bochs project. + * Copyright 2016-2018 Miran Grca. + * Copyright 2008-2018 Bochs project. */ #ifndef NET_DP8390_H diff --git a/src/include/86box/net_ne2000.h b/src/include/86box/net_ne2000.h index 73b5bd67d..350668ccb 100644 --- a/src/include/86box/net_ne2000.h +++ b/src/include/86box/net_ne2000.h @@ -12,7 +12,7 @@ * * Authors: Fred N. van Kempen, * - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. * * 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 diff --git a/src/include/86box/net_pcnet.h b/src/include/86box/net_pcnet.h index f1db74045..ccdc7e832 100644 --- a/src/include/86box/net_pcnet.h +++ b/src/include/86box/net_pcnet.h @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Emulation of the AMD PCnet LANCE NIC controller for both the ISA - * and PCI buses. + * Emulation of the AMD PCnet LANCE NIC controller for both the ISA + * and PCI buses. * * * - * Authors: Miran Grca, - * TheCollector1995, - * Antony T Curtis + * Authors: Miran Grca, + * TheCollector1995, + * Antony T Curtis * - * Copyright 2004-2019 Antony T Curtis - * Copyright 2016-2019 Miran Grca. + * Copyright 2004-2019 Antony T Curtis + * Copyright 2016-2019 Miran Grca. */ #ifndef NET_PCNET_H diff --git a/src/include/86box/net_plip.h b/src/include/86box/net_plip.h index 890de3fd0..83c33e4c6 100644 --- a/src/include/86box/net_plip.h +++ b/src/include/86box/net_plip.h @@ -1,17 +1,18 @@ /* - * 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. * - * Definitions for the PLIP parallel port network device. + * Definitions for the PLIP parallel port network device. * * * - * Author: RichardG, - * Copyright 2020 RichardG. + * Authors: RichardG, + * + * Copyright 2020 RichardG. */ #ifndef NET_PLIP_H diff --git a/src/include/86box/net_wd8003.h b/src/include/86box/net_wd8003.h index ee313c1a9..a0ea13287 100644 --- a/src/include/86box/net_wd8003.h +++ b/src/include/86box/net_wd8003.h @@ -1,26 +1,26 @@ /* - * 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. * - * Implementation of the following network controllers: - * - SMC/WD 8003E (ISA 8-bit); - * - SMC/WD 8013EBT (ISA 16-bit); - * - SMC/WD 8013EP/A (MCA). + * Implementation of the following network controllers: + * - SMC/WD 8003E (ISA 8-bit); + * - SMC/WD 8013EBT (ISA 16-bit); + * - SMC/WD 8013EP/A (MCA). * * * - * Authors: Fred N. van Kempen, - * TheCollector1995, - * Miran Grca, - * Peter Grehan, + * Authors: Fred N. van Kempen, + * TheCollector1995, + * Miran Grca, + * Peter Grehan, * - * Copyright 2017,2018 Fred N. van Kempen. - * Copyright 2016-2018 Miran Grca. - * Portions Copyright (C) 2002 MandrakeSoft S.A. + * Copyright 2017-2018 Fred N. van Kempen. + * Copyright 2016-2018 Miran Grca. + * Portions Copyright (C) 2002 MandrakeSoft S.A. * * 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 diff --git a/src/include/86box/nvr_ps2.h b/src/include/86box/nvr_ps2.h index 9fd0a7897..478d1be44 100644 --- a/src/include/86box/nvr_ps2.h +++ b/src/include/86box/nvr_ps2.h @@ -11,9 +11,9 @@ * * * Authors: Fred N. van Kempen, - * Sarah Walker, + * Sarah Walker, * - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. * Copyright 2008-2018 Sarah Walker. * * This program is free software; you can redistribute it and/or modify diff --git a/src/include/86box/pci.h b/src/include/86box/pci.h index 5c24bebf2..c16d5a7e8 100644 --- a/src/include/86box/pci.h +++ b/src/include/86box/pci.h @@ -12,7 +12,7 @@ * * Authors: Miran Grca, * Fred N. van Kempen, - * Sarah Walker, + * Sarah Walker, * * Copyright 2016-2020 Miran Grca. * Copyright 2017-2020 Fred N. van Kempen. diff --git a/src/include/86box/pic.h b/src/include/86box/pic.h index d1295be4b..318ce2fad 100644 --- a/src/include/86box/pic.h +++ b/src/include/86box/pic.h @@ -1,19 +1,19 @@ /* - * 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. * - * Header of the implementation of the Intel PIC chip emulation, - * partially ported from reenigne's XTCE. + * Header of the implementation of the Intel PIC chip emulation, + * partially ported from reenigne's XTCE. * - * Authors: Andrew Jenner, - * Miran Grca, + * Authors: Andrew Jenner, + * Miran Grca, * - * Copyright 2015-2020 Andrew Jenner. - * Copyright 2016-2020 Miran Grca. + * Copyright 2015-2020 Andrew Jenner. + * Copyright 2016-2020 Miran Grca. */ #ifndef EMU_PIC_H diff --git a/src/include/86box/pit.h b/src/include/86box/pit.h index f6eb4cc6d..d50e45967 100644 --- a/src/include/86box/pit.h +++ b/src/include/86box/pit.h @@ -1,18 +1,19 @@ /* - * 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. * - * Header of the implementation of the Intel 8253/8254 - * Programmable Interval Timer. + * Header of the implementation of the Intel 8253/8254 + * Programmable Interval Timer. * * * - * Author: Miran Grca, - * Copyright 2019,2020 Miran Grca. + * Authors: Miran Grca, + * + * Copyright 2019-2020 Miran Grca. */ #ifndef EMU_PIT_H diff --git a/src/include/86box/pit_fast.h b/src/include/86box/pit_fast.h index 317b8f13e..242fb4207 100644 --- a/src/include/86box/pit_fast.h +++ b/src/include/86box/pit_fast.h @@ -1,18 +1,19 @@ /* - * 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. * - * Header of the implementation of the Intel 8253/8254 - * Programmable Interval Timer. + * Header of the implementation of the Intel 8253/8254 + * Programmable Interval Timer. * * * - * Author: Miran Grca, - * Copyright 2019,2020 Miran Grca. + * Authors: Miran Grca, + * + * Copyright 2019-2020 Miran Grca. */ #ifndef EMU_PIT_FAST_H diff --git a/src/include/86box/plat_dir.h b/src/include/86box/plat_dir.h index 74caac23f..f6c135001 100644 --- a/src/include/86box/plat_dir.h +++ b/src/include/86box/plat_dir.h @@ -1,17 +1,18 @@ /* - * 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. * - * Definitions for the platform OpenDir module. + * Definitions for the platform OpenDir module. * * * - * Author: Fred N. van Kempen, - * Copyright 2017 Fred N. van Kempen. + * Authors: Fred N. van Kempen, + * + * Copyright 2017 Fred N. van Kempen. */ #ifndef PLAT_DIR_H diff --git a/src/include/86box/plat_dynld.h b/src/include/86box/plat_dynld.h index 6e20f6e27..986e72424 100644 --- a/src/include/86box/plat_dynld.h +++ b/src/include/86box/plat_dynld.h @@ -1,17 +1,18 @@ /* - * 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. * - * Define the Dynamic Module Loader interface. + * Define the Dynamic Module Loader interface. * * * - * Author: Fred N. van Kempen, - * Copyright 2017 Fred N. van Kempen + * Authors: Fred N. van Kempen, + * + * Copyright 2017 Fred N. van Kempen */ #ifndef PLAT_DYNLD_H diff --git a/src/include/86box/port_6x.h b/src/include/86box/port_6x.h index 927a15efa..7eb0c9a56 100644 --- a/src/include/86box/port_6x.h +++ b/src/include/86box/port_6x.h @@ -1,19 +1,19 @@ /* - * 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. * - * Header for the implementation of Port 6x used by various - * machines. + * Header for the implementation of Port 6x used by various + * machines. * * * - * Authors: Miran Grca, + * Authors: Miran Grca, * - * Copyright 2021 Miran Grca. + * Copyright 2021 Miran Grca. */ #ifndef EMU_PORT_6X_H diff --git a/src/include/86box/port_92.h b/src/include/86box/port_92.h index 4d5aa031c..319b2b3ac 100644 --- a/src/include/86box/port_92.h +++ b/src/include/86box/port_92.h @@ -1,19 +1,19 @@ /* - * 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. * - * Header for the implementation of Port 92 used by PS/2 - * machines and 386+ clones. + * Header for the implementation of Port 92 used by PS/2 + * machines and 386+ clones. * * * - * Authors: Miran Grca, + * Authors: Miran Grca, * - * Copyright 2019 Miran Grca. + * Copyright 2019 Miran Grca. */ #ifndef EMU_PORT_92_H diff --git a/src/include/86box/postcard.h b/src/include/86box/postcard.h index 0db2d6187..5ceb64ae3 100644 --- a/src/include/86box/postcard.h +++ b/src/include/86box/postcard.h @@ -1,18 +1,18 @@ /* - * 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. * - * Implementation of a port 80h POST diagnostic card. + * Implementation of a port 80h POST diagnostic card. * * * - * Author: RichardG, + * Authors: RichardG, * - * Copyright 2020 RichardG. + * Copyright 2020 RichardG. */ #ifndef POSTCARD_H diff --git a/src/include/86box/random.h b/src/include/86box/random.h index 089a49c4a..021969a54 100644 --- a/src/include/86box/random.h +++ b/src/include/86box/random.h @@ -1,18 +1,19 @@ /* - * 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. * - * A better random number generation, used for floppy weak bits - * and network MAC address generation. + * A better random number generation, used for floppy weak bits + * and network MAC address generation. * * * - * Author: Miran Grca, - * Copyright 2016,2017 Miran Grca. + * Authors: Miran Grca, + * + * Copyright 2016-2017 Miran Grca. */ #ifndef EMU_RANDOM_H diff --git a/src/include/86box/resource.h b/src/include/86box/resource.h index dc54b504f..17af95ca4 100644 --- a/src/include/86box/resource.h +++ b/src/include/86box/resource.h @@ -1,24 +1,24 @@ /* - * 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. * - * Windows resource defines. + * Windows resource defines. * * * - * Authors: Sarah Walker, - * Miran Grca, - * Fred N. van Kempen, - * David Hrdlička, + * Authors: Sarah Walker, + * Miran Grca, + * Fred N. van Kempen, + * David Hrdlička, * - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 Miran Grca. - * Copyright 2018,2019 David Hrdlička. - * Copyright 2021-2022 Jasmine Iwanek. + * Copyright 2008-2019 Sarah Walker. + * Copyright 2016-2019 Miran Grca. + * Copyright 2018-2019 David Hrdlička. + * Copyright 2021-2022 Jasmine Iwanek. */ #ifndef WIN_RESOURCE_H diff --git a/src/include/86box/rom.h b/src/include/86box/rom.h index 82a1aef5f..91f813a95 100644 --- a/src/include/86box/rom.h +++ b/src/include/86box/rom.h @@ -1,17 +1,18 @@ /* - * 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. * - * Definitions for the ROM image handler. + * Definitions for the ROM image handler. * * * - * Author: Fred N. van Kempen, - * Copyright 2018,2019 Fred N. van Kempen. + * Authors: Fred N. van Kempen, + * + * Copyright 2018-2019 Fred N. van Kempen. */ #ifndef EMU_ROM_H diff --git a/src/include/86box/scsi.h b/src/include/86box/scsi.h index 93a7fd010..d19497101 100644 --- a/src/include/86box/scsi.h +++ b/src/include/86box/scsi.h @@ -1,22 +1,22 @@ /* - * 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. * - * SCSI controller handler header. + * SCSI controller handler header. * * * - * Authors: TheCollector1995, - * Miran Grca, - * Fred N. van Kempen, + * Authors: TheCollector1995, + * Miran Grca, + * Fred N. van Kempen, * - * Copyright 2016-2018 TheCollector1995. - * Copyright 2016-2018 Miran Grca. - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2016-2018 TheCollector1995. + * Copyright 2016-2018 Miran Grca. + * Copyright 2017-2018 Fred N. van Kempen. */ #ifndef EMU_SCSI_H #define EMU_SCSI_H diff --git a/src/include/86box/scsi_buslogic.h b/src/include/86box/scsi_buslogic.h index be865ec57..12bff6fdf 100644 --- a/src/include/86box/scsi_buslogic.h +++ b/src/include/86box/scsi_buslogic.h @@ -1,19 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Emulation of BusLogic BT-542B ISA and BT-958D PCI SCSI - * controllers. + * Emulation of BusLogic BT-542B ISA and BT-958D PCI SCSI + * controllers. * * * - * Authors: TheCollector1995, - * Miran Grca, - * Fred N. van Kempen, - * Copyright 2016-2018 Miran Grca. - * Copyright 2017,2018 Fred N. van Kempen. + * Authors: TheCollector1995, + * Miran Grca, + * Fred N. van Kempen, + * + * Copyright 2016-2018 Miran Grca. + * Copyright 2017-2018 Fred N. van Kempen. */ #ifndef SCSI_BUSLOGIC_H diff --git a/src/include/86box/scsi_cdrom.h b/src/include/86box/scsi_cdrom.h index 42d4412d1..6b94c2aa4 100644 --- a/src/include/86box/scsi_cdrom.h +++ b/src/include/86box/scsi_cdrom.h @@ -1,19 +1,19 @@ /* - * 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. * - * Implementation of the CD-ROM drive with SCSI(-like) - * commands, for both ATAPI and SCSI usage. + * Implementation of the CD-ROM drive with SCSI(-like) + * commands, for both ATAPI and SCSI usage. * * * - * Author: Miran Grca, + * Authors: Miran Grca, * - * Copyright 2018,2019 Miran Grca. + * Copyright 2018-2019 Miran Grca. */ #ifndef EMU_SCSI_CDROM_H diff --git a/src/include/86box/scsi_device.h b/src/include/86box/scsi_device.h index 8cb2f3877..61048fb54 100644 --- a/src/include/86box/scsi_device.h +++ b/src/include/86box/scsi_device.h @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Definitions for the generic SCSI device command handler. + * Definitions for the generic SCSI device command handler. * * * - * Authors: Miran Grca, - * Fred N. van Kempen, + * Authors: Miran Grca, + * Fred N. van Kempen, * - * Copyright 2016-2019 Miran Grca. - * Copyright 2017-2019 Fred N. van Kempen. + * Copyright 2016-2019 Miran Grca. + * Copyright 2017-2019 Fred N. van Kempen. */ #ifndef SCSI_DEVICE_H diff --git a/src/include/86box/scsi_disk.h b/src/include/86box/scsi_disk.h index 94171e7ac..bff40a396 100644 --- a/src/include/86box/scsi_disk.h +++ b/src/include/86box/scsi_disk.h @@ -1,15 +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. + * 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. * - * Emulation of SCSI fixed and removable disks. + * Emulation of SCSI fixed and removable disks. * * * - * Author: Miran Grca, - * Copyright 2017,2018 Miran Grca. + * Authors: Miran Grca, + * + * Copyright 2017-2018 Miran Grca. */ #ifndef SCSI_DISK_H diff --git a/src/include/86box/scsi_ncr5380.h b/src/include/86box/scsi_ncr5380.h index 045e6bbe7..ecf5660ef 100644 --- a/src/include/86box/scsi_ncr5380.h +++ b/src/include/86box/scsi_ncr5380.h @@ -1,24 +1,24 @@ /* - * 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. * - * Implementation of the NCR 5380 series of SCSI Host Adapters - * made by NCR. These controllers were designed for - * the ISA bus. + * Implementation of the NCR 5380 series of SCSI Host Adapters + * made by NCR. These controllers were designed for + * the ISA bus. * * * - * Authors: Sarah Walker, - * TheCollector1995, - * Fred N. van Kempen, + * Authors: Sarah Walker, + * TheCollector1995, + * Fred N. van Kempen, * - * Copyright 2017-2018 Sarah Walker. - * Copyright 2017-2018 TheCollector1995. - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Sarah Walker. + * Copyright 2017-2018 TheCollector1995. + * Copyright 2017-2018 Fred N. van Kempen. */ #ifndef SCSI_NCR5380_H diff --git a/src/include/86box/scsi_ncr53c8xx.h b/src/include/86box/scsi_ncr53c8xx.h index 37c5a72bf..5149c2203 100644 --- a/src/include/86box/scsi_ncr53c8xx.h +++ b/src/include/86box/scsi_ncr53c8xx.h @@ -1,25 +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. + * 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. * - * Implementation of the NCR 53C810 and 53C875 SCSI Host - * Adapters made by NCR and later Symbios and LSI. These - * controllers were designed for the PCI bus. + * Implementation of the NCR 53C810 and 53C875 SCSI Host + * Adapters made by NCR and later Symbios and LSI. These + * controllers were designed for the PCI bus. * * * - * Authors: TheCollector1995, - * Miran Grca, - * Paul Brook (QEMU), - * Artyom Tarasenko (QEMU), + * Authors: TheCollector1995, + * Miran Grca, + * Paul Brook (QEMU), + * Artyom Tarasenko (QEMU), * - * Copyright 2006-2018 Paul Brook. - * Copyright 2009-2018 Artyom Tarasenko. - * Copyright 2017,2018 Miran Grca. + * Copyright 2006-2018 Paul Brook. + * Copyright 2009-2018 Artyom Tarasenko. + * Copyright 2017-2018 Miran Grca. */ #ifndef SCSI_NCR53C8XX_H diff --git a/src/include/86box/scsi_pcscsi.h b/src/include/86box/scsi_pcscsi.h index d0b5baf04..0ce353d33 100644 --- a/src/include/86box/scsi_pcscsi.h +++ b/src/include/86box/scsi_pcscsi.h @@ -1,25 +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. + * 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. * - * Implementation of the AMD PCscsi and Tekram DC-390 SCSI - * controllers using the NCR 53c9x series of chips. + * Implementation of the AMD PCscsi and Tekram DC-390 SCSI + * controllers using the NCR 53c9x series of chips. * * * * - * Authors: Fabrice Bellard (QEMU) - * Herve Poussineau (QEMU) - * TheCollector1995, - * Miran Grca, + * Authors: Fabrice Bellard (QEMU) + * Herve Poussineau (QEMU) + * TheCollector1995, + * Miran Grca, * - * Copyright 2005-2018 Fabrice Bellard. - * Copyright 2012-2018 Herve Poussineau. - * Copyright 2017,2018 Miran Grca. + * Copyright 2005-2018 Fabrice Bellard. + * Copyright 2012-2018 Herve Poussineau. + * Copyright 2017-2018 Miran Grca. */ #ifndef SCSI_PCSCSI_H diff --git a/src/include/86box/scsi_spock.h b/src/include/86box/scsi_spock.h index 3dae005db..bfa579c82 100644 --- a/src/include/86box/scsi_spock.h +++ b/src/include/86box/scsi_spock.h @@ -1,21 +1,21 @@ /* - * 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. * - * Implementation of the IBM PS/2 SCSI controller with - * cache for MCA only. + * Implementation of the IBM PS/2 SCSI controller with + * cache for MCA only. * * * - * Authors: Sarah Walker, - * TheCollector1995, + * Authors: Sarah Walker, + * TheCollector1995, * - * Copyright 2020 Sarah Walker. - * Copyright 2020 TheCollector1995. + * Copyright 2020 Sarah Walker. + * Copyright 2020 TheCollector1995. */ #ifndef SCSI_SPOCK_H diff --git a/src/include/86box/scsi_x54x.h b/src/include/86box/scsi_x54x.h index 68a31e651..a20f1e788 100644 --- a/src/include/86box/scsi_x54x.h +++ b/src/include/86box/scsi_x54x.h @@ -1,24 +1,24 @@ /* - * 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. * - * Header of the code common to the AHA-154x series of SCSI - * Host Adapters made by Adaptec, Inc. and the BusLogic series - * of SCSI Host Adapters made by Mylex. - * These controllers were designed for various buses. + * Header of the code common to the AHA-154x series of SCSI + * Host Adapters made by Adaptec, Inc. and the BusLogic series + * of SCSI Host Adapters made by Mylex. + * These controllers were designed for various buses. * * * - * Authors: TheCollector1995, - * Miran Grca, - * Fred N. van Kempen, + * Authors: TheCollector1995, + * Miran Grca, + * Fred N. van Kempen, * - * Copyright 2016-2018 Miran Grca. - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2016-2018 Miran Grca. + * Copyright 2017-2018 Fred N. van Kempen. */ #ifndef SCSI_X54X_H diff --git a/src/include/86box/serial.h b/src/include/86box/serial.h index 1394a1c53..ae48ee09f 100644 --- a/src/include/86box/serial.h +++ b/src/include/86box/serial.h @@ -11,7 +11,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/include/86box/smram.h b/src/include/86box/smram.h index 07537a7f6..84d1cbe8d 100644 --- a/src/include/86box/smram.h +++ b/src/include/86box/smram.h @@ -1,18 +1,18 @@ /* - * 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. * - * Definitions for the SMRAM interface. + * Definitions for the SMRAM interface. * * * - * Authors: Miran Grca, + * Authors: Miran Grca, * - * Copyright 2016-2020 Miran Grca. + * Copyright 2016-2020 Miran Grca. */ #ifndef EMU_SMRAM_H diff --git a/src/include/86box/snd_ac97.h b/src/include/86box/snd_ac97.h index 600dd84d8..14d31dc40 100644 --- a/src/include/86box/snd_ac97.h +++ b/src/include/86box/snd_ac97.h @@ -1,18 +1,18 @@ /* - * 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. * - * Definitions for AC'97 audio emulation. + * Definitions for AC'97 audio emulation. * * * - * Authors: RichardG, + * Authors: RichardG, * - * Copyright 2021 RichardG. + * Copyright 2021 RichardG. */ #ifndef SOUND_AC97_H #define SOUND_AC97_H diff --git a/src/include/86box/snd_ad1848.h b/src/include/86box/snd_ad1848.h index bdf5022e5..76fc775db 100644 --- a/src/include/86box/snd_ad1848.h +++ b/src/include/86box/snd_ad1848.h @@ -1,22 +1,22 @@ /* - * 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. * - * Definitions for AD1848 / CS4248 / CS4231 (Windows Sound System) codec emulation. + * Definitions for AD1848 / CS4248 / CS4231 (Windows Sound System) codec emulation. * * * - * Authors: Sarah Walker, - * TheCollector1995, - * RichardG, + * Authors: Sarah Walker, + * TheCollector1995, + * RichardG, * - * Copyright 2008-2020 Sarah Walker. - * Copyright 2018-2020 TheCollector1995. - * Copyright 2021 RichardG. + * Copyright 2008-2020 Sarah Walker. + * Copyright 2018-2020 TheCollector1995. + * Copyright 2021 RichardG. */ #ifndef SOUND_AD1848_H diff --git a/src/include/86box/snd_mpu401.h b/src/include/86box/snd_mpu401.h index 96143b251..4afbc6b53 100644 --- a/src/include/86box/snd_mpu401.h +++ b/src/include/86box/snd_mpu401.h @@ -1,23 +1,24 @@ /* - * 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. * - * Roland MPU-401 emulation. + * Roland MPU-401 emulation. * * * - * Author: Sarah Walker, - * DOSBox Team, - * Miran Grca, - * TheCollector1995, - * Copyright 2008-2020 Sarah Walker. - * Copyright 2008-2020 DOSBox Team. - * Copyright 2016-2020 Miran Grca. - * Copyright 2016-2020 TheCollector1995. + * Authors: Sarah Walker, + * DOSBox Team, + * Miran Grca, + * TheCollector1995, + * + * Copyright 2008-2020 Sarah Walker. + * Copyright 2008-2020 DOSBox Team. + * Copyright 2016-2020 Miran Grca. + * Copyright 2016-2020 TheCollector1995. */ #ifndef SOUND_MPU401_H diff --git a/src/include/86box/snd_opl.h b/src/include/86box/snd_opl.h index 5caccf8fc..b4f26543d 100644 --- a/src/include/86box/snd_opl.h +++ b/src/include/86box/snd_opl.h @@ -1,18 +1,18 @@ /* - * 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. * - * Definitions for the OPL interface. + * Definitions for the OPL interface. * - * Authors: Fred N. van Kempen, - * Miran Grca, + * Authors: Fred N. van Kempen, + * Miran Grca, * - * Copyright 2017-2020 Fred N. van Kempen. - * Copyright 2016-2020 Miran Grca. + * Copyright 2017-2020 Fred N. van Kempen. + * Copyright 2016-2020 Miran Grca. */ #ifndef SOUND_OPL_H #define SOUND_OPL_H diff --git a/src/include/86box/snd_opl_nuked.h b/src/include/86box/snd_opl_nuked.h index 635863407..f82e85b0e 100644 --- a/src/include/86box/snd_opl_nuked.h +++ b/src/include/86box/snd_opl_nuked.h @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Definitions for the NukedOPL3 driver. + * Definitions for the NukedOPL3 driver. * - * Version: @(#)snd_opl_nuked.h 1.0.5 2020/07/16 + * Version: @(#)snd_opl_nuked.h 1.0.5 2020/07/16 * - * Authors: Fred N. van Kempen, - * Miran Grca, + * Authors: Fred N. van Kempen, + * Miran Grca, * - * Copyright 2017-2020 Fred N. van Kempen. - * Copyright 2016-2019 Miran Grca. + * Copyright 2017-2020 Fred N. van Kempen. + * Copyright 2016-2019 Miran Grca. */ #ifndef SOUND_OPL_NUKED_H diff --git a/src/include/86box/snd_sb.h b/src/include/86box/snd_sb.h index 577335976..88f2c74f1 100644 --- a/src/include/86box/snd_sb.h +++ b/src/include/86box/snd_sb.h @@ -8,7 +8,7 @@ * * Sound Blaster emulation. * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * TheCollector1995, * diff --git a/src/include/86box/snd_speaker.h b/src/include/86box/snd_speaker.h index 922603d98..516d20588 100644 --- a/src/include/86box/snd_speaker.h +++ b/src/include/86box/snd_speaker.h @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Header of the emulation of the PC speaker. + * Header of the emulation of the PC speaker. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 Miran Grca. + * Copyright 2008-2019 Sarah Walker. + * Copyright 2016-2019 Miran Grca. */ #ifndef SOUND_SPEAKER_H diff --git a/src/include/86box/sound.h b/src/include/86box/sound.h index 10303c3ca..a38d213da 100644 --- a/src/include/86box/sound.h +++ b/src/include/86box/sound.h @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2018 Sarah Walker. diff --git a/src/include/86box/ui.h b/src/include/86box/ui.h index 5eb15a08d..58168ceb8 100644 --- a/src/include/86box/ui.h +++ b/src/include/86box/ui.h @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Define the various UI functions. + * Define the various UI functions. * * * - * Authors: Miran Grca, - * Fred N. van Kempen, + * Authors: Miran Grca, + * Fred N. van Kempen, * - * Copyright 2016-2019 Miran Grca. - * Copyright 2017-2019 Fred N. van Kempen. + * Copyright 2016-2019 Miran Grca. + * Copyright 2017-2019 Fred N. van Kempen. */ #ifndef EMU_UI_H #define EMU_UI_H diff --git a/src/include/86box/usb.h b/src/include/86box/usb.h index 893a9f501..d0b169b6c 100644 --- a/src/include/86box/usb.h +++ b/src/include/86box/usb.h @@ -1,18 +1,18 @@ /* - * 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. * - * Definitions for the Distributed DMA emulation. + * Definitions for the Distributed DMA emulation. * * * - * Authors: Miran Grca, + * Authors: Miran Grca, * - * Copyright 2020 Miran Grca. + * Copyright 2020 Miran Grca. */ #ifndef USB_H diff --git a/src/include/86box/vid_8514a.h b/src/include/86box/vid_8514a.h index be6c5d177..6463d0214 100644 --- a/src/include/86box/vid_8514a.h +++ b/src/include/86box/vid_8514a.h @@ -1,19 +1,19 @@ /* - * 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. * - * Emulation of the 8514/A card from IBM for the MCA bus and - * generic ISA bus clones without vendor extensions. + * Emulation of the 8514/A card from IBM for the MCA bus and + * generic ISA bus clones without vendor extensions. * * * - * Authors: TheCollector1995 + * Authors: TheCollector1995 * - * Copyright 2022 TheCollector1995. + * Copyright 2022 TheCollector1995. */ #ifndef VIDEO_8514A_H diff --git a/src/include/86box/vid_cga.h b/src/include/86box/vid_cga.h index 4421840d6..39e1c24ef 100644 --- a/src/include/86box/vid_cga.h +++ b/src/include/86box/vid_cga.h @@ -1,19 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Emulation of the old and new IBM CGA graphics cards. + * Emulation of the old and new IBM CGA graphics cards. * * * - * Author: Sarah Walker, - * Miran Grca, - * Copyright 2008-2018 Sarah Walker. - * Copyright 2016-2018 Miran Grca. + * Authors: Sarah Walker, + * Miran Grca, + * + * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. */ #ifndef VIDEO_CGA_H diff --git a/src/include/86box/vid_cga_comp.h b/src/include/86box/vid_cga_comp.h index f4dd58b40..3c7916034 100644 --- a/src/include/86box/vid_cga_comp.h +++ b/src/include/86box/vid_cga_comp.h @@ -1,20 +1,21 @@ /* - * 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. * - * IBM CGA composite filter, borrowed from reenigne's DOSBox - * patch and ported to C. + * IBM CGA composite filter, borrowed from reenigne's DOSBox + * patch and ported to C. * * * - * Author: reenigne, - * Miran Grca, - * Copyright 2015-2018 reenigne. - * Copyright 2015-2018 Miran Grca. + * Authors: reenigne, + * Miran Grca, + * + * Copyright 2015-2018 reenigne. + * Copyright 2015-2018 Miran Grca. */ #ifndef VIDEO_CGA_COMP_H diff --git a/src/include/86box/vid_ddc.h b/src/include/86box/vid_ddc.h index b64759bac..144cca406 100644 --- a/src/include/86box/vid_ddc.h +++ b/src/include/86box/vid_ddc.h @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * DDC monitor emulation definitions. + * DDC monitor emulation definitions. * * * - * Authors: Sarah Walker, - * RichardG, + * Authors: Sarah Walker, + * RichardG, * - * Copyright 2008-2020 Sarah Walker. - * Copyright 2020 RichardG. + * Copyright 2008-2020 Sarah Walker. + * Copyright 2020 RichardG. */ #ifndef EMU_VID_DDC_H diff --git a/src/include/86box/vid_ega.h b/src/include/86box/vid_ega.h index 3b4797bf8..784f0c596 100644 --- a/src/include/86box/vid_ega.h +++ b/src/include/86box/vid_ega.h @@ -1,21 +1,21 @@ /* - * 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. * - * Emulation of the EGA and Chips & Technologies SuperEGA - * graphics cards. + * Emulation of the EGA and Chips & Technologies SuperEGA + * graphics cards. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2020 Sarah Walker. - * Copyright 2016-2020 Miran Grca. + * Copyright 2008-2020 Sarah Walker. + * Copyright 2016-2020 Miran Grca. */ #ifndef VIDEO_EGA_H diff --git a/src/include/86box/vid_hercules.h b/src/include/86box/vid_hercules.h index 109d721ae..bbb4239aa 100644 --- a/src/include/86box/vid_hercules.h +++ b/src/include/86box/vid_hercules.h @@ -1,20 +1,22 @@ /* - * 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. * - * Emulation of the Hercules graphics cards. + * Emulation of the Hercules graphics cards. * * * - * Author: Sarah Walker, - * Miran Grca, - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 Miran Grca. - * Copyright 2021 Jasmine Iwanek. + * Authors: Sarah Walker, + * Miran Grca, + * Jasmine Iwanek, + * + * Copyright 2008-2019 Sarah Walker. + * Copyright 2016-2019 Miran Grca. + * Copyright 2021 Jasmine Iwanek. */ #ifndef VIDEO_HERCULES_H diff --git a/src/include/86box/vid_nga.h b/src/include/86box/vid_nga.h index 8dc0ad881..93786b15e 100644 --- a/src/include/86box/vid_nga.h +++ b/src/include/86box/vid_nga.h @@ -1,25 +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. + * 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. * - * Emulation of the Olivetti OGC 8-bit ISA (GO708) and - * M21/M24/M28 16-bit bus (GO317/318/380/709) video cards. + * Emulation of the Olivetti OGC 8-bit ISA (GO708) and + * M21/M24/M28 16-bit bus (GO317/318/380/709) video cards. * * * - * Authors: Sarah Walker, - * Miran Grca, - * Fred N. van Kempen, - * EngiNerd, + * Authors: Sarah Walker, + * Miran Grca, + * Fred N. van Kempen, + * EngiNerd, * - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 Miran Grca. - * Copyright 2017-2019 Fred N. van Kempen. - * Copyright 2020 EngiNerd. + * Copyright 2008-2019 Sarah Walker. + * Copyright 2016-2019 Miran Grca. + * Copyright 2017-2019 Fred N. van Kempen. + * Copyright 2020 EngiNerd. */ #ifndef VIDEO_NGA_H diff --git a/src/include/86box/vid_ogc.h b/src/include/86box/vid_ogc.h index 6e6447694..6b80f5859 100644 --- a/src/include/86box/vid_ogc.h +++ b/src/include/86box/vid_ogc.h @@ -1,25 +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. + * 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. * - * Emulation of the Olivetti OGC 8-bit ISA (GO708) and - * M21/M24/M28 16-bit bus (GO317/318/380/709) video cards. + * Emulation of the Olivetti OGC 8-bit ISA (GO708) and + * M21/M24/M28 16-bit bus (GO317/318/380/709) video cards. * * * - * Authors: Sarah Walker, - * Miran Grca, - * Fred N. van Kempen, - * EngiNerd, + * Authors: Sarah Walker, + * Miran Grca, + * Fred N. van Kempen, + * EngiNerd, * - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 Miran Grca. - * Copyright 2017-2019 Fred N. van Kempen. - * Copyright 2020 EngiNerd. + * Copyright 2008-2019 Sarah Walker. + * Copyright 2016-2019 Miran Grca. + * Copyright 2017-2019 Fred N. van Kempen. + * Copyright 2020 EngiNerd. */ #ifndef VIDEO_OGC_H diff --git a/src/include/86box/vid_pgc.h b/src/include/86box/vid_pgc.h index 3960598ab..12450c0d1 100644 --- a/src/include/86box/vid_pgc.h +++ b/src/include/86box/vid_pgc.h @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Definitions for the PGC driver. + * Definitions for the PGC driver. * * * - * Authors: Fred N. van Kempen, - * John Elliott, + * Authors: Fred N. van Kempen, + * John Elliott, * - * Copyright 2019 Fred N. van Kempen. - * Copyright 2019 John Elliott. + * Copyright 2019 Fred N. van Kempen. + * Copyright 2019 John Elliott. */ #ifndef VID_PGC_H #define VID_PGC_H diff --git a/src/include/86box/vid_pgc_palette.h b/src/include/86box/vid_pgc_palette.h index ffcf6a9f0..a242e0cbd 100644 --- a/src/include/86box/vid_pgc_palette.h +++ b/src/include/86box/vid_pgc_palette.h @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Palette definitions for the PGC core. + * Palette definitions for the PGC core. * * * - * Authors: Fred N. van Kempen, - * John Elliott, + * Authors: Fred N. van Kempen, + * John Elliott, * - * Copyright 2019 Fred N. van Kempen. - * Copyright 2019 John Elliott. + * Copyright 2019 Fred N. van Kempen. + * Copyright 2019 John Elliott. */ #ifndef VID_PGC_PALETTE_H diff --git a/src/include/86box/vid_svga.h b/src/include/86box/vid_svga.h index 3781d5530..7f987a2b7 100644 --- a/src/include/86box/vid_svga.h +++ b/src/include/86box/vid_svga.h @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2020 Sarah Walker. diff --git a/src/include/86box/vid_svga_render.h b/src/include/86box/vid_svga_render.h index 04bd740b1..13ff527e0 100644 --- a/src/include/86box/vid_svga_render.h +++ b/src/include/86box/vid_svga_render.h @@ -1,19 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * SVGA renderers. + * SVGA renderers. * * * - * Author: Sarah Walker, - * Miran Grca, - * Copyright 2008-2018 Sarah Walker. - * Copyright 2016-2018 Miran Grca. + * Authors: Sarah Walker, + * Miran Grca, + * + * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. */ #ifndef VIDEO_SVGA_RENDER_H diff --git a/src/include/86box/vid_vga.h b/src/include/86box/vid_vga.h index 44cc6b7c3..08a1a2591 100644 --- a/src/include/86box/vid_vga.h +++ b/src/include/86box/vid_vga.h @@ -1,20 +1,22 @@ /* - * 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. * - * Emulation of the IBM MDA + VGA graphics cards. + * Emulation of the IBM MDA + VGA graphics cards. * * * - * Author: Sarah Walker, - * Miran Grca, - * Copyright 2008-2018 Sarah Walker. - * Copyright 2016-2018 Miran Grca. - * Copyright 2021 Jasmine Iwanek. + * Authors: Sarah Walker, + * Miran Grca, + * Jasmine Iwanek, + * + * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. + * Copyright 2021 Jasmine Iwanek. */ #ifndef VIDEO_VGA_H diff --git a/src/include/86box/vid_voodoo_banshee.h b/src/include/86box/vid_voodoo_banshee.h index 4d966ea3e..56fd47eeb 100644 --- a/src/include/86box/vid_voodoo_banshee.h +++ b/src/include/86box/vid_voodoo_banshee.h @@ -1,18 +1,18 @@ /* - * 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. * - * Voodoo Banshee and 3 specific emulation. + * Voodoo Banshee and 3 specific emulation. * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * - * Copyright 2008-2020 Sarah Walker. + * Copyright 2008-2020 Sarah Walker. */ #ifndef VIDEO_VOODOO_BANSHEE_H diff --git a/src/include/86box/vid_voodoo_banshee_blitter.h b/src/include/86box/vid_voodoo_banshee_blitter.h index 9f7a1825e..2d36f1566 100644 --- a/src/include/86box/vid_voodoo_banshee_blitter.h +++ b/src/include/86box/vid_voodoo_banshee_blitter.h @@ -1,18 +1,18 @@ /* - * 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. * - * Voodoo Banshee and 3 specific emulation. + * Voodoo Banshee and 3 specific emulation. * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * - * Copyright 2008-2020 Sarah Walker. + * Copyright 2008-2020 Sarah Walker. */ #ifndef VIDEO_VOODOO_BANSHEE_BLITTER_H diff --git a/src/include/86box/vid_voodoo_blitter.h b/src/include/86box/vid_voodoo_blitter.h index 2802c7d1e..981c0856d 100644 --- a/src/include/86box/vid_voodoo_blitter.h +++ b/src/include/86box/vid_voodoo_blitter.h @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * * Copyright 2008-2020 Sarah Walker. */ diff --git a/src/include/86box/vid_voodoo_common.h b/src/include/86box/vid_voodoo_common.h index e6d4ad5e4..0fd4155ef 100644 --- a/src/include/86box/vid_voodoo_common.h +++ b/src/include/86box/vid_voodoo_common.h @@ -1,19 +1,19 @@ /* - * 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. * - * Voodoo Graphics, 2, Banshee, 3 emulation. + * Voodoo Graphics, 2, Banshee, 3 emulation. * * * - * Authors: Sarah Walker, - * leilei + * Authors: Sarah Walker, + * leilei * - * Copyright 2008-2020 Sarah Walker. + * Copyright 2008-2020 Sarah Walker. */ #ifndef VIDEO_VOODOO_COMMON_H diff --git a/src/include/86box/vid_voodoo_display.h b/src/include/86box/vid_voodoo_display.h index e415f7824..25b3e9b1a 100644 --- a/src/include/86box/vid_voodoo_display.h +++ b/src/include/86box/vid_voodoo_display.h @@ -1,19 +1,19 @@ /* - * 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. * - * Voodoo Graphics, 2, Banshee, 3 emulation. + * Voodoo Graphics, 2, Banshee, 3 emulation. * * * - * Authors: Sarah Walker, - * leilei + * Authors: Sarah Walker, + * leilei * - * Copyright 2008-2020 Sarah Walker. + * Copyright 2008-2020 Sarah Walker. */ #ifndef VIDEO_VOODOO_DISPLAY_H diff --git a/src/include/86box/vid_voodoo_dither.h b/src/include/86box/vid_voodoo_dither.h index 2d674c5b4..3580cada2 100644 --- a/src/include/86box/vid_voodoo_dither.h +++ b/src/include/86box/vid_voodoo_dither.h @@ -1,19 +1,19 @@ /* - * 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. * - * Voodoo Graphics and 2 specific emulation. + * Voodoo Graphics and 2 specific emulation. * * * - * Authors: Sarah Walker, - * leilei + * Authors: Sarah Walker, + * leilei * - * Copyright 2008-2020 Sarah Walker. + * Copyright 2008-2020 Sarah Walker. */ #ifndef VIDEO_VOODOO_DITHER_H diff --git a/src/include/86box/vid_voodoo_fb.h b/src/include/86box/vid_voodoo_fb.h index 374474cc5..2138e83da 100644 --- a/src/include/86box/vid_voodoo_fb.h +++ b/src/include/86box/vid_voodoo_fb.h @@ -1,19 +1,19 @@ /* - * 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. * - * Voodoo Graphics, 2, Banshee, 3 emulation. + * Voodoo Graphics, 2, Banshee, 3 emulation. * * * - * Authors: Sarah Walker, - * leilei + * Authors: Sarah Walker, + * leilei * - * Copyright 2008-2020 Sarah Walker. + * Copyright 2008-2020 Sarah Walker. */ #ifndef VIDEO_VOODOO_FB_H diff --git a/src/include/86box/vid_voodoo_fifo.h b/src/include/86box/vid_voodoo_fifo.h index 86956cc5a..0073a295c 100644 --- a/src/include/86box/vid_voodoo_fifo.h +++ b/src/include/86box/vid_voodoo_fifo.h @@ -1,19 +1,19 @@ /* - * 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. * - * Voodoo Graphics, 2, Banshee, 3 emulation. + * Voodoo Graphics, 2, Banshee, 3 emulation. * * * - * Authors: Sarah Walker, - * leilei + * Authors: Sarah Walker, + * leilei * - * Copyright 2008-2020 Sarah Walker. + * Copyright 2008-2020 Sarah Walker. */ #ifndef VIDEO_VOODOO_FIFO_H diff --git a/src/include/86box/vid_voodoo_reg.h b/src/include/86box/vid_voodoo_reg.h index 13f7ae932..62738a8c5 100644 --- a/src/include/86box/vid_voodoo_reg.h +++ b/src/include/86box/vid_voodoo_reg.h @@ -1,19 +1,19 @@ /* - * 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. * - * Voodoo Graphics, 2, Banshee, 3 emulation. + * Voodoo Graphics, 2, Banshee, 3 emulation. * * * - * Authors: Sarah Walker, - * leilei + * Authors: Sarah Walker, + * leilei * - * Copyright 2008-2020 Sarah Walker. + * Copyright 2008-2020 Sarah Walker. */ #ifndef VIDEO_VOODOO_REG_H diff --git a/src/include/86box/vid_voodoo_setup.h b/src/include/86box/vid_voodoo_setup.h index be94f9533..d8820a7cb 100644 --- a/src/include/86box/vid_voodoo_setup.h +++ b/src/include/86box/vid_voodoo_setup.h @@ -1,19 +1,19 @@ /* - * 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. * - * Voodoo Graphics, 2, Banshee, 3 emulation. + * Voodoo Graphics, 2, Banshee, 3 emulation. * * * - * Authors: Sarah Walker, - * leilei + * Authors: Sarah Walker, + * leilei * - * Copyright 2008-2020 Sarah Walker. + * Copyright 2008-2020 Sarah Walker. */ #ifndef VIDEO_VOODOO_SETUP_H diff --git a/src/include/86box/vid_voodoo_texture.h b/src/include/86box/vid_voodoo_texture.h index 2e0af97a3..65eec54e4 100644 --- a/src/include/86box/vid_voodoo_texture.h +++ b/src/include/86box/vid_voodoo_texture.h @@ -1,19 +1,19 @@ /* - * 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. * - * Voodoo Graphics, 2, Banshee, 3 emulation. + * Voodoo Graphics, 2, Banshee, 3 emulation. * * * - * Authors: Sarah Walker, - * leilei + * Authors: Sarah Walker, + * leilei * - * Copyright 2008-2020 Sarah Walker. + * Copyright 2008-2020 Sarah Walker. */ #ifndef VIDEO_VOODOO_TEXTURE_H diff --git a/src/include/86box/video.h b/src/include/86box/video.h index abba64574..6f35dc5ee 100644 --- a/src/include/86box/video.h +++ b/src/include/86box/video.h @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/include/86box/vnc.h b/src/include/86box/vnc.h index 7b82ce5d1..a63c53403 100644 --- a/src/include/86box/vnc.h +++ b/src/include/86box/vnc.h @@ -1,18 +1,18 @@ /* - * 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. * - * Definitions for the VNC renderer. + * Definitions for the VNC renderer. * * * - * Author: Fred N. van Kempen, + * Authors: Fred N. van Kempen, * - * Copyright 2017 Fred N. van Kempen. + * Copyright 2017 Fred N. van Kempen. */ #ifndef EMU_VNC_H diff --git a/src/include/86box/win.h b/src/include/86box/win.h index 3174e24b2..99620cbeb 100644 --- a/src/include/86box/win.h +++ b/src/include/86box/win.h @@ -1,23 +1,23 @@ /* - * 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. * - * Platform support defintions for Win32. + * Platform support defintions for Win32. * * * - * Authors: Sarah Walker, - * Miran Grca, - * Fred N. van Kempen, + * Authors: Sarah Walker, + * Miran Grca, + * Fred N. van Kempen, * - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 Miran Grca. - * Copyright 2017-2019 Fred N. van Kempen. - * Copyright 2021 Laci bá' + * Copyright 2008-2019 Sarah Walker. + * Copyright 2016-2019 Miran Grca. + * Copyright 2017-2019 Fred N. van Kempen. + * Copyright 2021 Laci bá' */ #ifndef PLAT_WIN_H diff --git a/src/include/86box/win_opengl.h b/src/include/86box/win_opengl.h index 6192a68c1..80d3695ca 100644 --- a/src/include/86box/win_opengl.h +++ b/src/include/86box/win_opengl.h @@ -1,16 +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. + * 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. * - * Header file for OpenGL rendering module + * Header file for OpenGL rendering module * - * Authors: Teemu Korhonen + * Authors: Teemu Korhonen * - * Copyright 2021 Teemu Korhonen + * Copyright 2021 Teemu Korhonen */ #ifndef WIN_OPENGL_H diff --git a/src/include/86box/win_opengl_glslp.h b/src/include/86box/win_opengl_glslp.h index caf86a04f..6586cd526 100644 --- a/src/include/86box/win_opengl_glslp.h +++ b/src/include/86box/win_opengl_glslp.h @@ -1,16 +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. + * 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. * - * Header file for shader file parser. + * Header file for shader file parser. * - * Authors: Teemu Korhonen + * Authors: Teemu Korhonen * - * Copyright 2021 Teemu Korhonen + * Copyright 2021 Teemu Korhonen */ #ifndef WIN_OPENGL_GLSLP_H diff --git a/src/include/86box/win_sdl.h b/src/include/86box/win_sdl.h index 52902034d..69340e8b6 100644 --- a/src/include/86box/win_sdl.h +++ b/src/include/86box/win_sdl.h @@ -1,38 +1,38 @@ /* - * 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. * - * Definitions for the libSDL2 rendering module. + * Definitions for the libSDL2 rendering module. * * * - * Authors: Fred N. van Kempen, - * Michael Drüing, + * Authors: Fred N. van Kempen, + * Michael Drüing, * - * Copyright 2018,2019 Fred N. van Kempen. - * Copyright 2018,2019 Michael Drüing. + * Copyright 2018-2019 Fred N. van Kempen. + * Copyright 2018-2019 Michael Drüing. * - * Redistribution and use in source and binary forms, with - * or without modification, are permitted provided that the - * following conditions are met: + * Redistribution and use in source and binary forms, with + * or without modification, are permitted provided that the + * following conditions are met: * - * 1. Redistributions of source code must retain the entire - * above notice, this list of conditions and the following - * disclaimer. + * 1. Redistributions of source code must retain the entire + * above notice, this list of conditions and the following + * disclaimer. * - * 2. Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the - * following disclaimer in the documentation and/or other - * materials provided with the distribution. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other + * materials provided with the distribution. * - * 3. Neither the name of the copyright holder nor the names - * of its contributors may be used to endorse or promote - * products derived from this software without specific - * prior written permission. + * 3. Neither the name of the copyright holder nor the names + * of its contributors may be used to endorse or promote + * products derived from this software without specific + * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT diff --git a/src/include/86box/zip.h b/src/include/86box/zip.h index 910436410..3981465ce 100644 --- a/src/include/86box/zip.h +++ b/src/include/86box/zip.h @@ -1,19 +1,19 @@ /* - * 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. * - * Implementation of the Iomega ZIP drive with SCSI(-like) - * commands, for both ATAPI and SCSI usage. + * Implementation of the Iomega ZIP drive with SCSI(-like) + * commands, for both ATAPI and SCSI usage. * * * - * Author: Miran Grca, + * Authors: Miran Grca, * - * Copyright 2018,2019 Miran Grca. + * Copyright 2018-2019 Miran Grca. */ #ifndef EMU_ZIP_H diff --git a/src/include/fdi2raw.h b/src/include/fdi2raw.h index 7a53d9d17..b848b26f2 100644 --- a/src/include/fdi2raw.h +++ b/src/include/fdi2raw.h @@ -1,51 +1,81 @@ /* - * 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. * - * Definitions for the FDI floppy file format. + * Definitions for the FDI floppy file format. * * * - * Authors: Toni Wilen, - * and Vincent Joguin, - * Thomas Harte, + * Authors: Toni Wilen, + * and Vincent Joguin, + * Thomas Harte, * - * Copyright 2001-2004 Toni Wilen. - * Copyright 2001-2004 Vincent Joguin. - * Copyright 2001 Thomas Harte. + * Copyright 2001-2004 Toni Wilen. + * Copyright 2001-2004 Vincent Joguin. + * Copyright 2001-2016 Thomas Harte. */ #ifndef __FDI2RAW_H #define __FDI2RAW_H -#define uae_u8 uint8_t -#define uae_u16 uint16_t -#define uae_u32 uint32_t - +#include +#include #include + typedef struct fdi FDI; #ifdef __cplusplus extern "C" { #endif -extern int fdi2raw_loadtrack(FDI *, uae_u16 *mfmbuf, uae_u16 *tracktiming, int track, int *tracklength, int *indexoffset, int *multirev, int mfm); +/*! + Attempts to parse and return an FDI header from the file @c file. -extern int fdi2raw_loadrevolution(FDI *, uae_u16 *mfmbuf, uae_u16 *tracktiming, int track, int *tracklength, int mfm); + @parameter file the file from which to attempt to read the FDI. + @returns a newly-allocated `FDI` if parsing succeeded; @c NULL otherwise. +*/ +extern FDI *fdi2raw_header(FILE *file); -extern FDI *fdi2raw_header(FILE *f); -extern void fdi2raw_header_free(FDI *); -extern int fdi2raw_get_last_track(FDI *); -extern int fdi2raw_get_num_sector(FDI *); -extern int fdi2raw_get_last_head(FDI *); -extern int fdi2raw_get_type(FDI *); -extern int fdi2raw_get_bit_rate(FDI *); -extern int fdi2raw_get_rotation(FDI *); -extern int fdi2raw_get_write_protect(FDI *); -extern int fdi2raw_get_tpi(FDI *); +/*! + Release all memory associated with @c file. +*/ +extern void fdi2raw_header_free(FDI *file); + +extern int fdi2raw_loadtrack(FDI *, uint16_t *mfmbuf, uint16_t *tracktiming, int track, int *tracklength, int *indexoffset, int *multirev, int mfm); +extern int fdi2raw_loadrevolution(FDI *, uint16_t *mfmbuf, uint16_t *tracktiming, int track, int *tracklength, int mfm); + +typedef enum { + FDI2RawDiskType8Inch = 0, + FDI2RawDiskType5_25Inch = 1, + FDI2RawDiskType3_5Inch = 2, + FDI2RawDiskType3Inch = 3, +} FDI2RawDiskType; + +/// @returns the disk type described by @c fdi. +extern FDI2RawDiskType fdi2raw_get_type(FDI *fdi); + +/// @returns the bit rate at which @c fdi is sampled if spinning at the intended rate, in Kbit/s. +extern int fdi2raw_get_bit_rate(FDI *fdi); + +/// @returns the intended rotation speed of @c fdi, in rotations per minute. +extern int fdi2raw_get_rotation(FDI *fdi); + +/// @returns whether the imaged disk was write protected. +extern bool fdi2raw_get_write_protect(FDI *fdi); + +/// @returns the final enumerated track represented in @c fdi. +extern int fdi2raw_get_last_track(FDI *fdi); + +/// @returns the final enumerated head represented in @c fdi. +extern int fdi2raw_get_last_head(FDI *fdi); + +/// @returns @c 22 if track 0 is a standard Amiga high-density; @c 11 otherwise. +extern int fdi2raw_get_num_sector(FDI *fdi); + +extern int fdi2raw_get_tpi(FDI *fdi); #ifdef __cplusplus } diff --git a/src/include/glad/glad.h b/src/include/glad/glad.h index 0b4d36656..5b2fd13f4 100644 --- a/src/include/glad/glad.h +++ b/src/include/glad/glad.h @@ -1,6 +1,6 @@ /* - OpenGL loader generated by glad 0.1.34 on Sat Dec 4 18:46:02 2021. + OpenGL loader generated by glad 0.1.36 on Sat Jan 7 18:24:33 2023. Language/Generator: C/C++ Specification: gl diff --git a/src/include/minitrace/minitrace.h b/src/include/minitrace/minitrace.h index 2047eedb7..0335c9ac3 100644 --- a/src/include/minitrace/minitrace.h +++ b/src/include/minitrace/minitrace.h @@ -1,7 +1,7 @@ // Minitrace // // Copyright 2014 by Henrik Rydgård -// http://www.github.com/hrydgard/minitrace +// https://www.github.com/hrydgard/minitrace // Released under the MIT license. // // Ultra-light dependency free library for performance tracing C/C++ applications. @@ -71,13 +71,13 @@ const char *mtr_pool_string(const char *str); // Commented-out types will be supported in the future. typedef enum { - MTR_ARG_TYPE_NONE = 0, - MTR_ARG_TYPE_INT = 1, // I - // MTR_ARG_TYPE_FLOAT = 2, // TODO - // MTR_ARG_TYPE_DOUBLE = 3, // TODO - MTR_ARG_TYPE_STRING_CONST = 8, // C - MTR_ARG_TYPE_STRING_COPY = 9, - // MTR_ARG_TYPE_JSON_COPY = 10, + MTR_ARG_TYPE_NONE = 0, + MTR_ARG_TYPE_INT = 1, // I + // MTR_ARG_TYPE_FLOAT = 2, // TODO + // MTR_ARG_TYPE_DOUBLE = 3, // TODO + MTR_ARG_TYPE_STRING_CONST = 8, // C + MTR_ARG_TYPE_STRING_COPY = 9, + // MTR_ARG_TYPE_JSON_COPY = 10, } mtr_arg_type; // TODO: Add support for more than one argument (metadata) per event @@ -213,55 +213,55 @@ void internal_mtr_raw_event_arg(const char *category, const char *name, char ph, // These are optimized to use X events (combined B and E). Much easier to do in C++ than in C. class MTRScopedTrace { public: - MTRScopedTrace(const char *category, const char *name) - : category_(category), name_(name) { - start_time_ = mtr_time_s(); - } - ~MTRScopedTrace() { - internal_mtr_raw_event(category_, name_, 'X', &start_time_); - } + MTRScopedTrace(const char *category, const char *name) + : category_(category), name_(name) { + start_time_ = mtr_time_s(); + } + ~MTRScopedTrace() { + internal_mtr_raw_event(category_, name_, 'X', &start_time_); + } private: - const char *category_; - const char *name_; - double start_time_; + const char *category_; + const char *name_; + double start_time_; }; // Only outputs a block if execution time exceeded the limit. // TODO: This will effectively call mtr_time_s twice at the end, which is bad. class MTRScopedTraceLimit { public: - MTRScopedTraceLimit(const char *category, const char *name, double limit_s) - : category_(category), name_(name), limit_(limit_s) { - start_time_ = mtr_time_s(); - } - ~MTRScopedTraceLimit() { - double end_time = mtr_time_s(); - if (end_time - start_time_ >= limit_) { - internal_mtr_raw_event(category_, name_, 'X', &start_time_); - } - } + MTRScopedTraceLimit(const char *category, const char *name, double limit_s) + : category_(category), name_(name), limit_(limit_s) { + start_time_ = mtr_time_s(); + } + ~MTRScopedTraceLimit() { + double end_time = mtr_time_s(); + if (end_time - start_time_ >= limit_) { + internal_mtr_raw_event(category_, name_, 'X', &start_time_); + } + } private: - const char *category_; - const char *name_; - double start_time_; - double limit_; + const char *category_; + const char *name_; + double start_time_; + double limit_; }; class MTRScopedTraceArg { public: - MTRScopedTraceArg(const char *category, const char *name, mtr_arg_type arg_type, const char *arg_name, void *arg_value) - : category_(category), name_(name) { - internal_mtr_raw_event_arg(category, name, 'B', 0, arg_type, arg_name, arg_value); - } - ~MTRScopedTraceArg() { - internal_mtr_raw_event(category_, name_, 'E', 0); - } + MTRScopedTraceArg(const char *category, const char *name, mtr_arg_type arg_type, const char *arg_name, void *arg_value) + : category_(category), name_(name) { + internal_mtr_raw_event_arg(category, name, 'B', 0, arg_type, arg_name, arg_value); + } + ~MTRScopedTraceArg() { + internal_mtr_raw_event(category_, name_, 'E', 0); + } private: - const char *category_; - const char *name_; + const char *category_; + const char *name_; }; #endif diff --git a/src/ini.c b/src/ini.c index 59a3dc629..009d21c0b 100644 --- a/src/ini.c +++ b/src/ini.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * Overdoze, @@ -19,7 +19,7 @@ * Copyright 2008-2019 Sarah Walker. * Copyright 2016-2019 Miran Grca. * Copyright 2017-2019 Fred N. van Kempen. - * Copyright 2018,2019 David Hrdlička. + * Copyright 2018-2019 David Hrdlička. * * NOTE: Forcing config files to be in Unicode encoding breaks * it on Windows XP, and possibly also Vista. Use the diff --git a/src/io.c b/src/io.c index cf934b895..0cd7cd87b 100644 --- a/src/io.c +++ b/src/io.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/mac/CMakeLists.txt b/src/mac/CMakeLists.txt index 9ad6206a8..bbdf1d5d5 100644 --- a/src/mac/CMakeLists.txt +++ b/src/mac/CMakeLists.txt @@ -38,9 +38,9 @@ set_source_files_properties(${APP_ICON_MACOSX} # Prepare long version string if(EMU_BUILD) - set(LONG_VER_STRING "${CMAKE_PROJECT_VERSION} [${EMU_BUILD}]") + set(LONG_VER_STRING "${CMAKE_PROJECT_VERSION} [${EMU_BUILD}]") else() - set(LONG_VER_STRING "${CMAKE_PROJECT_VERSION}") + set(LONG_VER_STRING "${CMAKE_PROJECT_VERSION}") endif() # Generate Info.plist diff --git a/src/machine/CMakeLists.txt b/src/machine/CMakeLists.txt index 1f356a91d..e88631044 100644 --- a/src/machine/CMakeLists.txt +++ b/src/machine/CMakeLists.txt @@ -10,7 +10,7 @@ # # Authors: David Hrdlička, # -# Copyright 2020,2021 David Hrdlička. +# Copyright 2020-2021 David Hrdlička. # add_library(mch OBJECT machine.c machine_table.c m_xt.c m_xt_compaq.c diff --git a/src/machine/m_amstrad.c b/src/machine/m_amstrad.c index 5d64bda3b..89f8f5670 100644 --- a/src/machine/m_amstrad.c +++ b/src/machine/m_amstrad.c @@ -31,7 +31,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * John Elliott, @@ -935,45 +935,45 @@ vid_speed_changed_200(void *priv) */ static unsigned char mapping1[256] = { // clang-format off -/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ -/*00*/ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -/*10*/ 2, 0, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, -/*20*/ 2, 2, 0, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, -/*30*/ 2, 2, 2, 0, 2, 2, 1, 1, 2, 2, 2, 1, 2, 2, 1, 1, -/*40*/ 2, 2, 1, 1, 0, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, -/*50*/ 2, 2, 1, 1, 2, 0, 1, 1, 2, 2, 1, 1, 2, 1, 1, 1, -/*60*/ 2, 2, 2, 2, 2, 2, 0, 1, 2, 2, 2, 2, 2, 2, 1, 1, -/*70*/ 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 1, -/*80*/ 2, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, -/*90*/ 2, 2, 1, 1, 1, 1, 1, 1, 2, 0, 1, 1, 1, 1, 1, 1, -/*A0*/ 2, 2, 2, 1, 2, 2, 1, 1, 2, 2, 0, 1, 2, 2, 1, 1, -/*B0*/ 2, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 0, 2, 2, 1, 1, -/*C0*/ 2, 2, 1, 1, 2, 1, 1, 1, 2, 2, 1, 1, 0, 1, 1, 1, -/*D0*/ 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 0, 1, 1, -/*E0*/ 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 0, 1, -/*F0*/ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, +/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ +/*00*/ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +/*10*/ 2, 0, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, +/*20*/ 2, 2, 0, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, +/*30*/ 2, 2, 2, 0, 2, 2, 1, 1, 2, 2, 2, 1, 2, 2, 1, 1, +/*40*/ 2, 2, 1, 1, 0, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, +/*50*/ 2, 2, 1, 1, 2, 0, 1, 1, 2, 2, 1, 1, 2, 1, 1, 1, +/*60*/ 2, 2, 2, 2, 2, 2, 0, 1, 2, 2, 2, 2, 2, 2, 1, 1, +/*70*/ 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 1, +/*80*/ 2, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, +/*90*/ 2, 2, 1, 1, 1, 1, 1, 1, 2, 0, 1, 1, 1, 1, 1, 1, +/*A0*/ 2, 2, 2, 1, 2, 2, 1, 1, 2, 2, 0, 1, 2, 2, 1, 1, +/*B0*/ 2, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 0, 2, 2, 1, 1, +/*C0*/ 2, 2, 1, 1, 2, 1, 1, 1, 2, 2, 1, 1, 0, 1, 1, 1, +/*D0*/ 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 0, 1, 1, +/*E0*/ 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 0, 1, +/*F0*/ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, // clang-format on }; static unsigned char mapping2[256] = { // clang-format off -/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ -/*00*/ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -/*10*/ 1, 3, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, -/*20*/ 1, 1, 3, 2, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, -/*30*/ 1, 1, 1, 3, 1, 1, 2, 2, 1, 1, 1, 2, 1, 1, 2, 2, -/*40*/ 1, 1, 2, 2, 3, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, -/*50*/ 1, 1, 2, 2, 1, 3, 2, 2, 1, 1, 2, 2, 1, 2, 2, 2, -/*60*/ 1, 1, 1, 1, 1, 1, 3, 2, 1, 1, 1, 1, 1, 1, 2, 2, -/*70*/ 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 2, -/*80*/ 2, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, -/*90*/ 1, 1, 2, 2, 2, 2, 2, 2, 1, 3, 2, 2, 2, 2, 2, 2, -/*A0*/ 1, 1, 1, 2, 1, 1, 2, 2, 1, 1, 3, 2, 1, 1, 2, 2, -/*B0*/ 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 3, 1, 1, 2, 2, -/*C0*/ 1, 1, 2, 2, 1, 2, 2, 2, 1, 1, 2, 2, 3, 2, 2, 2, -/*D0*/ 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 1, 3, 2, 2, -/*E0*/ 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 3, 2, -/*F0*/ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, +/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ +/*00*/ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +/*10*/ 1, 3, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, +/*20*/ 1, 1, 3, 2, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, +/*30*/ 1, 1, 1, 3, 1, 1, 2, 2, 1, 1, 1, 2, 1, 1, 2, 2, +/*40*/ 1, 1, 2, 2, 3, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, +/*50*/ 1, 1, 2, 2, 1, 3, 2, 2, 1, 1, 2, 2, 1, 2, 2, 2, +/*60*/ 1, 1, 1, 1, 1, 1, 3, 2, 1, 1, 1, 1, 1, 1, 2, 2, +/*70*/ 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 2, +/*80*/ 2, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, +/*90*/ 1, 1, 2, 2, 2, 2, 2, 2, 1, 3, 2, 2, 2, 2, 2, 2, +/*A0*/ 1, 1, 1, 2, 1, 1, 2, 2, 1, 1, 3, 2, 1, 1, 2, 2, +/*B0*/ 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 3, 1, 1, 2, 2, +/*C0*/ 1, 1, 2, 2, 1, 2, 2, 2, 1, 1, 2, 2, 3, 2, 2, 2, +/*D0*/ 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 1, 3, 2, 2, +/*E0*/ 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 3, 2, +/*F0*/ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, // clang-format on }; @@ -1054,7 +1054,7 @@ vid_out_200(uint16_t addr, uint8_t val, void *priv) uint8_t old; switch (addr) { - /* MDA writes ============================================================== */ + /* MDA writes ============================================================== */ case 0x3b1: case 0x3b3: case 0x3b5: @@ -1087,7 +1087,7 @@ vid_out_200(uint16_t addr, uint8_t val, void *priv) nmi_raise(); return; - /* CGA writes ============================================================== */ + /* CGA writes ============================================================== */ case 0x03d1: case 0x03d3: case 0x03d5: @@ -1122,12 +1122,12 @@ vid_out_200(uint16_t addr, uint8_t val, void *priv) set_lcd_cols(val); return; - /* PC200 control port writes ============================================== */ + /* PC200 control port writes ============================================== */ case 0x03de: vid->crtc_index = 0x1f; - /* NMI only seems to be triggered if the value being written has the high - * bit set (enable NMI). So it only protects writes to this port if you - * let it? */ + /* NMI only seems to be triggered if the value being written has the high + * bit set (enable NMI). So it only protects writes to this port if you + * let it? */ if (val & 0x80) { vid->operation_ctrl = val; vid->crtc_index |= 0x40; @@ -2032,14 +2032,14 @@ kbd_write(uint16_t port, uint8_t val, void *priv) /* * PortB - System Control. * - * 7 Enable Status-1/Disable Keyboard Code on Port A. - * 6 Enable incoming Keyboard Clock. - * 5 Prevent external parity errors from causing NMI. - * 4 Disable parity checking of on-board system Ram. - * 3 Undefined (Not Connected). - * 2 Enable Port C LSB / Disable MSB. (See 1.8.3) - * 1 Speaker Drive. - * 0 8253 GATE 2 (Speaker Modulate). + * 7 Enable Status-1/Disable Keyboard Code on Port A. + * 6 Enable incoming Keyboard Clock. + * 5 Prevent external parity errors from causing NMI. + * 4 Disable parity checking of on-board system Ram. + * 3 Undefined (Not Connected). + * 2 Enable Port C LSB / Disable MSB. (See 1.8.3) + * 1 Speaker Drive. + * 0 8253 GATE 2 (Speaker Modulate). * * This register is controlled by BIOS and/or ROS. */ @@ -2097,14 +2097,14 @@ kbd_read(uint16_t port, void *priv) /* * PortA - System Status 1 * - * 7 Always 0 (KBD7) - * 6 Second Floppy disk drive installed (KBD6) - * 5 DDM1 - Default Display Mode bit 1 (KBD5) - * 4 DDM0 - Default Display Mode bit 0 (KBD4) - * 3 Always 1 (KBD3) - * 2 Always 1 (KBD2) - * 1 8087 NDP installed (KBD1) - * 0 Always 1 (KBD0) + * 7 Always 0 (KBD7) + * 6 Second Floppy disk drive installed (KBD6) + * 5 DDM1 - Default Display Mode bit 1 (KBD5) + * 4 DDM0 - Default Display Mode bit 0 (KBD4) + * 3 Always 1 (KBD3) + * 2 Always 1 (KBD2) + * 1 8087 NDP installed (KBD1) + * 0 Always 1 (KBD0) * * DDM00 * 00 unknown, external color? @@ -2137,27 +2137,27 @@ kbd_read(uint16_t port, void *priv) /* * PortC - System Status 2. * - * 7 On-board system RAM parity error. - * 6 External parity error (I/OCHCK from expansion bus). - * 5 8253 PIT OUT2 output. - * 4 Undefined (Not Connected). + * 7 On-board system RAM parity error. + * 6 External parity error (I/OCHCK from expansion bus). + * 5 8253 PIT OUT2 output. + * 4 Undefined (Not Connected). *------------------------------------------- - * LSB MSB (depends on PB2) + * LSB MSB (depends on PB2) *------------------------------------------- - * 3 RAM3 Undefined - * 2 RAM2 Undefined - * 1 RAM1 Undefined - * 0 RAM0 RAM4 + * 3 RAM3 Undefined + * 2 RAM2 Undefined + * 1 RAM1 Undefined + * 0 RAM0 RAM4 * * PC7 is forced to 0 when on-board system RAM parity * checking is disabled by PB4. * * RAM4:0 - * 01110 512K bytes on-board. - * 01111 544K bytes (32K external). - * 10000 576K bytes (64K external). - * 10001 608K bytes (96K external). - * 10010 640K bytes (128K external or fitted on-board). + * 01110 512K bytes on-board. + * 01111 544K bytes (32K external). + * 10000 576K bytes (64K external). + * 10001 608K bytes (96K external). + * 10010 640K bytes (128K external or fitted on-board). */ if (ams->pb & 0x04) ret = ams->stat2 & 0x0f; @@ -2226,14 +2226,14 @@ ams_read(uint16_t port, void *priv) case 0x0379: /* printer control, also set LK1-3. * per John Elliott's site, this is xor'ed with 0x07 - * 7 English Language. - * 6 German Language. - * 5 French Language. - * 4 Spanish Language. - * 3 Danish Language. - * 2 Swedish Language. - * 1 Italian Language. - * 0 Diagnostic Mode. + * 7 English Language. + * 6 German Language. + * 5 French Language. + * 4 Spanish Language. + * 3 Danish Language. + * 2 Swedish Language. + * 1 Italian Language. + * 0 Diagnostic Mode. */ ret = (lpt_read(port, &lpt_ports[0]) & 0xf8) | ams->language; break; diff --git a/src/machine/m_at.c b/src/machine/m_at.c index ccee2f1e7..92f8c0f5f 100644 --- a/src/machine/m_at.c +++ b/src/machine/m_at.c @@ -12,7 +12,7 @@ * * Authors: Fred N. van Kempen, * Miran Grca, - * Sarah Walker, + * Sarah Walker, * * Copyright 2017-2020 Fred N. van Kempen. * Copyright 2016-2020 Miran Grca. diff --git a/src/machine/m_at_286_386sx.c b/src/machine/m_at_286_386sx.c index ee117fa33..253ce804d 100644 --- a/src/machine/m_at_286_386sx.c +++ b/src/machine/m_at_286_386sx.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * EngiNerd * diff --git a/src/machine/m_at_386dx_486.c b/src/machine/m_at_386dx_486.c index 1343b38ad..b9583f72e 100644 --- a/src/machine/m_at_386dx_486.c +++ b/src/machine/m_at_386dx_486.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2010-2020 Sarah Walker. @@ -635,10 +635,9 @@ machine_at_pc330_6573_init(const machine_t *model) /* doesn't like every CPU oth pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x10, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - - pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x12, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x12, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); device_add(&opti802g_pci_device); device_add(&opti822_device); @@ -1003,10 +1002,10 @@ machine_at_alfredo_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_2 | PCI_NO_IRQ_STEERING); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x01, PCI_CARD_IDE, 0, 0, 0, 0); - pci_register_slot(0x06, PCI_CARD_NORMAL, 3, 2, 1, 4); - pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 1, 3, 4); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 3, 2, 4); + pci_register_slot(0x01, PCI_CARD_IDE, 0, 0, 0, 0); + pci_register_slot(0x06, PCI_CARD_NORMAL, 3, 2, 1, 4); + pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 1, 3, 4); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 3, 2, 4); pci_register_slot(0x02, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&keyboard_ps2_pci_device); device_add(&sio_device); @@ -1033,9 +1032,9 @@ machine_at_ninja_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_1 | PCI_NO_IRQ_STEERING); pci_register_slot(0x05, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 1, 2); - pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 1, 2, 1); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 1, 2, 1); + pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 1, 2); + pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 1, 2, 1); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 1, 2, 1); device_add(&keyboard_ps2_intel_ami_pci_device); device_add(&intel_flash_bxt_ami_device); @@ -1061,13 +1060,13 @@ machine_at_486sp3_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_2 | PCI_NO_IRQ_STEERING); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x01, PCI_CARD_SCSI, 1, 2, 3, 4); /* 01 = SCSI */ - pci_register_slot(0x03, PCI_CARD_NORMAL, 1, 2, 3, 4); /* 03 = Slot 1 */ - pci_register_slot(0x04, PCI_CARD_NORMAL, 2, 3, 4, 1); /* 04 = Slot 2 */ - 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(0x01, PCI_CARD_SCSI, 1, 2, 3, 4); /* 01 = SCSI */ + pci_register_slot(0x03, PCI_CARD_NORMAL, 1, 2, 3, 4); /* 03 = Slot 1 */ + pci_register_slot(0x04, PCI_CARD_NORMAL, 2, 3, 4, 1); /* 04 = Slot 2 */ + 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_ps2_ami_pci_device); /* Uses the AMIKEY KBC */ device_add(&sio_device); device_add(&fdc37c663_ide_device); device_add(&sst_flash_29ee010_device); @@ -1095,12 +1094,12 @@ machine_at_pci400cb_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(0x0F, PCI_CARD_NORMAL, 4, 3, 2, 1); /* 0F = Slot 1 */ - pci_register_slot(0x0E, PCI_CARD_NORMAL, 3, 4, 1, 2); /* 0E = Slot 2 */ - pci_register_slot(0x0D, PCI_CARD_NORMAL, 2, 3, 4, 1); /* 0D = Slot 3 */ - pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); /* 0C = Slot 4 */ - device_add(&keyboard_ps2_ami_pci_device); /* Assume AMI Megakey 1993 standalone ('P') - because of the Tekram machine below. */ + pci_register_slot(0x0F, PCI_CARD_NORMAL, 4, 3, 2, 1); /* 0F = Slot 1 */ + pci_register_slot(0x0E, PCI_CARD_NORMAL, 3, 4, 1, 2); /* 0E = Slot 2 */ + pci_register_slot(0x0D, PCI_CARD_NORMAL, 2, 3, 4, 1); /* 0D = Slot 3 */ + pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); /* 0C = Slot 4 */ + device_add(&keyboard_ps2_ami_pci_device); /* Assume AMI Megakey 1993 standalone ('P') + because of the Tekram machine below. */ device_add(&ims8848_device); @@ -1127,10 +1126,10 @@ machine_at_g486ip_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(0x0F, PCI_CARD_NORMAL, 3, 4, 1, 2); /* 03 = Slot 1 */ - pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 3, 4, 1); /* 04 = Slot 2 */ - pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); /* 05 = Slot 3 */ - device_add(&keyboard_ps2_ami_pci_device); /* AMI Megakey 1993 stanalone ('P') */ + pci_register_slot(0x0F, PCI_CARD_NORMAL, 3, 4, 1, 2); /* 03 = Slot 1 */ + pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 3, 4, 1); /* 04 = Slot 2 */ + pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); /* 05 = Slot 3 */ + device_add(&keyboard_ps2_ami_pci_device); /* AMI Megakey 1993 stanalone ('P') */ device_add(&ims8848_device); @@ -1156,12 +1155,12 @@ machine_at_486sp3g_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_2); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x01, PCI_CARD_SCSI, 1, 2, 3, 4); /* 01 = SCSI */ - pci_register_slot(0x06, PCI_CARD_NORMAL, 1, 2, 3, 4); /* 06 = Slot 1 */ - pci_register_slot(0x05, PCI_CARD_NORMAL, 2, 3, 4, 1); /* 05 = Slot 2 */ - pci_register_slot(0x04, PCI_CARD_NORMAL, 3, 4, 1, 2); /* 04 = Slot 3 */ + pci_register_slot(0x01, PCI_CARD_SCSI, 1, 2, 3, 4); /* 01 = SCSI */ + pci_register_slot(0x06, PCI_CARD_NORMAL, 1, 2, 3, 4); /* 06 = Slot 1 */ + pci_register_slot(0x05, PCI_CARD_NORMAL, 2, 3, 4, 1); /* 05 = Slot 2 */ + pci_register_slot(0x04, PCI_CARD_NORMAL, 3, 4, 1, 2); /* 04 = Slot 3 */ 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_ps2_ami_pci_device); /* Uses the AMIKEY KBC */ device_add(&sio_zb_device); device_add(&pc87332_398_ide_device); device_add(&sst_flash_29ee010_device); @@ -1188,11 +1187,11 @@ machine_at_486ap4_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_1 | PCI_NO_IRQ_STEERING); /* Excluded: 5, 6, 7, 8 */ pci_register_slot(0x05, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x09, PCI_CARD_NORMAL, 1, 2, 3, 4); /* 09 = Slot 1 */ - pci_register_slot(0x0a, PCI_CARD_NORMAL, 2, 3, 4, 1); /* 0a = Slot 2 */ - pci_register_slot(0x0b, PCI_CARD_NORMAL, 3, 4, 1, 2); /* 0b = Slot 3 */ - 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 */ + pci_register_slot(0x09, PCI_CARD_NORMAL, 1, 2, 3, 4); /* 09 = Slot 1 */ + pci_register_slot(0x0a, PCI_CARD_NORMAL, 2, 3, 4, 1); /* 0a = Slot 2 */ + pci_register_slot(0x0b, PCI_CARD_NORMAL, 3, 4, 1, 2); /* 0b = Slot 3 */ + 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) device_add(&fdc_at_device); @@ -1217,10 +1216,10 @@ machine_at_g486vpa_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(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(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); device_add(&via_vt82c49x_pci_ide_device); device_add(&via_vt82c505_device); @@ -1246,10 +1245,10 @@ machine_at_486vipio2_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(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(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); device_add(&via_vt82c49x_pci_ide_device); device_add(&via_vt82c505_device); @@ -1275,9 +1274,9 @@ machine_at_abpb4_init(const machine_t *model) pci_init(PCI_CAN_SWITCH_TYPE); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x03, PCI_CARD_NORMAL, 1, 2, 3, 4); - 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(0x03, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x04, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x05, PCI_CARD_NORMAL, 3, 4, 1, 2); device_add(&ali1489_device); device_add(&w83787f_device); @@ -1303,9 +1302,9 @@ machine_at_win486pci_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(0x03, PCI_CARD_NORMAL, 1, 2, 3, 4); - 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(0x03, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x04, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x05, PCI_CARD_NORMAL, 3, 4, 1, 2); device_add(&ali1489_device); device_add(&prime3b_device); @@ -1329,10 +1328,10 @@ machine_at_ms4145_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(0x03, PCI_CARD_NORMAL, 1, 2, 3, 4); - 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(0x06, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x03, PCI_CARD_NORMAL, 1, 2, 3, 4); + 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(0x06, PCI_CARD_NORMAL, 4, 1, 2, 3); device_add(&ali1489_device); device_add(&w83787f_device); @@ -1357,11 +1356,11 @@ machine_at_sbc490_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(0x0F, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0E, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x01, PCI_CARD_VIDEO, 4, 1, 2, 3); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0E, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x01, PCI_CARD_VIDEO, 4, 1, 2, 3); device_add(&ali1489_device); device_add(&fdc37c665_device); @@ -1390,7 +1389,7 @@ machine_at_tf486_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(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); device_add(&ali1489_device); device_add(&w83977ef_device); @@ -1416,7 +1415,7 @@ machine_at_itoxstar_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x0B, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); pci_register_slot(0x0C, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x1F, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x1F, PCI_CARD_NORMAL, 1, 2, 3, 4); device_add(&w83977f_device); device_add(&keyboard_ps2_ami_pci_device); device_add(&stpc_client_device); @@ -1445,9 +1444,9 @@ machine_at_arb1423c_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x0B, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); pci_register_slot(0x0C, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x1F, PCI_CARD_NORMAL, 1, 0, 0, 0); - pci_register_slot(0x1E, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x1D, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x1F, PCI_CARD_NORMAL, 1, 0, 0, 0); + pci_register_slot(0x1E, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x1D, PCI_CARD_NORMAL, 3, 4, 1, 2); device_add(&w83977f_device); device_add(&keyboard_ps2_ami_pci_device); device_add(&stpc_consumer2_device); @@ -1472,9 +1471,9 @@ machine_at_arb1479_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x0B, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); pci_register_slot(0x0C, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x1F, PCI_CARD_NORMAL, 1, 0, 0, 0); - pci_register_slot(0x1E, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x1D, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x1F, PCI_CARD_NORMAL, 1, 0, 0, 0); + pci_register_slot(0x1E, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x1D, PCI_CARD_NORMAL, 3, 4, 1, 2); device_add(&w83977f_device); device_add(&keyboard_ps2_ami_pci_device); device_add(&stpc_consumer2_device); @@ -1499,9 +1498,9 @@ machine_at_pcm9340_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x0B, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); pci_register_slot(0x0C, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x1D, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x1E, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x1F, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x1D, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x1E, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x1F, PCI_CARD_NORMAL, 2, 3, 4, 1); device_add_inst(&w83977f_device, 1); device_add_inst(&w83977f_device, 2); device_add(&keyboard_ps2_ami_pci_device); @@ -1529,7 +1528,7 @@ machine_at_pcm5330_init(const machine_t *model) pci_register_slot(0x0C, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); pci_register_slot(0x0D, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); pci_register_slot(0x0E, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); - pci_register_slot(0x13, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x13, PCI_CARD_NORMAL, 1, 2, 3, 4); device_add(&stpc_serial_device); device_add(&w83977f_370_device); device_add(&keyboard_ps2_ami_pci_device); @@ -1555,10 +1554,10 @@ machine_at_ecs486_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x10, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); pci_register_slot(0x12, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); - pci_register_slot(0x0F, PCI_CARD_IDE, 0, 0, 0, 0); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0E, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0F, PCI_CARD_IDE, 0, 0, 0, 0); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0E, PCI_CARD_NORMAL, 3, 4, 1, 2); device_add(&umc_hb4_device); device_add(&umc_8886f_device); @@ -1586,10 +1585,10 @@ machine_at_hot433_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x10, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); pci_register_slot(0x12, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x0E, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x0F, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x0E, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 2, 3, 4, 1); device_add(&umc_hb4_device); device_add(&umc_8886af_device); @@ -1618,9 +1617,9 @@ machine_at_atc1415_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x10, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); pci_register_slot(0x12, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x13, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x14, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x13, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x14, PCI_CARD_NORMAL, 3, 4, 1, 2); device_add(&umc_hb4_device); device_add(&umc_8886af_device); @@ -1649,10 +1648,10 @@ machine_at_actionpc2600_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x10, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); pci_register_slot(0x12, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x0E, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x0F, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x0E, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 2, 3, 4, 1); device_add(&umc_hb4_device); device_add(&umc_8886af_device); @@ -1679,9 +1678,9 @@ machine_at_m919_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x10, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); pci_register_slot(0x12, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x0E, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x0E, PCI_CARD_NORMAL, 3, 4, 1, 2); device_add(&umc_hb4_device); device_add(&umc_8886af_device); @@ -1708,9 +1707,9 @@ machine_at_spc7700plw_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x10, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); pci_register_slot(0x12, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0E, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0E, PCI_CARD_NORMAL, 3, 4, 1, 2); device_add(&umc_hb4_device); device_add(&umc_8886af_device); diff --git a/src/machine/m_at_commodore.c b/src/machine/m_at_commodore.c index 8eeabab19..3587db44a 100644 --- a/src/machine/m_at_commodore.c +++ b/src/machine/m_at_commodore.c @@ -12,9 +12,9 @@ * * Authors: Fred N. van Kempen, * Miran Grca, - * Sarah Walker, + * Sarah Walker, * - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. * Copyright 2016-2018 Miran Grca. * Copyright 2008-2018 Sarah Walker. * diff --git a/src/machine/m_at_compaq.c b/src/machine/m_at_compaq.c index 74e853834..0b3a901b5 100644 --- a/src/machine/m_at_compaq.c +++ b/src/machine/m_at_compaq.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * TheCollector1995, * @@ -527,9 +527,9 @@ compaq_plasma_recalcattrs(compaq_plasma_t *self) * Bit 0: Attributes 01-06, 08-0E are inverse video * Bit 1: Attributes 01-06, 08-0E are bold * Bit 2: Attributes 11-16, 18-1F, 21-26, 28-2F ... F1-F6, F8-FF - * are inverse video + * are inverse video * Bit 3: Attributes 11-16, 18-1F, 21-26, 28-2F ... F1-F6, F8-FF - * are bold */ + * are bold */ /* Set up colours */ amber = makecol(0xff, 0x7D, 0x00); @@ -686,8 +686,8 @@ const device_config_t compaq_plasma_config[] = { }, { .name = "rgb_type", - .description = "RGB type", - .type = CONFIG_SELECTION, + .description = "RGB type", + .type = CONFIG_SELECTION, .default_string = "", .default_int = 0, .file_filter = "", diff --git a/src/machine/m_at_slot1.c b/src/machine/m_at_slot1.c index ec818871a..71aeeb7fb 100644 --- a/src/machine/m_at_slot1.c +++ b/src/machine/m_at_slot1.c @@ -654,7 +654,7 @@ machine_at_ms6168_common_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(0x14, PCI_CARD_SOUND, 3, 4, 1, 2); - pci_register_slot(0x0E, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0E, PCI_CARD_NORMAL, 1, 2, 3, 4); pci_register_slot(0x10, PCI_CARD_NORMAL, 2, 3, 4, 1); pci_register_slot(0x12, PCI_CARD_NORMAL, 3, 4, 1, 2); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); diff --git a/src/machine/m_at_socket370.c b/src/machine/m_at_socket370.c index 1388eec3a..66ef15e1d 100644 --- a/src/machine/m_at_socket370.c +++ b/src/machine/m_at_socket370.c @@ -96,7 +96,7 @@ machine_at_s1857_init(const machine_t *model) pci_register_slot(0x12, PCI_CARD_NORMAL, 3, 4, 1, 2); pci_register_slot(0x13, PCI_CARD_NORMAL, 4, 1, 2, 3); pci_register_slot(0x14, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); + pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); device_add(&i440bx_device); device_add(&piix4e_device); device_add(&keyboard_ps2_ami_pci_device); @@ -228,11 +228,11 @@ machine_at_ambx133_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(0x09, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0A, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x09, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0A, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 4, 1, 2, 3); pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); device_add(&i440bx_device); device_add(&piix4e_device); @@ -264,11 +264,11 @@ machine_at_awo671r_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(0x09, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0A, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x09, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0A, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 2, 3, 4, 1); pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); device_add(&i440bx_device); device_add(&piix4e_device); @@ -297,11 +297,11 @@ machine_at_63a1_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(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(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); /* Integrated Sound? */ + 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(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); /* Integrated Sound? */ pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); device_add(&i440zx_device); device_add(&piix4e_device); diff --git a/src/machine/m_at_socket4.c b/src/machine/m_at_socket4.c index d24933ff9..2aa94cce5 100644 --- a/src/machine/m_at_socket4.c +++ b/src/machine/m_at_socket4.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2010-2019 Sarah Walker. @@ -51,10 +51,10 @@ machine_at_premiere_common_init(const machine_t *model, int pci_switch) pci_init(PCI_CONFIG_TYPE_2 | pci_switch); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x01, PCI_CARD_IDE, 0, 0, 0, 0); - pci_register_slot(0x06, PCI_CARD_NORMAL, 3, 2, 1, 4); - pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 1, 3, 4); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 3, 2, 4); + pci_register_slot(0x01, PCI_CARD_IDE, 0, 0, 0, 0); + pci_register_slot(0x06, PCI_CARD_NORMAL, 3, 2, 1, 4); + pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 1, 3, 4); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 3, 2, 4); pci_register_slot(0x02, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&keyboard_ps2_intel_ami_pci_device); device_add(&sio_zb_device); @@ -70,12 +70,12 @@ machine_at_award_common_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_2 | PCI_NO_IRQ_STEERING); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x01, PCI_CARD_IDE, 0, 0, 0, 0); - pci_register_slot(0x03, PCI_CARD_NORMAL, 1, 2, 3, 4); /* 03 = Slot 1 */ - pci_register_slot(0x04, PCI_CARD_NORMAL, 2, 3, 4, 1); /* 04 = Slot 2 */ - 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(0x07, PCI_CARD_SCSI, 1, 2, 3, 4); /* 07 = SCSI */ + pci_register_slot(0x01, PCI_CARD_IDE, 0, 0, 0, 0); + pci_register_slot(0x03, PCI_CARD_NORMAL, 1, 2, 3, 4); /* 03 = Slot 1 */ + pci_register_slot(0x04, PCI_CARD_NORMAL, 2, 3, 4, 1); /* 04 = Slot 2 */ + 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(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) @@ -97,10 +97,10 @@ machine_at_sp4_common_init(const machine_t *model) pci_register_slot(0x0D, PCI_CARD_IDE, 1, 2, 3, 4); /* Excluded: 02, 03*, 04*, 05*, 06*, 07*, 08* */ /* Slots: 09 (04), 0A (03), 0B (02), 0C (07) */ - pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x09, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x09, PCI_CARD_NORMAL, 4, 1, 2, 3); device_add(&sis_85c50x_device); device_add(&ide_cmd640_pci_device); device_add(&keyboard_ps2_ami_pci_device); @@ -123,10 +123,10 @@ machine_at_excaliburpci_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_2); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x03, PCI_CARD_IDE, 0, 0, 0, 0); - pci_register_slot(0x0F, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x03, PCI_CARD_IDE, 0, 0, 0, 0); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 3, 4, 1, 2); pci_register_slot(0x02, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&fdc37c665_device); device_add(&keyboard_ps2_ami_pci_device); @@ -155,9 +155,9 @@ machine_at_p5mp3_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_2 | PCI_NO_IRQ_STEERING); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x05, PCI_CARD_NORMAL, 1, 2, 3, 4); /* 05 = Slot 1 */ - pci_register_slot(0x04, PCI_CARD_NORMAL, 2, 3, 4, 1); /* 04 = Slot 2 */ - pci_register_slot(0x03, PCI_CARD_NORMAL, 3, 4, 1, 2); /* 03 = Slot 3 */ + pci_register_slot(0x05, PCI_CARD_NORMAL, 1, 2, 3, 4); /* 05 = Slot 1 */ + pci_register_slot(0x04, PCI_CARD_NORMAL, 2, 3, 4, 1); /* 04 = Slot 2 */ + pci_register_slot(0x03, PCI_CARD_NORMAL, 3, 4, 1, 2); /* 03 = Slot 3 */ pci_register_slot(0x02, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&fdc_at_device); device_add(&keyboard_ps2_pci_device); @@ -187,10 +187,10 @@ machine_at_dellxp60_init(const machine_t *model) pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); /* Not: 00, 02, 03, 04, 05, 06, 07, 08, 09, 0A, 0B, 0C, 0D, 0E, 0F. */ /* Yes: 01, 10, 11, 12, 13, 14. */ - pci_register_slot(0x01, PCI_CARD_NORMAL, 1, 3, 2, 4); - pci_register_slot(0x04, PCI_CARD_NORMAL, 4, 4, 3, 3); - pci_register_slot(0x05, PCI_CARD_NORMAL, 1, 4, 3, 2); - pci_register_slot(0x06, PCI_CARD_NORMAL, 2, 1, 3, 4); + pci_register_slot(0x01, PCI_CARD_NORMAL, 1, 3, 2, 4); + pci_register_slot(0x04, PCI_CARD_NORMAL, 4, 4, 3, 3); + pci_register_slot(0x05, PCI_CARD_NORMAL, 1, 4, 3, 2); + pci_register_slot(0x06, PCI_CARD_NORMAL, 2, 1, 3, 4); pci_register_slot(0x02, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&i430lx_device); device_add(&keyboard_ps2_intel_ami_pci_device); @@ -217,9 +217,9 @@ machine_at_opti560l_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_2); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x03, PCI_CARD_NORMAL, 4, 4, 3, 3); - pci_register_slot(0x07, PCI_CARD_NORMAL, 1, 4, 3, 2); - pci_register_slot(0x08, PCI_CARD_NORMAL, 2, 1, 3, 4); + pci_register_slot(0x03, PCI_CARD_NORMAL, 4, 4, 3, 3); + pci_register_slot(0x07, PCI_CARD_NORMAL, 1, 4, 3, 2); + pci_register_slot(0x08, PCI_CARD_NORMAL, 2, 1, 3, 4); pci_register_slot(0x02, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&i430lx_device); device_add(&keyboard_ps2_intel_ami_pci_device); @@ -236,7 +236,8 @@ machine_at_ambradp60_init(const machine_t *model) int ret; ret = bios_load_linear_combined("roms/machines/ambradp60/1004AF1P.BIO", - "roms/machines/ambradp60/1004AF1P.BI1", 0x1c000, 128); + "roms/machines/ambradp60/1004AF1P.BI1", + 0x1c000, 128); if (bios_only || !ret) return ret; @@ -254,7 +255,8 @@ machine_at_valuepointp60_init(const machine_t *model) int ret; ret = bios_load_linear_combined("roms/machines/valuepointp60/1006AV0M.BIO", - "roms/machines/valuepointp60/1006AV0M.BI1", 0x1d000, 128); + "roms/machines/valuepointp60/1006AV0M.BI1", + 0x1d000, 128); if (bios_only || !ret) return ret; @@ -264,10 +266,10 @@ machine_at_valuepointp60_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_2 | PCI_NO_IRQ_STEERING); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x01, PCI_CARD_IDE, 0, 0, 0, 0); - pci_register_slot(0x06, PCI_CARD_NORMAL, 3, 2, 1, 4); - pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 1, 3, 4); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 3, 2, 4); + pci_register_slot(0x01, PCI_CARD_IDE, 0, 0, 0, 0); + pci_register_slot(0x06, PCI_CARD_NORMAL, 3, 2, 1, 4); + pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 1, 3, 4); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 3, 2, 4); pci_register_slot(0x02, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&keyboard_ps2_ps1_pci_device); device_add(&sio_device); @@ -285,7 +287,8 @@ machine_at_revenge_init(const machine_t *model) int ret; ret = bios_load_linear_combined("roms/machines/revenge/1009af2_.bio", - "roms/machines/revenge/1009af2_.bi1", 0x1c000, 128); + "roms/machines/revenge/1009af2_.bi1", + 0x1c000, 128); if (bios_only || !ret) return ret; @@ -323,7 +326,8 @@ machine_at_pb520r_init(const machine_t *model) int ret; ret = bios_load_linear_combined("roms/machines/pb520r/1009bc0r.bio", - "roms/machines/pb520r/1009bc0r.bi1", 0x1d000, 128); + "roms/machines/pb520r/1009bc0r.bi1", + 0x1d000, 128); if (bios_only || !ret) return ret; @@ -332,11 +336,11 @@ machine_at_pb520r_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_2); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x01, PCI_CARD_IDE, 0, 0, 0, 0); - pci_register_slot(0x03, PCI_CARD_VIDEO, 3, 3, 3, 3); - pci_register_slot(0x06, PCI_CARD_NORMAL, 3, 2, 1, 4); - pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 1, 3, 4); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 3, 2, 4); + pci_register_slot(0x01, PCI_CARD_IDE, 0, 0, 0, 0); + pci_register_slot(0x03, PCI_CARD_VIDEO, 3, 3, 3, 3); + pci_register_slot(0x06, PCI_CARD_NORMAL, 3, 2, 1, 4); + pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 1, 3, 4); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 3, 2, 4); pci_register_slot(0x02, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&i430lx_device); device_add(&ide_cmd640_pci_single_channel_device); @@ -389,10 +393,10 @@ machine_at_p5vl_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x10, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x12, PCI_CARD_NORMAL, 5, 6, 7, 8); - pci_register_slot(0x13, PCI_CARD_NORMAL, 9, 10, 11, 12); - pci_register_slot(0x14, PCI_CARD_NORMAL, 13, 14, 15, 16); + pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x12, PCI_CARD_NORMAL, 5, 6, 7, 8); + pci_register_slot(0x13, PCI_CARD_NORMAL, 9, 10, 11, 12); + pci_register_slot(0x14, PCI_CARD_NORMAL, 13, 14, 15, 16); device_add(&opti5x7_pci_device); device_add(&opti822_device); @@ -422,11 +426,11 @@ machine_at_excaliburpci2_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(0x01, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x08, PCI_CARD_IDE, 0, 0, 0, 0); - 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(0x08, PCI_CARD_IDE, 0, 0, 0, 0); + 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); device_add(&fdc37c665_device); device_add(&keyboard_ps2_ami_pci_device); device_add(&ide_cmd640_pci_legacy_only_device); diff --git a/src/machine/m_at_socket5.c b/src/machine/m_at_socket5.c index 55751ae43..fa562a62c 100644 --- a/src/machine/m_at_socket5.c +++ b/src/machine/m_at_socket5.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2010-2019 Sarah Walker. @@ -48,7 +48,8 @@ machine_at_plato_init(const machine_t *model) int ret; ret = bios_load_linear_combined("roms/machines/plato/1016ax1_.bio", - "roms/machines/plato/1016ax1_.bi1", 0x1d000, 128); + "roms/machines/plato/1016ax1_.bi1", + 0x1d000, 128); if (bios_only || !ret) return ret; @@ -66,7 +67,8 @@ machine_at_ambradp90_init(const machine_t *model) int ret; ret = bios_load_linear_combined("roms/machines/ambradp90/1002AX1P.BIO", - "roms/machines/ambradp90/1002AX1P.BI1", 0x1d000, 128); + "roms/machines/ambradp90/1002AX1P.BI1", + 0x1d000, 128); if (bios_only || !ret) return ret; @@ -114,10 +116,10 @@ machine_at_acerv30_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, 0, 0, 0, 0); - pci_register_slot(0x12, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x11, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x14, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x13, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x12, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x11, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x14, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x13, PCI_CARD_NORMAL, 4, 1, 2, 3); device_add(&i430fx_device); device_add(&piix_device); device_add(&keyboard_ps2_acer_pci_device); @@ -144,10 +146,10 @@ machine_at_apollo_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(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(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(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&keyboard_ps2_ami_pci_device); device_add(&i430fx_device); @@ -173,10 +175,10 @@ machine_at_exp8551_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(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x14, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x12, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x11, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x14, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x12, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x11, 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); device_add(&i430fx_device); @@ -193,7 +195,8 @@ machine_at_zappa_init(const machine_t *model) int ret; ret = bios_load_linear_combined("roms/machines/zappa/1006bs0_.bio", - "roms/machines/zappa/1006bs0_.bi1", 0x20000, 128); + "roms/machines/zappa/1006bs0_.bi1", + 0x20000, 128); if (bios_only || !ret) return ret; @@ -202,9 +205,9 @@ machine_at_zappa_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(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0E, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x0F, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0E, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 2, 3, 4, 1); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&keyboard_ps2_intel_ami_pci_device); device_add(&i430fx_device); @@ -231,9 +234,9 @@ machine_at_powermatev_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, 0, 0, 0, 0); - pci_register_slot(0x08, PCI_CARD_NORMAL, 0, 0, 0, 0); - pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x08, PCI_CARD_NORMAL, 0, 0, 0, 0); + pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); device_add(&keyboard_ps2_ami_pci_device); device_add(&i430fx_device); device_add(&piix_device); @@ -258,10 +261,10 @@ machine_at_mb500n_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(0x14, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x12, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x11, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x14, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x12, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x11, PCI_CARD_NORMAL, 4, 1, 2, 3); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&keyboard_ps2_pci_device); device_add(&i430fx_device); @@ -288,9 +291,9 @@ machine_at_hawk_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(0x14, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x12, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x14, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x12, PCI_CARD_NORMAL, 3, 4, 1, 2); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&keyboard_ps2_ami_pci_device); device_add(&i430fx_device); @@ -338,10 +341,9 @@ machine_at_hot543_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x10, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - - pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x12, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x12, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); device_add(&opti5x7_pci_device); device_add(&opti822_device); @@ -387,11 +389,11 @@ machine_at_sq588_init(const machine_t *model) pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); pci_register_slot(0x01, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); /* Correct: 0D (01), 0F (02), 11 (03), 13 (04) */ - pci_register_slot(0x02, PCI_CARD_IDE, 1, 2, 3, 4); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0F, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x11, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x13, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x02, PCI_CARD_IDE, 1, 2, 3, 4); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x11, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x13, PCI_CARD_NORMAL, 4, 1, 2, 3); device_add(&sis_85c50x_device); device_add(&ide_cmd640_pci_single_channel_device); device_add(&keyboard_ps2_ami_pci_device); diff --git a/src/machine/m_at_socket7.c b/src/machine/m_at_socket7.c index a51c58b14..0ead2972a 100644 --- a/src/machine/m_at_socket7.c +++ b/src/machine/m_at_socket7.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Melissa Goad, * @@ -95,11 +95,11 @@ machine_at_ap5vm_init(const machine_t *model) /* It seems there were plans for an on-board NCR 53C810 according to some clues left in the manual, but were latter scrapped. The BIOS still support that PCI device, though, so why not. */ - pci_register_slot(0x06, PCI_CARD_SCSI, 1, 2, 3, 4); - pci_register_slot(0x09, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0A, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x06, PCI_CARD_SCSI, 1, 2, 3, 4); + pci_register_slot(0x09, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0A, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 4, 1, 2, 3); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&i430vx_device); device_add(&piix3_device); @@ -126,10 +126,10 @@ machine_at_p55t2p4_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(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x09, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x09, PCI_CARD_NORMAL, 4, 1, 2, 3); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&i430hx_device); device_add(&piix3_device); @@ -155,10 +155,10 @@ machine_at_m7shi_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x12, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x11, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x10, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0F, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x12, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x11, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x10, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 1, 2, 3, 4); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); device_add(&i430hx_device); device_add(&piix3_device); @@ -188,11 +188,11 @@ machine_at_tc430hx_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(0x08, PCI_CARD_VIDEO, 4, 0, 0, 0); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0F, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x10, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x08, PCI_CARD_VIDEO, 4, 0, 0, 0); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x10, PCI_CARD_NORMAL, 4, 1, 2, 3); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&i430hx_device); device_add(&piix3_device); @@ -223,12 +223,12 @@ machine_at_equium5200_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(0x08, PCI_CARD_VIDEO, 4, 0, 0, 0); - pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x08, PCI_CARD_VIDEO, 4, 0, 0, 0); + pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 4, 1, 2); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 0, 0, 0); // riser + pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 0, 0, 0); // riser device_add(&i430hx_device); device_add(&piix3_device); device_add(&keyboard_ps2_ami_pci_device); @@ -257,11 +257,11 @@ machine_at_pcv90_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(0x08, PCI_CARD_VIDEO, 4, 0, 0, 0); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0F, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x10, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x08, PCI_CARD_VIDEO, 4, 0, 0, 0); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x10, PCI_CARD_NORMAL, 4, 1, 2, 3); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&i430hx_device); device_add(&piix3_device); @@ -303,10 +303,10 @@ machine_at_p55tvp4_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(0x09, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x09, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&i430vx_device); device_add(&piix3_device); @@ -332,9 +332,9 @@ machine_at_5ivg_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(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x12, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x12, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&i430vx_device); device_add(&piix3_device); @@ -361,10 +361,10 @@ machine_at_8500tvxa_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, 0, 0, 0, 0); - 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, 2, 1); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 4, 3, 2, 1); + 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, 2, 1); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 4, 3, 2, 1); device_add(&i430vx_device); device_add(&piix3_device); device_add(&keyboard_ps2_ami_pci_device); @@ -390,8 +390,8 @@ machine_at_presario2240_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(0x14, PCI_CARD_VIDEO, 3, 0, 0, 0); - pci_register_slot(0x13, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x14, PCI_CARD_VIDEO, 3, 0, 0, 0); + pci_register_slot(0x13, PCI_CARD_NORMAL, 1, 2, 3, 4); if (gfxcard == VID_INTERNAL) device_add(&s3_trio64v2_dx_onboard_pci_device); @@ -421,8 +421,8 @@ machine_at_presario4500_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(0x14, PCI_CARD_VIDEO, 3, 0, 0, 0); - pci_register_slot(0x13, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x14, PCI_CARD_VIDEO, 3, 0, 0, 0); + pci_register_slot(0x13, PCI_CARD_NORMAL, 1, 2, 3, 4); if (gfxcard == VID_INTERNAL) device_add(&s3_trio64v2_dx_onboard_pci_device); @@ -451,10 +451,10 @@ machine_at_p55va_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(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(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(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&i430vx_device); device_add(&piix3_device); @@ -480,10 +480,10 @@ machine_at_brio80xx_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x14, PCI_CARD_VIDEO, 4, 0, 0, 0); - pci_register_slot(0x13, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x12, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x11, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x14, PCI_CARD_VIDEO, 4, 0, 0, 0); + pci_register_slot(0x13, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x12, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x11, PCI_CARD_NORMAL, 3, 4, 1, 2); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); device_add(&i430vx_device); device_add(&piix3_device); @@ -513,10 +513,10 @@ machine_at_pb680_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(0x08, PCI_CARD_VIDEO, 4, 0, 0, 0); - pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x08, PCI_CARD_VIDEO, 4, 0, 0, 0); + pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 4, 1, 2); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&i430vx_device); device_add(&piix3_device); @@ -542,10 +542,10 @@ machine_at_mb520n_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(0x14, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x12, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x11, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x14, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x12, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x11, PCI_CARD_NORMAL, 4, 1, 2, 3); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&i430vx_device); device_add(&piix3_device); @@ -571,10 +571,10 @@ machine_at_i430vx_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(0x11, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x12, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x14, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x13, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x11, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x12, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x14, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x13, PCI_CARD_NORMAL, 4, 1, 2, 3); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&i430vx_device); device_add(&piix3_device); @@ -600,12 +600,12 @@ machine_at_nupro592_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(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x12, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x14, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 4, 1, 2); /*Strongly suspect these are on-board slots*/ - pci_register_slot(0x0C, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x12, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x14, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 4, 1, 2); /*Strongly suspect these are on-board slots*/ + pci_register_slot(0x0C, PCI_CARD_NORMAL, 4, 1, 2, 3); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 4); /* PIIX4 */ device_add(&i430tx_device); device_add(&piix4_device); @@ -637,13 +637,13 @@ machine_at_tx97_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(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x09, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x09, PCI_CARD_NORMAL, 4, 1, 2, 3); pci_register_slot(0x01, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); /* PIIX4 */ - pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x08, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x08, PCI_CARD_NORMAL, 1, 2, 3, 4); device_add(&i430tx_device); device_add(&piix4_device); device_add(&keyboard_ps2_ami_pci_device); @@ -691,11 +691,11 @@ machine_at_an430tx_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); /* PIIX4 */ - // pci_register_slot(0x08, PCI_CARD_VIDEO, 4, 0, 0, 0); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0F, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x10, PCI_CARD_NORMAL, 4, 1, 2, 3); + // pci_register_slot(0x08, PCI_CARD_VIDEO, 4, 0, 0, 0); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x10, PCI_CARD_NORMAL, 4, 1, 2, 3); device_add(&i430tx_device); device_add(&piix4_device); device_add(&keyboard_ps2_ami_pci_device); @@ -722,13 +722,13 @@ machine_at_ym430tx_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(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x09, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x09, PCI_CARD_NORMAL, 4, 1, 2, 3); pci_register_slot(0x01, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); /* PIIX4 */ - pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x08, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x08, PCI_CARD_NORMAL, 1, 2, 3, 4); device_add(&i430tx_device); device_add(&piix4_device); device_add(&keyboard_ps2_pci_device); @@ -754,10 +754,10 @@ machine_at_mb540n_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(0x11, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x12, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x14, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x11, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x12, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x14, PCI_CARD_NORMAL, 1, 2, 3, 4); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); /* PIIX4 */ device_add(&i430tx_device); device_add(&piix4_device); @@ -784,12 +784,12 @@ machine_at_56a5_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(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x12, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x14, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x12, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x14, PCI_CARD_NORMAL, 4, 1, 2, 3); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); /* PIIX4 */ - pci_register_slot(0x10, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x10, PCI_CARD_NORMAL, 1, 2, 3, 4); device_add(&i430tx_device); device_add(&piix4_device); device_add(&keyboard_ps2_pci_device); @@ -816,10 +816,10 @@ machine_at_p5mms98_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); /* PIIX4 */ - pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x12, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x14, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x12, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x14, PCI_CARD_NORMAL, 4, 1, 2, 3); device_add(&i430tx_device); device_add(&piix4_device); device_add(&keyboard_ps2_ami_pci_device); @@ -847,10 +847,10 @@ machine_at_ficva502_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(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(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(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); device_add(&via_vpx_device); device_add(&via_vt82c586b_device); @@ -966,15 +966,15 @@ machine_at_m560_init(const machine_t *model) machine_at_common_init_ex(model, 2); pci_init(PCI_CONFIG_TYPE_1); - pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x02, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x02, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); pci_register_slot(0x0B, PCI_CARD_SOUTHBRIDGE_IDE, 1, 2, 3, 4); pci_register_slot(0x0C, PCI_CARD_SOUTHBRIDGE_PMU, 1, 2, 3, 4); pci_register_slot(0x0F, PCI_CARD_SOUTHBRIDGE_USB, 1, 2, 3, 4); - pci_register_slot(0x03, PCI_CARD_NORMAL, 1, 2, 3, 4); - 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(0x06, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x03, PCI_CARD_NORMAL, 1, 2, 3, 4); + 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(0x06, PCI_CARD_NORMAL, 4, 1, 2, 3); device_add(&ali1531_device); device_add(&ali1543_device); /* -5 */ device_add(&sst_flash_29ee010_device); @@ -997,16 +997,16 @@ machine_at_ms5164_init(const machine_t *model) machine_at_common_init_ex(model, 2); pci_init(PCI_CONFIG_TYPE_1); - pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x02, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x02, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); pci_register_slot(0x0B, PCI_CARD_SOUTHBRIDGE_IDE, 5, 6, 0, 0); pci_register_slot(0x0C, PCI_CARD_SOUTHBRIDGE_PMU, 1, 2, 3, 4); pci_register_slot(0x0F, PCI_CARD_SOUTHBRIDGE_USB, 1, 2, 3, 4); - pci_register_slot(0x03, PCI_CARD_NORMAL, 1, 2, 3, 4); - 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(0x06, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x07, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x03, PCI_CARD_NORMAL, 1, 2, 3, 4); + 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(0x06, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x07, PCI_CARD_NORMAL, 1, 2, 3, 4); device_add(&ali1531_device); device_add(&ali1543_device); /* -5 */ diff --git a/src/machine/m_at_socket7_3v.c b/src/machine/m_at_socket7_3v.c index 09b142c83..7616d8a4a 100644 --- a/src/machine/m_at_socket7_3v.c +++ b/src/machine/m_at_socket7_3v.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Melissa Goad, * @@ -51,11 +51,11 @@ machine_at_thor_common_init(const machine_t *model, int mr) pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x08, PCI_CARD_VIDEO, 4, 0, 0, 0); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0F, PCI_CARD_NORMAL, 3, 4, 2, 1); - pci_register_slot(0x10, PCI_CARD_NORMAL, 4, 3, 2, 1); + pci_register_slot(0x08, PCI_CARD_VIDEO, 4, 0, 0, 0); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 3, 4, 2, 1); + pci_register_slot(0x10, PCI_CARD_NORMAL, 4, 3, 2, 1); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); if (gfxcard == VID_INTERNAL) @@ -76,10 +76,10 @@ machine_at_p54tp4xe_common_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(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x09, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x09, PCI_CARD_NORMAL, 4, 1, 2, 3); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&keyboard_ps2_pci_device); device_add(&i430fx_device); @@ -126,7 +126,8 @@ machine_at_gw2katx_init(const machine_t *model) int ret; ret = bios_load_linear_combined("roms/machines/gw2katx/1003CN0T.BIO", - "roms/machines/gw2katx/1003CN0T.BI1", 0x20000, 128); + "roms/machines/gw2katx/1003CN0T.BI1", + 0x20000, 128); if (bios_only || !ret) return ret; @@ -142,7 +143,8 @@ machine_at_thor_init(const machine_t *model) int ret; ret = bios_load_linear_combined("roms/machines/thor/1006cn0_.bio", - "roms/machines/thor/1006cn0_.bi1", 0x20000, 128); + "roms/machines/thor/1006cn0_.bi1", + 0x20000, 128); if (bios_only || !ret) return ret; @@ -174,7 +176,8 @@ machine_at_endeavor_init(const machine_t *model) int ret; ret = bios_load_linear_combined("roms/machines/endeavor/1006cb0_.bio", - "roms/machines/endeavor/1006cb0_.bi1", 0x1d000, 128); + "roms/machines/endeavor/1006cb0_.bi1", + 0x1d000, 128); if (bios_only || !ret) return ret; @@ -183,11 +186,11 @@ machine_at_endeavor_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(0x08, PCI_CARD_VIDEO, 4, 0, 0, 0); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0F, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x10, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x08, PCI_CARD_VIDEO, 4, 0, 0, 0); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x10, PCI_CARD_NORMAL, 4, 1, 2, 3); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); if (gfxcard == VID_INTERNAL) @@ -218,9 +221,9 @@ machine_at_ms5119_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, 0, 0, 0, 0); - pci_register_slot(0x0d, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0e, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0f, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0d, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0e, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0f, PCI_CARD_NORMAL, 3, 4, 1, 2); device_add(&i430fx_device); device_add(&piix_device); @@ -246,10 +249,10 @@ machine_at_pb640_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(0x08, PCI_CARD_VIDEO, 4, 0, 0, 0); - pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 1, 3, 4); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 2, 1, 4); + pci_register_slot(0x08, PCI_CARD_VIDEO, 4, 0, 0, 0); + pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 1, 3, 4); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 2, 1, 4); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&i430fx_rev02_device); device_add(&piix_rev02_device); @@ -280,10 +283,10 @@ machine_at_fmb_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, 0, 0, 0, 0); - pci_register_slot(0x14, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x12, PCI_CARD_NORMAL, 3, 4, 2, 1); - pci_register_slot(0x11, PCI_CARD_NORMAL, 4, 3, 2, 1); + pci_register_slot(0x14, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x12, PCI_CARD_NORMAL, 3, 4, 2, 1); + pci_register_slot(0x11, PCI_CARD_NORMAL, 4, 3, 2, 1); device_add(&i430fx_device); device_add(&piix_no_mirq_device); @@ -310,11 +313,11 @@ machine_at_acerm3a_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, 0, 0, 0, 0); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0E, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x0F, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x10, PCI_CARD_VIDEO, 4, 0, 0, 0); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0E, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x10, PCI_CARD_VIDEO, 4, 0, 0, 0); device_add(&i430hx_device); device_add(&piix3_device); device_add(&keyboard_ps2_pci_device); @@ -340,12 +343,12 @@ machine_at_ap53_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(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x12, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x14, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x12, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x14, PCI_CARD_NORMAL, 4, 1, 2, 3); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x06, PCI_CARD_VIDEO, 1, 2, 3, 4); + pci_register_slot(0x06, PCI_CARD_VIDEO, 1, 2, 3, 4); device_add(&i430hx_device); device_add(&piix3_device); device_add(&keyboard_ps2_ami_pci_device); @@ -370,10 +373,10 @@ machine_at_8500tuc_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(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(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(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); device_add(&i430hx_device); device_add(&piix3_device); @@ -399,10 +402,10 @@ machine_at_p55t2s_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(0x12, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x13, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x14, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x11, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x12, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x13, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x14, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x11, PCI_CARD_NORMAL, 2, 3, 4, 1); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&i430hx_device); device_add(&piix3_device); @@ -428,10 +431,10 @@ machine_at_p5vxb_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(0x05, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x06, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x08, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x09, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x05, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x06, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x08, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x09, PCI_CARD_NORMAL, 4, 1, 2, 3); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 4); device_add(&i430vx_device); device_add(&piix3_device); @@ -461,11 +464,11 @@ machine_at_gw2kte_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(0x08, PCI_CARD_VIDEO, 4, 0, 0, 0); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0F, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x10, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x08, PCI_CARD_VIDEO, 4, 0, 0, 0); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x10, PCI_CARD_NORMAL, 3, 4, 1, 2); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 4); device_add(&i430vx_device); device_add(&piix3_device); @@ -492,10 +495,10 @@ machine_at_ap5s_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(0x01, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0F, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x11, PCI_CARD_NORMAL, 3, 4, 2, 1); - pci_register_slot(0x13, PCI_CARD_NORMAL, 4, 3, 2, 1); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x11, PCI_CARD_NORMAL, 3, 4, 2, 1); + pci_register_slot(0x13, PCI_CARD_NORMAL, 4, 3, 2, 1); device_add(&sis_5511_device); device_add(&keyboard_ps2_ami_pci_device); @@ -521,10 +524,10 @@ machine_at_ms5124_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(0x01, PCI_CARD_SOUTHBRIDGE, 0xFE, 0xFF, 0, 0); - pci_register_slot(0x10, PCI_CARD_NORMAL, 0x41, 0x42, 0x43, 0x44); - pci_register_slot(0x11, PCI_CARD_NORMAL, 0x44, 0x41, 0x42, 0x43); - pci_register_slot(0x12, PCI_CARD_NORMAL, 0x43, 0x44, 0x41, 0x42); - pci_register_slot(0x0F, PCI_CARD_NORMAL, 0x42, 0x43, 0x44, 0x41); + pci_register_slot(0x10, PCI_CARD_NORMAL, 0x41, 0x42, 0x43, 0x44); + pci_register_slot(0x11, PCI_CARD_NORMAL, 0x44, 0x41, 0x42, 0x43); + pci_register_slot(0x12, PCI_CARD_NORMAL, 0x43, 0x44, 0x41, 0x42); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 0x42, 0x43, 0x44, 0x41); device_add(&sis_5511_device); device_add(&keyboard_ps2_ami_pci_device); @@ -550,10 +553,10 @@ machine_at_vectra54_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(0x0F, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x0D, PCI_CARD_VIDEO, 0, 0, 0, 0); - pci_register_slot(0x06, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x07, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x08, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0D, PCI_CARD_VIDEO, 0, 0, 0, 0); + pci_register_slot(0x06, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x07, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x08, PCI_CARD_NORMAL, 3, 4, 1, 2); if (gfxcard == VID_INTERNAL) device_add(&s3_phoenix_trio64_onboard_pci_device); diff --git a/src/machine/m_at_socket8.c b/src/machine/m_at_socket8.c index 5ffbec822..c1c95f197 100644 --- a/src/machine/m_at_socket8.c +++ b/src/machine/m_at_socket8.c @@ -55,13 +55,13 @@ machine_at_p6rp4_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x19, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x14, PCI_CARD_AGPBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x14, PCI_CARD_AGPBRIDGE, 0, 0, 0, 0); pci_register_slot(0x02, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x08, PCI_CARD_IDE, 0, 0, 0, 0); - pci_register_slot(0x07, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x06, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x05, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x04, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x08, PCI_CARD_IDE, 0, 0, 0, 0); + pci_register_slot(0x07, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x06, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x05, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x04, PCI_CARD_NORMAL, 4, 1, 2, 3); device_add(&i450kx_device); device_add(&sio_zb_device); device_add(&ide_cmd646_device); @@ -89,10 +89,10 @@ machine_at_686nx_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, 0, 0, 0, 0); - 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(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); device_add(&i440fx_device); device_add(&piix3_device); device_add(&keyboard_ps2_ami_pci_device); // Uses the AMIKEY keyboard controller @@ -118,10 +118,10 @@ machine_at_mb600n_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, 0, 0, 0, 0); - pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x12, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x14, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x12, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x14, PCI_CARD_NORMAL, 4, 1, 2, 3); device_add(&i440fx_device); device_add(&piix3_device); device_add(&keyboard_ps2_ami_pci_device); @@ -147,11 +147,11 @@ machine_at_acerv60n_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, 0, 0, 0, 0); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0F, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x10, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x12, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x10, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x12, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 2, 3, 4, 1); device_add(&i440fx_device); device_add(&piix3_device); device_add(&keyboard_ps2_pci_device); @@ -180,10 +180,10 @@ machine_at_vs440fx_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(0x0B, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0F, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x11, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x11, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&i440fx_device); device_add(&piix3_device); @@ -214,10 +214,10 @@ machine_at_ap440fx_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(0x08, PCI_CARD_VIDEO, 3, 0, 0, 0); - pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 3, 2, 4); - pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 1, 3, 4); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 2, 1, 4); + pci_register_slot(0x08, PCI_CARD_VIDEO, 3, 0, 0, 0); + pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 3, 2, 4); + pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 1, 3, 4); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 2, 1, 4); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 4); device_add(&i440fx_device); device_add(&piix3_device); @@ -244,10 +244,10 @@ machine_at_8600ttc_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, 0, 0, 0, 0); - 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(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); device_add(&i440fx_device); device_add(&piix3_device); device_add(&keyboard_ps2_ami_pci_device); @@ -273,10 +273,10 @@ machine_at_m6mi_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, 0, 0, 0, 0); - pci_register_slot(0x12, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x11, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x10, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x0F, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x12, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x11, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x10, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 4, 1, 2, 3); device_add(&i440fx_device); device_add(&piix3_device); device_add(&keyboard_ps2_ami_pci_device); @@ -294,11 +294,11 @@ machine_at_p65up5_common_init(const machine_t *model, const device_t *northbridg pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); pci_register_slot(0x01, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x09, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x09, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 4, 1, 2, 3); device_add(northbridge); device_add(&piix3_ioapic_device); device_add(&keyboard_ps2_ami_pci_device); diff --git a/src/machine/m_at_sockets7.c b/src/machine/m_at_sockets7.c index 381940a10..2813e7275 100644 --- a/src/machine/m_at_sockets7.c +++ b/src/machine/m_at_sockets7.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Melissa Goad, * diff --git a/src/machine/m_at_t3100e.c b/src/machine/m_at_t3100e.c index 6b09b1e02..080f22977 100644 --- a/src/machine/m_at_t3100e.c +++ b/src/machine/m_at_t3100e.c @@ -55,8 +55,8 @@ * * Page mapped at 0xD000 0xD400 0xD800 0xDC00 * ------------------------------------------------------ - * Pages 0x00-0x7F 0x208 0x4208 0x8208 0xc208 - * Pages 0x80-0xFF 0x218 0x4218 0x8218 0xc218 + * Pages 0x00-0x7F 0x208 0x4208 0x8208 0xc208 + * Pages 0x80-0xFF 0x218 0x4218 0x8218 0xc218 * Pages 0x100-0x17F 0x258 0x4258 0x8258 0xc258 * Pages 0x180-0x1FF 0x268 0x4268 0x8268 0xc268 * @@ -121,9 +121,9 @@ * * Authors: Fred N. van Kempen, * Miran Grca, - * Sarah Walker, + * Sarah Walker, * - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. * Copyright 2016-2018 Miran Grca. * Copyright 2008-2018 Sarah Walker. * diff --git a/src/machine/m_at_t3100e_vid.c b/src/machine/m_at_t3100e_vid.c index 30bbc488b..53571c49e 100644 --- a/src/machine/m_at_t3100e_vid.c +++ b/src/machine/m_at_t3100e_vid.c @@ -26,7 +26,7 @@ * * Authors: Fred N. van Kempen, * Miran Grca, - * Sarah Walker, + * Sarah Walker, * * Copyright 2017-2019 Fred N. van Kempen. * Copyright 2016-2019 Miran Grca. diff --git a/src/machine/m_elt.c b/src/machine/m_elt.c index 47e6f145d..81647612c 100644 --- a/src/machine/m_elt.c +++ b/src/machine/m_elt.c @@ -31,7 +31,6 @@ * USA. */ -// clang-format off #include #include #include @@ -51,7 +50,6 @@ #include <86box/rom.h> #include <86box/video.h> #include <86box/vid_cga.h> -// clang-format on static void elt_vid_off_poll(void *p) diff --git a/src/machine/m_europc.c b/src/machine/m_europc.c index 3f78c8f49..116e10e5f 100644 --- a/src/machine/m_europc.c +++ b/src/machine/m_europc.c @@ -293,50 +293,50 @@ rtc_reset(nvr_t *nvr) /* * EuroPC System Configuration: * - * [A] unknown + * [A] unknown * - * [B] 7 1 bootdrive extern - * 0 bootdribe intern - * 6:5 11 invalid hard disk type - * 10 hard disk installed, type 2 - * 01 hard disk installed, type 1 - * 00 hard disk not installed - * 4:3 11 invalid external drive type - * 10 external drive 720K - * 01 external drive 360K - * 00 external drive disabled - * 2 unknown - * 1:0 11 invalid internal drive type - * 10 internal drive 360K - * 01 internal drive 720K - * 00 internal drive disabled + * [B] 7 1 bootdrive extern + * 0 bootdrive intern + * 6:5 11 invalid hard disk type + * 10 hard disk installed, type 2 + * 01 hard disk installed, type 1 + * 00 hard disk not installed + * 4:3 11 invalid external drive type + * 10 external drive 720K + * 01 external drive 360K + * 00 external drive disabled + * 2 unknown + * 1:0 11 invalid internal drive type + * 10 internal drive 360K + * 01 internal drive 720K + * 00 internal drive disabled * - * [C] 7:6 unknown - * 5 monitor detection OFF - * 4 unknown - * 3:2 11 illegal memory size - * 10 512K - * 01 256K - * 00 640K - * 1:0 11 illegal game port - * 10 gameport as mouse port - * 01 gameport as joysticks - * 00 gameport disabled + * [C] 7:6 unknown + * 5 monitor detection OFF + * 4 unknown + * 3:2 11 illegal memory size + * 10 512K + * 01 256K + * 00 640K + * 1:0 11 illegal game port + * 10 gameport as mouse port + * 01 gameport as joysticks + * 00 gameport disabled * - * [D] 7:6 10 9MHz CPU speed - * 01 7MHz CPU speed - * 00 4.77 MHz CPU - * 5 unknown - * 4 external: color, internal: mono - * 3 unknown - * 2 internal video ON - * 1:0 11 mono - * 10 color80 - * 01 color40 - * 00 special (EGA,VGA etc) + * [D] 7:6 10 9MHz CPU speed + * 01 7MHz CPU speed + * 00 4.77 MHz CPU + * 5 unknown + * 4 external: color, internal: mono + * 3 unknown + * 2 internal video ON + * 1:0 11 mono + * 10 color80 + * 01 color40 + * 00 special (EGA,VGA etc) * - * [E] 7:4 unknown - * 3:0 country (00=Deutschland, 0A=ASCII) + * [E] 7:4 unknown + * 3:0 country (00=Deutschland, 0A=ASCII) */ nvr->regs[MRTC_CONF_A] = 0x00; /* CONFIG A */ nvr->regs[MRTC_CONF_B] = 0x0A; /* CONFIG B */ @@ -400,15 +400,15 @@ jim_set(europc_t *sys, uint8_t reg, uint8_t val) case 4: /* CPU Speed control */ switch (val & 0xc0) { case 0x00: /* 4.77 MHz */ - // cpu_set_clockscale(0, 1.0/2); + // cpu_set_clockscale(0, 1.0/2); break; case 0x40: /* 7.16 MHz */ - // cpu_set_clockscale(0, 3.0/4); + // cpu_set_clockscale(0, 3.0/4); break; default: /* 9.54 MHz */ - // cpu_set_clockscale(0, 1);break; + // cpu_set_clockscale(0, 1);break; break; } break; diff --git a/src/machine/m_pcjr.c b/src/machine/m_pcjr.c index 6446d5852..b03272f3d 100644 --- a/src/machine/m_pcjr.c +++ b/src/machine/m_pcjr.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/machine/m_ps1.c b/src/machine/m_ps1.c index 53e6928e8..209b5d7a4 100644 --- a/src/machine/m_ps1.c +++ b/src/machine/m_ps1.c @@ -24,7 +24,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/machine/m_ps2_mca.c b/src/machine/m_ps2_mca.c index cfe6ba6bd..f77b6f4a0 100644 --- a/src/machine/m_ps2_mca.c +++ b/src/machine/m_ps2_mca.c @@ -12,7 +12,7 @@ * * Authors: Fred N. van Kempen, * Miran Grca, - * Sarah Walker, + * Sarah Walker, * * Copyright 2017-2019 Fred N. van Kempen. * Copyright 2016-2019 Miran Grca. diff --git a/src/machine/m_tandy.c b/src/machine/m_tandy.c index c7789de26..0eddc1e19 100644 --- a/src/machine/m_tandy.c +++ b/src/machine/m_tandy.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2019 Sarah Walker. @@ -174,219 +174,219 @@ static const scancode scancode_tandy[512] = { { {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} }, /*054*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*058*/ + { {0}, {0} }, { {0}, {0} }, /*058*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*05c*/ + { {0}, {0} }, { {0}, {0} }, /*05c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*060*/ + { {0}, {0} }, { {0}, {0} }, /*060*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*064*/ + { {0}, {0} }, { {0}, {0} }, /*064*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*068*/ + { {0}, {0} }, { {0}, {0} }, /*068*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*06c*/ + { {0}, {0} }, { {0}, {0} }, /*06c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*070*/ + { {0}, {0} }, { {0}, {0} }, /*070*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*074*/ + { {0}, {0} }, { {0}, {0} }, /*074*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*078*/ + { {0}, {0} }, { {0}, {0} }, /*078*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*07c*/ + { {0}, {0} }, { {0}, {0} }, /*07c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*080*/ + { {0}, {0} }, { {0}, {0} }, /*080*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*084*/ + { {0}, {0} }, { {0}, {0} }, /*084*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*088*/ + { {0}, {0} }, { {0}, {0} }, /*088*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*08c*/ + { {0}, {0} }, { {0}, {0} }, /*08c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*090*/ + { {0}, {0} }, { {0}, {0} }, /*090*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*094*/ + { {0}, {0} }, { {0}, {0} }, /*094*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*098*/ + { {0}, {0} }, { {0}, {0} }, /*098*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*09c*/ + { {0}, {0} }, { {0}, {0} }, /*09c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0a0*/ + { {0}, {0} }, { {0}, {0} }, /*0a0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0a4*/ + { {0}, {0} }, { {0}, {0} }, /*0a4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0a8*/ + { {0}, {0} }, { {0}, {0} }, /*0a8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0ac*/ + { {0}, {0} }, { {0}, {0} }, /*0ac*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0b0*/ + { {0}, {0} }, { {0}, {0} }, /*0b0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0b4*/ + { {0}, {0} }, { {0}, {0} }, /*0b4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0b8*/ + { {0}, {0} }, { {0}, {0} }, /*0b8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0bc*/ + { {0}, {0} }, { {0}, {0} }, /*0bc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0c0*/ + { {0}, {0} }, { {0}, {0} }, /*0c0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0c4*/ + { {0}, {0} }, { {0}, {0} }, /*0c4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0c8*/ + { {0}, {0} }, { {0}, {0} }, /*0c8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0cc*/ + { {0}, {0} }, { {0}, {0} }, /*0cc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0d0*/ + { {0}, {0} }, { {0}, {0} }, /*0d0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0d4*/ + { {0}, {0} }, { {0}, {0} }, /*0d4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0d8*/ + { {0}, {0} }, { {0}, {0} }, /*0d8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0dc*/ + { {0}, {0} }, { {0}, {0} }, /*0dc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0e0*/ + { {0}, {0} }, { {0}, {0} }, /*0e0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0e4*/ + { {0}, {0} }, { {0}, {0} }, /*0e4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0e8*/ + { {0}, {0} }, { {0}, {0} }, /*0e8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0ec*/ + { {0}, {0} }, { {0}, {0} }, /*0ec*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0f0*/ + { {0}, {0} }, { {0}, {0} }, /*0f0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0f4*/ + { {0}, {0} }, { {0}, {0} }, /*0f4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0f8*/ + { {0}, {0} }, { {0}, {0} }, /*0f8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0fc*/ + { {0}, {0} }, { {0}, {0} }, /*0fc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*100*/ + { {0}, {0} }, { {0}, {0} }, /*100*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*104*/ + { {0}, {0} }, { {0}, {0} }, /*104*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*108*/ + { {0}, {0} }, { {0}, {0} }, /*108*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*10c*/ + { {0}, {0} }, { {0}, {0} }, /*10c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*110*/ + { {0}, {0} }, { {0}, {0} }, /*110*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*114*/ + { {0}, {0} }, { {0}, {0} }, /*114*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*118*/ + { {0}, {0} }, { {0}, {0} }, /*118*/ { {0x57, 0}, {0xd7, 0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*11c*/ + { {0}, {0} }, { {0}, {0} }, /*11c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*120*/ + { {0}, {0} }, { {0}, {0} }, /*120*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*124*/ + { {0}, {0} }, { {0}, {0} }, /*124*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*128*/ + { {0}, {0} }, { {0}, {0} }, /*128*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*12c*/ + { {0}, {0} }, { {0}, {0} }, /*12c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*130*/ + { {0}, {0} }, { {0}, {0} }, /*130*/ { {0}, {0} }, { {0x35, 0}, {0xb5, 0} }, - { {0}, {0} }, { {0x37, 0}, {0xb7, 0} }, /*134*/ + { {0}, {0} }, { {0x37, 0}, {0xb7, 0} }, /*134*/ { {0x38, 0}, {0xb8, 0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*138*/ + { {0}, {0} }, { {0}, {0} }, /*138*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*13c*/ + { {0}, {0} }, { {0}, {0} }, /*13c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*140*/ + { {0}, {0} }, { {0}, {0} }, /*140*/ { {0}, {0} }, { {0}, {0} }, - { {0x46, 0}, {0xc6, 0} }, { {0x47, 0}, {0xc7, 0} }, /*144*/ + { {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} }, { {0x2b, 0}, {0xab, 0} }, /*148*/ { {0}, {0} }, { {0x4e, 0}, {0xce, 0} }, - { {0}, {0} }, { {0x4f, 0}, {0xcf, 0} }, /*14c*/ + { {0}, {0} }, { {0x4f, 0}, {0xcf, 0} }, /*14c*/ { {0x4a, 0}, {0xca, 0} }, { {0x51, 0}, {0xd1, 0} }, - { {0x52, 0}, {0xd2, 0} }, { {0x53, 0}, {0xd3, 0} }, /*150*/ + { {0x52, 0}, {0xd2, 0} }, { {0x53, 0}, {0xd3, 0} }, /*150*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*154*/ + { {0}, {0} }, { {0}, {0} }, /*154*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*158*/ + { {0}, {0} }, { {0}, {0} }, /*158*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*15c*/ + { {0}, {0} }, { {0}, {0} }, /*15c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*160*/ + { {0}, {0} }, { {0}, {0} }, /*160*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*164*/ + { {0}, {0} }, { {0}, {0} }, /*164*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*168*/ + { {0}, {0} }, { {0}, {0} }, /*168*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*16c*/ + { {0}, {0} }, { {0}, {0} }, /*16c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*170*/ + { {0}, {0} }, { {0}, {0} }, /*170*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*174*/ + { {0}, {0} }, { {0}, {0} }, /*174*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*148*/ + { {0}, {0} }, { {0}, {0} }, /*148*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*17c*/ + { {0}, {0} }, { {0}, {0} }, /*17c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*180*/ + { {0}, {0} }, { {0}, {0} }, /*180*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*184*/ + { {0}, {0} }, { {0}, {0} }, /*184*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*88*/ + { {0}, {0} }, { {0}, {0} }, /*188*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*18c*/ + { {0}, {0} }, { {0}, {0} }, /*18c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*190*/ + { {0}, {0} }, { {0}, {0} }, /*190*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*194*/ + { {0}, {0} }, { {0}, {0} }, /*194*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*198*/ + { {0}, {0} }, { {0}, {0} }, /*198*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*19c*/ + { {0}, {0} }, { {0}, {0} }, /*19c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1a0*/ + { {0}, {0} }, { {0}, {0} }, /*1a0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1a4*/ + { {0}, {0} }, { {0}, {0} }, /*1a4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1a8*/ + { {0}, {0} }, { {0}, {0} }, /*1a8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1ac*/ + { {0}, {0} }, { {0}, {0} }, /*1ac*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1b0*/ + { {0}, {0} }, { {0}, {0} }, /*1b0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1b4*/ + { {0}, {0} }, { {0}, {0} }, /*1b4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1b8*/ + { {0}, {0} }, { {0}, {0} }, /*1b8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1bc*/ + { {0}, {0} }, { {0}, {0} }, /*1bc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1c0*/ + { {0}, {0} }, { {0}, {0} }, /*1c0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1c4*/ + { {0}, {0} }, { {0}, {0} }, /*1c4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1c8*/ + { {0}, {0} }, { {0}, {0} }, /*1c8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1cc*/ + { {0}, {0} }, { {0}, {0} }, /*1cc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1d0*/ + { {0}, {0} }, { {0}, {0} }, /*1d0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1d4*/ + { {0}, {0} }, { {0}, {0} }, /*1d4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1d8*/ + { {0}, {0} }, { {0}, {0} }, /*1d8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1dc*/ + { {0}, {0} }, { {0}, {0} }, /*1dc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1e0*/ + { {0}, {0} }, { {0}, {0} }, /*1e0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1e4*/ + { {0}, {0} }, { {0}, {0} }, /*1e4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1e8*/ + { {0}, {0} }, { {0}, {0} }, /*1e8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1ec*/ + { {0}, {0} }, { {0}, {0} }, /*1ec*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1f0*/ + { {0}, {0} }, { {0}, {0} }, /*1f0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1f4*/ + { {0}, {0} }, { {0}, {0} }, /*1f4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1f8*/ + { {0}, {0} }, { {0}, {0} }, /*1f8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} } /*1fc*/ + { {0}, {0} }, { {0}, {0} } /*1fc*/ // clang-format on }; static uint8_t crtcmask[32] = { diff --git a/src/machine/m_xt_compaq.c b/src/machine/m_xt_compaq.c index 733063306..f5dca48a7 100644 --- a/src/machine/m_xt_compaq.c +++ b/src/machine/m_xt_compaq.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * TheCollector1995, * diff --git a/src/machine/m_xt_olivetti.c b/src/machine/m_xt_olivetti.c index c978e2caf..bb52c2049 100644 --- a/src/machine/m_xt_olivetti.c +++ b/src/machine/m_xt_olivetti.c @@ -11,7 +11,7 @@ * - Supports MM58174 real-time clock emulation (M24) * - Supports MM58274 real-time clock emulation (M240) * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * EngiNerd @@ -889,219 +889,219 @@ const scancode scancode_olivetti_m24_deluxe[512] = { { {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*/ + { {0x5e, 0}, {0xde, 0} }, { {0x60, 0}, {0xe0, 0} }, /*054*/ { {0x61, 0}, {0xe1, 0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*058*/ + { {0}, {0} }, { {0}, {0} }, /*058*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*05c*/ + { {0}, {0} }, { {0}, {0} }, /*05c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*060*/ + { {0}, {0} }, { {0}, {0} }, /*060*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*064*/ + { {0}, {0} }, { {0}, {0} }, /*064*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*068*/ + { {0}, {0} }, { {0}, {0} }, /*068*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*06c*/ + { {0}, {0} }, { {0}, {0} }, /*06c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*070*/ + { {0}, {0} }, { {0}, {0} }, /*070*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*074*/ + { {0}, {0} }, { {0}, {0} }, /*074*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*078*/ + { {0}, {0} }, { {0}, {0} }, /*078*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*07c*/ + { {0}, {0} }, { {0}, {0} }, /*07c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*080*/ + { {0}, {0} }, { {0}, {0} }, /*080*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*084*/ + { {0}, {0} }, { {0}, {0} }, /*084*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*088*/ + { {0}, {0} }, { {0}, {0} }, /*088*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*08c*/ + { {0}, {0} }, { {0}, {0} }, /*08c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*090*/ + { {0}, {0} }, { {0}, {0} }, /*090*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*094*/ + { {0}, {0} }, { {0}, {0} }, /*094*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*098*/ + { {0}, {0} }, { {0}, {0} }, /*098*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*09c*/ + { {0}, {0} }, { {0}, {0} }, /*09c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0a0*/ + { {0}, {0} }, { {0}, {0} }, /*0a0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0a4*/ + { {0}, {0} }, { {0}, {0} }, /*0a4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0a8*/ + { {0}, {0} }, { {0}, {0} }, /*0a8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0ac*/ + { {0}, {0} }, { {0}, {0} }, /*0ac*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0b0*/ + { {0}, {0} }, { {0}, {0} }, /*0b0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0b4*/ + { {0}, {0} }, { {0}, {0} }, /*0b4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0b8*/ + { {0}, {0} }, { {0}, {0} }, /*0b8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0bc*/ + { {0}, {0} }, { {0}, {0} }, /*0bc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0c0*/ + { {0}, {0} }, { {0}, {0} }, /*0c0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0c4*/ + { {0}, {0} }, { {0}, {0} }, /*0c4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0c8*/ + { {0}, {0} }, { {0}, {0} }, /*0c8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0cc*/ + { {0}, {0} }, { {0}, {0} }, /*0cc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0d0*/ + { {0}, {0} }, { {0}, {0} }, /*0d0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0d4*/ + { {0}, {0} }, { {0}, {0} }, /*0d4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0d8*/ + { {0}, {0} }, { {0}, {0} }, /*0d8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0dc*/ + { {0}, {0} }, { {0}, {0} }, /*0dc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0e0*/ + { {0}, {0} }, { {0}, {0} }, /*0e0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0e4*/ + { {0}, {0} }, { {0}, {0} }, /*0e4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0e8*/ + { {0}, {0} }, { {0}, {0} }, /*0e8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0ec*/ + { {0}, {0} }, { {0}, {0} }, /*0ec*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0f0*/ + { {0}, {0} }, { {0}, {0} }, /*0f0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0f4*/ + { {0}, {0} }, { {0}, {0} }, /*0f4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0f8*/ + { {0}, {0} }, { {0}, {0} }, /*0f8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0fc*/ + { {0}, {0} }, { {0}, {0} }, /*0fc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*100*/ + { {0}, {0} }, { {0}, {0} }, /*100*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*104*/ + { {0}, {0} }, { {0}, {0} }, /*104*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*108*/ + { {0}, {0} }, { {0}, {0} }, /*108*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*10c*/ + { {0}, {0} }, { {0}, {0} }, /*10c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*110*/ + { {0}, {0} }, { {0}, {0} }, /*110*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*114*/ + { {0}, {0} }, { {0}, {0} }, /*114*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*118*/ + { {0}, {0} }, { {0}, {0} }, /*118*/ { {0x57, 0}, {0xd7, 0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*11c*/ + { {0}, {0} }, { {0}, {0} }, /*11c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*120*/ + { {0}, {0} }, { {0}, {0} }, /*120*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*124*/ + { {0}, {0} }, { {0}, {0} }, /*124*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*128*/ + { {0}, {0} }, { {0}, {0} }, /*128*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*12c*/ + { {0}, {0} }, { {0}, {0} }, /*12c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*130*/ + { {0}, {0} }, { {0}, {0} }, /*130*/ { {0}, {0} }, { {0x5f, 0}, {0xdf, 0} }, - { {0}, {0} }, { {0x37, 0}, {0xb7, 0} }, /*134*/ + { {0}, {0} }, { {0x37, 0}, {0xb7, 0} }, /*134*/ { {0x66, 0}, {0xe6, 0} }, { {0x55, 0}, {0xd5, 0} }, - { {0}, {0} }, { {0}, {0} }, /*138*/ + { {0}, {0} }, { {0}, {0} }, /*138*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*13c*/ + { {0}, {0} }, { {0}, {0} }, /*13c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*140*/ + { {0}, {0} }, { {0}, {0} }, /*140*/ { {0}, {0} }, { {0}, {0} }, - { {0x46, 0}, {0xc6, 0} }, { {0x63, 0}, {0xe3, 0} }, /*144*/ + { {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} }, { {0x58, 0}, {0xd8, 0} }, /*148*/ { {0}, {0} }, { {0x5a, 0}, {0xda, 0} }, - { {0}, {0} }, { {0x65, 0}, {0xe5, 0} }, /*14c*/ + { {0}, {0} }, { {0x65, 0}, {0xe5, 0} }, /*14c*/ { {0x59, 0}, {0xd9, 0} }, { {0x5d, 0}, {0xdd, 0} }, - { {0x62, 0}, {0xe2, 0} }, { {0x64, 0}, {0xe4, 0} }, /*150*/ + { {0x62, 0}, {0xe2, 0} }, { {0x64, 0}, {0xe4, 0} }, /*150*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*154*/ + { {0}, {0} }, { {0}, {0} }, /*154*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0x54, 0}, {0xd4, 0} }, /*158*/ + { {0}, {0} }, { {0x54, 0}, {0xd4, 0} }, /*158*/ { {0x67, 0}, {0xe7, 0} }, { {0x56, 0}, {0xd6, 0} }, - { {0}, {0} }, { {0}, {0} }, /*15c*/ + { {0}, {0} }, { {0}, {0} }, /*15c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*160*/ + { {0}, {0} }, { {0}, {0} }, /*160*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*164*/ + { {0}, {0} }, { {0}, {0} }, /*164*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*168*/ + { {0}, {0} }, { {0}, {0} }, /*168*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*16c*/ + { {0}, {0} }, { {0}, {0} }, /*16c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*170*/ + { {0}, {0} }, { {0}, {0} }, /*170*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*174*/ + { {0}, {0} }, { {0}, {0} }, /*174*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*148*/ + { {0}, {0} }, { {0}, {0} }, /*148*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*17c*/ + { {0}, {0} }, { {0}, {0} }, /*17c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*180*/ + { {0}, {0} }, { {0}, {0} }, /*180*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*184*/ + { {0}, {0} }, { {0}, {0} }, /*184*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*88*/ + { {0}, {0} }, { {0}, {0} }, /*188*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*18c*/ + { {0}, {0} }, { {0}, {0} }, /*18c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*190*/ + { {0}, {0} }, { {0}, {0} }, /*190*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*194*/ + { {0}, {0} }, { {0}, {0} }, /*194*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*198*/ + { {0}, {0} }, { {0}, {0} }, /*198*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*19c*/ + { {0}, {0} }, { {0}, {0} }, /*19c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1a0*/ + { {0}, {0} }, { {0}, {0} }, /*1a0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1a4*/ + { {0}, {0} }, { {0}, {0} }, /*1a4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1a8*/ + { {0}, {0} }, { {0}, {0} }, /*1a8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1ac*/ + { {0}, {0} }, { {0}, {0} }, /*1ac*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1b0*/ + { {0}, {0} }, { {0}, {0} }, /*1b0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1b4*/ + { {0}, {0} }, { {0}, {0} }, /*1b4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1b8*/ + { {0}, {0} }, { {0}, {0} }, /*1b8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1bc*/ + { {0}, {0} }, { {0}, {0} }, /*1bc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1c0*/ + { {0}, {0} }, { {0}, {0} }, /*1c0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1c4*/ + { {0}, {0} }, { {0}, {0} }, /*1c4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1c8*/ + { {0}, {0} }, { {0}, {0} }, /*1c8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1cc*/ + { {0}, {0} }, { {0}, {0} }, /*1cc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1d0*/ + { {0}, {0} }, { {0}, {0} }, /*1d0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1d4*/ + { {0}, {0} }, { {0}, {0} }, /*1d4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1d8*/ + { {0}, {0} }, { {0}, {0} }, /*1d8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1dc*/ + { {0}, {0} }, { {0}, {0} }, /*1dc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1e0*/ + { {0}, {0} }, { {0}, {0} }, /*1e0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1e4*/ + { {0}, {0} }, { {0}, {0} }, /*1e4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1e8*/ + { {0}, {0} }, { {0}, {0} }, /*1e8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1ec*/ + { {0}, {0} }, { {0}, {0} }, /*1ec*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1f0*/ + { {0}, {0} }, { {0}, {0} }, /*1f0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1f4*/ + { {0}, {0} }, { {0}, {0} }, /*1f4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1f8*/ + { {0}, {0} }, { {0}, {0} }, /*1f8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} } /*1fc*/ + { {0}, {0} }, { {0}, {0} } /*1fc*/ // clang-format on }; @@ -1156,219 +1156,219 @@ const scancode scancode_olivetti_m240[512] = { { {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} }, /*054*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*058*/ + { {0}, {0} }, { {0}, {0} }, /*058*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*05c*/ + { {0}, {0} }, { {0}, {0} }, /*05c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*060*/ + { {0}, {0} }, { {0}, {0} }, /*060*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*064*/ + { {0}, {0} }, { {0}, {0} }, /*064*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*068*/ + { {0}, {0} }, { {0}, {0} }, /*068*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*06c*/ + { {0}, {0} }, { {0}, {0} }, /*06c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*070*/ + { {0}, {0} }, { {0}, {0} }, /*070*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*074*/ + { {0}, {0} }, { {0}, {0} }, /*074*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*078*/ + { {0}, {0} }, { {0}, {0} }, /*078*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*07c*/ + { {0}, {0} }, { {0}, {0} }, /*07c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*080*/ + { {0}, {0} }, { {0}, {0} }, /*080*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*084*/ + { {0}, {0} }, { {0}, {0} }, /*084*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*088*/ + { {0}, {0} }, { {0}, {0} }, /*088*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*08c*/ + { {0}, {0} }, { {0}, {0} }, /*08c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*090*/ + { {0}, {0} }, { {0}, {0} }, /*090*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*094*/ + { {0}, {0} }, { {0}, {0} }, /*094*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*098*/ + { {0}, {0} }, { {0}, {0} }, /*098*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*09c*/ + { {0}, {0} }, { {0}, {0} }, /*09c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0a0*/ + { {0}, {0} }, { {0}, {0} }, /*0a0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0a4*/ + { {0}, {0} }, { {0}, {0} }, /*0a4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0a8*/ + { {0}, {0} }, { {0}, {0} }, /*0a8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0ac*/ + { {0}, {0} }, { {0}, {0} }, /*0ac*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0b0*/ + { {0}, {0} }, { {0}, {0} }, /*0b0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0b4*/ + { {0}, {0} }, { {0}, {0} }, /*0b4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0b8*/ + { {0}, {0} }, { {0}, {0} }, /*0b8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0bc*/ + { {0}, {0} }, { {0}, {0} }, /*0bc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0c0*/ + { {0}, {0} }, { {0}, {0} }, /*0c0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0c4*/ + { {0}, {0} }, { {0}, {0} }, /*0c4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0c8*/ + { {0}, {0} }, { {0}, {0} }, /*0c8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0cc*/ + { {0}, {0} }, { {0}, {0} }, /*0cc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0d0*/ + { {0}, {0} }, { {0}, {0} }, /*0d0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0d4*/ + { {0}, {0} }, { {0}, {0} }, /*0d4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0d8*/ + { {0}, {0} }, { {0}, {0} }, /*0d8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0dc*/ + { {0}, {0} }, { {0}, {0} }, /*0dc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0e0*/ + { {0}, {0} }, { {0}, {0} }, /*0e0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0e4*/ + { {0}, {0} }, { {0}, {0} }, /*0e4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0e8*/ + { {0}, {0} }, { {0}, {0} }, /*0e8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0ec*/ + { {0}, {0} }, { {0}, {0} }, /*0ec*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0f0*/ + { {0}, {0} }, { {0}, {0} }, /*0f0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0f4*/ + { {0}, {0} }, { {0}, {0} }, /*0f4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0f8*/ + { {0}, {0} }, { {0}, {0} }, /*0f8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0fc*/ + { {0}, {0} }, { {0}, {0} }, /*0fc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*100*/ + { {0}, {0} }, { {0}, {0} }, /*100*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*104*/ + { {0}, {0} }, { {0}, {0} }, /*104*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*108*/ + { {0}, {0} }, { {0}, {0} }, /*108*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*10c*/ + { {0}, {0} }, { {0}, {0} }, /*10c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*110*/ + { {0}, {0} }, { {0}, {0} }, /*110*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*114*/ + { {0}, {0} }, { {0}, {0} }, /*114*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*118*/ + { {0}, {0} }, { {0}, {0} }, /*118*/ { {0x1c, 0}, {0x9c, 0} }, { {0x1d, 0}, {0x9d, 0} }, - { {0}, {0} }, { {0}, {0} }, /*11c*/ + { {0}, {0} }, { {0}, {0} }, /*11c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*120*/ + { {0}, {0} }, { {0}, {0} }, /*120*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*124*/ + { {0}, {0} }, { {0}, {0} }, /*124*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*128*/ + { {0}, {0} }, { {0}, {0} }, /*128*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*12c*/ + { {0}, {0} }, { {0}, {0} }, /*12c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*130*/ + { {0}, {0} }, { {0}, {0} }, /*130*/ { {0}, {0} }, { {0x35, 0}, {0xb5, 0} }, - { {0}, {0} }, { {0x37, 0}, {0xb7, 0} }, /*134*/ + { {0}, {0} }, { {0x37, 0}, {0xb7, 0} }, /*134*/ { {0x38, 0}, {0xb8, 0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*138*/ + { {0}, {0} }, { {0}, {0} }, /*138*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*13c*/ + { {0}, {0} }, { {0}, {0} }, /*13c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*140*/ + { {0}, {0} }, { {0}, {0} }, /*140*/ { {0}, {0} }, { {0}, {0} }, - { {0x46, 0}, {0xc6, 0} }, { {0x47, 0}, {0xc7, 0} }, /*144*/ + { {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} }, { {0x4b, 0}, {0xcb, 0} }, /*148*/ { {0}, {0} }, { {0x4d, 0}, {0xcd, 0} }, - { {0}, {0} }, { {0x4f, 0}, {0xcf, 0} }, /*14c*/ + { {0}, {0} }, { {0x4f, 0}, {0xcf, 0} }, /*14c*/ { {0x50, 0}, {0xd0, 0} }, { {0x51, 0}, {0xd1, 0} }, - { {0x52, 0}, {0xd2, 0} }, { {0x53, 0}, {0xd3, 0} }, /*150*/ + { {0x52, 0}, {0xd2, 0} }, { {0x53, 0}, {0xd3, 0} }, /*150*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*154*/ + { {0}, {0} }, { {0}, {0} }, /*154*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*158*/ + { {0}, {0} }, { {0}, {0} }, /*158*/ { {0}, {0} }, { {0x54, 0}, {0xd4, 0} }, - { {0x56, 0}, {0xd6, 0} }, { {0x5c, 0}, {0xdc, 0} }, /*15c*/ + { {0x56, 0}, {0xd6, 0} }, { {0x5c, 0}, {0xdc, 0} }, /*15c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*160*/ + { {0}, {0} }, { {0}, {0} }, /*160*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*164*/ + { {0}, {0} }, { {0}, {0} }, /*164*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*168*/ + { {0}, {0} }, { {0}, {0} }, /*168*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*16c*/ + { {0}, {0} }, { {0}, {0} }, /*16c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*170*/ + { {0}, {0} }, { {0}, {0} }, /*170*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*174*/ + { {0}, {0} }, { {0}, {0} }, /*174*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*148*/ + { {0}, {0} }, { {0}, {0} }, /*148*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*17c*/ + { {0}, {0} }, { {0}, {0} }, /*17c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*180*/ + { {0}, {0} }, { {0}, {0} }, /*180*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*184*/ + { {0}, {0} }, { {0}, {0} }, /*184*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*88*/ + { {0}, {0} }, { {0}, {0} }, /*188*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*18c*/ + { {0}, {0} }, { {0}, {0} }, /*18c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*190*/ + { {0}, {0} }, { {0}, {0} }, /*190*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*194*/ + { {0}, {0} }, { {0}, {0} }, /*194*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*198*/ + { {0}, {0} }, { {0}, {0} }, /*198*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*19c*/ + { {0}, {0} }, { {0}, {0} }, /*19c*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1a0*/ + { {0}, {0} }, { {0}, {0} }, /*1a0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1a4*/ + { {0}, {0} }, { {0}, {0} }, /*1a4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1a8*/ + { {0}, {0} }, { {0}, {0} }, /*1a8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1ac*/ + { {0}, {0} }, { {0}, {0} }, /*1ac*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1b0*/ + { {0}, {0} }, { {0}, {0} }, /*1b0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1b4*/ + { {0}, {0} }, { {0}, {0} }, /*1b4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1b8*/ + { {0}, {0} }, { {0}, {0} }, /*1b8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1bc*/ + { {0}, {0} }, { {0}, {0} }, /*1bc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1c0*/ + { {0}, {0} }, { {0}, {0} }, /*1c0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1c4*/ + { {0}, {0} }, { {0}, {0} }, /*1c4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1c8*/ + { {0}, {0} }, { {0}, {0} }, /*1c8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1cc*/ + { {0}, {0} }, { {0}, {0} }, /*1cc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1d0*/ + { {0}, {0} }, { {0}, {0} }, /*1d0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1d4*/ + { {0}, {0} }, { {0}, {0} }, /*1d4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1d8*/ + { {0}, {0} }, { {0}, {0} }, /*1d8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1dc*/ + { {0}, {0} }, { {0}, {0} }, /*1dc*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1e0*/ + { {0}, {0} }, { {0}, {0} }, /*1e0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1e4*/ + { {0}, {0} }, { {0}, {0} }, /*1e4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1e8*/ + { {0}, {0} }, { {0}, {0} }, /*1e8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1ec*/ + { {0}, {0} }, { {0}, {0} }, /*1ec*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1f0*/ + { {0}, {0} }, { {0}, {0} }, /*1f0*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1f4*/ + { {0}, {0} }, { {0}, {0} }, /*1f4*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1f8*/ + { {0}, {0} }, { {0}, {0} }, /*1f8*/ { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} } /*1fc*/ + { {0}, {0} }, { {0}, {0} } /*1fc*/ // clang-format on }; diff --git a/src/machine/m_xt_t1000.c b/src/machine/m_xt_t1000.c index f61ce639b..f6f2e5322 100644 --- a/src/machine/m_xt_t1000.c +++ b/src/machine/m_xt_t1000.c @@ -55,7 +55,7 @@ * * Authors: Fred N. van Kempen, * Miran Grca, - * Sarah Walker, + * Sarah Walker, * * Copyright 2018-2019 Fred N. van Kempen. * Copyright 2018-2019 Miran Grca. @@ -687,8 +687,8 @@ t1000_read_nvram(uint16_t addr, void *priv) tmp = fdc_read(0x03f7, t1000.fdc); tmp = (tmp & 0x80) >> 3; /* Bit 4 is changeline */ - tmp |= (sys->nvr_active & 0xc0); /* Bits 6,7 are r/w mode */ - tmp |= 0x2e; /* Bits 5,3,2,1 always 1 */ + tmp |= (sys->nvr_active & 0xc0); /* Bits 6, 7 are r/w mode */ + tmp |= 0x2e; /* Bits 5, 3, 2, 1 always 1 */ tmp |= (sys->nvr_active & 0x40) >> 6; /* Ready state */ break; } diff --git a/src/machine/m_xt_t1000_vid.c b/src/machine/m_xt_t1000_vid.c index 60fb59082..48c00d3c3 100644 --- a/src/machine/m_xt_t1000_vid.c +++ b/src/machine/m_xt_t1000_vid.c @@ -13,7 +13,7 @@ * * Authors: Fred N. van Kempen, * Miran Grca, - * Sarah Walker, + * Sarah Walker, * * Copyright 2018-2019 Fred N. van Kempen. * Copyright 2018-2019 Miran Grca. diff --git a/src/machine/m_xt_zenith.c b/src/machine/m_xt_zenith.c index 9e05f3077..e5cebe552 100644 --- a/src/machine/m_xt_zenith.c +++ b/src/machine/m_xt_zenith.c @@ -11,7 +11,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * TheCollector1995, * EngiNerd diff --git a/src/machine/machine.c b/src/machine/machine.c index 6b496b06a..f7970d4f1 100644 --- a/src/machine/machine.c +++ b/src/machine/machine.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 2807c1060..c2db92654 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -13,7 +13,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/mem/CMakeLists.txt b/src/mem/CMakeLists.txt index 1739d4807..6aad80544 100644 --- a/src/mem/CMakeLists.txt +++ b/src/mem/CMakeLists.txt @@ -10,7 +10,7 @@ # # Authors: David Hrdlička, # -# Copyright 2020,2021 David Hrdlička. +# Copyright 2020-2021 David Hrdlička. # add_library(mem OBJECT catalyst_flash.c i2c_eeprom.c intel_flash.c mem.c rom.c diff --git a/src/mem/catalyst_flash.c b/src/mem/catalyst_flash.c index 043a24b37..5e473f540 100644 --- a/src/mem/catalyst_flash.c +++ b/src/mem/catalyst_flash.c @@ -11,7 +11,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2019 Sarah Walker. diff --git a/src/mem/intel_flash.c b/src/mem/intel_flash.c index 18b8a4b3d..f06b2426d 100644 --- a/src/mem/intel_flash.c +++ b/src/mem/intel_flash.c @@ -11,7 +11,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2020 Sarah Walker. diff --git a/src/mem/mem.c b/src/mem/mem.c index 4d5a5238b..1af83c844 100644 --- a/src/mem/mem.c +++ b/src/mem/mem.c @@ -8,7 +8,7 @@ * * Memory handling and MMU. * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/mem/rom.c b/src/mem/rom.c index 6c964f2c3..25ca1db71 100644 --- a/src/mem/rom.c +++ b/src/mem/rom.c @@ -14,7 +14,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/mem/sst_flash.c b/src/mem/sst_flash.c index 5ad110fa5..a58aa6895 100644 --- a/src/mem/sst_flash.c +++ b/src/mem/sst_flash.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Melissa Goad, * diff --git a/src/minitrace/minitrace.c b/src/minitrace/minitrace.c index df68e7d79..0b2208605 100644 --- a/src/minitrace/minitrace.c +++ b/src/minitrace/minitrace.c @@ -1,6 +1,6 @@ // minitrace // Copyright 2014 by Henrik Rydgård -// http://www.github.com/hrydgard/minitrace +// https://www.github.com/hrydgard/minitrace // Released under the MIT license. // See minitrace.h for basic documentation. @@ -48,20 +48,20 @@ // Ugh, this struct is already pretty heavy. // Will probably need to move arguments to a second buffer to support more than one. typedef struct raw_event { - const char *name; - const char *cat; - void *id; - int64_t ts; - uint32_t pid; - uint32_t tid; - char ph; - mtr_arg_type arg_type; - const char *arg_name; - union { - const char *a_str; - int a_int; - double a_double; - }; + const char *name; + const char *cat; + void *id; + int64_t ts; + uint32_t pid; + uint32_t tid; + char ph; + mtr_arg_type arg_type; + const char *arg_name; + union { + const char *a_str; + int a_int; + double a_double; + }; } raw_event_t; static raw_event_t *event_buffer; @@ -74,7 +74,7 @@ static int events_in_progress = 0; static int64_t time_offset; static int first_line = 1; static FILE *f; -static __thread int cur_thread_id; // Thread local storage +static __thread int cur_thread_id; // Thread local storage static int cur_process_id; static pthread_mutex_t mutex; static pthread_mutex_t event_mutex; @@ -89,44 +89,44 @@ void mtr_flush_with_state(int); // Tiny portability layer. // Exposes: -// get_cur_thread_id() -// get_cur_process_id() -// mtr_time_s() -// pthread basics +// get_cur_thread_id() +// get_cur_process_id() +// mtr_time_s() +// pthread basics #ifdef _WIN32 static int get_cur_thread_id(void) { - return (int)GetCurrentThreadId(); + return (int)GetCurrentThreadId(); } static int get_cur_process_id(void) { - return (int)GetCurrentProcessId(); + return (int)GetCurrentProcessId(); } static uint64_t _frequency = 0; static uint64_t _starttime = 0; double mtr_time_s(void) { - if (_frequency == 0) { - QueryPerformanceFrequency((LARGE_INTEGER*)&_frequency); - QueryPerformanceCounter((LARGE_INTEGER*)&_starttime); - } - __int64 time; - QueryPerformanceCounter((LARGE_INTEGER*)&time); - return ((double) (time - _starttime) / (double) _frequency); + if (_frequency == 0) { + QueryPerformanceFrequency((LARGE_INTEGER*)&_frequency); + QueryPerformanceCounter((LARGE_INTEGER*)&_starttime); + } + __int64 time; + QueryPerformanceCounter((LARGE_INTEGER*)&time); + return ((double) (time - _starttime) / (double) _frequency); } // Ctrl+C handling for Windows console apps static BOOL WINAPI CtrlHandler(DWORD fdwCtrlType) { - if (atomic_load(&is_tracing) && fdwCtrlType == CTRL_C_EVENT) { - printf("Ctrl-C detected! Flushing trace and shutting down.\n\n"); - mtr_flush(); - mtr_shutdown(); - } - ExitProcess(1); + if (atomic_load(&is_tracing) && fdwCtrlType == CTRL_C_EVENT) { + printf("Ctrl-C detected! Flushing trace and shutting down.\n\n"); + mtr_flush(); + mtr_shutdown(); + } + ExitProcess(1); } void mtr_register_sigint_handler(void) { - // For console apps: - SetConsoleCtrlHandler(&CtrlHandler, TRUE); + // For console apps: + SetConsoleCtrlHandler(&CtrlHandler, TRUE); } HANDLE thread_handle; @@ -155,10 +155,10 @@ static void join_flushing_thread(void) { #else static inline int get_cur_thread_id(void) { - return (int)(intptr_t)pthread_self(); + return (int)(intptr_t)pthread_self(); } static inline int get_cur_process_id(void) { - return (int)getpid(); + return (int)getpid(); } static pthread_t thread_handle = 0; @@ -188,110 +188,110 @@ static void join_flushing_thread(void) { #if defined(BLACKBERRY) double mtr_time_s() { - struct timespec time; - clock_gettime(CLOCK_MONOTONIC, &time); // Linux must use CLOCK_MONOTONIC_RAW due to time warps - return time.tv_sec + time.tv_nsec / 1.0e9; + struct timespec time; + clock_gettime(CLOCK_MONOTONIC, &time); // Linux must use CLOCK_MONOTONIC_RAW due to time warps + return time.tv_sec + time.tv_nsec / 1.0e9; } #else double mtr_time_s(void) { - static time_t start; - struct timeval tv; - gettimeofday(&tv, NULL); - if (start == 0) { - start = tv.tv_sec; - } - tv.tv_sec -= start; - return (double)tv.tv_sec + (double)tv.tv_usec / 1000000.0; + static time_t start; + struct timeval tv; + gettimeofday(&tv, NULL); + if (start == 0) { + start = tv.tv_sec; + } + tv.tv_sec -= start; + return (double)tv.tv_sec + (double)tv.tv_usec / 1000000.0; } -#endif // !BLACKBERRY +#endif // !BLACKBERRY static void termination_handler(int signum) ATTR_NORETURN; static void termination_handler(int signum) { - (void) signum; - if (is_tracing) { - printf("Ctrl-C detected! Flushing trace and shutting down.\n\n"); - mtr_flush(); - fwrite("\n]}\n", 1, 4, f); - fclose(f); - } - exit(1); + (void) signum; + if (is_tracing) { + printf("Ctrl-C detected! Flushing trace and shutting down.\n\n"); + mtr_flush(); + fwrite("\n]}\n", 1, 4, f); + fclose(f); + } + exit(1); } void mtr_register_sigint_handler(void) { #ifndef MTR_ENABLED - return; + return; #endif - // Avoid altering set-to-be-ignored handlers while registering. - if (signal(SIGINT, &termination_handler) == SIG_IGN) - signal(SIGINT, SIG_IGN); + // Avoid altering set-to-be-ignored handlers while registering. + if (signal(SIGINT, &termination_handler) == SIG_IGN) + signal(SIGINT, SIG_IGN); } #endif void mtr_init_from_stream(void *stream) { #ifndef MTR_ENABLED - return; + return; #endif - event_buffer = (raw_event_t *)malloc(INTERNAL_MINITRACE_BUFFER_SIZE * sizeof(raw_event_t)); - flush_buffer = (raw_event_t *)malloc(INTERNAL_MINITRACE_BUFFER_SIZE * sizeof(raw_event_t)); - event_count = 0; - f = (FILE *)stream; - const char *header = "{\"traceEvents\":[\n"; - fwrite(header, 1, strlen(header), f); - time_offset = (uint64_t)(mtr_time_s() * 1000000); - first_line = 1; - pthread_mutex_init(&mutex, 0); - pthread_mutex_init(&event_mutex, 0); + event_buffer = (raw_event_t *)malloc(INTERNAL_MINITRACE_BUFFER_SIZE * sizeof(raw_event_t)); + flush_buffer = (raw_event_t *)malloc(INTERNAL_MINITRACE_BUFFER_SIZE * sizeof(raw_event_t)); + event_count = 0; + f = (FILE *)stream; + const char *header = "{\"traceEvents\":[\n"; + fwrite(header, 1, strlen(header), f); + time_offset = (uint64_t)(mtr_time_s() * 1000000); + first_line = 1; + pthread_mutex_init(&mutex, 0); + pthread_mutex_init(&event_mutex, 0); } void mtr_init(const char *json_file) { #ifndef MTR_ENABLED - return; + return; #endif - mtr_init_from_stream(fopen(json_file, "wb")); + mtr_init_from_stream(fopen(json_file, "wb")); } void mtr_shutdown(void) { - int i; + int i; #ifndef MTR_ENABLED - return; + return; #endif - mtr_flush_with_state(TRUE); + mtr_flush_with_state(TRUE); - fwrite("\n]}\n", 1, 4, f); - fclose(f); - pthread_mutex_destroy(&mutex); - pthread_mutex_destroy(&event_mutex); - f = 0; - free(event_buffer); - event_buffer = 0; - for (i = 0; i < STRING_POOL_SIZE; i++) { - if (str_pool[i]) { - free(str_pool[i]); - str_pool[i] = 0; - } - } + fwrite("\n]}\n", 1, 4, f); + fclose(f); + pthread_mutex_destroy(&mutex); + pthread_mutex_destroy(&event_mutex); + f = 0; + free(event_buffer); + event_buffer = 0; + for (i = 0; i < STRING_POOL_SIZE; i++) { + if (str_pool[i]) { + free(str_pool[i]); + str_pool[i] = 0; + } + } } const char *mtr_pool_string(const char *str) { - int i; - for (i = 0; i < STRING_POOL_SIZE; i++) { - if (!str_pool[i]) { - str_pool[i] = (char*)malloc(strlen(str) + 1); - strcpy(str_pool[i], str); - return str_pool[i]; - } else { - if (!strcmp(str, str_pool[i])) - return str_pool[i]; - } - } - return "string pool full"; + int i; + for (i = 0; i < STRING_POOL_SIZE; i++) { + if (!str_pool[i]) { + str_pool[i] = (char*)malloc(strlen(str) + 1); + strcpy(str_pool[i], str); + return str_pool[i]; + } else { + if (!strcmp(str, str_pool[i])) + return str_pool[i]; + } + } + return "string pool full"; } void mtr_start(void) { #ifndef MTR_ENABLED - return; + return; #endif #ifdef _WIN32 pthread_cond_init(&buffer_not_full_cond); @@ -301,19 +301,19 @@ void mtr_start(void) { pthread_cond_init(&buffer_full_cond, NULL); #endif atomic_store(&is_tracing, TRUE); - init_flushing_thread(); + init_flushing_thread(); } void mtr_stop(void) { #ifndef MTR_ENABLED - return; + return; #endif - atomic_store(&is_tracing, FALSE); - atomic_store(&stop_flushing_requested, TRUE); - pthread_cond_signal(&buffer_not_full_cond); - pthread_cond_signal(&buffer_full_cond); - join_flushing_thread(); - atomic_store(&stop_flushing_requested, FALSE); + atomic_store(&is_tracing, FALSE); + atomic_store(&stop_flushing_requested, TRUE); + pthread_cond_signal(&buffer_not_full_cond); + pthread_cond_signal(&buffer_full_cond); + join_flushing_thread(); + atomic_store(&stop_flushing_requested, FALSE); } // TODO: fwrite more than one line at a time. @@ -323,247 +323,248 @@ void mtr_stop(void) { // running at any point of time void mtr_flush_with_state(int is_last) { #ifndef MTR_ENABLED - return; + return; #endif - int i = 0; - char linebuf[1024]; - char arg_buf[1024]; - char id_buf[256]; - int event_count_copy = 0; - int events_in_progress_copy = 1; - raw_event_t *event_buffer_tmp = NULL; + int i = 0; + char linebuf[1024]; + char arg_buf[1024]; + char id_buf[256]; + int event_count_copy = 0; + int events_in_progress_copy = 1; + raw_event_t *event_buffer_tmp = NULL; - // small critical section to swap buffers - // - no any new events can be spawn while - // swapping since they tied to the same mutex - // - checks for any flushing in process - pthread_mutex_lock(&mutex); - // if not flushing already - if (is_flushing) { - pthread_mutex_unlock(&mutex); - return; - } - is_flushing = TRUE; - if(!is_last) { - while(event_count < INTERNAL_MINITRACE_BUFFER_SIZE && atomic_load(&is_tracing)) { - pthread_cond_wait(&buffer_full_cond, &mutex); - } - } - event_count_copy = event_count; - event_buffer_tmp = flush_buffer; - flush_buffer = event_buffer; - event_buffer = event_buffer_tmp; - event_count = 0; - // waiting for any unfinished events before swap - while (events_in_progress_copy != 0) { - pthread_mutex_lock(&event_mutex); - events_in_progress_copy = events_in_progress; - pthread_mutex_unlock(&event_mutex); - } - pthread_mutex_unlock(&mutex); - pthread_cond_signal(&buffer_not_full_cond); + // small critical section to swap buffers + // - no any new events can be spawn while + // swapping since they tied to the same mutex + // - checks for any flushing in process + pthread_mutex_lock(&mutex); + // if not flushing already + if (is_flushing) { + pthread_mutex_unlock(&mutex); + return; + } + is_flushing = TRUE; + if(!is_last) { + while(event_count < INTERNAL_MINITRACE_BUFFER_SIZE && atomic_load(&is_tracing)) { + pthread_cond_wait(&buffer_full_cond, &mutex); + } + } + event_count_copy = event_count; + event_buffer_tmp = flush_buffer; + flush_buffer = event_buffer; + event_buffer = event_buffer_tmp; + event_count = 0; + // waiting for any unfinished events before swap + while (events_in_progress_copy != 0) { + pthread_mutex_lock(&event_mutex); + events_in_progress_copy = events_in_progress; + pthread_mutex_unlock(&event_mutex); + } + pthread_mutex_unlock(&mutex); + pthread_cond_signal(&buffer_not_full_cond); - for (i = 0; i < event_count_copy; i++) { - raw_event_t *raw = &flush_buffer[i]; - int len; - switch (raw->arg_type) { - case MTR_ARG_TYPE_INT: - snprintf(arg_buf, ARRAY_SIZE(arg_buf), "\"%s\":%i", raw->arg_name, raw->a_int); - break; - case MTR_ARG_TYPE_STRING_CONST: - snprintf(arg_buf, ARRAY_SIZE(arg_buf), "\"%s\":\"%s\"", raw->arg_name, raw->a_str); - break; - case MTR_ARG_TYPE_STRING_COPY: - if (strlen(raw->a_str) > 700) { - snprintf(arg_buf, ARRAY_SIZE(arg_buf), "\"%s\":\"%.*s\"", raw->arg_name, 700, raw->a_str); - } else { - snprintf(arg_buf, ARRAY_SIZE(arg_buf), "\"%s\":\"%s\"", raw->arg_name, raw->a_str); - } - break; - case MTR_ARG_TYPE_NONE: - arg_buf[0] = '\0'; - break; - } - if (raw->id) { - switch (raw->ph) { - case 'S': - case 'T': - case 'F': - // TODO: Support full 64-bit pointers - snprintf(id_buf, ARRAY_SIZE(id_buf), ",\"id\":\"0x%08x\"", (uint32_t)(uintptr_t)raw->id); - break; - case 'X': - snprintf(id_buf, ARRAY_SIZE(id_buf), ",\"dur\":%i", (int)raw->a_double); - break; - } - } else { - id_buf[0] = 0; - } - const char *cat = raw->cat; + for (i = 0; i < event_count_copy; i++) { + raw_event_t *raw = &flush_buffer[i]; + int len; + switch (raw->arg_type) { + case MTR_ARG_TYPE_INT: + snprintf(arg_buf, ARRAY_SIZE(arg_buf), "\"%s\":%i", raw->arg_name, raw->a_int); + break; + case MTR_ARG_TYPE_STRING_CONST: + snprintf(arg_buf, ARRAY_SIZE(arg_buf), "\"%s\":\"%s\"", raw->arg_name, raw->a_str); + break; + case MTR_ARG_TYPE_STRING_COPY: + if (strlen(raw->a_str) > 700) { + snprintf(arg_buf, ARRAY_SIZE(arg_buf), "\"%s\":\"%.*s\"", raw->arg_name, 700, raw->a_str); + } else { + snprintf(arg_buf, ARRAY_SIZE(arg_buf), "\"%s\":\"%s\"", raw->arg_name, raw->a_str); + } + break; + case MTR_ARG_TYPE_NONE: + arg_buf[0] = '\0'; + break; + } + if (raw->id) { + switch (raw->ph) { + case 'S': + case 'T': + case 'F': + // TODO: Support full 64-bit pointers + snprintf(id_buf, ARRAY_SIZE(id_buf), ",\"id\":\"0x%08x\"", (uint32_t)(uintptr_t)raw->id); + break; + case 'X': + snprintf(id_buf, ARRAY_SIZE(id_buf), ",\"dur\":%i", (int)raw->a_double); + break; + } + } else { + id_buf[0] = 0; + } + const char *cat = raw->cat; #ifdef _WIN32 - // On Windows, we often end up with backslashes in category. - char temp[256]; - { - int len = (int)strlen(cat); - int i; - if (len > 255) len = 255; - for (i = 0; i < len; i++) { - temp[i] = cat[i] == '\\' ? '/' : cat[i]; - } - temp[len] = 0; - cat = temp; - } + // On Windows, we often end up with backslashes in category. + char temp[256]; + { + int len = (int)strlen(cat); + int i; + if (len > 255) len = 255; + for (i = 0; i < len; i++) { + temp[i] = cat[i] == '\\' ? '/' : cat[i]; + } + temp[len] = 0; + cat = temp; + } #endif - len = snprintf(linebuf, ARRAY_SIZE(linebuf), "%s{\"cat\":\"%s\",\"pid\":%i,\"tid\":%i,\"ts\":%" PRId64 ",\"ph\":\"%c\",\"name\":\"%s\",\"args\":{%s}%s}", - first_line ? "" : ",\n", - cat, raw->pid, raw->tid, raw->ts - time_offset, raw->ph, raw->name, arg_buf, id_buf); - fwrite(linebuf, 1, len, f); - first_line = 0; + len = snprintf(linebuf, ARRAY_SIZE(linebuf), "%s{\"cat\":\"%s\",\"pid\":%i,\"tid\":%i,\"ts\":%" PRId64 ",\"ph\":\"%c\",\"name\":\"%s\",\"args\":{%s}%s}", + first_line ? "" : ",\n", + cat, raw->pid, raw->tid, raw->ts - time_offset, raw->ph, raw->name, arg_buf, id_buf); + fwrite(linebuf, 1, len, f); + first_line = 0; - if (raw->arg_type == MTR_ARG_TYPE_STRING_COPY) { - free((void*)raw->a_str); - } - #ifdef MTR_COPY_EVENT_CATEGORY_AND_NAME - free(raw->name); - free(raw->cat); - #endif - } + if (raw->arg_type == MTR_ARG_TYPE_STRING_COPY) { + free((void*)raw->a_str); + } + #ifdef MTR_COPY_EVENT_CATEGORY_AND_NAME + free(raw->name); + free(raw->cat); + #endif + } - pthread_mutex_lock(&mutex); - is_flushing = is_last; - pthread_mutex_unlock(&mutex); + pthread_mutex_lock(&mutex); + is_flushing = is_last; + pthread_mutex_unlock(&mutex); } void mtr_flush(void) { - mtr_flush_with_state(FALSE); + mtr_flush_with_state(FALSE); } void internal_mtr_raw_event(const char *category, const char *name, char ph, void *id) { #ifndef MTR_ENABLED - return; + return; #endif - if (!atomic_load(&is_tracing)) { - return; - } - pthread_mutex_lock(&mutex); - while(event_count >= INTERNAL_MINITRACE_BUFFER_SIZE && atomic_load(&is_tracing)) { - pthread_cond_wait(&buffer_not_full_cond, &mutex); - } - raw_event_t *ev = &event_buffer[event_count]; - ++event_count; - pthread_mutex_lock(&event_mutex); - ++events_in_progress; - pthread_mutex_unlock(&event_mutex); - int local_event_count = event_count; - pthread_mutex_unlock(&mutex); - if(local_event_count >= INTERNAL_MINITRACE_BUFFER_SIZE) { - pthread_cond_signal(&buffer_full_cond); - } + if (!atomic_load(&is_tracing)) { + return; + } + pthread_mutex_lock(&mutex); + while(event_count >= INTERNAL_MINITRACE_BUFFER_SIZE && atomic_load(&is_tracing)) { + pthread_cond_wait(&buffer_not_full_cond, &mutex); - double ts = mtr_time_s(); + } + raw_event_t *ev = &event_buffer[event_count]; + ++event_count; + pthread_mutex_lock(&event_mutex); + ++events_in_progress; + pthread_mutex_unlock(&event_mutex); + int local_event_count = event_count; + pthread_mutex_unlock(&mutex); + if(local_event_count >= INTERNAL_MINITRACE_BUFFER_SIZE) { + pthread_cond_signal(&buffer_full_cond); + } - if (!cur_thread_id) { - cur_thread_id = get_cur_thread_id(); - } - if (!cur_process_id) { - cur_process_id = get_cur_process_id(); - } + double ts = mtr_time_s(); + + if (!cur_thread_id) { + cur_thread_id = get_cur_thread_id(); + } + if (!cur_process_id) { + cur_process_id = get_cur_process_id(); + } #ifdef MTR_COPY_EVENT_CATEGORY_AND_NAME - const size_t category_len = strlen(category); - ev->cat = malloc(category_len + 1); - strcpy(ev->cat, category); + const size_t category_len = strlen(category); + ev->cat = malloc(category_len + 1); + strcpy(ev->cat, category); - const size_t name_len = strlen(name); - ev->name = malloc(name_len + 1); - strcpy(ev->name, name); + const size_t name_len = strlen(name); + ev->name = malloc(name_len + 1); + strcpy(ev->name, name); #else - ev->cat = category; - ev->name = name; + ev->cat = category; + ev->name = name; #endif - ev->id = id; - ev->ph = ph; - if (ev->ph == 'X') { - double x; - memcpy(&x, id, sizeof(double)); - ev->ts = (int64_t)(x * 1000000); - ev->a_double = (ts - x) * 1000000; - } else { - ev->ts = (int64_t)(ts * 1000000); - } - ev->tid = cur_thread_id; - ev->pid = cur_process_id; - ev->arg_type = MTR_ARG_TYPE_NONE; + ev->id = id; + ev->ph = ph; + if (ev->ph == 'X') { + double x; + memcpy(&x, id, sizeof(double)); + ev->ts = (int64_t)(x * 1000000); + ev->a_double = (ts - x) * 1000000; + } else { + ev->ts = (int64_t)(ts * 1000000); + } + ev->tid = cur_thread_id; + ev->pid = cur_process_id; + ev->arg_type = MTR_ARG_TYPE_NONE; - pthread_mutex_lock(&event_mutex); - --events_in_progress; - pthread_mutex_unlock(&event_mutex); + pthread_mutex_lock(&event_mutex); + --events_in_progress; + pthread_mutex_unlock(&event_mutex); } void internal_mtr_raw_event_arg(const char *category, const char *name, char ph, void *id, mtr_arg_type arg_type, const char *arg_name, void *arg_value) { #ifndef MTR_ENABLED - return; + return; #endif - if (!atomic_load(&is_tracing)) { - return; - } - pthread_mutex_lock(&mutex); - while(event_count >= INTERNAL_MINITRACE_BUFFER_SIZE && atomic_load(&is_tracing)) { - pthread_cond_wait(&buffer_not_full_cond, &mutex); - } - raw_event_t *ev = &event_buffer[event_count]; - ++event_count; - pthread_mutex_lock(&event_mutex); - ++events_in_progress; - pthread_mutex_unlock(&event_mutex); - int local_event_count = event_count; - pthread_mutex_unlock(&mutex); - if(local_event_count >= INTERNAL_MINITRACE_BUFFER_SIZE) { - pthread_cond_signal(&buffer_full_cond); - } + if (!atomic_load(&is_tracing)) { + return; + } + pthread_mutex_lock(&mutex); + while(event_count >= INTERNAL_MINITRACE_BUFFER_SIZE && atomic_load(&is_tracing)) { + pthread_cond_wait(&buffer_not_full_cond, &mutex); + } + raw_event_t *ev = &event_buffer[event_count]; + ++event_count; + pthread_mutex_lock(&event_mutex); + ++events_in_progress; + pthread_mutex_unlock(&event_mutex); + int local_event_count = event_count; + pthread_mutex_unlock(&mutex); + if(local_event_count >= INTERNAL_MINITRACE_BUFFER_SIZE) { + pthread_cond_signal(&buffer_full_cond); + } - if (!cur_thread_id) { - cur_thread_id = get_cur_thread_id(); - } - if (!cur_process_id) { - cur_process_id = get_cur_process_id(); - } - double ts = mtr_time_s(); + if (!cur_thread_id) { + cur_thread_id = get_cur_thread_id(); + } + if (!cur_process_id) { + cur_process_id = get_cur_process_id(); + } + double ts = mtr_time_s(); #ifdef MTR_COPY_EVENT_CATEGORY_AND_NAME - const size_t category_len = strlen(category); - ev->cat = malloc(category_len + 1); - strcpy(ev->cat, category); + const size_t category_len = strlen(category); + ev->cat = malloc(category_len + 1); + strcpy(ev->cat, category); - const size_t name_len = strlen(name); - ev->name = malloc(name_len + 1); - strcpy(ev->name, name); + const size_t name_len = strlen(name); + ev->name = malloc(name_len + 1); + strcpy(ev->name, name); #else - ev->cat = category; - ev->name = name; + ev->cat = category; + ev->name = name; #endif - ev->id = id; - ev->ts = (int64_t)(ts * 1000000); - ev->ph = ph; - ev->tid = cur_thread_id; - ev->pid = cur_process_id; - ev->arg_type = arg_type; - ev->arg_name = arg_name; - switch (arg_type) { - case MTR_ARG_TYPE_INT: ev->a_int = (int)(uintptr_t)arg_value; break; - case MTR_ARG_TYPE_STRING_CONST: ev->a_str = (const char*)arg_value; break; - case MTR_ARG_TYPE_STRING_COPY: ev->a_str = strdup((const char*)arg_value); break; - case MTR_ARG_TYPE_NONE: break; - } + ev->id = id; + ev->ts = (int64_t)(ts * 1000000); + ev->ph = ph; + ev->tid = cur_thread_id; + ev->pid = cur_process_id; + ev->arg_type = arg_type; + ev->arg_name = arg_name; + switch (arg_type) { + case MTR_ARG_TYPE_INT: ev->a_int = (int)(uintptr_t)arg_value; break; + case MTR_ARG_TYPE_STRING_CONST: ev->a_str = (const char*)arg_value; break; + case MTR_ARG_TYPE_STRING_COPY: ev->a_str = strdup((const char*)arg_value); break; + case MTR_ARG_TYPE_NONE: break; + } - pthread_mutex_lock(&event_mutex); - --events_in_progress; - pthread_mutex_unlock(&event_mutex); + pthread_mutex_lock(&event_mutex); + --events_in_progress; + pthread_mutex_unlock(&event_mutex); } diff --git a/src/network/CMakeLists.txt b/src/network/CMakeLists.txt index dc03cb417..e14f979d3 100644 --- a/src/network/CMakeLists.txt +++ b/src/network/CMakeLists.txt @@ -10,7 +10,7 @@ # # Authors: David Hrdlička, # -# Copyright 2020,2021 David Hrdlička. +# Copyright 2020-2021 David Hrdlička. # add_library(net OBJECT network.c net_pcap.c net_slirp.c net_dp8390.c net_3c501.c diff --git a/src/network/net_3c501.c b/src/network/net_3c501.c index 19ad587c2..736edb85b 100644 --- a/src/network/net_3c501.c +++ b/src/network/net_3c501.c @@ -1,22 +1,23 @@ /* - * 86Box An emulator of (mostly) x86-based PC systems and devices, - * using the ISA, EISA, VLB, MCA, and PCI system buses, - * roughly spanning the era between 1981 and 1995. + * 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 Project. + * This file is part of the 86Box distribution. * - * Implementation of the following network controller: - * - 3Com Etherlink 3c500/3c501 (ISA 8-bit). + * Implementation of the following network controller: + * - 3Com Etherlink 3c500/3c501 (ISA 8-bit). * * * - * Based on @(#)Dev3C501.cpp Oracle (VirtualBox) + * Based on @(#)Dev3C501.cpp Oracle (VirtualBox) * - * Authors: TheCollector1995, - * Oracle + * Authors: TheCollector1995, + * Oracle * - * Copyright 2022 TheCollector1995. - * Portions Copyright (C) 2022 Oracle and/or its affilitates. + * Copyright 2022 TheCollector1995. + * Portions Copyright (C) 2022 Oracle and/or its affilitates. * * 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 diff --git a/src/network/net_3c503.c b/src/network/net_3c503.c index 07dcc1a43..9e4f9c12b 100644 --- a/src/network/net_3c503.c +++ b/src/network/net_3c503.c @@ -1,9 +1,10 @@ /* - * 86Box An emulator of (mostly) x86-based PC systems and devices, - * using the ISA, EISA, VLB, MCA, and PCI system buses, - * roughly spanning the era between 1981 and 1995. + * 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 Project. + * This file is part of the 86Box distribution. * * Implementation of the following network controllers: * - 3Com Etherlink II 3c503 (ISA 8-bit). diff --git a/src/network/net_dp8390.c b/src/network/net_dp8390.c index 255749e4e..3b54fdb9d 100644 --- a/src/network/net_dp8390.c +++ b/src/network/net_dp8390.c @@ -44,11 +44,11 @@ dp8390_log(const char *fmt, ...) { va_list ap; - // if (dp8390_do_log >= lvl) { +// if (dp8390_do_log >= lvl) { va_start(ap, fmt); pclog_ex(fmt, ap); va_end(ap); - // } +// } } #else # define dp8390_log(lvl, fmt, ...) diff --git a/src/network/net_ne2000.c b/src/network/net_ne2000.c index 66681206b..9a598538d 100644 --- a/src/network/net_ne2000.c +++ b/src/network/net_ne2000.c @@ -22,7 +22,7 @@ * Miran Grca, * Peter Grehan, * - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. * Copyright 2016-2018 Miran Grca. * Portions Copyright (C) 2002 MandrakeSoft S.A. * diff --git a/src/network/pcap_if.c b/src/network/pcap_if.c index 69110cb34..56fa3eaf1 100644 --- a/src/network/pcap_if.c +++ b/src/network/pcap_if.c @@ -12,7 +12,7 @@ * * Authors: Fred N. van Kempen, * - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. * * Redistribution and use in source and binary forms, with * or without modification, are permitted provided that the diff --git a/src/network/slirp/CMakeLists.txt b/src/network/slirp/CMakeLists.txt index a2c82e642..29da352e9 100644 --- a/src/network/slirp/CMakeLists.txt +++ b/src/network/slirp/CMakeLists.txt @@ -10,7 +10,7 @@ # # Authors: David Hrdlička, # -# Copyright 2020,2021 David Hrdlička. +# Copyright 2020-2021 David Hrdlička. # add_library(slirp STATIC arp_table.c bootp.c cksum.c dnssearch.c if.c diff --git a/src/nvr.c b/src/nvr.c index dccc6be40..4b073c48f 100644 --- a/src/nvr.c +++ b/src/nvr.c @@ -12,7 +12,7 @@ * David Hrdlička, * * Copyright 2017-2019 Fred N. van Kempen. - * Copyright 2018,2019 David Hrdlička. + * Copyright 2018-2019 David Hrdlička. * * Redistribution and use in source and binary forms, with * or without modification, are permitted provided that the diff --git a/src/nvr_at.c b/src/nvr_at.c index a881444c2..bd0bbe34e 100644 --- a/src/nvr_at.c +++ b/src/nvr_at.c @@ -194,7 +194,7 @@ * Authors: Fred N. van Kempen, * Miran Grca, * Mahod, - * Sarah Walker, + * Sarah Walker, * * Copyright 2017-2020 Fred N. van Kempen. * Copyright 2016-2020 Miran Grca. diff --git a/src/nvr_ps2.c b/src/nvr_ps2.c index b137cb81b..1ab97d8a3 100644 --- a/src/nvr_ps2.c +++ b/src/nvr_ps2.c @@ -11,9 +11,9 @@ * * * Authors: Fred N. van Kempen, - * Sarah Walker, + * Sarah Walker, * - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. * Copyright 2008-2018 Sarah Walker. * * This program is free software; you can redistribute it and/or modify diff --git a/src/pci.c b/src/pci.c index 7b4464407..f9155e2e3 100644 --- a/src/pci.c +++ b/src/pci.c @@ -12,7 +12,7 @@ * * Authors: Miran Grca, * Fred N. van Kempen, - * Sarah Walker, + * Sarah Walker, * * Copyright 2016-2020 Miran Grca. * Copyright 2017-2020 Fred N. van Kempen. diff --git a/src/printer/CMakeLists.txt b/src/printer/CMakeLists.txt index dd07121df..ef7b1d5ec 100644 --- a/src/printer/CMakeLists.txt +++ b/src/printer/CMakeLists.txt @@ -10,7 +10,7 @@ # # Authors: David Hrdlička, # -# Copyright 2020,2021 David Hrdlička. +# Copyright 2020-2021 David Hrdlička. # add_library(print OBJECT png.c prt_cpmap.c prt_escp.c prt_text.c prt_ps.c) diff --git a/src/printer/prt_escp.c b/src/printer/prt_escp.c index e7c9e0442..1cca57da0 100644 --- a/src/printer/prt_escp.c +++ b/src/printer/prt_escp.c @@ -13,8 +13,8 @@ * * Based on code by Frederic Weymann (originally for DosBox.) * - * Copyright 2018,2019 Michael Drüing. - * Copyright 2019,2019 Fred N. van Kempen. + * Copyright 2018-2019 Michael Drüing. + * Copyright 2019 Fred N. van Kempen. * * Redistribution and use in source and binary forms, with * or without modification, are permitted provided that the diff --git a/src/printer/prt_text.c b/src/printer/prt_text.c index b67d859b9..506261ccf 100644 --- a/src/printer/prt_text.c +++ b/src/printer/prt_text.c @@ -17,7 +17,7 @@ * * Authors: Fred N. van Kempen, * - * Copyright 2018,2019 Fred N. van Kempen. + * Copyright 2018-2019 Fred N. van Kempen. * * Redistribution and use in source and binary forms, with * or without modification, are permitted provided that the diff --git a/src/qt/evdev_mouse.cpp b/src/qt/evdev_mouse.cpp index c3d926285..4b487e65d 100644 --- a/src/qt/evdev_mouse.cpp +++ b/src/qt/evdev_mouse.cpp @@ -1,18 +1,18 @@ /* - * 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. * - * Linux/FreeBSD libevdev mouse input module. + * Linux/FreeBSD libevdev mouse input module. * * * - * Authors: Cacodemon345 + * Authors: Cacodemon345 * - * Copyright 2021-2022 Cacodemon345 + * Copyright 2021-2022 Cacodemon345 */ #include "evdev_mouse.hpp" #include diff --git a/src/qt/qt.c b/src/qt/qt.c index f1c6eee3f..c2a5396da 100644 --- a/src/qt/qt.c +++ b/src/qt/qt.c @@ -1,16 +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. + * 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. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * - * Copyright 2021 Joakim L. Gilje + * Copyright 2021 Joakim L. Gilje */ /* * C functionality for Qt platform, where the C equivalent is not easily diff --git a/src/qt/qt_cdrom.c b/src/qt/qt_cdrom.c index d0ab0113e..6e28966b0 100644 --- a/src/qt/qt_cdrom.c +++ b/src/qt/qt_cdrom.c @@ -1,21 +1,21 @@ /* - * 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. * - * Handle the platform-side of CDROM/ZIP/MO drives. + * Handle the platform-side of CDROM/ZIP/MO drives. * * * - * Authors: Sarah Walker, - * Miran Grca, - * Fred N. van Kempen, + * Authors: Sarah Walker, + * Miran Grca, + * Fred N. van Kempen, * - * Copyright 2016-2018 Miran Grca. - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2016-2018 Miran Grca. + * Copyright 2017-2018 Fred N. van Kempen. */ #include diff --git a/src/qt/qt_deviceconfig.cpp b/src/qt/qt_deviceconfig.cpp index 81f8b8493..2fecdc543 100644 --- a/src/qt/qt_deviceconfig.cpp +++ b/src/qt/qt_deviceconfig.cpp @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Device configuration UI code. + * Device configuration UI code. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * Cacodemon345 * - * Copyright 2021 Joakim L. Gilje - * Copyright 2022 Cacodemon345 + * Copyright 2021 Joakim L. Gilje + * Copyright 2022 Cacodemon345 */ #include "qt_deviceconfig.hpp" #include "ui_qt_deviceconfig.h" diff --git a/src/qt/qt_filefield.cpp b/src/qt/qt_filefield.cpp index 969d5ff29..9bdb6cd7f 100644 --- a/src/qt/qt_filefield.cpp +++ b/src/qt/qt_filefield.cpp @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * File field widget. + * File field widget. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * Cacodemon345 * - * Copyright 2021 Joakim L. Gilje - * Copyright 2022 Cacodemon345 + * Copyright 2021 Joakim L. Gilje + * Copyright 2022 Cacodemon345 */ #include "qt_filefield.hpp" #include "ui_qt_filefield.h" diff --git a/src/qt/qt_harddiskdialog.cpp b/src/qt/qt_harddiskdialog.cpp index eb8b3fd1a..943b13dc0 100644 --- a/src/qt/qt_harddiskdialog.cpp +++ b/src/qt/qt_harddiskdialog.cpp @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Hard disk dialog code. + * Hard disk dialog code. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * Cacodemon345 * - * Copyright 2021 Joakim L. Gilje - * Copyright 2022 Cacodemon345 + * Copyright 2021 Joakim L. Gilje + * Copyright 2022 Cacodemon345 */ #include "qt_harddiskdialog.hpp" #include "ui_qt_harddiskdialog.h" diff --git a/src/qt/qt_harddrive_common.cpp b/src/qt/qt_harddrive_common.cpp index 2b415f6f4..55b7fa820 100644 --- a/src/qt/qt_harddrive_common.cpp +++ b/src/qt/qt_harddrive_common.cpp @@ -1,18 +1,18 @@ /* - * 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. * - * Common storage devices module. + * Common storage devices module. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * - * Copyright 2021 Joakim L. Gilje + * Copyright 2021 Joakim L. Gilje */ #include "qt_harddrive_common.hpp" diff --git a/src/qt/qt_hardwarerenderer.cpp b/src/qt/qt_hardwarerenderer.cpp index f158e7d62..647827e85 100644 --- a/src/qt/qt_hardwarerenderer.cpp +++ b/src/qt/qt_hardwarerenderer.cpp @@ -1,22 +1,22 @@ /* - * 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. * - * Hardware renderer module. + * Hardware renderer module. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * Cacodemon345 * Teemu Korhonen * - * Copyright 2021 Joakim L. Gilje - * Copyright 2021-2022 Cacodemon345 - * Copyright 2021-2022 Teemu Korhonen + * Copyright 2021 Joakim L. Gilje + * Copyright 2021-2022 Cacodemon345 + * Copyright 2021-2022 Teemu Korhonen */ #include "qt_hardwarerenderer.hpp" #include diff --git a/src/qt/qt_joystickconfiguration.cpp b/src/qt/qt_joystickconfiguration.cpp index a9c53c07e..e91cb9086 100644 --- a/src/qt/qt_joystickconfiguration.cpp +++ b/src/qt/qt_joystickconfiguration.cpp @@ -1,18 +1,18 @@ /* - * 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. * - * Joystick configuration UI module. + * Joystick configuration UI module. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * - * Copyright 2021 Joakim L. Gilje + * Copyright 2021 Joakim L. Gilje */ #include "qt_joystickconfiguration.hpp" #include "ui_qt_joystickconfiguration.h" diff --git a/src/qt/qt_machinestatus.cpp b/src/qt/qt_machinestatus.cpp index d095eadb7..29b394114 100644 --- a/src/qt/qt_machinestatus.cpp +++ b/src/qt/qt_machinestatus.cpp @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Joystick configuration UI module. + * Joystick configuration UI module. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * Cacodemon345 * - * Copyright 2021 Joakim L. Gilje - * Copyright 2021-2022 Cacodemon345 + * Copyright 2021 Joakim L. Gilje + * Copyright 2021-2022 Cacodemon345 */ #include "qt_machinestatus.hpp" diff --git a/src/qt/qt_main.cpp b/src/qt/qt_main.cpp index 1ae545227..e2d4c6c90 100644 --- a/src/qt/qt_main.cpp +++ b/src/qt/qt_main.cpp @@ -1,21 +1,21 @@ /* - * 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. * - * Main entry point module + * Main entry point module * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * Cacodemon345 * Teemu Korhonen * - * Copyright 2021 Joakim L. Gilje - * Copyright 2021-2022 Cacodemon345 - * Copyright 2021-2022 Teemu Korhonen + * Copyright 2021 Joakim L. Gilje + * Copyright 2021-2022 Cacodemon345 + * Copyright 2021-2022 Teemu Korhonen */ #include #include diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index 24c37d107..f0e8fdc34 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -1,24 +1,24 @@ /* - * 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. * - * Main window module. + * Main window module. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * Cacodemon345 * Teemu Korhonen * dob205 * - * Copyright 2021 Joakim L. Gilje - * Copyright 2021-2022 Cacodemon345 - * Copyright 2021-2022 Teemu Korhonen - * Copyright 2022 dob205 + * Copyright 2021 Joakim L. Gilje + * Copyright 2021-2022 Cacodemon345 + * Copyright 2021-2022 Teemu Korhonen + * Copyright 2022 dob205 */ #include diff --git a/src/qt/qt_mediahistorymanager.cpp b/src/qt/qt_mediahistorymanager.cpp index 5564afd46..b895b46aa 100644 --- a/src/qt/qt_mediahistorymanager.cpp +++ b/src/qt/qt_mediahistorymanager.cpp @@ -1,18 +1,18 @@ /* - * 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. * - * Media history management module + * Media history management module * * * - * Authors: cold-brewed + * Authors: cold-brewed * - * Copyright 2022 The 86Box development team + * Copyright 2022 The 86Box development team */ #include diff --git a/src/qt/qt_mediahistorymanager.hpp b/src/qt/qt_mediahistorymanager.hpp index 507cbdf7f..f1942b81c 100644 --- a/src/qt/qt_mediahistorymanager.hpp +++ b/src/qt/qt_mediahistorymanager.hpp @@ -1,18 +1,18 @@ /* - * 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. * - * Header for the media history management module + * Header for the media history management module * * * - * Authors: cold-brewed + * Authors: cold-brewed * - * Copyright 2022 The 86Box development team + * Copyright 2022 The 86Box development team */ #ifndef QT_MEDIAHISTORYMANAGER_HPP diff --git a/src/qt/qt_mediamenu.cpp b/src/qt/qt_mediamenu.cpp index f6f091bdc..e898ea9d9 100644 --- a/src/qt/qt_mediamenu.cpp +++ b/src/qt/qt_mediamenu.cpp @@ -1,22 +1,22 @@ /* - * 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. * - * Media menu UI module. + * Media menu UI module. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * Cacodemon345 * Teemu Korhonen * - * Copyright 2021 Joakim L. Gilje - * Copyright 2021-2022 Cacodemon345 - * Copyright 2021-2022 Teemu Korhonen + * Copyright 2021 Joakim L. Gilje + * Copyright 2021-2022 Cacodemon345 + * Copyright 2021-2022 Teemu Korhonen */ #include "qt_progsettings.hpp" #include "qt_machinestatus.hpp" diff --git a/src/qt/qt_models_common.cpp b/src/qt/qt_models_common.cpp index 0e9856a50..ed6aeaa7d 100644 --- a/src/qt/qt_models_common.cpp +++ b/src/qt/qt_models_common.cpp @@ -1,18 +1,18 @@ /* - * 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. * - * Common storage devices module. + * Common storage devices module. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * - * Copyright 2021 Joakim L. Gilje + * Copyright 2021 Joakim L. Gilje */ #include "qt_models_common.hpp" diff --git a/src/qt/qt_newfloppydialog.cpp b/src/qt/qt_newfloppydialog.cpp index cbb021963..479b6711f 100644 --- a/src/qt/qt_newfloppydialog.cpp +++ b/src/qt/qt_newfloppydialog.cpp @@ -1,22 +1,22 @@ /* - * 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. * - * Common storage devices module. + * Common storage devices module. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * Cacodemon345 * Teemu Korhonen * - * Copyright 2021 Joakim L. Gilje - * Copyright 2022 Cacodemon345 - * Copyright 2022 Teemu Korhonen + * Copyright 2021 Joakim L. Gilje + * Copyright 2022 Cacodemon345 + * Copyright 2022 Teemu Korhonen */ #include "qt_newfloppydialog.hpp" #include "ui_qt_newfloppydialog.h" diff --git a/src/qt/qt_opengloptions.cpp b/src/qt/qt_opengloptions.cpp index f90ba37c0..58030b467 100644 --- a/src/qt/qt_opengloptions.cpp +++ b/src/qt/qt_opengloptions.cpp @@ -1,17 +1,18 @@ /* - * 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. * - * OpenGL renderer options for Qt + * OpenGL renderer options for Qt * - * Authors: - * Teemu Korhonen * - * Copyright 2022 Teemu Korhonen + * + * Authors: Teemu Korhonen + * + * Copyright 2022 Teemu Korhonen */ #include diff --git a/src/qt/qt_opengloptions.hpp b/src/qt/qt_opengloptions.hpp index b88cf4b07..64f761670 100644 --- a/src/qt/qt_opengloptions.hpp +++ b/src/qt/qt_opengloptions.hpp @@ -1,17 +1,18 @@ /* - * 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. * - * Header for OpenGL renderer options + * Header for OpenGL renderer options * - * Authors: - * Teemu Korhonen * - * Copyright 2022 Teemu Korhonen + * + * Authors: Teemu Korhonen + * + * Copyright 2022 Teemu Korhonen */ #ifndef QT_OPENGLOPTIONS_HPP diff --git a/src/qt/qt_opengloptionsdialog.cpp b/src/qt/qt_opengloptionsdialog.cpp index c87989161..acb2ce9f2 100644 --- a/src/qt/qt_opengloptionsdialog.cpp +++ b/src/qt/qt_opengloptionsdialog.cpp @@ -1,17 +1,18 @@ /* - * 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. * - * OpenGL renderer options dialog for Qt + * OpenGL renderer options dialog for Qt * - * Authors: - * Teemu Korhonen * - * Copyright 2022 Teemu Korhonen + * + * Authors: Teemu Korhonen + * + * Copyright 2022 Teemu Korhonen */ #include diff --git a/src/qt/qt_opengloptionsdialog.hpp b/src/qt/qt_opengloptionsdialog.hpp index 6b1c673bd..f34d74d75 100644 --- a/src/qt/qt_opengloptionsdialog.hpp +++ b/src/qt/qt_opengloptionsdialog.hpp @@ -1,17 +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. + * 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. * - * Header for OpenGL renderer options dialog + * Header for OpenGL renderer options dialog * - * Authors: - * Teemu Korhonen + * Authors: Teemu Korhonen * - * Copyright 2022 Teemu Korhonen + * Copyright 2022 Teemu Korhonen */ #ifndef QT_OPENGLOPTIONSDIALOG_H diff --git a/src/qt/qt_openglrenderer.cpp b/src/qt/qt_openglrenderer.cpp index a2f1ecad0..60aa998a9 100644 --- a/src/qt/qt_openglrenderer.cpp +++ b/src/qt/qt_openglrenderer.cpp @@ -1,17 +1,18 @@ /* - * 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. * - * OpenGL renderer for Qt + * OpenGL renderer for Qt * - * Authors: - * Teemu Korhonen * - * Copyright 2022 Teemu Korhonen + * + * Authors: Teemu Korhonen + * + * Copyright 2022 Teemu Korhonen */ #include diff --git a/src/qt/qt_openglrenderer.hpp b/src/qt/qt_openglrenderer.hpp index c303ca614..27822600c 100644 --- a/src/qt/qt_openglrenderer.hpp +++ b/src/qt/qt_openglrenderer.hpp @@ -1,17 +1,18 @@ /* - * 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. * - * Header file for OpenGL renderer + * Header file for OpenGL renderer * - * Authors: - * Teemu Korhonen * - * Copyright 2022 Teemu Korhonen + * + * Authors: Teemu Korhonen + * + * Copyright 2022 Teemu Korhonen */ #ifndef QT_OPENGLRENDERER_HPP diff --git a/src/qt/qt_platform.cpp b/src/qt/qt_platform.cpp index 0fe611cbe..f1d56d061 100644 --- a/src/qt/qt_platform.cpp +++ b/src/qt/qt_platform.cpp @@ -1,21 +1,22 @@ /* - * 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. * - * Common platform functions. + * Common platform functions. * * - * Authors: Joakim L. Gilje + * + * Authors: Joakim L. Gilje * Cacodemon345 * Teemu Korhonen * - * Copyright 2021 Joakim L. Gilje - * Copyright 2021-2022 Cacodemon345 - * Copyright 2021-2022 Teemu Korhonen + * Copyright 2021 Joakim L. Gilje + * Copyright 2021-2022 Cacodemon345 + * Copyright 2021-2022 Teemu Korhonen */ #include diff --git a/src/qt/qt_progsettings.cpp b/src/qt/qt_progsettings.cpp index 3ee998002..4dda901d7 100644 --- a/src/qt/qt_progsettings.cpp +++ b/src/qt/qt_progsettings.cpp @@ -1,18 +1,18 @@ /* - * 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. * - * Program settings UI module. + * Program settings UI module. * * * * Authors: Cacodemon345 * - * Copyright 2021-2022 Cacodemon345 + * Copyright 2021-2022 Cacodemon345 */ #include diff --git a/src/qt/qt_renderercommon.cpp b/src/qt/qt_renderercommon.cpp index 98fb27ca0..47bc33d51 100644 --- a/src/qt/qt_renderercommon.cpp +++ b/src/qt/qt_renderercommon.cpp @@ -1,18 +1,18 @@ /* - * 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. * - * Program settings UI module. + * Program settings UI module. * * * * Authors: Joakim L. Gilje * - * Copyright 2021 Joakim L. Gilje + * Copyright 2021 Joakim L. Gilje */ #include "qt_renderercommon.hpp" diff --git a/src/qt/qt_rendererstack.cpp b/src/qt/qt_rendererstack.cpp index d36a88f86..885c97990 100644 --- a/src/qt/qt_rendererstack.cpp +++ b/src/qt/qt_rendererstack.cpp @@ -1,12 +1,12 @@ /* - * 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. * - * Program settings UI module. + * Program settings UI module. * * * @@ -14,9 +14,9 @@ * Cacodemon345 * Teemu Korhonen * - * Copyright 2021 Joakim L. Gilje - * Copyright 2021-2021 Teemu Korhonen - * Copyright 2021-2022 Cacodemon345 + * Copyright 2021 Joakim L. Gilje + * Copyright 2021-2021 Teemu Korhonen + * Copyright 2021-2022 Cacodemon345 */ #include "qt_rendererstack.hpp" #include "ui_qt_rendererstack.h" diff --git a/src/qt/qt_sdl.c b/src/qt/qt_sdl.c index 54eca952b..857ccf381 100644 --- a/src/qt/qt_sdl.c +++ b/src/qt/qt_sdl.c @@ -1,42 +1,42 @@ /* - * 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. * - * Rendering module for libSDL2 + * Rendering module for libSDL2 * - * NOTE: Given all the problems reported with FULLSCREEN use of SDL, - * we will not use that, but, instead, use a new window which - * coverrs the entire desktop. + * NOTE: Given all the problems reported with FULLSCREEN use of SDL, + * we will not use that, but, instead, use a new window which + * covers the entire desktop. * * * - * Authors: Fred N. van Kempen, - * Michael Drüing, + * Authors: Fred N. van Kempen, + * Michael Drüing, * - * Copyright 2018-2020 Fred N. van Kempen. - * Copyright 2018-2020 Michael Drüing. + * Copyright 2018-2020 Fred N. van Kempen. + * Copyright 2018-2020 Michael Drüing. * - * Redistribution and use in source and binary forms, with - * or without modification, are permitted provided that the - * following conditions are met: + * Redistribution and use in source and binary forms, with + * or without modification, are permitted provided that the + * following conditions are met: * - * 1. Redistributions of source code must retain the entire - * above notice, this list of conditions and the following - * disclaimer. + * 1. Redistributions of source code must retain the entire + * above notice, this list of conditions and the following + * disclaimer. * - * 2. Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the - * following disclaimer in the documentation and/or other - * materials provided with the distribution. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other + * materials provided with the distribution. * - * 3. Neither the name of the copyright holder nor the names - * of its contributors may be used to endorse or promote - * products derived from this software without specific - * prior written permission. + * 3. Neither the name of the copyright holder nor the names + * of its contributors may be used to endorse or promote + * products derived from this software without specific + * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT diff --git a/src/qt/qt_sdl.h b/src/qt/qt_sdl.h index 684e6ccd0..29804c278 100644 --- a/src/qt/qt_sdl.h +++ b/src/qt/qt_sdl.h @@ -1,38 +1,38 @@ /* - * 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. * - * Definitions for the libSDL2 rendering module. + * Definitions for the libSDL2 rendering module. * * * - * Authors: Fred N. van Kempen, - * Michael Drüing, + * Authors: Fred N. van Kempen, + * Michael Drüing, * - * Copyright 2018,2019 Fred N. van Kempen. - * Copyright 2018,2019 Michael Drüing. + * Copyright 2018-2019 Fred N. van Kempen. + * Copyright 2018-2019 Michael Drüing. * - * Redistribution and use in source and binary forms, with - * or without modification, are permitted provided that the - * following conditions are met: + * Redistribution and use in source and binary forms, with + * or without modification, are permitted provided that the + * following conditions are met: * - * 1. Redistributions of source code must retain the entire - * above notice, this list of conditions and the following - * disclaimer. + * 1. Redistributions of source code must retain the entire + * above notice, this list of conditions and the following + * disclaimer. * - * 2. Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the - * following disclaimer in the documentation and/or other - * materials provided with the distribution. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other + * materials provided with the distribution. * - * 3. Neither the name of the copyright holder nor the names - * of its contributors may be used to endorse or promote - * products derived from this software without specific - * prior written permission. + * 3. Neither the name of the copyright holder nor the names + * of its contributors may be used to endorse or promote + * products derived from this software without specific + * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT diff --git a/src/qt/qt_settings.cpp b/src/qt/qt_settings.cpp index b42b20786..f9a6b8e14 100644 --- a/src/qt/qt_settings.cpp +++ b/src/qt/qt_settings.cpp @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Program settings UI module. + * Program settings UI module. * * * * Authors: Joakim L. Gilje * Cacodemon345 * - * Copyright 2021 Joakim L. Gilje - * Copyright 2021-2022 Cacodemon345 + * Copyright 2021 Joakim L. Gilje + * Copyright 2021-2022 Cacodemon345 */ #include "qt_settings.hpp" #include "ui_qt_settings.h" diff --git a/src/qt/qt_settings_bus_tracking.cpp b/src/qt/qt_settings_bus_tracking.cpp index c22b8b10b..c6069e99e 100644 --- a/src/qt/qt_settings_bus_tracking.cpp +++ b/src/qt/qt_settings_bus_tracking.cpp @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Program settings UI module. + * Program settings UI module. * * * * Authors: Miran Grca * Cacodemon345 * - * Copyright 2022 Miran Grca - * Copyright 2022 Cacodemon345 + * Copyright 2022 Miran Grca + * Copyright 2022 Cacodemon345 */ #include #include diff --git a/src/qt/qt_settingsdisplay.cpp b/src/qt/qt_settingsdisplay.cpp index f01d7fc4d..d459b0e53 100644 --- a/src/qt/qt_settingsdisplay.cpp +++ b/src/qt/qt_settingsdisplay.cpp @@ -1,18 +1,18 @@ /* - * 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. * - * Display settings UI module. + * Display settings UI module. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * - * Copyright 2021 Joakim L. Gilje + * Copyright 2021 Joakim L. Gilje */ #include "qt_settingsdisplay.hpp" #include "ui_qt_settingsdisplay.h" diff --git a/src/qt/qt_settingsfloppycdrom.cpp b/src/qt/qt_settingsfloppycdrom.cpp index 751bb829a..609c76fc0 100644 --- a/src/qt/qt_settingsfloppycdrom.cpp +++ b/src/qt/qt_settingsfloppycdrom.cpp @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Floppy/CD-ROM devices configuration UI module. + * Floppy/CD-ROM devices configuration UI module. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * Cacodemon345 * - * Copyright 2021-2022 Cacodemon345 - * Copyright 2021 Joakim L. Gilje + * Copyright 2021-2022 Cacodemon345 + * Copyright 2021 Joakim L. Gilje */ #include "qt_settingsfloppycdrom.hpp" #include "ui_qt_settingsfloppycdrom.h" diff --git a/src/qt/qt_settingsharddisks.cpp b/src/qt/qt_settingsharddisks.cpp index 1883797e5..1b6964898 100644 --- a/src/qt/qt_settingsharddisks.cpp +++ b/src/qt/qt_settingsharddisks.cpp @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Hard disk configuration UI module. + * Hard disk configuration UI module. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * Cacodemon345 * - * Copyright 2021-2022 Cacodemon345 - * Copyright 2021 Joakim L. Gilje + * Copyright 2021-2022 Cacodemon345 + * Copyright 2021 Joakim L. Gilje */ #include "qt_settingsharddisks.hpp" #include "ui_qt_settingsharddisks.h" diff --git a/src/qt/qt_settingsinput.cpp b/src/qt/qt_settingsinput.cpp index 49d84037f..630fc705d 100644 --- a/src/qt/qt_settingsinput.cpp +++ b/src/qt/qt_settingsinput.cpp @@ -1,18 +1,18 @@ /* - * 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. * - * Mouse/Joystick configuration UI module. + * Mouse/Joystick configuration UI module. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * - * Copyright 2021 Joakim L. Gilje + * Copyright 2021 Joakim L. Gilje */ #include "qt_settingsinput.hpp" #include "ui_qt_settingsinput.h" diff --git a/src/qt/qt_settingsmachine.cpp b/src/qt/qt_settingsmachine.cpp index 0d2ffa129..b88397e30 100644 --- a/src/qt/qt_settingsmachine.cpp +++ b/src/qt/qt_settingsmachine.cpp @@ -1,18 +1,18 @@ /* - * 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. * - * Machine selection and configuration UI module. + * Machine selection and configuration UI module. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * - * Copyright 2021 Joakim L. Gilje + * Copyright 2021 Joakim L. Gilje */ #include "qt_settingsmachine.hpp" #include "ui_qt_settingsmachine.h" diff --git a/src/qt/qt_settingsnetwork.cpp b/src/qt/qt_settingsnetwork.cpp index cbddfab72..014e82ab3 100644 --- a/src/qt/qt_settingsnetwork.cpp +++ b/src/qt/qt_settingsnetwork.cpp @@ -1,18 +1,18 @@ /* - * 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. * - * Network devices configuration UI module. + * Network devices configuration UI module. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * - * Copyright 2021 Joakim L. Gilje + * Copyright 2021 Joakim L. Gilje */ #include "qt_settingsnetwork.hpp" #include "ui_qt_settingsnetwork.h" diff --git a/src/qt/qt_settingsotherperipherals.cpp b/src/qt/qt_settingsotherperipherals.cpp index edffd360a..e0edd7358 100644 --- a/src/qt/qt_settingsotherperipherals.cpp +++ b/src/qt/qt_settingsotherperipherals.cpp @@ -1,18 +1,18 @@ /* - * 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. * - * Other peripherals configuration UI module. + * Other peripherals configuration UI module. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * - * Copyright 2021 Joakim L. Gilje + * Copyright 2021 Joakim L. Gilje */ #include "qt_settingsotherperipherals.hpp" #include "ui_qt_settingsotherperipherals.h" diff --git a/src/qt/qt_settingsotherremovable.cpp b/src/qt/qt_settingsotherremovable.cpp index f625388ea..bb77046d2 100644 --- a/src/qt/qt_settingsotherremovable.cpp +++ b/src/qt/qt_settingsotherremovable.cpp @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Other removable devices configuration UI module. + * Other removable devices configuration UI module. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * Cacodemon345 * - * Copyright 2021-2022 Cacodemon345 - * Copyright 2021 Joakim L. Gilje + * Copyright 2021-2022 Cacodemon345 + * Copyright 2021 Joakim L. Gilje */ #include "qt_settingsotherremovable.hpp" #include "ui_qt_settingsotherremovable.h" diff --git a/src/qt/qt_settingsports.cpp b/src/qt/qt_settingsports.cpp index dfa2c8853..a4be440e5 100644 --- a/src/qt/qt_settingsports.cpp +++ b/src/qt/qt_settingsports.cpp @@ -1,21 +1,21 @@ /* - * 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. * - * Serial/Parallel ports configuration UI module. + * Serial/Parallel ports configuration UI module. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * Cacodemon345 * - * Copyright 2022 Cacodemon345 - * Copyright 2022 Jasmine Iwanek - * Copyright 2021 Joakim L. Gilje + * Copyright 2022 Cacodemon345 + * Copyright 2022 Jasmine Iwanek + * Copyright 2021 Joakim L. Gilje */ #include "qt_settingsports.hpp" #include "ui_qt_settingsports.h" diff --git a/src/qt/qt_settingssound.cpp b/src/qt/qt_settingssound.cpp index 57686f7df..e17ec5ed1 100644 --- a/src/qt/qt_settingssound.cpp +++ b/src/qt/qt_settingssound.cpp @@ -1,18 +1,18 @@ /* - * 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. * - * Sound/MIDI devices configuration UI module. + * Sound/MIDI devices configuration UI module. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * - * Copyright 2021 Joakim L. Gilje + * Copyright 2021 Joakim L. Gilje */ #include "qt_settingssound.hpp" #include "ui_qt_settingssound.h" diff --git a/src/qt/qt_settingsstoragecontrollers.cpp b/src/qt/qt_settingsstoragecontrollers.cpp index 14b0fb1dc..a732e9820 100644 --- a/src/qt/qt_settingsstoragecontrollers.cpp +++ b/src/qt/qt_settingsstoragecontrollers.cpp @@ -1,18 +1,18 @@ /* - * 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. * - * Storage devices configuration UI module. + * Storage devices configuration UI module. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * - * Copyright 2021 Joakim L. Gilje + * Copyright 2021 Joakim L. Gilje */ #include "qt_settingsstoragecontrollers.hpp" #include "ui_qt_settingsstoragecontrollers.h" diff --git a/src/qt/qt_softwarerenderer.cpp b/src/qt/qt_softwarerenderer.cpp index cd27e1c0e..a8c0229d3 100644 --- a/src/qt/qt_softwarerenderer.cpp +++ b/src/qt/qt_softwarerenderer.cpp @@ -1,22 +1,22 @@ /* - * 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. * - * Software renderer module. + * Software renderer module. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * Cacodemon345 * Teemu Korhonen * - * Copyright 2021 Joakim L. Gilje - * Copyright 2021-2022 Cacodemon345 - * Copyright 2021-2022 Teemu Korhonen + * Copyright 2021 Joakim L. Gilje + * Copyright 2021-2022 Cacodemon345 + * Copyright 2021-2022 Teemu Korhonen */ #include "qt_softwarerenderer.hpp" #include diff --git a/src/qt/qt_soundgain.cpp b/src/qt/qt_soundgain.cpp index 9283ae42e..725a5b115 100644 --- a/src/qt/qt_soundgain.cpp +++ b/src/qt/qt_soundgain.cpp @@ -1,18 +1,18 @@ /* - * 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. * - * Sound gain dialog UI module. + * Sound gain dialog UI module. * * * - * Authors: Cacodemon345 + * Authors: Cacodemon345 * - * Copyright 2021-2022 Cacodemon345 + * Copyright 2021-2022 Cacodemon345 */ #include "qt_soundgain.hpp" #include "ui_qt_soundgain.h" diff --git a/src/qt/qt_specifydimensions.cpp b/src/qt/qt_specifydimensions.cpp index e2aa24a9b..c01ef2ae4 100644 --- a/src/qt/qt_specifydimensions.cpp +++ b/src/qt/qt_specifydimensions.cpp @@ -1,18 +1,18 @@ /* - * 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. * - * Specify dimensions UI module. + * Specify dimensions UI module. * * * - * Authors: Cacodemon345 + * Authors: Cacodemon345 * - * Copyright 2021-2022 Cacodemon345 + * Copyright 2021-2022 Cacodemon345 */ #include "qt_specifydimensions.h" #include "ui_qt_specifydimensions.h" diff --git a/src/qt/qt_styleoverride.cpp b/src/qt/qt_styleoverride.cpp index 6efe523d9..7ec5a341c 100644 --- a/src/qt/qt_styleoverride.cpp +++ b/src/qt/qt_styleoverride.cpp @@ -1,18 +1,18 @@ /* - * 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. * - * Style override class. + * Style override class. * * * - * Authors: Teemu Korhonen + * Authors: Teemu Korhonen * - * Copyright 2022 Teemu Korhonen + * Copyright 2022 Teemu Korhonen */ #include "qt_styleoverride.hpp" diff --git a/src/qt/qt_ui.cpp b/src/qt/qt_ui.cpp index a2864f3ea..05a2e8f6c 100644 --- a/src/qt/qt_ui.cpp +++ b/src/qt/qt_ui.cpp @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Common UI functions. + * Common UI functions. * * * - * Authors: Joakim L. Gilje + * Authors: Joakim L. Gilje * Cacodemon345 * - * Copyright 2021 Joakim L. Gilje - * Copyright 2021-2022 Cacodemon345 + * Copyright 2021 Joakim L. Gilje + * Copyright 2021-2022 Cacodemon345 */ #include diff --git a/src/qt/qt_unixmanagerfilter.cpp b/src/qt/qt_unixmanagerfilter.cpp index d1091198d..5d94584e6 100644 --- a/src/qt/qt_unixmanagerfilter.cpp +++ b/src/qt/qt_unixmanagerfilter.cpp @@ -1,19 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Source file for Unix VM-managers (client-side) + * Source file for Unix VM-managers (client-side) * - * Authors: - * Teemu Korhonen - Cacodemon345 * - * Copyright 2022 Teemu Korhonen - * Copyright 2022 Cacodemon345 + * + * Authors: Teemu Korhonen + * Cacodemon345 + * + * Copyright 2022 Teemu Korhonen + * Copyright 2022 Cacodemon345 */ #include "qt_unixmanagerfilter.hpp" diff --git a/src/qt/qt_unixmanagerfilter.hpp b/src/qt/qt_unixmanagerfilter.hpp index eca373b47..0587e06ee 100644 --- a/src/qt/qt_unixmanagerfilter.hpp +++ b/src/qt/qt_unixmanagerfilter.hpp @@ -1,19 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * * Header file for Unix VM-managers (client-side) * - * Authors: - * Teemu Korhonen - Cacodemon345 * - * Copyright 2022 Teemu Korhonen - * Copyright 2022 Cacodemon345 + * + * Authors: Teemu Korhonen + * Cacodemon345 + * + * Copyright 2022 Teemu Korhonen + * Copyright 2022 Cacodemon345 */ #ifndef QT_UNIXMANAGERFILTER_HPP diff --git a/src/qt/qt_util.cpp b/src/qt/qt_util.cpp index 876a4b047..b05b656bb 100644 --- a/src/qt/qt_util.cpp +++ b/src/qt/qt_util.cpp @@ -1,18 +1,18 @@ /* - * 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. * - * Utility functions. + * Utility functions. * * * - * Authors: Teemu Korhonen + * Authors: Teemu Korhonen * - * Copyright 2022 Teemu Korhonen + * Copyright 2022 Teemu Korhonen */ #include #include diff --git a/src/qt/qt_winmanagerfilter.cpp b/src/qt/qt_winmanagerfilter.cpp index d9a6208b1..0218ae5ba 100644 --- a/src/qt/qt_winmanagerfilter.cpp +++ b/src/qt/qt_winmanagerfilter.cpp @@ -1,17 +1,18 @@ /* - * 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. * - * Windows VM-managers native messages filter + * Windows VM-managers native messages filter * - * Authors: - * Teemu Korhonen * - * Copyright 2022 Teemu Korhonen + * + * Authors: Teemu Korhonen + * + * Copyright 2022 Teemu Korhonen */ #include "qt_winmanagerfilter.hpp" diff --git a/src/qt/qt_winmanagerfilter.hpp b/src/qt/qt_winmanagerfilter.hpp index cd141e93f..e8fb06d90 100644 --- a/src/qt/qt_winmanagerfilter.hpp +++ b/src/qt/qt_winmanagerfilter.hpp @@ -1,17 +1,18 @@ /* - * 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. * - * Header file for Windows VM-managers native messages filter + * Header file for Windows VM-managers native messages filter * - * Authors: - * Teemu Korhonen * - * Copyright 2022 Teemu Korhonen + * + * Authors: Teemu Korhonen + * + * Copyright 2022 Teemu Korhonen */ #ifndef QT_WINDOWSMANAGERFILTER_HPP diff --git a/src/qt/qt_winrawinputfilter.cpp b/src/qt/qt_winrawinputfilter.cpp index 56d8c9ec9..88b723d4c 100644 --- a/src/qt/qt_winrawinputfilter.cpp +++ b/src/qt/qt_winrawinputfilter.cpp @@ -1,19 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Windows raw input native filter for QT + * Windows raw input native filter for QT * - * Authors: - * Teemu Korhonen - * Miran Grca, * - * Copyright 2021 Teemu Korhonen - * Copyright 2016-2018 Miran Grca. + * + * Authors: Teemu Korhonen + * Miran Grca, + * + * Copyright 2021 Teemu Korhonen + * Copyright 2016-2018 Miran Grca. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/qt/qt_winrawinputfilter.hpp b/src/qt/qt_winrawinputfilter.hpp index 252f7206c..6d23b83b7 100644 --- a/src/qt/qt_winrawinputfilter.hpp +++ b/src/qt/qt_winrawinputfilter.hpp @@ -1,17 +1,18 @@ /* - * 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. * - * Header file for windows raw input native filter for QT + * Header file for windows raw input native filter for QT * - * Authors: - * Teemu Korhonen * - * Copyright 2021 Teemu Korhonen + * + * Authors: Teemu Korhonen + * + * Copyright 2021 Teemu Korhonen * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/qt/win_dynld.c b/src/qt/win_dynld.c index 66fd0503d..88fb632bc 100644 --- a/src/qt/win_dynld.c +++ b/src/qt/win_dynld.c @@ -1,18 +1,18 @@ /* - * 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. * - * Try to load a support DLL. + * Try to load a support DLL. * * * - * Author: Fred N. van Kempen, + * Authors: Fred N. van Kempen, * - * Copyright 2017,2018 Fred N. van Kempen + * Copyright 2017-2018 Fred N. van Kempen */ #include #include diff --git a/src/qt/win_joystick_rawinput.c b/src/qt/win_joystick_rawinput.c index f41131b28..2976a54b9 100644 --- a/src/qt/win_joystick_rawinput.c +++ b/src/qt/win_joystick_rawinput.c @@ -1,20 +1,22 @@ /* - * 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. * - * RawInput joystick interface. + * RawInput joystick interface. * - * Authors: Sarah Walker, - * Miran Grca, - * GH Cao, * - * Copyright 2008-2018 Sarah Walker. - * Copyright 2016-2018 Miran Grca. - * Copyright 2020 GH Cao. + * + * Authors: Sarah Walker, + * Miran Grca, + * GH Cao, + * + * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. + * Copyright 2020 GH Cao. */ #include #include diff --git a/src/qt/wl_mouse.cpp b/src/qt/wl_mouse.cpp index 4cc1b3169..9b23792c8 100644 --- a/src/qt/wl_mouse.cpp +++ b/src/qt/wl_mouse.cpp @@ -1,18 +1,18 @@ /* - * 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. * - * Wayland mouse input module. + * Wayland mouse input module. * * * - * Authors: Cacodemon345 + * Authors: Cacodemon345 * - * Copyright 2021-2022 Cacodemon345 + * Copyright 2021-2022 Cacodemon345 */ #include "wl_mouse.hpp" #include diff --git a/src/qt/xinput2_mouse.cpp b/src/qt/xinput2_mouse.cpp index 5017c78d2..7e49c2694 100644 --- a/src/qt/xinput2_mouse.cpp +++ b/src/qt/xinput2_mouse.cpp @@ -1,18 +1,18 @@ /* - * 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. * - * X11 Xinput2 mouse input module. + * X11 Xinput2 mouse input module. * * * - * Authors: Cacodemon345 + * Authors: Cacodemon345 * - * Copyright 2022 Cacodemon345 + * Copyright 2022 Cacodemon345 */ /* Valuator parsing and duplicate event checking code from SDL2. */ diff --git a/src/scsi/CMakeLists.txt b/src/scsi/CMakeLists.txt index 467affd5a..addde844e 100644 --- a/src/scsi/CMakeLists.txt +++ b/src/scsi/CMakeLists.txt @@ -10,7 +10,7 @@ # # Authors: David Hrdlička, # -# Copyright 2020,2021 David Hrdlička. +# Copyright 2020-2021 David Hrdlička. # add_library(scsi OBJECT scsi.c scsi_device.c scsi_cdrom.c scsi_disk.c diff --git a/src/scsi/scsi_aha154x.c b/src/scsi/scsi_aha154x.c index 669d050bf..aec89d588 100644 --- a/src/scsi/scsi_aha154x.c +++ b/src/scsi/scsi_aha154x.c @@ -641,8 +641,8 @@ aha_pnp_config_changed(uint8_t ld, isapnp_device_config_t *config, void *priv) * their way of handling issues like these at the time.. * * Patch 1: emulate the I/O ADDR SW setting by patching a - * byte in the BIOS that indicates the I/O ADDR - * switch setting on the board. + * byte in the BIOS that indicates the I/O ADDR + * switch setting on the board. */ if (dev->rom_ioaddr != 0x0000) { /* Look up the I/O address in the table. */ @@ -789,8 +789,8 @@ aha_setbios(x54x_t *dev) * their way of handling issues like these at the time.. * * Patch 1: emulate the I/O ADDR SW setting by patching a - * byte in the BIOS that indicates the I/O ADDR - * switch setting on the board. + * byte in the BIOS that indicates the I/O ADDR + * switch setting on the board. */ if (dev->rom_ioaddr != 0x0000) { /* Look up the I/O address in the table. */ @@ -880,11 +880,11 @@ aha_initnvr(x54x_t *dev) dev->nvr[0] |= EE0_ALTFLOP; dev->nvr[1] = dev->Irq - 9; /* IRQ15 */ dev->nvr[1] |= (dev->DmaChannel << 4); /* DMA6 */ - dev->nvr[2] = (EE2_HABIOS | /* BIOS enabled */ - EE2_DYNSCAN | /* scan bus */ - EE2_EXT1G | EE2_RMVOK); /* Imm return on seek */ - dev->nvr[3] = SPEED_50; /* speed 5.0 MB/s */ - dev->nvr[6] = (EE6_TERM | /* host term enable */ + dev->nvr[2] = (EE2_HABIOS | /* BIOS enabled */ + EE2_DYNSCAN | /* scan bus */ + EE2_EXT1G | EE2_RMVOK); /* Imm return on seek */ + dev->nvr[3] = SPEED_50; /* speed 5.0 MB/s */ + dev->nvr[6] = (EE6_TERM | /* host term enable */ EE6_RSTBUS); /* reset SCSI bus on boot*/ } diff --git a/src/scsi/scsi_buslogic.c b/src/scsi/scsi_buslogic.c index c0b0575df..1e0f74d0f 100644 --- a/src/scsi/scsi_buslogic.c +++ b/src/scsi/scsi_buslogic.c @@ -1152,7 +1152,7 @@ BuslogicPCIRead(int func, int addr, void *p) case 0x13: return buslogic_pci_bar[0].addr_regs[3]; case 0x14: - // return (buslogic_pci_bar[1].addr_regs[0] & 0xe0); /*Memory space*/ + // return (buslogic_pci_bar[1].addr_regs[0] & 0xe0); /*Memory space*/ return 0x00; case 0x15: return buslogic_pci_bar[1].addr_regs[1] & 0xc0; diff --git a/src/scsi/scsi_cdrom.c b/src/scsi/scsi_cdrom.c index d2cf4c4e5..b635bcb10 100644 --- a/src/scsi/scsi_cdrom.c +++ b/src/scsi/scsi_cdrom.c @@ -1297,10 +1297,10 @@ scsi_cdrom_read_data(scsi_cdrom_t *dev, int msf, int type, int flags, int32_t *l data than that. */ #if 0 if ((dev->sector_pos + dev->sector_len - 1) >= cdsize) { - scsi_cdrom_log("CD-ROM %i: Trying to read to beyond the end of disc (%i >= %i)\n", dev->id, - (dev->sector_pos + dev->sector_len - 1), cdsize); - scsi_cdrom_lba_out_of_range(dev); - return -1; + scsi_cdrom_log("CD-ROM %i: Trying to read to beyond the end of disc (%i >= %i)\n", dev->id, + (dev->sector_pos + dev->sector_len - 1), cdsize); + scsi_cdrom_lba_out_of_range(dev); + return -1; } #endif diff --git a/src/scsi/scsi_spock.c b/src/scsi/scsi_spock.c index af37d63a4..1223c21aa 100644 --- a/src/scsi/scsi_spock.c +++ b/src/scsi/scsi_spock.c @@ -1162,12 +1162,12 @@ static const device_config_t spock_rom_config[] = { // clang-format off { .name = "bios_ver", - .description = "BIOS Version", - .type = CONFIG_SELECTION, - .default_string = "", - .default_int = 1, - .file_filter = "", - .spinner = { 0 }, + .description = "BIOS Version", + .type = CONFIG_SELECTION, + .default_string = "", + .default_int = 1, + .file_filter = "", + .spinner = { 0 }, .selection = { { .description = "1991 BIOS (>1GB)", .value = 1 }, { .description = "1990 BIOS", .value = 0 }, diff --git a/src/scsi/scsi_x54x.c b/src/scsi/scsi_x54x.c index 45854a0ba..ae049d921 100644 --- a/src/scsi/scsi_x54x.c +++ b/src/scsi/scsi_x54x.c @@ -1312,14 +1312,14 @@ x54x_in(uint16_t port, void *priv) case 3: /* Bits according to ASPI4DOS.SYS v3.36: - 0 Not checked - 1 Must be 0 - 2 Must be 0-0-0-1 - 3 Must be 0 - 4 Must be 0-1-0-0 - 5 Must be 0 - 6 Not checked - 7 Not checked + 0 Not checked + 1 Must be 0 + 2 Must be 0-0-0-1 + 3 Must be 0 + 4 Must be 0-1-0-0 + 5 Must be 0 + 6 Not checked + 7 Not checked */ if (dev->flags & X54X_INT_GEOM_WRITABLE) ret = dev->Geometry; diff --git a/src/sio/CMakeLists.txt b/src/sio/CMakeLists.txt index bf38efe57..15411d3e6 100644 --- a/src/sio/CMakeLists.txt +++ b/src/sio/CMakeLists.txt @@ -10,7 +10,7 @@ # # Authors: David Hrdlička, # -# Copyright 2020,2021 David Hrdlička. +# Copyright 2020-2021 David Hrdlička. # add_library(sio OBJECT sio_acc3221.c sio_ali5123.c sio_f82c710.c sio_82091aa.c diff --git a/src/sio/sio_82091aa.c b/src/sio/sio_82091aa.c index 1a7910cab..52a8809e9 100644 --- a/src/sio/sio_82091aa.c +++ b/src/sio/sio_82091aa.c @@ -1,17 +1,18 @@ /* - * 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. * - * Emulation of the Intel 82091AA Super I/O chip. + * Emulation of the Intel 82091AA Super I/O chip. * * * - * Author: Miran Grca, - * Copyright 2020 Miran Grca. + * Authors: Miran Grca, + * + * Copyright 2020 Miran Grca. */ #include #include diff --git a/src/sio/sio_acc3221.c b/src/sio/sio_acc3221.c index dd0c247f0..f5c671c3a 100644 --- a/src/sio/sio_acc3221.c +++ b/src/sio/sio_acc3221.c @@ -1,18 +1,18 @@ /* - * 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. * - * Implementation of the ACC 3221-SP Super I/O Chip. + * Implementation of the ACC 3221-SP Super I/O Chip. * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * - * Copyright 2019 Sarah Walker. + * Copyright 2019 Sarah Walker. */ #include #include @@ -40,31 +40,31 @@ typedef struct acc3221_t { } acc3221_t; /* Configuration Register Index, BE (R/W): - Bit Function - 7 PIRQ 5 polarity. + Bit Function + 7 PIRQ 5 polarity. 1 = active high, default 0 = active low - 6 PIRQ 7 polarity. + 6 PIRQ 7 polarity. 1 = active high, default 0 = active low - 5 Primary Parallel Port Extended Mode + 5 Primary Parallel Port Extended Mode 0 = Compatible mode, default 1 = Extended/Bidirectional mode. - 4 Primary Parallel Port Disable + 4 Primary Parallel Port Disable 1 = Disable, 0 = Enable Power Up Default is set by pin 120 (3221-DP)/pin 96 (3221-SP) - 3 Primary Parallel Port Power Down + 3 Primary Parallel Port Power Down 1 = Power Down, default = 0 - 2** Secondary Parallel Port Extended + 2** Secondary Parallel Port Extended Mode 0 = Compatible mode, default 1 = Extended/Bidirectional mode. - 1** Secondary Parallel Port Disable + 1** Secondary Parallel Port Disable 1 = Disable, 0 = Enable Power Up Default is set by pin 77 (3221-DP) - 0** Secondary Parallel Port Power Down + 0** Secondary Parallel Port Power Down 1 = Power Down 0 = Enable, default Note: Power Up not applicable to 3221-EP. */ @@ -72,41 +72,41 @@ typedef struct acc3221_t { #define REG_BE_LPT2_DISABLE (3 << 0) /* 3221-DP/EP only */ /* Configuration Register Index, BF (R/W): - Bit Function - 7-0 The 8 most significant address bits of + Bit Function + 7-0 The 8 most significant address bits of the primary parallel port (A9-2) Default 9E (LPT2, at 278-27B) */ /* Configuration Register Index, DA (R/W)**: - Bit Function - 7-0 The 8 most significant address bits of + Bit Function + 7-0 The 8 most significant address bits of the secondary parallel port (A9-2) Default DE (LPT1, at 378-37B) */ /* Configuration Register Index, DB (R/W): - Bit Function - 7 SIRQ4 polarity. + Bit Function + 7 SIRQ4 polarity. 1 = active high; default 0 = active low - 6 SIRQ3 polarity. + 6 SIRQ3 polarity. 1 = active high; default 0 = active low - 5 SXTAL clock off. 1 = SCLK off, + 5 SXTAL clock off. 1 = SCLK off, 0 = SCKL on, default - 4 Primary serial port disable + 4 Primary serial port disable 1 = Disable, 0 = Enable Power Up default is set by pin 116 (3221-DP)/pin 93 (3221-SP) - 3 Primary serial port power down + 3 Primary serial port power down 1 = Power down, 0 = Enable Power Up default is set by pin 116 (3221-DP)/pin 93 (3221-SP) - 2 Reserved - 1 Secondary serial port disable + 2 Reserved + 1 Secondary serial port disable 1 = Disable, 0 = Enable Power Up default is set by pin 121 (3221-DP)/pin 97 (3221-SP) - 0 Secondary serial port power down + 0 Secondary serial port power down 1 = Power down, 0 = Enable Power Up default is set by pin 121 (3221-DP)/pin 97 (3221-SP) @@ -115,57 +115,57 @@ typedef struct acc3221_t { #define REG_DB_SERIAL2_DISABLE (3 << 0) /* Configuration Register Index, DC (R/W): - Bit Function - 7-1 The MSB of the Primary Serial Port + Bit Function + 7-1 The MSB of the Primary Serial Port Address (bits A9-3). Default = 7F (COM1, at 3F8-3FF). - 0 When this bit is set to 1, bit A2 of + 0 When this bit is set to 1, bit A2 of primary parallel port is decoded. Default is 0. */ /* Configuration Register Index, DD (R/W): - Bit Function - 7-1 The MSB of the Secondary Serial Port + Bit Function + 7-1 The MSB of the Secondary Serial Port Address (bits A9-3). Default = 5F (COM2, at 2F8-2FF). - 0** When this bit is set to 1, bit A2 of + 0** When this bit is set to 1, bit A2 of secondary parallel port is decoded. Default is 0. */ /* Configuration Register Index, DE (R/W): - Bit Function - 7-6 SIRQ3 source - b7 b6 - 0 0 Disabled, tri-stated - 0 1 Disabled, tri-stated** - 1 0 Primary serial port - 1 1 Secondary serial port, + Bit Function + 7-6 SIRQ3 source + b7 b6 + 0 0 Disabled, tri-stated + 0 1 Disabled, tri-stated** + 1 0 Primary serial port + 1 1 Secondary serial port, default - 5-4 SIRQ4 source - b5 b4 - 0 0 Disabled, tri-stated - 0 1 Disabled, tri-stated** - 1 0 Primary serial port, + 5-4 SIRQ4 source + b5 b4 + 0 0 Disabled, tri-stated + 0 1 Disabled, tri-stated** + 1 0 Primary serial port, default - 1 1 Secondary serial port + 1 1 Secondary serial port - 3-2** PIRQ7 source - b3 b2 - 0 0 Diabled, tri-stated, + 3-2** PIRQ7 source + b3 b2 + 0 0 Diabled, tri-stated, default - 0 1 Primary serial port - 1 0 Primary parallel port - 1 1 Secondary parallel + 0 1 Primary serial port + 1 0 Primary parallel port + 1 1 Secondary parallel port Note: Bits 3-2 are reserved in 3221-SP. - 1-0 PIRQ5 source - b1 b0 - 0 0 Disabled, tri-stated - 0 1 Secondary serial port - 1 0 Primary parallel port, + 1-0 PIRQ5 source + b1 b0 + 0 0 Disabled, tri-stated + 0 1 Secondary serial port + 1 0 Primary parallel port, default - 1 1 Secondary parallel + 1 1 Secondary parallel port** */ #define REG_DE_SIRQ3_SOURCE (3 << 6) #define REG_DE_SIRQ3_SERIAL1 (1 << 6) @@ -183,48 +183,48 @@ typedef struct acc3221_t { #define REG_DE_PIRQ5_LPT2 (3 << 0) /* Configuration Register Index, DF (R/W)**: - Bit Function - 7-6 Reserved - 5 RTC interface disable + Bit Function + 7-6 Reserved + 5 RTC interface disable 1 = /RTCCS disabled 0 = /RTCCS enabled, default - 4 Disable Modem Select + 4 Disable Modem Select 1 = Moden CS disabled, default 0 = Modem CS enabled 3-2 - b3 b2 - 1 1 Reserved - 1 0 Modem port address + b3 b2 + 1 1 Reserved + 1 0 Modem port address = 3E8-3EF (default) - 0 1 Modem port address: + 0 1 Modem port address: 2F8-2FF - 0 0 Modem port address: + 0 0 Modem port address: 3F8-3FF 1-0 - b1 b0 - 1 1 Reserved - 1 0 Mode 2, EISA Mode - 0 1 Mode 1, AT BUS, - 0 0 Mode 0, Two parallel + b1 b0 + 1 1 Reserved + 1 0 Mode 2, EISA Mode + 0 1 Mode 1, AT BUS, + 0 0 Mode 0, Two parallel ports, default */ /* Configuration Register Index, FA (R/W)**: - Bit Function - 7 General purpose I/O register, Bit 7 - 6 General purpose I/O register, Bit 6 - 5 General purpose I/O register, Bit 5 - 4 General purpose I/O register, Bit 4 - 3 General purpose I/O register, Bit 3 - 2 General purpose I/O register, Bit 2 - 1 General purpose I/O register, Bit 1 - 0 General purpose I/O register, Bit 0 */ + Bit Function + 7 General purpose I/O register, Bit 7 + 6 General purpose I/O register, Bit 6 + 5 General purpose I/O register, Bit 5 + 4 General purpose I/O register, Bit 4 + 3 General purpose I/O register, Bit 3 + 2 General purpose I/O register, Bit 2 + 1 General purpose I/O register, Bit 1 + 0 General purpose I/O register, Bit 0 */ /* Configuration Register Index, FB (R/W)**: - Bit Function - 7 Reserved - 6** 0/2 EXG (Read Only) + Bit Function + 7 Reserved + 6** 0/2 EXG (Read Only) In mode 1 and mode 2 operation, when the third floppy drive is installed, pin @@ -234,7 +234,7 @@ typedef struct acc3221_t { disable the third floppy drive. 1 = Third floppy drive enabled 0 = Third floppy drive disabled - 5** EXTFDD (Read Only) + 5** EXTFDD (Read Only) In mode 1 and mode 2 operation, when the third floppy drive is installed and @@ -246,7 +246,7 @@ typedef struct acc3221_t { drive 2. 1 = Third floppy drive as drive 0 (bootable) 0 = Third floppy drive as drive 2 - 4** MS + 4** MS In mode 1 and mode 2, t his bit is to control the output pin MS to support a special 3 1/2", 1.2M drive. When this @@ -254,45 +254,45 @@ typedef struct acc3221_t { a low signal. When this bit is set to low (0), the MS pin sends a high signal to support a 3 1/2", 1.2M drive. - 3 FDC, Clock disable + 3 FDC, Clock disable 0 = enable, default 1 = disable - 2 Reserved - 1 FDC disable + 2 Reserved + 1 FDC disable 0 = enable, 1= disable Power Upd efault set by pin 117 (3221- DP)/pin 94 (3221-SP) - 0 FDC address + 0 FDC address 0 = Primary, default 1 = Secondary Note: Bits 6-4 are reserved in 3221-SP. */ #define REG_FB_FDC_DISABLE (1 << 1) /* Configuration Register Index, FB (R/W)**: - Bit Function - 7** Disable general chip select 1 + Bit Function + 7** Disable general chip select 1 1 = disable, default 0 = enable - 6** Disable general chip select 2 + 6** Disable general chip select 2 1 = disable, default 0 = enable - 5** Enable SA2 decoding for general chip + 5** Enable SA2 decoding for general chip select 1 1 = enable 0 = disable, default - 4** Enable SA2 decoding for general chip + 4** Enable SA2 decoding for general chip select 2 1 = enable 0 = disable, default - 3 Reserved - 2 IDE XT selected + 3 Reserved + 2 IDE XT selected 0 = IDE AT interface, default 1 = IDE XT interface - 1 IDE disable, 1 = IDE disable + 1 IDE disable, 1 = IDE disable 0 = IDE enable Power Up default set by pin 13 (3221- DP)/pin 13 (3221-SP) - 0 Secondary IDE + 0 Secondary IDE 1 = secondary 0 = primary, default Note: Bits 6-4 are reserved in 3221-SP. */ diff --git a/src/sio/sio_ali5123.c b/src/sio/sio_ali5123.c index 5c52bbc88..310a09ab0 100644 --- a/src/sio/sio_ali5123.c +++ b/src/sio/sio_ali5123.c @@ -1,17 +1,18 @@ /* - * 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. * - * Implementation of the ALi M5123/1543C Super I/O Chip. + * Implementation of the ALi M5123/1543C Super I/O Chip. * * * - * Author: Miran Grca, - * Copyright 2016-2018 Miran Grca. + * Authors: Miran Grca, + * + * Copyright 2016-2018 Miran Grca. */ #include #include diff --git a/src/sio/sio_detect.c b/src/sio/sio_detect.c index 871ad1a0a..36c12cd54 100644 --- a/src/sio/sio_detect.c +++ b/src/sio/sio_detect.c @@ -1,18 +1,18 @@ /* - * 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. * - * Super I/O chip detection code. + * Super I/O chip detection code. * * * - * Authors: Miran Grca, + * Authors: Miran Grca, * - * Copyright 2016-2018 Miran Grca. + * Copyright 2016-2018 Miran Grca. */ #include #include diff --git a/src/sio/sio_f82c710.c b/src/sio/sio_f82c710.c index eccf799f4..ad347fb03 100644 --- a/src/sio/sio_f82c710.c +++ b/src/sio/sio_f82c710.c @@ -1,28 +1,30 @@ /* - * 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. * - * Implementation of the Chips & Technologies F82C710 Universal Peripheral - * Controller (UPC) and 82C606 CHIPSpak Multifunction Controller. + * Implementation of the Chips & Technologies F82C710 Universal Peripheral + * Controller (UPC) and 82C606 CHIPSpak Multifunction Controller. * - * Relevant literature: + * Relevant literature: * - * [1] Chips and Technologies, Inc., - * 82C605/82C606 CHIPSpak/CHIPSport MULTIFUNCTION CONTROLLERS, - * PRELIMINARY Data Sheet, Revision 1, May 1987. - * + * [1] Chips and Technologies, Inc., + * 82C605/82C606 CHIPSpak/CHIPSport MULTIFUNCTION CONTROLLERS, + * PRELIMINARY Data Sheet, Revision 1, May 1987. + * * - * Authors: Sarah Walker, - * Eluan Costa Miranda - * Lubomir Rintel * - * Copyright 2020 Sarah Walker. - * Copyright 2020 Eluan Costa Miranda. - * Copyright 2021 Lubomir Rintel. + * + * Authors: Sarah Walker, + * Eluan Costa Miranda + * Lubomir Rintel + * + * Copyright 2020 Sarah Walker. + * Copyright 2020 Eluan Costa Miranda. + * Copyright 2021 Lubomir Rintel. */ #include #include diff --git a/src/sio/sio_fdc37c669.c b/src/sio/sio_fdc37c669.c index 81d9647c0..a8bc4d700 100644 --- a/src/sio/sio_fdc37c669.c +++ b/src/sio/sio_fdc37c669.c @@ -1,17 +1,18 @@ /* - * 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. * - * Implementation of the SMC FDC37C669 Super I/O Chip. + * Implementation of the SMC FDC37C669 Super I/O Chip. * * * - * Author: Miran Grca, - * Copyright 2016-2018 Miran Grca. + * Authors: Miran Grca, + * + * Copyright 2016-2018 Miran Grca. */ #include #include diff --git a/src/sio/sio_fdc37c67x.c b/src/sio/sio_fdc37c67x.c index e728a8ffb..af8a89bf5 100644 --- a/src/sio/sio_fdc37c67x.c +++ b/src/sio/sio_fdc37c67x.c @@ -1,17 +1,18 @@ /* - * 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. * - * Implementation of the SMC FDC37C67X Super I/O Chip. + * Implementation of the SMC FDC37C67X Super I/O Chip. * * * - * Author: Miran Grca, - * Copyright 2016-2018 Miran Grca. + * Authors: Miran Grca, + * + * Copyright 2016-2018 Miran Grca. */ #include #include @@ -171,13 +172,13 @@ fdc37c67x_sio_handler(fdc37c67x_t *dev) { #if 0 if (dev->sio_base) { - io_removehandler(dev->sio_base, 0x0002, - fdc37c67x_read, NULL, NULL, fdc37c67x_write, NULL, NULL, dev); + io_removehandler(dev->sio_base, 0x0002, + fdc37c67x_read, NULL, NULL, fdc37c67x_write, NULL, NULL, dev); } dev->sio_base = (((uint16_t) dev->regs[0x27]) << 8) | dev->regs[0x26]; if (dev->sio_base) { - io_sethandler(dev->sio_base, 0x0002, - fdc37c67x_read, NULL, NULL, fdc37c67x_write, NULL, NULL, dev); + io_sethandler(dev->sio_base, 0x0002, + fdc37c67x_read, NULL, NULL, fdc37c67x_write, NULL, NULL, dev); } #endif } diff --git a/src/sio/sio_fdc37c6xx.c b/src/sio/sio_fdc37c6xx.c index 9484ae680..f9c911402 100644 --- a/src/sio/sio_fdc37c6xx.c +++ b/src/sio/sio_fdc37c6xx.c @@ -11,7 +11,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2020 Sarah Walker. diff --git a/src/sio/sio_fdc37c93x.c b/src/sio/sio_fdc37c93x.c index afc1642a5..55464ec98 100644 --- a/src/sio/sio_fdc37c93x.c +++ b/src/sio/sio_fdc37c93x.c @@ -1,18 +1,19 @@ /* - * 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. * - * Implementation of the SMC FDC37C932FR and FDC37C935 Super - * I/O Chips. + * Implementation of the SMC FDC37C932FR and FDC37C935 Super + * I/O Chips. * * * - * Author: Miran Grca, - * Copyright 2016-2018 Miran Grca. + * Authors: Miran Grca, + * + * Copyright 2016-2018 Miran Grca. */ #include #include diff --git a/src/sio/sio_fdc37m60x.c b/src/sio/sio_fdc37m60x.c index d74db6207..e29734c51 100644 --- a/src/sio/sio_fdc37m60x.c +++ b/src/sio/sio_fdc37m60x.c @@ -1,15 +1,18 @@ /* - * 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. * - * Emulation of the SMSC FDC37M60x Super I/O + * Emulation of the SMSC FDC37M60x Super I/O * - * Authors: Tiseno100 - * Copyright 2020 Tiseno100 + * + * + * Authors: Tiseno100 + * + * Copyright 2020 Tiseno100 */ #include #include diff --git a/src/sio/sio_it8661f.c b/src/sio/sio_it8661f.c index 98340aaa5..c7d4110be 100644 --- a/src/sio/sio_it8661f.c +++ b/src/sio/sio_it8661f.c @@ -1,18 +1,18 @@ /* - * 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. * - * Implementation of the ITE IT8661F chipset. + * Implementation of the ITE IT8661F chipset. * - * Note: This Super I/O is partially incomplete and intended only for having the intended machine to function + * Note: This Super I/O is partially incomplete and intended only for having the intended machine to function * - * Authors: Tiseno100 + * Authors: Tiseno100 * - * Copyright 2021 Tiseno100 + * Copyright 2021 Tiseno100 * */ #include diff --git a/src/sio/sio_pc87306.c b/src/sio/sio_pc87306.c index 18b9a9357..8755775de 100644 --- a/src/sio/sio_pc87306.c +++ b/src/sio/sio_pc87306.c @@ -1,17 +1,18 @@ /* - * 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. * - * Emulation of the NatSemi PC87306 Super I/O chip. + * Emulation of the NatSemi PC87306 Super I/O chip. * * * - * Author: Miran Grca, - * Copyright 2016-2018 Miran Grca. + * Authors: Miran Grca, + * + * Copyright 2016-2018 Miran Grca. */ #include #include @@ -365,7 +366,7 @@ pc87306_reset(pc87306_t *dev) /* 0 = 360 rpm @ 500 kbps for 3.5" - 1 = Default, 300 rpm @ 500,300,250,1000 kbps for 3.5" + 1 = Default, 300 rpm @ 500, 300, 250, 1000 kbps for 3.5" */ lpt1_remove(); lpt1_handler(dev); diff --git a/src/sio/sio_pc87307.c b/src/sio/sio_pc87307.c index ecdb13c5b..6f773a8e1 100644 --- a/src/sio/sio_pc87307.c +++ b/src/sio/sio_pc87307.c @@ -1,17 +1,18 @@ /* - * 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. * - * Emulation of the NatSemi PC87307 Super I/O chip. + * Emulation of the NatSemi PC87307 Super I/O chip. * * * - * Author: Miran Grca, - * Copyright 2020 Miran Grca. + * Authors: Miran Grca, + * + * Copyright 2020 Miran Grca. */ #include #include @@ -534,7 +535,7 @@ pc87307_reset(pc87307_t *dev) /* 0 = 360 rpm @ 500 kbps for 3.5" - 1 = Default, 300 rpm @ 500,300,250,1000 kbps for 3.5" + 1 = Default, 300 rpm @ 500, 300, 250, 1000 kbps for 3.5" */ lpt1_remove(); serial_remove(dev->uart[0]); diff --git a/src/sio/sio_pc87309.c b/src/sio/sio_pc87309.c index 8d7ff7065..70ed57229 100644 --- a/src/sio/sio_pc87309.c +++ b/src/sio/sio_pc87309.c @@ -1,17 +1,18 @@ /* - * 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. * - * Emulation of the NatSemi PC87309 Super I/O chip. + * Emulation of the NatSemi PC87309 Super I/O chip. * * * - * Author: Miran Grca, - * Copyright 2020 Miran Grca. + * Authors: Miran Grca, + * + * Copyright 2020 Miran Grca. */ #include #include @@ -421,7 +422,7 @@ pc87309_reset(pc87309_t *dev) /* 0 = 360 rpm @ 500 kbps for 3.5" - 1 = Default, 300 rpm @ 500,300,250,1000 kbps for 3.5" + 1 = Default, 300 rpm @ 500, 300, 250, 1000 kbps for 3.5" */ lpt1_remove(); serial_remove(dev->uart[0]); diff --git a/src/sio/sio_pc87310.c b/src/sio/sio_pc87310.c index 5b5267191..eacbadf89 100644 --- a/src/sio/sio_pc87310.c +++ b/src/sio/sio_pc87310.c @@ -1,22 +1,22 @@ /* - * 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. * - * Emulation of the NatSemi PC87310 Super I/O chip. + * Emulation of the NatSemi PC87310 Super I/O chip. * * * - * Author: Miran Grca, - * Tiseno100 - * EngiNerd + * Authors: Miran Grca, + * Tiseno100 + * EngiNerd * - * Copyright 2020 Miran Grca. - * Copyright 2020 Tiseno100 - * Copyright 2021 EngiNerd. + * Copyright 2020 Miran Grca. + * Copyright 2020 Tiseno100 + * Copyright 2021 EngiNerd. */ #include #include @@ -210,7 +210,7 @@ pc87310_reset(pc87310_t *dev) dev->tries = 0; /* 0 = 360 rpm @ 500 kbps for 3.5" - 1 = Default, 300 rpm @ 500,300,250,1000 kbps for 3.5" + 1 = Default, 300 rpm @ 500, 300, 250, 1000 kbps for 3.5" */ lpt1_remove(); lpt1_handler(dev); diff --git a/src/sio/sio_pc87311.c b/src/sio/sio_pc87311.c index 2c098d5ab..c795da8a9 100644 --- a/src/sio/sio_pc87311.c +++ b/src/sio/sio_pc87311.c @@ -1,15 +1,18 @@ /* - * 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. * - * Emulation of the National Semiconductor PC87311 Super I/O + * Emulation of the National Semiconductor PC87311 Super I/O * - * Authors: Tiseno100 - * Copyright 2020 Tiseno100 + * + * + * Authors: Tiseno100 + * + * Copyright 2020 Tiseno100 */ #include #include diff --git a/src/sio/sio_pc87332.c b/src/sio/sio_pc87332.c index 71f7584f4..64dd86665 100644 --- a/src/sio/sio_pc87332.c +++ b/src/sio/sio_pc87332.c @@ -1,17 +1,18 @@ /* - * 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. * - * Emulation of the NatSemi PC87332 Super I/O chip. + * Emulation of the NatSemi PC87332 Super I/O chip. * * * - * Author: Miran Grca, - * Copyright 2020 Miran Grca. + * Authors: Miran Grca, + * + * Copyright 2020 Miran Grca. */ #include #include @@ -276,7 +277,7 @@ pc87332_reset(pc87332_t *dev) /* 0 = 360 rpm @ 500 kbps for 3.5" - 1 = Default, 300 rpm @ 500,300,250,1000 kbps for 3.5" + 1 = Default, 300 rpm @ 500, 300, 250, 1000 kbps for 3.5" */ lpt1_remove(); lpt1_handler(dev); diff --git a/src/sio/sio_prime3b.c b/src/sio/sio_prime3b.c index b0267f0a0..a204fde5b 100644 --- a/src/sio/sio_prime3b.c +++ b/src/sio/sio_prime3b.c @@ -1,15 +1,18 @@ /* - * 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. * - * Emulation of the Goldstar Prime3B Super I/O + * Emulation of the Goldstar Prime3B Super I/O * - * Authors: Tiseno100 - * Copyright 2021 Tiseno100 + * + * + * Authors: Tiseno100 + * + * Copyright 2021 Tiseno100 */ #include #include diff --git a/src/sio/sio_prime3c.c b/src/sio/sio_prime3c.c index 303a10967..eae3fe1b2 100644 --- a/src/sio/sio_prime3c.c +++ b/src/sio/sio_prime3c.c @@ -1,15 +1,18 @@ /* - * 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. * - * Emulation of the LG Prime3C Super I/O + * Emulation of the LG Prime3C Super I/O * - * Authors: Tiseno100 - * Copyright 2020 Tiseno100 + * + * + * Authors: Tiseno100 + * + * Copyright 2020 Tiseno100 */ #include #include diff --git a/src/sio/sio_um8669f.c b/src/sio/sio_um8669f.c index 954e7c45c..bd153a9e4 100644 --- a/src/sio/sio_um8669f.c +++ b/src/sio/sio_um8669f.c @@ -1,22 +1,22 @@ /* - * 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. * - * Emulation of the UMC UM8669F Super I/O chip. + * Emulation of the UMC UM8669F Super I/O chip. * * * - * Authors: Sarah Walker, - * Miran Grca, - * RichardG, + * Authors: Sarah Walker, + * Miran Grca, + * RichardG, * - * Copyright 2008-2021 Sarah Walker. - * Copyright 2016-2021 Miran Grca. - * Copyright 2021 RichardG. + * Copyright 2008-2021 Sarah Walker. + * Copyright 2016-2021 Miran Grca. + * Copyright 2021 RichardG. */ #include #include @@ -69,27 +69,27 @@ static uint8_t um8669f_pnp_rom[] = { }; static const isapnp_device_config_t um8669f_pnp_defaults[] = { { - .activate = 1, - .io = { { .base = FDC_PRIMARY_ADDR }, }, - .irq = { { .irq = FDC_PRIMARY_IRQ }, }, - .dma = { { .dma = FDC_PRIMARY_DMA }, } + .activate = 1, + .io = { { .base = FDC_PRIMARY_ADDR }, }, + .irq = { { .irq = FDC_PRIMARY_IRQ }, }, + .dma = { { .dma = FDC_PRIMARY_DMA }, } }, { - .activate = 1, - .io = { { .base = COM1_ADDR }, }, - .irq = { { .irq = COM1_IRQ }, } + .activate = 1, + .io = { { .base = COM1_ADDR }, }, + .irq = { { .irq = COM1_IRQ }, } }, { - .activate = 1, - .io = { { .base = COM2_ADDR }, }, - .irq = { { .irq = COM2_IRQ }, } + .activate = 1, + .io = { { .base = COM2_ADDR }, }, + .irq = { { .irq = COM2_IRQ }, } }, { - .activate = 1, - .io = { { .base = LPT1_ADDR }, }, - .irq = { { .irq = LPT1_IRQ }, } + .activate = 1, + .io = { { .base = LPT1_ADDR }, }, + .irq = { { .irq = LPT1_IRQ }, } }, { - .activate = 0 + .activate = 0 }, { - .activate = 0, - .io = { { .base = 0x200 }, } + .activate = 0, + .io = { { .base = 0x200 }, } } }; diff --git a/src/sio/sio_vt82c686.c b/src/sio/sio_vt82c686.c index 00617e4ea..c7f9c28bc 100644 --- a/src/sio/sio_vt82c686.c +++ b/src/sio/sio_vt82c686.c @@ -1,18 +1,18 @@ /* - * 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. * - * Emulation of the VIA VT82C686A/B integrated Super I/O. + * Emulation of the VIA VT82C686A/B integrated Super I/O. * * * - * Author: RichardG, + * Authors: RichardG, * - * Copyright 2020 RichardG. + * Copyright 2020 RichardG. */ #include #include diff --git a/src/sio/sio_w83787f.c b/src/sio/sio_w83787f.c index ce6c20386..722f1eef8 100644 --- a/src/sio/sio_w83787f.c +++ b/src/sio/sio_w83787f.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Emulation of the Winbond W83787F/IF Super I/O Chip. + * Emulation of the Winbond W83787F/IF Super I/O Chip. * - * Winbond W83787F Super I/O Chip - * Used by the Award 430HX + * Winbond W83787F Super I/O Chip + * Used by the Award 430HX * * * - * Author: Miran Grca, - * Copyright 2020 Miran Grca. + * Authors: Miran Grca, + * Copyright 2020 Miran Grca. */ #include #include diff --git a/src/sio/sio_w83877f.c b/src/sio/sio_w83877f.c index 28ab95f46..4f8b45118 100644 --- a/src/sio/sio_w83877f.c +++ b/src/sio/sio_w83877f.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Emulation of the Winbond W83877F Super I/O Chip. + * Emulation of the Winbond W83877F Super I/O Chip. * - * Winbond W83877F Super I/O Chip - * Used by the Award 430HX + * Winbond W83877F Super I/O Chip + * Used by the Award 430HX * * * - * Author: Miran Grca, - * Copyright 2016-2020 Miran Grca. + * Authors: Miran Grca, + * Copyright 2016-2020 Miran Grca. */ #include #include diff --git a/src/sio/sio_w83977f.c b/src/sio/sio_w83977f.c index e214f883d..1b6105840 100644 --- a/src/sio/sio_w83977f.c +++ b/src/sio/sio_w83977f.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Emulation of the Winbond W83977F Super I/O Chip. + * Emulation of the Winbond W83977F Super I/O Chip. * - * Winbond W83977F Super I/O Chip - * Used by the Award 430TX + * Winbond W83977F Super I/O Chip + * Used by the Award 430TX * * * - * Author: Miran Grca, - * Copyright 2016-2020 Miran Grca. + * Authors: Miran Grca, + * Copyright 2016-2020 Miran Grca. */ #include #include diff --git a/src/sound/CMakeLists.txt b/src/sound/CMakeLists.txt index 66672d547..10b8903bc 100644 --- a/src/sound/CMakeLists.txt +++ b/src/sound/CMakeLists.txt @@ -10,7 +10,7 @@ # # Authors: David Hrdlička, # -# Copyright 2020,2021 David Hrdlička. +# 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 diff --git a/src/sound/midi.c b/src/sound/midi.c index 93fa62891..0cc8f2b38 100644 --- a/src/sound/midi.c +++ b/src/sound/midi.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Bit, * DOSBox Team, diff --git a/src/sound/openal.c b/src/sound/openal.c index 2153d4c2b..48e4ee818 100644 --- a/src/sound/openal.c +++ b/src/sound/openal.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2019 Sarah Walker. diff --git a/src/sound/resid-fp/CMakeLists.txt b/src/sound/resid-fp/CMakeLists.txt index 5ec9130d7..699fcae54 100644 --- a/src/sound/resid-fp/CMakeLists.txt +++ b/src/sound/resid-fp/CMakeLists.txt @@ -10,7 +10,7 @@ # # Authors: David Hrdlička, # -# Copyright 2020,2021 David Hrdlička. +# Copyright 2020-2021 David Hrdlička. # add_library(resid-fp STATIC convolve-sse.cc convolve.cc envelope.cc extfilt.cc diff --git a/src/sound/snd_ad1848.c b/src/sound/snd_ad1848.c index 558024fb5..f9bc337c1 100644 --- a/src/sound/snd_ad1848.c +++ b/src/sound/snd_ad1848.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * TheCollector1995, * RichardG, * diff --git a/src/sound/snd_audiopci.c b/src/sound/snd_audiopci.c index ecac7f05a..7d029a169 100644 --- a/src/sound/snd_audiopci.c +++ b/src/sound/snd_audiopci.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * RichardG, * Miran Grca, * diff --git a/src/sound/snd_mpu401.c b/src/sound/snd_mpu401.c index a31c48a7b..328c3c688 100644 --- a/src/sound/snd_mpu401.c +++ b/src/sound/snd_mpu401.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * DOSBox Team, * Miran Grca, * TheCollector1995, diff --git a/src/sound/snd_sb.c b/src/sound/snd_sb.c index 7660ace90..d67701180 100644 --- a/src/sound/snd_sb.c +++ b/src/sound/snd_sb.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * TheCollector1995, * diff --git a/src/sound/snd_speaker.c b/src/sound/snd_speaker.c index 34d32c110..774e4d650 100644 --- a/src/sound/snd_speaker.c +++ b/src/sound/snd_speaker.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2019 Sarah Walker. diff --git a/src/sound/snd_wss.c b/src/sound/snd_wss.c index 8a325e5c3..9e37dd745 100644 --- a/src/sound/snd_wss.c +++ b/src/sound/snd_wss.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * TheCollector1995, * * Copyright 2012-2018 Sarah Walker. diff --git a/src/sound/sound.c b/src/sound/sound.c index cda851137..ab75af4f0 100644 --- a/src/sound/sound.c +++ b/src/sound/sound.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2020 Sarah Walker. diff --git a/src/unix/assets/86Box.spec b/src/unix/assets/86Box.spec index 414a38a96..9fac0dde4 100644 --- a/src/unix/assets/86Box.spec +++ b/src/unix/assets/86Box.spec @@ -12,7 +12,7 @@ # After a successful build, you can install the RPMs as follows: # sudo dnf install RPMS/$(uname -m)/86Box-3* RPMS/noarch/86Box-roms* -%global romver v3.7 +%global romver v3.11 Name: 86Box Version: 3.11 diff --git a/src/unix/unix_cdrom.c b/src/unix/unix_cdrom.c index bbeed0149..79a649eb5 100644 --- a/src/unix/unix_cdrom.c +++ b/src/unix/unix_cdrom.c @@ -10,12 +10,12 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * * Copyright 2016-2018 Miran Grca. - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. */ #include diff --git a/src/video/CMakeLists.txt b/src/video/CMakeLists.txt index a5ea1059a..b37e81134 100644 --- a/src/video/CMakeLists.txt +++ b/src/video/CMakeLists.txt @@ -10,7 +10,7 @@ # # Authors: David Hrdlička, # -# Copyright 2020,2021 David Hrdlička. +# Copyright 2020-2021 David Hrdlička. # add_library(vid OBJECT agpgart.c video.c vid_table.c vid_cga.c vid_cga_comp.c diff --git a/src/video/agpgart.c b/src/video/agpgart.c index 0a594a8d3..523fcc996 100644 --- a/src/video/agpgart.c +++ b/src/video/agpgart.c @@ -1,18 +1,18 @@ /* - * 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. * - * AGP Graphics Address Remapping Table remapping emulation. + * AGP Graphics Address Remapping Table remapping emulation. * * * - * Authors: RichardG, + * Authors: RichardG, * - * Copyright 2021 RichardG. + * Copyright 2021 RichardG. */ #include #include diff --git a/src/video/vid_8514a.c b/src/video/vid_8514a.c index 88dcee020..f7f3ce607 100644 --- a/src/video/vid_8514a.c +++ b/src/video/vid_8514a.c @@ -1,19 +1,19 @@ /* - * 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. * - * Emulation of the 8514/A card from IBM for the MCA bus and - * generic ISA bus clones without vendor extensions. + * Emulation of the 8514/A card from IBM for the MCA bus and + * generic ISA bus clones without vendor extensions. * * * - * Authors: TheCollector1995. + * Authors: TheCollector1995. * - * Copyright 2022 TheCollector1995. + * Copyright 2022 TheCollector1995. */ #include #include diff --git a/src/video/vid_ati18800.c b/src/video/vid_ati18800.c index 2fb58aa5b..3781ef567 100644 --- a/src/video/vid_ati18800.c +++ b/src/video/vid_ati18800.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * ATI 18800 emulation (VGA Edge-16) + * ATI 18800 emulation (VGA Edge-16) * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2020 Sarah Walker. - * Copyright 2016-2020 Miran Grca. + * Copyright 2008-2020 Sarah Walker. + * Copyright 2016-2020 Miran Grca. */ #include #include diff --git a/src/video/vid_ati28800.c b/src/video/vid_ati28800.c index 06b61d41f..352ce2f7d 100644 --- a/src/video/vid_ati28800.c +++ b/src/video/vid_ati28800.c @@ -1,22 +1,22 @@ /* - * 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. * - * ATI 28800 emulation (VGA Charger and Korean VGA) + * ATI 28800 emulation (VGA Charger and Korean VGA) * * * - * Authors: Sarah Walker, - * Miran Grca, - * greatpsycho, + * Authors: Sarah Walker, + * Miran Grca, + * greatpsycho, * - * Copyright 2008-2018 Sarah Walker. - * Copyright 2016-2018 Miran Grca. - * Copyright 2018 greatpsycho. + * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. + * Copyright 2018 greatpsycho. */ #include #include diff --git a/src/video/vid_ati68860_ramdac.c b/src/video/vid_ati68860_ramdac.c index 1bf74067a..49fad5815 100644 --- a/src/video/vid_ati68860_ramdac.c +++ b/src/video/vid_ati68860_ramdac.c @@ -1,40 +1,40 @@ /* - * 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. * - * ATI 68860 RAMDAC emulation (for Mach64) + * ATI 68860 RAMDAC emulation (for Mach64) * - * ATI 68860/68880 Truecolor DACs: - * REG08 (R/W): - * bit 0-? Always 2 ?? + * ATI 68860/68880 Truecolor DACs: + * REG08 (R/W): + * bit 0-? Always 2 ?? * - * REG0A (R/W): - * bit 0-? Always 1Dh ?? + * REG0A (R/W): + * bit 0-? Always 1Dh ?? * - * REG0B (R/W): (GMR ?) - * bit 0-7 Mode. 82h: 4bpp, 83h: 8bpp, - * A0h: 15bpp, A1h: 16bpp, C0h: 24bpp, - * E3h: 32bpp (80h for VGA modes ?) + * REG0B (R/W): (GMR ?) + * bit 0-7 Mode. 82h: 4bpp, 83h: 8bpp, + * A0h: 15bpp, A1h: 16bpp, C0h: 24bpp, + * E3h: 32bpp (80h for VGA modes ?) * - * REG0C (R/W): Device Setup Register A - * bit 0 Controls 6/8bit DAC. 0: 8bit DAC/LUT, 1: 6bit DAC/LUT - * 2-3 Depends on Video memory (= VRAM width ?) . - * 1: Less than 1Mb, 2: 1Mb, 3: > 1Mb - * 5-6 Always set ? - * 7 If set can remove "snow" in some cases - * (A860_Delay_L ?) ?? + * REG0C (R/W): Device Setup Register A + * bit 0 Controls 6/8bit DAC. 0: 8bit DAC/LUT, 1: 6bit DAC/LUT + * 2-3 Depends on Video memory (= VRAM width ?) . + * 1: Less than 1Mb, 2: 1Mb, 3: > 1Mb + * 5-6 Always set ? + * 7 If set can remove "snow" in some cases + * (A860_Delay_L ?) ?? * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2018 Sarah Walker. - * Copyright 2016-2018 Miran Grca. + * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. */ #include #include diff --git a/src/video/vid_ati_eeprom.c b/src/video/vid_ati_eeprom.c index 15696be63..f1840a698 100644 --- a/src/video/vid_ati_eeprom.c +++ b/src/video/vid_ati_eeprom.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Emulation of the EEPROM on select ATI cards. + * Emulation of the EEPROM on select ATI cards. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2020 Sarah Walker. - * Copyright 2016-2020 Miran Grca. + * Copyright 2008-2020 Sarah Walker. + * Copyright 2016-2020 Miran Grca. */ #include #include diff --git a/src/video/vid_ati_mach64.c b/src/video/vid_ati_mach64.c index c2aa2b6ad..d67ff876b 100644 --- a/src/video/vid_ati_mach64.c +++ b/src/video/vid_ati_mach64.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * ATi Mach64 graphics card emulation. + * ATi Mach64 graphics card emulation. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 Miran Grca. + * Copyright 2008-2019 Sarah Walker. + * Copyright 2016-2019 Miran Grca. */ #include #include diff --git a/src/video/vid_att20c49x_ramdac.c b/src/video/vid_att20c49x_ramdac.c index 81cde31a4..1874afce9 100644 --- a/src/video/vid_att20c49x_ramdac.c +++ b/src/video/vid_att20c49x_ramdac.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Emulation of a AT&T 20c490/491 and 492/493 RAMDAC. + * Emulation of a AT&T 20c490/491 and 492/493 RAMDAC. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2018 Sarah Walker. - * Copyright 2016-2018 Miran Grca. + * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. */ #include #include diff --git a/src/video/vid_att2xc498_ramdac.c b/src/video/vid_att2xc498_ramdac.c index 5983677db..2dab4b903 100644 --- a/src/video/vid_att2xc498_ramdac.c +++ b/src/video/vid_att2xc498_ramdac.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Emulation of a AT&T 2xc498 RAMDAC. + * Emulation of a AT&T 2xc498 RAMDAC. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2018 Sarah Walker. - * Copyright 2016-2018 Miran Grca. + * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. */ #include #include diff --git a/src/video/vid_av9194.c b/src/video/vid_av9194.c index 20d39f247..f8ebc89de 100644 --- a/src/video/vid_av9194.c +++ b/src/video/vid_av9194.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * AV9194 clock generator emulation. + * AV9194 clock generator emulation. * - * Used by the S3 86c801 (V7-Mirage) card. + * Used by the S3 86c801 (V7-Mirage) card. * * * - * Authors: Miran Grca, + * Authors: Miran Grca, * - * Copyright 2016-2018 Miran Grca. + * Copyright 2016-2018 Miran Grca. */ #include #include diff --git a/src/video/vid_bt48x_ramdac.c b/src/video/vid_bt48x_ramdac.c index 05ade0cc3..daf840df8 100644 --- a/src/video/vid_bt48x_ramdac.c +++ b/src/video/vid_bt48x_ramdac.c @@ -1,21 +1,21 @@ /* - * 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. * - * Emulation of the Brooktree BT484-485A true colour RAMDAC - * family. + * Emulation of the Brooktree BT484-485A true colour RAMDAC + * family. * * * - * Authors: Miran Grca, - * TheCollector1995, + * Authors: Miran Grca, + * TheCollector1995, * - * Copyright 2016-2018 Miran Grca. - * Copyright 2018 TheCollector1995. + * Copyright 2016-2018 Miran Grca. + * Copyright 2018 TheCollector1995. */ #include #include diff --git a/src/video/vid_cga.c b/src/video/vid_cga.c index 8dba373df..6ed81f616 100644 --- a/src/video/vid_cga.c +++ b/src/video/vid_cga.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Emulation of the old and new IBM CGA graphics cards. + * Emulation of the old and new IBM CGA graphics cards. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 Miran Grca. + * Copyright 2008-2019 Sarah Walker. + * Copyright 2016-2019 Miran Grca. */ #include #include diff --git a/src/video/vid_cga_comp.c b/src/video/vid_cga_comp.c index 077084000..ad9f673fb 100644 --- a/src/video/vid_cga_comp.c +++ b/src/video/vid_cga_comp.c @@ -1,21 +1,21 @@ /* - * 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. * - * IBM CGA composite filter, borrowed from reenigne's DOSBox - * patch and ported to C. + * IBM CGA composite filter, borrowed from reenigne's DOSBox + * patch and ported to C. * * * - * Authors: reenigne, - * Miran Grca, + * Authors: reenigne, + * Miran Grca, * - * Copyright 2015-2019 reenigne. - * Copyright 2015-2019 Miran Grca. + * Copyright 2015-2019 reenigne. + * Copyright 2015-2019 Miran Grca. */ #include #include diff --git a/src/video/vid_cl54xx.c b/src/video/vid_cl54xx.c index c3fd19e58..e29d95232 100644 --- a/src/video/vid_cl54xx.c +++ b/src/video/vid_cl54xx.c @@ -16,7 +16,7 @@ * TheCollector1995, * * Copyright 2016-2020 Miran Grca. - * Copyright 2020 tonioni. + * Copyright 2020 tonioni. * Copyright 2016-2020 TheCollector1995. */ #include diff --git a/src/video/vid_colorplus.c b/src/video/vid_colorplus.c index a343087d4..ae24d8ff0 100644 --- a/src/video/vid_colorplus.c +++ b/src/video/vid_colorplus.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Plantronics ColorPlus emulation. + * Plantronics ColorPlus emulation. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2018 Sarah Walker. - * Copyright 2016-2018 Miran Grca. + * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. */ #include #include diff --git a/src/video/vid_compaq_cga.c b/src/video/vid_compaq_cga.c index da4006339..68255e746 100644 --- a/src/video/vid_compaq_cga.c +++ b/src/video/vid_compaq_cga.c @@ -1,22 +1,22 @@ /* - * 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. * - * Emulation of the Compaq CGA graphics cards. + * Emulation of the Compaq CGA graphics cards. * * * - * Authors: John Elliott, - * Sarah Walker, - * Miran Grca, + * Authors: John Elliott, + * Sarah Walker, + * Miran Grca, * - * Copyright 2016-2019 John Elliott. - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 Miran Grca. + * Copyright 2016-2019 John Elliott. + * Copyright 2008-2019 Sarah Walker. + * Copyright 2016-2019 Miran Grca. */ #include #include diff --git a/src/video/vid_ddc.c b/src/video/vid_ddc.c index b263448fc..f6c4d4dac 100644 --- a/src/video/vid_ddc.c +++ b/src/video/vid_ddc.c @@ -1,18 +1,18 @@ /* - * 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. * - * DDC monitor emulation. + * DDC monitor emulation. * * * - * Authors: RichardG, + * Authors: RichardG, * - * Copyright 2020 RichardG. + * Copyright 2020 RichardG. */ #include #include diff --git a/src/video/vid_ega.c b/src/video/vid_ega.c index af1c06335..bfac7d503 100644 --- a/src/video/vid_ega.c +++ b/src/video/vid_ega.c @@ -1,21 +1,21 @@ /* - * 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. * - * Emulation of the EGA and Chips & Technologies SuperEGA - * graphics cards. + * Emulation of the EGA and Chips & Technologies SuperEGA + * graphics cards. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 Miran Grca. + * Copyright 2008-2019 Sarah Walker. + * Copyright 2016-2019 Miran Grca. */ #include #include diff --git a/src/video/vid_ega_render.c b/src/video/vid_ega_render.c index a9699dbf9..b2d5cb5c1 100644 --- a/src/video/vid_ega_render.c +++ b/src/video/vid_ega_render.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * EGA renderers. + * EGA renderers. * * * - * Author: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 Miran Grca. + * Copyright 2008-2019 Sarah Walker. + * Copyright 2016-2019 Miran Grca. */ #include #include diff --git a/src/video/vid_et3000.c b/src/video/vid_et3000.c index 1d6288d9c..d107afe5c 100644 --- a/src/video/vid_et3000.c +++ b/src/video/vid_et3000.c @@ -1,16 +1,18 @@ /* - * 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. * - * Emulation of the Tseng Labs ET3000. + * Emulation of the Tseng Labs ET3000. * - * Authors: Miran Grca, * - * Copyright 2016-2018 Miran Grca. + * + * Authors: Miran Grca, + * + * Copyright 2016-2018 Miran Grca. */ #include #include diff --git a/src/video/vid_et4000.c b/src/video/vid_et4000.c index 5d0691514..4020c0523 100644 --- a/src/video/vid_et4000.c +++ b/src/video/vid_et4000.c @@ -13,9 +13,9 @@ * Authors: Fred N. van Kempen, * Miran Grca, * GreatPsycho, - * Sarah Walker, + * Sarah Walker, * - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2018 Fred N. van Kempen. * Copyright 2016-2018 Miran Grca. * Copyright 2008-2018 Sarah Walker. * diff --git a/src/video/vid_et4000w32.c b/src/video/vid_et4000w32.c index eb604f4ea..2f6e6497c 100644 --- a/src/video/vid_et4000w32.c +++ b/src/video/vid_et4000w32.c @@ -12,7 +12,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2019 Sarah Walker. diff --git a/src/video/vid_f82c425.c b/src/video/vid_f82c425.c index 3fea0c1bd..15f4ce496 100644 --- a/src/video/vid_f82c425.c +++ b/src/video/vid_f82c425.c @@ -1,36 +1,36 @@ /* - * 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. * - * Chips & Technologies 82C425 display controller emulation, - * with support for 640x200 LCD and SMARTMAP text contrast - * enhancement. + * Chips & Technologies 82C425 display controller emulation, + * with support for 640x200 LCD and SMARTMAP text contrast + * enhancement. * - * Relevant literature: + * Relevant literature: * - * [1] Chips and Technologies, Inc., 82C425 CGA LCD/CRT Controller, - * Data Sheet, Revision No. 2.2, September 1991. - * + * [1] Chips and Technologies, Inc., 82C425 CGA LCD/CRT Controller, + * Data Sheet, Revision No. 2.2, September 1991. + * * - * [2] Pleva et al., COLOR TO MONOCHROME CONVERSION, - * U.S. Patent 4,977,398, Dec. 11, 1990. - * + * [2] Pleva et al., COLOR TO MONOCHROME CONVERSION, + * U.S. Patent 4,977,398, Dec. 11, 1990. + * * - * Based on Toshiba T1000 plasma display emulation code. + * Based on Toshiba T1000 plasma display emulation code. * - * Authors: Fred N. van Kempen, - * Miran Grca, - * Sarah Walker, - * Lubomir Rintel, + * Authors: Fred N. van Kempen, + * Miran Grca, + * Sarah Walker, + * Lubomir Rintel, * - * Copyright 2018,2019 Fred N. van Kempen. - * Copyright 2018,2019 Miran Grca. - * Copyright 2018,2019 Sarah Walker. - * Copyright 2021 Lubomir Rintel. + * Copyright 2018-2019 Fred N. van Kempen. + * Copyright 2018-2019 Miran Grca. + * Copyright 2018-2019 Sarah Walker. + * Copyright 2021 Lubomir Rintel. * * 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 diff --git a/src/video/vid_genius.c b/src/video/vid_genius.c index 5c13e3415..cbf4eabfe 100644 --- a/src/video/vid_genius.c +++ b/src/video/vid_genius.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * MDSI Genius VHR emulation. + * MDSI Genius VHR emulation. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 Miran Grca. + * Copyright 2008-2019 Sarah Walker. + * Copyright 2016-2019 Miran Grca. */ #include #include diff --git a/src/video/vid_hercules.c b/src/video/vid_hercules.c index 550f05338..5920ff27d 100644 --- a/src/video/vid_hercules.c +++ b/src/video/vid_hercules.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Hercules emulation. + * Hercules emulation. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 Miran Grca. + * Copyright 2008-2019 Sarah Walker. + * Copyright 2016-2019 Miran Grca. */ #include #include diff --git a/src/video/vid_herculesplus.c b/src/video/vid_herculesplus.c index ea569cd3e..6561f9429 100644 --- a/src/video/vid_herculesplus.c +++ b/src/video/vid_herculesplus.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Hercules Plus emulation. + * Hercules Plus emulation. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2018 Sarah Walker. - * Copyright 2016-2018 Miran Grca. + * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. */ #include #include diff --git a/src/video/vid_ht216.c b/src/video/vid_ht216.c index 72d101e2b..255a9e8b8 100644 --- a/src/video/vid_ht216.c +++ b/src/video/vid_ht216.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Video 7 VGA 1024i emulation. + * Video 7 VGA 1024i emulation. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2019 Sarah Walker. - * Copyright 2019 Miran Grca. + * Copyright 2019 Sarah Walker. + * Copyright 2019 Miran Grca. */ #include #include diff --git a/src/video/vid_ibm_rgb528_ramdac.c b/src/video/vid_ibm_rgb528_ramdac.c index 2f050e7c7..adfc6ea39 100644 --- a/src/video/vid_ibm_rgb528_ramdac.c +++ b/src/video/vid_ibm_rgb528_ramdac.c @@ -1,18 +1,18 @@ /* - * 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. * - * Emulation of the IBM RGB 528 true colour RAMDAC. + * Emulation of the IBM RGB 528 true colour RAMDAC. * * * - * Authors: Miran Grca, + * Authors: Miran Grca, * - * Copyright 2020 Miran Grca. + * Copyright 2020 Miran Grca. */ #include #include diff --git a/src/video/vid_icd2061.c b/src/video/vid_icd2061.c index 85740144c..3fafb65d9 100644 --- a/src/video/vid_icd2061.c +++ b/src/video/vid_icd2061.c @@ -1,24 +1,24 @@ /* - * 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. * - * ICD2061 clock generator emulation. - * Also emulates the ICS9161 which is the same as the ICD2016, - * but without the need for tuning (which is irrelevant in - * emulation anyway). + * ICD2061 clock generator emulation. + * Also emulates the ICS9161 which is the same as the ICD2016, + * but without the need for tuning (which is irrelevant in + * emulation anyway). * - * Used by ET4000w32/p (Diamond Stealth 32) and the S3 - * Vision964 family. + * Used by ET4000w32/p (Diamond Stealth 32) and the S3 + * Vision964 family. * * * - * Authors: Miran Grca, + * Authors: Miran Grca, * - * Copyright 2016-2018 Miran Grca. + * Copyright 2016-2018 Miran Grca. */ #include #include diff --git a/src/video/vid_ics2494.c b/src/video/vid_ics2494.c index d3a40cc8b..8bb4b0cb8 100644 --- a/src/video/vid_ics2494.c +++ b/src/video/vid_ics2494.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * ICS2494 clock generator emulation. + * ICS2494 clock generator emulation. * - * Used by the AMI S3 924. + * Used by the AMI S3 924. * * * - * Authors: Miran Grca, + * Authors: Miran Grca, * - * Copyright 2020 Miran Grca. + * Copyright 2020 Miran Grca. */ #include #include diff --git a/src/video/vid_ics2595.c b/src/video/vid_ics2595.c index 77c46b6c3..10fc5ba39 100644 --- a/src/video/vid_ics2595.c +++ b/src/video/vid_ics2595.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * ICS2595 clock chip emulation. Used by ATI Mach64. + * ICS2595 clock chip emulation. Used by ATI Mach64. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2018 Sarah Walker. - * Copyright 2016-2018 Miran Grca. + * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. */ #include #include diff --git a/src/video/vid_im1024.c b/src/video/vid_im1024.c index 9e08ce583..12d884127 100644 --- a/src/video/vid_im1024.c +++ b/src/video/vid_im1024.c @@ -1,50 +1,50 @@ /* - * 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. * - * Emulation of the ImageManager 1024 video controller. + * Emulation of the ImageManager 1024 video controller. * - * Just enough of the Vermont Microsystems IM-1024 is implemented - * to support the Windows 1.03 driver. Functions are partially - * implemented or hardwired to the behavior expected by the - * Windows driver. + * Just enough of the Vermont Microsystems IM-1024 is implemented + * to support the Windows 1.03 driver. Functions are partially + * implemented or hardwired to the behavior expected by the + * Windows driver. * - * One major difference seems to be that in hex mode, coordinates - * are passed as 2-byte integer words rather than 4-byte - * fixed-point fractions. + * One major difference seems to be that in hex mode, coordinates + * are passed as 2-byte integer words rather than 4-byte + * fixed-point fractions. * - * It is unknown what triggers this, so for now it's always on. + * It is unknown what triggers this, so for now it's always on. * - * As well as the usual PGC ring buffer at 0xC6000, the IM1024 - * appears to have an alternate method of passing commands. This - * is enabled by setting 0xC6330 to 1, and then: + * As well as the usual PGC ring buffer at 0xC6000, the IM1024 + * appears to have an alternate method of passing commands. This + * is enabled by setting 0xC6330 to 1, and then: * - * CX = count to write - * SI -> bytes to write + * CX = count to write + * SI -> bytes to write * - * Set pending bytes to 0 - * Read [C6331]. This gives number of bytes that can be written: - * 0xFF => 0, 0xFE => 1, 0xFD => 2 etc. - * Write that number of bytes to C6000. - * If there are more to come, go back to reading [C6331]. + * Set pending bytes to 0 + * Read [C6331]. This gives number of bytes that can be written: + * 0xFF => 0, 0xFE => 1, 0xFD => 2 etc. + * Write that number of bytes to C6000. + * If there are more to come, go back to reading [C6331]. * - * As far as can be determined, at least one byte is always - * written; there is no provision to pause if the queue is full. + * As far as can be determined, at least one byte is always + * written; there is no provision to pause if the queue is full. * - * This is implemented by holding a FIFO of unlimited depth in - * the IM1024 to receive the data. + * This is implemented by holding a FIFO of unlimited depth in + * the IM1024 to receive the data. * * * - * Authors: Fred N. van Kempen, - * John Elliott, + * Authors: Fred N. van Kempen, + * John Elliott, * - * Copyright 2019 Fred N. van Kempen. - * Copyright 2019 John Elliott. + * Copyright 2019 Fred N. van Kempen. + * Copyright 2019 John Elliott. */ #include #include diff --git a/src/video/vid_incolor.c b/src/video/vid_incolor.c index 6bf98ab86..68673c061 100644 --- a/src/video/vid_incolor.c +++ b/src/video/vid_incolor.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Hercules InColor emulation. + * Hercules InColor emulation. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2018 Sarah Walker. - * Copyright 2016-2018 Miran Grca. + * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. */ #include #include diff --git a/src/video/vid_mda.c b/src/video/vid_mda.c index 5ace70058..57e91637c 100644 --- a/src/video/vid_mda.c +++ b/src/video/vid_mda.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * MDA emulation. + * MDA emulation. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 Miran Grca. + * Copyright 2008-2019 Sarah Walker. + * Copyright 2016-2019 Miran Grca. */ #include #include diff --git a/src/video/vid_mga.c b/src/video/vid_mga.c index 6da9a7c0f..ef7a2b366 100644 --- a/src/video/vid_mga.c +++ b/src/video/vid_mga.c @@ -1,17 +1,18 @@ /* - * 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. * - * Matrox MGA graphics card emulation. + * Matrox MGA graphics card emulation. * * * - * Author: Sarah Walker, - * Copyright 2008-2020 Sarah Walker. + * Authors: Sarah Walker, + * + * Copyright 2008-2020 Sarah Walker. */ #include #include diff --git a/src/video/vid_nga.c b/src/video/vid_nga.c index 86173f198..e2e8fdc9c 100644 --- a/src/video/vid_nga.c +++ b/src/video/vid_nga.c @@ -1,24 +1,24 @@ /* - * 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. * - * Emulation of the NCR NGA (K511, K201) video cards. + * Emulation of the NCR NGA (K511, K201) video cards. * * * - * Authors: Sarah Walker, - * Miran Grca, - * Fred N. van Kempen, - * EngiNerd, + * Authors: Sarah Walker, + * Miran Grca, + * Fred N. van Kempen, + * EngiNerd, * - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 Miran Grca. - * Copyright 2017-2019 Fred N. van Kempen. - * Copyright 2020 EngiNerd. + * Copyright 2008-2019 Sarah Walker. + * Copyright 2016-2019 Miran Grca. + * Copyright 2017-2019 Fred N. van Kempen. + * Copyright 2020 EngiNerd. */ #include diff --git a/src/video/vid_oak_oti.c b/src/video/vid_oak_oti.c index 742bbafb0..cc07dc0a4 100644 --- a/src/video/vid_oak_oti.c +++ b/src/video/vid_oak_oti.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Oak OTI037C/67/077 emulation. + * Oak OTI037C/67/077 emulation. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2018 Sarah Walker. - * Copyright 2016-2018 Miran Grca. + * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. */ #include #include diff --git a/src/video/vid_ogc.c b/src/video/vid_ogc.c index eddc6da8d..38d993216 100644 --- a/src/video/vid_ogc.c +++ b/src/video/vid_ogc.c @@ -1,25 +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. + * 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. * - * Emulation of the Olivetti OGC 8-bit ISA (GO708) and - * M21/M24/M28 16-bit bus (GO317/318/380/709) video cards. + * Emulation of the Olivetti OGC 8-bit ISA (GO708) and + * M21/M24/M28 16-bit bus (GO317/318/380/709) video cards. * * * - * Authors: Sarah Walker, - * Miran Grca, - * Fred N. van Kempen, - * EngiNerd, + * Authors: Sarah Walker, + * Miran Grca, + * Fred N. van Kempen, + * EngiNerd, * - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 Miran Grca. - * Copyright 2017-2019 Fred N. van Kempen. - * Copyright 2020 EngiNerd. + * Copyright 2008-2019 Sarah Walker. + * Copyright 2016-2019 Miran Grca. + * Copyright 2017-2019 Fred N. van Kempen. + * Copyright 2020 EngiNerd. */ #include diff --git a/src/video/vid_paradise.c b/src/video/vid_paradise.c index 3d82d459a..f2ec8aeb2 100644 --- a/src/video/vid_paradise.c +++ b/src/video/vid_paradise.c @@ -1,22 +1,22 @@ /* - * 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. * - * Paradise VGA emulation - * PC2086, PC3086 use PVGA1A - * MegaPC uses W90C11A + * Paradise VGA emulation + * PC2086, PC3086 use PVGA1A + * MegaPC uses W90C11A * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 Miran Grca. + * Copyright 2008-2019 Sarah Walker. + * Copyright 2016-2019 Miran Grca. */ #include #include diff --git a/src/video/vid_pgc.c b/src/video/vid_pgc.c index eb28540fc..74a20145c 100644 --- a/src/video/vid_pgc.c +++ b/src/video/vid_pgc.c @@ -1,56 +1,56 @@ /* - * 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. * - * This implements just enough of the Professional Graphics - * Controller to act as a basis for the Vermont Microsystems - * IM-1024. + * This implements just enough of the Professional Graphics + * Controller to act as a basis for the Vermont Microsystems + * IM-1024. * - * PGC features implemented include: - * > The CGA-compatible display modes - * > Switching to and from native mode - * > Communicating with the host PC + * PGC features implemented include: + * > The CGA-compatible display modes + * > Switching to and from native mode + * > Communicating with the host PC * - * Numerous features are implemented partially or not at all, - * such as: - * > 2D drawing - * > 3D drawing - * > Command lists - * Some of these are marked TODO. + * Numerous features are implemented partially or not at all, + * such as: + * > 2D drawing + * > 3D drawing + * > Command lists + * Some of these are marked TODO. * - * The PGC has two display modes: CGA (in which it appears in - * the normal CGA memory and I/O ranges) and native (in which - * all functions are accessed through reads and writes to 1K - * of memory at 0xC6000). + * The PGC has two display modes: CGA (in which it appears in + * the normal CGA memory and I/O ranges) and native (in which + * all functions are accessed through reads and writes to 1K + * of memory at 0xC6000). * - * The PGC's 8088 processor monitors this buffer and executes - * instructions left there for it. We simulate this behavior - * with a separate thread. + * The PGC's 8088 processor monitors this buffer and executes + * instructions left there for it. We simulate this behavior + * with a separate thread. * - * **NOTE** This driver is not finished yet: + * **NOTE** This driver is not finished yet: * - * - cursor will blink at very high speed if used on a machine - * with clock greater than 4.77MHz. We should "scale down" - * this speed, to become relative to a 4.77MHz-based system. + * - cursor will blink at very high speed if used on a machine + * with clock greater than 4.77MHz. We should "scale down" + * this speed, to become relative to a 4.77MHz-based system. * - * - pgc_plot() should be overloaded by clones if they support - * modes other than WRITE and INVERT, like the IM-1024. + * - pgc_plot() should be overloaded by clones if they support + * modes other than WRITE and INVERT, like the IM-1024. * - * - test it with the Windows 1.x driver? + * - test it with the Windows 1.x driver? * - * This is expected to be done shortly. + * This is expected to be done shortly. * * * - * Authors: Fred N. van Kempen, - * John Elliott, + * Authors: Fred N. van Kempen, + * John Elliott, * - * Copyright 2019 Fred N. van Kempen. - * Copyright 2019 John Elliott. + * Copyright 2019 Fred N. van Kempen. + * Copyright 2019 John Elliott. * * 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 diff --git a/src/video/vid_rtg310x.c b/src/video/vid_rtg310x.c index 10f97cf4f..6f317426b 100644 --- a/src/video/vid_rtg310x.c +++ b/src/video/vid_rtg310x.c @@ -1,18 +1,18 @@ /* - * 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. * - * Emulation of the Realtek RTG series of VGA ISA chips. + * Emulation of the Realtek RTG series of VGA ISA chips. * * * - * Authors: TheCollector1995, + * Authors: TheCollector1995, * - * Copyright 2021 TheCollector1995. + * Copyright 2021 TheCollector1995. */ #include #include diff --git a/src/video/vid_s3.c b/src/video/vid_s3.c index b17f0e50b..e6630a6c3 100644 --- a/src/video/vid_s3.c +++ b/src/video/vid_s3.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2019 Sarah Walker. diff --git a/src/video/vid_s3_virge.c b/src/video/vid_s3_virge.c index 99661d309..376abb68c 100644 --- a/src/video/vid_s3_virge.c +++ b/src/video/vid_s3_virge.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * S3 ViRGE emulation. + * S3 ViRGE emulation. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2018 Sarah Walker. - * Copyright 2016-2018 Miran Grca. + * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. */ #include #include diff --git a/src/video/vid_sc1148x_ramdac.c b/src/video/vid_sc1148x_ramdac.c index 936ff308d..873f66e92 100644 --- a/src/video/vid_sc1148x_ramdac.c +++ b/src/video/vid_sc1148x_ramdac.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Emulation of Sierra SC1148x RAMDACs and clones (e.g.: Winbond). + * Emulation of Sierra SC1148x RAMDACs and clones (e.g.: Winbond). * - * Used by the S3 911 and 924 chips. + * Used by the S3 911 and 924 chips. * * * - * Authors: TheCollector1995, + * Authors: TheCollector1995, * - * Copyright 2020 TheCollector1995. + * Copyright 2020 TheCollector1995. */ #include #include diff --git a/src/video/vid_sc1502x_ramdac.c b/src/video/vid_sc1502x_ramdac.c index 202091449..3a3b3a863 100644 --- a/src/video/vid_sc1502x_ramdac.c +++ b/src/video/vid_sc1502x_ramdac.c @@ -1,22 +1,22 @@ /* - * 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. * - * Emulation of a Sierra SC1502X RAMDAC. + * Emulation of a Sierra SC1502X RAMDAC. * - * Used by the TLIVESA1 driver for ET4000. + * Used by the TLIVESA1 driver for ET4000. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2018 Sarah Walker. - * Copyright 2016-2018 Miran Grca. + * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. */ #include #include diff --git a/src/video/vid_sdac_ramdac.c b/src/video/vid_sdac_ramdac.c index 58d6b164c..45fe714ec 100644 --- a/src/video/vid_sdac_ramdac.c +++ b/src/video/vid_sdac_ramdac.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * 87C716 'SDAC' true colour RAMDAC emulation. + * 87C716 'SDAC' true colour RAMDAC emulation. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 Miran Grca. + * Copyright 2008-2019 Sarah Walker. + * Copyright 2016-2019 Miran Grca. */ #include #include diff --git a/src/video/vid_sigma.c b/src/video/vid_sigma.c index d8fa55ce3..0e1833b1e 100644 --- a/src/video/vid_sigma.c +++ b/src/video/vid_sigma.c @@ -1,18 +1,18 @@ /* - * 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. * - * Sigma Color 400 emulation. + * Sigma Color 400 emulation. * * * - * Authors: John Elliott, + * Authors: John Elliott, * - * Copyright 2018 John Elliott. + * Copyright 2018 John Elliott. */ #include #include diff --git a/src/video/vid_stg_ramdac.c b/src/video/vid_stg_ramdac.c index 161cf1177..78a477acb 100644 --- a/src/video/vid_stg_ramdac.c +++ b/src/video/vid_stg_ramdac.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * STG1702 true colour RAMDAC emulation. + * STG1702 true colour RAMDAC emulation. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2018 Sarah Walker. - * Copyright 2016-2018 Miran Grca. + * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. */ #include #include diff --git a/src/video/vid_svga.c b/src/video/vid_svga.c index 21d0b50ee..0d493a59e 100644 --- a/src/video/vid_svga.c +++ b/src/video/vid_svga.c @@ -13,7 +13,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2019 Sarah Walker. diff --git a/src/video/vid_svga_render.c b/src/video/vid_svga_render.c index c67a46e0d..ca843ac74 100644 --- a/src/video/vid_svga_render.c +++ b/src/video/vid_svga_render.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * SVGA renderers. + * SVGA renderers. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 Miran Grca. + * Copyright 2008-2019 Sarah Walker. + * Copyright 2016-2019 Miran Grca. */ #include #include diff --git a/src/video/vid_tgui9440.c b/src/video/vid_tgui9440.c index dd39daf8e..f2475888b 100644 --- a/src/video/vid_tgui9440.c +++ b/src/video/vid_tgui9440.c @@ -1,59 +1,59 @@ /* - * 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. * - * Trident TGUI9400CXi and TGUI9440 emulation. + * Trident TGUI9400CXi and TGUI9440 emulation. * - * TGUI9400CXi has extended write modes, controlled by extended - * GDC registers : + * TGUI9400CXi has extended write modes, controlled by extended + * GDC registers : * - * GDC[0x10] - Control - * bit 0 - pixel width (1 = 16 bit, 0 = 8 bit) - * bit 1 - mono->colour expansion (1 = enabled, - * 0 = disabled) - * bit 2 - mono->colour expansion transparency - * (1 = transparent, 0 = opaque) - * bit 3 - extended latch copy - * GDC[0x11] - Background colour (low byte) - * GDC[0x12] - Background colour (high byte) - * GDC[0x14] - Foreground colour (low byte) - * GDC[0x15] - Foreground colour (high byte) - * GDC[0x17] - Write mask (low byte) - * GDC[0x18] - Write mask (high byte) + * GDC[0x10] - Control + * bit 0 - pixel width (1 = 16 bit, 0 = 8 bit) + * bit 1 - mono->colour expansion (1 = enabled, + * 0 = disabled) + * bit 2 - mono->colour expansion transparency + * (1 = transparent, 0 = opaque) + * bit 3 - extended latch copy + * GDC[0x11] - Background colour (low byte) + * GDC[0x12] - Background colour (high byte) + * GDC[0x14] - Foreground colour (low byte) + * GDC[0x15] - Foreground colour (high byte) + * GDC[0x17] - Write mask (low byte) + * GDC[0x18] - Write mask (high byte) * - * Mono->colour expansion will expand written data 8:1 to 8/16 - * consecutive bytes. - * MSB is processed first. On word writes, low byte is processed - * first. 1 bits write foreground colour, 0 bits write background - * colour unless transparency is enabled. - * If the relevant bit is clear in the write mask then the data - * is not written. + * Mono->colour expansion will expand written data 8:1 to 8/16 + * consecutive bytes. + * MSB is processed first. On word writes, low byte is processed + * first. 1 bits write foreground colour, 0 bits write background + * colour unless transparency is enabled. + * If the relevant bit is clear in the write mask then the data + * is not written. * - * With 16-bit pixel width, each bit still expands to one byte, - * so the TGUI driver doubles up monochrome data. + * With 16-bit pixel width, each bit still expands to one byte, + * so the TGUI driver doubles up monochrome data. * - * While there is room in the register map for three byte colours, - * I don't believe 24-bit colour is supported. The TGUI9440 - * blitter has the same limitation. + * While there is room in the register map for three byte colours, + * I don't believe 24-bit colour is supported. The TGUI9440 + * blitter has the same limitation. * - * I don't think double word writes are supported. + * I don't think double word writes are supported. * - * Extended latch copy uses an internal 16 byte latch. Reads load - * the latch, writing writes out 16 bytes. I don't think the - * access size or host data has any affect, but the Windows 3.1 - * driver always reads bytes and write words of 0xffff. + * Extended latch copy uses an internal 16 byte latch. Reads load + * the latch, writing writes out 16 bytes. I don't think the + * access size or host data has any affect, but the Windows 3.1 + * driver always reads bytes and write words of 0xffff. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 Miran Grca. + * Copyright 2008-2019 Sarah Walker. + * Copyright 2016-2019 Miran Grca. */ #include #include diff --git a/src/video/vid_ti_cf62011.c b/src/video/vid_ti_cf62011.c index 417f85861..f804a6dde 100644 --- a/src/video/vid_ti_cf62011.c +++ b/src/video/vid_ti_cf62011.c @@ -1,56 +1,56 @@ /* - * 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. * - * Emulation of the TI CF62011 SVGA chip. + * Emulation of the TI CF62011 SVGA chip. * - * This chip was used in several of IBM's later machines, such - * as the PS/1 Model 2121, and a number of PS/2 models. As noted - * in an article on Usenet: + * This chip was used in several of IBM's later machines, such + * as the PS/1 Model 2121, and a number of PS/2 models. As noted + * in an article on Usenet: * - * "In the early 90s IBM looked for some cheap VGA card to - * substitute the (relatively) expensive XGA-2 adapter for - * *servers*, where the primary purpose is supervision of the - * machine rather than real *work* with it in Hi-Res. It was - * just to supply a base video, where a XGA-2 were a waste of - * potential. They had a contract with TI for some DSPs in - * multimedia already (the MWave for instance is based on - * TI-DSPs as well as many Thinkpad internal chipsets) and TI - * offered them a rather cheap – and inexpensive – chipset - * and combined it with a cheap clock oscillator and an Inmos - * RAMDAC. That chipset was already pretty much outdated at - * that time but IBM decided it would suffice for that low - * end purpose. + * "In the early 90s IBM looked for some cheap VGA card to + * substitute the (relatively) expensive XGA-2 adapter for + * *servers*, where the primary purpose is supervision of the + * machine rather than real *work* with it in Hi-Res. It was + * just to supply a base video, where a XGA-2 were a waste of + * potential. They had a contract with TI for some DSPs in + * multimedia already (the MWave for instance is based on + * TI-DSPs as well as many Thinkpad internal chipsets) and TI + * offered them a rather cheap – and inexpensive – chipset + * and combined it with a cheap clock oscillator and an Inmos + * RAMDAC. That chipset was already pretty much outdated at + * that time but IBM decided it would suffice for that low + * end purpose. * - * Driver support was given under DOS and OS/2 only for base - * functions like selection of the vertical refresh and few - * different modes only. Not even the Win 3.x support has - * been finalized. Technically the adapter could do better - * than VGA, but its video BIOS is largely undocumented and - * intentionally crippled down to a few functions." + * Driver support was given under DOS and OS/2 only for base + * functions like selection of the vertical refresh and few + * different modes only. Not even the Win 3.x support has + * been finalized. Technically the adapter could do better + * than VGA, but its video BIOS is largely undocumented and + * intentionally crippled down to a few functions." * - * This chip is reportedly the same one as used in the MCA - * IBM SVGA Adapter/A (ID 090EEh), which mostly had faster - * VRAM and RAMDAC. The VESA DOS graphics driver for that - * card can be used: m95svga.exe + * This chip is reportedly the same one as used in the MCA + * IBM SVGA Adapter/A (ID 090EEh), which mostly had faster + * VRAM and RAMDAC. The VESA DOS graphics driver for that + * card can be used: m95svga.exe * - * The controller responds at ports in the range 0x2100-0x210F, - * which are the same as the XGA. It supports up to 1MB of VRAM, - * but we lock it down to 512K. The PS/1 2122 had 256K. + * The controller responds at ports in the range 0x2100-0x210F, + * which are the same as the XGA. It supports up to 1MB of VRAM, + * but we lock it down to 512K. The PS/1 2122 had 256K. * * * - * Authors: Sarah Walker, - * Miran Grca, - * Fred N. van Kempen, + * Authors: Sarah Walker, + * Miran Grca, + * Fred N. van Kempen, * - * Copyright 2008-2018 Sarah Walker. - * Copyright 2016-2018 Miran Grca. - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. + * Copyright 2017-2018 Fred N. van Kempen. */ #include #include diff --git a/src/video/vid_tkd8001_ramdac.c b/src/video/vid_tkd8001_ramdac.c index 225c91c4b..66c2ca922 100644 --- a/src/video/vid_tkd8001_ramdac.c +++ b/src/video/vid_tkd8001_ramdac.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Trident TKD8001 RAMDAC emulation. + * Trident TKD8001 RAMDAC emulation. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2018 Sarah Walker. - * Copyright 2016-2018 Miran Grca. + * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. */ #include #include diff --git a/src/video/vid_tvga.c b/src/video/vid_tvga.c index ed249f618..384770ba4 100644 --- a/src/video/vid_tvga.c +++ b/src/video/vid_tvga.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Trident TVGA (8900D) emulation. + * Trident TVGA (8900D) emulation. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2018 Sarah Walker. - * Copyright 2016-2018 Miran Grca. + * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. */ #include #include diff --git a/src/video/vid_tvp3026_ramdac.c b/src/video/vid_tvp3026_ramdac.c index cde953b01..2ea60d520 100644 --- a/src/video/vid_tvp3026_ramdac.c +++ b/src/video/vid_tvp3026_ramdac.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Emulation of the Texas Instruments TVP3026 true colour RAMDAC - * family. + * Emulation of the Texas Instruments TVP3026 true colour RAMDAC + * family. * * - * TODO: Clock and other parts. + * TODO: Clock and other parts. * - * Authors: TheCollector1995, + * Authors: TheCollector1995, * - * Copyright 2021 TheCollector1995. + * Copyright 2021 TheCollector1995. */ #include #include diff --git a/src/video/vid_vga.c b/src/video/vid_vga.c index e581f237c..ac26c2b5d 100644 --- a/src/video/vid_vga.c +++ b/src/video/vid_vga.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * IBM VGA emulation. + * IBM VGA emulation. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2018 Sarah Walker. - * Copyright 2016-2018 Miran Grca. + * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. */ #include #include diff --git a/src/video/vid_voodoo.c b/src/video/vid_voodoo.c index 326ff9879..cb5491c03 100644 --- a/src/video/vid_voodoo.c +++ b/src/video/vid_voodoo.c @@ -1,19 +1,19 @@ /* - * 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. * - * Voodoo Graphics, 2, Banshee, 3 emulation. + * Voodoo Graphics, 2, Banshee, 3 emulation. * * * - * Authors: Sarah Walker, - * leilei + * Authors: Sarah Walker, + * leilei * - * Copyright 2008-2020 Sarah Walker. + * Copyright 2008-2020 Sarah Walker. */ #include #include diff --git a/src/video/vid_voodoo_banshee.c b/src/video/vid_voodoo_banshee.c index 386ac8575..f1c1347fe 100644 --- a/src/video/vid_voodoo_banshee.c +++ b/src/video/vid_voodoo_banshee.c @@ -1,18 +1,18 @@ /* - * 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. * - * Voodoo Banshee and 3 specific emulation. + * Voodoo Banshee and 3 specific emulation. * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * - * Copyright 2008-2020 Sarah Walker. + * Copyright 2008-2020 Sarah Walker. */ #include #include diff --git a/src/video/vid_voodoo_blitter.c b/src/video/vid_voodoo_blitter.c index 00847554a..f60d9e184 100644 --- a/src/video/vid_voodoo_blitter.c +++ b/src/video/vid_voodoo_blitter.c @@ -1,18 +1,18 @@ /* - * 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. * - * 3DFX Voodoo emulation. + * 3DFX Voodoo emulation. * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * - * Copyright 2008-2020 Sarah Walker. + * Copyright 2008-2020 Sarah Walker. */ #include #include diff --git a/src/video/vid_voodoo_display.c b/src/video/vid_voodoo_display.c index 40e0b2ce9..68be3b26d 100644 --- a/src/video/vid_voodoo_display.c +++ b/src/video/vid_voodoo_display.c @@ -1,18 +1,18 @@ /* - * 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. * - * 3DFX Voodoo emulation. + * 3DFX Voodoo emulation. * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * - * Copyright 2008-2020 Sarah Walker. + * Copyright 2008-2020 Sarah Walker. */ #include #include diff --git a/src/video/vid_voodoo_fb.c b/src/video/vid_voodoo_fb.c index 705c16853..f4a4edca6 100644 --- a/src/video/vid_voodoo_fb.c +++ b/src/video/vid_voodoo_fb.c @@ -1,18 +1,18 @@ /* - * 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. * - * 3DFX Voodoo emulation. + * 3DFX Voodoo emulation. * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * - * Copyright 2008-2020 Sarah Walker. + * Copyright 2008-2020 Sarah Walker. */ #include #include diff --git a/src/video/vid_voodoo_fifo.c b/src/video/vid_voodoo_fifo.c index d90c12bb5..646e5876c 100644 --- a/src/video/vid_voodoo_fifo.c +++ b/src/video/vid_voodoo_fifo.c @@ -1,18 +1,18 @@ /* - * 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. * - * 3DFX Voodoo emulation. + * 3DFX Voodoo emulation. * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * - * Copyright 2008-2020 Sarah Walker. + * Copyright 2008-2020 Sarah Walker. */ #include #include diff --git a/src/video/vid_voodoo_reg.c b/src/video/vid_voodoo_reg.c index 3d5580d04..51b9568b8 100644 --- a/src/video/vid_voodoo_reg.c +++ b/src/video/vid_voodoo_reg.c @@ -1,18 +1,18 @@ /* - * 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. * - * 3DFX Voodoo emulation. + * 3DFX Voodoo emulation. * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * - * Copyright 2008-2020 Sarah Walker. + * Copyright 2008-2020 Sarah Walker. */ #include #include diff --git a/src/video/vid_voodoo_render.c b/src/video/vid_voodoo_render.c index ec16b3a32..4b09cfadb 100644 --- a/src/video/vid_voodoo_render.c +++ b/src/video/vid_voodoo_render.c @@ -1,18 +1,18 @@ /* - * 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. * - * 3DFX Voodoo emulation. + * 3DFX Voodoo emulation. * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * - * Copyright 2008-2020 Sarah Walker. + * Copyright 2008-2020 Sarah Walker. */ #include #include diff --git a/src/video/vid_voodoo_setup.c b/src/video/vid_voodoo_setup.c index f98ddb450..40018ddf8 100644 --- a/src/video/vid_voodoo_setup.c +++ b/src/video/vid_voodoo_setup.c @@ -1,18 +1,18 @@ /* - * 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. * - * 3DFX Voodoo emulation. + * 3DFX Voodoo emulation. * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * - * Copyright 2008-2020 Sarah Walker. + * Copyright 2008-2020 Sarah Walker. */ #include #include diff --git a/src/video/vid_voodoo_texture.c b/src/video/vid_voodoo_texture.c index 9d1149c65..4f81f6d00 100644 --- a/src/video/vid_voodoo_texture.c +++ b/src/video/vid_voodoo_texture.c @@ -1,18 +1,18 @@ /* - * 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. * - * 3DFX Voodoo emulation. + * 3DFX Voodoo emulation. * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * - * Copyright 2008-2020 Sarah Walker. + * Copyright 2008-2020 Sarah Walker. */ #include #include diff --git a/src/video/vid_wy700.c b/src/video/vid_wy700.c index e492523db..1a4babb99 100644 --- a/src/video/vid_wy700.c +++ b/src/video/vid_wy700.c @@ -1,20 +1,20 @@ /* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. + * 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. * - * Wyse-700 emulation. + * Wyse-700 emulation. * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2018 Sarah Walker. - * Copyright 2016-2018 Miran Grca. + * Copyright 2008-2018 Sarah Walker. + * Copyright 2016-2018 Miran Grca. */ #include #include diff --git a/src/video/video.c b/src/video/video.c index 096ea89e1..d0e9ebb2c 100644 --- a/src/video/video.c +++ b/src/video/video.c @@ -1,52 +1,52 @@ /* - * 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. * - * Main video-rendering module. + * Main video-rendering module. * - * Video timing settings - + * Video timing settings - * - * 8-bit - 1mb/sec - * B = 8 ISA clocks - * W = 16 ISA clocks - * L = 32 ISA clocks + * 8-bit - 1mb/sec + * B = 8 ISA clocks + * W = 16 ISA clocks + * L = 32 ISA clocks * - * Slow 16-bit - 2mb/sec - * B = 6 ISA clocks - * W = 8 ISA clocks - * L = 16 ISA clocks + * Slow 16-bit - 2mb/sec + * B = 6 ISA clocks + * W = 8 ISA clocks + * L = 16 ISA clocks * - * Fast 16-bit - 4mb/sec - * B = 3 ISA clocks - * W = 3 ISA clocks - * L = 6 ISA clocks + * Fast 16-bit - 4mb/sec + * B = 3 ISA clocks + * W = 3 ISA clocks + * L = 6 ISA clocks * - * Slow VLB/PCI - 8mb/sec (ish) - * B = 4 bus clocks - * W = 8 bus clocks - * L = 16 bus clocks + * Slow VLB/PCI - 8mb/sec (ish) + * B = 4 bus clocks + * W = 8 bus clocks + * L = 16 bus clocks * - * Mid VLB/PCI - - * B = 4 bus clocks - * W = 5 bus clocks - * L = 10 bus clocks + * Mid VLB/PCI - + * B = 4 bus clocks + * W = 5 bus clocks + * L = 10 bus clocks * - * Fast VLB/PCI - - * B = 3 bus clocks - * W = 3 bus clocks - * L = 4 bus clocks + * Fast VLB/PCI - + * B = 3 bus clocks + * W = 3 bus clocks + * L = 4 bus clocks * * * - * Authors: Sarah Walker, - * Miran Grca, + * Authors: Sarah Walker, + * Miran Grca, * - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 Miran Grca. + * Copyright 2008-2019 Sarah Walker. + * Copyright 2016-2019 Miran Grca. */ #include #define PNG_DEBUG 0 diff --git a/src/win/glad.c b/src/win/glad.c index f3ceb1148..7c282ebee 100644 --- a/src/win/glad.c +++ b/src/win/glad.c @@ -1,6 +1,6 @@ /* - OpenGL loader generated by glad 0.1.34 on Sat Dec 4 18:46:02 2021. + OpenGL loader generated by glad 0.1.36 on Sat Jan 7 18:24:33 2023. Language/Generator: C/C++ Specification: gl @@ -21,10 +21,10 @@ https://glad.dav1d.de/#profile=core&language=c&specification=gl&loader=on&api=gl%3D3.0&extensions=GL_ARB_buffer_storage&extensions=GL_ARB_debug_output&extensions=GL_ARB_sync */ -#include #include #include #include +#include static void *get_proc(const char *namez); diff --git a/src/win/win.c b/src/win/win.c index 3d46054a6..3dd41fca9 100644 --- a/src/win/win.c +++ b/src/win/win.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/win/win_cdrom.c b/src/win/win_cdrom.c index 00195bcda..bfd62383a 100644 --- a/src/win/win_cdrom.c +++ b/src/win/win_cdrom.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/src/win/win_devconf.c b/src/win/win_devconf.c index c867dab9f..5a833d5e5 100644 --- a/src/win/win_devconf.c +++ b/src/win/win_devconf.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2018 Sarah Walker. diff --git a/src/win/win_icon.c b/src/win/win_icon.c index d23a325ff..64acc44b0 100644 --- a/src/win/win_icon.c +++ b/src/win/win_icon.c @@ -9,6 +9,7 @@ * Implement the application's icon changing system. * * + * * Authors: Laci bá' * * Copyright 2021 Laci bá'. diff --git a/src/win/win_joystick.cpp b/src/win/win_joystick.cpp index ab9a2907e..42ab8bd69 100644 --- a/src/win/win_joystick.cpp +++ b/src/win/win_joystick.cpp @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * * Copyright 2008-2019 Sarah Walker. diff --git a/src/win/win_joystick_rawinput.c b/src/win/win_joystick_rawinput.c index efaf76f01..2976a54b9 100644 --- a/src/win/win_joystick_rawinput.c +++ b/src/win/win_joystick_rawinput.c @@ -8,7 +8,9 @@ * * RawInput joystick interface. * - * Authors: Sarah Walker, + * + * + * Authors: Sarah Walker, * Miran Grca, * GH Cao, * diff --git a/src/win/win_joystick_xinput.c b/src/win/win_joystick_xinput.c index caf8f3452..2f98e5241 100644 --- a/src/win/win_joystick_xinput.c +++ b/src/win/win_joystick_xinput.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * GH Cao, * diff --git a/src/win/win_mouse.c b/src/win/win_mouse.c index 4490328a9..1a914aa9b 100644 --- a/src/win/win_mouse.c +++ b/src/win/win_mouse.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * GH Cao, * diff --git a/src/win/win_opengl.c b/src/win/win_opengl.c index d9a492927..586632aaa 100644 --- a/src/win/win_opengl.c +++ b/src/win/win_opengl.c @@ -15,6 +15,8 @@ * (UI) options * More error handling * + * + * * Authors: Teemu Korhonen * * Copyright 2021 Teemu Korhonen @@ -63,7 +65,7 @@ typedef LONG atomic_flag; static const int INIT_WIDTH = 640; static const int INIT_HEIGHT = 400; -static const int BUFFERPIXELS = 4194304; /* Same size as render_buffer, pow(2048+64,2). */ +static const int BUFFERPIXELS = 4194304; /* Same size as render_buffer, pow(2048 + 64, 2). */ static const int BUFFERBYTES = 16777216; /* Pixel is 4 bytes. */ static const int BUFFERCOUNT = 3; /* How many buffers to use for pixel transfer (2-3 is commonly recommended). */ static const int ROW_LENGTH = 2048; /* Source buffer row lenght (including padding) */ diff --git a/src/win/win_opengl_glslp.c b/src/win/win_opengl_glslp.c index c3d40a56e..47cc755dc 100644 --- a/src/win/win_opengl_glslp.c +++ b/src/win/win_opengl_glslp.c @@ -11,6 +11,8 @@ * * TODO: Read .glslp files for multipass shaders and settings. * + * + * * Authors: Teemu Korhonen * * Copyright 2021 Teemu Korhonen diff --git a/src/win/win_settings.c b/src/win/win_settings.c index d6e0c0693..40501c77c 100644 --- a/src/win/win_settings.c +++ b/src/win/win_settings.c @@ -14,7 +14,7 @@ * David Hrdlička, * * Copyright 2016-2019 Miran Grca. - * Copyright 2018,2019 David Hrdlička. + * Copyright 2018-2019 David Hrdlička. * Copyright 2021 Laci bá' * Copyright 2021-2022 Jasmine Iwanek. */ @@ -1103,7 +1103,7 @@ win_settings_video_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) settings_enable_window(hdlg, IDC_CONFIGURE_VID, video_card_has_config(e)); // Secondary Video Card - c = 0; + c = d = 0; settings_reset_content(hdlg, IDC_COMBO_VIDEO_2); while (1) { @@ -1118,12 +1118,17 @@ win_settings_video_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) if (!device_name[0]) break; + if ((c > 1) && (video_card_get_flags(c) == video_card_get_flags(temp_gfxcard))) { + c++; + continue; + } + if (video_card_available(c) && device_is_valid(video_card_getdevice(c), temp_machine)) { if (c == 0) // "None" settings_add_string(hdlg, IDC_COMBO_VIDEO_2, win_get_string(IDS_2104)); else if (c == 1) // "Internal" settings_add_string(hdlg, IDC_COMBO_VIDEO_2, win_get_string(IDS_2119)); - else if (video_card_get_flags(c) != video_card_get_flags(gfxcard)) + else settings_add_string(hdlg, IDC_COMBO_VIDEO_2, (LPARAM) device_name); settings_list_to_device[1][d] = c; if ((c == 0) || (c == temp_gfxcard_2)) @@ -1158,6 +1163,49 @@ win_settings_video_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) case IDC_COMBO_VIDEO: temp_gfxcard = settings_list_to_device[0][settings_get_cur_sel(hdlg, IDC_COMBO_VIDEO)]; settings_enable_window(hdlg, IDC_CONFIGURE_VID, video_card_has_config(temp_gfxcard)); + + // Secondary Video Card + c = d = 0; + settings_reset_content(hdlg, IDC_COMBO_VIDEO_2); + + while (1) { + /* Skip "internal" if machine doesn't have it. */ + if ((c == 1) && !machine_has_flags(temp_machine, MACHINE_VIDEO)) { + c++; + continue; + } + + generate_device_name(video_card_getdevice(c), video_get_internal_name(c), 1); + + if (!device_name[0]) + break; + + if ((c > 1) && (video_card_get_flags(c) == video_card_get_flags(temp_gfxcard))) { + c++; + continue; + } + + if (video_card_available(c) && device_is_valid(video_card_getdevice(c), temp_machine)) { + if (c == 0) // "None" + settings_add_string(hdlg, IDC_COMBO_VIDEO_2, win_get_string(IDS_2104)); + else if (c == 1) // "Internal" + settings_add_string(hdlg, IDC_COMBO_VIDEO_2, win_get_string(IDS_2119)); + else + settings_add_string(hdlg, IDC_COMBO_VIDEO_2, (LPARAM) device_name); + settings_list_to_device[1][d] = c; + if ((c == 0) || (c == temp_gfxcard_2)) + settings_set_cur_sel(hdlg, IDC_COMBO_VIDEO_2, d); + d++; + } + + c++; + + settings_process_messages(); + } + + settings_enable_window(hdlg, IDC_COMBO_VIDEO_2, !machine_has_flags(temp_machine, MACHINE_VIDEO_ONLY)); + e = settings_list_to_device[1][settings_get_cur_sel(hdlg, IDC_COMBO_VIDEO_2)]; + settings_enable_window(hdlg, IDC_CONFIGURE_VID_2, video_card_has_config(e)); break; case IDC_COMBO_VIDEO_2: @@ -1184,11 +1232,10 @@ win_settings_video_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) break; case IDC_BUTTON_XGA: - if (machine_has_bus(temp_machine, MACHINE_BUS_MCA) > 0) { + if (machine_has_bus(temp_machine, MACHINE_BUS_MCA) > 0) temp_deviceconfig |= deviceconfig_open(hdlg, (void *) &xga_device); - } else { + else temp_deviceconfig |= deviceconfig_open(hdlg, (void *) &xga_isa_device); - } break; case IDC_CONFIGURE_VID: diff --git a/src/win/win_thread.c b/src/win/win_thread.c index 97ea3a56c..c110779f2 100644 --- a/src/win/win_thread.c +++ b/src/win/win_thread.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Fred N. van Kempen, * * Copyright 2008-2018 Sarah Walker. diff --git a/src/win/win_ui.c b/src/win/win_ui.c index 38d7e161c..6107c0609 100644 --- a/src/win/win_ui.c +++ b/src/win/win_ui.c @@ -10,7 +10,7 @@ * * * - * Authors: Sarah Walker, + * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, * diff --git a/vcpkg.json b/vcpkg.json index 46ab6bff3..c9fd8eceb 100644 --- a/vcpkg.json +++ b/vcpkg.json @@ -2,7 +2,7 @@ "name": "86box", "version-string": "3.11", "homepage": "https://86box.net/", - "documentation": "http://86box.readthedocs.io/", + "documentation": "https://86box.readthedocs.io/", "license": "GPL-2.0-or-later", "dependencies": [ "freetype", From f9bc675a62102b5b6b4617bba97490a0ef2850fb Mon Sep 17 00:00:00 2001 From: TC1995 Date: Sun, 8 Jan 2023 14:32:58 +0100 Subject: [PATCH 138/285] Git, so, stop the pull/push errors, anyway, fix compile again. --- src/cdrom/cdrom_mitsumi.c | 89 +++++++++++++++++++++------------------ 1 file changed, 49 insertions(+), 40 deletions(-) diff --git a/src/cdrom/cdrom_mitsumi.c b/src/cdrom/cdrom_mitsumi.c index a6ad860b3..64433535f 100644 --- a/src/cdrom/cdrom_mitsumi.c +++ b/src/cdrom/cdrom_mitsumi.c @@ -1,18 +1,18 @@ /* - * 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. * - * Mitsumi CD-ROM emulation for the ISA bus. + * Mitsumi CD-ROM emulation for the ISA bus. * * * - * Authors: Miran Grca, + * Author: Miran Grca, * - * Copyright 2022 Miran Grca. + * Copyright 2022 Miran Grca. */ #include #include @@ -28,6 +28,7 @@ #include <86box/pic.h> #include <86box/dma.h> #include <86box/cdrom.h> +#include <86box/cdrom_interface.h> #include <86box/cdrom_mitsumi.h> #include <86box/plat.h> #include <86box/sound.h> @@ -109,6 +110,7 @@ typedef struct { int drvmode; int cur_toc_track; int pos; + int newstat; } mcd_t; /* The addresses sent from the guest are absolute, ie. a LBA of 0 corresponds to a MSF of 00:00:00. Otherwise, the counter displayed by the guest is wrong: @@ -141,9 +143,9 @@ mitsumi_cdrom_log(const char *fmt, ...) static void mitsumi_cdrom_reset(mcd_t *dev) { - cdrom_t *cdrom = &cdrom[0]; + cdrom_t cdrom; - dev->stat = cdrom->host_drive ? (STAT_READY | STAT_CHANGE) : 0; + dev->stat = cdrom.host_drive ? (STAT_READY | STAT_CHANGE) : 0; dev->cmdrd_count = 0; dev->cmdbuf_count = 0; dev->buf_count = 0; @@ -154,21 +156,19 @@ mitsumi_cdrom_reset(mcd_t *dev) dev->dmalen = COOKED_SECTOR_SIZE; dev->locked = 0; dev->change = 1; + dev->newstat = 1; dev->data = 0; } static int mitsumi_cdrom_read_sector(mcd_t *dev, int first) { - cdrom_t *cdrom = &cdrom[0]; + cdrom_t cdrom; uint8_t status; int ret; - if (cdrom == NULL) - return 0; - if (dev->drvmode == DRV_MODE_CDDA) { - status = cdrom_mitsumi_audio_play(cdrom, dev->readmsf, dev->readcount); + status = cdrom_mitsumi_audio_play(&cdrom, dev->readmsf, dev->readcount); if (status == 1) return status; else @@ -182,15 +182,15 @@ mitsumi_cdrom_read_sector(mcd_t *dev, int first) dev->data = 0; return 0; } - cdrom_stop(cdrom); - ret = cdrom_readsector_raw(cdrom, dev->buf, cdrom->seek_pos, 0, 2, 0x10, (int *) &dev->readcount); + cdrom_stop(&cdrom); + ret = cdrom_readsector_raw(&cdrom, dev->buf, cdrom.seek_pos, 0, 2, 0x10, (int *) &dev->readcount, 0); if (!ret) return 0; if (dev->mode & 0x40) { dev->buf[12] = CD_BCD((dev->readmsf >> 16) & 0xff); dev->buf[13] = CD_BCD((dev->readmsf >> 8) & 0xff); } - dev->readmsf = cdrom_lba_to_msf_accurate(cdrom->seek_pos + 1); + dev->readmsf = cdrom_lba_to_msf_accurate(cdrom.seek_pos + 1); dev->buf_count = dev->dmalen + 1; dev->buf_idx = 0; dev->data = 1; @@ -213,6 +213,7 @@ mitsumi_cdrom_in(uint16_t port, void *priv) mcd_t *dev = (mcd_t *) priv; uint8_t ret; + pclog("Mitsumi CD-ROM IN=%03x\n", port); switch (port & 1) { case 0: if (dev->cmdbuf_count) { @@ -225,16 +226,19 @@ mitsumi_cdrom_in(uint16_t port, void *priv) if (!dev->buf_count) mitsumi_cdrom_read_sector(dev, 0); + pclog("Read port 0: ret = %02x\n", ret); return ret; } + pclog("Read port 0: stat = %02x\n", dev->stat); return dev->stat; case 1: ret = 0; picintc(1 << dev->irq); if (!dev->buf_count || !dev->data || dev->enable_dma) ret |= FLAG_NODATA; - if (!dev->cmdbuf_count) + if (!dev->cmdbuf_count || !dev->newstat) ret |= FLAG_NOSTAT; + pclog("Read port 1: ret = %02x\n", ret | FLAG_UNK); return ret | FLAG_UNK; } @@ -245,8 +249,9 @@ static void mitsumi_cdrom_out(uint16_t port, uint8_t val, void *priv) { mcd_t *dev = (mcd_t *) priv; - cdrom_t *cdrom = &cdrom[0]; + cdrom_t cdrom; + pclog("Mitsumi CD-ROM OUT=%03x, val=%02x\n", port, val); switch (port & 1) { case 0: if (dev->cmdrd_count) { @@ -317,19 +322,19 @@ mitsumi_cdrom_out(uint16_t port, uint8_t val, void *priv) break; } if (!dev->cmdrd_count) - dev->stat = cdrom->host_drive ? (STAT_READY | (dev->change ? STAT_CHANGE : 0)) : 0; + dev->stat = cdrom.host_drive ? (STAT_READY | (dev->change ? STAT_CHANGE : 0)) : 0; return; } dev->cmd = val; dev->cmdbuf_idx = 0; dev->cmdrd_count = 0; dev->cmdbuf_count = 1; - dev->cmdbuf[0] = cdrom->host_drive ? (STAT_READY | (dev->change ? STAT_CHANGE : 0)) : 0; + dev->cmdbuf[0] = cdrom.host_drive ? (STAT_READY | (dev->change ? STAT_CHANGE : 0)) : 0; dev->data = 0; switch (val) { case CMD_GET_INFO: - if (cdrom->host_drive) { - cdrom_get_track_buffer(cdrom, &(dev->cmdbuf[1])); + if (cdrom.host_drive) { + cdrom_get_track_buffer(&cdrom, &(dev->cmdbuf[1])); dev->cmdbuf_count = 10; dev->readcount = 0; } else { @@ -338,8 +343,8 @@ mitsumi_cdrom_out(uint16_t port, uint8_t val, void *priv) } break; case CMD_GET_Q: - if (cdrom->host_drive) { - cdrom_get_q(cdrom, &(dev->cmdbuf[1]), &dev->cur_toc_track, dev->mode & MODE_GET_TOC); + if (cdrom.host_drive) { + cdrom_get_q(&cdrom, &(dev->cmdbuf[1]), &dev->cur_toc_track, dev->mode & MODE_GET_TOC); dev->cmdbuf_count = 11; dev->readcount = 0; } else { @@ -355,7 +360,7 @@ mitsumi_cdrom_out(uint16_t port, uint8_t val, void *priv) break; case CMD_STOPCDDA: case CMD_STOP: - cdrom_stop(cdrom); + cdrom_stop(&cdrom); dev->drvmode = DRV_MODE_STOP; dev->cur_toc_track = 0; break; @@ -364,7 +369,7 @@ mitsumi_cdrom_out(uint16_t port, uint8_t val, void *priv) break; case CMD_READ1X: case CMD_READ2X: - if (cdrom->host_drive) { + if (cdrom.host_drive) { dev->readcount = 0; dev->drvmode = (val == CMD_READ1X) ? DRV_MODE_CDDA : DRV_MODE_READ; dev->cmdrd_count = 6; @@ -380,13 +385,17 @@ mitsumi_cdrom_out(uint16_t port, uint8_t val, void *priv) dev->cmdbuf_count = 4; break; case CMD_EJECT: - cdrom_stop(cdrom); + cdrom_stop(&cdrom); cdrom_eject(0); dev->readcount = 0; break; case CMD_LOCK: dev->cmdrd_count = 1; break; + case CMD_SOFT_RESET: + pclog("Soft Reset\n"); + mitsumi_cdrom_reset(dev); + break; default: dev->cmdbuf[0] = dev->stat | STAT_CMD_CHECK; break; @@ -429,15 +438,15 @@ mitsumi_cdrom_close(void *priv) } const device_t mitsumi_cdrom_device = { - "Mitsumi CD-ROM interface", - "mcd", - DEVICE_ISA | DEVICE_AT, - 0, - mitsumi_cdrom_init, - mitsumi_cdrom_close, - NULL, - { NULL }, - NULL, - NULL, - NULL + .name = "Mitsumi CD-ROM interface", + .internal_name = "mcd", + .flags = DEVICE_ISA | DEVICE_AT, + .local = 1, + .init = mitsumi_cdrom_init, + .close = mitsumi_cdrom_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL }; From 112b60eb88e1f5819fdd84509fa1086e8553ccfc Mon Sep 17 00:00:00 2001 From: rueni97 <99608219+luennix@users.noreply.github.com> Date: Sun, 8 Jan 2023 19:04:40 +0300 Subject: [PATCH 139/285] Update ali1429.c --- src/chipset/ali1429.c | 300 +++++++++++++++++++++--------------------- 1 file changed, 152 insertions(+), 148 deletions(-) diff --git a/src/chipset/ali1429.c b/src/chipset/ali1429.c index 36ac2fdf9..500b1c6a0 100644 --- a/src/chipset/ali1429.c +++ b/src/chipset/ali1429.c @@ -1,23 +1,21 @@ /* - * 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. * - * Implementation of the ALi M1429 chipset. + * Implementation of the ALi M1429 chipset. * - * Note: This chipset has no datasheet, everything were done via - * reverse engineering the BIOS of various machines using it. + * Note: This chipset has no datasheet, everything were done via + * reverse engineering the BIOS of various machines using it. * + * Authors: Tiseno100, + * Miran Grca, * - * - * Authors: Tiseno100, - * Miran Grca, - * - * Copyright 2020-2021 Tiseno100. - * Copyright 2021-2021 Miran Grca. + * Copyright 2020,2021 Tiseno100. + * Copyright 2021,2021 Miran Grca. */ /* @@ -66,14 +64,15 @@ Register 20h: Bits 2-1-0: Bus Clock Speed 0 0 0: 7.1519Mhz (ATCLK2) - 0 0 1: CLK2IN/4 - 0 1 0: CLK2IN/5 - 0 1 1: CLK2IN/6 - 1 0 0: CLK2IN/8 - 1 0 1: CLK2IN/10 - 1 1 0: CLK2IN/12 + 0 0 1: CLK2IN/4 + 0 1 0: CLK2IN/5 + 0 1 1: CLK2IN/6 + 1 0 0: CLK2IN/8 + 1 0 1: CLK2IN/10 + 1 1 0: CLK2IN/12 */ + #include #include #include @@ -95,11 +94,13 @@ #include <86box/smram.h> #include <86box/chipset.h> -#define GREEN dev->is_g /* Is G Variant */ +#define GREEN dev->is_g /* Is G Variant */ + #ifdef ENABLE_ALI1429_LOG int ali1429_do_log = ENABLE_ALI1429_LOG; + static void ali1429_log(const char *fmt, ...) { @@ -112,25 +113,27 @@ ali1429_log(const char *fmt, ...) } } #else -# define ali1429_log(fmt, ...) +#define ali1429_log(fmt, ...) #endif + typedef struct { - uint8_t is_g, index, cfg_locked, reg_57h, - regs[90]; + uint8_t is_g, index, cfg_locked, reg_57h, + regs[90]; } ali1429_t; + static void ali1429_shadow_recalc(ali1429_t *dev) { uint32_t base, i, can_write, can_read; - shadowbios = (dev->regs[0x13] & 0x40) && (dev->regs[0x14] & 0x01); + shadowbios = (dev->regs[0x13] & 0x40) && (dev->regs[0x14] & 0x01); shadowbios_write = (dev->regs[0x13] & 0x40) && (dev->regs[0x14] & 0x02); can_write = (dev->regs[0x14] & 0x02) ? MEM_WRITE_INTERNAL : MEM_WRITE_EXTANY; - can_read = (dev->regs[0x14] & 0x01) ? MEM_READ_INTERNAL : MEM_READ_EXTANY; + can_read = (dev->regs[0x14] & 0x01) ? MEM_READ_INTERNAL : MEM_READ_EXTANY; for (i = 0; i < 8; i++) { base = 0xc0000 + (i << 15); @@ -144,149 +147,149 @@ ali1429_shadow_recalc(ali1429_t *dev) flushmmucache_nopc(); } + static void ali1429_write(uint16_t addr, uint8_t val, void *priv) { - ali1429_t *dev = (ali1429_t *) priv; + ali1429_t *dev = (ali1429_t *)priv; switch (addr) { - case 0x22: - dev->index = val; - break; + case 0x22: + dev->index = val; + break; - case 0x23: + case 0x23: #ifdef ENABLE_ALI1429_LOG - if (dev->index != 0x03) - ali1429_log("M1429: dev->regs[%02x] = %02x\n", dev->index, val); + if (dev->index != 0x03) + ali1429_log("M1429: dev->regs[%02x] = %02x\n", dev->index, val); #endif - if (dev->index == 0x03) - dev->cfg_locked = !(val == 0xc5); + if (dev->index == 0x03) + dev->cfg_locked = (val != 0xc5); - if (!dev->cfg_locked) { - /* Common M1429 Registers */ - switch (dev->index) { - case 0x10: - case 0x11: - dev->regs[dev->index] = val; - break; + if (!dev->cfg_locked) { + pclog("M1429: dev->regs[%02x] = %02x\n", dev->index, val); - case 0x12: - dev->regs[dev->index] = val; - if (val & 4) - mem_remap_top(128); - else - mem_remap_top(0); - break; + /* Common M1429 Registers */ + switch (dev->index) { + case 0x10: case 0x11: + dev->regs[dev->index] = val; + break; - case 0x13: - case 0x14: - dev->regs[dev->index] = val; - ali1429_shadow_recalc(dev); - break; + case 0x12: + dev->regs[dev->index] = val; + if(val & 4) + mem_remap_top(128); + else + mem_remap_top(0); + break; - case 0x15: - case 0x16: - case 0x17: - dev->regs[dev->index] = val; - break; + case 0x13: case 0x14: + dev->regs[dev->index] = val; + ali1429_shadow_recalc(dev); + break; - case 0x18: - dev->regs[dev->index] = (val & 0x8f) | 0x20; - cpu_cache_ext_enabled = !!(val & 2); - cpu_update_waitstates(); - break; + case 0x15: case 0x16: + case 0x17: + dev->regs[dev->index] = val; + break; - case 0x19: - case 0x1a: - case 0x1e: - dev->regs[dev->index] = val; - break; + case 0x18: + dev->regs[dev->index] = (val & 0x8f) | 0x20; + cpu_cache_ext_enabled = !!(val & 2); + cpu_update_waitstates(); + break; - case 0x20: - dev->regs[dev->index] = val; + case 0x19: case 0x1a: + case 0x1e: + dev->regs[dev->index] = val; + break; - switch (val & 7) { - case 0: - case 7: /* Illegal */ - cpu_set_isa_speed(7159091); - break; + case 0x20: + dev->regs[dev->index] = val; - case 1: - cpu_set_isa_speed(cpu_busspeed / 4); - break; + switch(val & 7) { + case 0: case 7: /* Illegal */ + cpu_set_isa_speed(7159091); + break; - case 2: - cpu_set_isa_speed(cpu_busspeed / 5); - break; + case 1: + cpu_set_isa_speed(cpu_busspeed / 4); + break; - case 3: - cpu_set_isa_speed(cpu_busspeed / 6); - break; + case 2: + cpu_set_isa_speed(cpu_busspeed / 5); + break; - case 4: - cpu_set_isa_speed(cpu_busspeed / 8); - break; + case 3: + cpu_set_isa_speed(cpu_busspeed / 6); + break; - case 5: - cpu_set_isa_speed(cpu_busspeed / 10); - break; + case 4: + cpu_set_isa_speed(cpu_busspeed / 8); + break; - case 6: - cpu_set_isa_speed(cpu_busspeed / 12); - break; - } - break; + case 5: + cpu_set_isa_speed(cpu_busspeed / 10); + break; - case 0x21 ... 0x27: - dev->regs[dev->index] = val; - break; - } + case 6: + cpu_set_isa_speed(cpu_busspeed / 12); + break; + } + break; - /* M1429G Only Registers */ - if (GREEN) { - switch (dev->index) { - case 0x30 ... 0x41: - case 0x43: - case 0x45: - case 0x4a: - dev->regs[dev->index] = val; - break; + case 0x21 ... 0x27: + dev->regs[dev->index] = val; + break; + } - case 0x57: - dev->reg_57h = val; - break; - } - } - } - break; + /* M1429G Only Registers */ + if (GREEN) { + switch (dev->index) { + case 0x30 ... 0x41: + case 0x43: case 0x45: + case 0x4a: + dev->regs[dev->index] = val; + break; + + case 0x57: + dev->reg_57h = val; + break; + } + } + } + break; } } + static uint8_t ali1429_read(uint16_t addr, void *priv) { - ali1429_t *dev = (ali1429_t *) priv; - uint8_t ret = 0xff; + ali1429_t *dev = (ali1429_t *)priv; + uint8_t ret = 0xff; if ((addr == 0x23) && (dev->index >= 0x10) && (dev->index <= 0x4a)) - ret = dev->regs[dev->index]; + ret = dev->regs[dev->index]; else if ((addr == 0x23) && (dev->index == 0x57)) - ret = dev->reg_57h; + ret = dev->reg_57h; else if (addr == 0x22) - ret = dev->index; + ret = dev->index; return ret; } + static void ali1429_close(void *priv) { - ali1429_t *dev = (ali1429_t *) priv; + ali1429_t *dev = (ali1429_t *)priv; free(dev); } + static void ali1429_defaults(ali1429_t *dev) { @@ -305,27 +308,28 @@ ali1429_defaults(ali1429_t *dev) /* M1429G Default Registers */ if (GREEN) { - dev->regs[0x31] = 0x88; - dev->regs[0x32] = 0xc0; - dev->regs[0x38] = 0xe5; - dev->regs[0x40] = 0xe3; - dev->regs[0x41] = 2; - dev->regs[0x45] = 0x80; + dev->regs[0x31] = 0x88; + dev->regs[0x32] = 0xc0; + dev->regs[0x38] = 0xe5; + dev->regs[0x40] = 0xe3; + dev->regs[0x41] = 2; + dev->regs[0x45] = 0x80; } } + static void * ali1429_init(const device_t *info) { - ali1429_t *dev = (ali1429_t *) malloc(sizeof(ali1429_t)); + ali1429_t *dev = (ali1429_t *)malloc(sizeof(ali1429_t)); memset(dev, 0, sizeof(ali1429_t)); dev->cfg_locked = 1; - GREEN = info->local; + GREEN = info->local; /* M1429 Ports: - 22h Index Port - 23h Data Port + 22h Index Port + 23h Data Port */ io_sethandler(0x0022, 0x0002, ali1429_read, NULL, NULL, ali1429_write, NULL, NULL, dev); @@ -337,29 +341,29 @@ ali1429_init(const device_t *info) } const device_t ali1429_device = { - .name = "ALi M1429", + .name = "ALi M1429", .internal_name = "ali1429", - .flags = 0, - .local = 0, - .init = ali1429_init, - .close = ali1429_close, - .reset = NULL, + .flags = 0, + .local = 0, + .init = ali1429_init, + .close = ali1429_close, + .reset = NULL, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; const device_t ali1429g_device = { - .name = "ALi M1429G", + .name = "ALi M1429G", .internal_name = "ali1429g", - .flags = 0, - .local = 1, - .init = ali1429_init, - .close = ali1429_close, - .reset = NULL, + .flags = 0, + .local = 1, + .init = ali1429_init, + .close = ali1429_close, + .reset = NULL, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; From 9b8182706e6b44d4ee0b79fa8bfe1f505e8722ed Mon Sep 17 00:00:00 2001 From: rueni97 <99608219+luennix@users.noreply.github.com> Date: Sun, 8 Jan 2023 19:05:00 +0300 Subject: [PATCH 140/285] Add files via upload --- src/chipset/ali1435.c | 323 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 323 insertions(+) create mode 100644 src/chipset/ali1435.c diff --git a/src/chipset/ali1435.c b/src/chipset/ali1435.c new file mode 100644 index 000000000..4497ad338 --- /dev/null +++ b/src/chipset/ali1435.c @@ -0,0 +1,323 @@ +/* + * 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. + * + * Emulation of ALi M1435 chipset that acts as both the + * southbridge. + * + * + * + * Authors: Miran Grca, + * + * Copyright 2020 Miran Grca. + */ +#include +#include +#include +#include +#include +#include +#define HAVE_STDARG_H +#include <86box/86box.h> +#include <86box/device.h> +#include <86box/io.h> +#include <86box/apm.h> +#include <86box/dma.h> +#include <86box/mem.h> +#include <86box/smram.h> +#include <86box/pci.h> +#include <86box/timer.h> +#include <86box/pic.h> +#include <86box/pit.h> +#include <86box/port_92.h> +#include <86box/hdc_ide.h> +#include <86box/hdc.h> +#include <86box/machine.h> +#include <86box/chipset.h> +#include <86box/spd.h> + + +#define MEM_STATE_SHADOW_R 0x01 +#define MEM_STATE_SHADOW_W 0x02 +#define MEM_STATE_SMRAM 0x04 + + +typedef struct +{ + uint8_t index, cfg_locked, + regs[16], pci_regs[256]; +} ali1435_t; + + +#define ENABLE_ALI1435_LOG 1 +#ifdef ENABLE_ALI1435_LOG +int ali1435_do_log = ENABLE_ALI1435_LOG; + + +static void +ali1435_log(const char *fmt, ...) +{ + va_list ap; + + if (ali1435_do_log) { + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); + } +} +#else +#define ali1435_log(fmt, ...) +#endif + + +/* NOTE: We cheat here. The real ALi M1435 uses a level to edge triggered IRQ converter + when the most siginificant bit is set. We work around that by manipulating the + emulated PIC's ELCR register. */ +static void +ali1435_update_irqs(ali1435_t *dev, int set) +{ + uint8_t val; + int i, reg; + int shift, irq; + int irq_map[8] = { -1, 5, 9, 10, 11, 12, 14, 15 }; + pic_t *temp_pic; + + for (i = 0; i < 4; i++) { + reg = 0x80 + (i >> 1); + shift = (i & 1) << 2; + val = (dev->pci_regs[reg] >> shift) & 0x0f; + irq = irq_map[val & 0x07]; + if (irq == -1) + continue; + temp_pic = (irq >= 8) ? &pic2 : &pic; + irq &= 7; + if (set && (val & 0x08)) + temp_pic->elcr |= (1 << irq); + else + temp_pic->elcr &= ~(1 << irq); + } +} + + +static void +ali1435_pci_write(int func, int addr, uint8_t val, void *priv) +{ + ali1435_t *dev = (ali1435_t *) priv; + int irq, irq_map[8] = { -1, 5, 9, 10, 11, 12, 14, 15 }; + + ali1435_log("ali1435_write(%02X, %02X, %02X)\n", func, addr, val); + + if (func > 0) + return; + + if ((addr < 0x04) || (addr == 0x06) || ((addr >= 0x08) && (addr <= 0x0b))) + return; + + if ((addr >= 0x0f) && (addr < 0x30)) + return; + + if ((addr >= 0x34) && (addr < 0x40)) + return; + + switch (addr) { + /* Dummy PCI Config */ + case 0x04: + dev->pci_regs[addr] = (val & 0x7f) | 0x07; + break; + + case 0x05: + dev->pci_regs[addr] = (val & 0x01); + break; + + /* Dummy PCI Status */ + case 0x07: + dev->pci_regs[addr] &= ~(val & 0xb8); + break; + + case 0x80: case 0x81: + dev->pci_regs[addr] = val; + ali1435_update_irqs(dev, 0); + irq = irq_map[val & 0x07]; + if (irq >= 0) { + ali1435_log("Set IRQ routing: INT %c -> %02X\n", 0x41 + ((addr & 0x01) << 1), irq); + pci_set_irq_routing(PCI_INTA + ((addr & 0x01) << 1), irq); + } else { + ali1435_log("Set IRQ routing: INT %c -> FF\n", 0x41 + ((addr & 0x01) << 1)); + pci_set_irq_routing(PCI_INTA + ((addr & 0x01) << 1), PCI_IRQ_DISABLED); + } + irq = irq_map[(val >> 4) & 0x07]; + if (irq >= 0) { + ali1435_log("Set IRQ routing: INT %c -> %02X\n", 0x42 + ((addr & 0x01) << 1), irq); + pci_set_irq_routing(PCI_INTB + ((addr & 0x01) << 1), irq); + } else { + ali1435_log("Set IRQ routing: INT %c -> FF\n", 0x42 + ((addr & 0x01) << 1)); + pci_set_irq_routing(PCI_INTB + ((addr & 0x01) << 1), PCI_IRQ_DISABLED); + } + ali1435_update_irqs(dev, 1); + break; + + default: + dev->pci_regs[addr] = val; + break; + } +} + + +static uint8_t +ali1435_pci_read(int func, int addr, void *priv) +{ + ali1435_t *dev = (ali1435_t *) priv; + uint8_t ret; + + ret = 0xff; + + if (func == 0) + ret = dev->pci_regs[addr]; + + ali1435_log("ali1435_read(%02X, %02X) = %02X\n", func, addr, ret); + + return ret; +} + + +static void +ali1435_write(uint16_t addr, uint8_t val, void *priv) +{ + ali1435_t *dev = (ali1435_t *)priv; + + switch (addr) { + case 0x22: + dev->index = val; + break; + + case 0x23: +/* #ifdef ENABLE_ALI1435_LOG + if (dev->index != 0x03) + ali1435_log("M1435: dev->regs[%02x] = %02x\n", dev->index, val); +#endif */ + + if (dev->index == 0x03) + dev->cfg_locked = (val != 0x69); + + if (!dev->cfg_locked) { + pclog("M1435: dev->regs[%02x] = %02x\n", dev->index, val); + + switch (dev->index) { + /* PCI Mechanism select? */ + case 0x00: + dev->regs[dev->index] = val; + pclog("PMC = %i\n", val != 0xc8); + pci_set_pmc(val != 0xc8); + break; + + /* ???? */ + case 0x06: + dev->regs[dev->index] = val; + break; + + /* ???? */ + case 0x07: + dev->regs[dev->index] = val; + break; + } + } + break; + } +} + + +static uint8_t +ali1435_read(uint16_t addr, void *priv) +{ + ali1435_t *dev = (ali1435_t *)priv; + uint8_t ret = 0xff; + + if ((addr == 0x23) && (dev->index < 0x10)) + ret = dev->regs[dev->index]; + else if (addr == 0x22) + ret = dev->index; + + return ret; +} + + +static void +ali1435_reset(void *priv) +{ + ali1435_t *dev = (ali1435_t *) priv; + + memset(dev->regs, 0, 16); + + dev->regs[0x00] = 0xff; + + pci_set_pmc(0); + + dev->cfg_locked = 1; + + memset(dev->pci_regs, 0, 256); + + dev->pci_regs[0x00] = 0x25; dev->pci_regs[0x01] = 0x10; /*ALi*/ + dev->pci_regs[0x02] = 0x35; dev->pci_regs[0x03] = 0x14; /*M1435*/ + dev->pci_regs[0x04] = 0x07; + dev->pci_regs[0x07] = 0x04; + dev->pci_regs[0x0b] = 0x06; + + dev->pci_regs[0x80] = 0x80; dev->pci_regs[0x81] = 0x00; + + pci_set_irq_routing(PCI_INTA, PCI_IRQ_DISABLED); + pci_set_irq_routing(PCI_INTB, PCI_IRQ_DISABLED); + pci_set_irq_routing(PCI_INTC, PCI_IRQ_DISABLED); + pci_set_irq_routing(PCI_INTD, PCI_IRQ_DISABLED); +} + + +static void +ali1435_close(void *p) +{ + ali1435_t *dev = (ali1435_t *)p; + + free(dev); +} + + +static void * +ali1435_init(const device_t *info) +{ + ali1435_t *dev = (ali1435_t *) malloc(sizeof(ali1435_t)); + memset(dev, 0, sizeof(ali1435_t)); + + dev->cfg_locked = 1; + + /* M1435 Ports: + 22h Index Port + 23h Data Port + */ + io_sethandler(0x0022, 0x0002, ali1435_read, NULL, NULL, ali1435_write, NULL, NULL, dev); + + pci_add_card(PCI_ADD_NORTHBRIDGE, ali1435_pci_read, ali1435_pci_write, dev); + + ali1435_reset(dev); + + /* pci_set_irq_level(PCI_INTA, 0); + pci_set_irq_level(PCI_INTB, 0); + pci_set_irq_level(PCI_INTC, 0); + pci_set_irq_level(PCI_INTD, 0); */ + + return dev; +} + +const device_t ali1435_device = { + .name = "Intel ALi M1435", + .internal_name = "ali1435", + .flags = DEVICE_PCI, + .local = 0x00, + .init = ali1435_init, + .close = ali1435_close, + .reset = ali1435_reset, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; From 42ceb4cfcc53f39d9db2faaca8dc96484693263a Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sun, 8 Jan 2023 15:25:28 -0500 Subject: [PATCH 141/285] Fix some bits which got lost in the last merge --- src/cdrom/cdrom_mitsumi.c | 16 ++++++++-------- src/scsi/scsi_ncr5380.c | 26 +++++++++++++------------- src/scsi/scsi_spock.c | 22 +++++++++++----------- 3 files changed, 32 insertions(+), 32 deletions(-) diff --git a/src/cdrom/cdrom_mitsumi.c b/src/cdrom/cdrom_mitsumi.c index 64433535f..eaddccef8 100644 --- a/src/cdrom/cdrom_mitsumi.c +++ b/src/cdrom/cdrom_mitsumi.c @@ -1,18 +1,18 @@ /* - * 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. * - * Mitsumi CD-ROM emulation for the ISA bus. + * Mitsumi CD-ROM emulation for the ISA bus. * * * - * Author: Miran Grca, + * Authors: Miran Grca, * - * Copyright 2022 Miran Grca. + * Copyright 2022 Miran Grca. */ #include #include diff --git a/src/scsi/scsi_ncr5380.c b/src/scsi/scsi_ncr5380.c index 54875963d..c01d0bf36 100644 --- a/src/scsi/scsi_ncr5380.c +++ b/src/scsi/scsi_ncr5380.c @@ -1,23 +1,23 @@ /* - * 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. * - * Implementation of the NCR 5380 series of SCSI Host Adapters - * made by NCR. These controllers were designed for the ISA bus. + * Implementation of the NCR 5380 series of SCSI Host Adapters + * made by NCR. These controllers were designed for the ISA bus. * * * - * Authors: Sarah Walker, - * TheCollector1995, - * Fred N. van Kempen, + * Authors: Sarah Walker, + * TheCollector1995, + * Fred N. van Kempen, * - * Copyright 2017-2019 Sarah Walker. - * Copyright 2017-2019 TheCollector1995. - * Copyright 2017-2019 Fred N. van Kempen. + * Copyright 2017-2019 Sarah Walker. + * Copyright 2017-2019 TheCollector1995. + * Copyright 2017-2019 Fred N. van Kempen. */ #include #include diff --git a/src/scsi/scsi_spock.c b/src/scsi/scsi_spock.c index 1223c21aa..0f618df95 100644 --- a/src/scsi/scsi_spock.c +++ b/src/scsi/scsi_spock.c @@ -1,21 +1,21 @@ /* - * 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. * - * Implementation of the IBM PS/2 SCSI controller with - * cache for MCA only. + * Implementation of the IBM PS/2 SCSI controller with + * cache for MCA only. * * * - * Authors: Sarah Walker, - * TheCollector1995, + * Authors: Sarah Walker, + * TheCollector1995, * - * Copyright 2020 Sarah Walker. - * Copyright 2020 TheCollector1995. + * Copyright 2020 Sarah Walker. + * Copyright 2020 TheCollector1995. */ #include #include From 4085e4c92824b487952731f851cb86f9f1d87968 Mon Sep 17 00:00:00 2001 From: luennix Date: Mon, 9 Jan 2023 16:31:36 +0300 Subject: [PATCH 142/285] PR for 86Box --- .../v1/query/client-MicrosoftVS/query.json | 1 + out/build/regular/CPackConfig.cmake | 69 +++++++++++ out/build/regular/CPackSourceConfig.cmake | 77 ++++++++++++ out/build/regular/VSInheritEnvironments.txt | 1 + src/chipset/CMakeLists.txt | 2 +- src/device/keyboard_at.c | 2 +- src/include/86box/chipset.h | 1 + src/include/86box/machine.h | 3 + src/include/86box/sio.h | 1 + src/machine/m_at_386dx_486.c | 91 ++++++++++++++ src/machine/machine_table.c | 111 ++++++++++++++++++ src/sio/sio_fdc37c6xx.c | 16 ++- 12 files changed, 372 insertions(+), 3 deletions(-) create mode 100644 out/build/regular/.cmake/api/v1/query/client-MicrosoftVS/query.json create mode 100644 out/build/regular/CPackConfig.cmake create mode 100644 out/build/regular/CPackSourceConfig.cmake create mode 100644 out/build/regular/VSInheritEnvironments.txt diff --git a/out/build/regular/.cmake/api/v1/query/client-MicrosoftVS/query.json b/out/build/regular/.cmake/api/v1/query/client-MicrosoftVS/query.json new file mode 100644 index 000000000..7d776af01 --- /dev/null +++ b/out/build/regular/.cmake/api/v1/query/client-MicrosoftVS/query.json @@ -0,0 +1 @@ +{"requests":[{"kind":"cache","version":2},{"kind":"cmakeFiles","version":1},{"kind":"codemodel","version":2},{"kind":"toolchains","version":1}]} \ No newline at end of file diff --git a/out/build/regular/CPackConfig.cmake b/out/build/regular/CPackConfig.cmake new file mode 100644 index 000000000..7dfc8fb33 --- /dev/null +++ b/out/build/regular/CPackConfig.cmake @@ -0,0 +1,69 @@ +# This file will be configured to contain variables for CPack. These variables +# should be set in the CMake list file of the project before CPack module is +# included. The list of available CPACK_xxx variables and their associated +# documentation may be obtained using +# cpack --help-variable-list +# +# Some variables are common to all generators (e.g. CPACK_PACKAGE_NAME) +# and some are specific to a generator +# (e.g. CPACK_NSIS_EXTRA_INSTALL_COMMANDS). The generator specific variables +# usually begin with CPACK__xxxx. + + +set(CPACK_BINARY_7Z "OFF") +set(CPACK_BINARY_IFW "OFF") +set(CPACK_BINARY_NSIS "ON") +set(CPACK_BINARY_NUGET "OFF") +set(CPACK_BINARY_WIX "OFF") +set(CPACK_BINARY_ZIP "OFF") +set(CPACK_BUILD_SOURCE_DIRS "C:/Users/rue/source/repos/86Box-luennix;C:/Users/rue/source/repos/86Box-luennix/out/build/regular") +set(CPACK_CMAKE_GENERATOR "Ninja") +set(CPACK_COMPONENTS_ALL "") +set(CPACK_COMPONENT_UNSPECIFIED_HIDDEN "TRUE") +set(CPACK_COMPONENT_UNSPECIFIED_REQUIRED "TRUE") +set(CPACK_DEFAULT_PACKAGE_DESCRIPTION_FILE "E:/Programs/Microsoft Visual Studio/2022/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/share/cmake-3.24/Templates/CPack.GenericDescription.txt") +set(CPACK_DEFAULT_PACKAGE_DESCRIPTION_SUMMARY "86Box built using CMake") +set(CPACK_GENERATOR "NSIS") +set(CPACK_INSTALL_CMAKE_PROJECTS "C:/Users/rue/source/repos/86Box-luennix/out/build/regular;86Box;ALL;/") +set(CPACK_INSTALL_PREFIX "C:/Program Files (x86)/86Box") +set(CPACK_MODULE_PATH "") +set(CPACK_NSIS_DISPLAY_NAME "86Box 3.11") +set(CPACK_NSIS_INSTALLER_ICON_CODE "") +set(CPACK_NSIS_INSTALLER_MUI_ICON_CODE "") +set(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES64") +set(CPACK_NSIS_PACKAGE_NAME "86Box 3.11") +set(CPACK_NSIS_UNINSTALL_NAME "Uninstall") +set(CPACK_OUTPUT_CONFIG_FILE "C:/Users/rue/source/repos/86Box-luennix/out/build/regular/CPackConfig.cmake") +set(CPACK_PACKAGE_DEFAULT_LOCATION "/") +set(CPACK_PACKAGE_DESCRIPTION_FILE "E:/Programs/Microsoft Visual Studio/2022/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/share/cmake-3.24/Templates/CPack.GenericDescription.txt") +set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Emulator of x86-based systems") +set(CPACK_PACKAGE_FILE_NAME "86Box-3.11-win64") +set(CPACK_PACKAGE_HOMEPAGE_URL "https://86box.net") +set(CPACK_PACKAGE_INSTALL_DIRECTORY "86Box 3.11") +set(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "86Box 3.11") +set(CPACK_PACKAGE_NAME "86Box") +set(CPACK_PACKAGE_RELOCATABLE "true") +set(CPACK_PACKAGE_VENDOR "Humanity") +set(CPACK_PACKAGE_VERSION "3.11") +set(CPACK_PACKAGE_VERSION_MAJOR "3") +set(CPACK_PACKAGE_VERSION_MINOR "11") +set(CPACK_RESOURCE_FILE_LICENSE "E:/Programs/Microsoft Visual Studio/2022/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/share/cmake-3.24/Templates/CPack.GenericLicense.txt") +set(CPACK_RESOURCE_FILE_README "E:/Programs/Microsoft Visual Studio/2022/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/share/cmake-3.24/Templates/CPack.GenericDescription.txt") +set(CPACK_RESOURCE_FILE_WELCOME "E:/Programs/Microsoft Visual Studio/2022/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/share/cmake-3.24/Templates/CPack.GenericWelcome.txt") +set(CPACK_SET_DESTDIR "OFF") +set(CPACK_SOURCE_7Z "ON") +set(CPACK_SOURCE_GENERATOR "7Z;ZIP") +set(CPACK_SOURCE_OUTPUT_CONFIG_FILE "C:/Users/rue/source/repos/86Box-luennix/out/build/regular/CPackSourceConfig.cmake") +set(CPACK_SOURCE_ZIP "ON") +set(CPACK_SYSTEM_NAME "win64") +set(CPACK_THREADS "1") +set(CPACK_TOPLEVEL_TAG "win64") +set(CPACK_WIX_SIZEOF_VOID_P "8") + +if(NOT CPACK_PROPERTIES_FILE) + set(CPACK_PROPERTIES_FILE "C:/Users/rue/source/repos/86Box-luennix/out/build/regular/CPackProperties.cmake") +endif() + +if(EXISTS ${CPACK_PROPERTIES_FILE}) + include(${CPACK_PROPERTIES_FILE}) +endif() diff --git a/out/build/regular/CPackSourceConfig.cmake b/out/build/regular/CPackSourceConfig.cmake new file mode 100644 index 000000000..eb8420f36 --- /dev/null +++ b/out/build/regular/CPackSourceConfig.cmake @@ -0,0 +1,77 @@ +# This file will be configured to contain variables for CPack. These variables +# should be set in the CMake list file of the project before CPack module is +# included. The list of available CPACK_xxx variables and their associated +# documentation may be obtained using +# cpack --help-variable-list +# +# Some variables are common to all generators (e.g. CPACK_PACKAGE_NAME) +# and some are specific to a generator +# (e.g. CPACK_NSIS_EXTRA_INSTALL_COMMANDS). The generator specific variables +# usually begin with CPACK__xxxx. + + +set(CPACK_BINARY_7Z "OFF") +set(CPACK_BINARY_IFW "OFF") +set(CPACK_BINARY_NSIS "ON") +set(CPACK_BINARY_NUGET "OFF") +set(CPACK_BINARY_WIX "OFF") +set(CPACK_BINARY_ZIP "OFF") +set(CPACK_BUILD_SOURCE_DIRS "C:/Users/rue/source/repos/86Box-luennix;C:/Users/rue/source/repos/86Box-luennix/out/build/regular") +set(CPACK_CMAKE_GENERATOR "Ninja") +set(CPACK_COMPONENTS_ALL "") +set(CPACK_COMPONENT_UNSPECIFIED_HIDDEN "TRUE") +set(CPACK_COMPONENT_UNSPECIFIED_REQUIRED "TRUE") +set(CPACK_DEFAULT_PACKAGE_DESCRIPTION_FILE "E:/Programs/Microsoft Visual Studio/2022/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/share/cmake-3.24/Templates/CPack.GenericDescription.txt") +set(CPACK_DEFAULT_PACKAGE_DESCRIPTION_SUMMARY "86Box built using CMake") +set(CPACK_GENERATOR "7Z;ZIP") +set(CPACK_IGNORE_FILES "/CVS/;/\\.svn/;/\\.bzr/;/\\.hg/;/\\.git/;\\.swp\$;\\.#;/#") +set(CPACK_INSTALLED_DIRECTORIES "C:/Users/rue/source/repos/86Box-luennix;/") +set(CPACK_INSTALL_CMAKE_PROJECTS "") +set(CPACK_INSTALL_PREFIX "C:/Program Files (x86)/86Box") +set(CPACK_MODULE_PATH "") +set(CPACK_NSIS_DISPLAY_NAME "86Box 3.11") +set(CPACK_NSIS_INSTALLER_ICON_CODE "") +set(CPACK_NSIS_INSTALLER_MUI_ICON_CODE "") +set(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES64") +set(CPACK_NSIS_PACKAGE_NAME "86Box 3.11") +set(CPACK_NSIS_UNINSTALL_NAME "Uninstall") +set(CPACK_OUTPUT_CONFIG_FILE "C:/Users/rue/source/repos/86Box-luennix/out/build/regular/CPackConfig.cmake") +set(CPACK_PACKAGE_DEFAULT_LOCATION "/") +set(CPACK_PACKAGE_DESCRIPTION_FILE "E:/Programs/Microsoft Visual Studio/2022/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/share/cmake-3.24/Templates/CPack.GenericDescription.txt") +set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Emulator of x86-based systems") +set(CPACK_PACKAGE_FILE_NAME "86Box-3.11-Source") +set(CPACK_PACKAGE_HOMEPAGE_URL "https://86box.net") +set(CPACK_PACKAGE_INSTALL_DIRECTORY "86Box 3.11") +set(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "86Box 3.11") +set(CPACK_PACKAGE_NAME "86Box") +set(CPACK_PACKAGE_RELOCATABLE "true") +set(CPACK_PACKAGE_VENDOR "Humanity") +set(CPACK_PACKAGE_VERSION "3.11") +set(CPACK_PACKAGE_VERSION_MAJOR "3") +set(CPACK_PACKAGE_VERSION_MINOR "11") +set(CPACK_RESOURCE_FILE_LICENSE "E:/Programs/Microsoft Visual Studio/2022/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/share/cmake-3.24/Templates/CPack.GenericLicense.txt") +set(CPACK_RESOURCE_FILE_README "E:/Programs/Microsoft Visual Studio/2022/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/share/cmake-3.24/Templates/CPack.GenericDescription.txt") +set(CPACK_RESOURCE_FILE_WELCOME "E:/Programs/Microsoft Visual Studio/2022/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/share/cmake-3.24/Templates/CPack.GenericWelcome.txt") +set(CPACK_RPM_PACKAGE_SOURCES "ON") +set(CPACK_SET_DESTDIR "OFF") +set(CPACK_SOURCE_7Z "ON") +set(CPACK_SOURCE_GENERATOR "7Z;ZIP") +set(CPACK_SOURCE_IGNORE_FILES "/CVS/;/\\.svn/;/\\.bzr/;/\\.hg/;/\\.git/;\\.swp\$;\\.#;/#") +set(CPACK_SOURCE_INSTALLED_DIRECTORIES "C:/Users/rue/source/repos/86Box-luennix;/") +set(CPACK_SOURCE_OUTPUT_CONFIG_FILE "C:/Users/rue/source/repos/86Box-luennix/out/build/regular/CPackSourceConfig.cmake") +set(CPACK_SOURCE_PACKAGE_FILE_NAME "86Box-3.11-Source") +set(CPACK_SOURCE_TOPLEVEL_TAG "win64-Source") +set(CPACK_SOURCE_ZIP "ON") +set(CPACK_STRIP_FILES "") +set(CPACK_SYSTEM_NAME "win64") +set(CPACK_THREADS "1") +set(CPACK_TOPLEVEL_TAG "win64-Source") +set(CPACK_WIX_SIZEOF_VOID_P "8") + +if(NOT CPACK_PROPERTIES_FILE) + set(CPACK_PROPERTIES_FILE "C:/Users/rue/source/repos/86Box-luennix/out/build/regular/CPackProperties.cmake") +endif() + +if(EXISTS ${CPACK_PROPERTIES_FILE}) + include(${CPACK_PROPERTIES_FILE}) +endif() diff --git a/out/build/regular/VSInheritEnvironments.txt b/out/build/regular/VSInheritEnvironments.txt new file mode 100644 index 000000000..f8cc9d8ac --- /dev/null +++ b/out/build/regular/VSInheritEnvironments.txt @@ -0,0 +1 @@ +msvc_x64_x64 \ No newline at end of file diff --git a/src/chipset/CMakeLists.txt b/src/chipset/CMakeLists.txt index d93f86219..0a6a5fbe5 100644 --- a/src/chipset/CMakeLists.txt +++ b/src/chipset/CMakeLists.txt @@ -13,7 +13,7 @@ # Copyright 2020-2021 David Hrdlička. # -add_library(chipset OBJECT 82c100.c acc2168.c cs8230.c ali1429.c ali1489.c ali1531.c ali1541.c ali1543.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 headland.c ims8848.c intel_82335.c contaq_82c59x.c cs4031.c intel_420ex.c intel_4x0.c intel_i450kx.c intel_sio.c intel_piix.c ../ioapic.c neat.c opti283.c opti291.c opti391.c opti495.c opti822.c opti895.c opti5x7.c scamp.c scat.c sis_85c310.c sis_85c4xx.c diff --git a/src/device/keyboard_at.c b/src/device/keyboard_at.c index 5b777eaf3..dc385c011 100644 --- a/src/device/keyboard_at.c +++ b/src/device/keyboard_at.c @@ -1947,7 +1947,7 @@ kbd_write(uint16_t port, uint8_t val, void *priv) val &= ~0x0c; val |= (dev->output_port & 0x0c); } - write_output(dev, val); + write_output(dev, val | 0x01); break; case 0xd2: /* write to keyboard output buffer */ diff --git a/src/include/86box/chipset.h b/src/include/86box/chipset.h index 0a3e988f6..9d6bd64cf 100644 --- a/src/include/86box/chipset.h +++ b/src/include/86box/chipset.h @@ -24,6 +24,7 @@ extern const device_t acc2168_device; extern const device_t ali1217_device; extern const device_t ali1429_device; extern const device_t ali1429g_device; +extern const device_t ali1435_device; extern const device_t ali1489_device; extern const device_t ali1531_device; extern const device_t ali1541_device; diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index 9137da5d3..4d5b535a8 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -513,6 +513,9 @@ extern int machine_at_atc1415_init(const machine_t *); extern int machine_at_actionpc2600_init(const machine_t *); extern int machine_at_m919_init(const machine_t *); extern int machine_at_spc7700plw_init(const machine_t *); +extern int machine_at_ms4134_init(const machine_t *); +extern int machine_at_tg486gp_init(const machine_t *); +extern int machine_at_tg486g_init(const machine_t *); /* m_at_commodore.c */ extern int machine_at_cmdpc_init(const machine_t *); diff --git a/src/include/86box/sio.h b/src/include/86box/sio.h index 09b5b1c40..8b95b55b5 100644 --- a/src/include/86box/sio.h +++ b/src/include/86box/sio.h @@ -29,6 +29,7 @@ extern const device_t fdc37c663_device; extern const device_t fdc37c663_ide_device; extern const device_t fdc37c665_device; extern const device_t fdc37c665_ide_device; +extern const device_t fdc37c665_ide_pri_device; extern const device_t fdc37c666_device; extern const device_t fdc37c67x_device; extern const device_t fdc37c669_device; diff --git a/src/machine/m_at_386dx_486.c b/src/machine/m_at_386dx_486.c index b9583f72e..036eac550 100644 --- a/src/machine/m_at_386dx_486.c +++ b/src/machine/m_at_386dx_486.c @@ -1719,3 +1719,94 @@ machine_at_spc7700plw_init(const machine_t *model) return ret; } + +int +machine_at_ms4134_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/ms4134/4alm001.bin", + 0x000e0000, 131072, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_ide_init(model); + + device_add(&ali1429g_device); + + device_add(&fdc37c665_ide_pri_device); + + pci_init(PCI_CAN_SWITCH_TYPE | PCI_ALWAYS_EXPOSE_DEV0); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + + pci_register_slot(0x0B, PCI_CARD_SCSI, 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(0x10, PCI_CARD_NORMAL, 1, 2, 3, 4); + + device_add(&ali1435_device); + device_add(&sst_flash_29ee010_device); + + device_add(&keyboard_ps2_ami_device); + + return ret; +} + +int +machine_at_tg486gp_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/tg486gp/tg486gp.bin", + 0x000e0000, 131072, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_ide_init(model); + + device_add(&ali1429g_device); + + device_add(&fdc37c665_ide_pri_device); + + pci_init(PCI_CAN_SWITCH_TYPE | PCI_ALWAYS_EXPOSE_DEV0); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + + pci_register_slot(0x0F, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x10, PCI_CARD_NORMAL, 1, 2, 3, 4); + + device_add(&ali1435_device); + device_add(&sst_flash_29ee010_device); + + device_add(&keyboard_ps2_ami_device); + + return ret; +} + +int +machine_at_tg486g_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/tg486g/tg486g.bin", + 0x000c0000, 262144, 0); + + if (bios_only || !ret) + return ret; + else { + mem_mapping_set_addr(&bios_mapping, 0x0c0000, 0x40000); + mem_mapping_set_exec(&bios_mapping, rom); + } + + machine_at_common_init(model); + device_add(&sis_85c471_device); + device_add(&ide_isa_device); + device_add(&fdc37c651_ide_device); + device_add(&keyboard_ps2_intel_ami_pci_device); + + return ret; +} diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index c2db92654..293aa6629 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -5765,8 +5765,119 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, + /* TriGem AMIBIOS Pre-Color with TriGem AMI 'Z' keyboard controller */ + { + .name = "[SiS 471] TriGem 486G", + .internal_name = "tg486g", + .type = MACHINE_TYPE_486_S3, + .chipset = MACHINE_CHIPSET_SIS_471, + .init = machine_at_tg486g_init, + .pad = 0, + .pad0 = 0, + .pad1 = MACHINE_AVAILABLE, + .pad2 = 0, + .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, + .ram = { + .min = 1024, + .max = 65536, + .step = 1024 + }, + .nvrmask = 127, + .kbc = KBC_UNKNOWN, + .kbc_p1 = 0, + .gpio = 0, + .device = NULL, + .vid_device = NULL, + .snd_device = NULL, + .net_device = NULL + }, /* 486 machines which utilize the PCI bus */ + /* Machine with ALi M1429G chipset and M1435 southbridge */ + { + .name = "[ALi M1429G] MSI MS-4134", + .internal_name = "ms4134", + .type = MACHINE_TYPE_486_S3, + .chipset = MACHINE_CHIPSET_ALI_M1429G, + .init = machine_at_ms4134_init, + .pad = 0, + .pad0 = 0, + .pad1 = MACHINE_AVAILABLE, + .pad2 = 0, + .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_PCIV, + .flags = MACHINE_IDE_DUAL, + .ram = { + .min = 1024, + .max = 131072, + .step = 1024 + }, + .nvrmask = 255, + .kbc = KBC_UNKNOWN, + .kbc_p1 = 0, + .gpio = 0, + .device = NULL, + .vid_device = NULL, + .snd_device = NULL, + .net_device = NULL + }, + /* TriGem machine with M1429G and PhoenixBIOS */ + { + .name = "[ALi M1429G] TriGem 486GP", + .internal_name = "tg486gp", + .type = MACHINE_TYPE_486_S3, + .chipset = MACHINE_CHIPSET_ALI_M1429G, + .init = machine_at_tg486gp_init, + .pad = 0, + .pad0 = 0, + .pad1 = MACHINE_AVAILABLE, + .pad2 = 0, + .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_PCIV, + .flags = MACHINE_IDE_DUAL, + .ram = { + .min = 1024, + .max = 131072, + .step = 1024 + }, + .nvrmask = 255, + .kbc = KBC_UNKNOWN, + .kbc_p1 = 0, + .gpio = 0, + .device = NULL, + .vid_device = NULL, + .snd_device = NULL, + .net_device = NULL + }, /* This has an AMIKey-2, which is an updated version of type 'H'. */ { .name = "[ALi M1489] AAEON SBC-490", diff --git a/src/sio/sio_fdc37c6xx.c b/src/sio/sio_fdc37c6xx.c index f9c911402..8400ca1e0 100644 --- a/src/sio/sio_fdc37c6xx.c +++ b/src/sio/sio_fdc37c6xx.c @@ -216,7 +216,7 @@ static uint8_t fdc37c6xx_read(uint16_t port, void *priv) { fdc37c6xx_t *dev = (fdc37c6xx_t *) priv; - uint8_t ret = 0x00; + uint8_t ret = 0xff; if (dev->tries == 2) { if (port == 0x3f1) @@ -437,6 +437,20 @@ const device_t fdc37c665_ide_device = { .config = NULL }; +const device_t fdc37c665_ide_pri_device = { + .name = "SMC FDC37C665 Super I/O (With Primary IDE)", + .internal_name = "fdc37c665_ide_pri", + .flags = 0, + .local = 0x165, + .init = fdc37c6xx_init, + .close = fdc37c6xx_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + const device_t fdc37c666_device = { .name = "SMC FDC37C666 Super I/O", .internal_name = "fdc37c666", From de67e4a085bfa34db5dd01b69c8d35d732a720af Mon Sep 17 00:00:00 2001 From: rueni97 <99608219+luennix@users.noreply.github.com> Date: Mon, 9 Jan 2023 17:07:38 +0300 Subject: [PATCH 143/285] Delete query.json --- .../regular/.cmake/api/v1/query/client-MicrosoftVS/query.json | 1 - 1 file changed, 1 deletion(-) delete mode 100644 out/build/regular/.cmake/api/v1/query/client-MicrosoftVS/query.json diff --git a/out/build/regular/.cmake/api/v1/query/client-MicrosoftVS/query.json b/out/build/regular/.cmake/api/v1/query/client-MicrosoftVS/query.json deleted file mode 100644 index 7d776af01..000000000 --- a/out/build/regular/.cmake/api/v1/query/client-MicrosoftVS/query.json +++ /dev/null @@ -1 +0,0 @@ -{"requests":[{"kind":"cache","version":2},{"kind":"cmakeFiles","version":1},{"kind":"codemodel","version":2},{"kind":"toolchains","version":1}]} \ No newline at end of file From d4e13d4ee33c689289bf32524dc911a7fb9e15eb Mon Sep 17 00:00:00 2001 From: rueni97 <99608219+luennix@users.noreply.github.com> Date: Mon, 9 Jan 2023 17:08:08 +0300 Subject: [PATCH 144/285] Delete CPackConfig.cmake --- out/build/regular/CPackConfig.cmake | 69 ----------------------------- 1 file changed, 69 deletions(-) delete mode 100644 out/build/regular/CPackConfig.cmake diff --git a/out/build/regular/CPackConfig.cmake b/out/build/regular/CPackConfig.cmake deleted file mode 100644 index 7dfc8fb33..000000000 --- a/out/build/regular/CPackConfig.cmake +++ /dev/null @@ -1,69 +0,0 @@ -# This file will be configured to contain variables for CPack. These variables -# should be set in the CMake list file of the project before CPack module is -# included. The list of available CPACK_xxx variables and their associated -# documentation may be obtained using -# cpack --help-variable-list -# -# Some variables are common to all generators (e.g. CPACK_PACKAGE_NAME) -# and some are specific to a generator -# (e.g. CPACK_NSIS_EXTRA_INSTALL_COMMANDS). The generator specific variables -# usually begin with CPACK__xxxx. - - -set(CPACK_BINARY_7Z "OFF") -set(CPACK_BINARY_IFW "OFF") -set(CPACK_BINARY_NSIS "ON") -set(CPACK_BINARY_NUGET "OFF") -set(CPACK_BINARY_WIX "OFF") -set(CPACK_BINARY_ZIP "OFF") -set(CPACK_BUILD_SOURCE_DIRS "C:/Users/rue/source/repos/86Box-luennix;C:/Users/rue/source/repos/86Box-luennix/out/build/regular") -set(CPACK_CMAKE_GENERATOR "Ninja") -set(CPACK_COMPONENTS_ALL "") -set(CPACK_COMPONENT_UNSPECIFIED_HIDDEN "TRUE") -set(CPACK_COMPONENT_UNSPECIFIED_REQUIRED "TRUE") -set(CPACK_DEFAULT_PACKAGE_DESCRIPTION_FILE "E:/Programs/Microsoft Visual Studio/2022/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/share/cmake-3.24/Templates/CPack.GenericDescription.txt") -set(CPACK_DEFAULT_PACKAGE_DESCRIPTION_SUMMARY "86Box built using CMake") -set(CPACK_GENERATOR "NSIS") -set(CPACK_INSTALL_CMAKE_PROJECTS "C:/Users/rue/source/repos/86Box-luennix/out/build/regular;86Box;ALL;/") -set(CPACK_INSTALL_PREFIX "C:/Program Files (x86)/86Box") -set(CPACK_MODULE_PATH "") -set(CPACK_NSIS_DISPLAY_NAME "86Box 3.11") -set(CPACK_NSIS_INSTALLER_ICON_CODE "") -set(CPACK_NSIS_INSTALLER_MUI_ICON_CODE "") -set(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES64") -set(CPACK_NSIS_PACKAGE_NAME "86Box 3.11") -set(CPACK_NSIS_UNINSTALL_NAME "Uninstall") -set(CPACK_OUTPUT_CONFIG_FILE "C:/Users/rue/source/repos/86Box-luennix/out/build/regular/CPackConfig.cmake") -set(CPACK_PACKAGE_DEFAULT_LOCATION "/") -set(CPACK_PACKAGE_DESCRIPTION_FILE "E:/Programs/Microsoft Visual Studio/2022/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/share/cmake-3.24/Templates/CPack.GenericDescription.txt") -set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Emulator of x86-based systems") -set(CPACK_PACKAGE_FILE_NAME "86Box-3.11-win64") -set(CPACK_PACKAGE_HOMEPAGE_URL "https://86box.net") -set(CPACK_PACKAGE_INSTALL_DIRECTORY "86Box 3.11") -set(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "86Box 3.11") -set(CPACK_PACKAGE_NAME "86Box") -set(CPACK_PACKAGE_RELOCATABLE "true") -set(CPACK_PACKAGE_VENDOR "Humanity") -set(CPACK_PACKAGE_VERSION "3.11") -set(CPACK_PACKAGE_VERSION_MAJOR "3") -set(CPACK_PACKAGE_VERSION_MINOR "11") -set(CPACK_RESOURCE_FILE_LICENSE "E:/Programs/Microsoft Visual Studio/2022/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/share/cmake-3.24/Templates/CPack.GenericLicense.txt") -set(CPACK_RESOURCE_FILE_README "E:/Programs/Microsoft Visual Studio/2022/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/share/cmake-3.24/Templates/CPack.GenericDescription.txt") -set(CPACK_RESOURCE_FILE_WELCOME "E:/Programs/Microsoft Visual Studio/2022/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/share/cmake-3.24/Templates/CPack.GenericWelcome.txt") -set(CPACK_SET_DESTDIR "OFF") -set(CPACK_SOURCE_7Z "ON") -set(CPACK_SOURCE_GENERATOR "7Z;ZIP") -set(CPACK_SOURCE_OUTPUT_CONFIG_FILE "C:/Users/rue/source/repos/86Box-luennix/out/build/regular/CPackSourceConfig.cmake") -set(CPACK_SOURCE_ZIP "ON") -set(CPACK_SYSTEM_NAME "win64") -set(CPACK_THREADS "1") -set(CPACK_TOPLEVEL_TAG "win64") -set(CPACK_WIX_SIZEOF_VOID_P "8") - -if(NOT CPACK_PROPERTIES_FILE) - set(CPACK_PROPERTIES_FILE "C:/Users/rue/source/repos/86Box-luennix/out/build/regular/CPackProperties.cmake") -endif() - -if(EXISTS ${CPACK_PROPERTIES_FILE}) - include(${CPACK_PROPERTIES_FILE}) -endif() From e04d58f419e8aac64a9014a78ea1a4fa1c352d26 Mon Sep 17 00:00:00 2001 From: rueni97 <99608219+luennix@users.noreply.github.com> Date: Mon, 9 Jan 2023 17:08:43 +0300 Subject: [PATCH 145/285] Delete CPackSourceConfig.cmake --- out/build/regular/CPackSourceConfig.cmake | 77 ----------------------- 1 file changed, 77 deletions(-) delete mode 100644 out/build/regular/CPackSourceConfig.cmake diff --git a/out/build/regular/CPackSourceConfig.cmake b/out/build/regular/CPackSourceConfig.cmake deleted file mode 100644 index eb8420f36..000000000 --- a/out/build/regular/CPackSourceConfig.cmake +++ /dev/null @@ -1,77 +0,0 @@ -# This file will be configured to contain variables for CPack. These variables -# should be set in the CMake list file of the project before CPack module is -# included. The list of available CPACK_xxx variables and their associated -# documentation may be obtained using -# cpack --help-variable-list -# -# Some variables are common to all generators (e.g. CPACK_PACKAGE_NAME) -# and some are specific to a generator -# (e.g. CPACK_NSIS_EXTRA_INSTALL_COMMANDS). The generator specific variables -# usually begin with CPACK__xxxx. - - -set(CPACK_BINARY_7Z "OFF") -set(CPACK_BINARY_IFW "OFF") -set(CPACK_BINARY_NSIS "ON") -set(CPACK_BINARY_NUGET "OFF") -set(CPACK_BINARY_WIX "OFF") -set(CPACK_BINARY_ZIP "OFF") -set(CPACK_BUILD_SOURCE_DIRS "C:/Users/rue/source/repos/86Box-luennix;C:/Users/rue/source/repos/86Box-luennix/out/build/regular") -set(CPACK_CMAKE_GENERATOR "Ninja") -set(CPACK_COMPONENTS_ALL "") -set(CPACK_COMPONENT_UNSPECIFIED_HIDDEN "TRUE") -set(CPACK_COMPONENT_UNSPECIFIED_REQUIRED "TRUE") -set(CPACK_DEFAULT_PACKAGE_DESCRIPTION_FILE "E:/Programs/Microsoft Visual Studio/2022/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/share/cmake-3.24/Templates/CPack.GenericDescription.txt") -set(CPACK_DEFAULT_PACKAGE_DESCRIPTION_SUMMARY "86Box built using CMake") -set(CPACK_GENERATOR "7Z;ZIP") -set(CPACK_IGNORE_FILES "/CVS/;/\\.svn/;/\\.bzr/;/\\.hg/;/\\.git/;\\.swp\$;\\.#;/#") -set(CPACK_INSTALLED_DIRECTORIES "C:/Users/rue/source/repos/86Box-luennix;/") -set(CPACK_INSTALL_CMAKE_PROJECTS "") -set(CPACK_INSTALL_PREFIX "C:/Program Files (x86)/86Box") -set(CPACK_MODULE_PATH "") -set(CPACK_NSIS_DISPLAY_NAME "86Box 3.11") -set(CPACK_NSIS_INSTALLER_ICON_CODE "") -set(CPACK_NSIS_INSTALLER_MUI_ICON_CODE "") -set(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES64") -set(CPACK_NSIS_PACKAGE_NAME "86Box 3.11") -set(CPACK_NSIS_UNINSTALL_NAME "Uninstall") -set(CPACK_OUTPUT_CONFIG_FILE "C:/Users/rue/source/repos/86Box-luennix/out/build/regular/CPackConfig.cmake") -set(CPACK_PACKAGE_DEFAULT_LOCATION "/") -set(CPACK_PACKAGE_DESCRIPTION_FILE "E:/Programs/Microsoft Visual Studio/2022/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/share/cmake-3.24/Templates/CPack.GenericDescription.txt") -set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Emulator of x86-based systems") -set(CPACK_PACKAGE_FILE_NAME "86Box-3.11-Source") -set(CPACK_PACKAGE_HOMEPAGE_URL "https://86box.net") -set(CPACK_PACKAGE_INSTALL_DIRECTORY "86Box 3.11") -set(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "86Box 3.11") -set(CPACK_PACKAGE_NAME "86Box") -set(CPACK_PACKAGE_RELOCATABLE "true") -set(CPACK_PACKAGE_VENDOR "Humanity") -set(CPACK_PACKAGE_VERSION "3.11") -set(CPACK_PACKAGE_VERSION_MAJOR "3") -set(CPACK_PACKAGE_VERSION_MINOR "11") -set(CPACK_RESOURCE_FILE_LICENSE "E:/Programs/Microsoft Visual Studio/2022/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/share/cmake-3.24/Templates/CPack.GenericLicense.txt") -set(CPACK_RESOURCE_FILE_README "E:/Programs/Microsoft Visual Studio/2022/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/share/cmake-3.24/Templates/CPack.GenericDescription.txt") -set(CPACK_RESOURCE_FILE_WELCOME "E:/Programs/Microsoft Visual Studio/2022/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/share/cmake-3.24/Templates/CPack.GenericWelcome.txt") -set(CPACK_RPM_PACKAGE_SOURCES "ON") -set(CPACK_SET_DESTDIR "OFF") -set(CPACK_SOURCE_7Z "ON") -set(CPACK_SOURCE_GENERATOR "7Z;ZIP") -set(CPACK_SOURCE_IGNORE_FILES "/CVS/;/\\.svn/;/\\.bzr/;/\\.hg/;/\\.git/;\\.swp\$;\\.#;/#") -set(CPACK_SOURCE_INSTALLED_DIRECTORIES "C:/Users/rue/source/repos/86Box-luennix;/") -set(CPACK_SOURCE_OUTPUT_CONFIG_FILE "C:/Users/rue/source/repos/86Box-luennix/out/build/regular/CPackSourceConfig.cmake") -set(CPACK_SOURCE_PACKAGE_FILE_NAME "86Box-3.11-Source") -set(CPACK_SOURCE_TOPLEVEL_TAG "win64-Source") -set(CPACK_SOURCE_ZIP "ON") -set(CPACK_STRIP_FILES "") -set(CPACK_SYSTEM_NAME "win64") -set(CPACK_THREADS "1") -set(CPACK_TOPLEVEL_TAG "win64-Source") -set(CPACK_WIX_SIZEOF_VOID_P "8") - -if(NOT CPACK_PROPERTIES_FILE) - set(CPACK_PROPERTIES_FILE "C:/Users/rue/source/repos/86Box-luennix/out/build/regular/CPackProperties.cmake") -endif() - -if(EXISTS ${CPACK_PROPERTIES_FILE}) - include(${CPACK_PROPERTIES_FILE}) -endif() From a40698b2e2e1640878739770bd1433fad8819a14 Mon Sep 17 00:00:00 2001 From: rueni97 <99608219+luennix@users.noreply.github.com> Date: Mon, 9 Jan 2023 17:08:57 +0300 Subject: [PATCH 146/285] Delete VSInheritEnvironments.txt --- out/build/regular/VSInheritEnvironments.txt | 1 - 1 file changed, 1 deletion(-) delete mode 100644 out/build/regular/VSInheritEnvironments.txt diff --git a/out/build/regular/VSInheritEnvironments.txt b/out/build/regular/VSInheritEnvironments.txt deleted file mode 100644 index f8cc9d8ac..000000000 --- a/out/build/regular/VSInheritEnvironments.txt +++ /dev/null @@ -1 +0,0 @@ -msvc_x64_x64 \ No newline at end of file From bd3b60b82fff4c341cffffe694147b0f98929682 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Mon, 9 Jan 2023 19:08:19 -0500 Subject: [PATCH 147/285] Fix mingw makefile build --- src/win/Makefile.mingw | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/win/Makefile.mingw b/src/win/Makefile.mingw index e39792966..0daf65323 100644 --- a/src/win/Makefile.mingw +++ b/src/win/Makefile.mingw @@ -549,7 +549,7 @@ CPUOBJ := $(DYNARECOBJ) \ CHIPSETOBJ := 82c100.o acc2168.o \ contaq_82c59x.o \ cs4031.o cs8230.o \ - ali1429.o ali1489.o ali1531.o ali1541.o ali1543.o ali1621.o ali6117.o \ + ali1429.o ali1435.o ali1489.o ali1531.o ali1541.o ali1543.o ali1621.o ali6117.o \ gc100.o headland.o \ ims8848.o intel_82335.o intel_420ex.o intel_4x0.o intel_i450kx.o intel_sio.o intel_piix.o \ ioapic.o \ From b91f79dcdcf94e0865f4e41e007733623cd55765 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 10 Jan 2023 03:50:47 +0100 Subject: [PATCH 148/285] Fixed warnings in cdrom/cdrom.c. --- src/cdrom/cdrom.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/cdrom/cdrom.c b/src/cdrom/cdrom.c index 37795b845..2a3cbb1ca 100644 --- a/src/cdrom/cdrom.c +++ b/src/cdrom/cdrom.c @@ -797,7 +797,7 @@ void cdrom_get_current_subchannel_sony(cdrom_t *dev, uint8_t *b, int msf) { subchannel_t subc; - int pos = 0, m, s, f; + int pos = 0; uint32_t dat; dev->ops->get_subchannel(dev, dev->seek_pos, &subc); @@ -833,7 +833,6 @@ cdrom_get_audio_status_sony(cdrom_t *dev, uint8_t *b, int msf) { uint8_t ret; subchannel_t subc; - int m, s, f; uint32_t dat; dev->ops->get_subchannel(dev, dev->seek_pos, &subc); @@ -1063,7 +1062,6 @@ read_toc_sony(cdrom_t *dev, unsigned char *b, unsigned char start_track, int msf { track_info_t ti; int i, len = 4; - int m, s, f; int first_track, last_track; uint32_t temp; From 829671848ed7650593b01f665e3b5be24c4f3477 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 10 Jan 2023 04:03:34 +0100 Subject: [PATCH 149/285] Fixed warning sin scsi/scsi_cdrom.c. --- src/scsi/scsi_cdrom.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/scsi/scsi_cdrom.c b/src/scsi/scsi_cdrom.c index b635bcb10..3fb567e98 100644 --- a/src/scsi/scsi_cdrom.c +++ b/src/scsi/scsi_cdrom.c @@ -858,11 +858,10 @@ scsi_cdrom_update_request_length(scsi_cdrom_t *dev, int len, int block_len) that a media access comand does not DRQ in the middle of a sector. One of the drivers that relies on the correctness of this behavior is MTMCDAI.SYS (the Mitsumi CD-ROM driver) for DOS which uses the READ CD command to read data on some CD types. */ - if ((dev->current_cdb[0] == 0xb9) || (dev->current_cdb[0] == 0xbe)) { - /* Round to sector length. */ - dlen = ((double) dev->max_transfer_len) / ((double) block_len); - dev->max_transfer_len = ((uint16_t) floor(dlen)) * block_len; - } + + /* Round to sector length. */ + dlen = ((double) dev->max_transfer_len) / ((double) block_len); + dev->max_transfer_len = ((uint16_t) floor(dlen)) * block_len; } else { /* Round it to the nearest 2048 bytes. */ dev->max_transfer_len = (dev->max_transfer_len >> 11) << 11; @@ -929,7 +928,7 @@ scsi_cdrom_bus_speed(scsi_cdrom_t *dev) static void scsi_cdrom_command_common(scsi_cdrom_t *dev) { - double bytes_per_second, period; + double bytes_per_second = 0.0, period; dev->status = BUSY_STAT; dev->phase = 1; From 55effffbfb29face735136d8194f382d0b6ac4d3 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 10 Jan 2023 04:04:53 +0100 Subject: [PATCH 150/285] Fixed warning in scsi/scsi_spock.c. --- src/scsi/scsi_spock.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scsi/scsi_spock.c b/src/scsi/scsi_spock.c index 0f618df95..f8dc3282e 100644 --- a/src/scsi/scsi_spock.c +++ b/src/scsi/scsi_spock.c @@ -516,7 +516,7 @@ spock_process_imm_cmd(spock_t *scsi) static void spock_execute_cmd(spock_t *scsi, scb_t *scb) { - int c, j; + int c, j = 0; int old_scb_state; if (scsi->in_reset) { From db55912a63487f60b51e02eb4ba0298925943a29 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 10 Jan 2023 04:11:01 +0100 Subject: [PATCH 151/285] Fixed another warning in scsi/scsi_cdrom.c. --- src/scsi/scsi_cdrom.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/scsi/scsi_cdrom.c b/src/scsi/scsi_cdrom.c index 3fb567e98..38693f590 100644 --- a/src/scsi/scsi_cdrom.c +++ b/src/scsi/scsi_cdrom.c @@ -2640,7 +2640,8 @@ begin: break; } - ret = cdrom_audio_play(dev->drv, pos, len, msf); + /* In this case, len is unused so just pass a fixed value of 1 intead. */ + ret = cdrom_audio_play(dev->drv, pos, 1 /*len*/, msf); if (ret) scsi_cdrom_command_complete(dev); From 54d862d0b72328973786db6bc041726565931421 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 10 Jan 2023 04:15:29 +0100 Subject: [PATCH 152/285] Fixed another warning in cdrom/cdrom.c. --- src/cdrom/cdrom.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/cdrom/cdrom.c b/src/cdrom/cdrom.c index 2a3cbb1ca..062e3bf72 100644 --- a/src/cdrom/cdrom.c +++ b/src/cdrom/cdrom.c @@ -1618,6 +1618,9 @@ cdrom_readsector_raw(cdrom_t *dev, uint8_t *buffer, int sector, int ismsf, int c lba = bcd2bin((sector >> 24) & 0xff); msf = sector; break; + /* Never used values but the compiler complains. */ + default: + lba = msf = 0; } } From 104d21f806d300841784dad8b16f8915de37ce13 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Thu, 12 Jan 2023 14:00:10 +0600 Subject: [PATCH 153/285] vid_mga: Fix Matrox Mystique MGA modes Clock selection now works properly --- src/video/vid_mga.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/video/vid_mga.c b/src/video/vid_mga.c index ef7a2b366..56dcf9605 100644 --- a/src/video/vid_mga.c +++ b/src/video/vid_mga.c @@ -848,7 +848,7 @@ mystique_recalctimings(svga_t *svga) mystique_t *mystique = (mystique_t *) svga->p; int clk_sel = (svga->miscout >> 2) & 3; - svga->clock = (cpuclock * (float) (1ull << 32)) / svga->getclock(clk_sel & 2, svga->clock_gen); + svga->clock = (cpuclock * (float) (1ull << 32)) / svga->getclock(clk_sel & 3, svga->clock_gen); if (mystique->crtcext_regs[1] & CRTCX_R1_HTOTAL8) svga->htotal += 0x100; @@ -896,7 +896,9 @@ mystique_recalctimings(svga_t *svga) svga->ma = svga->maback = (svga->maback - (mystique->ma_latch_old << 2)) + (svga->ma_latch << 2); mystique->ma_latch_old = svga->ma_latch; } - + + svga->rowoffset <<= 1; + switch (mystique->xmulctrl & XMULCTRL_DEPTH_MASK) { case XMULCTRL_DEPTH_8: case XMULCTRL_DEPTH_2G8V16: From f3680b05b1802a20d7a61ca049eb12179cf974ec Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Thu, 12 Jan 2023 19:16:04 -0500 Subject: [PATCH 154/285] Prevent accidental merge of VS Code files --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index b4c67ef0a..0a21bf105 100644 --- a/.gitignore +++ b/.gitignore @@ -38,6 +38,7 @@ Makefile # Visual Studio Code /.vs /.vscode +/out # Windows resource compiler RC* From 5aa971534c8a0a7ef6e9295a7064b4d8c90800a5 Mon Sep 17 00:00:00 2001 From: luennix Date: Sat, 14 Jan 2023 12:07:06 +0300 Subject: [PATCH 155/285] Fixed QDI EXCELLENT II to have an AGP slot, as the real board also has one. --- 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 293aa6629..cd2813991 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -10852,7 +10852,7 @@ const machine_t machines[] = { .min_multi = 3.0, .max_multi = 8.0 }, - .bus_flags = MACHINE_PS2_PCI, + .bus_flags = MACHINE_PS2_AGP, .flags = MACHINE_IDE_DUAL, .ram = { .min = 8192, From 72118bb259a8e22ed316c80e55b9d43296ad1bf1 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 14 Jan 2023 19:13:14 -0300 Subject: [PATCH 156/285] Jenkins: Add FluidSynth compilation to remove JACK and fix SDL compilation --- .ci/AppImageBuilder.yml | 1 - .ci/build.sh | 20 +++++++++++++++++--- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/.ci/AppImageBuilder.yml b/.ci/AppImageBuilder.yml index 69376b511..3d83e2851 100644 --- a/.ci/AppImageBuilder.yml +++ b/.ci/AppImageBuilder.yml @@ -45,7 +45,6 @@ AppDir: include: - libedit2 # if (CLI:BOOL=ON|QT:BOOL=OFF) - libevdev2 # if QT:BOOL=ON - - libfluidsynth2 - libfreetype6 - libgbm1 # if QT:BOOL=ON - libgl1 # if QT:BOOL=ON diff --git a/.ci/build.sh b/.ci/build.sh index 42790abb8..bde8cb09e 100644 --- a/.ci/build.sh +++ b/.ci/build.sh @@ -986,7 +986,8 @@ else sdl_ui=OFF grep -qiE "^QT:BOOL=ON" build/CMakeCache.txt || sdl_ui=ON - # Build rtmidi without JACK support to remove the dependency on libjack. + # Build rtmidi without JACK support to remove the dependency on libjack, as + # the Debian libjack is very likely to be incompatible with the system jackd. prefix="$cache_dir/rtmidi-4.0.0" if [ ! -d "$prefix" ] then @@ -998,6 +999,21 @@ else cmake --build "$prefix_build" -j$(nproc) || exit 99 cmake --install "$prefix_build" || exit 99 + # Build FluidSynth without JACK support to remove the dependency on libjack once again. + prefix="$cache_dir/fluidsynth-2.3.0" + if [ ! -d "$prefix" ] + then + rm -rf "$cache_dir/fluidsynth-"* # remove old versions + wget -qO - https://github.com/FluidSynth/fluidsynth/archive/refs/tags/v2.3.0.tar.gz | tar zxf - -C "$cache_dir" || rm -rf "$prefix" + fi + cp cmake/flags-gcc.cmake cmake/flags-gcc.cmake.old + sed -i -e 's/ -Werror=.*\([" ]\)/\1/g' cmake/flags-gcc.cmake # temporary hack for -Werror=old-style-definition non-compliance on FluidSynth and SDL2 + prefix_build="$prefix/build-$arch_deb" + cmake -G Ninja -D enable-jack=OFF -D enable-sdl2=$sdl_ss -D "CMAKE_TOOLCHAIN_FILE=$toolchain_file" -D "CMAKE_INSTALL_PREFIX=$cwd_root/archive_tmp/usr" -S "$prefix" -B "$prefix_build" || exit 99 + cmake --build "$prefix_build" -j$(nproc) || exit 99 + cmake --install "$prefix_build" || exit 99 + cp -p "$cwd_root/archive_tmp/usr/bin/fluidsynth" fluidsynth + # Build SDL2 for joystick and FAudio support, with most components # disabled to remove the dependencies on PulseAudio and libdrm. prefix="$cache_dir/SDL2-2.0.20" @@ -1006,8 +1022,6 @@ else rm -rf "$cache_dir/SDL2-"* # remove old versions wget -qO - https://www.libsdl.org/release/SDL2-2.0.20.tar.gz | tar zxf - -C "$cache_dir" || rm -rf "$prefix" fi - cp cmake/flags-gcc.cmake cmake/flags-gcc.cmake.old - sed -i -e 's/ -Werror=.*\([" ]\)/\1/g' cmake/flags-gcc.cmake # temporary hack for -Werror=old-style-definition non-compliance prefix_build="$cache_dir/SDL2-2.0.20-build-$arch_deb" cmake -G Ninja -D SDL_SHARED=ON -D SDL_STATIC=OFF \ \ From 781ebb04a711c0610f3ea19cd63cca8d97970a86 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sun, 15 Jan 2023 16:01:22 -0300 Subject: [PATCH 157/285] No ChAnGeS --- .ci/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci/build.sh b/.ci/build.sh index bde8cb09e..31e1d770f 100644 --- a/.ci/build.sh +++ b/.ci/build.sh @@ -12,7 +12,7 @@ # # Authors: RichardG, # -# Copyright 2021-2022 RichardG. +# Copyright 2021-2023 RichardG. # # From 74f3393fe6f7ea72bbc3d314d95560841902b0c0 Mon Sep 17 00:00:00 2001 From: Alexander Babikov <2708460+lemondrops@users.noreply.github.com> Date: Wed, 18 Jan 2023 15:57:59 +0500 Subject: [PATCH 158/285] Display dynarec information in the About box --- src/include/86box/language.h | 14 +++++++++++++- src/qt/qt_mainwindow.cpp | 17 +++++++++++++---- src/win/languages/cs-CZ.rc | 3 +++ src/win/languages/de-DE.rc | 3 +++ src/win/languages/en-GB.rc | 3 +++ src/win/languages/en-US.rc | 3 +++ src/win/languages/es-ES.rc | 3 +++ src/win/languages/fi-FI.rc | 3 +++ src/win/languages/fr-FR.rc | 3 +++ src/win/languages/hr-HR.rc | 3 +++ src/win/languages/hu-HU.rc | 3 +++ src/win/languages/it-IT.rc | 3 +++ src/win/languages/ja-JP.rc | 3 +++ src/win/languages/ko-KR.rc | 3 +++ src/win/languages/pl-PL.rc | 3 +++ src/win/languages/pt-BR.rc | 3 +++ src/win/languages/pt-PT.rc | 3 +++ src/win/languages/ru-RU.rc | 3 +++ src/win/languages/sl-SI.rc | 3 +++ src/win/languages/tr-TR.rc | 3 +++ src/win/languages/uk-UA.rc | 3 +++ src/win/languages/zh-CN.rc | 3 +++ src/win/languages/zh-TW.rc | 3 +++ src/win/win_about.c | 15 ++++++++++++++- 24 files changed, 103 insertions(+), 6 deletions(-) diff --git a/src/include/86box/language.h b/src/include/86box/language.h index 8db604efc..1fd5bdf61 100644 --- a/src/include/86box/language.h +++ b/src/include/86box/language.h @@ -150,6 +150,18 @@ #define IDS_2160 2160 // "ACPI shutdown" #define IDS_2161 2161 // "Settings" #define IDS_2162 2162 // "Early drive" +#define IDS_2163 2163 // "no dynarec" +#define IDS_2164 2164 // "old dynarec" +#define IDS_2165 2165 // "new dynarec" +#ifdef USE_DYNAREC +# ifdef USE_NEW_DYNAREC +# define IDS_DYNAREC IDS_2165 +# else +# define IDS_DYNAREC IDS_2164 +# endif +#else +# define IDS_DYNAREC IDS_2163 +#endif #define IDS_4096 4096 // "Hard disk (%s)" #define IDS_4097 4097 // "%01i:%01i" @@ -258,7 +270,7 @@ #define IDS_LANG_ENUS IDS_7168 -#define STR_NUM_2048 115 +#define STR_NUM_2048 118 // UNUSED: #define STR_NUM_3072 11 #define STR_NUM_4096 40 #define STR_NUM_4352 6 diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index f0e8fdc34..0a1a359ff 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -2095,12 +2095,21 @@ MainWindow::on_actionAbout_86Box_triggered() { QMessageBox msgBox; msgBox.setTextFormat(Qt::RichText); - QString githash; + QString versioninfo; #ifdef EMU_GIT_HASH - githash = QString(" [%1]").arg(EMU_GIT_HASH); + versioninfo = QString(" [%1]").arg(EMU_GIT_HASH); #endif - githash.append(QString(" [%1]").arg(QSysInfo::buildCpuArchitecture())); - msgBox.setText(QString("%3%1%2").arg(EMU_VERSION_FULL, githash, tr("86Box v"))); +#ifdef USE_DYNAREC +# ifdef USE_NEW_DYNAREC +# define DYNAREC_STR "new dynarec" +# else +# define DYNAREC_STR "old dynarec" +# endif +#else +# define DYNAREC_STR "no dynarec" +#endif + versioninfo.append(QString(" [%1, %2]").arg(QSysInfo::buildCpuArchitecture(), tr(DYNAREC_STR))); + msgBox.setText(QString("%3%1%2").arg(EMU_VERSION_FULL, versioninfo, tr("86Box v"))); msgBox.setInformativeText(tr("An emulator of old computers\n\nAuthors: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, Tiseno100, reenigne, 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); diff --git a/src/win/languages/cs-CZ.rc b/src/win/languages/cs-CZ.rc index 9b49fc01d..635d2dc89 100644 --- a/src/win/languages/cs-CZ.rc +++ b/src/win/languages/cs-CZ.rc @@ -522,6 +522,9 @@ BEGIN IDS_2160 "Vypnout skrze rozhraní ACPI" IDS_2161 "Nastavení" IDS_2162 "Časná mechanika" + IDS_2163 "no dynarec" + IDS_2164 "old dynarec" + IDS_2165 "new dynarec" END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/de-DE.rc b/src/win/languages/de-DE.rc index 74199b6da..308657978 100644 --- a/src/win/languages/de-DE.rc +++ b/src/win/languages/de-DE.rc @@ -522,6 +522,9 @@ BEGIN IDS_2160 "ACPI-basiertes Herunterfahren" IDS_2161 "Optionen" IDS_2162 "Früheres Laufwerk" + IDS_2163 "no dynarec" + IDS_2164 "old dynarec" + IDS_2165 "new dynarec" END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/en-GB.rc b/src/win/languages/en-GB.rc index dc0ec3627..0cc4a8f5a 100644 --- a/src/win/languages/en-GB.rc +++ b/src/win/languages/en-GB.rc @@ -522,6 +522,9 @@ BEGIN IDS_2160 "ACPI shutdown" IDS_2161 "Settings" IDS_2162 "Earlier drive" + IDS_2163 "no dynarec" + IDS_2164 "old dynarec" + IDS_2165 "new dynarec" END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/en-US.rc b/src/win/languages/en-US.rc index d166b1d0c..12100b0bf 100644 --- a/src/win/languages/en-US.rc +++ b/src/win/languages/en-US.rc @@ -522,6 +522,9 @@ BEGIN IDS_2160 "ACPI shutdown" IDS_2161 "Settings" IDS_2162 "Earlier drive" + IDS_2163 "no dynarec" + IDS_2164 "old dynarec" + IDS_2165 "new dynarec" END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/es-ES.rc b/src/win/languages/es-ES.rc index faba0638c..cf9c03371 100644 --- a/src/win/languages/es-ES.rc +++ b/src/win/languages/es-ES.rc @@ -522,6 +522,9 @@ BEGIN IDS_2160 "ACPI shutdown" IDS_2161 "Settings" IDS_2162 "Unidad anterior" + IDS_2163 "no dynarec" + IDS_2164 "old dynarec" + IDS_2165 "new dynarec" END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/fi-FI.rc b/src/win/languages/fi-FI.rc index 127508bdd..852778a96 100644 --- a/src/win/languages/fi-FI.rc +++ b/src/win/languages/fi-FI.rc @@ -522,6 +522,9 @@ BEGIN IDS_2160 "ACPI-sammutus" IDS_2161 "Asetukset" IDS_2162 "Aiemmat asemat" + IDS_2163 "no dynarec" + IDS_2164 "old dynarec" + IDS_2165 "new dynarec" END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/fr-FR.rc b/src/win/languages/fr-FR.rc index c7cdf65d7..8e005ebcd 100644 --- a/src/win/languages/fr-FR.rc +++ b/src/win/languages/fr-FR.rc @@ -522,6 +522,9 @@ BEGIN IDS_2160 "ACPI shutdown" IDS_2161 "Settings" IDS_2162 "Lecteur plus tôt" + IDS_2163 "no dynarec" + IDS_2164 "old dynarec" + IDS_2165 "new dynarec" END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/hr-HR.rc b/src/win/languages/hr-HR.rc index f2952bbcf..b1b4a3524 100644 --- a/src/win/languages/hr-HR.rc +++ b/src/win/languages/hr-HR.rc @@ -522,6 +522,9 @@ BEGIN IDS_2160 "ACPI bazirano gašenje" IDS_2161 "Postavke" IDS_2162 "Raniji pogon" + IDS_2163 "no dynarec" + IDS_2164 "old dynarec" + IDS_2165 "new dynarec" END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/hu-HU.rc b/src/win/languages/hu-HU.rc index 0ffa215c0..0692c1cdd 100644 --- a/src/win/languages/hu-HU.rc +++ b/src/win/languages/hu-HU.rc @@ -526,6 +526,9 @@ BEGIN IDS_2160 "ACPI shutdown" IDS_2161 "Settings" IDS_2162 "Korábbi meghajtó" + IDS_2163 "no dynarec" + IDS_2164 "old dynarec" + IDS_2165 "new dynarec" END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/it-IT.rc b/src/win/languages/it-IT.rc index 960e9e205..bf82c116f 100644 --- a/src/win/languages/it-IT.rc +++ b/src/win/languages/it-IT.rc @@ -523,6 +523,9 @@ BEGIN IDS_2160 "ACPI shutdown" IDS_2161 "Settings" IDS_2162 "Unità anteriore" + IDS_2163 "no dynarec" + IDS_2164 "old dynarec" + IDS_2165 "new dynarec" END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/ja-JP.rc b/src/win/languages/ja-JP.rc index edcf3f668..e1fc2bae9 100644 --- a/src/win/languages/ja-JP.rc +++ b/src/win/languages/ja-JP.rc @@ -522,6 +522,9 @@ BEGIN IDS_2160 "ACPIシャットダウン" IDS_2161 "設定" IDS_2162 "アーリードライブ" + IDS_2163 "no dynarec" + IDS_2164 "old dynarec" + IDS_2165 "new dynarec" END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/ko-KR.rc b/src/win/languages/ko-KR.rc index a5f0cfe57..9379205fe 100644 --- a/src/win/languages/ko-KR.rc +++ b/src/win/languages/ko-KR.rc @@ -522,6 +522,9 @@ BEGIN IDS_2160 "ACPI 종료" IDS_2161 "설정" IDS_2162 "이전 드라이브" + IDS_2163 "no dynarec" + IDS_2164 "old dynarec" + IDS_2165 "new dynarec" END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/pl-PL.rc b/src/win/languages/pl-PL.rc index ec59c5ef1..054428e5b 100644 --- a/src/win/languages/pl-PL.rc +++ b/src/win/languages/pl-PL.rc @@ -522,6 +522,9 @@ BEGIN IDS_2160 "Wyłączenie ACPI" IDS_2161 "Ustawienia" IDS_2162 "Wcześniejszy napęd" + IDS_2163 "no dynarec" + IDS_2164 "old dynarec" + IDS_2165 "new dynarec" END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/pt-BR.rc b/src/win/languages/pt-BR.rc index 8d16a2a48..7147854bc 100644 --- a/src/win/languages/pt-BR.rc +++ b/src/win/languages/pt-BR.rc @@ -525,6 +525,9 @@ BEGIN IDS_2160 "Desligamento por ACPI" IDS_2161 "Configurações" IDS_2162 "Unidade anterior" + IDS_2163 "no dynarec" + IDS_2164 "old dynarec" + IDS_2165 "new dynarec" END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/pt-PT.rc b/src/win/languages/pt-PT.rc index 704262b3d..0deeebc41 100644 --- a/src/win/languages/pt-PT.rc +++ b/src/win/languages/pt-PT.rc @@ -522,6 +522,9 @@ BEGIN IDS_2160 "Encerramento ACPI" IDS_2161 "Definições" IDS_2162 "Unidade anterior" + IDS_2163 "no dynarec" + IDS_2164 "old dynarec" + IDS_2165 "new dynarec" END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/ru-RU.rc b/src/win/languages/ru-RU.rc index 667cfafa6..7cb75fb48 100644 --- a/src/win/languages/ru-RU.rc +++ b/src/win/languages/ru-RU.rc @@ -522,6 +522,9 @@ BEGIN IDS_2160 "Сигнал завершения ACPI" IDS_2161 "Настройки машины" IDS_2162 "Предыдущий дисковод" + IDS_2163 "no dynarec" + IDS_2164 "old dynarec" + IDS_2165 "new dynarec" END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/sl-SI.rc b/src/win/languages/sl-SI.rc index 3bdf357f4..7a56d4cc5 100644 --- a/src/win/languages/sl-SI.rc +++ b/src/win/languages/sl-SI.rc @@ -522,6 +522,9 @@ BEGIN IDS_2160 "Zaustavitev ACPI" IDS_2161 "Nastavitve" IDS_2162 "Zgodnejši pogon" + IDS_2163 "no dynarec" + IDS_2164 "old dynarec" + IDS_2165 "new dynarec" END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/tr-TR.rc b/src/win/languages/tr-TR.rc index 858bf0a01..896f6a300 100644 --- a/src/win/languages/tr-TR.rc +++ b/src/win/languages/tr-TR.rc @@ -522,6 +522,9 @@ BEGIN IDS_2160 "ACPI kapatma" IDS_2161 "Ayarlar" IDS_2162 "Daha erken sürüş" + IDS_2163 "no dynarec" + IDS_2164 "old dynarec" + IDS_2165 "new dynarec" END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/uk-UA.rc b/src/win/languages/uk-UA.rc index 9f7f92cbe..332966686 100644 --- a/src/win/languages/uk-UA.rc +++ b/src/win/languages/uk-UA.rc @@ -522,6 +522,9 @@ BEGIN IDS_2160 "Сигнал завершення ACPI" IDS_2161 "Налаштування машини" IDS_2162 "Більш ранній дисковод" + IDS_2163 "no dynarec" + IDS_2164 "old dynarec" + IDS_2165 "new dynarec" END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/zh-CN.rc b/src/win/languages/zh-CN.rc index 88a7e9055..13f878cb6 100644 --- a/src/win/languages/zh-CN.rc +++ b/src/win/languages/zh-CN.rc @@ -522,6 +522,9 @@ BEGIN IDS_2160 "ACPI 关机" IDS_2161 "设置" IDS_2162 "早先的驱动器" + IDS_2163 "no dynarec" + IDS_2164 "old dynarec" + IDS_2165 "new dynarec" END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/zh-TW.rc b/src/win/languages/zh-TW.rc index e06f8525c..f922c950b 100644 --- a/src/win/languages/zh-TW.rc +++ b/src/win/languages/zh-TW.rc @@ -522,6 +522,9 @@ BEGIN IDS_2160 "ACPI 關機" IDS_2161 "設定" IDS_2162 "早先的光碟機" + IDS_2163 "no dynarec" + IDS_2164 "old dynarec" + IDS_2165 "new dynarec" END STRINGTABLE DISCARDABLE diff --git a/src/win/win_about.c b/src/win/win_about.c index c343eb7f0..f0c692b75 100644 --- a/src/win/win_about.c +++ b/src/win/win_about.c @@ -45,9 +45,22 @@ AboutDialogCreate(HWND hwnd) wchar_t emu_version[256]; i = swprintf(emu_version, sizeof(emu_version), L"%ls v%ls", EMU_NAME_W, EMU_VERSION_FULL_W); #ifdef EMU_GIT_HASH - swprintf(&emu_version[i], sizeof(emu_version) - i, L" [%ls]", EMU_GIT_HASH_W); + i += swprintf(&emu_version[i], sizeof(emu_version) - i, L" [%ls]", EMU_GIT_HASH_W); #endif +#if defined(__arm__) || defined(__TARGET_ARCH_ARM) +# define ARCH_STR L"arm" +#elif defined(__aarch64__) || defined(_M_ARM64) +# define ARCH_STR L"arm64" +#elif defined(__i386) || defined(__i386__) || defined(_M_IX86) +# define ARCH_STR L"i386" +#elif defined(__x86_64) || defined(__x86_64__) || defined(__amd64) || defined(_M_X64) +# define ARCH_STR L"x86_64" +#else +# define ARCH_STR L"unknown" +#endif + swprintf(&emu_version[i], sizeof(emu_version) - i, L" [%ls, %ls]", ARCH_STR, plat_get_string(IDS_DYNAREC)); + tdconfig.cbSize = sizeof(tdconfig); tdconfig.hwndParent = hwnd; tdconfig.hInstance = hinstance; From 8e74b634c61aab3568b018aec1cc06bf51d89b3a Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 19 Jan 2023 06:20:44 +0100 Subject: [PATCH 159/285] The Acer V35N now correctly initializes the NVR to 0x00's, making it boot correctly. --- src/machine/m_at_socket7.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/machine/m_at_socket7.c b/src/machine/m_at_socket7.c index 0ead2972a..899ce8f5a 100644 --- a/src/machine/m_at_socket7.c +++ b/src/machine/m_at_socket7.c @@ -57,7 +57,11 @@ machine_at_acerv35n_init(const machine_t *model) if (bios_only || !ret) return ret; - machine_at_common_init(model); + machine_at_common_init_ex(model, 2); + /* Yes, it's called amstrad_mega_pc_nvr_device, but it's basically the + standard AT NVR, just initialized to 0x00's (perhaps that should be the + default behavior?). */ + device_add(&amstrad_megapc_nvr_device); pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); From 0dda45ab463166cadf77c44c0da2296917b05242 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Fri, 20 Jan 2023 22:58:56 +0600 Subject: [PATCH 160/285] qt: Display device name separately in device configuration --- src/qt/qt_deviceconfig.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/qt/qt_deviceconfig.cpp b/src/qt/qt_deviceconfig.cpp index 2fecdc543..257238316 100644 --- a/src/qt/qt_deviceconfig.cpp +++ b/src/qt/qt_deviceconfig.cpp @@ -25,6 +25,8 @@ #include #include #include +#include +#include extern "C" { #include <86box/86box.h> @@ -61,6 +63,12 @@ DeviceConfig::ConfigureDevice(const _device_ *device, int instance, Settings *se device_context_t device_context; device_set_context(&device_context, device, instance); + auto device_label = new QLabel(device->name); + dc.ui->formLayout->addRow(device_label); + auto line = new QFrame; + line->setFrameShape(QFrame::HLine); + line->setFrameShadow(QFrame::Sunken); + dc.ui->formLayout->addRow(line); const auto *config = device->config; while (config->type != -1) { switch (config->type) { From 7898109b660c06d5e457ec68fce0eef94f74bd72 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sun, 22 Jan 2023 16:50:21 +0600 Subject: [PATCH 161/285] Add SVGA multi-monitor support Cirrus Logic CL-GD5436/CL-GD5446 works as secondary video adapters --- src/include/86box/vid_svga.h | 8 ++ src/include/86box/vid_voodoo_common.h | 1 + src/qt/qt_settingsdisplay.cpp | 2 +- src/video/vid_cl54xx.c | 18 ++-- src/video/vid_s3.c | 40 ++++----- src/video/vid_svga.c | 124 +++++++++++++------------- src/video/vid_svga_render.c | 82 ++++++++--------- src/video/vid_table.c | 7 +- src/video/vid_voodoo_banshee.c | 34 ++++--- src/video/vid_voodoo_display.c | 9 +- 10 files changed, 174 insertions(+), 151 deletions(-) diff --git a/src/include/86box/vid_svga.h b/src/include/86box/vid_svga.h index 7f987a2b7..31eabc064 100644 --- a/src/include/86box/vid_svga.h +++ b/src/include/86box/vid_svga.h @@ -33,6 +33,8 @@ # define FLAG_RAMDAC_SHIFT 64 # define FLAG_128K_MASK 128 +struct monitor_t; + typedef struct { int ena, x, y, xoff, yoff, cur_xsize, cur_ysize, @@ -170,6 +172,12 @@ typedef struct svga_t { uint32_t (*remap_func)(struct svga_t *svga, uint32_t in_addr); void *ramdac, *clock_gen; + + /* Monitor Index */ + uint8_t monitor_index; + + /* Pointer to monitor */ + monitor_t* monitor; } svga_t; extern int vga_on, ibm8514_on; diff --git a/src/include/86box/vid_voodoo_common.h b/src/include/86box/vid_voodoo_common.h index 0fd4155ef..7744ed08b 100644 --- a/src/include/86box/vid_voodoo_common.h +++ b/src/include/86box/vid_voodoo_common.h @@ -506,6 +506,7 @@ typedef struct voodoo_t { uint8_t *vram, *changedvram; void *p; + uint8_t monitor_index; } voodoo_t; typedef struct voodoo_set_t { diff --git a/src/qt/qt_settingsdisplay.cpp b/src/qt/qt_settingsdisplay.cpp index d459b0e53..10321cb2c 100644 --- a/src/qt/qt_settingsdisplay.cpp +++ b/src/qt/qt_settingsdisplay.cpp @@ -178,7 +178,7 @@ SettingsDisplay::on_comboBoxVideo_currentIndexChanged(int index) break; } - if (video_card_available(c) && device_is_valid(video_dev, machineId) && !(video_card_get_flags(c) == video_card_get_flags(videoCard))) { + if (video_card_available(c) && device_is_valid(video_dev, machineId) && !(video_card_get_flags(c) == video_card_get_flags(videoCard) && (video_card_get_flags(c) != VIDEO_FLAG_TYPE_SPECIAL))) { ui->comboBoxVideoSecondary->addItem(name, c); if (c == curVideoCard_2) ui->comboBoxVideoSecondary->setCurrentIndex(ui->comboBoxVideoSecondary->count() - 1); diff --git a/src/video/vid_cl54xx.c b/src/video/vid_cl54xx.c index e29d95232..d402050c7 100644 --- a/src/video/vid_cl54xx.c +++ b/src/video/vid_cl54xx.c @@ -525,7 +525,7 @@ gd54xx_overlay_draw(svga_t *svga, int displine) uint8_t *src2 = &svga->vram[(svga->ma - (svga->hdisp * bytesperpix)) & svga->vram_display_mask]; int occl, ckval; - p = &((uint32_t *) buffer32->line[displine])[gd54xx->overlay.region1size + svga->x_add]; + p = &((uint32_t *) svga->monitor->target_buffer->line[displine])[gd54xx->overlay.region1size + svga->x_add]; src2 += gd54xx->overlay.region1size * bytesperpix; OVERLAY_SAMPLE(); @@ -1858,16 +1858,16 @@ gd54xx_hwcursor_draw(svga_t *svga, int displine) break; case 1: /* The pixel is shown in the cursor background color */ - ((uint32_t *) buffer32->line[displine])[offset + svga->x_add] = bgcol; + ((uint32_t *) svga->monitor->target_buffer->line[displine])[offset + svga->x_add] = bgcol; break; case 2: /* The pixel is shown as the inverse of the original screen pixel (XOR cursor) */ - ((uint32_t *) buffer32->line[displine])[offset + svga->x_add] ^= 0xffffff; + ((uint32_t *) svga->monitor->target_buffer->line[displine])[offset + svga->x_add] ^= 0xffffff; break; case 3: /* The pixel is shown in the cursor foreground color */ - ((uint32_t *) buffer32->line[displine])[offset + svga->x_add] = fgcol; + ((uint32_t *) svga->monitor->target_buffer->line[displine])[offset + svga->x_add] = fgcol; break; } } @@ -2219,7 +2219,7 @@ gd54xx_readw_linear(uint32_t addr, void *p) temp |= (svga_readb_linear(addr, svga) << 8); if (svga->fast) - cycles -= video_timing_read_w; + cycles -= svga->monitor->mon_video_timing_read_w; return temp; case 3: @@ -2268,7 +2268,7 @@ gd54xx_readl_linear(uint32_t addr, void *p) temp |= (svga_readb_linear(addr + 2, svga) << 24); if (svga->fast) - cycles -= video_timing_read_l; + cycles -= svga->monitor->mon_video_timing_read_l; return temp; case 2: @@ -2278,7 +2278,7 @@ gd54xx_readl_linear(uint32_t addr, void *p) temp |= (svga_readb_linear(addr, svga) << 24); if (svga->fast) - cycles -= video_timing_read_l; + cycles -= svga->monitor->mon_video_timing_read_l; return temp; case 3: @@ -2454,7 +2454,7 @@ gd54xx_writew_linear(uint32_t addr, uint16_t val, void *p) svga_writeb_linear(addr, val >> 8, svga); if (svga->fast) - cycles -= video_timing_write_w; + cycles -= svga->monitor->mon_video_timing_write_w; case 3: return; } @@ -4267,7 +4267,7 @@ gd54xx_force_redraw(void *p) { gd54xx_t *gd54xx = (gd54xx_t *) p; - gd54xx->svga.fullchange = changeframecount; + gd54xx->svga.fullchange = gd54xx->svga.monitor->mon_changeframecount; } // clang-format off diff --git a/src/video/vid_s3.c b/src/video/vid_s3.c index e6630a6c3..c3eaa36a8 100644 --- a/src/video/vid_s3.c +++ b/src/video/vid_s3.c @@ -1776,7 +1776,7 @@ s3_accel_write_fifo_l(s3_t *s3, uint32_t addr, uint32_t val) case 0x8180: s3->streams.pri_ctrl = val; svga_recalctimings(svga); - svga->fullchange = changeframecount; + svga->fullchange = svga->monitor->mon_changeframecount; break; case 0x8184: s3->streams.chroma_ctrl = val; @@ -1806,37 +1806,37 @@ s3_accel_write_fifo_l(s3_t *s3, uint32_t addr, uint32_t val) case 0x81c0: s3->streams.pri_fb0 = val & 0x3fffff; svga_recalctimings(svga); - svga->fullchange = changeframecount; + svga->fullchange = svga->monitor->mon_changeframecount; break; case 0x81c4: s3->streams.pri_fb1 = val & 0x3fffff; svga_recalctimings(svga); - svga->fullchange = changeframecount; + svga->fullchange = svga->monitor->mon_changeframecount; break; case 0x81c8: s3->streams.pri_stride = val & 0xfff; svga_recalctimings(svga); - svga->fullchange = changeframecount; + svga->fullchange = svga->monitor->mon_changeframecount; break; case 0x81cc: s3->streams.buffer_ctrl = val; svga_recalctimings(svga); - svga->fullchange = changeframecount; + svga->fullchange = svga->monitor->mon_changeframecount; break; case 0x81d0: s3->streams.sec_fb0 = val; svga_recalctimings(svga); - svga->fullchange = changeframecount; + svga->fullchange = svga->monitor->mon_changeframecount; break; case 0x81d4: s3->streams.sec_fb1 = val; svga_recalctimings(svga); - svga->fullchange = changeframecount; + svga->fullchange = svga->monitor->mon_changeframecount; break; case 0x81d8: s3->streams.sec_stride = val; svga_recalctimings(svga); - svga->fullchange = changeframecount; + svga->fullchange = svga->monitor->mon_changeframecount; break; case 0x81dc: s3->streams.overlay_ctrl = val; @@ -1864,28 +1864,28 @@ s3_accel_write_fifo_l(s3_t *s3, uint32_t addr, uint32_t val) s3->streams.pri_x = (val >> 16) & 0x7ff; s3->streams.pri_y = val & 0x7ff; svga_recalctimings(svga); - svga->fullchange = changeframecount; + 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 = changeframecount; + 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 = changeframecount; + 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 = changeframecount; + svga->fullchange = svga->monitor->mon_changeframecount; break; case 0x8504: @@ -2891,7 +2891,7 @@ s3_out(uint16_t addr, uint8_t val, void *p) if ((((svga->crtc[0x67] & 0xc) != 0xc) && (s3->chip >= S3_TRIO64V)) || (s3->chip < S3_TRIO64V)) svga->ma_latch |= (s3->ma_ext << 16); } else { - svga->fullchange = changeframecount; + svga->fullchange = svga->monitor->mon_changeframecount; svga_recalctimings(svga); } } @@ -3626,10 +3626,10 @@ s3_accel_out(uint16_t port, uint8_t val, void *p) s3->accel.advfunc_cntl = val; if ((s3->chip > S3_86C805) && ((svga->crtc[0x50] & 0xc1) == 0x80)) { s3->width = (val & 4) ? 1600 : 800; - svga->fullchange = changeframecount; + svga->fullchange = svga->monitor->mon_changeframecount; svga_recalctimings(svga); } else if (s3->chip <= S3_86C805) { - svga->fullchange = changeframecount; + svga->fullchange = svga->monitor->mon_changeframecount; svga_recalctimings(svga); } if (s3->chip > S3_86C924) @@ -5653,16 +5653,16 @@ 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; \ - svga->changedvram[(dword_remap(svga, addr) & s3->vram_mask) >> 12] = changeframecount; \ + svga->changedvram[(dword_remap(svga, addr) & s3->vram_mask) >> 12] = svga->monitor->mon_changeframecount; \ } 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] = changeframecount; \ + 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] = changeframecount; \ + svga->changedvram[(dword_remap(svga, addr) & s3->vram_mask) >> 12] = svga->monitor->mon_changeframecount; \ } else { \ vram_l[dword_remap_l(svga, addr) & (s3->vram_mask >> 2)] = dat; \ - svga->changedvram[(dword_remap_l(svga, addr) & (s3->vram_mask >> 2)) >> 10] = changeframecount; \ + svga->changedvram[(dword_remap_l(svga, addr) & (s3->vram_mask >> 2)) >> 10] = svga->monitor->mon_changeframecount; \ } static __inline void @@ -8554,7 +8554,7 @@ s3_force_redraw(void *p) { s3_t *s3 = (s3_t *) p; - s3->svga.fullchange = changeframecount; + s3->svga.fullchange = s3->svga.monitor->mon_changeframecount; } static const device_config_t s3_orchid_86c911_config[] = { diff --git a/src/video/vid_svga.c b/src/video/vid_svga.c index 0d493a59e..8b61bf395 100644 --- a/src/video/vid_svga.c +++ b/src/video/vid_svga.c @@ -84,24 +84,24 @@ void svga_set_override(svga_t *svga, int val) { if (svga->override && !val) - svga->fullchange = changeframecount; + svga->fullchange = svga->monitor->mon_changeframecount; svga->override = val; if (!val) { /* Override turned off, restore overscan X and Y per the CRTC. */ if (enable_overscan) { - overscan_y = (svga->rowcount + 1) << 1; + svga->monitor->mon_overscan_y = (svga->rowcount + 1) << 1; - if (overscan_y < 16) - overscan_y = 16; + if (svga->monitor->mon_overscan_y < 16) + svga->monitor->mon_overscan_y = 16; } - overscan_x = (svga->seqregs[1] & 1) ? 16 : 18; + svga->monitor->mon_overscan_x = (svga->seqregs[1] & 1) ? 16 : 18; if (svga->seqregs[1] & 8) - overscan_x <<= 1; + svga->monitor->mon_overscan_x <<= 1; } else - overscan_x = overscan_y = 16; + svga->monitor->mon_overscan_x = svga->monitor->mon_overscan_y = 16; /* Override turned off, fix overcan X and Y to 16. */ } @@ -124,11 +124,11 @@ svga_out(uint16_t addr, uint8_t val, void *p) } } else { if ((svga->attraddr == 0x13) && (svga->attrregs[0x13] != val)) - svga->fullchange = changeframecount; + svga->fullchange = svga->monitor->mon_changeframecount; o = svga->attrregs[svga->attraddr & 31]; svga->attrregs[svga->attraddr & 31] = val; if (svga->attraddr < 16) - svga->fullchange = changeframecount; + svga->fullchange = svga->monitor->mon_changeframecount; if (svga->attraddr == 0x10 || svga->attraddr == 0x14 || svga->attraddr < 0x10) { for (c = 0; c < 16; c++) { if (svga->attrregs[0x10] & 0x80) { @@ -137,7 +137,7 @@ svga_out(uint16_t addr, uint8_t val, void *p) svga->egapal[c] = (svga->attrregs[c] & 0x3f) | ((svga->attrregs[0x14] & 0xc) << 4); } } - svga->fullchange = changeframecount; + svga->fullchange = svga->monitor->mon_changeframecount; } /* Recalculate timings on change of attribute register 0x11 (overscan border color) too. */ @@ -150,7 +150,7 @@ svga_out(uint16_t addr, uint8_t val, void *p) svga_recalctimings(svga); } else if (svga->attraddr == 0x12) { if ((val & 0xf) != svga->plane_mask) - svga->fullchange = changeframecount; + svga->fullchange = svga->monitor->mon_changeframecount; svga->plane_mask = val & 0xf; } } @@ -211,7 +211,7 @@ svga_out(uint16_t addr, uint8_t val, void *p) case 0x3c9: if (svga->adv_flags & FLAG_RAMDAC_SHIFT) val <<= 2; - svga->fullchange = changeframecount; + svga->fullchange = svga->monitor->mon_changeframecount; switch (svga->dac_pos) { case 0: svga->dac_r = val; @@ -552,19 +552,19 @@ svga_recalctimings(svga_t *svga) svga->char_width = (svga->seqregs[1] & 1) ? 8 : 9; if (enable_overscan) { - overscan_y = (svga->rowcount + 1) << 1; + svga->monitor->mon_overscan_y = (svga->rowcount + 1) << 1; - if (overscan_y < 16) - overscan_y = 16; + if (svga->monitor->mon_overscan_y < 16) + svga->monitor->mon_overscan_y = 16; } if (!(svga->gdcreg[6] & 1) && !(svga->attrregs[0x10] & 1)) { - overscan_x = (svga->seqregs[1] & 1) ? 16 : 18; + svga->monitor->mon_overscan_x = (svga->seqregs[1] & 1) ? 16 : 18; if (svga->seqregs[1] & 8) - overscan_x <<= 1; + svga->monitor->mon_overscan_x <<= 1; } else - overscan_x = 16; + svga->monitor->mon_overscan_x = 16; if (vga_on) { if (svga->recalctimings_ex) { @@ -577,8 +577,8 @@ svga_recalctimings(svga_t *svga) xga_recalctimings(svga); } - svga->y_add = (overscan_y >> 1) - (svga->crtc[8] & 0x1f); - svga->x_add = (overscan_x >> 1); + svga->y_add = (svga->monitor->mon_overscan_y >> 1) - (svga->crtc[8] & 0x1f); + svga->x_add = (svga->monitor->mon_overscan_x >> 1); if (svga->vblankstart < svga->dispend) svga->dispend = svga->vblankstart; @@ -631,10 +631,10 @@ svga_do_render(svga_t *svga) if (!svga->override) { svga->render(svga); - svga->x_add = (overscan_x >> 1); + svga->x_add = (svga->monitor->mon_overscan_x >> 1); svga_render_overscan_left(svga); svga_render_overscan_right(svga); - svga->x_add = (overscan_x >> 1) - svga->scrollcache; + svga->x_add = (svga->monitor->mon_overscan_x >> 1) - svga->scrollcache; } if (svga->overlay_on) { @@ -719,7 +719,7 @@ svga_poll(void *p) svga->ma &= svga->vram_display_mask; if (svga->firstline == 2000) { svga->firstline = svga->displine; - video_wait_for_buffer(); + video_wait_for_buffer_monitor(svga->monitor_index); } if (svga->hwcursor_on || svga->dac_hwcursor_on || svga->overlay_on) { @@ -813,7 +813,7 @@ svga_poll(void *p) svga->sc = 0; if (svga->attrregs[0x10] & 0x20) { svga->scrollcache = 0; - svga->x_add = (overscan_x >> 1); + svga->x_add = (svga->monitor->mon_overscan_x >> 1); } } } @@ -870,7 +870,7 @@ svga_poll(void *p) svga->oddeven ^= 1; - changeframecount = svga->interlace ? 3 : 2; + svga->monitor->mon_changeframecount = svga->interlace ? 3 : 2; svga->vslines = 0; if (svga->interlace && svga->oddeven) @@ -909,7 +909,7 @@ svga_poll(void *p) if ((svga->seqregs[1] & 8) || (svga->render == svga_render_8bpp_lowres)) svga->scrollcache <<= 1; - svga->x_add = (overscan_x >> 1) - svga->scrollcache; + svga->x_add = (svga->monitor->mon_overscan_x >> 1) - svga->scrollcache; svga->linecountff = 0; @@ -938,6 +938,8 @@ svga_init(const device_t *info, svga_t *svga, void *p, int memsize, int c, d, e; svga->p = p; + svga->monitor_index = monitor_index_global; + svga->monitor = &monitors[svga->monitor_index]; for (c = 0; c < 256; c++) { e = c; @@ -951,8 +953,8 @@ svga_init(const device_t *info, svga_t *svga, void *p, int memsize, svga->attrregs[0x11] = 0; svga->overscan_color = 0x000000; - overscan_x = 16; - overscan_y = 32; + svga->monitor->mon_overscan_x = 16; + svga->monitor->mon_overscan_y = 32; svga->x_add = 8; svga->y_add = 16; @@ -1075,7 +1077,7 @@ svga_write_common(uint32_t addr, uint8_t val, uint8_t linear, void *p) if (svga->adv_flags & FLAG_ADDR_BY8) writemask2 = svga->seqregs[2]; - cycles -= video_timing_write_b; + cycles -= svga->monitor->mon_video_timing_write_b; if (!linear) { if (xga_enabled) { @@ -1136,7 +1138,7 @@ svga_write_common(uint32_t addr, uint8_t val, uint8_t linear, void *p) addr &= svga->vram_mask; - svga->changedvram[addr >> 12] = changeframecount; + svga->changedvram[addr >> 12] = svga->monitor->mon_changeframecount; count = 4; if (svga->adv_flags & FLAG_LATCH8) @@ -1276,7 +1278,7 @@ svga_read_common(uint32_t addr, uint8_t linear, void *p) if (svga->adv_flags & FLAG_ADDR_BY8) readplane = svga->gdcreg[4] & 7; - cycles -= video_timing_read_b; + cycles -= svga->monitor->mon_video_timing_read_b; if (!linear) { if (xga_enabled) { @@ -1405,11 +1407,11 @@ svga_doblit(int wx, int wy, svga_t *svga) int i, j; int xs_temp, ys_temp; - y_add = (enable_overscan) ? overscan_y : 0; - x_add = (enable_overscan) ? overscan_x : 0; - y_start = (enable_overscan) ? 0 : (overscan_y >> 1); - x_start = (enable_overscan) ? 0 : (overscan_x >> 1); - bottom = (overscan_y >> 1) + (svga->crtc[8] & 0x1f); + y_add = (enable_overscan) ? svga->monitor->mon_overscan_y : 0; + x_add = (enable_overscan) ? svga->monitor->mon_overscan_x : 0; + y_start = (enable_overscan) ? 0 : (svga->monitor->mon_overscan_y >> 1); + x_start = (enable_overscan) ? 0 : (svga->monitor->mon_overscan_x >> 1); + bottom = (svga->monitor->mon_overscan_y >> 1) + (svga->crtc[8] & 0x1f); if (svga->vertical_linedbl) { y_add <<= 1; @@ -1432,12 +1434,12 @@ svga_doblit(int wx, int wy, svga_t *svga) if (ys_temp < 32) ys_temp = 200; - if ((svga->crtc[0x17] & 0x80) && ((xs_temp != xsize) || (ys_temp != ysize) || video_force_resize_get())) { + if ((svga->crtc[0x17] & 0x80) && ((xs_temp != svga->monitor->mon_xsize) || (ys_temp != svga->monitor->mon_ysize) || video_force_resize_get_monitor(svga->monitor_index))) { /* Screen res has changed.. fix up, and let them know. */ - xsize = xs_temp; - ysize = ys_temp; + svga->monitor->mon_xsize = xs_temp; + svga->monitor->mon_ysize = ys_temp; - if ((xsize > 1984) || (ysize > 2016)) { + if ((svga->monitor->mon_xsize > 1984) || (svga->monitor->mon_ysize > 2016)) { /* 2048x2048 is the biggest safe render texture, to account for overscan, we suppress overscan starting from x 1984 and y 2016. */ x_add = 0; @@ -1449,30 +1451,30 @@ svga_doblit(int wx, int wy, svga_t *svga) /* Block resolution changes while in DPMS mode to avoid getting a bogus screen width (320). We're already rendering a blank screen anyway. */ if (!svga->dpms) - set_screen_size(xsize + x_add, ysize + y_add); + set_screen_size_monitor(svga->monitor->mon_xsize + x_add, svga->monitor->mon_ysize + y_add, svga->monitor_index); - if (video_force_resize_get()) - video_force_resize_set(0); + if (video_force_resize_get_monitor(svga->monitor_index)) + video_force_resize_set_monitor(0, svga->monitor_index); } if ((wx >= 160) && ((wy + 1) >= 120)) { /* Draw (overscan_size - scroll size) lines of overscan on top and bottom. */ for (i = 0; i < svga->y_add; i++) { - p = &buffer32->line[i & 0x7ff][0]; + p = &svga->monitor->target_buffer->line[i & 0x7ff][0]; - for (j = 0; j < (xsize + x_add); j++) + for (j = 0; j < (svga->monitor->mon_xsize + x_add); j++) p[j] = svga->overscan_color; } for (i = 0; i < bottom; i++) { - p = &buffer32->line[(ysize + svga->y_add + i) & 0x7ff][0]; + p = &svga->monitor->target_buffer->line[(svga->monitor->mon_ysize + svga->y_add + i) & 0x7ff][0]; - for (j = 0; j < (xsize + x_add); j++) + for (j = 0; j < (svga->monitor->mon_xsize + x_add); j++) p[j] = svga->overscan_color; } } - video_blit_memtoscreen(x_start, y_start, xsize + x_add, ysize + y_add); + video_blit_memtoscreen_monitor(x_start, y_start, svga->monitor->mon_xsize + x_add, svga->monitor->mon_ysize + y_add, svga->monitor_index); if (svga->vertical_linedbl) svga->vertical_linedbl >>= 1; @@ -1492,7 +1494,7 @@ svga_writeb_linear(uint32_t addr, uint8_t val, void *p) if (addr >= svga->vram_max) return; addr &= svga->vram_mask; - svga->changedvram[addr >> 12] = changeframecount; + svga->changedvram[addr >> 12] = svga->monitor->mon_changeframecount; *(uint8_t *) &svga->vram[addr] = val; } @@ -1507,7 +1509,7 @@ svga_writew_common(uint32_t addr, uint16_t val, uint8_t linear, void *p) return; } - cycles -= video_timing_write_w; + cycles -= svga->monitor->mon_video_timing_write_w; if (!linear) { addr = svga_decode_addr(svga, addr, 1); @@ -1521,12 +1523,12 @@ svga_writew_common(uint32_t addr, uint16_t val, uint8_t linear, void *p) uint32_t addr2 = svga->translate_address(addr, p); if (addr2 < svga->vram_max) { svga->vram[addr2 & svga->vram_mask] = val & 0xff; - svga->changedvram[addr2 >> 12] = changeframecount; + svga->changedvram[addr2 >> 12] = svga->monitor->mon_changeframecount; } addr2 = svga->translate_address(addr + 1, p); if (addr2 < svga->vram_max) { svga->vram[addr2 & svga->vram_mask] = (val >> 8) & 0xff; - svga->changedvram[addr2 >> 12] = changeframecount; + svga->changedvram[addr2 >> 12] = svga->monitor->mon_changeframecount; } return; } @@ -1534,7 +1536,7 @@ svga_writew_common(uint32_t addr, uint16_t val, uint8_t linear, void *p) return; addr &= svga->vram_mask; - svga->changedvram[addr >> 12] = changeframecount; + svga->changedvram[addr >> 12] = svga->monitor->mon_changeframecount; *(uint16_t *) &svga->vram[addr] = val; } @@ -1563,7 +1565,7 @@ svga_writel_common(uint32_t addr, uint32_t val, uint8_t linear, void *p) return; } - cycles -= video_timing_write_l; + cycles -= svga->monitor->mon_video_timing_write_l; if (!linear) { addr = svga_decode_addr(svga, addr, 1); @@ -1577,22 +1579,22 @@ svga_writel_common(uint32_t addr, uint32_t val, uint8_t linear, void *p) uint32_t addr2 = svga->translate_address(addr, p); if (addr2 < svga->vram_max) { svga->vram[addr2 & svga->vram_mask] = val & 0xff; - svga->changedvram[addr2 >> 12] = changeframecount; + svga->changedvram[addr2 >> 12] = svga->monitor->mon_changeframecount; } addr2 = svga->translate_address(addr + 1, p); if (addr2 < svga->vram_max) { svga->vram[addr2 & svga->vram_mask] = (val >> 8) & 0xff; - svga->changedvram[addr2 >> 12] = changeframecount; + svga->changedvram[addr2 >> 12] = svga->monitor->mon_changeframecount; } addr2 = svga->translate_address(addr + 2, p); if (addr2 < svga->vram_max) { svga->vram[addr2 & svga->vram_mask] = (val >> 16) & 0xff; - svga->changedvram[addr2 >> 12] = changeframecount; + svga->changedvram[addr2 >> 12] = svga->monitor->mon_changeframecount; } addr2 = svga->translate_address(addr + 3, p); if (addr2 < svga->vram_max) { svga->vram[addr2 & svga->vram_mask] = (val >> 24) & 0xff; - svga->changedvram[addr2 >> 12] = changeframecount; + svga->changedvram[addr2 >> 12] = svga->monitor->mon_changeframecount; } return; } @@ -1600,7 +1602,7 @@ svga_writel_common(uint32_t addr, uint32_t val, uint8_t linear, void *p) return; addr &= svga->vram_mask; - svga->changedvram[addr >> 12] = changeframecount; + svga->changedvram[addr >> 12] = svga->monitor->mon_changeframecount; *(uint32_t *) &svga->vram[addr] = val; } @@ -1639,7 +1641,7 @@ svga_readw_common(uint32_t addr, uint8_t linear, void *p) if (!svga->fast) return svga_read_common(addr, linear, p) | (svga_read_common(addr + 1, linear, p) << 8); - cycles -= video_timing_read_w; + cycles -= svga->monitor->mon_video_timing_read_w; if (!linear) { addr = svga_decode_addr(svga, addr, 0); @@ -1686,7 +1688,7 @@ svga_readl_common(uint32_t addr, uint8_t linear, void *p) return svga_read_common(addr, linear, p) | (svga_read_common(addr + 1, linear, p) << 8) | (svga_read_common(addr + 2, linear, p) << 16) | (svga_read_common(addr + 3, linear, p) << 24); } - cycles -= video_timing_read_l; + cycles -= svga->monitor->mon_video_timing_read_l; if (!linear) { addr = svga_decode_addr(svga, addr, 0); diff --git a/src/video/vid_svga_render.c b/src/video/vid_svga_render.c index ca843ac74..81621681f 100644 --- a/src/video/vid_svga_render.c +++ b/src/video/vid_svga_render.c @@ -67,7 +67,7 @@ svga_render_blank(svga_t *svga) break; } - uint32_t *line_ptr = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + uint32_t *line_ptr = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; uint32_t line_width = (uint32_t) (svga->hdisp + svga->scrollcache) * char_width * sizeof(uint32_t); memset(line_ptr, 0, line_width); } @@ -83,7 +83,7 @@ svga_render_overscan_left(svga_t *svga) if (svga->scrblank || (svga->hdisp == 0)) return; - uint32_t *line_ptr = buffer32->line[svga->displine + svga->y_add]; + uint32_t *line_ptr = svga->monitor->target_buffer->line[svga->displine + svga->y_add]; for (i = 0; i < svga->x_add; i++) *line_ptr++ = svga->overscan_color; } @@ -99,7 +99,7 @@ svga_render_overscan_right(svga_t *svga) if (svga->scrblank || (svga->hdisp == 0)) return; - uint32_t *line_ptr = &buffer32->line[svga->displine + svga->y_add][svga->x_add + svga->hdisp]; + uint32_t *line_ptr = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add + svga->hdisp]; right = (overscan_x >> 1); for (i = 0; i < right; i++) *line_ptr++ = svga->overscan_color; @@ -124,7 +124,7 @@ svga_render_text_40(svga_t *svga) svga->lastline_draw = svga->displine; if (svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; xinc = (svga->seqregs[1] & 1) ? 16 : 18; for (x = 0; x < (svga->hdisp + svga->scrollcache); x += xinc) { @@ -198,7 +198,7 @@ svga_render_text_80(svga_t *svga) svga->lastline_draw = svga->displine; if (svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; xinc = (svga->seqregs[1] & 1) ? 8 : 9; for (x = 0; x < (svga->hdisp + svga->scrollcache); x += xinc) { @@ -271,7 +271,7 @@ svga_render_text_80_ksc5601(svga_t *svga) svga->lastline_draw = svga->displine; if (svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; xinc = (svga->seqregs[1] & 1) ? 8 : 9; @@ -394,7 +394,7 @@ svga_render_2bpp_lowres(svga_t *svga) 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 = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -442,7 +442,7 @@ svga_render_2bpp_lowres(svga_t *svga) changed_addr = svga->remap_func(svga, svga->ma); if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -491,7 +491,7 @@ svga_render_2bpp_highres(svga_t *svga) 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 = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -539,7 +539,7 @@ svga_render_2bpp_highres(svga_t *svga) changed_addr = svga->remap_func(svga, svga->ma); if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -588,7 +588,7 @@ svga_render_2bpp_headland_highres(svga_t *svga) changed_addr = svga->remap_func(svga, svga->ma); if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -641,7 +641,7 @@ svga_render_4bpp_lowres(svga_t *svga) if (svga->force_old_addr) { if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -701,7 +701,7 @@ svga_render_4bpp_lowres(svga_t *svga) changed_addr = svga->remap_func(svga, svga->ma); if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -759,7 +759,7 @@ svga_render_4bpp_highres(svga_t *svga) changed_offset = (svga->ma + (svga->sc & ~svga->crtc[0x17] & 3) * 0x8000) >> 12; if (svga->changedvram[changed_offset] || svga->changedvram[changed_offset + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -819,7 +819,7 @@ svga_render_4bpp_highres(svga_t *svga) changed_addr = svga->remap_func(svga, svga->ma); if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -874,7 +874,7 @@ svga_render_8bpp_lowres(svga_t *svga) if (svga->force_old_addr) { if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -897,7 +897,7 @@ svga_render_8bpp_lowres(svga_t *svga) changed_addr = svga->remap_func(svga, svga->ma); if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -946,7 +946,7 @@ svga_render_8bpp_highres(svga_t *svga) if (svga->force_old_addr) { if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -974,7 +974,7 @@ svga_render_8bpp_highres(svga_t *svga) changed_addr = svga->remap_func(svga, svga->ma); if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -1026,7 +1026,7 @@ svga_render_8bpp_tseng_lowres(svga_t *svga) return; if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -1068,7 +1068,7 @@ svga_render_8bpp_tseng_highres(svga_t *svga) return; if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -1129,7 +1129,7 @@ svga_render_15bpp_lowres(svga_t *svga) if (svga->force_old_addr) { if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -1153,7 +1153,7 @@ svga_render_15bpp_lowres(svga_t *svga) changed_addr = svga->remap_func(svga, svga->ma); if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -1200,7 +1200,7 @@ svga_render_15bpp_highres(svga_t *svga) if (svga->force_old_addr) { if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -1230,7 +1230,7 @@ svga_render_15bpp_highres(svga_t *svga) changed_addr = svga->remap_func(svga, svga->ma); if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -1281,7 +1281,7 @@ svga_render_15bpp_mix_lowres(svga_t *svga) return; if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -1316,7 +1316,7 @@ svga_render_15bpp_mix_highres(svga_t *svga) return; if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -1361,7 +1361,7 @@ svga_render_16bpp_lowres(svga_t *svga) if (svga->force_old_addr) { if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -1383,7 +1383,7 @@ svga_render_16bpp_lowres(svga_t *svga) changed_addr = svga->remap_func(svga, svga->ma); if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -1430,7 +1430,7 @@ svga_render_16bpp_highres(svga_t *svga) if (svga->force_old_addr) { if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -1460,7 +1460,7 @@ svga_render_16bpp_highres(svga_t *svga) changed_addr = svga->remap_func(svga, svga->ma); if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -1526,14 +1526,14 @@ svga_render_24bpp_lowres(svga_t *svga) fg = svga->vram[svga->ma] | (svga->vram[svga->ma + 1] << 8) | (svga->vram[svga->ma + 2] << 16); svga->ma += 3; svga->ma &= svga->vram_display_mask; - buffer32->line[svga->displine + svga->y_add][(x << 1) + svga->x_add] = buffer32->line[svga->displine + svga->y_add][(x << 1) + 1 + svga->x_add] = fg; + svga->monitor->target_buffer->line[svga->displine + svga->y_add][(x << 1) + svga->x_add] = svga->monitor->target_buffer->line[svga->displine + svga->y_add][(x << 1) + 1 + svga->x_add] = fg; } } } else { changed_addr = svga->remap_func(svga, svga->ma); if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -1588,7 +1588,7 @@ svga_render_24bpp_highres(svga_t *svga) if (svga->force_old_addr) { if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -1615,7 +1615,7 @@ svga_render_24bpp_highres(svga_t *svga) changed_addr = svga->remap_func(svga, svga->ma); if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -1677,14 +1677,14 @@ svga_render_32bpp_lowres(svga_t *svga) dat = svga->vram[svga->ma] | (svga->vram[svga->ma + 1] << 8) | (svga->vram[svga->ma + 2] << 16); svga->ma += 4; svga->ma &= svga->vram_display_mask; - buffer32->line[svga->displine + svga->y_add][(x << 1) + svga->x_add] = buffer32->line[svga->displine + svga->y_add][(x << 1) + 1 + svga->x_add] = dat; + svga->monitor->target_buffer->line[svga->displine + svga->y_add][(x << 1) + svga->x_add] = svga->monitor->target_buffer->line[svga->displine + svga->y_add][(x << 1) + 1 + svga->x_add] = dat; } } } else { changed_addr = svga->remap_func(svga, svga->ma); if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -1724,7 +1724,7 @@ svga_render_32bpp_highres(svga_t *svga) if (svga->force_old_addr) { if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->changedvram[(svga->ma >> 12) + 2] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -1741,7 +1741,7 @@ svga_render_32bpp_highres(svga_t *svga) changed_addr = svga->remap_func(svga, svga->ma); if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -1781,7 +1781,7 @@ svga_render_ABGR8888_highres(svga_t *svga) changed_addr = svga->remap_func(svga, svga->ma); if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -1820,7 +1820,7 @@ svga_render_RGBA8888_highres(svga_t *svga) changed_addr = svga->remap_func(svga, svga->ma); if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; diff --git a/src/video/vid_table.c b/src/video/vid_table.c index ab2eb5c96..92b82d17a 100644 --- a/src/video/vid_table.c +++ b/src/video/vid_table.c @@ -163,10 +163,10 @@ video_cards[] = { { &et4000w32p_pci_device }, { &gd5430_pci_device, }, { &gd5434_pci_device }, - { &gd5436_pci_device }, + { &gd5436_pci_device, VIDEO_FLAG_TYPE_SPECIAL }, { &gd5440_pci_device }, - { &gd5446_pci_device }, - { &gd5446_stb_pci_device }, + { &gd5446_pci_device, VIDEO_FLAG_TYPE_SPECIAL }, + { &gd5446_stb_pci_device,VIDEO_FLAG_TYPE_SPECIAL }, { &gd5480_pci_device }, { &s3_spea_mercury_lite_86c928_pci_device }, { &s3_diamond_stealth64_964_pci_device }, @@ -350,7 +350,6 @@ video_reset(int card) if (!(card == VID_NONE) && !machine_has_flags(machine, MACHINE_VIDEO_ONLY) && gfxcard_2 != 0 - && (video_cards[gfxcard_2].flags != video_cards[gfxcard].flags) && device_is_valid(video_card_getdevice(gfxcard_2), machine)) { video_monitor_init(1); monitor_index_global = 1; diff --git a/src/video/vid_voodoo_banshee.c b/src/video/vid_voodoo_banshee.c index f1c1347fe..f451c4b58 100644 --- a/src/video/vid_voodoo_banshee.c +++ b/src/video/vid_voodoo_banshee.c @@ -453,7 +453,7 @@ banshee_render_16bpp_tiled(svga_t *svga) { banshee_t *banshee = (banshee_t *) svga->p; int x; - uint32_t *p = &((uint32_t *) buffer32->line[svga->displine + svga->y_add])[svga->x_add]; + uint32_t *p = &((uint32_t *) svga->monitor->target_buffer->line[svga->displine + svga->y_add])[svga->x_add]; uint32_t addr; int drawn = 0; @@ -1602,6 +1602,10 @@ banshee_read_linear(uint32_t addr, void *p) cycles -= voodoo->read_time; + if ((banshee->pci_regs[0x30] & 0x01) && addr >= banshee->bios_rom.mapping.base && addr < (banshee->bios_rom.mapping.base + banshee->bios_rom.sz)) + { + return rom_read(addr & (banshee->bios_rom.sz - 1), &banshee->bios_rom); + } addr &= svga->decode_mask; if (addr >= voodoo->tile_base) { int x, y; @@ -1616,7 +1620,7 @@ banshee_read_linear(uint32_t addr, void *p) if (addr >= svga->vram_max) return 0xff; - cycles -= video_timing_read_b; + cycles -= svga->monitor->mon_video_timing_read_b; // banshee_log("read_linear: addr=%08x val=%02x\n", addr, svga->vram[addr & svga->vram_mask]); @@ -1634,6 +1638,10 @@ banshee_read_linear_w(uint32_t addr, void *p) return banshee_read_linear(addr, p) | (banshee_read_linear(addr + 1, p) << 8); cycles -= voodoo->read_time; + if ((banshee->pci_regs[0x30] & 0x01) && addr >= banshee->bios_rom.mapping.base && addr < (banshee->bios_rom.mapping.base + banshee->bios_rom.sz)) + { + return rom_readw(addr & (banshee->bios_rom.sz - 1), &banshee->bios_rom); + } addr &= svga->decode_mask; if (addr >= voodoo->tile_base) { int x, y; @@ -1648,7 +1656,7 @@ banshee_read_linear_w(uint32_t addr, void *p) if (addr >= svga->vram_max) return 0xff; - cycles -= video_timing_read_w; + cycles -= svga->monitor->mon_video_timing_read_w; // banshee_log("read_linear: addr=%08x val=%02x\n", addr, svga->vram[addr & svga->vram_mask]); @@ -1667,6 +1675,10 @@ banshee_read_linear_l(uint32_t addr, void *p) cycles -= voodoo->read_time; + if ((banshee->pci_regs[0x30] & 0x01) && addr >= banshee->bios_rom.mapping.base && addr < (banshee->bios_rom.mapping.base + banshee->bios_rom.sz)) + { + return rom_readl(addr & (banshee->bios_rom.sz - 1), &banshee->bios_rom); + } addr &= svga->decode_mask; if (addr >= voodoo->tile_base) { int x, y; @@ -1681,7 +1693,7 @@ banshee_read_linear_l(uint32_t addr, void *p) if (addr >= svga->vram_max) return 0xff; - cycles -= video_timing_read_l; + cycles -= svga->monitor->mon_video_timing_read_l; // banshee_log("read_linear: addr=%08x val=%02x\n", addr, svga->vram[addr & svga->vram_mask]); @@ -1712,7 +1724,7 @@ banshee_write_linear(uint32_t addr, uint8_t val, void *p) if (addr >= svga->vram_max) return; - cycles -= video_timing_write_b; + cycles -= svga->monitor->mon_video_timing_write_b; svga->changedvram[addr >> 12] = changeframecount; svga->vram[addr & svga->vram_mask] = val; @@ -1747,7 +1759,7 @@ banshee_write_linear_w(uint32_t addr, uint16_t val, void *p) if (addr >= svga->vram_max) return; - cycles -= video_timing_write_w; + cycles -= svga->monitor->mon_video_timing_write_w; svga->changedvram[addr >> 12] = changeframecount; *(uint16_t *) &svga->vram[addr & svga->vram_mask] = val; @@ -1790,7 +1802,7 @@ banshee_write_linear_l(uint32_t addr, uint32_t val, void *p) if (addr >= svga->vram_max) return; - cycles -= video_timing_write_l; + cycles -= svga->monitor->mon_video_timing_write_l; svga->changedvram[addr >> 12] = changeframecount; *(uint32_t *) &svga->vram[addr & svga->vram_mask] = val; @@ -1862,7 +1874,7 @@ banshee_hwcursor_draw(svga_t *svga, int displine) if (x_off > -8) { for (xx = 0; xx < 8; xx++) { if (plane0[x >> 3] & (1 << 7)) - ((uint32_t *) buffer32->line[displine])[x_off + xx + svga->x_add] = (plane1[x >> 3] & (1 << 7)) ? col1 : col0; + ((uint32_t *) svga->monitor->target_buffer->line[displine])[x_off + xx + svga->x_add] = (plane1[x >> 3] & (1 << 7)) ? col1 : col0; plane0[x >> 3] <<= 1; plane1[x >> 3] <<= 1; @@ -1877,9 +1889,9 @@ banshee_hwcursor_draw(svga_t *svga, int displine) if (x_off > -8) { for (xx = 0; xx < 8; xx++) { if (!(plane0[x >> 3] & (1 << 7))) - ((uint32_t *) buffer32->line[displine])[x_off + xx + svga->x_add] = (plane1[x >> 3] & (1 << 7)) ? col1 : col0; + ((uint32_t *) svga->monitor->target_buffer->line[displine])[x_off + xx + svga->x_add] = (plane1[x >> 3] & (1 << 7)) ? col1 : col0; else if (plane1[x >> 3] & (1 << 7)) - ((uint32_t *) buffer32->line[displine])[x_off + xx + svga->x_add] ^= 0xffffff; + ((uint32_t *) svga->monitor->target_buffer->line[displine])[x_off + xx + svga->x_add] ^= 0xffffff; plane0[x >> 3] <<= 1; plane1[x >> 3] <<= 1; @@ -2204,7 +2216,7 @@ banshee_overlay_draw(svga_t *svga, int displine) // pclog("displine=%i addr=%08x %08x %08x %08x\n", displine, svga->overlay_latch.addr, src_addr, voodoo->overlay.vidOverlayDvdy, *(uint32_t *)src); // if (src_addr >= 0x800000) // fatal("overlay out of range!\n"); - p = &((uint32_t *) buffer32->line[displine])[svga->overlay_latch.x + svga->x_add]; + p = &((uint32_t *) svga->monitor->target_buffer->line[displine])[svga->overlay_latch.x + svga->x_add]; if (banshee->voodoo->scrfilter && banshee->voodoo->scrfilterEnabled) skip_filtering = ((banshee->vidProcCfg & VIDPROCCFG_FILTER_MODE_MASK) != VIDPROCCFG_FILTER_MODE_BILINEAR && !(banshee->vidProcCfg & VIDPROCCFG_H_SCALE_ENABLE) && !(banshee->vidProcCfg & VIDPROCCFG_FILTER_MODE_DITHER_4X4) && !(banshee->vidProcCfg & VIDPROCCFG_FILTER_MODE_DITHER_2X2)); diff --git a/src/video/vid_voodoo_display.c b/src/video/vid_voodoo_display.c index 68be3b26d..822085127 100644 --- a/src/video/vid_voodoo_display.c +++ b/src/video/vid_voodoo_display.c @@ -495,6 +495,7 @@ void voodoo_callback(void *p) { voodoo_t *voodoo = (voodoo_t *) p; + monitor_t* monitor = &monitors[voodoo->monitor_index]; if (voodoo->fbiInit0 & FBIINIT0_VGA_PASS) { if (voodoo->line < voodoo->v_disp) { @@ -518,7 +519,7 @@ voodoo_callback(void *p) } if (draw_voodoo->dirty_line[draw_line]) { - uint32_t *p = &buffer32->line[voodoo->line + 8][8]; + uint32_t *p = &monitor->target_buffer->line[voodoo->line + 8][8]; uint16_t *src = (uint16_t *) &draw_voodoo->fb_mem[draw_voodoo->front_offset + draw_line * draw_voodoo->row_width]; int x; @@ -526,14 +527,14 @@ voodoo_callback(void *p) if (voodoo->line < voodoo->dirty_line_low) { voodoo->dirty_line_low = voodoo->line; - video_wait_for_buffer(); + video_wait_for_buffer_monitor(voodoo->monitor_index); } if (voodoo->line > voodoo->dirty_line_high) voodoo->dirty_line_high = voodoo->line; /* Draw left overscan. */ for (x = 0; x < 8; x++) - buffer32->line[voodoo->line + 8][x] = 0x00000000; + monitor->target_buffer->line[voodoo->line + 8][x] = 0x00000000; if (voodoo->scrfilter && voodoo->scrfilterEnabled) { uint8_t *fil = malloc((voodoo->h_disp) * 3); /* interleaved 24-bit RGB */ @@ -556,7 +557,7 @@ voodoo_callback(void *p) /* Draw right overscan. */ for (x = 0; x < 8; x++) - buffer32->line[voodoo->line + 8][voodoo->h_disp + x + 8] = 0x00000000; + monitor->target_buffer->line[voodoo->line + 8][voodoo->h_disp + x + 8] = 0x00000000; } } } From e7e4d4e1f2d4d692bc14370178a34a0921bdee82 Mon Sep 17 00:00:00 2001 From: luennix Date: Tue, 24 Jan 2023 18:20:56 +0300 Subject: [PATCH 162/285] Add PS/2 mouse support for TriGem 486G and bump Gigabyte GA-586IP's RAM limit to 256MB --- 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 cd2813991..9ef1f5101 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -5786,7 +5786,7 @@ const machine_t machines[] = { .min_multi = 0, .max_multi = 0 }, - .bus_flags = MACHINE_VLB, + .bus_flags = MACHINE_PS2_VLB, .flags = MACHINE_IDE, .ram = { .min = 1024, @@ -7684,7 +7684,7 @@ const machine_t machines[] = { .flags = MACHINE_IDE_DUAL, .ram = { .min = 2048, - .max = 131072, + .max = 262144, .step = 2048 }, .nvrmask = 127, From 6b77140af96086b53a92afa1ae03dc7ec0fb6abb Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Thu, 26 Jan 2023 14:29:40 +0600 Subject: [PATCH 163/285] qt: Reload renderer of main monitor when multiple monitors are shown --- src/qt/qt_mainwindow.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index 0a1a359ff..86d8afff7 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -723,6 +723,7 @@ MainWindow::destroyRendererMonitorSlot(int monitor_index) } config_save(); this->renderers[monitor_index].release()->deleteLater(); + ui->stackedWidget->switchRenderer((RendererStack::Renderer) vid_api); } } @@ -2378,6 +2379,7 @@ MainWindow::on_actionShow_non_primary_monitors_triggered() monitor_settings[monitor_index].mon_window_h > 2048 ? 2048 : monitor_settings[monitor_index].mon_window_h); } secondaryRenderer->switchRenderer((RendererStack::Renderer) vid_api); + ui->stackedWidget->switchRenderer((RendererStack::Renderer) vid_api); } } else { for (int monitor_index = 1; monitor_index < MONITORS_NUM; monitor_index++) { From c06e9b35f2b83831277396ccf89a86f244e77e30 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 26 Jan 2023 22:29:51 +0100 Subject: [PATCH 164/285] Fix PIC level-triggered interrupts on IRQ's 0 to 7 (spotted by TC1995). --- src/pic.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/pic.c b/src/pic.c index b7ff54e37..bdff7f59c 100644 --- a/src/pic.c +++ b/src/pic.c @@ -587,9 +587,9 @@ picint_common(uint16_t num, int level, int set) if (num & 0x00ff) { if (level) - pic.lines |= (num >> 8); + pic.lines |= (num & 0x00ff); - pic.irr |= num; + pic.irr |= (num & 0x00ff); } } else { smi_irq_status &= ~num; @@ -600,8 +600,8 @@ picint_common(uint16_t num, int level, int set) } if (num & 0x00ff) { - pic.lines &= ~num; - pic.irr &= ~num; + pic.lines &= ~(num & 0x00ff); + pic.irr &= ~(num & 0x00ff); } } From 6f918821008dafb393ed3eef9631af2678682cbf Mon Sep 17 00:00:00 2001 From: randomtechkid <69720918+randomtechkid@users.noreply.github.com> Date: Sat, 28 Jan 2023 13:06:45 +0700 Subject: [PATCH 165/285] Code for ECS P6BAT-A+ Code for ECS P6BAT-A+ and rename ECS P6BAP to P6BAP-A+ --- src/include/86box/machine.h | 1 + src/machine/m_at_socket370.c | 880 ++++++++++++++++++----------------- src/machine/machine_table.c | 41 +- 3 files changed, 499 insertions(+), 423 deletions(-) diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index 4d5b535a8..ffc52ff24 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -710,6 +710,7 @@ extern int machine_at_cuv4xls_init(const machine_t *); extern int machine_at_6via90ap_init(const machine_t *); extern int machine_at_s1857_init(const machine_t *); extern int machine_at_p6bap_init(const machine_t *); +extern int machine_at_p6bat_init(const machine_t *); /* m_at_misc.c */ extern int machine_at_vpc2007_init(const machine_t *); diff --git a/src/machine/m_at_socket370.c b/src/machine/m_at_socket370.c index 66ef15e1d..9cf3f561e 100644 --- a/src/machine/m_at_socket370.c +++ b/src/machine/m_at_socket370.c @@ -1,422 +1,458 @@ -/* - * 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 Socket 370(PGA370) machines. - * - * - * - * Authors: Miran Grca, - * - * Copyright 2016-2019 Miran Grca. - */ -#include -#include -#include -#include -#include -#include <86box/86box.h> -#include <86box/mem.h> -#include <86box/io.h> -#include <86box/rom.h> -#include <86box/pci.h> -#include <86box/device.h> -#include <86box/chipset.h> -#include <86box/hdc.h> -#include <86box/hdc_ide.h> -#include <86box/keyboard.h> -#include <86box/flash.h> -#include <86box/sio.h> -#include <86box/hwm.h> -#include <86box/spd.h> -#include <86box/video.h> -#include "cpu.h" -#include <86box/machine.h> -#include <86box/clock.h> -#include <86box/sound.h> -#include <86box/snd_ac97.h> - -int -machine_at_s370slm_init(const machine_t *model) -{ - int ret; - - ret = bios_load_linear("roms/machines/s370slm/3LM1202.rom", - 0x000c0000, 262144, 0); - - if (bios_only || !ret) - return ret; - - machine_at_common_init_ex(model, 2); - - pci_init(PCI_CONFIG_TYPE_1); - pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); - pci_register_slot(0x0F, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x10, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x12, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x14, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); - device_add(&i440lx_device); - device_add(&piix4e_device); - device_add(&w83977tf_device); - device_add(&keyboard_ps2_ami_pci_device); - device_add(&intel_flash_bxt_device); - spd_register(SPD_TYPE_SDRAM, 0x7, 256); - device_add(&w83781d_device); /* fans: CPU, Fan 2, Chassis; temperatures: unused, CPU, unused */ - hwm_values.temperatures[0] = 0; /* unused */ - hwm_values.temperatures[2] = 0; /* unused */ - - return ret; -} - -int -machine_at_s1857_init(const machine_t *model) -{ - int ret; - - ret = bios_load_linear("roms/machines/s1857/BX57200A.ROM", - 0x000c0000, 262144, 0); - - if (bios_only || !ret) - return ret; - - machine_at_common_init_ex(model, 2); - - pci_init(PCI_CONFIG_TYPE_1); - pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); - pci_register_slot(0x0F, PCI_CARD_SOUND, 1, 0, 0, 0); - pci_register_slot(0x10, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x11, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x12, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x13, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x14, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); - device_add(&i440bx_device); - device_add(&piix4e_device); - device_add(&keyboard_ps2_ami_pci_device); - device_add(&w83977ef_370_device); - device_add(&intel_flash_bxt_device); - spd_register(SPD_TYPE_SDRAM, 0x7, 256); - - if (sound_card_current == SOUND_INTERNAL) { - device_add(&es1371_onboard_device); - device_add(&cs4297_device); /* found on other Tyan boards around the same time */ - } - - return ret; -} - -int -machine_at_p6bap_init(const machine_t *model) -{ - int ret; - - ret = bios_load_linear("roms/machines/p6bap/bapa14a.BIN", - 0x000c0000, 262144, 0); - - if (bios_only || !ret) - return ret; - - machine_at_common_init_ex(model, 2); - - pci_init(PCI_CONFIG_TYPE_1); - pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 0, 0); - pci_register_slot(0x14, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x12, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x10, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); - device_add(&via_apro133a_device); /* Rebranded as ET82C693A */ - device_add(&via_vt82c596b_device); /* Rebranded as ET82C696B */ - device_add(&w83977ef_device); - device_add(&keyboard_ps2_ami_pci_device); - device_add(&sst_flash_39sf020_device); - spd_register(SPD_TYPE_SDRAM, 0x7, 256); - - return ret; -} - -int -machine_at_cubx_init(const machine_t *model) -{ - int ret; - - ret = bios_load_linear("roms/machines/cubx/1008cu.004", - 0x000c0000, 262144, 0); - - if (bios_only || !ret) - return ret; - - machine_at_common_init_ex(model, 2); - - pci_init(PCI_CONFIG_TYPE_1); - pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x04, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); - pci_register_slot(0x07, PCI_CARD_IDE, 2, 3, 4, 1); - pci_register_slot(0x09, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x0E, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); - device_add(&i440bx_device); - device_add(&piix4e_device); - device_add(&keyboard_ps2_ami_pci_device); - device_add(&w83977ef_device); - device_add(ics9xxx_get(ICS9250_08)); - device_add(&sst_flash_39sf020_device); - spd_register(SPD_TYPE_SDRAM, 0xF, 256); - device_add(&as99127f_device); /* fans: Chassis, CPU, Power; temperatures: MB, JTPWR, CPU */ - - return ret; -} - -int -machine_at_atc7020bxii_init(const machine_t *model) -{ - int ret; - - ret = bios_load_linear("roms/machines/atc7020bxii/7020s102.bin", - 0x000c0000, 262144, 0); - - if (bios_only || !ret) - return ret; - - machine_at_common_init_ex(model, 2); - - pci_init(PCI_CONFIG_TYPE_1); - pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(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(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); - device_add(&i440bx_device); - device_add(&slc90e66_device); - device_add(&keyboard_ps2_pci_device); - device_add(&w83977ef_device); - device_add(&sst_flash_39sf020_device); - spd_register(SPD_TYPE_SDRAM, 0xF, 256); - - return ret; -} - -int -machine_at_ambx133_init(const machine_t *model) -{ - int ret; - - ret = bios_load_linear("roms/machines/ambx133/mkbx2vg2.bin", - 0x000c0000, 262144, 0); - - if (bios_only || !ret) - return ret; - - machine_at_common_init_ex(model, 2); - - pci_init(PCI_CONFIG_TYPE_1); - pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); - pci_register_slot(0x09, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0A, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); - device_add(&i440bx_device); - device_add(&piix4e_device); - device_add(&w83977ef_device); - device_add(&keyboard_ps2_ami_pci_device); - device_add(&sst_flash_39sf020_device); - spd_register(SPD_TYPE_SDRAM, 0x7, 256); - device_add(&gl518sm_2d_device); /* fans: CPUFAN1, CPUFAN2; temperature: CPU */ - hwm_values.fans[1] += 500; - hwm_values.temperatures[0] += 4; /* CPU offset */ - hwm_values.voltages[1] = RESISTOR_DIVIDER(12000, 10, 2); /* different 12V divider in BIOS (10K/2K?) */ - - return ret; -} - -int -machine_at_awo671r_init(const machine_t *model) -{ - int ret; - - ret = bios_load_linear("roms/machines/awo671r/a08139c.bin", - 0x000c0000, 262144, 0); - - if (bios_only || !ret) - return ret; - - machine_at_common_init_ex(model, 2); - - pci_init(PCI_CONFIG_TYPE_1); - pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); - pci_register_slot(0x09, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0A, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); - device_add(&i440bx_device); - device_add(&piix4e_device); - device_add_inst(&w83977ef_device, 1); - device_add_inst(&w83977ef_device, 2); - device_add(&keyboard_ps2_pci_device); - device_add(&sst_flash_39sf020_device); - spd_register(SPD_TYPE_SDRAM, 0x3, 256); - - return ret; -} - -int -machine_at_63a1_init(const machine_t *model) -{ - int ret; - - ret = bios_load_linear("roms/machines/63a1/63a-q3.bin", - 0x000c0000, 262144, 0); - - if (bios_only || !ret) - return ret; - - machine_at_common_init_ex(model, 2); - - pci_init(PCI_CONFIG_TYPE_1); - pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); - 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(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); /* Integrated Sound? */ - pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); - device_add(&i440zx_device); - device_add(&piix4e_device); - device_add(&w83977tf_device); - device_add(&keyboard_ps2_ami_pci_device); - device_add(&intel_flash_bxt_device); - spd_register(SPD_TYPE_SDRAM, 0x3, 256); - - return ret; -} - -int -machine_at_apas3_init(const machine_t *model) -{ - int ret; - - ret = bios_load_linear("roms/machines/apas3/V0218SAG.BIN", - 0x000c0000, 262144, 0); - - if (bios_only || !ret) - return ret; - - machine_at_common_init_ex(model, 2); - - pci_init(PCI_CONFIG_TYPE_1); - pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 0, 0); - pci_register_slot(0x0F, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x10, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x14, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); - device_add(&via_apro_device); - device_add(&via_vt82c586b_device); - device_add(&fdc37c669_device); - device_add(&keyboard_ps2_ami_pci_device); - device_add(&sst_flash_39sf020_device); - spd_register(SPD_TYPE_SDRAM, 0x7, 256); - - return ret; -} - -int -machine_at_cuv4xls_init(const machine_t *model) -{ - int ret; - - ret = bios_load_linear("roms/machines/cuv4xls/1005LS.001", - 0x000c0000, 262144, 0); - - if (bios_only || !ret) - return ret; - - machine_at_common_init_ex(model, 2); - - pci_init(PCI_CONFIG_TYPE_1); - pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x04, PCI_CARD_SOUTHBRIDGE, 4, 1, 2, 3); - pci_register_slot(0x05, PCI_CARD_SOUND, 3, 0, 0, 0); - pci_register_slot(0x06, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x07, PCI_CARD_NORMAL, 2, 3, 0, 0); - pci_register_slot(0x08, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x09, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x14, PCI_CARD_NORMAL, 4, 0, 0, 0); - pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); - device_add(&via_apro133a_device); - device_add(&via_vt82c686b_device); - device_add(&keyboard_ps2_ami_pci_device); - device_add(ics9xxx_get(ICS9250_18)); - device_add(&sst_flash_39sf020_device); - spd_register(SPD_TYPE_SDRAM, 0xF, 1024); - device_add(&as99127f_device); /* fans: Chassis, CPU, Power; temperatures: MB, JTPWR, CPU */ - - if (sound_card_current == SOUND_INTERNAL) - device_add(&cmi8738_onboard_device); - - return ret; -} - -int -machine_at_6via90ap_init(const machine_t *model) -{ - int ret; - - ret = bios_load_linear("roms/machines/6via90ap/90ap10.bin", - 0x000c0000, 262144, 0); - - if (bios_only || !ret) - return ret; - - machine_at_common_init_ex(model, 2); - - pci_init(PCI_CONFIG_TYPE_1); - pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); - pci_register_slot(0x09, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0A, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); - device_add(&via_apro133a_device); - device_add(&via_vt82c686b_device); /* fans: CPU1, CPU2; temperatures: CPU, System, unused */ - device_add(&keyboard_ps2_ami_pci_device); - device_add(ics9xxx_get(ICS9250_18)); - device_add(&sst_flash_39sf020_device); - spd_register(SPD_TYPE_SDRAM, 0x7, 1024); - hwm_values.temperatures[0] += 2; /* CPU offset */ - hwm_values.temperatures[1] += 2; /* System offset */ - hwm_values.temperatures[2] = 0; /* unused */ - - if (sound_card_current == SOUND_INTERNAL) - device_add(&alc100_device); /* ALC100P identified on similar Acorp boards (694TA, 6VIA90A1) */ - - return ret; -} +/* + * 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 Socket 370(PGA370) machines. + * + * + * + * Authors: Miran Grca, + * + * Copyright 2016-2019 Miran Grca. + */ +#include +#include +#include +#include +#include +#include <86box/86box.h> +#include <86box/mem.h> +#include <86box/io.h> +#include <86box/rom.h> +#include <86box/pci.h> +#include <86box/device.h> +#include <86box/chipset.h> +#include <86box/hdc.h> +#include <86box/hdc_ide.h> +#include <86box/keyboard.h> +#include <86box/flash.h> +#include <86box/sio.h> +#include <86box/hwm.h> +#include <86box/spd.h> +#include <86box/video.h> +#include "cpu.h" +#include <86box/machine.h> +#include <86box/clock.h> +#include <86box/sound.h> +#include <86box/snd_ac97.h> + +int +machine_at_s370slm_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/s370slm/3LM1202.rom", + 0x000c0000, 262144, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_init_ex(model, 2); + + pci_init(PCI_CONFIG_TYPE_1); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x10, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x12, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x14, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); + device_add(&i440lx_device); + device_add(&piix4e_device); + device_add(&w83977tf_device); + device_add(&keyboard_ps2_ami_pci_device); + device_add(&intel_flash_bxt_device); + spd_register(SPD_TYPE_SDRAM, 0x7, 256); + device_add(&w83781d_device); /* fans: CPU, Fan 2, Chassis; temperatures: unused, CPU, unused */ + hwm_values.temperatures[0] = 0; /* unused */ + hwm_values.temperatures[2] = 0; /* unused */ + + return ret; +} + +int +machine_at_s1857_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/s1857/BX57200A.ROM", + 0x000c0000, 262144, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_init_ex(model, 2); + + pci_init(PCI_CONFIG_TYPE_1); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); + pci_register_slot(0x0F, PCI_CARD_SOUND, 1, 0, 0, 0); + pci_register_slot(0x10, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x11, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x12, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x13, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x14, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); + device_add(&i440bx_device); + device_add(&piix4e_device); + device_add(&keyboard_ps2_ami_pci_device); + device_add(&w83977ef_370_device); + device_add(&intel_flash_bxt_device); + spd_register(SPD_TYPE_SDRAM, 0x7, 256); + + if (sound_card_current == SOUND_INTERNAL) { + device_add(&es1371_onboard_device); + device_add(&cs4297_device); /* found on other Tyan boards around the same time */ + } + + return ret; +} + +int +machine_at_p6bap_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/p6bap/bapa14a.BIN", + 0x000c0000, 262144, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_init_ex(model, 2); + + pci_init(PCI_CONFIG_TYPE_1); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 0, 0); + pci_register_slot(0x14, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x12, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x10, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); + device_add(&via_apro133a_device); /* Rebranded as ET82C693A */ + device_add(&via_vt82c596b_device); /* Rebranded as ET82C696B */ + device_add(&w83977ef_device); + device_add(&keyboard_ps2_ami_pci_device); + device_add(&sst_flash_39sf020_device); + spd_register(SPD_TYPE_SDRAM, 0x7, 256); + + return ret; +} + +int +machine_at_p6bat_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/p6bat/bata+56.BIN", + 0x000c0000, 262144, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_init_ex(model, 2); + + pci_init(PCI_CONFIG_TYPE_1); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 0, 0); + pci_register_slot(0x14, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x12, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x10, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); + device_add(&via_apro133_device); + device_add(&via_vt82c596b_device); + device_add(&w83977ef_device); + device_add(&keyboard_ps2_ami_pci_device); + device_add(&sst_flash_39sf020_device); + spd_register(SPD_TYPE_SDRAM, 0x7, 256); + + if (sound_card_current == SOUND_INTERNAL) { + device_add(&cmi8738_onboard_device); + } + + return ret; +} + +int +machine_at_cubx_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/cubx/1008cu.004", + 0x000c0000, 262144, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_init_ex(model, 2); + + pci_init(PCI_CONFIG_TYPE_1); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x04, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); + pci_register_slot(0x07, PCI_CARD_IDE, 2, 3, 4, 1); + pci_register_slot(0x09, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x0E, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); + device_add(&i440bx_device); + device_add(&piix4e_device); + device_add(&keyboard_ps2_ami_pci_device); + device_add(&w83977ef_device); + device_add(ics9xxx_get(ICS9250_08)); + device_add(&sst_flash_39sf020_device); + spd_register(SPD_TYPE_SDRAM, 0xF, 256); + device_add(&as99127f_device); /* fans: Chassis, CPU, Power; temperatures: MB, JTPWR, CPU */ + + return ret; +} + +int +machine_at_atc7020bxii_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/atc7020bxii/7020s102.bin", + 0x000c0000, 262144, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_init_ex(model, 2); + + pci_init(PCI_CONFIG_TYPE_1); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(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(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); + device_add(&i440bx_device); + device_add(&slc90e66_device); + device_add(&keyboard_ps2_pci_device); + device_add(&w83977ef_device); + device_add(&sst_flash_39sf020_device); + spd_register(SPD_TYPE_SDRAM, 0xF, 256); + + return ret; +} + +int +machine_at_ambx133_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/ambx133/mkbx2vg2.bin", + 0x000c0000, 262144, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_init_ex(model, 2); + + pci_init(PCI_CONFIG_TYPE_1); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); + pci_register_slot(0x09, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0A, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); + device_add(&i440bx_device); + device_add(&piix4e_device); + device_add(&w83977ef_device); + device_add(&keyboard_ps2_ami_pci_device); + device_add(&sst_flash_39sf020_device); + spd_register(SPD_TYPE_SDRAM, 0x7, 256); + device_add(&gl518sm_2d_device); /* fans: CPUFAN1, CPUFAN2; temperature: CPU */ + hwm_values.fans[1] += 500; + hwm_values.temperatures[0] += 4; /* CPU offset */ + hwm_values.voltages[1] = RESISTOR_DIVIDER(12000, 10, 2); /* different 12V divider in BIOS (10K/2K?) */ + + return ret; +} + +int +machine_at_awo671r_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/awo671r/a08139c.bin", + 0x000c0000, 262144, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_init_ex(model, 2); + + pci_init(PCI_CONFIG_TYPE_1); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); + pci_register_slot(0x09, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0A, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); + device_add(&i440bx_device); + device_add(&piix4e_device); + device_add_inst(&w83977ef_device, 1); + device_add_inst(&w83977ef_device, 2); + device_add(&keyboard_ps2_pci_device); + device_add(&sst_flash_39sf020_device); + spd_register(SPD_TYPE_SDRAM, 0x3, 256); + + return ret; +} + +int +machine_at_63a1_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/63a1/63a-q3.bin", + 0x000c0000, 262144, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_init_ex(model, 2); + + pci_init(PCI_CONFIG_TYPE_1); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); + 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(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); /* Integrated Sound? */ + pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); + device_add(&i440zx_device); + device_add(&piix4e_device); + device_add(&w83977tf_device); + device_add(&keyboard_ps2_ami_pci_device); + device_add(&intel_flash_bxt_device); + spd_register(SPD_TYPE_SDRAM, 0x3, 256); + + return ret; +} + +int +machine_at_apas3_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/apas3/V0218SAG.BIN", + 0x000c0000, 262144, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_init_ex(model, 2); + + pci_init(PCI_CONFIG_TYPE_1); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 0, 0); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x10, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x14, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); + device_add(&via_apro_device); + device_add(&via_vt82c586b_device); + device_add(&fdc37c669_device); + device_add(&keyboard_ps2_ami_pci_device); + device_add(&sst_flash_39sf020_device); + spd_register(SPD_TYPE_SDRAM, 0x7, 256); + + return ret; +} + +int +machine_at_cuv4xls_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/cuv4xls/1005LS.001", + 0x000c0000, 262144, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_init_ex(model, 2); + + pci_init(PCI_CONFIG_TYPE_1); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x04, PCI_CARD_SOUTHBRIDGE, 4, 1, 2, 3); + pci_register_slot(0x05, PCI_CARD_SOUND, 3, 0, 0, 0); + pci_register_slot(0x06, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x07, PCI_CARD_NORMAL, 2, 3, 0, 0); + pci_register_slot(0x08, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x09, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x14, PCI_CARD_NORMAL, 4, 0, 0, 0); + pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); + device_add(&via_apro133a_device); + device_add(&via_vt82c686b_device); + device_add(&keyboard_ps2_ami_pci_device); + device_add(ics9xxx_get(ICS9250_18)); + device_add(&sst_flash_39sf020_device); + spd_register(SPD_TYPE_SDRAM, 0xF, 1024); + device_add(&as99127f_device); /* fans: Chassis, CPU, Power; temperatures: MB, JTPWR, CPU */ + + if (sound_card_current == SOUND_INTERNAL) + device_add(&cmi8738_onboard_device); + + return ret; +} + +int +machine_at_6via90ap_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/6via90ap/90ap10.bin", + 0x000c0000, 262144, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_init_ex(model, 2); + + pci_init(PCI_CONFIG_TYPE_1); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); + pci_register_slot(0x09, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0A, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); + device_add(&via_apro133a_device); + device_add(&via_vt82c686b_device); /* fans: CPU1, CPU2; temperatures: CPU, System, unused */ + device_add(&keyboard_ps2_ami_pci_device); + device_add(ics9xxx_get(ICS9250_18)); + device_add(&sst_flash_39sf020_device); + spd_register(SPD_TYPE_SDRAM, 0x7, 1024); + hwm_values.temperatures[0] += 2; /* CPU offset */ + hwm_values.temperatures[1] += 2; /* System offset */ + hwm_values.temperatures[2] = 0; /* unused */ + + if (sound_card_current == SOUND_INTERNAL) + device_add(&alc100_device); /* ALC100P identified on similar Acorp boards (694TA, 6VIA90A1) */ + + return ret; +} diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 9ef1f5101..175f3ea27 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -11528,6 +11528,45 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, + /* VIA Apollo Pro */ + /* Has a Winbond W83977EF Super I/O chip with on-chip KBC with AMIKey-2 KBC + firmware. */ + { + .name = "[VIA Apollo Pro 133] ECS P6BAT-A+", + .internal_name = "p6bat", + .type = MACHINE_TYPE_SLOT1_370, + .chipset = MACHINE_CHIPSET_VIA_APOLLO_PRO_133, + .init = machine_at_p6bat_init, + .pad = 0, + .pad0 = 0, + .pad1 = MACHINE_AVAILABLE, + .pad2 = 0, + .cpu = { + .package = CPU_PKG_SLOT1 | CPU_PKG_SOCKET370, + .block = CPU_BLOCK_NONE, + .min_bus = 66666667, + .max_bus = 133333333, + .min_voltage = 1300, + .max_voltage = 3500, + .min_multi = 1.5, + .max_multi = 8.0 + }, + .bus_flags = MACHINE_PS2_AGP, + .flags = MACHINE_IDE_DUAL | MACHINE_SOUND, + .ram = { + .min = 8192, + .max = 786432, + .step = 8192 + }, + .nvrmask = 255, + .kbc = KBC_UNKNOWN, + .kbc_p1 = 0, + .gpio = 0, + .device = &cmi8738_onboard_device, + .vid_device = NULL, + .snd_device = NULL, + .net_device = NULL + }, /* Slot 2 machines */ /* 440GX */ @@ -11887,7 +11926,7 @@ const machine_t machines[] = { /* Has a Winbond W83977EF Super I/O chip with on-chip KBC with AMIKey-2 KBC firmware. */ { - .name = "[VIA Apollo Pro 133] ECS P6BAP", + .name = "[VIA Apollo Pro 133] ECS P6BAP-A+", .internal_name = "p6bap", .type = MACHINE_TYPE_SOCKET370, .chipset = MACHINE_CHIPSET_VIA_APOLLO_PRO_133, From 2ab207451cfa90829627caf9b0a86b1fec7dc5ca Mon Sep 17 00:00:00 2001 From: luennix Date: Sun, 29 Jan 2023 22:50:50 +0300 Subject: [PATCH 166/285] Moved DataExpert EXP8551 from Socket 5 to Socket 7 (Single Voltage), as it's supposed to be. --- src/machine/machine_table.c | 74 ++++++++++++++++++------------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 9ef1f5101..afc56c204 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -7772,43 +7772,6 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, - /* Has AMIKey H KBC firmware. */ - { - .name = "[i430FX] DataExpert EXP8551", - .internal_name = "exp8551", - .type = MACHINE_TYPE_SOCKET5, - .chipset = MACHINE_CHIPSET_INTEL_430FX, - .init = machine_at_exp8551_init, - .pad = 0, - .pad0 = 0, - .pad1 = MACHINE_AVAILABLE, - .pad2 = 0, - .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, - .flags = MACHINE_IDE_DUAL | MACHINE_GAMEPORT, - .ram = { - .min = 8192, - .max = 131072, - .step = 8192 - }, - .nvrmask = 127, - .kbc = KBC_UNKNOWN, - .kbc_p1 = 0, - .gpio = 0, - .device = NULL, - .vid_device = NULL, - .snd_device = NULL, - .net_device = NULL - }, /* According to tests from real hardware: This has AMI MegaKey KBC firmware on the PC87306 Super I/O chip, command 0xA1 returns '5'. Command 0xA0 copyright string: (C)1994 AMI . */ @@ -8191,6 +8154,43 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, + /* Has AMIKey H KBC firmware. */ + { + .name = "[i430FX] DataExpert EXP8551", + .internal_name = "exp8551", + .type = MACHINE_TYPE_SOCKET7_3V, + .chipset = MACHINE_CHIPSET_INTEL_430FX, + .init = machine_at_exp8551_init, + .pad = 0, + .pad0 = 0, + .pad1 = MACHINE_AVAILABLE, + .pad2 = 0, + .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, + .flags = MACHINE_IDE_DUAL | MACHINE_GAMEPORT, + .ram = { + .min = 8192, + .max = 131072, + .step = 8192 + }, + .nvrmask = 127, + .kbc = KBC_UNKNOWN, + .kbc_p1 = 0, + .gpio = 0, + .device = NULL, + .vid_device = NULL, + .snd_device = NULL, + .net_device = NULL + }, /* According to tests from real hardware: This has AMI MegaKey KBC firmware on the PC87306 Super I/O chip, command 0xA1 returns '5'. Command 0xA0 copyright string: (C)1994 AMI . */ From 915b8efe092c42771a7f94a56046f2c9deaa123f Mon Sep 17 00:00:00 2001 From: luennix Date: Sun, 29 Jan 2023 23:10:00 +0300 Subject: [PATCH 167/285] Also moved PC Partner MB500N to Socket 7 (Single Voltage) --- src/machine/machine_table.c | 74 ++++++++++++++++++------------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index afc56c204..eacd50562 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -7848,43 +7848,6 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, - /* Has a VIA VT82C42N KBC. */ - { - .name = "[i430FX] PC Partner MB500N", - .internal_name = "mb500n", - .type = MACHINE_TYPE_SOCKET5, - .chipset = MACHINE_CHIPSET_INTEL_430FX, - .init = machine_at_mb500n_init, - .pad = 0, - .pad0 = 0, - .pad1 = MACHINE_AVAILABLE, - .pad2 = 0, - .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_PCI, - .flags = MACHINE_IDE_DUAL, - .ram = { - .min = 8192, - .max = 131072, - .step = 8192 - }, - .nvrmask = 127, - .kbc = KBC_UNKNOWN, - .kbc_p1 = 0, - .gpio = 0, - .device = NULL, - .vid_device = NULL, - .snd_device = NULL, - .net_device = NULL - }, /* Has AMIKey Z(!) KBC firmware. */ { .name = "[i430FX] TriGem Hawk", @@ -8460,6 +8423,43 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, + /* Has a VIA VT82C42N KBC. */ + { + .name = "[i430FX] PC Partner MB500N", + .internal_name = "mb500n", + .type = MACHINE_TYPE_SOCKET7_3V, + .chipset = MACHINE_CHIPSET_INTEL_430FX, + .init = machine_at_mb500n_init, + .pad = 0, + .pad0 = 0, + .pad1 = MACHINE_AVAILABLE, + .pad2 = 0, + .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_PCI, + .flags = MACHINE_IDE_DUAL, + .ram = { + .min = 8192, + .max = 131072, + .step = 8192 + }, + .nvrmask = 127, + .kbc = KBC_UNKNOWN, + .kbc_p1 = 0, + .gpio = 0, + .device = NULL, + .vid_device = NULL, + .snd_device = NULL, + .net_device = NULL + }, /* Has an AMI 'H' KBC firmware (1992). */ { .name = "[i430FX] QDI FMB", From e79ed18f85f5958bae0a6e51c2c9116f597de3e6 Mon Sep 17 00:00:00 2001 From: randomtechkid <69720918+randomtechkid@users.noreply.github.com> Date: Mon, 30 Jan 2023 22:06:21 +0700 Subject: [PATCH 168/285] Fix formatting --- src/machine/m_at_socket370.c | 916 +++++++++++++++++------------------ 1 file changed, 458 insertions(+), 458 deletions(-) diff --git a/src/machine/m_at_socket370.c b/src/machine/m_at_socket370.c index 9cf3f561e..3eb3234bf 100644 --- a/src/machine/m_at_socket370.c +++ b/src/machine/m_at_socket370.c @@ -1,458 +1,458 @@ -/* - * 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 Socket 370(PGA370) machines. - * - * - * - * Authors: Miran Grca, - * - * Copyright 2016-2019 Miran Grca. - */ -#include -#include -#include -#include -#include -#include <86box/86box.h> -#include <86box/mem.h> -#include <86box/io.h> -#include <86box/rom.h> -#include <86box/pci.h> -#include <86box/device.h> -#include <86box/chipset.h> -#include <86box/hdc.h> -#include <86box/hdc_ide.h> -#include <86box/keyboard.h> -#include <86box/flash.h> -#include <86box/sio.h> -#include <86box/hwm.h> -#include <86box/spd.h> -#include <86box/video.h> -#include "cpu.h" -#include <86box/machine.h> -#include <86box/clock.h> -#include <86box/sound.h> -#include <86box/snd_ac97.h> - -int -machine_at_s370slm_init(const machine_t *model) -{ - int ret; - - ret = bios_load_linear("roms/machines/s370slm/3LM1202.rom", - 0x000c0000, 262144, 0); - - if (bios_only || !ret) - return ret; - - machine_at_common_init_ex(model, 2); - - pci_init(PCI_CONFIG_TYPE_1); - pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); - pci_register_slot(0x0F, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x10, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x12, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x14, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); - device_add(&i440lx_device); - device_add(&piix4e_device); - device_add(&w83977tf_device); - device_add(&keyboard_ps2_ami_pci_device); - device_add(&intel_flash_bxt_device); - spd_register(SPD_TYPE_SDRAM, 0x7, 256); - device_add(&w83781d_device); /* fans: CPU, Fan 2, Chassis; temperatures: unused, CPU, unused */ - hwm_values.temperatures[0] = 0; /* unused */ - hwm_values.temperatures[2] = 0; /* unused */ - - return ret; -} - -int -machine_at_s1857_init(const machine_t *model) -{ - int ret; - - ret = bios_load_linear("roms/machines/s1857/BX57200A.ROM", - 0x000c0000, 262144, 0); - - if (bios_only || !ret) - return ret; - - machine_at_common_init_ex(model, 2); - - pci_init(PCI_CONFIG_TYPE_1); - pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); - pci_register_slot(0x0F, PCI_CARD_SOUND, 1, 0, 0, 0); - pci_register_slot(0x10, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x11, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x12, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x13, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x14, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); - device_add(&i440bx_device); - device_add(&piix4e_device); - device_add(&keyboard_ps2_ami_pci_device); - device_add(&w83977ef_370_device); - device_add(&intel_flash_bxt_device); - spd_register(SPD_TYPE_SDRAM, 0x7, 256); - - if (sound_card_current == SOUND_INTERNAL) { - device_add(&es1371_onboard_device); - device_add(&cs4297_device); /* found on other Tyan boards around the same time */ - } - - return ret; -} - -int -machine_at_p6bap_init(const machine_t *model) -{ - int ret; - - ret = bios_load_linear("roms/machines/p6bap/bapa14a.BIN", - 0x000c0000, 262144, 0); - - if (bios_only || !ret) - return ret; - - machine_at_common_init_ex(model, 2); - - pci_init(PCI_CONFIG_TYPE_1); - pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 0, 0); - pci_register_slot(0x14, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x12, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x10, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); - device_add(&via_apro133a_device); /* Rebranded as ET82C693A */ - device_add(&via_vt82c596b_device); /* Rebranded as ET82C696B */ - device_add(&w83977ef_device); - device_add(&keyboard_ps2_ami_pci_device); - device_add(&sst_flash_39sf020_device); - spd_register(SPD_TYPE_SDRAM, 0x7, 256); - - return ret; -} - -int -machine_at_p6bat_init(const machine_t *model) -{ - int ret; - - ret = bios_load_linear("roms/machines/p6bat/bata+56.BIN", - 0x000c0000, 262144, 0); - - if (bios_only || !ret) - return ret; - - machine_at_common_init_ex(model, 2); - - pci_init(PCI_CONFIG_TYPE_1); - pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 0, 0); - pci_register_slot(0x14, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x12, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x10, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); - device_add(&via_apro133_device); - device_add(&via_vt82c596b_device); - device_add(&w83977ef_device); - device_add(&keyboard_ps2_ami_pci_device); - device_add(&sst_flash_39sf020_device); - spd_register(SPD_TYPE_SDRAM, 0x7, 256); - - if (sound_card_current == SOUND_INTERNAL) { - device_add(&cmi8738_onboard_device); - } - - return ret; -} - -int -machine_at_cubx_init(const machine_t *model) -{ - int ret; - - ret = bios_load_linear("roms/machines/cubx/1008cu.004", - 0x000c0000, 262144, 0); - - if (bios_only || !ret) - return ret; - - machine_at_common_init_ex(model, 2); - - pci_init(PCI_CONFIG_TYPE_1); - pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x04, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); - pci_register_slot(0x07, PCI_CARD_IDE, 2, 3, 4, 1); - pci_register_slot(0x09, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x0E, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); - device_add(&i440bx_device); - device_add(&piix4e_device); - device_add(&keyboard_ps2_ami_pci_device); - device_add(&w83977ef_device); - device_add(ics9xxx_get(ICS9250_08)); - device_add(&sst_flash_39sf020_device); - spd_register(SPD_TYPE_SDRAM, 0xF, 256); - device_add(&as99127f_device); /* fans: Chassis, CPU, Power; temperatures: MB, JTPWR, CPU */ - - return ret; -} - -int -machine_at_atc7020bxii_init(const machine_t *model) -{ - int ret; - - ret = bios_load_linear("roms/machines/atc7020bxii/7020s102.bin", - 0x000c0000, 262144, 0); - - if (bios_only || !ret) - return ret; - - machine_at_common_init_ex(model, 2); - - pci_init(PCI_CONFIG_TYPE_1); - pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(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(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); - device_add(&i440bx_device); - device_add(&slc90e66_device); - device_add(&keyboard_ps2_pci_device); - device_add(&w83977ef_device); - device_add(&sst_flash_39sf020_device); - spd_register(SPD_TYPE_SDRAM, 0xF, 256); - - return ret; -} - -int -machine_at_ambx133_init(const machine_t *model) -{ - int ret; - - ret = bios_load_linear("roms/machines/ambx133/mkbx2vg2.bin", - 0x000c0000, 262144, 0); - - if (bios_only || !ret) - return ret; - - machine_at_common_init_ex(model, 2); - - pci_init(PCI_CONFIG_TYPE_1); - pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); - pci_register_slot(0x09, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0A, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); - device_add(&i440bx_device); - device_add(&piix4e_device); - device_add(&w83977ef_device); - device_add(&keyboard_ps2_ami_pci_device); - device_add(&sst_flash_39sf020_device); - spd_register(SPD_TYPE_SDRAM, 0x7, 256); - device_add(&gl518sm_2d_device); /* fans: CPUFAN1, CPUFAN2; temperature: CPU */ - hwm_values.fans[1] += 500; - hwm_values.temperatures[0] += 4; /* CPU offset */ - hwm_values.voltages[1] = RESISTOR_DIVIDER(12000, 10, 2); /* different 12V divider in BIOS (10K/2K?) */ - - return ret; -} - -int -machine_at_awo671r_init(const machine_t *model) -{ - int ret; - - ret = bios_load_linear("roms/machines/awo671r/a08139c.bin", - 0x000c0000, 262144, 0); - - if (bios_only || !ret) - return ret; - - machine_at_common_init_ex(model, 2); - - pci_init(PCI_CONFIG_TYPE_1); - pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); - pci_register_slot(0x09, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0A, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); - device_add(&i440bx_device); - device_add(&piix4e_device); - device_add_inst(&w83977ef_device, 1); - device_add_inst(&w83977ef_device, 2); - device_add(&keyboard_ps2_pci_device); - device_add(&sst_flash_39sf020_device); - spd_register(SPD_TYPE_SDRAM, 0x3, 256); - - return ret; -} - -int -machine_at_63a1_init(const machine_t *model) -{ - int ret; - - ret = bios_load_linear("roms/machines/63a1/63a-q3.bin", - 0x000c0000, 262144, 0); - - if (bios_only || !ret) - return ret; - - machine_at_common_init_ex(model, 2); - - pci_init(PCI_CONFIG_TYPE_1); - pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); - 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(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); /* Integrated Sound? */ - pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); - device_add(&i440zx_device); - device_add(&piix4e_device); - device_add(&w83977tf_device); - device_add(&keyboard_ps2_ami_pci_device); - device_add(&intel_flash_bxt_device); - spd_register(SPD_TYPE_SDRAM, 0x3, 256); - - return ret; -} - -int -machine_at_apas3_init(const machine_t *model) -{ - int ret; - - ret = bios_load_linear("roms/machines/apas3/V0218SAG.BIN", - 0x000c0000, 262144, 0); - - if (bios_only || !ret) - return ret; - - machine_at_common_init_ex(model, 2); - - pci_init(PCI_CONFIG_TYPE_1); - pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 0, 0); - pci_register_slot(0x0F, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x10, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x14, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); - device_add(&via_apro_device); - device_add(&via_vt82c586b_device); - device_add(&fdc37c669_device); - device_add(&keyboard_ps2_ami_pci_device); - device_add(&sst_flash_39sf020_device); - spd_register(SPD_TYPE_SDRAM, 0x7, 256); - - return ret; -} - -int -machine_at_cuv4xls_init(const machine_t *model) -{ - int ret; - - ret = bios_load_linear("roms/machines/cuv4xls/1005LS.001", - 0x000c0000, 262144, 0); - - if (bios_only || !ret) - return ret; - - machine_at_common_init_ex(model, 2); - - pci_init(PCI_CONFIG_TYPE_1); - pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x04, PCI_CARD_SOUTHBRIDGE, 4, 1, 2, 3); - pci_register_slot(0x05, PCI_CARD_SOUND, 3, 0, 0, 0); - pci_register_slot(0x06, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x07, PCI_CARD_NORMAL, 2, 3, 0, 0); - pci_register_slot(0x08, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x09, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x14, PCI_CARD_NORMAL, 4, 0, 0, 0); - pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); - device_add(&via_apro133a_device); - device_add(&via_vt82c686b_device); - device_add(&keyboard_ps2_ami_pci_device); - device_add(ics9xxx_get(ICS9250_18)); - device_add(&sst_flash_39sf020_device); - spd_register(SPD_TYPE_SDRAM, 0xF, 1024); - device_add(&as99127f_device); /* fans: Chassis, CPU, Power; temperatures: MB, JTPWR, CPU */ - - if (sound_card_current == SOUND_INTERNAL) - device_add(&cmi8738_onboard_device); - - return ret; -} - -int -machine_at_6via90ap_init(const machine_t *model) -{ - int ret; - - ret = bios_load_linear("roms/machines/6via90ap/90ap10.bin", - 0x000c0000, 262144, 0); - - if (bios_only || !ret) - return ret; - - machine_at_common_init_ex(model, 2); - - pci_init(PCI_CONFIG_TYPE_1); - pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); - pci_register_slot(0x09, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0A, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); - device_add(&via_apro133a_device); - device_add(&via_vt82c686b_device); /* fans: CPU1, CPU2; temperatures: CPU, System, unused */ - device_add(&keyboard_ps2_ami_pci_device); - device_add(ics9xxx_get(ICS9250_18)); - device_add(&sst_flash_39sf020_device); - spd_register(SPD_TYPE_SDRAM, 0x7, 1024); - hwm_values.temperatures[0] += 2; /* CPU offset */ - hwm_values.temperatures[1] += 2; /* System offset */ - hwm_values.temperatures[2] = 0; /* unused */ - - if (sound_card_current == SOUND_INTERNAL) - device_add(&alc100_device); /* ALC100P identified on similar Acorp boards (694TA, 6VIA90A1) */ - - return ret; -} +/* + * 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 Socket 370(PGA370) machines. + * + * + * + * Authors: Miran Grca, + * + * Copyright 2016-2019 Miran Grca. + */ +#include +#include +#include +#include +#include +#include <86box/86box.h> +#include <86box/mem.h> +#include <86box/io.h> +#include <86box/rom.h> +#include <86box/pci.h> +#include <86box/device.h> +#include <86box/chipset.h> +#include <86box/hdc.h> +#include <86box/hdc_ide.h> +#include <86box/keyboard.h> +#include <86box/flash.h> +#include <86box/sio.h> +#include <86box/hwm.h> +#include <86box/spd.h> +#include <86box/video.h> +#include "cpu.h" +#include <86box/machine.h> +#include <86box/clock.h> +#include <86box/sound.h> +#include <86box/snd_ac97.h> + +int +machine_at_s370slm_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/s370slm/3LM1202.rom", + 0x000c0000, 262144, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_init_ex(model, 2); + + pci_init(PCI_CONFIG_TYPE_1); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x10, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x12, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x14, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); + device_add(&i440lx_device); + device_add(&piix4e_device); + device_add(&w83977tf_device); + device_add(&keyboard_ps2_ami_pci_device); + device_add(&intel_flash_bxt_device); + spd_register(SPD_TYPE_SDRAM, 0x7, 256); + device_add(&w83781d_device); /* fans: CPU, Fan 2, Chassis; temperatures: unused, CPU, unused */ + hwm_values.temperatures[0] = 0; /* unused */ + hwm_values.temperatures[2] = 0; /* unused */ + + return ret; +} + +int +machine_at_s1857_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/s1857/BX57200A.ROM", + 0x000c0000, 262144, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_init_ex(model, 2); + + pci_init(PCI_CONFIG_TYPE_1); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); + pci_register_slot(0x0F, PCI_CARD_SOUND, 1, 0, 0, 0); + pci_register_slot(0x10, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x11, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x12, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x13, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x14, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); + device_add(&i440bx_device); + device_add(&piix4e_device); + device_add(&keyboard_ps2_ami_pci_device); + device_add(&w83977ef_370_device); + device_add(&intel_flash_bxt_device); + spd_register(SPD_TYPE_SDRAM, 0x7, 256); + + if (sound_card_current == SOUND_INTERNAL) { + device_add(&es1371_onboard_device); + device_add(&cs4297_device); /* found on other Tyan boards around the same time */ + } + + return ret; +} + +int +machine_at_p6bap_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/p6bap/bapa14a.BIN", + 0x000c0000, 262144, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_init_ex(model, 2); + + pci_init(PCI_CONFIG_TYPE_1); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 0, 0); + pci_register_slot(0x14, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x12, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x10, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); + device_add(&via_apro133a_device); /* Rebranded as ET82C693A */ + device_add(&via_vt82c596b_device); /* Rebranded as ET82C696B */ + device_add(&w83977ef_device); + device_add(&keyboard_ps2_ami_pci_device); + device_add(&sst_flash_39sf020_device); + spd_register(SPD_TYPE_SDRAM, 0x7, 256); + + return ret; +} + +int +machine_at_p6bat_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/p6bat/bata+56.BIN", + 0x000c0000, 262144, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_init_ex(model, 2); + + pci_init(PCI_CONFIG_TYPE_1); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 0, 0); + pci_register_slot(0x14, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x12, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x10, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); + device_add(&via_apro133_device); + device_add(&via_vt82c596b_device); + device_add(&w83977ef_device); + device_add(&keyboard_ps2_ami_pci_device); + device_add(&sst_flash_39sf020_device); + spd_register(SPD_TYPE_SDRAM, 0x7, 256); + + if (sound_card_current == SOUND_INTERNAL) { + device_add(&cmi8738_onboard_device); + } + + return ret; +} + +int +machine_at_cubx_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/cubx/1008cu.004", + 0x000c0000, 262144, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_init_ex(model, 2); + + pci_init(PCI_CONFIG_TYPE_1); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x04, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); + pci_register_slot(0x07, PCI_CARD_IDE, 2, 3, 4, 1); + pci_register_slot(0x09, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x0E, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); + device_add(&i440bx_device); + device_add(&piix4e_device); + device_add(&keyboard_ps2_ami_pci_device); + device_add(&w83977ef_device); + device_add(ics9xxx_get(ICS9250_08)); + device_add(&sst_flash_39sf020_device); + spd_register(SPD_TYPE_SDRAM, 0xF, 256); + device_add(&as99127f_device); /* fans: Chassis, CPU, Power; temperatures: MB, JTPWR, CPU */ + + return ret; +} + +int +machine_at_atc7020bxii_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/atc7020bxii/7020s102.bin", + 0x000c0000, 262144, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_init_ex(model, 2); + + pci_init(PCI_CONFIG_TYPE_1); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(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(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); + device_add(&i440bx_device); + device_add(&slc90e66_device); + device_add(&keyboard_ps2_pci_device); + device_add(&w83977ef_device); + device_add(&sst_flash_39sf020_device); + spd_register(SPD_TYPE_SDRAM, 0xF, 256); + + return ret; +} + +int +machine_at_ambx133_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/ambx133/mkbx2vg2.bin", + 0x000c0000, 262144, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_init_ex(model, 2); + + pci_init(PCI_CONFIG_TYPE_1); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); + pci_register_slot(0x09, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0A, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); + device_add(&i440bx_device); + device_add(&piix4e_device); + device_add(&w83977ef_device); + device_add(&keyboard_ps2_ami_pci_device); + device_add(&sst_flash_39sf020_device); + spd_register(SPD_TYPE_SDRAM, 0x7, 256); + device_add(&gl518sm_2d_device); /* fans: CPUFAN1, CPUFAN2; temperature: CPU */ + hwm_values.fans[1] += 500; + hwm_values.temperatures[0] += 4; /* CPU offset */ + hwm_values.voltages[1] = RESISTOR_DIVIDER(12000, 10, 2); /* different 12V divider in BIOS (10K/2K?) */ + + return ret; +} + +int +machine_at_awo671r_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/awo671r/a08139c.bin", + 0x000c0000, 262144, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_init_ex(model, 2); + + pci_init(PCI_CONFIG_TYPE_1); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); + pci_register_slot(0x09, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0A, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); + device_add(&i440bx_device); + device_add(&piix4e_device); + device_add_inst(&w83977ef_device, 1); + device_add_inst(&w83977ef_device, 2); + device_add(&keyboard_ps2_pci_device); + device_add(&sst_flash_39sf020_device); + spd_register(SPD_TYPE_SDRAM, 0x3, 256); + + return ret; +} + +int +machine_at_63a1_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/63a1/63a-q3.bin", + 0x000c0000, 262144, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_init_ex(model, 2); + + pci_init(PCI_CONFIG_TYPE_1); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); + 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(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); /* Integrated Sound? */ + pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); + device_add(&i440zx_device); + device_add(&piix4e_device); + device_add(&w83977tf_device); + device_add(&keyboard_ps2_ami_pci_device); + device_add(&intel_flash_bxt_device); + spd_register(SPD_TYPE_SDRAM, 0x3, 256); + + return ret; +} + +int +machine_at_apas3_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/apas3/V0218SAG.BIN", + 0x000c0000, 262144, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_init_ex(model, 2); + + pci_init(PCI_CONFIG_TYPE_1); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 0, 0); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x10, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x14, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); + device_add(&via_apro_device); + device_add(&via_vt82c586b_device); + device_add(&fdc37c669_device); + device_add(&keyboard_ps2_ami_pci_device); + device_add(&sst_flash_39sf020_device); + spd_register(SPD_TYPE_SDRAM, 0x7, 256); + + return ret; +} + +int +machine_at_cuv4xls_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/cuv4xls/1005LS.001", + 0x000c0000, 262144, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_init_ex(model, 2); + + pci_init(PCI_CONFIG_TYPE_1); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x04, PCI_CARD_SOUTHBRIDGE, 4, 1, 2, 3); + pci_register_slot(0x05, PCI_CARD_SOUND, 3, 0, 0, 0); + pci_register_slot(0x06, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x07, PCI_CARD_NORMAL, 2, 3, 0, 0); + pci_register_slot(0x08, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x09, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x14, PCI_CARD_NORMAL, 4, 0, 0, 0); + pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); + device_add(&via_apro133a_device); + device_add(&via_vt82c686b_device); + device_add(&keyboard_ps2_ami_pci_device); + device_add(ics9xxx_get(ICS9250_18)); + device_add(&sst_flash_39sf020_device); + spd_register(SPD_TYPE_SDRAM, 0xF, 1024); + device_add(&as99127f_device); /* fans: Chassis, CPU, Power; temperatures: MB, JTPWR, CPU */ + + if (sound_card_current == SOUND_INTERNAL) + device_add(&cmi8738_onboard_device); + + return ret; +} + +int +machine_at_6via90ap_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/6via90ap/90ap10.bin", + 0x000c0000, 262144, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_init_ex(model, 2); + + pci_init(PCI_CONFIG_TYPE_1); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); + pci_register_slot(0x09, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0A, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); + device_add(&via_apro133a_device); + device_add(&via_vt82c686b_device); /* fans: CPU1, CPU2; temperatures: CPU, System, unused */ + device_add(&keyboard_ps2_ami_pci_device); + device_add(ics9xxx_get(ICS9250_18)); + device_add(&sst_flash_39sf020_device); + spd_register(SPD_TYPE_SDRAM, 0x7, 1024); + hwm_values.temperatures[0] += 2; /* CPU offset */ + hwm_values.temperatures[1] += 2; /* System offset */ + hwm_values.temperatures[2] = 0; /* unused */ + + if (sound_card_current == SOUND_INTERNAL) + device_add(&alc100_device); /* ALC100P identified on similar Acorp boards (694TA, 6VIA90A1) */ + + return ret; +} From a34dc15dc0a786461fd79d00b61f63372b6c9f23 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Mon, 30 Jan 2023 13:56:55 -0300 Subject: [PATCH 169/285] Jenkins: Update openal-soft to 1.22.2 --- .ci/build.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.ci/build.sh b/.ci/build.sh index 31e1d770f..af6a31abf 100644 --- a/.ci/build.sh +++ b/.ci/build.sh @@ -949,13 +949,13 @@ else if grep -q "OPENAL:BOOL=ON" build/CMakeCache.txt then - # Build openal-soft 1.21.1 manually to fix audio issues. This is a temporary + # Build openal-soft 1.22.2 manually to fix audio issues. This is a temporary # workaround until a newer version of openal-soft trickles down to Debian repos. - prefix="$cache_dir/openal-soft-1.21.1" + prefix="$cache_dir/openal-soft-1.22.2" if [ ! -d "$prefix" ] then rm -rf "$cache_dir/openal-soft-"* # remove old versions - wget -qO - https://github.com/kcat/openal-soft/archive/refs/tags/1.21.1.tar.gz | tar zxf - -C "$cache_dir" || rm -rf "$prefix" + wget -qO - https://github.com/kcat/openal-soft/archive/refs/tags/1.22.2.tar.gz | tar zxf - -C "$cache_dir" || rm -rf "$prefix" fi prefix_build="$prefix/build-$arch_deb" cmake -G Ninja -D "CMAKE_TOOLCHAIN_FILE=$toolchain_file" -D "CMAKE_INSTALL_PREFIX=$cwd_root/archive_tmp/usr" -S "$prefix" -B "$prefix_build" || exit 99 From 3cb6e8d9aa5ecd263cfb49c4f4dc369b99e55b63 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Mon, 30 Jan 2023 15:20:37 -0300 Subject: [PATCH 170/285] Jenkins: Patch openal-soft to enable PipeWire --- .ci/build.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.ci/build.sh b/.ci/build.sh index af6a31abf..df1b097e9 100644 --- a/.ci/build.sh +++ b/.ci/build.sh @@ -951,11 +951,15 @@ else then # Build openal-soft 1.22.2 manually to fix audio issues. This is a temporary # workaround until a newer version of openal-soft trickles down to Debian repos. - prefix="$cache_dir/openal-soft-1.22.2" + prefix="$cache_dir/openal-soft-1.22.2-pwpatch" if [ ! -d "$prefix" ] then rm -rf "$cache_dir/openal-soft-"* # remove old versions wget -qO - https://github.com/kcat/openal-soft/archive/refs/tags/1.22.2.tar.gz | tar zxf - -C "$cache_dir" || rm -rf "$prefix" + + # Patches to build with the old PipeWire version in Debian. + sed -i -e 's/>=0.3.23//' "$prefix/CMakeLists.txt" + sed -i -e 's/PW_KEY_CONFIG_NAME/"config.name"/g' "$prefix/alc/backends/pipewire.cpp" fi prefix_build="$prefix/build-$arch_deb" cmake -G Ninja -D "CMAKE_TOOLCHAIN_FILE=$toolchain_file" -D "CMAKE_INSTALL_PREFIX=$cwd_root/archive_tmp/usr" -S "$prefix" -B "$prefix_build" || exit 99 From 8493bde039b18bbad63e83fb75ae762a1a9d02e3 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Mon, 30 Jan 2023 15:35:10 -0300 Subject: [PATCH 171/285] Jenkins: Fix openal-soft prefix --- .ci/build.sh | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/.ci/build.sh b/.ci/build.sh index df1b097e9..83c5c48c2 100644 --- a/.ci/build.sh +++ b/.ci/build.sh @@ -951,16 +951,17 @@ else then # Build openal-soft 1.22.2 manually to fix audio issues. This is a temporary # workaround until a newer version of openal-soft trickles down to Debian repos. - prefix="$cache_dir/openal-soft-1.22.2-pwpatch" + prefix="$cache_dir/openal-soft-1.22.2" if [ ! -d "$prefix" ] then rm -rf "$cache_dir/openal-soft-"* # remove old versions wget -qO - https://github.com/kcat/openal-soft/archive/refs/tags/1.22.2.tar.gz | tar zxf - -C "$cache_dir" || rm -rf "$prefix" - - # Patches to build with the old PipeWire version in Debian. - sed -i -e 's/>=0.3.23//' "$prefix/CMakeLists.txt" - sed -i -e 's/PW_KEY_CONFIG_NAME/"config.name"/g' "$prefix/alc/backends/pipewire.cpp" fi + + # Patches to build with the old PipeWire version in Debian. + sed -i -e 's/>=0.3.23//' "$prefix/CMakeLists.txt" + sed -i -e 's/PW_KEY_CONFIG_NAME/"config.name"/g' "$prefix/alc/backends/pipewire.cpp" + prefix_build="$prefix/build-$arch_deb" cmake -G Ninja -D "CMAKE_TOOLCHAIN_FILE=$toolchain_file" -D "CMAKE_INSTALL_PREFIX=$cwd_root/archive_tmp/usr" -S "$prefix" -B "$prefix_build" || exit 99 cmake --build "$prefix_build" -j$(nproc) || exit 99 From 934c5df8fd7bb878612ddc217704824dacae4a42 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Mon, 30 Jan 2023 18:26:14 -0300 Subject: [PATCH 172/285] Jenkins: Remove sound systems from FluidSynth as we don't use them --- .ci/build.sh | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.ci/build.sh b/.ci/build.sh index 83c5c48c2..99d05bca4 100644 --- a/.ci/build.sh +++ b/.ci/build.sh @@ -1004,7 +1004,8 @@ else cmake --build "$prefix_build" -j$(nproc) || exit 99 cmake --install "$prefix_build" || exit 99 - # Build FluidSynth without JACK support to remove the dependency on libjack once again. + # Build FluidSynth without sound systems to remove the dependencies on libjack + # and other sound system libraries. We don't output audio through FluidSynth. prefix="$cache_dir/fluidsynth-2.3.0" if [ ! -d "$prefix" ] then @@ -1014,7 +1015,9 @@ else cp cmake/flags-gcc.cmake cmake/flags-gcc.cmake.old sed -i -e 's/ -Werror=.*\([" ]\)/\1/g' cmake/flags-gcc.cmake # temporary hack for -Werror=old-style-definition non-compliance on FluidSynth and SDL2 prefix_build="$prefix/build-$arch_deb" - cmake -G Ninja -D enable-jack=OFF -D enable-sdl2=$sdl_ss -D "CMAKE_TOOLCHAIN_FILE=$toolchain_file" -D "CMAKE_INSTALL_PREFIX=$cwd_root/archive_tmp/usr" -S "$prefix" -B "$prefix_build" || exit 99 + cmake -G Ninja -D enable-dbus=OFF -D enable-jack=OFF -D enable-oss=OFF -D enable-sdl2=OFF -D enable-pulseaudio=OFF -D enable-pipewire=OFF -D enable-alsa=OFF \ + -D "CMAKE_TOOLCHAIN_FILE=$toolchain_file" -D "CMAKE_INSTALL_PREFIX=$cwd_root/archive_tmp/usr" \ + -S "$prefix" -B "$prefix_build" || exit 99 cmake --build "$prefix_build" -j$(nproc) || exit 99 cmake --install "$prefix_build" || exit 99 cp -p "$cwd_root/archive_tmp/usr/bin/fluidsynth" fluidsynth From 05874029284b5863ac7c8e2e5d1b8b3c0d92cdef Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Mon, 30 Jan 2023 19:04:49 -0300 Subject: [PATCH 173/285] Jenkins: Update appimage-builder to CI build to fix arm64 issues --- .ci/build.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.ci/build.sh b/.ci/build.sh index 99d05bca4..947d49a20 100644 --- a/.ci/build.sh +++ b/.ci/build.sh @@ -1166,7 +1166,8 @@ EOF done < .ci/AppImageBuilder.yml # Download appimage-builder if necessary. - appimage_builder_url="https://github.com/AppImageCrafters/appimage-builder/releases/download/v1.1.0/appimage-builder-1.1.0-$(uname -m).AppImage" + #appimage_builder_url="https://github.com/AppImageCrafters/appimage-builder/releases/download/v1.1.0/appimage-builder-1.1.0-$(uname -m).AppImage" + appimage_builder_url="https://ci.86box.net/userContent/appimage-builder-1.1.1.dev32+g2709a3b-x86_64.AppImage" appimage_builder_binary="$cache_dir/$(basename "$appimage_builder_url")" if [ ! -e "$appimage_builder_binary" ] then From a8604a6b6ab117f8710a55fd2ac57a1525108d53 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Mon, 30 Jan 2023 22:37:55 -0300 Subject: [PATCH 174/285] Jenkins: Proper workaround for the appimage-builder interpreter issue --- .ci/build.sh | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/.ci/build.sh b/.ci/build.sh index 947d49a20..b09e7c71b 100644 --- a/.ci/build.sh +++ b/.ci/build.sh @@ -1163,11 +1163,25 @@ EOF # Copy line. echo "$line" >> AppImageBuilder-generated.yml + + # Workaround for appimage-builder issues 272 and 283 (i686 and armhf are also missing) + if [ "$arch_appimage" != "x86_64" -a "$line" = " files:" ] + then + echo " include:" >> AppImageBuilder-generated.yml + for loader in "/lib/$libdir/ld-linux"*.so.* + do + for loader_copy in "$loader" "/lib/$(basename "$loader")" + do + mkdir -p "/runtime/compat$(dirname "$loader_copy")" + ln -s "$loader" "/runtime/compat$loader_copy" + echo " - /runtime/compat$loader_copy" >> AppImageBuilder-generated.yml + done + done + fi done < .ci/AppImageBuilder.yml # Download appimage-builder if necessary. - #appimage_builder_url="https://github.com/AppImageCrafters/appimage-builder/releases/download/v1.1.0/appimage-builder-1.1.0-$(uname -m).AppImage" - appimage_builder_url="https://ci.86box.net/userContent/appimage-builder-1.1.1.dev32+g2709a3b-x86_64.AppImage" + appimage_builder_url="https://github.com/AppImageCrafters/appimage-builder/releases/download/v1.1.0/appimage-builder-1.1.0-$(uname -m).AppImage" appimage_builder_binary="$cache_dir/$(basename "$appimage_builder_url")" if [ ! -e "$appimage_builder_binary" ] then @@ -1183,7 +1197,7 @@ EOF ln -s "$cache_dir/appimage-builder-cache" appimage-builder-cache # Run appimage-builder in extract-and-run mode for Docker compatibility. - # --appdir is a workaround for https://github.com/AppImageCrafters/appimage-builder/issues/270 + # --appdir is a workaround for appimage-builder issue 270 reported by us. for retry in 1 2 3 4 5 do project="$project" project_id="$project_id" project_version="$project_version" project_icon="$project_icon" arch_deb="$arch_deb" \ From a926ea1d8492938b07cf657b1d508d8210c3c2e2 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 31 Jan 2023 07:27:34 +0100 Subject: [PATCH 175/285] SiS 85c50x SMRAM fixes. --- src/chipset/sis_85c50x.c | 79 ++++++++++++++++++++++++++-------------- 1 file changed, 52 insertions(+), 27 deletions(-) diff --git a/src/chipset/sis_85c50x.c b/src/chipset/sis_85c50x.c index 24fdd7788..8d7222d54 100644 --- a/src/chipset/sis_85c50x.c +++ b/src/chipset/sis_85c50x.c @@ -59,7 +59,7 @@ typedef struct sis_85c50x_t { pci_conf[256], pci_conf_sb[256], regs[256]; - smram_t *smram; + smram_t *smram[2]; port_92_t *port_92; } sis_85c50x_t; @@ -93,28 +93,41 @@ static void sis_85c50x_smm_recalc(sis_85c50x_t *dev) { /* NOTE: Naming mismatch - what the datasheet calls "host address" is what we call ram_base. */ - uint32_t ram_base = (dev->pci_conf[0x64] << 20) | ((dev->pci_conf[0x65] & 0x07) << 28); + uint32_t host_base = (dev->pci_conf[0x64] << 20) | ((dev->pci_conf[0x65] & 0x07) << 28); - smram_disable(dev->smram); + smram_disable_all(); - if ((((dev->pci_conf[0x65] & 0xe0) >> 5) != 0x00) && (ram_base == 0x00000000)) + if ((((dev->pci_conf[0x65] & 0xe0) >> 5) != 0x00) && (host_base == 0x00000000)) return; switch ((dev->pci_conf[0x65] & 0xe0) >> 5) { case 0x00: - smram_enable(dev->smram, 0xe0000, 0xe0000, 0x8000, (dev->pci_conf[0x65] & 0x10), 1); + sis_85c50x_log("SiS 50x SMRAM: 000E0000-000E7FFF -> 000E0000-000E7FFF\n"); + smram_enable(dev->smram[0], 0xe0000, 0xe0000, 0x8000, (dev->pci_conf[0x65] & 0x10), 1); break; case 0x01: - smram_enable(dev->smram, 0xb0000, ram_base, 0x10000, (dev->pci_conf[0x65] & 0x10), 1); + host_base |= 0x000b0000; + sis_85c50x_log("SiS 50x SMRAM: %08X-%08X -> 000B0000-000BFFFF\n", host_base, host_base + 0x10000 - 1); + smram_enable(dev->smram[0], host_base, 0xb0000, 0x10000, (dev->pci_conf[0x65] & 0x10), 1); + smram_enable(dev->smram[1], host_base ^ 0x00100000, 0xb0000, 0x10000, (dev->pci_conf[0x65] & 0x10), 1); break; case 0x02: - smram_enable(dev->smram, 0xa0000, ram_base, 0x10000, (dev->pci_conf[0x65] & 0x10), 1); + host_base |= 0x000a0000; + sis_85c50x_log("SiS 50x SMRAM: %08X-%08X -> 000A0000-000AFFFF\n", host_base, host_base + 0x10000 - 1); + smram_enable(dev->smram[0], host_base, 0xa0000, 0x10000, (dev->pci_conf[0x65] & 0x10), 1); + smram_enable(dev->smram[1], host_base ^ 0x00100000, 0xa0000, 0x10000, (dev->pci_conf[0x65] & 0x10), 1); break; case 0x04: - smram_enable(dev->smram, 0xa0000, ram_base, 0x8000, (dev->pci_conf[0x65] & 0x10), 1); + host_base |= 0x000a0000; + sis_85c50x_log("SiS 50x SMRAM: %08X-%08X -> 000A0000-000AFFFF\n", host_base, host_base + 0x8000 - 1); + smram_enable(dev->smram[0], host_base, 0xa0000, 0x8000, (dev->pci_conf[0x65] & 0x10), 1); + smram_enable(dev->smram[1], host_base ^ 0x00100000, 0xa0000, 0x8000, (dev->pci_conf[0x65] & 0x10), 1); break; case 0x06: - smram_enable(dev->smram, 0xb0000, ram_base, 0x8000, (dev->pci_conf[0x65] & 0x10), 1); + host_base |= 0x000b0000; + sis_85c50x_log("SiS 50x SMRAM: %08X-%08X -> 000B0000-000BFFFF\n", host_base, host_base + 0x8000 - 1); + smram_enable(dev->smram[0], host_base, 0xb0000, 0x8000, (dev->pci_conf[0x65] & 0x10), 1); + smram_enable(dev->smram[1], host_base ^ 0x00100000, 0xa0000, 0x8000, (dev->pci_conf[0x65] & 0x10), 1); break; } } @@ -125,7 +138,9 @@ sis_85c50x_write(int func, int addr, uint8_t val, void *priv) sis_85c50x_t *dev = (sis_85c50x_t *) priv; uint8_t valxor = (val ^ dev->pci_conf[addr]); - switch (addr) { + sis_85c50x_log("85C501: [W] (%02X, %02X) = %02X\n", func, addr, val); + + if (func == 0x00) switch (addr) { case 0x04: /* Command - low byte */ dev->pci_conf[addr] = (dev->pci_conf[addr] & 0xb4) | (val & 0x4b); break; @@ -177,8 +192,8 @@ sis_85c50x_write(int func, int addr, uint8_t val, void *priv) break; case 0x5b: dev->pci_conf[addr] = val; - if (valxor & 0xc0) - port_92_set_features(dev->port_92, !!(val & 0x40), !!(val & 0x80)); + // if (valxor & 0xc0) + // port_92_set_features(dev->port_92, !!(val & 0x40), !!(val & 0x80)); break; case 0x60: /* SMI */ if ((dev->pci_conf[0x68] & 0x01) && !(dev->pci_conf[addr] & 0x02) && (val & 0x02)) { @@ -199,18 +214,20 @@ sis_85c50x_write(int func, int addr, uint8_t val, void *priv) dev->pci_conf[addr] &= ~(val); break; } - - sis_85c50x_log("85C501: dev->pci_conf[%02x] = %02x\n", addr, val); } static uint8_t sis_85c50x_read(int func, int addr, void *priv) { sis_85c50x_t *dev = (sis_85c50x_t *) priv; + uint8_t ret = 0xff; - sis_85c50x_log("85C501: dev->pci_conf[%02x] (%02x)\n", addr, dev->pci_conf[addr]); + if (func == 0x00) + ret = dev->pci_conf[addr]; - return dev->pci_conf[addr]; + sis_85c50x_log("85C501: [R] (%02X, %02X) = %02X\n", func, addr, ret); + + return ret; } static void @@ -218,7 +235,9 @@ sis_85c50x_sb_write(int func, int addr, uint8_t val, void *priv) { sis_85c50x_t *dev = (sis_85c50x_t *) priv; - switch (addr) { + sis_85c50x_log("85C503: [W] (%02X, %02X) = %02X\n", func, addr, val); + + if (func == 0x00) switch (addr) { case 0x04: /* Command */ dev->pci_conf_sb[addr] = val & 0x0f; break; @@ -246,17 +265,20 @@ sis_85c50x_sb_write(int func, int addr, uint8_t val, void *priv) dev->pci_conf_sb[addr] = val; break; } - - sis_85c50x_log("85C503: dev->pci_conf_sb[%02x] = %02x\n", addr, val); } static uint8_t sis_85c50x_sb_read(int func, int addr, void *priv) { sis_85c50x_t *dev = (sis_85c50x_t *) priv; - sis_85c50x_log("85C503: dev->pci_conf_sb[%02x] (%02x)\n", addr, dev->pci_conf_sb[addr]); + uint8_t ret = 0xff; - return dev->pci_conf_sb[addr]; + if (func == 0x00) + ret = dev->pci_conf_sb[addr]; + + sis_85c50x_log("85C503: [W] (%02X, %02X) = %02X\n", func, addr, ret); + + return ret; } static void @@ -264,6 +286,8 @@ sis_85c50x_isa_write(uint16_t addr, uint8_t val, void *priv) { sis_85c50x_t *dev = (sis_85c50x_t *) priv; + sis_85c50x_log("85C503 ISA: [W] (%04X) = %02X\n", addr, val); + switch (addr) { case 0x22: dev->index = val; @@ -279,7 +303,7 @@ sis_85c50x_isa_write(uint16_t addr, uint8_t val, void *priv) break; case 0x84: case 0x88: - case 0x9: + case 0x89: case 0x8a: case 0x8b: dev->regs[dev->index] = val; @@ -290,8 +314,6 @@ sis_85c50x_isa_write(uint16_t addr, uint8_t val, void *priv) } break; } - - sis_85c50x_log("85C501-ISA: dev->regs[%02x] = %02x\n", addr, val); } static uint8_t @@ -313,7 +335,7 @@ sis_85c50x_isa_read(uint16_t addr, void *priv) break; } - sis_85c50x_log("85C501-ISA: dev->regs[%02x] (%02x)\n", dev->index, ret); + sis_85c50x_log("85C503 ISA: [R] (%04X) = %02X\n", addr, ret); return ret; } @@ -370,7 +392,8 @@ sis_85c50x_close(void *priv) { sis_85c50x_t *dev = (sis_85c50x_t *) priv; - smram_del(dev->smram); + smram_del(dev->smram[1]); + smram_del(dev->smram[0]); free(dev); } @@ -387,7 +410,9 @@ sis_85c50x_init(const device_t *info) pci_add_card(PCI_ADD_SOUTHBRIDGE, sis_85c50x_sb_read, sis_85c50x_sb_write, dev); io_sethandler(0x0022, 0x0002, sis_85c50x_isa_read, NULL, NULL, sis_85c50x_isa_write, NULL, NULL, dev); - dev->smram = smram_add(); + dev->smram[0] = smram_add(); + dev->smram[1] = smram_add(); + dev->port_92 = device_add(&port_92_device); sis_85c50x_reset(dev); From 2ddb5407a562e314174eb4b447f09199d0d5df7c Mon Sep 17 00:00:00 2001 From: luennix Date: Tue, 31 Jan 2023 13:13:25 +0300 Subject: [PATCH 176/285] Fixed mistakes when moving EXP8551 and MB500N. --- src/include/86box/machine.h | 4 +-- src/machine/m_at_socket5.c | 58 ----------------------------------- src/machine/m_at_socket7_3v.c | 58 +++++++++++++++++++++++++++++++++++ 3 files changed, 60 insertions(+), 60 deletions(-) diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index 4d5b535a8..e06b7fe3e 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -558,10 +558,8 @@ extern int machine_at_430nx_init(const machine_t *); extern int machine_at_acerv30_init(const machine_t *); extern int machine_at_apollo_init(const machine_t *); -extern int machine_at_exp8551_init(const machine_t *); extern int machine_at_zappa_init(const machine_t *); extern int machine_at_powermatev_init(const machine_t *); -extern int machine_at_mb500n_init(const machine_t *); extern int machine_at_hawk_init(const machine_t *); extern int machine_at_pat54pv_init(const machine_t *); @@ -574,12 +572,14 @@ extern int machine_at_sq588_init(const machine_t *); /* m_at_socket7_3v.c */ extern int machine_at_p54tp4xe_init(const machine_t *); extern int machine_at_p54tp4xe_mr_init(const machine_t *); +extern int machine_at_exp8551_init(const machine_t *); extern int machine_at_gw2katx_init(const machine_t *); extern int machine_at_thor_init(const machine_t *); extern int machine_at_mrthor_init(const machine_t *); extern int machine_at_endeavor_init(const machine_t *); extern int machine_at_ms5119_init(const machine_t *); extern int machine_at_pb640_init(const machine_t *); +extern int machine_at_mb500n_init(const machine_t *); extern int machine_at_fmb_init(const machine_t *); extern int machine_at_acerm3a_init(const machine_t *); diff --git a/src/machine/m_at_socket5.c b/src/machine/m_at_socket5.c index fa562a62c..1d0b523d3 100644 --- a/src/machine/m_at_socket5.c +++ b/src/machine/m_at_socket5.c @@ -160,35 +160,6 @@ machine_at_apollo_init(const machine_t *model) return ret; } -int -machine_at_exp8551_init(const machine_t *model) -{ - int ret; - - ret = bios_load_linear("roms/machines/exp8551/AMI20.BIO", - 0x000e0000, 131072, 0); - - if (bios_only || !ret) - return ret; - - machine_at_common_init(model); - - pci_init(PCI_CONFIG_TYPE_1); - pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x14, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x12, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x11, 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); - device_add(&i430fx_device); - device_add(&piix_device); - device_add(&w83787f_device); - device_add(&sst_flash_29ee010_device); - - return ret; -} - int machine_at_zappa_init(const machine_t *model) { @@ -246,35 +217,6 @@ machine_at_powermatev_init(const machine_t *model) return ret; } -int -machine_at_mb500n_init(const machine_t *model) -{ - int ret; - - ret = bios_load_linear("roms/machines/mb500n/031396s.bin", - 0x000e0000, 131072, 0); - - if (bios_only || !ret) - return ret; - - machine_at_common_init(model); - - pci_init(PCI_CONFIG_TYPE_1); - pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x14, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x12, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x11, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); - device_add(&keyboard_ps2_pci_device); - device_add(&i430fx_device); - device_add(&piix_no_mirq_device); - device_add(&fdc37c665_device); - device_add(&intel_flash_bxt_device); - - return ret; -} - int machine_at_hawk_init(const machine_t *model) { diff --git a/src/machine/m_at_socket7_3v.c b/src/machine/m_at_socket7_3v.c index 7616d8a4a..03be14c37 100644 --- a/src/machine/m_at_socket7_3v.c +++ b/src/machine/m_at_socket7_3v.c @@ -120,6 +120,35 @@ machine_at_p54tp4xe_mr_init(const machine_t *model) return ret; } +int +machine_at_exp8551_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/exp8551/AMI20.BIO", + 0x000e0000, 131072, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_init(model); + + pci_init(PCI_CONFIG_TYPE_1); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x14, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x12, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x11, 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); + device_add(&i430fx_device); + device_add(&piix_device); + device_add(&w83787f_device); + device_add(&sst_flash_29ee010_device); + + return ret; +} + int machine_at_gw2katx_init(const machine_t *model) { @@ -267,6 +296,35 @@ machine_at_pb640_init(const machine_t *model) return ret; } +int +machine_at_mb500n_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/mb500n/031396s.bin", + 0x000e0000, 131072, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_init(model); + + pci_init(PCI_CONFIG_TYPE_1); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x14, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x12, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x11, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); + device_add(&keyboard_ps2_pci_device); + device_add(&i430fx_device); + device_add(&piix_no_mirq_device); + device_add(&fdc37c665_device); + device_add(&intel_flash_bxt_device); + + return ret; +} + int machine_at_fmb_init(const machine_t *model) { From 887995df05d5e65c6978f2e69074412d378d62db Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Tue, 31 Jan 2023 13:39:38 -0300 Subject: [PATCH 177/285] Jenkins: Add debug prints to figure out appimage-builder continuing not to work properly on CI only --- .ci/build.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.ci/build.sh b/.ci/build.sh index b09e7c71b..e10d254b1 100644 --- a/.ci/build.sh +++ b/.ci/build.sh @@ -1179,6 +1179,9 @@ EOF done fi done < .ci/AppImageBuilder.yml + echo = appimage-builder workaround list start = + grep /runtime/compat AppImageBuilder-generated.yml + echo = appimage-builder workaround list end = # Download appimage-builder if necessary. appimage_builder_url="https://github.com/AppImageCrafters/appimage-builder/releases/download/v1.1.0/appimage-builder-1.1.0-$(uname -m).AppImage" From 5b7ae72c334d6f9f0a59d4d2ae9eb46a68b4034b Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Tue, 31 Jan 2023 14:07:37 -0300 Subject: [PATCH 178/285] Jenkins: Fix /runtime workaround directory creation (not a fan) --- .ci/build.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.ci/build.sh b/.ci/build.sh index e10d254b1..63a957477 100644 --- a/.ci/build.sh +++ b/.ci/build.sh @@ -1167,6 +1167,9 @@ EOF # Workaround for appimage-builder issues 272 and 283 (i686 and armhf are also missing) if [ "$arch_appimage" != "x86_64" -a "$line" = " files:" ] then + # Some mild arbitrary code execution with a dummy package... + [ ! -d /runtime ] && sudo apt-get -y -o 'DPkg::Post-Invoke::=mkdir -p /runtime; chmod 777 /runtime' install libsixel1 > /dev/null 2>&1 + echo " include:" >> AppImageBuilder-generated.yml for loader in "/lib/$libdir/ld-linux"*.so.* do @@ -1179,9 +1182,6 @@ EOF done fi done < .ci/AppImageBuilder.yml - echo = appimage-builder workaround list start = - grep /runtime/compat AppImageBuilder-generated.yml - echo = appimage-builder workaround list end = # Download appimage-builder if necessary. appimage_builder_url="https://github.com/AppImageCrafters/appimage-builder/releases/download/v1.1.0/appimage-builder-1.1.0-$(uname -m).AppImage" From dd384432f0131eabf6dfb3e18f036c0e0a86c334 Mon Sep 17 00:00:00 2001 From: luennix Date: Tue, 31 Jan 2023 20:49:06 +0300 Subject: [PATCH 179/285] Add Gemlight GMB-P54SPS (SiS 501, Socket 5) --- src/include/86box/machine.h | 1 + src/machine/m_at_socket5.c | 29 +++++++++++++++++++++++++++++ src/machine/machine_table.c | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+) diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index e06b7fe3e..96d76b097 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -568,6 +568,7 @@ extern int machine_at_hot543_init(const machine_t *); extern int machine_at_p54sp4_init(const machine_t *); extern int machine_at_sq588_init(const machine_t *); +extern int machine_at_p54sps_init(const machine_t *); /* m_at_socket7_3v.c */ extern int machine_at_p54tp4xe_init(const machine_t *); diff --git a/src/machine/m_at_socket5.c b/src/machine/m_at_socket5.c index 1d0b523d3..842554713 100644 --- a/src/machine/m_at_socket5.c +++ b/src/machine/m_at_socket5.c @@ -344,3 +344,32 @@ machine_at_sq588_init(const machine_t *model) return ret; } + +int +machine_at_p54sps_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/p54sps/35s106.bin", + 0x000e0000, 131072, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_init(model); + + pci_init(PCI_CONFIG_TYPE_1); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x01, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x06, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x07, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x08, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x09, PCI_CARD_NORMAL, 4, 1, 2, 3); + device_add(&sis_85c50x_device); + device_add(&ide_pci_2ch_device); + device_add(&keyboard_at_ami_device); + device_add(&w83787f_device); + device_add(&sst_flash_29ee010_device); + + return ret; +} diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index eacd50562..5bdd5b948 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -8040,6 +8040,43 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, + /* This machine has a Winbond W83C842 KBC */ + { + .name = "[SiS 501] Gemlight GMB-P54SPS", + .internal_name = "p54sps", + .type = MACHINE_TYPE_SOCKET5, + .chipset = MACHINE_CHIPSET_SIS_501, + .init = machine_at_p54sps_init, + .pad = 0, + .pad0 = 0, + .pad1 = MACHINE_AVAILABLE, + .pad2 = 0, + .cpu = { + .package = CPU_PKG_SOCKET5_7, + CPU_BLOCK(CPU_PENTIUMMMX), + .min_bus = 50000000, + .max_bus = 66666667, + .min_voltage = 3520, + .max_voltage = 3520, + .min_multi = 1.5, + .max_multi = 1.5 + }, + .bus_flags = MACHINE_PCI, + .flags = MACHINE_IDE_DUAL, + .ram = { + .min = 8192, + .max = 131072, + .step = 8192 + }, + .nvrmask = 127, + .kbc = KBC_JETKEY_5_W83C42, + .kbc_p1 = 0, + .gpio = 0, + .device = NULL, + .vid_device = NULL, + .snd_device = NULL, + .net_device = NULL + }, /* Socket 7 (Single Voltage) machines */ /* 430FX */ From 91d5050a21940d89994bcca1f79ed0e09d7fdd5f Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Tue, 31 Jan 2023 18:29:29 -0300 Subject: [PATCH 180/285] Overhaul XInput2 handling to properly support absolute input devices, closes #2856 --- src/qt/xinput2_mouse.cpp | 119 ++++++++++++++++++++++++++------------- 1 file changed, 80 insertions(+), 39 deletions(-) diff --git a/src/qt/xinput2_mouse.cpp b/src/qt/xinput2_mouse.cpp index 7e49c2694..da7a2d1e0 100644 --- a/src/qt/xinput2_mouse.cpp +++ b/src/qt/xinput2_mouse.cpp @@ -11,11 +11,12 @@ * * * Authors: Cacodemon345 + * RichardG * - * Copyright 2022 Cacodemon345 + * Copyright 2022 Cacodemon345. + * Copyright 2023 RichardG. */ -/* Valuator parsing and duplicate event checking code from SDL2. */ #include #include #include @@ -43,20 +44,19 @@ extern "C" { #include <86box/plat.h> } -int xi2flides[2] = { 0, 0 }; - static Display *disp = nullptr; static QThread *procThread = nullptr; static XIEventMask ximask; static std::atomic exitfromthread = false; static std::atomic xi2_mouse_x = 0, xi2_mouse_y = 0, xi2_mouse_abs_x = 0, xi2_mouse_abs_y = 0; -static int xi2opcode = 0; -static double prev_rel_coords[2] = { 0., 0. }; -static Time prev_time = 0; +static int xi2opcode = 0; +static double prev_coords[2] = { 0.0 }; +static Time prev_time = 0; -// From SDL2. +/* Based on SDL2. */ static void -parse_valuators(const double *input_values, const unsigned char *mask, int mask_len, +parse_valuators(const double *input_values, + const unsigned char *mask, int mask_len, double *output_values, int output_values_len) { int i = 0, z = 0; @@ -64,11 +64,10 @@ parse_valuators(const double *input_values, const unsigned char *mask, int mask_ if (top > 16) top = 16; - memset(output_values, 0, output_values_len * sizeof(double)); + memset(output_values, 0, output_values_len * sizeof(output_values[0])); for (; i < top && z < output_values_len; i++) { if (XIMaskIsSet(mask, i)) { - const int value = (int) *input_values; - output_values[z] = value; + output_values[z] = *input_values; input_values++; } z++; @@ -92,8 +91,7 @@ xinput2_proc() XISetMask(ximask.mask, XI_RawButtonPress); XISetMask(ximask.mask, XI_RawButtonRelease); XISetMask(ximask.mask, XI_RawMotion); - if (XKeysymToKeycode(disp, XK_Home) == 69) - XISetMask(ximask.mask, XI_Motion); + XISetMask(ximask.mask, XI_Motion); XISelectEvents(disp, win, &ximask, 1); @@ -103,23 +101,77 @@ 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)) { + const XIRawEvent *rawev = (const XIRawEvent *) cookie->data; + double coords[2] = { 0.0 }; + switch (cookie->evtype) { + case XI_Motion: + { + const XIDeviceEvent *devev = (const XIDeviceEvent *) cookie->data; + parse_valuators(devev->valuators.values, devev->valuators.mask, devev->valuators.mask_len, coords, 2); + + /* XIDeviceEvent and XIRawEvent share the XIEvent base struct, which + doesn't contain deviceid, but that's at the same offset on both. */ + goto common_motion; + } + case XI_RawMotion: { - const XIRawEvent *rawev = (const XIRawEvent *) cookie->data; - double relative_coords[2] = { 0., 0. }; - parse_valuators(rawev->raw_values, rawev->valuators.mask, - rawev->valuators.mask_len, relative_coords, 2); + parse_valuators(rawev->raw_values, rawev->valuators.mask, rawev->valuators.mask_len, coords, 2); +common_motion: + /* Ignore duplicated events. */ + if ((rawev->time == prev_time) && (coords[0] == prev_coords[0]) && (coords[1] == prev_coords[1])) + break; - if ((rawev->time == prev_time) && (relative_coords[0] == prev_rel_coords[0]) && (relative_coords[1] == prev_rel_coords[1])) { - break; // Ignore duplicated events. + /* SDL2 queries the device on every event, so doing that should be fine. */ + int i; + XIDeviceInfo *xidevinfo = XIQueryDevice(disp, rawev->deviceid, &i); + if (xidevinfo) { + /* Process the device's axes. */ + int axis = 0; + for (i = 0; i < xidevinfo->num_classes; i++) { + const XIValuatorClassInfo *v = (const XIValuatorClassInfo *) xidevinfo->classes[i]; + if (v->type == XIValuatorClass) { + /* Is this an absolute or relative axis? */ + if (v->mode == XIModeRelative) { + /* Set relative coordinates. */ + if (axis == 0) + xi2_mouse_x = xi2_mouse_x + coords[axis]; + else + xi2_mouse_y = xi2_mouse_y + coords[axis]; + } else { + /* Convert absolute value range to pixel granularity, then to relative coordinates. */ + int disp_screen = XDefaultScreen(disp), abs_conv; + double abs_div; + if (axis == 0) { + abs_div = (v->max - v->min) / (double) XDisplayWidth(disp, disp_screen); + if (abs_div <= 0) + abs_div = 1; + abs_conv = (coords[axis] - v->min) / abs_div; + + if (xi2_mouse_abs_x != 0) + xi2_mouse_x = xi2_mouse_x + (abs_conv - xi2_mouse_abs_x); + xi2_mouse_abs_x = abs_conv; + } else { + abs_div = (v->max - v->min) / (double) XDisplayHeight(disp, disp_screen); + if (abs_div <= 0) + abs_div = 1; + abs_conv = (coords[axis] - v->min) / abs_div; + + if (xi2_mouse_abs_y != 0) + xi2_mouse_y = xi2_mouse_y + (abs_conv - xi2_mouse_abs_y); + xi2_mouse_abs_y = abs_conv; + } + } + prev_coords[axis] = coords[axis]; + if (++axis >= 2) /* stop after X and Y processed */ + break; + } + } } - xi2_mouse_x = xi2_mouse_x + relative_coords[0]; - xi2_mouse_y = xi2_mouse_y + relative_coords[1]; - prev_rel_coords[0] = relative_coords[0]; - prev_rel_coords[1] = relative_coords[1]; - prev_time = rawev->time; + + prev_time = rawev->time; if (!mouse_capture) break; XWindowAttributes winattrib {}; @@ -128,19 +180,8 @@ xinput2_proc() XWarpPointer(disp, XRootWindow(disp, XScreenNumberOfScreen(winattrib.screen)), XRootWindow(disp, XScreenNumberOfScreen(winattrib.screen)), 0, 0, 0, 0, globalPoint.x(), globalPoint.y()); XFlush(disp); } - } - case XI_Motion: - { - if (XKeysymToKeycode(disp, XK_Home) == 69) { - // No chance we will get raw motion events on VNC. - const XIDeviceEvent *motionev = (const XIDeviceEvent *) cookie->data; - if (xi2_mouse_abs_x != 0 || xi2_mouse_abs_y != 0) { - xi2_mouse_x = xi2_mouse_x + (motionev->event_x - xi2_mouse_abs_x); - xi2_mouse_y = xi2_mouse_y + (motionev->event_y - xi2_mouse_abs_y); - } - xi2_mouse_abs_x = motionev->event_x; - xi2_mouse_abs_y = motionev->event_y; - } + + break; } } } From f74b72d33277b163a0892d2aa3112c7e564918f3 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Tue, 31 Jan 2023 21:00:19 -0300 Subject: [PATCH 181/285] xinput2_mouse: Keep all absolute coordinate conversions in the double domain --- src/qt/xinput2_mouse.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/qt/xinput2_mouse.cpp b/src/qt/xinput2_mouse.cpp index da7a2d1e0..c9fe8f740 100644 --- a/src/qt/xinput2_mouse.cpp +++ b/src/qt/xinput2_mouse.cpp @@ -142,26 +142,26 @@ common_motion: xi2_mouse_y = xi2_mouse_y + coords[axis]; } else { /* Convert absolute value range to pixel granularity, then to relative coordinates. */ - int disp_screen = XDefaultScreen(disp), abs_conv; + int disp_screen = XDefaultScreen(disp); double abs_div; if (axis == 0) { abs_div = (v->max - v->min) / (double) XDisplayWidth(disp, disp_screen); if (abs_div <= 0) abs_div = 1; - abs_conv = (coords[axis] - v->min) / abs_div; + abs_div = (coords[axis] - v->min) / abs_div; if (xi2_mouse_abs_x != 0) - xi2_mouse_x = xi2_mouse_x + (abs_conv - xi2_mouse_abs_x); - xi2_mouse_abs_x = abs_conv; + xi2_mouse_x = xi2_mouse_x + (abs_div - xi2_mouse_abs_x); + xi2_mouse_abs_x = abs_div; } else { abs_div = (v->max - v->min) / (double) XDisplayHeight(disp, disp_screen); if (abs_div <= 0) abs_div = 1; - abs_conv = (coords[axis] - v->min) / abs_div; + abs_div = (coords[axis] - v->min) / abs_div; if (xi2_mouse_abs_y != 0) - xi2_mouse_y = xi2_mouse_y + (abs_conv - xi2_mouse_abs_y); - xi2_mouse_abs_y = abs_conv; + xi2_mouse_y = xi2_mouse_y + (abs_div - xi2_mouse_abs_y); + xi2_mouse_abs_y = abs_div; } } prev_coords[axis] = coords[axis]; From 3d15dfbe4b67ac62c53f96dfd9348462d615ed31 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Wed, 1 Feb 2023 01:45:23 -0500 Subject: [PATCH 182/285] Fix compile on OpenBSD --- src/include/discord_game_sdk.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/include/discord_game_sdk.h b/src/include/discord_game_sdk.h index 62ea8418e..4c4044eb6 100644 --- a/src/include/discord_game_sdk.h +++ b/src/include/discord_game_sdk.h @@ -248,13 +248,13 @@ typedef uint8_t DiscordNetworkChannelId; #ifdef __APPLE__ typedef void IDXGISwapChain; #endif -#ifdef __linux__ +#if defined (__linux__) || defined (__OpenBSD__) typedef void IDXGISwapChain; #endif #ifdef __APPLE__ typedef void MSG; #endif -#ifdef __linux__ +#if defined (__linux__) || defined (__OpenBSD__) typedef void MSG; #endif typedef char DiscordPath[4096]; From 4ebbeec488c87adbbb901f992ac6abeb5f8635ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Wed, 1 Feb 2023 16:48:07 +0100 Subject: [PATCH 183/285] Revert "Merge pull request #3069 from jriwanek-forks/OpenBSD" This reverts commit bc78165dd8123f72dd87fc091611c9f3994a07e3, reversing changes made to f74b72d33277b163a0892d2aa3112c7e564918f3. --- src/include/discord_game_sdk.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/include/discord_game_sdk.h b/src/include/discord_game_sdk.h index 4c4044eb6..62ea8418e 100644 --- a/src/include/discord_game_sdk.h +++ b/src/include/discord_game_sdk.h @@ -248,13 +248,13 @@ typedef uint8_t DiscordNetworkChannelId; #ifdef __APPLE__ typedef void IDXGISwapChain; #endif -#if defined (__linux__) || defined (__OpenBSD__) +#ifdef __linux__ typedef void IDXGISwapChain; #endif #ifdef __APPLE__ typedef void MSG; #endif -#if defined (__linux__) || defined (__OpenBSD__) +#ifdef __linux__ typedef void MSG; #endif typedef char DiscordPath[4096]; From 7490bb12c9ff3c7cac4606d94beb89facd1ab4f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Wed, 1 Feb 2023 17:17:56 +0100 Subject: [PATCH 184/285] Move Discord Rich Presence behind a compile-time option --- CMakeLists.txt | 1 + src/CMakeLists.txt | 7 ++++++- src/qt/qt_main.cpp | 11 +++++++++-- src/qt/qt_mainwindow.cpp | 10 +++++++++- src/qt/qt_platform.cpp | 8 +++++++- src/win/languages/cs-CZ.rc | 2 ++ src/win/languages/de-DE.rc | 2 ++ src/win/languages/en-GB.rc | 2 ++ src/win/languages/en-US.rc | 2 ++ src/win/languages/es-ES.rc | 2 ++ src/win/languages/fi-FI.rc | 2 ++ src/win/languages/fr-FR.rc | 2 ++ src/win/languages/hr-HR.rc | 2 ++ src/win/languages/hu-HU.rc | 2 ++ src/win/languages/it-IT.rc | 2 ++ src/win/languages/ja-JP.rc | 2 ++ src/win/languages/ko-KR.rc | 2 ++ src/win/languages/pl-PL.rc | 2 ++ src/win/languages/pt-BR.rc | 2 ++ src/win/languages/pt-PT.rc | 2 ++ src/win/languages/ru-RU.rc | 2 ++ src/win/languages/sl-SI.rc | 2 ++ src/win/languages/tr-TR.rc | 2 ++ src/win/languages/uk-UA.rc | 2 ++ src/win/languages/zh-CN.rc | 2 ++ src/win/languages/zh-TW.rc | 2 ++ src/win/win_ui.c | 17 ++++++++++++++++- 27 files changed, 90 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b067bedbe..dfbd87b7e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -138,6 +138,7 @@ option(MINITRACE "Enable Chrome tracing using the modified minitrace library" option(GDBSTUB "Enable GDB stub server for debugging" OFF) option(DEV_BRANCH "Development branch" OFF) option(QT "Qt GUI" ON) +option(DISCORD "Discord Rich Presence support" ON) # Development branch features # diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 476c27439..77de8aad9 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -19,7 +19,7 @@ if(APPLE) endif() add_executable(86Box 86box.c config.c log.c random.c timer.c io.c acpi.c apm.c - dma.c ddma.c discord.c nmi.c pic.c pit.c pit_fast.c port_6x.c port_92.c ppi.c pci.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 fifo8.c device.c nvr.c nvr_at.c nvr_ps2.c machine_status.c ini.c) if(CMAKE_SYSTEM_NAME MATCHES "Linux") @@ -51,6 +51,11 @@ if(DEV_BRANCH) add_compile_definitions(DEV_BRANCH) endif() +if(DISCORD) + add_compile_definitions(DISCORD) + target_sources(86Box PRIVATE discord.c) +endif() + if(VNC) find_package(LibVNCServer) if(LibVNCServer_FOUND) diff --git a/src/qt/qt_main.cpp b/src/qt/qt_main.cpp index e2d4c6c90..5bd2d40d3 100644 --- a/src/qt/qt_main.cpp +++ b/src/qt/qt_main.cpp @@ -52,7 +52,9 @@ extern "C" { #include <86box/plat.h> #include <86box/ui.h> #include <86box/video.h> -#include <86box/discord.h> +#ifdef DISCORD +# include <86box/discord.h> +#endif #include <86box/gdbstub.h> } @@ -196,7 +198,9 @@ main(int argc, char *argv[]) return 0; } +#ifdef DISCORD discord_load(); +#endif main_window = new MainWindow(); if (startMaximized) { @@ -271,12 +275,14 @@ main(int argc, char *argv[]) /* Set the PAUSE mode depending on the renderer. */ // plat_pause(0); QTimer onesec; - QTimer discordupdate; QObject::connect(&onesec, &QTimer::timeout, &app, [] { pc_onesec(); }); onesec.setTimerType(Qt::PreciseTimer); onesec.start(1000); + +#ifdef DISCORD + QTimer discordupdate; if (discord_loaded) { QTimer::singleShot(1000, &app, [] { if (enable_discord) { @@ -290,6 +296,7 @@ main(int argc, char *argv[]) }); discordupdate.start(1000); } +#endif /* Initialize the rendering window, or fullscreen. */ QTimer::singleShot(0, &app, [] { diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index 86d8afff7..0af5626f3 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -39,7 +39,9 @@ extern "C" { #include <86box/keyboard.h> #include <86box/plat.h> #include <86box/ui.h> -#include <86box/discord.h> +#ifdef DISCORD +# include <86box/discord.h> +#endif #include <86box/device.h> #include <86box/video.h> #include <86box/machine.h> @@ -305,6 +307,10 @@ MainWindow::MainWindow(QWidget *parent) ui->actionEnable_Discord_integration->setChecked(enable_discord); ui->actionApply_fullscreen_stretch_mode_when_maximized->setChecked(video_fullscreen_scale_maximized); +#ifndef DISCORD + ui->actionEnable_Discord_integration->setVisible(false); +#endif + #if defined Q_OS_WINDOWS || defined Q_OS_MACOS /* Make the option visible only if ANGLE is loaded. */ ui->actionHardware_Renderer_OpenGL_ES->setVisible(QOpenGLContext::openGLModuleType() == QOpenGLContext::LibGLES); @@ -2292,11 +2298,13 @@ void MainWindow::on_actionEnable_Discord_integration_triggered(bool checked) { enable_discord = checked; +#ifdef DISCORD if (enable_discord) { discord_init(); discord_update_activity(dopause); } else discord_close(); +#endif } void diff --git a/src/qt/qt_platform.cpp b/src/qt/qt_platform.cpp index f1d56d061..695531d5c 100644 --- a/src/qt/qt_platform.cpp +++ b/src/qt/qt_platform.cpp @@ -103,7 +103,9 @@ extern "C" { #include <86box/rom.h> #include <86box/config.h> #include <86box/ui.h> -#include <86box/discord.h> +#ifdef DISCORD +# include <86box/discord.h> +#endif #include "../cpu/cpu.h" #include <86box/plat.h> @@ -377,7 +379,11 @@ plat_pause(int p) } else { ui_window_title(oldtitle); } + +#ifdef DISCORD discord_update_activity(dopause); +#endif + QTimer::singleShot(0, main_window, &MainWindow::updateUiPauseState); #ifdef Q_OS_WINDOWS diff --git a/src/win/languages/cs-CZ.rc b/src/win/languages/cs-CZ.rc index 635d2dc89..1d48b7d12 100644 --- a/src/win/languages/cs-CZ.rc +++ b/src/win/languages/cs-CZ.rc @@ -104,7 +104,9 @@ BEGIN MENUITEM "Pořídit &screenshot\tCtrl+F11", IDM_ACTION_SCREENSHOT MENUITEM SEPARATOR MENUITEM "&Předvolby...", IDM_PREFERENCES +#ifdef DISCORD MENUITEM "Povolit integraci s &Discordem", IDM_DISCORD +#endif MENUITEM SEPARATOR MENUITEM "&Zesílení zvuku", IDM_SND_GAIN #ifdef MTR_ENABLED diff --git a/src/win/languages/de-DE.rc b/src/win/languages/de-DE.rc index 308657978..98c89fc2a 100644 --- a/src/win/languages/de-DE.rc +++ b/src/win/languages/de-DE.rc @@ -104,7 +104,9 @@ BEGIN MENUITEM "S&creenshot aufnehmen\tStrg+F11", IDM_ACTION_SCREENSHOT MENUITEM SEPARATOR MENUITEM "&Einstellungen...", IDM_PREFERENCES +#ifdef DISCORD MENUITEM "&Discord-Integration aktivieren", IDM_DISCORD +#endif MENUITEM SEPARATOR MENUITEM "&Klangverstärkung...", IDM_SND_GAIN #ifdef MTR_ENABLED diff --git a/src/win/languages/en-GB.rc b/src/win/languages/en-GB.rc index 0cc4a8f5a..2ca59c8c8 100644 --- a/src/win/languages/en-GB.rc +++ b/src/win/languages/en-GB.rc @@ -104,7 +104,9 @@ BEGIN MENUITEM "Take s&creenshot\tCtrl+F11", IDM_ACTION_SCREENSHOT MENUITEM SEPARATOR MENUITEM "&Preferences...", IDM_PREFERENCES +#ifdef DISCORD MENUITEM "Enable &Discord integration", IDM_DISCORD +#endif MENUITEM SEPARATOR MENUITEM "Sound &gain...", IDM_SND_GAIN #ifdef MTR_ENABLED diff --git a/src/win/languages/en-US.rc b/src/win/languages/en-US.rc index 12100b0bf..005b2495f 100644 --- a/src/win/languages/en-US.rc +++ b/src/win/languages/en-US.rc @@ -104,7 +104,9 @@ BEGIN MENUITEM "Take s&creenshot\tCtrl+F11", IDM_ACTION_SCREENSHOT MENUITEM SEPARATOR MENUITEM "&Preferences...", IDM_PREFERENCES +#ifdef DISCORD MENUITEM "Enable &Discord integration", IDM_DISCORD +#endif MENUITEM SEPARATOR MENUITEM "Sound &gain...", IDM_SND_GAIN #ifdef MTR_ENABLED diff --git a/src/win/languages/es-ES.rc b/src/win/languages/es-ES.rc index cf9c03371..ff6dc1b76 100644 --- a/src/win/languages/es-ES.rc +++ b/src/win/languages/es-ES.rc @@ -104,7 +104,9 @@ BEGIN MENUITEM "Tomar c&aptura\tCtrl+F11", IDM_ACTION_SCREENSHOT MENUITEM SEPARATOR MENUITEM "&Preferencias...", IDM_PREFERENCES +#ifdef DISCORD MENUITEM "Habilitar integración con &Discord", IDM_DISCORD +#endif MENUITEM SEPARATOR MENUITEM "&Ganancia de sonido...", IDM_SND_GAIN #ifdef MTR_ENABLED diff --git a/src/win/languages/fi-FI.rc b/src/win/languages/fi-FI.rc index 852778a96..9d65343f9 100644 --- a/src/win/languages/fi-FI.rc +++ b/src/win/languages/fi-FI.rc @@ -104,7 +104,9 @@ BEGIN MENUITEM "Ota &kuvakaappaus\tCtrl+F11", IDM_ACTION_SCREENSHOT MENUITEM SEPARATOR MENUITEM "&Sovellusasetukset...", IDM_PREFERENCES +#ifdef DISCORD MENUITEM "Käytä &Discord-integraatiota", IDM_DISCORD +#endif MENUITEM SEPARATOR MENUITEM "&Äänitasot...", IDM_SND_GAIN #ifdef MTR_ENABLED diff --git a/src/win/languages/fr-FR.rc b/src/win/languages/fr-FR.rc index 8e005ebcd..42acaec05 100644 --- a/src/win/languages/fr-FR.rc +++ b/src/win/languages/fr-FR.rc @@ -104,7 +104,9 @@ BEGIN MENUITEM "Copie &Ecran\tCtrl+F11", IDM_ACTION_SCREENSHOT MENUITEM SEPARATOR MENUITEM "&Préférences...", IDM_PREFERENCES +#ifdef DISCORD MENUITEM "Activer intégration &Discord", IDM_DISCORD +#endif MENUITEM SEPARATOR MENUITEM "&Gain Son...", IDM_SND_GAIN #ifdef MTR_ENABLED diff --git a/src/win/languages/hr-HR.rc b/src/win/languages/hr-HR.rc index b1b4a3524..a34dab06b 100644 --- a/src/win/languages/hr-HR.rc +++ b/src/win/languages/hr-HR.rc @@ -104,7 +104,9 @@ BEGIN MENUITEM "Napravi &snimku zaslona\tCtrl+F11", IDM_ACTION_SCREENSHOT MENUITEM SEPARATOR MENUITEM "&Postavke...", IDM_PREFERENCES +#ifdef DISCORD MENUITEM "Omogući integraciju sa programom &Discord", IDM_DISCORD +#endif MENUITEM SEPARATOR MENUITEM "&Pojačanje zvuka...", IDM_SND_GAIN #ifdef MTR_ENABLED diff --git a/src/win/languages/hu-HU.rc b/src/win/languages/hu-HU.rc index 0692c1cdd..7512c9a8a 100644 --- a/src/win/languages/hu-HU.rc +++ b/src/win/languages/hu-HU.rc @@ -109,7 +109,9 @@ BEGIN MENUITEM "&Képernyőkép készítése\tCtrl+F11", IDM_ACTION_SCREENSHOT MENUITEM SEPARATOR MENUITEM "&Beállítások...", IDM_PREFERENCES +#ifdef DISCORD MENUITEM "&Discord integráció engedélyezése", IDM_DISCORD +#endif MENUITEM SEPARATOR MENUITEM "&Hangerőszabályzó...", IDM_SND_GAIN #ifdef MTR_ENABLED diff --git a/src/win/languages/it-IT.rc b/src/win/languages/it-IT.rc index bf82c116f..af08d5bed 100644 --- a/src/win/languages/it-IT.rc +++ b/src/win/languages/it-IT.rc @@ -105,7 +105,9 @@ BEGIN MENUITEM "Cattura schermata\tCtrl+F11", IDM_ACTION_SCREENSHOT MENUITEM SEPARATOR MENUITEM "&Preferenze...", IDM_PREFERENCES +#ifdef DISCORD MENUITEM "Abilita &integrazione Discord", IDM_DISCORD +#endif MENUITEM SEPARATOR MENUITEM "Guadagno &suono...", IDM_SND_GAIN #ifdef MTR_ENABLED diff --git a/src/win/languages/ja-JP.rc b/src/win/languages/ja-JP.rc index e1fc2bae9..a5c39ba28 100644 --- a/src/win/languages/ja-JP.rc +++ b/src/win/languages/ja-JP.rc @@ -104,7 +104,9 @@ BEGIN MENUITEM "スクリーンショットを撮る(&C)\tCtrl+F11", IDM_ACTION_SCREENSHOT MENUITEM SEPARATOR MENUITEM "環境設定(&P)...", IDM_PREFERENCES +#ifdef DISCORD MENUITEM "Discordとの連携機能(&D)", IDM_DISCORD +#endif MENUITEM SEPARATOR MENUITEM "音量を調節(&G)...", IDM_SND_GAIN #ifdef MTR_ENABLED diff --git a/src/win/languages/ko-KR.rc b/src/win/languages/ko-KR.rc index 9379205fe..404b97584 100644 --- a/src/win/languages/ko-KR.rc +++ b/src/win/languages/ko-KR.rc @@ -104,7 +104,9 @@ BEGIN MENUITEM "스크린샷 찍기(&C)\tCtrl+F11", IDM_ACTION_SCREENSHOT MENUITEM SEPARATOR MENUITEM "환경설정(&P)...", IDM_PREFERENCES +#ifdef DISCORD MENUITEM "디스코드 연동 활성화하기(&D)", IDM_DISCORD +#endif MENUITEM SEPARATOR MENUITEM "음량 증폭(&G)...", IDM_SND_GAIN #ifdef MTR_ENABLED diff --git a/src/win/languages/pl-PL.rc b/src/win/languages/pl-PL.rc index 054428e5b..a9f760a50 100644 --- a/src/win/languages/pl-PL.rc +++ b/src/win/languages/pl-PL.rc @@ -104,7 +104,9 @@ BEGIN MENUITEM "Zrób &zrzut ekranu\tCtrl+F11", IDM_ACTION_SCREENSHOT MENUITEM SEPARATOR MENUITEM "&Preferencje...", IDM_PREFERENCES +#ifdef DISCORD MENUITEM "Włącz integrację z &Discord", IDM_DISCORD +#endif MENUITEM SEPARATOR MENUITEM "Wzmocnienie &dźwięku...", IDM_SND_GAIN #ifdef MTR_ENABLED diff --git a/src/win/languages/pt-BR.rc b/src/win/languages/pt-BR.rc index 7147854bc..8e4c36d38 100644 --- a/src/win/languages/pt-BR.rc +++ b/src/win/languages/pt-BR.rc @@ -107,7 +107,9 @@ BEGIN MENUITEM "Capturar &tela\tCtrl+F11", IDM_ACTION_SCREENSHOT MENUITEM SEPARATOR MENUITEM "&Preferências...", IDM_PREFERENCES +#ifdef DISCORD MENUITEM "Ativar integração com o &Discord", IDM_DISCORD +#endif DISCORD MENUITEM SEPARATOR MENUITEM "&Ganho de som...", IDM_SND_GAIN #ifdef MTR_ENABLED diff --git a/src/win/languages/pt-PT.rc b/src/win/languages/pt-PT.rc index 0deeebc41..aa61f812d 100644 --- a/src/win/languages/pt-PT.rc +++ b/src/win/languages/pt-PT.rc @@ -104,7 +104,9 @@ BEGIN MENUITEM "Gravar imagem de ecrã\tCtrl+F11", IDM_ACTION_SCREENSHOT MENUITEM SEPARATOR MENUITEM "&Preferências...", IDM_PREFERENCES +#ifdef DISCORD MENUITEM "Ativar integração com &Discord", IDM_DISCORD +#endif MENUITEM SEPARATOR MENUITEM "&Ganho de som...", IDM_SND_GAIN #ifdef MTR_ENABLED diff --git a/src/win/languages/ru-RU.rc b/src/win/languages/ru-RU.rc index 7cb75fb48..794e502ab 100644 --- a/src/win/languages/ru-RU.rc +++ b/src/win/languages/ru-RU.rc @@ -104,7 +104,9 @@ BEGIN MENUITEM "Сделать с&криншот\tCtrl+F11", IDM_ACTION_SCREENSHOT MENUITEM SEPARATOR MENUITEM "&Параметры...", IDM_PREFERENCES +#ifdef DISCORD MENUITEM "Включить интеграцию &Discord", IDM_DISCORD +#endif MENUITEM SEPARATOR MENUITEM "&Усиление звука...", IDM_SND_GAIN #ifdef MTR_ENABLED diff --git a/src/win/languages/sl-SI.rc b/src/win/languages/sl-SI.rc index 7a56d4cc5..a84bd5ec3 100644 --- a/src/win/languages/sl-SI.rc +++ b/src/win/languages/sl-SI.rc @@ -104,7 +104,9 @@ BEGIN MENUITEM "&Zajemi posnetek zaslona\tCtrl+F11", IDM_ACTION_SCREENSHOT MENUITEM SEPARATOR MENUITEM "&Možnosti...", IDM_PREFERENCES +#ifdef DISCORD MENUITEM "Omogoči integracijo s programom &Discord", IDM_DISCORD +#endif MENUITEM SEPARATOR MENUITEM "&Ojačanje zvoka...", IDM_SND_GAIN #ifdef MTR_ENABLED diff --git a/src/win/languages/tr-TR.rc b/src/win/languages/tr-TR.rc index 896f6a300..d162a9aa7 100644 --- a/src/win/languages/tr-TR.rc +++ b/src/win/languages/tr-TR.rc @@ -104,7 +104,9 @@ BEGIN MENUITEM "&Ekran görüntüsü al\tCtrl+F11", IDM_ACTION_SCREENSHOT MENUITEM SEPARATOR MENUITEM "&Tercihler...", IDM_PREFERENCES +#ifdef DISCORD MENUITEM "&Discord entegrasyonunu etkinleştir", IDM_DISCORD +#endif MENUITEM SEPARATOR MENUITEM "&Ses yükseltici...", IDM_SND_GAIN #ifdef MTR_ENABLED diff --git a/src/win/languages/uk-UA.rc b/src/win/languages/uk-UA.rc index 332966686..df751e3f1 100644 --- a/src/win/languages/uk-UA.rc +++ b/src/win/languages/uk-UA.rc @@ -104,7 +104,9 @@ BEGIN MENUITEM "Зробити &знімок\tCtrl+F11", IDM_ACTION_SCREENSHOT MENUITEM SEPARATOR MENUITEM "&Параметри...", IDM_PREFERENCES +#ifdef DISCORD MENUITEM "Увімкнути інтеграцію &Discord", IDM_DISCORD +#endif MENUITEM SEPARATOR MENUITEM "&Посилення звуку...", IDM_SND_GAIN #ifdef MTR_ENABLED diff --git a/src/win/languages/zh-CN.rc b/src/win/languages/zh-CN.rc index 13f878cb6..397a783e2 100644 --- a/src/win/languages/zh-CN.rc +++ b/src/win/languages/zh-CN.rc @@ -104,7 +104,9 @@ BEGIN MENUITEM "截图(&C)\tCtrl+F11", IDM_ACTION_SCREENSHOT MENUITEM SEPARATOR MENUITEM "首选项(&P)...", IDM_PREFERENCES +#ifdef DISCORD MENUITEM "启用 Discord 集成(&D)", IDM_DISCORD +#endif MENUITEM SEPARATOR MENUITEM "音量增益(&G)...", IDM_SND_GAIN #ifdef MTR_ENABLED diff --git a/src/win/languages/zh-TW.rc b/src/win/languages/zh-TW.rc index f922c950b..190103d93 100644 --- a/src/win/languages/zh-TW.rc +++ b/src/win/languages/zh-TW.rc @@ -104,7 +104,9 @@ BEGIN MENUITEM "擷圖(&C)\tCtrl+F11", IDM_ACTION_SCREENSHOT MENUITEM SEPARATOR MENUITEM "首選項(&P)...", IDM_PREFERENCES +#ifdef DISCORD MENUITEM "啟用 Discord 整合(&D)", IDM_DISCORD +#endif MENUITEM SEPARATOR MENUITEM "音量增益(&G)...", IDM_SND_GAIN #ifdef MTR_ENABLED diff --git a/src/win/win_ui.c b/src/win/win_ui.c index 6107c0609..63db0176b 100644 --- a/src/win/win_ui.c +++ b/src/win/win_ui.c @@ -44,7 +44,9 @@ #include <86box/ui.h> #include <86box/win.h> #include <86box/version.h> -#include <86box/discord.h> +#ifdef DISCORD +# include <86box/discord.h> +#endif #ifdef MTR_ENABLED # include @@ -316,10 +318,13 @@ ResetAllMenus(void) video_set_filter_menu(menuMain); +#ifdef DISCORD if (discord_loaded) CheckMenuItem(menuMain, IDM_DISCORD, enable_discord ? MF_CHECKED : MF_UNCHECKED); else EnableMenuItem(menuMain, IDM_DISCORD, MF_DISABLED); +#endif + #ifdef MTR_ENABLED EnableMenuItem(menuMain, IDM_ACTION_END_TRACE, MF_DISABLED); #endif @@ -820,6 +825,7 @@ MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) config_save(); break; +#ifdef DISCORD case IDM_DISCORD: if (!discord_loaded) break; @@ -831,6 +837,7 @@ MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) } else discord_close(); break; +#endif default: media_menu_proc(hwnd, message, wParam, lParam); @@ -1212,6 +1219,7 @@ ui_init(int nCmdShow) return (0); } +#ifdef DISCORD if (!discord_load()) { enable_discord = 0; } else if (enable_discord) { @@ -1221,6 +1229,7 @@ ui_init(int nCmdShow) /* Update Discord status */ discord_update_activity(dopause); } +#endif /* Create our main window's class and register it. */ wincl.hInstance = hinstance; @@ -1451,9 +1460,11 @@ ui_init(int nCmdShow) plat_setfullscreen(0); } +#ifdef DISCORD /* Run Discord API callbacks */ if (enable_discord) discord_run_callbacks(); +#endif } timeEndPeriod(1); @@ -1471,8 +1482,10 @@ ui_init(int nCmdShow) win_mouse_close(); +#ifdef DISCORD /* Shut down the Discord integration */ discord_close(); +#endif if (user32_handle != NULL) dynld_close(user32_handle); @@ -1521,9 +1534,11 @@ plat_pause(int p) CheckMenuItem(menuMain, IDM_ACTION_PAUSE, (dopause) ? MF_CHECKED : MF_UNCHECKED); +#ifdef DISCORD /* Update Discord status */ if (enable_discord) discord_update_activity(dopause); +#endif /* Update the toolbar */ ToolBarUpdatePause(p); From 63b2f6bb5d16044f23a0bd6f297dd0ebbc83d140 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Wed, 1 Feb 2023 19:50:28 +0100 Subject: [PATCH 185/285] Disable Discord on unsupported platforms --- CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index dfbd87b7e..e4d5c4061 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -116,6 +116,10 @@ if(WIN32) add_compile_definitions(_WINSOCK_DEPRECATED_NO_WARNINGS) endif() +if(NOT (WIN32 OR APPLE OR CMAKE_SYSTEM_NAME STREQUAL "Linux")) + set(DISCORD OFF) +endif() + set(CMAKE_C_STANDARD 11) set(CMAKE_CXX_STANDARD 14) set(CMAKE_FIND_PACKAGE_PREFER_CONFIG ON) From 5f04b29e8f7c16de3dc7b5cf6d7479dcc8723aad Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Wed, 1 Feb 2023 02:31:07 -0500 Subject: [PATCH 186/285] Support up to 4 sound cards --- src/86box.c | 3 - src/config.c | 69 ++++++---- src/include/86box/86box.h | 3 - src/include/86box/resource.h | 156 ++++++++++----------- src/include/86box/sound.h | 4 +- src/machine/m_at_slot1.c | 6 +- src/machine/m_at_socket370.c | 6 +- src/machine/m_at_sockets7.c | 2 +- src/qt/languages/cs-CZ.po | 22 +-- src/qt/languages/de-DE.po | 22 +-- src/qt/languages/en-GB.po | 22 +-- src/qt/languages/en-US.po | 22 +-- src/qt/languages/es-ES.po | 22 +-- src/qt/languages/fi-FI.po | 22 +-- src/qt/languages/fr-FR.po | 22 +-- src/qt/languages/hr-HR.po | 22 +-- src/qt/languages/hu-HU.po | 22 +-- src/qt/languages/it-IT.po | 22 +-- src/qt/languages/ja-JP.po | 22 +-- src/qt/languages/ko-KR.po | 22 +-- src/qt/languages/pl-PL.po | 22 +-- src/qt/languages/pt-BR.po | 22 +-- src/qt/languages/pt-PT.po | 22 +-- src/qt/languages/ru-RU.po | 22 +-- src/qt/languages/sl-SI.po | 22 +-- src/qt/languages/tr-TR.po | 22 +-- src/qt/languages/uk-UA.po | 22 +-- src/qt/languages/zh-CN.po | 22 +-- src/qt/languages/zh-TW.po | 22 +-- src/qt/qt_settingssound.cpp | 172 ++++++++++++------------ src/qt/qt_settingssound.hpp | 16 +-- src/qt/qt_settingssound.ui | 145 ++++++++++++-------- src/sound/sound.c | 69 +++++----- src/win/languages/cs-CZ.rc | 8 +- src/win/languages/de-DE.rc | 8 +- src/win/languages/dialogs.rc | 74 +++++----- src/win/languages/en-GB.rc | 8 +- src/win/languages/en-US.rc | 8 +- src/win/languages/es-ES.rc | 8 +- src/win/languages/fi-FI.rc | 8 +- src/win/languages/fr-FR.rc | 8 +- src/win/languages/hr-HR.rc | 8 +- src/win/languages/hu-HU.rc | 8 +- src/win/languages/it-IT.rc | 8 +- src/win/languages/ja-JP.rc | 8 +- src/win/languages/ko-KR.rc | 8 +- src/win/languages/pl-PL.rc | 8 +- src/win/languages/pt-BR.rc | 8 +- src/win/languages/pt-PT.rc | 8 +- src/win/languages/ru-RU.rc | 8 +- src/win/languages/sl-SI.rc | 8 +- src/win/languages/tr-TR.rc | 8 +- src/win/languages/uk-UA.rc | 8 +- src/win/languages/zh-CN.rc | 8 +- src/win/languages/zh-TW.rc | 8 +- src/win/win_settings.c | 253 +++++++++++++++++++++++++---------- 56 files changed, 892 insertions(+), 716 deletions(-) diff --git a/src/86box.c b/src/86box.c index 075727387..fba67ca55 100644 --- a/src/86box.c +++ b/src/86box.c @@ -168,9 +168,6 @@ int gfxcard = 0; /* (C) graphics/vide int gfxcard_2 = 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 GAMEBLASTER = 0; /* (C) sound option */ -int GUS = 0; /* (C) sound option */ -int SSI2001 = 0; /* (C) sound option */ int voodoo_enabled = 0; /* (C) video option */ int ibm8514_enabled = 0; /* (C) video option */ int xga_enabled = 0; /* (C) video option */ diff --git a/src/config.c b/src/config.c index cbccf115f..f573d3d4b 100644 --- a/src/config.c +++ b/src/config.c @@ -666,9 +666,36 @@ load_sound(void) if ((p != NULL) && (!strcmp(p, "sbpci128") || !strcmp(p, "sb128pci"))) p = "es1371"; if (p != NULL) - sound_card_current = sound_card_get_from_internal_name(p); + sound_card_current[0] = sound_card_get_from_internal_name(p); else - sound_card_current = 0; + 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 + sound_card_current[3] = 0; p = ini_section_get_string(cat, "midi_device", NULL); if (p != NULL) @@ -684,10 +711,6 @@ load_sound(void) mpu401_standalone_enable = !!ini_section_get_int(cat, "mpu401_standalone", 0); - SSI2001 = !!ini_section_get_int(cat, "ssi2001", 0); - GAMEBLASTER = !!ini_section_get_int(cat, "gameblaster", 0); - GUS = !!ini_section_get_int(cat, "gus", 0); - memset(temp, '\0', sizeof(temp)); p = ini_section_get_string(cat, "sound_type", "float"); if (strlen(p) > 511) @@ -2311,10 +2334,25 @@ save_sound(void) { ini_section_t cat = ini_find_or_create_section(config, "Sound"); - if (sound_card_current == 0) + if (sound_card_current[0] == 0) ini_section_delete_var(cat, "sndcard"); else - ini_section_set_string(cat, "sndcard", sound_card_get_internal_name(sound_card_current)); + ini_section_set_string(cat, "sndcard", sound_card_get_internal_name(sound_card_current[0])); + + if (sound_card_current[1] == 0) + ini_section_delete_var(cat, "sndcard2"); + else + ini_section_set_string(cat, "sndcard2", sound_card_get_internal_name(sound_card_current[1])); + + if (sound_card_current[2] == 0) + ini_section_delete_var(cat, "sndcard3"); + else + ini_section_set_string(cat, "sndcard3", sound_card_get_internal_name(sound_card_current[2])); + + if (sound_card_current[3] == 0) + ini_section_delete_var(cat, "sndcard4"); + else + ini_section_set_string(cat, "sndcard4", sound_card_get_internal_name(sound_card_current[3])); if (!strcmp(midi_out_device_get_internal_name(midi_output_device_current), "none")) ini_section_delete_var(cat, "midi_device"); @@ -2331,21 +2369,6 @@ save_sound(void) else ini_section_set_int(cat, "mpu401_standalone", mpu401_standalone_enable); - if (SSI2001 == 0) - ini_section_delete_var(cat, "ssi2001"); - else - ini_section_set_int(cat, "ssi2001", SSI2001); - - if (GAMEBLASTER == 0) - ini_section_delete_var(cat, "gameblaster"); - else - ini_section_set_int(cat, "gameblaster", GAMEBLASTER); - - if (GUS == 0) - ini_section_delete_var(cat, "gus"); - else - ini_section_set_int(cat, "gus", GUS); - if (sound_is_float == 1) ini_section_delete_var(cat, "sound_type"); else diff --git a/src/include/86box/86box.h b/src/include/86box/86box.h index 1db37f1a4..ca8d797cc 100644 --- a/src/include/86box/86box.h +++ b/src/include/86box/86box.h @@ -114,9 +114,6 @@ extern int bugger_enabled, /* (C) enable ISAbugger */ isamem_type[], /* (C) enable ISA mem cards */ isartc_type; /* (C) enable ISA RTC card */ extern int sound_is_float, /* (C) sound uses FP values */ - GAMEBLASTER, /* (C) sound option */ - GUS, GUSMAX, /* (C) sound option */ - SSI2001, /* (C) sound option */ voodoo_enabled, /* (C) video option */ ibm8514_enabled, /* (C) video option */ xga_enabled; /* (C) video option */ diff --git a/src/include/86box/resource.h b/src/include/86box/resource.h index 17af95ca4..edcb1891a 100644 --- a/src/include/86box/resource.h +++ b/src/include/86box/resource.h @@ -79,82 +79,85 @@ #define IDT_JOYSTICK 1718 /* Joystick: */ /* DLG_CFG_SOUND */ -#define IDT_SOUND 1719 /* Sound card: */ -#define IDT_MIDI_OUT 1720 /* MIDI Out Device: */ -#define IDT_MIDI_IN 1721 /* MIDI In Device: */ +#define IDT_SOUND1 1719 /* Sound card 1: */ +#define IDT_SOUND2 1720 /* Sound card 2: */ +#define IDT_SOUND3 1721 /* Sound card 3: */ +#define IDT_SOUND4 1722 /* Sound card 4: */ +#define IDT_MIDI_OUT 1723 /* MIDI Out Device: */ +#define IDT_MIDI_IN 1724 /* MIDI In Device: */ /* DLG_CFG_NETWORK */ -#define IDT_NET_TYPE 1722 /* Network type: */ -#define IDT_PCAP 1723 /* PCap device: */ -#define IDT_NET 1724 /* Network adapter: */ +#define IDT_NET_TYPE 1725 /* Network type: */ +#define IDT_PCAP 1726 /* PCap device: */ +#define IDT_NET 1727 /* Network adapter: */ /* DLG_CFG_PORTS */ -#define IDT_COM1 1725 /* COM1 Device: */ -#define IDT_COM2 1726 /* COM1 Device: */ -#define IDT_COM3 1727 /* COM1 Device: */ -#define IDT_COM4 1728 /* COM1 Device: */ +#define IDT_COM1 1728 /* COM1 Device: */ +#define IDT_COM2 1729 /* COM1 Device: */ +#define IDT_COM3 1730 /* COM1 Device: */ +#define IDT_COM4 1731 /* COM1 Device: */ -#define IDT_LPT1 1729 /* LPT1 Device: */ -#define IDT_LPT2 1730 /* LPT2 Device: */ -#define IDT_LPT3 1731 /* LPT3 Device: */ -#define IDT_LPT4 1732 /* LPT4 Device: */ +#define IDT_LPT1 1732 /* LPT1 Device: */ +#define IDT_LPT2 1733 /* LPT2 Device: */ +#define IDT_LPT3 1734 /* LPT3 Device: */ +#define IDT_LPT4 1735 /* LPT4 Device: */ /* DLG_CFG_STORAGE */ -#define IDT_HDC 1733 /* HD Controller: */ -#define IDT_FDC 1734 /* Ext FD Controller: */ -#define IDT_SCSI_1 1735 /* SCSI Board #1: */ -#define IDT_SCSI_2 1736 /* SCSI Board #2: */ -#define IDT_SCSI_3 1737 /* SCSI Board #3: */ -#define IDT_SCSI_4 1738 /* SCSI Board #4: */ +#define IDT_HDC 1736 /* HD Controller: */ +#define IDT_FDC 1737 /* Ext FD Controller: */ +#define IDT_SCSI_1 1738 /* SCSI Board #1: */ +#define IDT_SCSI_2 1739 /* SCSI Board #2: */ +#define IDT_SCSI_3 1740 /* SCSI Board #3: */ +#define IDT_SCSI_4 1742 /* SCSI Board #4: */ /* DLG_CFG_HARD_DISKS */ -#define IDT_HDD 1739 /* Hard disks: */ -#define IDT_BUS 1740 /* Bus: */ -#define IDT_CHANNEL 1741 /* Channel: */ -#define IDT_ID 1742 /* ID: */ -#define IDT_LUN 1743 /* LUN: */ -#define IDT_SPEED 1744 /* Speed: */ +#define IDT_HDD 1743 /* Hard disks: */ +#define IDT_BUS 1744 /* Bus: */ +#define IDT_CHANNEL 1745 /* Channel: */ +#define IDT_ID 1746 /* ID: */ +#define IDT_LUN 1747 /* LUN: */ +#define IDT_SPEED 1748 /* Speed: */ /* DLG_CFG_HARD_DISKS_ADD */ -#define IDT_SECTORS 1745 /* Sectors: */ -#define IDT_HEADS 1746 /* Heads: */ -#define IDT_CYLS 1747 /* Cylinders: */ -#define IDT_SIZE_MB 1748 /* Size (MB): */ -#define IDT_TYPE 1749 /* Type: */ -#define IDT_FILE_NAME 1750 /* File name: */ -#define IDT_IMG_FORMAT 1751 /* Image Format: */ -#define IDT_BLOCK_SIZE 1752 /* Block Size: */ -#define IDT_PROGRESS 1753 /* Progress: */ +#define IDT_SECTORS 1749 /* Sectors: */ +#define IDT_HEADS 1750 /* Heads: */ +#define IDT_CYLS 1751 /* Cylinders: */ +#define IDT_SIZE_MB 1752 /* Size (MB): */ +#define IDT_TYPE 1753 /* Type: */ +#define IDT_FILE_NAME 1754 /* File name: */ +#define IDT_IMG_FORMAT 1755 /* Image Format: */ +#define IDT_BLOCK_SIZE 1756 /* Block Size: */ +#define IDT_PROGRESS 1757 /* Progress: */ /* DLG_CFG_FLOPPY_AND_CDROM_DRIVES */ -#define IDT_FLOPPY_DRIVES 1754 /* Floppy drives: */ -#define IDT_FDD_TYPE 1755 /* Type: */ -#define IDT_CD_DRIVES 1756 /* CD-ROM drives: */ -#define IDT_CD_BUS 1757 /* Bus: */ -#define IDT_CD_ID 1758 /* ID: */ -#define IDT_CD_LUN 1759 /* LUN: */ -#define IDT_CD_CHANNEL 1760 /* Channel: */ -#define IDT_CD_SPEED 1761 /* Speed: */ +#define IDT_FLOPPY_DRIVES 1758 /* Floppy drives: */ +#define IDT_FDD_TYPE 1759 /* Type: */ +#define IDT_CD_DRIVES 1760 /* CD-ROM drives: */ +#define IDT_CD_BUS 1761 /* Bus: */ +#define IDT_CD_ID 1762 /* ID: */ +#define IDT_CD_LUN 1763 /* LUN: */ +#define IDT_CD_CHANNEL 1764 /* Channel: */ +#define IDT_CD_SPEED 1765 /* Speed: */ /* DLG_CFG_OTHER_REMOVABLE_DEVICES */ -#define IDT_MO_DRIVES 1762 /* MO drives: */ -#define IDT_MO_BUS 1763 /* Bus: */ -#define IDT_MO_ID 1764 /* ID: */ -#define IDT_MO_CHANNEL 1765 /* Channel */ -#define IDT_MO_TYPE 1766 /* Type: */ +#define IDT_MO_DRIVES 1766 /* MO drives: */ +#define IDT_MO_BUS 1767 /* Bus: */ +#define IDT_MO_ID 1768 /* ID: */ +#define IDT_MO_CHANNEL 1769 /* Channel */ +#define IDT_MO_TYPE 1770 /* Type: */ -#define IDT_ZIP_DRIVES 1767 /* ZIP drives: */ -#define IDT_ZIP_BUS 1768 /* Bus: */ -#define IDT_ZIP_ID 1769 /* ID: */ -#define IDT_ZIP_LUN 1770 /* LUN: */ -#define IDT_ZIP_CHANNEL 1771 /* Channel: */ +#define IDT_ZIP_DRIVES 1771 /* ZIP drives: */ +#define IDT_ZIP_BUS 1772 /* Bus: */ +#define IDT_ZIP_ID 1773 /* ID: */ +#define IDT_ZIP_LUN 1774 /* LUN: */ +#define IDT_ZIP_CHANNEL 1775 /* Channel: */ /* DLG_CFG_PERIPHERALS */ -#define IDT_ISARTC 1772 /* ISA RTC: */ -#define IDT_ISAMEM_1 1773 /* ISAMEM Board #1: */ -#define IDT_ISAMEM_2 1774 /* ISAMEM Board #2: */ -#define IDT_ISAMEM_3 1775 /* ISAMEM Board #3: */ -#define IDT_ISAMEM_4 1776 /* ISAMEM Board #4: */ +#define IDT_ISARTC 1776 /* ISA RTC: */ +#define IDT_ISAMEM_1 1777 /* ISAMEM Board #1: */ +#define IDT_ISAMEM_2 1778 /* ISAMEM Board #2: */ +#define IDT_ISAMEM_3 1779 /* ISAMEM Board #3: */ +#define IDT_ISAMEM_4 1780 /* ISAMEM Board #4: */ /* * To try to keep these organized, we now group the @@ -199,10 +202,10 @@ #define IDC_CONFIGURE_MOUSE 1034 #define IDC_SOUND 1040 /* sound config */ -#define IDC_COMBO_SOUND 1041 -#define IDC_CHECK_SSI 1042 -#define IDC_CHECK_CMS 1043 -#define IDC_CHECK_GUS 1044 +#define IDC_COMBO_SOUND1 1041 +#define IDC_COMBO_SOUND2 1042 +#define IDC_COMBO_SOUND3 1043 +#define IDC_COMBO_SOUND4 1044 #define IDC_COMBO_MIDI_OUT 1045 #define IDC_CHECK_MPU401 1046 #define IDC_CONFIGURE_MPU401 1047 @@ -329,19 +332,22 @@ #define IDC_CONFIG_BASE 1300 #define IDC_CONFIGURE_VID 1300 #define IDC_CONFIGURE_VID_2 1301 -#define IDC_CONFIGURE_SND 1302 -#define IDC_CONFIGURE_VOODOO 1303 -#define IDC_CONFIGURE_MOD 1304 -#define IDC_CONFIGURE_NET_TYPE 1305 -#define IDC_CONFIGURE_BUSLOGIC 1306 -#define IDC_CONFIGURE_PCAP 1307 -#define IDC_CONFIGURE_NET 1308 -#define IDC_CONFIGURE_MIDI_OUT 1309 -#define IDC_CONFIGURE_MIDI_IN 1310 -#define IDC_JOY1 1311 -#define IDC_JOY2 1312 -#define IDC_JOY3 1313 -#define IDC_JOY4 1314 +#define IDC_CONFIGURE_SND1 1302 +#define IDC_CONFIGURE_SND2 1303 +#define IDC_CONFIGURE_SND3 1304 +#define IDC_CONFIGURE_SND4 1305 +#define IDC_CONFIGURE_VOODOO 1306 +#define IDC_CONFIGURE_MOD 1307 +#define IDC_CONFIGURE_NET_TYPE 1308 +#define IDC_CONFIGURE_BUSLOGIC 1309 +#define IDC_CONFIGURE_PCAP 1310 +#define IDC_CONFIGURE_NET 1311 +#define IDC_CONFIGURE_MIDI_OUT 1312 +#define IDC_CONFIGURE_MIDI_IN 1313 +#define IDC_JOY1 1314 +#define IDC_JOY2 1315 +#define IDC_JOY3 1316 +#define IDC_JOY4 1317 #define IDC_HDTYPE 1380 #define IDC_RENDER 1381 #define IDC_STATUS 1382 diff --git a/src/include/86box/sound.h b/src/include/86box/sound.h index a38d213da..f0bfad7c7 100644 --- a/src/include/86box/sound.h +++ b/src/include/86box/sound.h @@ -20,6 +20,8 @@ #ifndef EMU_SOUND_H #define EMU_SOUND_H +#define SOUND_CARD_MAX 4 /* currently we support up to 4 sound cards and a standalome MPU401 */ + extern int sound_gain; #define SOUNDBUFLEN (48000 / 50) @@ -38,7 +40,7 @@ extern int gated, speakon; extern int sound_pos_global; -extern int sound_card_current; +extern int sound_card_current[SOUND_CARD_MAX]; extern void sound_add_handler(void (*get_buffer)(int32_t *buffer, int len, void *p), diff --git a/src/machine/m_at_slot1.c b/src/machine/m_at_slot1.c index 71aeeb7fb..c30f39603 100644 --- a/src/machine/m_at_slot1.c +++ b/src/machine/m_at_slot1.c @@ -461,7 +461,7 @@ machine_at_s1846_init(const machine_t *model) device_add(&intel_flash_bxt_device); spd_register(SPD_TYPE_SDRAM, 0x7, 256); - if (sound_card_current == SOUND_INTERNAL) { + if (sound_card_current[0] == SOUND_INTERNAL) { device_add(&es1371_onboard_device); device_add(&cs4297_device); /* found on other Tyan boards around the same time */ } @@ -606,7 +606,7 @@ machine_at_gt694va_init(const machine_t *model) hwm_values.fans[2] = 0; /* unused */ hwm_values.temperatures[2] = 0; /* unused */ - if (sound_card_current == SOUND_INTERNAL) { + if (sound_card_current[0] == SOUND_INTERNAL) { device_add(&es1371_onboard_device); device_add(&cs4297_device); /* assumed */ } @@ -670,7 +670,7 @@ machine_at_ms6168_common_init(const machine_t *model) device_add(&intel_flash_bxt_device); spd_register(SPD_TYPE_SDRAM, 0x3, 256); - if (sound_card_current == SOUND_INTERNAL) { + if (sound_card_current[0] == SOUND_INTERNAL) { device_add(&es1371_onboard_device); device_add(&cs4297_device); } diff --git a/src/machine/m_at_socket370.c b/src/machine/m_at_socket370.c index 66ef15e1d..422e2c989 100644 --- a/src/machine/m_at_socket370.c +++ b/src/machine/m_at_socket370.c @@ -104,7 +104,7 @@ machine_at_s1857_init(const machine_t *model) device_add(&intel_flash_bxt_device); spd_register(SPD_TYPE_SDRAM, 0x7, 256); - if (sound_card_current == SOUND_INTERNAL) { + if (sound_card_current[0] == SOUND_INTERNAL) { device_add(&es1371_onboard_device); device_add(&cs4297_device); /* found on other Tyan boards around the same time */ } @@ -377,7 +377,7 @@ machine_at_cuv4xls_init(const machine_t *model) spd_register(SPD_TYPE_SDRAM, 0xF, 1024); device_add(&as99127f_device); /* fans: Chassis, CPU, Power; temperatures: MB, JTPWR, CPU */ - if (sound_card_current == SOUND_INTERNAL) + if (sound_card_current[0] == SOUND_INTERNAL) device_add(&cmi8738_onboard_device); return ret; @@ -415,7 +415,7 @@ machine_at_6via90ap_init(const machine_t *model) hwm_values.temperatures[1] += 2; /* System offset */ hwm_values.temperatures[2] = 0; /* unused */ - if (sound_card_current == SOUND_INTERNAL) + if (sound_card_current[0] == SOUND_INTERNAL) device_add(&alc100_device); /* ALC100P identified on similar Acorp boards (694TA, 6VIA90A1) */ return ret; diff --git a/src/machine/m_at_sockets7.c b/src/machine/m_at_sockets7.c index 2813e7275..dab544707 100644 --- a/src/machine/m_at_sockets7.c +++ b/src/machine/m_at_sockets7.c @@ -268,7 +268,7 @@ machine_at_ficva503a_init(const machine_t *model) hwm_values.temperatures[1] += 2; /* System offset */ hwm_values.temperatures[2] = 0; /* unused */ - if (sound_card_current == SOUND_INTERNAL) + if (sound_card_current[0] == SOUND_INTERNAL) device_add(&wm9701a_device); /* on daughtercard */ return ret; diff --git a/src/qt/languages/cs-CZ.po b/src/qt/languages/cs-CZ.po index d8fe563fe..5f85c4f81 100644 --- a/src/qt/languages/cs-CZ.po +++ b/src/qt/languages/cs-CZ.po @@ -406,8 +406,17 @@ msgstr "Joystick 3..." msgid "Joystick 4..." msgstr "Joystick 4..." -msgid "Sound card:" -msgstr "Zvuková karta:" +msgid "Sound card 1:" +msgstr "Zvuková karta 1:" + +msgid "Sound card 2:" +msgstr "Zvuková karta 2:" + +msgid "Sound card 3:" +msgstr "Zvuková karta 3:" + +msgid "Sound card 4:" +msgstr "Zvuková karta 4:" msgid "MIDI Out Device:" msgstr "MIDI výstup:" @@ -418,15 +427,6 @@ msgstr "MIDI vstup:" msgid "Standalone MPU-401" msgstr "Samostatný MPU-401" -msgid "Innovation SSI-2001" -msgstr "Innovation SSI-2001" - -msgid "CMS / Game Blaster" -msgstr "CMS / Game Blaster" - -msgid "Gravis Ultrasound" -msgstr "Gravis Ultrasound" - msgid "Use FLOAT32 sound" msgstr "Použít zvuk FLOAT32" diff --git a/src/qt/languages/de-DE.po b/src/qt/languages/de-DE.po index 74fa56afa..efbd5f95e 100644 --- a/src/qt/languages/de-DE.po +++ b/src/qt/languages/de-DE.po @@ -406,8 +406,17 @@ msgstr "Joystick 3..." msgid "Joystick 4..." msgstr "Joystick 4..." -msgid "Sound card:" -msgstr "Soundkarte:" +msgid "Sound card 1:" +msgstr "Soundkarte 1:" + +msgid "Sound card 2:" +msgstr "Soundkarte 2:" + +msgid "Sound card 3:" +msgstr "Soundkarte 3:" + +msgid "Sound card 4:" +msgstr "Soundkarte 4:" msgid "MIDI Out Device:" msgstr "MIDI Out-Gerät:" @@ -418,15 +427,6 @@ msgstr "MIDI In-Gerät:" msgid "Standalone MPU-401" msgstr "Standalone-MPU-401-Gerät" -msgid "Innovation SSI-2001" -msgstr "Innovation SSI-2001" - -msgid "CMS / Game Blaster" -msgstr "CMS / Game Blaster" - -msgid "Gravis Ultrasound" -msgstr "Gravis Ultrasound" - msgid "Use FLOAT32 sound" msgstr "FLOAT32-Wiedergabe benutzen" diff --git a/src/qt/languages/en-GB.po b/src/qt/languages/en-GB.po index 5575d9481..7613cf4b3 100644 --- a/src/qt/languages/en-GB.po +++ b/src/qt/languages/en-GB.po @@ -406,8 +406,17 @@ msgstr "Joystick 3..." msgid "Joystick 4..." msgstr "Joystick 4..." -msgid "Sound card:" -msgstr "Sound card:" +msgid "Sound card 1:" +msgstr "Sound card 1:" + +msgid "Sound card 2:" +msgstr "Sound card 2:" + +msgid "Sound card 3:" +msgstr "Sound card 3:" + +msgid "Sound card 4:" +msgstr "Sound card 4:" msgid "MIDI Out Device:" msgstr "MIDI Out Device:" @@ -418,15 +427,6 @@ msgstr "MIDI In Device:" msgid "Standalone MPU-401" msgstr "Standalone MPU-401" -msgid "Innovation SSI-2001" -msgstr "Innovation SSI-2001" - -msgid "CMS / Game Blaster" -msgstr "CMS / Game Blaster" - -msgid "Gravis Ultrasound" -msgstr "Gravis Ultrasound" - msgid "Use FLOAT32 sound" msgstr "Use FLOAT32 sound" diff --git a/src/qt/languages/en-US.po b/src/qt/languages/en-US.po index e6652c057..bf822aceb 100644 --- a/src/qt/languages/en-US.po +++ b/src/qt/languages/en-US.po @@ -406,8 +406,17 @@ msgstr "Joystick 3..." msgid "Joystick 4..." msgstr "Joystick 4..." -msgid "Sound card:" -msgstr "Sound card:" +msgid "Sound card 1:" +msgstr "Sound card 1:" + +msgid "Sound card 2:" +msgstr "Sound card 2:" + +msgid "Sound card 3:" +msgstr "Sound card 3:" + +msgid "Sound card 4:" +msgstr "Sound card 4:" msgid "MIDI Out Device:" msgstr "MIDI Out Device:" @@ -418,15 +427,6 @@ msgstr "MIDI In Device:" msgid "Standalone MPU-401" msgstr "Standalone MPU-401" -msgid "Innovation SSI-2001" -msgstr "Innovation SSI-2001" - -msgid "CMS / Game Blaster" -msgstr "CMS / Game Blaster" - -msgid "Gravis Ultrasound" -msgstr "Gravis Ultrasound" - msgid "Use FLOAT32 sound" msgstr "Use FLOAT32 sound" diff --git a/src/qt/languages/es-ES.po b/src/qt/languages/es-ES.po index 0a7014589..0c2bd6aa9 100644 --- a/src/qt/languages/es-ES.po +++ b/src/qt/languages/es-ES.po @@ -406,8 +406,17 @@ msgstr "Mando 3..." msgid "Joystick 4..." msgstr "Mando 4..." -msgid "Sound card:" -msgstr "Tarjeta de sonido:" +msgid "Sound card 1:" +msgstr "Tarjeta de sonido 1:" + +msgid "Sound card 2:" +msgstr "Tarjeta de sonido 2:" + +msgid "Sound card 3:" +msgstr "Tarjeta de sonido 3:" + +msgid "Sound card 4:" +msgstr "Tarjeta de sonido 4:" msgid "MIDI Out Device:" msgstr "Dispositivo MIDI de salida:" @@ -418,15 +427,6 @@ msgstr "Dispositivo MIDI de entrada:" msgid "Standalone MPU-401" msgstr "MPU-401 independiente" -msgid "Innovation SSI-2001" -msgstr "Innovation SSI-2001" - -msgid "CMS / Game Blaster" -msgstr "CMS / Game Blaster" - -msgid "Gravis Ultrasound" -msgstr "Gravis Ultrasound" - msgid "Use FLOAT32 sound" msgstr "Usar sonido FLOAT32" diff --git a/src/qt/languages/fi-FI.po b/src/qt/languages/fi-FI.po index a5284844d..6224472fa 100644 --- a/src/qt/languages/fi-FI.po +++ b/src/qt/languages/fi-FI.po @@ -406,8 +406,17 @@ msgstr "Peliohjain 3..." msgid "Joystick 4..." msgstr "Peliohjain 4..." -msgid "Sound card:" -msgstr "Äänikortti:" +msgid "Sound card 1:" +msgstr "Äänikortti 1:" + +msgid "Sound card 2:" +msgstr "Äänikortti 2:" + +msgid "Sound card 3:" +msgstr "Äänikortti 3:" + +msgid "Sound card 4:" +msgstr "Äänikortti 4:" msgid "MIDI Out Device:" msgstr "MIDI-ulostulo:" @@ -418,15 +427,6 @@ msgstr "MIDI-sisääntulo:" msgid "Standalone MPU-401" msgstr "Erillinen MPU-401" -msgid "Innovation SSI-2001" -msgstr "Innovation SSI-2001" - -msgid "CMS / Game Blaster" -msgstr "CMS / Game Blaster" - -msgid "Gravis Ultrasound" -msgstr "Gravis Ultrasound" - msgid "Use FLOAT32 sound" msgstr "Käytä FLOAT32-ääntä" diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po index 272d654c9..3ae18533d 100644 --- a/src/qt/languages/fr-FR.po +++ b/src/qt/languages/fr-FR.po @@ -406,8 +406,17 @@ msgstr "Manette 3..." msgid "Joystick 4..." msgstr "Manette 4..." -msgid "Sound card:" -msgstr "Carte son:" +msgid "Sound card 1:" +msgstr "Carte son 1:" + +msgid "Sound card 2:" +msgstr "Carte son 2:" + +msgid "Sound card 3:" +msgstr "Carte son 3:" + +msgid "Sound card 4:" +msgstr "Carte son 4:" msgid "MIDI Out Device:" msgstr "Sortie MIDI:" @@ -418,15 +427,6 @@ msgstr "Entrée MIDI:" msgid "Standalone MPU-401" msgstr "MPU-401 autonome" -msgid "Innovation SSI-2001" -msgstr "Innovation SSI-2001" - -msgid "CMS / Game Blaster" -msgstr "CMS / Game Blaster" - -msgid "Gravis Ultrasound" -msgstr "Gravis Ultrasound" - msgid "Use FLOAT32 sound" msgstr "Utiliser le son FLOAT32" diff --git a/src/qt/languages/hr-HR.po b/src/qt/languages/hr-HR.po index 244e78304..06c3ad8b5 100644 --- a/src/qt/languages/hr-HR.po +++ b/src/qt/languages/hr-HR.po @@ -406,8 +406,17 @@ msgstr "Palica za igru 3..." msgid "Joystick 4..." msgstr "Palica za igru 4..." -msgid "Sound card:" -msgstr "Zvučna kartica:" +msgid "Sound card 1:" +msgstr "Zvučna kartica 1:" + +msgid "Sound card 2:" +msgstr "Zvučna kartica 2:" + +msgid "Sound card 3:" +msgstr "Zvučna kartica 3:" + +msgid "Sound card 4:" +msgstr "Zvučna kartica 4:" msgid "MIDI Out Device:" msgstr "Izlazni uređaj MIDI:" @@ -418,15 +427,6 @@ msgstr "Ulazni uređaj MIDI:" msgid "Standalone MPU-401" msgstr "Samostalni MPU-401" -msgid "Innovation SSI-2001" -msgstr "Innovation SSI-2001" - -msgid "CMS / Game Blaster" -msgstr "CMS / Game Blaster" - -msgid "Gravis Ultrasound" -msgstr "Gravis Ultrasound" - msgid "Use FLOAT32 sound" msgstr "Koristi FLOAT32 za zvuk" diff --git a/src/qt/languages/hu-HU.po b/src/qt/languages/hu-HU.po index c94e019f6..6658cbb00 100644 --- a/src/qt/languages/hu-HU.po +++ b/src/qt/languages/hu-HU.po @@ -406,8 +406,17 @@ msgstr "Játékvez. 3..." msgid "Joystick 4..." msgstr "Játékvez. 4..." -msgid "Sound card:" -msgstr "Hangkártya:" +msgid "Sound card 1:" +msgstr "Hangkártya 1:" + +msgid "Sound card 2:" +msgstr "Hangkártya 2:" + +msgid "Sound card 3:" +msgstr "Hangkártya 3:" + +msgid "Sound card 4:" +msgstr "Hangkártya 4:" msgid "MIDI Out Device:" msgstr "MIDI-kimenet:" @@ -418,15 +427,6 @@ msgstr "MIDI-bemenet:" msgid "Standalone MPU-401" msgstr "Különálló MPU-401" -msgid "Innovation SSI-2001" -msgstr "Innovation SSI-2001" - -msgid "CMS / Game Blaster" -msgstr "CMS / Game Blaster" - -msgid "Gravis Ultrasound" -msgstr "Gravis Ultrasound" - msgid "Use FLOAT32 sound" msgstr "FLOAT32 használata" diff --git a/src/qt/languages/it-IT.po b/src/qt/languages/it-IT.po index c1814eaeb..c02e3510f 100644 --- a/src/qt/languages/it-IT.po +++ b/src/qt/languages/it-IT.po @@ -406,8 +406,17 @@ msgstr "Joystick 3..." msgid "Joystick 4..." msgstr "Joystick 4..." -msgid "Sound card:" -msgstr "Scheda audio:" +msgid "Sound card 1:" +msgstr "Scheda audio 1:" + +msgid "Sound card 2:" +msgstr "Scheda audio 2:" + +msgid "Sound card 3:" +msgstr "Scheda audio 3:" + +msgid "Sound card 4:" +msgstr "Scheda audio 4:" msgid "MIDI Out Device:" msgstr "Uscita MIDI:" @@ -418,15 +427,6 @@ msgstr "Entrata MIDI:" msgid "Standalone MPU-401" msgstr "MPU-401 autonomo" -msgid "Innovation SSI-2001" -msgstr "Innovation SSI-2001" - -msgid "CMS / Game Blaster" -msgstr "CMS / Game Blaster" - -msgid "Gravis Ultrasound" -msgstr "Gravis Ultrasound" - msgid "Use FLOAT32 sound" msgstr "Usa suono FLOAT32" diff --git a/src/qt/languages/ja-JP.po b/src/qt/languages/ja-JP.po index 71b5d921f..420d34a2e 100644 --- a/src/qt/languages/ja-JP.po +++ b/src/qt/languages/ja-JP.po @@ -406,8 +406,17 @@ msgstr "ジョイスティック3..." msgid "Joystick 4..." msgstr "ジョイスティック4..." -msgid "Sound card:" -msgstr "サウンドカード:" +msgid "Sound card 1:" +msgstr "サウンドカード 1:" + +msgid "Sound card 2:" +msgstr "サウンドカード 2:" + +msgid "Sound card 3:" +msgstr "サウンドカード 3:" + +msgid "Sound card 4:" +msgstr "サウンドカード 4:" msgid "MIDI Out Device:" msgstr "MIDI出力デバイス:" @@ -418,15 +427,6 @@ msgstr "MIDI入力デバイス:" msgid "Standalone MPU-401" msgstr "独立型MPU-401" -msgid "Innovation SSI-2001" -msgstr "Innovation SSI-2001" - -msgid "CMS / Game Blaster" -msgstr "CMS / Game Blaster" - -msgid "Gravis Ultrasound" -msgstr "Gravis Ultrasound" - msgid "Use FLOAT32 sound" msgstr "FLOAT32サウンドを使用する" diff --git a/src/qt/languages/ko-KR.po b/src/qt/languages/ko-KR.po index 1ebabcfe4..6d189d8e3 100644 --- a/src/qt/languages/ko-KR.po +++ b/src/qt/languages/ko-KR.po @@ -406,8 +406,17 @@ msgstr "조이스틱 3..." msgid "Joystick 4..." msgstr "조이스틱 4..." -msgid "Sound card:" -msgstr "사운드 카드:" +msgid "Sound card 1:" +msgstr "사운드 카드 1:" + +msgid "Sound card 2:" +msgstr "사운드 카드 2:" + +msgid "Sound card 3:" +msgstr "사운드 카드 3:" + +msgid "Sound card 4:" +msgstr "사운드 카드 4:" msgid "MIDI Out Device:" msgstr "MIDI 출력 장치:" @@ -418,15 +427,6 @@ msgstr "MIDI 입력 장치:" msgid "Standalone MPU-401" msgstr "MPU-401 단독 사용" -msgid "Innovation SSI-2001" -msgstr "Innovation SSI-2001" - -msgid "CMS / Game Blaster" -msgstr "CMS / Game Blaster" - -msgid "Gravis Ultrasound" -msgstr "Gravis Ultrasound" - msgid "Use FLOAT32 sound" msgstr "FLOAT32 사운드 사용" diff --git a/src/qt/languages/pl-PL.po b/src/qt/languages/pl-PL.po index c0884601c..26c652c87 100644 --- a/src/qt/languages/pl-PL.po +++ b/src/qt/languages/pl-PL.po @@ -406,8 +406,17 @@ msgstr "Joystick 3..." msgid "Joystick 4..." msgstr "Joystick 4..." -msgid "Sound card:" -msgstr "Karta dźwiękowa:" +msgid "Sound card 1:" +msgstr "Karta dźwiękowa 1:" + +msgid "Sound card 2:" +msgstr "Karta dźwiękowa 2:" + +msgid "Sound card 3:" +msgstr "Karta dźwiękowa 3:" + +msgid "Sound card 4:" +msgstr "Karta dźwiękowa 4:" msgid "MIDI Out Device:" msgstr "Urządzenie wyjściowe MIDI:" @@ -418,15 +427,6 @@ msgstr "Urządzenie wejściowe MIDI:" msgid "Standalone MPU-401" msgstr "Samodzielne urządzenie MPU-401" -msgid "Innovation SSI-2001" -msgstr "Innovation SSI-2001" - -msgid "CMS / Game Blaster" -msgstr "CMS / Game Blaster" - -msgid "Gravis Ultrasound" -msgstr "Gravis Ultrasound" - msgid "Use FLOAT32 sound" msgstr "Użyj dźwięku FLOAT32" diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index d9ddcec83..0202b42a7 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -406,8 +406,17 @@ msgstr "Joystick 3..." msgid "Joystick 4..." msgstr "Joystick 4..." -msgid "Sound card:" -msgstr "Placa de som:" +msgid "Sound card 1:" +msgstr "Placa de som 1:" + +msgid "Sound card 2:" +msgstr "Placa de som 2:" + +msgid "Sound card 3:" +msgstr "Placa de som 3:" + +msgid "Sound card 4:" +msgstr "Placa de som 4:" msgid "MIDI Out Device:" msgstr "Disp. de saída MIDI:" @@ -418,15 +427,6 @@ msgstr "Disp. de entrada MIDI:" msgid "Standalone MPU-401" msgstr "MPU-401 autônomo" -msgid "Innovation SSI-2001" -msgstr "Innovation SSI-2001" - -msgid "CMS / Game Blaster" -msgstr "CMS / Game Blaster" - -msgid "Gravis Ultrasound" -msgstr "Gravis Ultrasound" - msgid "Use FLOAT32 sound" msgstr "Usar som FLOAT32" diff --git a/src/qt/languages/pt-PT.po b/src/qt/languages/pt-PT.po index 33501ecc7..a8ce8bbca 100644 --- a/src/qt/languages/pt-PT.po +++ b/src/qt/languages/pt-PT.po @@ -406,8 +406,17 @@ msgstr "Joystick 3..." msgid "Joystick 4..." msgstr "Joystick 4..." -msgid "Sound card:" -msgstr "Placa de som:" +msgid "Sound card 1:" +msgstr "Placa de som 1:" + +msgid "Sound card 2:" +msgstr "Placa de som 2:" + +msgid "Sound card 3:" +msgstr "Placa de som 3:" + +msgid "Sound card 4:" +msgstr "Placa de som 4:" msgid "MIDI Out Device:" msgstr "Disp. saída MIDI:" @@ -418,15 +427,6 @@ msgstr "Disp. entrada MIDI:" msgid "Standalone MPU-401" msgstr "MPU-401 autónomo" -msgid "Innovation SSI-2001" -msgstr "Innovation SSI-2001" - -msgid "CMS / Game Blaster" -msgstr "CMS / Game Blaster" - -msgid "Gravis Ultrasound" -msgstr "Gravis Ultrasound" - msgid "Use FLOAT32 sound" msgstr "Utilizar som FLOAT32" diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index 6cc388b58..a424c5f6f 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -406,8 +406,17 @@ msgstr "Джойстик 3..." msgid "Joystick 4..." msgstr "Джойстик 4..." -msgid "Sound card:" -msgstr "Звуковая карта:" +msgid "Sound card 1:" +msgstr "Звуковая карта 1:" + +msgid "Sound card 2:" +msgstr "Звуковая карта 2:" + +msgid "Sound card 3:" +msgstr "Звуковая карта 3:" + +msgid "Sound card 4:" +msgstr "Звуковая карта 4:" msgid "MIDI Out Device:" msgstr "MIDI Out устр-во:" @@ -418,15 +427,6 @@ msgstr "MIDI In устр-во:" msgid "Standalone MPU-401" msgstr "Отдельный MPU-401" -msgid "Innovation SSI-2001" -msgstr "Innovation SSI-2001" - -msgid "CMS / Game Blaster" -msgstr "CMS / Game Blaster" - -msgid "Gravis Ultrasound" -msgstr "Gravis Ultrasound" - msgid "Use FLOAT32 sound" msgstr "FLOAT32 звук" diff --git a/src/qt/languages/sl-SI.po b/src/qt/languages/sl-SI.po index 08060a790..ba11014d2 100644 --- a/src/qt/languages/sl-SI.po +++ b/src/qt/languages/sl-SI.po @@ -406,8 +406,17 @@ msgstr "Igralna palica 3..." msgid "Joystick 4..." msgstr "Igralna palica 4..." -msgid "Sound card:" -msgstr "Zvočna kartica:" +msgid "Sound card 1:" +msgstr "Zvočna kartica 1:" + +msgid "Sound card 2:" +msgstr "Zvočna kartica 2:" + +msgid "Sound card 3:" +msgstr "Zvočna kartica 3:" + +msgid "Sound card 4:" +msgstr "Zvočna kartica 4:" msgid "MIDI Out Device:" msgstr "Izhodna naprava MIDI:" @@ -418,15 +427,6 @@ msgstr "Vhodna naprava MIDI:" msgid "Standalone MPU-401" msgstr "Samostojen MPU-401" -msgid "Innovation SSI-2001" -msgstr "Innovation SSI-2001" - -msgid "CMS / Game Blaster" -msgstr "CMS / Game Blaster" - -msgid "Gravis Ultrasound" -msgstr "Gravis Ultrasound" - msgid "Use FLOAT32 sound" msgstr "Uporabi FLOAT32 za zvok" diff --git a/src/qt/languages/tr-TR.po b/src/qt/languages/tr-TR.po index 5c9ddbd4f..f9608e9d0 100644 --- a/src/qt/languages/tr-TR.po +++ b/src/qt/languages/tr-TR.po @@ -406,8 +406,17 @@ msgstr "Oyun kolu 3..." msgid "Joystick 4..." msgstr "Oyun kolu 4..." -msgid "Sound card:" -msgstr "Ses kartı:" +msgid "Sound card 1:" +msgstr "Ses kartı 1:" + +msgid "Sound card 2:" +msgstr "Ses kartı 2:" + +msgid "Sound card 3:" +msgstr "Ses kartı 3:" + +msgid "Sound card 4:" +msgstr "Ses kartı 4:" msgid "MIDI Out Device:" msgstr "MIDI Çıkış Cihazı:" @@ -418,15 +427,6 @@ msgstr "MIDI Giriş Cihazı:" msgid "Standalone MPU-401" msgstr "Bağımsız MPU-401" -msgid "Innovation SSI-2001" -msgstr "Innovation SSI-2001" - -msgid "CMS / Game Blaster" -msgstr "CMS / Game Blaster" - -msgid "Gravis Ultrasound" -msgstr "Gravis Ultrasound" - msgid "Use FLOAT32 sound" msgstr "FLOAT32 ses kullan" diff --git a/src/qt/languages/uk-UA.po b/src/qt/languages/uk-UA.po index c2a839542..0ebe3e5cc 100644 --- a/src/qt/languages/uk-UA.po +++ b/src/qt/languages/uk-UA.po @@ -406,8 +406,17 @@ msgstr "Джойстик 3..." msgid "Joystick 4..." msgstr "Джойстик 4..." -msgid "Sound card:" -msgstr "Звукова карта:" +msgid "Sound card 1:" +msgstr "Звукова карта 1:" + +msgid "Sound card 2:" +msgstr "Звукова карта 2:" + +msgid "Sound card 3:" +msgstr "Звукова карта 3:" + +msgid "Sound card 4:" +msgstr "Звукова карта 4:" msgid "MIDI Out Device:" msgstr "MIDI Out при-ій:" @@ -418,15 +427,6 @@ msgstr "MIDI In при-ій:" msgid "Standalone MPU-401" msgstr "Окремий MPU-401" -msgid "Innovation SSI-2001" -msgstr "Innovation SSI-2001" - -msgid "CMS / Game Blaster" -msgstr "CMS / Game Blaster" - -msgid "Gravis Ultrasound" -msgstr "Gravis Ultrasound" - msgid "Use FLOAT32 sound" msgstr "FLOAT32 звук" diff --git a/src/qt/languages/zh-CN.po b/src/qt/languages/zh-CN.po index 5c995ae8e..65977da27 100644 --- a/src/qt/languages/zh-CN.po +++ b/src/qt/languages/zh-CN.po @@ -406,8 +406,17 @@ msgstr "操纵杆 3..." msgid "Joystick 4..." msgstr "操纵杆 4..." -msgid "Sound card:" -msgstr "声卡:" +msgid "Sound card 1:" +msgstr "声卡 1:" + +msgid "Sound card 2:" +msgstr "声卡 2:" + +msgid "Sound card 3:" +msgstr "声卡 3:" + +msgid "Sound card 4:" +msgstr "声卡 4:" msgid "MIDI Out Device:" msgstr "MIDI 输出设备:" @@ -418,15 +427,6 @@ msgstr "MIDI 输入设备:" msgid "Standalone MPU-401" msgstr "独立 MPU-401" -msgid "Innovation SSI-2001" -msgstr "Innovation SSI-2001" - -msgid "CMS / Game Blaster" -msgstr "CMS / Game Blaster" - -msgid "Gravis Ultrasound" -msgstr "Gravis Ultrasound" - msgid "Use FLOAT32 sound" msgstr "使用单精度浮点 (FLOAT32)" diff --git a/src/qt/languages/zh-TW.po b/src/qt/languages/zh-TW.po index 587db5e0c..b61613b89 100644 --- a/src/qt/languages/zh-TW.po +++ b/src/qt/languages/zh-TW.po @@ -406,8 +406,17 @@ msgstr "搖桿 3..." msgid "Joystick 4..." msgstr "搖桿 4..." -msgid "Sound card:" -msgstr "音訊卡:" +msgid "Sound card 1:" +msgstr "音訊卡 1:" + +msgid "Sound card 2:" +msgstr "音訊卡 2:" + +msgid "Sound card 3:" +msgstr "音訊卡 3:" + +msgid "Sound card 4:" +msgstr "音訊卡 4:" msgid "MIDI Out Device:" msgstr "MIDI 輸出裝置:" @@ -418,15 +427,6 @@ msgstr "MIDI 輸入裝置:" msgid "Standalone MPU-401" msgstr "獨立 MPU-401" -msgid "Innovation SSI-2001" -msgstr "Innovation SSI-2001" - -msgid "CMS / Game Blaster" -msgstr "CMS / Game Blaster" - -msgid "Gravis Ultrasound" -msgstr "Gravis Ultrasound" - msgid "Use FLOAT32 sound" msgstr "使用單精度浮點 (FLOAT32)" diff --git a/src/qt/qt_settingssound.cpp b/src/qt/qt_settingssound.cpp index e17ec5ed1..1be663dd8 100644 --- a/src/qt/qt_settingssound.cpp +++ b/src/qt/qt_settingssound.cpp @@ -11,8 +11,10 @@ * * * Authors: Joakim L. Gilje + * Jasmine Iwanek * - * Copyright 2021 Joakim L. Gilje + * Copyright 2021 Joakim L. Gilje + * Copyright 2022-2023 Jasmine Iwanek */ #include "qt_settingssound.hpp" #include "ui_qt_settingssound.h" @@ -47,17 +49,17 @@ SettingsSound::~SettingsSound() void SettingsSound::save() { - sound_card_current = ui->comboBoxSoundCard->currentData().toInt(); + for (uint8_t i = 0; i < SOUND_CARD_MAX; ++i) { + auto *cbox = findChild(QString("comboBoxSoundCard%1").arg(i + 1)); + sound_card_current[i] = cbox->currentData().toInt(); + } + midi_output_device_current = ui->comboBoxMidiOut->currentData().toInt(); midi_input_device_current = ui->comboBoxMidiIn->currentData().toInt(); mpu401_standalone_enable = ui->checkBoxMPU401->isChecked() ? 1 : 0; - SSI2001 = ui->checkBoxSSI2001->isChecked() ? 1 : 0; - ; - GAMEBLASTER = ui->checkBoxCMS->isChecked() ? 1 : 0; - GUS = ui->checkBoxGUS->isChecked() ? 1 : 0; - ; + sound_is_float = ui->checkBoxFloat32->isChecked() ? 1 : 0; - ; + if (ui->radioButtonYMFM->isChecked()) fm_driver = FM_DRV_YMFM; else @@ -69,41 +71,45 @@ SettingsSound::onCurrentMachineChanged(int machineId) { this->machineId = machineId; - auto *model = ui->comboBoxSoundCard->model(); - auto removeRows = model->rowCount(); - int c = 0; - int selectedRow = 0; - while (true) { - /* Skip "internal" if machine doesn't have it. */ - if ((c == 1) && (machine_has_flags(machineId, MACHINE_SOUND) == 0)) { - c++; - continue; - } + int c = 0; + int selectedRow = 0; - auto *sound_dev = sound_card_getdevice(c); - QString name = DeviceConfig::DeviceName(sound_dev, sound_card_get_internal_name(c), 1); - if (name.isEmpty()) { - break; - } + for (uint8_t i = 0; i < SOUND_CARD_MAX; ++i) { + auto *cbox = findChild(QString("comboBoxSoundCard%1").arg(i + 1)); + auto *model = cbox->model(); + auto removeRows = model->rowCount(); + c = 0; + selectedRow = 0; - if (sound_card_available(c)) { - if (device_is_valid(sound_dev, machineId)) { + while (true) { + /* Skip "internal" if machine doesn't have it for the first card, always skip for others. */ + if (((c == 1) && (machine_has_flags(machineId, MACHINE_SOUND) == 0)) || (i != 0)) { + c++; + continue; + } + + auto name = DeviceConfig::DeviceName(sound_card_getdevice(c), sound_card_get_internal_name(c), 1); + if (name.isEmpty()) { + break; + } + + if (sound_card_available(c) && device_is_valid(sound_card_getdevice(c), machineId)) { int row = Models::AddEntry(model, name, c); - if (c == sound_card_current) { + if (c == sound_card_current[i]) { selectedRow = row - removeRows; } } + c++; } - c++; + model->removeRows(0, removeRows); + cbox->setEnabled(model->rowCount() > 0); + cbox->setCurrentIndex(-1); + cbox->setCurrentIndex(selectedRow); } - model->removeRows(0, removeRows); - ui->comboBoxSoundCard->setEnabled(model->rowCount() > 0); - ui->comboBoxSoundCard->setCurrentIndex(-1); - ui->comboBoxSoundCard->setCurrentIndex(selectedRow); - model = ui->comboBoxMidiOut->model(); - removeRows = model->rowCount(); + auto model = ui->comboBoxMidiOut->model(); + auto removeRows = model->rowCount(); c = 0; selectedRow = 0; while (true) { @@ -150,19 +156,8 @@ SettingsSound::onCurrentMachineChanged(int machineId) ui->comboBoxMidiIn->setCurrentIndex(selectedRow); ui->checkBoxMPU401->setChecked(mpu401_standalone_enable > 0); - ui->checkBoxSSI2001->setChecked(SSI2001 > 0); - ui->checkBoxCMS->setChecked(GAMEBLASTER > 0); - ui->checkBoxGUS->setChecked(GUS > 0); ui->checkBoxFloat32->setChecked(sound_is_float > 0); - bool hasIsa = machine_has_bus(machineId, MACHINE_BUS_ISA) > 0; - bool hasIsa16 = machine_has_bus(machineId, MACHINE_BUS_ISA16) > 0; - ui->checkBoxCMS->setEnabled(hasIsa); - ui->pushButtonConfigureCMS->setEnabled((GAMEBLASTER > 0) && hasIsa); - ui->checkBoxGUS->setEnabled(hasIsa16); - ui->pushButtonConfigureGUS->setEnabled((GUS > 0) && hasIsa16); - ui->checkBoxSSI2001->setEnabled(hasIsa); - ui->pushButtonConfigureSSI2001->setEnabled((SSI2001 > 0) && hasIsa); switch (fm_driver) { case FM_DRV_YMFM: ui->radioButtonYMFM->setChecked(true); @@ -192,18 +187,63 @@ allowMpu401(Ui::SettingsSound *ui) } void -SettingsSound::on_comboBoxSoundCard_currentIndexChanged(int index) +SettingsSound::on_comboBoxSoundCard1_currentIndexChanged(int index) { if (index < 0) { return; } - ui->pushButtonConfigureSoundCard->setEnabled(sound_card_has_config(ui->comboBoxSoundCard->currentData().toInt())); + ui->pushButtonConfigureSoundCard1->setEnabled(sound_card_has_config(ui->comboBoxSoundCard1->currentData().toInt())); } void -SettingsSound::on_pushButtonConfigureSoundCard_clicked() +SettingsSound::on_pushButtonConfigureSoundCard1_clicked() { - DeviceConfig::ConfigureDevice(sound_card_getdevice(ui->comboBoxSoundCard->currentData().toInt()), 0, qobject_cast(Settings::settings)); + DeviceConfig::ConfigureDevice(sound_card_getdevice(ui->comboBoxSoundCard1->currentData().toInt()), 0, qobject_cast(Settings::settings)); +} + +void +SettingsSound::on_comboBoxSoundCard2_currentIndexChanged(int index) +{ + if (index < 0) { + return; + } + ui->pushButtonConfigureSoundCard2->setEnabled(sound_card_has_config(ui->comboBoxSoundCard2->currentData().toInt())); +} + +void +SettingsSound::on_pushButtonConfigureSoundCard2_clicked() +{ + DeviceConfig::ConfigureDevice(sound_card_getdevice(ui->comboBoxSoundCard2->currentData().toInt()), 0, qobject_cast(Settings::settings)); +} + +void +SettingsSound::on_comboBoxSoundCard3_currentIndexChanged(int index) +{ + if (index < 0) { + return; + } + ui->pushButtonConfigureSoundCard3->setEnabled(sound_card_has_config(ui->comboBoxSoundCard3->currentData().toInt())); +} + +void +SettingsSound::on_pushButtonConfigureSoundCard3_clicked() +{ + DeviceConfig::ConfigureDevice(sound_card_getdevice(ui->comboBoxSoundCard3->currentData().toInt()), 0, qobject_cast(Settings::settings)); +} + +void +SettingsSound::on_comboBoxSoundCard4_currentIndexChanged(int index) +{ + if (index < 0) { + return; + } + ui->pushButtonConfigureSoundCard1->setEnabled(sound_card_has_config(ui->comboBoxSoundCard4->currentData().toInt())); +} + +void +SettingsSound::on_pushButtonConfigureSoundCard4_clicked() +{ + DeviceConfig::ConfigureDevice(sound_card_getdevice(ui->comboBoxSoundCard4->currentData().toInt()), 0, qobject_cast(Settings::settings)); } void @@ -246,24 +286,6 @@ SettingsSound::on_checkBoxMPU401_stateChanged(int state) ui->pushButtonConfigureMPU401->setEnabled(state == Qt::Checked); } -void -SettingsSound::on_checkBoxSSI2001_stateChanged(int state) -{ - ui->pushButtonConfigureSSI2001->setEnabled(state == Qt::Checked); -} - -void -SettingsSound::on_checkBoxCMS_stateChanged(int state) -{ - ui->pushButtonConfigureCMS->setEnabled(state == Qt::Checked); -} - -void -SettingsSound::on_checkBoxGUS_stateChanged(int state) -{ - ui->pushButtonConfigureGUS->setEnabled(state == Qt::Checked); -} - void SettingsSound::on_pushButtonConfigureMPU401_clicked() { @@ -273,21 +295,3 @@ SettingsSound::on_pushButtonConfigureMPU401_clicked() DeviceConfig::ConfigureDevice(&mpu401_device, 0, qobject_cast(Settings::settings)); } } - -void -SettingsSound::on_pushButtonConfigureSSI2001_clicked() -{ - DeviceConfig::ConfigureDevice(&ssi2001_device, 0, qobject_cast(Settings::settings)); -} - -void -SettingsSound::on_pushButtonConfigureCMS_clicked() -{ - DeviceConfig::ConfigureDevice(&cms_device, 0, qobject_cast(Settings::settings)); -} - -void -SettingsSound::on_pushButtonConfigureGUS_clicked() -{ - DeviceConfig::ConfigureDevice(&gus_device, 0, qobject_cast(Settings::settings)); -} diff --git a/src/qt/qt_settingssound.hpp b/src/qt/qt_settingssound.hpp index e0bc2e4f8..92b700c92 100644 --- a/src/qt/qt_settingssound.hpp +++ b/src/qt/qt_settingssound.hpp @@ -20,20 +20,20 @@ public slots: void onCurrentMachineChanged(int machineId); private slots: - void on_pushButtonConfigureGUS_clicked(); - void on_pushButtonConfigureCMS_clicked(); - void on_pushButtonConfigureSSI2001_clicked(); void on_pushButtonConfigureMPU401_clicked(); - void on_checkBoxGUS_stateChanged(int arg1); - void on_checkBoxCMS_stateChanged(int arg1); - void on_checkBoxSSI2001_stateChanged(int arg1); void on_checkBoxMPU401_stateChanged(int arg1); void on_pushButtonConfigureMidiIn_clicked(); void on_pushButtonConfigureMidiOut_clicked(); void on_comboBoxMidiIn_currentIndexChanged(int index); void on_comboBoxMidiOut_currentIndexChanged(int index); - void on_pushButtonConfigureSoundCard_clicked(); - void on_comboBoxSoundCard_currentIndexChanged(int index); + void on_pushButtonConfigureSoundCard1_clicked(); + void on_comboBoxSoundCard1_currentIndexChanged(int index); + void on_pushButtonConfigureSoundCard2_clicked(); + void on_comboBoxSoundCard2_currentIndexChanged(int index); + void on_pushButtonConfigureSoundCard3_clicked(); + void on_comboBoxSoundCard3_currentIndexChanged(int index); + void on_pushButtonConfigureSoundCard4_clicked(); + void on_comboBoxSoundCard4_currentIndexChanged(int index); private: Ui::SettingsSound *ui; diff --git a/src/qt/qt_settingssound.ui b/src/qt/qt_settingssound.ui index 9ae91dcd2..f85a09a0d 100644 --- a/src/qt/qt_settingssound.ui +++ b/src/qt/qt_settingssound.ui @@ -26,42 +26,73 @@ 0 - + MIDI In Device: - - - - Innovation SSI-2001 - - - - - - - Gravis Ultrasound - - - - Sound card: + Sound card #1: - + Configure - + + + + Sound card #2: + + + + + + + Configure + + + + + + + Sound card #3: + + + + + + + Configure + + + + + + + + Sound card #4: + + + + + + + Configure + + + + + + @@ -71,49 +102,35 @@ - + MIDI Out Device: - + Standalone MPU-401 - + Configure - + Configure - - - - Configure - - - - - - - CMS / Game Blaster - - - - + @@ -123,35 +140,21 @@ - + Configure - + Use FLOAT32 sound - - - - Configure - - - - - - - Configure - - - - + @@ -180,7 +183,7 @@ - + Qt::Vertical @@ -194,7 +197,37 @@ - + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + + + 0 diff --git a/src/sound/sound.c b/src/sound/sound.c index ab75af4f0..ecbb7e1a9 100644 --- a/src/sound/sound.c +++ b/src/sound/sound.c @@ -51,7 +51,7 @@ typedef struct { void *priv; } sound_handler_t; -int sound_card_current = 0; +int sound_card_current[SOUND_CARD_MAX] = { 0, 0, 0, 0}; int sound_pos_global = 0; int sound_gain = 0; @@ -79,30 +79,31 @@ static void (*filter_cd_audio)(int channel, double *buffer, void *p) = NULL; static void *filter_cd_audio_p = NULL; static const device_t sound_none_device = { - "None", - "none", - 0, - 0, - NULL, - NULL, - NULL, - { NULL }, - NULL, - NULL, - NULL + .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 = { - "Internal", - "internal", - 0, - 0, - NULL, - NULL, - NULL, - { NULL }, - NULL, - NULL, - NULL + .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[] = { @@ -115,8 +116,10 @@ static const SOUND_CARD sound_cards[] = { { &adgold_device }, { &azt2316a_device }, { &azt1605_device }, + { &cms_device }, { &cs4235_device }, { &cs4236b_device }, + { &gus_device }, { &sb_1_device }, { &sb_15_device }, { &sb_2_device }, @@ -130,6 +133,7 @@ static const SOUND_CARD sound_cards[] = { { &sb_awe64_value_device }, { &sb_awe64_device }, { &sb_awe64_gold_device }, + { &ssi2001_device }, #if defined(DEV_BRANCH) && defined(USE_PAS16) { &pas16_device }, #endif @@ -214,8 +218,14 @@ sound_card_get_from_internal_name(char *s) void sound_card_init(void) { - if (sound_cards[sound_card_current].device) - device_add(sound_cards[sound_card_current].device); + if (sound_cards[sound_card_current[0]].device) + device_add(sound_cards[sound_card_current[0]].device); + if (sound_cards[sound_card_current[1]].device) + device_add(sound_cards[sound_card_current[1]].device); + if (sound_cards[sound_card_current[2]].device) + device_add(sound_cards[sound_card_current[2]].device); + if (sound_cards[sound_card_current[3]].device) + device_add(sound_cards[sound_card_current[3]].device); } void @@ -511,15 +521,6 @@ sound_card_reset(void) if (mpu401_standalone_enable) mpu401_device_add(); - - if (GUS) - device_add(&gus_device); - - if (GAMEBLASTER) - device_add(&cms_device); - - if (SSI2001) - device_add(&ssi2001_device); } void diff --git a/src/win/languages/cs-CZ.rc b/src/win/languages/cs-CZ.rc index 635d2dc89..95818b72c 100644 --- a/src/win/languages/cs-CZ.rc +++ b/src/win/languages/cs-CZ.rc @@ -284,13 +284,13 @@ END #define STR_JOY3 "Joystick 3..." #define STR_JOY4 "Joystick 4..." -#define STR_SOUND "Zvuková karta:" +#define STR_SOUND1 "Zvuková karta 1:" +#define STR_SOUND2 "Zvuková karta 2:" +#define STR_SOUND3 "Zvuková karta 3:" +#define STR_SOUND4 "Zvuková karta 4:" #define STR_MIDI_OUT "MIDI výstup:" #define STR_MIDI_IN "MIDI vstup:" #define STR_MPU401 "Samostatný MPU-401" -#define STR_SSI "Innovation SSI-2001" -#define STR_CMS "CMS / Game Blaster" -#define STR_GUS "Gravis Ultrasound" #define STR_FLOAT "Použít zvuk FLOAT32" #define STR_FM_DRIVER "FM synth driver" #define STR_FM_DRV_NUKED "Nuked (přesnější)" diff --git a/src/win/languages/de-DE.rc b/src/win/languages/de-DE.rc index 308657978..da6fa043f 100644 --- a/src/win/languages/de-DE.rc +++ b/src/win/languages/de-DE.rc @@ -284,13 +284,13 @@ END #define STR_JOY3 "Joystick 3..." #define STR_JOY4 "Joystick 4..." -#define STR_SOUND "Soundkarte:" +#define STR_SOUND1 "Soundkarte 1:" +#define STR_SOUND2 "Soundkarte 2:" +#define STR_SOUND3 "Soundkarte 3:" +#define STR_SOUND4 "Soundkarte 4:" #define STR_MIDI_OUT "MIDI Out-Gerät:" #define STR_MIDI_IN "MIDI In-Gerät:" #define STR_MPU401 "Standalone-MPU-401-Gerät" -#define STR_SSI "Innovation SSI-2001" -#define STR_CMS "CMS / Game Blaster" -#define STR_GUS "Gravis Ultrasound" #define STR_FLOAT "FLOAT32-Wiedergabe benutzen" #define STR_FM_DRIVER "FM-Synth-Treiber" #define STR_FM_DRV_NUKED "Nuked (genauer)" diff --git a/src/win/languages/dialogs.rc b/src/win/languages/dialogs.rc index 0f74ef10b..30c3e4e50 100644 --- a/src/win/languages/dialogs.rc +++ b/src/win/languages/dialogs.rc @@ -320,58 +320,64 @@ DLG_CFG_SOUND DIALOG DISCARDABLE CFG_PANE_LEFT, CFG_PANE_TOP, CFG_PANE_WIDTH, C STYLE DS_CONTROL | WS_CHILD FONT FONT_SIZE, FONT_NAME BEGIN - LTEXT STR_SOUND, IDT_SOUND, + LTEXT STR_SOUND1, IDT_SOUND1, CFG_HMARGIN, CFG_VMARGIN, CFG_PANE_LTEXT_PRI_WIDTH, CFG_PANE_LTEXT_HEIGHT - COMBOBOX IDC_COMBO_SOUND, + COMBOBOX IDC_COMBO_SOUND1, CFG_COMBO_BOX_LEFT, 7, CFG_COMBO_BTN_WIDTH, CFG_COMBO_HEIGHT, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON STR_CONFIGURE, IDC_CONFIGURE_SND, + PUSHBUTTON STR_CONFIGURE, IDC_CONFIGURE_SND1, CFG_COMBO_BTN_LEFT, 6, CFG_BTN_WIDTH, CFG_BTN_HEIGHT - LTEXT STR_MIDI_OUT, IDT_MIDI_OUT, + LTEXT STR_SOUND2, IDT_SOUND2, CFG_HMARGIN, 28, CFG_PANE_LTEXT_PRI_WIDTH, CFG_PANE_LTEXT_HEIGHT - COMBOBOX IDC_COMBO_MIDI_OUT, + COMBOBOX IDC_COMBO_SOUND2, CFG_COMBO_BOX_LEFT, 26, CFG_COMBO_BTN_WIDTH, CFG_COMBO_HEIGHT, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON STR_CONFIGURE, IDC_CONFIGURE_SND2, + CFG_COMBO_BTN_LEFT, 25, CFG_BTN_WIDTH, CFG_BTN_HEIGHT + + LTEXT STR_SOUND3, IDT_SOUND3, + CFG_HMARGIN, 48, CFG_PANE_LTEXT_PRI_WIDTH, CFG_PANE_LTEXT_HEIGHT + COMBOBOX IDC_COMBO_SOUND3, + CFG_COMBO_BOX_LEFT, 46, CFG_COMBO_BTN_WIDTH, CFG_COMBO_HEIGHT, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON STR_CONFIGURE, IDC_CONFIGURE_SND3, + CFG_COMBO_BTN_LEFT, 45, CFG_BTN_WIDTH, CFG_BTN_HEIGHT + + LTEXT STR_SOUND4, IDT_SOUND4, + CFG_HMARGIN, 68, CFG_PANE_LTEXT_PRI_WIDTH, CFG_PANE_LTEXT_HEIGHT + COMBOBOX IDC_COMBO_SOUND4, + CFG_COMBO_BOX_LEFT, 66, CFG_COMBO_BTN_WIDTH, CFG_COMBO_HEIGHT, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON STR_CONFIGURE, IDC_CONFIGURE_SND4, + CFG_COMBO_BTN_LEFT, 65, CFG_BTN_WIDTH, CFG_BTN_HEIGHT + + LTEXT STR_MIDI_OUT, IDT_MIDI_OUT, + CFG_HMARGIN, 88, CFG_PANE_LTEXT_PRI_WIDTH, CFG_PANE_LTEXT_HEIGHT + COMBOBOX IDC_COMBO_MIDI_OUT, + CFG_COMBO_BOX_LEFT, 86, CFG_COMBO_BTN_WIDTH, CFG_COMBO_HEIGHT, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP PUSHBUTTON STR_CONFIGURE, IDC_CONFIGURE_MIDI_OUT, - CFG_COMBO_BTN_LEFT, 25, CFG_BTN_WIDTH, CFG_BTN_HEIGHT + CFG_COMBO_BTN_LEFT, 85, CFG_BTN_WIDTH, CFG_BTN_HEIGHT LTEXT STR_MIDI_IN, IDT_MIDI_IN, - CFG_HMARGIN, 47, CFG_PANE_LTEXT_PRI_WIDTH, CFG_PANE_LTEXT_HEIGHT + CFG_HMARGIN, 108, CFG_PANE_LTEXT_PRI_WIDTH, CFG_PANE_LTEXT_HEIGHT COMBOBOX IDC_COMBO_MIDI_IN, - CFG_COMBO_BOX_LEFT, 45, CFG_COMBO_BTN_WIDTH, CFG_COMBO_HEIGHT, + CFG_COMBO_BOX_LEFT, 105, CFG_COMBO_BTN_WIDTH, CFG_COMBO_HEIGHT, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP PUSHBUTTON STR_CONFIGURE, IDC_CONFIGURE_MIDI_IN, - CFG_COMBO_BTN_LEFT, 44, CFG_BTN_WIDTH, CFG_BTN_HEIGHT + CFG_COMBO_BTN_LEFT, 105, CFG_BTN_WIDTH, CFG_BTN_HEIGHT CONTROL STR_MPU401,IDC_CHECK_MPU401, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, - CFG_HMARGIN, 66, 199, CFG_CHECKBOX_HEIGHT + CFG_HMARGIN, 126, 199, CFG_CHECKBOX_HEIGHT PUSHBUTTON STR_CONFIGURE, IDC_CONFIGURE_MPU401, - CFG_COMBO_BTN_LEFT, 64, CFG_BTN_WIDTH, CFG_BTN_HEIGHT + CFG_COMBO_BTN_LEFT, 125, CFG_BTN_WIDTH, CFG_BTN_HEIGHT - CONTROL STR_SSI,IDC_CHECK_SSI, - "Button", BS_AUTOCHECKBOX | WS_TABSTOP, - CFG_HMARGIN, 84, 95, CFG_CHECKBOX_HEIGHT - PUSHBUTTON STR_CONFIGURE, IDC_CONFIGURE_SSI, - CFG_COMBO_BTN_LEFT, 82, CFG_BTN_WIDTH, CFG_BTN_HEIGHT - - CONTROL STR_CMS,IDC_CHECK_CMS, - "Button", BS_AUTOCHECKBOX | WS_TABSTOP, - CFG_HMARGIN, 102, CFG_CHECKBOX_PRI_WIDTH, CFG_CHECKBOX_HEIGHT - PUSHBUTTON STR_CONFIGURE, IDC_CONFIGURE_CMS, - CFG_COMBO_BTN_LEFT, 100, CFG_BTN_WIDTH, CFG_BTN_HEIGHT - - CONTROL STR_GUS,IDC_CHECK_GUS, - "Button", BS_AUTOCHECKBOX | WS_TABSTOP, - CFG_HMARGIN, 120, CFG_CHECKBOX_PRI_WIDTH, CFG_CHECKBOX_HEIGHT - PUSHBUTTON STR_CONFIGURE, IDC_CONFIGURE_GUS, - CFG_COMBO_BTN_LEFT, 118, CFG_BTN_WIDTH, CFG_BTN_HEIGHT - CONTROL STR_FLOAT, IDC_CHECK_FLOAT, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, - CFG_HMARGIN, 138, 104, CFG_CHECKBOX_HEIGHT + CFG_HMARGIN, 138, 194, CFG_CHECKBOX_HEIGHT GROUPBOX STR_FM_DRIVER, IDC_FM_DRIVER, CFG_HMARGIN, 154, 110, 42 @@ -958,13 +964,13 @@ END #undef STR_JOY3 #undef STR_JOY4 -#undef STR_SOUND +#undef STR_SOUND1 +#undef STR_SOUND2 +#undef STR_SOUND3 +#undef STR_SOUND4 #undef STR_MIDI_OUT #undef STR_MIDI_IN #undef STR_MPU401 -#undef STR_SSI -#undef STR_CMS -#undef STR_GUS #undef STR_FLOAT #undef STR_FM_DRIVER #undef STR_FM_DRV_NUKED diff --git a/src/win/languages/en-GB.rc b/src/win/languages/en-GB.rc index 0cc4a8f5a..25724a210 100644 --- a/src/win/languages/en-GB.rc +++ b/src/win/languages/en-GB.rc @@ -284,13 +284,13 @@ END #define STR_JOY3 "Joystick 3..." #define STR_JOY4 "Joystick 4..." -#define STR_SOUND "Sound card:" +#define STR_SOUND1 "Sound card 1:" +#define STR_SOUND2 "Sound card 2:" +#define STR_SOUND3 "Sound card 3:" +#define STR_SOUND4 "Sound card 4:" #define STR_MIDI_OUT "MIDI Out Device:" #define STR_MIDI_IN "MIDI In Device:" #define STR_MPU401 "Standalone MPU-401" -#define STR_SSI "Innovation SSI-2001" -#define STR_CMS "CMS / Game Blaster" -#define STR_GUS "Gravis Ultrasound" #define STR_FLOAT "Use FLOAT32 sound" #define STR_FM_DRIVER "FM synth driver" #define STR_FM_DRV_NUKED "Nuked (more accurate)" diff --git a/src/win/languages/en-US.rc b/src/win/languages/en-US.rc index 12100b0bf..ce7e3fc26 100644 --- a/src/win/languages/en-US.rc +++ b/src/win/languages/en-US.rc @@ -284,13 +284,13 @@ END #define STR_JOY3 "Joystick 3..." #define STR_JOY4 "Joystick 4..." -#define STR_SOUND "Sound card:" +#define STR_SOUND1 "Sound card 1:" +#define STR_SOUND2 "Sound card 2:" +#define STR_SOUND3 "Sound card 3:" +#define STR_SOUND4 "Sound card 4:" #define STR_MIDI_OUT "MIDI Out Device:" #define STR_MIDI_IN "MIDI In Device:" #define STR_MPU401 "Standalone MPU-401" -#define STR_SSI "Innovation SSI-2001" -#define STR_CMS "CMS / Game Blaster" -#define STR_GUS "Gravis Ultrasound" #define STR_FLOAT "Use FLOAT32 sound" #define STR_FM_DRIVER "FM synth driver" #define STR_FM_DRV_NUKED "Nuked (more accurate)" diff --git a/src/win/languages/es-ES.rc b/src/win/languages/es-ES.rc index cf9c03371..03cedff7e 100644 --- a/src/win/languages/es-ES.rc +++ b/src/win/languages/es-ES.rc @@ -284,13 +284,13 @@ END #define STR_JOY3 "Mando 3..." #define STR_JOY4 "Mando 4..." -#define STR_SOUND "Tarjeta de sonido:" +#define STR_SOUND1 "Tarjeta de sonido 1:" +#define STR_SOUND2 "Tarjeta de sonido 2:" +#define STR_SOUND3 "Tarjeta de sonido 3:" +#define STR_SOUND4 "Tarjeta de sonido 4:" #define STR_MIDI_OUT "Dispositivo MIDI de salida:" #define STR_MIDI_IN "Dispositivo MIDI de entrada:" #define STR_MPU401 "MPU-401 independiente" -#define STR_SSI "Innovation SSI-2001" -#define STR_CMS "CMS / Game Blaster" -#define STR_GUS "Gravis Ultrasound" #define STR_FLOAT "Usar sonido FLOAT32" #define STR_FM_DRIVER "Controlador de sintet. FM" #define STR_FM_DRV_NUKED "Nuked (más preciso)" diff --git a/src/win/languages/fi-FI.rc b/src/win/languages/fi-FI.rc index 852778a96..b08ceeb23 100644 --- a/src/win/languages/fi-FI.rc +++ b/src/win/languages/fi-FI.rc @@ -284,13 +284,13 @@ END #define STR_JOY3 "Peliohjain 3..." #define STR_JOY4 "Peliohjain 4..." -#define STR_SOUND "Äänikortti:" +#define STR_SOUND1 "Äänikortti 1:" +#define STR_SOUND2 "Äänikortti 2:" +#define STR_SOUND3 "Äänikortti 3:" +#define STR_SOUND4 "Äänikortti 4:" #define STR_MIDI_OUT "MIDI-ulostulo:" #define STR_MIDI_IN "MIDI-sisääntulo:" #define STR_MPU401 "Erillinen MPU-401" -#define STR_SSI "Innovation SSI-2001" -#define STR_CMS "CMS / Game Blaster" -#define STR_GUS "Gravis Ultrasound" #define STR_FLOAT "Käytä FLOAT32-ääntä" #define STR_FM_DRIVER "FM-syntetisaattoriohjain" #define STR_FM_DRV_NUKED "Nuked (tarkempi)" diff --git a/src/win/languages/fr-FR.rc b/src/win/languages/fr-FR.rc index 8e005ebcd..376829398 100644 --- a/src/win/languages/fr-FR.rc +++ b/src/win/languages/fr-FR.rc @@ -284,13 +284,13 @@ END #define STR_JOY3 "Manette 3..." #define STR_JOY4 "Manette 4..." -#define STR_SOUND "Carte son:" +#define STR_SOUND1 "Carte son 1:" +#define STR_SOUND2 "Carte son 2:" +#define STR_SOUND3 "Carte son 3:" +#define STR_SOUND4 "Carte son 4:" #define STR_MIDI_OUT "Sortie MIDI:" #define STR_MIDI_IN "Entrée MIDI:" #define STR_MPU401 "MPU-401 autonome" -#define STR_SSI "Innovation SSI-2001" -#define STR_CMS "CMS / Game Blaster" -#define STR_GUS "Gravis Ultrasound" #define STR_FLOAT "Utiliser le son FLOAT32" #define STR_FM_DRIVER "Pilote de synthétiseur FM" #define STR_FM_DRV_NUKED "Nuked (plus précis)" diff --git a/src/win/languages/hr-HR.rc b/src/win/languages/hr-HR.rc index b1b4a3524..451470aca 100644 --- a/src/win/languages/hr-HR.rc +++ b/src/win/languages/hr-HR.rc @@ -284,13 +284,13 @@ END #define STR_JOY3 "Palica za igru 3..." #define STR_JOY4 "Palica za igru 4..." -#define STR_SOUND "Zvučna kartica:" +#define STR_SOUND1 "Zvučna kartica 1:" +#define STR_SOUND2 "Zvučna kartica 2:" +#define STR_SOUND3 "Zvučna kartica 3:" +#define STR_SOUND4 "Zvučna kartica 4:" #define STR_MIDI_OUT "Izlazni uređaj MIDI:" #define STR_MIDI_IN "Ulazni uređaj MIDI:" #define STR_MPU401 "Samostalni MPU-401" -#define STR_SSI "Innovation SSI-2001" -#define STR_CMS "CMS / Game Blaster" -#define STR_GUS "Gravis Ultrasound" #define STR_FLOAT "Koristi FLOAT32 za zvuk" #define STR_FM_DRIVER "Drajver za FM sintisajzer" #define STR_FM_DRV_NUKED "Nuked (precizniji)" diff --git a/src/win/languages/hu-HU.rc b/src/win/languages/hu-HU.rc index 0692c1cdd..2b9025413 100644 --- a/src/win/languages/hu-HU.rc +++ b/src/win/languages/hu-HU.rc @@ -289,13 +289,13 @@ END #define STR_JOY3 "Játékvez. 3..." #define STR_JOY4 "Játékvez. 4..." -#define STR_SOUND "Hangkártya:" +#define STR_SOUND1 "Hangkártya 1:" +#define STR_SOUND2 "Hangkártya 2:" +#define STR_SOUND3 "Hangkártya 3:" +#define STR_SOUND4 "Hangkártya 4:" #define STR_MIDI_OUT "MIDI-kimenet:" #define STR_MIDI_IN "MIDI-bemenet:" #define STR_MPU401 "Különálló MPU-401" -#define STR_SSI "Innovation SSI-2001" -#define STR_CMS "CMS / Game Blaster" -#define STR_GUS "Gravis Ultrasound" #define STR_FLOAT "FLOAT32 használata" #define STR_FM_DRIVER "FM szintetizátor meghajtó" #define STR_FM_DRV_NUKED "Nuked (pontosabb)" diff --git a/src/win/languages/it-IT.rc b/src/win/languages/it-IT.rc index bf82c116f..302e4b599 100644 --- a/src/win/languages/it-IT.rc +++ b/src/win/languages/it-IT.rc @@ -285,13 +285,13 @@ END #define STR_JOY3 "Joystick 3..." #define STR_JOY4 "Joystick 4..." -#define STR_SOUND "Scheda audio:" +#define STR_SOUND1 "Scheda audio 1:" +#define STR_SOUND2 "Scheda audio 2:" +#define STR_SOUND3 "Scheda audio 3:" +#define STR_SOUND4 "Scheda audio 4:" #define STR_MIDI_OUT "Uscita MIDI:" #define STR_MIDI_IN "Entrata MIDI:" #define STR_MPU401 "MPU-401 autonomo" -#define STR_SSI "Innovation SSI-2001" -#define STR_CMS "CMS / Game Blaster" -#define STR_GUS "Gravis Ultrasound" #define STR_FLOAT "Usa suono FLOAT32" #define STR_FM_DRIVER "Driver sint. FM" #define STR_FM_DRV_NUKED "Nuked (più accurato)" diff --git a/src/win/languages/ja-JP.rc b/src/win/languages/ja-JP.rc index e1fc2bae9..9c1eadf9b 100644 --- a/src/win/languages/ja-JP.rc +++ b/src/win/languages/ja-JP.rc @@ -284,13 +284,13 @@ END #define STR_JOY3 "ジョイスティック3..." #define STR_JOY4 "ジョイスティック4..." -#define STR_SOUND "サウンドカード:" +#define STR_SOUND1 "サウンドカード 1:" +#define STR_SOUND2 "サウンドカード 2:" +#define STR_SOUND3 "サウンドカード 3:" +#define STR_SOUND4 "サウンドカード 4:" #define STR_MIDI_OUT "MIDI出力デバイス:" #define STR_MIDI_IN "MIDI入力デバイス:" #define STR_MPU401 "独立型MPU-401" -#define STR_SSI "Innovation SSI-2001" -#define STR_CMS "CMS / Game Blaster" -#define STR_GUS "Gravis Ultrasound" #define STR_FLOAT "FLOAT32サウンドを使用する" #define STR_FM_DRIVER "FMシンセドライバー" #define STR_FM_DRV_NUKED "Nuked (高精度化)" diff --git a/src/win/languages/ko-KR.rc b/src/win/languages/ko-KR.rc index 9379205fe..ed282653e 100644 --- a/src/win/languages/ko-KR.rc +++ b/src/win/languages/ko-KR.rc @@ -284,13 +284,13 @@ END #define STR_JOY3 "조이스틱 3..." #define STR_JOY4 "조이스틱 4..." -#define STR_SOUND "사운드 카드:" +#define STR_SOUND1 "사운드 카드 1:" +#define STR_SOUND2 "사운드 카드 2:" +#define STR_SOUND3 "사운드 카드 3:" +#define STR_SOUND4 "사운드 카드 4:" #define STR_MIDI_OUT "MIDI 출력 장치:" #define STR_MIDI_IN "MIDI 입력 장치:" #define STR_MPU401 "MPU-401 단독 사용" -#define STR_SSI "Innovation SSI-2001" -#define STR_CMS "CMS / Game Blaster" -#define STR_GUS "Gravis Ultrasound" #define STR_FLOAT "FLOAT32 사운드 사용" #define STR_FM_DRIVER "FM 신디사이저 드라이버" #define STR_FM_DRV_NUKED "Nuked (더 정확한)" diff --git a/src/win/languages/pl-PL.rc b/src/win/languages/pl-PL.rc index 054428e5b..acdf558ab 100644 --- a/src/win/languages/pl-PL.rc +++ b/src/win/languages/pl-PL.rc @@ -284,13 +284,13 @@ END #define STR_JOY3 "Joystick 3..." #define STR_JOY4 "Joystick 4..." -#define STR_SOUND "Karta dźwiękowa:" +#define STR_SOUND1 "Karta dźwiękowa 1:" +#define STR_SOUND2 "Karta dźwiękowa 2:" +#define STR_SOUND3 "Karta dźwiękowa 3:" +#define STR_SOUND4 "Karta dźwiękowa 4:" #define STR_MIDI_OUT "Urządzenie wyjściowe MIDI:" #define STR_MIDI_IN "Urządzenie wejściowe MIDI:" #define STR_MPU401 "Samodzielne urządzenie MPU-401" -#define STR_SSI "Innovation SSI-2001" -#define STR_CMS "CMS / Game Blaster" -#define STR_GUS "Gravis Ultrasound" #define STR_FLOAT "Użyj dźwięku FLOAT32" #define STR_FM_DRIVER "Sterownik syntezy FM" #define STR_FM_DRV_NUKED "Nuked (dokładniejszy)" diff --git a/src/win/languages/pt-BR.rc b/src/win/languages/pt-BR.rc index 7147854bc..fc63f0047 100644 --- a/src/win/languages/pt-BR.rc +++ b/src/win/languages/pt-BR.rc @@ -287,13 +287,13 @@ END #define STR_JOY3 "Joystick 3..." #define STR_JOY4 "Joystick 4..." -#define STR_SOUND "Placa de som:" +#define STR_SOUND1 "Placa de som 1:" +#define STR_SOUND2 "Placa de som 2:" +#define STR_SOUND3 "Placa de som 3:" +#define STR_SOUND4 "Placa de som 4:" #define STR_MIDI_OUT "Disp. saída MIDI:" #define STR_MIDI_IN "Disp. entrada MIDI:" #define STR_MPU401 "MPU-401 autônomo" -#define STR_SSI "Innovation SSI-2001" -#define STR_CMS "CMS / Game Blaster" -#define STR_GUS "Gravis Ultrasound" #define STR_FLOAT "Usar som FLOAT32" #define STR_FM_DRIVER "Controlador de sint. FM" #define STR_FM_DRV_NUKED "Nuked (mais preciso)" diff --git a/src/win/languages/pt-PT.rc b/src/win/languages/pt-PT.rc index 0deeebc41..f3ff9eb3d 100644 --- a/src/win/languages/pt-PT.rc +++ b/src/win/languages/pt-PT.rc @@ -284,13 +284,13 @@ END #define STR_JOY3 "Joystick 3..." #define STR_JOY4 "Joystick 4..." -#define STR_SOUND "Placa de som:" +#define STR_SOUND1 "Placa de som 1:" +#define STR_SOUND2 "Placa de som 2:" +#define STR_SOUND3 "Placa de som 3:" +#define STR_SOUND4 "Placa de som 4:" #define STR_MIDI_OUT "Disp. saída MIDI:" #define STR_MIDI_IN "Disp. entrada MIDI:" #define STR_MPU401 "MPU-401 autónomo" -#define STR_SSI "Innovation SSI-2001" -#define STR_CMS "CMS / Game Blaster" -#define STR_GUS "Gravis Ultrasound" #define STR_FLOAT "Utilizar som FLOAT32" #define STR_FM_DRIVER "Controlador de sint. FM" #define STR_FM_DRV_NUKED "Nuked (mais exacto)" diff --git a/src/win/languages/ru-RU.rc b/src/win/languages/ru-RU.rc index 7cb75fb48..a3ba6f496 100644 --- a/src/win/languages/ru-RU.rc +++ b/src/win/languages/ru-RU.rc @@ -284,13 +284,13 @@ END #define STR_JOY3 "Джойстик 3..." #define STR_JOY4 "Джойстик 4..." -#define STR_SOUND "Звуковая карта:" +#define STR_SOUND1 "Звуковая карта 1:" +#define STR_SOUND2 "Звуковая карта 2:" +#define STR_SOUND3 "Звуковая карта 3:" +#define STR_SOUND4 "Звуковая карта 4:" #define STR_MIDI_OUT "MIDI Out устр-во:" #define STR_MIDI_IN "MIDI In устр-во:" #define STR_MPU401 "Отдельный MPU-401" -#define STR_SSI "Innovation SSI-2001" -#define STR_CMS "CMS / Game Blaster" -#define STR_GUS "Gravis Ultrasound" #define STR_FLOAT "FLOAT32 звук" #define STR_FM_DRIVER "Драйвер FM-синтезатора" #define STR_FM_DRV_NUKED "Nuked (более точный)" diff --git a/src/win/languages/sl-SI.rc b/src/win/languages/sl-SI.rc index 7a56d4cc5..6bd892e77 100644 --- a/src/win/languages/sl-SI.rc +++ b/src/win/languages/sl-SI.rc @@ -284,13 +284,13 @@ END #define STR_JOY3 "Igralna palica 3..." #define STR_JOY4 "Igralna palica 4..." -#define STR_SOUND "Zvočna kartica:" +#define STR_SOUND1 "Zvočna kartica 1:" +#define STR_SOUND2 "Zvočna kartica 2:" +#define STR_SOUND3 "Zvočna kartica 3:" +#define STR_SOUND4 "Zvočna kartica 4:" #define STR_MIDI_OUT "Izhodna naprava MIDI:" #define STR_MIDI_IN "Vhodna naprava MIDI:" #define STR_MPU401 "Samostojen MPU-401" -#define STR_SSI "Innovation SSI-2001" -#define STR_CMS "CMS / Game Blaster" -#define STR_GUS "Gravis Ultrasound" #define STR_FLOAT "Uporabi FLOAT32 za zvok" #define STR_FM_DRIVER "Gonilnik sintetizacije FM" #define STR_FM_DRV_NUKED "Nuked (točnejši)" diff --git a/src/win/languages/tr-TR.rc b/src/win/languages/tr-TR.rc index 896f6a300..a28fdb2a2 100644 --- a/src/win/languages/tr-TR.rc +++ b/src/win/languages/tr-TR.rc @@ -284,13 +284,13 @@ END #define STR_JOY3 "Oyun kolu 3..." #define STR_JOY4 "Oyun kolu 4..." -#define STR_SOUND "Ses kartı:" +#define STR_SOUND1 "Ses kartı 1:" +#define STR_SOUND2 "Ses kartı 2:" +#define STR_SOUND3 "Ses kartı 3:" +#define STR_SOUND4 "Ses kartı 4:" #define STR_MIDI_OUT "MIDI Çıkış Cihazı:" #define STR_MIDI_IN "MIDI Giriş Cihazı:" #define STR_MPU401 "Bağımsız MPU-401" -#define STR_SSI "Innovation SSI-2001" -#define STR_CMS "CMS / Game Blaster" -#define STR_GUS "Gravis Ultrasound" #define STR_FLOAT "FLOAT32 ses kullan" #define STR_FM_DRIVER "FM sentez sürücüsü" #define STR_FM_DRV_NUKED "Nuked (daha doğru)" diff --git a/src/win/languages/uk-UA.rc b/src/win/languages/uk-UA.rc index 332966686..383752f25 100644 --- a/src/win/languages/uk-UA.rc +++ b/src/win/languages/uk-UA.rc @@ -284,13 +284,13 @@ END #define STR_JOY3 "Джойстик 3..." #define STR_JOY4 "Джойстик 4..." -#define STR_SOUND "Звукова карта:" +#define STR_SOUND1 "Звукова карта 1:" +#define STR_SOUND2 "Звукова карта 2:" +#define STR_SOUND3 "Звукова карта 3:" +#define STR_SOUND4 "Звукова карта 4:" #define STR_MIDI_OUT "MIDI Out при-ій:" #define STR_MIDI_IN "MIDI In при-ій:" #define STR_MPU401 "Окремий MPU-401" -#define STR_SSI "Innovation SSI-2001" -#define STR_CMS "CMS / Game Blaster" -#define STR_GUS "Gravis Ultrasound" #define STR_FLOAT "FLOAT32 звук" #define STR_FM_DRIVER "Драйвер FM-синтезатора" #define STR_FM_DRV_NUKED "Nuked (більш точний)" diff --git a/src/win/languages/zh-CN.rc b/src/win/languages/zh-CN.rc index 13f878cb6..d46077246 100644 --- a/src/win/languages/zh-CN.rc +++ b/src/win/languages/zh-CN.rc @@ -284,13 +284,13 @@ END #define STR_JOY3 "操纵杆 3..." #define STR_JOY4 "操纵杆 4..." -#define STR_SOUND "声卡:" +#define STR_SOUND1 "声卡 1:" +#define STR_SOUND2 "声卡 2:" +#define STR_SOUND3 "声卡 3:" +#define STR_SOUND4 "声卡 4:" #define STR_MIDI_OUT "MIDI 输出设备:" #define STR_MIDI_IN "MIDI 输入设备:" #define STR_MPU401 "独立 MPU-401" -#define STR_SSI "Innovation SSI-2001" -#define STR_CMS "CMS / Game Blaster" -#define STR_GUS "Gravis Ultrasound" #define STR_FLOAT "使用单精度浮点 (FLOAT32)" #define STR_FM_DRIVER "调频合成器驱动器" #define STR_FM_DRV_NUKED "Nuked (更准确)" diff --git a/src/win/languages/zh-TW.rc b/src/win/languages/zh-TW.rc index f922c950b..5a746d272 100644 --- a/src/win/languages/zh-TW.rc +++ b/src/win/languages/zh-TW.rc @@ -284,13 +284,13 @@ END #define STR_JOY3 "搖桿 3..." #define STR_JOY4 "搖桿 4..." -#define STR_SOUND "音訊卡:" +#define STR_SOUND1 "音訊卡 1:" +#define STR_SOUND2 "音訊卡 2:" +#define STR_SOUND3 "音訊卡 3:" +#define STR_SOUND4 "音訊卡 4:" #define STR_MIDI_OUT "MIDI 輸出裝置:" #define STR_MIDI_IN "MIDI 輸入裝置:" #define STR_MPU401 "獨立 MPU-401" -#define STR_SSI "Innovation SSI-2001" -#define STR_CMS "CMS / Game Blaster" -#define STR_GUS "Gravis Ultrasound" #define STR_FLOAT "使用單精度浮點 (FLOAT32)" #define STR_FM_DRIVER "調頻合成器驅動器" #define STR_FM_DRV_NUKED "Nuked (更準確)" diff --git a/src/win/win_settings.c b/src/win/win_settings.c index 40501c77c..eaeaed7fa 100644 --- a/src/win/win_settings.c +++ b/src/win/win_settings.c @@ -99,7 +99,8 @@ static int temp_gfxcard, temp_gfxcard_2, temp_ibm8514, temp_voodoo, temp_xga; static int temp_mouse, temp_joystick; /* Sound category */ -static int temp_sound_card, temp_midi_output_device, temp_midi_input_device, temp_mpu401, temp_SSI2001, temp_GAMEBLASTER, temp_GUS; +static int temp_sound_card[SOUND_CARD_MAX]; +static int temp_midi_output_device, temp_midi_input_device, temp_mpu401; static int temp_float, temp_fm_driver; /* Network category */ @@ -335,13 +336,11 @@ win_settings_init(void) temp_joystick = joystick_type; /* Sound category */ - temp_sound_card = sound_card_current; + for (i = 0; i < SOUND_CARD_MAX; i++) + temp_sound_card[i] = sound_card_current[i]; temp_midi_output_device = midi_output_device_current; temp_midi_input_device = midi_input_device_current; temp_mpu401 = mpu401_standalone_enable; - temp_SSI2001 = SSI2001; - temp_GAMEBLASTER = GAMEBLASTER; - temp_GUS = GUS; temp_float = sound_is_float; temp_fm_driver = fm_driver; @@ -462,13 +461,11 @@ win_settings_changed(void) i = i || (joystick_type != temp_joystick); /* Sound category */ - i = i || (sound_card_current != temp_sound_card); + for (j = 0; j < SOUND_CARD_MAX; j++) + i = i || (sound_card_current[j] != temp_sound_card[j]); i = i || (midi_output_device_current != temp_midi_output_device); i = i || (midi_input_device_current != temp_midi_input_device); i = i || (mpu401_standalone_enable != temp_mpu401); - i = i || (SSI2001 != temp_SSI2001); - i = i || (GAMEBLASTER != temp_GAMEBLASTER); - i = i || (GUS != temp_GUS); i = i || (sound_is_float != temp_float); i = i || (fm_driver != temp_fm_driver); @@ -555,13 +552,11 @@ win_settings_save(void) joystick_type = temp_joystick; /* Sound category */ - sound_card_current = temp_sound_card; + for (i = 0; i < SOUND_CARD_MAX; i++) + sound_card_current[i] = temp_sound_card[i]; midi_output_device_current = temp_midi_output_device; midi_input_device_current = temp_midi_input_device; mpu401_standalone_enable = temp_mpu401; - SSI2001 = temp_SSI2001; - GAMEBLASTER = temp_GAMEBLASTER; - GUS = temp_GUS; sound_is_float = temp_float; fm_driver = temp_fm_driver; @@ -1396,16 +1391,16 @@ static BOOL CALLBACK #endif win_settings_sound_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) { - int c, d; + uint16_t c, d; LPTSTR lptsTemp; - const device_t *sound_dev; + const device_t *sound_dev[SOUND_CARD_MAX]; switch (message) { case WM_INITDIALOG: lptsTemp = (LPTSTR) malloc(512 * sizeof(WCHAR)); c = d = 0; - settings_reset_content(hdlg, IDC_COMBO_SOUND); + settings_reset_content(hdlg, IDC_COMBO_SOUND1); while (1) { /* Skip "internal" if machine doesn't have it. */ if ((c == 1) && !machine_has_flags(temp_machine, MACHINE_SOUND)) { @@ -1419,18 +1414,18 @@ win_settings_sound_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) break; if (sound_card_available(c)) { - sound_dev = sound_card_getdevice(c); + sound_dev[0] = sound_card_getdevice(c); - if (device_is_valid(sound_dev, temp_machine)) { + if (device_is_valid(sound_dev[0], temp_machine)) { if (c == 0) - settings_add_string(hdlg, IDC_COMBO_SOUND, win_get_string(IDS_2104)); + settings_add_string(hdlg, IDC_COMBO_SOUND1, win_get_string(IDS_2104)); else if (c == 1) - settings_add_string(hdlg, IDC_COMBO_SOUND, win_get_string(IDS_2119)); + settings_add_string(hdlg, IDC_COMBO_SOUND1, win_get_string(IDS_2119)); else - settings_add_string(hdlg, IDC_COMBO_SOUND, (LPARAM) device_name); + settings_add_string(hdlg, IDC_COMBO_SOUND1, (LPARAM) device_name); settings_list_to_device[0][d] = c; - if ((c == 0) || (c == temp_sound_card)) - settings_set_cur_sel(hdlg, IDC_COMBO_SOUND, d); + if ((c == 0) || (c == temp_sound_card[0])) + settings_set_cur_sel(hdlg, IDC_COMBO_SOUND1, d); d++; } } @@ -1438,8 +1433,119 @@ win_settings_sound_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) c++; } - settings_enable_window(hdlg, IDC_COMBO_SOUND, d); - settings_enable_window(hdlg, IDC_CONFIGURE_SND, sound_card_has_config(temp_sound_card)); + settings_enable_window(hdlg, IDC_COMBO_SOUND1, d); + settings_enable_window(hdlg, IDC_CONFIGURE_SND1, sound_card_has_config(temp_sound_card[0])); + + c = d = 0; + settings_reset_content(hdlg, IDC_COMBO_SOUND2); + while (1) { + /* Skip "internal" */ + if (c == 1) { + c++; + continue; + } + + generate_device_name(sound_card_getdevice(c), sound_card_get_internal_name(c), 1); + + if (!device_name[0]) + break; + + if (sound_card_available(c)) { + sound_dev[1] = sound_card_getdevice(c); + + if (device_is_valid(sound_dev[1], temp_machine)) { + if (c == 0) + settings_add_string(hdlg, IDC_COMBO_SOUND2, win_get_string(IDS_2104)); + else if (c == 1) + settings_add_string(hdlg, IDC_COMBO_SOUND2, win_get_string(IDS_2119)); + else + settings_add_string(hdlg, IDC_COMBO_SOUND2, (LPARAM) device_name); + settings_list_to_device[0][d] = c; + if ((c == 0) || (c == temp_sound_card[1])) + settings_set_cur_sel(hdlg, IDC_COMBO_SOUND2, d); + d++; + } + } + + c++; + } + + settings_enable_window(hdlg, IDC_COMBO_SOUND2, d); + settings_enable_window(hdlg, IDC_CONFIGURE_SND2, sound_card_has_config(temp_sound_card[1])); + + c = d = 0; + settings_reset_content(hdlg, IDC_COMBO_SOUND3); + while (1) { + /* Skip "internal" */ + if (c == 1) { + c++; + continue; + } + + generate_device_name(sound_card_getdevice(c), sound_card_get_internal_name(c), 1); + + if (!device_name[0]) + break; + + if (sound_card_available(c)) { + sound_dev[2] = sound_card_getdevice(c); + + if (device_is_valid(sound_dev[2], temp_machine)) { + if (c == 0) + settings_add_string(hdlg, IDC_COMBO_SOUND3, win_get_string(IDS_2104)); + else if (c == 1) + settings_add_string(hdlg, IDC_COMBO_SOUND3, win_get_string(IDS_2119)); + else + settings_add_string(hdlg, IDC_COMBO_SOUND3, (LPARAM) device_name); + settings_list_to_device[0][d] = c; + if ((c == 0) || (c == temp_sound_card[2])) + settings_set_cur_sel(hdlg, IDC_COMBO_SOUND3, d); + d++; + } + } + + c++; + } + + settings_enable_window(hdlg, IDC_COMBO_SOUND3, d); + settings_enable_window(hdlg, IDC_CONFIGURE_SND3, sound_card_has_config(temp_sound_card[2])); + + c = d = 0; + settings_reset_content(hdlg, IDC_COMBO_SOUND4); + while (1) { + /* Skip "internal" */ + if (c == 1) { + c++; + continue; + } + + generate_device_name(sound_card_getdevice(c), sound_card_get_internal_name(c), 1); + + if (!device_name[0]) + break; + + if (sound_card_available(c)) { + sound_dev[3] = sound_card_getdevice(c); + + if (device_is_valid(sound_dev[3], temp_machine)) { + if (c == 0) + settings_add_string(hdlg, IDC_COMBO_SOUND4, win_get_string(IDS_2104)); + else if (c == 1) + settings_add_string(hdlg, IDC_COMBO_SOUND4, win_get_string(IDS_2119)); + else + settings_add_string(hdlg, IDC_COMBO_SOUND4, (LPARAM) device_name); + settings_list_to_device[0][d] = c; + if ((c == 0) || (c == temp_sound_card[3])) + settings_set_cur_sel(hdlg, IDC_COMBO_SOUND4, d); + d++; + } + } + + c++; + } + + settings_enable_window(hdlg, IDC_COMBO_SOUND4, d); + settings_enable_window(hdlg, IDC_CONFIGURE_SND4, sound_card_has_config(temp_sound_card[3])); c = d = 0; settings_reset_content(hdlg, IDC_COMBO_MIDI_OUT); @@ -1491,15 +1597,6 @@ win_settings_sound_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) settings_set_check(hdlg, IDC_CHECK_MPU401, temp_mpu401); settings_enable_window(hdlg, IDC_CHECK_MPU401, mpu401_standalone_allow()); settings_enable_window(hdlg, IDC_CONFIGURE_MPU401, mpu401_standalone_allow() && temp_mpu401); - settings_enable_window(hdlg, IDC_CHECK_CMS, machine_has_bus(temp_machine, MACHINE_BUS_ISA)); - settings_set_check(hdlg, IDC_CHECK_CMS, temp_GAMEBLASTER); - settings_enable_window(hdlg, IDC_CONFIGURE_CMS, machine_has_bus(temp_machine, MACHINE_BUS_ISA) && temp_GAMEBLASTER); - settings_enable_window(hdlg, IDC_CHECK_GUS, machine_has_bus(temp_machine, MACHINE_BUS_ISA16)); - settings_set_check(hdlg, IDC_CHECK_GUS, temp_GUS); - settings_enable_window(hdlg, IDC_CONFIGURE_GUS, machine_has_bus(temp_machine, MACHINE_BUS_ISA16) && temp_GUS); - settings_enable_window(hdlg, IDC_CHECK_SSI, machine_has_bus(temp_machine, MACHINE_BUS_ISA)); - settings_set_check(hdlg, IDC_CHECK_SSI, temp_SSI2001); - settings_enable_window(hdlg, IDC_CONFIGURE_SSI, machine_has_bus(temp_machine, MACHINE_BUS_ISA) && temp_SSI2001); settings_set_check(hdlg, IDC_CHECK_FLOAT, temp_float); if (temp_fm_driver == FM_DRV_YMFM) @@ -1513,17 +1610,56 @@ win_settings_sound_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) case WM_COMMAND: switch (LOWORD(wParam)) { - case IDC_COMBO_SOUND: - temp_sound_card = settings_list_to_device[0][settings_get_cur_sel(hdlg, IDC_COMBO_SOUND)]; - settings_enable_window(hdlg, IDC_CONFIGURE_SND, sound_card_has_config(temp_sound_card)); + case IDC_COMBO_SOUND1: + temp_sound_card[0] = settings_list_to_device[0][settings_get_cur_sel(hdlg, IDC_COMBO_SOUND1)]; + settings_enable_window(hdlg, IDC_CONFIGURE_SND1, sound_card_has_config(temp_sound_card[0])); settings_set_check(hdlg, IDC_CHECK_MPU401, temp_mpu401); settings_enable_window(hdlg, IDC_CHECK_MPU401, mpu401_standalone_allow()); settings_enable_window(hdlg, IDC_CONFIGURE_MPU401, mpu401_standalone_allow() && temp_mpu401); break; - case IDC_CONFIGURE_SND: - temp_sound_card = settings_list_to_device[0][settings_get_cur_sel(hdlg, IDC_COMBO_SOUND)]; - temp_deviceconfig |= deviceconfig_open(hdlg, (void *) sound_card_getdevice(temp_sound_card)); + case IDC_CONFIGURE_SND1: + temp_sound_card[0] = settings_list_to_device[0][settings_get_cur_sel(hdlg, IDC_COMBO_SOUND1)]; + temp_deviceconfig |= deviceconfig_open(hdlg, (void *) sound_card_getdevice(temp_sound_card[0])); + break; + + case IDC_COMBO_SOUND2: + temp_sound_card[1] = settings_list_to_device[0][settings_get_cur_sel(hdlg, IDC_COMBO_SOUND2)]; + settings_enable_window(hdlg, IDC_CONFIGURE_SND2, sound_card_has_config(temp_sound_card[1])); + settings_set_check(hdlg, IDC_CHECK_MPU401, temp_mpu401); + settings_enable_window(hdlg, IDC_CHECK_MPU401, mpu401_standalone_allow()); + settings_enable_window(hdlg, IDC_CONFIGURE_MPU401, mpu401_standalone_allow() && temp_mpu401); + break; + + case IDC_CONFIGURE_SND2: + temp_sound_card[1] = settings_list_to_device[0][settings_get_cur_sel(hdlg, IDC_COMBO_SOUND2)]; + temp_deviceconfig |= deviceconfig_open(hdlg, (void *) sound_card_getdevice(temp_sound_card[1])); + break; + + case IDC_COMBO_SOUND3: + temp_sound_card[2] = settings_list_to_device[0][settings_get_cur_sel(hdlg, IDC_COMBO_SOUND3)]; + settings_enable_window(hdlg, IDC_CONFIGURE_SND3, sound_card_has_config(temp_sound_card[2])); + settings_set_check(hdlg, IDC_CHECK_MPU401, temp_mpu401); + settings_enable_window(hdlg, IDC_CHECK_MPU401, mpu401_standalone_allow()); + settings_enable_window(hdlg, IDC_CONFIGURE_MPU401, mpu401_standalone_allow() && temp_mpu401); + break; + + case IDC_CONFIGURE_SND3: + temp_sound_card[2] = settings_list_to_device[0][settings_get_cur_sel(hdlg, IDC_COMBO_SOUND3)]; + temp_deviceconfig |= deviceconfig_open(hdlg, (void *) sound_card_getdevice(temp_sound_card[2])); + break; + + case IDC_COMBO_SOUND4: + temp_sound_card[3] = settings_list_to_device[0][settings_get_cur_sel(hdlg, IDC_COMBO_SOUND4)]; + settings_enable_window(hdlg, IDC_CONFIGURE_SND4, sound_card_has_config(temp_sound_card[3])); + settings_set_check(hdlg, IDC_CHECK_MPU401, temp_mpu401); + settings_enable_window(hdlg, IDC_CHECK_MPU401, mpu401_standalone_allow()); + settings_enable_window(hdlg, IDC_CONFIGURE_MPU401, mpu401_standalone_allow() && temp_mpu401); + break; + + case IDC_CONFIGURE_SND4: + temp_sound_card[3] = settings_list_to_device[0][settings_get_cur_sel(hdlg, IDC_COMBO_SOUND4)]; + temp_deviceconfig |= deviceconfig_open(hdlg, (void *) sound_card_getdevice(temp_sound_card[3])); break; case IDC_COMBO_MIDI_OUT: @@ -1561,46 +1697,17 @@ win_settings_sound_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) case IDC_CONFIGURE_MPU401: temp_deviceconfig |= deviceconfig_open(hdlg, machine_has_bus(temp_machine, MACHINE_BUS_MCA) ? (void *) &mpu401_mca_device : (void *) &mpu401_device); break; - - case IDC_CHECK_CMS: - temp_GAMEBLASTER = settings_get_check(hdlg, IDC_CHECK_CMS); - - settings_enable_window(hdlg, IDC_CONFIGURE_CMS, temp_GAMEBLASTER); - break; - - case IDC_CONFIGURE_CMS: - temp_deviceconfig |= deviceconfig_open(hdlg, &cms_device); - break; - - case IDC_CHECK_GUS: - temp_GUS = settings_get_check(hdlg, IDC_CHECK_GUS); - settings_enable_window(hdlg, IDC_CONFIGURE_GUS, temp_GUS); - break; - - case IDC_CONFIGURE_GUS: - temp_deviceconfig |= deviceconfig_open(hdlg, (void *) &gus_device); - break; - - case IDC_CHECK_SSI: - temp_SSI2001 = settings_get_check(hdlg, IDC_CHECK_SSI); - - settings_enable_window(hdlg, IDC_CONFIGURE_SSI, temp_SSI2001); - break; - - case IDC_CONFIGURE_SSI: - temp_deviceconfig |= deviceconfig_open(hdlg, &ssi2001_device); - break; } return FALSE; case WM_SAVESETTINGS: - temp_sound_card = settings_list_to_device[0][settings_get_cur_sel(hdlg, IDC_COMBO_SOUND)]; + temp_sound_card[0] = settings_list_to_device[0][settings_get_cur_sel(hdlg, IDC_COMBO_SOUND1)]; + temp_sound_card[1] = settings_list_to_device[0][settings_get_cur_sel(hdlg, IDC_COMBO_SOUND2)]; + temp_sound_card[2] = settings_list_to_device[0][settings_get_cur_sel(hdlg, IDC_COMBO_SOUND3)]; + temp_sound_card[3] = settings_list_to_device[0][settings_get_cur_sel(hdlg, IDC_COMBO_SOUND4)]; temp_midi_output_device = settings_list_to_midi[settings_get_cur_sel(hdlg, IDC_COMBO_MIDI_OUT)]; temp_midi_input_device = settings_list_to_midi_in[settings_get_cur_sel(hdlg, IDC_COMBO_MIDI_IN)]; temp_mpu401 = settings_get_check(hdlg, IDC_CHECK_MPU401); - temp_GAMEBLASTER = settings_get_check(hdlg, IDC_CHECK_CMS); - temp_GUS = settings_get_check(hdlg, IDC_CHECK_GUS); - temp_SSI2001 = settings_get_check(hdlg, IDC_CHECK_SSI); temp_float = settings_get_check(hdlg, IDC_CHECK_FLOAT); if (settings_get_check(hdlg, IDC_RADIO_FM_DRV_NUKED)) temp_fm_driver = FM_DRV_NUKED; From 91b86f1bb8abb7f82af4a17aebc83c9c53e55430 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Thu, 2 Feb 2023 07:47:58 -0500 Subject: [PATCH 187/285] Fix freeze on tools->settings --- src/qt/qt_settingssound.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qt/qt_settingssound.cpp b/src/qt/qt_settingssound.cpp index 1be663dd8..0568f5ea1 100644 --- a/src/qt/qt_settingssound.cpp +++ b/src/qt/qt_settingssound.cpp @@ -82,8 +82,8 @@ SettingsSound::onCurrentMachineChanged(int machineId) selectedRow = 0; while (true) { - /* Skip "internal" if machine doesn't have it for the first card, always skip for others. */ - if (((c == 1) && (machine_has_flags(machineId, MACHINE_SOUND) == 0)) || (i != 0)) { + /* Skip "internal" if machine doesn't have it. */ + if ((c == 1) && (machine_has_flags(machineId, MACHINE_SOUND) == 0)) { c++; continue; } From db77b53fc8cd0008e0312f2077752774cb94ba5f Mon Sep 17 00:00:00 2001 From: TC1995 Date: Thu, 2 Feb 2023 17:13:29 +0100 Subject: [PATCH 188/285] QT: Fix crash in the first sound card selection. --- src/qt/qt_settingssound.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qt/qt_settingssound.cpp b/src/qt/qt_settingssound.cpp index 0568f5ea1..f792791c1 100644 --- a/src/qt/qt_settingssound.cpp +++ b/src/qt/qt_settingssound.cpp @@ -237,7 +237,7 @@ SettingsSound::on_comboBoxSoundCard4_currentIndexChanged(int index) if (index < 0) { return; } - ui->pushButtonConfigureSoundCard1->setEnabled(sound_card_has_config(ui->comboBoxSoundCard4->currentData().toInt())); + ui->pushButtonConfigureSoundCard4->setEnabled(sound_card_has_config(ui->comboBoxSoundCard4->currentData().toInt())); } void From 2857655f6e3800da00722c9a7025d9013cd9e2cc Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Fri, 3 Feb 2023 00:37:20 -0500 Subject: [PATCH 189/285] Add tertiary and quaternary FDC options + improvements to monster FDC --- src/floppy/fdc.c | 70 ++++++++++++++++++++++++++++++++++++++++ src/floppy/fdc_monster.c | 44 +++++++++++++++++++++---- src/include/86box/fdc.h | 6 ++++ 3 files changed, 113 insertions(+), 7 deletions(-) diff --git a/src/floppy/fdc.c b/src/floppy/fdc.c index 9981a72a2..e729dee44 100644 --- a/src/floppy/fdc.c +++ b/src/floppy/fdc.c @@ -2280,6 +2280,12 @@ fdc_reset(void *priv) } else if (fdc->flags & FDC_FLAG_SEC) { fdc->dma = 1; fdc->specify[1] = 0; + } else if (fdc->flags & FDC_FLAG_TER) { + fdc->dma = 1; + fdc->specify[1] = 0; + } else if (fdc->flags & FDC_FLAG_QUA) { + fdc->dma = 1; + fdc->specify[1] = 0; } else { fdc->dma = 1; fdc->specify[1] = 0; @@ -2297,6 +2303,10 @@ fdc_reset(void *priv) fdc_remove(fdc); if (fdc->flags & FDC_FLAG_SEC) { fdc_set_base(fdc, FDC_SECONDARY_ADDR); + } else if (fdc->flags & FDC_FLAG_TER) { + fdc_set_base(fdc, FDC_TERTIARY_ADDR); + } else if (fdc->flags & FDC_FLAG_QUA) { + fdc_set_base(fdc, FDC_QUATERNARY_ADDR); } else { fdc_set_base(fdc, (fdc->flags & FDC_FLAG_PCJR) ? FDC_PRIMARY_PCJR_ADDR : FDC_PRIMARY_ADDR); } @@ -2337,6 +2347,10 @@ fdc_init(const device_t *info) timer_add(&fdc->watchdog_timer, fdc_watchdog_poll, fdc, 0); else if (fdc->flags & FDC_FLAG_SEC) fdc->dma_ch = FDC_SECONDARY_DMA; + else if (fdc->flags & FDC_FLAG_TER) + fdc->dma_ch = FDC_TERTIARY_DMA; + else if (fdc->flags & FDC_FLAG_QUA) + fdc->dma_ch = FDC_QUATERNARY_DMA; else fdc->dma_ch = FDC_PRIMARY_DMA; @@ -2390,6 +2404,34 @@ const device_t fdc_xt_sec_device = { .config = NULL }; +const device_t fdc_xt_ter_device = { + .name = "PC/XT Floppy Drive Controller (Tertiary)", + .internal_name = "fdc_xt_ter", + .flags = FDC_FLAG_TER, + .local = 0, + .init = fdc_init, + .close = fdc_close, + .reset = fdc_reset, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t fdc_xt_qua_device = { + .name = "PC/XT Floppy Drive Controller (Quaternary)", + .internal_name = "fdc_xt_qua", + .flags = FDC_FLAG_QUA, + .local = 0, + .init = fdc_init, + .close = fdc_close, + .reset = fdc_reset, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + const device_t fdc_xt_t1x00_device = { .name = "PC/XT Floppy Drive Controller (Toshiba)", .internal_name = "fdc_xt_t1x00", @@ -2474,6 +2516,34 @@ const device_t fdc_at_sec_device = { .config = NULL }; +const device_t fdc_at_ter_device = { + .name = "PC/AT Floppy Drive Controller (Tertiary)", + .internal_name = "fdc_at_ter", + .flags = 0, + .local = FDC_FLAG_AT | FDC_FLAG_TER, + .init = fdc_init, + .close = fdc_close, + .reset = fdc_reset, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t fdc_at_qua_device = { + .name = "PC/AT Floppy Drive Controller (Quaternary)", + .internal_name = "fdc_at_qua", + .flags = 0, + .local = FDC_FLAG_AT | FDC_FLAG_QUA, + .init = fdc_init, + .close = fdc_close, + .reset = fdc_reset, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + const device_t fdc_at_actlow_device = { .name = "PC/AT Floppy Drive Controller (Active low)", .internal_name = "fdc_at_actlow", diff --git a/src/floppy/fdc_monster.c b/src/floppy/fdc_monster.c index 2cd1d9b05..ae5e1b290 100644 --- a/src/floppy/fdc_monster.c +++ b/src/floppy/fdc_monster.c @@ -39,6 +39,8 @@ typedef struct { rom_t bios_rom; + fdc_t *fdc_pri; + fdc_t *fdc_sec; } monster_fdc_t; static void @@ -57,14 +59,29 @@ monster_fdc_init(const device_t *info) dev = (monster_fdc_t *)malloc(sizeof(monster_fdc_t)); memset(dev, 0, sizeof(monster_fdc_t)); +#if 0 + uint8_t sec_irq = device_get_config_int("sec_irq"); + uint8_t sec_dma = device_get_config_int("sec_dma"); +#endif + if (BIOS_ADDR != 0) rom_init(&dev->bios_rom, ROM_MONSTER_FDC, BIOS_ADDR, 0x2000, 0x1ffff, 0, MEM_MAPPING_EXTERNAL); // Primary FDC - device_add(&fdc_at_device); + dev->fdc_pri = device_add(&fdc_at_device); +#if 0 // Secondary FDC - // device_add(&fdc_at_sec_device); + uint8_t sec_enabled = device_get_config_int("sec_enabled"); + if (sec_enabled) + dev->fdc_sec = device_add(&fdc_at_sec_device); + fdc_set_irq(dev->fdc_sec, sec_irq); + 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 return dev; } @@ -76,7 +93,14 @@ static int monster_fdc_available(void) static const device_config_t monster_fdc_config[] = { // clang-format off -/* +#if 0 + { + .name = "sec_enabled", + .description = "Enable Secondary Controller", + .type = CONFIG_BINARY, + .default_string = "", + .default_int = 0 + }, { .name = "sec_irq", .description = "Secondary Controller IRQ", @@ -137,7 +161,7 @@ static const device_config_t monster_fdc_config[] = { { .description = "" } } }, -*/ +#endif { .name = "bios_addr", .description = "BIOS Address:", @@ -157,7 +181,7 @@ static const device_config_t monster_fdc_config[] = { { .description = "" } } }, -/* +#if 0 { .name = "bios_size", .description = "BIOS Size:", @@ -172,8 +196,14 @@ static const device_config_t monster_fdc_config[] = { { .description = "" } } }, -*/ - // BIOS extension ROM writes: Enabled/Disabled + { + .name = "rom_writes_enabled", + .description = "Enable BIOS extension ROM Writes", + .type = CONFIG_BINARY, + .default_string = "", + .default_int = 0 + }, +#endif { .name = "", .description = "", .type = CONFIG_END } // clang-format on }; diff --git a/src/include/86box/fdc.h b/src/include/86box/fdc.h index e68c5d463..09678b2e5 100644 --- a/src/include/86box/fdc.h +++ b/src/include/86box/fdc.h @@ -53,6 +53,8 @@ extern int fdc_type; #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 */ typedef struct { uint8_t dor, stat, command, processed_cmd, dat, st0, swap, dtl; @@ -187,12 +189,16 @@ extern uint8_t fdc_get_current_drive(void); #ifdef EMU_DEVICE_H extern const device_t fdc_xt_device; extern const device_t fdc_xt_sec_device; +extern const device_t fdc_xt_ter_device; +extern const device_t fdc_xt_qua_device; extern const device_t fdc_xt_t1x00_device; extern const device_t fdc_xt_tandy_device; extern const device_t fdc_xt_amstrad_device; extern const device_t fdc_pcjr_device; extern const device_t fdc_at_device; extern const device_t fdc_at_sec_device; +extern const device_t fdc_at_ter_device; +extern const device_t fdc_at_qua_device; extern const device_t fdc_at_actlow_device; extern const device_t fdc_at_ps1_device; extern const device_t fdc_at_smc_device; From ffbf1d63c3f096fa707d1e7d9ec0f5d3429a4243 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Fri, 3 Feb 2023 00:49:32 -0500 Subject: [PATCH 190/285] More makefile simplification and formatting in version.h.in --- src/include/86box/version.h.in | 66 +++++++++++++++++----------------- src/win/Makefile.mingw | 43 +++++++++------------- 2 files changed, 50 insertions(+), 59 deletions(-) diff --git a/src/include/86box/version.h.in b/src/include/86box/version.h.in index b8cd9ed97..5ebf7dba9 100644 --- a/src/include/86box/version.h.in +++ b/src/include/86box/version.h.in @@ -1,58 +1,60 @@ /* - * 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. * - * Definitions for project version, branding, and external links. + * Definitions for project version, branding, and external links. * - * Authors: Miran Grca, * - * Copyright 2020 Miran Grca. + * + * Authors: Miran Grca, + * + * Copyright 2020 Miran Grca. */ #define _LSTR(s) L ## s #define LSTR(s) _LSTR(s) /* Version info. */ -#define EMU_NAME "@CMAKE_PROJECT_NAME@" -#define EMU_NAME_W LSTR(EMU_NAME) +#define EMU_NAME "@CMAKE_PROJECT_NAME@" +#define EMU_NAME_W LSTR(EMU_NAME) -#define EMU_VERSION "@CMAKE_PROJECT_VERSION@" -#define EMU_VERSION_W LSTR(EMU_VERSION) -#define EMU_VERSION_EX "3.50" /* frozen due to IDE re-detection behavior on Windows */ -#define EMU_VERSION_MAJ @CMAKE_PROJECT_VERSION_MAJOR@ -#define EMU_VERSION_MIN @CMAKE_PROJECT_VERSION_MINOR@ +#define EMU_VERSION "@CMAKE_PROJECT_VERSION@" +#define EMU_VERSION_W LSTR(EMU_VERSION) +#define EMU_VERSION_EX "3.50" /* frozen due to IDE re-detection behavior on Windows */ +#define EMU_VERSION_MAJ @CMAKE_PROJECT_VERSION_MAJOR@ +#define EMU_VERSION_MIN @CMAKE_PROJECT_VERSION_MINOR@ #define EMU_VERSION_PATCH @CMAKE_PROJECT_VERSION_PATCH@ -#cmakedefine EMU_BUILD "@EMU_BUILD@" -#define EMU_BUILD_NUM @EMU_BUILD_NUM@ -#cmakedefine EMU_GIT_HASH "@EMU_GIT_HASH@" +#cmakedefine EMU_BUILD "@EMU_BUILD@" +#define EMU_BUILD_NUM @EMU_BUILD_NUM@ +#cmakedefine EMU_GIT_HASH "@EMU_GIT_HASH@" #ifdef EMU_BUILD -# define EMU_BUILD_W LSTR(EMU_BUILD) -# define EMU_VERSION_FULL EMU_VERSION " [" EMU_BUILD "]" -# define EMU_VERSION_FULL_W EMU_VERSION_W L" [" EMU_BUILD_W L"]" +# define EMU_BUILD_W LSTR(EMU_BUILD) +# define EMU_VERSION_FULL EMU_VERSION " [" EMU_BUILD "]" +# define EMU_VERSION_FULL_W EMU_VERSION_W L" [" EMU_BUILD_W L"]" #else -# define EMU_VERSION_FULL EMU_VERSION -# define EMU_VERSION_FULL_W EMU_VERSION_W +# define EMU_VERSION_FULL EMU_VERSION +# define EMU_VERSION_FULL_W EMU_VERSION_W #endif #ifdef EMU_GIT_HASH -# define EMU_GIT_HASH_W LSTR(EMU_GIT_HASH) +# define EMU_GIT_HASH_W LSTR(EMU_GIT_HASH) #endif -#define COPYRIGHT_YEAR "@EMU_COPYRIGHT_YEAR@" +#define COPYRIGHT_YEAR "@EMU_COPYRIGHT_YEAR@" /* Web URL info. */ -#define EMU_SITE "86box.net" -#define EMU_SITE_W LSTR(EMU_SITE) -#define EMU_ROMS_URL "https://github.com/86Box/roms/releases/latest" -#define EMU_ROMS_URL_W LSTR(EMU_ROMS_URL) +#define EMU_SITE "86box.net" +#define EMU_SITE_W LSTR(EMU_SITE) +#define EMU_ROMS_URL "https://github.com/86Box/roms/releases/latest" +#define EMU_ROMS_URL_W LSTR(EMU_ROMS_URL) #ifdef RELEASE_BUILD -# define EMU_DOCS_URL "https://86box.readthedocs.io/en/v@CMAKE_PROJECT_VERSION_MAJOR@.@CMAKE_PROJECT_VERSION_MINOR@/" +# define EMU_DOCS_URL "https://86box.readthedocs.io/en/v@CMAKE_PROJECT_VERSION_MAJOR@.@CMAKE_PROJECT_VERSION_MINOR@/" #else -# define EMU_DOCS_URL "https://86box.readthedocs.io" +# define EMU_DOCS_URL "https://86box.readthedocs.io" #endif -#define EMU_DOCS_URL_W LSTR(EMU_DOCS_URL) +#define EMU_DOCS_URL_W LSTR(EMU_DOCS_URL) diff --git a/src/win/Makefile.mingw b/src/win/Makefile.mingw index 0daf65323..4ba9f4745 100644 --- a/src/win/Makefile.mingw +++ b/src/win/Makefile.mingw @@ -240,44 +240,33 @@ VPATH := $(EXPATH) . $(CODEGEN) minitrace cpu \ sound/munt/srchelper sound/munt/srchelper/srctools/src \ sound/resid-fp sound/ymfm \ scsi video network network/slirp win + +WINDRES := windres +STRIP := strip ifeq ($(X64), y) TOOL_PREFIX := x86_64-w64-mingw32- else - TOOL_PREFIX := i686-w64-mingw32- -endif -WINDRES := windres -STRIP := strip -ifeq ($(ARM64), y) - WINDRES := aarch64-w64-mingw32-windres - STRIP := aarch64-w64-mingw32-strip -endif -ifeq ($(ARM), y) - WINDRES := armv7-w64-mingw32-windres - STRIP := armv7-w64-mingw32-strip -endif -ifeq ($(CLANG), y) - CPP := clang++ - CC := clang ifeq ($(ARM64), y) - CPP := aarch64-w64-mingw32-clang++ - CC := aarch64-w64-mingw32-clang + TOOL_PREFIX := aarch64-w64-mingw32- + WINDRES := ${TOOL_PREFIX}windres + STRIP := ${TOOL_PREFIX}strip endif ifeq ($(ARM), y) - CPP := armv7-w64-mingw32-clang++ - CC := armv7-w64-mingw32-clang + TOOL_PREFIX := armv7-w64-mingw32- + WINDRES := ${TOOL_PREFIX}windres + STRIP := ${TOOL_PREFIX}strip endif + TOOL_PREFIX := i686-w64-mingw32- +endif + +ifeq ($(CLANG), y) + CPP := ${TOOL_PREFIX}clang++ + CC := ${TOOL_PREFIX}clang else CPP := ${TOOL_PREFIX}g++ CC := ${TOOL_PREFIX}gcc - ifeq ($(ARM64), y) - CPP := aarch64-w64-mingw32-g++ - CC := aarch64-w64-mingw32-gcc - endif - ifeq ($(ARM), y) - CPP := armv7-w64-mingw32-g++ - CC := armv7-w64-mingw32-gcc - endif endif + DEPS = -MMD -MF $*.d -c $< DEPFILE := win/.depends From a3b7819981182f431196984f23b4c709e4b3786a Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Fri, 3 Feb 2023 01:03:55 -0500 Subject: [PATCH 191/285] Some bits which got lost in PR #3074 --- src/floppy/fdc.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/floppy/fdc.c b/src/floppy/fdc.c index e729dee44..0c35cfcb6 100644 --- a/src/floppy/fdc.c +++ b/src/floppy/fdc.c @@ -2340,6 +2340,10 @@ fdc_init(const device_t *info) if (fdc->flags & FDC_FLAG_SEC) fdc->irq = FDC_SECONDARY_IRQ; + else if (fdc->flags & FDC_FLAG_TER) + fdc->irq = FDC_TERTIARY_IRQ; + else if (fdc->flags & FDC_FLAG_QUA) + fdc->irq = FDC_QUATERNARY_IRQ; else fdc->irq = FDC_PRIMARY_IRQ; @@ -2392,7 +2396,7 @@ const device_t fdc_xt_device = { const device_t fdc_xt_sec_device = { .name = "PC/XT Floppy Drive Controller (Secondary)", - .internal_name = "fdc_xt", + .internal_name = "fdc_xt_sec", .flags = FDC_FLAG_SEC, .local = 0, .init = fdc_init, From e2d545eeb718f9e5c0a1ab79d998560a8afe703b Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Fri, 3 Feb 2023 01:11:17 -0500 Subject: [PATCH 192/285] Add many more flash rom options --- src/include/86box/flash.h | 30 ++- src/mem/sst_flash.c | 409 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 416 insertions(+), 23 deletions(-) diff --git a/src/include/86box/flash.h b/src/include/86box/flash.h index 21ba6b212..d161d416b 100644 --- a/src/include/86box/flash.h +++ b/src/include/86box/flash.h @@ -11,8 +11,10 @@ * * * Authors: Miran Grca, + * Jasmine Iwanek, * - * Copyright 2020 Miran Grca. + * Copyright 2020 Miran Grca. + * Copyright 2022-2023 Jasmine Iwanek. */ #ifndef EMU_FLASH_H @@ -26,10 +28,36 @@ extern const device_t intel_flash_bxb_device; extern const device_t sst_flash_29ee010_device; extern const device_t sst_flash_29ee020_device; + +extern const device_t winbond_flash_w29c512_device; extern const device_t winbond_flash_w29c010_device; extern const device_t winbond_flash_w29c020_device; +extern const device_t winbond_flash_w29c040_device; + +extern const device_t sst_flash_39sf512_device; extern const device_t sst_flash_39sf010_device; extern const device_t sst_flash_39sf020_device; extern const device_t sst_flash_39sf040_device; +extern const device_t sst_flash_39lf512_device; +extern const device_t sst_flash_39lf010_device; +extern const device_t sst_flash_39lf020_device; +extern const device_t sst_flash_39lf040_device; +extern const device_t sst_flash_39lf080_device; +extern const device_t sst_flash_39lf016_device; + +extern const device_t sst_flash_49lf002_device; +extern const device_t sst_flash_49lf020_device; +extern const device_t sst_flash_49lf020a_device; +extern const device_t sst_flash_49lf003_device; +extern const device_t sst_flash_49lf030_device; +extern const device_t sst_flash_49lf004_device; +extern const device_t sst_flash_49lf004c_device; +extern const device_t sst_flash_49lf040_device; +extern const device_t sst_flash_49lf008_device; +extern const device_t sst_flash_49lf008c_device; +extern const device_t sst_flash_49lf080_device; +extern const device_t sst_flash_49lf016_device; +extern const device_t sst_flash_49lf160_device; + #endif /*EMU_FLASH_H*/ diff --git a/src/mem/sst_flash.c b/src/mem/sst_flash.c index a58aa6895..551e2da63 100644 --- a/src/mem/sst_flash.c +++ b/src/mem/sst_flash.c @@ -13,10 +13,12 @@ * Authors: Sarah Walker, * Miran Grca, * Melissa Goad, + * Jasmine Iwanek, * * Copyright 2008-2020 Sarah Walker. * Copyright 2016-2020 Miran Grca. - * Copyright 2020 Melissa Goad. + * Copyright 2020 Melissa Goad. + * Copyright 2022-2023 Jasmine Iwanek. */ #include #include @@ -67,23 +69,69 @@ static char flash_path[1024]; /* 1st cycle variant only on 39 */ #define SST 0xbf /* SST Manufacturer's ID */ + +#define SST29EE512 0x5d00 +#define SST29LE_VE512 0x3d00 #define SST29EE010 0x0700 #define SST29LE_VE010 0x0800 #define SST29EE020 0x1000 #define SST29LE_VE020 0x1200 + #define SST39SF512 0xb400 #define SST39SF010 0xb500 #define SST39SF020 0xb600 #define SST39SF040 0xb700 -#define WINBOND 0xda /* Winbond Manufacturer's ID */ -#define W29C010 0xC100 -#define W29C020 0x4500 +#define SST39LF512 0xd400 +#define SST39LF010 0xd500 +#define SST39LF020 0xd600 +#define SST39LF040 0xd700 +#define SST39LF080 0xd800 +#define SST39LF016 0xd900 -#define SIZE_512K 0x010000 -#define SIZE_1M 0x020000 -#define SIZE_2M 0x040000 -#define SIZE_4M 0x080000 +/* +// 16 wide +#define SST39WF400 0x272f +#define SST39WF400B 0x272e +#define SST39WF800 0x273f +#define SST39WF800B 0x273e +#define SST39WF1601 0xbf274b +#define SST39WF1602 0xbf274a + +#define SST39LF100 0x2788 +#define SST39LF200 0x2789 +#define SST39LF400 0x2780 +#define SST39LF800 0x2781 +#define SST39LF160 0x2782 +*/ + +#define SST49LF002 0x5700 +#define SST49LF020 0x6100 +#define SST49LF020A 0x5200 +#define SST49LF003 0x1b00 +#define SST49LF004 0x6000 +#define SST49LF004C 0x5400 +#define SST49LF040 0x5100 +#define SST49LF008 0x5a00 +#define SST49LF008C 0x5900 +#define SST49LF080 0x5b00 +#define SST49LF030 0x1c00 +#define SST49LF160 0x4c00 +#define SST49LF016 0x5c00 + +#define WINBOND 0xda /* Winbond Manufacturer's ID */ +#define W29C512 0xc800 +#define W29C010 0xc100 +#define W29C020 0x4500 +#define W29C040 0x4600 + +#define SIZE_512K 0x010000 +#define SIZE_1M 0x020000 +#define SIZE_2M 0x040000 +#define SIZE_3M 0x060000 +#define SIZE_4M 0x080000 +#define SIZE_8M 0x100000 +#define SIZE_16M 0x200000 static void sst_sector_erase(sst_t *dev, uint32_t addr) @@ -483,20 +531,6 @@ const device_t sst_flash_29ee010_device = { .config = NULL }; -const device_t winbond_flash_w29c010_device = { - .name = "Winbond W29C010 Flash BIOS", - .internal_name = "winbond_flash_w29c010", - .flags = 0, - .local = WINBOND | W29C010 | SIZE_1M, - .init = sst_init, - .close = sst_close, - .reset = NULL, - { .available = NULL }, - .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL -}; - const device_t sst_flash_29ee020_device = { .name = "SST 29EE020 Flash BIOS", .internal_name = "sst_flash_29ee020", @@ -511,6 +545,34 @@ const device_t sst_flash_29ee020_device = { .config = NULL }; +const device_t winbond_flash_w29c512_device = { + .name = "Winbond W29C512 Flash BIOS", + .internal_name = "winbond_flash_w29c512", + .flags = 0, + .local = WINBOND | W29C010 | SIZE_512K, + .init = sst_init, + .close = sst_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t winbond_flash_w29c010_device = { + .name = "Winbond W29C010 Flash BIOS", + .internal_name = "winbond_flash_w29c010", + .flags = 0, + .local = WINBOND | W29C010 | SIZE_1M, + .init = sst_init, + .close = sst_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + const device_t winbond_flash_w29c020_device = { .name = "Winbond W29C020 Flash BIOS", .internal_name = "winbond_flash_w29c020", @@ -525,6 +587,34 @@ const device_t winbond_flash_w29c020_device = { .config = NULL }; +const device_t winbond_flash_w29c040_device = { + .name = "Winbond W29C040 Flash BIOS", + .internal_name = "winbond_flash_w29c040", + .flags = 0, + .local = WINBOND | W29C040 | SIZE_4M, + .init = sst_init, + .close = sst_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t sst_flash_39sf512_device = { + .name = "SST 39SF512 Flash BIOS", + .internal_name = "sst_flash_39sf512", + .flags = 0, + .local = SST | SST39SF512 | SIZE_512K, + .init = sst_init, + .close = sst_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + const device_t sst_flash_39sf010_device = { .name = "SST 39SF010 Flash BIOS", .internal_name = "sst_flash_39sf010", @@ -566,3 +656,278 @@ const device_t sst_flash_39sf040_device = { .force_redraw = NULL, .config = NULL }; + +const device_t sst_flash_39lf512_device = { + .name = "SST 39LF512 Flash BIOS", + .internal_name = "sst_flash_39lf512", + .flags = 0, + .local = SST | SST39LF512 | SIZE_512K, + .init = sst_init, + .close = sst_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t sst_flash_39lf010_device = { + .name = "SST 39LF010 Flash BIOS", + .internal_name = "sst_flash_39lf010", + .flags = 0, + .local = SST | SST39LF010 | SIZE_1M, + .init = sst_init, + .close = sst_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t sst_flash_39lf020_device = { + .name = "SST 39LF020 Flash BIOS", + .internal_name = "sst_flash_39lf020", + .flags = 0, + .local = SST | SST39LF020 | SIZE_2M, + .init = sst_init, + .close = sst_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t sst_flash_39lf040_device = { + .name = "SST 39LF040 Flash BIOS", + .internal_name = "sst_flash_39lf040", + .flags = 0, + .local = SST | SST39LF040 | SIZE_4M, + .init = sst_init, + .close = sst_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t sst_flash_39lf080_device = { + .name = "SST 39LF080 Flash BIOS", + .internal_name = "sst_flash_39lf080", + .flags = 0, + .local = SST | SST39LF080 | SIZE_8M, + .init = sst_init, + .close = sst_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t sst_flash_39lf016_device = { + .name = "SST 39LF016 Flash BIOS", + .internal_name = "sst_flash_39lf016", + .flags = 0, + .local = SST | SST39LF016 | SIZE_16M, + .init = sst_init, + .close = sst_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +/* + * Firmware Hubs. The FWH signals are not implemented yet. Firmware Hubs do write cycles + * to read/write on the flash. SST Flashes still do traditional flashing via PP Mode. Our + * BIOS firmwares don't seem to utilize FWH R/W thus the FWH ports remain unknown for an + * implementation. We just contain the ID's so the BIOS can do ESCD & DMI writes with no + * worries. + */ + +const device_t sst_flash_49lf002_device = { + .name = "SST 49LF002 Firmware Hub", + .internal_name = "sst_flash_49lf002", + .flags = 0, + .local = SST | SST49LF002 | SIZE_2M, + .init = sst_init, + .close = sst_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t sst_flash_49lf020_device = { + .name = "SST 49LF020 Firmware Hub", + .internal_name = "sst_flash_49lf0020", + .flags = 0, + .local = SST | SST49LF020 | SIZE_2M, + .init = sst_init, + .close = sst_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t sst_flash_49lf020a_device = { + .name = "SST 49LF020A Firmware Hub", + .internal_name = "sst_flash_49lf0020a", + .flags = 0, + .local = SST | SST49LF020A | SIZE_2M, + .init = sst_init, + .close = sst_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t sst_flash_49lf003_device = { + .name = "SST 49LF003 Firmware Hub", + .internal_name = "sst_flash_49lf003", + .flags = 0, + .local = SST | SST49LF003 | SIZE_3M, + .init = sst_init, + .close = sst_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t sst_flash_49lf030_device = { + .name = "SST 49LF030 Firmware Hub", + .internal_name = "sst_flash_49lf030", + .flags = 0, + .local = SST | SST49LF030 | SIZE_3M, + .init = sst_init, + .close = sst_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t sst_flash_49lf004_device = { + .name = "SST 49LF004 Firmware Hub", + .internal_name = "sst_flash_49lf004", + .flags = 0, + .local = SST | SST49LF004 | SIZE_4M, + .init = sst_init, + .close = sst_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t sst_flash_49lf004c_device = { + .name = "SST 49LF004C Firmware Hub", + .internal_name = "sst_flash_49lf004c", + .flags = 0, + .local = SST | SST49LF004C | SIZE_4M, + .init = sst_init, + .close = sst_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t sst_flash_49lf040_device = { + .name = "SST 49LF040 Firmware Hub", + .internal_name = "sst_flash_49lf040", + .flags = 0, + .local = SST | SST49LF040 | SIZE_4M, + .init = sst_init, + .close = sst_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t sst_flash_49lf008_device = { + .name = "SST 49LF008 Firmware Hub", + .internal_name = "sst_flash_49lf008", + .flags = 0, + .local = SST | SST49LF008 | SIZE_8M, + .init = sst_init, + .close = sst_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t sst_flash_49lf008c_device = { + .name = "SST 49LF008C Firmware Hub", + .internal_name = "sst_flash_49lf008c", + .flags = 0, + .local = SST | SST49LF008C | SIZE_8M, + .init = sst_init, + .close = sst_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t sst_flash_49lf080_device = { + .name = "SST 49LF080 Firmware Hub", + .internal_name = "sst_flash_49lf080", + .flags = 0, + .local = SST | SST49LF080 | SIZE_8M, + .init = sst_init, + .close = sst_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t sst_flash_49lf016_device = { + .name = "SST 49LF016 Firmware Hub", + .internal_name = "sst_flash_49lf016", + .flags = 0, + .local = SST | SST49LF016 | SIZE_16M, + .init = sst_init, + .close = sst_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t sst_flash_49lf160_device = { + + .name = "SST 49LF160 Firmware Hub", + .internal_name = "sst_flash_49lf160", + .flags = 0, + .local = SST | SST49LF160 | SIZE_16M, + .init = sst_init, + .close = sst_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; From 2b02287ef3bcda8737aeae5a0347035ed5d7d09f Mon Sep 17 00:00:00 2001 From: luennix Date: Fri, 3 Feb 2023 09:34:17 +0300 Subject: [PATCH 193/285] Unfinished Packard Bell PB810 work, currently breaks compile --- src/include/86box/machine.h | 1 + src/machine/m_at_socket7.c | 34 ++++++++++++++++++++++++++++++++++ src/machine/machine_table.c | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 72 insertions(+) diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index 96d76b097..2f976bcac 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -613,6 +613,7 @@ extern int machine_at_presario4500_init(const machine_t *); extern int machine_at_p55va_init(const machine_t *); extern int machine_at_brio80xx_init(const machine_t *); extern int machine_at_pb680_init(const machine_t *); +extern int machine_at_pb810_init(const machine_t *); extern int machine_at_mb520n_init(const machine_t *); extern int machine_at_i430vx_init(const machine_t *); diff --git a/src/machine/m_at_socket7.c b/src/machine/m_at_socket7.c index 899ce8f5a..34e54a9ee 100644 --- a/src/machine/m_at_socket7.c +++ b/src/machine/m_at_socket7.c @@ -531,6 +531,40 @@ machine_at_pb680_init(const machine_t *model) return ret; } +int +machine_at_pb810_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/pb810/G400125I.BIN", + 0x000e0000, 131072, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_init(model); + + pci_init(PCI_CONFIG_TYPE_1); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 1, 3, 4); + pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 3, 2, 4); + pci_register_slot(0x0b, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); + + if (gfxcard == VID_INTERNAL) + device_add(&s3_phoenix_trio64vplus_onboard_pci_device); + if (soundcard == SOUND_INTERNAL) + device_add(&cs4237b_device); + + device_add(&i430vx_device); + device_add(&piix3_device); + device_add(&keyboard_ps2_device); + device_add(&fdc37c935_device); + device_add(&intel_flash_bxt_device); + + return ret; +} + int machine_at_mb520n_init(const machine_t *model) { diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 5bdd5b948..1d00f8287 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -9449,6 +9449,43 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, + /* This machine has Phoenix MultiKey/42i KBC */ + { + .name = "[i430VX] Packard Bell PB810", + .internal_name = "pb810", + .type = MACHINE_TYPE_SOCKET7, + .chipset = MACHINE_CHIPSET_INTEL_430VX, + .init = machine_at_pb810_init, + .pad = 0, + .pad0 = 0, + .pad1 = MACHINE_AVAILABLE, + .pad2 = 0, + .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, + .flags = MACHINE_IDE_DUAL | MACHINE_AV, + .ram = { + .min = 8192, + .max = 131072, + .step = 8192 + }, + .nvrmask = 127, + .kbc = KBC_UNKNOWN, + .kbc_p1 = 0, + .gpio = 0, + .device = &s3_phoenix_trio64vplus_onboard_pci_device, + .vid_device = NULL, + .snd_device = NULL, + .net_device = NULL + }, /* This has the AMIKey 'H' firmware, possibly AMIKey-2. Photos show it with a BestKey, so it likely clones the behavior of AMIKey 'H'. */ { From 162667a9a61995972198e483126edae2698189cc Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Fri, 3 Feb 2023 02:22:46 -0500 Subject: [PATCH 194/285] Fix non QT builds & Add support for Termux --- src/include/86box/plat_dir.h | 4 ++-- src/unix/unix.c | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/include/86box/plat_dir.h b/src/include/86box/plat_dir.h index f6c135001..d55bc5046 100644 --- a/src/include/86box/plat_dir.h +++ b/src/include/86box/plat_dir.h @@ -18,8 +18,8 @@ #ifndef PLAT_DIR_H #define PLAT_DIR_H -/* Windows needs the POSIX re-implementations */ -#if defined(_WIN32) +/* Windows and Termux needs the POSIX re-implementations */ +#if defined(_WIN32) || defined(__TERMUX__) # ifdef _MAX_FNAME # define MAXNAMLEN _MAX_FNAME # else diff --git a/src/unix/unix.c b/src/unix/unix.c index 296da5e14..b9e842280 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -624,11 +624,11 @@ ui_msgbox_header(int flags, void *header, void *message) SDL_MessageBoxData msgdata; SDL_MessageBoxButtonData msgbtn; if (!header) - header = (flags & MBX_ANSI) ? "86Box" : L"86Box"; + header = (void *) (flags & MBX_ANSI) ? "86Box" : L"86Box"; if (header <= (void *) 7168) - header = plat_get_string(header); + header = (void *) plat_get_string((int) header); if (message <= (void *) 7168) - message = plat_get_string(message); + message = (void *) plat_get_string((int) message); msgbtn.buttonid = 1; msgbtn.text = "OK"; msgbtn.flags = 0; From 194ed138d7691020b66e95e20f270312b83c839e Mon Sep 17 00:00:00 2001 From: luennix Date: Fri, 3 Feb 2023 10:24:11 +0300 Subject: [PATCH 195/285] Add Packard Bell PB810 (without on-board video, for now) --- src/machine/m_at_socket7.c | 5 ++--- src/machine/machine_table.c | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/machine/m_at_socket7.c b/src/machine/m_at_socket7.c index 34e54a9ee..f7faae167 100644 --- a/src/machine/m_at_socket7.c +++ b/src/machine/m_at_socket7.c @@ -35,6 +35,7 @@ #include <86box/keyboard.h> #include <86box/flash.h> #include <86box/sio.h> +#include <86box/sound.h> #include <86box/hwm.h> #include <86box/video.h> #include <86box/spd.h> @@ -551,9 +552,7 @@ machine_at_pb810_init(const machine_t *model) pci_register_slot(0x0b, PCI_CARD_NORMAL, 1, 2, 3, 4); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); - if (gfxcard == VID_INTERNAL) - device_add(&s3_phoenix_trio64vplus_onboard_pci_device); - if (soundcard == SOUND_INTERNAL) + if (sound_card_current[0] == SOUND_INTERNAL) device_add(&cs4237b_device); device_add(&i430vx_device); diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 1d00f8287..bc993c913 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -9471,7 +9471,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_AV, + .flags = MACHINE_IDE_DUAL | MACHINE_SOUND, .ram = { .min = 8192, .max = 131072, @@ -9481,7 +9481,7 @@ const machine_t machines[] = { .kbc = KBC_UNKNOWN, .kbc_p1 = 0, .gpio = 0, - .device = &s3_phoenix_trio64vplus_onboard_pci_device, + .device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL From 9398a59351a8b06ecce0cee90416349058650a56 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 4 Feb 2023 00:30:36 +0100 Subject: [PATCH 196/285] Fixed Network card initialization in the WIN32 Settings dialog. --- src/win/win_settings.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/win/win_settings.c b/src/win/win_settings.c index eaeaed7fa..a75ae2f79 100644 --- a/src/win/win_settings.c +++ b/src/win/win_settings.c @@ -561,7 +561,7 @@ win_settings_save(void) fm_driver = temp_fm_driver; /* Network category */ - net_cards_conf[i].net_type = temp_net_type; + net_cards_conf[0].net_type = temp_net_type; memset(net_cards_conf[0].host_dev_name, '\0', sizeof(net_cards_conf[0].host_dev_name)); strcpy(net_cards_conf[0].host_dev_name, temp_pcap_dev); net_cards_conf[0].device_num = temp_net_card; From e9a326622fc1e9cbc7d013d3231b77b6a81ddc32 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Fri, 3 Feb 2023 20:55:39 -0300 Subject: [PATCH 197/285] xinput2_mouse: Treat XTEST as an absolute pointer device to fix VNC mouse injection --- src/qt/xinput2_mouse.cpp | 60 +++++++++++++++++++++++++++++++--------- 1 file changed, 47 insertions(+), 13 deletions(-) diff --git a/src/qt/xinput2_mouse.cpp b/src/qt/xinput2_mouse.cpp index c9fe8f740..e73f36869 100644 --- a/src/qt/xinput2_mouse.cpp +++ b/src/qt/xinput2_mouse.cpp @@ -76,22 +76,37 @@ parse_valuators(const double *input_values, static bool exitthread = false; +static int +xinput2_get_xtest_pointer() +{ + /* The XTEST pointer events injected by VNC servers to move the cursor always report + absolute coordinates, despite XTEST declaring relative axes (related: SDL issue 1836). + This looks for the XTEST pointer so that we can assume it's absolute as a workaround. */ + int devs; + XIDeviceInfo *info = XIQueryDevice(disp, XIAllDevices, &devs), *dev; + for (int i = 0; i < devs; i++) { + dev = &info[i]; + if ((dev->use == XISlavePointer) && !strcmp(dev->name, "Virtual core XTEST pointer")) + return dev->deviceid; + } + return -1; +} + void xinput2_proc() { Window win; win = DefaultRootWindow(disp); + int xtest_pointer = xinput2_get_xtest_pointer(); + ximask.deviceid = XIAllMasterDevices; ximask.mask_len = XIMaskLen(XI_LASTEVENT); ximask.mask = (unsigned char *) calloc(ximask.mask_len, sizeof(unsigned char)); - XISetMask(ximask.mask, XI_RawKeyPress); - XISetMask(ximask.mask, XI_RawKeyRelease); - XISetMask(ximask.mask, XI_RawButtonPress); - XISetMask(ximask.mask, XI_RawButtonRelease); XISetMask(ximask.mask, XI_RawMotion); XISetMask(ximask.mask, XI_Motion); + XISetMask(ximask.mask, XI_DeviceChanged); XISelectEvents(disp, win, &ximask, 1); @@ -134,7 +149,7 @@ common_motion: const XIValuatorClassInfo *v = (const XIValuatorClassInfo *) xidevinfo->classes[i]; if (v->type == XIValuatorClass) { /* Is this an absolute or relative axis? */ - if (v->mode == XIModeRelative) { + if ((v->mode == XIModeRelative) && (rawev->sourceid != xtest_pointer)) { /* Set relative coordinates. */ if (axis == 0) xi2_mouse_x = xi2_mouse_x + coords[axis]; @@ -145,19 +160,30 @@ common_motion: int disp_screen = XDefaultScreen(disp); double abs_div; if (axis == 0) { - abs_div = (v->max - v->min) / (double) XDisplayWidth(disp, disp_screen); - if (abs_div <= 0) - abs_div = 1; - abs_div = (coords[axis] - v->min) / abs_div; + if (v->mode == XIModeRelative) { + /* XTEST axes have dummy min/max values because they're nominally relative, + but in practice, the injected absolute coordinates are already in pixels. */ + abs_div = coords[axis]; + } else { + abs_div = (v->max - v->min) / (double) XDisplayWidth(disp, disp_screen); + if (abs_div <= 0) + abs_div = 1; + abs_div = (coords[axis] - v->min) / abs_div; + } if (xi2_mouse_abs_x != 0) xi2_mouse_x = xi2_mouse_x + (abs_div - xi2_mouse_abs_x); xi2_mouse_abs_x = abs_div; } else { - abs_div = (v->max - v->min) / (double) XDisplayHeight(disp, disp_screen); - if (abs_div <= 0) - abs_div = 1; - abs_div = (coords[axis] - v->min) / abs_div; + if (v->mode == XIModeRelative) { + /* Same as above. */ + abs_div = coords[axis]; + } else { + abs_div = (v->max - v->min) / (double) XDisplayHeight(disp, disp_screen); + if (abs_div <= 0) + abs_div = 1; + abs_div = (coords[axis] - v->min) / abs_div; + } if (xi2_mouse_abs_y != 0) xi2_mouse_y = xi2_mouse_y + (abs_div - xi2_mouse_abs_y); @@ -181,6 +207,14 @@ common_motion: XFlush(disp); } + break; + } + + case XI_DeviceChanged: + { + /* Re-scan for XTEST pointer, just in case. */ + xtest_pointer = xinput2_get_xtest_pointer(); + break; } } From f12b16cbdd5064ba3d9b2f9e3c0a0e46d5abb711 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 4 Feb 2023 04:02:19 +0100 Subject: [PATCH 198/285] Ali M5123 Super I/O fixes - serial ports now work correctly, fixes #3070. --- src/sio/sio_ali5123.c | 67 +++++++++++++++++++------------------------ 1 file changed, 30 insertions(+), 37 deletions(-) diff --git a/src/sio/sio_ali5123.c b/src/sio/sio_ali5123.c index 310a09ab0..ec5afdc98 100644 --- a/src/sio/sio_ali5123.c +++ b/src/sio/sio_ali5123.c @@ -66,7 +66,7 @@ static void ali5123_fdc_handler(ali5123_t *dev) { uint16_t ld_port = 0; - uint8_t global_enable = !!(dev->regs[0x22] & (1 << 0)); + uint8_t global_enable = !(dev->regs[0x22] & (1 << 0)); uint8_t local_enable = !!dev->ld_regs[0][0x30]; fdc_remove(dev->fdc); @@ -81,7 +81,7 @@ static void ali5123_lpt_handler(ali5123_t *dev) { uint16_t ld_port = 0; - uint8_t global_enable = !!(dev->regs[0x22] & (1 << 3)); + uint8_t global_enable = !(dev->regs[0x22] & (1 << 3)); uint8_t local_enable = !!dev->ld_regs[3][0x30]; uint8_t lpt_irq = dev->ld_regs[3][0x70]; @@ -100,9 +100,10 @@ ali5123_lpt_handler(ali5123_t *dev) static void ali5123_serial_handler(ali5123_t *dev, int uart) { + uint8_t uart_nos[2][3]= { { 4, 5, 0xb }, { 4, 0xb, 5 } }; uint16_t ld_port = 0; - uint8_t uart_no = (uart == 2) ? 0x0b : (4 + uart); - uint8_t global_enable = !!(dev->regs[0x22] & (1 << uart_no)); + uint8_t uart_no = uart_nos[!!(dev->regs[0x2d] & 0x20)][uart]; + uint8_t global_enable = !(dev->regs[0x22] & (1 << (4 + uart))); uint8_t local_enable = !!dev->ld_regs[uart_no][0x30]; uint8_t mask = (uart == 1) ? 0x04 : 0x05; @@ -207,8 +208,7 @@ ali5123_write(uint16_t port, uint8_t val, void *priv) { ali5123_t *dev = (ali5123_t *) priv; uint8_t index = (port & 1) ? 0 : 1; - uint8_t valxor = 0x00, keep = 0x00; - uint8_t cur_ld; + uint8_t valxor = 0x00, cur_ld = dev->regs[7]; if (index) { if (((val == 0x51) && (!dev->tries) && (!dev->locked)) || ((val == 0x23) && (dev->tries) && (!dev->locked))) { @@ -236,27 +236,23 @@ ali5123_write(uint16_t port, uint8_t val, void *priv) if (dev->locked) { if (dev->cur_reg < 48) { valxor = val ^ dev->regs[dev->cur_reg]; - if ((val == 0x1f) || (val == 0x20) || (val == 0x21)) + if ((val >= 0x1f) && (val <= 0x21)) return; dev->regs[dev->cur_reg] = val; } else { - valxor = val ^ dev->ld_regs[dev->regs[7]][dev->cur_reg]; - if (((dev->cur_reg & 0xf0) == 0x70) && (dev->regs[7] < 4)) + valxor = val ^ dev->ld_regs[cur_ld][dev->cur_reg]; + if (((dev->cur_reg & 0xf0) == 0x70) && (cur_ld < 4)) return; /* Block writes to some logical devices. */ - if (dev->regs[7] > 0x0c) + if (cur_ld > 0x0c) return; - else - switch (dev->regs[7]) { - case 0x01: - case 0x02: - case 0x06: - case 0x08: - case 0x09: - case 0x0a: - return; - } - dev->ld_regs[dev->regs[7]][dev->cur_reg] = val | keep; + else switch (cur_ld) { + case 0x01: case 0x02: + case 0x06: + case 0x08 ... 0x0a: + return; + } + dev->ld_regs[cur_ld][dev->cur_reg] = val; } } else return; @@ -281,16 +277,18 @@ ali5123_write(uint16_t port, uint8_t val, void *priv) if (valxor & 0x40) ali5123_serial_handler(dev, 2); break; + case 0x2d: + if (valxor & 0x20) { + ali5123_serial_handler(dev, 1); + ali5123_serial_handler(dev, 2); + } + break; } return; } cur_ld = dev->regs[7]; - if ((dev->regs[7] == 5) && (dev->regs[0x2d] & 0x20)) - cur_ld = 0x0b; - else if ((dev->regs[7] == 0x0b) && (dev->regs[0x2d] & 0x20)) - cur_ld = 5; switch (cur_ld) { case 0: /* FDD */ @@ -299,7 +297,7 @@ ali5123_write(uint16_t port, uint8_t val, void *priv) case 0x60: case 0x61: if ((dev->cur_reg == 0x30) && (val & 0x01)) - dev->regs[0x22] |= 0x01; + dev->regs[0x22] &= ~0x01; if (valxor) ali5123_fdc_handler(dev); break; @@ -339,7 +337,7 @@ ali5123_write(uint16_t port, uint8_t val, void *priv) case 0x61: case 0x70: if ((dev->cur_reg == 0x30) && (val & 0x01)) - dev->regs[0x22] |= 0x08; + dev->regs[0x22] &= ~0x08; if (valxor) ali5123_lpt_handler(dev); break; @@ -354,7 +352,7 @@ ali5123_write(uint16_t port, uint8_t val, void *priv) case 0x70: case 0xf0: if ((dev->cur_reg == 0x30) && (val & 0x01)) - dev->regs[0x22] |= 0x10; + dev->regs[0x22] &= ~0x10; if (valxor) ali5123_serial_handler(dev, 0); break; @@ -369,9 +367,9 @@ ali5123_write(uint16_t port, uint8_t val, void *priv) case 0x70: case 0xf0: if ((dev->cur_reg == 0x30) && (val & 0x01)) - dev->regs[0x22] |= 0x20; + dev->regs[0x22] &= ~((dev->regs[0x2d] & 0x20) ? 0x40 : 0x20); if (valxor) - ali5123_serial_handler(dev, 1); + ali5123_serial_handler(dev, (dev->regs[0x2d] & 0x20) ? 2 : 1); break; } break; @@ -384,9 +382,9 @@ ali5123_write(uint16_t port, uint8_t val, void *priv) case 0x70: case 0xf0: if ((dev->cur_reg == 0x30) && (val & 0x01)) - dev->regs[0x22] |= 0x40; + dev->regs[0x22] &= ~((dev->regs[0x2d] & 0x20) ? 0x20 : 0x40); if (valxor) - ali5123_serial_handler(dev, 2); + ali5123_serial_handler(dev, (dev->regs[0x2d] & 0x20) ? 1 : 2); break; } break; @@ -411,11 +409,6 @@ ali5123_read(uint16_t port, void *priv) ret = dev->regs[dev->cur_reg]; } else { cur_ld = dev->regs[7]; - if ((dev->regs[7] == 5) && (dev->regs[0x2d] & 0x20)) - cur_ld = 0x0b; - else if ((dev->regs[7] == 0x0b) && (dev->regs[0x2d] & 0x20)) - cur_ld = 5; - ret = dev->ld_regs[cur_ld][dev->cur_reg]; } } From 6ad5ff9a4b89964cfe82917a6fc7542d4792e28f Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sat, 4 Feb 2023 00:05:31 -0500 Subject: [PATCH 199/285] Another fix to the Network card initialization in the WIN32 Settings dialog --- src/win/win_settings.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/win/win_settings.c b/src/win/win_settings.c index a75ae2f79..475ab69fd 100644 --- a/src/win/win_settings.c +++ b/src/win/win_settings.c @@ -470,7 +470,7 @@ win_settings_changed(void) i = i || (fm_driver != temp_fm_driver); /* Network category */ - i = i || (net_cards_conf[i].net_type != temp_net_type); + i = i || (net_cards_conf[0].net_type != temp_net_type); i = i || strcmp(temp_pcap_dev, net_cards_conf[0].host_dev_name); i = i || (net_cards_conf[0].device_num != temp_net_card); From f88a1e17286dbdb23feedd95c047ef22aaf38646 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sat, 4 Feb 2023 02:23:32 -0500 Subject: [PATCH 200/285] Fix a warning due to extranious text --- src/win/languages/pt-BR.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/win/languages/pt-BR.rc b/src/win/languages/pt-BR.rc index fa47b6aab..97c354c03 100644 --- a/src/win/languages/pt-BR.rc +++ b/src/win/languages/pt-BR.rc @@ -109,7 +109,7 @@ BEGIN MENUITEM "&Preferências...", IDM_PREFERENCES #ifdef DISCORD MENUITEM "Ativar integração com o &Discord", IDM_DISCORD -#endif DISCORD +#endif MENUITEM SEPARATOR MENUITEM "&Ganho de som...", IDM_SND_GAIN #ifdef MTR_ENABLED From 5d752db6a7bdeab04b9f46f2176dd37999cd35ba Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sat, 4 Feb 2023 01:24:11 -0500 Subject: [PATCH 201/285] Underlying plumbing for multi-net in win32 ui --- src/include/86box/resource.h | 334 +++++++++++++++++++---------------- src/win/languages/cs-CZ.rc | 6 +- src/win/languages/de-DE.rc | 6 +- src/win/languages/dialogs.rc | 8 +- src/win/languages/en-GB.rc | 6 +- src/win/languages/en-US.rc | 6 +- src/win/languages/es-ES.rc | 6 +- src/win/languages/fi-FI.rc | 4 + src/win/languages/fr-FR.rc | 6 +- src/win/languages/hr-HR.rc | 6 +- src/win/languages/hu-HU.rc | 6 +- src/win/languages/it-IT.rc | 6 +- src/win/languages/ja-JP.rc | 6 +- src/win/languages/ko-KR.rc | 6 +- src/win/languages/pl-PL.rc | 6 +- src/win/languages/pt-BR.rc | 4 + src/win/languages/pt-PT.rc | 6 +- src/win/languages/ru-RU.rc | 6 +- src/win/languages/sl-SI.rc | 6 +- src/win/languages/tr-TR.rc | 6 +- src/win/languages/uk-UA.rc | 6 +- src/win/languages/zh-CN.rc | 6 +- src/win/languages/zh-TW.rc | 6 +- src/win/win_settings.c | 177 ++++++++++++------- 24 files changed, 394 insertions(+), 247 deletions(-) diff --git a/src/include/86box/resource.h b/src/include/86box/resource.h index edcb1891a..10f3a4224 100644 --- a/src/include/86box/resource.h +++ b/src/include/86box/resource.h @@ -90,74 +90,78 @@ #define IDT_NET_TYPE 1725 /* Network type: */ #define IDT_PCAP 1726 /* PCap device: */ #define IDT_NET 1727 /* Network adapter: */ +#define IDT_NET1 1728 /* Network adapter 1: */ +#define IDT_NET2 1729 /* Network adapter 2: */ +#define IDT_NET3 1730 /* Network adapter 3: */ +#define IDT_NET4 1731 /* Network adapter 4: */ /* DLG_CFG_PORTS */ -#define IDT_COM1 1728 /* COM1 Device: */ -#define IDT_COM2 1729 /* COM1 Device: */ -#define IDT_COM3 1730 /* COM1 Device: */ -#define IDT_COM4 1731 /* COM1 Device: */ +#define IDT_COM1 1732 /* COM1 Device: */ +#define IDT_COM2 1733 /* COM1 Device: */ +#define IDT_COM3 1734 /* COM1 Device: */ +#define IDT_COM4 1735 /* COM1 Device: */ -#define IDT_LPT1 1732 /* LPT1 Device: */ -#define IDT_LPT2 1733 /* LPT2 Device: */ -#define IDT_LPT3 1734 /* LPT3 Device: */ -#define IDT_LPT4 1735 /* LPT4 Device: */ +#define IDT_LPT1 1736 /* LPT1 Device: */ +#define IDT_LPT2 1737 /* LPT2 Device: */ +#define IDT_LPT3 1738 /* LPT3 Device: */ +#define IDT_LPT4 1739 /* LPT4 Device: */ /* DLG_CFG_STORAGE */ -#define IDT_HDC 1736 /* HD Controller: */ -#define IDT_FDC 1737 /* Ext FD Controller: */ -#define IDT_SCSI_1 1738 /* SCSI Board #1: */ -#define IDT_SCSI_2 1739 /* SCSI Board #2: */ -#define IDT_SCSI_3 1740 /* SCSI Board #3: */ -#define IDT_SCSI_4 1742 /* SCSI Board #4: */ +#define IDT_HDC 1740 /* HD Controller: */ +#define IDT_FDC 1741 /* Ext FD Controller: */ +#define IDT_SCSI_1 1742 /* SCSI Board #1: */ +#define IDT_SCSI_2 1743 /* SCSI Board #2: */ +#define IDT_SCSI_3 1744 /* SCSI Board #3: */ +#define IDT_SCSI_4 1745 /* SCSI Board #4: */ /* DLG_CFG_HARD_DISKS */ -#define IDT_HDD 1743 /* Hard disks: */ -#define IDT_BUS 1744 /* Bus: */ -#define IDT_CHANNEL 1745 /* Channel: */ -#define IDT_ID 1746 /* ID: */ -#define IDT_LUN 1747 /* LUN: */ -#define IDT_SPEED 1748 /* Speed: */ +#define IDT_HDD 1746 /* Hard disks: */ +#define IDT_BUS 1747 /* Bus: */ +#define IDT_CHANNEL 1748 /* Channel: */ +#define IDT_ID 1749 /* ID: */ +#define IDT_LUN 1750 /* LUN: */ +#define IDT_SPEED 1751 /* Speed: */ /* DLG_CFG_HARD_DISKS_ADD */ -#define IDT_SECTORS 1749 /* Sectors: */ -#define IDT_HEADS 1750 /* Heads: */ -#define IDT_CYLS 1751 /* Cylinders: */ -#define IDT_SIZE_MB 1752 /* Size (MB): */ -#define IDT_TYPE 1753 /* Type: */ -#define IDT_FILE_NAME 1754 /* File name: */ -#define IDT_IMG_FORMAT 1755 /* Image Format: */ -#define IDT_BLOCK_SIZE 1756 /* Block Size: */ -#define IDT_PROGRESS 1757 /* Progress: */ +#define IDT_SECTORS 1752 /* Sectors: */ +#define IDT_HEADS 1753 /* Heads: */ +#define IDT_CYLS 1754 /* Cylinders: */ +#define IDT_SIZE_MB 1755 /* Size (MB): */ +#define IDT_TYPE 1756 /* Type: */ +#define IDT_FILE_NAME 1757 /* File name: */ +#define IDT_IMG_FORMAT 1758 /* Image Format: */ +#define IDT_BLOCK_SIZE 1759 /* Block Size: */ +#define IDT_PROGRESS 1760 /* Progress: */ /* DLG_CFG_FLOPPY_AND_CDROM_DRIVES */ -#define IDT_FLOPPY_DRIVES 1758 /* Floppy drives: */ -#define IDT_FDD_TYPE 1759 /* Type: */ -#define IDT_CD_DRIVES 1760 /* CD-ROM drives: */ -#define IDT_CD_BUS 1761 /* Bus: */ -#define IDT_CD_ID 1762 /* ID: */ -#define IDT_CD_LUN 1763 /* LUN: */ -#define IDT_CD_CHANNEL 1764 /* Channel: */ -#define IDT_CD_SPEED 1765 /* Speed: */ +#define IDT_FLOPPY_DRIVES 1761 /* Floppy drives: */ +#define IDT_FDD_TYPE 1762 /* Type: */ +#define IDT_CD_DRIVES 1763 /* CD-ROM drives: */ +#define IDT_CD_BUS 1764 /* Bus: */ +#define IDT_CD_ID 1765 /* ID: */ +#define IDT_CD_LUN 1766 /* LUN: */ +#define IDT_CD_CHANNEL 1767 /* Channel: */ +#define IDT_CD_SPEED 1768 /* Speed: */ /* DLG_CFG_OTHER_REMOVABLE_DEVICES */ -#define IDT_MO_DRIVES 1766 /* MO drives: */ -#define IDT_MO_BUS 1767 /* Bus: */ -#define IDT_MO_ID 1768 /* ID: */ -#define IDT_MO_CHANNEL 1769 /* Channel */ -#define IDT_MO_TYPE 1770 /* Type: */ +#define IDT_MO_DRIVES 1769 /* MO drives: */ +#define IDT_MO_BUS 1770 /* Bus: */ +#define IDT_MO_ID 1771 /* ID: */ +#define IDT_MO_CHANNEL 1772 /* Channel */ +#define IDT_MO_TYPE 1773 /* Type: */ -#define IDT_ZIP_DRIVES 1771 /* ZIP drives: */ -#define IDT_ZIP_BUS 1772 /* Bus: */ -#define IDT_ZIP_ID 1773 /* ID: */ -#define IDT_ZIP_LUN 1774 /* LUN: */ -#define IDT_ZIP_CHANNEL 1775 /* Channel: */ +#define IDT_ZIP_DRIVES 1774 /* ZIP drives: */ +#define IDT_ZIP_BUS 1775 /* Bus: */ +#define IDT_ZIP_ID 1776 /* ID: */ +#define IDT_ZIP_LUN 1777 /* LUN: */ +#define IDT_ZIP_CHANNEL 1778 /* Channel: */ /* DLG_CFG_PERIPHERALS */ -#define IDT_ISARTC 1776 /* ISA RTC: */ -#define IDT_ISAMEM_1 1777 /* ISAMEM Board #1: */ -#define IDT_ISAMEM_2 1778 /* ISAMEM Board #2: */ -#define IDT_ISAMEM_3 1779 /* ISAMEM Board #3: */ -#define IDT_ISAMEM_4 1780 /* ISAMEM Board #4: */ +#define IDT_ISARTC 1779 /* ISA RTC: */ +#define IDT_ISAMEM_1 1780 /* ISAMEM Board #1: */ +#define IDT_ISAMEM_2 1781 /* ISAMEM Board #2: */ +#define IDT_ISAMEM_3 1782 /* ISAMEM Board #3: */ +#define IDT_ISAMEM_4 1783 /* ISAMEM Board #4: */ /* * To try to keep these organized, we now group the @@ -218,109 +222,118 @@ #define IDC_RADIO_FM_DRV_NUKED 1054 #define IDC_RADIO_FM_DRV_YMFM 1055 -#define IDC_COMBO_NET_TYPE 1060 /* network config */ -#define IDC_COMBO_PCAP 1061 -#define IDC_COMBO_NET 1062 +#define IDC_COMBO_NET1_TYPE 1060 /* network config */ +#define IDC_COMBO_NET2_TYPE 1061 +#define IDC_COMBO_NET3_TYPE 1062 +#define IDC_COMBO_NET4_TYPE 1063 +#define IDC_COMBO_PCAP1 1064 +#define IDC_COMBO_PCAP2 1065 +#define IDC_COMBO_PCAP3 1066 +#define IDC_COMBO_PCAP4 1067 +#define IDC_COMBO_NET1 1068 +#define IDC_COMBO_NET2 1069 +#define IDC_COMBO_NET3 1070 +#define IDC_COMBO_NET4 1071 -#define IDC_COMBO_LPT1 1070 /* ports config */ -#define IDC_COMBO_LPT2 1071 -#define IDC_COMBO_LPT3 1072 -#define IDC_COMBO_LPT4 1073 -#define IDC_CHECK_SERIAL1 1074 -#define IDC_CHECK_SERIAL2 1075 -#define IDC_CHECK_SERIAL3 1076 -#define IDC_CHECK_SERIAL4 1077 -#define IDC_CHECK_PARALLEL1 1078 -#define IDC_CHECK_PARALLEL2 1079 -#define IDC_CHECK_PARALLEL3 1080 -#define IDC_CHECK_PARALLEL4 1081 +#define IDC_COMBO_LPT1 1080 /* ports config */ +#define IDC_COMBO_LPT2 1081 +#define IDC_COMBO_LPT3 1082 +#define IDC_COMBO_LPT4 1083 +#define IDC_CHECK_SERIAL1 1084 +#define IDC_CHECK_SERIAL2 1085 +#define IDC_CHECK_SERIAL3 1086 +#define IDC_CHECK_SERIAL4 1087 +#define IDC_CHECK_PARALLEL1 1088 +#define IDC_CHECK_PARALLEL2 1089 +#define IDC_CHECK_PARALLEL3 1090 +#define IDC_CHECK_PARALLEL4 1091 -#define IDC_OTHER_PERIPH 1082 /* storage controllers config */ -#define IDC_COMBO_HDC 1083 -#define IDC_CONFIGURE_HDC 1084 -#define IDC_CHECK_IDE_TER 1085 -#define IDC_BUTTON_IDE_TER 1086 -#define IDC_CHECK_IDE_QUA 1087 -#define IDC_BUTTON_IDE_QUA 1088 -#define IDC_GROUP_SCSI 1089 -#define IDC_COMBO_SCSI_1 1090 -#define IDC_COMBO_SCSI_2 1091 -#define IDC_COMBO_SCSI_3 1092 -#define IDC_COMBO_SCSI_4 1093 -#define IDC_CONFIGURE_SCSI_1 1094 -#define IDC_CONFIGURE_SCSI_2 1095 -#define IDC_CONFIGURE_SCSI_3 1096 -#define IDC_CONFIGURE_SCSI_4 1097 -#define IDC_CHECK_CASSETTE 1098 +#define IDC_OTHER_PERIPH 1110 /* storage controllers config */ +#define IDC_COMBO_HDC 1111 +#define IDC_CONFIGURE_HDC 1112 +#define IDC_CHECK_IDE_TER 1113 +#define IDC_BUTTON_IDE_TER 1114 +#define IDC_CHECK_IDE_QUA 1115 +#define IDC_BUTTON_IDE_QUA 1116 +#define IDC_GROUP_SCSI 1117 +#define IDC_COMBO_SCSI_1 1118 +#define IDC_COMBO_SCSI_2 1119 +#define IDC_COMBO_SCSI_3 1120 +#define IDC_COMBO_SCSI_4 1121 +#define IDC_CONFIGURE_SCSI_1 1122 +#define IDC_CONFIGURE_SCSI_2 1123 +#define IDC_CONFIGURE_SCSI_3 1124 +#define IDC_CONFIGURE_SCSI_4 1125 +#define IDC_CHECK_CASSETTE 1126 -#define IDC_HARD_DISKS 1100 /* hard disks config */ -#define IDC_LIST_HARD_DISKS 1101 -#define IDC_BUTTON_HDD_ADD_NEW 1102 -#define IDC_BUTTON_HDD_ADD 1103 -#define IDC_BUTTON_HDD_REMOVE 1104 -#define IDC_COMBO_HD_BUS 1105 -#define IDC_COMBO_HD_CHANNEL 1106 -#define IDC_COMBO_HD_ID 1107 -#define IDC_COMBO_HD_LUN 1108 -#define IDC_COMBO_HD_CHANNEL_IDE 1109 +#define IDC_HARD_DISKS 1130 /* hard disks config */ +#define IDC_LIST_HARD_DISKS 1131 +#define IDC_BUTTON_HDD_ADD_NEW 1132 +#define IDC_BUTTON_HDD_ADD 1133 +#define IDC_BUTTON_HDD_REMOVE 1134 +#define IDC_COMBO_HD_BUS 1135 +#define IDC_COMBO_HD_CHANNEL 1136 +#define IDC_COMBO_HD_ID 1137 +#define IDC_COMBO_HD_LUN 1138 +#define IDC_COMBO_HD_CHANNEL_IDE 1139 -#define IDC_EDIT_HD_FILE_NAME 1110 /* add hard disk dialog */ -#define IDC_EDIT_HD_SPT 1111 -#define IDC_EDIT_HD_HPC 1112 -#define IDC_EDIT_HD_CYL 1113 -#define IDC_EDIT_HD_SIZE 1114 -#define IDC_COMBO_HD_TYPE 1115 -#define IDC_PBAR_IMG_CREATE 1116 -#define IDC_COMBO_HD_IMG_FORMAT 1117 -#define IDC_COMBO_HD_BLOCK_SIZE 1118 +#define IDC_EDIT_HD_FILE_NAME 1140 /* add hard disk dialog */ +#define IDC_EDIT_HD_SPT 1141 +#define IDC_EDIT_HD_HPC 1142 +#define IDC_EDIT_HD_CYL 1143 +#define IDC_EDIT_HD_SIZE 1144 +#define IDC_COMBO_HD_TYPE 1145 +#define IDC_PBAR_IMG_CREATE 1146 +#define IDC_COMBO_HD_IMG_FORMAT 1147 +#define IDC_COMBO_HD_BLOCK_SIZE 1148 -#define IDC_REMOV_DEVICES 1120 /* floppy and cd-rom drives config */ -#define IDC_LIST_FLOPPY_DRIVES 1121 -#define IDC_COMBO_FD_TYPE 1122 -#define IDC_CHECKTURBO 1123 -#define IDC_CHECKBPB 1124 -#define IDC_LIST_CDROM_DRIVES 1125 -#define IDC_COMBO_CD_BUS 1126 -#define IDC_COMBO_CD_ID 1127 -#define IDC_COMBO_CD_LUN 1128 -#define IDC_COMBO_CD_CHANNEL_IDE 1129 -#define IDC_CHECKEARLY 1130 +#define IDC_REMOV_DEVICES 1150 /* floppy and cd-rom drives config */ +#define IDC_LIST_FLOPPY_DRIVES 1151 +#define IDC_COMBO_FD_TYPE 1152 +#define IDC_CHECKTURBO 1153 +#define IDC_CHECKBPB 1154 +#define IDC_LIST_CDROM_DRIVES 1155 +#define IDC_COMBO_CD_BUS 1156 +#define IDC_COMBO_CD_ID 1157 +#define IDC_COMBO_CD_LUN 1158 +#define IDC_COMBO_CD_CHANNEL_IDE 1159 +#define IDC_CHECKEARLY 1160 -#define IDC_LIST_ZIP_DRIVES 1140 /* other removable devices config */ -#define IDC_COMBO_ZIP_BUS 1141 -#define IDC_COMBO_ZIP_ID 1142 -#define IDC_COMBO_ZIP_LUN 1143 -#define IDC_COMBO_ZIP_CHANNEL_IDE 1144 -#define IDC_CHECK250 1145 -#define IDC_COMBO_CD_SPEED 1146 -#define IDC_LIST_MO_DRIVES 1147 -#define IDC_COMBO_MO_BUS 1148 -#define IDC_COMBO_MO_ID 1149 -#define IDC_COMBO_MO_LUN 1150 -#define IDC_COMBO_MO_CHANNEL_IDE 1151 -#define IDC_COMBO_MO_TYPE 1152 +#define IDC_LIST_ZIP_DRIVES 1170 /* other removable devices config */ +#define IDC_COMBO_ZIP_BUS 1171 +#define IDC_COMBO_ZIP_ID 1172 +#define IDC_COMBO_ZIP_LUN 1173 +#define IDC_COMBO_ZIP_CHANNEL_IDE 1174 +#define IDC_CHECK250 1175 +#define IDC_COMBO_CD_SPEED 1176 +#define IDC_LIST_MO_DRIVES 1177 +#define IDC_COMBO_MO_BUS 1178 +#define IDC_COMBO_MO_ID 1179 +#define IDC_COMBO_MO_LUN 1170 +#define IDC_COMBO_MO_CHANNEL_IDE 1181 +#define IDC_COMBO_MO_TYPE 1182 -#define IDC_CHECK_BUGGER 1160 /* other periph config */ -#define IDC_CHECK_POSTCARD 1161 -#define IDC_COMBO_ISARTC 1162 -#define IDC_CONFIGURE_ISARTC 1163 -#define IDC_COMBO_FDC 1164 -#define IDC_CONFIGURE_FDC 1165 -#define IDC_GROUP_ISAMEM 1166 -#define IDC_COMBO_ISAMEM_1 1167 -#define IDC_COMBO_ISAMEM_2 1168 -#define IDC_COMBO_ISAMEM_3 1169 -#define IDC_COMBO_ISAMEM_4 1170 -#define IDC_CONFIGURE_ISAMEM_1 1171 -#define IDC_CONFIGURE_ISAMEM_2 1172 -#define IDC_CONFIGURE_ISAMEM_3 1173 -#define IDC_CONFIGURE_ISAMEM_4 1174 +#define IDC_CHECK_BUGGER 1190 /* other periph config */ +#define IDC_CHECK_POSTCARD 1191 +#define IDC_COMBO_ISARTC 1192 +#define IDC_CONFIGURE_ISARTC 1193 +#define IDC_COMBO_FDC 1194 +#define IDC_CONFIGURE_FDC 1195 +#define IDC_GROUP_ISAMEM 1196 +#define IDC_COMBO_ISAMEM_1 1197 +#define IDC_COMBO_ISAMEM_2 1198 +#define IDC_COMBO_ISAMEM_3 1199 +#define IDC_COMBO_ISAMEM_4 1200 +#define IDC_CONFIGURE_ISAMEM_1 1201 +#define IDC_CONFIGURE_ISAMEM_2 1202 +#define IDC_CONFIGURE_ISAMEM_3 1203 +#define IDC_CONFIGURE_ISAMEM_4 1204 -#define IDC_SLIDER_GAIN 1180 /* sound gain dialog */ +#define IDC_SLIDER_GAIN 1210 /* sound gain dialog */ -#define IDC_EDIT_FILE_NAME 1200 /* new floppy image dialog */ -#define IDC_COMBO_DISK_SIZE 1201 -#define IDC_COMBO_RPM_MODE 1202 +#define IDC_EDIT_FILE_NAME 1220 /* new floppy image dialog */ +#define IDC_COMBO_DISK_SIZE 1221 +#define IDC_COMBO_RPM_MODE 1222 #define IDC_COMBO_LANG 1009 /* change language dialog */ #define IDC_COMBO_ICON 1010 @@ -337,17 +350,24 @@ #define IDC_CONFIGURE_SND3 1304 #define IDC_CONFIGURE_SND4 1305 #define IDC_CONFIGURE_VOODOO 1306 -#define IDC_CONFIGURE_MOD 1307 -#define IDC_CONFIGURE_NET_TYPE 1308 -#define IDC_CONFIGURE_BUSLOGIC 1309 -#define IDC_CONFIGURE_PCAP 1310 -#define IDC_CONFIGURE_NET 1311 -#define IDC_CONFIGURE_MIDI_OUT 1312 -#define IDC_CONFIGURE_MIDI_IN 1313 -#define IDC_JOY1 1314 -#define IDC_JOY2 1315 -#define IDC_JOY3 1316 -#define IDC_JOY4 1317 +#define IDC_CONFIGURE_NET1_TYPE 1310 +#define IDC_CONFIGURE_NET2_TYPE 1311 +#define IDC_CONFIGURE_NET3_TYPE 1312 +#define IDC_CONFIGURE_NET4_TYPE 1313 +#define IDC_CONFIGURE_PCAP1 1314 +#define IDC_CONFIGURE_PCAP2 1315 +#define IDC_CONFIGURE_PCAP3 1316 +#define IDC_CONFIGURE_PCAP4 1317 +#define IDC_CONFIGURE_NET1 1318 +#define IDC_CONFIGURE_NET2 1319 +#define IDC_CONFIGURE_NET3 1320 +#define IDC_CONFIGURE_NET4 1321 +#define IDC_CONFIGURE_MIDI_OUT 1322 +#define IDC_CONFIGURE_MIDI_IN 1323 +#define IDC_JOY1 1330 +#define IDC_JOY2 1331 +#define IDC_JOY3 1332 +#define IDC_JOY4 1333 #define IDC_HDTYPE 1380 #define IDC_RENDER 1381 #define IDC_STATUS 1382 diff --git a/src/win/languages/cs-CZ.rc b/src/win/languages/cs-CZ.rc index 6ce8c4438..2c50e5316 100644 --- a/src/win/languages/cs-CZ.rc +++ b/src/win/languages/cs-CZ.rc @@ -298,9 +298,13 @@ END #define STR_FM_DRV_NUKED "Nuked (přesnější)" #define STR_FM_DRV_YMFM "YMFM (rychlejší)" -#define STR_NET_TYPE "Druh sítě:" +#define STR_NET_TYPE "Druh sítě:" #define STR_PCAP "PCap zařízení:" #define STR_NET "Síťový adaptér:" +#define STR_NET1 "Network card 1:" +#define STR_NET2 "Network card 2:" +#define STR_NET3 "Network card 3:" +#define STR_NET4 "Network card 4:" #define STR_COM1 "Zařízení na COM1:" #define STR_COM2 "Zařízení na COM2:" diff --git a/src/win/languages/de-DE.rc b/src/win/languages/de-DE.rc index fe79c2e21..0f9517038 100644 --- a/src/win/languages/de-DE.rc +++ b/src/win/languages/de-DE.rc @@ -298,9 +298,13 @@ END #define STR_FM_DRV_NUKED "Nuked (genauer)" #define STR_FM_DRV_YMFM "YMFM (schneller)" -#define STR_NET_TYPE "Netzwerktyp:" +#define STR_NET_TYPE "Netzwerktyp:" #define STR_PCAP "PCap-Gerät:" #define STR_NET "Netzwerkadapter:" +#define STR_NET1 "Network card 1:" +#define STR_NET2 "Network card 2:" +#define STR_NET3 "Network card 3:" +#define STR_NET4 "Network card 4:" #define STR_COM1 "COM1-Gerät:" #define STR_COM2 "COM2-Gerät:" diff --git a/src/win/languages/dialogs.rc b/src/win/languages/dialogs.rc index 30c3e4e50..5a150324c 100644 --- a/src/win/languages/dialogs.rc +++ b/src/win/languages/dialogs.rc @@ -397,22 +397,22 @@ FONT FONT_SIZE, FONT_NAME BEGIN LTEXT STR_NET_TYPE, IDT_NET_TYPE, CFG_HMARGIN, CFG_VMARGIN, CFG_PANE_LTEXT_PRI_WIDTH, CFG_PANE_LTEXT_HEIGHT - COMBOBOX IDC_COMBO_NET_TYPE, + COMBOBOX IDC_COMBO_NET1_TYPE, CFG_COMBO_BOX_LEFT, 7, CFG_COMBO_NOBTN_WIDTH, CFG_COMBO_HEIGHT, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP LTEXT STR_PCAP, IDT_PCAP, CFG_HMARGIN, 28, CFG_PANE_LTEXT_PRI_WIDTH, CFG_PANE_LTEXT_HEIGHT - COMBOBOX IDC_COMBO_PCAP, + COMBOBOX IDC_COMBO_PCAP1, CFG_COMBO_BOX_LEFT, 26, CFG_COMBO_NOBTN_WIDTH, CFG_COMBO_HEIGHT, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP LTEXT STR_NET, IDT_NET, CFG_HMARGIN, 47, CFG_PANE_LTEXT_PRI_WIDTH, CFG_PANE_LTEXT_HEIGHT - COMBOBOX IDC_COMBO_NET, + COMBOBOX IDC_COMBO_NET1, CFG_COMBO_BOX_LEFT, 45, CFG_COMBO_BTN_WIDTH, CFG_COMBO_HEIGHT, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON STR_CONFIGURE, IDC_CONFIGURE_NET, + PUSHBUTTON STR_CONFIGURE, IDC_CONFIGURE_NET1, CFG_COMBO_BTN_LEFT, 44, CFG_BTN_WIDTH, CFG_BTN_HEIGHT END diff --git a/src/win/languages/en-GB.rc b/src/win/languages/en-GB.rc index aaec696ba..7b849bef2 100644 --- a/src/win/languages/en-GB.rc +++ b/src/win/languages/en-GB.rc @@ -298,9 +298,13 @@ END #define STR_FM_DRV_NUKED "Nuked (more accurate)" #define STR_FM_DRV_YMFM "YMFM (faster)" -#define STR_NET_TYPE "Network type:" +#define STR_NET_TYPE "Network type:" #define STR_PCAP "PCap device:" #define STR_NET "Network adapter:" +#define STR_NET1 "Network card 1:" +#define STR_NET2 "Network card 2:" +#define STR_NET3 "Network card 3:" +#define STR_NET4 "Network card 4:" #define STR_COM1 "COM1 Device:" #define STR_COM2 "COM2 Device:" diff --git a/src/win/languages/en-US.rc b/src/win/languages/en-US.rc index ef639d934..8f279e355 100644 --- a/src/win/languages/en-US.rc +++ b/src/win/languages/en-US.rc @@ -298,9 +298,13 @@ END #define STR_FM_DRV_NUKED "Nuked (more accurate)" #define STR_FM_DRV_YMFM "YMFM (faster)" -#define STR_NET_TYPE "Network type:" +#define STR_NET_TYPE "Network type:" #define STR_PCAP "PCap device:" #define STR_NET "Network adapter:" +#define STR_NET1 "Network card 1:" +#define STR_NET2 "Network card 2:" +#define STR_NET3 "Network card 3:" +#define STR_NET4 "Network card 4:" #define STR_COM1 "COM1 Device:" #define STR_COM2 "COM2 Device:" diff --git a/src/win/languages/es-ES.rc b/src/win/languages/es-ES.rc index 4a1c098f6..3e1f746ba 100644 --- a/src/win/languages/es-ES.rc +++ b/src/win/languages/es-ES.rc @@ -298,9 +298,13 @@ END #define STR_FM_DRV_NUKED "Nuked (más preciso)" #define STR_FM_DRV_YMFM "YMFM (más rápido)" -#define STR_NET_TYPE "Tipo de red:" +#define STR_NET_TYPE "Tipo de red:" #define STR_PCAP "Dispositivo PCap:" #define STR_NET "Adaptador de red:" +#define STR_NET1 "Network card 1:" +#define STR_NET2 "Network card 2:" +#define STR_NET3 "Network card 3:" +#define STR_NET4 "Network card 4:" #define STR_COM1 "Dispositivo COM1:" #define STR_COM2 "Dispositivo COM2:" diff --git a/src/win/languages/fi-FI.rc b/src/win/languages/fi-FI.rc index 8927f2f0b..1eee0df45 100644 --- a/src/win/languages/fi-FI.rc +++ b/src/win/languages/fi-FI.rc @@ -301,6 +301,10 @@ END #define STR_NET_TYPE "Verkon tyyppi:" #define STR_PCAP "PCap-laite:" #define STR_NET "Verkkokortti:" +#define STR_NET1 "Network card 1:" +#define STR_NET2 "Network card 2:" +#define STR_NET3 "Network card 3:" +#define STR_NET4 "Network card 4:" #define STR_COM1 "COM1-laite:" #define STR_COM2 "COM2-laite:" diff --git a/src/win/languages/fr-FR.rc b/src/win/languages/fr-FR.rc index 57e14d5e5..29ccb911d 100644 --- a/src/win/languages/fr-FR.rc +++ b/src/win/languages/fr-FR.rc @@ -298,9 +298,13 @@ END #define STR_FM_DRV_NUKED "Nuked (plus précis)" #define STR_FM_DRV_YMFM "YMFM (plus rapide)" -#define STR_NET_TYPE "Type de réseau:" +#define STR_NET_TYPE "Type de réseau:" #define STR_PCAP "Dispositif PCap:" #define STR_NET "Adaptateur de réseau:" +#define STR_NET1 "Network card 1:" +#define STR_NET2 "Network card 2:" +#define STR_NET3 "Network card 3:" +#define STR_NET4 "Network card 4:" #define STR_COM1 "Dispositif COM1:" #define STR_COM2 "Dispositif COM2:" diff --git a/src/win/languages/hr-HR.rc b/src/win/languages/hr-HR.rc index 7753e89e0..317ceccef 100644 --- a/src/win/languages/hr-HR.rc +++ b/src/win/languages/hr-HR.rc @@ -298,9 +298,13 @@ END #define STR_FM_DRV_NUKED "Nuked (precizniji)" #define STR_FM_DRV_YMFM "YMFM (brži)" -#define STR_NET_TYPE "Tip mreže:" +#define STR_NET_TYPE "Tip mreže:" #define STR_PCAP "Uređaj PCap:" #define STR_NET "Mrežna kartica:" +#define STR_NET1 "Network card 1:" +#define STR_NET2 "Network card 2:" +#define STR_NET3 "Network card 3:" +#define STR_NET4 "Network card 4:" #define STR_COM1 "Uređaj COM1:" #define STR_COM2 "Uređaj COM2:" diff --git a/src/win/languages/hu-HU.rc b/src/win/languages/hu-HU.rc index 007118fbe..8a90cdfe6 100644 --- a/src/win/languages/hu-HU.rc +++ b/src/win/languages/hu-HU.rc @@ -303,9 +303,13 @@ END #define STR_FM_DRV_NUKED "Nuked (pontosabb)" #define STR_FM_DRV_YMFM "YMFM (gyorsabb)" -#define STR_NET_TYPE "Hálózati típusa:" +#define STR_NET_TYPE "Hálózati típusa:" #define STR_PCAP "PCap eszköz:" #define STR_NET "Hálózati kártya:" +#define STR_NET1 "Network card 1:" +#define STR_NET2 "Network card 2:" +#define STR_NET3 "Network card 3:" +#define STR_NET4 "Network card 4:" #define STR_COM1 "COM1 eszköz:" #define STR_COM2 "COM2 eszköz:" diff --git a/src/win/languages/it-IT.rc b/src/win/languages/it-IT.rc index 2151bcd2b..38189f706 100644 --- a/src/win/languages/it-IT.rc +++ b/src/win/languages/it-IT.rc @@ -299,9 +299,13 @@ END #define STR_FM_DRV_NUKED "Nuked (più accurato)" #define STR_FM_DRV_YMFM "YMFM (più veloce)" -#define STR_NET_TYPE "Tipo di rete:" +#define STR_NET_TYPE "Tipo di rete:" #define STR_PCAP "Dispositivo PCap:" #define STR_NET "Scheda di rete:" +#define STR_NET1 "Network card 1:" +#define STR_NET2 "Network card 2:" +#define STR_NET3 "Network card 3:" +#define STR_NET4 "Network card 4:" #define STR_COM1 "Dispositivo COM1:" #define STR_COM2 "Dispositivo COM2:" diff --git a/src/win/languages/ja-JP.rc b/src/win/languages/ja-JP.rc index c5f1545a3..daf28f011 100644 --- a/src/win/languages/ja-JP.rc +++ b/src/win/languages/ja-JP.rc @@ -298,9 +298,13 @@ END #define STR_FM_DRV_NUKED "Nuked (高精度化)" #define STR_FM_DRV_YMFM "YMFM (より速く)" -#define STR_NET_TYPE "ネットワークタイプ:" +#define STR_NET_TYPE "ネットワークタイプ:" #define STR_PCAP "PCapデバイス:" #define STR_NET "ネットワークアダプター:" +#define STR_NET1 "Network card 1:" +#define STR_NET2 "Network card 2:" +#define STR_NET3 "Network card 3:" +#define STR_NET4 "Network card 4:" #define STR_COM1 "COM1デバイス:" #define STR_COM2 "COM2デバイス:" diff --git a/src/win/languages/ko-KR.rc b/src/win/languages/ko-KR.rc index e35cbe313..f967286dd 100644 --- a/src/win/languages/ko-KR.rc +++ b/src/win/languages/ko-KR.rc @@ -298,9 +298,13 @@ END #define STR_FM_DRV_NUKED "Nuked (더 정확한)" #define STR_FM_DRV_YMFM "YMFM (더 빠르게)" -#define STR_NET_TYPE "네트워크 종류:" +#define STR_NET_TYPE "네트워크 종류:" #define STR_PCAP "PCap 장치:" #define STR_NET "네트워크 어댑터:" +#define STR_NET1 "Network card 1:" +#define STR_NET2 "Network card 2:" +#define STR_NET3 "Network card 3:" +#define STR_NET4 "Network card 4:" #define STR_COM1 "COM1 장치:" #define STR_COM2 "COM2 장치:" diff --git a/src/win/languages/pl-PL.rc b/src/win/languages/pl-PL.rc index 2932306bd..412076305 100644 --- a/src/win/languages/pl-PL.rc +++ b/src/win/languages/pl-PL.rc @@ -298,9 +298,13 @@ END #define STR_FM_DRV_NUKED "Nuked (dokładniejszy)" #define STR_FM_DRV_YMFM "YMFM (szybszy)" -#define STR_NET_TYPE "Rodzaj sieci:" +#define STR_NET_TYPE "Rodzaj sieci:" #define STR_PCAP "Urządzenie PCap:" #define STR_NET "Karta sieciowa:" +#define STR_NET1 "Network card 1:" +#define STR_NET2 "Network card 2:" +#define STR_NET3 "Network card 3:" +#define STR_NET4 "Network card 4:" #define STR_COM1 "Urządzenie COM1:" #define STR_COM2 "Urządzenie COM2:" diff --git a/src/win/languages/pt-BR.rc b/src/win/languages/pt-BR.rc index fa47b6aab..4c8c57cea 100644 --- a/src/win/languages/pt-BR.rc +++ b/src/win/languages/pt-BR.rc @@ -304,6 +304,10 @@ END #define STR_NET_TYPE "Tipo de rede:" #define STR_PCAP "Dispositivo PCap:" #define STR_NET "Adaptador de rede:" +#define STR_NET1 "Network card 1:" +#define STR_NET2 "Network card 2:" +#define STR_NET3 "Network card 3:" +#define STR_NET4 "Network card 4:" #define STR_COM1 "Dispositivo COM1:" #define STR_COM2 "Dispositivo COM2:" diff --git a/src/win/languages/pt-PT.rc b/src/win/languages/pt-PT.rc index d771628b8..188b0a930 100644 --- a/src/win/languages/pt-PT.rc +++ b/src/win/languages/pt-PT.rc @@ -298,9 +298,13 @@ END #define STR_FM_DRV_NUKED "Nuked (mais exacto)" #define STR_FM_DRV_YMFM "YMFM (mais rápido)" -#define STR_NET_TYPE "Tipo de rede:" +#define STR_NET_TYPE "Tipo de rede:" #define STR_PCAP "Dispositivo PCap:" #define STR_NET "Placa de rede:" +#define STR_NET1 "Network card 1:" +#define STR_NET2 "Network card 2:" +#define STR_NET3 "Network card 3:" +#define STR_NET4 "Network card 4:" #define STR_COM1 "Dispositivo COM1:" #define STR_COM2 "Dispositivo COM2:" diff --git a/src/win/languages/ru-RU.rc b/src/win/languages/ru-RU.rc index 13b802be5..32e6ed32d 100644 --- a/src/win/languages/ru-RU.rc +++ b/src/win/languages/ru-RU.rc @@ -298,9 +298,13 @@ END #define STR_FM_DRV_NUKED "Nuked (более точный)" #define STR_FM_DRV_YMFM "YMFM (быстрей)" -#define STR_NET_TYPE "Тип сети:" +#define STR_NET_TYPE "Тип сети:" #define STR_PCAP "Устройство PCap:" #define STR_NET "Сетевая карта:" +#define STR_NET1 "Network card 1:" +#define STR_NET2 "Network card 2:" +#define STR_NET3 "Network card 3:" +#define STR_NET4 "Network card 4:" #define STR_COM1 "Устройство COM1:" #define STR_COM2 "Устройство COM2:" diff --git a/src/win/languages/sl-SI.rc b/src/win/languages/sl-SI.rc index 493ed4c8a..93f2c4d98 100644 --- a/src/win/languages/sl-SI.rc +++ b/src/win/languages/sl-SI.rc @@ -298,9 +298,13 @@ END #define STR_FM_DRV_NUKED "Nuked (točnejši)" #define STR_FM_DRV_YMFM "YMFM (hitrejši)" -#define STR_NET_TYPE "Vrsta omrežja:" +#define STR_NET_TYPE "Vrsta omrežja:" #define STR_PCAP "Naprava PCap:" #define STR_NET "Omrežna kartica:" +#define STR_NET1 "Network card 1:" +#define STR_NET2 "Network card 2:" +#define STR_NET3 "Network card 3:" +#define STR_NET4 "Network card 4:" #define STR_COM1 "Naprava COM1:" #define STR_COM2 "Naprava COM2:" diff --git a/src/win/languages/tr-TR.rc b/src/win/languages/tr-TR.rc index 7ea555647..2c72f2bdf 100644 --- a/src/win/languages/tr-TR.rc +++ b/src/win/languages/tr-TR.rc @@ -298,9 +298,13 @@ END #define STR_FM_DRV_NUKED "Nuked (daha doğru)" #define STR_FM_DRV_YMFM "YMFM (daha hızlı)" -#define STR_NET_TYPE "Ağ tipi:" +#define STR_NET_TYPE "Ağ tipi:" #define STR_PCAP "PCap cihazı:" #define STR_NET "Ağ cihazı:" +#define STR_NET1 "Network card 1:" +#define STR_NET2 "Network card 2:" +#define STR_NET3 "Network card 3:" +#define STR_NET4 "Network card 4:" #define STR_COM1 "COM1 Cihazı:" #define STR_COM2 "COM2 Cihazı:" diff --git a/src/win/languages/uk-UA.rc b/src/win/languages/uk-UA.rc index 5b278c833..0dc2a544d 100644 --- a/src/win/languages/uk-UA.rc +++ b/src/win/languages/uk-UA.rc @@ -298,9 +298,13 @@ END #define STR_FM_DRV_NUKED "Nuked (більш точний)" #define STR_FM_DRV_YMFM "YMFM (швидший)" -#define STR_NET_TYPE "Тип мережі:" +#define STR_NET_TYPE "Тип мережі:" #define STR_PCAP "Пристрій PCap:" #define STR_NET "Мережева карта:" +#define STR_NET1 "Network card 1:" +#define STR_NET2 "Network card 2:" +#define STR_NET3 "Network card 3:" +#define STR_NET4 "Network card 4:" #define STR_COM1 "Пристрій COM1:" #define STR_COM2 "Пристрій COM2:" diff --git a/src/win/languages/zh-CN.rc b/src/win/languages/zh-CN.rc index 0e4d2d538..945194968 100644 --- a/src/win/languages/zh-CN.rc +++ b/src/win/languages/zh-CN.rc @@ -298,9 +298,13 @@ END #define STR_FM_DRV_NUKED "Nuked (更准确)" #define STR_FM_DRV_YMFM "YMFM (更快)" -#define STR_NET_TYPE "网络类型:" +#define STR_NET_TYPE "网络类型:" #define STR_PCAP "PCap 设备:" #define STR_NET "网络适配器:" +#define STR_NET1 "Network card 1:" +#define STR_NET2 "Network card 2:" +#define STR_NET3 "Network card 3:" +#define STR_NET4 "Network card 4:" #define STR_COM1 "COM1 设备:" #define STR_COM2 "COM2 设备:" diff --git a/src/win/languages/zh-TW.rc b/src/win/languages/zh-TW.rc index 88b49f492..6e5ed0321 100644 --- a/src/win/languages/zh-TW.rc +++ b/src/win/languages/zh-TW.rc @@ -298,9 +298,13 @@ END #define STR_FM_DRV_NUKED "Nuked (更準確)" #define STR_FM_DRV_YMFM "YMFM (更快)" -#define STR_NET_TYPE "網路類型:" +#define STR_NET_TYPE "網路類型:" #define STR_PCAP "PCap 裝置:" #define STR_NET "網路配接器:" +#define STR_NET1 "Network card 1:" +#define STR_NET2 "Network card 2:" +#define STR_NET3 "Network card 3:" +#define STR_NET4 "Network card 4:" #define STR_COM1 "COM1 裝置:" #define STR_COM2 "COM2 裝置:" diff --git a/src/win/win_settings.c b/src/win/win_settings.c index 475ab69fd..ea8d356b9 100644 --- a/src/win/win_settings.c +++ b/src/win/win_settings.c @@ -104,8 +104,9 @@ static int temp_midi_output_device, temp_midi_input_device, temp_mpu401; static int temp_float, temp_fm_driver; /* Network category */ -static int temp_net_type, temp_net_card; -static char temp_pcap_dev[128]; +static int temp_net_type[NET_CARD_MAX]; +static int temp_net_card[NET_CARD_MAX]; +static char temp_pcap_dev[NET_CARD_MAX][128]; /* Ports category */ static int temp_lpt_devices[PARALLEL_MAX]; @@ -345,13 +346,15 @@ win_settings_init(void) temp_fm_driver = fm_driver; /* Network category */ - temp_net_type = net_cards_conf[0].net_type; - memset(temp_pcap_dev, 0, sizeof(temp_pcap_dev)); -#ifdef ENABLE_SETTINGS_LOG - assert(sizeof(temp_pcap_dev) == sizeof(net_cards_conf[0].host_dev_name)); -#endif - memcpy(temp_pcap_dev, net_cards_conf[0].host_dev_name, sizeof(net_cards_conf[0].host_dev_name)); - temp_net_card = net_cards_conf[0].device_num; + for (i = 0; i < NET_CARD_MAX; i++) { + temp_net_type[i] = net_cards_conf[i].net_type; + memset(temp_pcap_dev[i], 0, sizeof(temp_pcap_dev[i])); +# ifdef ENABLE_SETTINGS_LOG + assert(sizeof(temp_pcap_dev[i]) == sizeof(net_cards_conf[i].host_dev_name)); +# endif + memcpy(temp_pcap_dev[i], net_cards_conf[i].host_dev_name, sizeof(net_cards_conf[i].host_dev_name)); + temp_net_card[i] = net_cards_conf[i].device_num; + } /* Ports category */ for (i = 0; i < PARALLEL_MAX; i++) { @@ -470,9 +473,11 @@ win_settings_changed(void) i = i || (fm_driver != temp_fm_driver); /* Network category */ - i = i || (net_cards_conf[0].net_type != temp_net_type); - i = i || strcmp(temp_pcap_dev, net_cards_conf[0].host_dev_name); - i = i || (net_cards_conf[0].device_num != temp_net_card); + for (j = 0; j < NET_CARD_MAX; j++) { + i = i || (net_cards_conf[j].net_type != temp_net_type[j]); + i = i || strcmp(temp_pcap_dev[j], net_cards_conf[j].host_dev_name); + i = i || (net_cards_conf[j].device_num != temp_net_card[j]); + } /* Ports category */ for (j = 0; j < PARALLEL_MAX; j++) { @@ -561,10 +566,12 @@ win_settings_save(void) fm_driver = temp_fm_driver; /* Network category */ - net_cards_conf[0].net_type = temp_net_type; - memset(net_cards_conf[0].host_dev_name, '\0', sizeof(net_cards_conf[0].host_dev_name)); - strcpy(net_cards_conf[0].host_dev_name, temp_pcap_dev); - net_cards_conf[0].device_num = temp_net_card; + for (i = 0; i < NET_CARD_MAX; i++) { + net_cards_conf[i].net_type = temp_net_type[i]; + memset(net_cards_conf[i].host_dev_name, '\0', sizeof(net_cards_conf[i].host_dev_name)); + strcpy(net_cards_conf[i].host_dev_name, temp_pcap_dev[i]); + net_cards_conf[i].device_num = temp_net_card[i]; + } /* Ports category */ for (i = 0; i < PARALLEL_MAX; i++) { @@ -2003,10 +2010,16 @@ network_recalc_combos(HWND hdlg) { ignore_change = 1; - settings_enable_window(hdlg, IDC_COMBO_PCAP, temp_net_type == NET_TYPE_PCAP); - settings_enable_window(hdlg, IDC_COMBO_NET, - (temp_net_type == NET_TYPE_SLIRP) || ((temp_net_type == NET_TYPE_PCAP) && (network_dev_to_id(temp_pcap_dev) > 0))); - settings_enable_window(hdlg, IDC_CONFIGURE_NET, network_card_has_config(temp_net_card) && ((temp_net_type == NET_TYPE_SLIRP) || ((temp_net_type == NET_TYPE_PCAP) && (network_dev_to_id(temp_pcap_dev) > 0)))); +#if 0 + for (uint8_t i = 0; i < NET_CARD_MAX; i++) { +#endif + settings_enable_window(hdlg, IDC_COMBO_PCAP1, temp_net_type[0] == NET_TYPE_PCAP); + settings_enable_window(hdlg, IDC_COMBO_NET1, + (temp_net_type[0] == NET_TYPE_SLIRP) || ((temp_net_type[0] == NET_TYPE_PCAP) && (network_dev_to_id(temp_pcap_dev[0]) > 0))); + settings_enable_window(hdlg, IDC_CONFIGURE_NET1, network_card_has_config(temp_net_card[0]) && ((temp_net_type[0] == NET_TYPE_SLIRP) || ((temp_net_type[0] == NET_TYPE_PCAP) && (network_dev_to_id(temp_pcap_dev[0]) > 0)))); +#if 0 + } +#endif ignore_change = 0; } @@ -2025,90 +2038,120 @@ win_settings_network_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) case WM_INITDIALOG: lptsTemp = (LPTSTR) malloc(512 * sizeof(WCHAR)); - settings_add_string(hdlg, IDC_COMBO_NET_TYPE, (LPARAM) L"None"); - settings_add_string(hdlg, IDC_COMBO_NET_TYPE, (LPARAM) L"SLiRP"); - settings_add_string(hdlg, IDC_COMBO_NET_TYPE, (LPARAM) L"PCap"); - settings_set_cur_sel(hdlg, IDC_COMBO_NET_TYPE, temp_net_type); - settings_enable_window(hdlg, IDC_COMBO_PCAP, temp_net_type == NET_TYPE_PCAP); +#if 0 + for (uint8_t i = 0; i < NET_CARD_MAX; i++) { +#endif + settings_add_string(hdlg, IDC_COMBO_NET1_TYPE, (LPARAM) L"None"); + settings_add_string(hdlg, IDC_COMBO_NET1_TYPE, (LPARAM) L"SLiRP"); + settings_add_string(hdlg, IDC_COMBO_NET1_TYPE, (LPARAM) L"PCap"); + settings_set_cur_sel(hdlg, IDC_COMBO_NET1_TYPE, temp_net_type[0]); + settings_enable_window(hdlg, IDC_COMBO_PCAP1, temp_net_type[0] == NET_TYPE_PCAP); - for (c = 0; c < network_ndev; c++) { - mbstowcs(lptsTemp, network_devs[c].description, strlen(network_devs[c].description) + 1); - settings_add_string(hdlg, IDC_COMBO_PCAP, (LPARAM) lptsTemp); - } - settings_set_cur_sel(hdlg, IDC_COMBO_PCAP, network_dev_to_id(temp_pcap_dev)); + for (c = 0; c < network_ndev; c++) { + mbstowcs(lptsTemp, network_devs[c].description, strlen(network_devs[c].description) + 1); + settings_add_string(hdlg, IDC_COMBO_PCAP1, (LPARAM) lptsTemp); + } + settings_set_cur_sel(hdlg, IDC_COMBO_PCAP1, network_dev_to_id(temp_pcap_dev[0])); - /* NIC config */ - c = d = 0; - settings_reset_content(hdlg, IDC_COMBO_NET); - while (1) { - generate_device_name(network_card_getdevice(c), network_card_get_internal_name(c), 1); + /* NIC config */ + c = d = 0; + settings_reset_content(hdlg, IDC_COMBO_NET1); + while (1) { + generate_device_name(network_card_getdevice(c), network_card_get_internal_name(c), 1); - if (device_name[0] == L'\0') - break; + if (device_name[0] == L'\0') + break; - if (network_card_available(c) && device_is_valid(network_card_getdevice(c), temp_machine)) { - if (c == 0) - settings_add_string(hdlg, IDC_COMBO_NET, win_get_string(IDS_2104)); - else - settings_add_string(hdlg, IDC_COMBO_NET, (LPARAM) device_name); - settings_list_to_device[0][d] = c; - if ((c == 0) || (c == temp_net_card)) - settings_set_cur_sel(hdlg, IDC_COMBO_NET, d); - d++; + if (network_card_available(c) && device_is_valid(network_card_getdevice(c), temp_machine)) { + if (c == 0) + settings_add_string(hdlg, IDC_COMBO_NET1, win_get_string(IDS_2104)); + else + settings_add_string(hdlg, IDC_COMBO_NET1, (LPARAM) device_name); + settings_list_to_device[0][d] = c; + if ((c == 0) || (c == temp_net_card[0])) + settings_set_cur_sel(hdlg, IDC_COMBO_NET1, d); + d++; + } + + c++; } - c++; + settings_enable_window(hdlg, IDC_COMBO_NET1, d); + network_recalc_combos(hdlg); + free(lptsTemp); +#if 0 } - - settings_enable_window(hdlg, IDC_COMBO_NET, d); - network_recalc_combos(hdlg); - free(lptsTemp); - +#endif return TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { - case IDC_COMBO_NET_TYPE: + case IDC_COMBO_NET1_TYPE: +#if 0 + case IDC_COMBO_NET2_TYPE: + case IDC_COMBO_NET3_TYPE: + case IDC_COMBO_NET4_TYPE: +#endif if (ignore_change) return FALSE; - temp_net_type = settings_get_cur_sel(hdlg, IDC_COMBO_NET_TYPE); + temp_net_type[0] = settings_get_cur_sel(hdlg, IDC_COMBO_NET1_TYPE); network_recalc_combos(hdlg); break; - case IDC_COMBO_PCAP: + case IDC_COMBO_PCAP1: +#if 0 + case IDC_COMBO_PCAP2: + case IDC_COMBO_PCAP3: + case IDC_COMBO_PCAP4: +#endif if (ignore_change) return FALSE; - memset(temp_pcap_dev, '\0', sizeof(temp_pcap_dev)); - strcpy(temp_pcap_dev, network_devs[settings_get_cur_sel(hdlg, IDC_COMBO_PCAP)].device); + memset(temp_pcap_dev[0], '\0', sizeof(temp_pcap_dev[0])); + strcpy(temp_pcap_dev[0], network_devs[settings_get_cur_sel(hdlg, IDC_COMBO_PCAP1)].device); network_recalc_combos(hdlg); break; - case IDC_COMBO_NET: + case IDC_COMBO_NET1: +#if 0 + case IDC_COMBO_NET2: + case IDC_COMBO_NET3: + case IDC_COMBO_NET4: +#endif if (ignore_change) return FALSE; - temp_net_card = settings_list_to_device[0][settings_get_cur_sel(hdlg, IDC_COMBO_NET)]; + temp_net_card[0] = settings_list_to_device[0][settings_get_cur_sel(hdlg, IDC_COMBO_NET1)]; network_recalc_combos(hdlg); break; - case IDC_CONFIGURE_NET: + case IDC_CONFIGURE_NET1: +#if 0 + case IDC_CONFIGURE_NET2: + case IDC_CONFIGURE_NET3: + case IDC_CONFIGURE_NET4: +#endif if (ignore_change) return FALSE; - temp_net_card = settings_list_to_device[0][settings_get_cur_sel(hdlg, IDC_COMBO_NET)]; - temp_deviceconfig |= deviceconfig_open(hdlg, (void *) network_card_getdevice(temp_net_card)); + temp_net_card[0] = settings_list_to_device[0][settings_get_cur_sel(hdlg, IDC_COMBO_NET1)]; + temp_deviceconfig |= deviceconfig_open(hdlg, (void *) network_card_getdevice(temp_net_card[0])); break; } return FALSE; case WM_SAVESETTINGS: - temp_net_type = settings_get_cur_sel(hdlg, IDC_COMBO_NET_TYPE); - memset(temp_pcap_dev, '\0', sizeof(temp_pcap_dev)); - strcpy(temp_pcap_dev, network_devs[settings_get_cur_sel(hdlg, IDC_COMBO_PCAP)].device); - temp_net_card = settings_list_to_device[0][settings_get_cur_sel(hdlg, IDC_COMBO_NET)]; - +#if 0 + for (uint8_t i = 0; i < NET_CARD_MAX; i++) { +#endif + temp_net_type[0] = settings_get_cur_sel(hdlg, IDC_COMBO_NET1_TYPE); + memset(temp_pcap_dev[0], '\0', sizeof(temp_pcap_dev[0])); + strcpy(temp_pcap_dev[0], network_devs[settings_get_cur_sel(hdlg, IDC_COMBO_PCAP1)].device); + temp_net_card[0] = settings_list_to_device[0][settings_get_cur_sel(hdlg, IDC_COMBO_NET1)]; +#if 0 + } +#endif default: return FALSE; } From c56dce0fc506af7968c8d6a988dd3d6f20e62fa9 Mon Sep 17 00:00:00 2001 From: luennix Date: Sat, 4 Feb 2023 12:01:59 +0300 Subject: [PATCH 202/285] Fix ECS P6BAP's IRQ steering table --- src/machine/m_at_socket370.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/machine/m_at_socket370.c b/src/machine/m_at_socket370.c index 422e2c989..70527e076 100644 --- a/src/machine/m_at_socket370.c +++ b/src/machine/m_at_socket370.c @@ -127,13 +127,13 @@ machine_at_p6bap_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, 0, 0); - pci_register_slot(0x14, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x12, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x10, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); + pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 3, 5); + pci_register_slot(0x09, PCI_CARD_NORMAL, 1, 2, 3, 5); + pci_register_slot(0x0a, PCI_CARD_NORMAL, 2, 3, 5, 1); + pci_register_slot(0x0b, PCI_CARD_NORMAL, 3, 5, 1, 2); + pci_register_slot(0x0c, PCI_CARD_NORMAL, 5, 1, 2, 3); + pci_register_slot(0x0d, PCI_CARD_NORMAL, 5, 3, 2, 1); + pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 5); device_add(&via_apro133a_device); /* Rebranded as ET82C693A */ device_add(&via_vt82c596b_device); /* Rebranded as ET82C696B */ device_add(&w83977ef_device); From f0c0ad130d9bbf6584901fd0a870da4c6acf128a Mon Sep 17 00:00:00 2001 From: luennix Date: Sat, 4 Feb 2023 12:13:32 +0300 Subject: [PATCH 203/285] Revert "Fix ECS P6BAP's IRQ steering table" This reverts commit c56dce0fc506af7968c8d6a988dd3d6f20e62fa9. --- src/machine/m_at_socket370.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/machine/m_at_socket370.c b/src/machine/m_at_socket370.c index 70527e076..422e2c989 100644 --- a/src/machine/m_at_socket370.c +++ b/src/machine/m_at_socket370.c @@ -127,13 +127,13 @@ machine_at_p6bap_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, 0, 0, 3, 5); - pci_register_slot(0x09, PCI_CARD_NORMAL, 1, 2, 3, 5); - pci_register_slot(0x0a, PCI_CARD_NORMAL, 2, 3, 5, 1); - pci_register_slot(0x0b, PCI_CARD_NORMAL, 3, 5, 1, 2); - pci_register_slot(0x0c, PCI_CARD_NORMAL, 5, 1, 2, 3); - pci_register_slot(0x0d, PCI_CARD_NORMAL, 5, 3, 2, 1); - pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 5); + pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 0, 0); + pci_register_slot(0x14, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x12, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x10, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); device_add(&via_apro133a_device); /* Rebranded as ET82C693A */ device_add(&via_vt82c596b_device); /* Rebranded as ET82C696B */ device_add(&w83977ef_device); From f672f20982cdb706f45a3a5a9558d2eecca2343c Mon Sep 17 00:00:00 2001 From: rueni97 <99608219+luennix@users.noreply.github.com> Date: Sat, 4 Feb 2023 12:31:33 +0300 Subject: [PATCH 204/285] Fix ECS P6BAP's IRQ steering table (#3081) --- src/machine/m_at_socket370.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/machine/m_at_socket370.c b/src/machine/m_at_socket370.c index 422e2c989..e3c640e85 100644 --- a/src/machine/m_at_socket370.c +++ b/src/machine/m_at_socket370.c @@ -127,13 +127,13 @@ machine_at_p6bap_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, 0, 0); - pci_register_slot(0x14, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x12, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x10, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); + pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 3, 5); + pci_register_slot(0x09, PCI_CARD_NORMAL, 1, 2, 3, 5); + pci_register_slot(0x0a, PCI_CARD_NORMAL, 2, 3, 5, 1); + pci_register_slot(0x0b, PCI_CARD_NORMAL, 3, 5, 1, 2); + pci_register_slot(0x0c, PCI_CARD_NORMAL, 5, 1, 2, 3); + pci_register_slot(0x0d, PCI_CARD_NORMAL, 5, 3, 2, 1); + pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 5); device_add(&via_apro133a_device); /* Rebranded as ET82C693A */ device_add(&via_vt82c596b_device); /* Rebranded as ET82C696B */ device_add(&w83977ef_device); From ad0a75735f8244362b92923a016fa841bb20a368 Mon Sep 17 00:00:00 2001 From: randomtechkid <69720918+randomtechkid@users.noreply.github.com> Date: Sun, 5 Feb 2023 13:02:29 +0700 Subject: [PATCH 205/285] Port fix from https://github.com/86Box/86Box/pull/3081 --- src/machine/m_at_socket370.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/machine/m_at_socket370.c b/src/machine/m_at_socket370.c index fd17096f7..e2b9eacbf 100644 --- a/src/machine/m_at_socket370.c +++ b/src/machine/m_at_socket370.c @@ -159,13 +159,13 @@ machine_at_p6bat_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, 0, 0); - pci_register_slot(0x14, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x12, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x10, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); + pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 3, 5); + pci_register_slot(0x09, PCI_CARD_NORMAL, 1, 2, 3, 5); + pci_register_slot(0x0a, PCI_CARD_NORMAL, 2, 3, 5, 1); + pci_register_slot(0x0b, PCI_CARD_NORMAL, 3, 5, 1, 2); + pci_register_slot(0x0c, PCI_CARD_NORMAL, 5, 1, 2, 3); + pci_register_slot(0x0d, PCI_CARD_NORMAL, 5, 3, 2, 1); + pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 5); device_add(&via_apro133_device); device_add(&via_vt82c596b_device); device_add(&w83977ef_device); From 5a2348c68f9a0f1fd110ddd4df9fdd441bda3472 Mon Sep 17 00:00:00 2001 From: cold-brewed Date: Sun, 5 Feb 2023 07:45:39 -0500 Subject: [PATCH 206/285] qt: hdd fields should not be editable in settings view --- src/qt/qt_settingsharddisks.ui | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/qt/qt_settingsharddisks.ui b/src/qt/qt_settingsharddisks.ui index b5ab110c9..ef351e5e7 100644 --- a/src/qt/qt_settingsharddisks.ui +++ b/src/qt/qt_settingsharddisks.ui @@ -28,6 +28,9 @@ + + QAbstractItemView::NoEditTriggers + QAbstractItemView::SingleSelection From b67c3c41e15ba4357d248b7f2e79118a57bb76aa Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 5 Feb 2023 17:16:53 +0100 Subject: [PATCH 207/285] Fixed (S)VGA timings, according to tests by Sergi. --- src/video/vid_svga.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/video/vid_svga.c b/src/video/vid_svga.c index 8b61bf395..704c6f612 100644 --- a/src/video/vid_svga.c +++ b/src/video/vid_svga.c @@ -455,7 +455,8 @@ svga_recalctimings(svga_t *svga) svga->hdisp++; svga->htotal = svga->crtc[0]; - svga->htotal += 6; /*+6 is required for Tyrian*/ + /* +5 has been verified by Sergi to be correct - +6 must have been an off by one error. */ + svga->htotal += 5; /*+6 is required for Tyrian*/ svga->rowoffset = svga->crtc[0x13]; From 6655d2d498ebeafc3b171a8b8a97f41997510ffb Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 5 Feb 2023 17:22:13 +0100 Subject: [PATCH 208/285] Removed an unused variable from the SiS 85c50x code. --- src/chipset/sis_85c50x.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/chipset/sis_85c50x.c b/src/chipset/sis_85c50x.c index 8d7222d54..247ff1b96 100644 --- a/src/chipset/sis_85c50x.c +++ b/src/chipset/sis_85c50x.c @@ -136,7 +136,6 @@ static void sis_85c50x_write(int func, int addr, uint8_t val, void *priv) { sis_85c50x_t *dev = (sis_85c50x_t *) priv; - uint8_t valxor = (val ^ dev->pci_conf[addr]); sis_85c50x_log("85C501: [W] (%02X, %02X) = %02X\n", func, addr, val); @@ -192,8 +191,6 @@ sis_85c50x_write(int func, int addr, uint8_t val, void *priv) break; case 0x5b: dev->pci_conf[addr] = val; - // if (valxor & 0xc0) - // port_92_set_features(dev->port_92, !!(val & 0x40), !!(val & 0x80)); break; case 0x60: /* SMI */ if ((dev->pci_conf[0x68] & 0x01) && !(dev->pci_conf[addr] & 0x02) && (val & 0x02)) { From c809f482d57a96ff0c4f9cee526f3cafc6110f54 Mon Sep 17 00:00:00 2001 From: cold-brewed Date: Sun, 5 Feb 2023 12:12:37 -0500 Subject: [PATCH 209/285] qt: Fixes to the process for selecting an existing hdd image --- src/qt/qt_filefield.cpp | 2 +- src/qt/qt_filefield.hpp | 2 +- src/qt/qt_harddiskdialog.cpp | 76 +++++++++++++++++++----------------- src/qt/qt_harddiskdialog.hpp | 2 +- 4 files changed, 43 insertions(+), 39 deletions(-) diff --git a/src/qt/qt_filefield.cpp b/src/qt/qt_filefield.cpp index 9bdb6cd7f..b6db5e611 100644 --- a/src/qt/qt_filefield.cpp +++ b/src/qt/qt_filefield.cpp @@ -29,7 +29,7 @@ FileField::FileField(QWidget *parent) connect(ui->label, &QLineEdit::editingFinished, this, [this]() { fileName_ = ui->label->text(); - emit fileSelected(ui->label->text()); + emit fileSelected(ui->label->text(), true); }); this->setFixedWidth(this->sizeHint().width() + ui->pushButton->sizeHint().width()); } diff --git a/src/qt/qt_filefield.hpp b/src/qt/qt_filefield.hpp index 8520e3e57..ee011a38b 100644 --- a/src/qt/qt_filefield.hpp +++ b/src/qt/qt_filefield.hpp @@ -24,7 +24,7 @@ public: bool createFile() { return createFile_; } signals: - void fileSelected(const QString &fileName); + void fileSelected(const QString &fileName, bool precheck = false); private slots: void on_pushButton_clicked(); diff --git a/src/qt/qt_harddiskdialog.cpp b/src/qt/qt_harddiskdialog.cpp index 943b13dc0..e8ccccd6f 100644 --- a/src/qt/qt_harddiskdialog.cpp +++ b/src/qt/qt_harddiskdialog.cpp @@ -51,6 +51,40 @@ HarddiskDialog::HarddiskDialog(bool existing, QWidget *parent) { ui->setupUi(this); + auto *model = ui->comboBoxFormat->model(); + model->insertRows(0, 6); + model->setData(model->index(0, 0), tr("Raw image (.img)")); + model->setData(model->index(1, 0), tr("HDI image (.hdi)")); + model->setData(model->index(2, 0), tr("HDX image (.hdx)")); + model->setData(model->index(3, 0), tr("Fixed-size VHD (.vhd)")); + model->setData(model->index(4, 0), tr("Dynamic-size VHD (.vhd)")); + model->setData(model->index(5, 0), tr("Differencing VHD (.vhd)")); + + model = ui->comboBoxBlockSize->model(); + model->insertRows(0, 2); + model->setData(model->index(0, 0), tr("Large blocks (2 MB)")); + model->setData(model->index(1, 0), tr("Small blocks (512 KB)")); + + ui->comboBoxBlockSize->hide(); + ui->labelBlockSize->hide(); + + Harddrives::populateBuses(ui->comboBoxBus->model()); + ui->comboBoxBus->setCurrentIndex(3); + + model = ui->comboBoxType->model(); + for (int i = 0; i < 127; i++) { + uint64_t size = ((uint64_t) hdd_table[i][0]) * hdd_table[i][1] * hdd_table[i][2]; + uint32_t size_mb = size >> 11LL; + // QString text = QString("%1 MiB (CHS: %2, %3, %4)").arg(size_mb).arg(hdd_table[i][0]).arg(hdd_table[i][1]).arg(hdd_table[i][2]); + QString text = QString::asprintf(tr("%u MB (CHS: %i, %i, %i)").toUtf8().constData(), (size_mb), (hdd_table[i][0]), (hdd_table[i][1]), (hdd_table[i][2])); + Models::AddEntry(model, text, i); + } + Models::AddEntry(model, tr("Custom..."), 127); + Models::AddEntry(model, tr("Custom (large)..."), 128); + + ui->lineEditSize->setValidator(new QIntValidator()); + ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); + if (existing) { ui->fileField->setFilter(tr("Hard disk images") % util::DlgFilter({ "hd?", "im?", "vhd" }) % tr("All files") % util::DlgFilter({ "*" }, true)); @@ -85,40 +119,6 @@ HarddiskDialog::HarddiskDialog(bool existing, QWidget *parent) ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(true); }); } - - auto *model = ui->comboBoxFormat->model(); - model->insertRows(0, 6); - model->setData(model->index(0, 0), tr("Raw image (.img)")); - model->setData(model->index(1, 0), tr("HDI image (.hdi)")); - model->setData(model->index(2, 0), tr("HDX image (.hdx)")); - model->setData(model->index(3, 0), tr("Fixed-size VHD (.vhd)")); - model->setData(model->index(4, 0), tr("Dynamic-size VHD (.vhd)")); - model->setData(model->index(5, 0), tr("Differencing VHD (.vhd)")); - - model = ui->comboBoxBlockSize->model(); - model->insertRows(0, 2); - model->setData(model->index(0, 0), tr("Large blocks (2 MB)")); - model->setData(model->index(1, 0), tr("Small blocks (512 KB)")); - - ui->comboBoxBlockSize->hide(); - ui->labelBlockSize->hide(); - - Harddrives::populateBuses(ui->comboBoxBus->model()); - ui->comboBoxBus->setCurrentIndex(3); - - model = ui->comboBoxType->model(); - for (int i = 0; i < 127; i++) { - uint64_t size = ((uint64_t) hdd_table[i][0]) * hdd_table[i][1] * hdd_table[i][2]; - uint32_t size_mb = size >> 11LL; - // QString text = QString("%1 MiB (CHS: %2, %3, %4)").arg(size_mb).arg(hdd_table[i][0]).arg(hdd_table[i][1]).arg(hdd_table[i][2]); - QString text = QString::asprintf(tr("%u MB (CHS: %i, %i, %i)").toUtf8().constData(), (size_mb), (hdd_table[i][0]), (hdd_table[i][1]), (hdd_table[i][2])); - Models::AddEntry(model, text, i); - } - Models::AddEntry(model, tr("Custom..."), 127); - Models::AddEntry(model, tr("Custom (large)..."), 128); - - ui->lineEditSize->setValidator(new QIntValidator()); - ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); } HarddiskDialog::~HarddiskDialog() @@ -499,7 +499,7 @@ HarddiskDialog::recalcSelection() } void -HarddiskDialog::onExistingFileSelected(const QString &fileName) +HarddiskDialog::onExistingFileSelected(const QString &fileName, bool precheck) { // TODO : Over to non-existing file selected /* @@ -531,7 +531,11 @@ HarddiskDialog::onExistingFileSelected(const QString &fileName) ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); QFile file(fileName); if (!file.open(QIODevice::ReadOnly)) { - QMessageBox::critical(this, tr("Unable to read file"), tr("Make sure the file exists and is readable.")); + // No message box during precheck (performed when the file input loses focus and this function is called) + // If precheck is false, the file has been chosen from a file dialog and the alert should display. + if(!precheck) { + QMessageBox::critical(this, tr("Unable to read file"), tr("Make sure the file exists and is readable.")); + } return; } QByteArray fileNameUtf8 = fileName.toUtf8(); diff --git a/src/qt/qt_harddiskdialog.hpp b/src/qt/qt_harddiskdialog.hpp index a630bd8e2..0d5fa13bc 100644 --- a/src/qt/qt_harddiskdialog.hpp +++ b/src/qt/qt_harddiskdialog.hpp @@ -37,7 +37,7 @@ private slots: void on_comboBoxBus_currentIndexChanged(int index); void on_comboBoxFormat_currentIndexChanged(int index); void onCreateNewFile(); - void onExistingFileSelected(const QString &fileName); + void onExistingFileSelected(const QString &fileName, bool precheck); private: Ui::HarddiskDialog *ui; From 118ae94200a432be33f7cf69bf504ffb87661012 Mon Sep 17 00:00:00 2001 From: cold-brewed Date: Sun, 5 Feb 2023 12:20:44 -0500 Subject: [PATCH 210/285] qt: Fix some other fields that should not be editable --- src/qt/qt_settingsfloppycdrom.ui | 6 ++++++ src/qt/qt_settingsotherremovable.ui | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/src/qt/qt_settingsfloppycdrom.ui b/src/qt/qt_settingsfloppycdrom.ui index 30be29153..7a025e7a6 100644 --- a/src/qt/qt_settingsfloppycdrom.ui +++ b/src/qt/qt_settingsfloppycdrom.ui @@ -35,6 +35,9 @@ + + QAbstractItemView::NoEditTriggers + QAbstractItemView::SingleSelection @@ -99,6 +102,9 @@ + + QAbstractItemView::NoEditTriggers + QAbstractItemView::SingleSelection diff --git a/src/qt/qt_settingsotherremovable.ui b/src/qt/qt_settingsotherremovable.ui index a82c296ae..c57dd3ca2 100644 --- a/src/qt/qt_settingsotherremovable.ui +++ b/src/qt/qt_settingsotherremovable.ui @@ -35,6 +35,9 @@ + + QAbstractItemView::NoEditTriggers + QAbstractItemView::SingleSelection @@ -105,6 +108,9 @@ + + QAbstractItemView::NoEditTriggers + QAbstractItemView::SingleSelection From a9149bb78a8bdbbd4fde2182e0e8f4905d7d8853 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Mon, 6 Feb 2023 01:39:34 +0600 Subject: [PATCH 211/285] qt: Reenable and make functional ACPI shutdown button --- src/86box.c | 5 +++++ src/acpi.c | 23 ++++++++++++++++++++++- src/include/86box/acpi.h | 10 ++++++++-- src/qt/qt_mainwindow.cpp | 10 ++++++++++ src/qt/qt_mainwindow.hpp | 3 +++ src/qt/qt_mainwindow.ui | 4 ++-- 6 files changed, 50 insertions(+), 5 deletions(-) diff --git a/src/86box.c b/src/86box.c index fba67ca55..32724802c 100644 --- a/src/86box.c +++ b/src/86box.c @@ -97,6 +97,8 @@ #include <86box/version.h> #include <86box/gdbstub.h> #include <86box/machine_status.h> +#include <86box/apm.h> +#include <86box/acpi.h> // Disable c99-designator to avoid the warnings about int ng #ifdef __clang__ @@ -1016,6 +1018,9 @@ pc_reset_hard_init(void) * modules that are. */ + /* Mark ACPI as unavailable */ + acpi_enabled = 0; + /* Reset the general machine support modules. */ io_init(); diff --git a/src/acpi.c b/src/acpi.c index 5f9db8d05..2c5f2ff90 100644 --- a/src/acpi.c +++ b/src/acpi.c @@ -40,7 +40,9 @@ #include <86box/i2c.h> #include <86box/video.h> -int acpi_rtc_status = 0; +int acpi_rtc_status = 0; +atomic_int acpi_pwrbut_pressed = 0; +int acpi_enabled = 0; static double cpu_to_acpi; @@ -1516,6 +1518,21 @@ acpi_ali_soft_smi_status_write(acpi_t *dev, uint8_t soft_smi) dev->regs.ali_soft_smi = soft_smi; } +void +acpi_pwrbtn_timer(void* priv) +{ + acpi_t *dev = (acpi_t *) priv; + + timer_on_auto(&dev->pwrbtn_timer, 16. * 1000.); + if (acpi_pwrbut_pressed) { + acpi_pwrbut_pressed = 0; + if (dev->regs.pmen & PWRBTN_EN) { + dev->regs.pmsts |= PWRBTN_STS; + acpi_update_irq(dev); + } + } +} + static void acpi_apm_out(uint16_t port, uint8_t val, void *p) { @@ -1707,9 +1724,13 @@ acpi_init(const device_t *info) timer_add(&dev->timer, acpi_timer_overflow, dev, 0); timer_add(&dev->resume_timer, acpi_timer_resume, dev, 0); + timer_add(&dev->pwrbtn_timer, acpi_pwrbtn_timer, dev, 0); + + timer_on_auto(&dev->pwrbtn_timer, 16. * 1000.); acpi_reset(dev); + acpi_enabled = 1; return dev; } diff --git a/src/include/86box/acpi.h b/src/include/86box/acpi.h index 4d2f2ac0d..18f40d874 100644 --- a/src/include/86box/acpi.h +++ b/src/include/86box/acpi.h @@ -18,7 +18,11 @@ #define ACPI_H #ifdef __cplusplus +#include +using atomic_int = std::atomic_int; extern "C" { +#else +#include #endif #define ACPI_TIMER_FREQ 3579545 @@ -90,7 +94,7 @@ typedef struct slot, irq_mode, irq_pin, irq_line, mirq_is_level; - pc_timer_t timer, resume_timer; + pc_timer_t timer, resume_timer, pwrbtn_timer; nvr_t *nvr; apm_t *apm; void *i2c, @@ -98,7 +102,9 @@ typedef struct } acpi_t; /* Global variables. */ -extern int acpi_rtc_status; +extern int acpi_rtc_status; +extern atomic_int acpi_pwrbut_pressed; +extern int acpi_enabled; extern const device_t acpi_ali_device; extern const device_t acpi_intel_device; diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index 0af5626f3..013650673 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -47,6 +47,9 @@ extern "C" { #include <86box/machine.h> #include <86box/vid_ega.h> #include <86box/version.h> +//#include <86box/acpi.h> /* Requires timer.h include, which conflicts with Qt headers */ +extern atomic_int acpi_pwrbut_pressed; +extern int acpi_enabled; #ifdef USE_VNC # include <86box/vnc.h> @@ -1679,6 +1682,7 @@ MainWindow::refreshMediaMenu() mm->refresh(ui->menuMedia); status->refresh(ui->statusbar); ui->actionMCA_devices->setVisible(machine_has_bus(machine, MACHINE_BUS_MCA)); + ui->actionACPI_Shutdown->setEnabled(!!acpi_enabled); } void @@ -2430,3 +2434,9 @@ MainWindow::on_actionApply_fullscreen_stretch_mode_when_maximized_triggered(bool device_force_redraw(); config_save(); } + +void MainWindow::on_actionACPI_Shutdown_triggered() +{ + acpi_pwrbut_pressed = 1; +} + diff --git a/src/qt/qt_mainwindow.hpp b/src/qt/qt_mainwindow.hpp index 6ad4c9beb..9668ecbbb 100644 --- a/src/qt/qt_mainwindow.hpp +++ b/src/qt/qt_mainwindow.hpp @@ -134,6 +134,9 @@ protected: void closeEvent(QCloseEvent *event) override; void changeEvent(QEvent *event) override; +private slots: + void on_actionACPI_Shutdown_triggered(); + private slots: void on_actionShow_non_primary_monitors_triggered(); diff --git a/src/qt/qt_mainwindow.ui b/src/qt/qt_mainwindow.ui index 6a86b632e..eb921899b 100644 --- a/src/qt/qt_mainwindow.ui +++ b/src/qt/qt_mainwindow.ui @@ -743,7 +743,7 @@ - false + true @@ -756,7 +756,7 @@ ACPI Shutdown - false + true From 7d212d6dddcd0dafd9cc0e5996fd234377a99fb2 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Mon, 6 Feb 2023 01:47:02 -0500 Subject: [PATCH 212/285] Fix p6bat internal sound --- src/machine/m_at_socket370.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/machine/m_at_socket370.c b/src/machine/m_at_socket370.c index e2b9eacbf..b8cc437a1 100644 --- a/src/machine/m_at_socket370.c +++ b/src/machine/m_at_socket370.c @@ -173,7 +173,7 @@ machine_at_p6bat_init(const machine_t *model) device_add(&sst_flash_39sf020_device); spd_register(SPD_TYPE_SDRAM, 0x7, 256); - if (sound_card_current == SOUND_INTERNAL) { + if (sound_card_current[0] == SOUND_INTERNAL) { device_add(&cmi8738_onboard_device); } From 6978f6d7d470e36d2092489ae9419dc963a11a73 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Mon, 6 Feb 2023 01:49:21 -0500 Subject: [PATCH 213/285] Fix uninitialized use in mitsumi_cdrom_reset --- src/cdrom/cdrom_mitsumi.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/cdrom/cdrom_mitsumi.c b/src/cdrom/cdrom_mitsumi.c index eaddccef8..e7e12bb94 100644 --- a/src/cdrom/cdrom_mitsumi.c +++ b/src/cdrom/cdrom_mitsumi.c @@ -144,6 +144,8 @@ static void mitsumi_cdrom_reset(mcd_t *dev) { cdrom_t cdrom; + + cdrom.host_drive = 0; dev->stat = cdrom.host_drive ? (STAT_READY | STAT_CHANGE) : 0; dev->cmdrd_count = 0; From 13b954a336278d06dfb26e4855dab07acd5f6f0d Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Mon, 6 Feb 2023 02:58:04 -0500 Subject: [PATCH 214/285] Port PR#2786 (Higher scaling factors) to win32 UI --- src/include/86box/resource.h | 35 +++++++++++++++++++++-------------- src/win/languages/cs-CZ.rc | 14 ++++++++++---- src/win/languages/de-DE.rc | 6 ++++++ src/win/languages/en-GB.rc | 6 ++++++ src/win/languages/en-US.rc | 6 ++++++ src/win/languages/es-ES.rc | 6 ++++++ src/win/languages/fi-FI.rc | 6 ++++++ src/win/languages/fr-FR.rc | 6 ++++++ src/win/languages/hr-HR.rc | 6 ++++++ src/win/languages/hu-HU.rc | 6 ++++++ src/win/languages/it-IT.rc | 6 ++++++ src/win/languages/ja-JP.rc | 6 ++++++ src/win/languages/ko-KR.rc | 6 ++++++ src/win/languages/pl-PL.rc | 6 ++++++ src/win/languages/pt-BR.rc | 6 ++++++ src/win/languages/pt-PT.rc | 6 ++++++ src/win/languages/ru-RU.rc | 6 ++++++ src/win/languages/sl-SI.rc | 6 ++++++ src/win/languages/tr-TR.rc | 6 ++++++ src/win/languages/uk-UA.rc | 6 ++++++ src/win/languages/zh-CN.rc | 6 ++++++ src/win/languages/zh-TW.rc | 6 ++++++ src/win/win_specify_dim.c | 6 ++++++ src/win/win_ui.c | 6 ++++++ 24 files changed, 163 insertions(+), 18 deletions(-) diff --git a/src/include/86box/resource.h b/src/include/86box/resource.h index 10f3a4224..967430216 100644 --- a/src/include/86box/resource.h +++ b/src/include/86box/resource.h @@ -412,20 +412,27 @@ #define IDM_VID_SCALE_2X 40056 #define IDM_VID_SCALE_3X 40057 #define IDM_VID_SCALE_4X 40058 -#define IDM_VID_HIDPI 40059 -#define IDM_VID_FULLSCREEN 40060 -#define IDM_VID_FS_FULL 40061 -#define IDM_VID_FS_43 40062 -#define IDM_VID_FS_KEEPRATIO 40063 -#define IDM_VID_FS_INT 40064 -#define IDM_VID_SPECIFY_DIM 40065 -#define IDM_VID_FORCE43 40066 -#define IDM_VID_OVERSCAN 40067 -#define IDM_VID_INVERT 40069 -#define IDM_VID_CGACON 40070 -#define IDM_VID_GRAYCT_601 40075 -#define IDM_VID_GRAYCT_709 40076 -#define IDM_VID_GRAYCT_AVE 40077 +#define IDM_VID_SCALE_5X 40059 +#define IDM_VID_SCALE_6X 40060 +#define IDM_VID_SCALE_7X 40061 +#define IDM_VID_SCALE_8X 40062 +#define IDM_VID_SCALE_9X 40063 +#define IDM_VID_SCALE_10X 40064 + +#define IDM_VID_HIDPI 40065 +#define IDM_VID_FULLSCREEN 40066 +#define IDM_VID_FS_FULL 40067 +#define IDM_VID_FS_43 40068 +#define IDM_VID_FS_KEEPRATIO 40069 +#define IDM_VID_FS_INT 40070 +#define IDM_VID_SPECIFY_DIM 40071 +#define IDM_VID_FORCE43 40072 +#define IDM_VID_OVERSCAN 40073 +#define IDM_VID_INVERT 40074 +#define IDM_VID_CGACON 40075 +#define IDM_VID_GRAYCT_601 40076 +#define IDM_VID_GRAYCT_709 40077 +#define IDM_VID_GRAYCT_AVE 40078 #define IDM_VID_GRAY_RGB 40080 #define IDM_VID_GRAY_MONO 40081 #define IDM_VID_GRAY_AMBER 40082 diff --git a/src/win/languages/cs-CZ.rc b/src/win/languages/cs-CZ.rc index 2c50e5316..c888fe954 100644 --- a/src/win/languages/cs-CZ.rc +++ b/src/win/languages/cs-CZ.rc @@ -53,10 +53,16 @@ BEGIN MENUITEM "&Dodržovat poměr stran 4:3", IDM_VID_FORCE43 POPUP "&Násobek zvětšení okna" BEGIN - MENUITEM "&0.5x", IDM_VID_SCALE_1X - MENUITEM "&1x", IDM_VID_SCALE_2X - MENUITEM "1.&5x", IDM_VID_SCALE_3X - MENUITEM "&2x", IDM_VID_SCALE_4X + MENUITEM "&0.5x", IDM_VID_SCALE_1X + MENUITEM "&1x", IDM_VID_SCALE_2X + MENUITEM "1.&5x", IDM_VID_SCALE_3X + MENUITEM "&2x", IDM_VID_SCALE_4X + MENUITEM "&3x", IDM_VID_SCALE_5X + MENUITEM "&4x", IDM_VID_SCALE_6X + MENUITEM "&5x", IDM_VID_SCALE_7X + MENUITEM "&6x", IDM_VID_SCALE_8X + MENUITEM "&7x", IDM_VID_SCALE_9X + MENUITEM "&8x", IDM_VID_SCALE_10X END POPUP "Metoda &filtrování" BEGIN diff --git a/src/win/languages/de-DE.rc b/src/win/languages/de-DE.rc index 0f9517038..3768898a5 100644 --- a/src/win/languages/de-DE.rc +++ b/src/win/languages/de-DE.rc @@ -57,6 +57,12 @@ BEGIN MENUITEM "&1x", IDM_VID_SCALE_2X MENUITEM "1,&5x", IDM_VID_SCALE_3X MENUITEM "&2x", IDM_VID_SCALE_4X + MENUITEM "&3x", IDM_VID_SCALE_5X + MENUITEM "&4x", IDM_VID_SCALE_6X + MENUITEM "&5x", IDM_VID_SCALE_7X + MENUITEM "&6x", IDM_VID_SCALE_8X + MENUITEM "&7x", IDM_VID_SCALE_9X + MENUITEM "&8x", IDM_VID_SCALE_10X END POPUP "Filteringmethode" BEGIN diff --git a/src/win/languages/en-GB.rc b/src/win/languages/en-GB.rc index 7b849bef2..a16c7977f 100644 --- a/src/win/languages/en-GB.rc +++ b/src/win/languages/en-GB.rc @@ -57,6 +57,12 @@ BEGIN MENUITEM "&1x", IDM_VID_SCALE_2X MENUITEM "1.&5x", IDM_VID_SCALE_3X MENUITEM "&2x", IDM_VID_SCALE_4X + MENUITEM "&3x", IDM_VID_SCALE_5X + MENUITEM "&4x", IDM_VID_SCALE_6X + MENUITEM "&5x", IDM_VID_SCALE_7X + MENUITEM "&6x", IDM_VID_SCALE_8X + MENUITEM "&7x", IDM_VID_SCALE_9X + MENUITEM "&8x", IDM_VID_SCALE_10X END POPUP "Filter method" BEGIN diff --git a/src/win/languages/en-US.rc b/src/win/languages/en-US.rc index 8f279e355..42070879d 100644 --- a/src/win/languages/en-US.rc +++ b/src/win/languages/en-US.rc @@ -57,6 +57,12 @@ BEGIN MENUITEM "&1x", IDM_VID_SCALE_2X MENUITEM "1.&5x", IDM_VID_SCALE_3X MENUITEM "&2x", IDM_VID_SCALE_4X + MENUITEM "&3x", IDM_VID_SCALE_5X + MENUITEM "&4x", IDM_VID_SCALE_6X + MENUITEM "&5x", IDM_VID_SCALE_7X + MENUITEM "&6x", IDM_VID_SCALE_8X + MENUITEM "&7x", IDM_VID_SCALE_9X + MENUITEM "&8x", IDM_VID_SCALE_10X END POPUP "Filter method" BEGIN diff --git a/src/win/languages/es-ES.rc b/src/win/languages/es-ES.rc index 3e1f746ba..8be2db827 100644 --- a/src/win/languages/es-ES.rc +++ b/src/win/languages/es-ES.rc @@ -57,6 +57,12 @@ BEGIN MENUITEM "&1x", IDM_VID_SCALE_2X MENUITEM "1.&5x", IDM_VID_SCALE_3X MENUITEM "&2x", IDM_VID_SCALE_4X + MENUITEM "&3x", IDM_VID_SCALE_5X + MENUITEM "&4x", IDM_VID_SCALE_6X + MENUITEM "&5x", IDM_VID_SCALE_7X + MENUITEM "&6x", IDM_VID_SCALE_8X + MENUITEM "&7x", IDM_VID_SCALE_9X + MENUITEM "&8x", IDM_VID_SCALE_10X END POPUP "&Método de filtrado" BEGIN diff --git a/src/win/languages/fi-FI.rc b/src/win/languages/fi-FI.rc index 1eee0df45..9f2f14187 100644 --- a/src/win/languages/fi-FI.rc +++ b/src/win/languages/fi-FI.rc @@ -57,6 +57,12 @@ BEGIN MENUITEM "&1x", IDM_VID_SCALE_2X MENUITEM "1.&5x", IDM_VID_SCALE_3X MENUITEM "&2x", IDM_VID_SCALE_4X + MENUITEM "&3x", IDM_VID_SCALE_5X + MENUITEM "&4x", IDM_VID_SCALE_6X + MENUITEM "&5x", IDM_VID_SCALE_7X + MENUITEM "&6x", IDM_VID_SCALE_8X + MENUITEM "&7x", IDM_VID_SCALE_9X + MENUITEM "&8x", IDM_VID_SCALE_10X END POPUP "&Suodatusmetodi" BEGIN diff --git a/src/win/languages/fr-FR.rc b/src/win/languages/fr-FR.rc index 29ccb911d..fcd4d480a 100644 --- a/src/win/languages/fr-FR.rc +++ b/src/win/languages/fr-FR.rc @@ -57,6 +57,12 @@ BEGIN MENUITEM "&1x", IDM_VID_SCALE_2X MENUITEM "1.&5x", IDM_VID_SCALE_3X MENUITEM "&2x", IDM_VID_SCALE_4X + MENUITEM "&3x", IDM_VID_SCALE_5X + MENUITEM "&4x", IDM_VID_SCALE_6X + MENUITEM "&5x", IDM_VID_SCALE_7X + MENUITEM "&6x", IDM_VID_SCALE_8X + MENUITEM "&7x", IDM_VID_SCALE_9X + MENUITEM "&8x", IDM_VID_SCALE_10X END POPUP "Methode Filtre" BEGIN diff --git a/src/win/languages/hr-HR.rc b/src/win/languages/hr-HR.rc index 317ceccef..fe0f9dad5 100644 --- a/src/win/languages/hr-HR.rc +++ b/src/win/languages/hr-HR.rc @@ -57,6 +57,12 @@ BEGIN MENUITEM "&1x", IDM_VID_SCALE_2X MENUITEM "1,&5x", IDM_VID_SCALE_3X MENUITEM "&2x", IDM_VID_SCALE_4X + MENUITEM "&3x", IDM_VID_SCALE_5X + MENUITEM "&4x", IDM_VID_SCALE_6X + MENUITEM "&5x", IDM_VID_SCALE_7X + MENUITEM "&6x", IDM_VID_SCALE_8X + MENUITEM "&7x", IDM_VID_SCALE_9X + MENUITEM "&8x", IDM_VID_SCALE_10X END POPUP "Metoda filtriranja" BEGIN diff --git a/src/win/languages/hu-HU.rc b/src/win/languages/hu-HU.rc index 8a90cdfe6..f23e3c35a 100644 --- a/src/win/languages/hu-HU.rc +++ b/src/win/languages/hu-HU.rc @@ -62,6 +62,12 @@ BEGIN MENUITEM "&1x", IDM_VID_SCALE_2X MENUITEM "1,&5x", IDM_VID_SCALE_3X MENUITEM "&2x", IDM_VID_SCALE_4X + MENUITEM "&3x", IDM_VID_SCALE_5X + MENUITEM "&4x", IDM_VID_SCALE_6X + MENUITEM "&5x", IDM_VID_SCALE_7X + MENUITEM "&6x", IDM_VID_SCALE_8X + MENUITEM "&7x", IDM_VID_SCALE_9X + MENUITEM "&8x", IDM_VID_SCALE_10X END POPUP "Szűrési mód" BEGIN diff --git a/src/win/languages/it-IT.rc b/src/win/languages/it-IT.rc index 38189f706..6335c690f 100644 --- a/src/win/languages/it-IT.rc +++ b/src/win/languages/it-IT.rc @@ -58,6 +58,12 @@ BEGIN MENUITEM "&1x", IDM_VID_SCALE_2X MENUITEM "1.&5x", IDM_VID_SCALE_3X MENUITEM "&2x", IDM_VID_SCALE_4X + MENUITEM "&3x", IDM_VID_SCALE_5X + MENUITEM "&4x", IDM_VID_SCALE_6X + MENUITEM "&5x", IDM_VID_SCALE_7X + MENUITEM "&6x", IDM_VID_SCALE_8X + MENUITEM "&7x", IDM_VID_SCALE_9X + MENUITEM "&8x", IDM_VID_SCALE_10X END POPUP "Metodo filtro" BEGIN diff --git a/src/win/languages/ja-JP.rc b/src/win/languages/ja-JP.rc index daf28f011..1de5e1f42 100644 --- a/src/win/languages/ja-JP.rc +++ b/src/win/languages/ja-JP.rc @@ -57,6 +57,12 @@ BEGIN MENUITEM "1x(&1)", IDM_VID_SCALE_2X MENUITEM "1.5x(&5)", IDM_VID_SCALE_3X MENUITEM "2x(&2)", IDM_VID_SCALE_4X + MENUITEM "&3x", IDM_VID_SCALE_5X + MENUITEM "&4x", IDM_VID_SCALE_6X + MENUITEM "&5x", IDM_VID_SCALE_7X + MENUITEM "&6x", IDM_VID_SCALE_8X + MENUITEM "&7x", IDM_VID_SCALE_9X + MENUITEM "&8x", IDM_VID_SCALE_10X END POPUP "フィルター方式" BEGIN diff --git a/src/win/languages/ko-KR.rc b/src/win/languages/ko-KR.rc index f967286dd..b96e21fa1 100644 --- a/src/win/languages/ko-KR.rc +++ b/src/win/languages/ko-KR.rc @@ -57,6 +57,12 @@ BEGIN MENUITEM "1배(&1)", IDM_VID_SCALE_2X MENUITEM "1.5배(&5)", IDM_VID_SCALE_3X MENUITEM "2배(&2)", IDM_VID_SCALE_4X + MENUITEM "&3배", IDM_VID_SCALE_5X + MENUITEM "&4배", IDM_VID_SCALE_6X + MENUITEM "&5배", IDM_VID_SCALE_7X + MENUITEM "&6배", IDM_VID_SCALE_8X + MENUITEM "&7배", IDM_VID_SCALE_9X + MENUITEM "&8배", IDM_VID_SCALE_10X END POPUP "필터 형식" BEGIN diff --git a/src/win/languages/pl-PL.rc b/src/win/languages/pl-PL.rc index 412076305..e4e6a4963 100644 --- a/src/win/languages/pl-PL.rc +++ b/src/win/languages/pl-PL.rc @@ -57,6 +57,12 @@ BEGIN MENUITEM "&1x", IDM_VID_SCALE_2X MENUITEM "1.&5x", IDM_VID_SCALE_3X MENUITEM "&2x", IDM_VID_SCALE_4X + MENUITEM "&3x", IDM_VID_SCALE_5X + MENUITEM "&4x", IDM_VID_SCALE_6X + MENUITEM "&5x", IDM_VID_SCALE_7X + MENUITEM "&6x", IDM_VID_SCALE_8X + MENUITEM "&7x", IDM_VID_SCALE_9X + MENUITEM "&8x", IDM_VID_SCALE_10X END POPUP "Metoda filtrowania" BEGIN diff --git a/src/win/languages/pt-BR.rc b/src/win/languages/pt-BR.rc index 46a823713..7a08080bc 100644 --- a/src/win/languages/pt-BR.rc +++ b/src/win/languages/pt-BR.rc @@ -60,6 +60,12 @@ BEGIN MENUITEM "&1x", IDM_VID_SCALE_2X MENUITEM "1,&5x", IDM_VID_SCALE_3X MENUITEM "&2x", IDM_VID_SCALE_4X + MENUITEM "&3x", IDM_VID_SCALE_5X + MENUITEM "&4x", IDM_VID_SCALE_6X + MENUITEM "&5x", IDM_VID_SCALE_7X + MENUITEM "&6x", IDM_VID_SCALE_8X + MENUITEM "&7x", IDM_VID_SCALE_9X + MENUITEM "&8x", IDM_VID_SCALE_10X END POPUP "Método de filtragem" BEGIN diff --git a/src/win/languages/pt-PT.rc b/src/win/languages/pt-PT.rc index 188b0a930..74968da02 100644 --- a/src/win/languages/pt-PT.rc +++ b/src/win/languages/pt-PT.rc @@ -57,6 +57,12 @@ BEGIN MENUITEM "&1x", IDM_VID_SCALE_2X MENUITEM "1.&5x", IDM_VID_SCALE_3X MENUITEM "&2x", IDM_VID_SCALE_4X + MENUITEM "&3x", IDM_VID_SCALE_5X + MENUITEM "&4x", IDM_VID_SCALE_6X + MENUITEM "&5x", IDM_VID_SCALE_7X + MENUITEM "&6x", IDM_VID_SCALE_8X + MENUITEM "&7x", IDM_VID_SCALE_9X + MENUITEM "&8x", IDM_VID_SCALE_10X END POPUP "Método de filtragem" BEGIN diff --git a/src/win/languages/ru-RU.rc b/src/win/languages/ru-RU.rc index 32e6ed32d..790738148 100644 --- a/src/win/languages/ru-RU.rc +++ b/src/win/languages/ru-RU.rc @@ -57,6 +57,12 @@ BEGIN MENUITEM "&1x", IDM_VID_SCALE_2X MENUITEM "1.&5x", IDM_VID_SCALE_3X MENUITEM "&2x", IDM_VID_SCALE_4X + MENUITEM "&3x", IDM_VID_SCALE_5X + MENUITEM "&4x", IDM_VID_SCALE_6X + MENUITEM "&5x", IDM_VID_SCALE_7X + MENUITEM "&6x", IDM_VID_SCALE_8X + MENUITEM "&7x", IDM_VID_SCALE_9X + MENUITEM "&8x", IDM_VID_SCALE_10X END POPUP "Метод фильтрации" BEGIN diff --git a/src/win/languages/sl-SI.rc b/src/win/languages/sl-SI.rc index 93f2c4d98..317cf51b8 100644 --- a/src/win/languages/sl-SI.rc +++ b/src/win/languages/sl-SI.rc @@ -57,6 +57,12 @@ BEGIN MENUITEM "&1x", IDM_VID_SCALE_2X MENUITEM "1.&5x", IDM_VID_SCALE_3X MENUITEM "&2x", IDM_VID_SCALE_4X + MENUITEM "&3x", IDM_VID_SCALE_5X + MENUITEM "&4x", IDM_VID_SCALE_6X + MENUITEM "&5x", IDM_VID_SCALE_7X + MENUITEM "&6x", IDM_VID_SCALE_8X + MENUITEM "&7x", IDM_VID_SCALE_9X + MENUITEM "&8x", IDM_VID_SCALE_10X END POPUP "&Metoda filtriranja" BEGIN diff --git a/src/win/languages/tr-TR.rc b/src/win/languages/tr-TR.rc index 2c72f2bdf..04a0f9abc 100644 --- a/src/win/languages/tr-TR.rc +++ b/src/win/languages/tr-TR.rc @@ -57,6 +57,12 @@ BEGIN MENUITEM "&1x", IDM_VID_SCALE_2X MENUITEM "1.&5x", IDM_VID_SCALE_3X MENUITEM "&2x", IDM_VID_SCALE_4X + MENUITEM "&3x", IDM_VID_SCALE_5X + MENUITEM "&4x", IDM_VID_SCALE_6X + MENUITEM "&5x", IDM_VID_SCALE_7X + MENUITEM "&6x", IDM_VID_SCALE_8X + MENUITEM "&7x", IDM_VID_SCALE_9X + MENUITEM "&8x", IDM_VID_SCALE_10X END POPUP "&Filtre metodu" BEGIN diff --git a/src/win/languages/uk-UA.rc b/src/win/languages/uk-UA.rc index 0dc2a544d..d8c5f1106 100644 --- a/src/win/languages/uk-UA.rc +++ b/src/win/languages/uk-UA.rc @@ -57,6 +57,12 @@ BEGIN MENUITEM "&1x", IDM_VID_SCALE_2X MENUITEM "1.&5x", IDM_VID_SCALE_3X MENUITEM "&2x", IDM_VID_SCALE_4X + MENUITEM "&3x", IDM_VID_SCALE_5X + MENUITEM "&4x", IDM_VID_SCALE_6X + MENUITEM "&5x", IDM_VID_SCALE_7X + MENUITEM "&6x", IDM_VID_SCALE_8X + MENUITEM "&7x", IDM_VID_SCALE_9X + MENUITEM "&8x", IDM_VID_SCALE_10X END POPUP "Метод фільтрації" BEGIN diff --git a/src/win/languages/zh-CN.rc b/src/win/languages/zh-CN.rc index 945194968..72d67e880 100644 --- a/src/win/languages/zh-CN.rc +++ b/src/win/languages/zh-CN.rc @@ -57,6 +57,12 @@ BEGIN MENUITEM "1x(&1)", IDM_VID_SCALE_2X MENUITEM "1.5x(&5)", IDM_VID_SCALE_3X MENUITEM "2x(&2)", IDM_VID_SCALE_4X + MENUITEM "&3x", IDM_VID_SCALE_5X + MENUITEM "&4x", IDM_VID_SCALE_6X + MENUITEM "&5x", IDM_VID_SCALE_7X + MENUITEM "&6x", IDM_VID_SCALE_8X + MENUITEM "&7x", IDM_VID_SCALE_9X + MENUITEM "&8x", IDM_VID_SCALE_10X END POPUP "过滤方式" BEGIN diff --git a/src/win/languages/zh-TW.rc b/src/win/languages/zh-TW.rc index 6e5ed0321..9cbb7c70e 100644 --- a/src/win/languages/zh-TW.rc +++ b/src/win/languages/zh-TW.rc @@ -57,6 +57,12 @@ BEGIN MENUITEM "1x(&1)", IDM_VID_SCALE_2X MENUITEM "1.5x(&5)", IDM_VID_SCALE_3X MENUITEM "2x(&2)", IDM_VID_SCALE_4X + MENUITEM "&3x", IDM_VID_SCALE_5X + MENUITEM "&4x", IDM_VID_SCALE_6X + MENUITEM "&5x", IDM_VID_SCALE_7X + MENUITEM "&6x", IDM_VID_SCALE_8X + MENUITEM "&7x", IDM_VID_SCALE_9X + MENUITEM "&8x", IDM_VID_SCALE_10X END POPUP "過濾方式" BEGIN diff --git a/src/win/win_specify_dim.c b/src/win/win_specify_dim.c index 184c39d4f..30698fac6 100644 --- a/src/win/win_specify_dim.c +++ b/src/win/win_specify_dim.c @@ -130,6 +130,12 @@ SpecifyDimensionsDialogProcedure(HWND hdlg, UINT message, WPARAM wParam, LPARAM EnableMenuItem(hmenu, IDM_VID_SCALE_2X, vid_resize ? MF_GRAYED : MF_ENABLED); EnableMenuItem(hmenu, IDM_VID_SCALE_3X, vid_resize ? MF_GRAYED : MF_ENABLED); EnableMenuItem(hmenu, IDM_VID_SCALE_4X, vid_resize ? MF_GRAYED : MF_ENABLED); + EnableMenuItem(hmenu, IDM_VID_SCALE_5X, vid_resize ? MF_GRAYED : MF_ENABLED); + EnableMenuItem(hmenu, IDM_VID_SCALE_6X, vid_resize ? MF_GRAYED : MF_ENABLED); + EnableMenuItem(hmenu, IDM_VID_SCALE_7X, vid_resize ? MF_GRAYED : MF_ENABLED); + EnableMenuItem(hmenu, IDM_VID_SCALE_8X, vid_resize ? MF_GRAYED : MF_ENABLED); + EnableMenuItem(hmenu, IDM_VID_SCALE_9X, vid_resize ? MF_GRAYED : MF_ENABLED); + EnableMenuItem(hmenu, IDM_VID_SCALE_10X, vid_resize ? MF_GRAYED : MF_ENABLED); scrnsz_x = fixed_size_x; scrnsz_y = fixed_size_y; diff --git a/src/win/win_ui.c b/src/win/win_ui.c index 63db0176b..8eefb1ccd 100644 --- a/src/win/win_ui.c +++ b/src/win/win_ui.c @@ -278,6 +278,12 @@ ResetAllMenus(void) CheckMenuItem(menuMain, IDM_VID_SCALE_1X + 1, MF_UNCHECKED); CheckMenuItem(menuMain, IDM_VID_SCALE_1X + 2, MF_UNCHECKED); CheckMenuItem(menuMain, IDM_VID_SCALE_1X + 3, MF_UNCHECKED); + CheckMenuItem(menuMain, IDM_VID_SCALE_1X + 4, MF_UNCHECKED); + CheckMenuItem(menuMain, IDM_VID_SCALE_1X + 5, MF_UNCHECKED); + CheckMenuItem(menuMain, IDM_VID_SCALE_1X + 6, MF_UNCHECKED); + CheckMenuItem(menuMain, IDM_VID_SCALE_1X + 7, MF_UNCHECKED); + CheckMenuItem(menuMain, IDM_VID_SCALE_1X + 8, MF_UNCHECKED); + CheckMenuItem(menuMain, IDM_VID_SCALE_1X + 9, MF_UNCHECKED); CheckMenuItem(menuMain, IDM_VID_HIDPI, MF_UNCHECKED); CheckMenuItem(menuMain, IDM_VID_CGACON, MF_UNCHECKED); From a7236a9022b865504fed39f3d37d8b43cc70edf0 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Mon, 6 Feb 2023 04:12:46 -0500 Subject: [PATCH 215/285] Make dual video card code use array --- src/86box.c | 19 ++++++------- src/config.c | 16 +++++------ src/device/keyboard_at.c | 2 +- src/device/keyboard_xt.c | 2 +- src/device/phoenix_486_jumper.c | 2 +- src/include/86box/86box.h | 2 +- src/include/86box/video.h | 1 - src/machine/m_amstrad.c | 4 +-- src/machine/m_at_286_386sx.c | 14 ++++----- src/machine/m_at_386dx_486.c | 14 ++++----- src/machine/m_at_compaq.c | 6 ++-- src/machine/m_at_slot1.c | 2 +- src/machine/m_at_socket4.c | 2 +- src/machine/m_at_socket7.c | 4 +-- src/machine/m_at_socket7_3v.c | 8 +++--- src/machine/m_elt.c | 2 +- src/machine/m_europc.c | 2 +- src/machine/m_pcjr.c | 2 +- src/machine/m_ps1.c | 2 +- src/machine/m_ps2_mca.c | 8 +++--- src/machine/m_tandy.c | 2 +- src/machine/m_v86p.c | 2 +- src/machine/m_xt_olivetti.c | 6 ++-- src/machine/m_xt_t1000.c | 4 +-- src/machine/machine.c | 6 ++-- src/qt/qt_settingsdisplay.cpp | 28 +++++++++--------- src/qt/qt_settingsdisplay.hpp | 5 ++-- src/unix/unix.c | 4 +-- src/video/vid_table.c | 8 +++--- src/win/win.c | 4 +-- src/win/win_settings.c | 50 ++++++++++++++++----------------- 31 files changed, 115 insertions(+), 118 deletions(-) diff --git a/src/86box.c b/src/86box.c index 32724802c..fb96ed87e 100644 --- a/src/86box.c +++ b/src/86box.c @@ -166,8 +166,7 @@ int bugger_enabled = 0; /* (C) enable ISAbug int postcard_enabled = 0; /* (C) enable POST card */ 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 = 0; /* (C) graphics/video card */ -int gfxcard_2 = 0; /* (C) graphics/video card */ +int gfxcard[2] = { 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 */ @@ -869,34 +868,34 @@ pc_init_modules(void) } /* Make sure we have a usable video card. */ - if (!video_card_available(gfxcard)) { + if (!video_card_available(gfxcard[0])) { memset(tempc, 0, sizeof(tempc)); - device_get_name(video_card_getdevice(gfxcard), 0, tempc); + device_get_name(video_card_getdevice(gfxcard[0]), 0, tempc); swprintf(temp, sizeof(temp), plat_get_string(IDS_2064), tempc); c = 0; while (video_get_internal_name(c) != NULL) { - gfxcard = -1; + gfxcard[0] = -1; if (video_card_available(c)) { ui_msgbox_header(MBX_INFO, (wchar_t *) IDS_2129, temp); - gfxcard = c; + gfxcard[0] = c; config_save(); break; } c++; } - if (gfxcard == -1) { + if (gfxcard[0] == -1) { fatal("No available video cards\n"); exit(-1); return (0); } } - if (!video_card_available(gfxcard_2)) { + if (!video_card_available(gfxcard[1])) { char tempc[512] = { 0 }; - device_get_name(video_card_getdevice(gfxcard_2), 0, tempc); + device_get_name(video_card_getdevice(gfxcard[1]), 0, tempc); swprintf(temp, sizeof(temp), (wchar_t *) "Video card #2 \"%hs\" is not available due to missing ROMs in the roms/video directory. Disabling the second video card.", tempc); ui_msgbox_header(MBX_INFO, (wchar_t *) IDS_2129, temp); - gfxcard_2 = 0; + gfxcard[1] = 0; } atfullspeed = 0; diff --git a/src/config.c b/src/config.c index f573d3d4b..a0f9a71f0 100644 --- a/src/config.c +++ b/src/config.c @@ -530,7 +530,7 @@ load_video(void) if (machine_has_flags(machine, MACHINE_VIDEO_ONLY)) { ini_section_delete_var(cat, "gfxcard"); - gfxcard = VID_INTERNAL; + gfxcard[0] = VID_INTERNAL; } else { p = ini_section_get_string(cat, "gfxcard", NULL); if (p == NULL) { @@ -544,9 +544,9 @@ load_video(void) free_p = 1; } if (!strcmp(p, "virge375_vbe20_pci")) /* migrate renamed cards */ - gfxcard = video_get_video_from_internal_name("virge385_pci"); + gfxcard[0] = video_get_video_from_internal_name("virge385_pci"); else - gfxcard = video_get_video_from_internal_name(p); + gfxcard[0] = video_get_video_from_internal_name(p); if (free_p) free(p); } @@ -560,7 +560,7 @@ load_video(void) p = ini_section_get_string(cat, "gfxcard_2", NULL); if (!p) p = "none"; - gfxcard_2 = video_get_video_from_internal_name(p); + gfxcard[1] = video_get_video_from_internal_name(p); } /* Load "Input Devices" section. */ @@ -1851,7 +1851,7 @@ config_load(void) dpi_scale = 1; fpu_type = fpu_get_type(cpu_f, cpu, "none"); - gfxcard = video_get_video_from_internal_name("cga"); + gfxcard[0] = video_get_video_from_internal_name("cga"); vid_api = plat_vidapi("default"); vid_resize = 0; video_fullscreen_first = 1; @@ -2235,7 +2235,7 @@ save_video(void) ini_section_t cat = ini_find_or_create_section(config, "Video"); ini_section_set_string(cat, "gfxcard", - video_get_internal_name(gfxcard)); + video_get_internal_name(gfxcard[0])); if (voodoo_enabled == 0) ini_section_delete_var(cat, "voodoo"); @@ -2252,10 +2252,10 @@ save_video(void) else ini_section_set_int(cat, "xga", xga_enabled); - if (gfxcard_2 == 0) + if (gfxcard[1] == 0) ini_section_delete_var(cat, "gfxcard_2"); else - ini_section_set_string(cat, "gfxcard_2", video_get_internal_name(gfxcard_2)); + ini_section_set_string(cat, "gfxcard_2", video_get_internal_name(gfxcard[1])); if (show_second_monitors == 1) ini_section_delete_var(cat, "show_second_monitors"); diff --git a/src/device/keyboard_at.c b/src/device/keyboard_at.c index dc385c011..c71213aa6 100644 --- a/src/device/keyboard_at.c +++ b/src/device/keyboard_at.c @@ -2491,7 +2491,7 @@ kbd_init(const device_t *info) dev->flags = info->local; - video_reset(gfxcard); + video_reset(gfxcard[0]); kbd_reset(dev); io_sethandler(0x0060, 1, kbd_read, NULL, NULL, kbd_write, NULL, NULL, dev); diff --git a/src/device/keyboard_xt.c b/src/device/keyboard_xt.c index 676f99f54..fe523cd2f 100644 --- a/src/device/keyboard_xt.c +++ b/src/device/keyboard_xt.c @@ -730,7 +730,7 @@ kbd_init(const device_t *info) key_queue_start = key_queue_end = 0; - video_reset(gfxcard); + video_reset(gfxcard[0]); if ((kbd->type == KBD_TYPE_PC81) || (kbd->type == KBD_TYPE_PC82) || (kbd->type == KBD_TYPE_PRAVETZ) || (kbd->type == KBD_TYPE_XT82) || diff --git a/src/device/phoenix_486_jumper.c b/src/device/phoenix_486_jumper.c index 357240ba7..d5e833404 100644 --- a/src/device/phoenix_486_jumper.c +++ b/src/device/phoenix_486_jumper.c @@ -91,7 +91,7 @@ phoenix_486_jumper_reset(void *priv) dev->jumper = 0x00; else { dev->jumper = 0x9f; - if (gfxcard != 0x01) + if (gfxcard[0] != 0x01) dev->jumper |= 0x40; } } diff --git a/src/include/86box/86box.h b/src/include/86box/86box.h index ca8d797cc..b88fa24ef 100644 --- a/src/include/86box/86box.h +++ b/src/include/86box/86box.h @@ -107,7 +107,7 @@ extern int vid_cga_contrast, /* (C) video */ video_filter_method, /* (C) video */ video_vsync, /* (C) video */ video_framerate, /* (C) video */ - gfxcard; /* (C) graphics/video card */ + gfxcard[2]; /* (C) graphics/video card */ extern char video_shader[512]; /* (C) video */ extern int bugger_enabled, /* (C) enable ISAbugger */ postcard_enabled, /* (C) enable POST card */ diff --git a/src/include/86box/video.h b/src/include/86box/video.h index 6f35dc5ee..a49f3bf34 100644 --- a/src/include/86box/video.h +++ b/src/include/86box/video.h @@ -132,7 +132,6 @@ extern monitor_t monitors[MONITORS_NUM]; extern monitor_settings_t monitor_settings[MONITORS_NUM]; extern atomic_bool doresize_monitors[MONITORS_NUM]; extern int monitor_index_global; -extern int gfxcard_2; extern int show_second_monitors; extern int video_fullscreen_scale_maximized; diff --git a/src/machine/m_amstrad.c b/src/machine/m_amstrad.c index 89f8f5670..a37427de1 100644 --- a/src/machine/m_amstrad.c +++ b/src/machine/m_amstrad.c @@ -2474,9 +2474,9 @@ machine_amstrad_init(const machine_t *model, int type) ams->language = 7; - video_reset(gfxcard); + video_reset(gfxcard[0]); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) switch (type) { case AMS_PC1512: loadfont("roms/machines/pc1512/40078", 8); diff --git a/src/machine/m_at_286_386sx.c b/src/machine/m_at_286_386sx.c index 253ce804d..54e7d6b9e 100644 --- a/src/machine/m_at_286_386sx.c +++ b/src/machine/m_at_286_386sx.c @@ -114,7 +114,7 @@ machine_at_ama932j_init(const machine_t *model) machine_at_common_ide_init(model); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&oti067_ama932j_device); machine_at_headland_common_init(2); @@ -420,7 +420,7 @@ machine_at_spc4620p_init(const machine_t *model) if (bios_only || !ret) return ret; - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&ati28800k_spc4620p_device); machine_at_scat_init(model, 1, 1); @@ -527,7 +527,7 @@ machine_at_wd76c10_init(const machine_t *model) machine_at_common_init(model); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(¶dise_wd90c11_megapc_device); device_add(&keyboard_ps2_quadtel_device); @@ -591,7 +591,7 @@ machine_at_cmdsl386sx25_init(const machine_t *model) if (bios_only || !ret) return ret; - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&gd5402_onboard_device); machine_at_scamp_common_init(model, 1); @@ -626,7 +626,7 @@ machine_at_spc6033p_init(const machine_t *model) if (bios_only || !ret) return ret; - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&ati28800k_spc6033p_device); machine_at_scamp_common_init(model, 1); @@ -711,7 +711,7 @@ machine_at_flytech386_init(const machine_t *model) device_add(&ali1217_device); device_add(&w83787f_ide_en_device); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&tvga8900d_device); device_add(&keyboard_ps2_device); @@ -833,7 +833,7 @@ machine_at_3302_init(const machine_t *model) if (fdc_type == FDC_INTERNAL) device_add(&fdc_at_device); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(¶dise_pvga1a_ncr3302_device); device_add(&keyboard_at_ncr_device); diff --git a/src/machine/m_at_386dx_486.c b/src/machine/m_at_386dx_486.c index 036eac550..eeebbb784 100644 --- a/src/machine/m_at_386dx_486.c +++ b/src/machine/m_at_386dx_486.c @@ -168,7 +168,7 @@ machine_at_valuepoint433_init(const machine_t *model) // hangs without the PS/2 machine_at_common_ide_init(model); device_add(&sis_85c461_device); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&et4000w32_onboard_device); device_add(&keyboard_ps2_device); @@ -310,7 +310,7 @@ machine_at_pb410a_init(const machine_t *model) device_add(&phoenix_486_jumper_device); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&ht216_32_pb410a_device); return ret; @@ -331,7 +331,7 @@ machine_at_vect486vl_init(const machine_t *model) // has HDC problems device_add(&vl82c480_device); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&gd5428_onboard_device); device_add(&keyboard_ps2_ami_device); @@ -355,7 +355,7 @@ machine_at_d824_init(const machine_t *model) device_add(&vl82c480_device); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&gd5428_onboard_device); device_add(&keyboard_ps2_device); @@ -378,7 +378,7 @@ machine_at_acera1g_init(const machine_t *model) machine_at_common_init(model); device_add(&ali1429g_device); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&gd5428_onboard_device); device_add(&keyboard_ps2_acer_pci_device); @@ -428,7 +428,7 @@ machine_at_decpclpv_init(const machine_t *model) device_add(&sis_85c461_device); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&s3_86c805_onboard_vlb_device); /* TODO: Phoenix MultiKey KBC */ @@ -1365,7 +1365,7 @@ machine_at_sbc490_init(const machine_t *model) device_add(&ali1489_device); device_add(&fdc37c665_device); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&tgui9440_onboard_pci_device); device_add(&keyboard_ps2_ami_device); diff --git a/src/machine/m_at_compaq.c b/src/machine/m_at_compaq.c index 0b3a901b5..e74261b8a 100644 --- a/src/machine/m_at_compaq.c +++ b/src/machine/m_at_compaq.c @@ -787,21 +787,21 @@ machine_at_compaq_init(const machine_t *model, int type) write_ram, write_ramw, write_raml, 0xa0000 + ram, MEM_MAPPING_INTERNAL, NULL); - video_reset(gfxcard); + video_reset(gfxcard[0]); switch (type) { case COMPAQ_PORTABLEII: break; case COMPAQ_PORTABLEIII: - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&compaq_plasma_device); break; case COMPAQ_PORTABLEIII386: if (hdc_current == 1) device_add(&ide_isa_device); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&compaq_plasma_device); break; diff --git a/src/machine/m_at_slot1.c b/src/machine/m_at_slot1.c index c30f39603..3cedb669a 100644 --- a/src/machine/m_at_slot1.c +++ b/src/machine/m_at_slot1.c @@ -663,7 +663,7 @@ machine_at_ms6168_common_init(const machine_t *model) device_add(&piix4e_device); device_add(&w83977ef_device); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&voodoo_3_2000_agp_onboard_8m_device); device_add(&keyboard_ps2_ami_pci_device); diff --git a/src/machine/m_at_socket4.c b/src/machine/m_at_socket4.c index 2aa94cce5..ef745d088 100644 --- a/src/machine/m_at_socket4.c +++ b/src/machine/m_at_socket4.c @@ -345,7 +345,7 @@ machine_at_pb520r_init(const machine_t *model) device_add(&i430lx_device); device_add(&ide_cmd640_pci_single_channel_device); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&gd5434_onboard_pci_device); device_add(&keyboard_ps2_pci_device); diff --git a/src/machine/m_at_socket7.c b/src/machine/m_at_socket7.c index f7faae167..0e76ac1c9 100644 --- a/src/machine/m_at_socket7.c +++ b/src/machine/m_at_socket7.c @@ -398,7 +398,7 @@ machine_at_presario2240_init(const machine_t *model) pci_register_slot(0x14, PCI_CARD_VIDEO, 3, 0, 0, 0); pci_register_slot(0x13, PCI_CARD_NORMAL, 1, 2, 3, 4); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&s3_trio64v2_dx_onboard_pci_device); device_add(&i430vx_device); @@ -429,7 +429,7 @@ machine_at_presario4500_init(const machine_t *model) pci_register_slot(0x14, PCI_CARD_VIDEO, 3, 0, 0, 0); pci_register_slot(0x13, PCI_CARD_NORMAL, 1, 2, 3, 4); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&s3_trio64v2_dx_onboard_pci_device); device_add(&i430vx_device); diff --git a/src/machine/m_at_socket7_3v.c b/src/machine/m_at_socket7_3v.c index 03be14c37..55a5068d9 100644 --- a/src/machine/m_at_socket7_3v.c +++ b/src/machine/m_at_socket7_3v.c @@ -58,7 +58,7 @@ machine_at_thor_common_init(const machine_t *model, int mr) pci_register_slot(0x10, PCI_CARD_NORMAL, 4, 3, 2, 1); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&s3_phoenix_trio64vplus_onboard_pci_device); // device_add(&keyboard_ps2_ami_pci_device); @@ -222,7 +222,7 @@ machine_at_endeavor_init(const machine_t *model) pci_register_slot(0x10, PCI_CARD_NORMAL, 4, 1, 2, 3); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&s3_phoenix_trio64_onboard_pci_device); device_add(&keyboard_ps2_intel_ami_pci_device); @@ -286,7 +286,7 @@ machine_at_pb640_init(const machine_t *model) device_add(&i430fx_rev02_device); device_add(&piix_rev02_device); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&gd5440_onboard_pci_device); device_add(&keyboard_ps2_intel_ami_pci_device); @@ -616,7 +616,7 @@ machine_at_vectra54_init(const machine_t *model) pci_register_slot(0x07, PCI_CARD_NORMAL, 2, 3, 4, 1); pci_register_slot(0x08, PCI_CARD_NORMAL, 3, 4, 1, 2); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&s3_phoenix_trio64_onboard_pci_device); device_add(&keyboard_ps2_ami_pci_device); diff --git a/src/machine/m_elt.c b/src/machine/m_elt.c index 81647612c..0370b45a2 100644 --- a/src/machine/m_elt.c +++ b/src/machine/m_elt.c @@ -178,7 +178,7 @@ machine_elt_init(const machine_t *model) if (fdc_type == FDC_INTERNAL) device_add(&fdc_xt_device); - if (gfxcard == VID_INTERNAL) { + if (gfxcard[0] == VID_INTERNAL) { cga = device_add(&cga_device); io_removehandler(0x03d0, 0x0010, cga_in, NULL, NULL, cga_out, NULL, NULL, cga); io_sethandler(0x03d0, 0x0010, elt_vid_in, NULL, NULL, elt_vid_out, NULL, NULL, cga); diff --git a/src/machine/m_europc.c b/src/machine/m_europc.c index 116e10e5f..b1368dd5d 100644 --- a/src/machine/m_europc.c +++ b/src/machine/m_europc.c @@ -549,7 +549,7 @@ europc_boot(const device_t *info) * with values set by the user. */ b = (sys->nvr.regs[MRTC_CONF_D] & ~0x17); - video_reset(gfxcard); + video_reset(gfxcard[0]); if (video_is_cga()) b |= 0x12; /* external video, CGA80 */ else if (video_is_mda()) diff --git a/src/machine/m_pcjr.c b/src/machine/m_pcjr.c index b03272f3d..0b1f8ec58 100644 --- a/src/machine/m_pcjr.c +++ b/src/machine/m_pcjr.c @@ -781,7 +781,7 @@ machine_pcjr_init(const machine_t *model) cpu_set(); /* Initialize the video controller. */ - video_reset(gfxcard); + video_reset(gfxcard[0]); loadfont("roms/video/mda/mda.rom", 0); mem_mapping_add(&pcjr->mapping, 0xb8000, 0x08000, vid_read, NULL, NULL, diff --git a/src/machine/m_ps1.c b/src/machine/m_ps1.c index 209b5d7a4..d002ba6bd 100644 --- a/src/machine/m_ps1.c +++ b/src/machine/m_ps1.c @@ -300,7 +300,7 @@ ps1_setup(int model) 0xfc0000, 0x40000, 0x3ffff, 0, MEM_MAPPING_EXTERNAL); /* Initialize the video controller. */ - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&ibm_ps1_2121_device); device_add(&fdc_at_ps1_device); diff --git a/src/machine/m_ps2_mca.c b/src/machine/m_ps2_mca.c index f77b6f4a0..5057b65ea 100644 --- a/src/machine/m_ps2_mca.c +++ b/src/machine/m_ps2_mca.c @@ -950,7 +950,7 @@ ps2_mca_board_model_50_init(int slots) ps2_mca_mem_fffc_init(2); } - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&ps1vga_mca_device); } @@ -1008,7 +1008,7 @@ ps2_mca_board_model_55sx_init(int has_sec_nvram, int slots) ps2.planar_read = model_55sx_read; ps2.planar_write = model_55sx_write; - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&ps1vga_mca_device); model_55sx_mem_recalc(); @@ -1244,7 +1244,7 @@ ps2_mca_board_model_70_type34_init(int is_type4, int slots) } } - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&ps1vga_mca_device); } @@ -1318,7 +1318,7 @@ ps2_mca_board_model_80_type2_init(int is486) } } - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&ps1vga_mca_device); ps2.split_size = 0; diff --git a/src/machine/m_tandy.c b/src/machine/m_tandy.c index 0eddc1e19..04f5e5381 100644 --- a/src/machine/m_tandy.c +++ b/src/machine/m_tandy.c @@ -1437,7 +1437,7 @@ machine_tandy1k_init(const machine_t *model, int type) if (fdc_type == FDC_INTERNAL) device_add(&fdc_xt_tandy_device); - video_reset(gfxcard); + video_reset(gfxcard[0]); switch (type) { case TYPE_TANDY: diff --git a/src/machine/m_v86p.c b/src/machine/m_v86p.c index 03bfda842..af90ab629 100644 --- a/src/machine/m_v86p.c +++ b/src/machine/m_v86p.c @@ -90,7 +90,7 @@ machine_v86p_init(const machine_t *model) if (fdc_type == FDC_INTERNAL) device_add(&fdc_xt_device); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&f82c425_video_device); if (hdc_current <= 1) diff --git a/src/machine/m_xt_olivetti.c b/src/machine/m_xt_olivetti.c index bb52c2049..e9c24f88f 100644 --- a/src/machine/m_xt_olivetti.c +++ b/src/machine/m_xt_olivetti.c @@ -1807,9 +1807,9 @@ machine_xt_m24_init(const machine_t *model) mm58174_init(nvr, model->nvrmask + 1); - video_reset(gfxcard); + video_reset(gfxcard[0]); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&ogc_m24_device); pit_devs[0].set_out_func(pit_devs[0].data, 1, pit_refresh_timer_xt); @@ -1919,7 +1919,7 @@ machine_xt_m19_init(const machine_t *model) nmi_init(); - video_reset(gfxcard); + video_reset(gfxcard[0]); m19_vid_init(vid); device_add_ex(&m19_vid_device, vid); diff --git a/src/machine/m_xt_t1000.c b/src/machine/m_xt_t1000.c index f6f2e5322..f632003ac 100644 --- a/src/machine/m_xt_t1000.c +++ b/src/machine/m_xt_t1000.c @@ -897,7 +897,7 @@ machine_xt_t1000_init(const machine_t *model) t1000_nvr_load(); nvr_set_ven_save(t1000_nvr_save); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&t1000_video_device); return ret; @@ -957,7 +957,7 @@ machine_xt_t1200_init(const machine_t *model) t1200_nvr_load(); nvr_set_ven_save(t1200_nvr_save); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&t1200_video_device); if (hdc_current <= 1) diff --git a/src/machine/machine.c b/src/machine/machine.c index f7970d4f1..7a69f4879 100644 --- a/src/machine/machine.c +++ b/src/machine/machine.c @@ -96,7 +96,7 @@ machine_init_ex(int m) /* Prepare some video-related things if we're using internal or no video. */ - video_pre_reset(gfxcard); + video_pre_reset(gfxcard[0]); /* Reset any ISA memory cards. */ isamem_reset(); @@ -112,7 +112,7 @@ machine_init_ex(int m) if (bios_only || !ret) return ret; - if (gfxcard != VID_NONE) { + if (gfxcard[0] != VID_NONE) { if (ibm8514_enabled) { ibm8514_device_add(); } @@ -122,7 +122,7 @@ machine_init_ex(int m) /* Reset the graphics card (or do nothing if it was already done by the machine's init function). */ - video_reset(gfxcard); + video_reset(gfxcard[0]); return ret; } diff --git a/src/qt/qt_settingsdisplay.cpp b/src/qt/qt_settingsdisplay.cpp index 10321cb2c..e64dc74dd 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 = gfxcard; - videoCard_2 = gfxcard_2; + videoCard[0] = gfxcard[0]; + videoCard[1] = gfxcard[1]; onCurrentMachineChanged(machine); } @@ -49,8 +49,8 @@ SettingsDisplay::~SettingsDisplay() void SettingsDisplay::save() { - gfxcard = ui->comboBoxVideo->currentData().toInt(); - gfxcard_2 = ui->comboBoxVideoSecondary->currentData().toInt(); + gfxcard[0] = ui->comboBoxVideo->currentData().toInt(); + gfxcard[1] = ui->comboBoxVideoSecondary->currentData().toInt(); voodoo_enabled = ui->checkBoxVoodoo->isChecked() ? 1 : 0; ibm8514_enabled = ui->checkBox8514->isChecked() ? 1 : 0; xga_enabled = ui->checkBoxXga->isChecked() ? 1 : 0; @@ -61,7 +61,7 @@ SettingsDisplay::onCurrentMachineChanged(int machineId) { // win_settings_video_proc, WM_INITDIALOG this->machineId = machineId; - auto curVideoCard = videoCard; + auto curVideoCard = videoCard[0]; auto *model = ui->comboBoxVideo->model(); auto removeRows = model->rowCount(); @@ -103,7 +103,7 @@ SettingsDisplay::onCurrentMachineChanged(int machineId) ui->pushButtonConfigureSecondary->setEnabled(true); } ui->comboBoxVideo->setCurrentIndex(selectedRow); - if (gfxcard_2 == 0) + if (gfxcard[1] == 0) ui->pushButtonConfigureSecondary->setEnabled(false); } @@ -136,9 +136,9 @@ SettingsDisplay::on_comboBoxVideo_currentIndexChanged(int index) if (index < 0) { return; } - auto curVideoCard_2 = videoCard_2; - videoCard = ui->comboBoxVideo->currentData().toInt(); - ui->pushButtonConfigure->setEnabled(video_card_has_config(videoCard) > 0); + auto curVideoCard_2 = videoCard[1]; + videoCard[0] = ui->comboBoxVideo->currentData().toInt(); + ui->pushButtonConfigure->setEnabled(video_card_has_config(videoCard[0]) > 0); bool machineHasPci = machine_has_bus(machineId, MACHINE_BUS_PCI) > 0; ui->checkBoxVoodoo->setEnabled(machineHasPci); @@ -167,7 +167,7 @@ SettingsDisplay::on_comboBoxVideo_currentIndexChanged(int index) ui->comboBoxVideoSecondary->setCurrentIndex(0); // TODO: Implement support for selecting non-MDA secondary cards properly when MDA cards are the primary ones. - if (video_card_get_flags(videoCard) == VIDEO_FLAG_TYPE_MDA) { + if (video_card_get_flags(videoCard[0]) == VIDEO_FLAG_TYPE_MDA) { ui->comboBoxVideoSecondary->setCurrentIndex(0); return; } @@ -178,7 +178,7 @@ SettingsDisplay::on_comboBoxVideo_currentIndexChanged(int index) break; } - if (video_card_available(c) && device_is_valid(video_dev, machineId) && !(video_card_get_flags(c) == video_card_get_flags(videoCard) && (video_card_get_flags(c) != VIDEO_FLAG_TYPE_SPECIAL))) { + if (video_card_available(c) && device_is_valid(video_dev, machineId) && !(video_card_get_flags(c) == video_card_get_flags(videoCard[0]) && (video_card_get_flags(c) != VIDEO_FLAG_TYPE_SPECIAL))) { ui->comboBoxVideoSecondary->addItem(name, c); if (c == curVideoCard_2) ui->comboBoxVideoSecondary->setCurrentIndex(ui->comboBoxVideoSecondary->count() - 1); @@ -187,7 +187,7 @@ SettingsDisplay::on_comboBoxVideo_currentIndexChanged(int index) c++; } - if (videoCard_2 == 0 || (machine_has_flags(machineId, MACHINE_VIDEO_ONLY) > 0)) { + if (videoCard[1] == 0 || (machine_has_flags(machineId, MACHINE_VIDEO_ONLY) > 0)) { ui->comboBoxVideoSecondary->setCurrentIndex(0); ui->pushButtonConfigureSecondary->setEnabled(false); } @@ -212,8 +212,8 @@ SettingsDisplay::on_comboBoxVideoSecondary_currentIndexChanged(int index) ui->pushButtonConfigureSecondary->setEnabled(false); return; } - videoCard_2 = ui->comboBoxVideoSecondary->currentData().toInt(); - ui->pushButtonConfigureSecondary->setEnabled(index != 0 && video_card_has_config(videoCard_2) > 0); + videoCard[1] = ui->comboBoxVideoSecondary->currentData().toInt(); + ui->pushButtonConfigureSecondary->setEnabled(index != 0 && video_card_has_config(videoCard[1]) > 0); } void diff --git a/src/qt/qt_settingsdisplay.hpp b/src/qt/qt_settingsdisplay.hpp index c02e55ce0..8331bbb5b 100644 --- a/src/qt/qt_settingsdisplay.hpp +++ b/src/qt/qt_settingsdisplay.hpp @@ -35,9 +35,8 @@ private slots: private: Ui::SettingsDisplay *ui; - int machineId = 0; - int videoCard = 0; - int videoCard_2 = 0; + int machineId = 0; + int videoCard[2] = { 0, 0 }; }; #endif // QT_SETTINGSDISPLAY_HPP diff --git a/src/unix/unix.c b/src/unix/unix.c index b9e842280..730d5be4c 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -1074,7 +1074,7 @@ monitor_thread(void *param) #endif } -extern int gfxcard_2; +extern int gfxcard[2]; int main(int argc, char **argv) { @@ -1089,7 +1089,7 @@ main(int argc, char **argv) return 6; } - gfxcard_2 = 0; + gfxcard[1] = 0; eventthread = SDL_ThreadID(); blitmtx = SDL_CreateMutex(); if (!blitmtx) { diff --git a/src/video/vid_table.c b/src/video/vid_table.c index 92b82d17a..fb6624ced 100644 --- a/src/video/vid_table.c +++ b/src/video/vid_table.c @@ -331,7 +331,7 @@ video_reset(int card) if ((video_get_type() != VIDEO_FLAG_TYPE_NONE) && was_reset) return; - vid_table_log("VIDEO: reset (gfxcard=%d, internal=%d)\n", + vid_table_log("VIDEO: reset (gfxcard[0]=%d, internal=%d)\n", card, machine_has_flags(machine, MACHINE_VIDEO) ? 1 : 0); monitor_index_global = 0; @@ -349,11 +349,11 @@ video_reset(int card) if (!(card == VID_NONE) && !machine_has_flags(machine, MACHINE_VIDEO_ONLY) - && gfxcard_2 != 0 - && device_is_valid(video_card_getdevice(gfxcard_2), machine)) { + && gfxcard[1] != 0 + && device_is_valid(video_card_getdevice(gfxcard[1]), machine)) { video_monitor_init(1); monitor_index_global = 1; - device_add(video_cards[gfxcard_2].device); + device_add(video_cards[gfxcard[1]].device); monitor_index_global = 0; } diff --git a/src/win/win.c b/src/win/win.c index 3dd41fca9..69561036d 100644 --- a/src/win/win.c +++ b/src/win/win.c @@ -488,8 +488,8 @@ WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpszArg, int nCmdShow) return (1); } - extern int gfxcard_2; - gfxcard_2 = 0; + extern int gfxcard[2]; + gfxcard[1] = 0; /* Create console window. */ if (force_debug) { diff --git a/src/win/win_settings.c b/src/win/win_settings.c index ea8d356b9..37a8aafb0 100644 --- a/src/win/win_settings.c +++ b/src/win/win_settings.c @@ -93,7 +93,7 @@ static int temp_dynarec; #endif /* Video category */ -static int temp_gfxcard, temp_gfxcard_2, temp_ibm8514, temp_voodoo, temp_xga; +static int temp_gfxcard[2], temp_ibm8514, temp_voodoo, temp_xga; /* Input devices category */ static int temp_mouse, temp_joystick; @@ -326,8 +326,8 @@ win_settings_init(void) temp_sync = time_sync; /* Video category */ - temp_gfxcard = gfxcard; - temp_gfxcard_2 = gfxcard_2; + temp_gfxcard[0] = gfxcard[0]; + temp_gfxcard[1] = gfxcard[1]; temp_voodoo = voodoo_enabled; temp_ibm8514 = ibm8514_enabled; temp_xga = xga_enabled; @@ -453,8 +453,8 @@ win_settings_changed(void) i = i || (temp_sync != time_sync); /* Video category */ - i = i || (gfxcard != temp_gfxcard); - i = i || (gfxcard_2 != temp_gfxcard_2); + i = i || (gfxcard[0] != temp_gfxcard[0]); + i = i || (gfxcard[1] != temp_gfxcard[1]); i = i || (voodoo_enabled != temp_voodoo); i = i || (ibm8514_enabled != temp_ibm8514); i = i || (xga_enabled != temp_xga); @@ -546,8 +546,8 @@ win_settings_save(void) time_sync = temp_sync; /* Video category */ - gfxcard = temp_gfxcard; - gfxcard_2 = temp_gfxcard_2; + gfxcard[0] = temp_gfxcard[0]; + gfxcard[1] = temp_gfxcard[1]; voodoo_enabled = temp_voodoo; ibm8514_enabled = temp_ibm8514; xga_enabled = temp_xga; @@ -1090,7 +1090,7 @@ win_settings_video_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) else settings_add_string(hdlg, IDC_COMBO_VIDEO, (LPARAM) device_name); settings_list_to_device[0][d] = c; - if ((c == 0) || (c == temp_gfxcard)) + if ((c == 0) || (c == temp_gfxcard[0])) settings_set_cur_sel(hdlg, IDC_COMBO_VIDEO, d); d++; } @@ -1120,7 +1120,7 @@ win_settings_video_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) if (!device_name[0]) break; - if ((c > 1) && (video_card_get_flags(c) == video_card_get_flags(temp_gfxcard))) { + if ((c > 1) && (video_card_get_flags(c) == video_card_get_flags(temp_gfxcard[0]))) { c++; continue; } @@ -1133,7 +1133,7 @@ win_settings_video_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) else settings_add_string(hdlg, IDC_COMBO_VIDEO_2, (LPARAM) device_name); settings_list_to_device[1][d] = c; - if ((c == 0) || (c == temp_gfxcard_2)) + if ((c == 0) || (c == temp_gfxcard[1])) settings_set_cur_sel(hdlg, IDC_COMBO_VIDEO_2, d); d++; } @@ -1163,8 +1163,8 @@ win_settings_video_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_COMBO_VIDEO: - temp_gfxcard = settings_list_to_device[0][settings_get_cur_sel(hdlg, IDC_COMBO_VIDEO)]; - settings_enable_window(hdlg, IDC_CONFIGURE_VID, video_card_has_config(temp_gfxcard)); + temp_gfxcard[0] = settings_list_to_device[0][settings_get_cur_sel(hdlg, IDC_COMBO_VIDEO)]; + settings_enable_window(hdlg, IDC_CONFIGURE_VID, video_card_has_config(temp_gfxcard[0])); // Secondary Video Card c = d = 0; @@ -1182,7 +1182,7 @@ win_settings_video_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) if (!device_name[0]) break; - if ((c > 1) && (video_card_get_flags(c) == video_card_get_flags(temp_gfxcard))) { + if ((c > 1) && (video_card_get_flags(c) == video_card_get_flags(temp_gfxcard[0]))) { c++; continue; } @@ -1195,7 +1195,7 @@ win_settings_video_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) else settings_add_string(hdlg, IDC_COMBO_VIDEO_2, (LPARAM) device_name); settings_list_to_device[1][d] = c; - if ((c == 0) || (c == temp_gfxcard_2)) + if ((c == 0) || (c == temp_gfxcard[1])) settings_set_cur_sel(hdlg, IDC_COMBO_VIDEO_2, d); d++; } @@ -1211,8 +1211,8 @@ win_settings_video_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) break; case IDC_COMBO_VIDEO_2: - temp_gfxcard_2 = settings_list_to_device[1][settings_get_cur_sel(hdlg, IDC_COMBO_VIDEO_2)]; - settings_enable_window(hdlg, IDC_CONFIGURE_VID_2, video_card_has_config(temp_gfxcard_2)); + temp_gfxcard[1] = settings_list_to_device[1][settings_get_cur_sel(hdlg, IDC_COMBO_VIDEO_2)]; + settings_enable_window(hdlg, IDC_CONFIGURE_VID_2, video_card_has_config(temp_gfxcard[1])); break; case IDC_CHECK_VOODOO: @@ -1241,23 +1241,23 @@ win_settings_video_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) break; case IDC_CONFIGURE_VID: - temp_gfxcard = settings_list_to_device[0][settings_get_cur_sel(hdlg, IDC_COMBO_VIDEO)]; - temp_deviceconfig |= deviceconfig_open(hdlg, (void *) video_card_getdevice(temp_gfxcard)); + temp_gfxcard[0] = settings_list_to_device[0][settings_get_cur_sel(hdlg, IDC_COMBO_VIDEO)]; + temp_deviceconfig |= deviceconfig_open(hdlg, (void *) video_card_getdevice(temp_gfxcard[0])); break; case IDC_CONFIGURE_VID_2: - temp_gfxcard_2 = settings_list_to_device[1][settings_get_cur_sel(hdlg, IDC_COMBO_VIDEO_2)]; - temp_deviceconfig |= deviceconfig_open(hdlg, (void *) video_card_getdevice(temp_gfxcard_2)); + temp_gfxcard[1] = settings_list_to_device[1][settings_get_cur_sel(hdlg, IDC_COMBO_VIDEO_2)]; + temp_deviceconfig |= deviceconfig_open(hdlg, (void *) video_card_getdevice(temp_gfxcard[1])); break; } return FALSE; case WM_SAVESETTINGS: - temp_gfxcard = settings_list_to_device[0][settings_get_cur_sel(hdlg, IDC_COMBO_VIDEO)]; - temp_gfxcard_2 = settings_list_to_device[1][settings_get_cur_sel(hdlg, IDC_COMBO_VIDEO_2)]; - temp_voodoo = settings_get_check(hdlg, IDC_CHECK_VOODOO); - temp_ibm8514 = settings_get_check(hdlg, IDC_CHECK_IBM8514); - temp_xga = settings_get_check(hdlg, IDC_CHECK_XGA); + temp_gfxcard[0] = settings_list_to_device[0][settings_get_cur_sel(hdlg, IDC_COMBO_VIDEO)]; + temp_gfxcard[1] = settings_list_to_device[1][settings_get_cur_sel(hdlg, IDC_COMBO_VIDEO_2)]; + temp_voodoo = settings_get_check(hdlg, IDC_CHECK_VOODOO); + temp_ibm8514 = settings_get_check(hdlg, IDC_CHECK_IBM8514); + temp_xga = settings_get_check(hdlg, IDC_CHECK_XGA); default: return FALSE; From 3b5cfe8bfc42984ae2e563ef7ca5705ddad12241 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Mon, 6 Feb 2023 12:46:37 -0500 Subject: [PATCH 216/285] Update libslirp to 4.7.0 with our customizations --- src/include/slirp/libslirp-version.h | 6 +- src/include/slirp/libslirp.h | 121 ++++++- src/include/tinyglib.h | 2 + src/network/net_slirp.c | 8 +- src/network/slirp/CMakeLists.txt | 9 +- src/network/slirp/arp_table.c | 26 +- src/network/slirp/bootp.c | 59 +++- src/network/slirp/bootp.h | 3 +- src/network/slirp/cksum.c | 2 +- src/network/slirp/debug.h | 8 + src/network/slirp/if.c | 23 +- src/network/slirp/ip.h | 14 +- src/network/slirp/ip6.h | 2 +- src/network/slirp/ip6_icmp.c | 43 ++- src/network/slirp/ip6_icmp.h | 23 +- src/network/slirp/ip6_input.c | 9 +- src/network/slirp/ip6_output.c | 6 + src/network/slirp/ip_icmp.c | 121 ++++--- src/network/slirp/ip_icmp.h | 2 + src/network/slirp/ip_input.c | 18 +- src/network/slirp/ip_output.c | 2 + src/network/slirp/libslirp-version.h | 6 +- src/network/slirp/libslirp.h | 121 ++++++- src/network/slirp/mbuf.c | 89 +++++- src/network/slirp/mbuf.h | 65 ++++ src/network/slirp/misc.c | 104 ++++-- src/network/slirp/ncsi-pkt.h | 229 +++++++++++-- src/network/slirp/ncsi.c | 12 +- src/network/slirp/ndp_table.c | 29 +- src/network/slirp/sbuf.c | 2 +- src/network/slirp/slirp.c | 460 +++++++++++++++++++++++++-- src/network/slirp/slirp.h | 36 ++- src/network/slirp/socket.c | 383 +++++++++++++++++++--- src/network/slirp/socket.h | 62 +++- src/network/slirp/state.c | 2 +- src/network/slirp/tcp.h | 2 +- src/network/slirp/tcp_input.c | 37 ++- src/network/slirp/tcp_subr.c | 59 +++- src/network/slirp/tcp_timer.c | 6 +- src/network/slirp/tcpip.h | 4 +- src/network/slirp/tftp.c | 62 ++-- src/network/slirp/tftp.h | 12 +- src/network/slirp/tinyglib.c | 12 + src/network/slirp/udp.c | 114 +++++-- src/network/slirp/udp.h | 6 + src/network/slirp/udp6.c | 27 +- src/network/slirp/util.c | 13 + src/network/slirp/util.h | 23 +- src/network/slirp/vmstate.h | 13 +- src/win/Makefile.mingw | 15 +- 50 files changed, 2071 insertions(+), 441 deletions(-) diff --git a/src/include/slirp/libslirp-version.h b/src/include/slirp/libslirp-version.h index 1599206a5..b68906957 100644 --- a/src/include/slirp/libslirp-version.h +++ b/src/include/slirp/libslirp-version.h @@ -7,9 +7,9 @@ extern "C" { #endif #define SLIRP_MAJOR_VERSION 4 -#define SLIRP_MINOR_VERSION 3 -#define SLIRP_MICRO_VERSION 1 -#define SLIRP_VERSION_STRING "4.3.1-git-86Box" +#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) || \ diff --git a/src/include/slirp/libslirp.h b/src/include/slirp/libslirp.h index 7c4340390..7a6c9a4da 100644 --- a/src/include/slirp/libslirp.h +++ b/src/include/slirp/libslirp.h @@ -8,6 +8,7 @@ #ifdef _WIN32 #include +#include #include #else #include @@ -31,8 +32,10 @@ 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, @@ -47,38 +50,58 @@ 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 + * 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(). The function - * doesn't need to send all the data and may return vnetwork_mask.s_addr | slirp->vnetwork_addr.s_addr; ArpTable *arptbl = &slirp->arp_table; int i; +/* + char ethaddr_str[ETH_ADDRSTRLEN]; + char addr[INET_ADDRSTRLEN]; DEBUG_CALL("arp_table_add"); - DEBUG_ARG("ip = %s", inet_ntoa((struct in_addr){ .s_addr = ip_addr })); - DEBUG_ARG("hw addr = %02x:%02x:%02x:%02x:%02x:%02x", ethaddr[0], ethaddr[1], - ethaddr[2], ethaddr[3], ethaddr[4], ethaddr[5]); + DEBUG_ARG("ip = %s", inet_ntop(AF_INET, &(struct in_addr){ .s_addr = ip_addr }, + addr, sizeof(addr))); + DEBUG_ARG("hw addr = %s", slirp_ether_ntoa(ethaddr, ethaddr_str, + sizeof(ethaddr_str))); +*/ if (ip_addr == 0 || ip_addr == 0xffffffff || ip_addr == broadcast_addr) { /* Do not register broadcast addresses */ @@ -67,9 +72,14 @@ bool arp_table_search(Slirp *slirp, uint32_t ip_addr, ~slirp->vnetwork_mask.s_addr | slirp->vnetwork_addr.s_addr; ArpTable *arptbl = &slirp->arp_table; int i; +/* + char ethaddr_str[ETH_ADDRSTRLEN]; + char addr[INET_ADDRSTRLEN]; DEBUG_CALL("arp_table_search"); - DEBUG_ARG("ip = %s", inet_ntoa((struct in_addr){ .s_addr = ip_addr })); + DEBUG_ARG("ip = %s", inet_ntop(AF_INET, &(struct in_addr){ .s_addr = ip_addr }, + addr, sizeof(addr))); +*/ /* If broadcast address */ if (ip_addr == 0 || ip_addr == 0xffffffff || ip_addr == broadcast_addr) { @@ -81,9 +91,11 @@ bool arp_table_search(Slirp *slirp, uint32_t ip_addr, for (i = 0; i < ARP_TABLE_SIZE; i++) { if (arptbl->table[i].ar_sip == ip_addr) { memcpy(out_ethaddr, arptbl->table[i].ar_sha, ETH_ALEN); - DEBUG_ARG("found hw addr = %02x:%02x:%02x:%02x:%02x:%02x", - out_ethaddr[0], out_ethaddr[1], out_ethaddr[2], - out_ethaddr[3], out_ethaddr[4], out_ethaddr[5]); +/* + DEBUG_ARG("found hw addr = %s", + slirp_ether_ntoa(out_ethaddr, ethaddr_str, + sizeof(ethaddr_str))); +*/ return 1; } } diff --git a/src/network/slirp/bootp.c b/src/network/slirp/bootp.c index 46e96810a..a0eb17a9d 100644 --- a/src/network/slirp/bootp.c +++ b/src/network/slirp/bootp.c @@ -34,6 +34,8 @@ #define LEASE_TIME (24 * 3600) +#define UEFI_HTTP_VENDOR_CLASS_ID "HTTPClient" + static const uint8_t rfc1533_cookie[] = { RFC1533_COOKIE }; #define DPRINTF(fmt, ...) DEBUG_CALL(fmt, ##__VA_ARGS__) @@ -92,21 +94,22 @@ found: return bc; } -static void dhcp_decode(const struct bootp_t *bp, int *pmsg_type, +static void dhcp_decode(const struct bootp_t *bp, + const uint8_t *bp_end, + int *pmsg_type, struct in_addr *preq_addr) { - const uint8_t *p, *p_end; + const uint8_t *p; int len, tag; *pmsg_type = 0; preq_addr->s_addr = htonl(0L); p = bp->bp_vend; - p_end = p + DHCP_OPT_LEN; if (memcmp(p, rfc1533_cookie, 4) != 0) return; p += 4; - while (p < p_end) { + while (p < bp_end) { tag = p[0]; if (tag == RFC1533_PAD) { p++; @@ -114,10 +117,10 @@ static void dhcp_decode(const struct bootp_t *bp, int *pmsg_type, break; } else { p++; - if (p >= p_end) + if (p >= bp_end) break; len = *p++; - if (p + len > p_end) { + if (p + len > bp_end) { break; } DPRINTF("dhcp: tag=%d len=%d\n", tag, len); @@ -144,7 +147,9 @@ static void dhcp_decode(const struct bootp_t *bp, int *pmsg_type, } } -static void bootp_reply(Slirp *slirp, const struct bootp_t *bp) +static void bootp_reply(Slirp *slirp, + const struct bootp_t *bp, + const uint8_t *bp_end) { BOOTPClient *bc = NULL; struct mbuf *m; @@ -157,7 +162,7 @@ static void bootp_reply(Slirp *slirp, const struct bootp_t *bp) uint8_t client_ethaddr[ETH_ALEN]; /* extract exact DHCP msg type */ - dhcp_decode(bp, &dhcp_msg_type, &preq_addr); + dhcp_decode(bp, bp_end, &dhcp_msg_type, &preq_addr); DPRINTF("bootp packet op=%d msgtype=%d", bp->bp_op, dhcp_msg_type); if (preq_addr.s_addr != htonl(0L)) DPRINTF(" req_addr=%08" PRIx32 "\n", ntohl(preq_addr.s_addr)); @@ -179,9 +184,10 @@ static void bootp_reply(Slirp *slirp, const struct bootp_t *bp) return; } m->m_data += IF_MAXLINKHDR; + m_inc(m, sizeof(struct bootp_t) + DHCP_OPT_LEN); rbp = (struct bootp_t *)m->m_data; m->m_data += sizeof(struct udpiphdr); - memset(rbp, 0, sizeof(struct bootp_t)); + memset(rbp, 0, sizeof(struct bootp_t) + DHCP_OPT_LEN); if (dhcp_msg_type == DHCPDISCOVER) { if (preq_addr.s_addr != htonl(0L)) { @@ -235,7 +241,7 @@ static void bootp_reply(Slirp *slirp, const struct bootp_t *bp) rbp->bp_siaddr = saddr.sin_addr; /* Server IP address */ q = rbp->bp_vend; - end = (uint8_t *)&rbp[1]; + end = rbp->bp_vend + DHCP_OPT_LEN; memcpy(q, rfc1533_cookie, 4); q += 4; @@ -336,6 +342,27 @@ static void bootp_reply(Slirp *slirp, const struct bootp_t *bp) q += val; } } + + /* this allows to support UEFI HTTP boot: according to the UEFI + specification, DHCP server must send vendor class identifier option + set to "HTTPClient" string, when responding to DHCP requests as part + of the UEFI HTTP boot + + we assume that, if the bootfile parameter was configured as an http + URL, the user intends to perform UEFI HTTP boot, so send this option + automatically */ + if (slirp->bootp_filename && g_str_has_prefix(slirp->bootp_filename, "http://")) { + val = strlen(UEFI_HTTP_VENDOR_CLASS_ID); + if (q + val + 2 >= end) { + g_warning("DHCP packet size exceeded, " + "omitting vendor class id option."); + } else { + *q++ = RFC2132_VENDOR_CLASS_ID; + *q++ = val; + memcpy(q, UEFI_HTTP_VENDOR_CLASS_ID, val); + q += val; + } + } } else { static const char nak_msg[] = "requested address not available"; @@ -351,19 +378,21 @@ static void bootp_reply(Slirp *slirp, const struct bootp_t *bp) q += sizeof(nak_msg) - 1; } assert(q < end); - *q = RFC1533_END; + *q++ = RFC1533_END; daddr.sin_addr.s_addr = 0xffffffffu; - m->m_len = sizeof(struct bootp_t) - sizeof(struct ip) - sizeof(struct udphdr); + assert(q <= end); + + m->m_len = sizeof(struct bootp_t) + (end - rbp->bp_vend) - sizeof(struct ip) - sizeof(struct udphdr); udp_output(NULL, m, &saddr, &daddr, IPTOS_LOWDELAY); } void bootp_input(struct mbuf *m) { - struct bootp_t *bp = mtod(m, struct bootp_t *); + struct bootp_t *bp = mtod_check(m, sizeof(struct bootp_t)); - if (bp->bp_op == BOOTP_REQUEST) { - bootp_reply(m->slirp, bp); + if (!m->slirp->disable_dhcp && bp && bp->bp_op == BOOTP_REQUEST) { + bootp_reply(m->slirp, bp, m_end(m)); } } diff --git a/src/network/slirp/bootp.h b/src/network/slirp/bootp.h index a57fa51bc..cf7797fac 100644 --- a/src/network/slirp/bootp.h +++ b/src/network/slirp/bootp.h @@ -71,6 +71,7 @@ #define RFC2132_MAX_SIZE 57 #define RFC2132_RENEWAL_TIME 58 #define RFC2132_REBIND_TIME 59 +#define RFC2132_VENDOR_CLASS_ID 60 #define RFC2132_TFTP_SERVER_NAME 66 #define DHCPDISCOVER 1 @@ -114,7 +115,7 @@ struct bootp_t { uint8_t bp_hwaddr[16]; uint8_t bp_sname[64]; char bp_file[128]; - uint8_t bp_vend[DHCP_OPT_LEN]; + uint8_t bp_vend[]; }; typedef struct { diff --git a/src/network/slirp/cksum.c b/src/network/slirp/cksum.c index 4d08380a4..b1cb97b7e 100644 --- a/src/network/slirp/cksum.c +++ b/src/network/slirp/cksum.c @@ -47,7 +47,7 @@ { \ l_util.l = sum; \ sum = l_util.s[0] + l_util.s[1]; \ - (void)ADDCARRY(sum); \ + ADDCARRY(sum); \ } int cksum(struct mbuf *m, int len) diff --git a/src/network/slirp/debug.h b/src/network/slirp/debug.h index 47712bd78..0f9f3eff3 100644 --- a/src/network/slirp/debug.h +++ b/src/network/slirp/debug.h @@ -10,6 +10,7 @@ #define DBG_MISC (1 << 1) #define DBG_ERROR (1 << 2) #define DBG_TFTP (1 << 3) +#define DBG_VERBOSE_CALL (1 << 4) extern int slirp_debug; @@ -20,6 +21,13 @@ extern int slirp_debug; } \ } while (0) +#define DEBUG_VERBOSE_CALL(fmt, ...) \ + do { \ + if (G_UNLIKELY(slirp_debug & DBG_VERBOSE_CALL)) { \ + g_debug(fmt "...", ##__VA_ARGS__); \ + } \ + } while (0) + #define DEBUG_ARG(fmt, ...) \ do { \ if (G_UNLIKELY(slirp_debug & DBG_CALL)) { \ diff --git a/src/network/slirp/if.c b/src/network/slirp/if.c index 23190b559..741473dc4 100644 --- a/src/network/slirp/if.c +++ b/src/network/slirp/if.c @@ -41,6 +41,8 @@ void if_init(Slirp *slirp) void if_output(struct socket *so, struct mbuf *ifm) { Slirp *slirp = ifm->slirp; + M_DUP_DEBUG(slirp, ifm, 0, 0); + struct mbuf *ifq; int on_fastq = 1; @@ -54,7 +56,7 @@ void if_output(struct socket *so, struct mbuf *ifm) * XXX Shouldn't need this, gotta change dtom() etc. */ if (ifm->m_flags & M_USEDLIST) { - remque(ifm); + slirp_remque(ifm); ifm->m_flags &= ~M_USEDLIST; } @@ -68,7 +70,8 @@ void if_output(struct socket *so, struct mbuf *ifm) */ if (so) { for (ifq = (struct mbuf *)slirp->if_batchq.qh_rlink; - (struct quehead *)ifq != &slirp->if_batchq; ifq = ifq->ifq_prev) { + (struct slirp_quehead *)ifq != &slirp->if_batchq; + ifq = ifq->ifq_prev) { if (so == ifq->ifq_so) { /* A match! */ ifm->ifq_so = so; @@ -98,7 +101,7 @@ void if_output(struct socket *so, struct mbuf *ifm) /* Create a new doubly linked list for this session */ ifm->ifq_so = so; ifs_init(ifm); - insque(ifm, ifq); + slirp_insque(ifm, ifq); diddit: if (so) { @@ -115,10 +118,10 @@ diddit: if (on_fastq && ((so->so_nqueued >= 6) && (so->so_nqueued - so->so_queued) >= 3)) { /* Remove from current queue... */ - remque(ifm->ifs_next); + slirp_remque(ifm->ifs_next); /* ...And insert in the new. That'll teach ya! */ - insque(ifm->ifs_next, &slirp->if_batchq); + slirp_insque(ifm->ifs_next, &slirp->if_batchq); } } @@ -143,7 +146,7 @@ void if_start(Slirp *slirp) bool from_batchq = false; struct mbuf *ifm, *ifm_next, *ifqt; - DEBUG_CALL("if_start"); + DEBUG_VERBOSE_CALL("if_start"); if (slirp->if_start_busy) { return; @@ -169,12 +172,12 @@ void if_start(Slirp *slirp) ifm = ifm_next; ifm_next = ifm->ifq_next; - if ((struct quehead *)ifm_next == &slirp->if_fastq) { + if ((struct slirp_quehead *)ifm_next == &slirp->if_fastq) { /* No more packets in fastq, switch to batchq */ ifm_next = batch_head; from_batchq = true; } - if ((struct quehead *)ifm_next == &slirp->if_batchq) { + if ((struct slirp_quehead *)ifm_next == &slirp->if_batchq) { /* end of batchq */ ifm_next = NULL; } @@ -187,13 +190,13 @@ void if_start(Slirp *slirp) /* Remove it from the queue */ ifqt = ifm->ifq_prev; - remque(ifm); + slirp_remque(ifm); /* If there are more packets for this session, re-queue them */ if (ifm->ifs_next != ifm) { struct mbuf *next = ifm->ifs_next; - insque(next, ifqt); + slirp_insque(next, ifqt); ifs_remque(ifm); if (!from_batchq) { ifm_next = next; diff --git a/src/network/slirp/ip.h b/src/network/slirp/ip.h index fba3defa1..c4203f635 100644 --- a/src/network/slirp/ip.h +++ b/src/network/slirp/ip.h @@ -75,7 +75,7 @@ typedef uint32_t n_long; /* long as received from the net */ #pragma pack(push, 1) #endif struct ip { -#if G_BYTE_ORDER == G_BIG_ENDIAN +#if (G_BYTE_ORDER == G_BIG_ENDIAN) && !defined(_MSC_VER) uint8_t ip_v : 4, /* version */ ip_hl : 4; /* header length */ #else @@ -147,7 +147,7 @@ struct ip_timestamp { uint8_t ipt_code; /* IPOPT_TS */ uint8_t ipt_len; /* size of structure (variable) */ uint8_t ipt_ptr; /* index of current entry */ -#if G_BYTE_ORDER == G_BIG_ENDIAN +#if (G_BYTE_ORDER == G_BIG_ENDIAN) && !defined(_MSC_VER) uint8_t ipt_oflw : 4, /* overflow counter */ ipt_flg : 4; /* flags, see below */ #else @@ -190,22 +190,28 @@ struct ip_timestamp { #define IP_MSS 576 /* default maximum segment size */ +#if GLIB_SIZEOF_VOID_P == 4 #if defined(_MSC_VER) && !defined (__clang__) #pragma pack(push, 1) #endif -#if GLIB_SIZEOF_VOID_P == 4 struct mbuf_ptr { struct mbuf *mptr; uint32_t dummy; } SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif #else +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct mbuf_ptr { struct mbuf *mptr; } SLIRP_PACKED; -#endif #if defined(_MSC_VER) && !defined (__clang__) #pragma pack(pop) #endif +#endif struct qlink { void *next, *prev; }; diff --git a/src/network/slirp/ip6.h b/src/network/slirp/ip6.h index 7210964d4..73a00b114 100644 --- a/src/network/slirp/ip6.h +++ b/src/network/slirp/ip6.h @@ -176,7 +176,7 @@ static inline void in6_compute_ethaddr(struct in6_addr ip, * Structure of an internet header, naked of options. */ struct ip6 { -#if G_BYTE_ORDER == G_BIG_ENDIAN +#if (G_BYTE_ORDER == G_BIG_ENDIAN) && !defined(_MSC_VER) uint32_t ip_v : 4, /* version */ ip_tc_hi : 4, /* traffic class */ ip_tc_lo : 4, ip_fl_hi : 4, /* flow label */ diff --git a/src/network/slirp/ip6_icmp.c b/src/network/slirp/ip6_icmp.c index d9c872bc9..0d7ee69ca 100644 --- a/src/network/slirp/ip6_icmp.c +++ b/src/network/slirp/ip6_icmp.c @@ -10,25 +10,14 @@ #define NDP_Interval \ g_rand_int_range(slirp->grand, NDP_MinRtrAdvInterval, NDP_MaxRtrAdvInterval) -static void ra_timer_handler(void *opaque) -{ - Slirp *slirp = opaque; - - slirp->cb->timer_mod(slirp->ra_timer, - slirp->cb->clock_get_ns(slirp->opaque) / SCALE_MS + - NDP_Interval, - slirp->opaque); - ndp_send_ra(slirp); -} - -void icmp6_init(Slirp *slirp) +void icmp6_post_init(Slirp *slirp) { if (!slirp->in6_enabled) { return; } slirp->ra_timer = - slirp->cb->timer_new(ra_timer_handler, slirp, slirp->opaque); + slirp_timer_new(slirp, SLIRP_TIMER_RA, NULL); slirp->cb->timer_mod(slirp->ra_timer, slirp->cb->clock_get_ns(slirp->opaque) / SCALE_MS + NDP_Interval, @@ -69,7 +58,7 @@ static void icmp6_send_echoreply(struct mbuf *m, Slirp *slirp, struct ip6 *ip, ip6_output(NULL, t, 0); } -void icmp6_send_error(struct mbuf *m, uint8_t type, uint8_t code) +void icmp6_forward_error(struct mbuf *m, uint8_t type, uint8_t code, struct in6_addr *src) { Slirp *slirp = m->slirp; struct mbuf *t; @@ -88,7 +77,7 @@ void icmp6_send_error(struct mbuf *m, uint8_t type, uint8_t code) /* IPv6 packet */ struct ip6 *rip = mtod(t, struct ip6 *); - rip->ip_src = (struct in6_addr)LINKLOCAL_ADDR; + rip->ip_src = *src; rip->ip_dst = ip->ip_src; inet_ntop(AF_INET6, &rip->ip_dst, addrstr, INET6_ADDRSTRLEN); DEBUG_ARG("target = %s", addrstr); @@ -131,10 +120,16 @@ void icmp6_send_error(struct mbuf *m, uint8_t type, uint8_t code) ip6_output(NULL, t, 0); } +void icmp6_send_error(struct mbuf *m, uint8_t type, uint8_t code) +{ + struct in6_addr src = LINKLOCAL_ADDR; + icmp6_forward_error(m, type, code, &src); +} + /* * Send NDP Router Advertisement */ -void ndp_send_ra(Slirp *slirp) +static void ndp_send_ra(Slirp *slirp) { DEBUG_CALL("ndp_send_ra"); @@ -213,6 +208,15 @@ void ndp_send_ra(Slirp *slirp) ip6_output(NULL, t, 0); } +void ra_timer_handler(Slirp *slirp, void *unused) +{ + slirp->cb->timer_mod(slirp->ra_timer, + slirp->cb->clock_get_ns(slirp->opaque) / SCALE_MS + + NDP_Interval, + slirp->opaque); + ndp_send_ra(slirp); +} + /* * Send NDP Neighbor Solitication */ @@ -315,6 +319,8 @@ static void ndp_send_na(Slirp *slirp, struct ip6 *ip, struct icmp6 *icmp) static void ndp_input(struct mbuf *m, Slirp *slirp, struct ip6 *ip, struct icmp6 *icmp) { + g_assert(M_ROOMBEFORE(m) >= ETH_HLEN); + m->m_len += ETH_HLEN; m->m_data -= ETH_HLEN; struct ethhdr *eth = mtod(m, struct ethhdr *); @@ -377,9 +383,12 @@ static void ndp_input(struct mbuf *m, Slirp *slirp, struct ip6 *ip, */ void icmp6_input(struct mbuf *m) { + Slirp *slirp = m->slirp; + /* NDP reads the ethernet header for gratuitous NDP */ + M_DUP_DEBUG(slirp, m, 1, ETH_HLEN); + struct icmp6 *icmp; struct ip6 *ip = mtod(m, struct ip6 *); - Slirp *slirp = m->slirp; int hlen = sizeof(struct ip6); DEBUG_CALL("icmp6_input"); diff --git a/src/network/slirp/ip6_icmp.h b/src/network/slirp/ip6_icmp.h index 77772a76b..02761b726 100644 --- a/src/network/slirp/ip6_icmp.h +++ b/src/network/slirp/ip6_icmp.h @@ -35,7 +35,7 @@ struct ndp_rs { /* Router Solicitation Message */ struct ndp_ra { /* Router Advertisement Message */ uint8_t chl; /* Cur Hop Limit */ -#if G_BYTE_ORDER == G_BIG_ENDIAN +#if (G_BYTE_ORDER == G_BIG_ENDIAN) && !defined(_MSC_VER) uint8_t M : 1, O : 1, reserved : 6; #else uint8_t reserved : 6, O : 1, M : 1; @@ -55,7 +55,7 @@ struct ndp_ns { /* Neighbor Solicitation Message */ G_STATIC_ASSERT(sizeof(struct ndp_ns) == 20); struct ndp_na { /* Neighbor Advertisement Message */ -#if G_BYTE_ORDER == G_BIG_ENDIAN +#if (G_BYTE_ORDER == G_BIG_ENDIAN) && !defined(_MSC_VER) uint32_t R : 1, /* Router Flag */ S : 1, /* Solicited Flag */ O : 1, /* Override Flag */ @@ -124,9 +124,12 @@ struct ndpopt { union { unsigned char linklayer_addr[6]; /* Source/Target Link-layer */ #define ndpopt_linklayer ndpopt_body.linklayer_addr +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct prefixinfo { /* Prefix Information */ uint8_t prefix_length; -#if G_BYTE_ORDER == G_BIG_ENDIAN +#if (G_BYTE_ORDER == G_BIG_ENDIAN) && !defined(_MSC_VER) uint8_t L : 1, A : 1, reserved1 : 6; #else uint8_t reserved1 : 6, A : 1, L : 1; @@ -136,12 +139,21 @@ struct ndpopt { uint32_t reserved2; struct in6_addr prefix; } SLIRP_PACKED prefixinfo; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif #define ndpopt_prefixinfo ndpopt_body.prefixinfo +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct rdnss { uint16_t reserved; uint32_t lifetime; struct in6_addr addr; } SLIRP_PACKED rdnss; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif #define ndpopt_rdnss ndpopt_body.rdnss } ndpopt_body; } SLIRP_PACKED; @@ -215,11 +227,12 @@ struct ndpopt { #define NDP_AdvPrefLifetime 14400 #define NDP_AdvAutonomousFlag 1 -void icmp6_init(Slirp *slirp); +void icmp6_post_init(Slirp *slirp); void icmp6_cleanup(Slirp *slirp); void icmp6_input(struct mbuf *); +void icmp6_forward_error(struct mbuf *m, uint8_t type, uint8_t code, struct in6_addr *src); void icmp6_send_error(struct mbuf *m, uint8_t type, uint8_t code); -void ndp_send_ra(Slirp *slirp); void ndp_send_ns(Slirp *slirp, struct in6_addr addr); +void ra_timer_handler(Slirp *slirp, void *unused); #endif diff --git a/src/network/slirp/ip6_input.c b/src/network/slirp/ip6_input.c index a83e4f8e3..4aca08285 100644 --- a/src/network/slirp/ip6_input.c +++ b/src/network/slirp/ip6_input.c @@ -11,9 +11,9 @@ * IP initialization: fill in IP protocol switch table. * All protocols not implemented in kernel go to raw IP protocol handler. */ -void ip6_init(Slirp *slirp) +void ip6_post_init(Slirp *slirp) { - icmp6_init(slirp); + icmp6_post_init(slirp); } void ip6_cleanup(Slirp *slirp) @@ -23,8 +23,11 @@ void ip6_cleanup(Slirp *slirp) void ip6_input(struct mbuf *m) { - struct ip6 *ip6; Slirp *slirp = m->slirp; + /* NDP reads the ethernet header for gratuitous NDP */ + M_DUP_DEBUG(slirp, m, 1, TCPIPHDR_DELTA + 2 + ETH_HLEN); + + struct ip6 *ip6; if (!slirp->in6_enabled) { goto bad; diff --git a/src/network/slirp/ip6_output.c b/src/network/slirp/ip6_output.c index b86110662..834f1c0a3 100644 --- a/src/network/slirp/ip6_output.c +++ b/src/network/slirp/ip6_output.c @@ -15,6 +15,9 @@ */ int ip6_output(struct socket *so, struct mbuf *m, int fast) { + Slirp *slirp = m->slirp; + M_DUP_DEBUG(slirp, m, 0, 0); + struct ip6 *ip = mtod(m, struct ip6 *); DEBUG_CALL("ip6_output"); @@ -30,7 +33,10 @@ int ip6_output(struct socket *so, struct mbuf *m, int fast) ip->ip_fl_lo = 0; if (fast) { + /* We cannot fast-send non-multicast, we'd need a NDP NS */ + assert(IN6_IS_ADDR_MULTICAST(&ip->ip_dst)); if_encap(m->slirp, m); + m_free(m); } else { if_output(so, m); } diff --git a/src/network/slirp/ip_icmp.c b/src/network/slirp/ip_icmp.c index 13a0e5508..6ae523c69 100644 --- a/src/network/slirp/ip_icmp.c +++ b/src/network/slirp/ip_icmp.c @@ -85,13 +85,41 @@ void icmp_cleanup(Slirp *slirp) static int icmp_send(struct socket *so, struct mbuf *m, int hlen) { + Slirp *slirp = m->slirp; + M_DUP_DEBUG(slirp, m, 0, 0); + struct ip *ip = mtod(m, struct ip *); struct sockaddr_in addr; + /* + * The behavior of reading SOCK_DGRAM+IPPROTO_ICMP sockets is inconsistent + * between host OSes. On Linux, only the ICMP header and payload is + * included. On macOS/Darwin, the socket acts like a raw socket and + * includes the IP header as well. On other BSDs, SOCK_DGRAM+IPPROTO_ICMP + * sockets aren't supported at all, so we treat them like raw sockets. It + * isn't possible to detect this difference at runtime, so we must use an + * #ifdef to determine if we need to remove the IP header. + */ +#ifdef CONFIG_BSD + so->so_type = IPPROTO_IP; +#else + so->so_type = IPPROTO_ICMP; +#endif + so->s = slirp_socket(AF_INET, SOCK_DGRAM, IPPROTO_ICMP); + if (so->s == -1) { + if (errno == EAFNOSUPPORT + || errno == EPROTONOSUPPORT + || errno == EACCES) { + /* Kernel doesn't support or allow ping sockets. */ + so->so_type = IPPROTO_IP; + so->s = slirp_socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); + } + } if (so->s == -1) { return -1; } + so->slirp->cb->register_poll_fd(so->s, so->slirp->opaque); if (slirp_bind_outbound(so, AF_INET) != 0) { // bind failed - close socket @@ -104,14 +132,13 @@ static int icmp_send(struct socket *so, struct mbuf *m, int hlen) so->so_faddr = ip->ip_dst; so->so_laddr = ip->ip_src; so->so_iptos = ip->ip_tos; - so->so_type = IPPROTO_ICMP; so->so_state = SS_ISFCONNECTED; so->so_expire = curtime + SO_EXPIRE; addr.sin_family = AF_INET; addr.sin_addr = so->so_faddr; - insque(so, &so->slirp->icmp); + slirp_insque(so, &so->slirp->icmp); if (sendto(so->s, m->m_data + hlen, m->m_len - hlen, 0, (struct sockaddr *)&addr, sizeof(addr)) == -1) { @@ -136,10 +163,12 @@ void icmp_detach(struct socket *so) */ void icmp_input(struct mbuf *m, int hlen) { + Slirp *slirp = m->slirp; + M_DUP_DEBUG(slirp, m, 0, 0); + register struct icmp *icp; register struct ip *ip = mtod(m, struct ip *); int icmplen = ip->ip_len; - Slirp *slirp = m->slirp; DEBUG_CALL("icmp_input"); DEBUG_ARG("m = %p", m); @@ -176,10 +205,17 @@ void icmp_input(struct mbuf *m, int hlen) } else { struct socket *so; struct sockaddr_storage addr; - so = socreate(slirp); + int ttl; + + so = socreate(slirp, IPPROTO_ICMP); if (icmp_send(so, m, hlen) == 0) { + /* We could send this as ICMP, good! */ return; } + + /* We could not send this as ICMP, try to send it on UDP echo + * service (7), wishfully hoping that it is open there. */ + if (udp_attach(so, AF_INET) == -1) { DEBUG_MISC("icmp_input udp_attach errno = %d-%s", errno, strerror(errno)); @@ -195,7 +231,6 @@ void icmp_input(struct mbuf *m, int hlen) so->so_laddr = ip->ip_src; so->so_lport = htons(9); so->so_iptos = ip->ip_tos; - so->so_type = IPPROTO_ICMP; so->so_state = SS_ISFCONNECTED; /* Send the packet */ @@ -207,6 +242,19 @@ void icmp_input(struct mbuf *m, int hlen) return; } + /* + * Check for TTL + */ + ttl = ip->ip_ttl-1; + if (ttl <= 0) { + DEBUG_MISC("udp ttl exceeded"); + icmp_send_error(m, ICMP_TIMXCEED, ICMP_TIMXCEED_INTRANS, 0, + NULL); + udp_detach(so); + break; + } + setsockopt(so->s, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl)); + if (sendto(so->s, icmp_ping_msg, strlen(icmp_ping_msg), 0, (struct sockaddr *)&addr, sockaddr_size(&addr)) == -1) { DEBUG_MISC("icmp_input udp sendto tx errno = %d-%s", errno, @@ -230,7 +278,7 @@ void icmp_input(struct mbuf *m, int hlen) default: m_free(m); - } /* swith */ + } /* switch */ end_error: /* m is m_free()'d xor put in a socket xor or given to ip_send */ @@ -256,8 +304,8 @@ end_error: */ #define ICMP_MAXDATALEN (IP_MSS - 28) -void icmp_send_error(struct mbuf *msrc, uint8_t type, uint8_t code, int minsize, - const char *message) +void icmp_forward_error(struct mbuf *msrc, uint8_t type, uint8_t code, int minsize, + const char *message, struct in_addr *src) { unsigned hlen, shlen, s_ip_len; register struct ip *ip; @@ -276,10 +324,12 @@ void icmp_send_error(struct mbuf *msrc, uint8_t type, uint8_t code, int minsize, goto end_error; ip = mtod(msrc, struct ip *); if (slirp_debug & DBG_MISC) { - char bufa[20], bufb[20]; - slirp_pstrcpy(bufa, sizeof(bufa), inet_ntoa(ip->ip_src)); - slirp_pstrcpy(bufb, sizeof(bufb), inet_ntoa(ip->ip_dst)); - DEBUG_MISC(" %.16s to %.16s", bufa, bufb); + char addr_src[INET_ADDRSTRLEN]; + char addr_dst[INET_ADDRSTRLEN]; + + inet_ntop(AF_INET, &ip->ip_src, addr_src, sizeof(addr_src)); + inet_ntop(AF_INET, &ip->ip_dst, addr_dst, sizeof(addr_dst)); + DEBUG_MISC(" %.16s to %.16s", addr_src, addr_dst); } if (ip->ip_off & IP_OFFMASK) goto end_error; /* Only reply to fragment 0 */ @@ -372,15 +422,21 @@ void icmp_send_error(struct mbuf *msrc, uint8_t type, uint8_t code, int minsize, ip->ip_ttl = MAXTTL; ip->ip_p = IPPROTO_ICMP; ip->ip_dst = ip->ip_src; /* ip addresses */ - ip->ip_src = m->slirp->vhost_addr; + ip->ip_src = *src; - (void)ip_output((struct socket *)NULL, m); + ip_output((struct socket *)NULL, m); end_error: return; } #undef ICMP_MAXDATALEN +void icmp_send_error(struct mbuf *msrc, uint8_t type, uint8_t code, int minsize, + const char *message) +{ + icmp_forward_error(msrc, type, code, minsize, message, &msrc->slirp->vhost_addr); +} + /* * Reflect the ip packet back to the source */ @@ -428,7 +484,7 @@ void icmp_reflect(struct mbuf *m) ip->ip_src = icmp_dst; } - (void)ip_output((struct socket *)NULL, m); + ip_output((struct socket *)NULL, m); } void icmp_receive(struct socket *so) @@ -446,31 +502,24 @@ void icmp_receive(struct socket *so) id = icp->icmp_id; len = recv(so->s, icp, M_ROOM(m), 0); - /* - * The behavior of reading SOCK_DGRAM+IPPROTO_ICMP sockets is inconsistent - * between host OSes. On Linux, only the ICMP header and payload is - * included. On macOS/Darwin, the socket acts like a raw socket and - * includes the IP header as well. On other BSDs, SOCK_DGRAM+IPPROTO_ICMP - * sockets aren't supported at all, so we treat them like raw sockets. It - * isn't possible to detect this difference at runtime, so we must use an - * #ifdef to determine if we need to remove the IP header. - */ -#ifdef CONFIG_BSD - if (len >= sizeof(struct ip)) { - struct ip *inner_ip = mtod(m, struct ip *); - int inner_hlen = inner_ip->ip_hl << 2; - if (inner_hlen > len) { + + if (so->so_type == IPPROTO_IP) { + if (len >= sizeof(struct ip)) { + struct ip *inner_ip = mtod(m, struct ip *); + int inner_hlen = inner_ip->ip_hl << 2; + if (inner_hlen > len) { + len = -1; + errno = -EINVAL; + } else { + len -= inner_hlen; + memmove(icp, (unsigned char *)icp + inner_hlen, len); + } + } else { len = -1; errno = -EINVAL; - } else { - len -= inner_hlen; - memmove(icp, (unsigned char *)icp + inner_hlen, len); } - } else { - len = -1; - errno = -EINVAL; } -#endif + icp->icmp_id = id; m->m_data -= hlen; diff --git a/src/network/slirp/ip_icmp.h b/src/network/slirp/ip_icmp.h index 84707db24..569a08306 100644 --- a/src/network/slirp/ip_icmp.h +++ b/src/network/slirp/ip_icmp.h @@ -157,6 +157,8 @@ struct icmp { void icmp_init(Slirp *slirp); void icmp_cleanup(Slirp *slirp); void icmp_input(struct mbuf *, int); +void icmp_forward_error(struct mbuf *msrc, uint8_t type, uint8_t code, int minsize, + const char *message, struct in_addr *src); void icmp_send_error(struct mbuf *msrc, uint8_t type, uint8_t code, int minsize, const char *message); void icmp_reflect(struct mbuf *); diff --git a/src/network/slirp/ip_input.c b/src/network/slirp/ip_input.c index e04d1506d..b0a64da19 100644 --- a/src/network/slirp/ip_input.c +++ b/src/network/slirp/ip_input.c @@ -71,6 +71,8 @@ void ip_cleanup(Slirp *slirp) void ip_input(struct mbuf *m) { Slirp *slirp = m->slirp; + M_DUP_DEBUG(slirp, m, 0, TCPIPHDR_DELTA); + register struct ip *ip; int hlen; @@ -251,7 +253,7 @@ static struct ip *ip_reass(Slirp *slirp, struct ip *ip, struct ipq *fp) goto dropfrag; } fp = mtod(t, struct ipq *); - insque(&fp->ip_link, &slirp->ipq.ip_link); + slirp_insque(&fp->ip_link, &slirp->ipq.ip_link); fp->ipq_ttl = IPFRAGTTL; fp->ipq_p = ip->ip_p; fp->ipq_id = ip->ip_id; @@ -348,7 +350,7 @@ insert: /* * If the fragments concatenated to an mbuf that's bigger than the total * size of the fragment and the mbuf was not already using an m_ext buffer, - * then an m_ext buffer was alloced. But fp->ipq_next points to the old + * then an m_ext buffer was allocated. But fp->ipq_next points to the old * buffer (in the mbuf), so we must point ip into the new buffer. */ if (m->m_flags & M_EXT) { @@ -360,8 +362,8 @@ insert: ip->ip_tos &= ~1; ip->ip_src = fp->ipq_src; ip->ip_dst = fp->ipq_dst; - remque(&fp->ip_link); - (void)m_free(dtom(slirp, fp)); + slirp_remque(&fp->ip_link); + m_free(dtom(slirp, fp)); m->m_len += (ip->ip_hl << 2); m->m_data -= (ip->ip_hl << 2); @@ -386,13 +388,13 @@ static void ip_freef(Slirp *slirp, struct ipq *fp) ip_deq(q); m_free(dtom(slirp, q)); } - remque(&fp->ip_link); - (void)m_free(dtom(slirp, fp)); + slirp_remque(&fp->ip_link); + m_free(dtom(slirp, fp)); } /* * Put an ip fragment on a reassembly chain. - * Like insque, but pointers in middle of structure. + * Like slirp_insque, but pointers in middle of structure. */ static void ip_enq(register struct ipasfrag *p, register struct ipasfrag *prev) { @@ -405,7 +407,7 @@ static void ip_enq(register struct ipasfrag *p, register struct ipasfrag *prev) } /* - * To ip_enq as remque is to insque. + * To ip_enq as slirp_remque is to slirp_insque. */ static void ip_deq(register struct ipasfrag *p) { diff --git a/src/network/slirp/ip_output.c b/src/network/slirp/ip_output.c index 22916a37d..4f6260591 100644 --- a/src/network/slirp/ip_output.c +++ b/src/network/slirp/ip_output.c @@ -51,6 +51,8 @@ int ip_output(struct socket *so, struct mbuf *m0) { Slirp *slirp = m0->slirp; + M_DUP_DEBUG(slirp, m0, 0, 0); + register struct ip *ip; register struct mbuf *m = m0; register int hlen = sizeof(struct ip); diff --git a/src/network/slirp/libslirp-version.h b/src/network/slirp/libslirp-version.h index 1599206a5..b68906957 100644 --- a/src/network/slirp/libslirp-version.h +++ b/src/network/slirp/libslirp-version.h @@ -7,9 +7,9 @@ extern "C" { #endif #define SLIRP_MAJOR_VERSION 4 -#define SLIRP_MINOR_VERSION 3 -#define SLIRP_MICRO_VERSION 1 -#define SLIRP_VERSION_STRING "4.3.1-git-86Box" +#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) || \ diff --git a/src/network/slirp/libslirp.h b/src/network/slirp/libslirp.h index 7c4340390..7a6c9a4da 100644 --- a/src/network/slirp/libslirp.h +++ b/src/network/slirp/libslirp.h @@ -8,6 +8,7 @@ #ifdef _WIN32 #include +#include #include #else #include @@ -31,8 +32,10 @@ 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, @@ -47,38 +50,58 @@ 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 + * 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(). The function - * doesn't need to send all the data and may return m_usedlist.qh_link = slirp->m_usedlist.qh_rlink = &slirp->m_usedlist; } -void m_cleanup(Slirp *slirp) +static void m_cleanup_list(struct slirp_quehead *list_head) { struct mbuf *m, *next; - m = (struct mbuf *)slirp->m_usedlist.qh_link; - while ((struct quehead *)m != &slirp->m_usedlist) { + m = (struct mbuf *)list_head->qh_link; + while ((struct slirp_quehead *)m != list_head) { next = m->m_next; if (m->m_flags & M_EXT) { g_free(m->m_ext); @@ -43,12 +43,16 @@ void m_cleanup(Slirp *slirp) g_free(m); m = next; } - m = (struct mbuf *)slirp->m_freelist.qh_link; - while ((struct quehead *)m != &slirp->m_freelist) { - next = m->m_next; - g_free(m); - m = next; - } + list_head->qh_link = list_head; + list_head->qh_rlink = list_head; +} + +void m_cleanup(Slirp *slirp) +{ + m_cleanup_list(&slirp->m_usedlist); + m_cleanup_list(&slirp->m_freelist); + m_cleanup_list(&slirp->if_batchq); + m_cleanup_list(&slirp->if_fastq); } /* @@ -66,19 +70,19 @@ struct mbuf *m_get(Slirp *slirp) DEBUG_CALL("m_get"); - if (slirp->m_freelist.qh_link == &slirp->m_freelist) { + if (MBUF_DEBUG || slirp->m_freelist.qh_link == &slirp->m_freelist) { m = g_malloc(SLIRP_MSIZE(slirp->if_mtu)); slirp->mbuf_alloced++; - if (slirp->mbuf_alloced > MBUF_THRESH) + if (MBUF_DEBUG || slirp->mbuf_alloced > MBUF_THRESH) flags = M_DOFREE; m->slirp = slirp; } else { m = (struct mbuf *)slirp->m_freelist.qh_link; - remque(m); + slirp_remque(m); } /* Insert it in the used list */ - insque(m, &slirp->m_usedlist); + slirp_insque(m, &slirp->m_usedlist); m->m_flags = (flags | M_USEDLIST); /* Initialise it */ @@ -101,11 +105,12 @@ void m_free(struct mbuf *m) if (m) { /* Remove from m_usedlist */ if (m->m_flags & M_USEDLIST) - remque(m); + slirp_remque(m); /* If it's M_EXT, free() it */ if (m->m_flags & M_EXT) { g_free(m->m_ext); + m->m_flags &= ~M_EXT; } /* * Either free() it or put it on the free list @@ -114,7 +119,7 @@ void m_free(struct mbuf *m) m->slirp->mbuf_alloced--; g_free(m); } else if ((m->m_flags & M_FREELIST) == 0) { - insque(m, &m->slirp->m_freelist); + slirp_insque(m, &m->slirp->m_freelist); m->m_flags = M_FREELIST; /* Clobber other flags */ } } /* if(m) */ @@ -209,7 +214,7 @@ struct mbuf *dtom(Slirp *slirp, void *dat) /* bug corrected for M_EXT buffers */ for (m = (struct mbuf *)slirp->m_usedlist.qh_link; - (struct quehead *)m != &slirp->m_usedlist; m = m->m_next) { + (struct slirp_quehead *)m != &slirp->m_usedlist; m = m->m_next) { if (m->m_flags & M_EXT) { if ((char *)dat >= m->m_ext && (char *)dat < (m->m_ext + m->m_size)) return m; @@ -223,3 +228,55 @@ struct mbuf *dtom(Slirp *slirp, void *dat) return (struct mbuf *)0; } + +/* + * Duplicate the mbuf + * + * copy_header specifies whether the bytes before m_data should also be copied. + * header_size specifies how many bytes are to be reserved before m_data. + */ +struct mbuf *m_dup(Slirp *slirp, struct mbuf *m, + bool copy_header, + size_t header_size) +{ + struct mbuf *n; + int mcopy_result; + + /* The previous mbuf was supposed to have it already, we can check it along + * the way */ + assert(M_ROOMBEFORE(m) >= header_size); + + n = m_get(slirp); + m_inc(n, m->m_len + header_size); + + if (copy_header) { + m->m_len += header_size; + m->m_data -= header_size; + mcopy_result = m_copy(n, m, 0, m->m_len + header_size); + n->m_data += header_size; + m->m_len -= header_size; + m->m_data += header_size; + } else { + n->m_data += header_size; + mcopy_result = m_copy(n, m, 0, m->m_len); + } + g_assert(mcopy_result == 0); + + return n; +} + +void *mtod_check(struct mbuf *m, size_t len) +{ + if (m->m_len >= len) { + return m->m_data; + } + + DEBUG_ERROR("mtod failed"); + + return NULL; +} + +void *m_end(struct mbuf *m) +{ + return m->m_data + m->m_len; +} diff --git a/src/network/slirp/mbuf.h b/src/network/slirp/mbuf.h index 546e7852c..aedfc712e 100644 --- a/src/network/slirp/mbuf.h +++ b/src/network/slirp/mbuf.h @@ -73,6 +73,13 @@ */ #define M_FREEROOM(m) (M_ROOM(m) - (m)->m_len) +/* + * How much free room there is before m_data + */ +#define M_ROOMBEFORE(m) \ + (((m)->m_flags & M_EXT) ? (m)->m_data - (m)->m_ext \ + : (m)->m_data - (m)->m_dat) + struct mbuf { /* XXX should union some of these! */ /* header at beginning of each mbuf: */ @@ -117,11 +124,69 @@ void m_cat(register struct mbuf *, register struct mbuf *); void m_inc(struct mbuf *, int); void m_adj(struct mbuf *, int); int m_copy(struct mbuf *, struct mbuf *, int, int); +struct mbuf *m_dup(Slirp *slirp, struct mbuf *m, bool copy_header, size_t header_size); struct mbuf *dtom(Slirp *, void *); +void *mtod_check(struct mbuf *, size_t len); +void *m_end(struct mbuf *); static inline void ifs_init(struct mbuf *ifm) { ifm->ifs_next = ifm->ifs_prev = ifm; } +#ifdef SLIRP_DEBUG +# define MBUF_DEBUG 1 +#else +# ifdef HAVE_VALGRIND +# include +# define MBUF_DEBUG RUNNING_ON_VALGRIND +# else +# define MBUF_DEBUG 0 +# endif +#endif + +/* + * When a function is given an mbuf as well as the responsibility to free it, we + * want valgrind etc. to properly identify the new responsible for the + * free. Achieve this by making a new copy. For instance: + * + * f0(void) { + * struct mbuf *m = m_get(slirp); + * [...] + * switch (something) { + * case 1: + * f1(m); + * break; + * case 2: + * f2(m); + * break; + * [...] + * } + * } + * + * f1(struct mbuf *m) { + * M_DUP_DEBUG(m->slirp, m); + * [...] + * m_free(m); // but author of f1 might be forgetting this + * } + * + * f0 transfers the freeing responsibility to f1, f2, etc. Without the + * M_DUP_DEBUG call in f1, valgrind would tell us that it is f0 where the buffer + * was allocated, but it's difficult to know whether a leak is actually in f0, + * or in f1, or in f2, etc. Duplicating the mbuf in M_DUP_DEBUG each time the + * responsibility is transferred allows to immediately know where the leak + * actually is. + */ +#define M_DUP_DEBUG(slirp, m, copy_header, header_size) do { \ + if (MBUF_DEBUG) { \ + struct mbuf *__n; \ + __n = m_dup((slirp), (m), (copy_header), (header_size)); \ + m_free(m); \ + (m) = __n; \ + } else { \ + (void) (slirp); (void) (copy_header); \ + g_assert(M_ROOMBEFORE(m) >= (header_size)); \ + } \ +} while(0) + #endif diff --git a/src/network/slirp/misc.c b/src/network/slirp/misc.c index 3bea32ac1..220506328 100644 --- a/src/network/slirp/misc.c +++ b/src/network/slirp/misc.c @@ -15,22 +15,26 @@ extern gsize g_strlcpy(gchar* dest, const gchar* src, gsize dest_size); #endif #endif -extern inline void insque(void *a, void *b) +#ifdef __APPLE__ +#include +#endif + +extern inline void slirp_insque(void *a, void *b) { - register struct quehead *element = (struct quehead *)a; - register struct quehead *head = (struct quehead *)b; + register struct slirp_quehead *element = (struct slirp_quehead *)a; + register struct slirp_quehead *head = (struct slirp_quehead *)b; element->qh_link = head->qh_link; - head->qh_link = (struct quehead *)element; - element->qh_rlink = (struct quehead *)head; - ((struct quehead *)(element->qh_link))->qh_rlink = - (struct quehead *)element; + head->qh_link = (struct slirp_quehead *)element; + element->qh_rlink = (struct slirp_quehead *)head; + ((struct slirp_quehead *)(element->qh_link))->qh_rlink = + (struct slirp_quehead *)element; } -extern inline void remque(void *a) +extern inline void slirp_remque(void *a) { - register struct quehead *element = (struct quehead *)a; - ((struct quehead *)(element->qh_link))->qh_rlink = element->qh_rlink; - ((struct quehead *)(element->qh_rlink))->qh_link = element->qh_link; + register struct slirp_quehead *element = (struct slirp_quehead *)a; + ((struct slirp_quehead *)(element->qh_link))->qh_rlink = element->qh_rlink; + ((struct slirp_quehead *)(element->qh_rlink))->qh_link = element->qh_link; element->qh_rlink = NULL; } @@ -89,7 +93,7 @@ static int slirp_socketpair_with_oob(int sv[2]) struct sockaddr_in addr = { .sin_family = AF_INET, .sin_port = 0, - .sin_addr.s_addr = INADDR_ANY, + .sin_addr.s_addr = htonl(INADDR_LOOPBACK), }; socklen_t addrlen = sizeof(addr); int ret, s; @@ -143,11 +147,21 @@ static void fork_exec_child_setup(gpointer data) { #ifndef _WIN32 setsid(); + + /* Unblock all signals and leave our exec()-ee to block what it wants */ + sigset_t ss; + sigemptyset(&ss); + sigprocmask(SIG_SETMASK, &ss, NULL); + + /* POSIX is obnoxious about SIGCHLD specifically across exec() */ + signal(SIGCHLD, SIG_DFL); #endif } +#ifdef __GNUC__ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif #if !GLIB_CHECK_VERSION(2, 58, 0) typedef struct SlirpGSpawnFds { @@ -197,7 +211,9 @@ g_spawn_async_with_fds_slirp(const gchar *working_directory, gchar **argv, #define g_spawn_async_with_fds(wd, argv, env, f, c, d, p, ifd, ofd, efd, err) \ g_spawn_async_with_fds_slirp(wd, argv, env, f, c, d, p, ifd, ofd, efd, err) +#ifdef __GNUC__ #pragma GCC diagnostic pop +#endif int fork_exec(struct socket *so, const char *ex) { @@ -300,6 +316,7 @@ char *slirp_connection_info(Slirp *slirp) uint16_t dst_port; struct socket *so; const char *state; + char addr[INET_ADDRSTRLEN]; char buf[20]; g_string_append_printf(str, @@ -329,10 +346,11 @@ char *slirp_connection_info(Slirp *slirp) } slirp_fmt0(buf, sizeof(buf), " TCP[%s]", state); g_string_append_printf(str, "%-19s %3d %15s %5d ", buf, so->s, - src.sin_addr.s_addr ? inet_ntoa(src.sin_addr) : - "*", + src.sin_addr.s_addr ? + inet_ntop(AF_INET, &src.sin_addr, addr, sizeof(addr)) : "*", ntohs(src.sin_port)); - g_string_append_printf(str, "%15s %5d %5d %5d\n", inet_ntoa(dst_addr), + g_string_append_printf(str, "%15s %5d %5d %5d\n", + inet_ntop(AF_INET, &dst_addr, addr, sizeof(addr)), ntohs(dst_port), so->so_rcv.sb_cc, so->so_snd.sb_cc); } @@ -353,10 +371,11 @@ char *slirp_connection_info(Slirp *slirp) dst_port = so->so_fport; } g_string_append_printf(str, "%-19s %3d %15s %5d ", buf, so->s, - src.sin_addr.s_addr ? inet_ntoa(src.sin_addr) : - "*", + src.sin_addr.s_addr ? + inet_ntop(AF_INET, &src.sin_addr, addr, sizeof(addr)) : "*", ntohs(src.sin_port)); - g_string_append_printf(str, "%15s %5d %5d %5d\n", inet_ntoa(dst_addr), + g_string_append_printf(str, "%15s %5d %5d %5d\n", + inet_ntop(AF_INET, &dst_addr, addr, sizeof(addr)), ntohs(dst_port), so->so_rcv.sb_cc, so->so_snd.sb_cc); } @@ -367,15 +386,58 @@ char *slirp_connection_info(Slirp *slirp) src.sin_addr = so->so_laddr; dst_addr = so->so_faddr; g_string_append_printf(str, "%-19s %3d %15s - ", buf, so->s, - src.sin_addr.s_addr ? inet_ntoa(src.sin_addr) : - "*"); - g_string_append_printf(str, "%15s - %5d %5d\n", inet_ntoa(dst_addr), + src.sin_addr.s_addr ? + inet_ntop(AF_INET, &src.sin_addr, addr, sizeof(addr)) : "*"); + g_string_append_printf(str, "%15s - %5d %5d\n", + inet_ntop(AF_INET, &dst_addr, addr, sizeof(addr)), so->so_rcv.sb_cc, so->so_snd.sb_cc); } return g_string_free(str, false); } +char *slirp_neighbor_info(Slirp *slirp) +{ + GString *str = g_string_new(NULL); + ArpTable *arp_table = &slirp->arp_table; + NdpTable *ndp_table = &slirp->ndp_table; + char ip_addr[INET6_ADDRSTRLEN]; + char eth_addr[ETH_ADDRSTRLEN]; + const char *ip; + + g_string_append_printf(str, " %5s %-17s %s\n", + "Table", "MacAddr", "IP Address"); + + for (int i = 0; i < ARP_TABLE_SIZE; ++i) { + struct in_addr addr; + addr.s_addr = arp_table->table[i].ar_sip; + if (!addr.s_addr) { + continue; + } + ip = inet_ntop(AF_INET, &addr, ip_addr, sizeof(ip_addr)); + g_assert(ip != NULL); + g_string_append_printf(str, " %5s %-17s %s\n", "ARP", + slirp_ether_ntoa(arp_table->table[i].ar_sha, + eth_addr, sizeof(eth_addr)), + ip); + } + + for (int i = 0; i < NDP_TABLE_SIZE; ++i) { + if (in6_zero(&ndp_table->table[i].ip_addr)) { + continue; + } + ip = inet_ntop(AF_INET6, &ndp_table->table[i].ip_addr, ip_addr, + sizeof(ip_addr)); + g_assert(ip != NULL); + g_string_append_printf(str, " %5s %-17s %s\n", "NDP", + slirp_ether_ntoa(ndp_table->table[i].eth_addr, + eth_addr, sizeof(eth_addr)), + ip); + } + + return g_string_free(str, false); +} + int slirp_bind_outbound(struct socket *so, unsigned short af) { int ret = 0; diff --git a/src/network/slirp/ncsi-pkt.h b/src/network/slirp/ncsi-pkt.h index 7795ad83e..7694e68ff 100644 --- a/src/network/slirp/ncsi-pkt.h +++ b/src/network/slirp/ncsi-pkt.h @@ -40,6 +40,9 @@ #define __be32 uint32_t #define __be16 uint16_t +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_pkt_hdr { unsigned char mc_id; /* Management controller ID */ unsigned char revision; /* NCSI version - 0x01 */ @@ -49,64 +52,118 @@ struct ncsi_pkt_hdr { unsigned char channel; /* Network controller ID */ __be16 length; /* Payload length */ __be32 reserved1[2]; /* Reserved */ -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_cmd_pkt_hdr { struct ncsi_pkt_hdr common; /* Common NCSI packet header */ -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_rsp_pkt_hdr { struct ncsi_pkt_hdr common; /* Common NCSI packet header */ __be16 code; /* Response code */ __be16 reason; /* Response reason */ -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_aen_pkt_hdr { struct ncsi_pkt_hdr common; /* Common NCSI packet header */ unsigned char reserved2[3]; /* Reserved */ unsigned char type; /* AEN packet type */ -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* NCSI common command packet */ +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_cmd_pkt { struct ncsi_cmd_pkt_hdr cmd; /* Command header */ __be32 checksum; /* Checksum */ unsigned char pad[26]; -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_rsp_pkt { struct ncsi_rsp_pkt_hdr rsp; /* Response header */ __be32 checksum; /* Checksum */ unsigned char pad[22]; -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* Select Package */ +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_cmd_sp_pkt { struct ncsi_cmd_pkt_hdr cmd; /* Command header */ unsigned char reserved[3]; /* Reserved */ unsigned char hw_arbitration; /* HW arbitration */ __be32 checksum; /* Checksum */ unsigned char pad[22]; -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* Disable Channel */ +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_cmd_dc_pkt { struct ncsi_cmd_pkt_hdr cmd; /* Command header */ unsigned char reserved[3]; /* Reserved */ unsigned char ald; /* Allow link down */ __be32 checksum; /* Checksum */ unsigned char pad[22]; -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* Reset Channel */ +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_cmd_rc_pkt { struct ncsi_cmd_pkt_hdr cmd; /* Command header */ __be32 reserved; /* Reserved */ __be32 checksum; /* Checksum */ unsigned char pad[22]; -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* AEN Enable */ +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_cmd_ae_pkt { struct ncsi_cmd_pkt_hdr cmd; /* Command header */ unsigned char reserved[3]; /* Reserved */ @@ -114,18 +171,30 @@ struct ncsi_cmd_ae_pkt { __be32 mode; /* AEN working mode */ __be32 checksum; /* Checksum */ unsigned char pad[18]; -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* Set Link */ +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_cmd_sl_pkt { struct ncsi_cmd_pkt_hdr cmd; /* Command header */ __be32 mode; /* Link working mode */ __be32 oem_mode; /* OEM link mode */ __be32 checksum; /* Checksum */ unsigned char pad[18]; -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* Set VLAN Filter */ +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_cmd_svf_pkt { struct ncsi_cmd_pkt_hdr cmd; /* Command header */ __be16 reserved; /* Reserved */ @@ -135,18 +204,30 @@ struct ncsi_cmd_svf_pkt { unsigned char enable; /* Enable or disable */ __be32 checksum; /* Checksum */ unsigned char pad[14]; -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* Enable VLAN */ +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_cmd_ev_pkt { struct ncsi_cmd_pkt_hdr cmd; /* Command header */ unsigned char reserved[3]; /* Reserved */ unsigned char mode; /* VLAN filter mode */ __be32 checksum; /* Checksum */ unsigned char pad[22]; -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* Set MAC Address */ +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_cmd_sma_pkt { struct ncsi_cmd_pkt_hdr cmd; /* Command header */ unsigned char mac[6]; /* MAC address */ @@ -154,23 +235,38 @@ struct ncsi_cmd_sma_pkt { unsigned char at_e; /* Addr type and operation */ __be32 checksum; /* Checksum */ unsigned char pad[18]; -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* Enable Broadcast Filter */ +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_cmd_ebf_pkt { struct ncsi_cmd_pkt_hdr cmd; /* Command header */ __be32 mode; /* Filter mode */ __be32 checksum; /* Checksum */ unsigned char pad[22]; -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* Enable Global Multicast Filter */ +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_cmd_egmf_pkt { struct ncsi_cmd_pkt_hdr cmd; /* Command header */ __be32 mode; /* Global MC mode */ __be32 checksum; /* Checksum */ unsigned char pad[22]; -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* Set NCSI Flow Control */ struct ncsi_cmd_snfc_pkt { @@ -179,9 +275,15 @@ struct ncsi_cmd_snfc_pkt { unsigned char mode; /* Flow control mode */ __be32 checksum; /* Checksum */ unsigned char pad[22]; -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* Get Link Status */ +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_rsp_gls_pkt { struct ncsi_rsp_pkt_hdr rsp; /* Response header */ __be32 status; /* Link status */ @@ -189,9 +291,15 @@ struct ncsi_rsp_gls_pkt { __be32 oem_status; /* OEM link status */ __be32 checksum; unsigned char pad[10]; -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* Get Version ID */ +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_rsp_gvi_pkt { struct ncsi_rsp_pkt_hdr rsp; /* Response header */ __be32 ncsi_version; /* NCSI version */ @@ -202,9 +310,15 @@ struct ncsi_rsp_gvi_pkt { __be16 pci_ids[4]; /* PCI IDs */ __be32 mf_id; /* Manufacture ID */ __be32 checksum; -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* Get Capabilities */ +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_rsp_gc_pkt { struct ncsi_rsp_pkt_hdr rsp; /* Response header */ __be32 cap; /* Capabilities */ @@ -220,9 +334,15 @@ struct ncsi_rsp_gc_pkt { unsigned char vlan_mode; /* VLAN mode */ unsigned char channel_cnt; /* Channel count */ __be32 checksum; /* Checksum */ -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* Get Parameters */ +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_rsp_gp_pkt { struct ncsi_rsp_pkt_hdr rsp; /* Response header */ unsigned char mac_cnt; /* Number of MAC addr */ @@ -241,9 +361,15 @@ struct ncsi_rsp_gp_pkt { unsigned char mac[6]; /* Supported MAC addr */ __be16 vlan; /* Supported VLAN tags */ __be32 checksum; /* Checksum */ -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* Get Controller Packet Statistics */ +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_rsp_gcps_pkt { struct ncsi_rsp_pkt_hdr rsp; /* Response header */ __be32 cnt_hi; /* Counter cleared */ @@ -288,9 +414,15 @@ struct ncsi_rsp_gcps_pkt { __be32 rx_runt_pkts; /* Rx error runt packets */ __be32 rx_jabber_pkts; /* Rx error jabber packets */ __be32 checksum; /* Checksum */ -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* Get NCSI Statistics */ +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_rsp_gns_pkt { struct ncsi_rsp_pkt_hdr rsp; /* Response header */ __be32 rx_cmds; /* Rx NCSI commands */ @@ -301,9 +433,15 @@ struct ncsi_rsp_gns_pkt { __be32 tx_pkts; /* Tx NCSI packets */ __be32 tx_aen_pkts; /* Tx AEN packets */ __be32 checksum; /* Checksum */ -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* Get NCSI Pass-through Statistics */ +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_rsp_gnpts_pkt { struct ncsi_rsp_pkt_hdr rsp; /* Response header */ __be32 tx_pkts; /* Tx packets */ @@ -316,45 +454,78 @@ struct ncsi_rsp_gnpts_pkt { __be32 rx_us_err; /* Rx undersize errors */ __be32 rx_os_err; /* Rx oversize errors */ __be32 checksum; /* Checksum */ -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* Get package status */ +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_rsp_gps_pkt { struct ncsi_rsp_pkt_hdr rsp; /* Response header */ __be32 status; /* Hardware arbitration status */ __be32 checksum; -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* Get package UUID */ +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_rsp_gpuuid_pkt { struct ncsi_rsp_pkt_hdr rsp; /* Response header */ unsigned char uuid[16]; /* UUID */ __be32 checksum; -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* AEN: Link State Change */ +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_aen_lsc_pkt { struct ncsi_aen_pkt_hdr aen; /* AEN header */ __be32 status; /* Link status */ __be32 oem_status; /* OEM link status */ __be32 checksum; /* Checksum */ unsigned char pad[14]; -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* AEN: Configuration Required */ +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_aen_cr_pkt { struct ncsi_aen_pkt_hdr aen; /* AEN header */ __be32 checksum; /* Checksum */ unsigned char pad[22]; -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* AEN: Host Network Controller Driver Status Change */ +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_aen_hncdsc_pkt { struct ncsi_aen_pkt_hdr aen; /* AEN header */ __be32 status; /* Status */ __be32 checksum; /* Checksum */ unsigned char pad[18]; -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* NCSI packet revision */ #define NCSI_PKT_REVISION 0x01 diff --git a/src/network/slirp/ncsi.c b/src/network/slirp/ncsi.c index 3c1dfef1f..f3427bd66 100644 --- a/src/network/slirp/ncsi.c +++ b/src/network/slirp/ncsi.c @@ -38,7 +38,7 @@ #include "ncsi-pkt.h" -static uint32_t ncsi_calculate_checksum(uint16_t *data, int len) +static uint32_t ncsi_calculate_checksum(uint8_t *data, int len) { uint32_t checksum = 0; int i; @@ -47,8 +47,8 @@ static uint32_t ncsi_calculate_checksum(uint16_t *data, int len) * 32-bit unsigned sum of the NC-SI packet header and NC-SI packet * payload interpreted as a series of 16-bit unsigned integer values. */ - for (i = 0; i < len / 2; i++) { - checksum += htons(data[i]); + for (i = 0; i < len; i += 2) { + checksum += (((uint16_t) data[i]) << 8) + data[i+1]; } checksum = (~checksum + 1); @@ -148,6 +148,10 @@ void ncsi_input(Slirp *slirp, const uint8_t *pkt, int pkt_len) uint32_t checksum; uint32_t *pchecksum; + if (pkt_len < ETH_HLEN + sizeof(struct ncsi_pkt_hdr)) { + return; /* packet too short */ + } + memset(ncsi_reply, 0, sizeof(ncsi_reply)); memset(reh->h_dest, 0xff, ETH_ALEN); @@ -184,7 +188,7 @@ void ncsi_input(Slirp *slirp, const uint8_t *pkt, int pkt_len) } /* Add the optional checksum at the end of the frame. */ - checksum = ncsi_calculate_checksum((uint16_t *)rnh, ncsi_rsp_len); + checksum = ncsi_calculate_checksum((uint8_t *)rnh, ncsi_rsp_len); pchecksum = (uint32_t *)((void *)rnh + ncsi_rsp_len); *pchecksum = htonl(checksum); ncsi_rsp_len += 4; diff --git a/src/network/slirp/ndp_table.c b/src/network/slirp/ndp_table.c index 110d6ea0e..fdb189d59 100644 --- a/src/network/slirp/ndp_table.c +++ b/src/network/slirp/ndp_table.c @@ -12,13 +12,14 @@ void ndp_table_add(Slirp *slirp, struct in6_addr ip_addr, char addrstr[INET6_ADDRSTRLEN]; NdpTable *ndp_table = &slirp->ndp_table; int i; + char ethaddr_str[ETH_ADDRSTRLEN]; inet_ntop(AF_INET6, &(ip_addr), addrstr, INET6_ADDRSTRLEN); DEBUG_CALL("ndp_table_add"); DEBUG_ARG("ip = %s", addrstr); - DEBUG_ARG("hw addr = %02x:%02x:%02x:%02x:%02x:%02x", ethaddr[0], ethaddr[1], - ethaddr[2], ethaddr[3], ethaddr[4], ethaddr[5]); + DEBUG_ARG("hw addr = %s", slirp_ether_ntoa(ethaddr, ethaddr_str, + sizeof(ethaddr_str))); if (IN6_IS_ADDR_MULTICAST(&ip_addr) || in6_zero(&ip_addr)) { /* Do not register multicast or unspecified addresses */ @@ -38,6 +39,10 @@ void ndp_table_add(Slirp *slirp, struct in6_addr ip_addr, /* No entry found, create a new one */ DEBUG_CALL(" create new entry"); + /* Save the first entry, it is the guest. */ + if (in6_zero(&ndp_table->guest_in6_addr)) { + ndp_table->guest_in6_addr = ip_addr; + } ndp_table->table[ndp_table->next_victim].ip_addr = ip_addr; memcpy(ndp_table->table[ndp_table->next_victim].eth_addr, ethaddr, ETH_ALEN); @@ -50,13 +55,19 @@ bool ndp_table_search(Slirp *slirp, struct in6_addr ip_addr, char addrstr[INET6_ADDRSTRLEN]; NdpTable *ndp_table = &slirp->ndp_table; int i; + char ethaddr_str[ETH_ADDRSTRLEN]; inet_ntop(AF_INET6, &(ip_addr), addrstr, INET6_ADDRSTRLEN); DEBUG_CALL("ndp_table_search"); DEBUG_ARG("ip = %s", addrstr); - assert(!in6_zero(&ip_addr)); + /* If unspecified address */ + if (in6_zero(&ip_addr)) { + /* return Ethernet broadcast address */ + memset(out_ethaddr, 0xff, ETH_ALEN); + return 1; + } /* Multicast address: fec0::abcd:efgh/8 -> 33:33:ab:cd:ef:gh */ if (IN6_IS_ADDR_MULTICAST(&ip_addr)) { @@ -66,18 +77,18 @@ bool ndp_table_search(Slirp *slirp, struct in6_addr ip_addr, out_ethaddr[3] = ip_addr.s6_addr[13]; out_ethaddr[4] = ip_addr.s6_addr[14]; out_ethaddr[5] = ip_addr.s6_addr[15]; - DEBUG_ARG("multicast addr = %02x:%02x:%02x:%02x:%02x:%02x", - out_ethaddr[0], out_ethaddr[1], out_ethaddr[2], - out_ethaddr[3], out_ethaddr[4], out_ethaddr[5]); + DEBUG_ARG("multicast addr = %s", + slirp_ether_ntoa(out_ethaddr, ethaddr_str, + sizeof(ethaddr_str))); return 1; } for (i = 0; i < NDP_TABLE_SIZE; i++) { if (in6_equal(&ndp_table->table[i].ip_addr, &ip_addr)) { memcpy(out_ethaddr, ndp_table->table[i].eth_addr, ETH_ALEN); - DEBUG_ARG("found hw addr = %02x:%02x:%02x:%02x:%02x:%02x", - out_ethaddr[0], out_ethaddr[1], out_ethaddr[2], - out_ethaddr[3], out_ethaddr[4], out_ethaddr[5]); + DEBUG_ARG("found hw addr = %s", + slirp_ether_ntoa(out_ethaddr, ethaddr_str, + sizeof(ethaddr_str))); return 1; } } diff --git a/src/network/slirp/sbuf.c b/src/network/slirp/sbuf.c index 2fb917614..b35709170 100644 --- a/src/network/slirp/sbuf.c +++ b/src/network/slirp/sbuf.c @@ -68,7 +68,7 @@ void sbappend(struct socket *so, struct mbuf *m) if (so->so_urgc) { sbappendsb(&so->so_rcv, m); m_free(m); - (void)sosendoob(so); + sosendoob(so); return; } diff --git a/src/network/slirp/slirp.c b/src/network/slirp/slirp.c index 021324cdb..0c2a20a9b 100644 --- a/src/network/slirp/slirp.c +++ b/src/network/slirp/slirp.c @@ -34,6 +34,37 @@ #undef if_mtu #endif +#if defined(_WIN32) + +#define INITIAL_DNS_ADDR_BUF_SIZE 32 * 1024 +#define REALLOC_RETRIES 5 + +// Broadcast site local DNS resolvers. We do not use these because they are +// highly unlikely to be valid. +// https://www.ietf.org/proceedings/52/I-D/draft-ietf-ipngwg-dns-discovery-03.txt +static const struct in6_addr SITE_LOCAL_DNS_BROADCAST_ADDRS[] = { + { + {{ + 0xfe, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 + }} + }, + { + {{ + 0xfe, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 + }} + }, + { + {{ + 0xfe, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + }} + }, +}; + +#endif + int slirp_debug; /* Define to 1 if you want KEEPALIVE timers */ @@ -51,20 +82,17 @@ static const uint8_t special_ethaddr[ETH_ALEN] = { 0x52, 0x55, 0x00, unsigned curtime; static struct in_addr dns_addr; -#ifndef _WIN32 static struct in6_addr dns6_addr; -#endif +static uint32_t dns6_scope_id; static unsigned dns_addr_time; -#ifndef _WIN32 static unsigned dns6_addr_time; -#endif #define TIMEOUT_FAST 2 /* milliseconds */ #define TIMEOUT_SLOW 499 /* milliseconds */ /* for the aging of certain requests like DNS */ #define TIMEOUT_DEFAULT 1000 /* milliseconds */ -#ifdef _WIN32 +#if defined(_WIN32) int get_dns_addr(struct in_addr *pdns_addr) { @@ -111,8 +139,108 @@ int get_dns_addr(struct in_addr *pdns_addr) return 0; } +int is_site_local_dns_broadcast(struct in6_addr *address) +{ + int i; + for (i = 0; i < G_N_ELEMENTS(SITE_LOCAL_DNS_BROADCAST_ADDRS); i++) { + if (in6_equal(address, &SITE_LOCAL_DNS_BROADCAST_ADDRS[i])) { + return 1; + } + } + return 0; +} + +void print_dns_v6_address(struct in6_addr address) +{ + char address_str[INET6_ADDRSTRLEN] = ""; + if (inet_ntop(AF_INET6, &address, address_str, INET6_ADDRSTRLEN) + == NULL) { + DEBUG_ERROR("Failed to stringify IPv6 address for logging."); + return; + } + DEBUG_CALL("IPv6 DNS server found: %s", address_str); +} + +// Gets the first valid DNS resolver with an IPv6 address. +// Ignores any site local broadcast DNS servers, as these +// are on deprecated addresses and not generally expected +// to work. Further details at: +// https://www.ietf.org/proceedings/52/I-D/draft-ietf-ipngwg-dns-discovery-03.txt +int get_ipv6_dns_server(struct in6_addr *dns_server_address, uint32_t *scope_id) +{ + PIP_ADAPTER_ADDRESSES addresses = NULL; + PIP_ADAPTER_ADDRESSES address = NULL; + IP_ADAPTER_DNS_SERVER_ADDRESS *dns_server = NULL; + struct sockaddr_in6 *dns_v6_addr = NULL; + + ULONG buf_size = INITIAL_DNS_ADDR_BUF_SIZE; + DWORD res = ERROR_BUFFER_OVERFLOW; + int i; + + for (i = 0; i < REALLOC_RETRIES; i++) { + // If non null, we hit buffer overflow, free it so we can try again. + if (addresses != NULL) { + g_free(addresses); + } + + addresses = g_malloc(buf_size); + res = GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_PREFIX, NULL, + addresses, &buf_size); + + if (res != ERROR_BUFFER_OVERFLOW) { + break; + } + } + + if (res != NO_ERROR) { + DEBUG_ERROR("Failed to get IPv6 DNS addresses due to error %lX", res); + goto failure; + } + + address = addresses; + for (address = addresses; address != NULL; address = address->Next) { + for (dns_server = address->FirstDnsServerAddress; + dns_server != NULL; + dns_server = dns_server->Next) { + + if (dns_server->Address.lpSockaddr->sa_family != AF_INET6) { + continue; + } + + dns_v6_addr = (struct sockaddr_in6 *)dns_server->Address.lpSockaddr; + if (is_site_local_dns_broadcast(&dns_v6_addr->sin6_addr) == 0) { + print_dns_v6_address(dns_v6_addr->sin6_addr); + *dns_server_address = dns_v6_addr->sin6_addr; + *scope_id = dns_v6_addr->sin6_scope_id; + + g_free(addresses); + return 0; + } + } + } + + DEBUG_ERROR("No IPv6 DNS servers found.\n"); + +failure: + g_free(addresses); + return -1; +} + int get_dns6_addr(struct in6_addr *pdns6_addr, uint32_t *scope_id) { + if (!in6_zero(&dns6_addr) && (curtime - dns6_addr_time) < TIMEOUT_DEFAULT) { + *pdns6_addr = dns6_addr; + *scope_id = dns6_scope_id; + return 0; + } + + if (get_ipv6_dns_server(pdns6_addr, scope_id) == 0) { + dns6_addr = *pdns6_addr; + dns6_addr_time = curtime; + dns6_scope_id = *scope_id; + return 0; + } + return -1; } @@ -121,7 +249,122 @@ static void winsock_cleanup(void) WSACleanup(); } +#elif defined(__APPLE__) + +#include + +static int get_dns_addr_cached(void *pdns_addr, void *cached_addr, + socklen_t addrlen, unsigned *cached_time) +{ + if (curtime - *cached_time < TIMEOUT_DEFAULT) { + memcpy(pdns_addr, cached_addr, addrlen); + return 0; + } + return 1; +} + +static int get_dns_addr_libresolv(int af, void *pdns_addr, void *cached_addr, + socklen_t addrlen, + uint32_t *scope_id, uint32_t *cached_scope_id, + unsigned *cached_time) +{ + struct __res_state state; + union res_sockaddr_union servers[NI_MAXSERV]; + int count; + int found; + void *addr; + + // we only support IPv4 and IPv4, we assume it's one or the other + assert(af == AF_INET || af == AF_INET6); + + if (res_ninit(&state) != 0) { + return -1; + } + + count = res_getservers(&state, servers, NI_MAXSERV); + found = 0; + DEBUG_MISC("IP address of your DNS(s):"); + for (int i = 0; i < count; i++) { + if (af == servers[i].sin.sin_family) { + found++; + } + if (af == AF_INET) { + addr = &servers[i].sin.sin_addr; + } else { // af == AF_INET6 + addr = &servers[i].sin6.sin6_addr; + } + + // we use the first found entry + if (found == 1) { + memcpy(pdns_addr, addr, addrlen); + memcpy(cached_addr, addr, addrlen); + if (scope_id) { + *scope_id = 0; + } + if (cached_scope_id) { + *cached_scope_id = 0; + } + *cached_time = curtime; + } + + if (found > 3) { + DEBUG_MISC(" (more)"); + break; + } else if (slirp_debug & DBG_MISC) { + char s[INET6_ADDRSTRLEN]; + const char *res = inet_ntop(af, addr, s, sizeof(s)); + if (!res) { + res = " (string conversion error)"; + } + DEBUG_MISC(" %s", res); + } + } + + res_ndestroy(&state); + if (!found) + return -1; + return 0; +} + +int get_dns_addr(struct in_addr *pdns_addr) +{ + if (dns_addr.s_addr != 0) { + int ret; + ret = get_dns_addr_cached(pdns_addr, &dns_addr, sizeof(dns_addr), + &dns_addr_time); + if (ret <= 0) { + return ret; + } + } + return get_dns_addr_libresolv(AF_INET, pdns_addr, &dns_addr, + sizeof(dns_addr), NULL, NULL, &dns_addr_time); +} + +int get_dns6_addr(struct in6_addr *pdns6_addr, uint32_t *scope_id) +{ + if (!in6_zero(&dns6_addr)) { + int ret; + ret = get_dns_addr_cached(pdns6_addr, &dns6_addr, sizeof(dns6_addr), + &dns6_addr_time); + if (ret == 0) { + *scope_id = dns6_scope_id; + } + if (ret <= 0) { + return ret; + } + } + return get_dns_addr_libresolv(AF_INET6, pdns6_addr, &dns6_addr, + sizeof(dns6_addr), + scope_id, &dns6_scope_id, &dns6_addr_time); +} + +#else // !defined(_WIN32) && !defined(__APPLE__) + +#if defined(__HAIKU__) +#define RESOLV_CONF_PATH "/boot/system/settings/network/resolv.conf" #else +#define RESOLV_CONF_PATH "/etc/resolv.conf" +#endif static int get_dns_addr_cached(void *pdns_addr, void *cached_addr, socklen_t addrlen, struct stat *cached_stat, @@ -133,7 +376,7 @@ static int get_dns_addr_cached(void *pdns_addr, void *cached_addr, return 0; } old_stat = *cached_stat; - if (stat("/etc/resolv.conf", cached_stat) != 0) { + if (stat(RESOLV_CONF_PATH, cached_stat) != 0) { return -1; } if (cached_stat->st_dev == old_stat.st_dev && @@ -147,17 +390,22 @@ static int get_dns_addr_cached(void *pdns_addr, void *cached_addr, } static int get_dns_addr_resolv_conf(int af, void *pdns_addr, void *cached_addr, - socklen_t addrlen, uint32_t *scope_id, + socklen_t addrlen, + uint32_t *scope_id, uint32_t *cached_scope_id, unsigned *cached_time) { char buff[512]; char buff2[257]; FILE *f; int found = 0; - void *tmp_addr = alloca(addrlen); + union { + struct in_addr dns_addr; + struct in6_addr dns6_addr; + } tmp_addr; unsigned if_index; - f = fopen("/etc/resolv.conf", "r"); + assert(sizeof(tmp_addr) >= addrlen); + f = fopen(RESOLV_CONF_PATH, "r"); if (!f) return -1; @@ -172,16 +420,19 @@ static int get_dns_addr_resolv_conf(int af, void *pdns_addr, void *cached_addr, if_index = 0; } - if (!inet_pton(af, buff2, tmp_addr)) { + if (!inet_pton(af, buff2, &tmp_addr)) { continue; } /* If it's the first one, set it to dns_addr */ if (!found) { - memcpy(pdns_addr, tmp_addr, addrlen); - memcpy(cached_addr, tmp_addr, addrlen); + memcpy(pdns_addr, &tmp_addr, addrlen); + memcpy(cached_addr, &tmp_addr, addrlen); if (scope_id) { *scope_id = if_index; } + if (cached_scope_id) { + *cached_scope_id = if_index; + } *cached_time = curtime; } @@ -190,7 +441,7 @@ static int get_dns_addr_resolv_conf(int af, void *pdns_addr, void *cached_addr, break; } else if (slirp_debug & DBG_MISC) { char s[INET6_ADDRSTRLEN]; - const char *res = inet_ntop(af, tmp_addr, s, sizeof(s)); + const char *res = inet_ntop(af, &tmp_addr, s, sizeof(s)); if (!res) { res = " (string conversion error)"; } @@ -217,7 +468,8 @@ int get_dns_addr(struct in_addr *pdns_addr) } } return get_dns_addr_resolv_conf(AF_INET, pdns_addr, &dns_addr, - sizeof(dns_addr), NULL, &dns_addr_time); + sizeof(dns_addr), + NULL, NULL, &dns_addr_time); } int get_dns6_addr(struct in6_addr *pdns6_addr, uint32_t *scope_id) @@ -228,13 +480,16 @@ int get_dns6_addr(struct in6_addr *pdns6_addr, uint32_t *scope_id) int ret; ret = get_dns_addr_cached(pdns6_addr, &dns6_addr, sizeof(dns6_addr), &dns6_addr_stat, &dns6_addr_time); + if (ret == 0) { + *scope_id = dns6_scope_id; + } if (ret <= 0) { return ret; } } return get_dns_addr_resolv_conf(AF_INET6, pdns6_addr, &dns6_addr, - sizeof(dns6_addr), scope_id, - &dns6_addr_time); + sizeof(dns6_addr), + scope_id, &dns6_scope_id, &dns6_addr_time); } #endif @@ -267,11 +522,49 @@ static void slirp_init_once(void) { "misc", DBG_MISC }, { "error", DBG_ERROR }, { "tftp", DBG_TFTP }, + { "verbose_call", DBG_VERBOSE_CALL }, }; slirp_debug = g_parse_debug_string(debug, keys, G_N_ELEMENTS(keys)); } } +static void ra_timer_handler_cb(void *opaque) +{ + Slirp *slirp = opaque; + + return ra_timer_handler(slirp, NULL); +} + +void slirp_handle_timer(Slirp *slirp, SlirpTimerId id, void *cb_opaque) +{ +// g_return_if_fail(id >= 0 && id < SLIRP_TIMER_NUM); + + switch (id) { + case SLIRP_TIMER_RA: + return ra_timer_handler(slirp, cb_opaque); + default: + abort(); + } +} + +void *slirp_timer_new(Slirp *slirp, SlirpTimerId id, void *cb_opaque) +{ + g_return_val_if_fail(id >= 0 && id < SLIRP_TIMER_NUM, NULL); + + if (slirp->cfg_version >= 4 && slirp->cb->timer_new_opaque) { + return slirp->cb->timer_new_opaque(id, cb_opaque, slirp->opaque); + } + + switch (id) { + case SLIRP_TIMER_RA: + g_return_val_if_fail(cb_opaque == NULL, NULL); + return slirp->cb->timer_new(ra_timer_handler_cb, slirp, slirp->opaque); + + default: + abort(); + } +} + Slirp *slirp_new(const SlirpConfig *cfg, const SlirpCb *callbacks, void *opaque) { Slirp *slirp; @@ -291,6 +584,7 @@ Slirp *slirp_new(const SlirpConfig *cfg, const SlirpCb *callbacks, void *opaque) slirp_init_once(); + slirp->cfg_version = cfg->version; slirp->opaque = opaque; slirp->cb = callbacks; slirp->grand = g_rand_new(); @@ -301,7 +595,6 @@ Slirp *slirp_new(const SlirpConfig *cfg, const SlirpCb *callbacks, void *opaque) if_init(slirp); ip_init(slirp); - ip6_init(slirp); m_init(slirp); @@ -345,6 +638,17 @@ Slirp *slirp_new(const SlirpConfig *cfg, const SlirpCb *callbacks, void *opaque) slirp->disable_dns = false; } + if (cfg->version >= 4) { + slirp->disable_dhcp = cfg->disable_dhcp; + } else { + slirp->disable_dhcp = false; + } + + if (slirp->cfg_version >= 4 && slirp->cb->init_completed) { + slirp->cb->init_completed(slirp, slirp->opaque); + } + + ip6_post_init(slirp); return slirp; } @@ -501,7 +805,10 @@ void slirp_pollfds_fill(Slirp *slirp, uint32_t *timeout, /* * Set for reading (and urgent data) if we are connected, can - * receive more, and we have room for it XXX /2 ? + * receive more, and we have room for it. + * + * If sb is already half full, we will wait for the guest to consume it, + * and notify again in sbdrop() when the sb becomes less than half full. */ if (CONN_CANFRCV(so) && (so->so_snd.sb_cc < (so->so_snd.sb_datalen / 2))) { @@ -623,10 +930,16 @@ void slirp_pollfds_poll(Slirp *slirp, int select_error, continue; } +#ifndef __APPLE__ /* * Check for URG data * This will soread as well, so no need to - * test for SLIRP_POLL_IN below if this succeeds + * test for SLIRP_POLL_IN below if this succeeds. + * + * This is however disabled on MacOS, which apparently always + * reports data as PRI when it is the last data of the + * connection. We would then report it out of band, which the guest + * would most probably not be ready for. */ if (revents & SLIRP_POLL_PRI) { ret = sorecvoob(so); @@ -639,8 +952,10 @@ void slirp_pollfds_poll(Slirp *slirp, int select_error, /* * Check sockets for reading */ - else if (revents & - (SLIRP_POLL_IN | SLIRP_POLL_HUP | SLIRP_POLL_ERR)) { + else +#endif + if (revents & + (SLIRP_POLL_IN | SLIRP_POLL_HUP | SLIRP_POLL_ERR | SLIRP_POLL_PRI)) { /* * Check for incoming connections */ @@ -763,6 +1078,10 @@ static void arp_input(Slirp *slirp, const uint8_t *pkt, int pkt_len) return; } + if (pkt_len < ETH_HLEN + sizeof(struct slirp_arphdr)) { + return; /* packet too short */ + } + ar_op = ntohs(ah->ar_op); switch (ar_op) { case ARPOP_REQUEST: @@ -953,6 +1272,7 @@ int if_encap(Slirp *slirp, struct mbuf *ifm) uint8_t ethaddr[ETH_ALEN]; const struct ip *iph = (const struct ip *)ifm->m_data; int ret; +// char ethaddr_str[ETH_ADDRSTRLEN]; if (ifm->m_len + ETH_HLEN > sizeof(buf)) { return 1; @@ -978,19 +1298,18 @@ int if_encap(Slirp *slirp, struct mbuf *ifm) } memcpy(eh->h_dest, ethaddr, ETH_ALEN); - DEBUG_ARG("src = %02x:%02x:%02x:%02x:%02x:%02x", eh->h_source[0], - eh->h_source[1], eh->h_source[2], eh->h_source[3], - eh->h_source[4], eh->h_source[5]); - DEBUG_ARG("dst = %02x:%02x:%02x:%02x:%02x:%02x", eh->h_dest[0], - eh->h_dest[1], eh->h_dest[2], eh->h_dest[3], eh->h_dest[4], - eh->h_dest[5]); +/* + DEBUG_ARG("src = %s", slirp_ether_ntoa(eh->h_source, ethaddr_str, + sizeof(ethaddr_str))); + DEBUG_ARG("dst = %s", slirp_ether_ntoa(eh->h_dest, ethaddr_str, + sizeof(ethaddr_str))); +*/ memcpy(buf + sizeof(struct ethhdr), ifm->m_data, ifm->m_len); slirp_send_packet_all(slirp, buf, ifm->m_len + ETH_HLEN); return 1; } /* Drop host forwarding rule, return 0 if found. */ -/* TODO: IPv6 */ int slirp_remove_hostfwd(Slirp *slirp, int is_udp, struct in_addr host_addr, int host_port) { @@ -1004,7 +1323,10 @@ int slirp_remove_hostfwd(Slirp *slirp, int is_udp, struct in_addr host_addr, addr_len = sizeof(addr); if ((so->so_state & SS_HOSTFWD) && getsockname(so->s, (struct sockaddr *)&addr, &addr_len) == 0 && - addr.sin_addr.s_addr == host_addr.s_addr && addr.sin_port == port) { + addr_len == sizeof(addr) && + addr.sin_family == AF_INET && + addr.sin_addr.s_addr == host_addr.s_addr && + addr.sin_port == port) { so->slirp->cb->unregister_poll_fd(so->s, so->slirp->opaque); closesocket(so->s); sofree(so); @@ -1015,7 +1337,6 @@ int slirp_remove_hostfwd(Slirp *slirp, int is_udp, struct in_addr host_addr, return -1; } -/* TODO: IPv6 */ 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) { @@ -1034,6 +1355,83 @@ int slirp_add_hostfwd(Slirp *slirp, int is_udp, struct in_addr host_addr, return 0; } +int slirp_remove_hostxfwd(Slirp *slirp, + const struct sockaddr *haddr, socklen_t haddrlen, + int flags) +{ + struct socket *so; + struct socket *head = (flags & SLIRP_HOSTFWD_UDP ? &slirp->udb : &slirp->tcb); + struct sockaddr_storage addr; + socklen_t addr_len; + + for (so = head->so_next; so != head; so = so->so_next) { + addr_len = sizeof(addr); + if ((so->so_state & SS_HOSTFWD) && + getsockname(so->s, (struct sockaddr *)&addr, &addr_len) == 0 && + sockaddr_equal(&addr, (const struct sockaddr_storage *) haddr)) { + so->slirp->cb->unregister_poll_fd(so->s, so->slirp->opaque); + closesocket(so->s); + sofree(so); + return 0; + } + } + + return -1; +} + +int slirp_add_hostxfwd(Slirp *slirp, + const struct sockaddr *haddr, socklen_t haddrlen, + const struct sockaddr *gaddr, socklen_t gaddrlen, + int flags) +{ + struct sockaddr_in gdhcp_addr; + int fwd_flags = SS_HOSTFWD; + + if (flags & SLIRP_HOSTFWD_V6ONLY) + fwd_flags |= SS_HOSTFWD_V6ONLY; + + if (gaddr->sa_family == AF_INET) { + const struct sockaddr_in *gaddr_in = (const struct sockaddr_in *) gaddr; + + if (gaddrlen < sizeof(struct sockaddr_in)) { + errno = EINVAL; + return -1; + } + + if (!gaddr_in->sin_addr.s_addr) { + gdhcp_addr = *gaddr_in; + gdhcp_addr.sin_addr = slirp->vdhcp_startaddr; + gaddr = (struct sockaddr *) &gdhcp_addr; + gaddrlen = sizeof(gdhcp_addr); + } + } else { + if (gaddrlen < sizeof(struct sockaddr_in6)) { + errno = EINVAL; + return -1; + } + + /* + * Libslirp currently only provides a stateless DHCPv6 server, thus + * we can't translate "addr-any" to the guest here. Instead, we defer + * performing the translation to when it's needed. See + * soassign_guest_addr_if_needed(). + */ + } + + if (flags & SLIRP_HOSTFWD_UDP) { + if (!udpx_listen(slirp, haddr, haddrlen, + gaddr, gaddrlen, + fwd_flags)) + return -1; + } else { + if (!tcpx_listen(slirp, haddr, haddrlen, + gaddr, gaddrlen, + fwd_flags)) + return -1; + } + return 0; +} + /* TODO: IPv6 */ static bool check_guestfwd(Slirp *slirp, struct in_addr *guest_addr, int guest_port) @@ -1158,6 +1556,8 @@ size_t slirp_socket_can_recv(Slirp *slirp, struct in_addr guest_addr, } if (!CONN_CANFRCV(so) || so->so_snd.sb_cc >= (so->so_snd.sb_datalen / 2)) { + /* If the sb is already half full, we will wait for the guest to consume it, + * and notify again in sbdrop() when the sb becomes less than half full. */ return 0; } diff --git a/src/network/slirp/slirp.h b/src/network/slirp/slirp.h index d996b53ed..e50c2ffe4 100644 --- a/src/network/slirp/slirp.h +++ b/src/network/slirp/slirp.h @@ -6,7 +6,7 @@ /* as defined in sdkddkver.h */ #ifndef _WIN32_WINNT -#define _WIN32_WINNT 0x0600 /* Vista */ +#define _WIN32_WINNT 0x0600 /* Windows Vista */ #endif /* reduces the number of implicitly included headers */ #ifndef WIN32_LEAN_AND_MEAN @@ -20,10 +20,8 @@ #include #else -#if !defined(__HAIKU__) #define O_BINARY 0 #endif -#endif #ifndef _WIN32 #include @@ -37,12 +35,6 @@ #include #endif -/* Avoid conflicting with the libc insque() and remque(), which - have different prototypes. */ -#define insque slirp_insque -#define remque slirp_remque -#define quehead slirp_quehead - #include "debug.h" #include "util.h" @@ -88,9 +80,9 @@ struct slirp_arphdr { /* * Ethernet looks like this : This bit is variable sized however... */ - unsigned char ar_sha[ETH_ALEN]; /* sender hardware address */ + uint8_t ar_sha[ETH_ALEN]; /* sender hardware address */ uint32_t ar_sip; /* sender IP address */ - unsigned char ar_tha[ETH_ALEN]; /* target hardware address */ + uint8_t ar_tha[ETH_ALEN]; /* target hardware address */ uint32_t ar_tip; /* target IP address */ } SLIRP_PACKED; #if defined(_MSC_VER) && !defined (__clang__) @@ -111,7 +103,7 @@ bool arp_table_search(Slirp *slirp, uint32_t ip_addr, uint8_t out_ethaddr[ETH_ALEN]); struct ndpentry { - unsigned char eth_addr[ETH_ALEN]; /* sender hardware address */ + uint8_t eth_addr[ETH_ALEN]; /* sender hardware address */ struct in6_addr ip_addr; /* sender IP address */ }; @@ -119,6 +111,12 @@ struct ndpentry { typedef struct NdpTable { struct ndpentry table[NDP_TABLE_SIZE]; + /* + * The table is a cache with old entries overwritten when the table fills. + * Preserve the first entry: it is the guest, which is needed for lazy + * hostfwd guest address assignment. + */ + struct in6_addr guest_in6_addr; int next_victim; } NdpTable; @@ -128,6 +126,8 @@ bool ndp_table_search(Slirp *slirp, struct in6_addr ip_addr, uint8_t out_ethaddr[ETH_ALEN]); struct Slirp { + int cfg_version; + unsigned time_fasttimo; unsigned last_slowtimo; bool do_slowtimo; @@ -141,6 +141,7 @@ struct Slirp { struct in6_addr vprefix_addr6; uint8_t vprefix_len; struct in6_addr vhost_addr6; + bool disable_dhcp; /* slirp will not reply to any DHCP requests */ struct in_addr vdhcp_startaddr; struct in_addr vnameserver_addr; struct in6_addr vnameserver_addr6; @@ -157,13 +158,13 @@ struct Slirp { bool disable_host_loopback; /* mbuf states */ - struct quehead m_freelist; - struct quehead m_usedlist; + struct slirp_quehead m_freelist; + struct slirp_quehead m_usedlist; int mbuf_alloced; /* if states */ - struct quehead if_fastq; /* fast queue (for interactive data) */ - struct quehead if_batchq; /* queue for non-interactive data */ + struct slirp_quehead if_fastq; /* fast queue (for interactive data) */ + struct slirp_quehead if_batchq; /* queue for non-interactive data */ bool if_start_busy; /* avoid if_start recursion */ /* ip states */ @@ -251,7 +252,7 @@ void ip_stripoptions(register struct mbuf *, struct mbuf *); int ip_output(struct socket *, struct mbuf *); /* ip6_input.c */ -void ip6_init(Slirp *); +void ip6_post_init(Slirp *); void ip6_cleanup(Slirp *); void ip6_input(struct mbuf *); @@ -287,5 +288,6 @@ struct socket *slirp_find_ctl_socket(Slirp *slirp, struct in_addr guest_addr, int guest_port); void slirp_send_packet_all(Slirp *slirp, const void *buf, size_t len); +void *slirp_timer_new(Slirp *slirp, SlirpTimerId id, void *cb_opaque); #endif diff --git a/src/network/slirp/socket.c b/src/network/slirp/socket.c index 36d005192..22144ffb8 100644 --- a/src/network/slirp/socket.c +++ b/src/network/slirp/socket.c @@ -8,6 +8,9 @@ #ifdef __sun__ #include #endif +#ifdef __linux__ +#include +#endif static void sofcantrcvmore(struct socket *so); static void sofcantsendmore(struct socket *so); @@ -38,15 +41,17 @@ struct socket *solookup(struct socket **last, struct socket *head, /* * Create a new socket, initialise the fields * It is the responsibility of the caller to - * insque() it into the correct linked-list + * slirp_insque() it into the correct linked-list */ -struct socket *socreate(Slirp *slirp) +struct socket *socreate(Slirp *slirp, int type) { struct socket *so = g_new(struct socket, 1); memset(so, 0, sizeof(struct socket)); + so->so_type = type; so->so_state = SS_NOFDREF; so->s = -1; + so->s_aux = -1; so->slirp = slirp; so->pollfds_idx = -1; @@ -56,11 +61,11 @@ struct socket *socreate(Slirp *slirp) /* * Remove references to so from the given message queue. */ -static void soqfree(struct socket *so, struct quehead *qh) +static void soqfree(struct socket *so, struct slirp_quehead *qh) { struct mbuf *ifq; - for (ifq = (struct mbuf *)qh->qh_link; (struct quehead *)ifq != qh; + for (ifq = (struct mbuf *)qh->qh_link; (struct slirp_quehead *)ifq != qh; ifq = ifq->ifq_next) { if (ifq->ifq_so == so) { struct mbuf *ifm; @@ -73,12 +78,16 @@ static void soqfree(struct socket *so, struct quehead *qh) } /* - * remque and free a socket, clobber cache + * slirp_remque and free a socket, clobber cache */ void sofree(struct socket *so) { Slirp *slirp = so->slirp; + if (so->s_aux != -1) { + closesocket(so->s_aux); + } + soqfree(so, &slirp->if_fastq); soqfree(so, &slirp->if_batchq); @@ -92,7 +101,7 @@ void sofree(struct socket *so) m_free(so->so_m); if (so->so_next && so->so_prev) - remque(so); /* crashes if so is not in a queue */ + slirp_remque(so); /* crashes if so is not in a queue */ if (so->so_tcpcb) { g_free(so->so_tcpcb); @@ -208,8 +217,8 @@ int soread(struct socket *so) errno, strerror(errno)); sofcantrcvmore(so); - if (err == ECONNRESET || err == ECONNREFUSED || err == ENOTCONN || - err == EPIPE) { + if (err == ECONNABORTED || err == ECONNRESET || err == ECONNREFUSED || + err == ENOTCONN || err == EPIPE) { tcp_drop(sototcpcb(so), err); } else { tcp_sockclosed(sototcpcb(so)); @@ -336,8 +345,8 @@ int sosendoob(struct socket *so) DEBUG_ARG("so = %p", so); DEBUG_ARG("sb->sb_cc = %d", sb->sb_cc); - if (so->so_urgc > 2048) - so->so_urgc = 2048; /* XXXX */ + if (so->so_urgc > sizeof(buff)) + so->so_urgc = sizeof(buff); /* XXXX */ if (sb->sb_rptr < sb->sb_wptr) { /* We can send it directly */ @@ -349,7 +358,7 @@ int sosendoob(struct socket *so) * we must copy all data to a linear buffer then * send it all */ - uint32_t urgc = so->so_urgc; + uint32_t urgc = so->so_urgc; /* Amount of room left in buff */ int len = (sb->sb_data + sb->sb_datalen) - sb->sb_rptr; if (len > urgc) { len = urgc; @@ -357,6 +366,7 @@ int sosendoob(struct socket *so) memcpy(buff, sb->sb_rptr, len); urgc -= len; if (urgc) { + /* We still have some room for the rest */ n = sb->sb_wptr - sb->sb_data; if (n > urgc) { n = urgc; @@ -365,7 +375,7 @@ int sosendoob(struct socket *so) len += n; } n = slirp_send(so, buff, len, (MSG_OOB)); /* |MSG_DONTWAIT)); */ -#ifdef DEBUG +#ifdef SLIRP_DEBUG if (n != len) { DEBUG_ERROR("Didn't send all data urgently XXXXX"); } @@ -493,12 +503,67 @@ void sorecvfrom(struct socket *so) struct sockaddr_storage addr; struct sockaddr_storage saddr, daddr; socklen_t addrlen = sizeof(struct sockaddr_storage); + char buff[256]; + +#ifdef __linux__ + ssize_t size; + struct msghdr msg; + struct iovec iov; + char control[1024]; + + /* First look for errors */ + memset(&msg, 0, sizeof(msg)); + msg.msg_name = &saddr; + msg.msg_namelen = sizeof(saddr); + msg.msg_control = control; + msg.msg_controllen = sizeof(control); + iov.iov_base = buff; + iov.iov_len = sizeof(buff); + msg.msg_iov = &iov; + msg.msg_iovlen = 1; + + size = recvmsg(so->s, &msg, MSG_ERRQUEUE); + if (size >= 0) { + struct cmsghdr *cmsg; + for (cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) { + + if (cmsg->cmsg_level == IPPROTO_IP && + cmsg->cmsg_type == IP_RECVERR) { + struct sock_extended_err *ee = + (struct sock_extended_err *) CMSG_DATA(cmsg); + + if (ee->ee_origin == SO_EE_ORIGIN_ICMP) { + /* Got an ICMP error, forward it */ + struct sockaddr_in *sin; + + sin = (struct sockaddr_in *) SO_EE_OFFENDER(ee); + icmp_forward_error(so->so_m, ee->ee_type, ee->ee_code, + 0, NULL, &sin->sin_addr); + } + } + else if (cmsg->cmsg_level == IPPROTO_IPV6 && + cmsg->cmsg_type == IPV6_RECVERR) { + struct sock_extended_err *ee = + (struct sock_extended_err *) CMSG_DATA(cmsg); + + if (ee->ee_origin == SO_EE_ORIGIN_ICMP6) { + /* Got an ICMPv6 error, forward it */ + struct sockaddr_in6 *sin6; + + sin6 = (struct sockaddr_in6 *) SO_EE_OFFENDER(ee); + icmp6_forward_error(so->so_m, ee->ee_type, ee->ee_code, + &sin6->sin6_addr); + } + } + } + return; + } +#endif DEBUG_CALL("sorecvfrom"); DEBUG_ARG("so = %p", so); if (so->so_type == IPPROTO_ICMP) { /* This is a "ping" reply */ - char buff[256]; int len; len = recvfrom(so->s, buff, 256, 0, (struct sockaddr *)&addr, &addrlen); @@ -533,9 +598,6 @@ void sorecvfrom(struct socket *so) DEBUG_MISC(" ioctlsocket errno = %d-%s\n", errno, strerror(errno)); return; } - if (n == 0) { - return; - } m = m_get(so->slirp); if (!m) { @@ -624,6 +686,28 @@ void sorecvfrom(struct socket *so) */ saddr = addr; sotranslate_in(so, &saddr); + + /* Perform lazy guest IP address resolution if needed. */ + if (so->so_state & SS_HOSTFWD) { + if (soassign_guest_addr_if_needed(so) < 0) { + DEBUG_MISC(" guest address not available yet"); + switch (so->so_lfamily) { + case AF_INET: + icmp_send_error(so->so_m, ICMP_UNREACH, + ICMP_UNREACH_HOST, 0, + "guest address not available yet"); + break; + case AF_INET6: + icmp6_send_error(so->so_m, ICMP6_UNREACH, + ICMP6_UNREACH_ADDRESS); + break; + default: + g_assert_not_reached(); + } + m_free(m); + return; + } + } daddr = so->lhost.ss; switch (so->so_ffamily) { @@ -679,32 +763,67 @@ int sosendto(struct socket *so, struct mbuf *m) /* * Listen for incoming TCP connections + * On failure errno contains the reason. */ -struct socket *tcp_listen(Slirp *slirp, uint32_t haddr, unsigned hport, - uint32_t laddr, unsigned lport, int flags) +struct socket *tcpx_listen(Slirp *slirp, + const struct sockaddr *haddr, socklen_t haddrlen, + const struct sockaddr *laddr, socklen_t laddrlen, + int flags) { - /* TODO: IPv6 */ - struct sockaddr_in addr; struct socket *so; int s, opt = 1; - socklen_t addrlen = sizeof(addr); - memset(&addr, 0, addrlen); + socklen_t addrlen; - DEBUG_CALL("tcp_listen"); - DEBUG_ARG("haddr = %s", inet_ntoa((struct in_addr){ .s_addr = haddr })); - DEBUG_ARG("hport = %d", ntohs(hport)); - DEBUG_ARG("laddr = %s", inet_ntoa((struct in_addr){ .s_addr = laddr })); - DEBUG_ARG("lport = %d", ntohs(lport)); + DEBUG_CALL("tcpx_listen"); + /* AF_INET6 addresses are bigger than AF_INET, so this is big enough. */ + char addrstr[INET6_ADDRSTRLEN]; + char portstr[6]; + int ret; + switch (haddr->sa_family) { + case AF_INET: + case AF_INET6: + ret = getnameinfo(haddr, haddrlen, addrstr, sizeof(addrstr), portstr, sizeof(portstr), NI_NUMERICHOST|NI_NUMERICSERV); + g_assert(ret == 0); + DEBUG_ARG("hfamily = INET"); + DEBUG_ARG("haddr = %s", addrstr); + DEBUG_ARG("hport = %s", portstr); + break; +#ifndef _WIN32 + case AF_UNIX: + DEBUG_ARG("hfamily = UNIX"); + DEBUG_ARG("hpath = %s", ((struct sockaddr_un *) haddr)->sun_path); + break; +#endif + default: + g_assert_not_reached(); + } + switch (laddr->sa_family) { + case AF_INET: + case AF_INET6: + ret = getnameinfo(laddr, laddrlen, addrstr, sizeof(addrstr), portstr, sizeof(portstr), NI_NUMERICHOST|NI_NUMERICSERV); + g_assert(ret == 0); + DEBUG_ARG("laddr = %s", addrstr); + DEBUG_ARG("lport = %s", portstr); + break; + default: + g_assert_not_reached(); + } DEBUG_ARG("flags = %x", flags); - so = socreate(slirp); + /* + * SS_HOSTFWD sockets can be accepted multiple times, so they can't be + * SS_FACCEPTONCE. Also, SS_HOSTFWD connections can be accepted and + * immediately closed if the guest address isn't available yet, which is + * incompatible with the "accept once" concept. Correct code will never + * request both, so disallow their combination by assertion. + */ + g_assert(!((flags & SS_HOSTFWD) && (flags & SS_FACCEPTONCE))); + + so = socreate(slirp, IPPROTO_TCP); /* Don't tcp_attach... we don't need so_snd nor so_rcv */ - if ((so->so_tcpcb = tcp_newtcpcb(so)) == NULL) { - g_free(so); - return NULL; - } - insque(so, &slirp->tcb); + so->so_tcpcb = tcp_newtcpcb(so); + slirp_insque(so, &slirp->tcb); /* * SS_FACCEPTONCE sockets must time out. @@ -714,20 +833,16 @@ struct socket *tcp_listen(Slirp *slirp, uint32_t haddr, unsigned hport, so->so_state &= SS_PERSISTENT_MASK; so->so_state |= (SS_FACCEPTCONN | flags); - so->so_lfamily = AF_INET; - so->so_lport = lport; /* Kept in network format */ - so->so_laddr.s_addr = laddr; /* Ditto */ - addr.sin_family = AF_INET; - addr.sin_addr.s_addr = haddr; - addr.sin_port = hport; + sockaddr_copy(&so->lhost.sa, sizeof(so->lhost), laddr, laddrlen); - if (((s = slirp_socket(AF_INET, SOCK_STREAM, 0)) < 0) || + s = slirp_socket(haddr->sa_family, SOCK_STREAM, 0); + if ((s < 0) || + (haddr->sa_family == AF_INET6 && slirp_socket_set_v6only(s, (flags & SS_HOSTFWD_V6ONLY) != 0) < 0) || (slirp_socket_set_fast_reuse(s) < 0) || - (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) || + (bind(s, haddr, haddrlen) < 0) || (listen(s, 1) < 0)) { int tmperrno = errno; /* Don't clobber the real reason we failed */ - if (s >= 0) { closesocket(s); } @@ -741,22 +856,34 @@ struct socket *tcp_listen(Slirp *slirp, uint32_t haddr, unsigned hport, return NULL; } setsockopt(s, SOL_SOCKET, SO_OOBINLINE, &opt, sizeof(int)); - opt = 1; - setsockopt(s, IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(int)); + slirp_socket_set_nodelay(s); - getsockname(s, (struct sockaddr *)&addr, &addrlen); - so->so_ffamily = AF_INET; - so->so_fport = addr.sin_port; - if (addr.sin_addr.s_addr == 0 || - addr.sin_addr.s_addr == loopback_addr.s_addr) - so->so_faddr = slirp->vhost_addr; - else - so->so_faddr = addr.sin_addr; + addrlen = sizeof(so->fhost); + getsockname(s, &so->fhost.sa, &addrlen); + sotranslate_accept(so); so->s = s; return so; } +struct socket *tcp_listen(Slirp *slirp, uint32_t haddr, unsigned hport, + uint32_t laddr, unsigned lport, int flags) +{ + struct sockaddr_in hsa, lsa; + + memset(&hsa, 0, sizeof(hsa)); + hsa.sin_family = AF_INET; + hsa.sin_addr.s_addr = haddr; + hsa.sin_port = hport; + + memset(&lsa, 0, sizeof(lsa)); + lsa.sin_family = AF_INET; + lsa.sin_addr.s_addr = laddr; + lsa.sin_port = lport; + + return tcpx_listen(slirp, (const struct sockaddr *) &hsa, sizeof(hsa), (struct sockaddr *) &lsa, sizeof(lsa), flags); +} + /* * Various session state calls * XXX Should be #define's @@ -941,6 +1068,108 @@ void sotranslate_accept(struct socket *so) } break; + case AF_UNIX: { + /* Translate Unix socket to random ephemeral source port. We obtain + * this source port by binding to port 0 so that the OS allocates a + * port for us. If this fails, we fall back to choosing a random port + * with a random number generator. */ + int s; + struct sockaddr_in in_addr; + struct sockaddr_in6 in6_addr; + socklen_t in_addr_len; + + if (so->slirp->in_enabled) { + so->so_ffamily = AF_INET; + so->so_faddr = slirp->vhost_addr; + so->so_fport = 0; + + switch (so->so_type) { + case IPPROTO_TCP: + s = slirp_socket(PF_INET, SOCK_STREAM, 0); + break; + case IPPROTO_UDP: + s = slirp_socket(PF_INET, SOCK_DGRAM, 0); + break; + default: + g_assert_not_reached(); + break; + } + if (s < 0) { + g_error("Ephemeral slirp_socket() allocation failed"); + goto unix2inet_cont; + } + memset(&in_addr, 0, sizeof(in_addr)); + in_addr.sin_family = AF_INET; + in_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + in_addr.sin_port = htons(0); + if (bind(s, (struct sockaddr *) &in_addr, sizeof(in_addr))) { + g_error("Ephemeral bind() failed"); + closesocket(s); + goto unix2inet_cont; + } + in_addr_len = sizeof(in_addr); + if (getsockname(s, (struct sockaddr *) &in_addr, &in_addr_len)) { + g_error("Ephemeral getsockname() failed"); + closesocket(s); + goto unix2inet_cont; + } + so->s_aux = s; + so->so_fport = in_addr.sin_port; + +unix2inet_cont: + if (!so->so_fport) { + g_warning("Falling back to random port allocation"); + so->so_fport = htons(g_rand_int_range(slirp->grand, 49152, 65536)); + } + } else if (so->slirp->in6_enabled) { + so->so_ffamily = AF_INET6; + so->so_faddr6 = slirp->vhost_addr6; + so->so_fport6 = 0; + + switch (so->so_type) { + case IPPROTO_TCP: + s = slirp_socket(PF_INET6, SOCK_STREAM, 0); + break; + case IPPROTO_UDP: + s = slirp_socket(PF_INET6, SOCK_DGRAM, 0); + break; + default: + g_assert_not_reached(); + break; + } + if (s < 0) { + g_error("Ephemeral slirp_socket() allocation failed"); + goto unix2inet6_cont; + } + memset(&in6_addr, 0, sizeof(in6_addr)); + in6_addr.sin6_family = AF_INET6; + in6_addr.sin6_addr = in6addr_loopback; + in6_addr.sin6_port = htons(0); + if (bind(s, (struct sockaddr *) &in6_addr, sizeof(in6_addr))) { + g_error("Ephemeral bind() failed"); + closesocket(s); + goto unix2inet6_cont; + } + in_addr_len = sizeof(in6_addr); + if (getsockname(s, (struct sockaddr *) &in6_addr, &in_addr_len)) { + g_error("Ephemeral getsockname() failed"); + closesocket(s); + goto unix2inet6_cont; + } + so->s_aux = s; + so->so_fport6 = in6_addr.sin6_port; + +unix2inet6_cont: + if (!so->so_fport6) { + g_warning("Falling back to random port allocation"); + so->so_fport6 = htons(g_rand_int_range(slirp->grand, 49152, 65536)); + } + } else { + g_assert_not_reached(); + } + break; + } /* case AF_UNIX */ + default: break; } @@ -952,3 +1181,53 @@ void sodrop(struct socket *s, int num) s->slirp->cb->notify(s->slirp->opaque); } } + +/* + * Translate "addr-any" in so->lhost to the guest's actual address. + * Returns 0 for success, or -1 if the guest doesn't have an address yet + * with errno set to EHOSTUNREACH. + * + * The guest address is taken from the first entry in the ARP table for IPv4 + * and the first entry in the NDP table for IPv6. + * Note: The IPv4 path isn't exercised yet as all hostfwd "" guest translations + * are handled immediately by using slirp->vdhcp_startaddr. + */ +int soassign_guest_addr_if_needed(struct socket *so) +{ + Slirp *slirp = so->slirp; + /* AF_INET6 addresses are bigger than AF_INET, so this is big enough. */ + char addrstr[INET6_ADDRSTRLEN]; + char portstr[6]; + + g_assert(so->so_state & SS_HOSTFWD); + + switch (so->so_ffamily) { + case AF_INET: + if (so->so_laddr.s_addr == INADDR_ANY) { + g_assert_not_reached(); + } + break; + + case AF_INET6: + if (in6_zero(&so->so_laddr6)) { + int ret; + if (in6_zero(&slirp->ndp_table.guest_in6_addr)) { + errno = EHOSTUNREACH; + return -1; + } + so->so_laddr6 = slirp->ndp_table.guest_in6_addr; + ret = getnameinfo((const struct sockaddr *) &so->lhost.ss, + sizeof(so->lhost.ss), addrstr, sizeof(addrstr), + portstr, sizeof(portstr), + NI_NUMERICHOST|NI_NUMERICSERV); + g_assert(ret == 0); + DEBUG_MISC("%s: new ip = [%s]:%s", __func__, addrstr, portstr); + } + break; + + default: + break; + } + + return 0; +} diff --git a/src/network/slirp/socket.h b/src/network/slirp/socket.h index a6a1e5e21..ca8c103ec 100644 --- a/src/network/slirp/socket.h +++ b/src/network/slirp/socket.h @@ -6,16 +6,31 @@ #ifndef SLIRP_SOCKET_H #define SLIRP_SOCKET_H +#include + +#ifndef _WIN32 +#include +#endif + #include "misc.h" +#include "sbuf.h" #define SO_EXPIRE 240000 #define SO_EXPIREFAST 10000 +/* Helps unify some in/in6 routines. */ +union in4or6_addr { + struct in_addr addr4; + struct in6_addr addr6; +}; +typedef union in4or6_addr in4or6_addr; + /* * Our socket structure */ union slirp_sockaddr { + struct sockaddr sa; struct sockaddr_storage ss; struct sockaddr_in sin; struct sockaddr_in6 sin6; @@ -25,6 +40,8 @@ struct socket { struct socket *so_next, *so_prev; /* For a linked list of sockets */ int s; /* The actual socket */ + int s_aux; /* An auxiliary socket for miscellaneous use. Currently used to + * reserve OS ports in UNIX-to-inet translation. */ struct gfwd_list *guestfwd; int pollfds_idx; /* GPollFD GArray index */ @@ -55,7 +72,8 @@ struct socket { uint8_t so_iptos; /* Type of service */ uint8_t so_emu; /* Is the socket emulated? */ - uint8_t so_type; /* Type of socket, UDP or TCP */ + uint8_t so_type; /* Protocol of the socket. May be 0 if loading old + * states. */ int32_t so_state; /* internal state flags SS_*, below */ struct tcpcb *so_tcpcb; /* pointer to TCP protocol control block */ @@ -97,9 +115,10 @@ struct socket { #define SS_HOSTFWD 0x1000 /* Socket describes host->guest forwarding */ #define SS_INCOMING \ 0x2000 /* Connection was initiated by a host on the internet */ +#define SS_HOSTFWD_V6ONLY 0x4000 /* Only bind on v6 addresses */ -static inline int sockaddr_equal(struct sockaddr_storage *a, - struct sockaddr_storage *b) +static inline int sockaddr_equal(const struct sockaddr_storage *a, + const struct sockaddr_storage *b) { if (a->ss_family != b->ss_family) { return 0; @@ -107,17 +126,24 @@ static inline int sockaddr_equal(struct sockaddr_storage *a, switch (a->ss_family) { case AF_INET: { - struct sockaddr_in *a4 = (struct sockaddr_in *)a; - struct sockaddr_in *b4 = (struct sockaddr_in *)b; + const struct sockaddr_in *a4 = (const struct sockaddr_in *)a; + const struct sockaddr_in *b4 = (const struct sockaddr_in *)b; return a4->sin_addr.s_addr == b4->sin_addr.s_addr && a4->sin_port == b4->sin_port; } case AF_INET6: { - struct sockaddr_in6 *a6 = (struct sockaddr_in6 *)a; - struct sockaddr_in6 *b6 = (struct sockaddr_in6 *)b; + const struct sockaddr_in6 *a6 = (const struct sockaddr_in6 *)a; + const struct sockaddr_in6 *b6 = (const struct sockaddr_in6 *)b; return (in6_equal(&a6->sin6_addr, &b6->sin6_addr) && a6->sin6_port == b6->sin6_port); } +#ifndef _WIN32 + case AF_UNIX: { + const struct sockaddr_un *aun = (const struct sockaddr_un *)a; + const struct sockaddr_un *bun = (const struct sockaddr_un *)b; + return strncmp(aun->sun_path, bun->sun_path, sizeof(aun->sun_path)) == 0; + } +#endif default: g_assert_not_reached(); } @@ -125,21 +151,33 @@ static inline int sockaddr_equal(struct sockaddr_storage *a, return 0; } -static inline socklen_t sockaddr_size(struct sockaddr_storage *a) +static inline socklen_t sockaddr_size(const struct sockaddr_storage *a) { switch (a->ss_family) { case AF_INET: return sizeof(struct sockaddr_in); case AF_INET6: return sizeof(struct sockaddr_in6); +#ifndef _WIN32 + case AF_UNIX: + return sizeof(struct sockaddr_un); +#endif default: g_assert_not_reached(); } } +static inline void sockaddr_copy(struct sockaddr *dst, socklen_t dstlen, const struct sockaddr *src, socklen_t srclen) +{ + socklen_t len = sockaddr_size((const struct sockaddr_storage *) src); + g_assert(len <= srclen); + g_assert(len <= dstlen); + memcpy(dst, src, len); +} + struct socket *solookup(struct socket **, struct socket *, struct sockaddr_storage *, struct sockaddr_storage *); -struct socket *socreate(Slirp *); +struct socket *socreate(Slirp *, int); void sofree(struct socket *); int soread(struct socket *); int sorecvoob(struct socket *); @@ -148,6 +186,10 @@ int sowrite(struct socket *); void sorecvfrom(struct socket *); int sosendto(struct socket *, struct mbuf *); struct socket *tcp_listen(Slirp *, uint32_t, unsigned, uint32_t, unsigned, int); +struct socket *tcpx_listen(Slirp *slirp, + const struct sockaddr *haddr, socklen_t haddrlen, + const struct sockaddr *laddr, socklen_t laddrlen, + int flags); void soisfconnecting(register struct socket *); void soisfconnected(register struct socket *); void sofwdrain(struct socket *); @@ -159,6 +201,6 @@ int sotranslate_out(struct socket *, struct sockaddr_storage *); void sotranslate_in(struct socket *, struct sockaddr_storage *); void sotranslate_accept(struct socket *); void sodrop(struct socket *, int num); - +int soassign_guest_addr_if_needed(struct socket *so); #endif /* SLIRP_SOCKET_H */ diff --git a/src/network/slirp/state.c b/src/network/slirp/state.c index 22af77b25..870854747 100644 --- a/src/network/slirp/state.c +++ b/src/network/slirp/state.c @@ -344,7 +344,7 @@ int slirp_state_load(Slirp *slirp, int version_id, SlirpReadCb read_cb, while (slirp_istream_read_u8(&f)) { int ret; - struct socket *so = socreate(slirp); + struct socket *so = socreate(slirp, -1); ret = slirp_vmstate_load_state(&f, &vmstate_slirp_socket, so, version_id); diff --git a/src/network/slirp/tcp.h b/src/network/slirp/tcp.h index 9c4a6b693..211dfec39 100644 --- a/src/network/slirp/tcp.h +++ b/src/network/slirp/tcp.h @@ -55,7 +55,7 @@ struct tcphdr { uint16_t th_dport; /* destination port */ tcp_seq th_seq; /* sequence number */ tcp_seq th_ack; /* acknowledgement number */ -#if G_BYTE_ORDER == G_BIG_ENDIAN +#if (G_BYTE_ORDER == G_BIG_ENDIAN) && !defined(_MSC_VER) uint8_t th_off : 4, /* data offset */ th_x2 : 4; /* (unused) */ #else diff --git a/src/network/slirp/tcp_input.c b/src/network/slirp/tcp_input.c index d55b0c81d..ecca972ee 100644 --- a/src/network/slirp/tcp_input.c +++ b/src/network/slirp/tcp_input.c @@ -146,14 +146,14 @@ static int tcp_reass(register struct tcpcb *tp, register struct tcpiphdr *ti, } q = tcpiphdr_next(q); m = tcpiphdr_prev(q)->ti_mbuf; - remque(tcpiphdr2qlink(tcpiphdr_prev(q))); + slirp_remque(tcpiphdr2qlink(tcpiphdr_prev(q))); m_free(m); } /* * Stick new segment in its place. */ - insque(tcpiphdr2qlink(ti), tcpiphdr2qlink(tcpiphdr_prev(q))); + slirp_insque(tcpiphdr2qlink(ti), tcpiphdr2qlink(tcpiphdr_prev(q))); present: /* @@ -170,7 +170,7 @@ present: do { tp->rcv_nxt += ti->ti_len; flags = ti->ti_flags & TH_FIN; - remque(tcpiphdr2qlink(ti)); + slirp_remque(tcpiphdr2qlink(ti)); m = ti->ti_mbuf; ti = tcpiphdr_next(ti); if (so->so_state & SS_FCANTSENDMORE) @@ -215,6 +215,9 @@ void tcp_input(struct mbuf *m, int iphlen, struct socket *inso, DEBUG_CALL("tcp_input"); DEBUG_ARG("m = %p iphlen = %2d inso = %p", m, iphlen, inso); + memset(&lhost, 0, sizeof(struct sockaddr_storage)); + memset(&fhost, 0, sizeof(struct sockaddr_storage)); + /* * If called with m == 0, then we're continuing the connect */ @@ -233,6 +236,16 @@ void tcp_input(struct mbuf *m, int iphlen, struct socket *inso, goto cont_conn; } slirp = m->slirp; + switch (af) { + case AF_INET: + M_DUP_DEBUG(slirp, m, 0, + sizeof(struct tcpiphdr) - sizeof(struct ip) - sizeof(struct tcphdr)); + break; + case AF_INET6: + M_DUP_DEBUG(slirp, m, 0, + sizeof(struct tcpiphdr) - sizeof(struct ip6) - sizeof(struct tcphdr)); + break; + } ip = mtod(m, struct ip *); ip6 = mtod(m, struct ip6 *); @@ -407,7 +420,7 @@ findso: if ((tiflags & (TH_SYN | TH_FIN | TH_RST | TH_URG | TH_ACK)) != TH_SYN) goto dropwithreset; - so = socreate(slirp); + so = socreate(slirp, IPPROTO_TCP); tcp_attach(so); sbreserve(&so->so_snd, TCP_SNDSPACE); @@ -524,7 +537,7 @@ findso: * we don't need this.. XXX??? */ if (so->so_snd.sb_cc) - (void)tcp_output(tp); + tcp_output(tp); return; } @@ -775,7 +788,7 @@ findso: soisfconnected(so); tp->t_state = TCPS_ESTABLISHED; - (void)tcp_reass(tp, (struct tcpiphdr *)0, (struct mbuf *)0); + tcp_reass(tp, (struct tcpiphdr *)0, (struct mbuf *)0); /* * if we didn't have to retransmit the SYN, * use its rtt as our initial srtt & rtt var. @@ -977,7 +990,7 @@ findso: soisfconnected(so); } - (void)tcp_reass(tp, (struct tcpiphdr *)0, (struct mbuf *)0); + tcp_reass(tp, (struct tcpiphdr *)0, (struct mbuf *)0); tp->snd_wl1 = ti->ti_seq - 1; /* Avoid ack processing; snd_una==ti_ack => dup ack */ goto synrx_to_est; @@ -1040,7 +1053,7 @@ findso: tp->t_rtt = 0; tp->snd_nxt = ti->ti_ack; tp->snd_cwnd = tp->t_maxseg; - (void)tcp_output(tp); + tcp_output(tp); tp->snd_cwnd = tp->snd_ssthresh + tp->t_maxseg * tp->t_dupacks; if (SEQ_GT(onxt, tp->snd_nxt)) @@ -1048,7 +1061,7 @@ findso: goto drop; } else if (tp->t_dupacks > TCPREXMTTHRESH) { tp->snd_cwnd += tp->t_maxseg; - (void)tcp_output(tp); + tcp_output(tp); goto drop; } } else @@ -1332,7 +1345,7 @@ dodata: * Return any desired output. */ if (needoutput || (tp->t_flags & TF_ACKNOW)) { - (void)tcp_output(tp); + tcp_output(tp); } return; @@ -1345,7 +1358,7 @@ dropafterack: goto drop; m_free(m); tp->t_flags |= TF_ACKNOW; - (void)tcp_output(tp); + tcp_output(tp); return; dropwithreset: @@ -1399,7 +1412,7 @@ static void tcp_dooptions(struct tcpcb *tp, uint8_t *cp, int cnt, continue; memcpy((char *)&mss, (char *)cp + 2, sizeof(mss)); NTOHS(mss); - (void)tcp_mss(tp, mss); /* sets t_maxseg */ + tcp_mss(tp, mss); /* sets t_maxseg */ break; } } diff --git a/src/network/slirp/tcp_subr.c b/src/network/slirp/tcp_subr.c index a1016d90d..112448483 100644 --- a/src/network/slirp/tcp_subr.c +++ b/src/network/slirp/tcp_subr.c @@ -303,7 +303,7 @@ struct tcpcb *tcp_drop(struct tcpcb *tp, int err) if (TCPS_HAVERCVDSYN(tp->t_state)) { tp->t_state = TCPS_CLOSED; - (void)tcp_output(tp); + tcp_output(tp); } return (tcp_close(tp)); } @@ -329,7 +329,7 @@ struct tcpcb *tcp_close(struct tcpcb *tp) while (!tcpfrag_list_end(t, tp)) { t = tcpiphdr_next(t); m = tcpiphdr_prev(t)->ti_mbuf; - remque(tcpiphdr2qlink(tcpiphdr_prev(t))); + slirp_remque(tcpiphdr2qlink(tcpiphdr_prev(t))); m_free(m); } g_free(tp); @@ -421,7 +421,7 @@ int tcp_fconnect(struct socket *so, unsigned short af) struct sockaddr_storage addr; slirp_set_nonblock(s); - so->slirp->cb->register_poll_fd(so->s, so->slirp->opaque); + so->slirp->cb->register_poll_fd(s, so->slirp->opaque); slirp_socket_set_fast_reuse(s); opt = 1; setsockopt(s, SOL_SOCKET, SO_OOBINLINE, &opt, sizeof(opt)); @@ -464,12 +464,54 @@ void tcp_connect(struct socket *inso) Slirp *slirp = inso->slirp; struct socket *so; struct sockaddr_storage addr; - socklen_t addrlen = sizeof(struct sockaddr_storage); + socklen_t addrlen; struct tcpcb *tp; - int s, opt; + int s, opt, ret; + /* AF_INET6 addresses are bigger than AF_INET, so this is big enough. */ + char addrstr[INET6_ADDRSTRLEN]; + char portstr[6]; DEBUG_CALL("tcp_connect"); DEBUG_ARG("inso = %p", inso); + switch (inso->lhost.ss.ss_family) { + case AF_INET: + addrlen = sizeof(struct sockaddr_in); + break; + case AF_INET6: + addrlen = sizeof(struct sockaddr_in6); + break; + default: + g_assert_not_reached(); + } + ret = getnameinfo((const struct sockaddr *) &inso->lhost.ss, addrlen, addrstr, sizeof(addrstr), portstr, sizeof(portstr), NI_NUMERICHOST|NI_NUMERICSERV); + g_assert(ret == 0); + DEBUG_ARG("ip = [%s]:%s", addrstr, portstr); + DEBUG_ARG("so_state = 0x%x", inso->so_state); + + /* Perform lazy guest IP address resolution if needed. */ + if (inso->so_state & SS_HOSTFWD) { + /* + * We can only reject the connection request by accepting it and + * then immediately closing it. Note that SS_FACCEPTONCE sockets can't + * get here. + */ + if (soassign_guest_addr_if_needed(inso) < 0) { + /* + * Guest address isn't available yet. We could either try to defer + * completing this connection request until the guest address is + * available, or punt. It's easier to punt. Otherwise we need to + * complicate the mechanism by which we're called to defer calling + * us again until the guest address is available. + */ + DEBUG_MISC(" guest address not available yet"); + addrlen = sizeof(addr); + s = accept(inso->s, (struct sockaddr *)&addr, &addrlen); + if (s >= 0) { + closesocket(s); + } + return; + } + } /* * If it's an SS_ACCEPTONCE socket, no need to socreate() @@ -479,7 +521,7 @@ void tcp_connect(struct socket *inso) /* FACCEPTONCE already have a tcpcb */ so = inso; } else { - so = socreate(slirp); + so = socreate(slirp, IPPROTO_TCP); tcp_attach(so); so->lhost = inso->lhost; so->so_ffamily = inso->so_ffamily; @@ -487,13 +529,14 @@ void tcp_connect(struct socket *inso) tcp_mss(sototcpcb(so), 0); + addrlen = sizeof(addr); s = accept(inso->s, (struct sockaddr *)&addr, &addrlen); if (s < 0) { tcp_close(sototcpcb(so)); /* This will sofree() as well */ return; } slirp_set_nonblock(s); - so->slirp->cb->register_poll_fd(so->s, so->slirp->opaque); + so->slirp->cb->register_poll_fd(s, so->slirp->opaque); slirp_socket_set_fast_reuse(s); opt = 1; setsockopt(s, SOL_SOCKET, SO_OOBINLINE, &opt, sizeof(int)); @@ -534,7 +577,7 @@ void tcp_connect(struct socket *inso) void tcp_attach(struct socket *so) { so->so_tcpcb = tcp_newtcpcb(so); - insque(so, &so->slirp->tcb); + slirp_insque(so, &so->slirp->tcb); } /* diff --git a/src/network/slirp/tcp_timer.c b/src/network/slirp/tcp_timer.c index 102023e7c..bc4db2d15 100644 --- a/src/network/slirp/tcp_timer.c +++ b/src/network/slirp/tcp_timer.c @@ -52,7 +52,7 @@ void tcp_fasttimo(Slirp *slirp) (tp->t_flags & TF_DELACK)) { tp->t_flags &= ~TF_DELACK; tp->t_flags |= TF_ACKNOW; - (void)tcp_output(tp); + tcp_output(tp); } } @@ -233,7 +233,7 @@ static struct tcpcb *tcp_timers(register struct tcpcb *tp, int timer) tp->snd_ssthresh = win * tp->t_maxseg; tp->t_dupacks = 0; } - (void)tcp_output(tp); + tcp_output(tp); break; /* @@ -243,7 +243,7 @@ static struct tcpcb *tcp_timers(register struct tcpcb *tp, int timer) case TCPT_PERSIST: tcp_setpersist(tp); tp->t_force = 1; - (void)tcp_output(tp); + tcp_output(tp); tp->t_force = 0; break; diff --git a/src/network/slirp/tcpip.h b/src/network/slirp/tcpip.h index d3df02149..a0fb2282f 100644 --- a/src/network/slirp/tcpip.h +++ b/src/network/slirp/tcpip.h @@ -88,8 +88,8 @@ struct tcpiphdr { /* This is the difference between the size of a tcpiphdr structure, and the * size of actual ip+tcp headers, rounded up since we need to align data. */ #define TCPIPHDR_DELTA \ - (MAX(0, (sizeof(struct tcpiphdr) - sizeof(struct ip) - \ - sizeof(struct tcphdr) + 3) & \ + (MAX(0, ((int) sizeof(struct tcpiphdr) - (int) sizeof(struct ip) - \ + (int) sizeof(struct tcphdr) + 3) & \ ~3)) /* diff --git a/src/network/slirp/tftp.c b/src/network/slirp/tftp.c index c6950ee10..a19c889d3 100644 --- a/src/network/slirp/tftp.c +++ b/src/network/slirp/tftp.c @@ -50,7 +50,7 @@ static void tftp_session_terminate(struct tftp_session *spt) } static int tftp_session_allocate(Slirp *slirp, struct sockaddr_storage *srcsas, - struct tftp_t *tp) + struct tftphdr *hdr) { struct tftp_session *spt; int k; @@ -75,7 +75,7 @@ found: memcpy(&spt->client_addr, srcsas, sockaddr_size(srcsas)); spt->fd = -1; spt->block_size = 512; - spt->client_port = tp->udp.uh_sport; + spt->client_port = hdr->udp.uh_sport; spt->slirp = slirp; tftp_session_update(spt); @@ -84,7 +84,7 @@ found: } static int tftp_session_find(Slirp *slirp, struct sockaddr_storage *srcsas, - struct tftp_t *tp) + struct tftphdr *hdr) { struct tftp_session *spt; int k; @@ -94,7 +94,7 @@ static int tftp_session_find(Slirp *slirp, struct sockaddr_storage *srcsas, if (tftp_session_in_use(spt)) { if (sockaddr_equal(&spt->client_addr, srcsas)) { - if (spt->client_port == tp->udp.uh_sport) { + if (spt->client_port == hdr->udp.uh_sport) { return k; } } @@ -148,13 +148,13 @@ static struct tftp_t *tftp_prep_mbuf_data(struct tftp_session *spt, } static void tftp_udp_output(struct tftp_session *spt, struct mbuf *m, - struct tftp_t *recv_tp) + struct tftphdr *hdr) { if (spt->client_addr.ss_family == AF_INET6) { struct sockaddr_in6 sa6, da6; sa6.sin6_addr = spt->slirp->vhost_addr6; - sa6.sin6_port = recv_tp->udp.uh_dport; + sa6.sin6_port = hdr->udp.uh_dport; da6.sin6_addr = ((struct sockaddr_in6 *)&spt->client_addr)->sin6_addr; da6.sin6_port = spt->client_port; @@ -163,7 +163,7 @@ static void tftp_udp_output(struct tftp_session *spt, struct mbuf *m, struct sockaddr_in sa4, da4; sa4.sin_addr = spt->slirp->vhost_addr; - sa4.sin_port = recv_tp->udp.uh_dport; + sa4.sin_port = hdr->udp.uh_dport; da4.sin_addr = ((struct sockaddr_in *)&spt->client_addr)->sin_addr; da4.sin_port = spt->client_port; @@ -185,14 +185,14 @@ static int tftp_send_oack(struct tftp_session *spt, const char *keys[], tp = tftp_prep_mbuf_data(spt, m); - tp->tp_op = htons(TFTP_OACK); + tp->hdr.tp_op = htons(TFTP_OACK); for (i = 0; i < nb; i++) { n += slirp_fmt0(tp->x.tp_buf + n, sizeof(tp->x.tp_buf) - n, "%s", keys[i]); n += slirp_fmt0(tp->x.tp_buf + n, sizeof(tp->x.tp_buf) - n, "%u", values[i]); } - m->m_len = G_SIZEOF_MEMBER(struct tftp_t, tp_op) + n; - tftp_udp_output(spt, m, recv_tp); + m->m_len = G_SIZEOF_MEMBER(struct tftp_t, hdr.tp_op) + n; + tftp_udp_output(spt, m, &recv_tp->hdr); return 0; } @@ -213,21 +213,21 @@ static void tftp_send_error(struct tftp_session *spt, uint16_t errorcode, tp = tftp_prep_mbuf_data(spt, m); - tp->tp_op = htons(TFTP_ERROR); + tp->hdr.tp_op = htons(TFTP_ERROR); tp->x.tp_error.tp_error_code = htons(errorcode); slirp_pstrcpy((char *)tp->x.tp_error.tp_msg, sizeof(tp->x.tp_error.tp_msg), msg); m->m_len = sizeof(struct tftp_t) - (TFTP_BLOCKSIZE_MAX + 2) + 3 + strlen(msg) - sizeof(struct udphdr); - tftp_udp_output(spt, m, recv_tp); + tftp_udp_output(spt, m, &recv_tp->hdr); out: tftp_session_terminate(spt); } static void tftp_send_next_block(struct tftp_session *spt, - struct tftp_t *recv_tp) + struct tftphdr *hdr) { struct mbuf *m; struct tftp_t *tp; @@ -241,7 +241,7 @@ static void tftp_send_next_block(struct tftp_session *spt, tp = tftp_prep_mbuf_data(spt, m); - tp->tp_op = htons(TFTP_DATA); + tp->hdr.tp_op = htons(TFTP_DATA); tp->x.tp_data.tp_block_nr = htons((spt->block_nr + 1) & 0xffff); nobytes = tftp_read_data(spt, spt->block_nr, tp->x.tp_data.tp_buf, @@ -259,7 +259,7 @@ static void tftp_send_next_block(struct tftp_session *spt, m->m_len = sizeof(struct tftp_t) - (TFTP_BLOCKSIZE_MAX - nobytes) - sizeof(struct udphdr); - tftp_udp_output(spt, m, recv_tp); + tftp_udp_output(spt, m, hdr); if (nobytes == spt->block_size) { tftp_session_update(spt); @@ -282,12 +282,12 @@ static void tftp_handle_rrq(Slirp *slirp, struct sockaddr_storage *srcsas, int nb_options = 0; /* check if a session already exists and if so terminate it */ - s = tftp_session_find(slirp, srcsas, tp); + s = tftp_session_find(slirp, srcsas, &tp->hdr); if (s >= 0) { tftp_session_terminate(&slirp->tftp_sessions[s]); } - s = tftp_session_allocate(slirp, srcsas, tp); + s = tftp_session_allocate(slirp, srcsas, &tp->hdr); if (s < 0) { return; @@ -413,29 +413,29 @@ static void tftp_handle_rrq(Slirp *slirp, struct sockaddr_storage *srcsas, } spt->block_nr = 0; - tftp_send_next_block(spt, tp); + tftp_send_next_block(spt, &tp->hdr); } static void tftp_handle_ack(Slirp *slirp, struct sockaddr_storage *srcsas, - struct tftp_t *tp, int pktlen) + struct tftphdr *hdr) { int s; - s = tftp_session_find(slirp, srcsas, tp); + s = tftp_session_find(slirp, srcsas, hdr); if (s < 0) { return; } - tftp_send_next_block(&slirp->tftp_sessions[s], tp); + tftp_send_next_block(&slirp->tftp_sessions[s], hdr); } static void tftp_handle_error(Slirp *slirp, struct sockaddr_storage *srcsas, - struct tftp_t *tp, int pktlen) + struct tftphdr *hdr) { int s; - s = tftp_session_find(slirp, srcsas, tp); + s = tftp_session_find(slirp, srcsas, hdr); if (s < 0) { return; @@ -446,19 +446,25 @@ static void tftp_handle_error(Slirp *slirp, struct sockaddr_storage *srcsas, void tftp_input(struct sockaddr_storage *srcsas, struct mbuf *m) { - struct tftp_t *tp = (struct tftp_t *)m->m_data; + struct tftphdr *hdr = mtod_check(m, sizeof(struct tftphdr)); - switch (ntohs(tp->tp_op)) { + if (hdr == NULL) { + return; + } + + switch (ntohs(hdr->tp_op)) { case TFTP_RRQ: - tftp_handle_rrq(m->slirp, srcsas, tp, m->m_len); + tftp_handle_rrq(m->slirp, srcsas, + mtod(m, struct tftp_t *), + m->m_len); break; case TFTP_ACK: - tftp_handle_ack(m->slirp, srcsas, tp, m->m_len); + tftp_handle_ack(m->slirp, srcsas, hdr); break; case TFTP_ERROR: - tftp_handle_error(m->slirp, srcsas, tp, m->m_len); + tftp_handle_error(m->slirp, srcsas, hdr); break; } } diff --git a/src/network/slirp/tftp.h b/src/network/slirp/tftp.h index 663485328..a0784885c 100644 --- a/src/network/slirp/tftp.h +++ b/src/network/slirp/tftp.h @@ -23,9 +23,19 @@ #if defined(_MSC_VER) && !defined (__clang__) #pragma pack(push, 1) #endif -struct tftp_t { +struct tftphdr { struct udphdr udp; uint16_t tp_op; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif + +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif +struct tftp_t { + struct tftphdr hdr; union { struct { uint16_t tp_block_nr; diff --git a/src/network/slirp/tinyglib.c b/src/network/slirp/tinyglib.c index 702c39ad7..7b1e27bc5 100644 --- a/src/network/slirp/tinyglib.c +++ b/src/network/slirp/tinyglib.c @@ -16,6 +16,7 @@ */ #include #include +#include /* Must be a function, as libslirp redefines it as a macro. */ gboolean @@ -28,6 +29,17 @@ g_spawn_async_with_fds(const gchar *working_directory, gchar **argv, return 0; } +/* Implementation borrowed from GLib itself. */ +gboolean +g_str_has_prefix (const gchar *str, + const gchar *prefix) +{ + g_return_val_if_fail (str != NULL, false); + g_return_val_if_fail (prefix != NULL, false); + + return strncmp (str, prefix, strlen (prefix)) == 0; +} + /* Needs bounds checking, but not really used by libslirp. */ GString * g_string_new(gchar *base) diff --git a/src/network/slirp/udp.c b/src/network/slirp/udp.c index 0ad44d7c0..bd4dbebde 100644 --- a/src/network/slirp/udp.c +++ b/src/network/slirp/udp.c @@ -67,6 +67,8 @@ void udp_cleanup(Slirp *slirp) void udp_input(register struct mbuf *m, int iphlen) { Slirp *slirp = m->slirp; + M_DUP_DEBUG(slirp, m, 0, 0); + register struct ip *ip; register struct udphdr *uh; int len; @@ -74,6 +76,7 @@ void udp_input(register struct mbuf *m, int iphlen) struct socket *so; struct sockaddr_storage lhost; struct sockaddr_in *lhost4; + int ttl; DEBUG_CALL("udp_input"); DEBUG_ARG("m = %p", m); @@ -93,7 +96,10 @@ void udp_input(register struct mbuf *m, int iphlen) /* * Get IP and UDP header together in first mbuf. */ - ip = mtod(m, struct ip *); + ip = mtod_check(m, iphlen + sizeof(struct udphdr)); + if (ip == NULL) { + goto bad; + } uh = (struct udphdr *)((char *)ip + iphlen); /* @@ -171,7 +177,7 @@ void udp_input(register struct mbuf *m, int iphlen) * If there's no socket for this packet, * create one */ - so = socreate(slirp); + so = socreate(slirp, IPPROTO_UDP); if (udp_attach(so, AF_INET) == -1) { DEBUG_MISC(" udp_attach errno = %d-%s", errno, strerror(errno)); sofree(so); @@ -202,6 +208,20 @@ void udp_input(register struct mbuf *m, int iphlen) m->m_len -= iphlen; m->m_data += iphlen; + /* + * Check for TTL + */ + ttl = save_ip.ip_ttl-1; + if (ttl <= 0) { + m->m_len += iphlen; + m->m_data -= iphlen; + *ip = save_ip; + DEBUG_MISC("udp ttl exceeded"); + icmp_send_error(m, ICMP_TIMXCEED, ICMP_TIMXCEED_INTRANS, 0, NULL); + goto bad; + } + setsockopt(so->s, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl)); + /* * Now we sendto() the packet. */ @@ -230,14 +250,21 @@ bad: int udp_output(struct socket *so, struct mbuf *m, struct sockaddr_in *saddr, struct sockaddr_in *daddr, int iptos) { + Slirp *slirp = m->slirp; +// char addr[INET_ADDRSTRLEN]; + + M_DUP_DEBUG(slirp, m, 0, sizeof(struct udpiphdr)); + register struct udpiphdr *ui; int error = 0; +/* DEBUG_CALL("udp_output"); DEBUG_ARG("so = %p", so); DEBUG_ARG("m = %p", m); - DEBUG_ARG("saddr = %s", inet_ntoa(saddr->sin_addr)); - DEBUG_ARG("daddr = %s", inet_ntoa(daddr->sin_addr)); + DEBUG_ARG("saddr = %s", inet_ntop(AF_INET, &saddr->sin_addr, addr, sizeof(addr))); + DEBUG_ARG("daddr = %s", inet_ntop(AF_INET, &daddr->sin_addr, addr, sizeof(addr))); +*/ /* * Adjust for header @@ -288,9 +315,27 @@ int udp_attach(struct socket *so, unsigned short af) so->s = -1; return -1; } + +#ifdef __linux__ + { + int opt = 1; + switch (af) { + case AF_INET: + setsockopt(so->s, IPPROTO_IP, IP_RECVERR, &opt, sizeof(opt)); + break; + case AF_INET6: + setsockopt(so->s, IPPROTO_IPV6, IPV6_RECVERR, &opt, sizeof(opt)); + break; + default: + g_assert_not_reached(); + } + } +#endif + so->so_expire = curtime + SO_EXPIRE; - insque(so, &so->slirp->udb); + slirp_insque(so, &so->slirp->udb); } + so->slirp->cb->register_poll_fd(so->s, so->slirp->opaque); return (so->s); } @@ -321,45 +366,64 @@ static uint8_t udp_tos(struct socket *so) return 0; } -struct socket *udp_listen(Slirp *slirp, uint32_t haddr, unsigned hport, - uint32_t laddr, unsigned lport, int flags) +struct socket *udpx_listen(Slirp *slirp, + const struct sockaddr *haddr, socklen_t haddrlen, + const struct sockaddr *laddr, socklen_t laddrlen, + int flags) { - /* TODO: IPv6 */ - struct sockaddr_in addr; struct socket *so; - socklen_t addrlen = sizeof(struct sockaddr_in); + socklen_t addrlen; + int save_errno; - memset(&addr, 0, sizeof(addr)); - so = socreate(slirp); - so->s = slirp_socket(AF_INET, SOCK_DGRAM, 0); + so = socreate(slirp, IPPROTO_UDP); + so->s = slirp_socket(haddr->sa_family, SOCK_DGRAM, 0); if (so->s < 0) { + save_errno = errno; sofree(so); + errno = save_errno; return NULL; } + if (haddr->sa_family == AF_INET6) + slirp_socket_set_v6only(so->s, (flags & SS_HOSTFWD_V6ONLY) != 0); so->so_expire = curtime + SO_EXPIRE; - insque(so, &slirp->udb); + slirp_insque(so, &slirp->udb); - addr.sin_family = AF_INET; - addr.sin_addr.s_addr = haddr; - addr.sin_port = hport; - - if (bind(so->s, (struct sockaddr *)&addr, addrlen) < 0) { + if (bind(so->s, haddr, haddrlen) < 0) { + save_errno = errno; udp_detach(so); + errno = save_errno; return NULL; } slirp_socket_set_fast_reuse(so->s); - getsockname(so->s, (struct sockaddr *)&addr, &addrlen); - so->fhost.sin = addr; + addrlen = sizeof(so->fhost); + getsockname(so->s, &so->fhost.sa, &addrlen); sotranslate_accept(so); - so->so_lfamily = AF_INET; - so->so_lport = lport; - so->so_laddr.s_addr = laddr; + + sockaddr_copy(&so->lhost.sa, sizeof(so->lhost), laddr, laddrlen); + if (flags != SS_FACCEPTONCE) so->so_expire = 0; - so->so_state &= SS_PERSISTENT_MASK; so->so_state |= SS_ISFCONNECTED | flags; return so; } + +struct socket *udp_listen(Slirp *slirp, uint32_t haddr, unsigned hport, + uint32_t laddr, unsigned lport, int flags) +{ + struct sockaddr_in hsa, lsa; + + memset(&hsa, 0, sizeof(hsa)); + hsa.sin_family = AF_INET; + hsa.sin_addr.s_addr = haddr; + hsa.sin_port = hport; + + memset(&lsa, 0, sizeof(lsa)); + lsa.sin_family = AF_INET; + lsa.sin_addr.s_addr = laddr; + lsa.sin_port = lport; + + return udpx_listen(slirp, (const struct sockaddr *) &hsa, sizeof(hsa), (struct sockaddr *) &lsa, sizeof(lsa), flags); +} diff --git a/src/network/slirp/udp.h b/src/network/slirp/udp.h index c3b83fdc5..47f4ed34d 100644 --- a/src/network/slirp/udp.h +++ b/src/network/slirp/udp.h @@ -34,6 +34,8 @@ #ifndef UDP_H #define UDP_H +#include "socket.h" + #define UDP_TTL 0x60 #define UDP_UDPDATALEN 16192 @@ -80,6 +82,10 @@ void udp_input(register struct mbuf *, int); int udp_attach(struct socket *, unsigned short af); void udp_detach(struct socket *); struct socket *udp_listen(Slirp *, uint32_t, unsigned, uint32_t, unsigned, int); +struct socket *udpx_listen(Slirp *, + const struct sockaddr *haddr, socklen_t haddrlen, + const struct sockaddr *laddr, socklen_t laddrlen, + int flags); int udp_output(struct socket *so, struct mbuf *m, struct sockaddr_in *saddr, struct sockaddr_in *daddr, int iptos); diff --git a/src/network/slirp/udp6.c b/src/network/slirp/udp6.c index 6f9486bbc..effdf77d0 100644 --- a/src/network/slirp/udp6.c +++ b/src/network/slirp/udp6.c @@ -11,12 +11,15 @@ void udp6_input(struct mbuf *m) { Slirp *slirp = m->slirp; + M_DUP_DEBUG(slirp, m, 0, 0); + struct ip6 *ip, save_ip; struct udphdr *uh; int iphlen = sizeof(struct ip6); int len; struct socket *so; struct sockaddr_in6 lhost; + int hop_limit; DEBUG_CALL("udp6_input"); DEBUG_ARG("m = %p", m); @@ -28,7 +31,10 @@ void udp6_input(struct mbuf *m) ip = mtod(m, struct ip6 *); m->m_len -= iphlen; m->m_data += iphlen; - uh = mtod(m, struct udphdr *); + uh = mtod_check(m, sizeof(struct udphdr)); + if (uh == NULL) { + goto bad; + } m->m_len += iphlen; m->m_data -= iphlen; @@ -89,7 +95,7 @@ void udp6_input(struct mbuf *m) if (so == NULL) { /* If there's no socket for this packet, create one. */ - so = socreate(slirp); + so = socreate(slirp, IPPROTO_UDP); if (udp_attach(so, AF_INET6) == -1) { DEBUG_MISC(" udp6_attach errno = %d-%s", errno, strerror(errno)); sofree(so); @@ -110,6 +116,20 @@ void udp6_input(struct mbuf *m) m->m_len -= iphlen; m->m_data += iphlen; + /* + * Check for TTL + */ + hop_limit = save_ip.ip_hl-1; + if (hop_limit <= 0) { + m->m_len += iphlen; + m->m_data -= iphlen; + *ip = save_ip; + DEBUG_MISC("udp ttl exceeded"); + icmp6_send_error(m, ICMP6_TIMXCEED, ICMP6_TIMXCEED_INTRANS); + goto bad; + } + setsockopt(so->s, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &hop_limit, sizeof(hop_limit)); + /* * Now we sendto() the packet. */ @@ -138,6 +158,9 @@ bad: int udp6_output(struct socket *so, struct mbuf *m, struct sockaddr_in6 *saddr, struct sockaddr_in6 *daddr) { + Slirp *slirp = m->slirp; + M_DUP_DEBUG(slirp, m, 0, sizeof(struct ip6) + sizeof(struct udphdr)); + struct ip6 *ip; struct udphdr *uh; diff --git a/src/network/slirp/util.c b/src/network/slirp/util.c index 8478c48d6..7297e5022 100644 --- a/src/network/slirp/util.c +++ b/src/network/slirp/util.c @@ -72,6 +72,7 @@ static void slirp_set_cloexec(int fd) /* * Opens a socket with FD_CLOEXEC set + * On failure errno contains the reason. */ int slirp_socket(int domain, int type, int protocol) { @@ -366,6 +367,7 @@ void slirp_pstrcpy(char *buf, int buf_size, const char *str) *q = '\0'; } +G_GNUC_PRINTF(3, 0) static int slirp_vsnprintf(char *str, size_t size, const char *format, va_list args) { @@ -427,3 +429,14 @@ int slirp_fmt0(char *str, size_t size, const char *format, ...) return rv; } + +const char *slirp_ether_ntoa(const uint8_t *addr, char *out_str, + size_t out_str_size) +{ + assert(out_str_size >= ETH_ADDRSTRLEN); + + slirp_fmt0(out_str, out_str_size, "%02x:%02x:%02x:%02x:%02x:%02x", + addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]); + + return out_str; +} diff --git a/src/network/slirp/util.h b/src/network/slirp/util.h index 951bfc57d..0f0123a34 100644 --- a/src/network/slirp/util.h +++ b/src/network/slirp/util.h @@ -30,9 +30,6 @@ #include #include #include -#ifndef _WIN32 -#include -#endif #include #include #include @@ -40,7 +37,9 @@ #ifdef _WIN32 #include #include +#include #else +#include #include #include #include @@ -49,7 +48,7 @@ #if defined(_MSC_VER) && !defined(__clang__) #define SLIRP_PACKED #elif defined(_WIN32) && (defined(__x86_64__) || defined(__i386__)) && !defined(__clang__) -#define SLIRP_PACKED __attribute__((gcc_struct, packed)) +#define SLIRP_PACKED __attribute__((gcc_struct, packed)) #else #define SLIRP_PACKED __attribute__((packed)) #endif @@ -59,7 +58,8 @@ #endif #ifndef container_of -#define container_of(ptr, type, member) ((type *)((char *)(ptr) - offsetof(type, member))); +#define container_of(ptr, type, member) \ + ((type *) (((char *)(ptr)) - offsetof(type, member))); #endif #ifndef G_SIZEOF_MEMBER @@ -83,6 +83,7 @@ struct iovec { #define SCALE_MS 1000000 #define ETH_ALEN 6 +#define ETH_ADDRSTRLEN 18 /* "xx:xx:xx:xx:xx:xx", with trailing NUL */ #define ETH_HLEN 14 #define ETH_P_IP (0x0800) /* Internet Protocol packet */ #define ETH_P_ARP (0x0806) /* Address Resolution packet */ @@ -159,6 +160,11 @@ int slirp_inet_aton(const char *cp, struct in_addr *ia); int slirp_socket(int domain, int type, int protocol); void slirp_set_nonblock(int fd); +static inline int slirp_socket_set_v6only(int fd, int v) +{ + return setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &v, sizeof(v)); +} + static inline int slirp_socket_set_nodelay(int fd) { int v = 1; @@ -185,4 +191,11 @@ void slirp_pstrcpy(char *buf, int buf_size, const char *str); int slirp_fmt(char *str, size_t size, const char *format, ...) G_GNUC_PRINTF(3, 4); int slirp_fmt0(char *str, size_t size, const char *format, ...) G_GNUC_PRINTF(3, 4); +/* + * Pretty print a MAC address into out_str. + * As a convenience returns out_str. + */ +const char *slirp_ether_ntoa(const uint8_t *addr, char *out_str, + size_t out_str_len); + #endif diff --git a/src/network/slirp/vmstate.h b/src/network/slirp/vmstate.h index e6bed53a6..b1d40e892 100644 --- a/src/network/slirp/vmstate.h +++ b/src/network/slirp/vmstate.h @@ -175,6 +175,9 @@ enum VMStateFlags { * VMStateField.struct_version_id to tell which version of the * structure we are referencing to use. */ VMS_VSTRUCT = 0x8000, + + /* Marker for end of list */ + VMS_END = 0x10000 }; struct VMStateField { @@ -216,10 +219,17 @@ extern const VMStateInfo slirp_vmstate_info_nullptr; extern const VMStateInfo slirp_vmstate_info_buffer; extern const VMStateInfo slirp_vmstate_info_tmp; +#ifdef __GNUC__ #define type_check_array(t1, t2, n) ((t1(*)[n])0 - (t2 *)0) #define type_check_pointer(t1, t2) ((t1 **)0 - (t2 *)0) #define typeof_field(type, field) typeof(((type *)0)->field) #define type_check(t1, t2) ((t1 *)0 - (t2 *)0) +#else +#define type_check_array(t1, t2, n) 0 +#define type_check_pointer(t1, t2) 0 +#define typeof_field(type, field) (((type *)0)->field) +#define type_check(t1, t2) 0 +#endif #define vmstate_offset_value(_state, _field, _type) \ (offsetof(_state, _field) + type_check(_type, typeof_field(_state, _field))) @@ -388,6 +398,7 @@ extern const VMStateInfo slirp_vmstate_info_tmp; #define VMSTATE_END_OF_LIST() \ { \ + .flags = VMS_END, \ } -#endif +#endif /* VMSTATE_H_ */ diff --git a/src/win/Makefile.mingw b/src/win/Makefile.mingw index 4ba9f4745..0c34aeaa4 100644 --- a/src/win/Makefile.mingw +++ b/src/win/Makefile.mingw @@ -637,16 +637,17 @@ SCSIOBJ := scsi.o scsi_device.o \ scsi_ncr5380.o scsi_ncr53c8xx.o \ scsi_pcscsi.o scsi_spock.o -SLIRPOBJ := arp_table.o bootp.o cksum.o dnssearch.o if.o \ - ip_icmp.o ip_input.o ip_output.o \ - mbuf.o misc.o sbuf.o slirp.o socket.o \ - tcp_input.o tcp_output.o tcp_subr.o tcp_timer.o \ - udp.o \ - util.o version.o \ +SLIRPOBJ := net_slirp.o tinyglib.o \ + arp_table.o bootp.o cksum.o dhcpv6.o dnssearch.o if.o \ + ip_icmp.o ip_input.o ip_output.o \ + ip6_icmp.o ip6_input.o ip6_output.o \ + mbuf.o misc.o sbuf.o slirp.o socket.o \ + tcp_input.o tcp_output.o tcp_subr.o tcp_timer.o \ + udp.o udp6.o \ + util.o version.o \ NETOBJ := network.o \ net_pcap.o \ - net_slirp.o tinyglib.o \ ${SLIRPOBJ} \ net_dp8390.o net_3c501.o \ net_3c503.o net_ne2000.o \ From 75b52274ec4c02259253dde56557ead57918369d Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Mon, 6 Feb 2023 13:53:46 -0500 Subject: [PATCH 217/285] Add APM flags to 386 & later, ACPI flag to Pentium and later This isn't a perfect solution, but it'll be less false positives than elsewise. --- src/machine/machine_table.c | 412 ++++++++++++++++++------------------ 1 file changed, 206 insertions(+), 206 deletions(-) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index a5f51a8bf..c65884b7e 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -4312,7 +4312,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_AT, - .flags = MACHINE_FLAGS_NONE, + .flags = MACHINE_APM, .ram = { .min = 1024, .max = 16384, @@ -4350,7 +4350,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_AT, - .flags = MACHINE_FLAGS_NONE, + .flags = MACHINE_APM, .ram = { .min = 1024, .max = 16384, @@ -4387,7 +4387,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_AT, - .flags = MACHINE_FLAGS_NONE, + .flags = MACHINE_APM, .ram = { .min = 1024, .max = 16384, @@ -4424,7 +4424,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_AT, - .flags = 0, + .flags = MACHINE_APM, .ram = { .min = 1024, .max = 32768, @@ -4462,7 +4462,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_AT, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM, .ram = { .min = 1024, .max = 14336, @@ -4499,7 +4499,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_AT, - .flags = MACHINE_IDE | MACHINE_VIDEO, + .flags = MACHINE_IDE | MACHINE_VIDEO | MACHINE_APM, .ram = { .min = 1024, .max = 14336, @@ -4536,7 +4536,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_AT, - .flags = MACHINE_FLAGS_NONE, + .flags = MACHINE_APM, .ram = { .min = 512, .max = 8192, @@ -4573,7 +4573,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_AT, - .flags = MACHINE_FLAGS_NONE, + .flags = MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -4612,7 +4612,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2_MCA, - .flags = MACHINE_VIDEO, + .flags = MACHINE_VIDEO | MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -4652,7 +4652,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM, .ram = { .min = 1024, .max = 32768, @@ -4689,7 +4689,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM, .ram = { .min = 1024, .max = 32768, @@ -4726,7 +4726,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM, .ram = { .min = 1024, .max = 32768, @@ -4763,7 +4763,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2_MCA, - .flags = MACHINE_VIDEO, + .flags = MACHINE_VIDEO | MACHINE_APM, .ram = { .min = 2048, .max = 65536, @@ -4800,7 +4800,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2_MCA, - .flags = MACHINE_VIDEO, + .flags = MACHINE_VIDEO | MACHINE_APM, .ram = { .min = 2048, .max = 65536, @@ -4843,7 +4843,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM, .ram = { .min = 1024, .max = 32768, @@ -4882,7 +4882,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_FLAGS_NONE, + .flags = MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -4920,7 +4920,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -4957,7 +4957,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_AT, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -4994,7 +4994,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_AT, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -5032,7 +5032,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -5069,7 +5069,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM, .ram = { .min = 1024, .max = 131072, @@ -5109,7 +5109,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_AT, - .flags = MACHINE_FLAGS_NONE, + .flags = MACHINE_APM, .ram = { .min = 1024, .max = 64512, @@ -5148,7 +5148,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2, - .flags = MACHINE_IDE | MACHINE_VIDEO, + .flags = MACHINE_IDE | MACHINE_VIDEO | MACHINE_APM, .ram = { .min = 2048, .max = 32768, @@ -5185,7 +5185,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2, - .flags = MACHINE_IDE | MACHINE_VIDEO, + .flags = MACHINE_IDE | MACHINE_VIDEO | MACHINE_APM, .ram = { .min = 2048, .max = 32768, @@ -5226,7 +5226,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2, - .flags = MACHINE_IDE | MACHINE_VIDEO, + .flags = MACHINE_IDE | MACHINE_VIDEO | MACHINE_APM, .ram = { .min = 4096, .max = 36864, @@ -5263,7 +5263,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2, - .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO, + .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_APM, .ram = { .min = 4096, .max = 36864, @@ -5300,7 +5300,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM, .ram = { .min = 1024, .max = 32768, @@ -5337,7 +5337,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2, - .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO, + .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_APM, .ram = { .min = 1024, .max = 32768, @@ -5374,7 +5374,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 32768, @@ -5412,7 +5412,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2, - .flags = MACHINE_IDE | MACHINE_VIDEO, + .flags = MACHINE_IDE | MACHINE_VIDEO | MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -5451,7 +5451,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -5491,7 +5491,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_FLAGS_NONE, + .flags = MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -5528,7 +5528,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_FLAGS_NONE, + .flags = MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -5565,7 +5565,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_FLAGS_NONE, + .flags = MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -5602,7 +5602,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_FLAGS_NONE, + .flags = MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -5639,7 +5639,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -5676,7 +5676,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2_VLB, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -5713,7 +5713,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -5750,7 +5750,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -5787,7 +5787,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2_VLB, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -5826,7 +5826,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2_PCIV, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 131072, @@ -5863,7 +5863,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2_PCIV, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 131072, @@ -5900,7 +5900,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO, + .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -5938,7 +5938,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -5979,7 +5979,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -6020,7 +6020,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -6057,7 +6057,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -6094,7 +6094,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -6131,7 +6131,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2_PCIV, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 131072, @@ -6168,7 +6168,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 131072, @@ -6205,7 +6205,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_SCSI, + .flags = MACHINE_IDE_DUAL | MACHINE_SCSI | MACHINE_APM, .ram = { .min = 1024, .max = 131072, @@ -6242,7 +6242,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 2048, .max = 131072, @@ -6280,7 +6280,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_SCSI, + .flags = MACHINE_IDE_DUAL | MACHINE_SCSI | MACHINE_APM, .ram = { .min = 1024, .max = 131072, @@ -6317,7 +6317,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 2048, .max = 131072, @@ -6354,7 +6354,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 2048, .max = 131072, @@ -6391,7 +6391,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2_PCIV, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 261120, @@ -6428,7 +6428,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 131072, @@ -6465,7 +6465,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 131072, @@ -6502,7 +6502,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 261120, @@ -6540,7 +6540,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2_PCIV, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 261120, @@ -6578,7 +6578,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 261120, @@ -6615,7 +6615,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -6652,7 +6652,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 131072, @@ -6689,7 +6689,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 262144, @@ -6727,7 +6727,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PCIV, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 131072, @@ -6764,7 +6764,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 131072, @@ -6801,7 +6801,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 262144, @@ -6838,7 +6838,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PCIV, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 131072, @@ -6875,7 +6875,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2_PCIV, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 131072, @@ -6916,7 +6916,7 @@ const machine_t machines[] = { .max_multi = 1.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 8192, .max = 131072, @@ -6954,7 +6954,7 @@ const machine_t machines[] = { .max_multi = 2.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 32768, .max = 163840, @@ -6992,7 +6992,7 @@ const machine_t machines[] = { .max_multi = 2.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 32768, .max = 163840, @@ -7030,7 +7030,7 @@ const machine_t machines[] = { .max_multi = 2.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 32768, .max = 98304, @@ -7068,7 +7068,7 @@ const machine_t machines[] = { .max_multi = 2.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 32768, .max = 131072, @@ -7112,7 +7112,7 @@ const machine_t machines[] = { .max_multi = MACHINE_MULTIPLIER_FIXED }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 2048, .max = 131072, @@ -7149,7 +7149,7 @@ const machine_t machines[] = { .max_multi = MACHINE_MULTIPLIER_FIXED }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 2048, .max = 196608, @@ -7186,7 +7186,7 @@ const machine_t machines[] = { .max_multi = MACHINE_MULTIPLIER_FIXED }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 2048, .max = 131072, @@ -7223,7 +7223,7 @@ const machine_t machines[] = { .max_multi = MACHINE_MULTIPLIER_FIXED }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 2048, .max = 131072, @@ -7262,7 +7262,7 @@ const machine_t machines[] = { .max_multi = MACHINE_MULTIPLIER_FIXED }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 2048, .max = 131072, @@ -7299,7 +7299,7 @@ const machine_t machines[] = { .max_multi = MACHINE_MULTIPLIER_FIXED }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 2048, .max = 131072, @@ -7336,7 +7336,7 @@ const machine_t machines[] = { .max_multi = MACHINE_MULTIPLIER_FIXED }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 2048, .max = 131072, @@ -7373,7 +7373,7 @@ const machine_t machines[] = { .max_multi = MACHINE_MULTIPLIER_FIXED }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 2048, .max = 131072, @@ -7410,7 +7410,7 @@ const machine_t machines[] = { .max_multi = MACHINE_MULTIPLIER_FIXED }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO, + .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 139264, @@ -7451,7 +7451,7 @@ const machine_t machines[] = { .max_multi = MACHINE_MULTIPLIER_FIXED }, .bus_flags = MACHINE_PS2_VLB, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 2048, .max = 65536, @@ -7490,7 +7490,7 @@ const machine_t machines[] = { .max_multi = MACHINE_MULTIPLIER_FIXED }, .bus_flags = MACHINE_PCIV, - .flags = MACHINE_FLAGS_NONE, + .flags = MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -7529,7 +7529,7 @@ const machine_t machines[] = { .max_multi = MACHINE_MULTIPLIER_FIXED }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -7566,7 +7566,7 @@ const machine_t machines[] = { .max_multi = MACHINE_MULTIPLIER_FIXED }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -7606,7 +7606,7 @@ const machine_t machines[] = { .max_multi = 1.5 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 2048, .max = 131072, @@ -7644,7 +7644,7 @@ const machine_t machines[] = { .max_multi = 1.5 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 2048, .max = 131072, @@ -7681,7 +7681,7 @@ const machine_t machines[] = { .max_multi = 1.5 }, .bus_flags = MACHINE_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 2048, .max = 262144, @@ -7720,7 +7720,7 @@ const machine_t machines[] = { .max_multi = 2.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -7757,7 +7757,7 @@ const machine_t machines[] = { .max_multi = 2.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -7796,7 +7796,7 @@ const machine_t machines[] = { .max_multi = 2.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -7833,7 +7833,7 @@ const machine_t machines[] = { .max_multi = 2.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -7870,7 +7870,7 @@ const machine_t machines[] = { .max_multi = 2.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -7911,7 +7911,7 @@ const machine_t machines[] = { .max_multi = 1.5 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_FLAGS_NONE, + .flags = MACHINE_APM | MACHINE_ACPI, .ram = { .min = 2048, .max = 65536, @@ -7949,7 +7949,7 @@ const machine_t machines[] = { .max_multi = 2.0 }, .bus_flags = MACHINE_PCIV, - .flags = MACHINE_FLAGS_NONE, + .flags = MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -7988,7 +7988,7 @@ const machine_t machines[] = { .max_multi = 1.5 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -8025,7 +8025,7 @@ const machine_t machines[] = { .max_multi = 1.5 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -8062,7 +8062,7 @@ const machine_t machines[] = { .max_multi = 1.5 }, .bus_flags = MACHINE_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -8102,7 +8102,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -8139,7 +8139,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -8176,7 +8176,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_GAMEPORT, + .flags = MACHINE_IDE_DUAL | MACHINE_GAMEPORT | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -8215,7 +8215,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -8253,7 +8253,7 @@ const machine_t machines[] = { .max_multi = 2.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO, + .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -8292,7 +8292,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO, + .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -8331,7 +8331,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -8370,7 +8370,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO, + .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -8407,7 +8407,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -8445,7 +8445,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO, + .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -8482,7 +8482,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -8519,7 +8519,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -8560,7 +8560,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 196608, @@ -8597,7 +8597,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 524288, @@ -8634,7 +8634,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 524288, @@ -8672,7 +8672,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 786432, @@ -8711,7 +8711,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -8750,7 +8750,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -8789,7 +8789,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 524288, @@ -8826,7 +8826,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 524288, @@ -8866,7 +8866,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 196608, @@ -8903,7 +8903,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 262144, @@ -8940,7 +8940,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -8979,7 +8979,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -9018,7 +9018,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 196608, @@ -9058,7 +9058,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 196608, @@ -9095,7 +9095,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 524288, @@ -9134,7 +9134,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_SCSI, + .flags = MACHINE_IDE_DUAL | MACHINE_SCSI | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -9171,7 +9171,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -9209,7 +9209,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -9246,7 +9246,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -9284,7 +9284,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO, + .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -9321,7 +9321,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO, + .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -9358,7 +9358,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -9395,7 +9395,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -9434,7 +9434,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -9471,7 +9471,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_SOUND, + .flags = MACHINE_IDE_DUAL | MACHINE_SOUND | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -9509,7 +9509,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -9547,7 +9547,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_GAMEPORT, + .flags = MACHINE_IDE_DUAL | MACHINE_GAMEPORT | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -9586,7 +9586,7 @@ const machine_t machines[] = { .max_multi = 5.5 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 262144, @@ -9623,7 +9623,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 262144, @@ -9661,7 +9661,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 262144, @@ -9699,7 +9699,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 262144, @@ -9736,7 +9736,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 262144, @@ -9773,7 +9773,7 @@ const machine_t machines[] = { .max_multi = 5.5 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 262144, @@ -9810,7 +9810,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 262144, @@ -9850,7 +9850,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 524288, @@ -9890,7 +9890,7 @@ const machine_t machines[] = { .max_multi = 5.5 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 1048576, @@ -9929,7 +9929,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 393216, @@ -9966,7 +9966,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 262144, @@ -10005,7 +10005,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 786432, @@ -10042,7 +10042,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 1048576, @@ -10082,7 +10082,7 @@ const machine_t machines[] = { .max_multi = 5.5 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 1024, .max = 1572864, @@ -10120,7 +10120,7 @@ const machine_t machines[] = { .max_multi = 5.5 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 1024, .max = 1572864, @@ -10157,7 +10157,7 @@ const machine_t machines[] = { .max_multi = 5.5 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 1024, .max = 1572864, @@ -10194,7 +10194,7 @@ const machine_t machines[] = { .max_multi = 5.5 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 1024, .max = 1572864, @@ -10234,7 +10234,7 @@ const machine_t machines[] = { .max_multi = 5.5 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 1048576, @@ -10272,7 +10272,7 @@ const machine_t machines[] = { .max_multi = 5.5 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 1048576, @@ -10310,7 +10310,7 @@ const machine_t machines[] = { .max_multi = 5.5 }, .bus_flags = MACHINE_PS2_A97, - .flags = MACHINE_IDE_DUAL | MACHINE_SOUND, + .flags = MACHINE_IDE_DUAL | MACHINE_SOUND | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 786432, @@ -10348,7 +10348,7 @@ const machine_t machines[] = { .max_multi = 5.5 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 786432, @@ -10388,7 +10388,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 524288, @@ -10427,7 +10427,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 524288, @@ -10464,7 +10464,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 1048576, @@ -10502,7 +10502,7 @@ const machine_t machines[] = { .max_multi = 5.5 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 1048576, @@ -10538,7 +10538,7 @@ const machine_t machines[] = { .max_multi = 5.5 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 524288, @@ -10577,7 +10577,7 @@ const machine_t machines[] = { .max_multi = 3.5 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -10616,7 +10616,7 @@ const machine_t machines[] = { .max_multi = 3.5 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 524288, @@ -10653,7 +10653,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 786432, @@ -10692,7 +10692,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 524288, @@ -10732,7 +10732,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 1024, .max = 1572864, @@ -10771,7 +10771,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 1048576, @@ -10809,7 +10809,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 786432, @@ -10849,7 +10849,7 @@ const machine_t machines[] = { .max_multi = 5.5 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 1048576, @@ -10887,7 +10887,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 1048576, @@ -10927,7 +10927,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 524288, @@ -10967,7 +10967,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 1048576, @@ -11005,7 +11005,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 1048576, @@ -11043,7 +11043,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 786432, @@ -11081,7 +11081,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 786432, @@ -11119,7 +11119,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 1048576, @@ -11157,7 +11157,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 1048576, @@ -11195,7 +11195,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL | MACHINE_SOUND, + .flags = MACHINE_IDE_DUAL | MACHINE_SOUND | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 1048576, @@ -11233,7 +11233,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 786432, @@ -11273,7 +11273,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL | MACHINE_AV, + .flags = MACHINE_IDE_DUAL | MACHINE_AV | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 524288, @@ -11311,7 +11311,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL | MACHINE_AV, + .flags = MACHINE_IDE_DUAL | MACHINE_AV | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 524288, @@ -11351,7 +11351,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 786432, @@ -11391,7 +11391,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 524288, @@ -11429,7 +11429,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 1572864, @@ -11467,7 +11467,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 2097152, @@ -11505,7 +11505,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL | MACHINE_SOUND, + .flags = MACHINE_IDE_DUAL | MACHINE_SOUND | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 3145728, @@ -11546,7 +11546,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_NOISA, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 16384, .max = 2097152, @@ -11587,7 +11587,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 786432, @@ -11626,7 +11626,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL | MACHINE_SOUND, + .flags = MACHINE_IDE_DUAL | MACHINE_SOUND | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 786432, @@ -11667,7 +11667,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 16384, .max = 2097152, @@ -11705,7 +11705,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 16384, .max = 2097152, @@ -11746,7 +11746,7 @@ const machine_t machines[] = { .max_multi = MACHINE_MULTIPLIER_FIXED, }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 786432, @@ -11786,7 +11786,7 @@ const machine_t machines[] = { .max_multi = 8.0 /* limits assumed */ }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 524288, @@ -11824,7 +11824,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 1048576, @@ -11862,7 +11862,7 @@ const machine_t machines[] = { .max_multi = 8.0 /* limits assumed */ }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 786432, @@ -11902,7 +11902,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 524288, @@ -11942,7 +11942,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 1048576, @@ -11982,7 +11982,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 786432, @@ -12020,7 +12020,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 1572864, @@ -12058,7 +12058,7 @@ const machine_t machines[] = { .max_multi = MACHINE_MULTIPLIER_FIXED }, .bus_flags = MACHINE_PS2_A97, - .flags = MACHINE_IDE_DUAL | MACHINE_AG, + .flags = MACHINE_IDE_DUAL | MACHINE_AG | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 16384, .max = 3145728, @@ -12096,7 +12096,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_NOI97, - .flags = MACHINE_IDE_DUAL | MACHINE_SOUND, + .flags = MACHINE_IDE_DUAL | MACHINE_SOUND | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 16384, .max = 4194304, @@ -12136,7 +12136,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 1048576, From cd2abb2454e407c98dd9d5783ee9250393d6a717 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Mon, 6 Feb 2023 14:16:58 -0500 Subject: [PATCH 218/285] Ability to build with CLANG and Regular builds --- .github/workflows/c-cpp.yml | 19 +++++++++++++++++++ .github/workflows/cmake.yml | 16 ++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index 5b2573dde..e91259189 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -28,6 +28,9 @@ jobs: fail-fast: true matrix: build: +# - name: Regular +# debug: n +# dev: n - name: Debug debug: y dev: n @@ -44,14 +47,28 @@ jobs: new: y slug: -NDR environment: +# - msystem: MSYS +# clang: n +# x64: y - msystem: MINGW32 prefix: mingw-w64-i686 + clang: n x64: n - msystem: MINGW64 prefix: mingw-w64-x86_64 + clang: n x64: y +# - msystem: CLANG32 +# prefix: mingw-w64-clang-i686 +# clang: y +# x64: n +# - msystem: CLANG64 +# prefix: mingw-w64-clang-x86_64 +# clang: y +# x64: y - msystem: UCRT64 prefix: mingw-w64-ucrt-x86_64 + clang: n x64: y steps: @@ -65,6 +82,7 @@ jobs: make pacboy: >- gcc:p + clang:p pkg-config:p freetype:p SDL2:p @@ -80,6 +98,7 @@ jobs: DEV_BUILD=${{ matrix.build.dev }} DEBUG=${{ matrix.build.debug }} NEW_DYNAREC=${{ matrix.dynarec.new }} + CLANG=${{ matrix.environment.clang }} X64=${{ matrix.environment.x64 }} working-directory: ./src - uses: actions/upload-artifact@v3 diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index 4596b51b8..be42cbae6 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -37,6 +37,8 @@ jobs: fail-fast: true matrix: build: +# - name: Regular +# preset: regular - name: Debug preset: debug slug: -Debug @@ -62,12 +64,20 @@ jobs: qt5-base:p qt5-tools:p 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 - msystem: UCRT64 prefix: mingw-w64-ucrt-x86_64 toolchain: ./cmake/flags-gcc-x86_64.cmake @@ -122,6 +132,8 @@ jobs: fail-fast: true matrix: build: +# - name: Regular +# preset: regular - name: Debug preset: debug slug: -Debug @@ -219,6 +231,8 @@ jobs: fail-fast: true matrix: build: +# - name: Regular +# preset: regular - name: Debug preset: debug slug: -Debug @@ -280,6 +294,8 @@ jobs: fail-fast: true matrix: build: +# - name: Regular +# preset: regular - name: Debug preset: debug slug: -Debug From b18ed9e20e0568451f516ff546fdc0dd280fb6cd Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Fri, 13 Jan 2023 01:21:53 -0500 Subject: [PATCH 219/285] Make CMakePresets.json better --- CMakePresets.json | 48 ++++++++++++++++++++++++++++++++--------------- 1 file changed, 33 insertions(+), 15 deletions(-) diff --git a/CMakePresets.json b/CMakePresets.json index 2cb84ee6f..d2980ed87 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -1,36 +1,52 @@ { - "version": 3, + "version": 2, "cmakeMinimumRequired": { "major": 3, - "minor": 21 + "minor": 20 }, "configurePresets": [ + { + "name": "base", + "binaryDir": "${sourceDir}/build/${presetName}", + "cacheVariables": { + "CMAKE_INSTALL_PREFIX": "${sourceDir}/build/artifacts", + "CMAKE_EXPORT_COMPILE_COMMANDS": true, + "DEV_BRANCH": "OFF", + "NEW_DYNAREC": "OFF", + "QT": "ON" + }, + "generator": "Ninja", + "hidden": true + }, { "name": "regular", "cacheVariables": { - "CMAKE_BUILD_TYPE": "Release", - "DEV_BRANCH": "OFF", - "NEW_DYNAREC": "OFF" + "CMAKE_BUILD_TYPE": "Release" }, - "generator": "Ninja" + "inherits": "base" }, { "name": "optimized", "cacheVariables": { - "CMAKE_BUILD_TYPE": "Optimized", - "DEV_BRANCH": "OFF", - "NEW_DYNAREC": "OFF" + "CMAKE_BUILD_TYPE": "Optimized" }, - "generator": "Ninja" + "inherits": "base" }, { "name": "debug", "cacheVariables": { - "CMAKE_BUILD_TYPE": "Debug", - "DEV_BRANCH": "OFF", + "CMAKE_BUILD_TYPE": "Debug" + }, + "inherits": "base" + }, + { + "name": "development", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Release", + "DEV_BRANCH": "ON", "NEW_DYNAREC": "OFF" }, - "generator": "Ninja" + "inherits": "base" }, { "name": "experimental", @@ -39,7 +55,9 @@ "DEV_BRANCH": "ON", "NEW_DYNAREC": "ON" }, - "generator": "Ninja" + "inherits": "base" } - ] + ], + "buildPresets": [], + "testPresets": [] } From 0e53a29e3d733414a0effd37b6e96736661818b1 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Mon, 6 Feb 2023 14:28:59 -0500 Subject: [PATCH 220/285] Fix build when ENABLE_CDROM_LOG is set --- src/cdrom/cdrom.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cdrom/cdrom.c b/src/cdrom/cdrom.c index 062e3bf72..31c5d2165 100644 --- a/src/cdrom/cdrom.c +++ b/src/cdrom/cdrom.c @@ -802,7 +802,7 @@ cdrom_get_current_subchannel_sony(cdrom_t *dev, uint8_t *b, int msf) dev->ops->get_subchannel(dev, dev->seek_pos, &subc); - cdrom_log("CD-ROM %i: Returned subchannel at %02i:%02i.%02i, ret = %02x, seek pos = %08x, cd_end = %08x.\n", dev->id, subc.abs_m, subc.abs_s, subc.abs_f, ret, dev->seek_pos, dev->cd_end); + cdrom_log("CD-ROM %i: Returned subchannel at %02i:%02i.%02i, seek pos = %08x, cd_end = %08x.\n", dev->id, subc.abs_m, subc.abs_s, subc.abs_f, dev->seek_pos, dev->cd_end); b[pos++] = subc.attr; b[pos++] = subc.track; From 8910c10d94e8bb0e52d82f1316f96bf88f71fa0b Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Mon, 6 Feb 2023 19:37:51 -0300 Subject: [PATCH 221/285] Jenkins: Don't create AppImage workaround symlink if it already exists (also: introducing new Windows node) --- .ci/build.sh | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.ci/build.sh b/.ci/build.sh index 63a957477..85420a3c6 100644 --- a/.ci/build.sh +++ b/.ci/build.sh @@ -1175,8 +1175,11 @@ EOF do for loader_copy in "$loader" "/lib/$(basename "$loader")" do - mkdir -p "/runtime/compat$(dirname "$loader_copy")" - ln -s "$loader" "/runtime/compat$loader_copy" + if [ ! -e "/runtime/compat$loader_copy" ] + then + mkdir -p "/runtime/compat$(dirname "$loader_copy")" + ln -s "$loader" "/runtime/compat$loader_copy" + fi echo " - /runtime/compat$loader_copy" >> AppImageBuilder-generated.yml done done From 64becf5d137ff827a3169166365675fdceed7114 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Tue, 7 Feb 2023 17:18:12 +0600 Subject: [PATCH 222/285] Fix erased line --- src/qt/qt_mainwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index 41c363744..65af4d8d3 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -2462,9 +2462,9 @@ void MainWindow::on_actionPen_triggered() { tablet_tool_type = 1; config_save(); +} void MainWindow::on_actionACPI_Shutdown_triggered() { acpi_pwrbut_pressed = 1; - } From 64ad9e5fbaea9b218c5c165397673dee18614a3c Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 7 Feb 2023 06:48:06 -0500 Subject: [PATCH 223/285] Some escaped standardization in machine table --- src/machine/machine_table.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index c65884b7e..587e854c9 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -8016,7 +8016,7 @@ const machine_t machines[] = { .pad2 = 0, .cpu = { .package = CPU_PKG_SOCKET5_7, - CPU_BLOCK(CPU_PENTIUMMMX), + .block = CPU_BLOCK(CPU_PENTIUMMMX), .min_bus = 50000000, .max_bus = 66666667, .min_voltage = 3520, @@ -9763,14 +9763,14 @@ const machine_t machines[] = { .pad1 = MACHINE_AVAILABLE, .pad2 = 0, .cpu = { - .package = CPU_PKG_SOCKET5_7, - .block = CPU_BLOCK_NONE, - .min_bus = 55000000, - .max_bus = 75000000, - .min_voltage = 2800, - .max_voltage = 3520, - .min_multi = 1.5, - .max_multi = 5.5 + .package = CPU_PKG_SOCKET5_7, + .block = CPU_BLOCK_NONE, + .min_bus = 55000000, + .max_bus = 75000000, + .min_voltage = 2800, + .max_voltage = 3520, + .min_multi = 1.5, + .max_multi = 5.5 }, .bus_flags = MACHINE_PS2_PCI, .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, From 22c0fd29a360f8dde4180e744038e5989e2e29d2 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Tue, 7 Feb 2023 13:12:34 -0300 Subject: [PATCH 224/285] Jenkins: Overhaul MSYS2 package handling to remove the version pinning hack --- .ci/build.sh | 108 +++++++------------------------------- .ci/dependencies_msys.txt | 36 +++++-------- 2 files changed, 30 insertions(+), 114 deletions(-) diff --git a/.ci/build.sh b/.ci/build.sh index 85420a3c6..56199d3e6 100644 --- a/.ci/build.sh +++ b/.ci/build.sh @@ -26,7 +26,6 @@ # - Packaging the Ghostscript DLL requires 32-bit and/or 64-bit Ghostscript on Program Files # - Packaging the FluidSynth DLL requires it to be at /home/86Box/dll32/libfluidsynth.dll # and/or /home/86Box/dll64/libfluidsynth64.dll (for 32-bit and 64-bit builds respectively) -# - Packaging the Discord DLL requires wget (MSYS should come with it) # - For Linux builds: # - Only Debian and derivatives are supported # - dpkg and apt-get are called through sudo to manage dependencies; make sure those @@ -284,7 +283,7 @@ then then # Update keyring as well, since the package signing keys sometimes change. echo [-] Updating package databases and keyring - yes | pacman -Sy --needed msys2-keyring + pacman -Sy --needed --noconfirm msys2-keyring # Save build tag to skip pacman sync/keyring later. save_buildtag pacmansync @@ -292,100 +291,29 @@ then echo [-] Not updating package databases and keyring again fi - # Query installed packages. - pacman -Qe > "$cache_dir/pacman.txt" - - # Download the specified versions of architecture-specific dependencies. - echo -n [-] Downloading dependencies: - pkg_dir="/var/cache/pacman/pkg" - repo_base="https://repo.msys2.org/mingw/$(echo $MSYSTEM | tr '[:upper:]' '[:lower:]')" - cat .ci/dependencies_msys.txt | tr -d '\r' > "$cache_dir/deps.txt" - pkgs="" - while IFS=" " read pkg version - do - prefixed_pkg="$MINGW_PACKAGE_PREFIX-$pkg" - installed_version=$(grep -E "^$prefixed_pkg " "$cache_dir/pacman.txt" | cut -d " " -f 2) - if [ "$installed_version" != "$version" ] # installed_version will be empty if not installed - then - echo -n " [$pkg" - - # Download package if not already present in the local cache. - pkg_tar="$prefixed_pkg-$version-any.pkg.tar" - if [ -s "$pkg_dir/$pkg_tar.xz" ] - then - pkg_fn="$pkg_tar.xz" - pkg_dest="$pkg_dir/$pkg_fn" - else - pkg_fn="$pkg_tar.zst" - pkg_dest="$pkg_dir/$pkg_fn" - if [ ! -s "$pkg_dest" ] - then - if ! wget -qO "$pkg_dest" "$repo_base/$pkg_fn" - then - rm -f "$pkg_dest" - pkg_fn="$pkg_tar.xz" - pkg_dest="$pkg_dir/$pkg_fn" - wget -qO "$pkg_dest" "$repo_base/$pkg_fn" || rm -f "$pkg_dest" - fi - if [ -s "$pkg_dest" ] - then - wget -qO "$pkg_dest.sig" "$repo_base/$pkg_fn.sig" || rm -f "$pkg_dest.sig" - [ ! -s "$pkg_dest.sig" ] && rm -f "$pkg_dest.sig" - fi - fi - fi - - # Check if the cached package is valid. - if [ -s "$pkg_dest" ] - then - # Add cached zst package. - pkgs="$pkgs $pkg_fn" - else - # Not valid, remove if it exists. - rm -f "$pkg_dest" "$pkg_dest.sig" - echo -n " FAIL" - fi - echo -n "]" - fi - done < "$cache_dir/deps.txt" - [ -z "$pkgs" ] && echo -n ' none required' - echo - - # Install the downloaded architecture-specific dependencies. - echo [-] Installing dependencies through pacman - if [ -n "$pkgs" ] - then - pushd "$pkg_dir" - yes | pacman -U --needed $pkgs - if [ $? -ne 0 ] - then - # Install packages individually if installing them all together failed. - for pkg in $pkgs - do - yes | pacman -U --needed "$pkg" - done - fi - popd - - # Query installed packages again. - pacman -Qe > "$cache_dir/pacman.txt" - fi - - # Install the latest versions for any missing packages (if the specified version couldn't be installed). + # Establish general dependencies. pkgs="git" - while IFS=" " read pkg version + + # Gather installed architecture-specific packages for updating. + # This prevents outdated shared libraries, unmet dependencies + # and potentially other issues caused by the fact pacman doesn't + # update a package's dependencies unless explicitly told to. + pkgs="$pkgs $(pacman -Quq | grep -E "^$MINGW_PACKAGE_PREFIX-")" + + # Establish architecture-specific dependencies. + while read pkg rest do - prefixed_pkg="$MINGW_PACKAGE_PREFIX-$pkg" - grep -qE "^$prefixed_pkg " "$cache_dir/pacman.txt" || pkgs="$pkgs $prefixed_pkg" - done < "$cache_dir/deps.txt" - rm -f "$cache_dir/pacman.txt" "$cache_dir/deps.txt" - yes | pacman -S --needed $pkgs - if [ $? -ne 0 ] + pkgs="$pkgs $MINGW_PACKAGE_PREFIX-$(echo "$pkg" | tr -d '\r')" # CR removal required + done < .ci/dependencies_msys.txt + + # Install or update dependencies. + echo [-] Installing dependencies through pacman + if ! pacman -S --needed --noconfirm $pkgs then # Install packages individually if installing them all together failed. for pkg in $pkgs do - yes | pacman -S --needed "$pkg" + pacman -S --needed --noconfirm "$pkg" done fi diff --git a/.ci/dependencies_msys.txt b/.ci/dependencies_msys.txt index 35e3506fd..df4932352 100644 --- a/.ci/dependencies_msys.txt +++ b/.ci/dependencies_msys.txt @@ -1,24 +1,12 @@ -zlib 1.2.11-9 -binutils 2.37-4 -headers-git 9.0.0.6357.eac8c38c1-1 -crt-git 9.0.0.6357.eac8c38c1-2 -libwinpthread-git 9.0.0.6357.eac8c38c1-1 -winpthreads-git 9.0.0.6357.eac8c38c1-1 -winstorecompat-git 9.0.0.6357.eac8c38c1-1 -gcc-libs 11.2.0-4 -gcc-ada 11.2.0-4 -gcc-fortran 11.2.0-4 -gcc-libgfortran 11.2.0-4 -gcc-objc 11.2.0-4 -gcc 11.2.0-4 -libgccjit 11.2.0-4 -tools-git 9.0.0.6357.eac8c38c1-1 -ninja 1.10.2-3 -pkgconf 1.8.0-2 -openal 1.21.1-3 -libpng 1.6.37-6 -freetype 2.11.1-1 -SDL2 2.0.18-2 -rtmidi 4.0.0-1 -cmake 3.22.1-1 -qt5-static 5.15.2-4 +ninja +cmake +gcc +pkgconf +openal +freetype +SDL2 +zlib +libpng +rtmidi +qt5-static +qt5-translations From 9ceec90d7926c8e5471c2db99b30c644673618b1 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Tue, 7 Feb 2023 21:17:14 +0100 Subject: [PATCH 225/285] Added more ATAPI CD-ROM types (including the NEC CDR-273 4.20 drive used to be there at some point) and removed some non-working types. --- src/include/86box/cdrom.h | 67 +++++++++++++++++++++------------------ src/scsi/scsi_cdrom.c | 19 +++++++++-- 2 files changed, 53 insertions(+), 33 deletions(-) diff --git a/src/include/86box/cdrom.h b/src/include/86box/cdrom.h index 28e9cf14b..d2f032280 100644 --- a/src/include/86box/cdrom.h +++ b/src/include/86box/cdrom.h @@ -60,7 +60,7 @@ enum { CDROM_BUS_USB }; -#define KNOWN_CDROM_DRIVE_TYPES 30 +#define KNOWN_CDROM_DRIVE_TYPES 35 #define BUS_TYPE_ALL 0 #define BUS_TYPE_IDE 1 #define BUS_TYPE_SCSI 2 @@ -75,36 +75,41 @@ static const struct const int bus_type; } cdrom_drive_types[] = { - { "86BOX", "CD-ROM", "1.00", "(ATAPI/SCSI) 86BOX CD-ROM 1.00", "86BOX_CD-ROM_1.00", BUS_TYPE_ALL}, - { "AZT", "CDA46802I", "1.15", "(ATAPI) AZT CDA46802I 1.15", "AZT_CDA46802I_1.15", BUS_TYPE_IDE}, - { "BTC", "CD-ROM BCD36XH", "U1.0", "(ATAPI) BTC CD-ROM BCD36XH U1.0", "BTC_CD-ROM_BCD36XH_U1.0", BUS_TYPE_IDE}, - { "GOLDSTAR", "CRD-8160B", "3.14", "(ATAPI) GOLDSTAR CRD-8160B 3.14", "GOLDSTAR_CRD-8160B_3.14", BUS_TYPE_IDE}, - { "HITACHI", "CDR-8130", "0020", "(ATAPI) HITACHI CDR-8130 0020", "HITACHI_CDR-8130_0020", BUS_TYPE_IDE}, - { "KENWOOD", "CD-ROM UCR-421", "208E", "(ATAPI) KENWOOD CD-ROM UCR-421 208E", "KENWOOD_CD-ROM_UCR-421_208E", BUS_TYPE_IDE}, - { "MATSHITA", "CD-ROM CR-587", "7S13", "(ATAPI) MATSHITA CD-ROM CR-587 7S13", "MATSHITA_CD-ROM_CR-587_7S13", BUS_TYPE_IDE}, - { "MATSHITA", "CD-ROM CR-588", "LS15", "(ATAPI) MATSHITA CD-ROM CR-588 LS15", "MATSHITA_CD-ROM_CR-588_LS15", BUS_TYPE_IDE}, - { "MITSUMI", "CRMC-FX4820T", "D02A", "(ATAPI) MITSUMI CRMC-FX4820T D02A", "MITSUMI_CRMC-FX4820T_D02A", BUS_TYPE_IDE}, - { "NEC", "CD-ROM DRIVE:260", "1.00", "(ATAPI) NEC CD-ROM DRIVE:260 1.00", "NEC_CD-ROM_DRIVE260_1.00", BUS_TYPE_IDE}, - { "NEC", "CD-ROM DRIVE:260", "1.01", "(ATAPI) NEC CD-ROM DRIVE:260 1.01", "NEC_CD-ROM_DRIVE260_1.01", BUS_TYPE_IDE}, - { "NEC", "CDR-1300A", "1.05", "(ATAPI) NEC CDR-1300A 1.05", "NEC_CDR-1300A_1.05", BUS_TYPE_IDE}, - { "PHILIPS", "CD-ROM PCA403CD", "U31P", "(ATAPI) PHILIPS CD-ROM PCA403CD U31P", "PHILIPS_CD-ROM_PCA403CD_U31P", BUS_TYPE_IDE}, - { "SONY", "CD-ROM CDU76", "1.0i", "(ATAPI) SONY CD-ROM CDU76 1.0i", "SONY_CD-ROM_CDU76_1.0i", BUS_TYPE_IDE}, - { "SONY", "CD-ROM CDU311", "3.0h", "(ATAPI) SONY CD-ROM CDU311 3.0h", "SONY_CD-ROM_CDU311_3.0h", BUS_TYPE_IDE}, - { "TOSHIBA", "CD-ROM XM-5702B", "TA70", "(ATAPI) TOSHIBA CD-ROM XM-5702B TA70", "TOSHIBA_CD-ROM_XM-5702B_TA70", BUS_TYPE_IDE}, - { "CHINON", "CD-ROM CDS-431", "H42 ", "(SCSI) CHINON CD-ROM CDS-431 H42", "CHINON_CD-ROM_CDS-431_H42", BUS_TYPE_SCSI}, - { "DEC", "RRD45 (C) DEC", "0436", "(SCSI) DEC RRD45 0436", "DEC_RRD45_0436", BUS_TYPE_SCSI}, - { "MATSHITA", "CD-ROM CR-501", "1.0b", "(SCSI) MATSHITA CD-ROM CR-501 1.0b", "MATSHITA_CD-ROM_CR-501_1.0b", BUS_TYPE_SCSI}, - { "NEC", "CD-ROM DRIVE:74", "1.00", "(SCSI) NEC CD-ROM DRIVE:74 1.00", "NEC_CD-ROM_DRIVE74_1.00", BUS_TYPE_SCSI}, - { "NEC", "CD-ROM DRIVE:464", "1.05", "(SCSI) NEC CD-ROM DRIVE:464 1.05", "NEC_CD-ROM_DRIVE464_1.05", BUS_TYPE_SCSI}, - { "SONY", "CD-ROM CDU-541", "1.0i", "(SCSI) SONY CD-ROM CDU-541 1.0i", "SONY_CD-ROM_CDU-541_1.0i", BUS_TYPE_SCSI}, - { "SONY", "CD-ROM CDU-76S", "1.00", "(SCSI) SONY CD-ROM CDU-76S 1.00", "SONY_CD-ROM_CDU-76S_1.00", BUS_TYPE_SCSI}, - { "PHILIPS", "CDD2600", "1.07", "(SCSI) PHILIPS CDD2600 1.07", "PHILIPS_CDD2600_1.07", BUS_TYPE_SCSI}, - { "PIONEER", "CD-ROM DRM-604X", "2403", "(SCSI) PIONEER CD-ROM DRM-604X 2403", "PIONEER_CD-ROM_DRM-604X_2403", BUS_TYPE_SCSI}, - { "PLEXTOR", "CD-ROM PX-32TS", "1.03", "(SCSI) PLEXTOR CD-ROM PX-32TS 1.03", "PLEXTOR_CD-ROM_PX-32TS_1.03", BUS_TYPE_SCSI}, - { "TEAC", "CD-R55S", "1.0R", "(SCSI) TEAC CD-R55S 1.0R", "TEAC_CD-R55S_1.0R", BUS_TYPE_SCSI}, - { "TOSHIBA", "CD-ROM DRIVE:XM", "3433", "(SCSI) TOSHIBA CD-ROM DRIVE:XM 3433", "TOSHIBA_CD-ROM_DRIVEXM_3433", BUS_TYPE_SCSI}, - { "TOSHIBA", "CD-ROM XM-3301TA", "0272", "(SCSI) TOSHIBA CD-ROM XM-3301TA 0272", "TOSHIBA_CD-ROM_XM-3301TA_0272", BUS_TYPE_SCSI}, - { "TOSHIBA", "CD-ROM XM-5701TA", "3136", "(SCSI) TOSHIBA CD-ROM XM-5701TA 3136", "TOSHIBA_CD-ROM_XM-5701TA_3136", BUS_TYPE_SCSI}, + { "86BOX", "CD-ROM", "1.00", "(ATAPI/SCSI) 86BOX CD-ROM 1.00", "86BOX_CD-ROM_1.00", BUS_TYPE_ALL}, /*1*/ + { "AZT", "CDA46802I", "1.15", "(ATAPI) AZT CDA46802I 1.15", "AZT_CDA46802I_1.15", BUS_TYPE_IDE}, /*2*/ + { "BTC", "CD-ROM BCD36XH", "U1.0", "(ATAPI) BTC CD-ROM BCD36XH U1.0", "BTC_CD-ROM_BCD36XH_U1.0", BUS_TYPE_IDE}, /*3*/ + { "GOLDSTAR", "CRD-8160B", "3.14", "(ATAPI) GOLDSTAR CRD-8160B 3.14", "GOLDSTAR_CRD-8160B_3.14", BUS_TYPE_IDE}, /*4*/ + { "HITACHI", "CDR-8130", "0020", "(ATAPI) HITACHI CDR-8130 0020", "HITACHI_CDR-8130_0020", BUS_TYPE_IDE}, /*5*/ + { "KENWOOD", "CD-ROM UCR-421", "208E", "(ATAPI) KENWOOD CD-ROM UCR-421 208E", "KENWOOD_CD-ROM_UCR-421_208E", BUS_TYPE_IDE}, /*6*/ + { "MATSHITA", "CD-ROM CR-587", "7S13", "(ATAPI) MATSHITA CD-ROM CR-587 7S13", "MATSHITA_CD-ROM_CR-587_7S13", BUS_TYPE_IDE}, /*7*/ + { "MATSHITA", "CD-ROM CR-588", "LS15", "(ATAPI) MATSHITA CD-ROM CR-588 LS15", "MATSHITA_CD-ROM_CR-588_LS15", BUS_TYPE_IDE}, /*8*/ + { "MATSHITA", "CR-571", "1.0e", "(ATAPI) MATSHITA CR-571 1.0e", "MATSHITA_CR-571_1.0e", BUS_TYPE_IDE}, /*9*/ + { "MATSHITA", "CR-572", "1.0j", "(ATAPI) MATSHITA CR-572 1.0j", "MATSHITA_CR-572_1.0j", BUS_TYPE_IDE}, /*10*/ + { "MITSUMI", "CRMC-FX4820T", "D02A", "(ATAPI) MITSUMI CRMC-FX4820T D02A", "MITSUMI_CRMC-FX4820T_D02A", BUS_TYPE_IDE}, /*11*/ + { "NEC", "CD-ROM DRIVE:260", "1.00", "(ATAPI) NEC CD-ROM DRIVE:260 1.00", "NEC_CD-ROM_DRIVE260_1.00", BUS_TYPE_IDE}, /*12*/ + { "NEC", "CD-ROM DRIVE:260", "1.01", "(ATAPI) NEC CD-ROM DRIVE:260 1.01", "NEC_CD-ROM_DRIVE260_1.01", BUS_TYPE_IDE}, /*13*/ + { "NEC", "CD-ROM DRIVE:273", "4.20", "(ATAPI) NEC CD-ROM DRIVE:273 4.20", "NEC_CD-ROM_DRIVE273_4.20", BUS_TYPE_IDE}, /*14*/ + { "NEC", "CD-ROM DRIVE:280", "1.05", "(ATAPI) NEC CD-ROM DRIVE:280 1.05", "NEC_CD-ROM_DRIVE280_1.05", BUS_TYPE_IDE}, /*15*/ + { "NEC", "CD-ROM DRIVE:280", "3.08", "(ATAPI) NEC CD-ROM DRIVE:280 3.08", "NEC_CD-ROM_DRIVE280_3.08", BUS_TYPE_IDE}, /*16*/ + { "PHILIPS", "CD-ROM PCA403CD", "U31P", "(ATAPI) PHILIPS CD-ROM PCA403CD U31P", "PHILIPS_CD-ROM_PCA403CD_U31P", BUS_TYPE_IDE}, /*17*/ + { "SONY", "CD-ROM CDU76", "1.0i", "(ATAPI) SONY CD-ROM CDU76 1.0i", "SONY_CD-ROM_CDU76_1.0i", BUS_TYPE_IDE}, /*18*/ + { "SONY", "CD-ROM CDU311", "3.0h", "(ATAPI) SONY CD-ROM CDU311 3.0h", "SONY_CD-ROM_CDU311_3.0h", BUS_TYPE_IDE}, /*19*/ + { "TOSHIBA", "CD-ROM XM-5302TA", "0305", "(ATAPI) TOSHIBA CD-ROM XM-5302TA 0305", "TOSHIBA_CD-ROM_XM-5302TA_0305", BUS_TYPE_IDE}, /*20*/ + { "TOSHIBA", "CD-ROM XM-5702B", "TA70", "(ATAPI) TOSHIBA CD-ROM XM-5702B TA70", "TOSHIBA_CD-ROM_XM-5702B_TA70", BUS_TYPE_IDE}, /*21*/ + { "CHINON", "CD-ROM CDS-431", "H42 ", "(SCSI) CHINON CD-ROM CDS-431 H42", "CHINON_CD-ROM_CDS-431_H42", BUS_TYPE_SCSI}, /*22*/ + { "DEC", "RRD45 (C) DEC", "0436", "(SCSI) DEC RRD45 0436", "DEC_RRD45_0436", BUS_TYPE_SCSI}, /*23*/ + { "MATSHITA", "CD-ROM CR-501", "1.0b", "(SCSI) MATSHITA CD-ROM CR-501 1.0b", "MATSHITA_CD-ROM_CR-501_1.0b", BUS_TYPE_SCSI}, /*24*/ + { "NEC", "CD-ROM DRIVE:74", "1.00", "(SCSI) NEC CD-ROM DRIVE:74 1.00", "NEC_CD-ROM_DRIVE74_1.00", BUS_TYPE_SCSI}, /*25*/ + { "NEC", "CD-ROM DRIVE:464", "1.05", "(SCSI) NEC CD-ROM DRIVE:464 1.05", "NEC_CD-ROM_DRIVE464_1.05", BUS_TYPE_SCSI}, /*26*/ + { "SONY", "CD-ROM CDU-541", "1.0i", "(SCSI) SONY CD-ROM CDU-541 1.0i", "SONY_CD-ROM_CDU-541_1.0i", BUS_TYPE_SCSI}, /*27*/ + { "SONY", "CD-ROM CDU-76S", "1.00", "(SCSI) SONY CD-ROM CDU-76S 1.00", "SONY_CD-ROM_CDU-76S_1.00", BUS_TYPE_SCSI}, /*28*/ + { "PHILIPS", "CDD2600", "1.07", "(SCSI) PHILIPS CDD2600 1.07", "PHILIPS_CDD2600_1.07", BUS_TYPE_SCSI}, /*29*/ + { "PIONEER", "CD-ROM DRM-604X", "2403", "(SCSI) PIONEER CD-ROM DRM-604X 2403", "PIONEER_CD-ROM_DRM-604X_2403", BUS_TYPE_SCSI}, /*30*/ + { "PLEXTOR", "CD-ROM PX-32TS", "1.03", "(SCSI) PLEXTOR CD-ROM PX-32TS 1.03", "PLEXTOR_CD-ROM_PX-32TS_1.03", BUS_TYPE_SCSI}, /*31*/ + { "TEAC", "CD-R55S", "1.0R", "(SCSI) TEAC CD-R55S 1.0R", "TEAC_CD-R55S_1.0R", BUS_TYPE_SCSI}, /*32*/ + { "TOSHIBA", "CD-ROM DRIVE:XM", "3433", "(SCSI) TOSHIBA CD-ROM DRIVE:XM 3433", "TOSHIBA_CD-ROM_DRIVEXM_3433", BUS_TYPE_SCSI}, /*33*/ + { "TOSHIBA", "CD-ROM XM-3301TA", "0272", "(SCSI) TOSHIBA CD-ROM XM-3301TA 0272", "TOSHIBA_CD-ROM_XM-3301TA_0272", BUS_TYPE_SCSI}, /*34*/ + { "TOSHIBA", "CD-ROM XM-5701TA", "3136", "(SCSI) TOSHIBA CD-ROM XM-5701TA 3136", "TOSHIBA_CD-ROM_XM-5701TA_3136", BUS_TYPE_SCSI}, /*35*/ { "", "", "", "", "", -1}, }; diff --git a/src/scsi/scsi_cdrom.c b/src/scsi/scsi_cdrom.c index 38693f590..25939f06e 100644 --- a/src/scsi/scsi_cdrom.c +++ b/src/scsi/scsi_cdrom.c @@ -3519,15 +3519,30 @@ scsi_cdrom_identify(ide_t *ide, int ide_has_dma) } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU311_3.0h"))) { ide_padstr((char *) (ide->buffer + 23), "3.0h ", 8); /* Firmware */ ide_padstr((char *) (ide->buffer + 27), "SONY CD-ROM CDU311 ", 40); /* Model */ - } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "NEC_CDR-1300A_1.05"))) { + } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "NEC_CD-ROM_DRIVE280_1.05"))) { ide_padstr((char *) (ide->buffer + 23), "1.05 ", 8); /* Firmware */ - ide_padstr((char *) (ide->buffer + 27), "NEC CDR-1300A ", 40); /* Model */ + ide_padstr((char *) (ide->buffer + 27), "NEC CD-ROM DRIVE:280 ", 40); /* Model */ + } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "NEC_CD-ROM_DRIVE280_3.08"))) { + ide_padstr((char *) (ide->buffer + 23), "3.08 ", 8); /* Firmware */ + ide_padstr((char *) (ide->buffer + 27), "NEC CD-ROM DRIVE:280 ", 40); /* Model */ + } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "NEC_CD-ROM_DRIVE273_4.20"))) { + ide_padstr((char *) (ide->buffer + 23), "4.20 ", 8); /* Firmware */ + ide_padstr((char *) (ide->buffer + 27), "NEC CD-ROM DRIVE:273 ", 40); /* Model */ + } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "TOSHIBA_CD-ROM_XM-5302TA_0305"))) { + ide_padstr((char *) (ide->buffer + 23), "0305 ", 8); /* Firmware */ + ide_padstr((char *) (ide->buffer + 27), "TOSHIBA CD-ROM XM-5302TA ", 40); /* Model */ } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "TOSHIBA_CD-ROM_XM-5702B_TA70"))) { ide_padstr((char *) (ide->buffer + 23), "TA70 ", 8); /* Firmware */ ide_padstr((char *) (ide->buffer + 27), "TOSHIBA CD-ROM XM-5702B ", 40); /* Model */ } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "GOLDSTAR_CRD-8160B_3.14"))) { ide_padstr((char *) (ide->buffer + 23), "3.14 ", 8); /* Firmware */ ide_padstr((char *) (ide->buffer + 27), "GOLDSTAR CRD-8160B ", 40); /* Model */ + } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "MATSHITA_CR-571_1.0e"))) { + ide_padstr((char *) (ide->buffer + 23), "1.0e ", 8); /* Firmware */ + ide_padstr((char *) (ide->buffer + 27), "MATSHITA CR-571 ", 40); /* Model */ + } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "MATSHITA_CR-572_1.0j"))) { + ide_padstr((char *) (ide->buffer + 23), "1.0j ", 8); /* Firmware */ + ide_padstr((char *) (ide->buffer + 27), "MATSHITA CR-572 ", 40); /* Model */ } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "MATSHITA_CD-ROM_CR-587_7S13"))) { ide_padstr((char *) (ide->buffer + 23), "7S13 ", 8); /* Firmware */ ide_padstr((char *) (ide->buffer + 27), "MATSHITA CD-ROM CR-587 ", 40); /* Model */ From fea5ac681b99705754e293e10a3c21cb5da3fdb2 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 7 Feb 2023 18:06:50 -0500 Subject: [PATCH 226/285] Handful of function renames --- src/device.c | 4 ++-- src/include/86box/machine.h | 8 ++++---- src/machine/machine.c | 2 +- src/machine/machine_table.c | 8 ++++---- src/qt/qt_settingsmachine.cpp | 4 ++-- src/win/win_settings.c | 4 ++-- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/device.c b/src/device.c index 81e19e2dc..12d06580a 100644 --- a/src/device.c +++ b/src/device.c @@ -748,7 +748,7 @@ device_is_valid(const device_t *device, int m) int machine_get_config_int(char *s) { - const device_t *d = machine_getdevice(machine); + const device_t *d = machine_get_device(machine); const device_config_t *c; if (d == NULL) @@ -768,7 +768,7 @@ machine_get_config_int(char *s) char * machine_get_config_string(char *s) { - const device_t *d = machine_getdevice(machine); + const device_t *d = machine_get_device(machine); const device_config_t *c; if (d == NULL) diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index a6571a1fd..a2417a1bc 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -324,10 +324,10 @@ extern char *machine_get_internal_name(void); extern int machine_get_machine_from_internal_name(char *s); extern void machine_init(void); #ifdef EMU_DEVICE_H -extern const device_t *machine_getdevice(int m); -extern const device_t *machine_getviddevice(int m); -extern const device_t *machine_getsnddevice(int m); -extern const device_t *machine_getnetdevice(int m); +extern const device_t *machine_get_device(int m); +extern const device_t *machine_get_vid_device(int m); +extern const device_t *machine_get_snd_device(int m); +extern const device_t *machine_get_net_device(int m); #endif extern char *machine_get_internal_name_ex(int m); extern int machine_get_nvrmask(int m); diff --git a/src/machine/machine.c b/src/machine/machine.c index 7a69f4879..893700c7e 100644 --- a/src/machine/machine.c +++ b/src/machine/machine.c @@ -138,7 +138,7 @@ int machine_available(int m) { int ret; - device_t *d = (device_t *) machine_getdevice(m); + device_t *d = (device_t *) machine_get_device(m); bios_only = 1; diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 587e854c9..c489889a3 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -12245,7 +12245,7 @@ machine_getname_ex(int m) } const device_t * -machine_getdevice(int m) +machine_get_device(int m) { if (machines[m].device) return (machines[m].device); @@ -12254,7 +12254,7 @@ machine_getdevice(int m) } const device_t * -machine_getviddevice(int m) +machine_get_vid_device(int m) { if (machines[m].vid_device) return (machines[m].vid_device); @@ -12263,7 +12263,7 @@ machine_getviddevice(int m) } const device_t * -machine_getsnddevice(int m) +machine_get_snd_device(int m) { if (machines[m].snd_device) return (machines[m].snd_device); @@ -12272,7 +12272,7 @@ machine_getsnddevice(int m) } const device_t * -machine_getnetdevice(int m) +machine_get_net_device(int m) { if (machines[m].net_device) return (machines[m].net_device); diff --git a/src/qt/qt_settingsmachine.cpp b/src/qt/qt_settingsmachine.cpp index b88397e30..e08b07997 100644 --- a/src/qt/qt_settingsmachine.cpp +++ b/src/qt/qt_settingsmachine.cpp @@ -169,7 +169,7 @@ SettingsMachine::on_comboBoxMachine_currentIndexChanged(int index) } int machineId = ui->comboBoxMachine->currentData().toInt(); - const auto *device = machine_getdevice(machineId); + const auto *device = machine_get_device(machineId); ui->pushButtonConfigure->setEnabled((device != nullptr) && (device->config != nullptr)); auto *modelCpu = ui->comboBoxCPU->model(); @@ -304,6 +304,6 @@ SettingsMachine::on_pushButtonConfigure_clicked() { // deviceconfig_inst_open int machineId = ui->comboBoxMachine->currentData().toInt(); - const auto *device = machine_getdevice(machineId); + const auto *device = machine_get_device(machineId); DeviceConfig::ConfigureDevice(device, 0, qobject_cast(Settings::settings)); } diff --git a/src/win/win_settings.c b/src/win/win_settings.c index 37a8aafb0..07822f28b 100644 --- a/src/win/win_settings.c +++ b/src/win/win_settings.c @@ -755,7 +755,7 @@ win_settings_machine_recalc_machine(HWND hdlg) lptsTemp = (LPTSTR) malloc(512 * sizeof(WCHAR)); - d = (device_t *) machine_getdevice(temp_machine); + d = (device_t *) machine_get_device(temp_machine); settings_enable_window(hdlg, IDC_CONFIGURE_MACHINE, d && d->config); settings_reset_content(hdlg, IDC_COMBO_CPU_TYPE); @@ -987,7 +987,7 @@ win_settings_machine_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) break; case IDC_CONFIGURE_MACHINE: temp_machine = listtomachine[settings_get_cur_sel(hdlg, IDC_COMBO_MACHINE)]; - temp_deviceconfig |= deviceconfig_open(hdlg, (void *) machine_getdevice(temp_machine)); + temp_deviceconfig |= deviceconfig_open(hdlg, (void *) machine_get_device(temp_machine)); break; } From 118ab005f0a22a106b31dd73fbc582965c7eb354 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 7 Feb 2023 18:08:11 -0500 Subject: [PATCH 227/285] Switch kbc to device_t kbd_device --- src/include/86box/keyboard.h | 2 - src/include/86box/machine.h | 7 +- src/machine/machine_table.c | 662 ++++++++++++++++++----------------- 3 files changed, 342 insertions(+), 329 deletions(-) diff --git a/src/include/86box/keyboard.h b/src/include/86box/keyboard.h index db18ac789..1f7d8860c 100644 --- a/src/include/86box/keyboard.h +++ b/src/include/86box/keyboard.h @@ -39,8 +39,6 @@ typedef struct { #define RSHIFT_OFF 0x105 /* KBC #define's */ -#define KBC_UNKNOWN 0x0000 /* As yet unknown keyboard */ - /* IBM-style controllers */ #define KBC_IBM_PC_XT 0x0000 /* IBM PC/XT */ #define KBC_IBM_PCJR 0x0001 /* IBM PCjr */ diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index a2417a1bc..694552c50 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -288,7 +288,11 @@ typedef struct _machine_ { const machine_memory_t ram; int ram_granularity; int nvrmask; - uint16_t kbc; +#ifdef EMU_DEVICE_H + const device_t *kbc_device; +#else + void *kbc_device; +#endif /* EMU_DEVICE_H */ /* Bits: 7-0 Set bits are forced set on P1 (no forced set = 0x00); 15-8 Clear bits are forced clear on P1 (no foced clear = 0xff). */ @@ -324,6 +328,7 @@ extern char *machine_get_internal_name(void); extern int machine_get_machine_from_internal_name(char *s); extern void machine_init(void); #ifdef EMU_DEVICE_H +extern const device_t *machine_get_kbc_device(int m); extern const device_t *machine_get_device(int m); extern const device_t *machine_get_vid_device(int m); extern const device_t *machine_get_snd_device(int m); diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index c489889a3..a8f8643c0 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -230,7 +230,7 @@ const machine_t machines[] = { .step = 16 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_pc_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -266,7 +266,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_pc82_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -302,7 +302,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 0, - .kbc = KBC_IBM_PCJR, + .kbc_device = NULL, /* TODO: No specific kbd_device yet */ .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &pcjr_device, @@ -338,7 +338,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xt_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -374,7 +374,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xt86_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -410,7 +410,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xtclone_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -446,7 +446,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xtclone_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -482,7 +482,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xtclone_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -518,7 +518,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_pc82_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -554,7 +554,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xt_compaq_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -590,7 +590,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xtclone_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -626,7 +626,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_pc82_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -662,7 +662,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xt_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -698,7 +698,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xtclone_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -734,7 +734,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xtclone_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -770,7 +770,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xtclone_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -806,7 +806,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xtclone_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -842,7 +842,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xtclone_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -878,7 +878,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_pc_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -914,7 +914,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_pc_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -950,7 +950,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xt_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -986,7 +986,7 @@ const machine_t machines[] = { .step = 256 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xtclone_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -1022,7 +1022,7 @@ const machine_t machines[] = { .step = 256 }, .nvrmask = 0, - .kbc = KBC_OLIVETTI_XT, + .kbc_device = &keyboard_xt_olivetti_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &m19_vid_device, @@ -1058,7 +1058,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xtclone_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -1094,7 +1094,7 @@ const machine_t machines[] = { .step = 256 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xtclone_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -1130,7 +1130,7 @@ const machine_t machines[] = { .step = 256 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_pc_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -1166,7 +1166,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xtclone_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -1202,7 +1202,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_pravetz_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -1238,7 +1238,7 @@ const machine_t machines[] = { .step = 256 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xtclone_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -1274,7 +1274,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 15, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xt_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -1310,7 +1310,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xtclone_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -1346,7 +1346,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 0, - .kbc = KBC_TANDY, + .kbc_device = &keyboard_tandy_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &vid_device, @@ -1382,7 +1382,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 0, - .kbc = KBC_TANDY, + .kbc_device = &keyboard_tandy_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &vid_device_hx, @@ -1418,7 +1418,7 @@ const machine_t machines[] = { .step = 768 }, .nvrmask = 63, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xt_t1x00_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &t1000_video_device, @@ -1454,7 +1454,7 @@ const machine_t machines[] = { .step = 256 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xtclone_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -1491,7 +1491,7 @@ const machine_t machines[] = { .step = 256 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xt_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -1499,7 +1499,7 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, -#endif +#endif /* defined(DEV_BRANCH) && defined(USE_LASERXT) */ /* Has a standard PS/2 KBC (so, use IBM PS/2 Type 1). */ { .name = "[8088] Xi8088", @@ -1529,7 +1529,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_VIA_VT82C4XN_XI8088, + .kbc_device = &keyboard_ps2_xi8088_device, .kbc_p1 = 0xff04, .gpio = 0xffffffff, .device = &xi8088_device, @@ -1565,7 +1565,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xtclone_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -1601,7 +1601,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xt_zenith_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -1637,7 +1637,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xt_zenith_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -1673,7 +1673,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xt_zenith_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &cga_device, @@ -1709,7 +1709,7 @@ const machine_t machines[] = { .step = 256 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_pc_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -1745,7 +1745,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xtclone_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -1783,7 +1783,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 63, - .kbc = KBC_AMSTRAD, + .kbc_device = NULL /* TODO: No specific kbd_device yet */, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &vid_1512_device, @@ -1819,7 +1819,7 @@ const machine_t machines[] = { .step = 640 }, .nvrmask = 63, - .kbc = KBC_AMSTRAD, + .kbc_device = NULL /* TODO: No specific kbd_device yet */, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &vid_1640_device, @@ -1855,7 +1855,7 @@ const machine_t machines[] = { .step = 640 }, .nvrmask = 63, - .kbc = KBC_AMSTRAD, + .kbc_device = NULL /* TODO: No specific kbd_device yet */, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &vid_pc2086_device, @@ -1891,7 +1891,7 @@ const machine_t machines[] = { .step = 640 }, .nvrmask = 63, - .kbc = KBC_AMSTRAD, + .kbc_device = NULL /* TODO: No specific kbd_device yet */, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &vid_pc3086_device, @@ -1927,7 +1927,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 63, - .kbc = KBC_AMSTRAD, + .kbc_device = NULL /* TODO: No specific kbd_device yet */, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &vid_200_device, @@ -1963,7 +1963,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 63, - .kbc = KBC_AMSTRAD, + .kbc_device = NULL /* TODO: No specific kbd_device yet */, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &vid_ppc512_device, @@ -1999,7 +1999,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xt_compaq_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -2035,7 +2035,7 @@ const machine_t machines[] = { .step = 640 }, .nvrmask = 0x3f, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xt_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -2071,7 +2071,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 15, - .kbc = KBC_OLIVETTI_XT, + .kbc_device = NULL /* TODO: No specific kbd_device yet */, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &ogc_m24_device, @@ -2108,7 +2108,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 15, - .kbc = KBC_OLIVETTI, + .kbc_device = NULL /* TODO: No specific kbd_device yet */, .kbc_p1 = 0xff04, .gpio = 0xffffffff, .device = NULL, @@ -2144,7 +2144,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xtclone_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -2180,7 +2180,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 0, - .kbc = KBC_TANDY_SL2, + .kbc_device = NULL /* TODO: No specific kbd_device yet */, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &vid_device_sl, @@ -2216,7 +2216,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 63, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xt_t1x00_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &t1200_video_device, @@ -2252,7 +2252,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xt_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -2290,7 +2290,7 @@ const machine_t machines[] = { .step = 256 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xt_lxt3_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -2298,7 +2298,7 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, -#endif +#endif /* defined(DEV_BRANCH) && defined(USE_LASERXT) */ /* 286 AT machines */ /* Has IBM AT KBC firmware. */ @@ -2330,7 +2330,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -2367,7 +2367,7 @@ const machine_t machines[] = { .step = 512 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -2404,7 +2404,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -2441,7 +2441,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -2478,7 +2478,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -2516,7 +2516,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -2553,7 +2553,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -2590,7 +2590,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &compaq_plasma_device, @@ -2627,7 +2627,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -2664,7 +2664,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -2702,7 +2702,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -2710,7 +2710,7 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, -#endif +#endif /* defined(DEV_BRANCH) && defined(USE_OLIVETTI) */ #if defined(DEV_BRANCH) && defined(USE_OPEN_AT) /* Has IBM AT KBC firmware. */ { @@ -2741,7 +2741,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -2749,7 +2749,7 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, -#endif +#endif /* defined(DEV_BRANCH) && defined(USE_OPEN_AT) */ /* Has IBM AT KBC firmware. */ { .name = "[ISA] Phoenix IBM AT", @@ -2779,7 +2779,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -2816,7 +2816,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -2853,7 +2853,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -2890,7 +2890,7 @@ const machine_t machines[] = { .step = 256 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -2927,7 +2927,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -2964,7 +2964,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3001,7 +3001,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3038,7 +3038,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3075,7 +3075,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3112,7 +3112,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3149,7 +3149,7 @@ const machine_t machines[] = { .step = 512 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3186,7 +3186,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3223,7 +3223,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3260,7 +3260,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3297,7 +3297,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3334,7 +3334,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3371,7 +3371,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3410,7 +3410,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3447,7 +3447,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3487,7 +3487,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3524,7 +3524,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3561,7 +3561,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3598,7 +3598,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3635,7 +3635,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3674,7 +3674,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &tvga8900d_device, @@ -3712,7 +3712,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3749,7 +3749,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3786,7 +3786,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3825,7 +3825,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &oti067_ama932j_device, @@ -3864,7 +3864,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3900,7 +3900,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3939,7 +3939,7 @@ const machine_t machines[] = { .step = 512 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3976,7 +3976,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -4013,7 +4013,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -4052,7 +4052,7 @@ const machine_t machines[] = { .step = 512 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &gd5402_onboard_device, @@ -4091,7 +4091,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -4128,7 +4128,7 @@ const machine_t machines[] = { .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &ati28800k_spc6033p_device, @@ -4166,7 +4166,7 @@ const machine_t machines[] = { .step = 512 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -4203,7 +4203,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -4242,7 +4242,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -4279,7 +4279,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -4319,7 +4319,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -4357,7 +4357,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -4394,7 +4394,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -4431,7 +4431,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -4469,7 +4469,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -4477,7 +4477,7 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, -#endif +#endif /* defined(DEV_BRANCH) && defined(USE_DESKPRO386) */ { .name = "[ISA] Compaq Portable III (386)", .internal_name = "portableiii386", @@ -4506,7 +4506,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &compaq_plasma_device, @@ -4543,7 +4543,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -4580,7 +4580,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -4619,7 +4619,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -4659,7 +4659,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -4696,7 +4696,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -4733,7 +4733,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -4770,7 +4770,7 @@ const machine_t machines[] = { .step = 2048 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -4807,7 +4807,7 @@ const machine_t machines[] = { .step = 2048 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -4850,7 +4850,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -4889,7 +4889,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -4927,7 +4927,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -4964,7 +4964,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -5001,7 +5001,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -5039,7 +5039,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -5076,7 +5076,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -5116,7 +5116,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -5155,7 +5155,7 @@ const machine_t machines[] = { .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &gd5428_onboard_device, @@ -5192,7 +5192,7 @@ const machine_t machines[] = { .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &gd5428_onboard_device, @@ -5233,7 +5233,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -5270,7 +5270,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &gd5428_onboard_device, @@ -5307,7 +5307,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -5344,7 +5344,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &s3_86c805_onboard_vlb_device, @@ -5381,7 +5381,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -5419,7 +5419,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -5458,7 +5458,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -5498,7 +5498,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -5535,7 +5535,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -5572,7 +5572,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -5609,7 +5609,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -5646,7 +5646,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -5683,7 +5683,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -5720,7 +5720,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -5757,7 +5757,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -5794,7 +5794,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -5833,7 +5833,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -5870,7 +5870,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -5907,7 +5907,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &tgui9440_onboard_pci_device, @@ -5945,7 +5945,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -5986,7 +5986,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6027,7 +6027,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6064,7 +6064,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6101,7 +6101,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6138,7 +6138,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6175,7 +6175,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6212,7 +6212,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6249,7 +6249,7 @@ const machine_t machines[] = { .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6287,7 +6287,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6324,7 +6324,7 @@ const machine_t machines[] = { .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6361,7 +6361,7 @@ const machine_t machines[] = { .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6398,7 +6398,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6435,7 +6435,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6472,7 +6472,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6509,7 +6509,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6547,7 +6547,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6585,7 +6585,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6622,7 +6622,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6659,7 +6659,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6696,7 +6696,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6734,7 +6734,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6771,7 +6771,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6808,7 +6808,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6845,7 +6845,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6882,7 +6882,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6923,7 +6923,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6961,7 +6961,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6999,7 +6999,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7037,7 +7037,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7075,7 +7075,7 @@ const machine_t machines[] = { .step = 32768 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7119,7 +7119,7 @@ const machine_t machines[] = { .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7156,7 +7156,7 @@ const machine_t machines[] = { .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7193,7 +7193,7 @@ const machine_t machines[] = { .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7230,7 +7230,7 @@ const machine_t machines[] = { .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7269,7 +7269,7 @@ const machine_t machines[] = { .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7306,7 +7306,7 @@ const machine_t machines[] = { .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7343,7 +7343,7 @@ const machine_t machines[] = { .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7380,7 +7380,7 @@ const machine_t machines[] = { .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7417,7 +7417,7 @@ const machine_t machines[] = { .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &gd5434_onboard_pci_device, @@ -7458,7 +7458,7 @@ const machine_t machines[] = { .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7497,7 +7497,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7536,7 +7536,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7573,7 +7573,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7613,7 +7613,7 @@ const machine_t machines[] = { .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7651,7 +7651,7 @@ const machine_t machines[] = { .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7688,7 +7688,7 @@ const machine_t machines[] = { .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7727,7 +7727,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7764,7 +7764,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7803,7 +7803,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7840,7 +7840,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7877,7 +7877,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7918,7 +7918,7 @@ const machine_t machines[] = { .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7956,7 +7956,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7995,7 +7995,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -8032,7 +8032,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -8069,7 +8069,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_JETKEY_5_W83C42, + .kbc_device = &keyboard_at_ami_device, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -8109,7 +8109,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -8146,7 +8146,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -8158,7 +8158,7 @@ const machine_t machines[] = { { .name = "[i430FX] DataExpert EXP8551", .internal_name = "exp8551", - .type = MACHINE_TYPE_SOCKET7_3V, + .type = MACHINE_TYPE_SOCKET5, .chipset = MACHINE_CHIPSET_INTEL_430FX, .init = machine_at_exp8551_init, .pad = 0, @@ -8183,7 +8183,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -8222,7 +8222,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -8260,7 +8260,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 511, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &s3_phoenix_trio64_onboard_pci_device, @@ -8299,7 +8299,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &s3_phoenix_trio64vplus_onboard_pci_device, @@ -8338,7 +8338,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &s3_phoenix_trio64vplus_onboard_pci_device, @@ -8377,7 +8377,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &s3_phoenix_trio64_onboard_pci_device, @@ -8414,7 +8414,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -8452,7 +8452,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &gd5440_onboard_pci_device, @@ -8464,7 +8464,7 @@ const machine_t machines[] = { { .name = "[i430FX] PC Partner MB500N", .internal_name = "mb500n", - .type = MACHINE_TYPE_SOCKET7_3V, + .type = MACHINE_TYPE_SOCKET5, .chipset = MACHINE_CHIPSET_INTEL_430FX, .init = machine_at_mb500n_init, .pad = 0, @@ -8489,7 +8489,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -8526,7 +8526,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -8567,7 +8567,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -8604,7 +8604,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -8641,7 +8641,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -8679,7 +8679,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -8718,7 +8718,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -8757,7 +8757,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -8796,7 +8796,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -8833,7 +8833,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -8873,7 +8873,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -8910,7 +8910,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -8947,7 +8947,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 511, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -8986,7 +8986,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9025,7 +9025,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9065,7 +9065,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9102,7 +9102,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9141,7 +9141,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9178,7 +9178,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9216,7 +9216,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9253,7 +9253,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9291,7 +9291,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &s3_trio64v2_dx_onboard_pci_device, @@ -9328,7 +9328,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &s3_trio64v2_dx_onboard_pci_device, @@ -9365,7 +9365,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9402,7 +9402,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9441,7 +9441,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9478,7 +9478,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9516,7 +9516,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9554,7 +9554,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9593,7 +9593,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9630,7 +9630,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9668,7 +9668,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9676,7 +9676,7 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, -#endif +#endif /* defined(DEV_BRANCH) && defined(USE_AN430TX) */ /* This has the AMIKey KBC firmware, which is an updated 'F' type. */ { .name = "[i430TX] Intel YM430TX", @@ -9706,7 +9706,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9743,7 +9743,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9780,7 +9780,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9817,7 +9817,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9857,7 +9857,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9897,7 +9897,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9936,7 +9936,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9973,7 +9973,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10012,7 +10012,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10049,7 +10049,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10089,7 +10089,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10127,7 +10127,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10164,7 +10164,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10201,7 +10201,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10241,7 +10241,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10279,7 +10279,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10317,7 +10317,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10355,7 +10355,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10395,7 +10395,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10434,7 +10434,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10471,7 +10471,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10509,7 +10509,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10545,7 +10545,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10584,7 +10584,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10623,7 +10623,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10660,7 +10660,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10699,7 +10699,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10739,7 +10739,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10778,7 +10778,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10816,7 +10816,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10856,7 +10856,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10894,7 +10894,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10934,7 +10934,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10974,7 +10974,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -11012,7 +11012,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -11050,7 +11050,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -11088,7 +11088,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -11126,7 +11126,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -11164,7 +11164,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -11202,7 +11202,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &es1371_onboard_device, @@ -11240,7 +11240,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -11280,7 +11280,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &voodoo_3_2000_agp_onboard_8m_device, @@ -11318,7 +11318,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &voodoo_3_2000_agp_onboard_8m_device, @@ -11358,7 +11358,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -11398,7 +11398,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -11436,7 +11436,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -11474,7 +11474,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -11512,7 +11512,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &es1371_onboard_device, @@ -11553,7 +11553,7 @@ const machine_t machines[] = { .step = 16384 }, .nvrmask = 511, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -11594,7 +11594,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &es1371_onboard_device, @@ -11633,7 +11633,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &cmi8738_onboard_device, @@ -11674,7 +11674,7 @@ const machine_t machines[] = { .step = 16384 }, .nvrmask = 511, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -11712,7 +11712,7 @@ const machine_t machines[] = { .step = 16384 }, .nvrmask = 511, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -11753,7 +11753,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -11793,7 +11793,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -11831,7 +11831,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -11869,7 +11869,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -11909,7 +11909,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -11949,7 +11949,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -11989,7 +11989,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -12027,7 +12027,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -12065,7 +12065,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -12103,7 +12103,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &cmi8738_onboard_device, @@ -12143,7 +12143,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -12180,7 +12180,7 @@ const machine_t machines[] = { .step = 0 }, .nvrmask = 0, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -12244,6 +12244,16 @@ machine_getname_ex(int m) return ((char *) machines[m].name); } +const device_t * +machine_get_kbc_device(int m) +{ + if (machines[m].kbc_device) + return (machines[m].kbc_device); + + return (NULL); +} + + const device_t * machine_get_device(int m) { From 01749a6de65859d9fb85bce173ac260a5aa7d8ce Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 7 Feb 2023 18:08:42 -0500 Subject: [PATCH 228/285] Add fdc_device to machine table --- src/include/86box/machine.h | 3 + src/machine/machine_table.c | 326 ++++++++++++++++++++++++++++++++++++ 2 files changed, 329 insertions(+) diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index 694552c50..2d9dfbc96 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -301,11 +301,13 @@ typedef struct _machine_ { uint32_t gpio_acpi; #ifdef EMU_DEVICE_H const device_t *device; + const device_t *fdc_device; const device_t *vid_device; const device_t *snd_device; const device_t *net_device; #else void *device; + void *fdc_device; void *vid_device; void *snd_device; void *net_device; @@ -330,6 +332,7 @@ extern void machine_init(void); #ifdef EMU_DEVICE_H extern const device_t *machine_get_kbc_device(int m); extern const device_t *machine_get_device(int m); +extern const device_t *machine_get_fdc_device(int m); extern const device_t *machine_get_vid_device(int m); extern const device_t *machine_get_snd_device(int m); extern const device_t *machine_get_net_device(int m); diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index a8f8643c0..eb31fc91c 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -234,6 +234,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -270,6 +271,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -306,6 +308,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &pcjr_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -342,6 +345,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -378,6 +382,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -414,6 +419,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -450,6 +456,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -486,6 +493,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -522,6 +530,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -558,6 +567,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -594,6 +604,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -630,6 +641,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -666,6 +678,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -702,6 +715,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -738,6 +752,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -774,6 +789,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -810,6 +826,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -846,6 +863,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -882,6 +900,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -918,6 +937,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -954,6 +974,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -990,6 +1011,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1026,6 +1048,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &m19_vid_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1062,6 +1085,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1098,6 +1122,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1134,6 +1159,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1170,6 +1196,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1206,6 +1233,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1242,6 +1270,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1278,6 +1307,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1314,6 +1344,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1350,6 +1381,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &vid_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1386,6 +1418,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &vid_device_hx, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1422,6 +1455,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &t1000_video_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1458,6 +1492,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1495,6 +1530,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1533,6 +1569,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff04, .gpio = 0xffffffff, .device = &xi8088_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1569,6 +1606,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1605,6 +1643,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1641,6 +1680,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1677,6 +1717,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &cga_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1713,6 +1754,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1749,6 +1791,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1787,6 +1830,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &vid_1512_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1823,6 +1867,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &vid_1640_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1859,6 +1904,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &vid_pc2086_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1895,6 +1941,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &vid_pc3086_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1931,6 +1978,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &vid_200_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1967,6 +2015,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &vid_ppc512_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2003,6 +2052,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2039,6 +2089,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2075,6 +2126,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &ogc_m24_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2112,6 +2164,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff04, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2148,6 +2201,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2184,6 +2238,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &vid_device_sl, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2220,6 +2275,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &t1200_video_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2256,6 +2312,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2294,6 +2351,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2334,6 +2392,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2371,6 +2430,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2408,6 +2468,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2445,6 +2506,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2482,6 +2544,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2520,6 +2583,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2557,6 +2621,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2594,6 +2659,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &compaq_plasma_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2631,6 +2697,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2668,6 +2735,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2706,6 +2774,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2745,6 +2814,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2783,6 +2853,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2820,6 +2891,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2857,6 +2929,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2894,6 +2967,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2931,6 +3005,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2968,6 +3043,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3005,6 +3081,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3042,6 +3119,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3079,6 +3157,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3116,6 +3195,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3153,6 +3233,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3190,6 +3271,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3227,6 +3309,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3264,6 +3347,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3301,6 +3385,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3338,6 +3423,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3375,6 +3461,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3414,6 +3501,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3451,6 +3539,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3491,6 +3580,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3528,6 +3618,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3565,6 +3656,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3602,6 +3694,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3639,6 +3732,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3678,6 +3772,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &tvga8900d_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3716,6 +3811,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3753,6 +3849,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3790,6 +3887,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3829,6 +3927,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &oti067_ama932j_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3868,6 +3967,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3904,6 +4004,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3943,6 +4044,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3980,6 +4082,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4017,6 +4120,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4056,6 +4160,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &gd5402_onboard_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4095,6 +4200,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4132,6 +4238,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &ati28800k_spc6033p_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4170,6 +4277,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4207,6 +4315,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4246,6 +4355,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4283,6 +4393,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4323,6 +4434,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4361,6 +4473,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4398,6 +4511,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4435,6 +4549,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4473,6 +4588,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4510,6 +4626,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &compaq_plasma_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4547,6 +4664,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4584,6 +4702,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4623,6 +4742,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4663,6 +4783,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4700,6 +4821,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4737,6 +4859,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4774,6 +4897,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4811,6 +4935,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4854,6 +4979,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4893,6 +5019,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4931,6 +5058,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4968,6 +5096,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5005,6 +5134,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5043,6 +5173,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5080,6 +5211,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5120,6 +5252,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5159,6 +5292,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &gd5428_onboard_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5196,6 +5330,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &gd5428_onboard_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5237,6 +5372,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5274,6 +5410,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &gd5428_onboard_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5311,6 +5448,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5349,6 +5487,7 @@ const machine_t machines[] = { .gpio = 0, .device = &s3_86c805_onboard_vlb_device, .vid_device = NULL, + .fdc_device = NULL, .snd_device = NULL, .net_device = NULL }, @@ -5385,6 +5524,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5423,6 +5563,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5462,6 +5603,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5502,6 +5644,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5539,6 +5682,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5576,6 +5720,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5613,6 +5758,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5650,6 +5796,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5687,6 +5834,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5724,6 +5872,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5761,6 +5910,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5798,6 +5948,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5837,6 +5988,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5874,6 +6026,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5911,6 +6064,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &tgui9440_onboard_pci_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5949,6 +6103,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5990,6 +6145,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6031,6 +6187,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6068,6 +6225,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6105,6 +6263,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6142,6 +6301,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6179,6 +6339,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6216,6 +6377,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6253,6 +6415,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6291,6 +6454,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6328,6 +6492,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6365,6 +6530,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6402,6 +6568,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6439,6 +6606,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6476,6 +6644,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6513,6 +6682,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6551,6 +6721,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6589,6 +6760,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6626,6 +6798,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6663,6 +6836,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6700,6 +6874,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6738,6 +6913,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6775,6 +6951,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6812,6 +6989,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6849,6 +7027,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6886,6 +7065,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6927,6 +7107,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6965,6 +7146,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7003,6 +7185,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7041,6 +7224,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7079,6 +7263,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7123,6 +7308,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7160,6 +7346,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7197,6 +7384,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7234,6 +7422,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7273,6 +7462,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7310,6 +7500,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7347,6 +7538,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7384,6 +7576,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7421,6 +7614,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &gd5434_onboard_pci_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7462,6 +7656,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7501,6 +7696,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7540,6 +7736,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7577,6 +7774,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7617,6 +7815,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7655,6 +7854,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7692,6 +7892,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7731,6 +7932,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7768,6 +7970,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7807,6 +8010,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7844,6 +8048,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7881,6 +8086,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7922,6 +8128,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7960,6 +8167,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7999,6 +8207,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8036,6 +8245,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8073,6 +8283,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8113,6 +8324,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8150,6 +8362,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8187,6 +8400,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8226,6 +8440,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8264,6 +8479,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &s3_phoenix_trio64_onboard_pci_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8303,6 +8519,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &s3_phoenix_trio64vplus_onboard_pci_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8342,6 +8559,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &s3_phoenix_trio64vplus_onboard_pci_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8381,6 +8599,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &s3_phoenix_trio64_onboard_pci_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8418,6 +8637,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8456,6 +8676,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &gd5440_onboard_pci_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8493,6 +8714,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8530,6 +8752,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8571,6 +8794,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8608,6 +8832,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8645,6 +8870,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8683,6 +8909,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8722,6 +8949,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8761,6 +8989,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8800,6 +9029,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8837,6 +9067,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8877,6 +9108,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8914,6 +9146,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8951,6 +9184,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8990,6 +9224,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9029,6 +9264,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9069,6 +9305,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9106,6 +9343,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9145,6 +9383,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9182,6 +9421,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9220,6 +9460,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9257,6 +9498,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9295,6 +9537,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &s3_trio64v2_dx_onboard_pci_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9332,6 +9575,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &s3_trio64v2_dx_onboard_pci_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9369,6 +9613,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9406,6 +9651,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9445,6 +9691,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9482,6 +9729,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9520,6 +9768,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9558,6 +9807,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9597,6 +9847,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9634,6 +9885,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9672,6 +9924,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9710,6 +9963,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9747,6 +10001,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9784,6 +10039,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9821,6 +10077,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9861,6 +10118,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9901,6 +10159,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9940,6 +10199,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9977,6 +10237,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10016,6 +10277,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10053,6 +10315,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10093,6 +10356,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10131,6 +10395,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10168,6 +10433,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10205,6 +10471,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10245,6 +10512,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10283,6 +10551,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10321,6 +10590,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10359,6 +10629,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10399,6 +10670,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10438,6 +10710,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10475,6 +10748,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10513,6 +10787,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10549,6 +10824,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10588,6 +10864,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10627,6 +10904,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10664,6 +10942,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10703,6 +10982,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10743,6 +11023,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10782,6 +11063,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10820,6 +11102,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10860,6 +11143,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10898,6 +11182,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10938,6 +11223,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10978,6 +11264,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11016,6 +11303,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11054,6 +11342,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11092,6 +11381,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11130,6 +11420,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11168,6 +11459,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11206,6 +11498,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &es1371_onboard_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11244,6 +11537,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11284,6 +11578,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &voodoo_3_2000_agp_onboard_8m_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11322,6 +11617,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &voodoo_3_2000_agp_onboard_8m_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11362,6 +11658,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11402,6 +11699,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11440,6 +11738,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11478,6 +11777,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11516,6 +11816,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &es1371_onboard_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11557,6 +11858,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11598,6 +11900,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &es1371_onboard_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11637,6 +11940,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &cmi8738_onboard_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11678,6 +11982,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11716,6 +12021,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11757,6 +12063,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11797,6 +12104,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11835,6 +12143,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11873,6 +12182,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11913,6 +12223,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11953,6 +12264,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11993,6 +12305,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -12031,6 +12344,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -12069,6 +12383,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -12107,6 +12422,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &cmi8738_onboard_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -12147,6 +12463,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -12184,6 +12501,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -12263,6 +12581,14 @@ machine_get_device(int m) return (NULL); } +const device_t * +machine_get_fdc_device(int m) +{ + if (machines[m].fdc_device) + return (machines[m].fdc_device); + + return (NULL); +} const device_t * machine_get_vid_device(int m) { From fa9e05a3177484a2e736001120c0dd3360042d73 Mon Sep 17 00:00:00 2001 From: "Joakim L. Gilje" Date: Wed, 8 Feb 2023 22:11:22 +0100 Subject: [PATCH 229/285] add command 0xea - set stream mode --- src/device/mouse_ps2.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/device/mouse_ps2.c b/src/device/mouse_ps2.c index 42e2211b9..c2f996b22 100644 --- a/src/device/mouse_ps2.c +++ b/src/device/mouse_ps2.c @@ -191,6 +191,12 @@ ps2_write(uint8_t val, void *priv) keyboard_at_adddata_mouse(dev->sample_rate); break; + case 0xea: /* set stream */ + dev->flags &= ~FLAG_CTRLDAT; + mouse_scan = 1; + keyboard_at_adddata_mouse(0xfa); /* ACK for command byte */ + break; + case 0xeb: /* Get mouse data */ keyboard_at_adddata_mouse(0xfa); From 947e511d72bd02723591be6b40965f6ca2473f52 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 7 Feb 2023 18:09:00 -0500 Subject: [PATCH 230/285] Add sio_device to machine table --- src/include/86box/machine.h | 3 + src/machine/machine_table.c | 328 ++++++++++++++++++++++++++++++++++++ 2 files changed, 331 insertions(+) diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index 2d9dfbc96..165e37cb2 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -302,12 +302,14 @@ typedef struct _machine_ { #ifdef EMU_DEVICE_H const device_t *device; const device_t *fdc_device; + const device_t *sio_device; const device_t *vid_device; const device_t *snd_device; const device_t *net_device; #else void *device; void *fdc_device; + void *sio_device; void *vid_device; void *snd_device; void *net_device; @@ -333,6 +335,7 @@ extern void machine_init(void); extern const device_t *machine_get_kbc_device(int m); extern const device_t *machine_get_device(int m); extern const device_t *machine_get_fdc_device(int m); +extern const device_t *machine_get_sio_device(int m); extern const device_t *machine_get_vid_device(int m); extern const device_t *machine_get_snd_device(int m); extern const device_t *machine_get_net_device(int m); diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index eb31fc91c..032975672 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -235,6 +235,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -272,6 +273,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -309,6 +311,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = &pcjr_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -346,6 +349,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -383,6 +387,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -420,6 +425,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -457,6 +463,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -494,6 +501,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -531,6 +539,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -568,6 +577,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -605,6 +615,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -642,6 +653,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -679,6 +691,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -716,6 +729,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -753,6 +767,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -790,6 +805,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -827,6 +843,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -864,6 +881,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -901,6 +919,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -938,6 +957,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -975,6 +995,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1012,6 +1033,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1049,6 +1071,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = &m19_vid_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1086,6 +1109,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1123,6 +1147,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1160,6 +1185,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1197,6 +1223,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1234,6 +1261,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1271,6 +1299,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1308,6 +1337,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1345,6 +1375,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1382,6 +1413,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = &vid_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1419,6 +1451,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = &vid_device_hx, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1456,6 +1489,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = &t1000_video_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1493,6 +1527,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1531,6 +1566,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1570,6 +1606,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = &xi8088_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1607,6 +1644,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1644,6 +1682,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1681,6 +1720,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1718,6 +1758,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = &cga_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1755,6 +1796,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1792,6 +1834,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1831,6 +1874,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = &vid_1512_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1868,6 +1912,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = &vid_1640_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1905,6 +1950,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = &vid_pc2086_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1942,6 +1988,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = &vid_pc3086_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1979,6 +2026,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = &vid_200_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2016,6 +2064,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = &vid_ppc512_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2053,6 +2102,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2090,6 +2140,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2127,6 +2178,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = &ogc_m24_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2165,6 +2217,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2202,6 +2255,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2239,6 +2293,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = &vid_device_sl, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2276,6 +2331,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = &t1200_video_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2313,6 +2369,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2352,6 +2409,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2393,6 +2451,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2431,6 +2490,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2469,6 +2529,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2507,6 +2568,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2545,6 +2607,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2584,6 +2647,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2622,6 +2686,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2660,6 +2725,7 @@ const machine_t machines[] = { .gpio = 0, .device = &compaq_plasma_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2698,6 +2764,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2736,6 +2803,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2775,6 +2843,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2815,6 +2884,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2854,6 +2924,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2892,6 +2963,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2930,6 +3002,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2968,6 +3041,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3006,6 +3080,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3044,6 +3119,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3082,6 +3158,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3120,6 +3197,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3158,6 +3236,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3196,6 +3275,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3234,6 +3314,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3272,6 +3353,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3310,6 +3392,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3348,6 +3431,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3386,6 +3470,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3424,6 +3509,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3462,6 +3548,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3502,6 +3589,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3540,6 +3628,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3581,6 +3670,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3619,6 +3709,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3657,6 +3748,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3695,6 +3787,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3733,6 +3826,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3773,6 +3867,7 @@ const machine_t machines[] = { .gpio = 0, .device = &tvga8900d_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3812,6 +3907,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3850,6 +3946,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3888,6 +3985,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3928,6 +4026,7 @@ const machine_t machines[] = { .gpio = 0, .device = &oti067_ama932j_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3968,6 +4067,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4005,6 +4105,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4045,6 +4146,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4083,6 +4185,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4121,6 +4224,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4161,6 +4265,7 @@ const machine_t machines[] = { .gpio = 0, .device = &gd5402_onboard_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4201,6 +4306,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4239,6 +4345,7 @@ const machine_t machines[] = { .gpio = 0, .device = &ati28800k_spc6033p_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4278,6 +4385,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4316,6 +4424,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4356,6 +4465,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4394,6 +4504,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4435,6 +4546,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4474,6 +4586,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4512,6 +4625,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4550,6 +4664,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4589,6 +4704,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4627,6 +4743,7 @@ const machine_t machines[] = { .gpio = 0, .device = &compaq_plasma_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4665,6 +4782,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4703,6 +4821,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4743,6 +4862,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4784,6 +4904,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4822,6 +4943,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4860,6 +4982,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4898,6 +5021,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4936,6 +5060,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4980,6 +5105,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5020,6 +5146,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5059,6 +5186,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5097,6 +5225,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5135,6 +5264,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5174,6 +5304,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5212,6 +5343,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5253,6 +5385,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5293,6 +5426,7 @@ const machine_t machines[] = { .gpio = 0, .device = &gd5428_onboard_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5331,6 +5465,7 @@ const machine_t machines[] = { .gpio = 0, .device = &gd5428_onboard_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5373,6 +5508,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5411,6 +5547,7 @@ const machine_t machines[] = { .gpio = 0, .device = &gd5428_onboard_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5449,6 +5586,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5488,6 +5626,7 @@ const machine_t machines[] = { .device = &s3_86c805_onboard_vlb_device, .vid_device = NULL, .fdc_device = NULL, + .sio_device = NULL, .snd_device = NULL, .net_device = NULL }, @@ -5525,6 +5664,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5564,6 +5704,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5604,6 +5745,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5645,6 +5787,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5683,6 +5826,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5721,6 +5865,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5759,6 +5904,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5797,6 +5943,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5835,6 +5982,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5873,6 +6021,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5911,6 +6060,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5949,6 +6099,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5989,6 +6140,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6027,6 +6179,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6065,6 +6218,7 @@ const machine_t machines[] = { .gpio = 0, .device = &tgui9440_onboard_pci_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6104,6 +6258,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6146,6 +6301,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6188,6 +6344,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6226,6 +6383,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6264,6 +6422,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6302,6 +6461,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6340,6 +6500,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6378,6 +6539,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6416,6 +6578,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6455,6 +6618,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6493,6 +6657,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6531,6 +6696,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6569,6 +6735,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6607,6 +6774,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6645,6 +6813,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6683,6 +6852,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6722,6 +6892,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6761,6 +6932,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6799,6 +6971,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6837,6 +7010,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6875,6 +7049,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6914,6 +7089,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6952,6 +7128,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6990,6 +7167,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7028,6 +7206,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7066,6 +7245,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7108,6 +7288,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7147,6 +7328,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7186,6 +7368,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7225,6 +7408,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7264,6 +7448,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7309,6 +7494,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7347,6 +7533,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7385,6 +7572,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7423,6 +7611,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7463,6 +7652,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7501,6 +7691,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7539,6 +7730,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7577,6 +7769,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7615,6 +7808,7 @@ const machine_t machines[] = { .gpio = 0, .device = &gd5434_onboard_pci_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7657,6 +7851,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7697,6 +7892,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7737,6 +7933,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7775,6 +7972,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7816,6 +8014,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7855,6 +8054,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7893,6 +8093,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7933,6 +8134,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7971,6 +8173,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8011,6 +8214,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8049,6 +8253,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8087,6 +8292,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8129,6 +8335,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8168,6 +8375,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8208,6 +8416,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8246,6 +8455,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8284,6 +8494,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8325,6 +8536,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8363,6 +8575,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8401,6 +8614,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8441,6 +8655,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8480,6 +8695,7 @@ const machine_t machines[] = { .gpio = 0, .device = &s3_phoenix_trio64_onboard_pci_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8520,6 +8736,7 @@ const machine_t machines[] = { .gpio = 0, .device = &s3_phoenix_trio64vplus_onboard_pci_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8560,6 +8777,7 @@ const machine_t machines[] = { .gpio = 0, .device = &s3_phoenix_trio64vplus_onboard_pci_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8600,6 +8818,7 @@ const machine_t machines[] = { .gpio = 0, .device = &s3_phoenix_trio64_onboard_pci_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8638,6 +8857,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8677,6 +8897,7 @@ const machine_t machines[] = { .gpio = 0, .device = &gd5440_onboard_pci_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8715,6 +8936,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8753,6 +8975,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8795,6 +9018,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8833,6 +9057,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8871,6 +9096,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8910,6 +9136,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8950,6 +9177,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8990,6 +9218,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9030,6 +9259,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9068,6 +9298,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9109,6 +9340,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9147,6 +9379,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9185,6 +9418,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9225,6 +9459,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9265,6 +9500,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9306,6 +9542,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9344,6 +9581,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9384,6 +9622,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9422,6 +9661,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9461,6 +9701,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9499,6 +9740,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9538,6 +9780,7 @@ const machine_t machines[] = { .gpio = 0, .device = &s3_trio64v2_dx_onboard_pci_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9576,6 +9819,7 @@ const machine_t machines[] = { .gpio = 0, .device = &s3_trio64v2_dx_onboard_pci_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9614,6 +9858,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9652,6 +9897,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9692,6 +9938,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9730,6 +9977,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9769,6 +10017,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9808,6 +10057,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9848,6 +10098,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9886,6 +10137,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9925,6 +10177,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9964,6 +10217,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10002,6 +10256,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10040,6 +10295,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10078,6 +10334,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10119,6 +10376,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10160,6 +10418,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10200,6 +10459,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10238,6 +10498,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10278,6 +10539,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10316,6 +10578,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10357,6 +10620,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10396,6 +10660,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10434,6 +10699,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10472,6 +10738,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10513,6 +10780,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10552,6 +10820,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10591,6 +10860,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10630,6 +10900,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10671,6 +10942,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10711,6 +10983,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10749,6 +11022,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10788,6 +11062,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10825,6 +11100,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10865,6 +11141,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10905,6 +11182,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10943,6 +11221,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10983,6 +11262,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11024,6 +11304,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11064,6 +11345,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11103,6 +11385,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11144,6 +11427,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11183,6 +11467,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11224,6 +11509,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11265,6 +11551,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11304,6 +11591,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11343,6 +11631,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11382,6 +11671,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11421,6 +11711,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11460,6 +11751,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11499,6 +11791,7 @@ const machine_t machines[] = { .gpio = 0, .device = &es1371_onboard_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11538,6 +11831,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11579,6 +11873,7 @@ const machine_t machines[] = { .gpio = 0, .device = &voodoo_3_2000_agp_onboard_8m_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11618,6 +11913,7 @@ const machine_t machines[] = { .gpio = 0, .device = &voodoo_3_2000_agp_onboard_8m_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11659,6 +11955,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11700,6 +11997,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11739,6 +12037,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11778,6 +12077,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11817,6 +12117,7 @@ const machine_t machines[] = { .gpio = 0, .device = &es1371_onboard_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11859,6 +12160,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11901,6 +12203,7 @@ const machine_t machines[] = { .gpio = 0, .device = &es1371_onboard_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11941,6 +12244,7 @@ const machine_t machines[] = { .gpio = 0, .device = &cmi8738_onboard_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11983,6 +12287,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -12022,6 +12327,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -12064,6 +12370,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -12105,6 +12412,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -12144,6 +12452,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -12183,6 +12492,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -12224,6 +12534,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -12265,6 +12576,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -12306,6 +12618,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -12345,6 +12658,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -12384,6 +12698,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -12423,6 +12738,7 @@ const machine_t machines[] = { .gpio = 0, .device = &cmi8738_onboard_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -12464,6 +12780,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -12502,6 +12819,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -12589,6 +12907,16 @@ machine_get_fdc_device(int m) return (NULL); } + +const device_t * +machine_get_sio_device(int m) +{ + if (machines[m].sio_device) + return (machines[m].sio_device); + + return (NULL); +} + const device_t * machine_get_vid_device(int m) { From 3f62a95ca18a8f7550e0dd28114cadeb1c5a3d30 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 11 Feb 2023 14:34:35 -0300 Subject: [PATCH 231/285] VIA PIPC: Poll legacy audio only if enabled, improves performance on 686A/B machines --- src/chipset/via_pipc.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/chipset/via_pipc.c b/src/chipset/via_pipc.c index 4f640920e..a568032b4 100644 --- a/src/chipset/via_pipc.c +++ b/src/chipset/via_pipc.c @@ -851,9 +851,28 @@ pipc_sb_handlers(pipc_t *dev, uint8_t modem) if (dev->ac97_regs[0][0x42] & 0x04) { io_sethandler(0x388, 4, pipc_fm_read, NULL, NULL, pipc_fm_write, NULL, NULL, dev); +#ifndef VIA_PIPC_FM_EMULATION + dev->sb->opl_enabled = 1; + } else { + dev->sb->opl_enabled = 0; +#endif } } +static void +pipc_sb_get_buffer(int32_t *buffer, int len, void *priv) +{ + pipc_t *dev = (pipc_t *) priv; + + /* Poll SB audio only if the legacy block is enabled. */ +#ifdef VIA_PIPC_FM_EMULATION + if (dev->ac97_regs[0][0x42] & 0x01) +#else + if (dev->ac97_regs[0][0x42] & 0x05) +#endif + sb_get_buffer_sbpro(buffer, len, dev->sb); +} + static uint8_t pipc_read(int func, int addr, void *priv) { @@ -1599,10 +1618,7 @@ pipc_init(const device_t *info) ac97_via_set_slot(dev->ac97, dev->slot, PCI_INTC); dev->sb = device_add_inst(&sb_pro_compat_device, 2); -#ifndef VIA_PIPC_FM_EMULATION - dev->sb->opl_enabled = 1; -#endif - sound_add_handler(sb_get_buffer_sbpro, dev->sb); + sound_add_handler(pipc_sb_get_buffer, dev); dev->gameport = gameport_add(&gameport_sio_device); From 476e8eeead02f7283d041039a1865db7c4050285 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 11 Feb 2023 21:39:21 +0100 Subject: [PATCH 232/285] Fixes to pci_dummy.c. --- src/pci_dummy.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/pci_dummy.c b/src/pci_dummy.c index 22ed1522d..03141fa2c 100644 --- a/src/pci_dummy.c +++ b/src/pci_dummy.c @@ -18,11 +18,10 @@ static uint8_t card = 0; static void pci_dummy_interrupt(int set) { - if (set) { + if (set) pci_set_irq(card, pci_regs[0x3D]); - } else { + else pci_clear_irq(card, pci_regs[0x3D]); - } } static uint8_t @@ -111,7 +110,7 @@ pci_dummy_pci_read(int func, int addr, void *priv) { pclog("AB0B:071A: PCI_Read(%d, %04x)\n", func, addr); - switch (addr) { + if (func == 0x00) switch (addr) { case 0x00: return 0x1A; case 0x01: @@ -168,7 +167,8 @@ pci_dummy_pci_read(int func, int addr, void *priv) default: return 0x00; - } + } else + return 0xff; } static void @@ -178,7 +178,7 @@ pci_dummy_pci_write(int func, int addr, uint8_t val, void *priv) pclog("AB0B:071A: PCI_Write(%d, %04x, %02x)\n", func, addr, val); - switch (addr) { + if (func == 0x00) switch (addr) { case 0x04: /* PCI_COMMAND_LO */ valxor = (val & 0x03) ^ pci_regs[addr]; if (valxor & PCI_COMMAND_IO) { @@ -212,9 +212,8 @@ pci_dummy_pci_write(int func, int addr, uint8_t val, void *priv) /* We're done, so get out of the here. */ if (pci_regs[4] & PCI_COMMAND_IO) { - if ((pci_bar[0].addr) != 0) { + if ((pci_bar[0].addr) != 0) pci_dummy_io_set(); - } } break; @@ -233,5 +232,5 @@ pci_dummy_init(void) pci_bar[0].addr_regs[0] = 0x01; pci_regs[0x04] = 0x03; - pci_regs[0x3D] = PCI_INTD; + pci_regs[0x3D] = PCI_INTA; } From c6359517c160ec11d4177b47cebec8cf5c22ae4f Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 11 Feb 2023 22:15:50 +0100 Subject: [PATCH 233/285] More pci_dummy.c fixes and it's now instantiable and the exposed init function initializes it for PCI slot brute force purposes. --- src/include/86box/pci_dummy.h | 2 +- src/pci_dummy.c | 243 ++++++++++++++++++++-------------- 2 files changed, 147 insertions(+), 98 deletions(-) diff --git a/src/include/86box/pci_dummy.h b/src/include/86box/pci_dummy.h index d221ddd2e..104437b6e 100644 --- a/src/include/86box/pci_dummy.h +++ b/src/include/86box/pci_dummy.h @@ -1,6 +1,6 @@ #ifndef EMU_PCI_DUMMY_H #define EMU_PCI_DUMMY_H -extern void pci_dummy_init(void); +extern void pci_dummy_init(int min_slot, int max_slot, int nb_slot, int sb_slot); #endif /*EMU_PCI_DUMMY_H*/ diff --git a/src/pci_dummy.c b/src/pci_dummy.c index 03141fa2c..a54b63260 100644 --- a/src/pci_dummy.c +++ b/src/pci_dummy.c @@ -1,57 +1,68 @@ /* This can also serve as a sample PCI device. */ #include #include +#include #include #include #include <86box/86box.h> +#include <86box/device.h> #include <86box/io.h> #include <86box/pci.h> #include <86box/pci_dummy.h> -static uint8_t pci_regs[256]; +typedef struct +{ + uint8_t pci_regs[256]; -static bar_t pci_bar[2]; + bar_t pci_bar[2]; -static uint8_t interrupt_on = 0x00; -static uint8_t card = 0; + uint8_t card, interrupt_on; +} pci_dummy_t; static void -pci_dummy_interrupt(int set) +pci_dummy_interrupt(int set, pci_dummy_t *dev) { if (set) - pci_set_irq(card, pci_regs[0x3D]); + pci_set_irq(dev->card, dev->pci_regs[0x3D]); else - pci_clear_irq(card, pci_regs[0x3D]); + pci_clear_irq(dev->card, dev->pci_regs[0x3D]); } static uint8_t pci_dummy_read(uint16_t Port, void *p) { - uint8_t ret = 0; + pci_dummy_t *dev = (pci_dummy_t *) p; + uint8_t ret = 0xff; switch (Port & 0x20) { case 0x00: - return 0x1A; + ret = 0x1a; + break; case 0x01: - return 0x07; + ret = 0x07; + break; case 0x02: - return 0x0B; + ret = 0x0b; + break; case 0x03: - return 0xAB; + ret = 0xab; + break; case 0x04: - return pci_regs[0x3C]; + ret = dev->pci_regs[0x3c]; + break; case 0x05: - return pci_regs[0x3D]; + ret = dev->pci_regs[0x3d]; + break; case 0x06: - ret = interrupt_on; - if (interrupt_on) { - pci_dummy_interrupt(0); - interrupt_on = 0; + ret = dev->interrupt_on; + if (dev->interrupt_on) { + pci_dummy_interrupt(0, dev); + dev->interrupt_on = 0; } - return ret; - default: - return 0x00; + break; } + + return ret; } static uint16_t @@ -69,11 +80,13 @@ pci_dummy_readl(uint16_t Port, void *p) static void pci_dummy_write(uint16_t Port, uint8_t Val, void *p) { + pci_dummy_t *dev = (pci_dummy_t *) p; + switch (Port & 0x20) { case 0x06: - if (!interrupt_on) { - interrupt_on = 1; - pci_dummy_interrupt(1); + if (!dev->interrupt_on) { + dev->interrupt_on = 1; + pci_dummy_interrupt(1, dev); } return; default: @@ -94,143 +107,179 @@ pci_dummy_writel(uint16_t Port, uint32_t Val, void *p) } static void -pci_dummy_io_remove(void) +pci_dummy_io_remove(pci_dummy_t *dev) { - io_removehandler(pci_bar[0].addr, 0x0020, pci_dummy_read, pci_dummy_readw, pci_dummy_readl, pci_dummy_write, pci_dummy_writew, pci_dummy_writel, NULL); + io_removehandler(dev->pci_bar[0].addr, 0x0020, pci_dummy_read, pci_dummy_readw, pci_dummy_readl, pci_dummy_write, pci_dummy_writew, pci_dummy_writel, dev); } static void -pci_dummy_io_set(void) +pci_dummy_io_set(pci_dummy_t *dev) { - io_sethandler(pci_bar[0].addr, 0x0020, pci_dummy_read, pci_dummy_readw, pci_dummy_readl, pci_dummy_write, pci_dummy_writew, pci_dummy_writel, NULL); + io_sethandler(dev->pci_bar[0].addr, 0x0020, pci_dummy_read, pci_dummy_readw, pci_dummy_readl, pci_dummy_write, pci_dummy_writew, pci_dummy_writel, dev); } static uint8_t pci_dummy_pci_read(int func, int addr, void *priv) { - pclog("AB0B:071A: PCI_Read(%d, %04x)\n", func, addr); + pci_dummy_t *dev = (pci_dummy_t *) priv; + uint8_t ret = 0xff; if (func == 0x00) switch (addr) { - case 0x00: - return 0x1A; - case 0x01: - return 0x07; + case 0x00: case 0x2c: + ret = 0x1a; + break; + case 0x01: case 0x2d: + ret = 0x07; break; - case 0x02: - return 0x0B; - case 0x03: - return 0xAB; + case 0x02: case 0x2e: + ret = 0x0b; + break; + case 0x03: case 0x2f: + ret = 0xab; + break; case 0x04: /* PCI_COMMAND_LO */ case 0x05: /* PCI_COMMAND_HI */ - return pci_regs[addr]; - case 0x06: /* PCI_STATUS_LO */ case 0x07: /* PCI_STATUS_HI */ - return pci_regs[addr]; + case 0x0a: case 0x0b: + case 0x3c: /* PCI_ILR */ + ret = dev->pci_regs[addr]; + break; - case 0x08: - case 0x09: - return 0x00; - - case 0x0A: - return pci_regs[addr]; - - case 0x0B: - return pci_regs[addr]; + case 0x08: /* Techncially, revision, but we return the card (slot) here. */ + ret = dev->card; + break; case 0x10: /* PCI_BAR 7:5 */ - return (pci_bar[0].addr_regs[0] & 0xe0) | 0x01; + ret = (dev->pci_bar[0].addr_regs[0] & 0xe0) | 0x01; + break; case 0x11: /* PCI_BAR 15:8 */ - return pci_bar[0].addr_regs[1]; - case 0x12: /* PCI_BAR 23:16 */ - return pci_bar[0].addr_regs[2]; - case 0x13: /* PCI_BAR 31:24 */ - return pci_bar[0].addr_regs[3]; + ret = dev->pci_bar[0].addr_regs[1]; + break; - case 0x2C: - return 0x1A; - case 0x2D: - return 0x07; - - case 0x2E: - return 0x0B; - case 0x2F: - return 0xAB; - - case 0x3C: /* PCI_ILR */ - return pci_regs[addr]; - - case 0x3D: /* PCI_IPR */ - return pci_regs[addr]; + case 0x3d: /* PCI_IPR */ + ret = PCI_INTA; + break; default: - return 0x00; - } else - return 0xff; + ret = 0x00; + break; + } + + pclog("AB0B:071A: PCI_Read(%d, %04X) = %02X\n", func, addr, ret); + + return ret; } static void pci_dummy_pci_write(int func, int addr, uint8_t val, void *priv) { + pci_dummy_t *dev = (pci_dummy_t *) priv; uint8_t valxor; pclog("AB0B:071A: PCI_Write(%d, %04x, %02x)\n", func, addr, val); if (func == 0x00) switch (addr) { case 0x04: /* PCI_COMMAND_LO */ - valxor = (val & 0x03) ^ pci_regs[addr]; + valxor = (val & 0x03) ^ dev->pci_regs[addr]; if (valxor & PCI_COMMAND_IO) { - pci_dummy_io_remove(); - if (((pci_bar[0].addr & 0xffe0) != 0) && (val & PCI_COMMAND_IO)) { - pci_dummy_io_set(); - } + pci_dummy_io_remove(dev); + if ((dev->pci_bar[0].addr != 0) && (val & PCI_COMMAND_IO)) + pci_dummy_io_set(dev); } - pci_regs[addr] = val & 0x03; + dev->pci_regs[addr] = val & 0x03; break; case 0x10: /* PCI_BAR */ val &= 0xe0; /* 0xe0 acc to RTL DS */ - val |= 0x01; /* re-enable IOIN bit */ /*FALLTHROUGH*/ case 0x11: /* PCI_BAR */ - case 0x12: /* PCI_BAR */ - case 0x13: /* PCI_BAR */ /* Remove old I/O. */ - pci_dummy_io_remove(); + pci_dummy_io_remove(dev); /* Set new I/O as per PCI request. */ - pci_bar[0].addr_regs[addr & 3] = val; + dev->pci_bar[0].addr_regs[addr & 3] = val; /* Then let's calculate the new I/O base. */ - pci_bar[0].addr &= 0xffe0; + dev->pci_bar[0].addr &= 0xffe0; /* Log the new base. */ - pclog("AB0B:071A: PCI: new I/O base is %04X\n", pci_bar[0].addr); + pclog("AB0B:071A: PCI: new I/O base is %04X\n", dev->pci_bar[0].addr); /* We're done, so get out of the here. */ - if (pci_regs[4] & PCI_COMMAND_IO) { - if ((pci_bar[0].addr) != 0) - pci_dummy_io_set(); + if (dev->pci_regs[4] & PCI_COMMAND_IO) { + if ((dev->pci_bar[0].addr) != 0) + pci_dummy_io_set(dev); } break; - case 0x3C: /* PCI_ILR */ + case 0x3c: /* PCI_ILR */ pclog("AB0B:071A: IRQ now: %i\n", val); - pci_regs[addr] = val; + dev->pci_regs[addr] = val; return; } } -void -pci_dummy_init(void) +static void +pci_dummy_reset(void *priv) { - card = pci_add_card(PCI_ADD_NORMAL, pci_dummy_pci_read, pci_dummy_pci_write, NULL); + pci_dummy_t *dev = (pci_dummy_t *) priv; - pci_bar[0].addr_regs[0] = 0x01; - pci_regs[0x04] = 0x03; + /* Lower the IRQ. */ + pci_dummy_interrupt(0, dev); - pci_regs[0x3D] = PCI_INTA; + /* Disable I/O and memory accesses. */ + pci_dummy_pci_write(0x00, 0x04, 0x00, dev); + + /* Zero all the registers. */ + memset(dev, 0x00, sizeof(pci_dummy_t)); +} + +static void +pci_dummy_close(void *priv) +{ + pci_dummy_t *dev = (pci_dummy_t *) priv; + + free(dev); +} + +static void * +pci_dummy_card_init(const device_t *info) +{ + pci_dummy_t *dev = (pci_dummy_t *) calloc(1, sizeof(pci_dummy_t)); + + dev->card = pci_add_card(PCI_ADD_NORMAL, pci_dummy_pci_read, pci_dummy_pci_write, dev); + + return dev; +} + +const device_t pci_dummy_device = { + .name = "Dummy Device (PCI)", + .internal_name = "pci_dummy", + .flags = DEVICE_PCI, + .local = 0, + .init = pci_dummy_card_init, + .close = pci_dummy_close, + .reset = pci_dummy_reset, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +void +pci_dummy_init(int min_slot, int max_slot, int nb_slot, int sb_slot) +{ + int i = 0, j = 1; + + for (i = min_slot; i <= max_slot; i++) { + if ((i != nb_slot) && (i != sb_slot)) { + pci_register_slot(j, PCI_CARD_NORMAL, 1, 3, 2, 4); + device_add_inst(&pci_dummy_device, j); + j++; + } + } } From 050c0c0e18d5d3df36996415e992863ec968d985 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 11 Feb 2023 22:17:41 +0100 Subject: [PATCH 234/285] Added PCI_DUMMY flag to the Mingw makefile. --- src/win/Makefile.mingw | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/win/Makefile.mingw b/src/win/Makefile.mingw index 0c34aeaa4..9c32a77da 100644 --- a/src/win/Makefile.mingw +++ b/src/win/Makefile.mingw @@ -76,6 +76,9 @@ ifeq ($(DEV_BUILD), y) ifndef PAS16 PAS16 := y endif + ifndef PCI_DUMMY + PCI_DUMMY := y + endif ifndef SIO_DETECT SIO_DETECT := y endif @@ -137,6 +140,9 @@ else ifndef PAS16 PAS16 := n endif + ifndef PCI_DUMMY + PCI_DUMMY := n + endif ifndef SIO_DETECT SIO_DETECT := n endif @@ -476,6 +482,11 @@ ifeq ($(DEV_BRANCH), y) DEVBROBJ += snd_pas16.o endif + ifeq ($(PCI_DUMMY), y) + OPTS += -DUSE_PCI_DUMMY + DEVBROBJ += pci_dummy.o + endif + ifeq ($(SIO_DETECT), y) OPTS += -DUSE_SIO_DETECT DEVBROBJ += sio_detect.o From e395c59254c22fcdb0855020680098999467ef05 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 11 Feb 2023 22:51:00 +0100 Subject: [PATCH 235/285] Very small fix to pci_dummy.c. --- src/pci_dummy.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pci_dummy.c b/src/pci_dummy.c index a54b63260..abc7639b4 100644 --- a/src/pci_dummy.c +++ b/src/pci_dummy.c @@ -277,7 +277,7 @@ pci_dummy_init(int min_slot, int max_slot, int nb_slot, int sb_slot) for (i = min_slot; i <= max_slot; i++) { if ((i != nb_slot) && (i != sb_slot)) { - pci_register_slot(j, PCI_CARD_NORMAL, 1, 3, 2, 4); + pci_register_slot(i, PCI_CARD_NORMAL, 1, 3, 2, 4); device_add_inst(&pci_dummy_device, j); j++; } From a76e9f9d7703ec49ce8c6da7810333857f7a98ef Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 11 Feb 2023 23:58:43 +0100 Subject: [PATCH 236/285] Removed excess pci_dummy.c logging and added LOG=y to the Mingw makefile to compile without -mwindows. --- src/pci_dummy.c | 16 +++++++--------- src/win/Makefile.mingw | 12 +++++++++--- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/pci_dummy.c b/src/pci_dummy.c index abc7639b4..b3a5c6eee 100644 --- a/src/pci_dummy.c +++ b/src/pci_dummy.c @@ -23,9 +23,9 @@ static void pci_dummy_interrupt(int set, pci_dummy_t *dev) { if (set) - pci_set_irq(dev->card, dev->pci_regs[0x3D]); + pci_set_irq(dev->card, PCI_INTA); else - pci_clear_irq(dev->card, dev->pci_regs[0x3D]); + pci_clear_irq(dev->card, PCI_INTA); } static uint8_t @@ -88,9 +88,7 @@ pci_dummy_write(uint16_t Port, uint8_t Val, void *p) dev->interrupt_on = 1; pci_dummy_interrupt(1, dev); } - return; - default: - return; + break; } } @@ -168,7 +166,7 @@ pci_dummy_pci_read(int func, int addr, void *priv) break; } - pclog("AB0B:071A: PCI_Read(%d, %04X) = %02X\n", func, addr, ret); + // pclog("AB0B:071A: PCI_Read(%d, %04X) = %02X\n", func, addr, ret); return ret; } @@ -179,7 +177,7 @@ pci_dummy_pci_write(int func, int addr, uint8_t val, void *priv) pci_dummy_t *dev = (pci_dummy_t *) priv; uint8_t valxor; - pclog("AB0B:071A: PCI_Write(%d, %04x, %02x)\n", func, addr, val); + // pclog("AB0B:071A: PCI_Write(%d, %04X, %02X)\n", func, addr, val); if (func == 0x00) switch (addr) { case 0x04: /* PCI_COMMAND_LO */ @@ -207,7 +205,7 @@ pci_dummy_pci_write(int func, int addr, uint8_t val, void *priv) dev->pci_bar[0].addr &= 0xffe0; /* Log the new base. */ - pclog("AB0B:071A: PCI: new I/O base is %04X\n", dev->pci_bar[0].addr); + // pclog("AB0B:071A: PCI: new I/O base is %04X\n", dev->pci_bar[0].addr); /* We're done, so get out of the here. */ if (dev->pci_regs[4] & PCI_COMMAND_IO) { @@ -217,7 +215,7 @@ pci_dummy_pci_write(int func, int addr, uint8_t val, void *priv) break; case 0x3c: /* PCI_ILR */ - pclog("AB0B:071A: IRQ now: %i\n", val); + pclog("AB0B:071A Device %02X: IRQ now: %i\n", dev->card, val); dev->pci_regs[addr] = val; return; } diff --git a/src/win/Makefile.mingw b/src/win/Makefile.mingw index 9c32a77da..747bbda2d 100644 --- a/src/win/Makefile.mingw +++ b/src/win/Makefile.mingw @@ -782,13 +782,19 @@ ifdef EXOBJ OBJ += $(EXOBJ) endif +ifeq ($(LOG), y) + MWIN := -lcomdlg32 +else + MWIN := -mwindows +endif + ifeq ($(OPENAL), y) - LIBS := -mwindows -lopenal -lcomctl32 -lSDL2 -limagehlp -ldinput8 -ldxguid -ldxerr8 -luser32 -lgdi32 -lwinmm -limm32 -lole32 -loleaut32 -lshell32 -lversion -luuid -lws2_32 + LIBS := $(MWIN) -lopenal -lcomctl32 -lSDL2 -limagehlp -ldinput8 -ldxguid -ldxerr8 -luser32 -lgdi32 -lwinmm -limm32 -lole32 -loleaut32 -lshell32 -lversion -luuid -lws2_32 else ifeq ($(FAUDIO), y) - LIBS := -mwindows -lfaudio -lcomctl32 -lSDL2 -limagehlp -ldinput8 -ldxguid -ldxerr8 -luser32 -lgdi32 -lwinmm -limm32 -lole32 -loleaut32 -lshell32 -lversion -luuid -lws2_32 + LIBS := $(MWIN) -lfaudio -lcomctl32 -lSDL2 -limagehlp -ldinput8 -ldxguid -ldxerr8 -luser32 -lgdi32 -lwinmm -limm32 -lole32 -loleaut32 -lshell32 -lversion -luuid -lws2_32 else - LIBS := -mwindows -lcomctl32 -lSDL2 -limagehlp -ldinput8 -ldxguid -ldxerr8 -luser32 -lgdi32 -lwinmm -limm32 -lole32 -loleaut32 -lshell32 -lversion -luuid -lws2_32 + LIBS := $(MWIN) -lcomctl32 -lSDL2 -limagehlp -ldinput8 -ldxguid -ldxerr8 -luser32 -lgdi32 -lwinmm -limm32 -lole32 -loleaut32 -lshell32 -lversion -luuid -lws2_32 endif endif From 16b9a5d3e04c1d6805ddea7ab1364dc3f9e8f212 Mon Sep 17 00:00:00 2001 From: "Joakim L. Gilje" Date: Mon, 13 Feb 2023 17:33:40 +0100 Subject: [PATCH 237/285] TigerVNC pointer needs the same workaround as previously added for another VNC server, (#3103) but it's pointer is named differently. In addition, it also publishes a pointer using the XTEST pointer name already added as a workaround. So, if a TigerVNC pointer is detected, it should be selected first. --- src/qt/xinput2_mouse.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/qt/xinput2_mouse.cpp b/src/qt/xinput2_mouse.cpp index e73f36869..0ce51c5ab 100644 --- a/src/qt/xinput2_mouse.cpp +++ b/src/qt/xinput2_mouse.cpp @@ -81,9 +81,17 @@ xinput2_get_xtest_pointer() { /* The XTEST pointer events injected by VNC servers to move the cursor always report absolute coordinates, despite XTEST declaring relative axes (related: SDL issue 1836). - This looks for the XTEST pointer so that we can assume it's absolute as a workaround. */ + This looks for the XTEST pointer so that we can assume it's absolute as a workaround. + + TigerVNC publishes both the XTEST pointer and a TigerVNC pointer, but actual + RawMotion events are published using the TigerVNC pointer */ int devs; XIDeviceInfo *info = XIQueryDevice(disp, XIAllDevices, &devs), *dev; + for (int i = 0; i < devs; i++) { + dev = &info[i]; + if ((dev->use == XISlavePointer) && !strcmp(dev->name, "TigerVNC pointer")) + return dev->deviceid; + } for (int i = 0; i < devs; i++) { dev = &info[i]; if ((dev->use == XISlavePointer) && !strcmp(dev->name, "Virtual core XTEST pointer")) From f643391975ca6a7ca166e08dc93f4759a906a645 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 14 Feb 2023 20:37:58 -0500 Subject: [PATCH 238/285] Serial Passthrough --- src/86box.c | 6 + src/config.c | 19 ++ src/device.c | 9 + src/device/CMakeLists.txt | 5 +- src/device/serial.c | 127 ++++++- src/device/serial_passthrough.c | 357 ++++++++++++++++++++ src/include/86box/device.h | 7 +- src/include/86box/plat_serial_passthrough.h | 38 +++ src/include/86box/resource.h | 8 + src/include/86box/serial.h | 15 +- src/include/86box/serial_passthrough.h | 61 ++++ src/include/86box/win_opengl.h | 2 +- src/include/discord_game_sdk.h | 2 +- src/qt/CMakeLists.txt | 6 + src/qt/qt_deviceconfig.cpp | 70 ++++ src/qt/qt_main.cpp | 2 +- src/qt/qt_settingsports.cpp | 63 ++++ src/qt/qt_settingsports.hpp | 24 ++ src/qt/qt_settingsports.ui | 166 ++++++--- src/qt/qt_winmanagerfilter.cpp | 2 +- src/qt/qt_winrawinputfilter.cpp | 2 +- src/qt/qt_winrawinputfilter.hpp | 2 +- src/unix/CMakeLists.txt | 4 +- src/unix/unix_serial_passthrough.c | 314 +++++++++++++++++ src/win/CMakeLists.txt | 5 +- src/win/Makefile.mingw | 4 +- src/win/languages/cs-CZ.rc | 4 + src/win/languages/de-DE.rc | 4 + src/win/languages/dialogs.rc | 56 ++- src/win/languages/en-GB.rc | 4 + src/win/languages/en-US.rc | 4 + src/win/languages/es-ES.rc | 4 + src/win/languages/fi-FI.rc | 4 + src/win/languages/fr-FR.rc | 4 + src/win/languages/hr-HR.rc | 4 + src/win/languages/hu-HU.rc | 4 + src/win/languages/it-IT.rc | 4 + src/win/languages/ja-JP.rc | 4 + src/win/languages/ko-KR.rc | 4 + src/win/languages/pl-PL.rc | 4 + src/win/languages/pt-BR.rc | 4 + src/win/languages/pt-PT.rc | 4 + src/win/languages/ru-RU.rc | 4 + src/win/languages/sl-SI.rc | 4 + src/win/languages/tr-TR.rc | 4 + src/win/languages/uk-UA.rc | 4 + src/win/languages/zh-CN.rc | 4 + src/win/languages/zh-TW.rc | 4 + src/win/win_opengl.c | 2 +- src/win/win_serial_passthrough.c | 223 ++++++++++++ src/win/win_settings.c | 28 +- src/win/win_toolbar.c | 4 +- 52 files changed, 1622 insertions(+), 95 deletions(-) create mode 100644 src/device/serial_passthrough.c create mode 100644 src/include/86box/plat_serial_passthrough.h create mode 100644 src/include/86box/serial_passthrough.h create mode 100644 src/unix/unix_serial_passthrough.c create mode 100644 src/win/win_serial_passthrough.c diff --git a/src/86box.c b/src/86box.c index fb96ed87e..11d5c1ff8 100644 --- a/src/86box.c +++ b/src/86box.c @@ -19,11 +19,14 @@ * Copyright 2017-2020 Fred N. van Kempen. * Copyright 2021 Laci bá' * Copyright 2021 dob205 + * Copyright 2021 Andreas J. Reichel. + * Copyright 2021-2022 Jasmine Iwanek. */ #include #include #include #include +#include #include #include #include @@ -68,6 +71,7 @@ #include <86box/isartc.h> #include <86box/lpt.h> #include <86box/serial.h> +#include <86box/serial_passthrough.h> #include <86box/keyboard.h> #include <86box/mouse.h> #include <86box/gameport.h> @@ -162,6 +166,7 @@ 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 */ int bugger_enabled = 0; /* (C) enable ISAbugger */ int postcard_enabled = 0; /* (C) enable POST card */ int isamem_type[ISAMEM_MAX] = { 0, 0, 0, 0 }; /* (C) enable ISA mem cards */ @@ -1038,6 +1043,7 @@ pc_reset_hard_init(void) /* Reset and reconfigure the serial ports. */ serial_standalone_init(); + serial_passthrough_init(); /* Reset and reconfigure the Sound Card layer. */ sound_card_reset(); diff --git a/src/config.c b/src/config.c index a0f9a71f0..056a00887 100644 --- a/src/config.c +++ b/src/config.c @@ -20,6 +20,8 @@ * Copyright 2016-2019 Miran Grca. * Copyright 2017-2019 Fred N. van Kempen. * Copyright 2018-2019 David Hrdlička. + * Copyright 2021 Andreas J. Reichel. + * Copyright 2021-2022 Jasmine Iwanek. * * NOTE: Forcing config files to be in Unicode encoding breaks * it on Windows XP, and possibly also Vista. Use the @@ -54,6 +56,8 @@ #include <86box/fdc.h> #include <86box/fdc_ext.h> #include <86box/gameport.h> +#include <86box/serial.h> +#include <86box/serial_passthrough.h> #include <86box/machine.h> #include <86box/mouse.h> #include <86box/thread.h> @@ -81,6 +85,7 @@ static ini_t config; static int backwards_compat = 0; static int backwards_compat2 = 0; +#define ENABLE_CONFIG_LOG 1 #ifdef ENABLE_CONFIG_LOG int config_do_log = ENABLE_CONFIG_LOG; @@ -834,6 +839,8 @@ load_ports(void) char temp[512]; int c, d; + memset(temp, 0, sizeof(temp)); + for (c = 0; c < SERIAL_MAX; c++) { sprintf(temp, "serial%d_enabled", c + 1); com_ports[c].enabled = !!ini_section_get_int(cat, temp, (c >= 2) ? 0 : 1); @@ -843,6 +850,12 @@ load_ports(void) p = (char *) ini_section_get_string(cat, temp, "none"); com_ports[c].device = com_device_get_from_internal_name(p); */ + + sprintf(temp, "serial%d_passthrough_enabled", c + 1); + serial_passthrough_enabled[c] = !!ini_section_get_int(cat, temp, 0); + + if (serial_passthrough_enabled[c]) + config_log("Serial Port %d: passthrough enabled.\n\n", c+1); } for (c = 0; c < PARALLEL_MAX; c++) { @@ -2458,6 +2471,12 @@ save_ports(void) ini_section_set_string(cat, temp, (char *) com_device_get_internal_name(com_ports[c].device)); */ + + if (com_ports[c].enabled) + if (serial_passthrough_enabled[c]) { + sprintf(temp, "serial%d_passthrough_enabled", c + 1); + ini_section_set_int(cat, temp, 1); + } } for (c = 0; c < PARALLEL_MAX; c++) { diff --git a/src/device.c b/src/device.c index 12d06580a..52d2bb18e 100644 --- a/src/device.c +++ b/src/device.c @@ -18,6 +18,8 @@ * Copyright 2017-2019 Fred N. van Kempen. * Copyright 2016-2019 Miran Grca. * Copyright 2008-2019 Sarah Walker. + * Copyright 2021 Andreas J. Reichel. + * Copyright 2021-2022 Jasmine Iwanek. * * 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 @@ -91,6 +93,7 @@ device_set_context(device_context_t *c, const device_t *d, int inst) memset(c, 0, sizeof(device_context_t)); c->dev = d; + c->instance = inst; if (inst) { sprintf(c->name, "%s #%i", d->name, inst); @@ -556,6 +559,12 @@ device_force_redraw(void) } } +const int +device_get_instance(void) +{ + return device_current.instance; +} + const char * device_get_config_string(const char *s) { diff --git a/src/device/CMakeLists.txt b/src/device/CMakeLists.txt index ed8464647..41b9930c6 100644 --- a/src/device/CMakeLists.txt +++ b/src/device/CMakeLists.txt @@ -11,13 +11,16 @@ # Authors: David Hrdlička, # # Copyright 2020-2021 David Hrdlička. +# Copyright 2021 Andreas J. Reichel. +# Copyright 2021-2022 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 clock_ics9xxx.c isapnp.c i2c.c i2c_gpio.c smbus_piix4.c smbus_ali7101.c keyboard.c keyboard_xt.c keyboard_at.c - mouse.c mouse_bus.c mouse_serial.c mouse_ps2.c phoenix_486_jumper.c) + mouse.c mouse_bus.c mouse_serial.c mouse_ps2.c phoenix_486_jumper.c + serial_passthrough.c) if(ISAMEM_RAMPAGE) target_compile_definitions(dev PRIVATE USE_ISAMEM_RAMPAGE) diff --git a/src/device/serial.c b/src/device/serial.c index dad2ed7f5..7d90a0fe8 100644 --- a/src/device/serial.c +++ b/src/device/serial.c @@ -93,6 +93,8 @@ serial_transmit_period(serial_t *dev) /* Bit period based on DLAB. */ dev->transmit_period = (16000000.0 * ddlab) / dev->clock_src; + if (dev->sd && dev->sd->transmit_period_callback) + dev->sd->transmit_period_callback(dev, dev->sd->priv, dev->transmit_period); } void @@ -161,7 +163,7 @@ write_fifo(serial_t *dev, uint8_t dat) dev->lsr |= 0x01; dev->int_status |= SERIAL_INT_RECEIVE; } - if (dev->rcvr_fifo_pos < 15) + if (dev->rcvr_fifo_pos < (dev->rcvr_fifo_len - 1)) dev->rcvr_fifo_pos++; else dev->rcvr_fifo_full = 1; @@ -175,6 +177,8 @@ write_fifo(serial_t *dev, uint8_t dat) dev->dat = dat; dev->lsr |= 0x01; dev->int_status |= SERIAL_INT_RECEIVE; + if (dev->lsr & 0x02) + dev->int_status |= SERIAL_INT_LSR; serial_update_ints(dev); } } @@ -311,6 +315,22 @@ serial_timeout_timer(void *priv) serial_update_ints(dev); } +void +serial_device_timeout(void *priv) +{ + serial_t *dev = (serial_t *) priv; + +#ifdef ENABLE_SERIAL_LOG + serial_log("serial_device_timeout()\n"); +#endif + + if (!dev->fifo_enabled) { + dev->lsr |= 0x10; + dev->int_status |= SERIAL_INT_LSR; + serial_update_ints(dev); + } +} + static void serial_update_speed(serial_t *dev) { @@ -331,6 +351,63 @@ serial_reset_fifo(serial_t *dev) dev->rcvr_fifo_full = 0; } +void +serial_set_dsr(serial_t *dev, uint8_t enabled) +{ + if (dev->mctrl & 0x10) + return; + + dev->msr &= ~0x2; + dev->msr |= !!((dev->msr & 0x20) ^ (enabled << 5)) << 1; + dev->msr &= ~0x20; + dev->msr |= (!!enabled) << 5; + dev->msr_set &= ~0x20; + dev->msr_set |= (!!enabled) << 5; + + if (dev->msr & 0x2) { + dev->int_status |= SERIAL_INT_MSR; + serial_update_ints(dev); + } +} + +void +serial_set_cts(serial_t *dev, uint8_t enabled) +{ + if (dev->mctrl & 0x10) + return; + + dev->msr &= ~0x1; + dev->msr |= !!((dev->msr & 0x10) ^ (enabled << 4)); + dev->msr &= ~0x10; + dev->msr |= (!!enabled) << 4; + dev->msr_set &= ~0x10; + dev->msr_set |= (!!enabled) << 4; + + if (dev->msr & 0x1) { + dev->int_status |= SERIAL_INT_MSR; + serial_update_ints(dev); + } +} + +void +serial_set_dcd(serial_t *dev, uint8_t enabled) +{ + if (dev->mctrl & 0x10) + return; + + dev->msr &= ~0x8; + dev->msr |= !!((dev->msr & 0x80) ^ (enabled << 7)); + dev->msr &= ~0x80; + dev->msr |= (!!enabled) << 7; + dev->msr_set &= ~0x80; + dev->msr_set |= (!!enabled) << 7; + + if (dev->msr & 0x8) { + dev->int_status |= SERIAL_INT_MSR; + serial_update_ints(dev); + } +} + void serial_set_clock_src(serial_t *dev, double clock_src) { @@ -431,7 +508,7 @@ serial_write(uint16_t addr, uint8_t val, void *p) case 3: old = dev->lcr; dev->lcr = val; - if ((old ^ val) & 0x0f) { + if ((old ^ val) & 0x3f) { /* Data bits + start bit. */ dev->bits = ((dev->lcr & 0x03) + 5) + 1; /* Stop bits. */ @@ -444,11 +521,14 @@ serial_write(uint16_t addr, uint8_t val, void *p) serial_transmit_period(dev); serial_update_speed(dev); + + if (dev->sd && dev->sd->lcr_callback) + dev->sd->lcr_callback(dev, dev->sd->priv, dev->lcr); } break; case 4: if ((val & 2) && !(dev->mctrl & 2)) { - if (dev->sd->rcr_callback) + if (dev->sd && dev->sd->rcr_callback) dev->sd->rcr_callback(dev, dev->sd->priv); } if (!(val & 8) && (dev->mctrl & 8)) @@ -487,7 +567,7 @@ serial_write(uint16_t addr, uint8_t val, void *p) serial_update_ints(dev); break; case 6: - dev->msr = val; + dev->msr = (val & 0xF0) | (dev->msr & 0x0F); if (dev->msr & 0x0f) dev->int_status |= SERIAL_INT_MSR; serial_update_ints(dev); @@ -521,11 +601,15 @@ serial_read(uint16_t addr, void *p) ret = dev->rcvr_fifo[0]; dev->rcvr_fifo_full = 0; + + for (i = 1; i < 16; i++) + dev->rcvr_fifo[i - 1] = dev->rcvr_fifo[i]; + + dev->rcvr_fifo_pos--; + if (dev->rcvr_fifo_pos > 0) { - for (i = 1; i < 16; i++) - dev->rcvr_fifo[i - 1] = dev->rcvr_fifo[i]; serial_log("FIFO position %i: read %02X, next %02X\n", dev->rcvr_fifo_pos, ret, dev->rcvr_fifo[0]); - dev->rcvr_fifo_pos--; + /* At least one byte remains to be read, start the timeout timer so that a timeout is indicated in case of no read. */ timer_on_auto(&dev->timeout_timer, 4.0 * dev->bits * dev->transmit_period); @@ -571,7 +655,7 @@ serial_read(uint16_t addr, void *p) serial_update_ints(dev); break; case 6: - ret = dev->msr; + ret = dev->msr | dev->msr_set; dev->msr &= ~0x0f; dev->int_status &= ~SERIAL_INT_MSR; serial_update_ints(dev); @@ -630,9 +714,30 @@ serial_attach(int port, { serial_device_t *sd = &serial_devices[port]; - sd->rcr_callback = rcr_callback; - sd->dev_write = dev_write; - sd->priv = priv; + sd->rcr_callback = rcr_callback; + sd->dev_write = dev_write; + sd->transmit_period_callback = NULL; + sd->lcr_callback = NULL; + sd->priv = priv; + + return sd->serial; +} + +serial_t * +serial_attach_ex(int port, + void (*rcr_callback)(struct serial_s *serial, void *p), + void (*dev_write)(struct serial_s *serial, void *p, uint8_t data), + void (*transmit_period_callback)(struct serial_s *serial, void *p, double transmit_period), + void (*lcr_callback)(struct serial_s *serial, void *p, uint8_t data_bits), + void *priv) +{ + serial_device_t *sd = &serial_devices[port]; + + sd->rcr_callback = rcr_callback; + sd->dev_write = dev_write; + sd->transmit_period_callback = transmit_period_callback; + sd->lcr_callback = lcr_callback; + sd->priv = priv; return sd->serial; } diff --git a/src/device/serial_passthrough.c b/src/device/serial_passthrough.c new file mode 100644 index 000000000..6025f264a --- /dev/null +++ b/src/device/serial_passthrough.c @@ -0,0 +1,357 @@ +/* + * 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 Serial passthrough device. + * + * + * Authors: Andreas J. Reichel , + * Jasmine Iwanek + * + * Copyright 2021 Andreas J. Reichel. + * Copyright 2021-2022 Jasmine Iwanek. + */ + +#include +#include +#include +#include +#include +#include +#define HAVE_STDARG_H +#include <86box/86box.h> +#include <86box/device.h> +#include <86box/timer.h> +#include <86box/serial.h> +#include <86box/serial_passthrough.h> +#include <86box/plat_serial_passthrough.h> + +#define ENABLE_SERIAL_PASSTHROUGH_LOG 1 +#ifdef ENABLE_SERIAL_PASSTHROUGH_LOG +int serial_passthrough_do_log = ENABLE_SERIAL_PASSTHROUGH_LOG; + +static void +serial_passthrough_log(const char *fmt, ...) +{ + va_list ap; + + if (serial_passthrough_do_log) { + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); + } +} +#else +# define serial_passthrough_log(fmt, ...) +#endif + +void +serial_passthrough_init(void) +{ + int c; + + for (c = 0; c < SERIAL_MAX; c++) { + if (serial_passthrough_enabled[c]) { + /* Instance n for COM n */ + device_add_inst(&serial_passthrough_device, c + 1); + } + } +} + +static void +serial_passthrough_timers_off(serial_passthrough_t *dev) +{ + timer_stop(&dev->host_to_serial_timer); +} + +static void +serial_passthrough_write(serial_t *s, void *priv, uint8_t val) +{ + plat_serpt_write(priv, val); +} + +static void +host_to_serial_cb(void *priv) +{ + serial_passthrough_t *dev = (serial_passthrough_t *) priv; + + uint8_t byte; + + /* write_fifo has no failure indication, but if we write to fast, the host + * can never fetch the bytes in time, so check if the fifo is full if in + * fifo mode or if lsr has bit 0 set if not in fifo mode */ + if ((dev->serial->type >= SERIAL_16550) && dev->serial->fifo_enabled) { + if (dev->serial->rcvr_fifo_full) { + goto no_write_to_machine; + } + } else { + if (dev->serial->lsr & 1) { + goto no_write_to_machine; + } + } + if (plat_serpt_read(dev, &byte)) { + // printf("got byte %02X\n", byte); + serial_write_fifo(dev->serial, byte); + // serial_set_dsr(dev->serial, 1); + } +no_write_to_machine: + // serial_device_timeout(dev->serial); + timer_on_auto(&dev->host_to_serial_timer, (1000000.0 / dev->baudrate) * (double) dev->bits); +} + +static void +serial_passthrough_rcr_cb(struct serial_s *serial, void *priv) +{ + serial_passthrough_t *dev = (serial_passthrough_t *) priv; + + timer_stop(&dev->host_to_serial_timer); + /* FIXME: do something to dev->baudrate */ + timer_on_auto(&dev->host_to_serial_timer, (1000000.0 / dev->baudrate) * (double) dev->bits); + // serial_clear_fifo(dev->serial); +} + +static void +serial_passthrough_speed_changed(void *priv) +{ + serial_passthrough_t *dev = (serial_passthrough_t *) priv; + + timer_stop(&dev->host_to_serial_timer); + /* FIXME: do something to dev->baudrate */ + timer_on_auto(&dev->host_to_serial_timer, (1000000.0 / dev->baudrate) * (double) dev->bits); + // serial_clear_fifo(dev->serial); +} + +static void +serial_passthrough_dev_close(void *priv) +{ + serial_passthrough_t *dev = (serial_passthrough_t *) priv; + + /* Detach passthrough device from COM port */ + if (dev && dev->serial && dev->serial->sd) + memset(dev->serial->sd, 0, sizeof(serial_device_t)); + + plat_serpt_close(dev); + free(dev); +} + +void +serial_passthrough_transmit_period(serial_t *serial, void *p, double transmit_period) +{ + serial_passthrough_t *dev = (serial_passthrough_t *) p; + + if (dev->mode != SERPT_MODE_HOSTSER) + return; + dev->baudrate = 1000000.0 / (transmit_period); + + serial_passthrough_speed_changed(p); + plat_serpt_set_params(dev); +} + +void +serial_passthrough_lcr_callback(serial_t *serial, void *p, uint8_t lcr) +{ + serial_passthrough_t *dev = (serial_passthrough_t *) p; + + if (dev->mode != SERPT_MODE_HOSTSER) + return; + dev->bits = serial->bits; + dev->data_bits = ((lcr & 0x03) + 5); + serial_passthrough_speed_changed(p); + plat_serpt_set_params(dev); +} + +/* Initialize the device for use by the user. */ +static void * +serial_passthrough_dev_init(const device_t *info) +{ + serial_passthrough_t *dev; + + dev = (serial_passthrough_t *) malloc(sizeof(serial_passthrough_t)); + memset(dev, 0, sizeof(serial_passthrough_t)); + dev->mode = device_get_config_int("mode"); + + dev->port = device_get_instance() - 1; + dev->baudrate = device_get_config_int("baudrate"); + dev->data_bits = device_get_config_int("data_bits"); + + /* Attach passthrough device to a COM port */ + dev->serial = serial_attach_ex(dev->port, serial_passthrough_rcr_cb, + serial_passthrough_write, serial_passthrough_transmit_period, serial_passthrough_lcr_callback, dev); + + strncpy(dev->host_serial_path, device_get_config_string("host_serial_path"), 1024); + + serial_passthrough_log("%s: port=COM%d\n", info->name, dev->port + 1); + serial_passthrough_log("%s: baud=%f\n", info->name, dev->baudrate); + serial_passthrough_log("%s: mode=%s\n", info->name, serpt_mode_names[dev->mode]); + + if (plat_serpt_open_device(dev)) { + serial_passthrough_log("%s: not running\n", info->name); + return NULL; + } + serial_passthrough_log("%s: running\n", info->name); + + memset(&dev->host_to_serial_timer, 0, sizeof(pc_timer_t)); + timer_add(&dev->host_to_serial_timer, host_to_serial_cb, dev, 1); + serial_set_cts(dev->serial, 1); + serial_set_dsr(dev->serial, 1); + serial_set_dcd(dev->serial, 1); + + /* 1 start bit + data bits + stop bits (no parity assumed) */ + dev->bits = 1 + device_get_config_int("data_bits") + device_get_config_int("stop_bits"); + + /* Return our private data to the I/O layer. */ + return dev; +} + +const char *serpt_mode_names[SERPT_MODES_MAX] = { + [SERPT_MODE_VCON] = "vcon", + [SERPT_MODE_TCPSRV] = "tcpsrv", + [SERPT_MODE_TCPCLNT] = "tcpclnt", + [SERPT_MODE_HOSTSER] = "hostser", +}; + +// clang-format off +static const device_config_t serial_passthrough_config[] = { + { + .name = "mode", + .description = "Passthrough Mode", + .type = CONFIG_SELECTION, + .default_string = "", + .default_int = 0, + .file_filter = "", + .spinner = { 0 }, + .selection = { +#ifdef _WIN32 + { + .description = "Named Pipe (Server)", + .value = SERPT_MODE_VCON + }, +#if 0 /* TODO */ + { + .description = "Named Pipe (Client)", + .value = SERPT_MODE_VCON + }, +#endif +#else + { + .description = "Pseudo Terminal/Virtual Console", + .value = SERPT_MODE_VCON + }, +#endif +#if 0 /* TODO */ + { + .description = "TCP Server", + .value = SERPT_MODE_TCPSRV + }, + { + .description = "TCP Client", + .value = SERPT_MODE_TCPCLNT + }, +#endif + { + .description = "Host Serial Passthrough", + .value = SERPT_MODE_HOSTSER + }, + { + .description = "" + } + } + }, + { + .name = "host_serial_path", + .description = "Host Serial Device", + .type = CONFIG_SERPORT, + .default_string = "", + .file_filter = NULL, + .spinner = {}, + .selection = {} + }, + { + .name = "data_bits", + .description = "Data bits", + .type = CONFIG_SELECTION, + .default_string = "8", + .default_int = 8, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { +#if 0 /* Mentioned by WFW 3.1x, not supported, atleast on Linux */ + { .description = "4", .value = 4 }, +#endif + { .description = "5", .value = 5 }, + { .description = "6", .value = 6 }, + { .description = "7", .value = 7 }, + { .description = "8", .value = 8 } + } + }, + { + .name = "stop_bits", + .description = "Stop bits", + .type = CONFIG_SELECTION, + .default_string = "1", + .default_int = 1, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { + { .description = "1", .value = 1 }, +#if 0 + { .description = "1.5", .value = 1.5 }, +#endif + { .description = "2", .value = 2 } + } + }, + { + .name = "baudrate", + .description = "Baud Rate of Passthrough", + .type = CONFIG_SELECTION, + .default_string = "", + .default_int = 115200, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { +#if 0 + { .description = "256000", .value = 256000 }, + { .description = "128000", .value = 128000 }, +#endif + { .description = "115200", .value = 115200 }, + { .description = "57600", .value = 57600 }, + { .description = "56000", .value = 56000 }, + { .description = "38400", .value = 38400 }, + { .description = "19200", .value = 19200 }, + { .description = "14400", .value = 14400 }, + { .description = "9600", .value = 9600 }, + { .description = "7200", .value = 7200 }, + { .description = "4800", .value = 4800 }, + { .description = "2400", .value = 2400 }, + { .description = "1800", .value = 1800 }, + { .description = "1200", .value = 1200 }, + { .description = "600", .value = 600 }, + { .description = "300", .value = 300 }, + { .description = "150", .value = 150 }, +#if 0 + { .description = "134.5", .value = 134.5 }, +#endif + { .description = "110", .value = 110 }, + { .description = "75", .value = 75 } + } + }, + { .name = "", .description = "", .type = CONFIG_END } +}; +// clang-format on + +const device_t serial_passthrough_device = { + .name = "Serial Passthrough Device", + .flags = 0, + .local = 0, + .init = serial_passthrough_dev_init, + .close = serial_passthrough_dev_close, + .reset = NULL, + { .poll = NULL }, + .speed_changed = serial_passthrough_speed_changed, + .force_redraw = NULL, + .config = serial_passthrough_config +}; diff --git a/src/include/86box/device.h b/src/include/86box/device.h index 79cbf4d2a..877ef660a 100644 --- a/src/include/86box/device.h +++ b/src/include/86box/device.h @@ -17,6 +17,8 @@ * Copyright 2017-2019 Fred N. van Kempen. * Copyright 2016-2019 Miran Grca. * Copyright 2008-2019 Sarah Walker. + * Copyright 2021 Andreas J. Reichel. + * Copyright 2021-2022 Jasmine Iwanek. * * 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 @@ -52,6 +54,7 @@ #define CONFIG_MAC 9 #define CONFIG_MIDI_IN 10 #define CONFIG_BIOS 11 +#define CONFIG_SERPORT 12 enum { DEVICE_PCJR = 2, /* requires an IBM PCjr */ @@ -107,7 +110,7 @@ typedef struct { int default_int; const char *file_filter; const device_config_spinner_t spinner; - const device_config_selection_t selection[16]; + const device_config_selection_t selection[32]; const device_config_bios_t bios[32]; } device_config_t; @@ -134,6 +137,7 @@ typedef struct _device_ { typedef struct { const device_t *dev; char name[2048]; + int instance; } device_context_t; #ifdef __cplusplus @@ -178,6 +182,7 @@ extern void device_set_config_hex16(const char *s, int val); extern void device_set_config_hex20(const char *s, int val); extern void device_set_config_mac(const char *s, int val); extern const char *device_get_config_string(const char *name); +extern const int device_get_instance(void); #define device_get_config_bios device_get_config_string extern char *device_get_internal_name(const device_t *d); diff --git a/src/include/86box/plat_serial_passthrough.h b/src/include/86box/plat_serial_passthrough.h new file mode 100644 index 000000000..e9df0584e --- /dev/null +++ b/src/include/86box/plat_serial_passthrough.h @@ -0,0 +1,38 @@ +/* + * 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. + * + * Definitions for platform specific serial to host passthrough. + * + * + * Authors: Andreas J. Reichel , + * Jasmine Iwanek + * + * Copyright 2021 Andreas J. Reichel. + * Copyright 2021-2022 Jasmine Iwanek. + */ + +#ifndef PLAT_SERIAL_PASSTHROUGH_H +#define PLAT_SERIAL_PASSTHROUGH_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern void plat_serpt_write(void *p, uint8_t data); +extern int plat_serpt_read(void *p, uint8_t *data); +extern int plat_serpt_open_device(void *p); +extern void plat_serpt_close(void *p); +extern void plat_serpt_set_params(void *p); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/include/86box/resource.h b/src/include/86box/resource.h index 967430216..397443299 100644 --- a/src/include/86box/resource.h +++ b/src/include/86box/resource.h @@ -247,6 +247,10 @@ #define IDC_CHECK_PARALLEL2 1089 #define IDC_CHECK_PARALLEL3 1090 #define IDC_CHECK_PARALLEL4 1091 +#define IDC_CHECK_SERIAL_PASS1 1092 +#define IDC_CHECK_SERIAL_PASS2 1093 +#define IDC_CHECK_SERIAL_PASS3 1094 +#define IDC_CHECK_SERIAL_PASS4 1095 #define IDC_OTHER_PERIPH 1110 /* storage controllers config */ #define IDC_COMBO_HDC 1111 @@ -364,6 +368,10 @@ #define IDC_CONFIGURE_NET4 1321 #define IDC_CONFIGURE_MIDI_OUT 1322 #define IDC_CONFIGURE_MIDI_IN 1323 +#define IDC_CONFIGURE_SERIAL_PASS1 1324 +#define IDC_CONFIGURE_SERIAL_PASS2 1325 +#define IDC_CONFIGURE_SERIAL_PASS3 1326 +#define IDC_CONFIGURE_SERIAL_PASS4 1327 #define IDC_JOY1 1330 #define IDC_JOY2 1331 #define IDC_JOY3 1332 diff --git a/src/include/86box/serial.h b/src/include/86box/serial.h index ae48ee09f..62b4c9a5f 100644 --- a/src/include/86box/serial.h +++ b/src/include/86box/serial.h @@ -53,7 +53,7 @@ typedef struct serial_s { dat, int_status, scratch, fcr, irq, type, inst, transmit_enabled, fifo_enabled, rcvr_fifo_len, bits, data_bits, - baud_cycles, rcvr_fifo_full, txsr, pad; + baud_cycles, rcvr_fifo_full, txsr, pad, msr_set; uint16_t dlab, base_address; @@ -70,6 +70,8 @@ typedef struct serial_s { typedef struct serial_device_s { void (*rcr_callback)(struct serial_s *serial, void *p); void (*dev_write)(struct serial_s *serial, void *p, uint8_t data); + void (*lcr_callback)(struct serial_s *serial, void *p, uint8_t lcr); + void (*transmit_period_callback)(struct serial_s *serial, void *p, double transmit_period); void *priv; serial_t *serial; } serial_device_t; @@ -84,6 +86,12 @@ extern serial_t *serial_attach(int port, void (*rcr_callback)(struct serial_s *serial, void *p), void (*dev_write)(struct serial_s *serial, void *p, uint8_t data), void *priv); +extern serial_t *serial_attach_ex(int port, + void (*rcr_callback)(struct serial_s *serial, void *p), + void (*dev_write)(struct serial_s *serial, void *p, uint8_t data), + void (*transmit_period_callback)(struct serial_s *serial, void *p, double transmit_period), + void (*lcr_callback)(struct serial_s *serial, void *p, uint8_t data_bits), + void *priv); extern void serial_remove(serial_t *dev); extern void serial_set_type(serial_t *dev, int type); extern void serial_setup(serial_t *dev, uint16_t addr, uint8_t irq); @@ -93,6 +101,11 @@ extern void serial_set_next_inst(int ni); extern void serial_standalone_init(void); extern void serial_set_clock_src(serial_t *dev, double clock_src); extern void serial_reset_port(serial_t *dev); +extern void serial_device_timeout(void *priv); + +extern void serial_set_cts(serial_t *dev, uint8_t enabled); +extern void serial_set_dsr(serial_t *dev, uint8_t enabled); +extern void serial_set_dcd(serial_t *dev, uint8_t enabled); extern const device_t ns8250_device; extern const device_t ns8250_pcjr_device; diff --git a/src/include/86box/serial_passthrough.h b/src/include/86box/serial_passthrough.h new file mode 100644 index 000000000..20c97fa03 --- /dev/null +++ b/src/include/86box/serial_passthrough.h @@ -0,0 +1,61 @@ +/* + * 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. + * + * Definition of Serial passthrough device. + * + * + * Authors: Andreas J. Reichel , + * Jasmine Iwanek + * + * Copyright 2021 Andreas J. Reichel. + * Copyright 2021-2022 Jasmine Iwanek. + */ + +#ifndef SERIAL_PASSTHROUGH_H +#define SERIAL_PASSTHROUGH_H + +#include +#include + +#include <86box/86box.h> +#include <86box/device.h> +#include <86box/timer.h> +#include <86box/serial.h> + +enum serial_passthrough_mode { + SERPT_MODE_VCON, /*Named Pipe (Server) / Pseudo Terminal/Virtual Console */ + SERPT_MODE_TCPSRV, /* TCP Server (TODO) */ + SERPT_MODE_TCPCLNT, /* TCP Client (TODO) */ + SERPT_MODE_HOSTSER, /* Host Serial Passthrough */ + SERPT_MODES_MAX, +}; + +extern const char *serpt_mode_names[SERPT_MODES_MAX]; + +typedef struct serial_passthrough_s { + enum serial_passthrough_mode mode; + pc_timer_t host_to_serial_timer; + pc_timer_t serial_to_host_timer; + serial_t *serial; + double baudrate; + uint8_t bits, data_bits; + uint8_t port; + uint8_t data; + char slave_pt[32]; /* used for pseudo term name of slave side */ + intptr_t master_fd; /* file desc for master pseudo terminal or + * socket or alike */ + char host_serial_path[1024]; /* Path to TTY/host serial port on the host */ + void *backend_priv; /* Private platform backend data */ +} serial_passthrough_t; + +extern bool serial_passthrough_enabled[SERIAL_MAX]; +extern const device_t serial_passthrough_device; + +extern void serial_passthrough_init(void); + +#endif diff --git a/src/include/86box/win_opengl.h b/src/include/86box/win_opengl.h index 80d3695ca..d354131ef 100644 --- a/src/include/86box/win_opengl.h +++ b/src/include/86box/win_opengl.h @@ -17,7 +17,7 @@ #define WIN_OPENGL_H #define UNICODE -#include +#include extern int opengl_init(HWND hwnd); extern int opengl_pause(void); diff --git a/src/include/discord_game_sdk.h b/src/include/discord_game_sdk.h index 62ea8418e..0d3da6dea 100644 --- a/src/include/discord_game_sdk.h +++ b/src/include/discord_game_sdk.h @@ -9,7 +9,7 @@ #define _DISCORD_GAME_SDK_H_ #ifdef _WIN32 -#include +#include #include #endif diff --git a/src/qt/CMakeLists.txt b/src/qt/CMakeLists.txt index 7b3dfc929..1cb26a239 100644 --- a/src/qt/CMakeLists.txt +++ b/src/qt/CMakeLists.txt @@ -221,6 +221,12 @@ if(WIN32 AND NOT MINGW) target_sources(plat PRIVATE ../win/win_opendir.c) endif() +if(WIN32) + target_sources(plat PRIVATE ../win/win_serial_passthrough.c) +else() + target_sources(plat PRIVATE ../unix/unix_serial_passthrough.c) +endif() + if (APPLE) target_sources(ui PRIVATE macos_event_filter.mm) if(MOLTENVK) diff --git a/src/qt/qt_deviceconfig.cpp b/src/qt/qt_deviceconfig.cpp index 257238316..bf7d4bbb0 100644 --- a/src/qt/qt_deviceconfig.cpp +++ b/src/qt/qt_deviceconfig.cpp @@ -27,6 +27,8 @@ #include #include #include +#include +#include extern "C" { #include <86box/86box.h> @@ -40,6 +42,10 @@ extern "C" { #include "qt_filefield.hpp" #include "qt_models_common.hpp" +#ifdef Q_OS_LINUX +# include +# include +#endif DeviceConfig::DeviceConfig(QWidget *parent) : QDialog(parent) @@ -53,6 +59,40 @@ DeviceConfig::~DeviceConfig() delete ui; } +static QStringList +EnumerateSerialDevices() +{ + QStringList serialDevices, ttyEntries; + QByteArray devstr(1024, 0); +#ifdef Q_OS_LINUX + QDir class_dir("/sys/class/tty/"); + QDir dev_dir("/dev/"); + ttyEntries = class_dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot | QDir::System, QDir::SortFlag::Name); + for (int i = 0; i < ttyEntries.size(); i++) { + if (class_dir.exists(ttyEntries[i] + "/device/driver/") && dev_dir.exists(ttyEntries[i]) + && QFileInfo(dev_dir.canonicalPath() + '/' + ttyEntries[i]).isReadable() + && QFileInfo(dev_dir.canonicalPath() + '/' + ttyEntries[i]).isWritable()) { + serialDevices.push_back("/dev/" + ttyEntries[i]); + } + } +#endif +#ifdef Q_OS_WINDOWS + QSettings comPorts("HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM", QSettings::NativeFormat, nullptr); + for (int i = 0; i < comPorts.childKeys().length(); i++) { + serialDevices.push_back(QString("\\\\.\\") + comPorts.value(comPorts.childKeys()[i]).toString()); + } +#endif +#ifdef Q_OS_MACOS + QDir dev_dir("/dev/"); + dev_dir.setNameFilters({ "tty.*", "cu.*" }); + QDir::Filters serial_dev_flags = QDir::Files | QDir::NoSymLinks | QDir::Readable | QDir::Writable | QDir::NoDotAndDotDot | QDir::System; + for (const auto &device : dev_dir.entryInfoList(serial_dev_flags, QDir::SortFlag::Name)) { + serialDevices.push_back(device.canonicalFilePath()); + } +#endif + return serialDevices; +} + void DeviceConfig::ConfigureDevice(const _device_ *device, int instance, Settings *settings) { @@ -205,6 +245,27 @@ DeviceConfig::ConfigureDevice(const _device_ *device, int instance, Settings *se dc.ui->formLayout->addRow(config->description, fileField); break; } + case CONFIG_SERPORT: + { + auto *cbox = new QComboBox(); + cbox->setObjectName(config->name); + auto *model = cbox->model(); + int currentIndex = 0; + auto serialDevices = EnumerateSerialDevices(); + char *selected = config_get_string(device_context.name, const_cast(config->name), const_cast(config->default_string)); + + Models::AddEntry(model, "None", -1); + for (int i = 0; i < serialDevices.size(); i++) { + int row = Models::AddEntry(model, serialDevices[i], i); + if (selected == serialDevices[i]) { + currentIndex = row; + } + } + + dc.ui->formLayout->addRow(config->description, cbox); + cbox->setCurrentIndex(currentIndex); + break; + } } ++config; } @@ -236,6 +297,15 @@ DeviceConfig::ConfigureDevice(const _device_ *device, int instance, Settings *se config_set_string(device_context.name, const_cast(config->name), const_cast(config->bios[idx].internal_name)); break; } + case CONFIG_SERPORT: + { + auto *cbox = dc.findChild(config->name); + auto path = cbox->currentText().toUtf8(); + if (path == "None") + path = ""; + config_set_string(device_context.name, const_cast(config->name), path); + break; + } case CONFIG_HEX16: { auto *cbox = dc.findChild(config->name); diff --git a/src/qt/qt_main.cpp b/src/qt/qt_main.cpp index 5bd2d40d3..a003bf59c 100644 --- a/src/qt/qt_main.cpp +++ b/src/qt/qt_main.cpp @@ -43,7 +43,7 @@ Q_IMPORT_PLUGIN(QWindowsVistaStylePlugin) # include "qt_winrawinputfilter.hpp" # include "qt_winmanagerfilter.hpp" # include <86box/win.h> -# include +# include #endif extern "C" { diff --git a/src/qt/qt_settingsports.cpp b/src/qt/qt_settingsports.cpp index a4be440e5..9b19df68d 100644 --- a/src/qt/qt_settingsports.cpp +++ b/src/qt/qt_settingsports.cpp @@ -27,6 +27,7 @@ extern "C" { #include <86box/machine.h> #include <86box/lpt.h> #include <86box/serial.h> +#include <86box/serial_passthrough.h> } #include "qt_deviceconfig.hpp" @@ -66,6 +67,15 @@ SettingsPorts::SettingsPorts(QWidget *parent) auto *checkBox = findChild(QString("checkBoxSerial%1").arg(i + 1)); checkBox->setChecked(com_ports[i].enabled > 0); } + + 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]); } SettingsPorts::~SettingsPorts() @@ -87,6 +97,11 @@ SettingsPorts::save() auto *checkBox = findChild(QString("checkBoxSerial%1").arg(i + 1)); com_ports[i].enabled = checkBox->isChecked() ? 1 : 0; } + + 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 @@ -112,3 +127,51 @@ SettingsPorts::on_checkBoxParallel4_stateChanged(int state) { ui->comboBoxLpt4->setEnabled(state == Qt::Checked); } + +void +SettingsPorts::on_pushButtonSerialPassThru1_clicked() +{ + DeviceConfig::ConfigureDevice(&serial_passthrough_device, 1, qobject_cast(Settings::settings)); +} + +void +SettingsPorts::on_pushButtonSerialPassThru2_clicked() +{ + DeviceConfig::ConfigureDevice(&serial_passthrough_device, 2, qobject_cast(Settings::settings)); +} + +void +SettingsPorts::on_pushButtonSerialPassThru3_clicked() +{ + DeviceConfig::ConfigureDevice(&serial_passthrough_device, 3, qobject_cast(Settings::settings)); +} + +void +SettingsPorts::on_pushButtonSerialPassThru4_clicked() +{ + DeviceConfig::ConfigureDevice(&serial_passthrough_device, 4, qobject_cast(Settings::settings)); +} + +void +SettingsPorts::on_checkBoxSerialPassThru1_clicked(bool checked) +{ + ui->pushButtonSerialPassThru1->setEnabled(checked); +} + +void +SettingsPorts::on_checkBoxSerialPassThru2_clicked(bool checked) +{ + ui->pushButtonSerialPassThru2->setEnabled(checked); +} + +void +SettingsPorts::on_checkBoxSerialPassThru3_clicked(bool checked) +{ + ui->pushButtonSerialPassThru3->setEnabled(checked); +} + +void +SettingsPorts::on_checkBoxSerialPassThru4_clicked(bool checked) +{ + ui->pushButtonSerialPassThru4->setEnabled(checked); +} diff --git a/src/qt/qt_settingsports.hpp b/src/qt/qt_settingsports.hpp index 5fa88e210..a5129d35f 100644 --- a/src/qt/qt_settingsports.hpp +++ b/src/qt/qt_settingsports.hpp @@ -15,6 +15,30 @@ public: ~SettingsPorts(); void save(); +private slots: + void on_checkBoxSerialPassThru4_clicked(bool checked); + +private slots: + void on_checkBoxSerialPassThru3_clicked(bool checked); + +private slots: + void on_checkBoxSerialPassThru2_clicked(bool checked); + +private slots: + void on_pushButtonSerialPassThru4_clicked(); + +private slots: + void on_pushButtonSerialPassThru3_clicked(); + +private slots: + void on_pushButtonSerialPassThru2_clicked(); + +private slots: + void on_pushButtonSerialPassThru1_clicked(); + +private slots: + void on_checkBoxSerialPassThru1_clicked(bool checked); + private slots: void on_checkBoxParallel3_stateChanged(int arg1); void on_checkBoxParallel2_stateChanged(int arg1); diff --git a/src/qt/qt_settingsports.ui b/src/qt/qt_settingsports.ui index a1fbb47e7..7a338aff5 100644 --- a/src/qt/qt_settingsports.ui +++ b/src/qt/qt_settingsports.ui @@ -13,7 +13,7 @@ Form - + 0 @@ -26,7 +26,7 @@ 0 - + @@ -70,29 +70,8 @@ - + - - - - Serial port 1 - - - - - - - Parallel port 1 - - - - - - - Serial port 2 - - - @@ -100,13 +79,6 @@ - - - - Serial port 3 - - - @@ -114,10 +86,17 @@ - - + + - Serial port 4 + Serial port 3 + + + + + + + Serial port 1 @@ -128,20 +107,117 @@ + + + + Serial port 2 + + + + + + + Parallel port 1 + + + + + + + Serial port 4 + + + - - - - Qt::Vertical + + + + QLayout::SetDefaultConstraint - - - 20 - 40 - - - + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Serial port passthrough 3 + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Configure + + + + + + + Serial port passthrough 1 + + + + + + + Serial port passthrough 2 + + + + + + + Serial port passthrough 4 + + + + + + + Configure + + + + + + + Configure + + + + + + + Configure + + + + diff --git a/src/qt/qt_winmanagerfilter.cpp b/src/qt/qt_winmanagerfilter.cpp index 0218ae5ba..cdb81fcd5 100644 --- a/src/qt/qt_winmanagerfilter.cpp +++ b/src/qt/qt_winmanagerfilter.cpp @@ -17,7 +17,7 @@ #include "qt_winmanagerfilter.hpp" -#include +#include #include <86box/win.h> bool diff --git a/src/qt/qt_winrawinputfilter.cpp b/src/qt/qt_winrawinputfilter.cpp index 88b723d4c..6690a08eb 100644 --- a/src/qt/qt_winrawinputfilter.cpp +++ b/src/qt/qt_winrawinputfilter.cpp @@ -35,7 +35,7 @@ #include -#include +#include #include <86box/keyboard.h> #include <86box/mouse.h> diff --git a/src/qt/qt_winrawinputfilter.hpp b/src/qt/qt_winrawinputfilter.hpp index 6d23b83b7..b03f6783e 100644 --- a/src/qt/qt_winrawinputfilter.hpp +++ b/src/qt/qt_winrawinputfilter.hpp @@ -37,7 +37,7 @@ #include #include -#include +#include #include diff --git a/src/unix/CMakeLists.txt b/src/unix/CMakeLists.txt index 5fbcf0329..43c730315 100644 --- a/src/unix/CMakeLists.txt +++ b/src/unix/CMakeLists.txt @@ -13,9 +13,11 @@ # # Copyright 2021 Cacodemon345. # Copyright 2021 David Hrdlička. +# Copyright 2021 Andreas J. Reichel. +# Copyright 2021-2022 Jasmine Iwanek. # -add_library(plat OBJECT unix.c) +add_library(plat OBJECT unix.c unix_serial_passthrough.c) if (NOT CPPTHREADS) target_sources(plat PRIVATE unix_thread.c) diff --git a/src/unix/unix_serial_passthrough.c b/src/unix/unix_serial_passthrough.c new file mode 100644 index 000000000..29e4b8317 --- /dev/null +++ b/src/unix/unix_serial_passthrough.c @@ -0,0 +1,314 @@ +/* + * 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. + * + * Definitions for platform specific serial to host passthrough + * + * + * Authors: Andreas J. Reichel , + * Jasmine Iwanek + * + * Copyright 2021 Andreas J. Reichel. + * Copyright 2021-2022 Jasmine Iwanek. + */ + +#ifndef __APPLE__ +# define _XOPEN_SOURCE 500 +# define _DEFAULT_SOURCE 1 +# define _BSD_SOURCE 1 +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +#include <86box/86box.h> +#include <86box/log.h> +#include <86box/plat.h> +#include <86box/device.h> +#include <86box/serial_passthrough.h> +#include <86box/plat_serial_passthrough.h> +#include +#include + +#define LOG_PREFIX "serial_passthrough: " + +int +plat_serpt_read(void *p, uint8_t *data) +{ + serial_passthrough_t *dev = (serial_passthrough_t *) p; + int res; + struct timeval tv; + fd_set rdfds; + + switch (dev->mode) { + case SERPT_MODE_VCON: + case SERPT_MODE_HOSTSER: + FD_ZERO(&rdfds); + FD_SET(dev->master_fd, &rdfds); + tv.tv_sec = 0; + tv.tv_usec = 0; + + res = select(dev->master_fd + 1, &rdfds, NULL, NULL, &tv); + if (res <= 0 || !FD_ISSET(dev->master_fd, &rdfds)) { + return 0; + } + + if (read(dev->master_fd, data, 1) > 0) { + return 1; + } + break; + default: + break; + } + return 0; +} + +void +plat_serpt_close(void *p) +{ + serial_passthrough_t *dev = (serial_passthrough_t *) p; + + if (dev->mode == SERPT_MODE_HOSTSER) { + tcsetattr(dev->master_fd, TCSANOW, (struct termios *) dev->backend_priv); + free(dev->backend_priv); + } + close(dev->master_fd); +} + +static void +plat_serpt_write_vcon(serial_passthrough_t *dev, uint8_t data) +{ + /* fd_set wrfds; + * int res; + */ + + /* We cannot use select here, this would block the hypervisor! */ + /* FD_ZERO(&wrfds); + FD_SET(ctx->master_fd, &wrfds); + + res = select(ctx->master_fd + 1, NULL, &wrfds, NULL, NULL); + + if (res <= 0) { + return; + } + */ + + /* just write it out */ + if (dev->mode == SERPT_MODE_HOSTSER) { + int res = 0; + do { + res = write(dev->master_fd, &data, 1); + } while (res == 0 || (res == -1 && (errno == EAGAIN || res == EWOULDBLOCK))); + } else + write(dev->master_fd, &data, 1); +} + +void +plat_serpt_set_params(void *p) +{ + serial_passthrough_t *dev = (serial_passthrough_t *) p; + + if (dev->mode == SERPT_MODE_HOSTSER) { + struct termios term_attr; + tcgetattr(dev->master_fd, &term_attr); +#define BAUDRATE_RANGE(baud_rate, min, max, val) \ + if (baud_rate >= min && baud_rate < max) { \ + cfsetispeed(&term_attr, val); \ + cfsetospeed(&term_attr, val); \ + } + + BAUDRATE_RANGE(dev->baudrate, 50, 75, B50); + BAUDRATE_RANGE(dev->baudrate, 75, 110, B75); + BAUDRATE_RANGE(dev->baudrate, 110, 134, B110); + BAUDRATE_RANGE(dev->baudrate, 134, 150, B134); + BAUDRATE_RANGE(dev->baudrate, 150, 200, B150); + BAUDRATE_RANGE(dev->baudrate, 200, 300, B200); + BAUDRATE_RANGE(dev->baudrate, 300, 600, B300); + BAUDRATE_RANGE(dev->baudrate, 600, 1200, B600); + BAUDRATE_RANGE(dev->baudrate, 1200, 1800, B1200); + BAUDRATE_RANGE(dev->baudrate, 1800, 2400, B1800); + BAUDRATE_RANGE(dev->baudrate, 2400, 4800, B2400); + BAUDRATE_RANGE(dev->baudrate, 4800, 9600, B4800); + BAUDRATE_RANGE(dev->baudrate, 9600, 19200, B9600); + BAUDRATE_RANGE(dev->baudrate, 19200, 38400, B19200); + BAUDRATE_RANGE(dev->baudrate, 38400, 57600, B38400); + BAUDRATE_RANGE(dev->baudrate, 57600, 115200, B57600); + BAUDRATE_RANGE(dev->baudrate, 115200, 0xFFFFFFFF, B115200); + + term_attr.c_cflag &= CSIZE; + switch (dev->data_bits) { + case 8: + default: + term_attr.c_cflag |= CS8; + break; + case 7: + term_attr.c_cflag |= CS7; + break; + case 6: + term_attr.c_cflag |= CS6; + break; + case 5: + term_attr.c_cflag |= CS5; + break; + } + term_attr.c_cflag &= CSTOPB; + if (dev->serial->lcr & 0x04) + term_attr.c_cflag |= CSTOPB; +#ifdef __APPLE__ + term_attr.c_cflag &= PARENB | PARODD; +#else + term_attr.c_cflag &= PARENB | PARODD | CMSPAR; +#endif + if (dev->serial->lcr & 0x08) { + term_attr.c_cflag |= PARENB; + if (!(dev->serial->lcr & 0x10)) + term_attr.c_cflag |= PARODD; +#ifndef __APPLE__ + if ((dev->serial->lcr & 0x20)) + term_attr.c_cflag |= CMSPAR; +#endif + } + tcsetattr(dev->master_fd, TCSANOW, &term_attr); +#undef BAUDRATE_RANGE + } +} + +void +plat_serpt_write(void *p, uint8_t data) +{ + serial_passthrough_t *dev = (serial_passthrough_t *) p; + + switch (dev->mode) { + case SERPT_MODE_VCON: + case SERPT_MODE_HOSTSER: + plat_serpt_write_vcon(dev, data); + break; + default: + break; + } +} + +static int +open_pseudo_terminal(serial_passthrough_t *dev) +{ + int master_fd = open("/dev/ptmx", O_RDWR | O_NONBLOCK); + char *ptname; + struct termios term_attr_raw; + + if (!master_fd) { + return 0; + } + + /* get name of slave device */ + if (!(ptname = ptsname(master_fd))) { + pclog(LOG_PREFIX "could not get name of slave pseudo terminal"); + close(master_fd); + return 0; + } + memset(dev->slave_pt, 0, sizeof(dev->slave_pt)); + strncpy(dev->slave_pt, ptname, sizeof(dev->slave_pt) - 1); + + fprintf(stderr, LOG_PREFIX "Slave side is %s\n", dev->slave_pt); + + if (grantpt(master_fd)) { + pclog(LOG_PREFIX "error in grantpt()\n"); + close(master_fd); + return 0; + } + + if (unlockpt(master_fd)) { + pclog(LOG_PREFIX "error in unlockpt()\n"); + close(master_fd); + return 0; + } + + tcgetattr(master_fd, &term_attr_raw); + cfmakeraw(&term_attr_raw); + tcsetattr(master_fd, TCSANOW, &term_attr_raw); + + dev->master_fd = master_fd; + + return master_fd; +} + +static int +open_host_serial_port(serial_passthrough_t *dev) +{ + struct termios *term_attr = NULL; + struct termios term_attr_raw = {}; + int fd = open(dev->host_serial_path, O_RDWR | O_NOCTTY | O_NONBLOCK); + if (fd == -1) { + return 0; + } + + if (!isatty(fd)) { + return 0; + } + + term_attr = calloc(1, sizeof(struct termios)); + if (!term_attr) { + close(fd); + return 0; + } + + if (tcgetattr(fd, term_attr) == -1) { + free(term_attr); + close(fd); + return 0; + } + term_attr_raw = *term_attr; + /* "Raw" mode. */ + cfmakeraw(&term_attr_raw); + term_attr_raw.c_cflag &= CSIZE; + switch (dev->data_bits) { + case 8: + default: + term_attr_raw.c_cflag |= CS8; + break; + case 7: + term_attr_raw.c_cflag |= CS7; + break; + case 6: + term_attr_raw.c_cflag |= CS6; + break; + case 5: + term_attr_raw.c_cflag |= CS5; + break; + } + tcsetattr(fd, TCSANOW, &term_attr_raw); + dev->backend_priv = term_attr; + dev->master_fd = fd; + pclog(LOG_PREFIX "Opened host TTY/serial port %s\n", dev->host_serial_path); + return 1; +} + +int +plat_serpt_open_device(void *p) +{ + serial_passthrough_t *dev = (serial_passthrough_t *) p; + + switch (dev->mode) { + case SERPT_MODE_VCON: + if (!open_pseudo_terminal(dev)) { + return 1; + } + break; + case SERPT_MODE_HOSTSER: + if (!open_host_serial_port(dev)) { + return 1; + } + break; + default: + break; + } + return 0; +} diff --git a/src/win/CMakeLists.txt b/src/win/CMakeLists.txt index a0a4c8e14..604ba9bb0 100644 --- a/src/win/CMakeLists.txt +++ b/src/win/CMakeLists.txt @@ -10,13 +10,14 @@ # # Authors: David Hrdlička, # -# Copyright 2020-2021 David Hrdlička. +# Copyright 2020,2021 David Hrdlička. +# Copyright 2021-2022 Jasmine Iwanek. # enable_language(RC) add_library(plat OBJECT win.c win_dynld.c win_cdrom.c win_keyboard.c - win_mouse.c) + win_mouse.c win_serial_passthrough.c) add_library(ui OBJECT win_ui.c win_icon.c win_stbar.c win_sdl.c win_dialog.c win_about.c win_settings.c win_devconf.c win_snd_gain.c win_specify_dim.c win_new_floppy.c diff --git a/src/win/Makefile.mingw b/src/win/Makefile.mingw index 747bbda2d..9dd6af728 100644 --- a/src/win/Makefile.mingw +++ b/src/win/Makefile.mingw @@ -596,7 +596,7 @@ DEVOBJ := bugger.o cartridge.o cassette.o hasp.o hwm.o hwm_lm75.o hwm_lm78.o hwm mouse.o \ mouse_bus.o \ mouse_serial.o mouse_ps2.o \ - phoenix_486_jumper.o + phoenix_486_jumper.o serial_passthrough.o SIOOBJ := sio_acc3221.o sio_ali5123.o \ sio_f82c710.o sio_82091aa.o sio_fdc37c6xx.o \ @@ -749,7 +749,7 @@ VOODOOOBJ := vid_voodoo.o vid_voodoo_banshee.o \ PLATOBJ := win.o \ win_dynld.o \ win_cdrom.o win_keyboard.o \ - win_mouse.o + win_mouse.o win_serial_passthrough.o UIOBJ := win_ui.o win_icon.o win_stbar.o discord.o \ win_sdl.o win_opengl.o win_opengl_glslp.o glad.o \ diff --git a/src/win/languages/cs-CZ.rc b/src/win/languages/cs-CZ.rc index c888fe954..fe8a8a42b 100644 --- a/src/win/languages/cs-CZ.rc +++ b/src/win/languages/cs-CZ.rc @@ -328,6 +328,10 @@ END #define STR_PARALLEL2 "Povolit port LPT2" #define STR_PARALLEL3 "Povolit port LPT3" #define STR_PARALLEL4 "Povolit port LPT4" +#define STR_SERIAL_PASS1 "Serial port passthrough 1" +#define STR_SERIAL_PASS2 "Serial port passthrough 2" +#define STR_SERIAL_PASS3 "Serial port passthrough 3" +#define STR_SERIAL_PASS4 "Serial port passthrough 4" #define STR_HDC "Řadič disku:" #define STR_FDC "Disketový řadič:" diff --git a/src/win/languages/de-DE.rc b/src/win/languages/de-DE.rc index 3768898a5..58d799539 100644 --- a/src/win/languages/de-DE.rc +++ b/src/win/languages/de-DE.rc @@ -328,6 +328,10 @@ END #define STR_PARALLEL2 "Parallelport 2" #define STR_PARALLEL3 "Parallelport 3" #define STR_PARALLEL4 "Parallelport 4" +#define STR_SERIAL_PASS1 "Serial port passthrough 1" +#define STR_SERIAL_PASS2 "Serial port passthrough 2" +#define STR_SERIAL_PASS3 "Serial port passthrough 3" +#define STR_SERIAL_PASS4 "Serial port passthrough 4" #define STR_HDC "HDD-Controller:" #define STR_FDC "FD-Controller:" diff --git a/src/win/languages/dialogs.rc b/src/win/languages/dialogs.rc index 5a150324c..1facfb10d 100644 --- a/src/win/languages/dialogs.rc +++ b/src/win/languages/dialogs.rc @@ -453,54 +453,78 @@ BEGIN CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP LTEXT STR_LPT2, IDT_LPT2, - CFG_HMARGIN, 28, CFG_PANE_LTEXT_PRI_WIDTH, CFG_PANE_LTEXT_HEIGHT + CFG_HMARGIN, 24, CFG_PANE_LTEXT_PRI_WIDTH, CFG_PANE_LTEXT_HEIGHT COMBOBOX IDC_COMBO_LPT2, - CFG_COMBO_BOX_LEFT, 26, CFG_COMBO_NOBTN_WIDTH, CFG_COMBO_HEIGHT, + CFG_COMBO_BOX_LEFT, 22, CFG_COMBO_NOBTN_WIDTH, CFG_COMBO_HEIGHT, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP LTEXT STR_LPT3, IDT_LPT3, - CFG_HMARGIN, 47, CFG_PANE_LTEXT_PRI_WIDTH, CFG_PANE_LTEXT_HEIGHT + CFG_HMARGIN, 39, CFG_PANE_LTEXT_PRI_WIDTH, CFG_PANE_LTEXT_HEIGHT COMBOBOX IDC_COMBO_LPT3, - CFG_COMBO_BOX_LEFT, 45, CFG_COMBO_NOBTN_WIDTH, CFG_COMBO_HEIGHT, + CFG_COMBO_BOX_LEFT, 37, CFG_COMBO_NOBTN_WIDTH, CFG_COMBO_HEIGHT, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP LTEXT STR_LPT4, IDT_LPT4, - CFG_HMARGIN, 66, CFG_PANE_LTEXT_PRI_WIDTH, CFG_PANE_LTEXT_HEIGHT + CFG_HMARGIN, 54, CFG_PANE_LTEXT_PRI_WIDTH, CFG_PANE_LTEXT_HEIGHT COMBOBOX IDC_COMBO_LPT4, - CFG_COMBO_BOX_LEFT, 64, CFG_COMBO_NOBTN_WIDTH, CFG_COMBO_HEIGHT, + CFG_COMBO_BOX_LEFT, 52, CFG_COMBO_NOBTN_WIDTH, CFG_COMBO_HEIGHT, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP CONTROL STR_SERIAL1, IDC_CHECK_SERIAL1, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, - CFG_HMARGIN, 83, CFG_CHECKBOX_PRI_WIDTH, CFG_CHECKBOX_HEIGHT + CFG_HMARGIN, 71, CFG_CHECKBOX_PRI_WIDTH, CFG_CHECKBOX_HEIGHT CONTROL STR_SERIAL2, IDC_CHECK_SERIAL2, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, - CFG_HMARGIN, 102, CFG_CHECKBOX_PRI_WIDTH, CFG_CHECKBOX_HEIGHT + CFG_HMARGIN, 86, CFG_CHECKBOX_PRI_WIDTH, CFG_CHECKBOX_HEIGHT CONTROL STR_SERIAL3, IDC_CHECK_SERIAL3, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, - CFG_HMARGIN, 121, CFG_CHECKBOX_PRI_WIDTH, CFG_CHECKBOX_HEIGHT + CFG_HMARGIN, 101, CFG_CHECKBOX_PRI_WIDTH, CFG_CHECKBOX_HEIGHT CONTROL STR_SERIAL4, IDC_CHECK_SERIAL4, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, - CFG_HMARGIN, 140, CFG_CHECKBOX_PRI_WIDTH, CFG_CHECKBOX_HEIGHT + CFG_HMARGIN, 116, CFG_CHECKBOX_PRI_WIDTH, CFG_CHECKBOX_HEIGHT CONTROL STR_PARALLEL1, IDC_CHECK_PARALLEL1, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, - 167, 83, CFG_CHECKBOX_PRI_WIDTH, CFG_CHECKBOX_HEIGHT + 167, 71, CFG_CHECKBOX_PRI_WIDTH, CFG_CHECKBOX_HEIGHT CONTROL STR_PARALLEL2, IDC_CHECK_PARALLEL2, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, - 167, 102, CFG_CHECKBOX_PRI_WIDTH, CFG_CHECKBOX_HEIGHT + 167, 86, CFG_CHECKBOX_PRI_WIDTH, CFG_CHECKBOX_HEIGHT CONTROL STR_PARALLEL3, IDC_CHECK_PARALLEL3, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, - 167, 121, CFG_CHECKBOX_PRI_WIDTH, CFG_CHECKBOX_HEIGHT + 167, 101, CFG_CHECKBOX_PRI_WIDTH, CFG_CHECKBOX_HEIGHT CONTROL STR_PARALLEL4, IDC_CHECK_PARALLEL4, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, - 167, 140, CFG_CHECKBOX_PRI_WIDTH, CFG_CHECKBOX_HEIGHT + 167, 116, CFG_CHECKBOX_PRI_WIDTH, CFG_CHECKBOX_HEIGHT + + CONTROL STR_SERIAL_PASS1, IDC_CHECK_SERIAL_PASS1, + "Button", BS_AUTOCHECKBOX | WS_TABSTOP, + CFG_HMARGIN, 134, CFG_CHECKBOX_PRI_WIDTH, CFG_CHECKBOX_HEIGHT + PUSHBUTTON STR_CONFIGURE, IDC_CONFIGURE_SERIAL_PASS1, + CFG_COMBO_BTN_LEFT, 131, CFG_BTN_WIDTH, CFG_BTN_HEIGHT + + CONTROL STR_SERIAL_PASS2, IDC_CHECK_SERIAL_PASS2, + "Button", BS_AUTOCHECKBOX | WS_TABSTOP, + CFG_HMARGIN, 150, CFG_CHECKBOX_PRI_WIDTH, CFG_CHECKBOX_HEIGHT + PUSHBUTTON STR_CONFIGURE, IDC_CONFIGURE_SERIAL_PASS2, + CFG_COMBO_BTN_LEFT, 147, CFG_BTN_WIDTH, CFG_BTN_HEIGHT + + CONTROL STR_SERIAL_PASS3, IDC_CHECK_SERIAL_PASS3, + "Button", BS_AUTOCHECKBOX | WS_TABSTOP, + CFG_HMARGIN, 165, CFG_CHECKBOX_PRI_WIDTH, CFG_CHECKBOX_HEIGHT + PUSHBUTTON STR_CONFIGURE, IDC_CONFIGURE_SERIAL_PASS3, + CFG_COMBO_BTN_LEFT, 162, CFG_BTN_WIDTH, CFG_BTN_HEIGHT + + CONTROL STR_SERIAL_PASS4, IDC_CHECK_SERIAL_PASS4, + "Button", BS_AUTOCHECKBOX | WS_TABSTOP, + CFG_HMARGIN, 180, CFG_CHECKBOX_PRI_WIDTH, CFG_CHECKBOX_HEIGHT + PUSHBUTTON STR_CONFIGURE, IDC_CONFIGURE_SERIAL_PASS4, + CFG_COMBO_BTN_LEFT, 177, CFG_BTN_WIDTH, CFG_BTN_HEIGHT END DLG_CFG_STORAGE DIALOG DISCARDABLE CFG_PANE_LEFT, CFG_PANE_TOP, CFG_PANE_WIDTH, CFG_PANE_HEIGHT @@ -996,6 +1020,10 @@ END #undef STR_PARALLEL2 #undef STR_PARALLEL3 #undef STR_PARALLEL4 +#undef STR_SERIAL_PASS1 +#undef STR_SERIAL_PASS2 +#undef STR_SERIAL_PASS3 +#undef STR_SERIAL_PASS4 #undef STR_HDC #undef STR_FDC diff --git a/src/win/languages/en-GB.rc b/src/win/languages/en-GB.rc index a16c7977f..005a8fc9c 100644 --- a/src/win/languages/en-GB.rc +++ b/src/win/languages/en-GB.rc @@ -328,6 +328,10 @@ END #define STR_PARALLEL2 "Parallel port 2" #define STR_PARALLEL3 "Parallel port 3" #define STR_PARALLEL4 "Parallel port 4" +#define STR_SERIAL_PASS1 "Serial port passthrough 1" +#define STR_SERIAL_PASS2 "Serial port passthrough 2" +#define STR_SERIAL_PASS3 "Serial port passthrough 3" +#define STR_SERIAL_PASS4 "Serial port passthrough 4" #define STR_HDC "HD Controller:" #define STR_FDC "FD Controller:" diff --git a/src/win/languages/en-US.rc b/src/win/languages/en-US.rc index 42070879d..dcda2a1b4 100644 --- a/src/win/languages/en-US.rc +++ b/src/win/languages/en-US.rc @@ -328,6 +328,10 @@ END #define STR_PARALLEL2 "Parallel port 2" #define STR_PARALLEL3 "Parallel port 3" #define STR_PARALLEL4 "Parallel port 4" +#define STR_SERIAL_PASS1 "Serial port passthrough 1" +#define STR_SERIAL_PASS2 "Serial port passthrough 2" +#define STR_SERIAL_PASS3 "Serial port passthrough 3" +#define STR_SERIAL_PASS4 "Serial port passthrough 4" #define STR_HDC "HD Controller:" #define STR_FDC "FD Controller:" diff --git a/src/win/languages/es-ES.rc b/src/win/languages/es-ES.rc index 8be2db827..112d5d89e 100644 --- a/src/win/languages/es-ES.rc +++ b/src/win/languages/es-ES.rc @@ -328,6 +328,10 @@ END #define STR_PARALLEL2 "Puerto paralelo 2" #define STR_PARALLEL3 "Puerto paralelo 3" #define STR_PARALLEL4 "Puerto paralelo 4" +#define STR_SERIAL_PASS1 "Serial port passthrough 1" +#define STR_SERIAL_PASS2 "Serial port passthrough 2" +#define STR_SERIAL_PASS3 "Serial port passthrough 3" +#define STR_SERIAL_PASS4 "Serial port passthrough 4" #define STR_HDC "Controladora HD:" #define STR_FDC "Controladora FD:" diff --git a/src/win/languages/fi-FI.rc b/src/win/languages/fi-FI.rc index 9f2f14187..5494bffc5 100644 --- a/src/win/languages/fi-FI.rc +++ b/src/win/languages/fi-FI.rc @@ -328,6 +328,10 @@ END #define STR_PARALLEL2 "Rinnakkaisportti 2" #define STR_PARALLEL3 "Rinnakkaisportti 3" #define STR_PARALLEL4 "Rinnakkaisportti 4" +#define STR_SERIAL_PASS1 "Serial port passthrough 1" +#define STR_SERIAL_PASS2 "Serial port passthrough 2" +#define STR_SERIAL_PASS3 "Serial port passthrough 3" +#define STR_SERIAL_PASS4 "Serial port passthrough 4" #define STR_HDC "Kiintolevyohjain:" #define STR_FDC "Levykeohjain:" diff --git a/src/win/languages/fr-FR.rc b/src/win/languages/fr-FR.rc index fcd4d480a..970b4db01 100644 --- a/src/win/languages/fr-FR.rc +++ b/src/win/languages/fr-FR.rc @@ -328,6 +328,10 @@ END #define STR_PARALLEL2 "Port parallèle 2" #define STR_PARALLEL3 "Port parallèle 3" #define STR_PARALLEL4 "Port parallèle 4" +#define STR_SERIAL_PASS1 "Serial port passthrough 1" +#define STR_SERIAL_PASS2 "Serial port passthrough 2" +#define STR_SERIAL_PASS3 "Serial port passthrough 3" +#define STR_SERIAL_PASS4 "Serial port passthrough 4" #define STR_HDC "Contrôleur HD:" #define STR_FDC "Contrôleur FD:" diff --git a/src/win/languages/hr-HR.rc b/src/win/languages/hr-HR.rc index fe0f9dad5..7afb7b26d 100644 --- a/src/win/languages/hr-HR.rc +++ b/src/win/languages/hr-HR.rc @@ -328,6 +328,10 @@ END #define STR_PARALLEL2 "Paralelna vrata 2" #define STR_PARALLEL3 "Paralelna vrata 3" #define STR_PARALLEL4 "Paralelna vrata 4" +#define STR_SERIAL_PASS1 "Serial port passthrough 1" +#define STR_SERIAL_PASS2 "Serial port passthrough 2" +#define STR_SERIAL_PASS3 "Serial port passthrough 3" +#define STR_SERIAL_PASS4 "Serial port passthrough 4" #define STR_HDC "Kontroler tvrdog diska:" #define STR_FDC "Kontroler diskete:" diff --git a/src/win/languages/hu-HU.rc b/src/win/languages/hu-HU.rc index f23e3c35a..81fc034c4 100644 --- a/src/win/languages/hu-HU.rc +++ b/src/win/languages/hu-HU.rc @@ -333,6 +333,10 @@ END #define STR_PARALLEL2 "Párhuzamos port 2" #define STR_PARALLEL3 "Párhuzamos port 3" #define STR_PARALLEL4 "Párhuzamos port 4" +#define STR_SERIAL_PASS1 "Serial port passthrough 1" +#define STR_SERIAL_PASS2 "Serial port passthrough 2" +#define STR_SERIAL_PASS3 "Serial port passthrough 3" +#define STR_SERIAL_PASS4 "Serial port passthrough 4" #define STR_HDC "Merevl.-vezérlő:" #define STR_FDC "Floppy-vezérlő:" diff --git a/src/win/languages/it-IT.rc b/src/win/languages/it-IT.rc index 6335c690f..fd0441232 100644 --- a/src/win/languages/it-IT.rc +++ b/src/win/languages/it-IT.rc @@ -329,6 +329,10 @@ END #define STR_PARALLEL2 "Porta parallela 2" #define STR_PARALLEL3 "Porta parallela 3" #define STR_PARALLEL4 "Porta parallela 4" +#define STR_SERIAL_PASS1 "Serial port passthrough 1" +#define STR_SERIAL_PASS2 "Serial port passthrough 2" +#define STR_SERIAL_PASS3 "Serial port passthrough 3" +#define STR_SERIAL_PASS4 "Serial port passthrough 4" #define STR_HDC "Controller HD:" #define STR_FDC "Controller FD:" diff --git a/src/win/languages/ja-JP.rc b/src/win/languages/ja-JP.rc index 1de5e1f42..c1e0ee463 100644 --- a/src/win/languages/ja-JP.rc +++ b/src/win/languages/ja-JP.rc @@ -328,6 +328,10 @@ END #define STR_PARALLEL2 "パラレルポート2" #define STR_PARALLEL3 "パラレルポート3" #define STR_PARALLEL4 "パラレルポート4" +#define STR_SERIAL_PASS1 "Serial port passthrough 1" +#define STR_SERIAL_PASS2 "Serial port passthrough 2" +#define STR_SERIAL_PASS3 "Serial port passthrough 3" +#define STR_SERIAL_PASS4 "Serial port passthrough 4" #define STR_HDC "HDコントローラー:" #define STR_FDC "FDコントローラー:" diff --git a/src/win/languages/ko-KR.rc b/src/win/languages/ko-KR.rc index b96e21fa1..d43056478 100644 --- a/src/win/languages/ko-KR.rc +++ b/src/win/languages/ko-KR.rc @@ -328,6 +328,10 @@ END #define STR_PARALLEL2 "병렬 포트 2" #define STR_PARALLEL3 "병렬 포트 3" #define STR_PARALLEL4 "병렬 포트 4" +#define STR_SERIAL_PASS1 "Serial port passthrough 1" +#define STR_SERIAL_PASS2 "Serial port passthrough 2" +#define STR_SERIAL_PASS3 "Serial port passthrough 3" +#define STR_SERIAL_PASS4 "Serial port passthrough 4" #define STR_HDC "HD 컨트롤러:" #define STR_FDC "FD 컨트롤러:" diff --git a/src/win/languages/pl-PL.rc b/src/win/languages/pl-PL.rc index e4e6a4963..343ca929b 100644 --- a/src/win/languages/pl-PL.rc +++ b/src/win/languages/pl-PL.rc @@ -328,6 +328,10 @@ END #define STR_PARALLEL2 "Port równoległy 2" #define STR_PARALLEL3 "Port równoległy 3" #define STR_PARALLEL4 "Port równoległy 4" +#define STR_SERIAL_PASS1 "Serial port passthrough 1" +#define STR_SERIAL_PASS2 "Serial port passthrough 2" +#define STR_SERIAL_PASS3 "Serial port passthrough 3" +#define STR_SERIAL_PASS4 "Serial port passthrough 4" #define STR_HDC "Kontroler dysku twardego:" #define STR_FDC "Kontroler dyskietek:" diff --git a/src/win/languages/pt-BR.rc b/src/win/languages/pt-BR.rc index 7a08080bc..104c3648e 100644 --- a/src/win/languages/pt-BR.rc +++ b/src/win/languages/pt-BR.rc @@ -331,6 +331,10 @@ END #define STR_PARALLEL2 "Porta paralela 2" #define STR_PARALLEL3 "Porta paralela 3" #define STR_PARALLEL4 "Porta paralela 4" +#define STR_SERIAL_PASS1 "Serial port passthrough 1" +#define STR_SERIAL_PASS2 "Serial port passthrough 2" +#define STR_SERIAL_PASS3 "Serial port passthrough 3" +#define STR_SERIAL_PASS4 "Serial port passthrough 4" #define STR_HDC "Controlador HD:" #define STR_FDC "Controlador FD:" diff --git a/src/win/languages/pt-PT.rc b/src/win/languages/pt-PT.rc index 74968da02..31c68fbd0 100644 --- a/src/win/languages/pt-PT.rc +++ b/src/win/languages/pt-PT.rc @@ -328,6 +328,10 @@ END #define STR_PARALLEL2 "Porta paralela 2" #define STR_PARALLEL3 "Porta paralela 3" #define STR_PARALLEL4 "Porta paralela 4" +#define STR_SERIAL_PASS1 "Serial port passthrough 1" +#define STR_SERIAL_PASS2 "Serial port passthrough 2" +#define STR_SERIAL_PASS3 "Serial port passthrough 3" +#define STR_SERIAL_PASS4 "Serial port passthrough 4" #define STR_HDC "Controlador HD:" #define STR_FDC "Controlador FD:" diff --git a/src/win/languages/ru-RU.rc b/src/win/languages/ru-RU.rc index 790738148..8ae6b20b6 100644 --- a/src/win/languages/ru-RU.rc +++ b/src/win/languages/ru-RU.rc @@ -328,6 +328,10 @@ END #define STR_PARALLEL2 "Параллельный порт LPT2" #define STR_PARALLEL3 "Параллельный порт LPT3" #define STR_PARALLEL4 "Параллельный порт LPT4" +#define STR_SERIAL_PASS1 "Serial port passthrough 1" +#define STR_SERIAL_PASS2 "Serial port passthrough 2" +#define STR_SERIAL_PASS3 "Serial port passthrough 3" +#define STR_SERIAL_PASS4 "Serial port passthrough 4" #define STR_HDC "Контроллер HD:" #define STR_FDC "Контроллер FD:" diff --git a/src/win/languages/sl-SI.rc b/src/win/languages/sl-SI.rc index 317cf51b8..f1badf570 100644 --- a/src/win/languages/sl-SI.rc +++ b/src/win/languages/sl-SI.rc @@ -328,6 +328,10 @@ END #define STR_PARALLEL2 "Paralelna vrata 2" #define STR_PARALLEL3 "Paralelna vrata 3" #define STR_PARALLEL4 "Paralelna vrata 4" +#define STR_SERIAL_PASS1 "Serial port passthrough 1" +#define STR_SERIAL_PASS2 "Serial port passthrough 2" +#define STR_SERIAL_PASS3 "Serial port passthrough 3" +#define STR_SERIAL_PASS4 "Serial port passthrough 4" #define STR_HDC "Krmilnik trdega diska:" #define STR_FDC "Krmilnik disketnika:" diff --git a/src/win/languages/tr-TR.rc b/src/win/languages/tr-TR.rc index 04a0f9abc..a168d2f30 100644 --- a/src/win/languages/tr-TR.rc +++ b/src/win/languages/tr-TR.rc @@ -328,6 +328,10 @@ END #define STR_PARALLEL2 "Paralel port 2" #define STR_PARALLEL3 "Paralel port 3" #define STR_PARALLEL4 "Paralel port 4" +#define STR_SERIAL_PASS1 "Serial port passthrough 1" +#define STR_SERIAL_PASS2 "Serial port passthrough 2" +#define STR_SERIAL_PASS3 "Serial port passthrough 3" +#define STR_SERIAL_PASS4 "Serial port passthrough 4" #define STR_HDC "HD Kontrolcüsü:" #define STR_FDC "FD Kontrolcüsü:" diff --git a/src/win/languages/uk-UA.rc b/src/win/languages/uk-UA.rc index d8c5f1106..db2604860 100644 --- a/src/win/languages/uk-UA.rc +++ b/src/win/languages/uk-UA.rc @@ -328,6 +328,10 @@ END #define STR_PARALLEL2 "Паралельний порт LPT2" #define STR_PARALLEL3 "Паралельний порт LPT3" #define STR_PARALLEL4 "Паралельний порт LPT4" +#define STR_SERIAL_PASS1 "Serial port passthrough 1" +#define STR_SERIAL_PASS2 "Serial port passthrough 2" +#define STR_SERIAL_PASS3 "Serial port passthrough 3" +#define STR_SERIAL_PASS4 "Serial port passthrough 4" #define STR_HDC "Контролер HD:" #define STR_FDC "Контролер FD:" diff --git a/src/win/languages/zh-CN.rc b/src/win/languages/zh-CN.rc index 72d67e880..f72177a81 100644 --- a/src/win/languages/zh-CN.rc +++ b/src/win/languages/zh-CN.rc @@ -328,6 +328,10 @@ END #define STR_PARALLEL2 "并口 2" #define STR_PARALLEL3 "并口 3" #define STR_PARALLEL4 "并口 4" +#define STR_SERIAL_PASS1 "Serial port passthrough 1" +#define STR_SERIAL_PASS2 "Serial port passthrough 2" +#define STR_SERIAL_PASS3 "Serial port passthrough 3" +#define STR_SERIAL_PASS4 "Serial port passthrough 4" #define STR_HDC "硬盘控制器:" #define STR_FDC "软盘控制器:" diff --git a/src/win/languages/zh-TW.rc b/src/win/languages/zh-TW.rc index 9cbb7c70e..6c2d87545 100644 --- a/src/win/languages/zh-TW.rc +++ b/src/win/languages/zh-TW.rc @@ -328,6 +328,10 @@ END #define STR_PARALLEL2 "並列埠 2" #define STR_PARALLEL3 "並列埠 3" #define STR_PARALLEL4 "並列埠 4" +#define STR_SERIAL_PASS1 "Serial port passthrough 1" +#define STR_SERIAL_PASS2 "Serial port passthrough 2" +#define STR_SERIAL_PASS3 "Serial port passthrough 3" +#define STR_SERIAL_PASS4 "Serial port passthrough 4" #define STR_HDC "硬碟控制器:" #define STR_FDC "軟碟控制器:" diff --git a/src/win/win_opengl.c b/src/win/win_opengl.c index 586632aaa..1de065855 100644 --- a/src/win/win_opengl.c +++ b/src/win/win_opengl.c @@ -36,7 +36,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #define UNICODE -#include +#include #include #include #include diff --git a/src/win/win_serial_passthrough.c b/src/win/win_serial_passthrough.c new file mode 100644 index 000000000..bf7ce7f98 --- /dev/null +++ b/src/win/win_serial_passthrough.c @@ -0,0 +1,223 @@ +/* + * 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. + * + * Definitions for platform specific serial to host passthrough + * + * + * Authors: Andreas J. Reichel , + * Jasmine Iwanek + * + * Copyright 2021 Andreas J. Reichel + * Copyright 2021-2022 Jasmine Iwanek + */ + +#define _XOPEN_SOURCE 500 +#include +#include +#include +#include +#include + +#include <86box/86box.h> +#include <86box/log.h> +#include <86box/timer.h> +#include <86box/plat.h> +#include <86box/device.h> +#include <86box/serial_passthrough.h> +#include <86box/plat_serial_passthrough.h> + +#include + +#define LOG_PREFIX "serial_passthrough: " + +void +plat_serpt_close(void *p) +{ + serial_passthrough_t *dev = (serial_passthrough_t *) p; + + // fclose(dev->master_fd); + FlushFileBuffers((HANDLE) dev->master_fd); + if (dev->mode == SERPT_MODE_VCON) + DisconnectNamedPipe((HANDLE) dev->master_fd); + if (dev->mode == SERPT_MODE_HOSTSER) { + SetCommState((HANDLE)dev->master_fd, (DCB*)dev->backend_priv); + free(dev->backend_priv); + } + CloseHandle((HANDLE) dev->master_fd); +} + +static void +plat_serpt_write_vcon(serial_passthrough_t *dev, uint8_t data) +{ + /* fd_set wrfds; + * int res; + */ + + /* We cannot use select here, this would block the hypervisor! */ + /* FD_ZERO(&wrfds); + FD_SET(ctx->master_fd, &wrfds); + + res = select(ctx->master_fd + 1, NULL, &wrfds, NULL, NULL); + + if (res <= 0) { + return; + } + */ + + /* just write it out */ + // fwrite(dev->master_fd, &data, 1); + DWORD bytesWritten = 0; + WriteFile((HANDLE) dev->master_fd, &data, 1, &bytesWritten, NULL); + if (bytesWritten == 0) { + fatal("serial_passthrough: WriteFile pipe write-buffer full!"); + } +} + +void +plat_serpt_set_params(void *p) +{ + serial_passthrough_t *dev = (serial_passthrough_t *)p; + + if (dev->mode == SERPT_MODE_HOSTSER) { + DCB serialattr = {}; + GetCommState((HANDLE)dev->master_fd, &serialattr); +#define BAUDRATE_RANGE(baud_rate, min, max) if (baud_rate >= min && baud_rate < max) { serialattr.BaudRate = min; } + + BAUDRATE_RANGE(dev->baudrate, 110, 300); + BAUDRATE_RANGE(dev->baudrate, 300, 600); + BAUDRATE_RANGE(dev->baudrate, 600, 1200); + BAUDRATE_RANGE(dev->baudrate, 1200, 2400); + BAUDRATE_RANGE(dev->baudrate, 2400, 4800); + BAUDRATE_RANGE(dev->baudrate, 4800, 9600); + BAUDRATE_RANGE(dev->baudrate, 9600, 14400); + BAUDRATE_RANGE(dev->baudrate, 14400, 19200); + BAUDRATE_RANGE(dev->baudrate, 19200, 38400); + BAUDRATE_RANGE(dev->baudrate, 38400, 57600); + BAUDRATE_RANGE(dev->baudrate, 57600, 115200); + BAUDRATE_RANGE(dev->baudrate, 115200, 0xFFFFFFFF); + + serialattr.ByteSize = dev->data_bits; + serialattr.StopBits = (dev->serial->lcr & 0x04) ? TWOSTOPBITS : ONESTOPBIT; + if (!(dev->serial->lcr & 0x08)) { + serialattr.fParity = 0; + serialattr.Parity = NOPARITY; + } else { + serialattr.fParity = 1; + if (dev->serial->lcr & 0x20) { + serialattr.Parity = (MARKPARITY) + !!(dev->serial->lcr & 0x10); + } else { + serialattr.Parity = (ODDPARITY) + !!(dev->serial->lcr & 0x10); + } + } + + SetCommState((HANDLE)dev->master_fd, &serialattr); +#undef BAUDRATE_RANGE + } +} + +void +plat_serpt_write(void *p, uint8_t data) +{ + serial_passthrough_t *dev = (serial_passthrough_t *) p; + + switch (dev->mode) { + case SERPT_MODE_VCON: + case SERPT_MODE_HOSTSER: + plat_serpt_write_vcon(dev, data); + break; + default: + break; + } +} + +uint8_t +plat_serpt_read_vcon(serial_passthrough_t *dev, uint8_t *data) +{ + DWORD bytesRead = 0; + ReadFile((HANDLE) dev->master_fd, data, 1, &bytesRead, NULL); + return !!bytesRead; +} + +int +plat_serpt_read(void *p, uint8_t *data) +{ + serial_passthrough_t *dev = (serial_passthrough_t *) p; + int res = 0; + + switch (dev->mode) { + case SERPT_MODE_VCON: + case SERPT_MODE_HOSTSER: + res = plat_serpt_read_vcon(dev, data); + break; + default: + break; + } + return res; +} + +static int +open_pseudo_terminal(serial_passthrough_t *dev) +{ + char ascii_pipe_name[1024] = { 0 }; + snprintf(ascii_pipe_name, sizeof(ascii_pipe_name), "\\\\.\\pipe\\86Box\\%s", vm_name); + dev->master_fd = (intptr_t) CreateNamedPipeA(ascii_pipe_name, PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_NOWAIT, 32, 65536, 65536, NMPWAIT_USE_DEFAULT_WAIT, NULL); + if (dev->master_fd == (intptr_t) INVALID_HANDLE_VALUE) { + return 0; + } + pclog("Named Pipe @ %s\n", ascii_pipe_name); + return 1; +} + +static int +open_host_serial_port(serial_passthrough_t *dev) +{ + COMMTIMEOUTS timeouts = { + .ReadIntervalTimeout = MAXDWORD, + .ReadTotalTimeoutConstant = 0, + .ReadTotalTimeoutMultiplier = 0, + .WriteTotalTimeoutMultiplier = 0, + .WriteTotalTimeoutConstant = 1000 + }; + DCB* serialattr = calloc(1, sizeof(DCB)); + if (!serialattr) return 0; + dev->master_fd = (intptr_t) CreateFileA(dev->host_serial_path, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); + if (dev->master_fd == (intptr_t) INVALID_HANDLE_VALUE) { + free(serialattr); + return 0; + } + if (!SetCommTimeouts((HANDLE) dev->master_fd, &timeouts)) { + pclog(LOG_PREFIX "error setting COM port timeouts.\n"); + CloseHandle((HANDLE) dev->master_fd); + free(serialattr); + return 0; + } + GetCommState((HANDLE)dev->master_fd, serialattr); + dev->backend_priv = serialattr; + return 1; +} + +int +plat_serpt_open_device(void *p) +{ + serial_passthrough_t *dev = (serial_passthrough_t *) p; + + switch (dev->mode) { + case SERPT_MODE_VCON: + if (open_pseudo_terminal(dev)) { + return 0; + } + break; + case SERPT_MODE_HOSTSER: + if (open_host_serial_port(dev)) { + return 0; + } + default: + break; + } + return 1; +} diff --git a/src/win/win_settings.c b/src/win/win_settings.c index 07822f28b..4901b283c 100644 --- a/src/win/win_settings.c +++ b/src/win/win_settings.c @@ -71,6 +71,7 @@ #include <86box/plat.h> #include <86box/ui.h> #include <86box/win.h> +#include <86box/serial_passthrough.h> #include "../disk/minivhd/minivhd.h" #include "../disk/minivhd/minivhd_util.h" @@ -111,6 +112,7 @@ static char temp_pcap_dev[NET_CARD_MAX][128]; /* Ports category */ static int temp_lpt_devices[PARALLEL_MAX]; static int temp_serial[SERIAL_MAX], temp_lpt[PARALLEL_MAX]; +static int temp_serial_passthrough_enabled[SERIAL_MAX]; /* Other peripherals category */ static int temp_fdc_card, temp_hdc, temp_ide_ter, temp_ide_qua, temp_cassette; @@ -358,11 +360,13 @@ win_settings_init(void) /* Ports category */ for (i = 0; i < PARALLEL_MAX; i++) { - temp_lpt_devices[i] = lpt_ports[i].device; - temp_lpt[i] = lpt_ports[i].enabled; + temp_lpt_devices[i] = lpt_ports[i].device; + temp_lpt[i] = lpt_ports[i].enabled; + } + for (i = 0; i < SERIAL_MAX; i++) { + temp_serial[i] = com_ports[i].enabled; + temp_serial_passthrough_enabled[i] = serial_passthrough_enabled[i]; } - for (i = 0; i < SERIAL_MAX; i++) - temp_serial[i] = com_ports[i].enabled; /* Storage devices category */ for (i = 0; i < SCSI_BUS_MAX; i++) @@ -484,8 +488,10 @@ win_settings_changed(void) i = i || (temp_lpt_devices[j] != lpt_ports[j].device); i = i || (temp_lpt[j] != lpt_ports[j].enabled); } - for (j = 0; j < SERIAL_MAX; j++) + for (j = 0; j < SERIAL_MAX; j++) { i = i || (temp_serial[j] != com_ports[j].enabled); + i = i || (temp_serial_passthrough_enabled[i] != serial_passthrough_enabled[i]); + } /* Storage devices category */ for (j = 0; j < SCSI_BUS_MAX; j++) @@ -578,8 +584,10 @@ win_settings_save(void) lpt_ports[i].device = temp_lpt_devices[i]; lpt_ports[i].enabled = temp_lpt[i]; } - for (i = 0; i < SERIAL_MAX; i++) + for (i = 0; i < SERIAL_MAX; i++) { com_ports[i].enabled = temp_serial[i]; + serial_passthrough_enabled[i] = temp_serial_passthrough_enabled[i]; + } /* Storage devices category */ for (i = 0; i < SCSI_BUS_MAX; i++) @@ -1764,8 +1772,10 @@ win_settings_ports_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) settings_enable_window(hdlg, IDC_COMBO_LPT1 + i, temp_lpt[i]); } - for (i = 0; i < SERIAL_MAX; i++) + for (i = 0; i < SERIAL_MAX; i++) { settings_set_check(hdlg, IDC_CHECK_SERIAL1 + i, temp_serial[i]); + settings_set_check(hdlg, IDC_CHECK_SERIAL_PASS1 + i, temp_serial_passthrough_enabled[i]); + } free(lptsTemp); @@ -1790,8 +1800,10 @@ win_settings_ports_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) temp_lpt[i] = settings_get_check(hdlg, IDC_CHECK_PARALLEL1 + i); } - for (i = 0; i < SERIAL_MAX; i++) + for (i = 0; i < SERIAL_MAX; i++) { temp_serial[i] = settings_get_check(hdlg, IDC_CHECK_SERIAL1 + i); + temp_serial_passthrough_enabled[i] = settings_get_check(hdlg, IDC_CHECK_SERIAL_PASS1 + i); + } default: return FALSE; diff --git a/src/win/win_toolbar.c b/src/win/win_toolbar.c index fade8d25e..6b1edefb2 100644 --- a/src/win/win_toolbar.c +++ b/src/win/win_toolbar.c @@ -2,8 +2,8 @@ #include #include #include -#include -#include +#include +#include #include <86box/86box.h> #include <86box/plat.h> #include <86box/resource.h> From 0ed4548aeb2fa7af3a5da3bdb70554ed67dc5c90 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 15 Feb 2023 14:32:47 +0100 Subject: [PATCH 239/285] Fixed warnings in device/serial_passthrough.c. --- src/device/serial_passthrough.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/device/serial_passthrough.c b/src/device/serial_passthrough.c index 6025f264a..b5026f9b6 100644 --- a/src/device/serial_passthrough.c +++ b/src/device/serial_passthrough.c @@ -62,12 +62,6 @@ serial_passthrough_init(void) } } -static void -serial_passthrough_timers_off(serial_passthrough_t *dev) -{ - timer_stop(&dev->host_to_serial_timer); -} - static void serial_passthrough_write(serial_t *s, void *priv, uint8_t val) { @@ -182,7 +176,7 @@ serial_passthrough_dev_init(const device_t *info) dev->serial = serial_attach_ex(dev->port, serial_passthrough_rcr_cb, serial_passthrough_write, serial_passthrough_transmit_period, serial_passthrough_lcr_callback, dev); - strncpy(dev->host_serial_path, device_get_config_string("host_serial_path"), 1024); + strncpy(dev->host_serial_path, device_get_config_string("host_serial_path"), 1023); serial_passthrough_log("%s: port=COM%d\n", info->name, dev->port + 1); serial_passthrough_log("%s: baud=%f\n", info->name, dev->baudrate); From 9d59f72f0b088b59b54c09d8c5390094c958f461 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 15 Feb 2023 16:00:46 +0100 Subject: [PATCH 240/285] Rewrote the serial port receiver FIFO. --- src/device/serial.c | 204 +++++++++++++++++++++++++++---------- src/include/86box/serial.h | 9 +- 2 files changed, 155 insertions(+), 58 deletions(-) diff --git a/src/device/serial.c b/src/device/serial.c index 7d90a0fe8..2d656b40f 100644 --- a/src/device/serial.c +++ b/src/device/serial.c @@ -78,10 +78,13 @@ serial_reset_port(serial_t *dev) dev->iir = dev->ier = dev->lcr = dev->fcr = 0; dev->fifo_enabled = 0; dev->xmit_fifo_pos = dev->rcvr_fifo_pos = 0; + dev->xmit_fifo_end = dev->rcvr_fifo_end = 0; dev->rcvr_fifo_full = 0; dev->baud_cycles = 0; + dev->new = 0; + dev->out_new = 0xffff; memset(dev->xmit_fifo, 0, 16); - memset(dev->rcvr_fifo, 0, 14); + memset(dev->rcvr_fifo, 0, 16); } void @@ -89,7 +92,10 @@ serial_transmit_period(serial_t *dev) { double ddlab; - ddlab = (double) dev->dlab; + if (dev->dlab != 0x0000) + ddlab = (double) dev->dlab; + else + ddlab = 65536.0; /* Bit period based on DLAB. */ dev->transmit_period = (16000000.0 * ddlab) / dev->clock_src; @@ -145,42 +151,88 @@ serial_clear_timeout(serial_t *dev) } static void -write_fifo(serial_t *dev, uint8_t dat) +serial_receive_timer(void *priv) { - serial_log("write_fifo(%08X, %02X, %i, %i)\n", dev, dat, (dev->type >= SERIAL_16550) && dev->fifo_enabled, dev->rcvr_fifo_pos & 0x0f); + serial_t *dev = (serial_t *) priv; +#if 0 + uint16_t old_out_new = dev->out_new; +#endif + + // serial_log("serial_receive_timer()\n"); + + timer_on_auto(&dev->receive_timer, /* dev->bits * */ dev->transmit_period); if ((dev->type >= SERIAL_16550) && dev->fifo_enabled) { /* FIFO mode. */ - timer_disable(&dev->timeout_timer); - /* Indicate overrun. */ - if (dev->rcvr_fifo_full) - dev->lsr |= 0x02; - else - dev->rcvr_fifo[dev->rcvr_fifo_pos] = dat; - dev->lsr &= 0xfe; - dev->int_status &= ~SERIAL_INT_RECEIVE; - if (dev->rcvr_fifo_pos == (dev->rcvr_fifo_len - 1)) { - dev->lsr |= 0x01; - dev->int_status |= SERIAL_INT_RECEIVE; + + if (dev->out_new != 0xffff) { + /* We have received a byte into the RSR. */ + + /* Clear FIFO timeout. */ + serial_clear_timeout(dev); + + if (dev->rcvr_fifo_full) { + /* Overrun - just discard the byte in the RSR. */ + serial_log("FIFO overrun\n"); + dev->lsr |= 0x02; + } else { + /* We can input data into the FIFO. */ + dev->rcvr_fifo[dev->rcvr_fifo_end] = (uint8_t) (dev->out_new & 0xff); + dev->rcvr_fifo_end = (dev->rcvr_fifo_end + 1) & 0x0f; + + serial_log("To FIFO: %02X (%i)\n", (uint8_t) (dev->out_new & 0xff), + abs(dev->rcvr_fifo_end - dev->rcvr_fifo_pos)); + dev->out_new = 0xffff; + + if (abs(dev->rcvr_fifo_end - dev->rcvr_fifo_pos) >= dev->rcvr_fifo_len) { + /* We have >= trigger level bytes, raise Data Ready interrupt. */ + serial_log("We have >= %i bytes in the FIFO, data ready!\n", dev->rcvr_fifo_len); + dev->lsr |= 0x01; + dev->int_status |= SERIAL_INT_RECEIVE; + serial_update_ints(dev); + } + + timer_on_auto(&dev->timeout_timer, 4.0 * dev->bits * dev->transmit_period); + } } - if (dev->rcvr_fifo_pos < (dev->rcvr_fifo_len - 1)) - dev->rcvr_fifo_pos++; - else - dev->rcvr_fifo_full = 1; - serial_update_ints(dev); - timer_on_auto(&dev->timeout_timer, 4.0 * dev->bits * dev->transmit_period); + } + + serial_update_ints(dev); + +#if 0 + serial_log("FIFO: %i, out_new = %04X, old_out_new = %04X, was_enabled = %i, condition = %i\n", + ((dev->type >= SERIAL_16550) && dev->fifo_enabled), dev->out_new, + old_out_new, was_enabled, + ((dev->type >= SERIAL_16550) && dev->fifo_enabled) ? (dev->rcvr_fifo_pos != dev->rcvr_fifo_end) : dev->new); +#endif +} + +static void +write_fifo(serial_t *dev, uint8_t dat) +{ + serial_log("write_fifo(%08X, %02X, %i, %i)\n", dev, dat, (dev->type >= SERIAL_16550) && dev->fifo_enabled, dev->rcvr_fifo_pos % dev->rcvr_fifo_len); + + if ((dev->type >= SERIAL_16550) && dev->fifo_enabled) { + /* FIFO mode. */ + + /* This is the first phase, we are sending the data to the RSR (Receiver Shift + Register), from where it's going to get dispatched to the FIFO. */ } else { /* Non-FIFO mode. */ + /* Indicate overrun. */ if (dev->lsr & 0x01) dev->lsr |= 0x02; - dev->dat = dat; + + /* Raise Data Ready interrupt. */ + serial_log("To RHR: %02X\n", dat); dev->lsr |= 0x01; dev->int_status |= SERIAL_INT_RECEIVE; - if (dev->lsr & 0x02) - dev->int_status |= SERIAL_INT_LSR; serial_update_ints(dev); } + + /* Do this here, because in non-FIFO mode, this is read directly. */ + dev->out_new = (uint16_t) dat; } void @@ -334,6 +386,8 @@ serial_device_timeout(void *priv) static void serial_update_speed(serial_t *dev) { + timer_on_auto(&dev->receive_timer, /* dev->bits * */ dev->transmit_period); + if (dev->transmit_enabled & 3) timer_on_auto(&dev->transmit_timer, dev->transmit_period); @@ -482,6 +536,7 @@ serial_write(uint16_t addr, uint8_t val, void *p) if (val & 0x02) { memset(dev->rcvr_fifo, 0, 14); dev->rcvr_fifo_pos = 0; + dev->rcvr_fifo_end = 0; dev->rcvr_fifo_full = 0; } if (val & 0x04) { @@ -502,6 +557,8 @@ serial_write(uint16_t addr, uint8_t val, void *p) dev->rcvr_fifo_len = 14; break; } + dev->out_new = 0xffff; + dev->new = 0; serial_log("FIFO now %sabled, receive FIFO length = %i\n", dev->fifo_enabled ? "en" : "dis", dev->rcvr_fifo_len); } break; @@ -583,7 +640,7 @@ uint8_t serial_read(uint16_t addr, void *p) { serial_t *dev = (serial_t *) p; - uint8_t i, ret = 0; + uint8_t ret = 0; cycles -= ISA_CYCLES(8); @@ -594,37 +651,46 @@ serial_read(uint16_t addr, void *p) break; } + /* Clear timeout. */ + serial_clear_timeout(dev); + if ((dev->type >= SERIAL_16550) && dev->fifo_enabled) { /* FIFO mode. */ - serial_clear_timeout(dev); + if (dev->rcvr_fifo_pos != dev->rcvr_fifo_end) { + /* There is data in the FIFO. */ + ret = dev->rcvr_fifo[dev->rcvr_fifo_pos]; + dev->rcvr_fifo_pos = (dev->rcvr_fifo_pos + 1) & 0x0f; - ret = dev->rcvr_fifo[0]; - dev->rcvr_fifo_full = 0; + if (abs(dev->rcvr_fifo_pos - dev->rcvr_fifo_end) < dev->rcvr_fifo_len) { + /* Amount of data in the FIFO below trigger level, + clear Data Ready interrupt. */ + dev->lsr &= 0xfe; + dev->int_status &= ~SERIAL_INT_RECEIVE; + serial_update_ints(dev); - for (i = 1; i < 16; i++) - dev->rcvr_fifo[i - 1] = dev->rcvr_fifo[i]; - - dev->rcvr_fifo_pos--; - - if (dev->rcvr_fifo_pos > 0) { - serial_log("FIFO position %i: read %02X, next %02X\n", dev->rcvr_fifo_pos, ret, dev->rcvr_fifo[0]); - - /* At least one byte remains to be read, start the timeout - timer so that a timeout is indicated in case of no read. */ - timer_on_auto(&dev->timeout_timer, 4.0 * dev->bits * dev->transmit_period); - } else { - dev->lsr &= 0xfe; - dev->int_status &= ~SERIAL_INT_RECEIVE; - serial_update_ints(dev); + /* Make sure the Data Ready bit of the LSR is set if we still have + bytes left in the FIFO. */ + if (dev->rcvr_fifo_pos != dev->rcvr_fifo_end) { + dev->lsr |= 0x01; + /* There are bytes left in the FIFO, activate the FIFO Timeout timer. */ + timer_on_auto(&dev->timeout_timer, 4.0 * dev->bits * dev->transmit_period); + } + } } } else { - ret = dev->dat; + /* Non-FIFO mode. */ + + ret = (uint8_t) (dev->out_new & 0xffff); + dev->out_new = 0xffff; + + /* Always clear Data Ready interrupt. */ dev->lsr &= 0xfe; dev->int_status &= ~SERIAL_INT_RECEIVE; serial_update_ints(dev); } - serial_log("Read data: %02X\n", ret); + + // serial_log("Read data: %02X\n", ret); break; case 1: if (dev->lcr & 0x80) @@ -760,6 +826,34 @@ serial_close(void *priv) free(dev); } +static void +serial_reset(void *priv) +{ + serial_t *dev = (serial_t *) priv; + + timer_disable(&dev->transmit_timer); + timer_disable(&dev->timeout_timer); + timer_disable(&dev->receive_timer); + + dev->lsr = dev->thr = dev->mctrl = dev->rcr = 0x00; + dev->iir = dev->ier = dev->lcr = dev->msr = 0x00; + dev->dat = dev->int_status = dev->scratch = dev->fcr = 0x00; + dev->fifo_enabled = dev->rcvr_fifo_len = dev->bits = dev->data_bits = 0x00; + dev->baud_cycles = dev->rcvr_fifo_full = dev->txsr = dev->out = 0x00; + + dev->dlab = dev->out_new = dev->new = 0x0000; + + dev->rcvr_fifo_pos = dev->xmit_fifo_pos = dev->rcvr_fifo_end = dev->xmit_fifo_end = 0x00; + + serial_reset_port(dev); + + dev->dlab = 96; + dev->fcr = 0x06; + + serial_transmit_period(dev); + serial_update_speed(dev); +} + static void * serial_init(const device_t *info) { @@ -788,9 +882,11 @@ serial_init(const device_t *info) dev->dlab = 96; dev->fcr = 0x06; dev->clock_src = 1843200.0; - serial_transmit_period(dev); timer_add(&dev->transmit_timer, serial_transmit_timer, dev, 0); timer_add(&dev->timeout_timer, serial_timeout_timer, dev, 0); + timer_add(&dev->receive_timer, serial_receive_timer, dev, 0); + serial_transmit_period(dev); + serial_update_speed(dev); } next_inst++; @@ -818,7 +914,7 @@ const device_t ns8250_device = { .local = SERIAL_8250, .init = serial_init, .close = serial_close, - .reset = NULL, + .reset = serial_reset, { .available = NULL }, .speed_changed = serial_speed_changed, .force_redraw = NULL, @@ -832,7 +928,7 @@ const device_t ns8250_pcjr_device = { .local = SERIAL_8250_PCJR, .init = serial_init, .close = serial_close, - .reset = NULL, + .reset = serial_reset, { .available = NULL }, .speed_changed = serial_speed_changed, .force_redraw = NULL, @@ -846,7 +942,7 @@ const device_t ns16450_device = { .local = SERIAL_16450, .init = serial_init, .close = serial_close, - .reset = NULL, + .reset = serial_reset, { .available = NULL }, .speed_changed = serial_speed_changed, .force_redraw = NULL, @@ -860,7 +956,7 @@ const device_t ns16550_device = { .local = SERIAL_16550, .init = serial_init, .close = serial_close, - .reset = NULL, + .reset = serial_reset, { .available = NULL }, .speed_changed = serial_speed_changed, .force_redraw = NULL, @@ -874,7 +970,7 @@ const device_t ns16650_device = { .local = SERIAL_16650, .init = serial_init, .close = serial_close, - .reset = NULL, + .reset = serial_reset, { .available = NULL }, .speed_changed = serial_speed_changed, .force_redraw = NULL, @@ -888,7 +984,7 @@ const device_t ns16750_device = { .local = SERIAL_16750, .init = serial_init, .close = serial_close, - .reset = NULL, + .reset = serial_reset, { .available = NULL }, .speed_changed = serial_speed_changed, .force_redraw = NULL, @@ -902,7 +998,7 @@ const device_t ns16850_device = { .local = SERIAL_16850, .init = serial_init, .close = serial_close, - .reset = NULL, + .reset = serial_reset, { .available = NULL }, .speed_changed = serial_speed_changed, .force_redraw = NULL, @@ -916,7 +1012,7 @@ const device_t ns16950_device = { .local = SERIAL_16950, .init = serial_init, .close = serial_close, - .reset = NULL, + .reset = serial_reset, { .available = NULL }, .speed_changed = serial_speed_changed, .force_redraw = NULL, diff --git a/src/include/86box/serial.h b/src/include/86box/serial.h index 62b4c9a5f..f1f80972a 100644 --- a/src/include/86box/serial.h +++ b/src/include/86box/serial.h @@ -53,15 +53,16 @@ typedef struct serial_s { dat, int_status, scratch, fcr, irq, type, inst, transmit_enabled, fifo_enabled, rcvr_fifo_len, bits, data_bits, - baud_cycles, rcvr_fifo_full, txsr, pad, msr_set; + baud_cycles, rcvr_fifo_full, txsr, out, msr_set, pad, pad0, pad1; - uint16_t dlab, base_address; + uint16_t dlab, base_address, out_new, new; uint8_t rcvr_fifo_pos, xmit_fifo_pos, - pad0, pad1, + rcvr_fifo_end, xmit_fifo_end, rcvr_fifo[SERIAL_FIFO_SIZE], xmit_fifo[SERIAL_FIFO_SIZE]; - pc_timer_t transmit_timer, timeout_timer; + pc_timer_t transmit_timer, timeout_timer, + receive_timer; double clock_src, transmit_period; struct serial_device_s *sd; From f4d985b3da61b2ab8d111bf3e9ddfb37ea3c67a4 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Wed, 15 Feb 2023 21:37:20 +0600 Subject: [PATCH 241/285] serial: Fix compilation with Qt --- src/device/serial.c | 6 ++---- src/include/86box/serial.h | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/device/serial.c b/src/device/serial.c index 2d656b40f..97107efad 100644 --- a/src/device/serial.c +++ b/src/device/serial.c @@ -81,7 +81,6 @@ serial_reset_port(serial_t *dev) dev->xmit_fifo_end = dev->rcvr_fifo_end = 0; dev->rcvr_fifo_full = 0; dev->baud_cycles = 0; - dev->new = 0; dev->out_new = 0xffff; memset(dev->xmit_fifo, 0, 16); memset(dev->rcvr_fifo, 0, 16); @@ -203,7 +202,7 @@ serial_receive_timer(void *priv) serial_log("FIFO: %i, out_new = %04X, old_out_new = %04X, was_enabled = %i, condition = %i\n", ((dev->type >= SERIAL_16550) && dev->fifo_enabled), dev->out_new, old_out_new, was_enabled, - ((dev->type >= SERIAL_16550) && dev->fifo_enabled) ? (dev->rcvr_fifo_pos != dev->rcvr_fifo_end) : dev->new); + ((dev->type >= SERIAL_16550) && dev->fifo_enabled) ? (dev->rcvr_fifo_pos != dev->rcvr_fifo_end) : 0); #endif } @@ -558,7 +557,6 @@ serial_write(uint16_t addr, uint8_t val, void *p) break; } dev->out_new = 0xffff; - dev->new = 0; serial_log("FIFO now %sabled, receive FIFO length = %i\n", dev->fifo_enabled ? "en" : "dis", dev->rcvr_fifo_len); } break; @@ -841,7 +839,7 @@ serial_reset(void *priv) dev->fifo_enabled = dev->rcvr_fifo_len = dev->bits = dev->data_bits = 0x00; dev->baud_cycles = dev->rcvr_fifo_full = dev->txsr = dev->out = 0x00; - dev->dlab = dev->out_new = dev->new = 0x0000; + dev->dlab = dev->out_new = 0x0000; dev->rcvr_fifo_pos = dev->xmit_fifo_pos = dev->rcvr_fifo_end = dev->xmit_fifo_end = 0x00; diff --git a/src/include/86box/serial.h b/src/include/86box/serial.h index f1f80972a..63164bd57 100644 --- a/src/include/86box/serial.h +++ b/src/include/86box/serial.h @@ -55,7 +55,7 @@ typedef struct serial_s { fifo_enabled, rcvr_fifo_len, bits, data_bits, baud_cycles, rcvr_fifo_full, txsr, out, msr_set, pad, pad0, pad1; - uint16_t dlab, base_address, out_new, new; + uint16_t dlab, base_address, out_new; uint8_t rcvr_fifo_pos, xmit_fifo_pos, rcvr_fifo_end, xmit_fifo_end, From 566d0c8f449189d260f3eaf40113b1382bb8461e Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 15 Feb 2023 16:42:06 +0100 Subject: [PATCH 242/285] Padding in serial.h. --- src/include/86box/serial.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/include/86box/serial.h b/src/include/86box/serial.h index 63164bd57..8ed3606a7 100644 --- a/src/include/86box/serial.h +++ b/src/include/86box/serial.h @@ -53,9 +53,10 @@ typedef struct serial_s { dat, int_status, scratch, fcr, irq, type, inst, transmit_enabled, fifo_enabled, rcvr_fifo_len, bits, data_bits, - baud_cycles, rcvr_fifo_full, txsr, out, msr_set, pad, pad0, pad1; + baud_cycles, rcvr_fifo_full, txsr, out, + msr_set, pad, pad0, pad1; - uint16_t dlab, base_address, out_new; + uint16_t dlab, base_address, out_new, pad2; uint8_t rcvr_fifo_pos, xmit_fifo_pos, rcvr_fifo_end, xmit_fifo_end, From ed6f7a6f8e3529b956992056d4d36f01682b0258 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Wed, 15 Feb 2023 23:09:41 +0600 Subject: [PATCH 243/285] qt: Fix serial ports enumeration on Windows --- src/qt/qt_deviceconfig.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/qt/qt_deviceconfig.cpp b/src/qt/qt_deviceconfig.cpp index bf7d4bbb0..77624b824 100644 --- a/src/qt/qt_deviceconfig.cpp +++ b/src/qt/qt_deviceconfig.cpp @@ -46,6 +46,9 @@ extern "C" { # include # include #endif +#ifdef Q_OS_WINDOWS +#include +#endif DeviceConfig::DeviceConfig(QWidget *parent) : QDialog(parent) @@ -77,9 +80,15 @@ EnumerateSerialDevices() } #endif #ifdef Q_OS_WINDOWS - QSettings comPorts("HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM", QSettings::NativeFormat, nullptr); - for (int i = 0; i < comPorts.childKeys().length(); i++) { - serialDevices.push_back(QString("\\\\.\\") + comPorts.value(comPorts.childKeys()[i]).toString()); + for (int i = 1; i < 256; i++) { + devstr[0] = 0; + snprintf(devstr.data(), 1024, "\\\\.\\COM%d", i); + auto handle = CreateFileA(devstr.data(), GENERIC_READ | GENERIC_WRITE, 0, nullptr, OPEN_EXISTING, 0, 0); + auto dwError = GetLastError(); + if (handle != INVALID_HANDLE_VALUE || (handle == INVALID_HANDLE_VALUE && ((dwError == ERROR_ACCESS_DENIED) || (dwError == ERROR_GEN_FAILURE) || (dwError == ERROR_SHARING_VIOLATION) || (dwError == ERROR_SEM_TIMEOUT)))) { + if (handle != INVALID_HANDLE_VALUE) CloseHandle(handle); + serialDevices.push_back(QString(devstr)); + } } #endif #ifdef Q_OS_MACOS From e6156022cfcabbe82d6b12c1c735633edcd249fa Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Wed, 15 Feb 2023 23:10:27 +0600 Subject: [PATCH 244/285] win_serial_passthrough: Don't error on 0-byte writes --- src/win/win_serial_passthrough.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/win/win_serial_passthrough.c b/src/win/win_serial_passthrough.c index bf7ce7f98..7fa9c3032 100644 --- a/src/win/win_serial_passthrough.c +++ b/src/win/win_serial_passthrough.c @@ -73,9 +73,6 @@ plat_serpt_write_vcon(serial_passthrough_t *dev, uint8_t data) // fwrite(dev->master_fd, &data, 1); DWORD bytesWritten = 0; WriteFile((HANDLE) dev->master_fd, &data, 1, &bytesWritten, NULL); - if (bytesWritten == 0) { - fatal("serial_passthrough: WriteFile pipe write-buffer full!"); - } } void From d5291233f740348c2451babed49e6afe09156676 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 15 Feb 2023 21:16:51 +0100 Subject: [PATCH 245/285] Reintroduced IDE bit 7 pulldown, this time properly. --- src/disk/hdc_ide.c | 65 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 46 insertions(+), 19 deletions(-) diff --git a/src/disk/hdc_ide.c b/src/disk/hdc_ide.c index c2595e3e4..bd91647f8 100644 --- a/src/disk/hdc_ide.c +++ b/src/disk/hdc_ide.c @@ -738,7 +738,8 @@ ide_set_signature(ide_t *ide) ide->cylinder = ide->sc->request_length; } else { ide->secount = 1; - ide->cylinder = ((ide->type == IDE_HDD) ? 0 : 0xFFFF); + // ide->cylinder = ((ide->type == IDE_HDD) ? 0 : 0xFFFF); + ide->cylinder = ((ide->type == IDE_HDD) ? 0 : 0x7F7F); if (ide->type == IDE_HDD) ide->drive = 0; } @@ -1891,11 +1892,7 @@ static uint8_t ide_status(ide_t *ide, ide_t *ide_other, int ch) { if ((ide->type == IDE_NONE) && ((ide_other->type == IDE_NONE) || !(ch & 1))) -#ifdef STATUS_BIT_7_PULLDOWN - return 0x7F; /* Bit 7 pulled down, all other bits pulled up, per the spec. */ -#else - return 0xFF; -#endif + return 0x7f; /* Bit 7 pulled down, all other bits pulled up, per the spec. */ else if ((ide->type == IDE_NONE) && (ch & 1)) return 0x00; /* On real hardware, a slave with a present master always returns a status of 0x00. */ else if (ide->type == IDE_ATAPI) @@ -1909,7 +1906,7 @@ ide_readb(uint16_t addr, void *priv) { ide_board_t *dev = (ide_board_t *) priv; - int ch; + int ch, absent = 0; ide_t *ide; ch = dev->cur_dev; @@ -1921,18 +1918,31 @@ ide_readb(uint16_t addr, void *priv) addr |= 0x90; addr &= 0xFFF7; + if ((ide->type == IDE_NONE) && ((ide_drives[ch ^ 1]->type == IDE_NONE) || !(ch & 1))) + absent = 1; /* Absent and is master or both are absent. */ + else if ((ide->type == IDE_NONE) && (ch & 1)) + absent = 2; /* Absent and is slave and master is present. */ + switch (addr & 0x7) { case 0x0: /* Data */ - tempw = ide_read_data(ide, 2); - temp = tempw & 0xff; + if (absent == 1) + temp = 0x7f; + else if (absent == 2) + temp = 0x00; + else { + tempw = ide_read_data(ide, 2); + temp = tempw & 0xff; + } break; /* For ATAPI: Bits 7-4 = sense key, bit 3 = MCR (media change requested), Bit 2 = ABRT (aborted command), Bit 1 = EOM (end of media), and Bit 0 = ILI (illegal length indication). */ case 0x1: /* Error */ - if (ide->type == IDE_NONE) - temp = 0; + if (absent == 1) + temp = 0x7f; + else if (absent == 2) + temp = 0x01; else if (ide->type == IDE_ATAPI) temp = ide->sc->error; else @@ -1953,20 +1963,30 @@ ide_readb(uint16_t addr, void *priv) 0 1 0 Data from host 1 0 1 Status. */ case 0x2: /* Sector count */ - if (ide->type == IDE_ATAPI) + if (absent == 1) + temp = 0x7f; + else if (absent == 2) + temp = 0x01; + else if (ide->type == IDE_ATAPI) temp = ide->sc->phase; - else if (ide->type != IDE_NONE) + else temp = ide->secount; break; case 0x3: /* Sector */ - if (ide->type != IDE_NONE) + if (absent == 1) + temp = 0x7f; + else if (absent == 2) + temp = 0x01; + else temp = (uint8_t) ide->sector; break; case 0x4: /* Cylinder low */ - if (ide->type == IDE_NONE) - temp = 0xFF; + if (absent == 1) + temp = 0x7f; + else if (absent == 2) + temp = 0x00; else if (ide->type == IDE_ATAPI) temp = ide->sc->request_length & 0xff; else @@ -1974,8 +1994,10 @@ ide_readb(uint16_t addr, void *priv) break; case 0x5: /* Cylinder high */ - if (ide->type == IDE_NONE) - temp = 0xFF; + if (absent == 1) + temp = 0x7f; + else if (absent == 2) + temp = 0x00; else if (ide->type == IDE_ATAPI) temp = ide->sc->request_length >> 8; else @@ -1983,7 +2005,12 @@ ide_readb(uint16_t addr, void *priv) break; case 0x6: /* Drive/Head */ - temp = (uint8_t) (ide->head | ((ch & 1) ? 0x10 : 0) | (ide->lba ? 0x40 : 0) | 0xa0); + if (absent == 1) + temp = 0x7f; + else if (absent == 2) + temp = 0xb0; + else + temp = (uint8_t) (ide->head | ((ch & 1) ? 0x10 : 0) | (ide->lba ? 0x40 : 0) | 0xa0); break; /* For ATAPI: Bit 5 is DMA ready, but without overlapped or interlaved DMA, it is From 3d480a6ffc5ede43accf9ff695094ab45913661c Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 16 Feb 2023 00:15:04 +0100 Subject: [PATCH 246/285] A small fix to the serial receiver FIFO - fixes error 1101 on IBM PS/2 Models 70 and 80. --- src/device/serial.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/device/serial.c b/src/device/serial.c index 97107efad..847e3135b 100644 --- a/src/device/serial.c +++ b/src/device/serial.c @@ -153,9 +153,6 @@ static void serial_receive_timer(void *priv) { serial_t *dev = (serial_t *) priv; -#if 0 - uint16_t old_out_new = dev->out_new; -#endif // serial_log("serial_receive_timer()\n"); @@ -179,8 +176,9 @@ serial_receive_timer(void *priv) dev->rcvr_fifo[dev->rcvr_fifo_end] = (uint8_t) (dev->out_new & 0xff); dev->rcvr_fifo_end = (dev->rcvr_fifo_end + 1) & 0x0f; - serial_log("To FIFO: %02X (%i)\n", (uint8_t) (dev->out_new & 0xff), - abs(dev->rcvr_fifo_end - dev->rcvr_fifo_pos)); + serial_log("To FIFO: %02X (%i, %i, %i)\n", (uint8_t) (dev->out_new & 0xff), + abs(dev->rcvr_fifo_end - dev->rcvr_fifo_pos), + dev->rcvr_fifo_end, dev->rcvr_fifo_pos); dev->out_new = 0xffff; if (abs(dev->rcvr_fifo_end - dev->rcvr_fifo_pos) >= dev->rcvr_fifo_len) { @@ -191,19 +189,15 @@ serial_receive_timer(void *priv) serial_update_ints(dev); } + if (dev->rcvr_fifo_end == dev->rcvr_fifo_pos) + dev->rcvr_fifo_full = 1; + timer_on_auto(&dev->timeout_timer, 4.0 * dev->bits * dev->transmit_period); } } } serial_update_ints(dev); - -#if 0 - serial_log("FIFO: %i, out_new = %04X, old_out_new = %04X, was_enabled = %i, condition = %i\n", - ((dev->type >= SERIAL_16550) && dev->fifo_enabled), dev->out_new, - old_out_new, was_enabled, - ((dev->type >= SERIAL_16550) && dev->fifo_enabled) ? (dev->rcvr_fifo_pos != dev->rcvr_fifo_end) : 0); -#endif } static void @@ -622,7 +616,7 @@ serial_write(uint16_t addr, uint8_t val, void *p) serial_update_ints(dev); break; case 6: - dev->msr = (val & 0xF0) | (dev->msr & 0x0F); + dev->msr = (val & 0xf0) | (dev->msr & 0x0f); if (dev->msr & 0x0f) dev->int_status |= SERIAL_INT_MSR; serial_update_ints(dev); @@ -655,7 +649,7 @@ serial_read(uint16_t addr, void *p) if ((dev->type >= SERIAL_16550) && dev->fifo_enabled) { /* FIFO mode. */ - if (dev->rcvr_fifo_pos != dev->rcvr_fifo_end) { + if (dev->lsr & 0x01) { /* There is data in the FIFO. */ ret = dev->rcvr_fifo[dev->rcvr_fifo_pos]; dev->rcvr_fifo_pos = (dev->rcvr_fifo_pos + 1) & 0x0f; From f6c8080bdc87731704a1c77cbf31784873dd295e Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 16 Feb 2023 02:43:06 +0100 Subject: [PATCH 247/285] Fixed MSR writability, fixes Error D on the IBM PCjr. --- src/device/serial.c | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/src/device/serial.c b/src/device/serial.c index 847e3135b..0900799de 100644 --- a/src/device/serial.c +++ b/src/device/serial.c @@ -203,7 +203,10 @@ serial_receive_timer(void *priv) static void write_fifo(serial_t *dev, uint8_t dat) { - serial_log("write_fifo(%08X, %02X, %i, %i)\n", dev, dat, (dev->type >= SERIAL_16550) && dev->fifo_enabled, dev->rcvr_fifo_pos % dev->rcvr_fifo_len); + serial_log("write_fifo(%08X, %02X, %i, %i)\n", dev, dat, + (dev->type >= SERIAL_16550) && dev->fifo_enabled, + ((dev->type >= SERIAL_16550) && dev->fifo_enabled) ? + (dev->rcvr_fifo_pos % dev->rcvr_fifo_len) : 0); if ((dev->type >= SERIAL_16550) && dev->fifo_enabled) { /* FIFO mode. */ @@ -405,7 +408,7 @@ serial_set_dsr(serial_t *dev, uint8_t enabled) return; dev->msr &= ~0x2; - dev->msr |= !!((dev->msr & 0x20) ^ (enabled << 5)) << 1; + dev->msr |= ((dev->msr & 0x20) ^ ((!!enabled) << 5)) >> 4; dev->msr &= ~0x20; dev->msr |= (!!enabled) << 5; dev->msr_set &= ~0x20; @@ -424,7 +427,7 @@ serial_set_cts(serial_t *dev, uint8_t enabled) return; dev->msr &= ~0x1; - dev->msr |= !!((dev->msr & 0x10) ^ (enabled << 4)); + dev->msr |= ((dev->msr & 0x10) ^ ((!!enabled) << 4)) >> 4; dev->msr &= ~0x10; dev->msr |= (!!enabled) << 4; dev->msr_set &= ~0x10; @@ -443,7 +446,7 @@ serial_set_dcd(serial_t *dev, uint8_t enabled) return; dev->msr &= ~0x8; - dev->msr |= !!((dev->msr & 0x80) ^ (enabled << 7)); + dev->msr |= ((dev->msr & 0x80) ^ ((!!enabled) << 7)) >> 4; dev->msr &= ~0x80; dev->msr |= (!!enabled) << 7; dev->msr_set &= ~0x80; @@ -470,7 +473,8 @@ serial_write(uint16_t addr, uint8_t val, void *p) serial_t *dev = (serial_t *) p; uint8_t new_msr, old; - serial_log("UART: Write %02X to port %02X\n", val, addr); + // serial_log("UART: Write %02X to port %02X\n", val, addr); + serial_log("UART: [%04X:%08X] Write %02X to port %02X\n", CS, cpu_state.pc, val, addr); cycles -= ISA_CYCLES(8); @@ -616,7 +620,11 @@ serial_write(uint16_t addr, uint8_t val, void *p) serial_update_ints(dev); break; case 6: - dev->msr = (val & 0xf0) | (dev->msr & 0x0f); + // dev->msr = (val & 0xf0) | (dev->msr & 0x0f); + // dev->msr = val; + /* The actual condition bits of the MSR are read-only, but the delta bits are + undocumentedly writable, and the PCjr BIOS uses them to raise MSR interrupts. */ + dev->msr = (dev->msr & 0xf0) | (val & 0x0f); if (dev->msr & 0x0f) dev->int_status |= SERIAL_INT_MSR; serial_update_ints(dev); @@ -723,7 +731,8 @@ serial_read(uint16_t addr, void *p) break; } - serial_log("UART: Read %02X from port %02X\n", ret, addr); + // serial_log("UART: Read %02X from port %02X\n", ret, addr); + serial_log("UART: [%04X:%08X] Read %02X from port %02X\n", CS, cpu_state.pc, ret, addr); return ret; } @@ -873,7 +882,10 @@ serial_init(const device_t *info) /* Default to 1200,N,7. */ dev->dlab = 96; dev->fcr = 0x06; - dev->clock_src = 1843200.0; + if (info->local == SERIAL_8250_PCJR) + dev->clock_src = 1789500.0; + else + dev->clock_src = 1843200.0; timer_add(&dev->transmit_timer, serial_transmit_timer, dev, 0); timer_add(&dev->timeout_timer, serial_timeout_timer, dev, 0); timer_add(&dev->receive_timer, serial_receive_timer, dev, 0); From efaca1b10662786d270496d91489d45e091f7fb6 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Thu, 16 Feb 2023 10:25:05 +0600 Subject: [PATCH 248/285] wacom: Get rid of ID transmission hacks --- src/device/mouse_wacom_tablet.c | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/device/mouse_wacom_tablet.c b/src/device/mouse_wacom_tablet.c index 19e5b53cc..386e89042 100644 --- a/src/device/mouse_wacom_tablet.c +++ b/src/device/mouse_wacom_tablet.c @@ -340,15 +340,7 @@ transmit_prepare: wacom_transmit_prepare(wacom, x, y); transmit: - if (wacom->transmit_id) { - uint8_t i = 0; - - for (i = 0; i < 9; i++) { - serial_write_fifo(wacom->serial, wacom->data[wacom->data_pos++]); - if (wacom->data[wacom->data_pos] == 0) break; - } - } else - serial_write_fifo(wacom->serial, wacom->data[wacom->data_pos++]); + serial_write_fifo(wacom->serial, wacom->data[wacom->data_pos++]); if ((wacom->transmission_format == 0 && wacom->data[wacom->data_pos] == 0) || (wacom->transmission_format == 1 && wacom->data_pos == 7)) { wacom->transmission_ongoing = 0; From 3050dae395dcc76732c17f0a8162c77f4fb5083a Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Thu, 16 Feb 2023 00:00:31 +0600 Subject: [PATCH 249/285] serial_passthrough: Allow configuration of named pipe parameter --- src/device/serial_passthrough.c | 14 ++++++++ src/include/86box/serial_passthrough.h | 1 + src/qt/qt_deviceconfig.cpp | 16 +++++++++ src/win/win_devconf.c | 50 ++++++++++++++++++++++++++ src/win/win_serial_passthrough.c | 10 +++++- 5 files changed, 90 insertions(+), 1 deletion(-) diff --git a/src/device/serial_passthrough.c b/src/device/serial_passthrough.c index b5026f9b6..672bc98c3 100644 --- a/src/device/serial_passthrough.c +++ b/src/device/serial_passthrough.c @@ -177,6 +177,9 @@ serial_passthrough_dev_init(const device_t *info) serial_passthrough_write, serial_passthrough_transmit_period, serial_passthrough_lcr_callback, dev); strncpy(dev->host_serial_path, device_get_config_string("host_serial_path"), 1023); +#ifdef _WIN32 + strncpy(dev->named_pipe, device_get_config_string("named_pipe"), 1023); +#endif serial_passthrough_log("%s: port=COM%d\n", info->name, dev->port + 1); serial_passthrough_log("%s: baud=%f\n", info->name, dev->baudrate); @@ -264,6 +267,17 @@ static const device_config_t serial_passthrough_config[] = { .spinner = {}, .selection = {} }, +#ifdef _WIN32 + { + .name = "named_pipe", + .description = "Name of pipe", + .type = CONFIG_STRING, + .default_string = "\\\\.\\pipe\\86Box\\test", + .file_filter = NULL, + .spinner = {}, + .selection = {} + }, +#endif { .name = "data_bits", .description = "Data bits", diff --git a/src/include/86box/serial_passthrough.h b/src/include/86box/serial_passthrough.h index 20c97fa03..9612b9500 100644 --- a/src/include/86box/serial_passthrough.h +++ b/src/include/86box/serial_passthrough.h @@ -50,6 +50,7 @@ typedef struct serial_passthrough_s { intptr_t master_fd; /* file desc for master pseudo terminal or * socket or alike */ char host_serial_path[1024]; /* Path to TTY/host serial port on the host */ + char named_pipe[1024]; /* (Windows only) Name of the pipe. */ void *backend_priv; /* Private platform backend data */ } serial_passthrough_t; diff --git a/src/qt/qt_deviceconfig.cpp b/src/qt/qt_deviceconfig.cpp index 77624b824..770e28157 100644 --- a/src/qt/qt_deviceconfig.cpp +++ b/src/qt/qt_deviceconfig.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -254,6 +255,15 @@ DeviceConfig::ConfigureDevice(const _device_ *device, int instance, Settings *se dc.ui->formLayout->addRow(config->description, fileField); break; } + case CONFIG_STRING: + { + auto lineEdit = new QLineEdit; + lineEdit->setObjectName(config->name); + lineEdit->setCursor(Qt::IBeamCursor); + lineEdit->setText(config_get_string(device_context.name, const_cast(config->name), const_cast(config->default_string))); + dc.ui->formLayout->addRow(config->description, lineEdit); + break; + } case CONFIG_SERPORT: { auto *cbox = new QComboBox(); @@ -315,6 +325,12 @@ DeviceConfig::ConfigureDevice(const _device_ *device, int instance, Settings *se config_set_string(device_context.name, const_cast(config->name), path); break; } + case CONFIG_STRING: + { + auto *lineEdit = dc.findChild(config->name); + config_set_string(device_context.name, const_cast(config->name), lineEdit->text().toUtf8()); + break; + } case CONFIG_HEX16: { auto *cbox = dc.findChild(config->name); diff --git a/src/win/win_devconf.c b/src/win/win_devconf.c index 5a833d5e5..849bf62f1 100644 --- a/src/win/win_devconf.c +++ b/src/win/win_devconf.c @@ -168,6 +168,7 @@ deviceconfig_dlgproc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) id += 2; break; case CONFIG_FNAME: + case CONFIG_STRING: wstr = config_get_wstring((char *) config_device.name, (char *) config->name, 0); if (wstr) @@ -288,6 +289,7 @@ deviceconfig_dlgproc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) id += 2; break; case CONFIG_FNAME: + case CONFIG_STRING: str = config_get_string((char *) config_device.name, (char *) config->name, (char *) ""); SendMessage(h, WM_GETTEXT, 511, (LPARAM) s); @@ -397,6 +399,7 @@ deviceconfig_dlgproc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) id += 2; break; case CONFIG_FNAME: + case CONFIG_STRING: SendMessage(h, WM_GETTEXT, 511, (LPARAM) ws); config_set_wstring((char *) config_device.name, (char *) config->name, ws); @@ -455,6 +458,7 @@ deviceconfig_dlgproc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) case CONFIG_MIDI_OUT: case CONFIG_MIDI_IN: case CONFIG_SPINNER: + case CONFIG_STRING: id += 2; break; case CONFIG_FNAME: @@ -640,6 +644,52 @@ deviceconfig_inst_open(HWND hwnd, const device_t *device, int inst) data += MultiByteToWideChar(CP_ACP, 0, config->description, -1, data, 256); *data++ = 0; /* no creation data */ + if (((uintptr_t) data) & 2) + data++; + + y += 20; + break; + case CONFIG_STRING: + /*Editable Text*/ + item = (DLGITEMTEMPLATE *) data; + item->x = 70; + item->y = y; + item->id = id++; + + item->cx = 140; + item->cy = 14; + + item->style = WS_CHILD | WS_VISIBLE | ES_READONLY; + item->dwExtendedStyle = WS_EX_CLIENTEDGE; + + data = (uint16_t *) (item + 1); + *data++ = 0xFFFF; + *data++ = 0x0081; /* edit text class */ + + data += MultiByteToWideChar(CP_ACP, 0, "", -1, data, 256); + *data++ = 0; /* no creation data */ + + if (((uintptr_t) data) & 2) + data++; + + /*Static text*/ + item = (DLGITEMTEMPLATE *) data; + item->x = 10; + item->y = y + 2; + item->id = id++; + + item->cx = 60; + item->cy = 20; + + item->style = WS_CHILD | WS_VISIBLE; + + data = (uint16_t *) (item + 1); + *data++ = 0xFFFF; + *data++ = 0x0082; /* static class */ + + data += MultiByteToWideChar(CP_ACP, 0, config->description, -1, data, 256); + *data++ = 0; /* no creation data */ + if (((uintptr_t) data) & 2) data++; diff --git a/src/win/win_serial_passthrough.c b/src/win/win_serial_passthrough.c index 7fa9c3032..f80c5936d 100644 --- a/src/win/win_serial_passthrough.c +++ b/src/win/win_serial_passthrough.c @@ -22,6 +22,7 @@ #include #include #include +#include #include <86box/86box.h> #include <86box/log.h> @@ -30,6 +31,7 @@ #include <86box/device.h> #include <86box/serial_passthrough.h> #include <86box/plat_serial_passthrough.h> +#include <86box/ui.h> #include @@ -161,9 +163,15 @@ static int open_pseudo_terminal(serial_passthrough_t *dev) { char ascii_pipe_name[1024] = { 0 }; - snprintf(ascii_pipe_name, sizeof(ascii_pipe_name), "\\\\.\\pipe\\86Box\\%s", vm_name); + strncpy(ascii_pipe_name, dev->named_pipe, 1023); dev->master_fd = (intptr_t) CreateNamedPipeA(ascii_pipe_name, PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_NOWAIT, 32, 65536, 65536, NMPWAIT_USE_DEFAULT_WAIT, NULL); if (dev->master_fd == (intptr_t) INVALID_HANDLE_VALUE) { + wchar_t errorMsg[1024] = { 0 }; + wchar_t finalMsg[1024] = { 0 }; + DWORD error = GetLastError(); + FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM, NULL, error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), errorMsg, 1024, NULL); + swprintf(finalMsg, 1024, L"Named Pipe (server, named_pipe=\"%hs\", port=COM%d): %ls\n", ascii_pipe_name, dev->port + 1, errorMsg); + ui_msgbox(MBX_ERROR | MBX_FATAL, finalMsg); return 0; } pclog("Named Pipe @ %s\n", ascii_pipe_name); From be573713a6673f7a617323b368f8e0c7f2fdd327 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Thu, 16 Feb 2023 22:43:33 +0600 Subject: [PATCH 250/285] config: Fix serial passthrough saving --- src/config.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/config.c b/src/config.c index 056a00887..2a8a32e4b 100644 --- a/src/config.c +++ b/src/config.c @@ -2472,11 +2472,12 @@ save_ports(void) (char *) com_device_get_internal_name(com_ports[c].device)); */ - if (com_ports[c].enabled) - if (serial_passthrough_enabled[c]) { - sprintf(temp, "serial%d_passthrough_enabled", c + 1); - ini_section_set_int(cat, temp, 1); - } + sprintf(temp, "serial%d_passthrough_enabled", c + 1); + if (serial_passthrough_enabled[c]) { + ini_section_set_int(cat, temp, 1); + } else { + ini_section_delete_var(cat, temp); + } } for (c = 0; c < PARALLEL_MAX; c++) { From b2f324262dd1dcbc602c8d05f973da5e85e02269 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 16 Feb 2023 20:10:05 +0100 Subject: [PATCH 251/285] Fixed more serial receiver FIFO bugs. --- src/device/serial.c | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/src/device/serial.c b/src/device/serial.c index 0900799de..d8cb37c11 100644 --- a/src/device/serial.c +++ b/src/device/serial.c @@ -174,7 +174,10 @@ serial_receive_timer(void *priv) } else { /* We can input data into the FIFO. */ dev->rcvr_fifo[dev->rcvr_fifo_end] = (uint8_t) (dev->out_new & 0xff); - dev->rcvr_fifo_end = (dev->rcvr_fifo_end + 1) & 0x0f; + // dev->rcvr_fifo_end = (dev->rcvr_fifo_end + 1) & 0x0f; + /* Do not wrap around, makes sure it still triggers the interrupt + at 16 bytes. */ + dev->rcvr_fifo_end++; serial_log("To FIFO: %02X (%i, %i, %i)\n", (uint8_t) (dev->out_new & 0xff), abs(dev->rcvr_fifo_end - dev->rcvr_fifo_pos), @@ -189,6 +192,9 @@ serial_receive_timer(void *priv) serial_update_ints(dev); } + /* Now wrap around. */ + dev->rcvr_fifo_end &= 0x0f; + if (dev->rcvr_fifo_end == dev->rcvr_fifo_pos) dev->rcvr_fifo_full = 1; @@ -657,26 +663,29 @@ serial_read(uint16_t addr, void *p) if ((dev->type >= SERIAL_16550) && dev->fifo_enabled) { /* FIFO mode. */ - if (dev->lsr & 0x01) { + if (dev->rcvr_fifo_full || (dev->rcvr_fifo_pos != dev->rcvr_fifo_end)) { /* There is data in the FIFO. */ ret = dev->rcvr_fifo[dev->rcvr_fifo_pos]; dev->rcvr_fifo_pos = (dev->rcvr_fifo_pos + 1) & 0x0f; + /* Make sure to clear the FIFO full condition. */ + dev->rcvr_fifo_full = 0; + if (abs(dev->rcvr_fifo_pos - dev->rcvr_fifo_end) < dev->rcvr_fifo_len) { /* Amount of data in the FIFO below trigger level, clear Data Ready interrupt. */ - dev->lsr &= 0xfe; dev->int_status &= ~SERIAL_INT_RECEIVE; serial_update_ints(dev); - - /* Make sure the Data Ready bit of the LSR is set if we still have - bytes left in the FIFO. */ - if (dev->rcvr_fifo_pos != dev->rcvr_fifo_end) { - dev->lsr |= 0x01; - /* There are bytes left in the FIFO, activate the FIFO Timeout timer. */ - timer_on_auto(&dev->timeout_timer, 4.0 * dev->bits * dev->transmit_period); - } } + + /* Make sure the Data Ready bit of the LSR is set if we still have + bytes left in the FIFO. */ + if (dev->rcvr_fifo_pos != dev->rcvr_fifo_end) { + dev->lsr |= 0x01; + /* There are bytes left in the FIFO, activate the FIFO Timeout timer. */ + timer_on_auto(&dev->timeout_timer, 4.0 * dev->bits * dev->transmit_period); + } else + dev->lsr &= 0xfe; } } else { /* Non-FIFO mode. */ From a96f40e5ef84c0fdf8f3aac7d5d5dbe4406658af Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Fri, 17 Feb 2023 01:48:29 +0600 Subject: [PATCH 252/285] mouse_wacom_tablet: Change to snprintf for ID transmission --- src/device/mouse_wacom_tablet.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/device/mouse_wacom_tablet.c b/src/device/mouse_wacom_tablet.c index 386e89042..d613bcc1b 100644 --- a/src/device/mouse_wacom_tablet.c +++ b/src/device/mouse_wacom_tablet.c @@ -229,7 +229,7 @@ wacom_transmit_prepare(mouse_wacom_t* wacom, int x, int y) memset(wacom->data, 0, sizeof(wacom->data)); if (wacom->transmit_id) { wacom->transmission_format = 0; - strcat((char*)wacom->data, "~#SD51C V3.2.1.01\r"); + snprintf((char*)wacom->data, sizeof(wacom->data), "~#SD51C V3.2.1.01\r\0"); return; } wacom->transmission_format = wacom->format; From 29d7a7f2651d453d5af137a6f8fb300712a0d687 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Fri, 17 Feb 2023 11:04:24 +0600 Subject: [PATCH 253/285] mouse_wacom_tablet: Reset "always_report" to 0 as well Fixes Windows 95 drivers --- src/device/mouse_wacom_tablet.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/device/mouse_wacom_tablet.c b/src/device/mouse_wacom_tablet.c index d613bcc1b..84459efa7 100644 --- a/src/device/mouse_wacom_tablet.c +++ b/src/device/mouse_wacom_tablet.c @@ -91,6 +91,7 @@ wacom_reset(mouse_wacom_t* wacom) wacom->increment = wacom->suppressed_increment = 0; wacom->reset_tsc = tsc; wacom->remote_mode = wacom->remote_req = 0; + wacom->always_report = 0; mouse_mode = 1; } From 7f66f8334e7ea3c6a4453cac029ce32d1db5bade Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Fri, 17 Feb 2023 11:36:13 +0600 Subject: [PATCH 254/285] mouse_wacom_tablet: Always transmit coordinates when requested in remote mode --- src/device/mouse_wacom_tablet.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/device/mouse_wacom_tablet.c b/src/device/mouse_wacom_tablet.c index 84459efa7..2d324effb 100644 --- a/src/device/mouse_wacom_tablet.c +++ b/src/device/mouse_wacom_tablet.c @@ -230,7 +230,7 @@ wacom_transmit_prepare(mouse_wacom_t* wacom, int x, int y) memset(wacom->data, 0, sizeof(wacom->data)); if (wacom->transmit_id) { wacom->transmission_format = 0; - snprintf((char*)wacom->data, sizeof(wacom->data), "~#SD51C V3.2.1.01\r\0"); + snprintf((char*)wacom->data, sizeof(wacom->data), "~#SD51C V3.2.1.01\r"); return; } wacom->transmission_format = wacom->format; @@ -299,6 +299,9 @@ wacom_report_timer(void *priv) else if (wacom->remote_mode && !wacom->remote_req) return; else { + if (wacom->remote_mode && wacom->remote_req) { + goto transmit_prepare; + } if (wacom->transmission_stopped || (!mouse_tablet_in_proximity && !wacom->always_report)) return; From 2ca0fb3dd23f11fa2bb0ee504f2624a559b987c3 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Fri, 17 Feb 2023 12:39:04 +0600 Subject: [PATCH 255/285] vid_tvp3026_ramdac: Don't ignore CCR2 and CCR3 bits for Cursor RAM reads/writes Fixes hardware cursor under Windows 95 --- src/video/vid_tvp3026_ramdac.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/video/vid_tvp3026_ramdac.c b/src/video/vid_tvp3026_ramdac.c index 2ea60d520..5ae5663f8 100644 --- a/src/video/vid_tvp3026_ramdac.c +++ b/src/video/vid_tvp3026_ramdac.c @@ -163,11 +163,19 @@ tvp3026_ramdac_out(uint16_t addr, int rs2, int rs3, uint8_t val, void *p, svga_t switch (ramdac->ind_idx) { case 0x06: /* Indirect Cursor Control */ ramdac->ccr = val; - svga->dac_hwcursor.cur_xsize = svga->dac_hwcursor.cur_ysize = 64; - svga->dac_hwcursor.x = ramdac->hwc_x - svga->dac_hwcursor.cur_xsize; - svga->dac_hwcursor.y = ramdac->hwc_y - svga->dac_hwcursor.cur_ysize; - svga->dac_hwcursor.ena = !!(val & 0x03); - ramdac->mode = val & 0x03; + if (!(ramdac->ccr & 0x80)) { + svga->dac_hwcursor.cur_xsize = svga->dac_hwcursor.cur_ysize = 64; + svga->dac_hwcursor.x = ramdac->hwc_x - svga->dac_hwcursor.cur_xsize; + svga->dac_hwcursor.y = ramdac->hwc_y - svga->dac_hwcursor.cur_ysize; + svga->dac_hwcursor.ena = !!(val & 0x03); + ramdac->mode = val & 0x03; + } else { + svga->dac_hwcursor.cur_xsize = svga->dac_hwcursor.cur_ysize = 64; + svga->dac_hwcursor.x = ramdac->hwc_x - svga->dac_hwcursor.cur_xsize; + svga->dac_hwcursor.y = ramdac->hwc_y - svga->dac_hwcursor.cur_ysize; + svga->dac_hwcursor.ena = !!(ramdac->dcc & 0x03); + ramdac->mode = ramdac->dcc & 0x03; + } break; case 0x0f: /* Latch Control */ ramdac->latch_cntl = val; @@ -244,7 +252,7 @@ tvp3026_ramdac_out(uint16_t addr, int rs2, int rs3, uint8_t val, void *p, svga_t } break; case 0x0b: /* Cursor RAM Data Register (RS value = 1011) */ - index = svga->dac_addr & da_mask; + index = (svga->dac_addr & da_mask) | ((ramdac->ccr & 0x0c) << 6); cd = (uint8_t *) ramdac->cursor64_data; cd[index] = val; svga->dac_addr = (svga->dac_addr + 1) & da_mask; @@ -410,7 +418,7 @@ tvp3026_ramdac_in(uint16_t addr, int rs2, int rs3, void *p, svga_t *svga) } break; case 0x0b: /* Cursor RAM Data Register (RS value = 1011) */ - index = (svga->dac_addr - 1) & da_mask; + index = ((svga->dac_addr - 1) & da_mask) | ((ramdac->ccr & 0x0c) << 6); cd = (uint8_t *) ramdac->cursor64_data; temp = cd[index]; From 68ac52c19037c3ea840f43b86a111ddf17867006 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Fri, 17 Feb 2023 16:10:06 +0600 Subject: [PATCH 256/285] vid_mga: Pattern drawing now works correctly on OS/2 --- src/video/vid_mga.c | 76 ++++++++++++++++++++++++++++++++------------- 1 file changed, 54 insertions(+), 22 deletions(-) diff --git a/src/video/vid_mga.c b/src/video/vid_mga.c index 56dcf9605..344287ee2 100644 --- a/src/video/vid_mga.c +++ b/src/video/vid_mga.c @@ -472,7 +472,7 @@ typedef struct mystique_t { ta_key, ta_mask, lastpix_r, lastpix_g, lastpix_b, highv_line, beta, dither; - int pattern[8][8]; + int pattern[8][16]; uint32_t dwgctrl, dwgctrl_running, bcol, fcol, pitch, plnwt, ybot, ydstorg, @@ -1621,7 +1621,7 @@ mystique_accel_ctrl_write_b(uint32_t addr, uint8_t val, void *p) case REG_PAT1 + 2: case REG_PAT1 + 3: for (x = 0; x < 8; x++) - mystique->dwgreg.pattern[addr & 7][x] = val & (1 << (7 - x)); + mystique->dwgreg.pattern[addr & 7][x] = mystique->dwgreg.pattern[addr & 7][x + 8] = val & (1 << (7 - x)); break; case REG_XYSTRT: @@ -2249,26 +2249,58 @@ mystique_accel_ctrl_write_l(uint32_t addr, uint32_t val, void *p) mystique->dwgreg.fcol = val; break; - case REG_SRC0: - mystique->dwgreg.src[0] = val; - if (mystique->busy && (mystique->dwgreg.dwgctrl_running & DWGCTRL_OPCODE_MASK) == DWGCTRL_OPCODE_ILOAD) - blit_iload_write(mystique, mystique->dwgreg.src[0], 32); + case REG_SRC0: { + int x = 0, y = 0; + mystique->dwgreg.src[0] = val; + for (y = 0; y < 2; y++) { + for (x = 0; x < 16; x++) { + mystique->dwgreg.pattern[y][x] = val & (1 << (x + (y * 16))); + } + } + //pclog("SRC0 = 0x%08X\n", val); + if (mystique->busy && (mystique->dwgreg.dwgctrl_running & DWGCTRL_OPCODE_MASK) == DWGCTRL_OPCODE_ILOAD) + blit_iload_write(mystique, mystique->dwgreg.src[0], 32); + } break; - case REG_SRC1: - mystique->dwgreg.src[1] = val; - if (mystique->busy && (mystique->dwgreg.dwgctrl_running & DWGCTRL_OPCODE_MASK) == DWGCTRL_OPCODE_ILOAD) - blit_iload_write(mystique, mystique->dwgreg.src[1], 32); - break; - case REG_SRC2: - mystique->dwgreg.src[2] = val; - if (mystique->busy && (mystique->dwgreg.dwgctrl_running & DWGCTRL_OPCODE_MASK) == DWGCTRL_OPCODE_ILOAD) - blit_iload_write(mystique, mystique->dwgreg.src[2], 32); - break; - case REG_SRC3: - mystique->dwgreg.src[3] = val; - if (mystique->busy && (mystique->dwgreg.dwgctrl_running & DWGCTRL_OPCODE_MASK) == DWGCTRL_OPCODE_ILOAD) - blit_iload_write(mystique, mystique->dwgreg.src[3], 32); + case REG_SRC1: { + int x = 0, y = 0; + mystique->dwgreg.src[1] = val; + for (y = 2; y < 4; y++) { + for (x = 0; x < 16; x++) { + mystique->dwgreg.pattern[y][x] = val & (1 << (x + ((y - 2) * 16))); + } + } + //pclog("SRC1 = 0x%08X\n", val); + if (mystique->busy && (mystique->dwgreg.dwgctrl_running & DWGCTRL_OPCODE_MASK) == DWGCTRL_OPCODE_ILOAD) + blit_iload_write(mystique, mystique->dwgreg.src[1], 32); + } break; + case REG_SRC2: { + int x = 0, y = 0; + mystique->dwgreg.src[2] = val; + for (y = 4; y < 6; y++) { + for (x = 0; x < 16; x++) { + mystique->dwgreg.pattern[y][x] = val & (1 << (x + ((y - 4) * 16))); + } + } + //pclog("SRC2 = 0x%08X\n", val); + if (mystique->busy && (mystique->dwgreg.dwgctrl_running & DWGCTRL_OPCODE_MASK) == DWGCTRL_OPCODE_ILOAD) + blit_iload_write(mystique, mystique->dwgreg.src[2], 32); + break; + } + case REG_SRC3: { + int x = 0, y = 0; + mystique->dwgreg.src[3] = val; + for (y = 6; y < 8; y++) { + for (x = 0; x < 16; x++) { + mystique->dwgreg.pattern[y][x] = val & (1 << (x + ((y - 6) * 16))); + } + } + //pclog("SRC3 = 0x%08X\n", val); + if (mystique->busy && (mystique->dwgreg.dwgctrl_running & DWGCTRL_OPCODE_MASK) == DWGCTRL_OPCODE_ILOAD) + blit_iload_write(mystique, mystique->dwgreg.src[3], 32); + break; + } case REG_DMAPAD: if (mystique->busy && (mystique->dwgreg.dwgctrl_running & DWGCTRL_OPCODE_MASK) == DWGCTRL_OPCODE_ILOAD) @@ -4054,7 +4086,7 @@ blit_trap(mystique_t *mystique) while (x_l != x_r) { if (x_l >= mystique->dwgreg.cxleft && x_l <= mystique->dwgreg.cxright && mystique->dwgreg.ydst_lin >= mystique->dwgreg.ytop && mystique->dwgreg.ydst_lin <= mystique->dwgreg.ybot && trans[x_l & 3]) { - int xoff = (mystique->dwgreg.xoff + x_l) & 7; + int xoff = (mystique->dwgreg.xoff + (x_l & 7)) & 15; int pattern = mystique->dwgreg.pattern[yoff][xoff]; uint32_t dst; @@ -4121,7 +4153,7 @@ blit_trap(mystique_t *mystique) while (x_l != x_r) { if (x_l >= mystique->dwgreg.cxleft && x_l <= mystique->dwgreg.cxright && mystique->dwgreg.ydst_lin >= mystique->dwgreg.ytop && mystique->dwgreg.ydst_lin <= mystique->dwgreg.ybot && trans[x_l & 3]) { - int xoff = (mystique->dwgreg.xoff + x_l) & 7; + int xoff = (mystique->dwgreg.xoff + (x_l & 7)) & 15; int pattern = mystique->dwgreg.pattern[yoff][xoff]; uint32_t src = pattern ? mystique->dwgreg.fcol : mystique->dwgreg.bcol; uint32_t dst, old_dst; From 1f3dec570811c4e63c343b1b8a01d71989fd5757 Mon Sep 17 00:00:00 2001 From: luennix Date: Fri, 17 Feb 2023 14:11:24 +0300 Subject: [PATCH 257/285] Add Toshiba Infinia 7200 (TC430HX OEM) and add TC430HX's on-board S3 ViRGE/DX. --- src/include/86box/machine.h | 1 + src/machine/m_at_socket7.c | 36 +++++++++++++++++++++++++++++++ src/machine/machine_table.c | 42 ++++++++++++++++++++++++++++++++++++- 3 files changed, 78 insertions(+), 1 deletion(-) diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index 165e37cb2..5a5b0bfda 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -611,6 +611,7 @@ extern int machine_at_acerv35n_init(const machine_t *); extern int machine_at_p55t2p4_init(const machine_t *); extern int machine_at_m7shi_init(const machine_t *); extern int machine_at_tc430hx_init(const machine_t *); +extern int machine_at_infinia7200_init(const machine_t *); extern int machine_at_equium5200_init(const machine_t *); extern int machine_at_pcv90_init(const machine_t *); extern int machine_at_p65up5_cp55t2d_init(const machine_t *); diff --git a/src/machine/m_at_socket7.c b/src/machine/m_at_socket7.c index 0e76ac1c9..3c0f0481a 100644 --- a/src/machine/m_at_socket7.c +++ b/src/machine/m_at_socket7.c @@ -199,6 +199,42 @@ machine_at_tc430hx_init(const machine_t *model) pci_register_slot(0x0F, PCI_CARD_NORMAL, 3, 4, 1, 2); pci_register_slot(0x10, PCI_CARD_NORMAL, 4, 1, 2, 3); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); + device_add(&s3_virge_375_pci_device); + device_add(&i430hx_device); + device_add(&piix3_device); + device_add(&keyboard_ps2_ami_pci_device); + device_add(&pc87306_device); + device_add(&intel_flash_bxt_ami_device); + + return ret; +} + +int +machine_at_infinia7200_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear_combined2("roms/machines/infinia7200/1008DH08.BIO", + "roms/machines/infinia7200/1008DH08.BI1", + "roms/machines/infinia7200/1008DH08.BI2", + "roms/machines/infinia7200/1008DH08.BI3", + "roms/machines/infinia7200/1008DH08.RCV", + 0x3a000, 128); + + if (bios_only || !ret) + return ret; + + machine_at_common_init(model); + + pci_init(PCI_CONFIG_TYPE_1); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x08, PCI_CARD_VIDEO, 4, 0, 0, 0); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x10, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); + device_add(&s3_virge_375_pci_device); device_add(&i430hx_device); device_add(&piix3_device); device_add(&keyboard_ps2_ami_pci_device); diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 032975672..aa09866da 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -9447,7 +9447,47 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, + .flags = MACHINE_VIDEO | MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, + .ram = { + .min = 8192, + .max = 131072, + .step = 8192 + }, + .nvrmask = 255, + .kbc_device = NULL, + .kbc_p1 = 0, + .gpio = 0, + .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, + .vid_device = NULL, + .snd_device = NULL, + .net_device = NULL + }, + /* OEM version of Intel TC430HX, has AMI MegaKey KBC firmware on the PC87306 + Super I/O chip */ + { + .name = "[i430HX] Toshiba Infinia 7200", + .internal_name = "infinia7200", + .type = MACHINE_TYPE_SOCKET7, + .chipset = MACHINE_CHIPSET_INTEL_430HX, + .init = machine_at_infinia7200_init, + .pad = 0, + .pad0 = 0, + .pad1 = MACHINE_AVAILABLE, + .pad2 = 0, + .cpu = { + .package = CPU_PKG_SOCKET5_7, + .block = CPU_BLOCK_NONE, + .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_VIDEO | MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, From 85f38ef7c0c7f4fb8c9e7b67d708e2f9173bb451 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Fri, 17 Feb 2023 17:24:04 +0600 Subject: [PATCH 258/285] vid_mga: Fix opaque pattern blits --- 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 344287ee2..b557d1ce5 100644 --- a/src/video/vid_mga.c +++ b/src/video/vid_mga.c @@ -2177,7 +2177,7 @@ mystique_accel_ctrl_write_l(uint32_t addr, uint32_t val, void *p) int x, y; for (y = 0; y < 8; y++) { - for (x = 0; x < 8; x++) + for (x = 0; x < 16; x++) mystique->dwgreg.pattern[y][x] = 1; } mystique->dwgreg.src[0] = 0xffffffff; From a0d853ff1ff1aab82b7a22d7da99c437cc463b66 Mon Sep 17 00:00:00 2001 From: luennix Date: Fri, 17 Feb 2023 22:09:17 +0300 Subject: [PATCH 259/285] Actually implement on-board ViRGE/DX for Infinia 7200 and TC430HX --- src/video/vid_s3_virge.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/video/vid_s3_virge.c b/src/video/vid_s3_virge.c index 376abb68c..e2ecf8ae5 100644 --- a/src/video/vid_s3_virge.c +++ b/src/video/vid_s3_virge.c @@ -4181,10 +4181,13 @@ s3_virge_init(const device_t *info) s3_virge_overlay_draw); virge->svga.hwcursor.cur_ysize = 64; - if (info->local == S3_VIRGE_GX2) - rom_init(&virge->bios_rom, (char *) bios_fn, 0xc0000, 0x10000, 0xffff, 0, MEM_MAPPING_EXTERNAL); - else - rom_init(&virge->bios_rom, (char *) bios_fn, 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); + if (bios_fn != NULL) + { + if (info->local == S3_VIRGE_GX2) + rom_init(&virge->bios_rom, (char *) bios_fn, 0xc0000, 0x10000, 0xffff, 0, MEM_MAPPING_EXTERNAL); + else + rom_init(&virge->bios_rom, (char *) bios_fn, 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); + } mem_mapping_disable(&virge->bios_rom.mapping); From f9cd6c9b5f3863628a98b3102be9a6ca11d811de Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sat, 18 Feb 2023 01:16:16 +0600 Subject: [PATCH 260/285] Set default tablet tool to Pen --- src/device/mouse.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/device/mouse.c b/src/device/mouse.c index 12531e3ce..93384e063 100644 --- a/src/device/mouse.c +++ b/src/device/mouse.c @@ -40,7 +40,7 @@ int mouse_x, mouse_buttons, mouse_mode, mouse_tablet_in_proximity = 0, - tablet_tool_type = 0; /* 0 = Puck/Cursor, 1 = Pen */ + tablet_tool_type = 1; /* 0 = Puck/Cursor, 1 = Pen */ double mouse_x_abs, mouse_y_abs; From 1ad8d1870b7257b37df41a9cef73e96504fa419e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miran=20Gr=C4=8Da?= Date: Sat, 18 Feb 2023 23:40:17 +0100 Subject: [PATCH 261/285] Update README.md --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index 05a2a9ed2..a1e3985e1 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,16 @@ Licensing The emulator can also optionally make use of [munt](https://github.com/munt/munt), [FluidSynth](https://www.fluidsynth.org/), [Ghostscript](https://www.ghostscript.com/) and [Discord Game SDK](https://discord.com/developers/docs/game-sdk/sdk-starter-guide), which are distributed under their respective licenses. +Contribution requirements +------------------------- + Formal codification of the project's emulated hardware contribution requirements, which all have to be met to accept an addition: +* A ROM must be available; +* Documentation must be available or it must be feasible to reverse engineer with a reasonable amount of time and effort; +* It must be feasible to implement with a reasonable amount of time and effort; +* It has to fall inside the project's scope. + +Where unsure or for more details about the project's emulated hardware contribution requirements, contact a Contributor or higher. + Donations --------- We do not charge you for the emulator but donations are still welcome: From e7fec886d017e71b1a251a7249eb729e97aef319 Mon Sep 17 00:00:00 2001 From: ts-korhonen Date: Tue, 14 Feb 2023 09:12:23 +0200 Subject: [PATCH 262/285] qt: tabs to network interface settings. --- src/qt/qt_settings.ui | 18 +- src/qt/qt_settingsnetwork.ui | 712 ++++++++++++++++++++--------------- 2 files changed, 430 insertions(+), 300 deletions(-) diff --git a/src/qt/qt_settings.ui b/src/qt/qt_settings.ui index ec3198ebe..7b4d28bec 100644 --- a/src/qt/qt_settings.ui +++ b/src/qt/qt_settings.ui @@ -6,20 +6,20 @@ 0 0 - 831 - 595 + 800 + 570 - 831 - 595 + 800 + 570 - 831 - 595 + 800 + 570 @@ -29,6 +29,12 @@ + + 0 + + + 0 + diff --git a/src/qt/qt_settingsnetwork.ui b/src/qt/qt_settingsnetwork.ui index 763537c9e..d781a1beb 100644 --- a/src/qt/qt_settingsnetwork.ui +++ b/src/qt/qt_settingsnetwork.ui @@ -7,7 +7,7 @@ 0 0 548 - 458 + 488 @@ -27,302 +27,426 @@ 0 - - - Network Interface Contollers + + + 0 - - - - - - 0 - 0 - - - - Adapter - - - - - - - - 0 - 0 - - - - - - - - - 0 - 0 - - - - - - - - - 0 - 0 - - - - Configure - - - - - - - - 0 - 0 - - - - - - - - - 0 - 0 - - - - Card 3: - - - - - - - - 0 - 0 - - - - QComboBox::AdjustToContents - - - - - - - - 0 - 0 - - - - Card 1: - - - - - - - - 0 - 0 - - - - Interface - - - - - - - - 0 - 0 - - - - QComboBox::AdjustToContents - - - - - - - - 0 - 0 - - - - Configure - - - - - - - - 0 - 0 - - - - QComboBox::AdjustToContents - - - - - - - - 0 - 0 - - - - - - - - - 0 - 0 - - - - Card 4: - - - - - - - - 0 - 0 - - - - Mode - - - - - - - - 0 - 0 - - - - Card 2: - - - - - - - - 0 - 0 - - - - - - - - - 0 - 0 - - - - - - - - - 0 - 0 - - - - Configure - - - - - - - - 0 - 0 - - - - Configure - - - - - - - - 0 - 0 - - - - - - - - - 0 - 0 - - - - - - - - - 0 - 0 - - - - QComboBox::AdjustToContents - - - - + + + Network Card #1 + + + + + + + 0 + 0 + + + + QComboBox::AdjustToContents + + + + + + + + 0 + 0 + + + + Adapter + + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + Configure + + + + + + + + 0 + 0 + + + + Interface + + + + + + + + 0 + 0 + + + + Mode + + + + + + + + 0 + 0 + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + Network Card #2 + + + + + + + 0 + 0 + + + + Interface + + + + + + + + 0 + 0 + + + + Mode + + + + + + + + 0 + 0 + + + + Adapter + + + + + + + + 0 + 0 + + + + QComboBox::AdjustToContents + + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + + + + + Configure + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + Network Card #3 + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + Adapter + + + + + + + + 0 + 0 + + + + Mode + + + + + + + + 0 + 0 + + + + Interface + + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + Configure + + + + + + + + 0 + 0 + + + + QComboBox::AdjustToContents + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + Network Card #4 + + + + + + + 0 + 0 + + + + QComboBox::AdjustToContents + + + + + + + + 0 + 0 + + + + Configure + + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + Interface + + + + + + + + 0 + 0 + + + + Adapter + + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + Mode + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + - - - - Qt::Vertical - - - - 20 - 40 - - - - From 5e0a87f682c7bb9c78d60d64ccb1640c6bb90bf1 Mon Sep 17 00:00:00 2001 From: ts-korhonen Date: Tue, 14 Feb 2023 23:49:36 +0200 Subject: [PATCH 263/285] qt: make display settings narrower. --- src/qt/qt_settingsdisplay.ui | 168 ++++++++++++++++++++--------------- 1 file changed, 97 insertions(+), 71 deletions(-) diff --git a/src/qt/qt_settingsdisplay.ui b/src/qt/qt_settingsdisplay.ui index c9bbaf1c7..c34c7aa38 100644 --- a/src/qt/qt_settingsdisplay.ui +++ b/src/qt/qt_settingsdisplay.ui @@ -13,7 +13,7 @@ Form - + 0 @@ -26,14 +26,108 @@ 0 - + + + + + 0 + 0 + + + + Configure + + + + + + + XGA + + + + + + + + 0 + 0 + + + + Video: + + + + + + + + 0 + 0 + + + + + + + + Configure + + + + + + + + 0 + 0 + + + + Video #2: + + + + 8514/A - + + + + Voodoo Graphics + + + + + + + Configure + + + + + + + Configure + + + + + + + + 0 + 0 + + + + + Qt::Vertical @@ -46,74 +140,6 @@ - - - - - - - - 0 - 0 - - - - Configure - - - - - - - Voodoo Graphics - - - - - - - Configure - - - - - - - Video: - - - - - - - XGA - - - - - - - Configure - - - - - - - Video #2: - - - - - - - - - - Configure - - - From e536c4ca69cbbd4be6b3c91e729d97e7fbc860f9 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sun, 19 Feb 2023 22:49:30 +0600 Subject: [PATCH 264/285] device: Add extended parameters infrastructure --- src/device.c | 70 ++++++++++++++++++++++++++++++++------ src/include/86box/device.h | 43 +++++++++++++++-------- 2 files changed, 87 insertions(+), 26 deletions(-) diff --git a/src/device.c b/src/device.c index 52d2bb18e..79c84cd10 100644 --- a/src/device.c +++ b/src/device.c @@ -135,7 +135,7 @@ device_context_restore(void) } static void * -device_add_common(const device_t *d, const device_t *cd, void *p, int inst) +device_add_common(const device_t *d, const device_t *cd, void *p, void* params, int inst) { void *priv = NULL; int c; @@ -160,7 +160,7 @@ device_add_common(const device_t *d, const device_t *cd, void *p, int inst) device_set_context(&device_current, cd, inst); if (d->init != NULL) { - priv = d->init(d); + priv = (d->flags & DEVICE_EXTPARAMS) ? d->init_ext(d, params) : d->init(d); if (priv == NULL) { if (d->name) device_log("DEVICE: device '%s' init failed\n", d->name); @@ -199,55 +199,103 @@ device_get_internal_name(const device_t *d) void * device_add(const device_t *d) { - return device_add_common(d, d, NULL, 0); + return device_add_common(d, d, NULL, NULL, 0); +} + +void * +device_add_parameters(const device_t *d, void* params) +{ + return device_add_common(d, d, NULL, params, 0); } /* For devices that do not have an init function (internal video etc.) */ void device_add_ex(const device_t *d, void *priv) { - device_add_common(d, d, priv, 0); + device_add_common(d, d, priv, NULL, 0); +} + +void +device_add_ex_parameters(const device_t *d, void* priv, void *params) +{ + device_add_common(d, d, priv, params, 0); } void * device_add_inst(const device_t *d, int inst) { - return device_add_common(d, d, NULL, inst); + return device_add_common(d, d, NULL, NULL, inst); +} + +void * +device_add_inst_parameters(const device_t *d, int inst, void *params) +{ + return device_add_common(d, d, NULL, params, inst); } /* For devices that do not have an init function (internal video etc.) */ void device_add_inst_ex(const device_t *d, void *priv, int inst) { - device_add_common(d, d, priv, inst); + device_add_common(d, d, priv, NULL, inst); } -/* These four are to add a device with another device's context - will be +void +device_add_inst_ex_parameters(const device_t *d, void *priv, int inst, void *params) +{ + device_add_common(d, d, priv, params, inst); +} + +/* These eight are to add a device with another device's context - will be used to add machines' internal devices. */ void * device_cadd(const device_t *d, const device_t *cd) { - return device_add_common(d, cd, NULL, 0); + return device_add_common(d, cd, NULL, NULL, 0); +} + +void * +device_cadd_parameters(const device_t *d, const device_t *cd, void *params) +{ + return device_add_common(d, cd, NULL, params, 0); } /* For devices that do not have an init function (internal video etc.) */ void device_cadd_ex(const device_t *d, const device_t *cd, void *priv) { - device_add_common(d, cd, priv, 0); + device_add_common(d, cd, priv, NULL, 0); +} + +void +device_cadd_ex_parameters(const device_t *d, const device_t *cd, void *priv, void *params) +{ + device_add_common(d, cd, priv, params, 0); } void * device_cadd_inst(const device_t *d, const device_t *cd, int inst) { - return device_add_common(d, cd, NULL, inst); + return device_add_common(d, cd, NULL, NULL, inst); +} + +void * +device_cadd_inst_parameters(const device_t *d, const device_t *cd, int inst, void *params) +{ + return device_add_common(d, cd, NULL, params, inst); } /* For devices that do not have an init function (internal video etc.) */ void device_cadd_inst_ex(const device_t *d, const device_t *cd, void *priv, int inst) { - device_add_common(d, cd, priv, inst); + device_add_common(d, cd, priv, NULL, inst); +} + +void +device_cadd_inst_ex_parameters(const device_t *d, const device_t *cd, void *priv, int inst, void* params) +{ + device_add_common(d, cd, priv, params, inst); } void diff --git a/src/include/86box/device.h b/src/include/86box/device.h index 877ef660a..1c0e34045 100644 --- a/src/include/86box/device.h +++ b/src/include/86box/device.h @@ -57,19 +57,21 @@ #define CONFIG_SERPORT 12 enum { - DEVICE_PCJR = 2, /* requires an IBM PCjr */ - DEVICE_AT = 4, /* requires an AT-compatible system */ - DEVICE_PS2 = 8, /* requires a PS/1 or PS/2 system */ - DEVICE_ISA = 0x10, /* requires the ISA bus */ - DEVICE_CBUS = 0x20, /* requires the C-BUS bus */ - DEVICE_MCA = 0x40, /* requires the MCA bus */ - DEVICE_EISA = 0x80, /* requires the EISA bus */ - DEVICE_VLB = 0x100, /* requires the PCI bus */ - DEVICE_PCI = 0x200, /* requires the VLB bus */ - DEVICE_AGP = 0x400, /* requires the AGP bus */ - DEVICE_AC97 = 0x800, /* requires the AC'97 bus */ - DEVICE_COM = 0x1000, /* requires a serial port */ - DEVICE_LPT = 0x2000 /* requires a parallel port */ + DEVICE_PCJR = 2, /* requires an IBM PCjr */ + DEVICE_AT = 4, /* requires an AT-compatible system */ + DEVICE_PS2 = 8, /* requires a PS/1 or PS/2 system */ + DEVICE_ISA = 0x10, /* requires the ISA bus */ + DEVICE_CBUS = 0x20, /* requires the C-BUS bus */ + DEVICE_MCA = 0x40, /* requires the MCA bus */ + DEVICE_EISA = 0x80, /* requires the EISA bus */ + DEVICE_VLB = 0x100, /* requires the PCI bus */ + DEVICE_PCI = 0x200, /* requires the VLB bus */ + DEVICE_AGP = 0x400, /* requires the AGP bus */ + DEVICE_AC97 = 0x800, /* requires the AC'97 bus */ + DEVICE_COM = 0x1000, /* requires a serial port */ + DEVICE_LPT = 0x2000, /* requires a parallel port */ + + DEVICE_EXTPARAMS = 0x40000000 /* accepts extended parameters */ }; #define BIOS_NORMAL 0 @@ -118,9 +120,12 @@ typedef struct _device_ { const char *name; const char *internal_name; uint32_t flags; /* system flags */ - uint32_t local; /* flags local to device */ + uintptr_t local; /* flags local to device */ - void *(*init)(const struct _device_ *); + union { + void *(*init)(const struct _device_ *); + void *(*init_ext)(const struct _device_ *, void*); + }; void (*close)(void *priv); void (*reset)(void *priv); union { @@ -150,13 +155,21 @@ extern void device_context(const device_t *d); extern void device_context_inst(const device_t *d, int inst); extern void device_context_restore(void); extern void *device_add(const device_t *d); +extern void *device_add_parameters(const device_t *d, void *params); extern void device_add_ex(const device_t *d, void *priv); +extern void device_add_ex_parameters(const device_t *d, void *priv, void *params); extern void *device_add_inst(const device_t *d, int inst); +extern void *device_add_inst_parameters(const device_t *d, int inst, void *params); extern void device_add_inst_ex(const device_t *d, void *priv, int inst); +extern void device_add_inst_ex_parameters(const device_t *d, void *priv, int inst, void *params); extern void *device_cadd(const device_t *d, const device_t *cd); +extern void *device_cadd_parameters(const device_t *d, const device_t *cd, void *params); extern void device_cadd_ex(const device_t *d, const device_t *cd, void *priv); +extern void device_cadd_ex_parameters(const device_t *d, const device_t *cd, void *priv, void *params); extern void *device_cadd_inst(const device_t *d, const device_t *cd, int inst); +extern void *device_cadd_inst_parameters(const device_t *d, const device_t *cd, int inst, void *params); extern void device_cadd_inst_ex(const device_t *d, const device_t *cd, void *priv, int inst); +extern void device_cadd_inst_ex_parameters(const device_t *d, const device_t *cd, void *priv, int inst, void *params); extern void device_close_all(void); extern void device_reset_all(void); extern void device_reset_all_pci(void); From 4248d800406f6edde5eec0d3ae102fbeeeb10191 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Kn=C3=A1pek?= Date: Sun, 19 Feb 2023 18:47:43 +0100 Subject: [PATCH 265/285] Port PR#199 from pcem to 86Box. Source: https://github.com/sarah-walker-pcem/pcem/pull/199 --- src/video/vid_voodoo_banshee.c | 32 ++++++++++++-------------------- src/video/vid_voodoo_display.c | 16 +++++++--------- 2 files changed, 19 insertions(+), 29 deletions(-) diff --git a/src/video/vid_voodoo_banshee.c b/src/video/vid_voodoo_banshee.c index f451c4b58..6b6af2a09 100644 --- a/src/video/vid_voodoo_banshee.c +++ b/src/video/vid_voodoo_banshee.c @@ -14,6 +14,7 @@ * * Copyright 2008-2020 Sarah Walker. */ +#include #include #include #include @@ -2267,9 +2268,10 @@ banshee_overlay_draw(svga_t *svga, int displine) case VIDPROCCFG_FILTER_MODE_DITHER_4X4: if (banshee->voodoo->scrfilter && banshee->voodoo->scrfilterEnabled) { - uint8_t *fil = malloc((svga->overlay_latch.cur_xsize) * 3); - uint8_t *fil3 = malloc((svga->overlay_latch.cur_xsize) * 3); + uint8_t fil[64 * 3]; + uint8_t fil3[64 * 3]; + assert(svga->overlay_latch.cur_xsize <= 64); if (banshee->vidProcCfg & VIDPROCCFG_H_SCALE_ENABLE) /* leilei HACK - don't know of real 4x1 hscaled behavior yet, double for now */ { for (x = 0; x < svga->overlay_latch.cur_xsize; x++) { @@ -2320,9 +2322,6 @@ banshee_overlay_draw(svga_t *svga, int displine) fil[(x) *3 + 2] = vb_filter_v1_rb[fil[x * 3 + 2]][fil3[(x + 1) * 3 + 2]]; p[x] = (fil[x * 3 + 2] << 16) | (fil[x * 3 + 1] << 8) | fil[x * 3]; } - - free(fil); - free(fil3); } else /* filter disabled by emulator option */ { if (banshee->vidProcCfg & VIDPROCCFG_H_SCALE_ENABLE) { @@ -2339,15 +2338,16 @@ banshee_overlay_draw(svga_t *svga, int displine) case VIDPROCCFG_FILTER_MODE_DITHER_2X2: if (banshee->voodoo->scrfilter && banshee->voodoo->scrfilterEnabled) { - uint8_t *fil = malloc((svga->overlay_latch.cur_xsize) * 3); - uint8_t *soak = malloc((svga->overlay_latch.cur_xsize) * 3); - uint8_t *soak2 = malloc((svga->overlay_latch.cur_xsize) * 3); + uint8_t fil[64 * 3]; + uint8_t soak[64 * 3]; + uint8_t soak2[64 * 3]; - uint8_t *samp1 = malloc((svga->overlay_latch.cur_xsize) * 3); - uint8_t *samp2 = malloc((svga->overlay_latch.cur_xsize) * 3); - uint8_t *samp3 = malloc((svga->overlay_latch.cur_xsize) * 3); - uint8_t *samp4 = malloc((svga->overlay_latch.cur_xsize) * 3); + uint8_t samp1[64 * 3]; + uint8_t samp2[64 * 3]; + uint8_t samp3[64 * 3]; + uint8_t samp4[64 * 3]; + assert(svga->overlay_latch.cur_xsize <= 64); src = &svga->vram[src_addr2 & svga->vram_mask]; OVERLAY_SAMPLE(banshee->overlay_buffer[1]); for (x = 0; x < svga->overlay_latch.cur_xsize; x++) { @@ -2395,14 +2395,6 @@ banshee_overlay_draw(svga_t *svga, int displine) p[x] = (fil[x * 3 + 2] << 16) | (fil[x * 3 + 1] << 8) | fil[x * 3]; } } - - free(fil); - free(soak); - free(soak2); - free(samp1); - free(samp2); - free(samp3); - free(samp4); } else /* filter disabled by emulator option */ { if (banshee->vidProcCfg & VIDPROCCFG_H_SCALE_ENABLE) { diff --git a/src/video/vid_voodoo_display.c b/src/video/vid_voodoo_display.c index 822085127..34037605a 100644 --- a/src/video/vid_voodoo_display.c +++ b/src/video/vid_voodoo_display.c @@ -14,6 +14,7 @@ * * Copyright 2008-2020 Sarah Walker. */ +#include #include #include #include @@ -373,8 +374,9 @@ voodoo_filterline_v1(voodoo_t *voodoo, uint8_t *fil, int column, uint16_t *src, int x; // Scratchpad for avoiding feedback streaks - uint8_t *fil3 = malloc((voodoo->h_disp) * 3); + uint8_t fil3[4096 * 3]; + assert(voodoo->h_disp <= 4096); /* 16 to 32-bit */ for (x = 0; x < column; x++) { fil[x * 3] = ((src[x] & 31) << 3); @@ -422,8 +424,6 @@ voodoo_filterline_v1(voodoo_t *voodoo, uint8_t *fil, int column, uint16_t *src, fil[(x) *3 + 1] = voodoo->thefilterg[fil3[x * 3 + 1]][fil3[(x + 1) * 3 + 1]]; fil[(x) *3 + 2] = voodoo->thefilter[fil3[x * 3 + 2]][fil3[(x + 1) * 3 + 2]]; } - - free(fil3); } static void @@ -432,8 +432,9 @@ voodoo_filterline_v2(voodoo_t *voodoo, uint8_t *fil, int column, uint16_t *src, int x; // Scratchpad for blending filter - uint8_t *fil3 = malloc((voodoo->h_disp) * 3); + uint8_t fil3[4096 * 3]; + assert(voodoo->h_disp <= 4096); /* 16 to 32-bit */ for (x = 0; x < column; x++) { // Blank scratchpads @@ -487,8 +488,6 @@ voodoo_filterline_v2(voodoo_t *voodoo, uint8_t *fil, int column, uint16_t *src, fil3[(column - 1) * 3] = voodoo->thefilterb[fil[(column - 1) * 3]][((src[column] & 31) << 3)]; fil3[(column - 1) * 3 + 1] = voodoo->thefilterg[fil[(column - 1) * 3 + 1]][(((src[column] >> 5) & 63) << 2)]; fil3[(column - 1) * 3 + 2] = voodoo->thefilter[fil[(column - 1) * 3 + 2]][(((src[column] >> 11) & 31) << 3)]; - - free(fil3); } void @@ -537,8 +536,9 @@ voodoo_callback(void *p) monitor->target_buffer->line[voodoo->line + 8][x] = 0x00000000; if (voodoo->scrfilter && voodoo->scrfilterEnabled) { - uint8_t *fil = malloc((voodoo->h_disp) * 3); /* interleaved 24-bit RGB */ + uint8_t fil[4096 * 3]; /* interleaved 24-bit RGB */ + assert(voodoo->h_disp <= 4096); if (voodoo->type == VOODOO_2) voodoo_filterline_v2(voodoo, fil, voodoo->h_disp, src, voodoo->line); else @@ -547,8 +547,6 @@ voodoo_callback(void *p) for (x = 0; x < voodoo->h_disp; x++) { p[x] = (voodoo->clutData256[fil[x * 3]].b << 0 | voodoo->clutData256[fil[x * 3 + 1]].g << 8 | voodoo->clutData256[fil[x * 3 + 2]].r << 16); } - - free(fil); } else { for (x = 0; x < voodoo->h_disp; x++) { p[x] = draw_voodoo->video_16to32[src[x]]; From 424c9489c502ae4d4e91cfcc931db28d1b26d468 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Mon, 20 Feb 2023 00:55:03 +0600 Subject: [PATCH 266/285] machine.h: Make `chipset` `uintptr_t` --- src/include/86box/machine.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index 5a5b0bfda..4d1effe9a 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -279,7 +279,7 @@ typedef struct _machine_ { const char *name; const char *internal_name; uint32_t type; - uint32_t chipset; + uintptr_t chipset; int (*init)(const struct _machine_ *); uintptr_t pad, pad0, pad1, pad2; const machine_cpu_t cpu; From b8bfaa926937d38ffa0f8a1fcf685312bfb038b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Sun, 19 Feb 2023 23:05:16 +0100 Subject: [PATCH 267/285] Fix buffer lengths in `swprintf` calls --- src/86box.c | 6 +++--- src/win/win_about.c | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/86box.c b/src/86box.c index 11d5c1ff8..f318bcfbc 100644 --- a/src/86box.c +++ b/src/86box.c @@ -853,7 +853,7 @@ pc_init_modules(void) /* Load the ROMs for the selected machine. */ if (!machine_available(machine)) { - swprintf(temp, sizeof(temp), plat_get_string(IDS_2063), machine_getname()); + swprintf(temp, sizeof_w(temp), plat_get_string(IDS_2063), machine_getname()); c = 0; machine = -1; while (machine_get_internal_name_ex(c) != NULL) { @@ -876,7 +876,7 @@ pc_init_modules(void) if (!video_card_available(gfxcard[0])) { memset(tempc, 0, sizeof(tempc)); device_get_name(video_card_getdevice(gfxcard[0]), 0, tempc); - swprintf(temp, sizeof(temp), plat_get_string(IDS_2064), tempc); + swprintf(temp, sizeof_w(temp), plat_get_string(IDS_2064), tempc); c = 0; while (video_get_internal_name(c) != NULL) { gfxcard[0] = -1; @@ -898,7 +898,7 @@ 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(temp), (wchar_t *) "Video card #2 \"%hs\" is not available due to missing ROMs in the roms/video directory. Disabling the second video card.", tempc); + swprintf(temp, sizeof_w(temp), (wchar_t *) "Video card #2 \"%hs\" is not available due to missing ROMs in the roms/video directory. Disabling the second video card.", tempc); ui_msgbox_header(MBX_INFO, (wchar_t *) IDS_2129, temp); gfxcard[1] = 0; } diff --git a/src/win/win_about.c b/src/win/win_about.c index f0c692b75..82b327d2e 100644 --- a/src/win/win_about.c +++ b/src/win/win_about.c @@ -43,9 +43,9 @@ AboutDialogCreate(HWND hwnd) }; wchar_t emu_version[256]; - i = swprintf(emu_version, sizeof(emu_version), L"%ls v%ls", EMU_NAME_W, EMU_VERSION_FULL_W); + i = swprintf(emu_version, sizeof_w(emu_version), L"%ls v%ls", EMU_NAME_W, EMU_VERSION_FULL_W); #ifdef EMU_GIT_HASH - i += swprintf(&emu_version[i], sizeof(emu_version) - i, L" [%ls]", EMU_GIT_HASH_W); + i += swprintf(&emu_version[i], sizeof_w(emu_version) - i, L" [%ls]", EMU_GIT_HASH_W); #endif #if defined(__arm__) || defined(__TARGET_ARCH_ARM) @@ -59,7 +59,7 @@ AboutDialogCreate(HWND hwnd) #else # define ARCH_STR L"unknown" #endif - swprintf(&emu_version[i], sizeof(emu_version) - i, L" [%ls, %ls]", ARCH_STR, plat_get_string(IDS_DYNAREC)); + swprintf(&emu_version[i], sizeof_w(emu_version) - i, L" [%ls, %ls]", ARCH_STR, plat_get_string(IDS_DYNAREC)); tdconfig.cbSize = sizeof(tdconfig); tdconfig.hwndParent = hwnd; From 6cd11f3fc405f60f0cda20017c16d073d170f783 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 21 Feb 2023 19:24:38 +0100 Subject: [PATCH 268/285] Corrected the MMU function called in one recompiled instruction, fixes fatals when unpacking Windows 2000 updates. --- src/codegen/codegen_ops_arith.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/codegen/codegen_ops_arith.h b/src/codegen/codegen_ops_arith.h index f1c426838..87f1640e6 100644 --- a/src/codegen/codegen_ops_arith.h +++ b/src/codegen/codegen_ops_arith.h @@ -744,7 +744,7 @@ rop81_l(uint8_t opcode, uint32_t fetchdat, uint32_t op_32, uint32_t op_pc, codeb host_reg = 0; } else { SAVE_EA(); - MEM_CHECK_WRITE(target_seg); + MEM_CHECK_WRITE_L(target_seg); host_reg = MEM_LOAD_ADDR_EA_L_NO_ABRT(target_seg); } } else { From 29c7e10cb3a2ccf1096009c1a3ea533f68ffac62 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 21 Feb 2023 18:50:09 -0500 Subject: [PATCH 269/285] Fix the wdxt-gen's ID --- src/disk/hdc_st506_xt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/disk/hdc_st506_xt.c b/src/disk/hdc_st506_xt.c index 08f1329be..94d59091b 100644 --- a/src/disk/hdc_st506_xt.c +++ b/src/disk/hdc_st506_xt.c @@ -2141,7 +2141,7 @@ const device_t st506_xt_xebec_device = { const device_t st506_xt_wdxt_gen_device = { .name = "Western Digital WDXT-GEN (MFM)", - .internal_name = "st506_xt", + .internal_name = "st506_xt_gen", .flags = DEVICE_ISA, .local = (HDD_BUS_MFM << 8) | ST506_XT_TYPE_WDXT_GEN, .init = st506_init, From 8e9f969e1aef217ff8329c715aa3b298772c8169 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Wed, 22 Feb 2023 07:31:05 -0500 Subject: [PATCH 270/285] Fix wdxt --- src/disk/hdc_st506_xt.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/disk/hdc_st506_xt.c b/src/disk/hdc_st506_xt.c index 94d59091b..e42516c3f 100644 --- a/src/disk/hdc_st506_xt.c +++ b/src/disk/hdc_st506_xt.c @@ -1733,6 +1733,12 @@ xebec_available(void) return (rom_present(XEBEC_BIOS_FILE)); } +static int +wdxt_available(void) +{ + return (rom_present(WDXT_GEN_BIOS_FILE)); +} + static int dtc5150x_available(void) { @@ -2147,7 +2153,7 @@ const device_t st506_xt_wdxt_gen_device = { .init = st506_init, .close = st506_close, .reset = NULL, - { .available = xebec_available }, + { .available = wdxt_available }, .speed_changed = NULL, .force_redraw = NULL, .config = NULL From 63ed285b869db9eb48784f2a5ded5f608b113708 Mon Sep 17 00:00:00 2001 From: eientei Date: Fri, 24 Feb 2023 16:03:53 +1300 Subject: [PATCH 271/285] Make joysticks work with the PCjr --- src/machine/m_pcjr.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/machine/m_pcjr.c b/src/machine/m_pcjr.c index 0b1f8ec58..c4d4ed53a 100644 --- a/src/machine/m_pcjr.c +++ b/src/machine/m_pcjr.c @@ -37,6 +37,7 @@ #include <86box/pit.h> #include <86box/mem.h> #include <86box/device.h> +#include <86box/gameport.h> #include <86box/serial.h> #include <86box/keyboard.h> #include <86box/rom.h> @@ -815,5 +816,8 @@ machine_pcjr_init(const machine_t *model) device_add(&ns8250_pcjr_device); serial_set_next_inst(SERIAL_MAX); /* So that serial_standalone_init() won't do anything. */ + /* "All the inputs are 'read' with one 'IN' from address hex 201." - PCjr Technical Reference (Nov. 83), p.2-119 */ + standalone_gameport_type = &gameport_201_device; + return ret; } From 1f0da2d557d47c20c75801f9ba7a87a06b8eba7f Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Fri, 24 Feb 2023 01:43:59 -0500 Subject: [PATCH 272/285] Fix accidental reversion from Socket 7 to socket 5 in two machines --- 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 aa09866da..0ec772669 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -8584,7 +8584,7 @@ const machine_t machines[] = { { .name = "[i430FX] DataExpert EXP8551", .internal_name = "exp8551", - .type = MACHINE_TYPE_SOCKET5, + .type = MACHINE_TYPE_SOCKET7_3V, .chipset = MACHINE_CHIPSET_INTEL_430FX, .init = machine_at_exp8551_init, .pad = 0, @@ -8906,7 +8906,7 @@ const machine_t machines[] = { { .name = "[i430FX] PC Partner MB500N", .internal_name = "mb500n", - .type = MACHINE_TYPE_SOCKET5, + .type = MACHINE_TYPE_SOCKET7_3V, .chipset = MACHINE_CHIPSET_INTEL_430FX, .init = machine_at_mb500n_init, .pad = 0, From 35029deb8ef47d400dbc3cc567a024410bb80391 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Fri, 24 Feb 2023 15:07:42 +0600 Subject: [PATCH 273/285] qt: Poll for 4th and 5th mouse buttons on Windows --- src/qt/qt_winrawinputfilter.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/qt/qt_winrawinputfilter.cpp b/src/qt/qt_winrawinputfilter.cpp index 6690a08eb..08af142a6 100644 --- a/src/qt/qt_winrawinputfilter.cpp +++ b/src/qt/qt_winrawinputfilter.cpp @@ -340,6 +340,16 @@ WindowsRawInputFilter::mouse_handle(PRAWINPUT raw) else if (state.usButtonFlags & RI_MOUSE_RIGHT_BUTTON_UP) buttons &= ~2; + if (state.usButtonFlags & RI_MOUSE_BUTTON_4_DOWN) + buttons |= 8; + else if (state.usButtonFlags & RI_MOUSE_BUTTON_4_UP) + buttons &= ~8; + + if (state.usButtonFlags & RI_MOUSE_BUTTON_5_DOWN) + buttons |= 16; + else if (state.usButtonFlags & RI_MOUSE_BUTTON_5_UP) + buttons &= ~16; + if (state.usButtonFlags & RI_MOUSE_WHEEL) { dwheel += (SHORT) state.usButtonData / 120; } From 0395ea02a1caab163b67eac6948c787571cfcf80 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Fri, 24 Feb 2023 16:50:38 +0600 Subject: [PATCH 274/285] qt: Poll from Qt code instead of RawInput code on Windows when absolute mode is used Fixes tablet input --- src/qt/qt_rendererstack.cpp | 8 +++++--- src/qt/qt_winrawinputfilter.cpp | 1 + 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/qt/qt_rendererstack.cpp b/src/qt/qt_rendererstack.cpp index 3d5faff34..9ebd891c3 100644 --- a/src/qt/qt_rendererstack.cpp +++ b/src/qt/qt_rendererstack.cpp @@ -145,9 +145,11 @@ void RendererStack::mousePoll() { #ifdef Q_OS_WINDOWS - mouse_x_abs = mousedata.x_abs; - mouse_y_abs = mousedata.y_abs; - return; + if (mouse_mode == 0) { + mouse_x_abs = mousedata.x_abs; + mouse_y_abs = mousedata.y_abs; + return; + } #endif #ifndef __APPLE__ mouse_x = mousedata.deltax; diff --git a/src/qt/qt_winrawinputfilter.cpp b/src/qt/qt_winrawinputfilter.cpp index 6690a08eb..309f7b2d0 100644 --- a/src/qt/qt_winrawinputfilter.cpp +++ b/src/qt/qt_winrawinputfilter.cpp @@ -373,6 +373,7 @@ WindowsRawInputFilter::mouse_handle(PRAWINPUT raw) void WindowsRawInputFilter::mousePoll() { + if (mouse_mode >= 1) return; if (mouse_capture || video_fullscreen) { static int b = 0; From d7134acacc61edf28a0c04357a8e444142661d35 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 28 Feb 2023 00:03:43 -0500 Subject: [PATCH 275/285] Bump version to 4.0 --- CMakeLists.txt | 2 +- debian/changelog | 4 ++-- src/include_make/86box/version.h | 8 ++++---- src/unix/assets/86Box.spec | 4 ++-- src/unix/assets/net.86box.86Box.metainfo.xml | 2 +- vcpkg.json | 2 +- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e4d5c4061..8070ff263 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -39,7 +39,7 @@ if(MUNT_EXTERNAL) endif() project(86Box - VERSION 3.11 + VERSION 4.0 DESCRIPTION "Emulator of x86-based systems" HOMEPAGE_URL "https://86box.net" LANGUAGES C CXX) diff --git a/debian/changelog b/debian/changelog index 45b701f83..1bca318dd 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,5 +1,5 @@ -86box (3.11.0-1) UNRELEASED; urgency=medium +86box (4.0) UNRELEASED; urgency=medium * Bump release. - -- Jasmine Iwanek Sun, 18 Nov 2022 23:27:00 -0500 + -- Jasmine Iwanek Tue, 28 Feb 2023 00:02:16 -0500 diff --git a/src/include_make/86box/version.h b/src/include_make/86box/version.h index e4792969c..96e81ce5f 100644 --- a/src/include_make/86box/version.h +++ b/src/include_make/86box/version.h @@ -22,11 +22,11 @@ #define EMU_NAME "86Box" #define EMU_NAME_W LSTR(EMU_NAME) -#define EMU_VERSION "3.11" +#define EMU_VERSION "4.0" #define EMU_VERSION_W LSTR(EMU_VERSION) #define EMU_VERSION_EX "3.50" /* frozen due to IDE re-detection behavior on Windows */ -#define EMU_VERSION_MAJ 3 -#define EMU_VERSION_MIN 11 +#define EMU_VERSION_MAJ 4 +#define EMU_VERSION_MIN 0 #define EMU_VERSION_PATCH 0 #define EMU_BUILD_NUM 0 @@ -42,7 +42,7 @@ #define EMU_ROMS_URL "https://github.com/86Box/roms/releases/latest" #define EMU_ROMS_URL_W LSTR(EMU_ROMS_URL) #ifdef RELEASE_BUILD -# define EMU_DOCS_URL "https://86box.readthedocs.io/en/v3.11/" +# define EMU_DOCS_URL "https://86box.readthedocs.io/en/v4.0/" #else # define EMU_DOCS_URL "https://86box.readthedocs.io" #endif diff --git a/src/unix/assets/86Box.spec b/src/unix/assets/86Box.spec index 9fac0dde4..e994ca4a7 100644 --- a/src/unix/assets/86Box.spec +++ b/src/unix/assets/86Box.spec @@ -15,7 +15,7 @@ %global romver v3.11 Name: 86Box -Version: 3.11 +Version: 4.0 Release: 1%{?dist} Summary: Classic PC emulator License: GPLv2+ @@ -117,5 +117,5 @@ popd %{_datadir}/%{name}/roms %changelog -* Fri Nov 18 2022 Robert de Rooy 3.11-1 +* Tue Feb 28 2023 Robert de Rooy 4.0-1 - Bump release diff --git a/src/unix/assets/net.86box.86Box.metainfo.xml b/src/unix/assets/net.86box.86Box.metainfo.xml index 3cd4b9ba2..59671d0f9 100644 --- a/src/unix/assets/net.86box.86Box.metainfo.xml +++ b/src/unix/assets/net.86box.86Box.metainfo.xml @@ -10,7 +10,7 @@ net.86box.86Box.desktop - + diff --git a/vcpkg.json b/vcpkg.json index c9fd8eceb..890aeed46 100644 --- a/vcpkg.json +++ b/vcpkg.json @@ -1,6 +1,6 @@ { "name": "86box", - "version-string": "3.11", + "version-string": "4.0", "homepage": "https://86box.net/", "documentation": "https://86box.readthedocs.io/", "license": "GPL-2.0-or-later", From 875a9fe373cb7bcfa35aee8525a6e958dfd0f90a Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Tue, 28 Feb 2023 17:27:59 -0300 Subject: [PATCH 276/285] ACPI: Add undocumented ALi M1543C suspend type used by ASUS P5A, fixes shutdown hang/reboot --- src/acpi.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/acpi.c b/src/acpi.c index 2c5f2ff90..f5c98b6e9 100644 --- a/src/acpi.c +++ b/src/acpi.c @@ -672,6 +672,7 @@ acpi_reg_write_common_regs(int size, uint16_t addr, uint8_t val, void *p) /* PMCNTRL - Power Management Control Register (IO) */ if ((addr == 0x05) && (val & 0x20)) { sus_typ = dev->suspend_types[(val >> 2) & 7]; + acpi_log("ACPI suspend type %d flags %02X\n", (val >> 2) & 7, sus_typ); if (sus_typ & SUS_POWER_OFF) { /* Soft power off. */ @@ -1698,6 +1699,7 @@ acpi_init(const device_t *info) dev->suspend_types[1] = SUS_POWER_OFF; dev->suspend_types[2] = SUS_SUSPEND | SUS_NVR | SUS_RESET_CPU | SUS_RESET_PCI; dev->suspend_types[3] = SUS_SUSPEND; + dev->suspend_types[5] = SUS_POWER_OFF; /* undocumented, used for S4/S5 by ASUS P5A ACPI table */ break; case VEN_VIA: From 5653ae85d975a4b4a69d4dc9b8ec0e6f1ac59981 Mon Sep 17 00:00:00 2001 From: Alexander Babikov <2708460+lemondrops@users.noreply.github.com> Date: Tue, 28 Feb 2023 12:23:59 +0500 Subject: [PATCH 277/285] Switch more device_t's to named initializers Fixes "missing braces around initializer" warnings --- src/machine/m_pcjr.c | 22 +++++++++++----------- src/sio/sio_fdc37c669.c | 6 +++--- src/sio/sio_fdc37c93x.c | 22 +++++++++++----------- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/src/machine/m_pcjr.c b/src/machine/m_pcjr.c index c4d4ed53a..d1eafef79 100644 --- a/src/machine/m_pcjr.c +++ b/src/machine/m_pcjr.c @@ -743,17 +743,17 @@ static const device_config_t pcjr_config[] = { }; const device_t pcjr_device = { - "IBM PCjr", - "pcjr", - 0, - 0, - NULL, - NULL, - NULL, - { NULL }, - speed_changed, - NULL, - pcjr_config + .name = "IBM PCjr", + .internal_name = "pcjr", + .flags = 0, + .local = 0, + .init = NULL, + .close = NULL, + .reset = NULL, + { .available = NULL }, + .speed_changed = speed_changed, + .force_redraw = NULL, + .config = pcjr_config }; int diff --git a/src/sio/sio_fdc37c669.c b/src/sio/sio_fdc37c669.c index a8bc4d700..219213d69 100644 --- a/src/sio/sio_fdc37c669.c +++ b/src/sio/sio_fdc37c669.c @@ -338,9 +338,9 @@ const device_t fdc37c669_370_device = { .internal_name = "fdc37c669_370", .flags = 0, .local = 1, - fdc37c669_init, - fdc37c669_close, - .reset = NULL, + .init = fdc37c669_init, + .close = fdc37c669_close, + .reset = NULL, { .available = NULL }, .speed_changed = NULL, .force_redraw = NULL, diff --git a/src/sio/sio_fdc37c93x.c b/src/sio/sio_fdc37c93x.c index 55464ec98..110289f1f 100644 --- a/src/sio/sio_fdc37c93x.c +++ b/src/sio/sio_fdc37c93x.c @@ -793,17 +793,17 @@ access_bus_init(const device_t *info) } static const device_t access_bus_device = { - "SMC FDC37C932FR ACCESS.bus", - "access_bus", - 0, - 0x03, - access_bus_init, - access_bus_close, - NULL, - { NULL }, - NULL, - NULL, - NULL + .name = "SMC FDC37C932FR ACCESS.bus", + .internal_name = "access_bus", + .flags = 0, + .local = 0x03, + .init = access_bus_init, + .close = access_bus_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL }; static void From 0a5ebf939bf35dca2925062c17e045c0f5a3715e Mon Sep 17 00:00:00 2001 From: Alexander Babikov <2708460+lemondrops@users.noreply.github.com> Date: Tue, 28 Feb 2023 12:24:31 +0500 Subject: [PATCH 278/285] qt: Remove a no longer used function --- src/qt/qt_settingsfloppycdrom.cpp | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/qt/qt_settingsfloppycdrom.cpp b/src/qt/qt_settingsfloppycdrom.cpp index 609c76fc0..4d2f6e9f9 100644 --- a/src/qt/qt_settingsfloppycdrom.cpp +++ b/src/qt/qt_settingsfloppycdrom.cpp @@ -90,14 +90,6 @@ setCDROMSpeed(QAbstractItemModel *model, const QModelIndex &idx, uint8_t speed) model->setData(i, speed, Qt::UserRole); } -static void -setCDROMEarly(QAbstractItemModel *model, const QModelIndex &idx, bool early) -{ - auto i = idx.siblingAtColumn(2); - model->setData(i, (early == true) ? QObject::tr("On") : QObject::tr("Off")); - model->setData(i, early, Qt::UserRole); -} - static void setCDROMType(QAbstractItemModel *model, const QModelIndex &idx, int type) { From ba57ed190b26a8b72dbbfba7a3137b311cb2aa62 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sun, 8 Jan 2023 15:58:36 -0500 Subject: [PATCH 279/285] Fix a bug in the VTech Laser Turbo XT --- src/include/86box/keyboard.h | 4 ++-- src/machine/m_xt_laserxt.c | 31 +++++++++++++++++++------------ 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/src/include/86box/keyboard.h b/src/include/86box/keyboard.h index 1f7d8860c..b89c4504d 100644 --- a/src/include/86box/keyboard.h +++ b/src/include/86box/keyboard.h @@ -152,7 +152,7 @@ extern const device_t keyboard_xt_t1x00_device; extern const device_t keyboard_tandy_device; # if defined(DEV_BRANCH) && defined(USE_LASERXT) extern const device_t keyboard_xt_lxt3_device; -# endif +# endif /*defined(DEV_BRANCH) && defined(USE_LASERXT) */ extern const device_t keyboard_xt_olivetti_device; extern const device_t keyboard_xt_zenith_device; extern const device_t keyboard_xtclone_device; @@ -176,7 +176,7 @@ extern const device_t keyboard_ps2_ami_pci_device; extern const device_t keyboard_ps2_intel_ami_pci_device; extern const device_t keyboard_ps2_acer_pci_device; extern const device_t keyboard_ps2_ali_pci_device; -#endif +#endif /*EMU_DEVICE_H*/ extern void keyboard_init(void); extern void keyboard_close(void); diff --git a/src/machine/m_xt_laserxt.c b/src/machine/m_xt_laserxt.c index 02635ee8b..418835a0b 100644 --- a/src/machine/m_xt_laserxt.c +++ b/src/machine/m_xt_laserxt.c @@ -136,6 +136,22 @@ laserxt_init(int is_lxt3) laserxt_is_lxt3 = is_lxt3; } +static void +machine_xt_laserxt_common_init(const machine_t *model,int is_lxt3) +{ + 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; + + laserxt_init(is_lxt3); +} + int machine_xt_laserxt_init(const machine_t *model) { @@ -147,9 +163,9 @@ machine_xt_laserxt_init(const machine_t *model) if (bios_only || !ret) return ret; - machine_xt_init(model); + device_add(&keyboard_xt_device); - laserxt_init(0); + machine_xt_laserxt_common_init(model, 0); return ret; } @@ -165,18 +181,9 @@ machine_xt_lxt3_init(const machine_t *model) if (bios_only || !ret) return ret; - machine_common_init(model); - - pit_devs[0].set_out_func(pit_devs[0].data, 1, pit_refresh_timer_xt); - device_add(&keyboard_xt_lxt3_device); - if (fdc_type == FDC_INTERNAL) - device_add(&fdc_xt_device); - nmi_init(); - standalone_gameport_type = &gameport_device; - - laserxt_init(1); + machine_xt_laserxt_common_init(model, 1); return ret; } From 610401de7a3aa1100075811f7ffc61f022f2c9df Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 28 Feb 2023 23:24:58 -0500 Subject: [PATCH 280/285] Yet more clang-formatting --- src/86box.c | 80 +++---- src/acpi.c | 6 +- src/chipset/ali1429.c | 297 ++++++++++++----------- src/chipset/ali1435.c | 250 ++++++++++---------- src/chipset/ali6117.c | 66 +++--- src/chipset/scat.c | 12 +- src/chipset/sis_85c50x.c | 206 ++++++++-------- src/config.c | 6 +- src/device.c | 10 +- src/device/isartc.c | 4 +- src/device/mouse.c | 5 +- src/device/mouse_serial.c | 2 +- src/device/mouse_wacom_tablet.c | 202 ++++++++-------- src/device/serial.c | 19 +- src/discord.c | 2 +- src/disk/hdc_ide.c | 6 +- src/disk/hdc_xta.c | 4 +- src/floppy/fdc_monster.c | 31 +-- src/floppy/fdi2raw.c | 4 +- src/machine/m_at_386dx_486.c | 14 +- src/machine/machine_table.c | 1 - src/network/net_3c501.c | 366 ++++++++++++++--------------- src/pci_dummy.c | 157 +++++++------ src/scsi/scsi_cdrom.c | 353 ++++++++++++++-------------- src/scsi/scsi_ncr5380.c | 6 +- src/scsi/scsi_spock.c | 8 +- src/sio/sio_ali5123.c | 16 +- src/sound/snd_optimc.c | 8 +- src/sound/sound.c | 38 +-- src/unix/unix.c | 6 +- src/unix/unix_serial_passthrough.c | 4 +- src/video/vid_mga.c | 26 +- src/video/vid_s3.c | 18 +- src/video/vid_s3_virge.c | 13 +- src/video/vid_svga.c | 14 +- src/video/vid_tvp3026_ramdac.c | 2 +- src/video/vid_voodoo_banshee.c | 9 +- src/video/vid_voodoo_display.c | 4 +- src/video/video.c | 2 - src/vnc.c | 6 +- src/win/win.c | 4 +- src/win/win_devconf.c | 6 +- src/win/win_serial_passthrough.c | 76 +++--- src/win/win_settings.c | 104 ++++---- src/win/win_ui.c | 2 +- 45 files changed, 1245 insertions(+), 1230 deletions(-) diff --git a/src/86box.c b/src/86box.c index 344d3c63d..28012ea7a 100644 --- a/src/86box.c +++ b/src/86box.c @@ -150,47 +150,47 @@ uint64_t instru_run_ms = 0; /* Configuration values. */ int window_remember; -int vid_resize; /* (C) allow resizing */ -int invert_display = 0; /* (C) invert the display */ -int suppress_overscan = 0; /* (C) suppress overscans */ -int scale = 0; /* (C) screen scale factor */ -int dpi_scale = 0; /* (C) DPI scaling of the emulated screen */ -int vid_api = 0; /* (C) video renderer */ -int vid_cga_contrast = 0; /* (C) video */ -int video_fullscreen = 0; /* (C) video */ -int video_fullscreen_scale = 0; /* (C) video */ -int video_fullscreen_first = 0; /* (C) video */ -int enable_overscan = 0; /* (C) video */ -int force_43 = 0; /* (C) video */ -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 */ +int vid_resize; /* (C) allow resizing */ +int invert_display = 0; /* (C) invert the display */ +int suppress_overscan = 0; /* (C) suppress overscans */ +int scale = 0; /* (C) screen scale factor */ +int dpi_scale = 0; /* (C) DPI scaling of the emulated screen */ +int vid_api = 0; /* (C) video renderer */ +int vid_cga_contrast = 0; /* (C) video */ +int video_fullscreen = 0; /* (C) video */ +int video_fullscreen_scale = 0; /* (C) video */ +int video_fullscreen_first = 0; /* (C) video */ +int enable_overscan = 0; /* (C) video */ +int force_43 = 0; /* (C) video */ +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 */ -int bugger_enabled = 0; /* (C) enable ISAbugger */ -int postcard_enabled = 0; /* (C) enable POST card */ -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 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 */ -int ibm8514_enabled = 0; /* (C) video option */ -int xga_enabled = 0; /* (C) video option */ -uint32_t mem_size = 0; /* (C) memory size (Installed on system board)*/ -uint32_t isa_mem_size = 0; /* (C) memory size (ISA Memory Cards) */ -int cpu_use_dynarec = 0; /* (C) cpu uses/needs Dyna */ -int cpu = 0; /* (C) cpu type */ -int fpu_type = 0; /* (C) fpu type */ -int time_sync = 0; /* (C) enable time sync */ -int confirm_reset = 1; /* (C) enable reset confirmation */ -int confirm_exit = 1; /* (C) enable exit confirmation */ -int confirm_save = 1; /* (C) enable save confirmation */ -int enable_discord = 0; /* (C) enable Discord integration */ -int pit_mode = -1; /* (C) force setting PIT mode */ -int fm_driver = 0; /* (C) select FM sound driver */ -int open_dir_usr_path = 0; /* default file open dialog directory of usr_path */ -int video_fullscreen_scale_maximized = 0; /* (C) Whether fullscreen scaling settings also apply when maximized. */ +int bugger_enabled = 0; /* (C) enable ISAbugger */ +int postcard_enabled = 0; /* (C) enable POST card */ +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 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 */ +int ibm8514_enabled = 0; /* (C) video option */ +int xga_enabled = 0; /* (C) video option */ +uint32_t mem_size = 0; /* (C) memory size (Installed on system board)*/ +uint32_t isa_mem_size = 0; /* (C) memory size (ISA Memory Cards) */ +int cpu_use_dynarec = 0; /* (C) cpu uses/needs Dyna */ +int cpu = 0; /* (C) cpu type */ +int fpu_type = 0; /* (C) fpu type */ +int time_sync = 0; /* (C) enable time sync */ +int confirm_reset = 1; /* (C) enable reset confirmation */ +int confirm_exit = 1; /* (C) enable exit confirmation */ +int confirm_save = 1; /* (C) enable save confirmation */ +int enable_discord = 0; /* (C) enable Discord integration */ +int pit_mode = -1; /* (C) force setting PIT mode */ +int fm_driver = 0; /* (C) select FM sound driver */ +int open_dir_usr_path = 0; /* default file open dialog directory of usr_path */ +int video_fullscreen_scale_maximized = 0; /* (C) Whether fullscreen scaling settings also apply when maximized. */ /* Statistics. */ extern int mmuflush; diff --git a/src/acpi.c b/src/acpi.c index f5c98b6e9..cafa06229 100644 --- a/src/acpi.c +++ b/src/acpi.c @@ -40,9 +40,9 @@ #include <86box/i2c.h> #include <86box/video.h> -int acpi_rtc_status = 0; +int acpi_rtc_status = 0; atomic_int acpi_pwrbut_pressed = 0; -int acpi_enabled = 0; +int acpi_enabled = 0; static double cpu_to_acpi; @@ -1520,7 +1520,7 @@ acpi_ali_soft_smi_status_write(acpi_t *dev, uint8_t soft_smi) } void -acpi_pwrbtn_timer(void* priv) +acpi_pwrbtn_timer(void *priv) { acpi_t *dev = (acpi_t *) priv; diff --git a/src/chipset/ali1429.c b/src/chipset/ali1429.c index 500b1c6a0..937725b92 100644 --- a/src/chipset/ali1429.c +++ b/src/chipset/ali1429.c @@ -1,21 +1,21 @@ /* - * 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. * - * Implementation of the ALi M1429 chipset. + * Implementation of the ALi M1429 chipset. * - * Note: This chipset has no datasheet, everything were done via - * reverse engineering the BIOS of various machines using it. + * Note: This chipset has no datasheet, everything were done via + * reverse engineering the BIOS of various machines using it. * - * Authors: Tiseno100, - * Miran Grca, + * Authors: Tiseno100, + * Miran Grca, * - * Copyright 2020,2021 Tiseno100. - * Copyright 2021,2021 Miran Grca. + * Copyright 2020-2021 Tiseno100. + * Copyright 2021 Miran Grca. */ /* @@ -64,12 +64,12 @@ Register 20h: Bits 2-1-0: Bus Clock Speed 0 0 0: 7.1519Mhz (ATCLK2) - 0 0 1: CLK2IN/4 - 0 1 0: CLK2IN/5 - 0 1 1: CLK2IN/6 - 1 0 0: CLK2IN/8 - 1 0 1: CLK2IN/10 - 1 1 0: CLK2IN/12 + 0 0 1: CLK2IN/4 + 0 1 0: CLK2IN/5 + 0 1 1: CLK2IN/6 + 1 0 0: CLK2IN/8 + 1 0 1: CLK2IN/10 + 1 1 0: CLK2IN/12 */ @@ -94,13 +94,11 @@ #include <86box/smram.h> #include <86box/chipset.h> -#define GREEN dev->is_g /* Is G Variant */ - +#define GREEN dev->is_g /* Is G Variant */ #ifdef ENABLE_ALI1429_LOG int ali1429_do_log = ENABLE_ALI1429_LOG; - static void ali1429_log(const char *fmt, ...) { @@ -113,27 +111,25 @@ ali1429_log(const char *fmt, ...) } } #else -#define ali1429_log(fmt, ...) +# define ali1429_log(fmt, ...) #endif - typedef struct { - uint8_t is_g, index, cfg_locked, reg_57h, - regs[90]; + uint8_t is_g, index, cfg_locked, reg_57h, + regs[90]; } ali1429_t; - static void ali1429_shadow_recalc(ali1429_t *dev) { uint32_t base, i, can_write, can_read; - shadowbios = (dev->regs[0x13] & 0x40) && (dev->regs[0x14] & 0x01); + shadowbios = (dev->regs[0x13] & 0x40) && (dev->regs[0x14] & 0x01); shadowbios_write = (dev->regs[0x13] & 0x40) && (dev->regs[0x14] & 0x02); can_write = (dev->regs[0x14] & 0x02) ? MEM_WRITE_INTERNAL : MEM_WRITE_EXTANY; - can_read = (dev->regs[0x14] & 0x01) ? MEM_READ_INTERNAL : MEM_READ_EXTANY; + can_read = (dev->regs[0x14] & 0x01) ? MEM_READ_INTERNAL : MEM_READ_EXTANY; for (i = 0; i < 8; i++) { base = 0xc0000 + (i << 15); @@ -147,149 +143,151 @@ ali1429_shadow_recalc(ali1429_t *dev) flushmmucache_nopc(); } - static void ali1429_write(uint16_t addr, uint8_t val, void *priv) { - ali1429_t *dev = (ali1429_t *)priv; + ali1429_t *dev = (ali1429_t *) priv; switch (addr) { - case 0x22: - dev->index = val; - break; + case 0x22: + dev->index = val; + break; - case 0x23: + case 0x23: #ifdef ENABLE_ALI1429_LOG - if (dev->index != 0x03) - ali1429_log("M1429: dev->regs[%02x] = %02x\n", dev->index, val); + if (dev->index != 0x03) + ali1429_log("M1429: dev->regs[%02x] = %02x\n", dev->index, val); #endif - if (dev->index == 0x03) - dev->cfg_locked = (val != 0xc5); + if (dev->index == 0x03) + dev->cfg_locked = (val != 0xc5); - if (!dev->cfg_locked) { - pclog("M1429: dev->regs[%02x] = %02x\n", dev->index, val); + if (!dev->cfg_locked) { + pclog("M1429: dev->regs[%02x] = %02x\n", dev->index, val); - /* Common M1429 Registers */ - switch (dev->index) { - case 0x10: case 0x11: - dev->regs[dev->index] = val; - break; + /* Common M1429 Registers */ + switch (dev->index) { + case 0x10: + case 0x11: + dev->regs[dev->index] = val; + break; - case 0x12: - dev->regs[dev->index] = val; - if(val & 4) - mem_remap_top(128); - else - mem_remap_top(0); - break; + case 0x12: + dev->regs[dev->index] = val; + if (val & 4) + mem_remap_top(128); + else + mem_remap_top(0); + break; - case 0x13: case 0x14: - dev->regs[dev->index] = val; - ali1429_shadow_recalc(dev); - break; + case 0x13: + case 0x14: + dev->regs[dev->index] = val; + ali1429_shadow_recalc(dev); + break; - case 0x15: case 0x16: - case 0x17: - dev->regs[dev->index] = val; - break; + case 0x15: + case 0x16: + case 0x17: + dev->regs[dev->index] = val; + break; - case 0x18: - dev->regs[dev->index] = (val & 0x8f) | 0x20; - cpu_cache_ext_enabled = !!(val & 2); - cpu_update_waitstates(); - break; + case 0x18: + dev->regs[dev->index] = (val & 0x8f) | 0x20; + cpu_cache_ext_enabled = !!(val & 2); + cpu_update_waitstates(); + break; - case 0x19: case 0x1a: - case 0x1e: - dev->regs[dev->index] = val; - break; + case 0x19: + case 0x1a: + case 0x1e: + dev->regs[dev->index] = val; + break; - case 0x20: - dev->regs[dev->index] = val; + case 0x20: + dev->regs[dev->index] = val; - switch(val & 7) { - case 0: case 7: /* Illegal */ - cpu_set_isa_speed(7159091); - break; + switch (val & 7) { + case 0: + case 7: /* Illegal */ + cpu_set_isa_speed(7159091); + break; - case 1: - cpu_set_isa_speed(cpu_busspeed / 4); - break; + case 1: + cpu_set_isa_speed(cpu_busspeed / 4); + break; - case 2: - cpu_set_isa_speed(cpu_busspeed / 5); - break; + case 2: + cpu_set_isa_speed(cpu_busspeed / 5); + break; - case 3: - cpu_set_isa_speed(cpu_busspeed / 6); - break; + case 3: + cpu_set_isa_speed(cpu_busspeed / 6); + break; - case 4: - cpu_set_isa_speed(cpu_busspeed / 8); - break; + case 4: + cpu_set_isa_speed(cpu_busspeed / 8); + break; - case 5: - cpu_set_isa_speed(cpu_busspeed / 10); - break; + case 5: + cpu_set_isa_speed(cpu_busspeed / 10); + break; - case 6: - cpu_set_isa_speed(cpu_busspeed / 12); - break; - } - break; + case 6: + cpu_set_isa_speed(cpu_busspeed / 12); + break; + } + break; - case 0x21 ... 0x27: - dev->regs[dev->index] = val; - break; - } + case 0x21 ... 0x27: + dev->regs[dev->index] = val; + break; + } - /* M1429G Only Registers */ - if (GREEN) { - switch (dev->index) { - case 0x30 ... 0x41: - case 0x43: case 0x45: - case 0x4a: - dev->regs[dev->index] = val; - break; + /* M1429G Only Registers */ + if (GREEN) { + switch (dev->index) { + case 0x30 ... 0x41: + case 0x43: + case 0x45: + case 0x4a: + dev->regs[dev->index] = val; + break; - case 0x57: - dev->reg_57h = val; - break; - } - } - } - break; + case 0x57: + dev->reg_57h = val; + break; + } + } + } + break; } } - static uint8_t ali1429_read(uint16_t addr, void *priv) { - ali1429_t *dev = (ali1429_t *)priv; - uint8_t ret = 0xff; + ali1429_t *dev = (ali1429_t *) priv; + uint8_t ret = 0xff; if ((addr == 0x23) && (dev->index >= 0x10) && (dev->index <= 0x4a)) - ret = dev->regs[dev->index]; + ret = dev->regs[dev->index]; else if ((addr == 0x23) && (dev->index == 0x57)) - ret = dev->reg_57h; + ret = dev->reg_57h; else if (addr == 0x22) - ret = dev->index; + ret = dev->index; return ret; } - static void ali1429_close(void *priv) { - ali1429_t *dev = (ali1429_t *)priv; + ali1429_t *dev = (ali1429_t *) priv; free(dev); } - static void ali1429_defaults(ali1429_t *dev) { @@ -308,28 +306,27 @@ ali1429_defaults(ali1429_t *dev) /* M1429G Default Registers */ if (GREEN) { - dev->regs[0x31] = 0x88; - dev->regs[0x32] = 0xc0; - dev->regs[0x38] = 0xe5; - dev->regs[0x40] = 0xe3; - dev->regs[0x41] = 2; - dev->regs[0x45] = 0x80; + dev->regs[0x31] = 0x88; + dev->regs[0x32] = 0xc0; + dev->regs[0x38] = 0xe5; + dev->regs[0x40] = 0xe3; + dev->regs[0x41] = 2; + dev->regs[0x45] = 0x80; } } - static void * ali1429_init(const device_t *info) { - ali1429_t *dev = (ali1429_t *)malloc(sizeof(ali1429_t)); + ali1429_t *dev = (ali1429_t *) malloc(sizeof(ali1429_t)); memset(dev, 0, sizeof(ali1429_t)); dev->cfg_locked = 1; - GREEN = info->local; + GREEN = info->local; /* M1429 Ports: - 22h Index Port - 23h Data Port + 22h Index Port + 23h Data Port */ io_sethandler(0x0022, 0x0002, ali1429_read, NULL, NULL, ali1429_write, NULL, NULL, dev); @@ -341,29 +338,29 @@ ali1429_init(const device_t *info) } const device_t ali1429_device = { - .name = "ALi M1429", + .name = "ALi M1429", .internal_name = "ali1429", - .flags = 0, - .local = 0, - .init = ali1429_init, - .close = ali1429_close, - .reset = NULL, + .flags = 0, + .local = 0, + .init = ali1429_init, + .close = ali1429_close, + .reset = NULL, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; const device_t ali1429g_device = { - .name = "ALi M1429G", + .name = "ALi M1429G", .internal_name = "ali1429g", - .flags = 0, - .local = 1, - .init = ali1429_init, - .close = ali1429_close, - .reset = NULL, + .flags = 0, + .local = 1, + .init = ali1429_init, + .close = ali1429_close, + .reset = NULL, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; diff --git a/src/chipset/ali1435.c b/src/chipset/ali1435.c index 4497ad338..2909a48b9 100644 --- a/src/chipset/ali1435.c +++ b/src/chipset/ali1435.c @@ -38,138 +38,132 @@ #include <86box/chipset.h> #include <86box/spd.h> - -#define MEM_STATE_SHADOW_R 0x01 -#define MEM_STATE_SHADOW_W 0x02 -#define MEM_STATE_SMRAM 0x04 - +#define MEM_STATE_SHADOW_R 0x01 +#define MEM_STATE_SHADOW_W 0x02 +#define MEM_STATE_SMRAM 0x04 typedef struct { - uint8_t index, cfg_locked, - regs[16], pci_regs[256]; + uint8_t index, cfg_locked, + regs[16], pci_regs[256]; } ali1435_t; - #define ENABLE_ALI1435_LOG 1 #ifdef ENABLE_ALI1435_LOG int ali1435_do_log = ENABLE_ALI1435_LOG; - static void ali1435_log(const char *fmt, ...) { va_list ap; if (ali1435_do_log) { - va_start(ap, fmt); - pclog_ex(fmt, ap); - va_end(ap); + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); } } #else -#define ali1435_log(fmt, ...) +# define ali1435_log(fmt, ...) #endif - /* NOTE: We cheat here. The real ALi M1435 uses a level to edge triggered IRQ converter - when the most siginificant bit is set. We work around that by manipulating the - emulated PIC's ELCR register. */ + when the most siginificant bit is set. We work around that by manipulating the + emulated PIC's ELCR register. */ static void ali1435_update_irqs(ali1435_t *dev, int set) { uint8_t val; - int i, reg; - int shift, irq; - int irq_map[8] = { -1, 5, 9, 10, 11, 12, 14, 15 }; - pic_t *temp_pic; + int i, reg; + int shift, irq; + int irq_map[8] = { -1, 5, 9, 10, 11, 12, 14, 15 }; + pic_t *temp_pic; for (i = 0; i < 4; i++) { - reg = 0x80 + (i >> 1); - shift = (i & 1) << 2; - val = (dev->pci_regs[reg] >> shift) & 0x0f; - irq = irq_map[val & 0x07]; - if (irq == -1) - continue; - temp_pic = (irq >= 8) ? &pic2 : &pic; - irq &= 7; - if (set && (val & 0x08)) - temp_pic->elcr |= (1 << irq); - else - temp_pic->elcr &= ~(1 << irq); + reg = 0x80 + (i >> 1); + shift = (i & 1) << 2; + val = (dev->pci_regs[reg] >> shift) & 0x0f; + irq = irq_map[val & 0x07]; + if (irq == -1) + continue; + temp_pic = (irq >= 8) ? &pic2 : &pic; + irq &= 7; + if (set && (val & 0x08)) + temp_pic->elcr |= (1 << irq); + else + temp_pic->elcr &= ~(1 << irq); } } - static void ali1435_pci_write(int func, int addr, uint8_t val, void *priv) { ali1435_t *dev = (ali1435_t *) priv; - int irq, irq_map[8] = { -1, 5, 9, 10, 11, 12, 14, 15 }; + int irq, irq_map[8] = { -1, 5, 9, 10, 11, 12, 14, 15 }; ali1435_log("ali1435_write(%02X, %02X, %02X)\n", func, addr, val); if (func > 0) - return; + return; if ((addr < 0x04) || (addr == 0x06) || ((addr >= 0x08) && (addr <= 0x0b))) - return; + return; if ((addr >= 0x0f) && (addr < 0x30)) - return; + return; if ((addr >= 0x34) && (addr < 0x40)) - return; + return; switch (addr) { - /* Dummy PCI Config */ - case 0x04: - dev->pci_regs[addr] = (val & 0x7f) | 0x07; - break; + /* Dummy PCI Config */ + case 0x04: + dev->pci_regs[addr] = (val & 0x7f) | 0x07; + break; - case 0x05: - dev->pci_regs[addr] = (val & 0x01); - break; + case 0x05: + dev->pci_regs[addr] = (val & 0x01); + break; - /* Dummy PCI Status */ - case 0x07: - dev->pci_regs[addr] &= ~(val & 0xb8); - break; + /* Dummy PCI Status */ + case 0x07: + dev->pci_regs[addr] &= ~(val & 0xb8); + break; - case 0x80: case 0x81: - dev->pci_regs[addr] = val; - ali1435_update_irqs(dev, 0); - irq = irq_map[val & 0x07]; - if (irq >= 0) { - ali1435_log("Set IRQ routing: INT %c -> %02X\n", 0x41 + ((addr & 0x01) << 1), irq); - pci_set_irq_routing(PCI_INTA + ((addr & 0x01) << 1), irq); - } else { - ali1435_log("Set IRQ routing: INT %c -> FF\n", 0x41 + ((addr & 0x01) << 1)); - pci_set_irq_routing(PCI_INTA + ((addr & 0x01) << 1), PCI_IRQ_DISABLED); - } - irq = irq_map[(val >> 4) & 0x07]; - if (irq >= 0) { - ali1435_log("Set IRQ routing: INT %c -> %02X\n", 0x42 + ((addr & 0x01) << 1), irq); - pci_set_irq_routing(PCI_INTB + ((addr & 0x01) << 1), irq); - } else { - ali1435_log("Set IRQ routing: INT %c -> FF\n", 0x42 + ((addr & 0x01) << 1)); - pci_set_irq_routing(PCI_INTB + ((addr & 0x01) << 1), PCI_IRQ_DISABLED); - } - ali1435_update_irqs(dev, 1); - break; + case 0x80: + case 0x81: + dev->pci_regs[addr] = val; + ali1435_update_irqs(dev, 0); + irq = irq_map[val & 0x07]; + if (irq >= 0) { + ali1435_log("Set IRQ routing: INT %c -> %02X\n", 0x41 + ((addr & 0x01) << 1), irq); + pci_set_irq_routing(PCI_INTA + ((addr & 0x01) << 1), irq); + } else { + ali1435_log("Set IRQ routing: INT %c -> FF\n", 0x41 + ((addr & 0x01) << 1)); + pci_set_irq_routing(PCI_INTA + ((addr & 0x01) << 1), PCI_IRQ_DISABLED); + } + irq = irq_map[(val >> 4) & 0x07]; + if (irq >= 0) { + ali1435_log("Set IRQ routing: INT %c -> %02X\n", 0x42 + ((addr & 0x01) << 1), irq); + pci_set_irq_routing(PCI_INTB + ((addr & 0x01) << 1), irq); + } else { + ali1435_log("Set IRQ routing: INT %c -> FF\n", 0x42 + ((addr & 0x01) << 1)); + pci_set_irq_routing(PCI_INTB + ((addr & 0x01) << 1), PCI_IRQ_DISABLED); + } + ali1435_update_irqs(dev, 1); + break; - default: - dev->pci_regs[addr] = val; - break; + default: + dev->pci_regs[addr] = val; + break; } } - static uint8_t ali1435_pci_read(int func, int addr, void *priv) { ali1435_t *dev = (ali1435_t *) priv; - uint8_t ret; + uint8_t ret; ret = 0xff; @@ -181,68 +175,65 @@ ali1435_pci_read(int func, int addr, void *priv) return ret; } - static void ali1435_write(uint16_t addr, uint8_t val, void *priv) { - ali1435_t *dev = (ali1435_t *)priv; + ali1435_t *dev = (ali1435_t *) priv; switch (addr) { - case 0x22: - dev->index = val; - break; + case 0x22: + dev->index = val; + break; - case 0x23: -/* #ifdef ENABLE_ALI1435_LOG - if (dev->index != 0x03) - ali1435_log("M1435: dev->regs[%02x] = %02x\n", dev->index, val); -#endif */ + case 0x23: + /* #ifdef ENABLE_ALI1435_LOG + if (dev->index != 0x03) + ali1435_log("M1435: dev->regs[%02x] = %02x\n", dev->index, val); + #endif */ - if (dev->index == 0x03) - dev->cfg_locked = (val != 0x69); + if (dev->index == 0x03) + dev->cfg_locked = (val != 0x69); - if (!dev->cfg_locked) { - pclog("M1435: dev->regs[%02x] = %02x\n", dev->index, val); + if (!dev->cfg_locked) { + pclog("M1435: dev->regs[%02x] = %02x\n", dev->index, val); - switch (dev->index) { - /* PCI Mechanism select? */ - case 0x00: - dev->regs[dev->index] = val; - pclog("PMC = %i\n", val != 0xc8); - pci_set_pmc(val != 0xc8); - break; + switch (dev->index) { + /* PCI Mechanism select? */ + case 0x00: + dev->regs[dev->index] = val; + pclog("PMC = %i\n", val != 0xc8); + pci_set_pmc(val != 0xc8); + break; - /* ???? */ - case 0x06: - dev->regs[dev->index] = val; - break; + /* ???? */ + case 0x06: + dev->regs[dev->index] = val; + break; - /* ???? */ - case 0x07: - dev->regs[dev->index] = val; - break; - } - } - break; + /* ???? */ + case 0x07: + dev->regs[dev->index] = val; + break; + } + } + break; } } - static uint8_t ali1435_read(uint16_t addr, void *priv) { - ali1435_t *dev = (ali1435_t *)priv; - uint8_t ret = 0xff; + ali1435_t *dev = (ali1435_t *) priv; + uint8_t ret = 0xff; if ((addr == 0x23) && (dev->index < 0x10)) - ret = dev->regs[dev->index]; + ret = dev->regs[dev->index]; else if (addr == 0x22) - ret = dev->index; + ret = dev->index; return ret; } - static void ali1435_reset(void *priv) { @@ -258,13 +249,16 @@ ali1435_reset(void *priv) memset(dev->pci_regs, 0, 256); - dev->pci_regs[0x00] = 0x25; dev->pci_regs[0x01] = 0x10; /*ALi*/ - dev->pci_regs[0x02] = 0x35; dev->pci_regs[0x03] = 0x14; /*M1435*/ + dev->pci_regs[0x00] = 0x25; + dev->pci_regs[0x01] = 0x10; /*ALi*/ + dev->pci_regs[0x02] = 0x35; + dev->pci_regs[0x03] = 0x14; /*M1435*/ dev->pci_regs[0x04] = 0x07; dev->pci_regs[0x07] = 0x04; dev->pci_regs[0x0b] = 0x06; - dev->pci_regs[0x80] = 0x80; dev->pci_regs[0x81] = 0x00; + dev->pci_regs[0x80] = 0x80; + dev->pci_regs[0x81] = 0x00; pci_set_irq_routing(PCI_INTA, PCI_IRQ_DISABLED); pci_set_irq_routing(PCI_INTB, PCI_IRQ_DISABLED); @@ -272,16 +266,14 @@ ali1435_reset(void *priv) pci_set_irq_routing(PCI_INTD, PCI_IRQ_DISABLED); } - static void ali1435_close(void *p) { - ali1435_t *dev = (ali1435_t *)p; + ali1435_t *dev = (ali1435_t *) p; free(dev); } - static void * ali1435_init(const device_t *info) { @@ -291,8 +283,8 @@ ali1435_init(const device_t *info) dev->cfg_locked = 1; /* M1435 Ports: - 22h Index Port - 23h Data Port + 22h Index Port + 23h Data Port */ io_sethandler(0x0022, 0x0002, ali1435_read, NULL, NULL, ali1435_write, NULL, NULL, dev); @@ -309,15 +301,15 @@ ali1435_init(const device_t *info) } const device_t ali1435_device = { - .name = "Intel ALi M1435", + .name = "Intel ALi M1435", .internal_name = "ali1435", - .flags = DEVICE_PCI, - .local = 0x00, - .init = ali1435_init, - .close = ali1435_close, - .reset = ali1435_reset, + .flags = DEVICE_PCI, + .local = 0x00, + .init = ali1435_init, + .close = ali1435_close, + .reset = ali1435_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; diff --git a/src/chipset/ali6117.c b/src/chipset/ali6117.c index 700fe1405..98451067a 100644 --- a/src/chipset/ali6117.c +++ b/src/chipset/ali6117.c @@ -46,38 +46,40 @@ typedef struct ali6117_t { /* Total size, Bank 0 size, Bank 1 size, Bank 2 size, Bank 3 size. */ static uint32_t ali6117_modes[32][5] = { - { 1024, 512, 512, 0, 0 }, - { 2048, 512, 512, 512, 512 }, - { 3072, 512, 512, 2048, 0 }, - { 5120, 512, 512, 2048, 2048 }, - { 9216, 512, 512, 8192, 0 }, - { 1024, 1024, 0, 0, 0 }, - { 2048, 1024, 1024, 0, 0 }, - { 4096, 1024, 1024, 2048, 0 }, - { 6144, 1024, 1024, 2048, 2048 }, - { 10240, 1024, 1024, 8192, 0 }, - { 18432, 1024, 1024, 8192, 8192 }, - { 3072, 1024, 2048, 0, 0 }, - { 5120, 1024, 2048, 2048, 0 }, - { 9216, 1024, 8192, 0, 0 }, - { 2048, 2048, 0, 0, 0 }, - { 4096, 2048, 2048, 0, 0 }, - { 6144, 2048, 2048, 2048, 0 }, - { 8192, 2048, 2048, 2048, 2048 }, - { 12288, 2048, 2048, 8192, 0 }, - { 20480, 2048, 2048, 8192, 8192 }, - { 10240, 2048, 8192, 0, 0 }, - { 18432, 2048, 8192, 8192, 0 }, - { 26624, 2048, 8192, 8192, 8192 }, - { 4096, 4096, 0, 0, 0 }, - { 8192, 4096, 4096, 0, 0 }, - { 24576, 4096, 4096, 8192, 8192 }, - { 12288, 4096, 8192, 0, 0 }, - { 8192, 8192, 0, 0, 0 }, - { 16384, 8192, 8192, 0, 0 }, - { 24576, 8192, 8192, 8192, 0 }, - { 32768, 8192, 8192, 8192, 8192 }, - { 65536, 32768, 32768, 0, 0 } +// clang-format off + { 1024, 512, 512, 0, 0 }, + { 2048, 512, 512, 512, 512 }, + { 3072, 512, 512, 2048, 0 }, + { 5120, 512, 512, 2048, 2048 }, + { 9216, 512, 512, 8192, 0 }, + { 1024, 1024, 0, 0, 0 }, + { 2048, 1024, 1024, 0, 0 }, + { 4096, 1024, 1024, 2048, 0 }, + { 6144, 1024, 1024, 2048, 2048 }, + { 10240, 1024, 1024, 8192, 0 }, + { 18432, 1024, 1024, 8192, 8192 }, + { 3072, 1024, 2048, 0, 0 }, + { 5120, 1024, 2048, 2048, 0 }, + { 9216, 1024, 8192, 0, 0 }, + { 2048, 2048, 0, 0, 0 }, + { 4096, 2048, 2048, 0, 0 }, + { 6144, 2048, 2048, 2048, 0 }, + { 8192, 2048, 2048, 2048, 2048 }, + { 12288, 2048, 2048, 8192, 0 }, + { 20480, 2048, 2048, 8192, 8192 }, + { 10240, 2048, 8192, 0, 0 }, + { 18432, 2048, 8192, 8192, 0 }, + { 26624, 2048, 8192, 8192, 8192 }, + { 4096, 4096, 0, 0, 0 }, + { 8192, 4096, 4096, 0, 0 }, + { 24576, 4096, 4096, 8192, 8192 }, + { 12288, 4096, 8192, 0, 0 }, + { 8192, 8192, 0, 0, 0 }, + { 16384, 8192, 8192, 0, 0 }, + { 24576, 8192, 8192, 8192, 0 }, + { 32768, 8192, 8192, 8192, 8192 }, + { 65536, 32768, 32768, 0, 0 } +// clang-format on }; #ifdef ENABLE_ALI6117_LOG diff --git a/src/chipset/scat.c b/src/chipset/scat.c index 57b06662a..2bbac6cc0 100644 --- a/src/chipset/scat.c +++ b/src/chipset/scat.c @@ -84,16 +84,20 @@ typedef struct scat_t { } scat_t; static const uint8_t max_map[32] = { +// clang-format off 0, 1, 1, 1, 2, 3, 4, 8, 4, 8, 12, 16, 20, 24, 28, 32, 0, 5, 9, 13, 6, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +// clang-format om }; static const uint8_t max_map_sx[32] = { - 0, 1, 2, 1, 3, 4, 6, 10, - 5, 9, 13, 4, 8, 12, 16, 14, - 18, 22, 26, 20, 24, 28, 32, 18, - 20, 32, 0, 0, 0, 0, 0, 0 +// clang-format off + 0, 1, 2, 1, 3, 4, 6, 10, + 5, 9, 13, 4, 8, 12, 16, 14, + 18, 22, 26, 20, 24, 28, 32, 18, + 20, 32, 0, 0, 0, 0, 0, 0 +// clang-format om }; static const uint8_t scatsx_external_is_RAS[33] = { 0, 0, 0, 0, 0, 0, 0, 0, diff --git a/src/chipset/sis_85c50x.c b/src/chipset/sis_85c50x.c index 247ff1b96..56d3a0a30 100644 --- a/src/chipset/sis_85c50x.c +++ b/src/chipset/sis_85c50x.c @@ -135,89 +135,90 @@ sis_85c50x_smm_recalc(sis_85c50x_t *dev) static void sis_85c50x_write(int func, int addr, uint8_t val, void *priv) { - sis_85c50x_t *dev = (sis_85c50x_t *) priv; + sis_85c50x_t *dev = (sis_85c50x_t *) priv; sis_85c50x_log("85C501: [W] (%02X, %02X) = %02X\n", func, addr, val); - if (func == 0x00) switch (addr) { - case 0x04: /* Command - low byte */ - dev->pci_conf[addr] = (dev->pci_conf[addr] & 0xb4) | (val & 0x4b); - break; - case 0x07: /* Status - high byte */ - dev->pci_conf[addr] = ((dev->pci_conf[addr] & 0xf9) & ~(val & 0xf8)) | (val & 0x06); - break; - case 0x50: - dev->pci_conf[addr] = val; - break; - case 0x51: /* Cache */ - dev->pci_conf[addr] = val; - cpu_cache_ext_enabled = (val & 0x40); - cpu_update_waitstates(); - break; - case 0x52: - dev->pci_conf[addr] = val; - break; - case 0x53: /* Shadow RAM */ - case 0x54: - case 0x55: - case 0x56: - dev->pci_conf[addr] = val; - sis_85c50x_shadow_recalc(dev); - if (addr == 0x54) + if (func == 0x00) + switch (addr) { + case 0x04: /* Command - low byte */ + dev->pci_conf[addr] = (dev->pci_conf[addr] & 0xb4) | (val & 0x4b); + break; + case 0x07: /* Status - high byte */ + dev->pci_conf[addr] = ((dev->pci_conf[addr] & 0xf9) & ~(val & 0xf8)) | (val & 0x06); + break; + case 0x50: + dev->pci_conf[addr] = val; + break; + case 0x51: /* Cache */ + dev->pci_conf[addr] = val; + cpu_cache_ext_enabled = (val & 0x40); + cpu_update_waitstates(); + break; + case 0x52: + dev->pci_conf[addr] = val; + break; + case 0x53: /* Shadow RAM */ + case 0x54: + case 0x55: + case 0x56: + dev->pci_conf[addr] = val; + sis_85c50x_shadow_recalc(dev); + if (addr == 0x54) + sis_85c50x_smm_recalc(dev); + break; + case 0x57: + case 0x58: + case 0x59: + case 0x5a: + case 0x5c: + case 0x5d: + case 0x5e: + case 0x61: + case 0x62: + case 0x63: + case 0x67: + case 0x68: + case 0x6a: + case 0x6b: + case 0x6c: + case 0x6d: + case 0x6e: + case 0x6f: + dev->pci_conf[addr] = val; + break; + case 0x5f: + dev->pci_conf[addr] = val & 0xfe; + break; + case 0x5b: + dev->pci_conf[addr] = val; + break; + case 0x60: /* SMI */ + if ((dev->pci_conf[0x68] & 0x01) && !(dev->pci_conf[addr] & 0x02) && (val & 0x02)) { + dev->pci_conf[0x69] |= 0x01; + smi_raise(); + } + dev->pci_conf[addr] = val & 0x3e; + break; + case 0x64: /* SMRAM */ + case 0x65: + dev->pci_conf[addr] = val; sis_85c50x_smm_recalc(dev); - break; - case 0x57: - case 0x58: - case 0x59: - case 0x5a: - case 0x5c: - case 0x5d: - case 0x5e: - case 0x61: - case 0x62: - case 0x63: - case 0x67: - case 0x68: - case 0x6a: - case 0x6b: - case 0x6c: - case 0x6d: - case 0x6e: - case 0x6f: - dev->pci_conf[addr] = val; - break; - case 0x5f: - dev->pci_conf[addr] = val & 0xfe; - break; - case 0x5b: - dev->pci_conf[addr] = val; - break; - case 0x60: /* SMI */ - if ((dev->pci_conf[0x68] & 0x01) && !(dev->pci_conf[addr] & 0x02) && (val & 0x02)) { - dev->pci_conf[0x69] |= 0x01; - smi_raise(); - } - dev->pci_conf[addr] = val & 0x3e; - break; - case 0x64: /* SMRAM */ - case 0x65: - dev->pci_conf[addr] = val; - sis_85c50x_smm_recalc(dev); - break; - case 0x66: - dev->pci_conf[addr] = (val & 0x7f); - break; - case 0x69: - dev->pci_conf[addr] &= ~(val); - break; - } + break; + case 0x66: + dev->pci_conf[addr] = (val & 0x7f); + break; + case 0x69: + dev->pci_conf[addr] &= ~(val); + break; + } } static uint8_t sis_85c50x_read(int func, int addr, void *priv) { sis_85c50x_t *dev = (sis_85c50x_t *) priv; - uint8_t ret = 0xff; + uint8_t ret = 0xff; if (func == 0x00) ret = dev->pci_conf[addr]; @@ -234,41 +235,42 @@ sis_85c50x_sb_write(int func, int addr, uint8_t val, void *priv) sis_85c50x_log("85C503: [W] (%02X, %02X) = %02X\n", func, addr, val); - if (func == 0x00) switch (addr) { - case 0x04: /* Command */ - dev->pci_conf_sb[addr] = val & 0x0f; - break; - case 0x07: /* Status */ - dev->pci_conf_sb[addr] &= ~(val & 0x30); - break; - case 0x40: /* BIOS Control Register */ - dev->pci_conf_sb[addr] = val & 0x3f; - break; - case 0x41: - case 0x42: - case 0x43: - case 0x44: - /* INTA/B/C/D# Remapping Control Register */ - dev->pci_conf_sb[addr] = val & 0x8f; - if (val & 0x80) - pci_set_irq_routing(PCI_INTA + (addr - 0x41), PCI_IRQ_DISABLED); - else - pci_set_irq_routing(PCI_INTA + (addr - 0x41), val & 0xf); - break; - case 0x48: /* ISA Master/DMA Memory Cycle Control Register 1 */ - case 0x49: /* ISA Master/DMA Memory Cycle Control Register 2 */ - case 0x4a: /* ISA Master/DMA Memory Cycle Control Register 3 */ - case 0x4b: /* ISA Master/DMA Memory Cycle Control Register 4 */ - dev->pci_conf_sb[addr] = val; - break; - } + if (func == 0x00) + switch (addr) { + case 0x04: /* Command */ + dev->pci_conf_sb[addr] = val & 0x0f; + break; + case 0x07: /* Status */ + dev->pci_conf_sb[addr] &= ~(val & 0x30); + break; + case 0x40: /* BIOS Control Register */ + dev->pci_conf_sb[addr] = val & 0x3f; + break; + case 0x41: + case 0x42: + case 0x43: + case 0x44: + /* INTA/B/C/D# Remapping Control Register */ + dev->pci_conf_sb[addr] = val & 0x8f; + if (val & 0x80) + pci_set_irq_routing(PCI_INTA + (addr - 0x41), PCI_IRQ_DISABLED); + else + pci_set_irq_routing(PCI_INTA + (addr - 0x41), val & 0xf); + break; + case 0x48: /* ISA Master/DMA Memory Cycle Control Register 1 */ + case 0x49: /* ISA Master/DMA Memory Cycle Control Register 2 */ + case 0x4a: /* ISA Master/DMA Memory Cycle Control Register 3 */ + case 0x4b: /* ISA Master/DMA Memory Cycle Control Register 4 */ + dev->pci_conf_sb[addr] = val; + break; + } } static uint8_t sis_85c50x_sb_read(int func, int addr, void *priv) { sis_85c50x_t *dev = (sis_85c50x_t *) priv; - uint8_t ret = 0xff; + uint8_t ret = 0xff; if (func == 0x00) ret = dev->pci_conf_sb[addr]; diff --git a/src/config.c b/src/config.c index 701078df1..6399c91ab 100644 --- a/src/config.c +++ b/src/config.c @@ -857,7 +857,7 @@ load_ports(void) serial_passthrough_enabled[c] = !!ini_section_get_int(cat, temp, 0); if (serial_passthrough_enabled[c]) - config_log("Serial Port %d: passthrough enabled.\n\n", c+1); + config_log("Serial Port %d: passthrough enabled.\n\n", c + 1); } for (c = 0; c < PARALLEL_MAX; c++) { @@ -2345,7 +2345,7 @@ save_input_devices(void) } else { ini_section_delete_var(cat, "tablet_tool_type"); } - + ini_delete_section_if_empty(config, cat); } @@ -2540,7 +2540,7 @@ save_storage_controllers(void) ini_section_delete_var(cat, "cdrom_interface"); else ini_section_set_string(cat, "cdrom_interface", - cdrom_interface_get_internal_name(cdrom_interface_current)); + cdrom_interface_get_internal_name(cdrom_interface_current)); if (ide_ter_enabled == 0) ini_section_delete_var(cat, "ide_ter"); diff --git a/src/device.c b/src/device.c index a5c5d6276..5d739b13c 100644 --- a/src/device.c +++ b/src/device.c @@ -92,7 +92,7 @@ device_set_context(device_context_t *c, const device_t *d, int inst) void *sec, *single_sec; memset(c, 0, sizeof(device_context_t)); - c->dev = d; + c->dev = d; c->instance = inst; if (inst) { sprintf(c->name, "%s #%i", d->name, inst); @@ -135,7 +135,7 @@ device_context_restore(void) } static void * -device_add_common(const device_t *d, const device_t *cd, void *p, void* params, int inst) +device_add_common(const device_t *d, const device_t *cd, void *p, void *params, int inst) { void *priv = NULL; int c; @@ -203,7 +203,7 @@ device_add(const device_t *d) } void * -device_add_parameters(const device_t *d, void* params) +device_add_parameters(const device_t *d, void *params) { return device_add_common(d, d, NULL, params, 0); } @@ -216,7 +216,7 @@ device_add_ex(const device_t *d, void *priv) } void -device_add_ex_parameters(const device_t *d, void* priv, void *params) +device_add_ex_parameters(const device_t *d, void *priv, void *params) { device_add_common(d, d, priv, params, 0); } @@ -293,7 +293,7 @@ device_cadd_inst_ex(const device_t *d, const device_t *cd, void *priv, int inst) } void -device_cadd_inst_ex_parameters(const device_t *d, const device_t *cd, void *priv, int inst, void* params) +device_cadd_inst_ex_parameters(const device_t *d, const device_t *cd, void *priv, int inst, void *params) { device_add_common(d, cd, priv, params, inst); } diff --git a/src/device/isartc.c b/src/device/isartc.c index bb0f928eb..67b5b94c2 100644 --- a/src/device/isartc.c +++ b/src/device/isartc.c @@ -88,7 +88,7 @@ #define ISARTC_A6PAK 3 #define ISARTC_VENDEX 4 -#define ISARTC_DEBUG 0 +#define ISARTC_DEBUG 0 typedef struct { const char *name; /* board name */ @@ -572,7 +572,7 @@ isartc_init(const device_t *info) dev->f_rd, NULL, NULL, dev->f_wr, NULL, NULL, dev); /* Hook into the NVR backend. */ - dev->nvr.fn = (char *)info->internal_name; + dev->nvr.fn = (char *) info->internal_name; dev->nvr.irq = dev->irq; if (!is_at) nvr_init(&dev->nvr); diff --git a/src/device/mouse.c b/src/device/mouse.c index 93384e063..98ce0eaf4 100644 --- a/src/device/mouse.c +++ b/src/device/mouse.c @@ -40,11 +40,10 @@ int mouse_x, mouse_buttons, mouse_mode, mouse_tablet_in_proximity = 0, - tablet_tool_type = 1; /* 0 = Puck/Cursor, 1 = Pen */ + tablet_tool_type = 1; /* 0 = Puck/Cursor, 1 = Pen */ double mouse_x_abs, - mouse_y_abs; - + mouse_y_abs; static const device_t mouse_none_device = { .name = "None", diff --git a/src/device/mouse_serial.c b/src/device/mouse_serial.c index f5e532101..f7956a9bd 100644 --- a/src/device/mouse_serial.c +++ b/src/device/mouse_serial.c @@ -511,7 +511,7 @@ sermouse_command_timer(void *priv) } static int -sermouse_poll(int x, int y, int z, int b, double abs_x, double abs_y, void *priv) +sermouse_poll(int x, int y, int z, int b, double abs_x, double abs_y, void *priv) { mouse_t *dev = (mouse_t *) priv; diff --git a/src/device/mouse_wacom_tablet.c b/src/device/mouse_wacom_tablet.c index 2d324effb..f6f39fa95 100644 --- a/src/device/mouse_wacom_tablet.c +++ b/src/device/mouse_wacom_tablet.c @@ -10,10 +10,9 @@ #include <86box/serial.h> #include <86box/plat.h> -#define FLAG_3BTN 0x20 /* enable 3-button mode */ +#define FLAG_3BTN 0x20 /* enable 3-button mode */ -enum wacom_modes -{ +enum wacom_modes { WACOM_MODE_SUPPRESSED = 0, WACOM_MODE_POINT = 1, WACOM_MODE_STREAM = 2, @@ -36,7 +35,7 @@ typedef struct { int abs_x, abs_y, rel_x, rel_y, oldb, b; - + int data_pos, data_rec_pos, mode, transmission_ongoing, transmission_format, interval; int increment, suppressed_increment; int transmission_stopped; @@ -46,8 +45,8 @@ typedef struct { int suppressed, measurement, always_report; int remote_req, remote_mode; - int last_abs_x, last_abs_y; /* Suppressed/Increment Mode. */ - uint32_t settings; /* Settings DWORD */ + int last_abs_x, last_abs_y; /* Suppressed/Increment Mode. */ + uint32_t settings; /* Settings DWORD */ double transmit_period; double old_tsc, reset_tsc; @@ -59,8 +58,8 @@ typedef struct { static double wacom_transmit_period(mouse_wacom_t *dev, int bps, int rps) { - double dbps = (double) bps; - double temp = 0.0; + double dbps = (double) bps; + double temp = 0.0; int word_len = 10; if (rps == -1) @@ -76,22 +75,22 @@ wacom_transmit_period(mouse_wacom_t *dev, int bps, int rps) } static void -wacom_reset(mouse_wacom_t* wacom) +wacom_reset(mouse_wacom_t *wacom) { - wacom->transmit_period = wacom_transmit_period(wacom, 9600, -1); - wacom->mode = WACOM_MODE_POINT; - wacom->data_pos = 0; + wacom->transmit_period = wacom_transmit_period(wacom, 9600, -1); + wacom->mode = WACOM_MODE_POINT; + wacom->data_pos = 0; wacom->transmission_ongoing = 0; - wacom->mode = 0; + wacom->mode = 0; wacom->transmission_stopped = 0; - wacom->interval = 0; - wacom->transmit_id = 0; - wacom->format = 0; /* ASCII */ - wacom->measurement = 1; + wacom->interval = 0; + wacom->transmit_id = 0; + wacom->format = 0; /* ASCII */ + wacom->measurement = 1; wacom->increment = wacom->suppressed_increment = 0; - wacom->reset_tsc = tsc; + wacom->reset_tsc = tsc; wacom->remote_mode = wacom->remote_req = 0; - wacom->always_report = 0; + wacom->always_report = 0; mouse_mode = 1; } @@ -99,7 +98,7 @@ wacom_reset(mouse_wacom_t* wacom) static void wacom_callback(struct serial_s *serial, void *priv) { - mouse_wacom_t* wacom = (mouse_wacom_t*)priv; + mouse_wacom_t *wacom = (mouse_wacom_t *) priv; wacom->transmit_period = wacom_transmit_period(wacom, 9600, -1); timer_stop(&wacom->report_timer); @@ -109,8 +108,8 @@ wacom_callback(struct serial_s *serial, void *priv) static void wacom_write(struct serial_s *serial, void *priv, uint8_t data) { - mouse_wacom_t* wacom = (mouse_wacom_t*)priv; - static int special_command = 0; + mouse_wacom_t *wacom = (mouse_wacom_t *) priv; + static int special_command = 0; if (data == '~') { special_command = 1; @@ -119,17 +118,18 @@ wacom_write(struct serial_s *serial, void *priv, uint8_t data) if (special_command) { switch (data) { case '#': - { - if (!wacom->transmission_ongoing) wacom->transmit_id++; - break; - } + { + if (!wacom->transmission_ongoing) + wacom->transmit_id++; + break; + } } special_command = 0; return; } if (data == '@') { - wacom->remote_req = 1; + wacom->remote_req = 1; wacom->remote_mode = 1; return; } @@ -144,41 +144,44 @@ wacom_write(struct serial_s *serial, void *priv, uint8_t data) } wacom->data_rec[wacom->data_rec_pos++] = data; if (data == '\r' || data == '\n') { - wacom->data_rec[wacom->data_rec_pos] = 0; - wacom->data_rec_pos = 0; + wacom->data_rec[wacom->data_rec_pos] = 0; + wacom->data_rec_pos = 0; - if (data == '\n') pclog("Wacom: written %s", wacom->data_rec); - else pclog("Wacom: written %s\n", wacom->data_rec); + if (data == '\n') + pclog("Wacom: written %s", wacom->data_rec); + else + pclog("Wacom: written %s\n", wacom->data_rec); if (!memcmp(wacom->data_rec, "AS", 2)) { - wacom->format = (wacom->data_rec[2] == '1'); + wacom->format = (wacom->data_rec[2] == '1'); wacom->transmission_ongoing = 0; } else if (!memcmp(wacom->data_rec, "SR", 2)) { - wacom->mode = WACOM_MODE_STREAM; + wacom->mode = WACOM_MODE_STREAM; wacom->suppressed_increment = 0; } else if (!memcmp(wacom->data_rec, "IN", 2)) { - sscanf((const char*)wacom->data_rec, "IN%d", &wacom->increment); + sscanf((const char *) wacom->data_rec, "IN%d", &wacom->increment); } else if (!memcmp(wacom->data_rec, "RE", 2) || wacom->data_rec[0] == '$' || wacom->data_rec[0] == '#') { wacom_reset(wacom); } else if (!memcmp(wacom->data_rec, "IT", 2)) { - sscanf((const char*)wacom->data_rec, "IT%d", &wacom->interval); + sscanf((const char *) wacom->data_rec, "IT%d", &wacom->interval); } else if (!memcmp(wacom->data_rec, "DE", 2)) { - sscanf((const char*)wacom->data_rec, "DE%d", &mouse_mode); + sscanf((const char *) wacom->data_rec, "DE%d", &mouse_mode); mouse_mode = !mouse_mode; plat_mouse_capture(0); } else if (!memcmp(wacom->data_rec, "SU", 2)) { - sscanf((const char*)wacom->data_rec, "SU%d", &wacom->suppressed_increment); + sscanf((const char *) wacom->data_rec, "SU%d", &wacom->suppressed_increment); } else if (!memcmp(wacom->data_rec, "PH", 2)) { - sscanf((const char*)wacom->data_rec, "PH%d", &wacom->pressure_mode); + sscanf((const char *) wacom->data_rec, "PH%d", &wacom->pressure_mode); } else if (!memcmp(wacom->data_rec, "IC", 2)) { - sscanf((const char*)wacom->data_rec, "IC%d", &wacom->measurement); + sscanf((const char *) wacom->data_rec, "IC%d", &wacom->measurement); } else if (!memcmp(wacom->data_rec, "AL", 2)) { - sscanf((const char*)wacom->data_rec, "AL%d", &wacom->always_report); + sscanf((const char *) wacom->data_rec, "AL%d", &wacom->always_report); } else if (!memcmp(wacom->data_rec, "RQ", 2)) { - sscanf((const char*)wacom->data_rec, "RQ%d", &wacom->remote_mode); - if (wacom->remote_mode) wacom->remote_req = 1; + sscanf((const char *) wacom->data_rec, "RQ%d", &wacom->remote_mode); + if (wacom->remote_mode) + wacom->remote_req = 1; } else if (!memcmp(wacom->data_rec, "SP", 2)) { wacom->transmission_stopped = 1; - } else if (!memcmp(wacom->data_rec, "ST", 2)){ + } else if (!memcmp(wacom->data_rec, "ST", 2)) { wacom->transmission_stopped = 0; wacom->remote_mode = wacom->remote_req = 0; } @@ -188,16 +191,21 @@ wacom_write(struct serial_s *serial, void *priv, uint8_t data) static int wacom_poll(int x, int y, int z, int b, double abs_x, double abs_y, void *priv) { - mouse_wacom_t* wacom = (mouse_wacom_t*)priv; - wacom->abs_x = abs_x * (wacom->measurement ? 4566. : 5800.); - wacom->abs_y = abs_y * (wacom->measurement ? 2972. : 3774.); - if (wacom->abs_x > (wacom->measurement ? 4566 : 5800)) wacom->abs_x = (wacom->measurement ? 4566 : 5800); - if (wacom->abs_y > (wacom->measurement ? 2972 : 3774)) wacom->abs_x = (wacom->measurement ? 2972 : 3774); - if (wacom->abs_x < 0) wacom->abs_x = 0; - if (wacom->abs_y < 0) wacom->abs_y = 0; + mouse_wacom_t *wacom = (mouse_wacom_t *) priv; + wacom->abs_x = abs_x * (wacom->measurement ? 4566. : 5800.); + wacom->abs_y = abs_y * (wacom->measurement ? 2972. : 3774.); + if (wacom->abs_x > (wacom->measurement ? 4566 : 5800)) + wacom->abs_x = (wacom->measurement ? 4566 : 5800); + if (wacom->abs_y > (wacom->measurement ? 2972 : 3774)) + wacom->abs_x = (wacom->measurement ? 2972 : 3774); + if (wacom->abs_x < 0) + wacom->abs_x = 0; + if (wacom->abs_y < 0) + wacom->abs_y = 0; wacom->rel_x = x; wacom->rel_y = y; - if (wacom->b != b) wacom->oldb = wacom->b; + if (wacom->b != b) + wacom->oldb = wacom->b; wacom->b = b; return (0); } @@ -205,9 +213,12 @@ wacom_poll(int x, int y, int z, int b, double abs_x, double abs_y, void *priv) static int wacom_switch_off_to_on(int b, int oldb) { - if (!(oldb & 0x1) && (b & 1)) return 1; - if (!(oldb & 0x2) && (b & 2)) return 1; - if (!(oldb & 0x4) && (b & 4)) return 1; + if (!(oldb & 0x1) && (b & 1)) + return 1; + if (!(oldb & 0x2) && (b & 2)) + return 1; + if (!(oldb & 0x4) && (b & 4)) + return 1; return 0; } @@ -215,33 +226,36 @@ wacom_switch_off_to_on(int b, int oldb) static uint8_t wacom_get_switch(int b) { - if (b & 0x4) return 0x23; - if (b & 0x2) return 0x22; - if (b & 0x1) return 0x21; + if (b & 0x4) + return 0x23; + if (b & 0x2) + return 0x22; + if (b & 0x1) + return 0x21; return 0x00; } static void -wacom_transmit_prepare(mouse_wacom_t* wacom, int x, int y) +wacom_transmit_prepare(mouse_wacom_t *wacom, int x, int y) { wacom->transmission_ongoing = 1; - wacom->data_pos = 0; + wacom->data_pos = 0; memset(wacom->data, 0, sizeof(wacom->data)); if (wacom->transmit_id) { wacom->transmission_format = 0; - snprintf((char*)wacom->data, sizeof(wacom->data), "~#SD51C V3.2.1.01\r"); + snprintf((char *) wacom->data, sizeof(wacom->data), "~#SD51C V3.2.1.01\r"); return; } wacom->transmission_format = wacom->format; - wacom->last_abs_x = wacom->abs_x; - wacom->last_abs_y = wacom->abs_y; - wacom->remote_req = 0; + wacom->last_abs_x = wacom->abs_x; + wacom->last_abs_y = wacom->abs_y; + wacom->remote_req = 0; wacom->oldb = wacom->b; if (wacom->format == 1) { wacom->data[0] = 0xC0; - wacom->data[6] = wacom->pressure_mode ? ((wacom->b & 0x1) ? (uint8_t)31 : (uint8_t)-31) : wacom_get_switch(wacom->b); + wacom->data[6] = wacom->pressure_mode ? ((wacom->b & 0x1) ? (uint8_t) 31 : (uint8_t) -31) : wacom_get_switch(wacom->b); wacom->data[5] = (y & 0x7F); wacom->data[4] = ((y & 0x3F80) >> 7) & 0x7F; @@ -264,15 +278,15 @@ wacom_transmit_prepare(mouse_wacom_t* wacom, int x, int y) if (tablet_tool_type == 1) { wacom->data[0] |= 0x20; } - + if (!mouse_tablet_in_proximity) { wacom->data[0] &= ~0x40; } } else { wacom->data[0] = 0; - snprintf((char*)wacom->data, sizeof(wacom->data), "*,%05d,%05d,%d\r\n", - wacom->abs_x, wacom->abs_y, - wacom->pressure_mode ? ((wacom->b & 0x1) ? (uint8_t)-31 : (uint8_t)15) : ((wacom->b & 0x1) ? 21 : 00)); + snprintf((char *) wacom->data, sizeof(wacom->data), "*,%05d,%05d,%d\r\n", + wacom->abs_x, wacom->abs_y, + wacom->pressure_mode ? ((wacom->b & 0x1) ? (uint8_t) -31 : (uint8_t) 15) : ((wacom->b & 0x1) ? 21 : 00)); } } @@ -280,17 +294,17 @@ extern double cpuclock; static void wacom_report_timer(void *priv) { - mouse_wacom_t* wacom = (mouse_wacom_t*)priv; - double milisecond_diff = ((double)(tsc - wacom->old_tsc)) / cpuclock * 1000.0; - int relative_mode = (mouse_mode == 0); - int x = (relative_mode ? wacom->rel_x : wacom->abs_x); - int y = (relative_mode ? wacom->rel_y : wacom->abs_y); - int x_diff = abs(relative_mode ? wacom->rel_x : (wacom->abs_x - wacom->last_abs_x)); - int y_diff = abs(relative_mode ? wacom->rel_y : (wacom->abs_y - wacom->last_abs_y)); - int increment = wacom->suppressed_increment ? wacom->suppressed_increment : wacom->increment; + mouse_wacom_t *wacom = (mouse_wacom_t *) priv; + double milisecond_diff = ((double) (tsc - wacom->old_tsc)) / cpuclock * 1000.0; + int relative_mode = (mouse_mode == 0); + int x = (relative_mode ? wacom->rel_x : wacom->abs_x); + int y = (relative_mode ? wacom->rel_y : wacom->abs_y); + int x_diff = abs(relative_mode ? wacom->rel_x : (wacom->abs_x - wacom->last_abs_x)); + int y_diff = abs(relative_mode ? wacom->rel_y : (wacom->abs_y - wacom->last_abs_y)); + int increment = wacom->suppressed_increment ? wacom->suppressed_increment : wacom->increment; timer_on_auto(&wacom->report_timer, wacom->transmit_period); - if ((((double)(tsc - wacom->reset_tsc)) / cpuclock * 1000.0) <= 10) + if ((((double) (tsc - wacom->reset_tsc)) / cpuclock * 1000.0) <= 10) return; if (wacom->transmit_id && !wacom->transmission_ongoing) goto transmit_prepare; @@ -309,26 +323,26 @@ wacom_report_timer(void *priv) wacom->old_tsc = tsc; } else return; - + switch (wacom->mode) { case WACOM_MODE_STREAM: default: break; - + case WACOM_MODE_POINT: - { - if (!(wacom_switch_off_to_on(wacom->b, wacom->oldb))) - return; - break; - } + { + if (!(wacom_switch_off_to_on(wacom->b, wacom->oldb))) + return; + break; + } case WACOM_MODE_SWITCH: - { - if (!wacom->b) - return; - - break; - } + { + if (!wacom->b) + return; + + break; + } } if (increment && !(x_diff > increment || y_diff > increment)) { @@ -348,9 +362,9 @@ transmit: if ((wacom->transmission_format == 0 && wacom->data[wacom->data_pos] == 0) || (wacom->transmission_format == 1 && wacom->data_pos == 7)) { wacom->transmission_ongoing = 0; - wacom->transmit_id = 0; - wacom->data_pos = 0; - wacom->old_tsc = tsc; + wacom->transmit_id = 0; + wacom->data_pos = 0; + wacom->old_tsc = tsc; } return; } @@ -360,7 +374,7 @@ wacom_init(const device_t *info) { mouse_wacom_t *dev; - dev = (mouse_wacom_t *) calloc(1, sizeof(mouse_wacom_t)); + dev = (mouse_wacom_t *) calloc(1, sizeof(mouse_wacom_t)); dev->name = info->name; dev->but = 3; diff --git a/src/device/serial.c b/src/device/serial.c index d8cb37c11..c0f5bdb7d 100644 --- a/src/device/serial.c +++ b/src/device/serial.c @@ -152,7 +152,7 @@ serial_clear_timeout(serial_t *dev) static void serial_receive_timer(void *priv) { - serial_t *dev = (serial_t *) priv; + serial_t *dev = (serial_t *) priv; // serial_log("serial_receive_timer()\n"); @@ -211,8 +211,7 @@ write_fifo(serial_t *dev, uint8_t dat) { serial_log("write_fifo(%08X, %02X, %i, %i)\n", dev, dat, (dev->type >= SERIAL_16550) && dev->fifo_enabled, - ((dev->type >= SERIAL_16550) && dev->fifo_enabled) ? - (dev->rcvr_fifo_pos % dev->rcvr_fifo_len) : 0); + ((dev->type >= SERIAL_16550) && dev->fifo_enabled) ? (dev->rcvr_fifo_pos % dev->rcvr_fifo_len) : 0); if ((dev->type >= SERIAL_16550) && dev->fifo_enabled) { /* FIFO mode. */ @@ -560,7 +559,7 @@ serial_write(uint16_t addr, uint8_t val, void *p) dev->rcvr_fifo_len = 14; break; } - dev->out_new = 0xffff; + dev->out_new = 0xffff; serial_log("FIFO now %sabled, receive FIFO length = %i\n", dev->fifo_enabled ? "en" : "dis", dev->rcvr_fifo_len); } break; @@ -665,7 +664,7 @@ serial_read(uint16_t addr, void *p) if (dev->rcvr_fifo_full || (dev->rcvr_fifo_pos != dev->rcvr_fifo_end)) { /* There is data in the FIFO. */ - ret = dev->rcvr_fifo[dev->rcvr_fifo_pos]; + ret = dev->rcvr_fifo[dev->rcvr_fifo_pos]; dev->rcvr_fifo_pos = (dev->rcvr_fifo_pos + 1) & 0x0f; /* Make sure to clear the FIFO full condition. */ @@ -690,7 +689,7 @@ serial_read(uint16_t addr, void *p) } else { /* Non-FIFO mode. */ - ret = (uint8_t) (dev->out_new & 0xffff); + ret = (uint8_t) (dev->out_new & 0xffff); dev->out_new = 0xffff; /* Always clear Data Ready interrupt. */ @@ -857,8 +856,8 @@ serial_reset(void *priv) serial_reset_port(dev); - dev->dlab = 96; - dev->fcr = 0x06; + dev->dlab = 96; + dev->fcr = 0x06; serial_transmit_period(dev); serial_update_speed(dev); @@ -889,8 +888,8 @@ serial_init(const device_t *info) serial_setup(dev, COM1_ADDR, COM1_IRQ); /* Default to 1200,N,7. */ - dev->dlab = 96; - dev->fcr = 0x06; + dev->dlab = 96; + dev->fcr = 0x06; if (info->local == SERIAL_8250_PCJR) dev->clock_src = 1789500.0; else diff --git a/src/discord.c b/src/discord.c index 458688eaa..fcc8d18c1 100644 --- a/src/discord.c +++ b/src/discord.c @@ -88,7 +88,7 @@ discord_update_activity(int paused) *(paren - 1) = '\0'; #pragma GCC diagnostic push -#if defined(__GNUC__) && !defined (__clang__) +#if defined(__GNUC__) && !defined(__clang__) # pragma GCC diagnostic ignored "-Wformat-truncation" #endif if (strlen(vm_name) < 100) { diff --git a/src/disk/hdc_ide.c b/src/disk/hdc_ide.c index bd91647f8..d4b44a13e 100644 --- a/src/disk/hdc_ide.c +++ b/src/disk/hdc_ide.c @@ -737,7 +737,7 @@ ide_set_signature(ide_t *ide) ide->secount = ide->sc->phase; ide->cylinder = ide->sc->request_length; } else { - ide->secount = 1; + ide->secount = 1; // ide->cylinder = ((ide->type == IDE_HDD) ? 0 : 0xFFFF); ide->cylinder = ((ide->type == IDE_HDD) ? 0 : 0x7F7F); if (ide->type == IDE_HDD) @@ -1919,9 +1919,9 @@ ide_readb(uint16_t addr, void *priv) addr &= 0xFFF7; if ((ide->type == IDE_NONE) && ((ide_drives[ch ^ 1]->type == IDE_NONE) || !(ch & 1))) - absent = 1; /* Absent and is master or both are absent. */ + absent = 1; /* Absent and is master or both are absent. */ else if ((ide->type == IDE_NONE) && (ch & 1)) - absent = 2; /* Absent and is slave and master is present. */ + absent = 2; /* Absent and is slave and master is present. */ switch (addr & 0x7) { case 0x0: /* Data */ diff --git a/src/disk/hdc_xta.c b/src/disk/hdc_xta.c index ca7f01b9d..0ac095929 100644 --- a/src/disk/hdc_xta.c +++ b/src/disk/hdc_xta.c @@ -102,7 +102,7 @@ #include <86box/hdc.h> #include <86box/hdd.h> -#define HDC_TIME (50 * TIMER_USEC) +#define HDC_TIME (50 * TIMER_USEC) #define WD_REV_1_BIOS_FILE "roms/hdd/xta/idexywd2.bin" #define WD_REV_2_BIOS_FILE "roms/hdd/xta/infowdbios.rom" @@ -968,7 +968,7 @@ xta_init(const device_t *info) { drive_t *drive; char *bios_rev = NULL; - char *fn = NULL; + char *fn = NULL; hdc_t *dev; int c, i; int max = XTA_NUM; diff --git a/src/floppy/fdc_monster.c b/src/floppy/fdc_monster.c index ae5e1b290..00a9d968a 100644 --- a/src/floppy/fdc_monster.c +++ b/src/floppy/fdc_monster.c @@ -33,12 +33,12 @@ #include <86box/fdc.h> #include <86box/fdc_ext.h> -#define BIOS_ADDR (uint32_t)(device_get_config_hex20("bios_addr") & 0x000fffff) +#define BIOS_ADDR (uint32_t)(device_get_config_hex20("bios_addr") & 0x000fffff) #define ROM_MONSTER_FDC "roms/floppy/monster-fdc/floppy_bios.bin" typedef struct { - rom_t bios_rom; + rom_t bios_rom; fdc_t *fdc_pri; fdc_t *fdc_sec; } monster_fdc_t; @@ -46,7 +46,7 @@ typedef struct static void monster_fdc_close(void *priv) { - monster_fdc_t *dev = (monster_fdc_t *)priv; + monster_fdc_t *dev = (monster_fdc_t *) priv; free(dev); } @@ -56,7 +56,7 @@ monster_fdc_init(const device_t *info) { monster_fdc_t *dev; - dev = (monster_fdc_t *)malloc(sizeof(monster_fdc_t)); + dev = (monster_fdc_t *) malloc(sizeof(monster_fdc_t)); memset(dev, 0, sizeof(monster_fdc_t)); #if 0 @@ -86,13 +86,14 @@ monster_fdc_init(const device_t *info) return dev; } -static int monster_fdc_available(void) +static int +monster_fdc_available(void) { return rom_present(ROM_MONSTER_FDC); } static const device_config_t monster_fdc_config[] = { -// clang-format off + // clang-format off #if 0 { .name = "sec_enabled", @@ -205,19 +206,19 @@ static const device_config_t monster_fdc_config[] = { }, #endif { .name = "", .description = "", .type = CONFIG_END } -// clang-format on + // clang-format on }; const device_t fdc_monster_device = { - .name = "Monster FDC Floppy Drive Controller", + .name = "Monster FDC Floppy Drive Controller", .internal_name = "monster_fdc", - .flags = DEVICE_ISA, - .local = 0, - .init = monster_fdc_init, - .close = monster_fdc_close, - .reset = NULL, + .flags = DEVICE_ISA, + .local = 0, + .init = monster_fdc_init, + .close = monster_fdc_close, + .reset = NULL, { .available = monster_fdc_available }, .speed_changed = NULL, - .force_redraw = NULL, - .config =monster_fdc_config + .force_redraw = NULL, + .config = monster_fdc_config }; diff --git a/src/floppy/fdi2raw.c b/src/floppy/fdi2raw.c index dcda6afc1..810293264 100644 --- a/src/floppy/fdi2raw.c +++ b/src/floppy/fdi2raw.c @@ -1520,7 +1520,7 @@ struct pulse_sample { static int pulse_limitval = 15; /* tolerance of 15% */ static struct pulse_sample psarray[FDI_MAX_ARRAY]; static int array_index; -static uint32_t total; +static uint32_t total; static int totaldiv; static void @@ -2051,7 +2051,7 @@ decode_lowlevel_track(FDI *fdi, int track, struct fdi_cache *cache) } static unsigned char fdiid[] = { "Formatted Disk Image file" }; -static int bit_rate_table[16] = { 125, 150, 250, 300, 500, 1000 }; +static int bit_rate_table[16] = { 125, 150, 250, 300, 500, 1000 }; void fdi2raw_header_free(FDI *fdi) diff --git a/src/machine/m_at_386dx_486.c b/src/machine/m_at_386dx_486.c index eeebbb784..0ee7b51a2 100644 --- a/src/machine/m_at_386dx_486.c +++ b/src/machine/m_at_386dx_486.c @@ -1066,7 +1066,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_ps2_ami_pci_device); /* Uses the AMIKEY KBC */ device_add(&sio_device); device_add(&fdc37c663_ide_device); device_add(&sst_flash_29ee010_device); @@ -1725,11 +1725,11 @@ machine_at_ms4134_init(const machine_t *model) { int ret; - ret = bios_load_linear("roms/machines/ms4134/4alm001.bin", + ret = bios_load_linear("roms/machines/ms4134/4alm001.bin", 0x000e0000, 131072, 0); if (bios_only || !ret) - return ret; + return ret; machine_at_common_ide_init(model); @@ -1760,10 +1760,10 @@ machine_at_tg486gp_init(const machine_t *model) int ret; ret = bios_load_linear("roms/machines/tg486gp/tg486gp.bin", - 0x000e0000, 131072, 0); + 0x000e0000, 131072, 0); if (bios_only || !ret) - return ret; + return ret; machine_at_common_ide_init(model); @@ -1793,10 +1793,10 @@ machine_at_tg486g_init(const machine_t *model) int ret; ret = bios_load_linear("roms/machines/tg486g/tg486g.bin", - 0x000c0000, 262144, 0); + 0x000c0000, 262144, 0); if (bios_only || !ret) - return ret; + return ret; else { mem_mapping_set_addr(&bios_mapping, 0x0c0000, 0x40000); mem_mapping_set_exec(&bios_mapping, rom); diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 0ec772669..9047342e8 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -12929,7 +12929,6 @@ machine_get_kbc_device(int m) return (NULL); } - const device_t * machine_get_device(int m) { diff --git a/src/network/net_3c501.c b/src/network/net_3c501.c index 736edb85b..5f542e41a 100644 --- a/src/network/net_3c501.c +++ b/src/network/net_3c501.c @@ -60,43 +60,42 @@ #include <86box/bswap.h> /* Maximum number of times we report a link down to the guest (failure to send frame) */ -#define ELNK_MAX_LINKDOWN_REPORTED 3 +#define ELNK_MAX_LINKDOWN_REPORTED 3 /* Maximum number of times we postpone restoring a link that is temporarily down. */ -#define ELNK_MAX_LINKRST_POSTPONED 3 +#define ELNK_MAX_LINKRST_POSTPONED 3 /* Maximum frame size we handle */ -#define MAX_FRAME 1536 +#define MAX_FRAME 1536 /* Size of the packet buffer. */ -#define ELNK_BUF_SIZE 2048 +#define ELNK_BUF_SIZE 2048 /* The packet buffer address mask. */ -#define ELNK_BUF_ADR_MASK (ELNK_BUF_SIZE - 1) +#define ELNK_BUF_ADR_MASK (ELNK_BUF_SIZE - 1) /* The GP buffer pointer address within the buffer. */ -#define ELNK_GP(dev) (dev->uGPBufPtr & ELNK_BUF_ADR_MASK) +#define ELNK_GP(dev) (dev->uGPBufPtr & ELNK_BUF_ADR_MASK) /* The GP buffer pointer mask. * NB: The GP buffer pointer is internally a 12-bit counter. When addressing into the * packet buffer, bit 11 is ignored. Required to pass 3C501 diagnostics. */ -#define ELNK_GP_MASK 0xfff +#define ELNK_GP_MASK 0xfff /********************************************************************************************************************************* -* Structures and Typedefs * -*********************************************************************************************************************************/ - + * Structures and Typedefs * + *********************************************************************************************************************************/ /** * EtherLink Transmit Command Register. */ typedef struct ELNK_XMIT_CMD { - uint8_t det_ufl : 1; /* Detect underflow. */ - uint8_t det_coll : 1; /* Detect collision. */ - uint8_t det_16col : 1; /* Detect collision 16. */ - uint8_t det_succ : 1; /* Detect successful xmit. */ - uint8_t unused : 4; + uint8_t det_ufl : 1; /* Detect underflow. */ + uint8_t det_coll : 1; /* Detect collision. */ + uint8_t det_16col : 1; /* Detect collision 16. */ + uint8_t det_succ : 1; /* Detect successful xmit. */ + uint8_t unused : 4; } EL_XMT_CMD; /** @@ -107,151 +106,151 @@ typedef struct ELNK_XMIT_CMD { * (something the 3C501 does not have a concept of). */ typedef struct ELNK_XMIT_STAT { - uint8_t uflow : 1; /* Underflow on transmit. */ - uint8_t coll : 1; /* Collision on transmit. */ - uint8_t coll16 : 1; /* 16 collisions on transmit. */ - uint8_t ready : 1; /* Ready for a new frame. */ - uint8_t undef : 4; + uint8_t uflow : 1; /* Underflow on transmit. */ + uint8_t coll : 1; /* Collision on transmit. */ + uint8_t coll16 : 1; /* 16 collisions on transmit. */ + uint8_t ready : 1; /* Ready for a new frame. */ + uint8_t undef : 4; } EL_XMT_STAT; /** Address match (adr_match) modes. */ typedef enum { - EL_ADRM_DISABLED = 0, /* Receiver disabled. */ - EL_ADRM_PROMISC = 1, /* Receive all addresses. */ - EL_ADRM_BCAST = 2, /* Receive station + broadcast. */ - EL_ADRM_MCAST = 3 /* Receive station + multicast. */ + EL_ADRM_DISABLED = 0, /* Receiver disabled. */ + EL_ADRM_PROMISC = 1, /* Receive all addresses. */ + EL_ADRM_BCAST = 2, /* Receive station + broadcast. */ + EL_ADRM_MCAST = 3 /* Receive station + multicast. */ } EL_ADDR_MATCH; /** * EtherLink Receive Command Register. */ typedef struct ELNK_RECV_CMD { - uint8_t det_ofl : 1; /* Detect overflow errors. */ - uint8_t det_fcs : 1; /* Detect FCS errors. */ - uint8_t det_drbl : 1; /* Detect dribble error. */ - uint8_t det_runt : 1; /* Detect short frames. */ - uint8_t det_eof : 1; /* Detect EOF (frames without overflow). */ - uint8_t acpt_good : 1; /* Accept good frames. */ - uint8_t adr_match : 2; /* Address match mode. */ + uint8_t det_ofl : 1; /* Detect overflow errors. */ + uint8_t det_fcs : 1; /* Detect FCS errors. */ + uint8_t det_drbl : 1; /* Detect dribble error. */ + uint8_t det_runt : 1; /* Detect short frames. */ + uint8_t det_eof : 1; /* Detect EOF (frames without overflow). */ + uint8_t acpt_good : 1; /* Accept good frames. */ + uint8_t adr_match : 2; /* Address match mode. */ } EL_RCV_CMD; /** * EtherLink Receive Status Register. */ typedef struct ELNK_RECV_STAT { - uint8_t oflow : 1; /* Overflow on receive. */ - uint8_t fcs : 1; /* FCS error. */ - uint8_t dribble : 1; /* Dribble error. */ - uint8_t runt : 1; /* Short frame. */ - uint8_t no_ovf : 1; /* Received packet w/o overflow. */ - uint8_t good : 1; /* Received good packet. */ - uint8_t undef : 1; - uint8_t stale : 1; /* Stale receive status. */ + uint8_t oflow : 1; /* Overflow on receive. */ + uint8_t fcs : 1; /* FCS error. */ + uint8_t dribble : 1; /* Dribble error. */ + uint8_t runt : 1; /* Short frame. */ + uint8_t no_ovf : 1; /* Received packet w/o overflow. */ + uint8_t good : 1; /* Received good packet. */ + uint8_t undef : 1; + uint8_t stale : 1; /* Stale receive status. */ } EL_RCV_STAT; /** Buffer control (buf_ctl) modes. */ typedef enum { - EL_BCTL_SYSTEM = 0, /* Host has buffer access. */ - EL_BCTL_XMT_RCV = 1, /* Transmit, then receive. */ - EL_BCTL_RECEIVE = 2, /* Receive. */ - EL_BCTL_LOOPBACK = 3 /* Loopback. */ + EL_BCTL_SYSTEM = 0, /* Host has buffer access. */ + EL_BCTL_XMT_RCV = 1, /* Transmit, then receive. */ + EL_BCTL_RECEIVE = 2, /* Receive. */ + EL_BCTL_LOOPBACK = 3 /* Loopback. */ } EL_BUFFER_CONTROL; /** * EtherLink Auxiliary Status Register. */ typedef struct ELNK_AUX_CMD { - uint8_t ire : 1; /* Interrupt Request Enable. */ - uint8_t xmit_bf : 1; /* Xmit packets with bad FCS. */ - uint8_t buf_ctl : 2; /* Packet buffer control. */ - uint8_t unused : 1; - uint8_t dma_req : 1; /* DMA request. */ - uint8_t ride : 1; /* Request Interrupt and DMA Enable. */ - uint8_t reset : 1; /* Card in reset while set. */ + uint8_t ire : 1; /* Interrupt Request Enable. */ + uint8_t xmit_bf : 1; /* Xmit packets with bad FCS. */ + uint8_t buf_ctl : 2; /* Packet buffer control. */ + uint8_t unused : 1; + uint8_t dma_req : 1; /* DMA request. */ + uint8_t ride : 1; /* Request Interrupt and DMA Enable. */ + uint8_t reset : 1; /* Card in reset while set. */ } EL_AUX_CMD; /** * EtherLink Auxiliary Status Register. */ typedef struct ELNK_AUX_STAT { - uint8_t recv_bsy : 1; /* Receive busy. */ - uint8_t xmit_bf : 1; /* Xmit packets with bad FCS. */ - uint8_t buf_ctl : 2; /* Packet buffer control. */ - uint8_t dma_done : 1; /* DMA done. */ - uint8_t dma_req : 1; /* DMA request. */ - uint8_t ride : 1; /* Request Interrupt and DMA Enable. */ - uint8_t xmit_bsy : 1; /* Transmit busy. */ + uint8_t recv_bsy : 1; /* Receive busy. */ + uint8_t xmit_bf : 1; /* Xmit packets with bad FCS. */ + uint8_t buf_ctl : 2; /* Packet buffer control. */ + uint8_t dma_done : 1; /* DMA done. */ + uint8_t dma_req : 1; /* DMA request. */ + uint8_t ride : 1; /* Request Interrupt and DMA Enable. */ + uint8_t xmit_bsy : 1; /* Transmit busy. */ } EL_AUX_STAT; /** * Internal interrupt status. */ typedef struct ELNK_INTR_STAT { - uint8_t recv_intr : 1; /* Receive interrupt status. */ - uint8_t xmit_intr : 1; /* Transmit interrupt status. */ - uint8_t dma_intr : 1; /* DMA interrupt status. */ - uint8_t unused : 5; + uint8_t recv_intr : 1; /* Receive interrupt status. */ + uint8_t xmit_intr : 1; /* Transmit interrupt status. */ + uint8_t dma_intr : 1; /* DMA interrupt status. */ + uint8_t unused : 5; } EL_INTR_STAT; typedef struct { - uint32_t base_address; - int base_irq; - uint32_t bios_addr; - uint8_t maclocal[6]; /* configured MAC (local) address. */ - bool fISR; /* Internal interrupt flag. */ - int fDMA; /* Internal DMA active flag. */ - int fInReset; /* Internal in-reset flag. */ - uint8_t aPROM[8]; /* The PROM contents. Only 8 bytes addressable, R/O. */ - uint8_t aStationAddr[6]; /* The station address programmed by the guest, W/O. */ - uint16_t uGPBufPtr; /* General Purpose (GP) Buffer Pointer, R/W. */ - uint16_t uRCVBufPtr; /* Receive (RCV) Buffer Pointer, R/W. */ + uint32_t base_address; + int base_irq; + uint32_t bios_addr; + uint8_t maclocal[6]; /* configured MAC (local) address. */ + bool fISR; /* Internal interrupt flag. */ + int fDMA; /* Internal DMA active flag. */ + int fInReset; /* Internal in-reset flag. */ + uint8_t aPROM[8]; /* The PROM contents. Only 8 bytes addressable, R/O. */ + uint8_t aStationAddr[6]; /* The station address programmed by the guest, W/O. */ + uint16_t uGPBufPtr; /* General Purpose (GP) Buffer Pointer, R/W. */ + uint16_t uRCVBufPtr; /* Receive (RCV) Buffer Pointer, R/W. */ /** Transmit Command Register, W/O. */ union { - uint8_t XmitCmdReg; - EL_XMT_CMD XmitCmd; + uint8_t XmitCmdReg; + EL_XMT_CMD XmitCmd; }; /** Transmit Status Register, R/O. */ union { - uint8_t XmitStatReg; - EL_XMT_STAT XmitStat; + uint8_t XmitStatReg; + EL_XMT_STAT XmitStat; }; /** Receive Command Register, W/O. */ union { - uint8_t RcvCmdReg; - EL_RCV_CMD RcvCmd; + uint8_t RcvCmdReg; + EL_RCV_CMD RcvCmd; }; /** Receive Status Register, R/O. */ union { - uint8_t RcvStatReg; - EL_RCV_STAT RcvStat; + uint8_t RcvStatReg; + EL_RCV_STAT RcvStat; }; /** Auxiliary Command Register, W/O. */ union { - uint8_t AuxCmdReg; - EL_AUX_CMD AuxCmd; + uint8_t AuxCmdReg; + EL_AUX_CMD AuxCmd; }; /** Auxiliary Status Register, R/O. */ union { - uint8_t AuxStatReg; - EL_AUX_STAT AuxStat; + uint8_t AuxStatReg; + EL_AUX_STAT AuxStat; }; - int fLinkUp; /* If set the link is currently up. */ - int fLinkTempDown; /* If set the link is temporarily down because of a saved state load. */ - uint16_t cLinkDownReported; /* Number of times we've reported the link down. */ - uint16_t cLinkRestorePostponed; /* Number of times we've postponed the link restore. */ + int fLinkUp; /* If set the link is currently up. */ + int fLinkTempDown; /* If set the link is temporarily down because of a saved state load. */ + uint16_t cLinkDownReported; /* Number of times we've reported the link down. */ + uint16_t cLinkRestorePostponed; /* Number of times we've postponed the link restore. */ /* Internal interrupt state. */ union { - uint8_t IntrStateReg; - EL_INTR_STAT IntrState; + uint8_t IntrStateReg; + EL_INTR_STAT IntrState; }; - uint32_t cMsLinkUpDelay; /* MS to wait before we enable the link. */ - int dma_channel; - uint8_t abLoopBuf[ELNK_BUF_SIZE]; /* The loopback transmit buffer (avoid stack allocations). */ - uint8_t abRuntBuf[64]; /* The runt pad buffer (only really needs 60 bytes). */ - uint8_t abPacketBuf[ELNK_BUF_SIZE]; /* The packet buffer. */ - int dma_pos; - pc_timer_t timer_restore; - netcard_t *netcard; + uint32_t cMsLinkUpDelay; /* MS to wait before we enable the link. */ + int dma_channel; + uint8_t abLoopBuf[ELNK_BUF_SIZE]; /* The loopback transmit buffer (avoid stack allocations). */ + uint8_t abRuntBuf[64]; /* The runt pad buffer (only really needs 60 bytes). */ + uint8_t abPacketBuf[ELNK_BUF_SIZE]; /* The packet buffer. */ + int dma_pos; + pc_timer_t timer_restore; + netcard_t *netcard; } threec501_t; #ifdef ENABLE_3COM501_LOG @@ -280,7 +279,7 @@ static void elnkR3HardReset(threec501_t *dev); #endif #define ETHER_ADDR_LEN ETH_ALEN -#define ETH_ALEN 6 +#define ETH_ALEN 6 #pragma pack(1) struct ether_header /** @todo Use RTNETETHERHDR? */ { @@ -325,8 +324,8 @@ static void elnkTempLinkDown(threec501_t *dev) { if (dev->fLinkUp) { - dev->fLinkTempDown = 1; - dev->cLinkDownReported = 0; + dev->fLinkTempDown = 1; + dev->cLinkDownReported = 0; dev->cLinkRestorePostponed = 0; timer_set_delay_u64(&dev->timer_restore, (dev->cMsLinkUpDelay * 1000) * TIMER_USEC); } @@ -341,7 +340,7 @@ elnkR3Reset(void *priv) threec501_t *dev = (threec501_t *) priv; if (dev->fLinkTempDown) { - dev->cLinkDownReported = 0x1000; + dev->cLinkDownReported = 0x1000; dev->cLinkRestorePostponed = 0x1000; timer_disable(&dev->timer_restore); } @@ -367,15 +366,14 @@ elnkR3HardReset(threec501_t *dev) elnkSoftReset(dev); } - /** * Check if incoming frame matches the station address. */ static __inline int padr_match(threec501_t *dev, const uint8_t *buf) { - struct ether_header *hdr = (struct ether_header *)buf; - int result; + struct ether_header *hdr = (struct ether_header *) buf; + int result; /* Checks own + broadcast as well as own + multicast. */ result = (dev->RcvCmd.adr_match >= EL_ADRM_BCAST) && !memcmp(hdr->ether_dhost, dev->aStationAddr, 6); @@ -389,21 +387,20 @@ padr_match(threec501_t *dev, const uint8_t *buf) static __inline int padr_bcast(threec501_t *dev, const uint8_t *buf) { - static uint8_t aBCAST[6] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; - struct ether_header *hdr = (struct ether_header *)buf; - int result = (dev->RcvCmd.adr_match == EL_ADRM_BCAST) && !memcmp(hdr->ether_dhost, aBCAST, 6); + static uint8_t aBCAST[6] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; + struct ether_header *hdr = (struct ether_header *) buf; + int result = (dev->RcvCmd.adr_match == EL_ADRM_BCAST) && !memcmp(hdr->ether_dhost, aBCAST, 6); return result; } - /** * Check if incoming frame is an accepted multicast frame. */ static __inline int padr_mcast(threec501_t *dev, const uint8_t *buf) { - struct ether_header *hdr = (struct ether_header *)buf; - int result = (dev->RcvCmd.adr_match == EL_ADRM_MCAST) && ETHER_IS_MULTICAST(hdr->ether_dhost); + struct ether_header *hdr = (struct ether_header *) buf; + int result = (dev->RcvCmd.adr_match == EL_ADRM_MCAST) && ETHER_IS_MULTICAST(hdr->ether_dhost); return result; } @@ -475,9 +472,9 @@ elnkSoftReset(threec501_t *dev) static int elnkReceiveLocked(void *priv, uint8_t *src, int size) { - threec501_t *dev = (threec501_t *) priv; - int is_padr = 0, is_bcast = 0, is_mcast = 0; - bool fLoopback = dev->RcvCmd.adr_match == EL_BCTL_LOOPBACK; + threec501_t *dev = (threec501_t *) priv; + int is_padr = 0, is_bcast = 0, is_mcast = 0; + bool fLoopback = dev->RcvCmd.adr_match == EL_BCTL_LOOPBACK; union { uint8_t RcvStatNewReg; @@ -513,8 +510,8 @@ elnkReceiveLocked(void *priv, uint8_t *src, int size) * filter are always ignored. */ /// @todo cbToRecv must be 6 or more (complete address) - if ((dev->RcvCmd.adr_match == EL_ADRM_PROMISC) /* promiscuous enabled */ - || (is_padr = padr_match(dev, src)) + if ((dev->RcvCmd.adr_match == EL_ADRM_PROMISC) /* promiscuous enabled */ + || (is_padr = padr_match(dev, src)) || (is_bcast = padr_bcast(dev, src)) || (is_mcast = padr_mcast(dev, src))) { uint8_t *dst = dev->abPacketBuf + dev->uRCVBufPtr; @@ -524,9 +521,9 @@ elnkReceiveLocked(void *priv, uint8_t *src, int size) #endif /* Receive status is evaluated from scratch. The stale bit must remain set until we know better. */ - rcvstatnew.RcvStatNewReg = 0; + rcvstatnew.RcvStatNewReg = 0; rcvstatnew.RcvStatNew.stale = 1; - dev->RcvStatReg = 0x80; + dev->RcvStatReg = 0x80; /* Detect errors: Runts, overflow, and FCS errors. * NB: Dribble errors can not happen because we can only receive an @@ -549,7 +546,7 @@ elnkReceiveLocked(void *priv, uint8_t *src, int size) memset(dev->abRuntBuf, 0, sizeof(dev->abRuntBuf)); memcpy(dev->abRuntBuf, src, size); size = 60; - src = dev->abRuntBuf; + src = dev->abRuntBuf; } else { #ifdef ENABLE_3COM501_LOG threec501_log("3Com501 runt, size=%d\n", size); @@ -582,7 +579,7 @@ elnkReceiveLocked(void *priv, uint8_t *src, int size) if (rcvstatnew.RcvStatNew.no_ovf && !rcvstatnew.RcvStatNew.fcs && !rcvstatnew.RcvStatNew.runt) rcvstatnew.RcvStatNew.good = 1; - uint16_t cbCopy = (uint16_t)MIN(ELNK_BUF_SIZE - dev->uRCVBufPtr, size); + uint16_t cbCopy = (uint16_t) MIN(ELNK_BUF_SIZE - dev->uRCVBufPtr, size); /* All packets that passed the address filter are copied to the buffer. */ @@ -604,15 +601,15 @@ elnkReceiveLocked(void *priv, uint8_t *src, int size) * NB: The precise receive logic is not very well described in the EtherLink * documentation. It was refined using the 3C501.EXE diagnostic utility. */ - if ( (rcvstatnew.RcvStatNew.good && dev->RcvCmd.acpt_good) - || (rcvstatnew.RcvStatNew.no_ovf && dev->RcvCmd.det_eof) - || (rcvstatnew.RcvStatNew.runt && dev->RcvCmd.det_runt) + if ((rcvstatnew.RcvStatNew.good && dev->RcvCmd.acpt_good) + || (rcvstatnew.RcvStatNew.no_ovf && dev->RcvCmd.det_eof) + || (rcvstatnew.RcvStatNew.runt && dev->RcvCmd.det_runt) || (rcvstatnew.RcvStatNew.dribble && dev->RcvCmd.det_drbl) - || (rcvstatnew.RcvStatNew.fcs && dev->RcvCmd.det_fcs) - || (rcvstatnew.RcvStatNew.oflow && dev->RcvCmd.det_ofl)) { - dev->AuxStat.recv_bsy = 0; - dev->IntrState.recv_intr = 1; - rcvstatnew.RcvStatNew.stale = 0; /* Prevents further receive until set again. */ + || (rcvstatnew.RcvStatNew.fcs && dev->RcvCmd.det_fcs) + || (rcvstatnew.RcvStatNew.oflow && dev->RcvCmd.det_ofl)) { + dev->AuxStat.recv_bsy = 0; + dev->IntrState.recv_intr = 1; + rcvstatnew.RcvStatNew.stale = 0; /* Prevents further receive until set again. */ } /* Finally update the receive status. */ @@ -715,7 +712,7 @@ elnkAsyncTransmit(threec501_t *dev) /* NB: The buffer control does *not* change to Receive and stays the way it was. */ if (!fLoopback) { - dev->AuxStat.recv_bsy = 1; /* Receive Busy now set until a packet is received. */ + dev->AuxStat.recv_bsy = 1; /* Receive Busy now set until a packet is received. */ } } while (0); /* No loop, because there isn't ever more than one packet to transmit. */ @@ -725,14 +722,14 @@ elnkAsyncTransmit(threec501_t *dev) static void elnkCsrWrite(threec501_t *dev, uint8_t data) { - bool fTransmit = false; - bool fReceive = false; - bool fDMAR; - int mode; + bool fTransmit = false; + bool fReceive = false; + bool fDMAR; + int mode; union { - uint8_t reg; - EL_AUX_CMD val; + uint8_t reg; + EL_AUX_CMD val; } auxcmd; auxcmd.reg = data; @@ -759,7 +756,7 @@ elnkCsrWrite(threec501_t *dev, uint8_t data) #endif elnkSoftReset(dev); } - dev->AuxCmd.reset = auxcmd.val.reset; /* Update the reset bit, if nothing else. */ + dev->AuxCmd.reset = auxcmd.val.reset; /* Update the reset bit, if nothing else. */ } /* If the card is in reset, stop right here. */ @@ -788,14 +785,14 @@ elnkCsrWrite(threec501_t *dev, uint8_t data) } } else { while (dev->dma_pos < (ELNK_BUF_SIZE - ELNK_GP(dev))) { - int dma_data = dma_channel_read(dev->dma_channel); + int dma_data = dma_channel_read(dev->dma_channel); dev->abPacketBuf[ELNK_GP(dev) + dev->dma_pos] = dma_data & 0xff; dev->dma_pos++; } } dev->uGPBufPtr = (dev->uGPBufPtr + dev->dma_pos) & ELNK_GP_MASK; dma_set_drq(dev->dma_channel, 0); - dev->dma_pos = 0; + dev->dma_pos = 0; dev->IntrState.dma_intr = 1; dev->AuxStat.dma_done = 1; elnkUpdateIrq(dev); @@ -808,7 +805,7 @@ elnkCsrWrite(threec501_t *dev, uint8_t data) /* Interrupt enable changes. */ if ((dev->AuxCmd.ire != auxcmd.val.ire) || (dev->AuxCmd.ride != auxcmd.val.ride)) { dev->AuxStat.ride = dev->AuxCmd.ride = auxcmd.val.ride; - dev->AuxCmd.ire = auxcmd.val.ire; /* NB: IRE is not visible in the aux status register. */ + dev->AuxCmd.ire = auxcmd.val.ire; /* NB: IRE is not visible in the aux status register. */ } /* DMA Request changes. */ @@ -824,15 +821,15 @@ elnkCsrWrite(threec501_t *dev, uint8_t data) /* Packet buffer control changes. */ if (dev->AuxCmd.buf_ctl != auxcmd.val.buf_ctl) { #ifdef ENABLE_3COM501_LOG - static const char *apszBuffCntrl[4] = { "System", "Xmit then Recv", "Receive", "Loopback" }; + static const char *apszBuffCntrl[4] = { "System", "Xmit then Recv", "Receive", "Loopback" }; threec501_log("3Com501: Packet buffer control `%s' -> `%s'\n", apszBuffCntrl[dev->AuxCmd.buf_ctl], apszBuffCntrl[auxcmd.val.buf_ctl]); #endif if (auxcmd.val.buf_ctl == EL_BCTL_XMT_RCV) { /* Transmit, then receive. */ - fTransmit = true; + fTransmit = true; dev->AuxStat.recv_bsy = 0; } else if (auxcmd.val.buf_ctl == EL_BCTL_SYSTEM) { - dev->AuxStat.xmit_bsy = 1; /* Transmit Busy is set here and cleared once actual transmit completes. */ + dev->AuxStat.xmit_bsy = 1; /* Transmit Busy is set here and cleared once actual transmit completes. */ dev->AuxStat.recv_bsy = 0; } else if (auxcmd.val.buf_ctl == EL_BCTL_RECEIVE) { /* Special case: If going from xmit-then-receive mode to receive mode, and we received @@ -845,8 +842,8 @@ elnkCsrWrite(threec501_t *dev, uint8_t data) /* For loopback, we go through the regular transmit and receive path. That may be an * overkill but the receive path is too complex for a special loopback-only case. */ - fTransmit = true; - dev->AuxStat.recv_bsy = 1; /* Receive Busy now set until a packet is received. */ + fTransmit = true; + dev->AuxStat.recv_bsy = 1; /* Receive Busy now set until a packet is received. */ } dev->AuxStat.buf_ctl = dev->AuxCmd.buf_ctl = auxcmd.val.buf_ctl; } @@ -863,7 +860,7 @@ elnkCsrWrite(threec501_t *dev, uint8_t data) if (fTransmit) elnkAsyncTransmit(dev); else if (fReceive) { - dev->AuxStat.recv_bsy = 1; /* Receive Busy now set until a packet is received. */ + dev->AuxStat.recv_bsy = 1; /* Receive Busy now set until a packet is received. */ } } @@ -874,52 +871,52 @@ threec501_read(uint16_t addr, void *priv) uint8_t retval = 0xff; switch (addr & 0x0f) { - case 0x00: /* Receive status register aliases. The SEEQ 8001 */ - case 0x02: /* EDLC clearly only decodes one bit for reads. */ + case 0x00: /* Receive status register aliases. The SEEQ 8001 */ + case 0x02: /* EDLC clearly only decodes one bit for reads. */ case 0x04: - case 0x06: /* Receive status register. */ - retval = dev->RcvStatReg; - dev->RcvStat.stale = 1; /* Allows further reception. */ + case 0x06: /* Receive status register. */ + retval = dev->RcvStatReg; + dev->RcvStat.stale = 1; /* Allows further reception. */ dev->IntrState.recv_intr = 0; /* Reading clears receive interrupt. */ elnkUpdateIrq(dev); break; - case 0x01: /* Transmit status register aliases. */ + case 0x01: /* Transmit status register aliases. */ case 0x03: case 0x05: - case 0x07: /* Transmit status register. */ - retval = dev->XmitStatReg; + case 0x07: /* Transmit status register. */ + retval = dev->XmitStatReg; dev->IntrState.xmit_intr = 0; /* Reading clears transmit interrupt. */ elnkUpdateIrq(dev); break; - case 0x08: /* GP Buffer pointer LSB. */ + case 0x08: /* GP Buffer pointer LSB. */ retval = (dev->uGPBufPtr & 0xff); break; - case 0x09: /* GP Buffer pointer MSB. */ + case 0x09: /* GP Buffer pointer MSB. */ retval = (dev->uGPBufPtr >> 8); break; - case 0x0a: /* RCV Buffer pointer LSB. */ + case 0x0a: /* RCV Buffer pointer LSB. */ retval = (dev->uRCVBufPtr & 0xff); break; - case 0x0b: /* RCV Buffer pointer MSB. */ + case 0x0b: /* RCV Buffer pointer MSB. */ retval = (dev->uRCVBufPtr >> 8); break; - case 0x0c: /* Ethernet address PROM window. */ - case 0x0d: /* Alias. */ + case 0x0c: /* Ethernet address PROM window. */ + case 0x0d: /* Alias. */ /* Reads use low 3 bits of GP buffer pointer, no auto-increment. */ retval = dev->aPROM[dev->uGPBufPtr & 7]; break; - case 0x0e: /* Auxiliary status register. */ + case 0x0e: /* Auxiliary status register. */ retval = dev->AuxStatReg; break; - case 0x0f: /* Buffer window. */ + case 0x0f: /* Buffer window. */ /* Reads use low 11 bits of GP buffer pointer, auto-increment. */ - retval = dev->abPacketBuf[ELNK_GP(dev)]; + retval = dev->abPacketBuf[ELNK_GP(dev)]; dev->uGPBufPtr = (dev->uGPBufPtr + 1) & ELNK_GP_MASK; break; } @@ -973,40 +970,40 @@ threec501_write(uint16_t addr, uint8_t value, void *priv) #endif break; - case 0x08: /* GP Buffer pointer LSB. */ + case 0x08: /* GP Buffer pointer LSB. */ dev->uGPBufPtr = (dev->uGPBufPtr & 0xff00) | value; break; - case 0x09: /* GP Buffer pointer MSB. */ + case 0x09: /* GP Buffer pointer MSB. */ dev->uGPBufPtr = (dev->uGPBufPtr & 0x00ff) | (value << 8); break; - case 0x0a: /* RCV Buffer pointer clear. */ + case 0x0a: /* RCV Buffer pointer clear. */ dev->uRCVBufPtr = 0; #ifdef ENABLE_3COM501_LOG threec501_log("3Com501: RCV Buffer Pointer cleared (%02X)\n", value); #endif break; - case 0x0b: /* RCV buffer pointer MSB. */ - case 0x0c: /* Ethernet address PROM window. */ - case 0x0d: /* Undocumented. */ + case 0x0b: /* RCV buffer pointer MSB. */ + case 0x0c: /* Ethernet address PROM window. */ + case 0x0d: /* Undocumented. */ #ifdef ENABLE_3COM501_LOG threec501_log("3Com501: Writing read-only register %02X!\n", reg); #endif break; - case 0x0e: /* Auxiliary Command (CSR). */ + case 0x0e: /* Auxiliary Command (CSR). */ elnkCsrWrite(dev, value); break; - case 0x0f: /* Buffer window. */ + case 0x0f: /* Buffer window. */ /* Writes use low 11 bits of GP buffer pointer, auto-increment. */ if (dev->AuxCmd.buf_ctl != EL_BCTL_SYSTEM) { /// @todo Does this still increment GPBufPtr? break; } dev->abPacketBuf[ELNK_GP(dev)] = value; - dev->uGPBufPtr = (dev->uGPBufPtr + 1) & ELNK_GP_MASK; + dev->uGPBufPtr = (dev->uGPBufPtr + 1) & ELNK_GP_MASK; break; } @@ -1042,12 +1039,12 @@ elnkSetLinkState(void *priv, uint32_t link_state) if (dev->fLinkUp != link_up) { dev->fLinkUp = link_up; if (link_up) { - dev->fLinkTempDown = 1; - dev->cLinkDownReported = 0; + dev->fLinkTempDown = 1; + dev->cLinkDownReported = 0; dev->cLinkRestorePostponed = 0; timer_set_delay_u64(&dev->timer_restore, (dev->cMsLinkUpDelay * 1000) * TIMER_USEC); } else { - dev->cLinkDownReported = 0; + dev->cLinkDownReported = 0; dev->cLinkRestorePostponed = 0; } } @@ -1060,8 +1057,7 @@ elnkR3TimerRestore(void *priv) { threec501_t *dev = (threec501_t *) priv; - if ((dev->cLinkDownReported <= ELNK_MAX_LINKDOWN_REPORTED) && - (dev->cLinkRestorePostponed <= ELNK_MAX_LINKRST_POSTPONED)) { + if ((dev->cLinkDownReported <= ELNK_MAX_LINKDOWN_REPORTED) && (dev->cLinkRestorePostponed <= ELNK_MAX_LINKRST_POSTPONED)) { timer_advance_u64(&dev->timer_restore, 1500000 * TIMER_USEC); dev->cLinkRestorePostponed++; } else { @@ -1117,7 +1113,7 @@ threec501_nic_init(const device_t *info) /* Initialize the PROM */ memcpy(dev->aPROM, dev->maclocal, sizeof(dev->maclocal)); - dev->aPROM[6] = dev->aPROM[7] = 0; /* The two padding bytes. */ + dev->aPROM[6] = dev->aPROM[7] = 0; /* The two padding bytes. */ #ifdef ENABLE_3COM501_LOG threec501_log("I/O=%04x, IRQ=%d, DMA=%d, MAC=%02x:%02x:%02x:%02x:%02x:%02x\n", @@ -1210,15 +1206,15 @@ static const device_config_t threec501_config[] = { }; const device_t threec501_device = { - .name = "3Com EtherLink (3c500/3c501)", + .name = "3Com EtherLink (3c500/3c501)", .internal_name = "3c501", - .flags = DEVICE_ISA, - .local = 0, - .init = threec501_nic_init, - .close = threec501_nic_close, - .reset = elnkR3Reset, + .flags = DEVICE_ISA, + .local = 0, + .init = threec501_nic_init, + .close = threec501_nic_close, + .reset = elnkR3Reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = threec501_config + .force_redraw = NULL, + .config = threec501_config }; diff --git a/src/pci_dummy.c b/src/pci_dummy.c index b3a5c6eee..1d0c95be2 100644 --- a/src/pci_dummy.c +++ b/src/pci_dummy.c @@ -32,7 +32,7 @@ static uint8_t pci_dummy_read(uint16_t Port, void *p) { pci_dummy_t *dev = (pci_dummy_t *) p; - uint8_t ret = 0xff; + uint8_t ret = 0xff; switch (Port & 0x20) { case 0x00: @@ -120,51 +120,57 @@ static uint8_t pci_dummy_pci_read(int func, int addr, void *priv) { pci_dummy_t *dev = (pci_dummy_t *) priv; - uint8_t ret = 0xff; + uint8_t ret = 0xff; - if (func == 0x00) switch (addr) { - case 0x00: case 0x2c: - ret = 0x1a; - break; - case 0x01: case 0x2d: - ret = 0x07; - break; + if (func == 0x00) + switch (addr) { + case 0x00: + case 0x2c: + ret = 0x1a; + break; + case 0x01: + case 0x2d: + ret = 0x07; + break; - case 0x02: case 0x2e: - ret = 0x0b; - break; - case 0x03: case 0x2f: - ret = 0xab; - break; + case 0x02: + case 0x2e: + ret = 0x0b; + break; + case 0x03: + case 0x2f: + ret = 0xab; + break; - case 0x04: /* PCI_COMMAND_LO */ - case 0x05: /* PCI_COMMAND_HI */ - case 0x06: /* PCI_STATUS_LO */ - case 0x07: /* PCI_STATUS_HI */ - case 0x0a: case 0x0b: - case 0x3c: /* PCI_ILR */ - ret = dev->pci_regs[addr]; - break; + case 0x04: /* PCI_COMMAND_LO */ + case 0x05: /* PCI_COMMAND_HI */ + case 0x06: /* PCI_STATUS_LO */ + case 0x07: /* PCI_STATUS_HI */ + case 0x0a: + case 0x0b: + case 0x3c: /* PCI_ILR */ + ret = dev->pci_regs[addr]; + break; - case 0x08: /* Techncially, revision, but we return the card (slot) here. */ - ret = dev->card; - break; + case 0x08: /* Techncially, revision, but we return the card (slot) here. */ + ret = dev->card; + break; - case 0x10: /* PCI_BAR 7:5 */ - ret = (dev->pci_bar[0].addr_regs[0] & 0xe0) | 0x01; - break; - case 0x11: /* PCI_BAR 15:8 */ - ret = dev->pci_bar[0].addr_regs[1]; - break; + case 0x10: /* PCI_BAR 7:5 */ + ret = (dev->pci_bar[0].addr_regs[0] & 0xe0) | 0x01; + break; + case 0x11: /* PCI_BAR 15:8 */ + ret = dev->pci_bar[0].addr_regs[1]; + break; - case 0x3d: /* PCI_IPR */ - ret = PCI_INTA; - break; + case 0x3d: /* PCI_IPR */ + ret = PCI_INTA; + break; - default: - ret = 0x00; - break; - } + default: + ret = 0x00; + break; + } // pclog("AB0B:071A: PCI_Read(%d, %04X) = %02X\n", func, addr, ret); @@ -175,50 +181,51 @@ static void pci_dummy_pci_write(int func, int addr, uint8_t val, void *priv) { pci_dummy_t *dev = (pci_dummy_t *) priv; - uint8_t valxor; + uint8_t valxor; // pclog("AB0B:071A: PCI_Write(%d, %04X, %02X)\n", func, addr, val); - if (func == 0x00) switch (addr) { - case 0x04: /* PCI_COMMAND_LO */ - valxor = (val & 0x03) ^ dev->pci_regs[addr]; - if (valxor & PCI_COMMAND_IO) { + if (func == 0x00) + switch (addr) { + case 0x04: /* PCI_COMMAND_LO */ + valxor = (val & 0x03) ^ dev->pci_regs[addr]; + if (valxor & PCI_COMMAND_IO) { + pci_dummy_io_remove(dev); + if ((dev->pci_bar[0].addr != 0) && (val & PCI_COMMAND_IO)) + pci_dummy_io_set(dev); + } + dev->pci_regs[addr] = val & 0x03; + break; + + case 0x10: /* PCI_BAR */ + val &= 0xe0; /* 0xe0 acc to RTL DS */ + /*FALLTHROUGH*/ + + case 0x11: /* PCI_BAR */ + /* Remove old I/O. */ pci_dummy_io_remove(dev); - if ((dev->pci_bar[0].addr != 0) && (val & PCI_COMMAND_IO)) - pci_dummy_io_set(dev); - } - dev->pci_regs[addr] = val & 0x03; - break; - case 0x10: /* PCI_BAR */ - val &= 0xe0; /* 0xe0 acc to RTL DS */ - /*FALLTHROUGH*/ + /* Set new I/O as per PCI request. */ + dev->pci_bar[0].addr_regs[addr & 3] = val; - case 0x11: /* PCI_BAR */ - /* Remove old I/O. */ - pci_dummy_io_remove(dev); + /* Then let's calculate the new I/O base. */ + dev->pci_bar[0].addr &= 0xffe0; - /* Set new I/O as per PCI request. */ - dev->pci_bar[0].addr_regs[addr & 3] = val; + /* Log the new base. */ + // pclog("AB0B:071A: PCI: new I/O base is %04X\n", dev->pci_bar[0].addr); - /* Then let's calculate the new I/O base. */ - dev->pci_bar[0].addr &= 0xffe0; + /* We're done, so get out of the here. */ + if (dev->pci_regs[4] & PCI_COMMAND_IO) { + if ((dev->pci_bar[0].addr) != 0) + pci_dummy_io_set(dev); + } + break; - /* Log the new base. */ - // pclog("AB0B:071A: PCI: new I/O base is %04X\n", dev->pci_bar[0].addr); - - /* We're done, so get out of the here. */ - if (dev->pci_regs[4] & PCI_COMMAND_IO) { - if ((dev->pci_bar[0].addr) != 0) - pci_dummy_io_set(dev); - } - break; - - case 0x3c: /* PCI_ILR */ - pclog("AB0B:071A Device %02X: IRQ now: %i\n", dev->card, val); - dev->pci_regs[addr] = val; - return; - } + case 0x3c: /* PCI_ILR */ + pclog("AB0B:071A Device %02X: IRQ now: %i\n", dev->card, val); + dev->pci_regs[addr] = val; + return; + } } static void @@ -275,7 +282,7 @@ pci_dummy_init(int min_slot, int max_slot, int nb_slot, int sb_slot) for (i = min_slot; i <= max_slot; i++) { if ((i != nb_slot) && (i != sb_slot)) { - pci_register_slot(i, PCI_CARD_NORMAL, 1, 3, 2, 4); + pci_register_slot(i, PCI_CARD_NORMAL, 1, 3, 2, 4); device_add_inst(&pci_dummy_device, j); j++; } diff --git a/src/scsi/scsi_cdrom.c b/src/scsi/scsi_cdrom.c index 25939f06e..98716692b 100644 --- a/src/scsi/scsi_cdrom.c +++ b/src/scsi/scsi_cdrom.c @@ -63,138 +63,138 @@ typedef struct /* Table of all SCSI commands and their flags, needed for the new disc change / not ready handler. */ uint8_t scsi_cdrom_command_flags[0x100] = { - IMPLEMENTED | CHECK_READY | NONDATA, /* 0x00 */ - IMPLEMENTED | ALLOW_UA | NONDATA | SCSI_ONLY, /* 0x01 */ - 0, /* 0x02 */ - IMPLEMENTED | ALLOW_UA, /* 0x03 */ - 0, 0, 0, 0, /* 0x04-0x07 */ - IMPLEMENTED | CHECK_READY, /* 0x08 */ - 0, 0, /* 0x09-0x0A */ - IMPLEMENTED | CHECK_READY | NONDATA, /* 0x0B */ - 0, /* 0x0C */ - IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0x0D */ - 0, 0, 0, 0, /* 0x0E-0x11 */ - IMPLEMENTED | ALLOW_UA, /* 0x12 */ - IMPLEMENTED | CHECK_READY | NONDATA | SCSI_ONLY, /* 0x13 */ - 0, /* 0x14 */ - IMPLEMENTED, /* 0x15 */ - 0, 0, 0, 0, /* 0x16-0x19 */ - IMPLEMENTED, /* 0x1A */ - IMPLEMENTED | CHECK_READY, /* 0x1B */ - 0, 0, /* 0x1C-0x1D */ - IMPLEMENTED | CHECK_READY, /* 0x1E */ - 0, 0, 0, /* 0x1F-0x21*/ - IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0x22*/ - 0, 0, /* 0x23-0x24 */ - IMPLEMENTED | CHECK_READY, /* 0x25 */ - IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0x26 */ - 0, /* 0x27 */ - IMPLEMENTED | CHECK_READY, /* 0x28 */ - 0, 0, /* 0x29-0x2A */ - IMPLEMENTED | CHECK_READY | NONDATA, /* 0x2B */ - 0, 0, 0, /* 0x2C-0x2E */ - IMPLEMENTED | CHECK_READY | NONDATA | SCSI_ONLY, /* 0x2F */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30-0x3F */ - 0, 0, /* 0x40-0x41 */ - IMPLEMENTED | CHECK_READY, /* 0x42 */ - IMPLEMENTED | CHECK_READY, /* 0x43 - Read TOC - can get through UNIT_ATTENTION, per VIDE-CDD.SYS - NOTE: The ATAPI reference says otherwise, but I think this is a question of - interpreting things right - the UNIT ATTENTION condition we have here - is a tradition from not ready to ready, by definition the drive - eventually becomes ready, make the condition go away. */ - IMPLEMENTED | CHECK_READY, /* 0x44 */ - IMPLEMENTED | CHECK_READY, /* 0x45 */ - IMPLEMENTED | ALLOW_UA, /* 0x46 */ - IMPLEMENTED | CHECK_READY, /* 0x47 */ - IMPLEMENTED | CHECK_READY, /* 0x48 */ - IMPLEMENTED | CHECK_READY, /* 0x49 */ - IMPLEMENTED | ALLOW_UA, /* 0x4A */ - IMPLEMENTED | CHECK_READY, /* 0x4B */ - 0, 0, /* 0x4C-0x4D */ - IMPLEMENTED | CHECK_READY, /* 0x4E */ - 0, 0, /* 0x4F-0x50 */ - IMPLEMENTED | CHECK_READY, /* 0x51 */ - IMPLEMENTED | CHECK_READY, /* 0x52 */ - 0, 0, /* 0x53-0x54 */ - IMPLEMENTED, /* 0x55 */ - 0, 0, 0, 0, /* 0x56-0x59 */ - IMPLEMENTED, /* 0x5A */ - 0, 0, 0, 0, 0, /* 0x5B-0x5F */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60-0x6F */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70-0x7F */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80-0x8F */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90-0x9F */ - 0, 0, 0, 0, 0, /* 0xA0-0xA4 */ - IMPLEMENTED | CHECK_READY, /* 0xA5 */ - 0, 0, /* 0xA6-0xA7 */ - IMPLEMENTED | CHECK_READY, /* 0xA8 */ - IMPLEMENTED | CHECK_READY, /* 0xA9 */ - 0, 0, 0, /* 0xAA-0xAC */ - IMPLEMENTED | CHECK_READY, /* 0xAD */ - 0, /* 0xAE */ - IMPLEMENTED | CHECK_READY | NONDATA | SCSI_ONLY, /* 0xAF */ - 0, 0, 0, 0, /* 0xB0-0xB3 */ - IMPLEMENTED | CHECK_READY | ATAPI_ONLY, /* 0xB4 */ - 0, 0, 0, /* 0xB5-0xB7 */ - IMPLEMENTED | CHECK_READY | ATAPI_ONLY, /* 0xB8 */ - IMPLEMENTED | CHECK_READY, /* 0xB9 */ - IMPLEMENTED | CHECK_READY, /* 0xBA */ - IMPLEMENTED, /* 0xBB */ - IMPLEMENTED | CHECK_READY, /* 0xBC */ - IMPLEMENTED, /* 0xBD */ - IMPLEMENTED | CHECK_READY, /* 0xBE */ - IMPLEMENTED | CHECK_READY, /* 0xBF */ - IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xC0 */ - IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xC1 */ - IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xC2 */ - IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xC3 */ - IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xC4 */ - IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xC5 */ - IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xC6 */ - IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xC7 */ - IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xC8 */ - IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xC9 */ - IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xCA */ - IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xCB */ - IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xCC */ - IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xCD */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xCE-0xD7 */ - IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xD8 */ - IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xD9 */ - IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xDA */ - IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xDB */ - IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xDC */ - IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xDD */ - IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xDE */ - 0, /* 0xDF */ - IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xE0 */ - IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xE1 */ - 0, /* 0xE2 */ - IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xE3 */ - IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xE4 */ - IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xE5 */ - IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xE6 */ - IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xE7 */ - IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xE8 */ - IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xE9 */ - 0, /* 0xEA */ - IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xEB */ - 0, /* 0xEC */ - IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xED */ - IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xEE */ - 0, /* 0xEF */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 /* 0xF0-0xFF */ + IMPLEMENTED | CHECK_READY | NONDATA, /* 0x00 */ + IMPLEMENTED | ALLOW_UA | NONDATA | SCSI_ONLY, /* 0x01 */ + 0, /* 0x02 */ + IMPLEMENTED | ALLOW_UA, /* 0x03 */ + 0, 0, 0, 0, /* 0x04-0x07 */ + IMPLEMENTED | CHECK_READY, /* 0x08 */ + 0, 0, /* 0x09-0x0A */ + IMPLEMENTED | CHECK_READY | NONDATA, /* 0x0B */ + 0, /* 0x0C */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0x0D */ + 0, 0, 0, 0, /* 0x0E-0x11 */ + IMPLEMENTED | ALLOW_UA, /* 0x12 */ + IMPLEMENTED | CHECK_READY | NONDATA | SCSI_ONLY, /* 0x13 */ + 0, /* 0x14 */ + IMPLEMENTED, /* 0x15 */ + 0, 0, 0, 0, /* 0x16-0x19 */ + IMPLEMENTED, /* 0x1A */ + IMPLEMENTED | CHECK_READY, /* 0x1B */ + 0, 0, /* 0x1C-0x1D */ + IMPLEMENTED | CHECK_READY, /* 0x1E */ + 0, 0, 0, /* 0x1F-0x21*/ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0x22*/ + 0, 0, /* 0x23-0x24 */ + IMPLEMENTED | CHECK_READY, /* 0x25 */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0x26 */ + 0, /* 0x27 */ + IMPLEMENTED | CHECK_READY, /* 0x28 */ + 0, 0, /* 0x29-0x2A */ + IMPLEMENTED | CHECK_READY | NONDATA, /* 0x2B */ + 0, 0, 0, /* 0x2C-0x2E */ + IMPLEMENTED | CHECK_READY | NONDATA | SCSI_ONLY, /* 0x2F */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30-0x3F */ + 0, 0, /* 0x40-0x41 */ + IMPLEMENTED | CHECK_READY, /* 0x42 */ + IMPLEMENTED | CHECK_READY, /* 0x43 - Read TOC - can get through UNIT_ATTENTION, per VIDE-CDD.SYS + NOTE: The ATAPI reference says otherwise, but I think this is a question of + interpreting things right - the UNIT ATTENTION condition we have here + is a tradition from not ready to ready, by definition the drive + eventually becomes ready, make the condition go away. */ + IMPLEMENTED | CHECK_READY, /* 0x44 */ + IMPLEMENTED | CHECK_READY, /* 0x45 */ + IMPLEMENTED | ALLOW_UA, /* 0x46 */ + IMPLEMENTED | CHECK_READY, /* 0x47 */ + IMPLEMENTED | CHECK_READY, /* 0x48 */ + IMPLEMENTED | CHECK_READY, /* 0x49 */ + IMPLEMENTED | ALLOW_UA, /* 0x4A */ + IMPLEMENTED | CHECK_READY, /* 0x4B */ + 0, 0, /* 0x4C-0x4D */ + IMPLEMENTED | CHECK_READY, /* 0x4E */ + 0, 0, /* 0x4F-0x50 */ + IMPLEMENTED | CHECK_READY, /* 0x51 */ + IMPLEMENTED | CHECK_READY, /* 0x52 */ + 0, 0, /* 0x53-0x54 */ + IMPLEMENTED, /* 0x55 */ + 0, 0, 0, 0, /* 0x56-0x59 */ + IMPLEMENTED, /* 0x5A */ + 0, 0, 0, 0, 0, /* 0x5B-0x5F */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60-0x6F */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70-0x7F */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80-0x8F */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90-0x9F */ + 0, 0, 0, 0, 0, /* 0xA0-0xA4 */ + IMPLEMENTED | CHECK_READY, /* 0xA5 */ + 0, 0, /* 0xA6-0xA7 */ + IMPLEMENTED | CHECK_READY, /* 0xA8 */ + IMPLEMENTED | CHECK_READY, /* 0xA9 */ + 0, 0, 0, /* 0xAA-0xAC */ + IMPLEMENTED | CHECK_READY, /* 0xAD */ + 0, /* 0xAE */ + IMPLEMENTED | CHECK_READY | NONDATA | SCSI_ONLY, /* 0xAF */ + 0, 0, 0, 0, /* 0xB0-0xB3 */ + IMPLEMENTED | CHECK_READY | ATAPI_ONLY, /* 0xB4 */ + 0, 0, 0, /* 0xB5-0xB7 */ + IMPLEMENTED | CHECK_READY | ATAPI_ONLY, /* 0xB8 */ + IMPLEMENTED | CHECK_READY, /* 0xB9 */ + IMPLEMENTED | CHECK_READY, /* 0xBA */ + IMPLEMENTED, /* 0xBB */ + IMPLEMENTED | CHECK_READY, /* 0xBC */ + IMPLEMENTED, /* 0xBD */ + IMPLEMENTED | CHECK_READY, /* 0xBE */ + IMPLEMENTED | CHECK_READY, /* 0xBF */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xC0 */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xC1 */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xC2 */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xC3 */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xC4 */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xC5 */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xC6 */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xC7 */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xC8 */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xC9 */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xCA */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xCB */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xCC */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xCD */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xCE-0xD7 */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xD8 */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xD9 */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xDA */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xDB */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xDC */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xDD */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xDE */ + 0, /* 0xDF */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xE0 */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xE1 */ + 0, /* 0xE2 */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xE3 */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xE4 */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xE5 */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xE6 */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xE7 */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xE8 */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xE9 */ + 0, /* 0xEA */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xEB */ + 0, /* 0xEC */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xED */ + IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xEE */ + 0, /* 0xEF */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 /* 0xF0-0xFF */ }; -static uint64_t scsi_cdrom_mode_sense_page_flags = (GPMODEP_R_W_ERROR_PAGE | GPMODEP_DISCONNECT_PAGE | GPMODEP_CDROM_PAGE | GPMODEP_CDROM_AUDIO_PAGE | (1ULL << 0x0fULL) | GPMODEP_CAPABILITIES_PAGE | GPMODEP_ALL_PAGES); +static uint64_t scsi_cdrom_mode_sense_page_flags = (GPMODEP_R_W_ERROR_PAGE | GPMODEP_DISCONNECT_PAGE | GPMODEP_CDROM_PAGE | GPMODEP_CDROM_AUDIO_PAGE | (1ULL << 0x0fULL) | GPMODEP_CAPABILITIES_PAGE | GPMODEP_ALL_PAGES); static uint64_t scsi_cdrom_mode_sense_page_flags_sony = (GPMODEP_R_W_ERROR_PAGE | GPMODEP_DISCONNECT_PAGE | GPMODEP_CDROM_PAGE_SONY | GPMODEP_CDROM_AUDIO_PAGE_SONY | (1ULL << 0x0fULL) | GPMODEP_CAPABILITIES_PAGE | GPMODEP_ALL_PAGES); -static uint64_t scsi_cdrom_drive_status_page_flags = ((1ULL << 0x01ULL) | (1ULL << 0x02ULL) | (1ULL << 0x0fULL) | GPMODEP_ALL_PAGES); +static uint64_t scsi_cdrom_drive_status_page_flags = ((1ULL << 0x01ULL) | (1ULL << 0x02ULL) | (1ULL << 0x0fULL) | GPMODEP_ALL_PAGES); static const mode_sense_pages_t scsi_cdrom_drive_status_pages = { {{ 0, 0 }, { 0x01, 0, 2, 0x0f, 0xbf }, /*Drive Status Data Format*/ - { 0x02, 0, 1, 0}, /*Audio Play Status Format*/ - { 0, 0 }, + { 0x02, 0, 1, 0 }, /*Audio Play Status Format*/ + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, @@ -709,8 +709,8 @@ scsi_cdrom_drive_status(scsi_cdrom_t *dev, uint8_t *buf, uint32_t pos, uint8_t p for (j = 0; j < msplen; j++) { if (i == 0x01) { buf[pos++] = scsi_cdrom_drive_status_read(dev, page_control, i, 3 + j); - if (!(j & 1)) { /*MSB of Drive Status*/ - if (dev->drv->ops) /*Bit 11 of Drive Status, */ + if (!(j & 1)) { /*MSB of Drive Status*/ + if (dev->drv->ops) /*Bit 11 of Drive Status, */ buf[pos] &= ~0x08; /*Disc is present*/ else buf[pos] |= 0x08; /*Disc not present*/ @@ -1702,13 +1702,13 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb) int toc_format, block_desc = 0; int ret, format = 0; int real_pos, track = 0; - char device_identify[9] = { '8', '6', 'B', '_', 'C', 'D', '0', '0', 0 }; - char device_identify_ex[15] = { '8', '6', 'B', '_', 'C', 'D', '0', '0', ' ', 'v', '1', '.', '0', '0', 0 }; - int32_t blen = 0, *BufLen; - uint8_t *b; - uint32_t profiles[2] = { MMC_PROFILE_CD_ROM, MMC_PROFILE_DVD_ROM }; - uint8_t scsi_bus = (dev->drv->scsi_device_id >> 4) & 0x0f; - uint8_t scsi_id = dev->drv->scsi_device_id & 0x0f; + char device_identify[9] = { '8', '6', 'B', '_', 'C', 'D', '0', '0', 0 }; + char device_identify_ex[15] = { '8', '6', 'B', '_', 'C', 'D', '0', '0', ' ', 'v', '1', '.', '0', '0', 0 }; + int32_t blen = 0, *BufLen; + uint8_t *b; + uint32_t profiles[2] = { MMC_PROFILE_CD_ROM, MMC_PROFILE_DVD_ROM }; + uint8_t scsi_bus = (dev->drv->scsi_device_id >> 4) & 0x0f; + uint8_t scsi_id = dev->drv->scsi_device_id & 0x0f; if (dev->drv->bus_type == CDROM_BUS_SCSI) { BufLen = &scsi_devices[scsi_bus][scsi_id].buffer_length; @@ -1876,7 +1876,7 @@ begin: case 0xC7: if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "MATSHITA_CD-ROM_CR-501_1.0b"))) { /*GPCMD_PLAY_AUDIO_MSF_MATSUSHITA*/ - cdb[0] = GPCMD_PLAY_AUDIO_MSF; + cdb[0] = GPCMD_PLAY_AUDIO_MSF; dev->current_cdb[0] = cdb[0]; goto begin; break; @@ -1884,10 +1884,10 @@ begin: !strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-76S_1.00")) { /*GPCMD_PLAY_MSF_SONY*/ cdb[0] = GPCMD_PLAY_AUDIO_MSF; dev->current_cdb[0] = cdb[0]; - dev->sony_vendor = 1; + dev->sony_vendor = 1; goto begin; break; - } /*GPCMD_READ_DISC_INFORMATION_TOSHIBA*/ + } /*GPCMD_READ_DISC_INFORMATION_TOSHIBA*/ case 0xDE: /*GPCMD_READ_DISC_INFORMATION_NEC*/ scsi_cdrom_set_phase(dev, SCSI_PHASE_DATA_IN); scsi_cdrom_buf_alloc(dev, 4); @@ -2405,7 +2405,7 @@ begin: scsi_cdrom_command_complete(dev); dev->sony_vendor = 1; break; - } /*GPCMD_AUDIO_TRACK_SEARCH_TOSHIBA and GPCMD_EJECT_CHINON*/ + } /*GPCMD_AUDIO_TRACK_SEARCH_TOSHIBA and GPCMD_EJECT_CHINON*/ case 0xD8: /*GPCMD_AUDIO_TRACK_SEARCH_NEC*/ if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "CHINON_CD-ROM_CDS-431_H42"))) { scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS); @@ -2418,8 +2418,8 @@ begin: scsi_cdrom_illegal_mode(dev); break; } - pos = (cdb[2] << 24) | (cdb[3] << 16) | (cdb[4] << 8) | cdb[5]; - ret = cdrom_audio_track_search(dev->drv, pos, cdb[9] & 0xc0, cdb[1] & 1); + pos = (cdb[2] << 24) | (cdb[3] << 16) | (cdb[4] << 8) | cdb[5]; + ret = cdrom_audio_track_search(dev->drv, pos, cdb[9] & 0xc0, cdb[1] & 1); dev->drv->audio_op = (cdb[1] & 1) ? 0x03 : 0x02; if (ret) @@ -2438,7 +2438,7 @@ begin: if (strcmp(cdrom_drive_types[dev->drv->type].internal_name, "PIONEER_CD-ROM_DRM-604X_2403")) { dev->sony_vendor = 0; } else { - msf = dev->ms_pages_saved_sony.pages[GPMODE_CDROM_PAGE_SONY][2] & 0x01; + msf = dev->ms_pages_saved_sony.pages[GPMODE_CDROM_PAGE_SONY][2] & 0x01; dev->sony_vendor = 1; } @@ -2465,7 +2465,7 @@ begin: scsi_cdrom_data_command_finish(dev, len, len, len, 0); return; - } /*GPCMD_PLAY_AUDIO_TOSHIBA*/ + } /*GPCMD_PLAY_AUDIO_TOSHIBA*/ case 0xD9: /*GPCMD_PLAY_AUDIO_NEC*/ scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS); if ((dev->drv->host_drive < 1) || (dev->drv->cd_status <= CD_STATUS_DATA_ONLY)) { @@ -2648,7 +2648,7 @@ begin: else scsi_cdrom_illegal_mode(dev); break; - } /*GPCMD_READ_SUBCODEQ_PLAYING_STATUS_TOSHIBA and GPCMD_STOP_CHINON*/ + } /*GPCMD_READ_SUBCODEQ_PLAYING_STATUS_TOSHIBA and GPCMD_STOP_CHINON*/ case 0xDD: /*GPCMD_READ_SUBCODEQ_PLAYING_STATUS_NEC*/ if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "CHINON_CD-ROM_CDS-431_H42"))) { scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS); @@ -2658,7 +2658,7 @@ begin: scsi_cdrom_set_phase(dev, SCSI_PHASE_DATA_IN); alloc_length = cdb[1] & 0x1f; - len = 10; + len = 10; if (!dev->drv->ops) { scsi_cdrom_not_ready(dev); @@ -2753,7 +2753,7 @@ begin: case 0xC4: if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "MATSHITA_CD-ROM_CR-501_1.0b"))) { /*GPCMD_READ_HEADER_MATSUSHITA*/ - cdb[0] = GPCMD_READ_HEADER; + cdb[0] = GPCMD_READ_HEADER; dev->current_cdb[0] = cdb[0]; goto begin; break; @@ -2772,10 +2772,10 @@ begin: len = max_len; memset(dev->buffer, 0, 10); - dev->buffer[0] = 0x00; /*Reserved*/ - dev->buffer[1] = 0x00; /*Reserved*/ - dev->buffer[2] = cdb[7]; /*Audio Status data length*/ - dev->buffer[3] = cdb[8]; /*Audio Status data length*/ + dev->buffer[0] = 0x00; /*Reserved*/ + dev->buffer[1] = 0x00; /*Reserved*/ + dev->buffer[2] = cdb[7]; /*Audio Status data length*/ + dev->buffer[3] = cdb[8]; /*Audio Status data length*/ dev->buffer[4] = cdrom_get_audio_status_sony(dev->drv, &dev->buffer[6], msf); /*Audio status*/ dev->buffer[5] = 0x00; @@ -2842,15 +2842,14 @@ begin: if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "86BOX_CD-ROM_1.00"))) ide_padstr8(dev->buffer + idx, 8, EMU_NAME); /* Vendor */ else - ide_padstr8(dev->buffer + idx, 8, cdrom_drive_types[dev->drv->type].vendor); /* Vendor */ + ide_padstr8(dev->buffer + idx, 8, cdrom_drive_types[dev->drv->type].vendor); /* Vendor */ idx += 8; if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "86BOX_CD-ROM_1.00"))) ide_padstr8(dev->buffer + idx, 40, device_identify_ex); /* Product */ else - ide_padstr8(dev->buffer + idx, 40, cdrom_drive_types[dev->drv->type].model); /* Product */ - + ide_padstr8(dev->buffer + idx, 40, cdrom_drive_types[dev->drv->type].model); /* Product */ idx += 40; ide_padstr8(dev->buffer + idx, 20, "53R141"); /* Serial */ @@ -2959,7 +2958,7 @@ begin: else { if (max_len == 96) { dev->buffer[4] = 91; - idx = 96; + idx = 96; } } } @@ -2995,7 +2994,7 @@ atapi_out: case 0xC3: if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "MATSHITA_CD-ROM_CR-501_1.0b"))) { /*GPCMD_READ_TOC_MATSUSHITA*/ - cdb[0] = GPCMD_READ_TOC_PMA_ATIP; + cdb[0] = GPCMD_READ_TOC_PMA_ATIP; dev->current_cdb[0] = cdb[0]; goto begin; break; @@ -3009,11 +3008,11 @@ atapi_out: dev->sector_len = 1; dev->sector_pos = (cdb[2] << 24) | (cdb[3] << 16) | (cdb[4] << 8) | cdb[5]; - real_pos = cdrom_lba_to_msf_accurate(dev->sector_pos); - dev->buffer[0] = ((real_pos >> 16) & 0xff); - dev->buffer[1] = ((real_pos >> 8) & 0xff); - dev->buffer[2] = real_pos & 0xff; - dev->buffer[3] = 1; /*2048 bytes user data*/ + real_pos = cdrom_lba_to_msf_accurate(dev->sector_pos); + dev->buffer[0] = ((real_pos >> 16) & 0xff); + dev->buffer[1] = ((real_pos >> 8) & 0xff); + dev->buffer[2] = real_pos & 0xff; + dev->buffer[3] = 1; /*2048 bytes user data*/ len = 4; len = MIN(len, alloc_length); @@ -3030,7 +3029,7 @@ atapi_out: case 0xC2: if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "MATSHITA_CD-ROM_CR-501_1.0b"))) { /*GPCMD_READ_SUBCHANNEL_MATSUSHITA*/ - cdb[0] = GPCMD_READ_SUBCHANNEL; + cdb[0] = GPCMD_READ_SUBCHANNEL; dev->current_cdb[0] = cdb[0]; goto begin; break; @@ -3135,7 +3134,7 @@ atapi_out: case 0xC5: if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "MATSHITA_CD-ROM_CR-501_1.0b"))) { /*GPCMD_PLAY_AUDIO_MATSUSHITA*/ - cdb[0] = GPCMD_PLAY_AUDIO_10; + cdb[0] = GPCMD_PLAY_AUDIO_10; dev->current_cdb[0] = cdb[0]; goto begin; break; @@ -3149,7 +3148,7 @@ atapi_out: } case 0xC8: if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "MATSHITA_CD-ROM_CR-501_1.0b"))) { /*GPCMD_PLAY_AUDIO_TRACK_INDEX_MATSUSHITA*/ - cdb[0] = GPCMD_PLAY_AUDIO_TRACK_INDEX; + cdb[0] = GPCMD_PLAY_AUDIO_TRACK_INDEX; dev->current_cdb[0] = cdb[0]; goto begin; break; @@ -3157,13 +3156,13 @@ atapi_out: !strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-76S_1.00")) { /*GPCMD_PLAY_AUDIO_SONY*/ cdb[0] = GPCMD_PLAY_AUDIO_10; dev->current_cdb[0] = cdb[0]; - dev->sony_vendor = 1; + dev->sony_vendor = 1; goto begin; break; } case 0xC9: if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "MATSHITA_CD-ROM_CR-501_1.0b"))) { /*GPCMD_PLAY_AUDIO_TRACK_RELATIVE_10_MATSUSHITA*/ - cdb[0] = GPCMD_PLAY_AUDIO_TRACK_RELATIVE_10; + cdb[0] = GPCMD_PLAY_AUDIO_TRACK_RELATIVE_10; dev->current_cdb[0] = cdb[0]; goto begin; break; @@ -3188,7 +3187,7 @@ atapi_out: } case 0xCB: if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "MATSHITA_CD-ROM_CR-501_1.0b"))) { /*GPCMD_PAUSE_RESUME_MATSUSHITA*/ - cdb[0] = GPCMD_PAUSE_RESUME; + cdb[0] = GPCMD_PAUSE_RESUME; dev->current_cdb[0] = cdb[0]; goto begin; break; @@ -3206,10 +3205,10 @@ atapi_out: len = max_len; memset(dev->buffer, 0, 10); - dev->buffer[0] = 0x00; /*Reserved*/ - dev->buffer[1] = 0x00; /*Reserved*/ - dev->buffer[2] = cdb[7]; /*Audio Status data length*/ - dev->buffer[3] = cdb[8]; /*Audio Status data length*/ + dev->buffer[0] = 0x00; /*Reserved*/ + dev->buffer[1] = 0x00; /*Reserved*/ + dev->buffer[2] = cdb[7]; /*Audio Status data length*/ + dev->buffer[3] = cdb[8]; /*Audio Status data length*/ dev->buffer[4] = cdrom_get_audio_status_sony(dev->drv, &dev->buffer[6], msf); /*Audio status*/ dev->buffer[5] = 0x00; @@ -3246,8 +3245,8 @@ atapi_out: memset(dev->buffer, 0, len); alloc_length = len; - len = scsi_cdrom_drive_status(dev, dev->buffer, 0, cdb[2]); - len = MIN(len, alloc_length); + len = scsi_cdrom_drive_status(dev, dev->buffer, 0, cdb[2]); + len = MIN(len, alloc_length); scsi_cdrom_set_buf_len(dev, BufLen, &len); @@ -3258,14 +3257,14 @@ atapi_out: } case 0xE5: if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "MATSHITA_CD-ROM_CR-501_1.0b"))) { /*GPCMD_PLAY_AUDIO_12_MATSUSHITA*/ - cdb[0] = GPCMD_PLAY_AUDIO_12; + cdb[0] = GPCMD_PLAY_AUDIO_12; dev->current_cdb[0] = cdb[0]; goto begin; break; } case 0xE9: if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "MATSHITA_CD-ROM_CR-501_1.0b"))) { /*GPCMD_PLAY_AUDIO_TRACK_RELATIVE_12_MATSUSHITA*/ - cdb[0] = GPCMD_PLAY_AUDIO_TRACK_RELATIVE_12; + cdb[0] = GPCMD_PLAY_AUDIO_TRACK_RELATIVE_12; dev->current_cdb[0] = cdb[0]; goto begin; break; @@ -3484,7 +3483,7 @@ static void scsi_cdrom_identify(ide_t *ide, int ide_has_dma) { scsi_cdrom_t *dev; - char device_identify[9] = { '8', '6', 'B', '_', 'C', 'D', '0', '0', 0 }; + char device_identify[9] = { '8', '6', 'B', '_', 'C', 'D', '0', '0', 0 }; dev = (scsi_cdrom_t *) ide->sc; @@ -3492,13 +3491,13 @@ scsi_cdrom_identify(ide_t *ide, int ide_has_dma) scsi_cdrom_log("ATAPI Identify: %s\n", device_identify); if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "NEC_CD-ROM_DRIVE260_1.01")) || (!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "NEC_CD-ROM_DRIVE260_1.00"))) /*NEC only*/ - ide->buffer[0] = 0x8000 | (5 << 8) | 0x80 | (1 << 5); /* ATAPI device, CD-ROM drive, removable media, interrupt DRQ */ + ide->buffer[0] = 0x8000 | (5 << 8) | 0x80 | (1 << 5); /* ATAPI device, CD-ROM drive, removable media, interrupt DRQ */ else ide->buffer[0] = 0x8000 | (5 << 8) | 0x80 | (2 << 5); /* ATAPI device, CD-ROM drive, removable media, accelerated DRQ */ - ide_padstr((char *) (ide->buffer + 10), "", 20); /* Serial Number */ + ide_padstr((char *) (ide->buffer + 10), "", 20); /* Serial Number */ if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "86BOX_CD-ROM_1.00"))) { - ide_padstr((char *) (ide->buffer + 23), EMU_VERSION_EX, 8); /* Firmware */ + ide_padstr((char *) (ide->buffer + 23), EMU_VERSION_EX, 8); /* Firmware */ ide_padstr((char *) (ide->buffer + 27), device_identify, 40); /* Model */ } else { if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "NEC_CD-ROM_DRIVE260_1.01"))) { diff --git a/src/scsi/scsi_ncr5380.c b/src/scsi/scsi_ncr5380.c index c01d0bf36..faa91b093 100644 --- a/src/scsi/scsi_ncr5380.c +++ b/src/scsi/scsi_ncr5380.c @@ -880,10 +880,10 @@ memio_read(uint32_t addr, void *priv) ncr_log("NCR status ctrl read=%02x\n", ncr_dev->status_ctrl & STATUS_BUFFER_NOT_READY); if (!ncr_dev->ncr_busy) ret |= STATUS_53C80_ACCESSIBLE; - if (ncr->mode & 0x30) { /*Parity bits*/ + if (ncr->mode & 0x30) { /*Parity bits*/ if (!(ncr->mode & MODE_DMA)) { /*This is to avoid RTBios 8.10R BIOS problems with the hard disk and detection.*/ - ret |= 0x01; /*If the parity bits are set, bit 0 of the 53c400 status port should be set as well.*/ - ncr->mode = 0; /*Required by RTASPI10.SYS otherwise it won't initialize.*/ + ret |= 0x01; /*If the parity bits are set, bit 0 of the 53c400 status port should be set as well.*/ + ncr->mode = 0; /*Required by RTASPI10.SYS otherwise it won't initialize.*/ } } ncr_log("NCR 53c400 status = %02x.\n", ret); diff --git a/src/scsi/scsi_spock.c b/src/scsi/scsi_spock.c index f8dc3282e..19fba0fb7 100644 --- a/src/scsi/scsi_spock.c +++ b/src/scsi/scsi_spock.c @@ -445,9 +445,9 @@ spock_process_imm_cmd(spock_t *scsi) 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; + adapter_id = (scsi->command >> 16) & 15; + phys_id = (scsi->command >> 20) & 7; + lun_id = (scsi->command >> 24) & 7; if (adapter_id == 15) { if (phys_id == 7) /*Device 15 always adapter*/ spock_set_irq(scsi, scsi->attention & 0x0f, IRQ_TYPE_IMM_CMD_COMPLETE); @@ -1175,7 +1175,7 @@ static const device_config_t spock_rom_config[] = { }, }, { .name = "", .description = "", .type = CONFIG_END } -// clang-format on + // clang-format on }; const device_t spock_device = { diff --git a/src/sio/sio_ali5123.c b/src/sio/sio_ali5123.c index ec5afdc98..33e4022c6 100644 --- a/src/sio/sio_ali5123.c +++ b/src/sio/sio_ali5123.c @@ -246,12 +246,14 @@ ali5123_write(uint16_t port, uint8_t val, void *priv) /* Block writes to some logical devices. */ if (cur_ld > 0x0c) return; - else switch (cur_ld) { - case 0x01: case 0x02: - case 0x06: - case 0x08 ... 0x0a: - return; - } + else + switch (cur_ld) { + case 0x01: + case 0x02: + case 0x06: + case 0x08 ... 0x0a: + return; + } dev->ld_regs[cur_ld][dev->cur_reg] = val; } } else @@ -409,7 +411,7 @@ ali5123_read(uint16_t port, void *priv) ret = dev->regs[dev->cur_reg]; } else { cur_ld = dev->regs[7]; - ret = dev->ld_regs[cur_ld][dev->cur_reg]; + ret = dev->ld_regs[cur_ld][dev->cur_reg]; } } } diff --git a/src/sound/snd_optimc.c b/src/sound/snd_optimc.c index f83161bce..5f0de7673 100644 --- a/src/sound/snd_optimc.c +++ b/src/sound/snd_optimc.c @@ -70,14 +70,14 @@ typedef struct optimc_t { } optimc_t, opti_82c929a_t; static void -optimc_filter_opl(void* priv, double* out_l, double* out_r) +optimc_filter_opl(void *priv, double *out_l, double *out_r) { optimc_t *optimc = (optimc_t *) priv; if (optimc->cur_wss_enabled) { *out_l /= optimc->sb->mixer_sbpro.fm_l; *out_r /= optimc->sb->mixer_sbpro.fm_r; - ad1848_filter_aux2((void*)&optimc->ad1848, out_l, out_r); + ad1848_filter_aux2((void *) &optimc->ad1848, out_l, out_r); } } @@ -167,7 +167,7 @@ optimc_reg_write(uint16_t addr, uint8_t val, void *p) switch ((val >> 4) & 0x3) { case 0: /* WSBase = 0x530 */ optimc->cur_wss_addr = 0x530; - break; + break; case 1: /* WSBase = 0xE80 */ optimc->cur_wss_addr = 0xE80; break; @@ -373,7 +373,7 @@ optimc_init(const device_t *info) sb_ct1345_mixer_reset(optimc->sb); optimc->sb->opl_mixer = optimc; - optimc->sb->opl_mix = optimc_filter_opl; + optimc->sb->opl_mix = optimc_filter_opl; optimc->fm_type = (info->local & OPTIMC_OPL4) ? FM_YMF278B : FM_YMF262; fm_driver_get(optimc->fm_type, &optimc->sb->opl); diff --git a/src/sound/sound.c b/src/sound/sound.c index ecbb7e1a9..21c54d6ee 100644 --- a/src/sound/sound.c +++ b/src/sound/sound.c @@ -51,9 +51,9 @@ typedef struct { void *priv; } sound_handler_t; -int sound_card_current[SOUND_CARD_MAX] = { 0, 0, 0, 0}; -int sound_pos_global = 0; -int sound_gain = 0; +int sound_card_current[SOUND_CARD_MAX] = { 0, 0, 0, 0 }; +int sound_pos_global = 0; +int sound_gain = 0; static sound_handler_t sound_handlers[8]; @@ -79,31 +79,31 @@ static void (*filter_cd_audio)(int channel, double *buffer, void *p) = NULL; static void *filter_cd_audio_p = NULL; static const device_t sound_none_device = { - .name = "None", + .name = "None", .internal_name = "none", - .flags = 0, - .local = 0, - .init = NULL, - .close = NULL, - .reset = NULL, + .flags = 0, + .local = 0, + .init = NULL, + .close = NULL, + .reset = NULL, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; static const device_t sound_internal_device = { - .name = "Internal", + .name = "Internal", .internal_name = "internal", - .flags = 0, - .local = 0, - .init = NULL, - .close = NULL, - .reset = NULL, + .flags = 0, + .local = 0, + .init = NULL, + .close = NULL, + .reset = NULL, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; static const SOUND_CARD sound_cards[] = { diff --git a/src/unix/unix.c b/src/unix/unix.c index 7916ab044..478b5309f 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -814,9 +814,9 @@ void plat_get_global_config_dir(char *strptr) { #ifdef __APPLE__ - char* prefPath = SDL_GetPrefPath(NULL, "net.86Box.86Box") + char *prefPath = SDL_GetPrefPath(NULL, "net.86Box.86Box") #else - char* prefPath = SDL_GetPrefPath(NULL, "86Box"); + char *prefPath = SDL_GetPrefPath(NULL, "86Box"); #endif strncpy(strptr, prefPath, 1024); path_slash(strptr); @@ -1089,7 +1089,7 @@ main(int argc, char **argv) return 6; } - gfxcard[1] = 0; + gfxcard[1] = 0; eventthread = SDL_ThreadID(); blitmtx = SDL_CreateMutex(); if (!blitmtx) { diff --git a/src/unix/unix_serial_passthrough.c b/src/unix/unix_serial_passthrough.c index 29e4b8317..13c695e83 100644 --- a/src/unix/unix_serial_passthrough.c +++ b/src/unix/unix_serial_passthrough.c @@ -200,8 +200,8 @@ plat_serpt_write(void *p, uint8_t data) static int open_pseudo_terminal(serial_passthrough_t *dev) { - int master_fd = open("/dev/ptmx", O_RDWR | O_NONBLOCK); - char *ptname; + int master_fd = open("/dev/ptmx", O_RDWR | O_NONBLOCK); + char *ptname; struct termios term_attr_raw; if (!master_fd) { diff --git a/src/video/vid_mga.c b/src/video/vid_mga.c index b557d1ce5..a70a9552d 100644 --- a/src/video/vid_mga.c +++ b/src/video/vid_mga.c @@ -896,9 +896,9 @@ mystique_recalctimings(svga_t *svga) svga->ma = svga->maback = (svga->maback - (mystique->ma_latch_old << 2)) + (svga->ma_latch << 2); mystique->ma_latch_old = svga->ma_latch; } - + svga->rowoffset <<= 1; - + switch (mystique->xmulctrl & XMULCTRL_DEPTH_MASK) { case XMULCTRL_DEPTH_8: case XMULCTRL_DEPTH_2G8V16: @@ -2249,7 +2249,8 @@ mystique_accel_ctrl_write_l(uint32_t addr, uint32_t val, void *p) mystique->dwgreg.fcol = val; break; - case REG_SRC0: { + case REG_SRC0: + { int x = 0, y = 0; mystique->dwgreg.src[0] = val; for (y = 0; y < 2; y++) { @@ -2257,12 +2258,13 @@ mystique_accel_ctrl_write_l(uint32_t addr, uint32_t val, void *p) mystique->dwgreg.pattern[y][x] = val & (1 << (x + (y * 16))); } } - //pclog("SRC0 = 0x%08X\n", val); + // pclog("SRC0 = 0x%08X\n", val); if (mystique->busy && (mystique->dwgreg.dwgctrl_running & DWGCTRL_OPCODE_MASK) == DWGCTRL_OPCODE_ILOAD) blit_iload_write(mystique, mystique->dwgreg.src[0], 32); } break; - case REG_SRC1: { + case REG_SRC1: + { int x = 0, y = 0; mystique->dwgreg.src[1] = val; for (y = 2; y < 4; y++) { @@ -2270,12 +2272,13 @@ mystique_accel_ctrl_write_l(uint32_t addr, uint32_t val, void *p) mystique->dwgreg.pattern[y][x] = val & (1 << (x + ((y - 2) * 16))); } } - //pclog("SRC1 = 0x%08X\n", val); + // pclog("SRC1 = 0x%08X\n", val); if (mystique->busy && (mystique->dwgreg.dwgctrl_running & DWGCTRL_OPCODE_MASK) == DWGCTRL_OPCODE_ILOAD) blit_iload_write(mystique, mystique->dwgreg.src[1], 32); } break; - case REG_SRC2: { + case REG_SRC2: + { int x = 0, y = 0; mystique->dwgreg.src[2] = val; for (y = 4; y < 6; y++) { @@ -2283,12 +2286,13 @@ mystique_accel_ctrl_write_l(uint32_t addr, uint32_t val, void *p) mystique->dwgreg.pattern[y][x] = val & (1 << (x + ((y - 4) * 16))); } } - //pclog("SRC2 = 0x%08X\n", val); + // pclog("SRC2 = 0x%08X\n", val); if (mystique->busy && (mystique->dwgreg.dwgctrl_running & DWGCTRL_OPCODE_MASK) == DWGCTRL_OPCODE_ILOAD) blit_iload_write(mystique, mystique->dwgreg.src[2], 32); break; } - case REG_SRC3: { + case REG_SRC3: + { int x = 0, y = 0; mystique->dwgreg.src[3] = val; for (y = 6; y < 8; y++) { @@ -2296,11 +2300,11 @@ mystique_accel_ctrl_write_l(uint32_t addr, uint32_t val, void *p) mystique->dwgreg.pattern[y][x] = val & (1 << (x + ((y - 6) * 16))); } } - //pclog("SRC3 = 0x%08X\n", val); + // pclog("SRC3 = 0x%08X\n", val); if (mystique->busy && (mystique->dwgreg.dwgctrl_running & DWGCTRL_OPCODE_MASK) == DWGCTRL_OPCODE_ILOAD) blit_iload_write(mystique, mystique->dwgreg.src[3], 32); break; - } + } case REG_DMAPAD: if (mystique->busy && (mystique->dwgreg.dwgctrl_running & DWGCTRL_OPCODE_MASK) == DWGCTRL_OPCODE_ILOAD) diff --git a/src/video/vid_s3.c b/src/video/vid_s3.c index c3eaa36a8..68b84d9db 100644 --- a/src/video/vid_s3.c +++ b/src/video/vid_s3.c @@ -5650,18 +5650,18 @@ polygon_setup(s3_t *s3) out = (out & s3->accel.wrt_mask) | (old_dest_dat & ~s3->accel.wrt_mask); \ } -#define WRITE(addr, dat) \ - if (s3->bpp == 0 && !s3->color_16bit) { \ - svga->vram[dword_remap(svga, addr) & s3->vram_mask] = dat; \ +#define WRITE(addr, dat) \ + if (s3->bpp == 0 && !s3->color_16bit) { \ + 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) { \ - vram_w[dword_remap_w(svga, addr) & (s3->vram_mask >> 1)] = dat; \ + } 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; \ + } 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 { \ - vram_l[dword_remap_l(svga, addr) & (s3->vram_mask >> 2)] = dat; \ + } else { \ + 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; \ } diff --git a/src/video/vid_s3_virge.c b/src/video/vid_s3_virge.c index e2ecf8ae5..d79053f0e 100644 --- a/src/video/vid_s3_virge.c +++ b/src/video/vid_s3_virge.c @@ -4181,13 +4181,12 @@ s3_virge_init(const device_t *info) s3_virge_overlay_draw); virge->svga.hwcursor.cur_ysize = 64; - if (bios_fn != NULL) - { - if (info->local == S3_VIRGE_GX2) - rom_init(&virge->bios_rom, (char *) bios_fn, 0xc0000, 0x10000, 0xffff, 0, MEM_MAPPING_EXTERNAL); - else - rom_init(&virge->bios_rom, (char *) bios_fn, 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); - } + if (bios_fn != NULL) { + if (info->local == S3_VIRGE_GX2) + rom_init(&virge->bios_rom, (char *) bios_fn, 0xc0000, 0x10000, 0xffff, 0, MEM_MAPPING_EXTERNAL); + else + rom_init(&virge->bios_rom, (char *) bios_fn, 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); + } mem_mapping_disable(&virge->bios_rom.mapping); diff --git a/src/video/vid_svga.c b/src/video/vid_svga.c index 704c6f612..6f8cc0448 100644 --- a/src/video/vid_svga.c +++ b/src/video/vid_svga.c @@ -872,7 +872,7 @@ svga_poll(void *p) svga->oddeven ^= 1; svga->monitor->mon_changeframecount = svga->interlace ? 3 : 2; - svga->vslines = 0; + svga->vslines = 0; if (svga->interlace && svga->oddeven) svga->ma = svga->maback = svga->ma_latch + (svga->rowoffset << 1) + ((svga->crtc[5] & 0x60) >> 5); @@ -938,9 +938,9 @@ svga_init(const device_t *info, svga_t *svga, void *p, int memsize, { int c, d, e; - svga->p = p; + svga->p = p; svga->monitor_index = monitor_index_global; - svga->monitor = &monitors[svga->monitor_index]; + svga->monitor = &monitors[svga->monitor_index]; for (c = 0; c < 256; c++) { e = c; @@ -954,10 +954,10 @@ svga_init(const device_t *info, svga_t *svga, void *p, int memsize, svga->attrregs[0x11] = 0; svga->overscan_color = 0x000000; - svga->monitor->mon_overscan_x = 16; - svga->monitor->mon_overscan_y = 32; - svga->x_add = 8; - svga->y_add = 16; + svga->monitor->mon_overscan_x = 16; + svga->monitor->mon_overscan_y = 32; + svga->x_add = 8; + svga->y_add = 16; svga->crtc[0] = 63; svga->crtc[6] = 255; diff --git a/src/video/vid_tvp3026_ramdac.c b/src/video/vid_tvp3026_ramdac.c index 5ae5663f8..148c9b748 100644 --- a/src/video/vid_tvp3026_ramdac.c +++ b/src/video/vid_tvp3026_ramdac.c @@ -162,7 +162,7 @@ tvp3026_ramdac_out(uint16_t addr, int rs2, int rs3, uint8_t val, void *p, svga_t case 0x0a: /* Indexed Data (RS value = 1010) */ switch (ramdac->ind_idx) { case 0x06: /* Indirect Cursor Control */ - ramdac->ccr = val; + ramdac->ccr = val; if (!(ramdac->ccr & 0x80)) { svga->dac_hwcursor.cur_xsize = svga->dac_hwcursor.cur_ysize = 64; svga->dac_hwcursor.x = ramdac->hwc_x - svga->dac_hwcursor.cur_xsize; diff --git a/src/video/vid_voodoo_banshee.c b/src/video/vid_voodoo_banshee.c index 6b6af2a09..ef94f9846 100644 --- a/src/video/vid_voodoo_banshee.c +++ b/src/video/vid_voodoo_banshee.c @@ -1603,8 +1603,7 @@ banshee_read_linear(uint32_t addr, void *p) cycles -= voodoo->read_time; - if ((banshee->pci_regs[0x30] & 0x01) && addr >= banshee->bios_rom.mapping.base && addr < (banshee->bios_rom.mapping.base + banshee->bios_rom.sz)) - { + if ((banshee->pci_regs[0x30] & 0x01) && addr >= banshee->bios_rom.mapping.base && addr < (banshee->bios_rom.mapping.base + banshee->bios_rom.sz)) { return rom_read(addr & (banshee->bios_rom.sz - 1), &banshee->bios_rom); } addr &= svga->decode_mask; @@ -1639,8 +1638,7 @@ banshee_read_linear_w(uint32_t addr, void *p) return banshee_read_linear(addr, p) | (banshee_read_linear(addr + 1, p) << 8); cycles -= voodoo->read_time; - if ((banshee->pci_regs[0x30] & 0x01) && addr >= banshee->bios_rom.mapping.base && addr < (banshee->bios_rom.mapping.base + banshee->bios_rom.sz)) - { + if ((banshee->pci_regs[0x30] & 0x01) && addr >= banshee->bios_rom.mapping.base && addr < (banshee->bios_rom.mapping.base + banshee->bios_rom.sz)) { return rom_readw(addr & (banshee->bios_rom.sz - 1), &banshee->bios_rom); } addr &= svga->decode_mask; @@ -1676,8 +1674,7 @@ banshee_read_linear_l(uint32_t addr, void *p) cycles -= voodoo->read_time; - if ((banshee->pci_regs[0x30] & 0x01) && addr >= banshee->bios_rom.mapping.base && addr < (banshee->bios_rom.mapping.base + banshee->bios_rom.sz)) - { + if ((banshee->pci_regs[0x30] & 0x01) && addr >= banshee->bios_rom.mapping.base && addr < (banshee->bios_rom.mapping.base + banshee->bios_rom.sz)) { return rom_readl(addr & (banshee->bios_rom.sz - 1), &banshee->bios_rom); } addr &= svga->decode_mask; diff --git a/src/video/vid_voodoo_display.c b/src/video/vid_voodoo_display.c index 34037605a..aded37e2d 100644 --- a/src/video/vid_voodoo_display.c +++ b/src/video/vid_voodoo_display.c @@ -493,8 +493,8 @@ voodoo_filterline_v2(voodoo_t *voodoo, uint8_t *fil, int column, uint16_t *src, void voodoo_callback(void *p) { - voodoo_t *voodoo = (voodoo_t *) p; - monitor_t* monitor = &monitors[voodoo->monitor_index]; + voodoo_t *voodoo = (voodoo_t *) p; + monitor_t *monitor = &monitors[voodoo->monitor_index]; if (voodoo->fbiInit0 & FBIINIT0_VGA_PASS) { if (voodoo->line < voodoo->v_disp) { diff --git a/src/video/video.c b/src/video/video.c index d0e9ebb2c..0253e3c03 100644 --- a/src/video/video.c +++ b/src/video/video.c @@ -106,7 +106,6 @@ void *__cdecl (*video_copy)(void *_Dst, const void *_Src, size_t _Size) = memcpy void *(*video_copy)(void *__restrict, const void *__restrict, size_t); #endif - PALETTE cgapal = { {0,0,0}, {0,42,0}, {42,0,0}, {42,21,0}, {0,0,0}, {0,42,42}, {42,0,42}, {42,42,42}, @@ -173,7 +172,6 @@ PALETTE cgapal_mono[6] = { } }; - const uint32_t shade[5][256] = { {0}, // RGB Color (unused) diff --git a/src/vnc.c b/src/vnc.c index ef388939a..eaa1d89fe 100644 --- a/src/vnc.c +++ b/src/vnc.c @@ -88,8 +88,8 @@ vnc_mouse_poll(void) mouse_x += ms.dx; mouse_y += ms.dy; - ms.dx = 0; - ms.dy = 0; + ms.dx = 0; + ms.dy = 0; // pclog("dx=%d, dy=%d, dwheel=%d\n", mouse_x, mouse_y, mouse_z); } @@ -186,7 +186,7 @@ vnc_display(rfbClientPtr cl) static void vnc_blit(int x, int y, int w, int h, int monitor_index) { - int row; + int row; if (monitor_index || (x < 0) || (y < 0) || (w < VNC_MIN_X) || (h < VNC_MIN_Y) || (w > VNC_MAX_X) || (h > VNC_MAX_Y) || (buffer32 == NULL)) { video_blit_complete_monitor(monitor_index); diff --git a/src/win/win.c b/src/win/win.c index 69561036d..7c06d3710 100644 --- a/src/win/win.c +++ b/src/win/win.c @@ -884,12 +884,12 @@ plat_mmap(size_t size, uint8_t executable) } void -plat_get_global_config_dir(char* strptr) +plat_get_global_config_dir(char *strptr) { wchar_t appdata_dir[1024] = { L'\0' }; if (_wgetenv(L"LOCALAPPDATA") && _wgetenv(L"LOCALAPPDATA")[0] != L'\0') { - size_t len = 0; + size_t len = 0; wcsncpy(appdata_dir, _wgetenv(L"LOCALAPPDATA"), 1024); len = wcslen(appdata_dir); if (appdata_dir[len - 1] != L'\\') { diff --git a/src/win/win_devconf.c b/src/win/win_devconf.c index 849bf62f1..6573e8400 100644 --- a/src/win/win_devconf.c +++ b/src/win/win_devconf.c @@ -251,7 +251,7 @@ deviceconfig_dlgproc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) id += 2; break; case CONFIG_BIOS: - bios = config->bios; + bios = config->bios; val_str = config_get_string((char *) config_device.name, (char *) config->name, (char *) config->default_string); @@ -378,8 +378,8 @@ deviceconfig_dlgproc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) id += 2; break; case CONFIG_BIOS: - bios = config->bios; - c = combo_to_struct[SendMessage(h, CB_GETCURSEL, 0, 0)]; + bios = config->bios; + c = combo_to_struct[SendMessage(h, CB_GETCURSEL, 0, 0)]; for (; c > 0; c--) bios++; config_set_string((char *) config_device.name, (char *) config->name, (char *) bios->internal_name); diff --git a/src/win/win_serial_passthrough.c b/src/win/win_serial_passthrough.c index f80c5936d..1e190956d 100644 --- a/src/win/win_serial_passthrough.c +++ b/src/win/win_serial_passthrough.c @@ -47,7 +47,7 @@ plat_serpt_close(void *p) if (dev->mode == SERPT_MODE_VCON) DisconnectNamedPipe((HANDLE) dev->master_fd); if (dev->mode == SERPT_MODE_HOSTSER) { - SetCommState((HANDLE)dev->master_fd, (DCB*)dev->backend_priv); + SetCommState((HANDLE) dev->master_fd, (DCB *) dev->backend_priv); free(dev->backend_priv); } CloseHandle((HANDLE) dev->master_fd); @@ -80,41 +80,44 @@ plat_serpt_write_vcon(serial_passthrough_t *dev, uint8_t data) void plat_serpt_set_params(void *p) { - serial_passthrough_t *dev = (serial_passthrough_t *)p; + serial_passthrough_t *dev = (serial_passthrough_t *) p; - if (dev->mode == SERPT_MODE_HOSTSER) { - DCB serialattr = {}; - GetCommState((HANDLE)dev->master_fd, &serialattr); -#define BAUDRATE_RANGE(baud_rate, min, max) if (baud_rate >= min && baud_rate < max) { serialattr.BaudRate = min; } + if (dev->mode == SERPT_MODE_HOSTSER) { + DCB serialattr = {}; + GetCommState((HANDLE) dev->master_fd, &serialattr); +#define BAUDRATE_RANGE(baud_rate, min, max) \ + if (baud_rate >= min && baud_rate < max) { \ + serialattr.BaudRate = min; \ + } - BAUDRATE_RANGE(dev->baudrate, 110, 300); - BAUDRATE_RANGE(dev->baudrate, 300, 600); - BAUDRATE_RANGE(dev->baudrate, 600, 1200); - BAUDRATE_RANGE(dev->baudrate, 1200, 2400); - BAUDRATE_RANGE(dev->baudrate, 2400, 4800); - BAUDRATE_RANGE(dev->baudrate, 4800, 9600); - BAUDRATE_RANGE(dev->baudrate, 9600, 14400); - BAUDRATE_RANGE(dev->baudrate, 14400, 19200); - BAUDRATE_RANGE(dev->baudrate, 19200, 38400); - BAUDRATE_RANGE(dev->baudrate, 38400, 57600); - BAUDRATE_RANGE(dev->baudrate, 57600, 115200); - BAUDRATE_RANGE(dev->baudrate, 115200, 0xFFFFFFFF); + BAUDRATE_RANGE(dev->baudrate, 110, 300); + BAUDRATE_RANGE(dev->baudrate, 300, 600); + BAUDRATE_RANGE(dev->baudrate, 600, 1200); + BAUDRATE_RANGE(dev->baudrate, 1200, 2400); + BAUDRATE_RANGE(dev->baudrate, 2400, 4800); + BAUDRATE_RANGE(dev->baudrate, 4800, 9600); + BAUDRATE_RANGE(dev->baudrate, 9600, 14400); + BAUDRATE_RANGE(dev->baudrate, 14400, 19200); + BAUDRATE_RANGE(dev->baudrate, 19200, 38400); + BAUDRATE_RANGE(dev->baudrate, 38400, 57600); + BAUDRATE_RANGE(dev->baudrate, 57600, 115200); + BAUDRATE_RANGE(dev->baudrate, 115200, 0xFFFFFFFF); - serialattr.ByteSize = dev->data_bits; - serialattr.StopBits = (dev->serial->lcr & 0x04) ? TWOSTOPBITS : ONESTOPBIT; - if (!(dev->serial->lcr & 0x08)) { - serialattr.fParity = 0; - serialattr.Parity = NOPARITY; - } else { - serialattr.fParity = 1; - if (dev->serial->lcr & 0x20) { - serialattr.Parity = (MARKPARITY) + !!(dev->serial->lcr & 0x10); - } else { - serialattr.Parity = (ODDPARITY) + !!(dev->serial->lcr & 0x10); - } - } + serialattr.ByteSize = dev->data_bits; + serialattr.StopBits = (dev->serial->lcr & 0x04) ? TWOSTOPBITS : ONESTOPBIT; + if (!(dev->serial->lcr & 0x08)) { + serialattr.fParity = 0; + serialattr.Parity = NOPARITY; + } else { + serialattr.fParity = 1; + if (dev->serial->lcr & 0x20) { + serialattr.Parity = (MARKPARITY) + !!(dev->serial->lcr & 0x10); + } else { + serialattr.Parity = (ODDPARITY) + !!(dev->serial->lcr & 0x10); + } + } - SetCommState((HANDLE)dev->master_fd, &serialattr); + SetCommState((HANDLE) dev->master_fd, &serialattr); #undef BAUDRATE_RANGE } } @@ -168,7 +171,7 @@ open_pseudo_terminal(serial_passthrough_t *dev) if (dev->master_fd == (intptr_t) INVALID_HANDLE_VALUE) { wchar_t errorMsg[1024] = { 0 }; wchar_t finalMsg[1024] = { 0 }; - DWORD error = GetLastError(); + DWORD error = GetLastError(); FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM, NULL, error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), errorMsg, 1024, NULL); swprintf(finalMsg, 1024, L"Named Pipe (server, named_pipe=\"%hs\", port=COM%d): %ls\n", ascii_pipe_name, dev->port + 1, errorMsg); ui_msgbox(MBX_ERROR | MBX_FATAL, finalMsg); @@ -188,8 +191,9 @@ open_host_serial_port(serial_passthrough_t *dev) .WriteTotalTimeoutMultiplier = 0, .WriteTotalTimeoutConstant = 1000 }; - DCB* serialattr = calloc(1, sizeof(DCB)); - if (!serialattr) return 0; + DCB *serialattr = calloc(1, sizeof(DCB)); + if (!serialattr) + return 0; dev->master_fd = (intptr_t) CreateFileA(dev->host_serial_path, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); if (dev->master_fd == (intptr_t) INVALID_HANDLE_VALUE) { free(serialattr); @@ -201,7 +205,7 @@ open_host_serial_port(serial_passthrough_t *dev) free(serialattr); return 0; } - GetCommState((HANDLE)dev->master_fd, serialattr); + GetCommState((HANDLE) dev->master_fd, serialattr); dev->backend_priv = serialattr; return 1; } diff --git a/src/win/win_settings.c b/src/win/win_settings.c index 4901b283c..b6166c76c 100644 --- a/src/win/win_settings.c +++ b/src/win/win_settings.c @@ -328,11 +328,11 @@ win_settings_init(void) temp_sync = time_sync; /* Video category */ - temp_gfxcard[0] = gfxcard[0]; + temp_gfxcard[0] = gfxcard[0]; temp_gfxcard[1] = gfxcard[1]; - temp_voodoo = voodoo_enabled; - temp_ibm8514 = ibm8514_enabled; - temp_xga = xga_enabled; + temp_voodoo = voodoo_enabled; + temp_ibm8514 = ibm8514_enabled; + temp_xga = xga_enabled; /* Input devices category */ temp_mouse = mouse_type; @@ -351,17 +351,17 @@ win_settings_init(void) for (i = 0; i < NET_CARD_MAX; i++) { temp_net_type[i] = net_cards_conf[i].net_type; memset(temp_pcap_dev[i], 0, sizeof(temp_pcap_dev[i])); -# ifdef ENABLE_SETTINGS_LOG +#ifdef ENABLE_SETTINGS_LOG assert(sizeof(temp_pcap_dev[i]) == sizeof(net_cards_conf[i].host_dev_name)); -# endif +#endif memcpy(temp_pcap_dev[i], net_cards_conf[i].host_dev_name, sizeof(net_cards_conf[i].host_dev_name)); temp_net_card[i] = net_cards_conf[i].device_num; } /* Ports category */ for (i = 0; i < PARALLEL_MAX; i++) { - temp_lpt_devices[i] = lpt_ports[i].device; - temp_lpt[i] = lpt_ports[i].enabled; + temp_lpt_devices[i] = lpt_ports[i].device; + temp_lpt[i] = lpt_ports[i].enabled; } for (i = 0; i < SERIAL_MAX; i++) { temp_serial[i] = com_ports[i].enabled; @@ -552,8 +552,8 @@ win_settings_save(void) time_sync = temp_sync; /* Video category */ - gfxcard[0] = temp_gfxcard[0]; - gfxcard[1] = temp_gfxcard[1]; + gfxcard[0] = temp_gfxcard[0]; + gfxcard[1] = temp_gfxcard[1]; voodoo_enabled = temp_voodoo; ibm8514_enabled = temp_ibm8514; xga_enabled = temp_xga; @@ -585,7 +585,7 @@ win_settings_save(void) lpt_ports[i].enabled = temp_lpt[i]; } for (i = 0; i < SERIAL_MAX; i++) { - com_ports[i].enabled = temp_serial[i]; + com_ports[i].enabled = temp_serial[i]; serial_passthrough_enabled[i] = temp_serial_passthrough_enabled[i]; } @@ -1801,7 +1801,7 @@ win_settings_ports_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) } for (i = 0; i < SERIAL_MAX; i++) { - temp_serial[i] = settings_get_check(hdlg, IDC_CHECK_SERIAL1 + i); + temp_serial[i] = settings_get_check(hdlg, IDC_CHECK_SERIAL1 + i); temp_serial_passthrough_enabled[i] = settings_get_check(hdlg, IDC_CHECK_SERIAL_PASS1 + i); } @@ -2025,10 +2025,10 @@ network_recalc_combos(HWND hdlg) #if 0 for (uint8_t i = 0; i < NET_CARD_MAX; i++) { #endif - settings_enable_window(hdlg, IDC_COMBO_PCAP1, temp_net_type[0] == NET_TYPE_PCAP); - settings_enable_window(hdlg, IDC_COMBO_NET1, - (temp_net_type[0] == NET_TYPE_SLIRP) || ((temp_net_type[0] == NET_TYPE_PCAP) && (network_dev_to_id(temp_pcap_dev[0]) > 0))); - settings_enable_window(hdlg, IDC_CONFIGURE_NET1, network_card_has_config(temp_net_card[0]) && ((temp_net_type[0] == NET_TYPE_SLIRP) || ((temp_net_type[0] == NET_TYPE_PCAP) && (network_dev_to_id(temp_pcap_dev[0]) > 0)))); + settings_enable_window(hdlg, IDC_COMBO_PCAP1, temp_net_type[0] == NET_TYPE_PCAP); + settings_enable_window(hdlg, IDC_COMBO_NET1, + (temp_net_type[0] == NET_TYPE_SLIRP) || ((temp_net_type[0] == NET_TYPE_PCAP) && (network_dev_to_id(temp_pcap_dev[0]) > 0))); + settings_enable_window(hdlg, IDC_CONFIGURE_NET1, network_card_has_config(temp_net_card[0]) && ((temp_net_type[0] == NET_TYPE_SLIRP) || ((temp_net_type[0] == NET_TYPE_PCAP) && (network_dev_to_id(temp_pcap_dev[0]) > 0)))); #if 0 } #endif @@ -2053,44 +2053,44 @@ win_settings_network_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) #if 0 for (uint8_t i = 0; i < NET_CARD_MAX; i++) { #endif - settings_add_string(hdlg, IDC_COMBO_NET1_TYPE, (LPARAM) L"None"); - settings_add_string(hdlg, IDC_COMBO_NET1_TYPE, (LPARAM) L"SLiRP"); - settings_add_string(hdlg, IDC_COMBO_NET1_TYPE, (LPARAM) L"PCap"); - settings_set_cur_sel(hdlg, IDC_COMBO_NET1_TYPE, temp_net_type[0]); - settings_enable_window(hdlg, IDC_COMBO_PCAP1, temp_net_type[0] == NET_TYPE_PCAP); + settings_add_string(hdlg, IDC_COMBO_NET1_TYPE, (LPARAM) L"None"); + settings_add_string(hdlg, IDC_COMBO_NET1_TYPE, (LPARAM) L"SLiRP"); + settings_add_string(hdlg, IDC_COMBO_NET1_TYPE, (LPARAM) L"PCap"); + settings_set_cur_sel(hdlg, IDC_COMBO_NET1_TYPE, temp_net_type[0]); + settings_enable_window(hdlg, IDC_COMBO_PCAP1, temp_net_type[0] == NET_TYPE_PCAP); - for (c = 0; c < network_ndev; c++) { - mbstowcs(lptsTemp, network_devs[c].description, strlen(network_devs[c].description) + 1); - settings_add_string(hdlg, IDC_COMBO_PCAP1, (LPARAM) lptsTemp); - } - settings_set_cur_sel(hdlg, IDC_COMBO_PCAP1, network_dev_to_id(temp_pcap_dev[0])); + for (c = 0; c < network_ndev; c++) { + mbstowcs(lptsTemp, network_devs[c].description, strlen(network_devs[c].description) + 1); + settings_add_string(hdlg, IDC_COMBO_PCAP1, (LPARAM) lptsTemp); + } + settings_set_cur_sel(hdlg, IDC_COMBO_PCAP1, network_dev_to_id(temp_pcap_dev[0])); - /* NIC config */ - c = d = 0; - settings_reset_content(hdlg, IDC_COMBO_NET1); - while (1) { - generate_device_name(network_card_getdevice(c), network_card_get_internal_name(c), 1); + /* NIC config */ + c = d = 0; + settings_reset_content(hdlg, IDC_COMBO_NET1); + while (1) { + generate_device_name(network_card_getdevice(c), network_card_get_internal_name(c), 1); - if (device_name[0] == L'\0') - break; + if (device_name[0] == L'\0') + break; - if (network_card_available(c) && device_is_valid(network_card_getdevice(c), temp_machine)) { - if (c == 0) - settings_add_string(hdlg, IDC_COMBO_NET1, win_get_string(IDS_2104)); - else - settings_add_string(hdlg, IDC_COMBO_NET1, (LPARAM) device_name); - settings_list_to_device[0][d] = c; - if ((c == 0) || (c == temp_net_card[0])) - settings_set_cur_sel(hdlg, IDC_COMBO_NET1, d); - d++; - } - - c++; + if (network_card_available(c) && device_is_valid(network_card_getdevice(c), temp_machine)) { + if (c == 0) + settings_add_string(hdlg, IDC_COMBO_NET1, win_get_string(IDS_2104)); + else + settings_add_string(hdlg, IDC_COMBO_NET1, (LPARAM) device_name); + settings_list_to_device[0][d] = c; + if ((c == 0) || (c == temp_net_card[0])) + settings_set_cur_sel(hdlg, IDC_COMBO_NET1, d); + d++; } - settings_enable_window(hdlg, IDC_COMBO_NET1, d); - network_recalc_combos(hdlg); - free(lptsTemp); + c++; + } + + settings_enable_window(hdlg, IDC_COMBO_NET1, d); + network_recalc_combos(hdlg); + free(lptsTemp); #if 0 } #endif @@ -2157,10 +2157,10 @@ win_settings_network_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) #if 0 for (uint8_t i = 0; i < NET_CARD_MAX; i++) { #endif - temp_net_type[0] = settings_get_cur_sel(hdlg, IDC_COMBO_NET1_TYPE); - memset(temp_pcap_dev[0], '\0', sizeof(temp_pcap_dev[0])); - strcpy(temp_pcap_dev[0], network_devs[settings_get_cur_sel(hdlg, IDC_COMBO_PCAP1)].device); - temp_net_card[0] = settings_list_to_device[0][settings_get_cur_sel(hdlg, IDC_COMBO_NET1)]; + temp_net_type[0] = settings_get_cur_sel(hdlg, IDC_COMBO_NET1_TYPE); + memset(temp_pcap_dev[0], '\0', sizeof(temp_pcap_dev[0])); + strcpy(temp_pcap_dev[0], network_devs[settings_get_cur_sel(hdlg, IDC_COMBO_PCAP1)].device); + temp_net_card[0] = settings_list_to_device[0][settings_get_cur_sel(hdlg, IDC_COMBO_NET1)]; #if 0 } #endif diff --git a/src/win/win_ui.c b/src/win/win_ui.c index 3144c8ef3..4c19f5a7f 100644 --- a/src/win/win_ui.c +++ b/src/win/win_ui.c @@ -45,7 +45,7 @@ #include <86box/win.h> #include <86box/version.h> #ifdef DISCORD -# include <86box/discord.h> +# include <86box/discord.h> #endif #ifdef MTR_ENABLED From 8c1906bc983c9260b5b4ea83f7a779e6a6c821f6 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sun, 13 Nov 2022 22:16:18 -0500 Subject: [PATCH 281/285] Add missing translation --- src/86box.c | 2 +- src/include/86box/language.h | 1 + src/qt/qt_platform.cpp | 1 + src/win/languages/cs-CZ.rc | 1 + src/win/languages/de-DE.rc | 1 + src/win/languages/en-GB.rc | 1 + src/win/languages/en-US.rc | 1 + src/win/languages/es-ES.rc | 1 + src/win/languages/fi-FI.rc | 1 + src/win/languages/fr-FR.rc | 1 + src/win/languages/hr-HR.rc | 1 + src/win/languages/hu-HU.rc | 1 + src/win/languages/it-IT.rc | 1 + src/win/languages/ja-JP.rc | 1 + src/win/languages/ko-KR.rc | 1 + src/win/languages/pl-PL.rc | 1 + src/win/languages/pt-BR.rc | 1 + src/win/languages/pt-PT.rc | 1 + src/win/languages/ru-RU.rc | 1 + src/win/languages/sl-SI.rc | 1 + src/win/languages/tr-TR.rc | 1 + src/win/languages/uk-UA.rc | 1 + src/win/languages/zh-CN.rc | 1 + src/win/languages/zh-TW.rc | 1 + 24 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/86box.c b/src/86box.c index 28012ea7a..1c020c32e 100644 --- a/src/86box.c +++ b/src/86box.c @@ -898,7 +898,7 @@ 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), (wchar_t *) "Video card #2 \"%hs\" is not available due to missing ROMs in the roms/video directory. Disabling the second video card.", tempc); + swprintf(temp, sizeof_w(temp), plat_get_string(IDS_2163), tempc); ui_msgbox_header(MBX_INFO, (wchar_t *) IDS_2129, temp); gfxcard[1] = 0; } diff --git a/src/include/86box/language.h b/src/include/86box/language.h index 1fd5bdf61..e3ffd1db9 100644 --- a/src/include/86box/language.h +++ b/src/include/86box/language.h @@ -162,6 +162,7 @@ #else # define IDS_DYNAREC IDS_2163 #endif +#define IDS_2166 2166 // "Video card #2 ""%hs"" is not..." #define IDS_4096 4096 // "Hard disk (%s)" #define IDS_4097 4097 // "%01i:%01i" diff --git a/src/qt/qt_platform.cpp b/src/qt/qt_platform.cpp index 695531d5c..1fa3b5637 100644 --- a/src/qt/qt_platform.cpp +++ b/src/qt/qt_platform.cpp @@ -597,6 +597,7 @@ ProgSettings::reloadStrings() translatedstrings[IDS_2115] = QCoreApplication::translate("", "Unable to initialize Ghostscript").toStdWString(); translatedstrings[IDS_2063] = QCoreApplication::translate("", "Machine \"%hs\" is not available due to missing ROMs in the roms/machines directory. Switching to an available machine.").toStdWString(); translatedstrings[IDS_2064] = 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[IDS_2163] = QCoreApplication::translate("", "Video card #2 \"%hs\" is not available due to missing ROMs in the roms/video directory. Disabling the second video card.").toStdWString(); translatedstrings[IDS_2129] = QCoreApplication::translate("", "Hardware not available").toStdWString(); translatedstrings[IDS_2143] = QCoreApplication::translate("", "Monitor in sleep mode").toStdWString(); translatedstrings[IDS_2121] = QCoreApplication::translate("", "No ROMs found").toStdWString(); diff --git a/src/win/languages/cs-CZ.rc b/src/win/languages/cs-CZ.rc index fe8a8a42b..ebdf36613 100644 --- a/src/win/languages/cs-CZ.rc +++ b/src/win/languages/cs-CZ.rc @@ -541,6 +541,7 @@ BEGIN IDS_2163 "no dynarec" IDS_2164 "old dynarec" IDS_2165 "new dynarec" + IDS_2166 "Video card #2 ""%hs"" is not available due to missing ROMs in the roms/video directory. Disabling the second video card." END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/de-DE.rc b/src/win/languages/de-DE.rc index 58d799539..51ad1da79 100644 --- a/src/win/languages/de-DE.rc +++ b/src/win/languages/de-DE.rc @@ -541,6 +541,7 @@ BEGIN IDS_2163 "no dynarec" IDS_2164 "old dynarec" IDS_2165 "new dynarec" + IDS_2166 "Video card #2 ""%hs"" is not available due to missing ROMs in the roms/video directory. Disabling the second video card." END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/en-GB.rc b/src/win/languages/en-GB.rc index 005a8fc9c..b92311e40 100644 --- a/src/win/languages/en-GB.rc +++ b/src/win/languages/en-GB.rc @@ -541,6 +541,7 @@ BEGIN IDS_2163 "no dynarec" IDS_2164 "old dynarec" IDS_2165 "new dynarec" + IDS_2166 "Video card #2 ""%hs"" is not available due to missing ROMs in the roms/video directory. Disabling the second video card." END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/en-US.rc b/src/win/languages/en-US.rc index dcda2a1b4..fbdc6dd9d 100644 --- a/src/win/languages/en-US.rc +++ b/src/win/languages/en-US.rc @@ -541,6 +541,7 @@ BEGIN IDS_2163 "no dynarec" IDS_2164 "old dynarec" IDS_2165 "new dynarec" + IDS_2166 "Video card #2 ""%hs"" is not available due to missing ROMs in the roms/video directory. Disabling the second video card." END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/es-ES.rc b/src/win/languages/es-ES.rc index 112d5d89e..134acb16f 100644 --- a/src/win/languages/es-ES.rc +++ b/src/win/languages/es-ES.rc @@ -541,6 +541,7 @@ BEGIN IDS_2163 "no dynarec" IDS_2164 "old dynarec" IDS_2165 "new dynarec" + IDS_2166 "Video card #2 ""%hs"" is not available due to missing ROMs in the roms/video directory. Disabling the second video card." END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/fi-FI.rc b/src/win/languages/fi-FI.rc index 5494bffc5..5deb21ce2 100644 --- a/src/win/languages/fi-FI.rc +++ b/src/win/languages/fi-FI.rc @@ -541,6 +541,7 @@ BEGIN IDS_2163 "no dynarec" IDS_2164 "old dynarec" IDS_2165 "new dynarec" + IDS_2166 "Video card #2 ""%hs"" is not available due to missing ROMs in the roms/video directory. Disabling the second video card." END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/fr-FR.rc b/src/win/languages/fr-FR.rc index 970b4db01..d7a6893af 100644 --- a/src/win/languages/fr-FR.rc +++ b/src/win/languages/fr-FR.rc @@ -541,6 +541,7 @@ BEGIN IDS_2163 "no dynarec" IDS_2164 "old dynarec" IDS_2165 "new dynarec" + IDS_2166 "Video card #2 ""%hs"" is not available due to missing ROMs in the roms/video directory. Disabling the second video card." END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/hr-HR.rc b/src/win/languages/hr-HR.rc index 7afb7b26d..3fc3895dc 100644 --- a/src/win/languages/hr-HR.rc +++ b/src/win/languages/hr-HR.rc @@ -541,6 +541,7 @@ BEGIN IDS_2163 "no dynarec" IDS_2164 "old dynarec" IDS_2165 "new dynarec" + IDS_2166 "Video card #2 ""%hs"" is not available due to missing ROMs in the roms/video directory. Disabling the second video card." END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/hu-HU.rc b/src/win/languages/hu-HU.rc index 81fc034c4..77b378e7b 100644 --- a/src/win/languages/hu-HU.rc +++ b/src/win/languages/hu-HU.rc @@ -545,6 +545,7 @@ BEGIN IDS_2163 "no dynarec" IDS_2164 "old dynarec" IDS_2165 "new dynarec" + IDS_2166 "Video card #2 ""%hs"" is not available due to missing ROMs in the roms/video directory. Disabling the second video card." END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/it-IT.rc b/src/win/languages/it-IT.rc index fd0441232..d30f85b74 100644 --- a/src/win/languages/it-IT.rc +++ b/src/win/languages/it-IT.rc @@ -542,6 +542,7 @@ BEGIN IDS_2163 "no dynarec" IDS_2164 "old dynarec" IDS_2165 "new dynarec" + IDS_2166 "Video card #2 ""%hs"" is not available due to missing ROMs in the roms/video directory. Disabling the second video card." END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/ja-JP.rc b/src/win/languages/ja-JP.rc index c1e0ee463..87690eb07 100644 --- a/src/win/languages/ja-JP.rc +++ b/src/win/languages/ja-JP.rc @@ -541,6 +541,7 @@ BEGIN IDS_2163 "no dynarec" IDS_2164 "old dynarec" IDS_2165 "new dynarec" + IDS_2166 "Video card #2 ""%hs"" is not available due to missing ROMs in the roms/video directory. Disabling the second video card." END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/ko-KR.rc b/src/win/languages/ko-KR.rc index d43056478..fd366cc13 100644 --- a/src/win/languages/ko-KR.rc +++ b/src/win/languages/ko-KR.rc @@ -541,6 +541,7 @@ BEGIN IDS_2163 "no dynarec" IDS_2164 "old dynarec" IDS_2165 "new dynarec" + IDS_2166 "Video card #2 ""%hs"" is not available due to missing ROMs in the roms/video directory. Disabling the second video card." END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/pl-PL.rc b/src/win/languages/pl-PL.rc index 343ca929b..2692e4951 100644 --- a/src/win/languages/pl-PL.rc +++ b/src/win/languages/pl-PL.rc @@ -541,6 +541,7 @@ BEGIN IDS_2163 "no dynarec" IDS_2164 "old dynarec" IDS_2165 "new dynarec" + IDS_2166 "Video card #2 ""%hs"" is not available due to missing ROMs in the roms/video directory. Disabling the second video card." END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/pt-BR.rc b/src/win/languages/pt-BR.rc index 104c3648e..8d6fbfb12 100644 --- a/src/win/languages/pt-BR.rc +++ b/src/win/languages/pt-BR.rc @@ -544,6 +544,7 @@ BEGIN IDS_2163 "no dynarec" IDS_2164 "old dynarec" IDS_2165 "new dynarec" + IDS_2166 "Video card #2 ""%hs"" is not available due to missing ROMs in the roms/video directory. Disabling the second video card." END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/pt-PT.rc b/src/win/languages/pt-PT.rc index 31c68fbd0..f6fce2a33 100644 --- a/src/win/languages/pt-PT.rc +++ b/src/win/languages/pt-PT.rc @@ -541,6 +541,7 @@ BEGIN IDS_2163 "no dynarec" IDS_2164 "old dynarec" IDS_2165 "new dynarec" + IDS_2166 "Video card #2 ""%hs"" is not available due to missing ROMs in the roms/video directory. Disabling the second video card." END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/ru-RU.rc b/src/win/languages/ru-RU.rc index 8ae6b20b6..4c659a43a 100644 --- a/src/win/languages/ru-RU.rc +++ b/src/win/languages/ru-RU.rc @@ -541,6 +541,7 @@ BEGIN IDS_2163 "no dynarec" IDS_2164 "old dynarec" IDS_2165 "new dynarec" + IDS_2166 "Video card #2 ""%hs"" is not available due to missing ROMs in the roms/video directory. Disabling the second video card." END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/sl-SI.rc b/src/win/languages/sl-SI.rc index f1badf570..3086278df 100644 --- a/src/win/languages/sl-SI.rc +++ b/src/win/languages/sl-SI.rc @@ -541,6 +541,7 @@ BEGIN IDS_2163 "no dynarec" IDS_2164 "old dynarec" IDS_2165 "new dynarec" + IDS_2166 "Video card #2 ""%hs"" is not available due to missing ROMs in the roms/video directory. Disabling the second video card." END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/tr-TR.rc b/src/win/languages/tr-TR.rc index a168d2f30..4ad902940 100644 --- a/src/win/languages/tr-TR.rc +++ b/src/win/languages/tr-TR.rc @@ -541,6 +541,7 @@ BEGIN IDS_2163 "no dynarec" IDS_2164 "old dynarec" IDS_2165 "new dynarec" + IDS_2166 "Video card #2 ""%hs"" is not available due to missing ROMs in the roms/video directory. Disabling the second video card." END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/uk-UA.rc b/src/win/languages/uk-UA.rc index db2604860..b9073ef95 100644 --- a/src/win/languages/uk-UA.rc +++ b/src/win/languages/uk-UA.rc @@ -541,6 +541,7 @@ BEGIN IDS_2163 "no dynarec" IDS_2164 "old dynarec" IDS_2165 "new dynarec" + IDS_2166 "Video card #2 ""%hs"" is not available due to missing ROMs in the roms/video directory. Disabling the second video card." END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/zh-CN.rc b/src/win/languages/zh-CN.rc index f72177a81..676ef9082 100644 --- a/src/win/languages/zh-CN.rc +++ b/src/win/languages/zh-CN.rc @@ -541,6 +541,7 @@ BEGIN IDS_2163 "no dynarec" IDS_2164 "old dynarec" IDS_2165 "new dynarec" + IDS_2166 "Video card #2 ""%hs"" is not available due to missing ROMs in the roms/video directory. Disabling the second video card." END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/zh-TW.rc b/src/win/languages/zh-TW.rc index 6c2d87545..5203b707a 100644 --- a/src/win/languages/zh-TW.rc +++ b/src/win/languages/zh-TW.rc @@ -541,6 +541,7 @@ BEGIN IDS_2163 "no dynarec" IDS_2164 "old dynarec" IDS_2165 "new dynarec" + IDS_2166 "Video card #2 ""%hs"" is not available due to missing ROMs in the roms/video directory. Disabling the second video card." END STRINGTABLE DISCARDABLE From ffaa8f885d7718c409862dd9d73877ce45f7578f Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Wed, 1 Mar 2023 00:19:13 -0500 Subject: [PATCH 282/285] Capitalize Dynarec strings --- src/win/languages/cs-CZ.rc | 6 +++--- src/win/languages/de-DE.rc | 6 +++--- src/win/languages/en-GB.rc | 6 +++--- src/win/languages/en-US.rc | 6 +++--- src/win/languages/es-ES.rc | 6 +++--- src/win/languages/fi-FI.rc | 6 +++--- src/win/languages/fr-FR.rc | 6 +++--- src/win/languages/hr-HR.rc | 6 +++--- src/win/languages/hu-HU.rc | 6 +++--- src/win/languages/it-IT.rc | 6 +++--- src/win/languages/ja-JP.rc | 6 +++--- src/win/languages/ko-KR.rc | 6 +++--- src/win/languages/pl-PL.rc | 6 +++--- src/win/languages/pt-BR.rc | 6 +++--- src/win/languages/pt-PT.rc | 6 +++--- src/win/languages/ru-RU.rc | 6 +++--- src/win/languages/sl-SI.rc | 6 +++--- src/win/languages/tr-TR.rc | 6 +++--- src/win/languages/uk-UA.rc | 6 +++--- src/win/languages/zh-CN.rc | 6 +++--- src/win/languages/zh-TW.rc | 6 +++--- 21 files changed, 63 insertions(+), 63 deletions(-) diff --git a/src/win/languages/cs-CZ.rc b/src/win/languages/cs-CZ.rc index ebdf36613..361a59397 100644 --- a/src/win/languages/cs-CZ.rc +++ b/src/win/languages/cs-CZ.rc @@ -538,9 +538,9 @@ BEGIN IDS_2160 "Vypnout skrze rozhraní ACPI" IDS_2161 "Nastavení" IDS_2162 "Časná mechanika" - IDS_2163 "no dynarec" - IDS_2164 "old dynarec" - IDS_2165 "new dynarec" + IDS_2163 "No Dynarec" + IDS_2164 "Old Dynarec" + IDS_2165 "New Dynarec" IDS_2166 "Video card #2 ""%hs"" is not available due to missing ROMs in the roms/video directory. Disabling the second video card." END diff --git a/src/win/languages/de-DE.rc b/src/win/languages/de-DE.rc index 51ad1da79..97105b785 100644 --- a/src/win/languages/de-DE.rc +++ b/src/win/languages/de-DE.rc @@ -538,9 +538,9 @@ BEGIN IDS_2160 "ACPI-basiertes Herunterfahren" IDS_2161 "Optionen" IDS_2162 "Früheres Laufwerk" - IDS_2163 "no dynarec" - IDS_2164 "old dynarec" - IDS_2165 "new dynarec" + IDS_2163 "No Dynarec" + IDS_2164 "Old Dynarec" + IDS_2165 "New Dynarec" IDS_2166 "Video card #2 ""%hs"" is not available due to missing ROMs in the roms/video directory. Disabling the second video card." END diff --git a/src/win/languages/en-GB.rc b/src/win/languages/en-GB.rc index b92311e40..d94ecf0a0 100644 --- a/src/win/languages/en-GB.rc +++ b/src/win/languages/en-GB.rc @@ -538,9 +538,9 @@ BEGIN IDS_2160 "ACPI shutdown" IDS_2161 "Settings" IDS_2162 "Earlier drive" - IDS_2163 "no dynarec" - IDS_2164 "old dynarec" - IDS_2165 "new dynarec" + IDS_2163 "No Dynarec" + IDS_2164 "Old Dynarec" + IDS_2165 "New Dynarec" IDS_2166 "Video card #2 ""%hs"" is not available due to missing ROMs in the roms/video directory. Disabling the second video card." END diff --git a/src/win/languages/en-US.rc b/src/win/languages/en-US.rc index fbdc6dd9d..02270a509 100644 --- a/src/win/languages/en-US.rc +++ b/src/win/languages/en-US.rc @@ -538,9 +538,9 @@ BEGIN IDS_2160 "ACPI shutdown" IDS_2161 "Settings" IDS_2162 "Earlier drive" - IDS_2163 "no dynarec" - IDS_2164 "old dynarec" - IDS_2165 "new dynarec" + IDS_2163 "No Dynarec" + IDS_2164 "Old Dynarec" + IDS_2165 "New Dynarec" IDS_2166 "Video card #2 ""%hs"" is not available due to missing ROMs in the roms/video directory. Disabling the second video card." END diff --git a/src/win/languages/es-ES.rc b/src/win/languages/es-ES.rc index 134acb16f..593635dec 100644 --- a/src/win/languages/es-ES.rc +++ b/src/win/languages/es-ES.rc @@ -538,9 +538,9 @@ BEGIN IDS_2160 "ACPI shutdown" IDS_2161 "Settings" IDS_2162 "Unidad anterior" - IDS_2163 "no dynarec" - IDS_2164 "old dynarec" - IDS_2165 "new dynarec" + IDS_2163 "No Dynarec" + IDS_2164 "Old Dynarec" + IDS_2165 "New Dynarec" IDS_2166 "Video card #2 ""%hs"" is not available due to missing ROMs in the roms/video directory. Disabling the second video card." END diff --git a/src/win/languages/fi-FI.rc b/src/win/languages/fi-FI.rc index 5deb21ce2..a36b92719 100644 --- a/src/win/languages/fi-FI.rc +++ b/src/win/languages/fi-FI.rc @@ -538,9 +538,9 @@ BEGIN IDS_2160 "ACPI-sammutus" IDS_2161 "Asetukset" IDS_2162 "Aiemmat asemat" - IDS_2163 "no dynarec" - IDS_2164 "old dynarec" - IDS_2165 "new dynarec" + IDS_2163 "No Dynarec" + IDS_2164 "Old Dynarec" + IDS_2165 "New Dynarec" IDS_2166 "Video card #2 ""%hs"" is not available due to missing ROMs in the roms/video directory. Disabling the second video card." END diff --git a/src/win/languages/fr-FR.rc b/src/win/languages/fr-FR.rc index d7a6893af..7d4d82650 100644 --- a/src/win/languages/fr-FR.rc +++ b/src/win/languages/fr-FR.rc @@ -538,9 +538,9 @@ BEGIN IDS_2160 "ACPI shutdown" IDS_2161 "Settings" IDS_2162 "Lecteur plus tôt" - IDS_2163 "no dynarec" - IDS_2164 "old dynarec" - IDS_2165 "new dynarec" + IDS_2163 "No Dynarec" + IDS_2164 "Old Dynarec" + IDS_2165 "New Dynarec" IDS_2166 "Video card #2 ""%hs"" is not available due to missing ROMs in the roms/video directory. Disabling the second video card." END diff --git a/src/win/languages/hr-HR.rc b/src/win/languages/hr-HR.rc index 3fc3895dc..43a90aa8a 100644 --- a/src/win/languages/hr-HR.rc +++ b/src/win/languages/hr-HR.rc @@ -538,9 +538,9 @@ BEGIN IDS_2160 "ACPI bazirano gašenje" IDS_2161 "Postavke" IDS_2162 "Raniji pogon" - IDS_2163 "no dynarec" - IDS_2164 "old dynarec" - IDS_2165 "new dynarec" + IDS_2163 "No Dynarec" + IDS_2164 "Old Dynarec" + IDS_2165 "New Dynarec" IDS_2166 "Video card #2 ""%hs"" is not available due to missing ROMs in the roms/video directory. Disabling the second video card." END diff --git a/src/win/languages/hu-HU.rc b/src/win/languages/hu-HU.rc index 77b378e7b..ece73eea2 100644 --- a/src/win/languages/hu-HU.rc +++ b/src/win/languages/hu-HU.rc @@ -542,9 +542,9 @@ BEGIN IDS_2160 "ACPI shutdown" IDS_2161 "Settings" IDS_2162 "Korábbi meghajtó" - IDS_2163 "no dynarec" - IDS_2164 "old dynarec" - IDS_2165 "new dynarec" + IDS_2163 "No Dynarec" + IDS_2164 "Old Dynarec" + IDS_2165 "New Dynarec" IDS_2166 "Video card #2 ""%hs"" is not available due to missing ROMs in the roms/video directory. Disabling the second video card." END diff --git a/src/win/languages/it-IT.rc b/src/win/languages/it-IT.rc index d30f85b74..60a09d150 100644 --- a/src/win/languages/it-IT.rc +++ b/src/win/languages/it-IT.rc @@ -539,9 +539,9 @@ BEGIN IDS_2160 "ACPI shutdown" IDS_2161 "Settings" IDS_2162 "Unità anteriore" - IDS_2163 "no dynarec" - IDS_2164 "old dynarec" - IDS_2165 "new dynarec" + IDS_2163 "No Dynarec" + IDS_2164 "Old Dynarec" + IDS_2165 "New Dynarec" IDS_2166 "Video card #2 ""%hs"" is not available due to missing ROMs in the roms/video directory. Disabling the second video card." END diff --git a/src/win/languages/ja-JP.rc b/src/win/languages/ja-JP.rc index 87690eb07..caab14089 100644 --- a/src/win/languages/ja-JP.rc +++ b/src/win/languages/ja-JP.rc @@ -538,9 +538,9 @@ BEGIN IDS_2160 "ACPIシャットダウン" IDS_2161 "設定" IDS_2162 "アーリードライブ" - IDS_2163 "no dynarec" - IDS_2164 "old dynarec" - IDS_2165 "new dynarec" + IDS_2163 "No Dynarec" + IDS_2164 "Old Dynarec" + IDS_2165 "New Dynarec" IDS_2166 "Video card #2 ""%hs"" is not available due to missing ROMs in the roms/video directory. Disabling the second video card." END diff --git a/src/win/languages/ko-KR.rc b/src/win/languages/ko-KR.rc index fd366cc13..bab31f72d 100644 --- a/src/win/languages/ko-KR.rc +++ b/src/win/languages/ko-KR.rc @@ -538,9 +538,9 @@ BEGIN IDS_2160 "ACPI 종료" IDS_2161 "설정" IDS_2162 "이전 드라이브" - IDS_2163 "no dynarec" - IDS_2164 "old dynarec" - IDS_2165 "new dynarec" + IDS_2163 "No Dynarec" + IDS_2164 "Old Dynarec" + IDS_2165 "New Dynarec" IDS_2166 "Video card #2 ""%hs"" is not available due to missing ROMs in the roms/video directory. Disabling the second video card." END diff --git a/src/win/languages/pl-PL.rc b/src/win/languages/pl-PL.rc index 2692e4951..ce9747d80 100644 --- a/src/win/languages/pl-PL.rc +++ b/src/win/languages/pl-PL.rc @@ -538,9 +538,9 @@ BEGIN IDS_2160 "Wyłączenie ACPI" IDS_2161 "Ustawienia" IDS_2162 "Wcześniejszy napęd" - IDS_2163 "no dynarec" - IDS_2164 "old dynarec" - IDS_2165 "new dynarec" + IDS_2163 "No Dynarec" + IDS_2164 "Old Dynarec" + IDS_2165 "New Dynarec" IDS_2166 "Video card #2 ""%hs"" is not available due to missing ROMs in the roms/video directory. Disabling the second video card." END diff --git a/src/win/languages/pt-BR.rc b/src/win/languages/pt-BR.rc index 8d6fbfb12..d73fb5c3d 100644 --- a/src/win/languages/pt-BR.rc +++ b/src/win/languages/pt-BR.rc @@ -541,9 +541,9 @@ BEGIN IDS_2160 "Desligamento por ACPI" IDS_2161 "Configurações" IDS_2162 "Unidade anterior" - IDS_2163 "no dynarec" - IDS_2164 "old dynarec" - IDS_2165 "new dynarec" + IDS_2163 "No Dynarec" + IDS_2164 "Old Dynarec" + IDS_2165 "New Dynarec" IDS_2166 "Video card #2 ""%hs"" is not available due to missing ROMs in the roms/video directory. Disabling the second video card." END diff --git a/src/win/languages/pt-PT.rc b/src/win/languages/pt-PT.rc index f6fce2a33..1fca7d6ad 100644 --- a/src/win/languages/pt-PT.rc +++ b/src/win/languages/pt-PT.rc @@ -538,9 +538,9 @@ BEGIN IDS_2160 "Encerramento ACPI" IDS_2161 "Definições" IDS_2162 "Unidade anterior" - IDS_2163 "no dynarec" - IDS_2164 "old dynarec" - IDS_2165 "new dynarec" + IDS_2163 "No Dynarec" + IDS_2164 "Old Dynarec" + IDS_2165 "New Dynarec" IDS_2166 "Video card #2 ""%hs"" is not available due to missing ROMs in the roms/video directory. Disabling the second video card." END diff --git a/src/win/languages/ru-RU.rc b/src/win/languages/ru-RU.rc index 4c659a43a..73b68c07b 100644 --- a/src/win/languages/ru-RU.rc +++ b/src/win/languages/ru-RU.rc @@ -538,9 +538,9 @@ BEGIN IDS_2160 "Сигнал завершения ACPI" IDS_2161 "Настройки машины" IDS_2162 "Предыдущий дисковод" - IDS_2163 "no dynarec" - IDS_2164 "old dynarec" - IDS_2165 "new dynarec" + IDS_2163 "No Dynarec" + IDS_2164 "Old Dynarec" + IDS_2165 "New Dynarec" IDS_2166 "Video card #2 ""%hs"" is not available due to missing ROMs in the roms/video directory. Disabling the second video card." END diff --git a/src/win/languages/sl-SI.rc b/src/win/languages/sl-SI.rc index 3086278df..a1240713e 100644 --- a/src/win/languages/sl-SI.rc +++ b/src/win/languages/sl-SI.rc @@ -538,9 +538,9 @@ BEGIN IDS_2160 "Zaustavitev ACPI" IDS_2161 "Nastavitve" IDS_2162 "Zgodnejši pogon" - IDS_2163 "no dynarec" - IDS_2164 "old dynarec" - IDS_2165 "new dynarec" + IDS_2163 "No Dynarec" + IDS_2164 "Old Dynarec" + IDS_2165 "New Dynarec" IDS_2166 "Video card #2 ""%hs"" is not available due to missing ROMs in the roms/video directory. Disabling the second video card." END diff --git a/src/win/languages/tr-TR.rc b/src/win/languages/tr-TR.rc index 4ad902940..189be0f5b 100644 --- a/src/win/languages/tr-TR.rc +++ b/src/win/languages/tr-TR.rc @@ -538,9 +538,9 @@ BEGIN IDS_2160 "ACPI kapatma" IDS_2161 "Ayarlar" IDS_2162 "Daha erken sürüş" - IDS_2163 "no dynarec" - IDS_2164 "old dynarec" - IDS_2165 "new dynarec" + IDS_2163 "No Dynarec" + IDS_2164 "Old Dynarec" + IDS_2165 "New Dynarec" IDS_2166 "Video card #2 ""%hs"" is not available due to missing ROMs in the roms/video directory. Disabling the second video card." END diff --git a/src/win/languages/uk-UA.rc b/src/win/languages/uk-UA.rc index b9073ef95..8bf380e50 100644 --- a/src/win/languages/uk-UA.rc +++ b/src/win/languages/uk-UA.rc @@ -538,9 +538,9 @@ BEGIN IDS_2160 "Сигнал завершення ACPI" IDS_2161 "Налаштування машини" IDS_2162 "Більш ранній дисковод" - IDS_2163 "no dynarec" - IDS_2164 "old dynarec" - IDS_2165 "new dynarec" + IDS_2163 "No Dynarec" + IDS_2164 "Old Dynarec" + IDS_2165 "New Dynarec" IDS_2166 "Video card #2 ""%hs"" is not available due to missing ROMs in the roms/video directory. Disabling the second video card." END diff --git a/src/win/languages/zh-CN.rc b/src/win/languages/zh-CN.rc index 676ef9082..81899ec7b 100644 --- a/src/win/languages/zh-CN.rc +++ b/src/win/languages/zh-CN.rc @@ -538,9 +538,9 @@ BEGIN IDS_2160 "ACPI 关机" IDS_2161 "设置" IDS_2162 "早先的驱动器" - IDS_2163 "no dynarec" - IDS_2164 "old dynarec" - IDS_2165 "new dynarec" + IDS_2163 "No Dynarec" + IDS_2164 "Old Dynarec" + IDS_2165 "New Dynarec" IDS_2166 "Video card #2 ""%hs"" is not available due to missing ROMs in the roms/video directory. Disabling the second video card." END diff --git a/src/win/languages/zh-TW.rc b/src/win/languages/zh-TW.rc index 5203b707a..9294b1fbd 100644 --- a/src/win/languages/zh-TW.rc +++ b/src/win/languages/zh-TW.rc @@ -538,9 +538,9 @@ BEGIN IDS_2160 "ACPI 關機" IDS_2161 "設定" IDS_2162 "早先的光碟機" - IDS_2163 "no dynarec" - IDS_2164 "old dynarec" - IDS_2165 "new dynarec" + IDS_2163 "No Dynarec" + IDS_2164 "Old Dynarec" + IDS_2165 "New Dynarec" IDS_2166 "Video card #2 ""%hs"" is not available due to missing ROMs in the roms/video directory. Disabling the second video card." END From 8c284c5a4ca16defc75355171ef0c6750ac11ebb Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Wed, 19 Oct 2022 20:16:47 -0400 Subject: [PATCH 283/285] Format src\chipset\ali1429.c --- src/chipset/ali1429.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/chipset/ali1429.c b/src/chipset/ali1429.c index 937725b92..02034e481 100644 --- a/src/chipset/ali1429.c +++ b/src/chipset/ali1429.c @@ -11,6 +11,8 @@ * Note: This chipset has no datasheet, everything were done via * reverse engineering the BIOS of various machines using it. * + * + * * Authors: Tiseno100, * Miran Grca, * @@ -72,7 +74,6 @@ 1 1 0: CLK2IN/12 */ - #include #include #include From de32c40204ea65225c44590ae2273b30d5966d55 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sun, 13 Nov 2022 22:16:18 -0500 Subject: [PATCH 284/285] Whitespace in lang files --- src/win/languages/cs-CZ.rc | 816 ++++++++++++++++++------------------- src/win/languages/de-DE.rc | 808 ++++++++++++++++++------------------ src/win/languages/en-GB.rc | 790 +++++++++++++++++------------------ src/win/languages/en-US.rc | 786 +++++++++++++++++------------------ src/win/languages/es-ES.rc | 714 ++++++++++++++++---------------- src/win/languages/fi-FI.rc | 28 +- src/win/languages/fr-FR.rc | 712 ++++++++++++++++---------------- src/win/languages/hr-HR.rc | 712 ++++++++++++++++---------------- src/win/languages/hu-HU.rc | 712 ++++++++++++++++---------------- src/win/languages/it-IT.rc | 712 ++++++++++++++++---------------- src/win/languages/ja-JP.rc | 712 ++++++++++++++++---------------- src/win/languages/ko-KR.rc | 712 ++++++++++++++++---------------- src/win/languages/pl-PL.rc | 714 ++++++++++++++++---------------- src/win/languages/pt-BR.rc | 712 ++++++++++++++++---------------- src/win/languages/pt-PT.rc | 710 ++++++++++++++++---------------- src/win/languages/ru-RU.rc | 714 ++++++++++++++++---------------- src/win/languages/sl-SI.rc | 712 ++++++++++++++++---------------- src/win/languages/tr-TR.rc | 712 ++++++++++++++++---------------- src/win/languages/uk-UA.rc | 528 ++++++++++++------------ src/win/languages/zh-CN.rc | 712 ++++++++++++++++---------------- src/win/languages/zh-TW.rc | 712 ++++++++++++++++---------------- 21 files changed, 7220 insertions(+), 7220 deletions(-) diff --git a/src/win/languages/cs-CZ.rc b/src/win/languages/cs-CZ.rc index 361a59397..a46700771 100644 --- a/src/win/languages/cs-CZ.rc +++ b/src/win/languages/cs-CZ.rc @@ -17,114 +17,114 @@ MainMenu MENU DISCARDABLE BEGIN POPUP "&Akce" BEGIN - MENUITEM "&Klávesnice vyžaduje záběr", IDM_ACTION_KBD_REQ_CAPTURE - MENUITEM "&Pravý Ctrl je levý Alt", IDM_ACTION_RCTRL_IS_LALT + MENUITEM "&Klávesnice vyžaduje záběr", IDM_ACTION_KBD_REQ_CAPTURE + MENUITEM "&Pravý Ctrl je levý Alt", IDM_ACTION_RCTRL_IS_LALT MENUITEM SEPARATOR - MENUITEM "&Resetovat", IDM_ACTION_HRESET - MENUITEM "&Ctrl+Alt+Del\tCtrl+F12", IDM_ACTION_RESET_CAD + MENUITEM "&Resetovat", IDM_ACTION_HRESET + MENUITEM "&Ctrl+Alt+Del\tCtrl+F12", IDM_ACTION_RESET_CAD MENUITEM SEPARATOR - MENUITEM "Ctrl+Alt+&Esc", IDM_ACTION_CTRL_ALT_ESC + MENUITEM "Ctrl+Alt+&Esc", IDM_ACTION_CTRL_ALT_ESC MENUITEM SEPARATOR - MENUITEM "P&ozastavit", IDM_ACTION_PAUSE + MENUITEM "P&ozastavit", IDM_ACTION_PAUSE MENUITEM SEPARATOR - MENUITEM "&Ukončit", IDM_ACTION_EXIT + MENUITEM "&Ukončit", IDM_ACTION_EXIT END POPUP "&Zobrazení" BEGIN - MENUITEM "&Schovat stavový řádek", IDM_VID_HIDE_STATUS_BAR - MENUITEM "Schovat panel &nástrojů", IDM_VID_HIDE_TOOLBAR + MENUITEM "&Schovat stavový řádek", IDM_VID_HIDE_STATUS_BAR + MENUITEM "Schovat panel &nástrojů", IDM_VID_HIDE_TOOLBAR MENUITEM SEPARATOR - MENUITEM "&Show non-primary monitors", IDM_VID_MONITORS - MENUITEM "&Měnitelná velikost okna", IDM_VID_RESIZE - MENUITEM "&Pamatovat velikost a pozici", IDM_VID_REMEMBER + MENUITEM "&Show non-primary monitors", IDM_VID_MONITORS + MENUITEM "&Měnitelná velikost okna", IDM_VID_RESIZE + MENUITEM "&Pamatovat velikost a pozici", IDM_VID_REMEMBER MENUITEM SEPARATOR POPUP "&Renderer" BEGIN - MENUITEM "&SDL (Software)", IDM_VID_SDL_SW - MENUITEM "SDL (&Hardware)", IDM_VID_SDL_HW - MENUITEM "SDL (&OpenGL)", IDM_VID_SDL_OPENGL - MENUITEM "Open&GL (3.0 Core)", IDM_VID_OPENGL_CORE + MENUITEM "&SDL (Software)", IDM_VID_SDL_SW + MENUITEM "SDL (&Hardware)", IDM_VID_SDL_HW + MENUITEM "SDL (&OpenGL)", IDM_VID_SDL_OPENGL + MENUITEM "Open&GL (3.0 Core)", IDM_VID_OPENGL_CORE #ifdef USE_VNC - MENUITEM "&VNC", IDM_VID_VNC + MENUITEM "&VNC", IDM_VID_VNC #endif END MENUITEM SEPARATOR - MENUITEM "&Zadat velikost...", IDM_VID_SPECIFY_DIM - MENUITEM "&Dodržovat poměr stran 4:3", IDM_VID_FORCE43 + MENUITEM "&Zadat velikost...", IDM_VID_SPECIFY_DIM + MENUITEM "&Dodržovat poměr stran 4:3", IDM_VID_FORCE43 POPUP "&Násobek zvětšení okna" BEGIN - MENUITEM "&0.5x", IDM_VID_SCALE_1X - MENUITEM "&1x", IDM_VID_SCALE_2X - MENUITEM "1.&5x", IDM_VID_SCALE_3X - MENUITEM "&2x", IDM_VID_SCALE_4X - MENUITEM "&3x", IDM_VID_SCALE_5X - MENUITEM "&4x", IDM_VID_SCALE_6X - MENUITEM "&5x", IDM_VID_SCALE_7X - MENUITEM "&6x", IDM_VID_SCALE_8X - MENUITEM "&7x", IDM_VID_SCALE_9X - MENUITEM "&8x", IDM_VID_SCALE_10X + MENUITEM "&0.5x", IDM_VID_SCALE_1X + MENUITEM "&1x", IDM_VID_SCALE_2X + MENUITEM "1.&5x", IDM_VID_SCALE_3X + MENUITEM "&2x", IDM_VID_SCALE_4X + MENUITEM "&3x", IDM_VID_SCALE_5X + MENUITEM "&4x", IDM_VID_SCALE_6X + MENUITEM "&5x", IDM_VID_SCALE_7X + MENUITEM "&6x", IDM_VID_SCALE_8X + MENUITEM "&7x", IDM_VID_SCALE_9X + MENUITEM "&8x", IDM_VID_SCALE_10X END POPUP "Metoda &filtrování" BEGIN - MENUITEM "&Nejbližší", IDM_VID_FILTER_NEAREST - MENUITEM "&Lineární", IDM_VID_FILTER_LINEAR + MENUITEM "&Nejbližší", IDM_VID_FILTER_NEAREST + MENUITEM "&Lineární", IDM_VID_FILTER_LINEAR END - MENUITEM "Š&kálování HiDPI", IDM_VID_HIDPI + MENUITEM "Š&kálování HiDPI", IDM_VID_HIDPI MENUITEM SEPARATOR - MENUITEM "&Celá obrazovka\tCtrl+Alt+PgUp", IDM_VID_FULLSCREEN + MENUITEM "&Celá obrazovka\tCtrl+Alt+PgUp", IDM_VID_FULLSCREEN POPUP "Režím roztá&hnutí při celé obrazovce" BEGIN - MENUITEM "&Roztáhnout", IDM_VID_FS_FULL - MENUITEM "&4:3", IDM_VID_FS_43 - MENUITEM "&Zachovat poměr stran", IDM_VID_FS_KEEPRATIO - MENUITEM "&Celočíselné škálování", IDM_VID_FS_INT + MENUITEM "&Roztáhnout", IDM_VID_FS_FULL + MENUITEM "&4:3", IDM_VID_FS_43 + MENUITEM "&Zachovat poměr stran", IDM_VID_FS_KEEPRATIO + MENUITEM "&Celočíselné škálování", IDM_VID_FS_INT END POPUP "Nastavení pro E&GA a (S)VGA" BEGIN - MENUITEM "&Převrátit barvy", IDM_VID_INVERT + MENUITEM "&Převrátit barvy", IDM_VID_INVERT POPUP "&Typ VGA monitoru" BEGIN - MENUITEM "RGB &barevný", IDM_VID_GRAY_RGB - MENUITEM "&Odstíny šedi", IDM_VID_GRAY_MONO - MENUITEM "&Jantarová obrazovka", IDM_VID_GRAY_AMBER - MENUITEM "&Zelená obrazovka", IDM_VID_GRAY_GREEN - MENUITEM "&Bílá obrazovka", IDM_VID_GRAY_WHITE + MENUITEM "RGB &barevný", IDM_VID_GRAY_RGB + MENUITEM "&Odstíny šedi", IDM_VID_GRAY_MONO + MENUITEM "&Jantarová obrazovka", IDM_VID_GRAY_AMBER + MENUITEM "&Zelená obrazovka", IDM_VID_GRAY_GREEN + MENUITEM "&Bílá obrazovka", IDM_VID_GRAY_WHITE END POPUP "Převod na &odstíny šedi" BEGIN - MENUITEM "BT&601 (NTSC/PAL)", IDM_VID_GRAYCT_601 - MENUITEM "BT&709 (HDTV)", IDM_VID_GRAYCT_709 - MENUITEM "&Průměr", IDM_VID_GRAYCT_AVE + MENUITEM "BT&601 (NTSC/PAL)", IDM_VID_GRAYCT_601 + MENUITEM "BT&709 (HDTV)", IDM_VID_GRAYCT_709 + MENUITEM "&Průměr", IDM_VID_GRAYCT_AVE END END MENUITEM SEPARATOR - MENUITEM "Přesah obrazu CGA/PCjr/Tandy/E&GA/(S)VGA", IDM_VID_OVERSCAN - MENUITEM "&Upravit kontrast černobílé obrazovky", IDM_VID_CGACON + MENUITEM "Přesah obrazu CGA/PCjr/Tandy/E&GA/(S)VGA", IDM_VID_OVERSCAN + MENUITEM "&Upravit kontrast černobílé obrazovky", IDM_VID_CGACON END - MENUITEM "&Média", IDM_MEDIA + MENUITEM "&Média", IDM_MEDIA POPUP "&Nástroje" BEGIN - MENUITEM "&Nastavení...", IDM_CONFIG - MENUITEM "&Aktualizovat ikony stavového řádku", IDM_UPDATE_ICONS + MENUITEM "&Nastavení...", IDM_CONFIG + MENUITEM "&Aktualizovat ikony stavového řádku", IDM_UPDATE_ICONS MENUITEM SEPARATOR - MENUITEM "Pořídit &screenshot\tCtrl+F11", IDM_ACTION_SCREENSHOT + MENUITEM "Pořídit &screenshot\tCtrl+F11", IDM_ACTION_SCREENSHOT MENUITEM SEPARATOR - MENUITEM "&Předvolby...", IDM_PREFERENCES + MENUITEM "&Předvolby...", IDM_PREFERENCES #ifdef DISCORD - MENUITEM "Povolit integraci s &Discordem", IDM_DISCORD + MENUITEM "Povolit integraci s &Discordem", IDM_DISCORD #endif MENUITEM SEPARATOR - MENUITEM "&Zesílení zvuku", IDM_SND_GAIN + MENUITEM "&Zesílení zvuku", IDM_SND_GAIN #ifdef MTR_ENABLED MENUITEM SEPARATOR - MENUITEM "Začít trace\tCtrl+T", IDM_ACTION_BEGIN_TRACE - MENUITEM "Zastavit trace\tCtrl+T", IDM_ACTION_END_TRACE + MENUITEM "Začít trace\tCtrl+T", IDM_ACTION_BEGIN_TRACE + MENUITEM "Zastavit trace\tCtrl+T", IDM_ACTION_END_TRACE #endif END POPUP "Ná&pověda" BEGIN - MENUITEM "&Dokumentace", IDM_DOCS - MENUITEM "&O programu 86Box", IDM_ABOUT + MENUITEM "&Dokumentace", IDM_DOCS + MENUITEM "&O programu 86Box", IDM_ABOUT END END @@ -137,17 +137,17 @@ CassetteSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Nový obraz...", IDM_CASSETTE_IMAGE_NEW + MENUITEM "&Nový obraz...", IDM_CASSETTE_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&Existující obraz...", IDM_CASSETTE_IMAGE_EXISTING - MENUITEM "Existující obraz (&ochrana proti zápisu)...", IDM_CASSETTE_IMAGE_EXISTING_WP + MENUITEM "&Existující obraz...", IDM_CASSETTE_IMAGE_EXISTING + MENUITEM "Existující obraz (&ochrana proti zápisu)...", IDM_CASSETTE_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "&Nahrávat", IDM_CASSETTE_RECORD - MENUITEM "&Přehrát", IDM_CASSETTE_PLAY - MENUITEM "Přetočit na &začátek", IDM_CASSETTE_REWIND - MENUITEM "Přetočit na &konec", IDM_CASSETTE_FAST_FORWARD + MENUITEM "&Nahrávat", IDM_CASSETTE_RECORD + MENUITEM "&Přehrát", IDM_CASSETTE_PLAY + MENUITEM "Přetočit na &začátek", IDM_CASSETTE_REWIND + MENUITEM "Přetočit na &konec", IDM_CASSETTE_FAST_FORWARD MENUITEM SEPARATOR - MENUITEM "&Vyjmout", IDM_CASSETTE_EJECT + MENUITEM "&Vyjmout", IDM_CASSETTE_EJECT END END @@ -155,9 +155,9 @@ CartridgeSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Obraz...", IDM_CARTRIDGE_IMAGE + MENUITEM "&Obraz...", IDM_CARTRIDGE_IMAGE MENUITEM SEPARATOR - MENUITEM "&Vyjmout", IDM_CARTRIDGE_EJECT + MENUITEM "&Vyjmout", IDM_CARTRIDGE_EJECT END END @@ -165,14 +165,14 @@ FloppySubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Nový obraz...", IDM_FLOPPY_IMAGE_NEW + MENUITEM "&Nový obraz...", IDM_FLOPPY_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&Existující obraz...", IDM_FLOPPY_IMAGE_EXISTING - MENUITEM "Existující obraz (&ochrana proti zápisu)...", IDM_FLOPPY_IMAGE_EXISTING_WP + MENUITEM "&Existující obraz...", IDM_FLOPPY_IMAGE_EXISTING + MENUITEM "Existující obraz (&ochrana proti zápisu)...", IDM_FLOPPY_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "E&xportovat do 86F...", IDM_FLOPPY_EXPORT_TO_86F + MENUITEM "E&xportovat do 86F...", IDM_FLOPPY_EXPORT_TO_86F MENUITEM SEPARATOR - MENUITEM "&Vyjmout", IDM_FLOPPY_EJECT + MENUITEM "&Vyjmout", IDM_FLOPPY_EJECT END END @@ -180,13 +180,13 @@ CdromSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Ztišit", IDM_CDROM_MUTE + MENUITEM "&Ztišit", IDM_CDROM_MUTE MENUITEM SEPARATOR - MENUITEM "&Vyjmout", IDM_CDROM_EMPTY - MENUITEM "&Načíst znova předchozí obraz", IDM_CDROM_RELOAD + MENUITEM "&Vyjmout", IDM_CDROM_EMPTY + MENUITEM "&Načíst znova předchozí obraz", IDM_CDROM_RELOAD MENUITEM SEPARATOR - MENUITEM "&Obraz...", IDM_CDROM_IMAGE - MENUITEM "&Složka...", IDM_CDROM_DIR + MENUITEM "&Obraz...", IDM_CDROM_IMAGE + MENUITEM "&Složka...", IDM_CDROM_DIR END END @@ -194,13 +194,13 @@ ZIPSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Nový obraz...", IDM_ZIP_IMAGE_NEW + MENUITEM "&Nový obraz...", IDM_ZIP_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&Existující obraz...", IDM_ZIP_IMAGE_EXISTING - MENUITEM "Existující obraz (&ochrana proti zápisu)...", IDM_ZIP_IMAGE_EXISTING_WP + MENUITEM "&Existující obraz...", IDM_ZIP_IMAGE_EXISTING + MENUITEM "Existující obraz (&ochrana proti zápisu)...", IDM_ZIP_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "&Vyjmout", IDM_ZIP_EJECT - MENUITEM "&Načíst znova předchozí obraz", IDM_ZIP_RELOAD + MENUITEM "&Vyjmout", IDM_ZIP_EJECT + MENUITEM "&Načíst znova předchozí obraz", IDM_ZIP_RELOAD END END @@ -208,13 +208,13 @@ MOSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Nový obraz...", IDM_MO_IMAGE_NEW + MENUITEM "&Nový obraz...", IDM_MO_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&Existující obraz...", IDM_MO_IMAGE_EXISTING - MENUITEM "Existující obraz (&ochrana proti zápisu)...", IDM_MO_IMAGE_EXISTING_WP + MENUITEM "&Existující obraz...", IDM_MO_IMAGE_EXISTING + MENUITEM "Existující obraz (&ochrana proti zápisu)...", IDM_MO_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "&Vyjmout", IDM_MO_EJECT - MENUITEM "&Načíst znova předchozí obraz", IDM_MO_RELOAD + MENUITEM "&Vyjmout", IDM_MO_EJECT + MENUITEM "&Načíst znova předchozí obraz", IDM_MO_RELOAD END END @@ -240,150 +240,150 @@ END // Dialog // -#define STR_PREFERENCES "Předvolby" -#define STR_SND_GAIN "Zesílení zvuku" -#define STR_NEW_FLOPPY "Nový obraz" -#define STR_CONFIG "Nastavení" -#define STR_SPECIFY_DIM "Zadat rozměry hlavního okna" +#define STR_PREFERENCES "Předvolby" +#define STR_SND_GAIN "Zesílení zvuku" +#define STR_NEW_FLOPPY "Nový obraz" +#define STR_CONFIG "Nastavení" +#define STR_SPECIFY_DIM "Zadat rozměry hlavního okna" -#define STR_OK "OK" -#define STR_CANCEL "Storno" -#define STR_GLOBAL "Uložit toto nastavení jako &globální výchozí stav" -#define STR_DEFAULT "&Výchozí" -#define STR_LANGUAGE "Jazyk:" -#define STR_ICONSET "Sada ikon:" +#define STR_OK "OK" +#define STR_CANCEL "Storno" +#define STR_GLOBAL "Uložit toto nastavení jako &globální výchozí stav" +#define STR_DEFAULT "&Výchozí" +#define STR_LANGUAGE "Jazyk:" +#define STR_ICONSET "Sada ikon:" -#define STR_GAIN "Zesílení" +#define STR_GAIN "Zesílení" -#define STR_FILE_NAME "Název souboru:" -#define STR_DISK_SIZE "Velikost disku:" -#define STR_RPM_MODE "Režím ot./m:" -#define STR_PROGRESS "Průběh:" +#define STR_FILE_NAME "Název souboru:" +#define STR_DISK_SIZE "Velikost disku:" +#define STR_RPM_MODE "Režím ot./m:" +#define STR_PROGRESS "Průběh:" -#define STR_WIDTH "Šířka:" -#define STR_HEIGHT "Výška:" -#define STR_LOCK_TO_SIZE "Uzamknout na tyto rozměry" +#define STR_WIDTH "Šířka:" +#define STR_HEIGHT "Výška:" +#define STR_LOCK_TO_SIZE "Uzamknout na tyto rozměry" -#define STR_MACHINE_TYPE "Typ počítače:" -#define STR_MACHINE "Počítač:" -#define STR_CONFIGURE "Nastavit" -#define STR_CPU_TYPE "Procesor:" -#define STR_CPU_SPEED "Rychlost:" -#define STR_FPU "Koprocesor:" -#define STR_WAIT_STATES "Čekací stavy:" -#define STR_MB "MB" -#define STR_MEMORY "Pamět:" -#define STR_TIME_SYNC "Synchronizace času" -#define STR_DISABLED "Vypnuta" -#define STR_ENABLED_LOCAL "Zapnuta (místní čas)" -#define STR_ENABLED_UTC "Zapnuta (UTC)" -#define STR_DYNAREC "Dynamický překladač" +#define STR_MACHINE_TYPE "Typ počítače:" +#define STR_MACHINE "Počítač:" +#define STR_CONFIGURE "Nastavit" +#define STR_CPU_TYPE "Procesor:" +#define STR_CPU_SPEED "Rychlost:" +#define STR_FPU "Koprocesor:" +#define STR_WAIT_STATES "Čekací stavy:" +#define STR_MB "MB" +#define STR_MEMORY "Pamět:" +#define STR_TIME_SYNC "Synchronizace času" +#define STR_DISABLED "Vypnuta" +#define STR_ENABLED_LOCAL "Zapnuta (místní čas)" +#define STR_ENABLED_UTC "Zapnuta (UTC)" +#define STR_DYNAREC "Dynamický překladač" -#define STR_VIDEO "Grafika:" -#define STR_VIDEO_2 "Grafika 2:" -#define STR_VOODOO "Použít grafický akcelerátor Voodoo" -#define STR_IBM8514 "Grafika IBM 8514/a" -#define STR_XGA "Grafika XGA" +#define STR_VIDEO "Grafika:" +#define STR_VIDEO_2 "Grafika 2:" +#define STR_VOODOO "Použít grafický akcelerátor Voodoo" +#define STR_IBM8514 "Grafika IBM 8514/a" +#define STR_XGA "Grafika XGA" -#define STR_MOUSE "Myš:" -#define STR_JOYSTICK "Joystick:" -#define STR_JOY1 "Joystick 1..." -#define STR_JOY2 "Joystick 2..." -#define STR_JOY3 "Joystick 3..." -#define STR_JOY4 "Joystick 4..." +#define STR_MOUSE "Myš:" +#define STR_JOYSTICK "Joystick:" +#define STR_JOY1 "Joystick 1..." +#define STR_JOY2 "Joystick 2..." +#define STR_JOY3 "Joystick 3..." +#define STR_JOY4 "Joystick 4..." -#define STR_SOUND1 "Zvuková karta 1:" -#define STR_SOUND2 "Zvuková karta 2:" -#define STR_SOUND3 "Zvuková karta 3:" -#define STR_SOUND4 "Zvuková karta 4:" -#define STR_MIDI_OUT "MIDI výstup:" -#define STR_MIDI_IN "MIDI vstup:" -#define STR_MPU401 "Samostatný MPU-401" -#define STR_FLOAT "Použít zvuk FLOAT32" -#define STR_FM_DRIVER "FM synth driver" -#define STR_FM_DRV_NUKED "Nuked (přesnější)" -#define STR_FM_DRV_YMFM "YMFM (rychlejší)" +#define STR_SOUND1 "Zvuková karta 1:" +#define STR_SOUND2 "Zvuková karta 2:" +#define STR_SOUND3 "Zvuková karta 3:" +#define STR_SOUND4 "Zvuková karta 4:" +#define STR_MIDI_OUT "MIDI výstup:" +#define STR_MIDI_IN "MIDI vstup:" +#define STR_MPU401 "Samostatný MPU-401" +#define STR_FLOAT "Použít zvuk FLOAT32" +#define STR_FM_DRIVER "FM synth driver" +#define STR_FM_DRV_NUKED "Nuked (přesnější)" +#define STR_FM_DRV_YMFM "YMFM (rychlejší)" -#define STR_NET_TYPE "Druh sítě:" -#define STR_PCAP "PCap zařízení:" -#define STR_NET "Síťový adaptér:" -#define STR_NET1 "Network card 1:" -#define STR_NET2 "Network card 2:" -#define STR_NET3 "Network card 3:" -#define STR_NET4 "Network card 4:" +#define STR_NET_TYPE "Druh sítě:" +#define STR_PCAP "PCap zařízení:" +#define STR_NET "Síťový adaptér:" +#define STR_NET1 "Network card 1:" +#define STR_NET2 "Network card 2:" +#define STR_NET3 "Network card 3:" +#define STR_NET4 "Network card 4:" -#define STR_COM1 "Zařízení na COM1:" -#define STR_COM2 "Zařízení na COM2:" -#define STR_COM3 "Zařízení na COM3:" -#define STR_COM4 "Zařízení na COM4:" -#define STR_LPT1 "Zařízení na LPT1:" -#define STR_LPT2 "Zařízení na LPT2:" -#define STR_LPT3 "Zařízení na LPT3:" -#define STR_LPT4 "Zařízení na LPT4:" -#define STR_SERIAL1 "Povolit port COM1" -#define STR_SERIAL2 "Povolit port COM2" -#define STR_SERIAL3 "Povolit port COM3" -#define STR_SERIAL4 "Povolit port COM4" -#define STR_PARALLEL1 "Povolit port LPT1" -#define STR_PARALLEL2 "Povolit port LPT2" -#define STR_PARALLEL3 "Povolit port LPT3" -#define STR_PARALLEL4 "Povolit port LPT4" -#define STR_SERIAL_PASS1 "Serial port passthrough 1" -#define STR_SERIAL_PASS2 "Serial port passthrough 2" -#define STR_SERIAL_PASS3 "Serial port passthrough 3" -#define STR_SERIAL_PASS4 "Serial port passthrough 4" +#define STR_COM1 "Zařízení na COM1:" +#define STR_COM2 "Zařízení na COM2:" +#define STR_COM3 "Zařízení na COM3:" +#define STR_COM4 "Zařízení na COM4:" +#define STR_LPT1 "Zařízení na LPT1:" +#define STR_LPT2 "Zařízení na LPT2:" +#define STR_LPT3 "Zařízení na LPT3:" +#define STR_LPT4 "Zařízení na LPT4:" +#define STR_SERIAL1 "Povolit port COM1" +#define STR_SERIAL2 "Povolit port COM2" +#define STR_SERIAL3 "Povolit port COM3" +#define STR_SERIAL4 "Povolit port COM4" +#define STR_PARALLEL1 "Povolit port LPT1" +#define STR_PARALLEL2 "Povolit port LPT2" +#define STR_PARALLEL3 "Povolit port LPT3" +#define STR_PARALLEL4 "Povolit port LPT4" +#define STR_SERIAL_PASS1 "Serial port passthrough 1" +#define STR_SERIAL_PASS2 "Serial port passthrough 2" +#define STR_SERIAL_PASS3 "Serial port passthrough 3" +#define STR_SERIAL_PASS4 "Serial port passthrough 4" -#define STR_HDC "Řadič disku:" -#define STR_FDC "Disketový řadič:" -#define STR_IDE_TER "Třetí řadič IDE" -#define STR_IDE_QUA "Čtvrtý řadič IDE" -#define STR_SCSI "SCSI" -#define STR_SCSI_1 "Řadič 1:" -#define STR_SCSI_2 "Řadič 2:" -#define STR_SCSI_3 "Řadič 3:" -#define STR_SCSI_4 "Řadič 4:" -#define STR_CASSETTE "Kazeta" +#define STR_HDC "Řadič disku:" +#define STR_FDC "Disketový řadič:" +#define STR_IDE_TER "Třetí řadič IDE" +#define STR_IDE_QUA "Čtvrtý řadič IDE" +#define STR_SCSI "SCSI" +#define STR_SCSI_1 "Řadič 1:" +#define STR_SCSI_2 "Řadič 2:" +#define STR_SCSI_3 "Řadič 3:" +#define STR_SCSI_4 "Řadič 4:" +#define STR_CASSETTE "Kazeta" -#define STR_HDD "Pevné disky:" -#define STR_NEW "&Nový..." -#define STR_EXISTING "&Existující..." -#define STR_REMOVE "&Odebrat" -#define STR_BUS "Sběrnice:" -#define STR_CHANNEL "Kanál:" -#define STR_ID "ID:" -#define STR_SPEED "Speed:" +#define STR_HDD "Pevné disky:" +#define STR_NEW "&Nový..." +#define STR_EXISTING "&Existující..." +#define STR_REMOVE "&Odebrat" +#define STR_BUS "Sběrnice:" +#define STR_CHANNEL "Kanál:" +#define STR_ID "ID:" +#define STR_SPEED "Speed:" -#define STR_SPECIFY "&Zadat..." -#define STR_SECTORS "Sektory:" -#define STR_HEADS "Hlavy:" -#define STR_CYLS "Cylindry:" -#define STR_SIZE_MB "Velikost (MB):" -#define STR_TYPE "Typ:" -#define STR_IMG_FORMAT "Formát obrazu:" -#define STR_BLOCK_SIZE "Velikost bloků:" +#define STR_SPECIFY "&Zadat..." +#define STR_SECTORS "Sektory:" +#define STR_HEADS "Hlavy:" +#define STR_CYLS "Cylindry:" +#define STR_SIZE_MB "Velikost (MB):" +#define STR_TYPE "Typ:" +#define STR_IMG_FORMAT "Formát obrazu:" +#define STR_BLOCK_SIZE "Velikost bloků:" -#define STR_FLOPPY_DRIVES "Disketové mechaniky:" -#define STR_TURBO "Turbo časování" -#define STR_CHECKBPB "Kontrola BPB" -#define STR_CDROM_DRIVES "Mechaniky CD-ROM:" -#define STR_CD_SPEED "Rychlost:" -#define STR_EARLY "Časná mechanika" +#define STR_FLOPPY_DRIVES "Disketové mechaniky:" +#define STR_TURBO "Turbo časování" +#define STR_CHECKBPB "Kontrola BPB" +#define STR_CDROM_DRIVES "Mechaniky CD-ROM:" +#define STR_CD_SPEED "Rychlost:" +#define STR_EARLY "Časná mechanika" -#define STR_MO_DRIVES "Magnetooptické mechaniky:" -#define STR_ZIP_DRIVES "Mechaniky ZIP:" -#define STR_250 "ZIP 250" +#define STR_MO_DRIVES "Magnetooptické mechaniky:" +#define STR_ZIP_DRIVES "Mechaniky ZIP:" +#define STR_250 "ZIP 250" -#define STR_ISARTC "ISA hodiny:" -#define STR_ISAMEM "ISA rozšíření paměti" -#define STR_ISAMEM_1 "Karta 1:" -#define STR_ISAMEM_2 "Karta 2:" -#define STR_ISAMEM_3 "Karta 3:" -#define STR_ISAMEM_4 "Karta 4:" -#define STR_BUGGER "Zařízení ISABugger" -#define STR_POSTCARD "Karta pro kódy POST" +#define STR_ISARTC "ISA hodiny:" +#define STR_ISAMEM "ISA rozšíření paměti" +#define STR_ISAMEM_1 "Karta 1:" +#define STR_ISAMEM_2 "Karta 2:" +#define STR_ISAMEM_3 "Karta 3:" +#define STR_ISAMEM_4 "Karta 4:" +#define STR_BUGGER "Zařízení ISABugger" +#define STR_POSTCARD "Karta pro kódy POST" -#define FONT_SIZE 9 -#define FONT_NAME "Segoe UI" +#define FONT_SIZE 9 +#define FONT_NAME "Segoe UI" #include "dialogs.rc" @@ -394,149 +394,149 @@ END STRINGTABLE DISCARDABLE BEGIN - 2048 "86Box" - IDS_2049 "Chyba" - IDS_2050 "Kritická chyba" - IDS_2051 " - PAUSED" - IDS_2052 "Stiskněte Ctrl+Alt+PgDn pro návrat z režimu celé obrazovky." - IDS_2053 "Rychlost" - IDS_2054 "ZIP %03i %i (%s): %ls" - IDS_2055 "Obrazy ZIP disků (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" - IDS_2056 "86Box nenalezl žádné použitelné image pamětí ROM.\n\nStáhněte sadu obrazů ROM a extrahujte ji do složky ""roms""." - IDS_2057 "(prázdné)" - IDS_2058 "Obrazy ZIP disků (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0All files (*.*)\0*.*\0" - IDS_2059 "Turbo" - IDS_2060 "Zap." - IDS_2061 "Vyp." - IDS_2062 "Všechny obrazy disků (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0Základní sektorové obrazy (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Obrazy povrchu (*.86F)\0*.86F\0" - IDS_2063 "Počítač ""%hs"" není dostupný, jelikož chybí obraz jeho paměti ROM ve složce ""roms/machines"". Konfigurace se přepne na jiný dostupný počítač." + 2048 "86Box" + IDS_2049 "Chyba" + IDS_2050 "Kritická chyba" + IDS_2051 " - PAUSED" + IDS_2052 "Stiskněte Ctrl+Alt+PgDn pro návrat z režimu celé obrazovky." + IDS_2053 "Rychlost" + IDS_2054 "ZIP %03i %i (%s): %ls" + IDS_2055 "Obrazy ZIP disků (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" + IDS_2056 "86Box nenalezl žádné použitelné image pamětí ROM.\n\nStáhněte sadu obrazů ROM a extrahujte ji do složky ""roms""." + IDS_2057 "(prázdné)" + IDS_2058 "Obrazy ZIP disků (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0All files (*.*)\0*.*\0" + IDS_2059 "Turbo" + IDS_2060 "Zap." + IDS_2061 "Vyp." + IDS_2062 "Všechny obrazy disků (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0Základní sektorové obrazy (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Obrazy povrchu (*.86F)\0*.86F\0" + IDS_2063 "Počítač ""%hs"" není dostupný, jelikož chybí obraz jeho paměti ROM ve složce ""roms/machines"". Konfigurace se přepne na jiný dostupný počítač." END STRINGTABLE DISCARDABLE BEGIN - IDS_2064 "Video adaptér ""%hs"" není dostupný, jelikož chybí obraz jeho paměti ROM ve složce ""roms/video"". Konfigurace se přepne na jiný dostupný adaptér." - IDS_2065 "Počítač" - IDS_2066 "Obraz" - IDS_2067 "Vstupní zařízení" - IDS_2068 "Zvuk" - IDS_2069 "Síť" - IDS_2070 "COM a LPT porty" - IDS_2071 "Řadiče úložiště" - IDS_2072 "Pevné disky" - IDS_2073 "Disketové a CD-ROM mechaniky" - IDS_2074 "Další vyměnitelná zařízení" - IDS_2075 "Jiné příslušenství" - IDS_2076 "Obrazy povrchu (*.86F)\0*.86F\0" - IDS_2077 "Klikněte pro zabraní myši" - IDS_2078 "Stiskněte F8+F12 pro uvolnění myši" - IDS_2079 "Stiskněte F8+F12 nebo prostřední tlačítko pro uvolnění myši" + IDS_2064 "Video adaptér ""%hs"" není dostupný, jelikož chybí obraz jeho paměti ROM ve složce ""roms/video"". Konfigurace se přepne na jiný dostupný adaptér." + IDS_2065 "Počítač" + IDS_2066 "Obraz" + IDS_2067 "Vstupní zařízení" + IDS_2068 "Zvuk" + IDS_2069 "Síť" + IDS_2070 "COM a LPT porty" + IDS_2071 "Řadiče úložiště" + IDS_2072 "Pevné disky" + IDS_2073 "Disketové a CD-ROM mechaniky" + IDS_2074 "Další vyměnitelná zařízení" + IDS_2075 "Jiné příslušenství" + IDS_2076 "Obrazy povrchu (*.86F)\0*.86F\0" + IDS_2077 "Klikněte pro zabraní myši" + IDS_2078 "Stiskněte F8+F12 pro uvolnění myši" + IDS_2079 "Stiskněte F8+F12 nebo prostřední tlačítko pro uvolnění myši" END STRINGTABLE DISCARDABLE BEGIN - IDS_2080 "Nastala chyba při inicializaci knihovny FluidSynth." - IDS_2081 "Sběrnice" - IDS_2082 "Soubor" - IDS_2083 "C" - IDS_2084 "H" - IDS_2085 "S" - IDS_2086 "MB" + IDS_2080 "Nastala chyba při inicializaci knihovny FluidSynth." + IDS_2081 "Sběrnice" + IDS_2082 "Soubor" + IDS_2083 "C" + IDS_2084 "H" + IDS_2085 "S" + IDS_2086 "MB" IDS_2087 "Speed" - IDS_2088 "Kontrola BPB" - IDS_2089 "KB" - IDS_2090 "Nastala chyba při inicializaci video rendereru." - IDS_2091 "Výchozí" - IDS_2092 "%i čekací stav(y)" - IDS_2093 "Typ" - IDS_2094 "Nastala chyba při inicializaci knihovny PCap" - IDS_2095 "Nebyla nalezena žádná PCap zařízení" - IDS_2096 "Neplatné PCap zařízení" - IDS_2097 "Standardní 2tlačítkový joystick" - IDS_2098 "Standardní 4tlačítkový joystick" - IDS_2099 "Standardní 6tlačítkový joystick" - IDS_2100 "Standardní 8tlačítkový joystick" - IDS_2101 "CH Flightstick Pro" - IDS_2102 "Microsoft SideWinder Pad" - IDS_2103 "Thrustmaster Flight Control System" - IDS_2104 "Žadné" - IDS_2105 "Nebylo možné nahrát klávesnicové zkratky." - IDS_2106 "Nebylo možné zaregistrovat raw input." - IDS_2107 "%u" - IDS_2108 "%u MB (CHS: %i, %i, %i)" - IDS_2109 "Disketová mechanika %i (%s): %ls" - IDS_2110 "Všechny obrazy (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Rozšířené sektorové obrazy (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Základní sektorové obrazy (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Obrazy magnetického toku (*.FDI)\0*.FDI\0Obrazy povrchu (*.86F;*.MFM)\0*.86F;*.MFM\0Všechny soubory (*.*)\0*.*\0" - IDS_2111 "Nastala chyba při inicializaci knihovny FreeType" - IDS_2112 "Nastala chyba při inicializaci knihovny SDL, je potřeba SDL2.dll" - IDS_2113 "Opravdu chcete resetovat emulovaný počítač?" - IDS_2114 "Opravdu chcete ukončit 86Box?" - IDS_2115 "Nastala chyba při inicializaci knihovny Ghostscript" - IDS_2116 "MO %i (%ls): %ls" - IDS_2117 "Obrazy MO (*.IM?;*.MDI)\0*.IM?;*.MDI\0Všechny soubory (*.*)\0*.*\0" - IDS_2118 "Vítejte v programu 86Box!" - IDS_2119 "Vestavěný řadič" - IDS_2120 "Ukončit" - IDS_2121 "Nebyly nalezeny žádné obrazy ROM" - IDS_2122 "Chcete uložit nastavení?" - IDS_2123 "Pokračováním se resetuje emulovaný počítač." - IDS_2124 "Uložit" - IDS_2125 "O programu 86Box" - IDS_2126 "86Box v" EMU_VERSION + IDS_2088 "Kontrola BPB" + IDS_2089 "KB" + IDS_2090 "Nastala chyba při inicializaci video rendereru." + IDS_2091 "Výchozí" + IDS_2092 "%i čekací stav(y)" + IDS_2093 "Typ" + IDS_2094 "Nastala chyba při inicializaci knihovny PCap" + IDS_2095 "Nebyla nalezena žádná PCap zařízení" + IDS_2096 "Neplatné PCap zařízení" + IDS_2097 "Standardní 2tlačítkový joystick" + IDS_2098 "Standardní 4tlačítkový joystick" + IDS_2099 "Standardní 6tlačítkový joystick" + IDS_2100 "Standardní 8tlačítkový joystick" + IDS_2101 "CH Flightstick Pro" + IDS_2102 "Microsoft SideWinder Pad" + IDS_2103 "Thrustmaster Flight Control System" + IDS_2104 "Žadné" + IDS_2105 "Nebylo možné nahrát klávesnicové zkratky." + IDS_2106 "Nebylo možné zaregistrovat raw input." + IDS_2107 "%u" + IDS_2108 "%u MB (CHS: %i, %i, %i)" + IDS_2109 "Disketová mechanika %i (%s): %ls" + IDS_2110 "Všechny obrazy (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Rozšířené sektorové obrazy (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Základní sektorové obrazy (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Obrazy magnetického toku (*.FDI)\0*.FDI\0Obrazy povrchu (*.86F;*.MFM)\0*.86F;*.MFM\0Všechny soubory (*.*)\0*.*\0" + IDS_2111 "Nastala chyba při inicializaci knihovny FreeType" + IDS_2112 "Nastala chyba při inicializaci knihovny SDL, je potřeba SDL2.dll" + IDS_2113 "Opravdu chcete resetovat emulovaný počítač?" + IDS_2114 "Opravdu chcete ukončit 86Box?" + IDS_2115 "Nastala chyba při inicializaci knihovny Ghostscript" + IDS_2116 "MO %i (%ls): %ls" + IDS_2117 "Obrazy MO (*.IM?;*.MDI)\0*.IM?;*.MDI\0Všechny soubory (*.*)\0*.*\0" + IDS_2118 "Vítejte v programu 86Box!" + IDS_2119 "Vestavěný řadič" + IDS_2120 "Ukončit" + IDS_2121 "Nebyly nalezeny žádné obrazy ROM" + IDS_2122 "Chcete uložit nastavení?" + IDS_2123 "Pokračováním se resetuje emulovaný počítač." + IDS_2124 "Uložit" + IDS_2125 "O programu 86Box" + IDS_2126 "86Box v" EMU_VERSION - IDS_2127 "Emulátor starých počítačů\n\nAutoři: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, Tiseno100, reenigne, leilei, JohnElliott, greatpsycho, and others.\n\nZveřejněno pod licencí GNU General Public License verze 2 nebo novější. Viz soubor LICENSE pro více informací." - IDS_2128 "OK" - IDS_2129 "Hardware není dostupný" + IDS_2127 "Emulátor starých počítačů\n\nAutoři: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, Tiseno100, reenigne, leilei, JohnElliott, greatpsycho, and others.\n\nZveřejněno pod licencí GNU General Public License verze 2 nebo novější. Viz soubor LICENSE pro více informací." + IDS_2128 "OK" + IDS_2129 "Hardware není dostupný" #ifdef _WIN32 #define LIB_NAME_PCAP "WinPcap" #else #define LIB_NAME_PCAP "libpcap" #endif - IDS_2130 "Ujistěte se, že je nainstalován " LIB_NAME_PCAP " a používáte síťové připojení s ním kompatibilní." - IDS_2131 "Neplatná konfigurace" + IDS_2130 "Ujistěte se, že je nainstalován " LIB_NAME_PCAP " a používáte síťové připojení s ním kompatibilní." + IDS_2131 "Neplatná konfigurace" #ifdef _WIN32 #define LIB_NAME_FREETYPE "freetype.dll" #else #define LIB_NAME_FREETYPE "libfreetype" #endif - IDS_2132 LIB_NAME_FREETYPE " je potřeba pro emulaci ESC/P tiskáren." + IDS_2132 LIB_NAME_FREETYPE " je potřeba pro emulaci ESC/P tiskáren." #ifdef _WIN32 #define LIB_NAME_GS "gsdll32.dll" #else #define LIB_NAME_GS "libgs" #endif - IDS_2133 LIB_NAME_GS " je potřeba pro automatický převod PostScript dokumentů do PDF.\n\nJakékoliv dokumenty vytisknuté přes obecnou PostScriptovou tiskárnu budou uloženy jako PostScript (.ps) soubory." + IDS_2133 LIB_NAME_GS " je potřeba pro automatický převod PostScript dokumentů do PDF.\n\nJakékoliv dokumenty vytisknuté přes obecnou PostScriptovou tiskárnu budou uloženy jako PostScript (.ps) soubory." #ifdef _WIN32 #define LIB_NAME_FLUIDSYNTH "libfluidsynth.dll" #else #define LIB_NAME_FLUIDSYNTH "libfluidsynth" #endif - IDS_2134 LIB_NAME_FLUIDSYNTH " je potřeba pro MIDI výstup přes knihovnu FluidSynth." - IDS_2135 "Vstup do režimu celé obrazovky" - IDS_2136 "Nezobrazovat dále tuto zprávu" - IDS_2137 "Neukončovat" - IDS_2138 "Resetovat" - IDS_2139 "Neresetovat" - IDS_2140 "Obraz magnetooptického disku (*.IM?;*.MDI)\0*.IM?;*.MDI\0Všechny soubory (*.*)\0*.*\0" - IDS_2141 "Obraz CD-ROM disku (*.ISO;*.CUE)\0*.ISO;*.CUE\0Všechny soubory (*.*)\0*.*\0" - IDS_2142 "Konfigurace zařízení %hs" + IDS_2134 LIB_NAME_FLUIDSYNTH " je potřeba pro MIDI výstup přes knihovnu FluidSynth." + IDS_2135 "Vstup do režimu celé obrazovky" + IDS_2136 "Nezobrazovat dále tuto zprávu" + IDS_2137 "Neukončovat" + IDS_2138 "Resetovat" + IDS_2139 "Neresetovat" + IDS_2140 "Obraz magnetooptického disku (*.IM?;*.MDI)\0*.IM?;*.MDI\0Všechny soubory (*.*)\0*.*\0" + IDS_2141 "Obraz CD-ROM disku (*.ISO;*.CUE)\0*.ISO;*.CUE\0Všechny soubory (*.*)\0*.*\0" + IDS_2142 "Konfigurace zařízení %hs" IDS_2143 "Monitor je v režimu spánku" - IDS_2144 "Shadery OpenGL (*.GLSL)\0*.GLSL\0All files (*.*)\0*.*\0" - IDS_2145 "Možnosti OpenGL" - IDS_2146 "Pokoušíte se spustit nepodporovanou konfiguraci" - IDS_2147 "Pro tuto konfiguraci bylo vypnuto filtrování procesorů podle zvoleného počítače.\n\nToto umožňuje zvolit procesor, který by jinak se zvoleným počítačem nebyl kompatibilní. Můžou však nastat potíže s BIOSem nebo jiným softwarem.\n\nPovolení tohoto nastavení není oficiálně podporováno a jakákoliv hlášení o chybách mohou být uzavřeny jako neplatné." - IDS_2148 "Pokračovat" - IDS_2149 "Kazeta: %s" - IDS_2150 "Kazetové nahrávky (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Všechny soubory (*.*)\0*.*\0" - IDS_2151 "Cartridge %i: %ls" - IDS_2152 "Obrazy cartridge (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Všechny soubory (*.*)\0*.*\0" - IDS_2153 "Error initializing renderer" - IDS_2154 "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." - IDS_2155 "Obnovit" - IDS_2156 "Pozastavit" - IDS_2157 "Stisknout Ctrl+Alt+Delete" - IDS_2158 "Stisknout Ctrl+Alt+Esc" - IDS_2159 "Resetovat" - IDS_2160 "Vypnout skrze rozhraní ACPI" - IDS_2161 "Nastavení" + IDS_2144 "Shadery OpenGL (*.GLSL)\0*.GLSL\0All files (*.*)\0*.*\0" + IDS_2145 "Možnosti OpenGL" + IDS_2146 "Pokoušíte se spustit nepodporovanou konfiguraci" + IDS_2147 "Pro tuto konfiguraci bylo vypnuto filtrování procesorů podle zvoleného počítače.\n\nToto umožňuje zvolit procesor, který by jinak se zvoleným počítačem nebyl kompatibilní. Můžou však nastat potíže s BIOSem nebo jiným softwarem.\n\nPovolení tohoto nastavení není oficiálně podporováno a jakákoliv hlášení o chybách mohou být uzavřeny jako neplatné." + IDS_2148 "Pokračovat" + IDS_2149 "Kazeta: %s" + IDS_2150 "Kazetové nahrávky (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Všechny soubory (*.*)\0*.*\0" + IDS_2151 "Cartridge %i: %ls" + IDS_2152 "Obrazy cartridge (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Všechny soubory (*.*)\0*.*\0" + IDS_2153 "Error initializing renderer" + IDS_2154 "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." + IDS_2155 "Obnovit" + IDS_2156 "Pozastavit" + IDS_2157 "Stisknout Ctrl+Alt+Delete" + IDS_2158 "Stisknout Ctrl+Alt+Esc" + IDS_2159 "Resetovat" + IDS_2160 "Vypnout skrze rozhraní ACPI" + IDS_2161 "Nastavení" IDS_2162 "Časná mechanika" IDS_2163 "No Dynarec" IDS_2164 "Old Dynarec" @@ -547,45 +547,45 @@ END STRINGTABLE DISCARDABLE BEGIN IDS_4096 "Pevný disk (%s)" - IDS_4097 "%01i:%01i" - IDS_4098 "%01i" - IDS_4099 "CD-ROM mechaniky pro rozhraní MFM/RLL nebo ESDI nikdy neexistovaly" - IDS_4100 "Vlastní..." - IDS_4101 "Vlastní (velký)..." - IDS_4102 "Přidat nový pevný disk" - IDS_4103 "Přidat existující pevný disk" - IDS_4104 "Obraz disku formátu HDI nemůžou být větší než 4 GB." - IDS_4105 "Obraz disku nemůžou být větší než 127 GB." - IDS_4106 "Obrazy pevného disku (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0Všechny soubory (*.*)\0*.*\0" - IDS_4107 "Nebylo možné přečíst soubor" - IDS_4108 "Nebylo možné zapisovat do souboru" - IDS_4109 "Obraz disku ve formátu HDI nebo HDX s velikostí sektoru jinou než 512 bajtů nejsou podporovány." - IDS_4110 "USB zatím není podporováno." - IDS_4111 "Soubor obrazu disku již existuje" - IDS_4112 "Zadejte platný název souboru." - IDS_4113 "Obraz disku byl vytvořen" - IDS_4114 "Ujistěte se, že soubor existuje a lze jej přečíst." - IDS_4115 "Ujistěte se, že se do složky, kde se má soubor uložit, dá zapisovat." - IDS_4116 "Obraz disku je příliš velký" - IDS_4117 "Nezapomeňte nově vytvořený disk rozdělit a naformátovat." - IDS_4118 "Zvolený soubor bude přepsán. Opravdu jej chcete použít?" - IDS_4119 "Nepodporovaný obraz disku" - IDS_4120 "Přepsat" - IDS_4121 "Nepřepisovat" - IDS_4122 "Surový obraz (.img)" - IDS_4123 "HDI obraz (.hdi)" - IDS_4124 "HDX obraz (.hdx)" - IDS_4125 "VHD s pevnou velikostí (.vhd)" - IDS_4126 "VHD s dynamickou velikostí (.vhd)" - IDS_4127 "Rozdílový VHD (.vhd)" - IDS_4128 "Velké bloky (2 MB)" - IDS_4129 "Malé bloky (512 KB)" - IDS_4130 "Soubory VHD (*.VHD)\0*.VHD\0Všechny soubory (*.*)\0*.*\0" - IDS_4131 "Vyberte nadřazený virtuální disk" - IDS_4132 "To může znamenat, že se obsahy nadřazeného disku změnily po vytvoření rozdílového disku.\n\nTato chyba také může nastat, pokud byl obraz disku kopírován nebo přesunut, nebo kvůli chybě v programu, který jej vytvořil.\n\nChcete časová razítka opravit?" - IDS_4133 "Časová razítka nadřazeného a podřazeného disku nesouhlasí" - IDS_4134 "Nebylo možné opravit časové razítko VHD." - IDS_4135 "%01i:%02i" + IDS_4097 "%01i:%01i" + IDS_4098 "%01i" + IDS_4099 "CD-ROM mechaniky pro rozhraní MFM/RLL nebo ESDI nikdy neexistovaly" + IDS_4100 "Vlastní..." + IDS_4101 "Vlastní (velký)..." + IDS_4102 "Přidat nový pevný disk" + IDS_4103 "Přidat existující pevný disk" + IDS_4104 "Obraz disku formátu HDI nemůžou být větší než 4 GB." + IDS_4105 "Obraz disku nemůžou být větší než 127 GB." + IDS_4106 "Obrazy pevného disku (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0Všechny soubory (*.*)\0*.*\0" + IDS_4107 "Nebylo možné přečíst soubor" + IDS_4108 "Nebylo možné zapisovat do souboru" + IDS_4109 "Obraz disku ve formátu HDI nebo HDX s velikostí sektoru jinou než 512 bajtů nejsou podporovány." + IDS_4110 "USB zatím není podporováno." + IDS_4111 "Soubor obrazu disku již existuje" + IDS_4112 "Zadejte platný název souboru." + IDS_4113 "Obraz disku byl vytvořen" + IDS_4114 "Ujistěte se, že soubor existuje a lze jej přečíst." + IDS_4115 "Ujistěte se, že se do složky, kde se má soubor uložit, dá zapisovat." + IDS_4116 "Obraz disku je příliš velký" + IDS_4117 "Nezapomeňte nově vytvořený disk rozdělit a naformátovat." + IDS_4118 "Zvolený soubor bude přepsán. Opravdu jej chcete použít?" + IDS_4119 "Nepodporovaný obraz disku" + IDS_4120 "Přepsat" + IDS_4121 "Nepřepisovat" + IDS_4122 "Surový obraz (.img)" + IDS_4123 "HDI obraz (.hdi)" + IDS_4124 "HDX obraz (.hdx)" + IDS_4125 "VHD s pevnou velikostí (.vhd)" + IDS_4126 "VHD s dynamickou velikostí (.vhd)" + IDS_4127 "Rozdílový VHD (.vhd)" + IDS_4128 "Velké bloky (2 MB)" + IDS_4129 "Malé bloky (512 KB)" + IDS_4130 "Soubory VHD (*.VHD)\0*.VHD\0Všechny soubory (*.*)\0*.*\0" + IDS_4131 "Vyberte nadřazený virtuální disk" + IDS_4132 "To může znamenat, že se obsahy nadřazeného disku změnily po vytvoření rozdílového disku.\n\nTato chyba také může nastat, pokud byl obraz disku kopírován nebo přesunut, nebo kvůli chybě v programu, který jej vytvořil.\n\nChcete časová razítka opravit?" + IDS_4133 "Časová razítka nadřazeného a podřazeného disku nesouhlasí" + IDS_4134 "Nebylo možné opravit časové razítko VHD." + IDS_4135 "%01i:%02i" IDS_4352 "MFM/RLL" IDS_4353 "XTA" @@ -594,56 +594,56 @@ BEGIN IDS_4356 "ATAPI" IDS_4357 "SCSI" - IDS_4608 "MFM/RLL (%01i:%01i)" - IDS_4609 "XTA (%01i:%01i)" - IDS_4610 "ESDI (%01i:%01i)" - IDS_4611 "IDE (%01i:%01i)" - IDS_4612 "ATAPI (%01i:%01i)" - IDS_4613 "SCSI (%01i:%02i)" + IDS_4608 "MFM/RLL (%01i:%01i)" + IDS_4609 "XTA (%01i:%01i)" + IDS_4610 "ESDI (%01i:%01i)" + IDS_4611 "IDE (%01i:%01i)" + IDS_4612 "ATAPI (%01i:%01i)" + IDS_4613 "SCSI (%01i:%02i)" - IDS_5120 "CD-ROM %i (%s): %s" + IDS_5120 "CD-ROM %i (%s): %s" - IDS_5376 "Vypnuto" - IDS_5381 "ATAPI" + IDS_5376 "Vypnuto" + IDS_5381 "ATAPI" IDS_5382 "SCSI" - IDS_5632 "Vypnuto" - IDS_5637 "ATAPI (%01i:%01i)" + IDS_5632 "Vypnuto" + IDS_5637 "ATAPI (%01i:%01i)" IDS_5638 "SCSI (%01i:%02i)" - IDS_5888 "160 kB" - IDS_5889 "180 kB" - IDS_5890 "320 kB" - IDS_5891 "360 kB" - IDS_5892 "640 kB" - IDS_5893 "720 kB" - IDS_5894 "1.2 MB" - IDS_5895 "1.25 MB" - IDS_5896 "1.44 MB" - IDS_5897 "DMF (cluster 1024)" - IDS_5898 "DMF (cluster 2048)" - IDS_5899 "2.88 MB" - IDS_5900 "ZIP 100" - IDS_5901 "ZIP 250" - IDS_5902 "3.5"" 128 MB (ISO 10090)" - IDS_5903 "3.5"" 230 MB (ISO 13963)" - IDS_5904 "3.5"" 540 MB (ISO 15498)" - IDS_5905 "3.5"" 640 MB (ISO 15498)" - IDS_5906 "3.5"" 1.3 GB (GigaMO)" - IDS_5907 "3.5"" 2.3 GB (GigaMO 2)" - IDS_5908 "5.25"" 600 MB" - IDS_5909 "5.25"" 650 MB" - IDS_5910 "5.25"" 1 GB" - IDS_5911 "5.25"" 1.3 GB" + IDS_5888 "160 kB" + IDS_5889 "180 kB" + IDS_5890 "320 kB" + IDS_5891 "360 kB" + IDS_5892 "640 kB" + IDS_5893 "720 kB" + IDS_5894 "1.2 MB" + IDS_5895 "1.25 MB" + IDS_5896 "1.44 MB" + IDS_5897 "DMF (cluster 1024)" + IDS_5898 "DMF (cluster 2048)" + IDS_5899 "2.88 MB" + IDS_5900 "ZIP 100" + IDS_5901 "ZIP 250" + IDS_5902 "3.5"" 128 MB (ISO 10090)" + IDS_5903 "3.5"" 230 MB (ISO 13963)" + IDS_5904 "3.5"" 540 MB (ISO 15498)" + IDS_5905 "3.5"" 640 MB (ISO 15498)" + IDS_5906 "3.5"" 1.3 GB (GigaMO)" + IDS_5907 "3.5"" 2.3 GB (GigaMO 2)" + IDS_5908 "5.25"" 600 MB" + IDS_5909 "5.25"" 650 MB" + IDS_5910 "5.25"" 1 GB" + IDS_5911 "5.25"" 1.3 GB" - IDS_6144 "Dokonalé otáčky za minutu" - IDS_6145 "1% pod dokonalými ot./m" - IDS_6146 "1.5% pod dokonalými ot./m" - IDS_6147 "2% pod dokonalými ot./m" + IDS_6144 "Dokonalé otáčky za minutu" + IDS_6145 "1% pod dokonalými ot./m" + IDS_6146 "1.5% pod dokonalými ot./m" + IDS_6147 "2% pod dokonalými ot./m" - IDS_7168 "(Výchozí nastavení systému)" + IDS_7168 "(Výchozí nastavení systému)" END -#define IDS_LANG_ENUS IDS_7168 +#define IDS_LANG_ENUS IDS_7168 // Czech (Czech Republic) resources ///////////////////////////////////////////////////////////////////////////// diff --git a/src/win/languages/de-DE.rc b/src/win/languages/de-DE.rc index 97105b785..79872535a 100644 --- a/src/win/languages/de-DE.rc +++ b/src/win/languages/de-DE.rc @@ -17,114 +17,114 @@ MainMenu MENU DISCARDABLE BEGIN POPUP "&Aktionen" BEGIN - MENUITEM "&Tastatur benötigt das Einfangen des Mauszeigers", IDM_ACTION_KBD_REQ_CAPTURE - MENUITEM "&Die rechte Strg-Taste ist die Linke Alt-Taste", IDM_ACTION_RCTRL_IS_LALT + MENUITEM "&Tastatur benötigt das Einfangen des Mauszeigers", IDM_ACTION_KBD_REQ_CAPTURE + MENUITEM "&Die rechte Strg-Taste ist die Linke Alt-Taste", IDM_ACTION_RCTRL_IS_LALT MENUITEM SEPARATOR - MENUITEM "&Hard-Reset...", IDM_ACTION_HRESET - MENUITEM "&Strg+Alt+Entf\tStrg+F12", IDM_ACTION_RESET_CAD + MENUITEM "&Hard-Reset...", IDM_ACTION_HRESET + MENUITEM "&Strg+Alt+Entf\tStrg+F12", IDM_ACTION_RESET_CAD MENUITEM SEPARATOR - MENUITEM "Strg+Alt+&Esc", IDM_ACTION_CTRL_ALT_ESC + MENUITEM "Strg+Alt+&Esc", IDM_ACTION_CTRL_ALT_ESC MENUITEM SEPARATOR - MENUITEM "&Pause", IDM_ACTION_PAUSE + MENUITEM "&Pause", IDM_ACTION_PAUSE MENUITEM SEPARATOR - MENUITEM "Be&enden...", IDM_ACTION_EXIT + MENUITEM "Be&enden...", IDM_ACTION_EXIT END POPUP "&Ansicht" BEGIN - MENUITEM "&Statusleiste ausblenden", IDM_VID_HIDE_STATUS_BAR - MENUITEM "&Werkzeugleiste ausblenden", IDM_VID_HIDE_TOOLBAR + MENUITEM "&Statusleiste ausblenden", IDM_VID_HIDE_STATUS_BAR + MENUITEM "&Werkzeugleiste ausblenden", IDM_VID_HIDE_TOOLBAR MENUITEM SEPARATOR - MENUITEM "&Show non-primary monitors", IDM_VID_MONITORS - MENUITEM "&Größenverstellbares Fenster", IDM_VID_RESIZE + MENUITEM "&Show non-primary monitors", IDM_VID_MONITORS + MENUITEM "&Größenverstellbares Fenster", IDM_VID_RESIZE MENUITEM "&Größe && Position merken", IDM_VID_REMEMBER MENUITEM SEPARATOR POPUP "Re&nderer" BEGIN - MENUITEM "&SDL (Software)", IDM_VID_SDL_SW - MENUITEM "SDL (&Hardware)", IDM_VID_SDL_HW - MENUITEM "SDL (&OpenGL)", IDM_VID_SDL_OPENGL - MENUITEM "Open&GL (3.0-Kern)", IDM_VID_OPENGL_CORE + MENUITEM "&SDL (Software)", IDM_VID_SDL_SW + MENUITEM "SDL (&Hardware)", IDM_VID_SDL_HW + MENUITEM "SDL (&OpenGL)", IDM_VID_SDL_OPENGL + MENUITEM "Open&GL (3.0-Kern)", IDM_VID_OPENGL_CORE #ifdef USE_VNC - MENUITEM "&VNC", IDM_VID_VNC + MENUITEM "&VNC", IDM_VID_VNC #endif END MENUITEM SEPARATOR - MENUITEM "Fenstergröße einstellen...", IDM_VID_SPECIFY_DIM - MENUITEM "&4:3-Seitenverhältnis erzwingen", IDM_VID_FORCE43 + MENUITEM "Fenstergröße einstellen...", IDM_VID_SPECIFY_DIM + MENUITEM "&4:3-Seitenverhältnis erzwingen", IDM_VID_FORCE43 POPUP "&Fensterskalierungsfaktor" BEGIN - MENUITEM "&0,5x", IDM_VID_SCALE_1X - MENUITEM "&1x", IDM_VID_SCALE_2X - MENUITEM "1,&5x", IDM_VID_SCALE_3X - MENUITEM "&2x", IDM_VID_SCALE_4X - MENUITEM "&3x", IDM_VID_SCALE_5X - MENUITEM "&4x", IDM_VID_SCALE_6X - MENUITEM "&5x", IDM_VID_SCALE_7X - MENUITEM "&6x", IDM_VID_SCALE_8X - MENUITEM "&7x", IDM_VID_SCALE_9X - MENUITEM "&8x", IDM_VID_SCALE_10X + MENUITEM "&0,5x", IDM_VID_SCALE_1X + MENUITEM "&1x", IDM_VID_SCALE_2X + MENUITEM "1,&5x", IDM_VID_SCALE_3X + MENUITEM "&2x", IDM_VID_SCALE_4X + MENUITEM "&3x", IDM_VID_SCALE_5X + MENUITEM "&4x", IDM_VID_SCALE_6X + MENUITEM "&5x", IDM_VID_SCALE_7X + MENUITEM "&6x", IDM_VID_SCALE_8X + MENUITEM "&7x", IDM_VID_SCALE_9X + MENUITEM "&8x", IDM_VID_SCALE_10X END POPUP "Filteringmethode" BEGIN - MENUITEM "&Nearest", IDM_VID_FILTER_NEAREST - MENUITEM "&Linear", IDM_VID_FILTER_LINEAR + MENUITEM "&Nearest", IDM_VID_FILTER_NEAREST + MENUITEM "&Linear", IDM_VID_FILTER_LINEAR END - MENUITEM "Hi&DPI-Skalierung", IDM_VID_HIDPI + MENUITEM "Hi&DPI-Skalierung", IDM_VID_HIDPI MENUITEM SEPARATOR - MENUITEM "&Vollbild\tStrg+Alt+Bild auf", IDM_VID_FULLSCREEN + MENUITEM "&Vollbild\tStrg+Alt+Bild auf", IDM_VID_FULLSCREEN POPUP "&Stretching-Modus im Vollbildmodus" BEGIN - MENUITEM "&Vollbild-Stretching", IDM_VID_FS_FULL - MENUITEM "&4:3-Seitenverhältnis erzwingen", IDM_VID_FS_43 + MENUITEM "&Vollbild-Stretching", IDM_VID_FS_FULL + MENUITEM "&4:3-Seitenverhältnis erzwingen", IDM_VID_FS_43 MENUITEM "&Quadratische Pixel (Seitenverhältnis beibehalten)", IDM_VID_FS_KEEPRATIO - MENUITEM "&Integer-Skalierung", IDM_VID_FS_INT + MENUITEM "&Integer-Skalierung", IDM_VID_FS_INT END POPUP "E&GA/(S)VGA-Einstellungen" BEGIN - MENUITEM "&Invertierte VGA-Anzeige", IDM_VID_INVERT + MENUITEM "&Invertierte VGA-Anzeige", IDM_VID_INVERT POPUP "&VGA-Bildschirmtyp" BEGIN - MENUITEM "&RGB-Farbe", IDM_VID_GRAY_RGB - MENUITEM "&RGB-Graustufen", IDM_VID_GRAY_MONO - MENUITEM "&Bernstein-Monitor", IDM_VID_GRAY_AMBER - MENUITEM "&Grüner Monitor", IDM_VID_GRAY_GREEN - MENUITEM "&Weißer Monitor", IDM_VID_GRAY_WHITE + MENUITEM "&RGB-Farbe", IDM_VID_GRAY_RGB + MENUITEM "&RGB-Graustufen", IDM_VID_GRAY_MONO + MENUITEM "&Bernstein-Monitor", IDM_VID_GRAY_AMBER + MENUITEM "&Grüner Monitor", IDM_VID_GRAY_GREEN + MENUITEM "&Weißer Monitor", IDM_VID_GRAY_WHITE END POPUP "Methode zur &Graustufenkonversion" BEGIN - MENUITEM "BT&601 (NTSC/PAL)", IDM_VID_GRAYCT_601 - MENUITEM "BT&709 (HDTV)", IDM_VID_GRAYCT_709 - MENUITEM "&Durchschnittsmethode", IDM_VID_GRAYCT_AVE + MENUITEM "BT&601 (NTSC/PAL)", IDM_VID_GRAYCT_601 + MENUITEM "BT&709 (HDTV)", IDM_VID_GRAYCT_709 + MENUITEM "&Durchschnittsmethode", IDM_VID_GRAYCT_AVE END END MENUITEM SEPARATOR - MENUITEM "Overscan für CGA/PCjr/Tandy/E&GA/(S)VGA-Displays", IDM_VID_OVERSCAN + MENUITEM "Overscan für CGA/PCjr/Tandy/E&GA/(S)VGA-Displays", IDM_VID_OVERSCAN MENUITEM "Kontrast für &monochrome Displays ändern", IDM_VID_CGACON END - MENUITEM "&Medien", IDM_MEDIA + MENUITEM "&Medien", IDM_MEDIA POPUP "&Werkzeuge" BEGIN - MENUITEM "&Optionen...", IDM_CONFIG - MENUITEM "&Statusleistenicons aktualisieren", IDM_UPDATE_ICONS + MENUITEM "&Optionen...", IDM_CONFIG + MENUITEM "&Statusleistenicons aktualisieren", IDM_UPDATE_ICONS MENUITEM SEPARATOR - MENUITEM "S&creenshot aufnehmen\tStrg+F11", IDM_ACTION_SCREENSHOT + MENUITEM "S&creenshot aufnehmen\tStrg+F11", IDM_ACTION_SCREENSHOT MENUITEM SEPARATOR - MENUITEM "&Einstellungen...", IDM_PREFERENCES + MENUITEM "&Einstellungen...", IDM_PREFERENCES #ifdef DISCORD MENUITEM "&Discord-Integration aktivieren", IDM_DISCORD #endif MENUITEM SEPARATOR - MENUITEM "&Klangverstärkung...", IDM_SND_GAIN + MENUITEM "&Klangverstärkung...", IDM_SND_GAIN #ifdef MTR_ENABLED MENUITEM SEPARATOR - MENUITEM "Tracing starten\tStrg+T", IDM_ACTION_BEGIN_TRACE - MENUITEM "Tracing beenden\tStrg+T", IDM_ACTION_END_TRACE + MENUITEM "Tracing starten\tStrg+T", IDM_ACTION_BEGIN_TRACE + MENUITEM "Tracing beenden\tStrg+T", IDM_ACTION_END_TRACE #endif END POPUP "&Hilfe" BEGIN - MENUITEM "&Dokumentation...", IDM_DOCS - MENUITEM "&Über 86Box...", IDM_ABOUT + MENUITEM "&Dokumentation...", IDM_DOCS + MENUITEM "&Über 86Box...", IDM_ABOUT END END @@ -137,17 +137,17 @@ CassetteSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Neues Image...", IDM_CASSETTE_IMAGE_NEW + MENUITEM "&Neues Image...", IDM_CASSETTE_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&Bestehendes Image...", IDM_CASSETTE_IMAGE_EXISTING - MENUITEM "Bestehendes Image (&schreibgeschützt)...", IDM_CASSETTE_IMAGE_EXISTING_WP + MENUITEM "&Bestehendes Image...", IDM_CASSETTE_IMAGE_EXISTING + MENUITEM "Bestehendes Image (&schreibgeschützt)...", IDM_CASSETTE_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "&Aufnehmen", IDM_CASSETTE_RECORD - MENUITEM "&Abspielen", IDM_CASSETTE_PLAY - MENUITEM "&An den Anfang zurückspulen", IDM_CASSETTE_REWIND - MENUITEM "&An das Ende vorspulen", IDM_CASSETTE_FAST_FORWARD + MENUITEM "&Aufnehmen", IDM_CASSETTE_RECORD + MENUITEM "&Abspielen", IDM_CASSETTE_PLAY + MENUITEM "&An den Anfang zurückspulen", IDM_CASSETTE_REWIND + MENUITEM "&An das Ende vorspulen", IDM_CASSETTE_FAST_FORWARD MENUITEM SEPARATOR - MENUITEM "A&uswerfen", IDM_CASSETTE_EJECT + MENUITEM "A&uswerfen", IDM_CASSETTE_EJECT END END @@ -155,9 +155,9 @@ CartridgeSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Cartridgeimage...", IDM_CARTRIDGE_IMAGE + MENUITEM "&Cartridgeimage...", IDM_CARTRIDGE_IMAGE MENUITEM SEPARATOR - MENUITEM "A&uswerfen", IDM_CARTRIDGE_EJECT + MENUITEM "A&uswerfen", IDM_CARTRIDGE_EJECT END END @@ -165,14 +165,14 @@ FloppySubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Neues Image...", IDM_FLOPPY_IMAGE_NEW + MENUITEM "&Neues Image...", IDM_FLOPPY_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&Bestehendes Image...", IDM_FLOPPY_IMAGE_EXISTING - MENUITEM "Bestehendes Image (&schreibgeschützt)...", IDM_FLOPPY_IMAGE_EXISTING_WP + MENUITEM "&Bestehendes Image...", IDM_FLOPPY_IMAGE_EXISTING + MENUITEM "Bestehendes Image (&schreibgeschützt)...", IDM_FLOPPY_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "&In das 86F-Format e&xportieren...", IDM_FLOPPY_EXPORT_TO_86F + MENUITEM "&In das 86F-Format e&xportieren...", IDM_FLOPPY_EXPORT_TO_86F MENUITEM SEPARATOR - MENUITEM "&Auswerfen", IDM_FLOPPY_EJECT + MENUITEM "&Auswerfen", IDM_FLOPPY_EJECT END END @@ -180,13 +180,13 @@ CdromSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Stummschalten", IDM_CDROM_MUTE + MENUITEM "&Stummschalten", IDM_CDROM_MUTE MENUITEM SEPARATOR - MENUITEM "L&eer", IDM_CDROM_EMPTY - MENUITEM "&Voriges Image neu laden", IDM_CDROM_RELOAD + MENUITEM "L&eer", IDM_CDROM_EMPTY + MENUITEM "&Voriges Image neu laden", IDM_CDROM_RELOAD MENUITEM SEPARATOR - MENUITEM "&Image...", IDM_CDROM_IMAGE - MENUITEM "&Verzeichnis...", IDM_CDROM_DIR + MENUITEM "&Image...", IDM_CDROM_IMAGE + MENUITEM "&Verzeichnis...", IDM_CDROM_DIR END END @@ -194,13 +194,13 @@ ZIPSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Neues Image...", IDM_ZIP_IMAGE_NEW + MENUITEM "&Neues Image...", IDM_ZIP_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&Bestehendes Image...", IDM_ZIP_IMAGE_EXISTING - MENUITEM "Bestehendes Image (&schreibgeschützt)...", IDM_ZIP_IMAGE_EXISTING_WP + MENUITEM "&Bestehendes Image...", IDM_ZIP_IMAGE_EXISTING + MENUITEM "Bestehendes Image (&schreibgeschützt)...", IDM_ZIP_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "A&uswerfen", IDM_ZIP_EJECT - MENUITEM "&Voriges Image neu laden", IDM_ZIP_RELOAD + MENUITEM "A&uswerfen", IDM_ZIP_EJECT + MENUITEM "&Voriges Image neu laden", IDM_ZIP_RELOAD END END @@ -208,13 +208,13 @@ MOSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Neues Image...", IDM_MO_IMAGE_NEW + MENUITEM "&Neues Image...", IDM_MO_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&Bestehendes Image...", IDM_MO_IMAGE_EXISTING - MENUITEM "Bestehendes Image (&schreibgeschützt)...", IDM_MO_IMAGE_EXISTING_WP + MENUITEM "&Bestehendes Image...", IDM_MO_IMAGE_EXISTING + MENUITEM "Bestehendes Image (&schreibgeschützt)...", IDM_MO_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "&Auswerfen", IDM_MO_EJECT - MENUITEM "&Bestehendes Image erneut laden", IDM_MO_RELOAD + MENUITEM "&Auswerfen", IDM_MO_EJECT + MENUITEM "&Bestehendes Image erneut laden", IDM_MO_RELOAD END END @@ -240,150 +240,150 @@ END // Dialog // -#define STR_PREFERENCES "Einstellungen" -#define STR_SND_GAIN "Klangverstärkung" -#define STR_NEW_FLOPPY "Neues Image" -#define STR_CONFIG "Optionen" -#define STR_SPECIFY_DIM "Fenstergröße einstellen" +#define STR_PREFERENCES "Einstellungen" +#define STR_SND_GAIN "Klangverstärkung" +#define STR_NEW_FLOPPY "Neues Image" +#define STR_CONFIG "Optionen" +#define STR_SPECIFY_DIM "Fenstergröße einstellen" -#define STR_OK "OK" -#define STR_CANCEL "Abbrechen" -#define STR_GLOBAL "Einstellungen als &globalen Standard speichern" -#define STR_DEFAULT "&Standard" -#define STR_LANGUAGE "Sprache:" -#define STR_ICONSET "Icon-Satz:" +#define STR_OK "OK" +#define STR_CANCEL "Abbrechen" +#define STR_GLOBAL "Einstellungen als &globalen Standard speichern" +#define STR_DEFAULT "&Standard" +#define STR_LANGUAGE "Sprache:" +#define STR_ICONSET "Icon-Satz:" -#define STR_GAIN "Verstärkung" +#define STR_GAIN "Verstärkung" -#define STR_FILE_NAME "Dateiname:" -#define STR_DISK_SIZE "Plattengröße:" -#define STR_RPM_MODE "Drehzahlmodus:" -#define STR_PROGRESS "Fortschritt:" +#define STR_FILE_NAME "Dateiname:" +#define STR_DISK_SIZE "Plattengröße:" +#define STR_RPM_MODE "Drehzahlmodus:" +#define STR_PROGRESS "Fortschritt:" -#define STR_WIDTH "Breite:" -#define STR_HEIGHT "Höhe:" -#define STR_LOCK_TO_SIZE "Feste Größe" +#define STR_WIDTH "Breite:" +#define STR_HEIGHT "Höhe:" +#define STR_LOCK_TO_SIZE "Feste Größe" -#define STR_MACHINE_TYPE "Systemtyp:" -#define STR_MACHINE "System:" -#define STR_CONFIGURE "Einstellen" -#define STR_CPU_TYPE "CPU-Typ:" -#define STR_CPU_SPEED "Takt:" -#define STR_FPU "FPU-Einheit:" -#define STR_WAIT_STATES "Wartezustände:" -#define STR_MB "MB" -#define STR_MEMORY "Hauptspeicher:" -#define STR_TIME_SYNC "Zeitsynchronisierung" -#define STR_DISABLED "Deaktiviert" -#define STR_ENABLED_LOCAL "Aktiviert (Lokale Uhrzeit)" -#define STR_ENABLED_UTC "Aktiviert (UTC)" -#define STR_DYNAREC "Dynamischer Recompiler" +#define STR_MACHINE_TYPE "Systemtyp:" +#define STR_MACHINE "System:" +#define STR_CONFIGURE "Einstellen" +#define STR_CPU_TYPE "CPU-Typ:" +#define STR_CPU_SPEED "Takt:" +#define STR_FPU "FPU-Einheit:" +#define STR_WAIT_STATES "Wartezustände:" +#define STR_MB "MB" +#define STR_MEMORY "Hauptspeicher:" +#define STR_TIME_SYNC "Zeitsynchronisierung" +#define STR_DISABLED "Deaktiviert" +#define STR_ENABLED_LOCAL "Aktiviert (Lokale Uhrzeit)" +#define STR_ENABLED_UTC "Aktiviert (UTC)" +#define STR_DYNAREC "Dynamischer Recompiler" -#define STR_VIDEO "Videokarte:" -#define STR_VIDEO_2 "Videokarte 2:" -#define STR_VOODOO "Voodoo-Grafik" -#define STR_IBM8514 "IBM 8514/a-Grafik" -#define STR_XGA "XGA-Grafik" +#define STR_VIDEO "Videokarte:" +#define STR_VIDEO_2 "Videokarte 2:" +#define STR_VOODOO "Voodoo-Grafik" +#define STR_IBM8514 "IBM 8514/a-Grafik" +#define STR_XGA "XGA-Grafik" -#define STR_MOUSE "Maus:" -#define STR_JOYSTICK "Joystick:" -#define STR_JOY1 "Joystick 1..." -#define STR_JOY2 "Joystick 2..." -#define STR_JOY3 "Joystick 3..." -#define STR_JOY4 "Joystick 4..." +#define STR_MOUSE "Maus:" +#define STR_JOYSTICK "Joystick:" +#define STR_JOY1 "Joystick 1..." +#define STR_JOY2 "Joystick 2..." +#define STR_JOY3 "Joystick 3..." +#define STR_JOY4 "Joystick 4..." -#define STR_SOUND1 "Soundkarte 1:" -#define STR_SOUND2 "Soundkarte 2:" -#define STR_SOUND3 "Soundkarte 3:" -#define STR_SOUND4 "Soundkarte 4:" -#define STR_MIDI_OUT "MIDI Out-Gerät:" -#define STR_MIDI_IN "MIDI In-Gerät:" -#define STR_MPU401 "Standalone-MPU-401-Gerät" -#define STR_FLOAT "FLOAT32-Wiedergabe benutzen" -#define STR_FM_DRIVER "FM-Synth-Treiber" -#define STR_FM_DRV_NUKED "Nuked (genauer)" -#define STR_FM_DRV_YMFM "YMFM (schneller)" +#define STR_SOUND1 "Soundkarte 1:" +#define STR_SOUND2 "Soundkarte 2:" +#define STR_SOUND3 "Soundkarte 3:" +#define STR_SOUND4 "Soundkarte 4:" +#define STR_MIDI_OUT "MIDI Out-Gerät:" +#define STR_MIDI_IN "MIDI In-Gerät:" +#define STR_MPU401 "Standalone-MPU-401-Gerät" +#define STR_FLOAT "FLOAT32-Wiedergabe benutzen" +#define STR_FM_DRIVER "FM-Synth-Treiber" +#define STR_FM_DRV_NUKED "Nuked (genauer)" +#define STR_FM_DRV_YMFM "YMFM (schneller)" -#define STR_NET_TYPE "Netzwerktyp:" -#define STR_PCAP "PCap-Gerät:" -#define STR_NET "Netzwerkadapter:" -#define STR_NET1 "Network card 1:" -#define STR_NET2 "Network card 2:" -#define STR_NET3 "Network card 3:" -#define STR_NET4 "Network card 4:" +#define STR_NET_TYPE "Netzwerktyp:" +#define STR_PCAP "PCap-Gerät:" +#define STR_NET "Netzwerkadapter:" +#define STR_NET1 "Network card 1:" +#define STR_NET2 "Network card 2:" +#define STR_NET3 "Network card 3:" +#define STR_NET4 "Network card 4:" -#define STR_COM1 "COM1-Gerät:" -#define STR_COM2 "COM2-Gerät:" -#define STR_COM3 "COM3-Gerät:" -#define STR_COM4 "COM4-Gerät:" -#define STR_LPT1 "LPT1-Gerät:" -#define STR_LPT2 "LPT2-Gerät:" -#define STR_LPT3 "LPT3-Gerät:" -#define STR_LPT4 "LPT4-Gerät:" -#define STR_SERIAL1 "Serielle Schnittstelle 1" -#define STR_SERIAL2 "Serielle Schnittstelle 2" -#define STR_SERIAL3 "Serielle Schnittstelle 3" -#define STR_SERIAL4 "Serielle Schnittstelle 4" -#define STR_PARALLEL1 "Parallelport 1" -#define STR_PARALLEL2 "Parallelport 2" -#define STR_PARALLEL3 "Parallelport 3" -#define STR_PARALLEL4 "Parallelport 4" -#define STR_SERIAL_PASS1 "Serial port passthrough 1" -#define STR_SERIAL_PASS2 "Serial port passthrough 2" -#define STR_SERIAL_PASS3 "Serial port passthrough 3" -#define STR_SERIAL_PASS4 "Serial port passthrough 4" +#define STR_COM1 "COM1-Gerät:" +#define STR_COM2 "COM2-Gerät:" +#define STR_COM3 "COM3-Gerät:" +#define STR_COM4 "COM4-Gerät:" +#define STR_LPT1 "LPT1-Gerät:" +#define STR_LPT2 "LPT2-Gerät:" +#define STR_LPT3 "LPT3-Gerät:" +#define STR_LPT4 "LPT4-Gerät:" +#define STR_SERIAL1 "Serielle Schnittstelle 1" +#define STR_SERIAL2 "Serielle Schnittstelle 2" +#define STR_SERIAL3 "Serielle Schnittstelle 3" +#define STR_SERIAL4 "Serielle Schnittstelle 4" +#define STR_PARALLEL1 "Parallelport 1" +#define STR_PARALLEL2 "Parallelport 2" +#define STR_PARALLEL3 "Parallelport 3" +#define STR_PARALLEL4 "Parallelport 4" +#define STR_SERIAL_PASS1 "Serial port passthrough 1" +#define STR_SERIAL_PASS2 "Serial port passthrough 2" +#define STR_SERIAL_PASS3 "Serial port passthrough 3" +#define STR_SERIAL_PASS4 "Serial port passthrough 4" -#define STR_HDC "HDD-Controller:" -#define STR_FDC "FD-Controller:" -#define STR_IDE_TER "Tertiärer IDE-Controller" -#define STR_IDE_QUA "Quartärer IDE-Controller" -#define STR_SCSI "SCSI" -#define STR_SCSI_1 "Controller 1:" -#define STR_SCSI_2 "Controller 2:" -#define STR_SCSI_3 "Controller 3:" -#define STR_SCSI_4 "Controller 4:" -#define STR_CASSETTE "Kassette" +#define STR_HDC "HDD-Controller:" +#define STR_FDC "FD-Controller:" +#define STR_IDE_TER "Tertiärer IDE-Controller" +#define STR_IDE_QUA "Quartärer IDE-Controller" +#define STR_SCSI "SCSI" +#define STR_SCSI_1 "Controller 1:" +#define STR_SCSI_2 "Controller 2:" +#define STR_SCSI_3 "Controller 3:" +#define STR_SCSI_4 "Controller 4:" +#define STR_CASSETTE "Kassette" -#define STR_HDD "Festplatten:" -#define STR_NEW "&Neu..." -#define STR_EXISTING "&Vorhanden..." -#define STR_REMOVE "&Entfernen" -#define STR_BUS "Bus:" -#define STR_CHANNEL "Kanal:" -#define STR_ID "ID:" -#define STR_SPEED "Speed:" +#define STR_HDD "Festplatten:" +#define STR_NEW "&Neu..." +#define STR_EXISTING "&Vorhanden..." +#define STR_REMOVE "&Entfernen" +#define STR_BUS "Bus:" +#define STR_CHANNEL "Kanal:" +#define STR_ID "ID:" +#define STR_SPEED "Speed:" -#define STR_SPECIFY "&Festlegen..." -#define STR_SECTORS "Sektoren:" -#define STR_HEADS "Köpfe:" -#define STR_CYLS "Zylinder:" -#define STR_SIZE_MB "Größe (MB):" -#define STR_TYPE "Typ:" -#define STR_IMG_FORMAT "Imageformat:" -#define STR_BLOCK_SIZE "Blockgröße:" +#define STR_SPECIFY "&Festlegen..." +#define STR_SECTORS "Sektoren:" +#define STR_HEADS "Köpfe:" +#define STR_CYLS "Zylinder:" +#define STR_SIZE_MB "Größe (MB):" +#define STR_TYPE "Typ:" +#define STR_IMG_FORMAT "Imageformat:" +#define STR_BLOCK_SIZE "Blockgröße:" -#define STR_FLOPPY_DRIVES "Diskettenlaufwerke:" -#define STR_TURBO "Turbo-Timings" -#define STR_CHECKBPB "BPB überprüfen" -#define STR_CDROM_DRIVES "CD-ROM-Laufwerke:" -#define STR_CD_SPEED "Geschwindigkeit:" -#define STR_EARLY "Früheres Laufwerk" +#define STR_FLOPPY_DRIVES "Diskettenlaufwerke:" +#define STR_TURBO "Turbo-Timings" +#define STR_CHECKBPB "BPB überprüfen" +#define STR_CDROM_DRIVES "CD-ROM-Laufwerke:" +#define STR_CD_SPEED "Geschwindigkeit:" +#define STR_EARLY "Früheres Laufwerk" -#define STR_MO_DRIVES "MO-Laufwerke:" -#define STR_ZIP_DRIVES "ZIP-Laufwerke:" -#define STR_250 "ZIP 250" +#define STR_MO_DRIVES "MO-Laufwerke:" +#define STR_ZIP_DRIVES "ZIP-Laufwerke:" +#define STR_250 "ZIP 250" -#define STR_ISARTC "ISA-Echtzeituhr:" -#define STR_ISAMEM "ISA-Speichererweiterung:" -#define STR_ISAMEM_1 "Steckkarte 1:" -#define STR_ISAMEM_2 "Steckkarte 2:" -#define STR_ISAMEM_3 "Steckkarte 3:" -#define STR_ISAMEM_4 "Steckkarte 4:" -#define STR_BUGGER "ISABugger-Gerät" -#define STR_POSTCARD "POST-Code-Karte" +#define STR_ISARTC "ISA-Echtzeituhr:" +#define STR_ISAMEM "ISA-Speichererweiterung:" +#define STR_ISAMEM_1 "Steckkarte 1:" +#define STR_ISAMEM_2 "Steckkarte 2:" +#define STR_ISAMEM_3 "Steckkarte 3:" +#define STR_ISAMEM_4 "Steckkarte 4:" +#define STR_BUGGER "ISABugger-Gerät" +#define STR_POSTCARD "POST-Code-Karte" -#define FONT_SIZE 9 -#define FONT_NAME "Segoe UI" +#define FONT_SIZE 9 +#define FONT_NAME "Segoe UI" #include "dialogs.rc" @@ -394,149 +394,149 @@ END STRINGTABLE DISCARDABLE BEGIN - 2048 "86Box" - IDS_2049 "Fehler" - IDS_2050 "Fataler Fehler" - IDS_2051 " - PAUSED" - IDS_2052 "Bitte Strg+Alt+Bild ab zur Rückkehr in den Fenstermodus drücken." - IDS_2053 "Geschwindigkeit" - IDS_2054 "ZIP %03i %i (%s): %ls" - IDS_2055 "ZIP-Images (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" - IDS_2056 "86Box konnte keine nutzbaren ROM-Dateien finden.\n\nBitte besuchen Sie download, laden ein ROM-Set herunter und extrahieren dies in das ""roms""-Verzeichnis." - IDS_2057 "(leer)" - IDS_2058 "ZIP-Images (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0Alle Dateien (*.*)\0*.*\0" - IDS_2059 "Turbo" - IDS_2060 "An" - IDS_2061 "Aus" - IDS_2062 "Alle Images (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0Basissektorimages (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Oberflächenimages (*.86F)\0*.86F\0" - IDS_2063 "Das System ""%hs"" ist aufgrund von fehlenden ROMs im Verzeichnis roms/machines nicht verfügbar. Es wird auf ein verfügbares System gewechselt." + 2048 "86Box" + IDS_2049 "Fehler" + IDS_2050 "Fataler Fehler" + IDS_2051 " - PAUSED" + IDS_2052 "Bitte Strg+Alt+Bild ab zur Rückkehr in den Fenstermodus drücken." + IDS_2053 "Geschwindigkeit" + IDS_2054 "ZIP %03i %i (%s): %ls" + IDS_2055 "ZIP-Images (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" + IDS_2056 "86Box konnte keine nutzbaren ROM-Dateien finden.\n\nBitte besuchen Sie download, laden ein ROM-Set herunter und extrahieren dies in das ""roms""-Verzeichnis." + IDS_2057 "(leer)" + IDS_2058 "ZIP-Images (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0Alle Dateien (*.*)\0*.*\0" + IDS_2059 "Turbo" + IDS_2060 "An" + IDS_2061 "Aus" + IDS_2062 "Alle Images (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0Basissektorimages (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Oberflächenimages (*.86F)\0*.86F\0" + IDS_2063 "Das System ""%hs"" ist aufgrund von fehlenden ROMs im Verzeichnis roms/machines nicht verfügbar. Es wird auf ein verfügbares System gewechselt." END STRINGTABLE DISCARDABLE BEGIN - IDS_2064 "Die Videokarte ""%hs"" ist aufgrund von fehlenden ROMs im Verzeichnis roms/video nicht verfügbar. Es wird auf eine verfügbare Videokarte gewechselt." - IDS_2065 "System" - IDS_2066 "Anzeige" - IDS_2067 "Eingabegeräte" - IDS_2068 "Multimedia" - IDS_2069 "Netzwerk" - IDS_2070 "Anschlüsse (COM & LPT)" - IDS_2071 "Speichercontroller" - IDS_2072 "Festplatten" - IDS_2073 "Disketten- & CD-ROM-Laufwerke" - IDS_2074 "Andere Wechsellaufwerke" - IDS_2075 "Andere Peripheriegeräte" - IDS_2076 "Oberflächenimages (*.86F)\0*.86F\0" - IDS_2077 "Zum Einfangen des Mauszeigers bitte klicken" - IDS_2078 "Bitte F8+F12 zur Mausfreigabe drücken" - IDS_2079 "Bitte F8+F12 oder die mittlere Maustaste zur Mausfreigabe drücken" + IDS_2064 "Die Videokarte ""%hs"" ist aufgrund von fehlenden ROMs im Verzeichnis roms/video nicht verfügbar. Es wird auf eine verfügbare Videokarte gewechselt." + IDS_2065 "System" + IDS_2066 "Anzeige" + IDS_2067 "Eingabegeräte" + IDS_2068 "Multimedia" + IDS_2069 "Netzwerk" + IDS_2070 "Anschlüsse (COM & LPT)" + IDS_2071 "Speichercontroller" + IDS_2072 "Festplatten" + IDS_2073 "Disketten- & CD-ROM-Laufwerke" + IDS_2074 "Andere Wechsellaufwerke" + IDS_2075 "Andere Peripheriegeräte" + IDS_2076 "Oberflächenimages (*.86F)\0*.86F\0" + IDS_2077 "Zum Einfangen des Mauszeigers bitte klicken" + IDS_2078 "Bitte F8+F12 zur Mausfreigabe drücken" + IDS_2079 "Bitte F8+F12 oder die mittlere Maustaste zur Mausfreigabe drücken" END STRINGTABLE DISCARDABLE BEGIN - IDS_2080 "FluidSynth konnte nicht initialisiert werden" - IDS_2081 "Bus" - IDS_2082 "Datei" - IDS_2083 "C" - IDS_2084 "H" - IDS_2085 "S" - IDS_2086 "MB" + IDS_2080 "FluidSynth konnte nicht initialisiert werden" + IDS_2081 "Bus" + IDS_2082 "Datei" + IDS_2083 "C" + IDS_2084 "H" + IDS_2085 "S" + IDS_2086 "MB" IDS_2087 "Speed" - IDS_2088 "BPB prüfen" - IDS_2089 "KB" - IDS_2090 "Der Videorenderer konnte nicht initialisiert werden." - IDS_2091 "Standard" - IDS_2092 "%i Wartezustände" - IDS_2093 "Typ" - IDS_2094 "PCap konnte nicht eingerichtet werden" - IDS_2095 "Keine PCap-Geräte gefunden" - IDS_2096 "Ungültiges PCap-Gerät" - IDS_2097 "Standard 2-Tasten-Joystick(s)" - IDS_2098 "Standard 4-Tasten-Joystick" - IDS_2099 "Standard 6-Tasten-Joystick" - IDS_2100 "Standard 8-Tasten-Joystick" - IDS_2101 "CH Flightstick Pro" - IDS_2102 "Microsoft SideWinder Pad" - IDS_2103 "Thrustmaster Flight Control System" - IDS_2104 "Ohne" - IDS_2105 "Tastaturbeschleuniger konnten nicht geladen werden." - IDS_2106 "Roheingaben konnten nicht registriert werden." - IDS_2107 "%u" - IDS_2108 "%u MB (CHS: %i, %i, %i)" - IDS_2109 "Diskette %i (%s): %ls" - IDS_2110 "Alle Images (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Fortgeschrittene Sektorimages (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Basissektorimages (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Fluximages (*.FDI)\0*.FDI\0Oberflächenimages (*.86F;*.MFM)\0*.86F;*.MFM\0Alle Dateien (*.*)\0*.*\0" - IDS_2111 "FreeType konnte nicht initialisiert werden" - IDS_2112 "SDL konnte nicht initialisiert werden, die Datei SDL2.dll wird benötigt" - IDS_2113 "Sind Sie sich sicher, dass Sie einen Hard-Reset für das emulierte System durchführen wollen?" - IDS_2114 "Sind Sie sich sicher, dass Sie 86Box beenden wollen?" - IDS_2115 "Ghostscript konnte nicht initialisiert werden" - IDS_2116 "MO %i (%ls): %ls" - IDS_2117 "MO-Images (*.IM?;*.MDI)\0*.IM?;*.MDI\0Alle Dateien (*.*)\0*.*\0" - IDS_2118 "Willkommen bei 86Box!" - IDS_2119 "Interner Controller" - IDS_2120 "Beenden" - IDS_2121 "Keine ROMs gefunden" - IDS_2122 "Möchten Sie die Einstellungen speichern?" - IDS_2123 "Dies wird zu einem Hard-Reset des emulierten Systems führen." - IDS_2124 "Speichern" - IDS_2125 "Über 86Box" - IDS_2126 "86Box Version " EMU_VERSION + IDS_2088 "BPB prüfen" + IDS_2089 "KB" + IDS_2090 "Der Videorenderer konnte nicht initialisiert werden." + IDS_2091 "Standard" + IDS_2092 "%i Wartezustände" + IDS_2093 "Typ" + IDS_2094 "PCap konnte nicht eingerichtet werden" + IDS_2095 "Keine PCap-Geräte gefunden" + IDS_2096 "Ungültiges PCap-Gerät" + IDS_2097 "Standard 2-Tasten-Joystick(s)" + IDS_2098 "Standard 4-Tasten-Joystick" + IDS_2099 "Standard 6-Tasten-Joystick" + IDS_2100 "Standard 8-Tasten-Joystick" + IDS_2101 "CH Flightstick Pro" + IDS_2102 "Microsoft SideWinder Pad" + IDS_2103 "Thrustmaster Flight Control System" + IDS_2104 "Ohne" + IDS_2105 "Tastaturbeschleuniger konnten nicht geladen werden." + IDS_2106 "Roheingaben konnten nicht registriert werden." + IDS_2107 "%u" + IDS_2108 "%u MB (CHS: %i, %i, %i)" + IDS_2109 "Diskette %i (%s): %ls" + IDS_2110 "Alle Images (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Fortgeschrittene Sektorimages (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Basissektorimages (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Fluximages (*.FDI)\0*.FDI\0Oberflächenimages (*.86F;*.MFM)\0*.86F;*.MFM\0Alle Dateien (*.*)\0*.*\0" + IDS_2111 "FreeType konnte nicht initialisiert werden" + IDS_2112 "SDL konnte nicht initialisiert werden, die Datei SDL2.dll wird benötigt" + IDS_2113 "Sind Sie sich sicher, dass Sie einen Hard-Reset für das emulierte System durchführen wollen?" + IDS_2114 "Sind Sie sich sicher, dass Sie 86Box beenden wollen?" + IDS_2115 "Ghostscript konnte nicht initialisiert werden" + IDS_2116 "MO %i (%ls): %ls" + IDS_2117 "MO-Images (*.IM?;*.MDI)\0*.IM?;*.MDI\0Alle Dateien (*.*)\0*.*\0" + IDS_2118 "Willkommen bei 86Box!" + IDS_2119 "Interner Controller" + IDS_2120 "Beenden" + IDS_2121 "Keine ROMs gefunden" + IDS_2122 "Möchten Sie die Einstellungen speichern?" + IDS_2123 "Dies wird zu einem Hard-Reset des emulierten Systems führen." + IDS_2124 "Speichern" + IDS_2125 "Über 86Box" + IDS_2126 "86Box Version " EMU_VERSION - IDS_2127 "Ein Emulator für alte Computer\n\nAutoren: Sarah Walker, Miran Grča, Fred N. van Kempen (waltje), SA1988, Tiseno100, reenigne, leilei, JohnElliott, greatpsycho sowie andere.\n\nÜbersetzt von: dob205\n\nVeröffentlicht unter der GNU General Public License in der Version 2 oder neuer. Siehe LICENSE für mehr Informationen." - IDS_2128 "OK" - IDS_2129 "Hardware nicht verfügbar" + IDS_2127 "Ein Emulator für alte Computer\n\nAutoren: Sarah Walker, Miran Grča, Fred N. van Kempen (waltje), SA1988, Tiseno100, reenigne, leilei, JohnElliott, greatpsycho sowie andere.\n\nÜbersetzt von: dob205\n\nVeröffentlicht unter der GNU General Public License in der Version 2 oder neuer. Siehe LICENSE für mehr Informationen." + IDS_2128 "OK" + IDS_2129 "Hardware nicht verfügbar" #ifdef _WIN32 #define LIB_NAME_PCAP "WinPcap" #else #define LIB_NAME_PCAP "libpcap" #endif - IDS_2130 "Bitte stellen Sie sicher, dass " LIB_NAME_PCAP " installiert ist und sie eine " LIB_NAME_PCAP "-kompatible Netzwerkverbindung nutzen." - IDS_2131 "Ungültige Konfiguration" + IDS_2130 "Bitte stellen Sie sicher, dass " LIB_NAME_PCAP " installiert ist und sie eine " LIB_NAME_PCAP "-kompatible Netzwerkverbindung nutzen." + IDS_2131 "Ungültige Konfiguration" #ifdef _WIN32 #define LIB_NAME_FREETYPE "freetype.dll" #else #define LIB_NAME_FREETYPE "libfreetype" #endif - IDS_2132 LIB_NAME_FREETYPE " wird für die ESC/P-Druckeremulation benötigt." + IDS_2132 LIB_NAME_FREETYPE " wird für die ESC/P-Druckeremulation benötigt." #ifdef _WIN32 #define LIB_NAME_GS "gsdll32.dll" #else #define LIB_NAME_GS "libgs" #endif - IDS_2133 LIB_NAME_GS " wird zur automatischen Konversion von PostScript-Dateien in das PDF-Format benötigt.\n\nSämtliche an den generischen PostScript-Drucker gesendete Dateien werden als PostScript (.ps)-Dateien gesichert." + IDS_2133 LIB_NAME_GS " wird zur automatischen Konversion von PostScript-Dateien in das PDF-Format benötigt.\n\nSämtliche an den generischen PostScript-Drucker gesendete Dateien werden als PostScript (.ps)-Dateien gesichert." #ifdef _WIN32 #define LIB_NAME_FLUIDSYNTH "libfluidsynth.dll" #else #define LIB_NAME_FLUIDSYNTH "libfluidsynth" #endif - IDS_2134 LIB_NAME_FLUIDSYNTH " wird für die FluidSynth-MIDI-Ausgabe benötigt." - IDS_2135 "Vollbildmodus wird aktiviert" - IDS_2136 "Diese Nachricht nicht mehr anzeigen" - IDS_2137 "Nicht beenden" - IDS_2138 "Zurücksetzen" - IDS_2139 "Nicht zurücksetzen" - IDS_2140 "MO-Images (*.IM?;*.MDI)\0*.IM?;*.MDI\0Alle Dateien (*.*)\0*.*\0" - IDS_2141 "CD-ROM-Images (*.ISO;*.CUE)\0*.ISO;*.CUE\0Alle Dateien (*.*)\0*.*\0" - IDS_2142 "%hs-Gerätekonfiguration" + IDS_2134 LIB_NAME_FLUIDSYNTH " wird für die FluidSynth-MIDI-Ausgabe benötigt." + IDS_2135 "Vollbildmodus wird aktiviert" + IDS_2136 "Diese Nachricht nicht mehr anzeigen" + IDS_2137 "Nicht beenden" + IDS_2138 "Zurücksetzen" + IDS_2139 "Nicht zurücksetzen" + IDS_2140 "MO-Images (*.IM?;*.MDI)\0*.IM?;*.MDI\0Alle Dateien (*.*)\0*.*\0" + IDS_2141 "CD-ROM-Images (*.ISO;*.CUE)\0*.ISO;*.CUE\0Alle Dateien (*.*)\0*.*\0" + IDS_2142 "%hs-Gerätekonfiguration" IDS_2143 "Monitor im Standbymodus" - IDS_2144 "OpenGL-Shader (*.GLSL)\0*.GLSL\0Alle Dateien (*.*)\0*.*\0" - IDS_2145 "OpenGL-Optionen" - IDS_2146 "Sie laden gerade eine nicht unterstützte Konfiguration" - IDS_2147 "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." - IDS_2148 "Fortfahren" - IDS_2149 "Kassette: %s" - IDS_2150 "Kassettenimages (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Alle Dateien (*.*)\0*.*\0" - IDS_2151 "Cartridge %i: %ls" - IDS_2152 "Cartridgeimages (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Alle Dateien (*.*)\0*.*\0" - IDS_2153 "Fehler bei der Rendererinitialisierung" - IDS_2154 "Der OpenGL (3.0-Kern)-Renderer konnte nicht initialisiert werden. Bitte benutzen Sie einen anderen Renderer." - IDS_2155 "Fortsetzen" - IDS_2156 "Pausieren" - IDS_2157 "Strg+Alt+Entf drücken" - IDS_2158 "Strg+Alt+Esc drücken" - IDS_2159 "Hard-Reset" - IDS_2160 "ACPI-basiertes Herunterfahren" - IDS_2161 "Optionen" + IDS_2144 "OpenGL-Shader (*.GLSL)\0*.GLSL\0Alle Dateien (*.*)\0*.*\0" + IDS_2145 "OpenGL-Optionen" + IDS_2146 "Sie laden gerade eine nicht unterstützte Konfiguration" + IDS_2147 "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." + IDS_2148 "Fortfahren" + IDS_2149 "Kassette: %s" + IDS_2150 "Kassettenimages (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Alle Dateien (*.*)\0*.*\0" + IDS_2151 "Cartridge %i: %ls" + IDS_2152 "Cartridgeimages (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Alle Dateien (*.*)\0*.*\0" + IDS_2153 "Fehler bei der Rendererinitialisierung" + IDS_2154 "Der OpenGL (3.0-Kern)-Renderer konnte nicht initialisiert werden. Bitte benutzen Sie einen anderen Renderer." + IDS_2155 "Fortsetzen" + IDS_2156 "Pausieren" + IDS_2157 "Strg+Alt+Entf drücken" + IDS_2158 "Strg+Alt+Esc drücken" + IDS_2159 "Hard-Reset" + IDS_2160 "ACPI-basiertes Herunterfahren" + IDS_2161 "Optionen" IDS_2162 "Früheres Laufwerk" IDS_2163 "No Dynarec" IDS_2164 "Old Dynarec" @@ -547,45 +547,45 @@ END STRINGTABLE DISCARDABLE BEGIN IDS_4096 "Festplatte (%s)" - IDS_4097 "%01i:%01i" - IDS_4098 "%01i" - IDS_4099 "MFM/RLL- oder ESDI CD-ROM-Laufwerke hat es niemals gegeben" - IDS_4100 "Angepasst..." - IDS_4101 "Angepasst (Groß)..." - IDS_4102 "Neue Festplatte hinzufügen" - IDS_4103 "Bestehende Festplatte hinzufügen" - IDS_4104 "HDI-Diskimages können nicht größer als 4 GB groß sein." - IDS_4105 "Festplattenimages können nicht größer als 127 GB groß sein." - IDS_4106 "Festplattenimages (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0Alle Dateien (*.*)\0*.*\0" - IDS_4107 "Die Datei konnte nicht gelesen werden" - IDS_4108 "Die Datei konnte nicht beschrieben werden" - IDS_4109 "HDI- oder HDX-Images mit einer Sektorgröße größer als 512 kB werden nicht unterstützt." - IDS_4110 "USB wird noch nicht unterstützt" - IDS_4111 "Die Festplattenimagedatei existiert bereits" - IDS_4112 "Bitte geben Sie einen gültigen Dateinamen ein." - IDS_4113 "Disk-Image wurde erstellt" - IDS_4114 "Bitte stellen Sie sicher, dass die Datei existiert und lesbar ist." - IDS_4115 "Bitte stellen Sie sicher, dass die Datei in ein Verzeichnis mit Schreibberechtigungen gespeichert wird." - IDS_4116 "Festplattenimage ist zu groß" - IDS_4117 "Bitte denken Sie an das Partitionieren und Formatieren des neu erstellten Laufwerks." - IDS_4118 "Die ausgewählte Datei wird überschrieben. Möchten Sie diese Datei nutzen?" - IDS_4119 "Nicht unterstütztes Festplattenimage" - IDS_4120 "Überschreiben" - IDS_4121 "Nicht überschreiben" - IDS_4122 "Rohdatenimages (.img)" - IDS_4123 "HDI-Images (.hdi)" - IDS_4124 "HDX-Images (.hdx)" - IDS_4125 "VHD mit fester Größe (.vhd)" - IDS_4126 "VHD mit dynamischer Größe (.vhd)" - IDS_4127 "Differenzierende VHD (.vhd)" - IDS_4128 "Große Blöcke (2 MB)" - IDS_4129 "Kleine Blöcke (512 KB)" - IDS_4130 "VHD-Dateien (*.VHD)\0*.VHD\0Alle Dateien (*.*)\0*.*\0" - IDS_4131 "Eltern-VHD-Datei bitte auswählen" - IDS_4132 "Dies bedeutet, dass das Elternimage nach der Erstellung des differenzierenden Images erzeugt wurde.\n\nDies kann auch passieren, falls die Image-Dateien verschoben oder kopiert wurden. Ebenso kann auch dies durch einen Bug im Programm, welches das Image erstellt hat, passieren.\n\nMöchten Sie die Zeitstempel korrigieren?" - IDS_4133 "Die Zeitstempel der Eltern- und der Kindesplatte stimmen nicht überein" - IDS_4134 "Der Zeitstempel der VHD konnte nicht korrigiert werden." - IDS_4135 "%01i:%02i" + IDS_4097 "%01i:%01i" + IDS_4098 "%01i" + IDS_4099 "MFM/RLL- oder ESDI CD-ROM-Laufwerke hat es niemals gegeben" + IDS_4100 "Angepasst..." + IDS_4101 "Angepasst (Groß)..." + IDS_4102 "Neue Festplatte hinzufügen" + IDS_4103 "Bestehende Festplatte hinzufügen" + IDS_4104 "HDI-Diskimages können nicht größer als 4 GB groß sein." + IDS_4105 "Festplattenimages können nicht größer als 127 GB groß sein." + IDS_4106 "Festplattenimages (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0Alle Dateien (*.*)\0*.*\0" + IDS_4107 "Die Datei konnte nicht gelesen werden" + IDS_4108 "Die Datei konnte nicht beschrieben werden" + IDS_4109 "HDI- oder HDX-Images mit einer Sektorgröße größer als 512 kB werden nicht unterstützt." + IDS_4110 "USB wird noch nicht unterstützt" + IDS_4111 "Die Festplattenimagedatei existiert bereits" + IDS_4112 "Bitte geben Sie einen gültigen Dateinamen ein." + IDS_4113 "Disk-Image wurde erstellt" + IDS_4114 "Bitte stellen Sie sicher, dass die Datei existiert und lesbar ist." + IDS_4115 "Bitte stellen Sie sicher, dass die Datei in ein Verzeichnis mit Schreibberechtigungen gespeichert wird." + IDS_4116 "Festplattenimage ist zu groß" + IDS_4117 "Bitte denken Sie an das Partitionieren und Formatieren des neu erstellten Laufwerks." + IDS_4118 "Die ausgewählte Datei wird überschrieben. Möchten Sie diese Datei nutzen?" + IDS_4119 "Nicht unterstütztes Festplattenimage" + IDS_4120 "Überschreiben" + IDS_4121 "Nicht überschreiben" + IDS_4122 "Rohdatenimages (.img)" + IDS_4123 "HDI-Images (.hdi)" + IDS_4124 "HDX-Images (.hdx)" + IDS_4125 "VHD mit fester Größe (.vhd)" + IDS_4126 "VHD mit dynamischer Größe (.vhd)" + IDS_4127 "Differenzierende VHD (.vhd)" + IDS_4128 "Große Blöcke (2 MB)" + IDS_4129 "Kleine Blöcke (512 KB)" + IDS_4130 "VHD-Dateien (*.VHD)\0*.VHD\0Alle Dateien (*.*)\0*.*\0" + IDS_4131 "Eltern-VHD-Datei bitte auswählen" + IDS_4132 "Dies bedeutet, dass das Elternimage nach der Erstellung des differenzierenden Images erzeugt wurde.\n\nDies kann auch passieren, falls die Image-Dateien verschoben oder kopiert wurden. Ebenso kann auch dies durch einen Bug im Programm, welches das Image erstellt hat, passieren.\n\nMöchten Sie die Zeitstempel korrigieren?" + IDS_4133 "Die Zeitstempel der Eltern- und der Kindesplatte stimmen nicht überein" + IDS_4134 "Der Zeitstempel der VHD konnte nicht korrigiert werden." + IDS_4135 "%01i:%02i" IDS_4352 "MFM/RLL" IDS_4353 "XTA" @@ -594,56 +594,56 @@ BEGIN IDS_4356 "ATAPI" IDS_4357 "SCSI" - IDS_4608 "MFM/RLL (%01i:%01i)" - IDS_4609 "XTA (%01i:%01i)" - IDS_4610 "ESDI (%01i:%01i)" - IDS_4611 "IDE (%01i:%01i)" - IDS_4612 "ATAPI (%01i:%01i)" - IDS_4613 "SCSI (%01i:%02i)" + IDS_4608 "MFM/RLL (%01i:%01i)" + IDS_4609 "XTA (%01i:%01i)" + IDS_4610 "ESDI (%01i:%01i)" + IDS_4611 "IDE (%01i:%01i)" + IDS_4612 "ATAPI (%01i:%01i)" + IDS_4613 "SCSI (%01i:%02i)" - IDS_5120 "CD-ROM %i (%s): %s" + IDS_5120 "CD-ROM %i (%s): %s" - IDS_5376 "Deaktiviert" - IDS_5381 "ATAPI" + IDS_5376 "Deaktiviert" + IDS_5381 "ATAPI" IDS_5382 "SCSI" - IDS_5632 "Deaktiviert" - IDS_5637 "ATAPI (%01i:%01i)" + IDS_5632 "Deaktiviert" + IDS_5637 "ATAPI (%01i:%01i)" IDS_5638 "SCSI (%01i:%02i)" - IDS_5888 "160 kB" - IDS_5889 "180 kB" - IDS_5890 "320 kB" - IDS_5891 "360 kB" - IDS_5892 "640 kB" - IDS_5893 "720 kB" - IDS_5894 "1,2 MB" - IDS_5895 "1,25 MB" - IDS_5896 "1,44 MB" - IDS_5897 "DMF (1024 Cluster)" - IDS_5898 "DMF (2048 Cluster)" - IDS_5899 "2,88 MB" - IDS_5900 "ZIP 100" - IDS_5901 "ZIP 250" - IDS_5902 "3,5-Zoll 128 MB (ISO 10090)" - IDS_5903 "3,5-Zoll 230 MB (ISO 13963)" - IDS_5904 "3,5-Zoll 540 MB (ISO 15498)" - IDS_5905 "3,5-Zoll 640 MB (ISO 15498)" - IDS_5906 "3,5-Zoll 1,3 GB (GigaMO)" - IDS_5907 "3,5-Zoll 2,3 GB (GigaMO 2)" - IDS_5908 "5,25-Zoll 600 MB" - IDS_5909 "5,25-Zoll 650 MB" - IDS_5910 "5,25-Zoll 1 GB" - IDS_5911 "5,25-Zoll 1,3 GB" + IDS_5888 "160 kB" + IDS_5889 "180 kB" + IDS_5890 "320 kB" + IDS_5891 "360 kB" + IDS_5892 "640 kB" + IDS_5893 "720 kB" + IDS_5894 "1,2 MB" + IDS_5895 "1,25 MB" + IDS_5896 "1,44 MB" + IDS_5897 "DMF (1024 Cluster)" + IDS_5898 "DMF (2048 Cluster)" + IDS_5899 "2,88 MB" + IDS_5900 "ZIP 100" + IDS_5901 "ZIP 250" + IDS_5902 "3,5-Zoll 128 MB (ISO 10090)" + IDS_5903 "3,5-Zoll 230 MB (ISO 13963)" + IDS_5904 "3,5-Zoll 540 MB (ISO 15498)" + IDS_5905 "3,5-Zoll 640 MB (ISO 15498)" + IDS_5906 "3,5-Zoll 1,3 GB (GigaMO)" + IDS_5907 "3,5-Zoll 2,3 GB (GigaMO 2)" + IDS_5908 "5,25-Zoll 600 MB" + IDS_5909 "5,25-Zoll 650 MB" + IDS_5910 "5,25-Zoll 1 GB" + IDS_5911 "5,25-Zoll 1,3 GB" - IDS_6144 "Perfekte Drehzahl" - IDS_6145 "1% unterhalb der perfekten Drehzahl" - IDS_6146 "1,5% unterhalb der perfekten Drehzahl" - IDS_6147 "2% unterhalb der perfekten Drehzahl" + IDS_6144 "Perfekte Drehzahl" + IDS_6145 "1% unterhalb der perfekten Drehzahl" + IDS_6146 "1,5% unterhalb der perfekten Drehzahl" + IDS_6147 "2% unterhalb der perfekten Drehzahl" - IDS_7168 "(Systemstandard)" + IDS_7168 "(Systemstandard)" END -#define IDS_LANG_ENUS IDS_7168 +#define IDS_LANG_ENUS IDS_7168 // German (de-DE) resources ///////////////////////////////////////////////////////////////////////////// diff --git a/src/win/languages/en-GB.rc b/src/win/languages/en-GB.rc index d94ecf0a0..d673f1a2c 100644 --- a/src/win/languages/en-GB.rc +++ b/src/win/languages/en-GB.rc @@ -17,40 +17,40 @@ MainMenu MENU DISCARDABLE BEGIN POPUP "&Action" BEGIN - MENUITEM "&Keyboard requires capture", IDM_ACTION_KBD_REQ_CAPTURE - MENUITEM "&Right CTRL is left ALT", IDM_ACTION_RCTRL_IS_LALT + MENUITEM "&Keyboard requires capture", IDM_ACTION_KBD_REQ_CAPTURE + MENUITEM "&Right CTRL is left ALT", IDM_ACTION_RCTRL_IS_LALT MENUITEM SEPARATOR - MENUITEM "&Hard Reset...", IDM_ACTION_HRESET - MENUITEM "&Ctrl+Alt+Del\tCtrl+F12", IDM_ACTION_RESET_CAD + MENUITEM "&Hard Reset...", IDM_ACTION_HRESET + MENUITEM "&Ctrl+Alt+Del\tCtrl+F12", IDM_ACTION_RESET_CAD MENUITEM SEPARATOR - MENUITEM "Ctrl+Alt+&Esc", IDM_ACTION_CTRL_ALT_ESC + MENUITEM "Ctrl+Alt+&Esc", IDM_ACTION_CTRL_ALT_ESC MENUITEM SEPARATOR - MENUITEM "&Pause", IDM_ACTION_PAUSE + MENUITEM "&Pause", IDM_ACTION_PAUSE MENUITEM SEPARATOR - MENUITEM "E&xit...", IDM_ACTION_EXIT + MENUITEM "E&xit...", IDM_ACTION_EXIT END POPUP "&View" BEGIN - MENUITEM "&Hide status bar", IDM_VID_HIDE_STATUS_BAR - MENUITEM "Hide &toolbar", IDM_VID_HIDE_TOOLBAR + MENUITEM "&Hide status bar", IDM_VID_HIDE_STATUS_BAR + MENUITEM "Hide &toolbar", IDM_VID_HIDE_TOOLBAR MENUITEM SEPARATOR - MENUITEM "&Show non-primary monitors", IDM_VID_MONITORS - MENUITEM "&Resizeable window", IDM_VID_RESIZE - MENUITEM "R&emember size && position", IDM_VID_REMEMBER + MENUITEM "&Show non-primary monitors", IDM_VID_MONITORS + MENUITEM "&Resizeable window", IDM_VID_RESIZE + MENUITEM "R&emember size && position", IDM_VID_REMEMBER MENUITEM SEPARATOR POPUP "Re&nderer" BEGIN - MENUITEM "&SDL (Software)", IDM_VID_SDL_SW - MENUITEM "SDL (&Hardware)", IDM_VID_SDL_HW - MENUITEM "SDL (&OpenGL)", IDM_VID_SDL_OPENGL - MENUITEM "Open&GL (3.0 Core)", IDM_VID_OPENGL_CORE + MENUITEM "&SDL (Software)", IDM_VID_SDL_SW + MENUITEM "SDL (&Hardware)", IDM_VID_SDL_HW + MENUITEM "SDL (&OpenGL)", IDM_VID_SDL_OPENGL + MENUITEM "Open&GL (3.0 Core)", IDM_VID_OPENGL_CORE #ifdef USE_VNC - MENUITEM "&VNC", IDM_VID_VNC + MENUITEM "&VNC", IDM_VID_VNC #endif END MENUITEM SEPARATOR - MENUITEM "Specify dimensions...", IDM_VID_SPECIFY_DIM - MENUITEM "F&orce 4:3 display ratio", IDM_VID_FORCE43 + MENUITEM "Specify dimensions...", IDM_VID_SPECIFY_DIM + MENUITEM "F&orce 4:3 display ratio", IDM_VID_FORCE43 POPUP "&Window scale factor" BEGIN MENUITEM "&0.5x", IDM_VID_SCALE_1X @@ -66,65 +66,65 @@ BEGIN END POPUP "Filter method" BEGIN - MENUITEM "&Nearest", IDM_VID_FILTER_NEAREST - MENUITEM "&Linear", IDM_VID_FILTER_LINEAR + MENUITEM "&Nearest", IDM_VID_FILTER_NEAREST + MENUITEM "&Linear", IDM_VID_FILTER_LINEAR END - MENUITEM "Hi&DPI scaling", IDM_VID_HIDPI + MENUITEM "Hi&DPI scaling", IDM_VID_HIDPI MENUITEM SEPARATOR - MENUITEM "&Fullscreen\tCtrl+Alt+PgUp", IDM_VID_FULLSCREEN + MENUITEM "&Fullscreen\tCtrl+Alt+PgUp", IDM_VID_FULLSCREEN POPUP "Fullscreen &stretch mode" BEGIN - MENUITEM "&Full screen stretch", IDM_VID_FS_FULL - MENUITEM "&4:3", IDM_VID_FS_43 + MENUITEM "&Full screen stretch", IDM_VID_FS_FULL + MENUITEM "&4:3", IDM_VID_FS_43 MENUITEM "&Square pixels (Keep ratio)", IDM_VID_FS_KEEPRATIO - MENUITEM "&Integer scale", IDM_VID_FS_INT + MENUITEM "&Integer scale", IDM_VID_FS_INT END POPUP "E&GA/(S)VGA settings" BEGIN - MENUITEM "&Inverted VGA monitor", IDM_VID_INVERT + MENUITEM "&Inverted VGA monitor", IDM_VID_INVERT POPUP "VGA screen &type" BEGIN - MENUITEM "RGB &Colour", IDM_VID_GRAY_RGB - MENUITEM "&RGB Greyscale", IDM_VID_GRAY_MONO - MENUITEM "&Amber monitor", IDM_VID_GRAY_AMBER - MENUITEM "&Green monitor", IDM_VID_GRAY_GREEN - MENUITEM "&White monitor", IDM_VID_GRAY_WHITE + MENUITEM "RGB &Colour", IDM_VID_GRAY_RGB + MENUITEM "&RGB Greyscale", IDM_VID_GRAY_MONO + MENUITEM "&Amber monitor", IDM_VID_GRAY_AMBER + MENUITEM "&Green monitor", IDM_VID_GRAY_GREEN + MENUITEM "&White monitor", IDM_VID_GRAY_WHITE END POPUP "Grayscale &conversion type" BEGIN - MENUITEM "BT&601 (NTSC/PAL)", IDM_VID_GRAYCT_601 - MENUITEM "BT&709 (HDTV)", IDM_VID_GRAYCT_709 - MENUITEM "&Average", IDM_VID_GRAYCT_AVE + MENUITEM "BT&601 (NTSC/PAL)", IDM_VID_GRAYCT_601 + MENUITEM "BT&709 (HDTV)", IDM_VID_GRAYCT_709 + MENUITEM "&Average", IDM_VID_GRAYCT_AVE END END MENUITEM SEPARATOR - MENUITEM "CGA/PCjr/Tandy/E&GA/(S)VGA overscan", IDM_VID_OVERSCAN + MENUITEM "CGA/PCjr/Tandy/E&GA/(S)VGA overscan", IDM_VID_OVERSCAN MENUITEM "Change contrast for &monochrome display", IDM_VID_CGACON END - MENUITEM "&Media", IDM_MEDIA + MENUITEM "&Media", IDM_MEDIA POPUP "&Tools" BEGIN - MENUITEM "&Settings...", IDM_CONFIG - MENUITEM "&Update status bar icons", IDM_UPDATE_ICONS + MENUITEM "&Settings...", IDM_CONFIG + MENUITEM "&Update status bar icons", IDM_UPDATE_ICONS MENUITEM SEPARATOR - MENUITEM "Take s&creenshot\tCtrl+F11", IDM_ACTION_SCREENSHOT + MENUITEM "Take s&creenshot\tCtrl+F11", IDM_ACTION_SCREENSHOT MENUITEM SEPARATOR - MENUITEM "&Preferences...", IDM_PREFERENCES + MENUITEM "&Preferences...", IDM_PREFERENCES #ifdef DISCORD MENUITEM "Enable &Discord integration", IDM_DISCORD #endif MENUITEM SEPARATOR - MENUITEM "Sound &gain...", IDM_SND_GAIN + MENUITEM "Sound &gain...", IDM_SND_GAIN #ifdef MTR_ENABLED MENUITEM SEPARATOR - MENUITEM "Begin trace\tCtrl+T", IDM_ACTION_BEGIN_TRACE - MENUITEM "End trace\tCtrl+T", IDM_ACTION_END_TRACE + MENUITEM "Begin trace\tCtrl+T", IDM_ACTION_BEGIN_TRACE + MENUITEM "End trace\tCtrl+T", IDM_ACTION_END_TRACE #endif END POPUP "&Help" BEGIN - MENUITEM "&Documentation...", IDM_DOCS - MENUITEM "&About 86Box...", IDM_ABOUT + MENUITEM "&Documentation...", IDM_DOCS + MENUITEM "&About 86Box...", IDM_ABOUT END END @@ -137,17 +137,17 @@ CassetteSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&New image...", IDM_CASSETTE_IMAGE_NEW + MENUITEM "&New image...", IDM_CASSETTE_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&Existing image...", IDM_CASSETTE_IMAGE_EXISTING - MENUITEM "Existing image (&Write-protected)...", IDM_CASSETTE_IMAGE_EXISTING_WP + MENUITEM "&Existing image...", IDM_CASSETTE_IMAGE_EXISTING + MENUITEM "Existing image (&Write-protected)...", IDM_CASSETTE_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "&Record", IDM_CASSETTE_RECORD - MENUITEM "&Play", IDM_CASSETTE_PLAY - MENUITEM "&Rewind to the beginning", IDM_CASSETTE_REWIND - MENUITEM "&Fast forward to the end", IDM_CASSETTE_FAST_FORWARD + MENUITEM "&Record", IDM_CASSETTE_RECORD + MENUITEM "&Play", IDM_CASSETTE_PLAY + MENUITEM "&Rewind to the beginning", IDM_CASSETTE_REWIND + MENUITEM "&Fast forward to the end", IDM_CASSETTE_FAST_FORWARD MENUITEM SEPARATOR - MENUITEM "E&ject", IDM_CASSETTE_EJECT + MENUITEM "E&ject", IDM_CASSETTE_EJECT END END @@ -155,9 +155,9 @@ CartridgeSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Image...", IDM_CARTRIDGE_IMAGE + MENUITEM "&Image...", IDM_CARTRIDGE_IMAGE MENUITEM SEPARATOR - MENUITEM "E&ject", IDM_CARTRIDGE_EJECT + MENUITEM "E&ject", IDM_CARTRIDGE_EJECT END END @@ -165,14 +165,14 @@ FloppySubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&New image...", IDM_FLOPPY_IMAGE_NEW + MENUITEM "&New image...", IDM_FLOPPY_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&Existing image...", IDM_FLOPPY_IMAGE_EXISTING - MENUITEM "Existing image (&Write-protected)...", IDM_FLOPPY_IMAGE_EXISTING_WP + MENUITEM "&Existing image...", IDM_FLOPPY_IMAGE_EXISTING + MENUITEM "Existing image (&Write-protected)...", IDM_FLOPPY_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "E&xport to 86F...", IDM_FLOPPY_EXPORT_TO_86F + MENUITEM "E&xport to 86F...", IDM_FLOPPY_EXPORT_TO_86F MENUITEM SEPARATOR - MENUITEM "E&ject", IDM_FLOPPY_EJECT + MENUITEM "E&ject", IDM_FLOPPY_EJECT END END @@ -180,13 +180,13 @@ CdromSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Mute", IDM_CDROM_MUTE + MENUITEM "&Mute", IDM_CDROM_MUTE MENUITEM SEPARATOR - MENUITEM "E&mpty", IDM_CDROM_EMPTY - MENUITEM "&Reload previous image", IDM_CDROM_RELOAD + MENUITEM "E&mpty", IDM_CDROM_EMPTY + MENUITEM "&Reload previous image", IDM_CDROM_RELOAD MENUITEM SEPARATOR - MENUITEM "&Image...", IDM_CDROM_IMAGE - MENUITEM "&Folder...", IDM_CDROM_DIR + MENUITEM "&Image...", IDM_CDROM_IMAGE + MENUITEM "&Folder...", IDM_CDROM_DIR END END @@ -194,13 +194,13 @@ ZIPSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&New image...", IDM_ZIP_IMAGE_NEW + MENUITEM "&New image...", IDM_ZIP_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&Existing image...", IDM_ZIP_IMAGE_EXISTING - MENUITEM "Existing image (&Write-protected)...", IDM_ZIP_IMAGE_EXISTING_WP + MENUITEM "&Existing image...", IDM_ZIP_IMAGE_EXISTING + MENUITEM "Existing image (&Write-protected)...", IDM_ZIP_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "E&ject", IDM_ZIP_EJECT - MENUITEM "&Reload previous image", IDM_ZIP_RELOAD + MENUITEM "E&ject", IDM_ZIP_EJECT + MENUITEM "&Reload previous image", IDM_ZIP_RELOAD END END @@ -208,13 +208,13 @@ MOSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&New image...", IDM_MO_IMAGE_NEW + MENUITEM "&New image...", IDM_MO_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&Existing image...", IDM_MO_IMAGE_EXISTING - MENUITEM "Existing image (&Write-protected)...", IDM_MO_IMAGE_EXISTING_WP + MENUITEM "&Existing image...", IDM_MO_IMAGE_EXISTING + MENUITEM "Existing image (&Write-protected)...", IDM_MO_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "E&ject", IDM_MO_EJECT - MENUITEM "&Reload previous image", IDM_MO_RELOAD + MENUITEM "E&ject", IDM_MO_EJECT + MENUITEM "&Reload previous image", IDM_MO_RELOAD END END @@ -240,150 +240,150 @@ END // Dialog // -#define STR_PREFERENCES "Preferences" -#define STR_SND_GAIN "Sound Gain" -#define STR_NEW_FLOPPY "New Image" -#define STR_CONFIG "Settings" -#define STR_SPECIFY_DIM "Specify Main Window Dimensions" +#define STR_PREFERENCES "Preferences" +#define STR_SND_GAIN "Sound Gain" +#define STR_NEW_FLOPPY "New Image" +#define STR_CONFIG "Settings" +#define STR_SPECIFY_DIM "Specify Main Window Dimensions" -#define STR_OK "OK" -#define STR_CANCEL "Cancel" -#define STR_GLOBAL "Save these settings as &global defaults" -#define STR_DEFAULT "&Default" -#define STR_LANGUAGE "Language:" -#define STR_ICONSET "Icon set:" +#define STR_OK "OK" +#define STR_CANCEL "Cancel" +#define STR_GLOBAL "Save these settings as &global defaults" +#define STR_DEFAULT "&Default" +#define STR_LANGUAGE "Language:" +#define STR_ICONSET "Icon set:" -#define STR_GAIN "Gain" +#define STR_GAIN "Gain" -#define STR_FILE_NAME "File name:" -#define STR_DISK_SIZE "Disk size:" -#define STR_RPM_MODE "RPM mode:" -#define STR_PROGRESS "Progress:" +#define STR_FILE_NAME "File name:" +#define STR_DISK_SIZE "Disk size:" +#define STR_RPM_MODE "RPM mode:" +#define STR_PROGRESS "Progress:" -#define STR_WIDTH "Width:" -#define STR_HEIGHT "Height:" -#define STR_LOCK_TO_SIZE "Lock to this size" +#define STR_WIDTH "Width:" +#define STR_HEIGHT "Height:" +#define STR_LOCK_TO_SIZE "Lock to this size" -#define STR_MACHINE_TYPE "Machine type:" -#define STR_MACHINE "Machine:" -#define STR_CONFIGURE "Configure" -#define STR_CPU_TYPE "CPU type:" -#define STR_CPU_SPEED "Speed:" -#define STR_FPU "FPU:" -#define STR_WAIT_STATES "Wait states:" -#define STR_MB "MB" -#define STR_MEMORY "Memory:" -#define STR_TIME_SYNC "Time synchronization" -#define STR_DISABLED "Disabled" -#define STR_ENABLED_LOCAL "Enabled (local time)" -#define STR_ENABLED_UTC "Enabled (UTC)" -#define STR_DYNAREC "Dynamic Recompiler" +#define STR_MACHINE_TYPE "Machine type:" +#define STR_MACHINE "Machine:" +#define STR_CONFIGURE "Configure" +#define STR_CPU_TYPE "CPU type:" +#define STR_CPU_SPEED "Speed:" +#define STR_FPU "FPU:" +#define STR_WAIT_STATES "Wait states:" +#define STR_MB "MB" +#define STR_MEMORY "Memory:" +#define STR_TIME_SYNC "Time synchronization" +#define STR_DISABLED "Disabled" +#define STR_ENABLED_LOCAL "Enabled (local time)" +#define STR_ENABLED_UTC "Enabled (UTC)" +#define STR_DYNAREC "Dynamic Recompiler" -#define STR_VIDEO "Video:" -#define STR_VIDEO_2 "Video 2:" -#define STR_VOODOO "Voodoo Graphics" -#define STR_IBM8514 "IBM 8514/a Graphics" -#define STR_XGA "XGA Graphics" +#define STR_VIDEO "Video:" +#define STR_VIDEO_2 "Video 2:" +#define STR_VOODOO "Voodoo Graphics" +#define STR_IBM8514 "IBM 8514/a Graphics" +#define STR_XGA "XGA Graphics" -#define STR_MOUSE "Mouse:" -#define STR_JOYSTICK "Joystick:" -#define STR_JOY1 "Joystick 1..." -#define STR_JOY2 "Joystick 2..." -#define STR_JOY3 "Joystick 3..." -#define STR_JOY4 "Joystick 4..." +#define STR_MOUSE "Mouse:" +#define STR_JOYSTICK "Joystick:" +#define STR_JOY1 "Joystick 1..." +#define STR_JOY2 "Joystick 2..." +#define STR_JOY3 "Joystick 3..." +#define STR_JOY4 "Joystick 4..." -#define STR_SOUND1 "Sound card 1:" -#define STR_SOUND2 "Sound card 2:" -#define STR_SOUND3 "Sound card 3:" -#define STR_SOUND4 "Sound card 4:" -#define STR_MIDI_OUT "MIDI Out Device:" -#define STR_MIDI_IN "MIDI In Device:" -#define STR_MPU401 "Standalone MPU-401" -#define STR_FLOAT "Use FLOAT32 sound" -#define STR_FM_DRIVER "FM synth driver" -#define STR_FM_DRV_NUKED "Nuked (more accurate)" -#define STR_FM_DRV_YMFM "YMFM (faster)" +#define STR_SOUND1 "Sound card 1:" +#define STR_SOUND2 "Sound card 2:" +#define STR_SOUND3 "Sound card 3:" +#define STR_SOUND4 "Sound card 4:" +#define STR_MIDI_OUT "MIDI Out Device:" +#define STR_MIDI_IN "MIDI In Device:" +#define STR_MPU401 "Standalone MPU-401" +#define STR_FLOAT "Use FLOAT32 sound" +#define STR_FM_DRIVER "FM synth driver" +#define STR_FM_DRV_NUKED "Nuked (more accurate)" +#define STR_FM_DRV_YMFM "YMFM (faster)" -#define STR_NET_TYPE "Network type:" -#define STR_PCAP "PCap device:" -#define STR_NET "Network adapter:" -#define STR_NET1 "Network card 1:" -#define STR_NET2 "Network card 2:" -#define STR_NET3 "Network card 3:" -#define STR_NET4 "Network card 4:" +#define STR_NET_TYPE "Network type:" +#define STR_PCAP "PCap device:" +#define STR_NET "Network adapter:" +#define STR_NET1 "Network card 1:" +#define STR_NET2 "Network card 2:" +#define STR_NET3 "Network card 3:" +#define STR_NET4 "Network card 4:" -#define STR_COM1 "COM1 Device:" -#define STR_COM2 "COM2 Device:" -#define STR_COM3 "COM3 Device:" -#define STR_COM4 "COM4 Device:" -#define STR_LPT1 "LPT1 Device:" -#define STR_LPT2 "LPT2 Device:" -#define STR_LPT3 "LPT3 Device:" -#define STR_LPT4 "LPT4 Device:" -#define STR_SERIAL1 "Serial port 1" -#define STR_SERIAL2 "Serial port 2" -#define STR_SERIAL3 "Serial port 3" -#define STR_SERIAL4 "Serial port 4" -#define STR_PARALLEL1 "Parallel port 1" -#define STR_PARALLEL2 "Parallel port 2" -#define STR_PARALLEL3 "Parallel port 3" -#define STR_PARALLEL4 "Parallel port 4" -#define STR_SERIAL_PASS1 "Serial port passthrough 1" -#define STR_SERIAL_PASS2 "Serial port passthrough 2" -#define STR_SERIAL_PASS3 "Serial port passthrough 3" -#define STR_SERIAL_PASS4 "Serial port passthrough 4" +#define STR_COM1 "COM1 Device:" +#define STR_COM2 "COM2 Device:" +#define STR_COM3 "COM3 Device:" +#define STR_COM4 "COM4 Device:" +#define STR_LPT1 "LPT1 Device:" +#define STR_LPT2 "LPT2 Device:" +#define STR_LPT3 "LPT3 Device:" +#define STR_LPT4 "LPT4 Device:" +#define STR_SERIAL1 "Serial port 1" +#define STR_SERIAL2 "Serial port 2" +#define STR_SERIAL3 "Serial port 3" +#define STR_SERIAL4 "Serial port 4" +#define STR_PARALLEL1 "Parallel port 1" +#define STR_PARALLEL2 "Parallel port 2" +#define STR_PARALLEL3 "Parallel port 3" +#define STR_PARALLEL4 "Parallel port 4" +#define STR_SERIAL_PASS1 "Serial port passthrough 1" +#define STR_SERIAL_PASS2 "Serial port passthrough 2" +#define STR_SERIAL_PASS3 "Serial port passthrough 3" +#define STR_SERIAL_PASS4 "Serial port passthrough 4" -#define STR_HDC "HD Controller:" -#define STR_FDC "FD Controller:" -#define STR_IDE_TER "Tertiary IDE Controller" -#define STR_IDE_QUA "Quaternary IDE Controller" -#define STR_SCSI "SCSI" -#define STR_SCSI_1 "Controller 1:" -#define STR_SCSI_2 "Controller 2:" -#define STR_SCSI_3 "Controller 3:" -#define STR_SCSI_4 "Controller 4:" -#define STR_CASSETTE "Cassette" +#define STR_HDC "HD Controller:" +#define STR_FDC "FD Controller:" +#define STR_IDE_TER "Tertiary IDE Controller" +#define STR_IDE_QUA "Quaternary IDE Controller" +#define STR_SCSI "SCSI" +#define STR_SCSI_1 "Controller 1:" +#define STR_SCSI_2 "Controller 2:" +#define STR_SCSI_3 "Controller 3:" +#define STR_SCSI_4 "Controller 4:" +#define STR_CASSETTE "Cassette" -#define STR_HDD "Hard disks:" -#define STR_NEW "&New..." -#define STR_EXISTING "&Existing..." -#define STR_REMOVE "&Remove" -#define STR_BUS "Bus:" -#define STR_CHANNEL "Channel:" -#define STR_ID "ID:" -#define STR_SPEED "Speed:" +#define STR_HDD "Hard disks:" +#define STR_NEW "&New..." +#define STR_EXISTING "&Existing..." +#define STR_REMOVE "&Remove" +#define STR_BUS "Bus:" +#define STR_CHANNEL "Channel:" +#define STR_ID "ID:" +#define STR_SPEED "Speed:" -#define STR_SPECIFY "&Specify..." -#define STR_SECTORS "Sectors:" -#define STR_HEADS "Heads:" -#define STR_CYLS "Cylinders:" -#define STR_SIZE_MB "Size (MB):" -#define STR_TYPE "Type:" -#define STR_IMG_FORMAT "Image Format:" -#define STR_BLOCK_SIZE "Block Size:" +#define STR_SPECIFY "&Specify..." +#define STR_SECTORS "Sectors:" +#define STR_HEADS "Heads:" +#define STR_CYLS "Cylinders:" +#define STR_SIZE_MB "Size (MB):" +#define STR_TYPE "Type:" +#define STR_IMG_FORMAT "Image Format:" +#define STR_BLOCK_SIZE "Block Size:" -#define STR_FLOPPY_DRIVES "Floppy drives:" -#define STR_TURBO "Turbo timings" -#define STR_CHECKBPB "Check BPB" -#define STR_CDROM_DRIVES "CD-ROM drives:" -#define STR_CD_SPEED "Speed:" -#define STR_EARLY "Earlier drive" +#define STR_FLOPPY_DRIVES "Floppy drives:" +#define STR_TURBO "Turbo timings" +#define STR_CHECKBPB "Check BPB" +#define STR_CDROM_DRIVES "CD-ROM drives:" +#define STR_CD_SPEED "Speed:" +#define STR_EARLY "Earlier drive" -#define STR_MO_DRIVES "MO drives:" -#define STR_ZIP_DRIVES "ZIP drives:" -#define STR_250 "ZIP 250" +#define STR_MO_DRIVES "MO drives:" +#define STR_ZIP_DRIVES "ZIP drives:" +#define STR_250 "ZIP 250" -#define STR_ISARTC "ISA RTC:" -#define STR_ISAMEM "ISA Memory Expansion" -#define STR_ISAMEM_1 "Card 1:" -#define STR_ISAMEM_2 "Card 2:" -#define STR_ISAMEM_3 "Card 3:" -#define STR_ISAMEM_4 "Card 4:" -#define STR_BUGGER "ISABugger device" -#define STR_POSTCARD "POST card" +#define STR_ISARTC "ISA RTC:" +#define STR_ISAMEM "ISA Memory Expansion" +#define STR_ISAMEM_1 "Card 1:" +#define STR_ISAMEM_2 "Card 2:" +#define STR_ISAMEM_3 "Card 3:" +#define STR_ISAMEM_4 "Card 4:" +#define STR_BUGGER "ISABugger device" +#define STR_POSTCARD "POST card" -#define FONT_SIZE 9 -#define FONT_NAME "Segoe UI" +#define FONT_SIZE 9 +#define FONT_NAME "Segoe UI" #include "dialogs.rc" @@ -394,149 +394,149 @@ END STRINGTABLE DISCARDABLE BEGIN - 2048 "86Box" - IDS_2049 "Error" - IDS_2050 "Fatal error" - IDS_2051 " - PAUSED" - IDS_2052 "Press Ctrl+Alt+PgDn to return to windowed mode." - IDS_2053 "Speed" - IDS_2054 "ZIP %03i %i (%s): %ls" - IDS_2055 "ZIP images (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" - IDS_2056 "86Box could not find any usable ROM images.\n\nPlease download a ROM set and extract it into the ""roms"" directory." - IDS_2057 "(empty)" - IDS_2058 "ZIP images (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0All files (*.*)\0*.*\0" - IDS_2059 "Turbo" - IDS_2060 "On" - IDS_2061 "Off" - IDS_2062 "All images (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0Basic sector images (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Surface images (*.86F)\0*.86F\0" - IDS_2063 "Machine ""%hs"" is not available due to missing ROMs in the roms/machines directory. Switching to an available machine." + 2048 "86Box" + IDS_2049 "Error" + IDS_2050 "Fatal error" + IDS_2051 " - PAUSED" + IDS_2052 "Press Ctrl+Alt+PgDn to return to windowed mode." + IDS_2053 "Speed" + IDS_2054 "ZIP %03i %i (%s): %ls" + IDS_2055 "ZIP images (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" + IDS_2056 "86Box could not find any usable ROM images.\n\nPlease download a ROM set and extract it into the ""roms"" directory." + IDS_2057 "(empty)" + IDS_2058 "ZIP images (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0All files (*.*)\0*.*\0" + IDS_2059 "Turbo" + IDS_2060 "On" + IDS_2061 "Off" + IDS_2062 "All images (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0Basic sector images (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Surface images (*.86F)\0*.86F\0" + IDS_2063 "Machine ""%hs"" is not available due to missing ROMs in the roms/machines directory. Switching to an available machine." END STRINGTABLE DISCARDABLE BEGIN - IDS_2064 "Video card ""%hs"" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." - IDS_2065 "Machine" - IDS_2066 "Display" - IDS_2067 "Input devices" - IDS_2068 "Sound" - IDS_2069 "Network" - IDS_2070 "Ports (COM & LPT)" - IDS_2071 "Storage controllers" - IDS_2072 "Hard disks" - IDS_2073 "Floppy & CD-ROM drives" - IDS_2074 "Other removable devices" - IDS_2075 "Other peripherals" - IDS_2076 "Surface images (*.86F)\0*.86F\0" - IDS_2077 "Click to capture mouse" - IDS_2078 "Press F8+F12 to release mouse" - IDS_2079 "Press F8+F12 or middle button to release mouse" + IDS_2064 "Video card ""%hs"" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." + IDS_2065 "Machine" + IDS_2066 "Display" + IDS_2067 "Input devices" + IDS_2068 "Sound" + IDS_2069 "Network" + IDS_2070 "Ports (COM & LPT)" + IDS_2071 "Storage controllers" + IDS_2072 "Hard disks" + IDS_2073 "Floppy & CD-ROM drives" + IDS_2074 "Other removable devices" + IDS_2075 "Other peripherals" + IDS_2076 "Surface images (*.86F)\0*.86F\0" + IDS_2077 "Click to capture mouse" + IDS_2078 "Press F8+F12 to release mouse" + IDS_2079 "Press F8+F12 or middle button to release mouse" END STRINGTABLE DISCARDABLE BEGIN - IDS_2080 "Unable to initialize FluidSynth" - IDS_2081 "Bus" - IDS_2082 "File" - IDS_2083 "C" - IDS_2084 "H" - IDS_2085 "S" - IDS_2086 "MB" + IDS_2080 "Unable to initialize FluidSynth" + IDS_2081 "Bus" + IDS_2082 "File" + IDS_2083 "C" + IDS_2084 "H" + IDS_2085 "S" + IDS_2086 "MB" IDS_2087 "Speed" - IDS_2088 "Check BPB" - IDS_2089 "KB" - IDS_2090 "Could not initialize the video renderer." - IDS_2091 "Default" - IDS_2092 "%i Wait state(s)" - IDS_2093 "Type" - IDS_2094 "Failed to set up PCap" - IDS_2095 "No PCap devices found" - IDS_2096 "Invalid PCap device" - IDS_2097 "Standard 2-button joystick(s)" - IDS_2098 "Standard 4-button joystick" - IDS_2099 "Standard 6-button joystick" - IDS_2100 "Standard 8-button joystick" - IDS_2101 "CH Flightstick Pro" - IDS_2102 "Microsoft SideWinder Pad" - IDS_2103 "Thrustmaster Flight Control System" - IDS_2104 "None" - IDS_2105 "Unable to load keyboard accelerators." - IDS_2106 "Unable to register raw input." - IDS_2107 "%u" - IDS_2108 "%u MB (CHS: %i, %i, %i)" - IDS_2109 "Floppy %i (%s): %ls" - IDS_2110 "All images (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Advanced sector images (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Basic sector images (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Flux images (*.FDI)\0*.FDI\0Surface images (*.86F;*.MFM)\0*.86F;*.MFM\0All files (*.*)\0*.*\0" - IDS_2111 "Unable to initialize FreeType" - IDS_2112 "Unable to initialize SDL, SDL2.dll is required" - IDS_2113 "Are you sure you want to hard reset the emulated machine?" - IDS_2114 "Are you sure you want to exit 86Box?" - IDS_2115 "Unable to initialize Ghostscript" - IDS_2116 "MO %i (%ls): %ls" - IDS_2117 "MO images (*.IM?;*.MDI)\0*.IM?;*.MDI\0All files (*.*)\0*.*\0" - IDS_2118 "Welcome to 86Box!" - IDS_2119 "Internal controller" - IDS_2120 "Exit" - IDS_2121 "No ROMs found" - IDS_2122 "Do you want to save the settings?" - IDS_2123 "This will hard reset the emulated machine." - IDS_2124 "Save" - IDS_2125 "About 86Box" - IDS_2126 "86Box v" EMU_VERSION + IDS_2088 "Check BPB" + IDS_2089 "KB" + IDS_2090 "Could not initialize the video renderer." + IDS_2091 "Default" + IDS_2092 "%i Wait state(s)" + IDS_2093 "Type" + IDS_2094 "Failed to set up PCap" + IDS_2095 "No PCap devices found" + IDS_2096 "Invalid PCap device" + IDS_2097 "Standard 2-button joystick(s)" + IDS_2098 "Standard 4-button joystick" + IDS_2099 "Standard 6-button joystick" + IDS_2100 "Standard 8-button joystick" + IDS_2101 "CH Flightstick Pro" + IDS_2102 "Microsoft SideWinder Pad" + IDS_2103 "Thrustmaster Flight Control System" + IDS_2104 "None" + IDS_2105 "Unable to load keyboard accelerators." + IDS_2106 "Unable to register raw input." + IDS_2107 "%u" + IDS_2108 "%u MB (CHS: %i, %i, %i)" + IDS_2109 "Floppy %i (%s): %ls" + IDS_2110 "All images (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Advanced sector images (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Basic sector images (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Flux images (*.FDI)\0*.FDI\0Surface images (*.86F;*.MFM)\0*.86F;*.MFM\0All files (*.*)\0*.*\0" + IDS_2111 "Unable to initialize FreeType" + IDS_2112 "Unable to initialize SDL, SDL2.dll is required" + IDS_2113 "Are you sure you want to hard reset the emulated machine?" + IDS_2114 "Are you sure you want to exit 86Box?" + IDS_2115 "Unable to initialize Ghostscript" + IDS_2116 "MO %i (%ls): %ls" + IDS_2117 "MO images (*.IM?;*.MDI)\0*.IM?;*.MDI\0All files (*.*)\0*.*\0" + IDS_2118 "Welcome to 86Box!" + IDS_2119 "Internal controller" + IDS_2120 "Exit" + IDS_2121 "No ROMs found" + IDS_2122 "Do you want to save the settings?" + IDS_2123 "This will hard reset the emulated machine." + IDS_2124 "Save" + IDS_2125 "About 86Box" + IDS_2126 "86Box v" EMU_VERSION - IDS_2127 "An emulator of old computers\n\nAuthors: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, Tiseno100, reenigne, leilei, JohnElliott, greatpsycho, and others.\n\nReleased under the GNU General Public License version 2 or later. See LICENSE for more information." - IDS_2128 "OK" - IDS_2129 "Hardware not available" + IDS_2127 "An emulator of old computers\n\nAuthors: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, Tiseno100, reenigne, leilei, JohnElliott, greatpsycho, and others.\n\nReleased under the GNU General Public License version 2 or later. See LICENSE for more information." + IDS_2128 "OK" + IDS_2129 "Hardware not available" #ifdef _WIN32 #define LIB_NAME_PCAP "WinPcap" #else #define LIB_NAME_PCAP "libpcap" #endif - IDS_2130 "Make sure " LIB_NAME_PCAP " is installed and that you are on a " LIB_NAME_PCAP "-compatible network connection." - IDS_2131 "Invalid configuration" + IDS_2130 "Make sure " LIB_NAME_PCAP " is installed and that you are on a " LIB_NAME_PCAP "-compatible network connection." + IDS_2131 "Invalid configuration" #ifdef _WIN32 #define LIB_NAME_FREETYPE "freetype.dll" #else #define LIB_NAME_FREETYPE "libfreetype" #endif - IDS_2132 LIB_NAME_FREETYPE " is required for ESC/P printer emulation." + IDS_2132 LIB_NAME_FREETYPE " is required for ESC/P printer emulation." #ifdef _WIN32 #define LIB_NAME_GS "gsdll32.dll" #else #define LIB_NAME_GS "libgs" #endif - IDS_2133 LIB_NAME_GS " is required for automatic conversion of PostScript files to PDF.\n\nAny documents sent to the generic PostScript printer will be saved as PostScript (.ps) files." + IDS_2133 LIB_NAME_GS " is required for automatic conversion of PostScript files to PDF.\n\nAny documents sent to the generic PostScript printer will be saved as PostScript (.ps) files." #ifdef _WIN32 #define LIB_NAME_FLUIDSYNTH "libfluidsynth.dll" #else #define LIB_NAME_FLUIDSYNTH "libfluidsynth" #endif - IDS_2134 LIB_NAME_FLUIDSYNTH " is required for FluidSynth MIDI output." - IDS_2135 "Entering fullscreen mode" - IDS_2136 "Don't show this message again" - IDS_2137 "Don't exit" - IDS_2138 "Reset" - IDS_2139 "Don't reset" - IDS_2140 "MO images (*.IM?;*.MDI)\0*.IM?;*.MDI\0All files (*.*)\0*.*\0" - IDS_2141 "CD-ROM images (*.ISO;*.CUE)\0*.ISO;*.CUE\0All files (*.*)\0*.*\0" - IDS_2142 "%hs Device Configuration" + IDS_2134 LIB_NAME_FLUIDSYNTH " is required for FluidSynth MIDI output." + IDS_2135 "Entering fullscreen mode" + IDS_2136 "Don't show this message again" + IDS_2137 "Don't exit" + IDS_2138 "Reset" + IDS_2139 "Don't reset" + IDS_2140 "MO images (*.IM?;*.MDI)\0*.IM?;*.MDI\0All files (*.*)\0*.*\0" + IDS_2141 "CD-ROM images (*.ISO;*.CUE)\0*.ISO;*.CUE\0All files (*.*)\0*.*\0" + IDS_2142 "%hs Device Configuration" IDS_2143 "Monitor in sleep mode" - IDS_2144 "OpenGL Shaders (*.GLSL)\0*.GLSL\0All files (*.*)\0*.*\0" - IDS_2145 "OpenGL options" - IDS_2146 "You are loading an unsupported configuration" - IDS_2147 "CPU type filtering based on selected machine is disabled for this emulated machine.\n\nThis makes it possible to choose a CPU that is otherwise incompatible with the selected machine. However, you may run into incompatibilities with the machine BIOS or other software.\n\nEnabling this setting is not officially supported and any bug reports filed may be closed as invalid." - IDS_2148 "Continue" - IDS_2149 "Cassette: %s" - IDS_2150 "Cassette images (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0All files (*.*)\0*.*\0" - IDS_2151 "Cartridge %i: %ls" - IDS_2152 "Cartridge images (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0All files (*.*)\0*.*\0" - IDS_2153 "Error initializing renderer" - IDS_2154 "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." - IDS_2155 "Resume execution" - IDS_2156 "Pause execution" - IDS_2157 "Press Ctrl+Alt+Del" - IDS_2158 "Press Ctrl+Alt+Esc" - IDS_2159 "Hard reset" - IDS_2160 "ACPI shutdown" - IDS_2161 "Settings" + IDS_2144 "OpenGL Shaders (*.GLSL)\0*.GLSL\0All files (*.*)\0*.*\0" + IDS_2145 "OpenGL options" + IDS_2146 "You are loading an unsupported configuration" + IDS_2147 "CPU type filtering based on selected machine is disabled for this emulated machine.\n\nThis makes it possible to choose a CPU that is otherwise incompatible with the selected machine. However, you may run into incompatibilities with the machine BIOS or other software.\n\nEnabling this setting is not officially supported and any bug reports filed may be closed as invalid." + IDS_2148 "Continue" + IDS_2149 "Cassette: %s" + IDS_2150 "Cassette images (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0All files (*.*)\0*.*\0" + IDS_2151 "Cartridge %i: %ls" + IDS_2152 "Cartridge images (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0All files (*.*)\0*.*\0" + IDS_2153 "Error initializing renderer" + IDS_2154 "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." + IDS_2155 "Resume execution" + IDS_2156 "Pause execution" + IDS_2157 "Press Ctrl+Alt+Del" + IDS_2158 "Press Ctrl+Alt+Esc" + IDS_2159 "Hard reset" + IDS_2160 "ACPI shutdown" + IDS_2161 "Settings" IDS_2162 "Earlier drive" IDS_2163 "No Dynarec" IDS_2164 "Old Dynarec" @@ -547,45 +547,45 @@ END STRINGTABLE DISCARDABLE BEGIN IDS_4096 "Hard disk (%s)" - IDS_4097 "%01i:%01i" - IDS_4098 "%01i" - IDS_4099 "MFM/RLL or ESDI CD-ROM drives never existed" - IDS_4100 "Custom..." - IDS_4101 "Custom (large)..." - IDS_4102 "Add New Hard Disk" - IDS_4103 "Add Existing Hard Disk" - IDS_4104 "HDI disk images cannot be larger than 4 GB." - IDS_4105 "Disk images cannot be larger than 127 GB." - IDS_4106 "Hard disk images (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0All files (*.*)\0*.*\0" - IDS_4107 "Unable to read file" - IDS_4108 "Unable to write file" - IDS_4109 "HDI or HDX images with a sector size other than 512 are not supported." - IDS_4110 "USB is not yet supported" - IDS_4111 "Disk image file already exists" - IDS_4112 "Please specify a valid file name." - IDS_4113 "Disk image created" - IDS_4114 "Make sure the file exists and is readable." - IDS_4115 "Make sure the file is being saved to a writable directory." - IDS_4116 "Disk image too large" - IDS_4117 "Remember to partition and format the newly-created drive." - IDS_4118 "The selected file will be overwritten. Are you sure you want to use it?" - IDS_4119 "Unsupported disk image" - IDS_4120 "Overwrite" - IDS_4121 "Don't overwrite" - IDS_4122 "Raw image (.img)" - IDS_4123 "HDI image (.hdi)" - IDS_4124 "HDX image (.hdx)" - IDS_4125 "Fixed-size VHD (.vhd)" - IDS_4126 "Dynamic-size VHD (.vhd)" - IDS_4127 "Differencing VHD (.vhd)" - IDS_4128 "Large blocks (2 MB)" - IDS_4129 "Small blocks (512 KB)" - IDS_4130 "VHD files (*.VHD)\0*.VHD\0All files (*.*)\0*.*\0" - IDS_4131 "Select the parent VHD" - IDS_4132 "This could mean that the parent image was modified after the differencing image was created.\n\nIt can also happen if the image files were moved or copied, or by a bug in the program that created this disk.\n\nDo you want to fix the timestamps?" - IDS_4133 "Parent and child disk timestamps do not match" - IDS_4134 "Could not fix VHD timestamp." - IDS_4135 "%01i:%02i" + IDS_4097 "%01i:%01i" + IDS_4098 "%01i" + IDS_4099 "MFM/RLL or ESDI CD-ROM drives never existed" + IDS_4100 "Custom..." + IDS_4101 "Custom (large)..." + IDS_4102 "Add New Hard Disk" + IDS_4103 "Add Existing Hard Disk" + IDS_4104 "HDI disk images cannot be larger than 4 GB." + IDS_4105 "Disk images cannot be larger than 127 GB." + IDS_4106 "Hard disk images (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0All files (*.*)\0*.*\0" + IDS_4107 "Unable to read file" + IDS_4108 "Unable to write file" + IDS_4109 "HDI or HDX images with a sector size other than 512 are not supported." + IDS_4110 "USB is not yet supported" + IDS_4111 "Disk image file already exists" + IDS_4112 "Please specify a valid file name." + IDS_4113 "Disk image created" + IDS_4114 "Make sure the file exists and is readable." + IDS_4115 "Make sure the file is being saved to a writable directory." + IDS_4116 "Disk image too large" + IDS_4117 "Remember to partition and format the newly-created drive." + IDS_4118 "The selected file will be overwritten. Are you sure you want to use it?" + IDS_4119 "Unsupported disk image" + IDS_4120 "Overwrite" + IDS_4121 "Don't overwrite" + IDS_4122 "Raw image (.img)" + IDS_4123 "HDI image (.hdi)" + IDS_4124 "HDX image (.hdx)" + IDS_4125 "Fixed-size VHD (.vhd)" + IDS_4126 "Dynamic-size VHD (.vhd)" + IDS_4127 "Differencing VHD (.vhd)" + IDS_4128 "Large blocks (2 MB)" + IDS_4129 "Small blocks (512 KB)" + IDS_4130 "VHD files (*.VHD)\0*.VHD\0All files (*.*)\0*.*\0" + IDS_4131 "Select the parent VHD" + IDS_4132 "This could mean that the parent image was modified after the differencing image was created.\n\nIt can also happen if the image files were moved or copied, or by a bug in the program that created this disk.\n\nDo you want to fix the timestamps?" + IDS_4133 "Parent and child disk timestamps do not match" + IDS_4134 "Could not fix VHD timestamp." + IDS_4135 "%01i:%02i" IDS_4352 "MFM/RLL" IDS_4353 "XTA" @@ -594,56 +594,56 @@ BEGIN IDS_4356 "ATAPI" IDS_4357 "SCSI" - IDS_4608 "MFM/RLL (%01i:%01i)" - IDS_4609 "XTA (%01i:%01i)" - IDS_4610 "ESDI (%01i:%01i)" - IDS_4611 "IDE (%01i:%01i)" - IDS_4612 "ATAPI (%01i:%01i)" - IDS_4613 "SCSI (%01i:%02i)" + IDS_4608 "MFM/RLL (%01i:%01i)" + IDS_4609 "XTA (%01i:%01i)" + IDS_4610 "ESDI (%01i:%01i)" + IDS_4611 "IDE (%01i:%01i)" + IDS_4612 "ATAPI (%01i:%01i)" + IDS_4613 "SCSI (%01i:%02i)" - IDS_5120 "CD-ROM %i (%s): %s" + IDS_5120 "CD-ROM %i (%s): %s" - IDS_5376 "Disabled" - IDS_5381 "ATAPI" + IDS_5376 "Disabled" + IDS_5381 "ATAPI" IDS_5382 "SCSI" - IDS_5632 "Disabled" - IDS_5637 "ATAPI (%01i:%01i)" + IDS_5632 "Disabled" + IDS_5637 "ATAPI (%01i:%01i)" IDS_5638 "SCSI (%01i:%02i)" - IDS_5888 "160 kB" - IDS_5889 "180 kB" - IDS_5890 "320 kB" - IDS_5891 "360 kB" - IDS_5892 "640 kB" - IDS_5893 "720 kB" - IDS_5894 "1.2 MB" - IDS_5895 "1.25 MB" - IDS_5896 "1.44 MB" - IDS_5897 "DMF (cluster 1024)" - IDS_5898 "DMF (cluster 2048)" - IDS_5899 "2.88 MB" - IDS_5900 "ZIP 100" - IDS_5901 "ZIP 250" - IDS_5902 "3.5"" 128 MB (ISO 10090)" - IDS_5903 "3.5"" 230 MB (ISO 13963)" - IDS_5904 "3.5"" 540 MB (ISO 15498)" - IDS_5905 "3.5"" 640 MB (ISO 15498)" - IDS_5906 "3.5"" 1.3 GB (GigaMO)" - IDS_5907 "3.5"" 2.3 GB (GigaMO 2)" - IDS_5908 "5.25"" 600 MB" - IDS_5909 "5.25"" 650 MB" - IDS_5910 "5.25"" 1 GB" - IDS_5911 "5.25"" 1.3 GB" + IDS_5888 "160 kB" + IDS_5889 "180 kB" + IDS_5890 "320 kB" + IDS_5891 "360 kB" + IDS_5892 "640 kB" + IDS_5893 "720 kB" + IDS_5894 "1.2 MB" + IDS_5895 "1.25 MB" + IDS_5896 "1.44 MB" + IDS_5897 "DMF (cluster 1024)" + IDS_5898 "DMF (cluster 2048)" + IDS_5899 "2.88 MB" + IDS_5900 "ZIP 100" + IDS_5901 "ZIP 250" + IDS_5902 "3.5"" 128 MB (ISO 10090)" + IDS_5903 "3.5"" 230 MB (ISO 13963)" + IDS_5904 "3.5"" 540 MB (ISO 15498)" + IDS_5905 "3.5"" 640 MB (ISO 15498)" + IDS_5906 "3.5"" 1.3 GB (GigaMO)" + IDS_5907 "3.5"" 2.3 GB (GigaMO 2)" + IDS_5908 "5.25"" 600 MB" + IDS_5909 "5.25"" 650 MB" + IDS_5910 "5.25"" 1 GB" + IDS_5911 "5.25"" 1.3 GB" - IDS_6144 "Perfect RPM" - IDS_6145 "1% below perfect RPM" - IDS_6146 "1.5% below perfect RPM" - IDS_6147 "2% below perfect RPM" + IDS_6144 "Perfect RPM" + IDS_6145 "1% below perfect RPM" + IDS_6146 "1.5% below perfect RPM" + IDS_6147 "2% below perfect RPM" - IDS_7168 "(System Default)" + IDS_7168 "(System Default)" END -#define IDS_LANG_ENUS IDS_7168 +#define IDS_LANG_ENUS IDS_7168 // English (U.K.) resources ///////////////////////////////////////////////////////////////////////////// diff --git a/src/win/languages/en-US.rc b/src/win/languages/en-US.rc index 02270a509..047a64c94 100644 --- a/src/win/languages/en-US.rc +++ b/src/win/languages/en-US.rc @@ -17,40 +17,40 @@ MainMenu MENU DISCARDABLE BEGIN POPUP "&Action" BEGIN - MENUITEM "&Keyboard requires capture", IDM_ACTION_KBD_REQ_CAPTURE - MENUITEM "&Right CTRL is left ALT", IDM_ACTION_RCTRL_IS_LALT + MENUITEM "&Keyboard requires capture", IDM_ACTION_KBD_REQ_CAPTURE + MENUITEM "&Right CTRL is left ALT", IDM_ACTION_RCTRL_IS_LALT MENUITEM SEPARATOR - MENUITEM "&Hard Reset...", IDM_ACTION_HRESET - MENUITEM "&Ctrl+Alt+Del\tCtrl+F12", IDM_ACTION_RESET_CAD + MENUITEM "&Hard Reset...", IDM_ACTION_HRESET + MENUITEM "&Ctrl+Alt+Del\tCtrl+F12", IDM_ACTION_RESET_CAD MENUITEM SEPARATOR - MENUITEM "Ctrl+Alt+&Esc", IDM_ACTION_CTRL_ALT_ESC + MENUITEM "Ctrl+Alt+&Esc", IDM_ACTION_CTRL_ALT_ESC MENUITEM SEPARATOR - MENUITEM "&Pause", IDM_ACTION_PAUSE + MENUITEM "&Pause", IDM_ACTION_PAUSE MENUITEM SEPARATOR - MENUITEM "E&xit...", IDM_ACTION_EXIT + MENUITEM "E&xit...", IDM_ACTION_EXIT END POPUP "&View" BEGIN - MENUITEM "&Hide status bar", IDM_VID_HIDE_STATUS_BAR - MENUITEM "Hide &toolbar", IDM_VID_HIDE_TOOLBAR + MENUITEM "&Hide status bar", IDM_VID_HIDE_STATUS_BAR + MENUITEM "Hide &toolbar", IDM_VID_HIDE_TOOLBAR MENUITEM SEPARATOR - MENUITEM "&Show non-primary monitors", IDM_VID_MONITORS - MENUITEM "&Resizeable window", IDM_VID_RESIZE - MENUITEM "R&emember size && position", IDM_VID_REMEMBER + MENUITEM "&Show non-primary monitors", IDM_VID_MONITORS + MENUITEM "&Resizeable window", IDM_VID_RESIZE + MENUITEM "R&emember size && position", IDM_VID_REMEMBER MENUITEM SEPARATOR POPUP "Re&nderer" BEGIN - MENUITEM "&SDL (Software)", IDM_VID_SDL_SW - MENUITEM "SDL (&Hardware)", IDM_VID_SDL_HW - MENUITEM "SDL (&OpenGL)", IDM_VID_SDL_OPENGL - MENUITEM "Open&GL (3.0 Core)", IDM_VID_OPENGL_CORE + MENUITEM "&SDL (Software)", IDM_VID_SDL_SW + MENUITEM "SDL (&Hardware)", IDM_VID_SDL_HW + MENUITEM "SDL (&OpenGL)", IDM_VID_SDL_OPENGL + MENUITEM "Open&GL (3.0 Core)", IDM_VID_OPENGL_CORE #ifdef USE_VNC - MENUITEM "&VNC", IDM_VID_VNC + MENUITEM "&VNC", IDM_VID_VNC #endif END MENUITEM SEPARATOR - MENUITEM "Specify dimensions...", IDM_VID_SPECIFY_DIM - MENUITEM "F&orce 4:3 display ratio", IDM_VID_FORCE43 + MENUITEM "Specify dimensions...", IDM_VID_SPECIFY_DIM + MENUITEM "F&orce 4:3 display ratio", IDM_VID_FORCE43 POPUP "&Window scale factor" BEGIN MENUITEM "&0.5x", IDM_VID_SCALE_1X @@ -66,12 +66,12 @@ BEGIN END POPUP "Filter method" BEGIN - MENUITEM "&Nearest", IDM_VID_FILTER_NEAREST - MENUITEM "&Linear", IDM_VID_FILTER_LINEAR + MENUITEM "&Nearest", IDM_VID_FILTER_NEAREST + MENUITEM "&Linear", IDM_VID_FILTER_LINEAR END - MENUITEM "Hi&DPI scaling", IDM_VID_HIDPI + MENUITEM "Hi&DPI scaling", IDM_VID_HIDPI MENUITEM SEPARATOR - MENUITEM "&Fullscreen\tCtrl+Alt+PgUp", IDM_VID_FULLSCREEN + MENUITEM "&Fullscreen\tCtrl+Alt+PgUp", IDM_VID_FULLSCREEN POPUP "Fullscreen &stretch mode" BEGIN MENUITEM "&Full screen stretch", IDM_VID_FS_FULL @@ -81,35 +81,35 @@ BEGIN END POPUP "E&GA/(S)VGA settings" BEGIN - MENUITEM "&Inverted VGA monitor", IDM_VID_INVERT + MENUITEM "&Inverted VGA monitor", IDM_VID_INVERT POPUP "VGA screen &type" BEGIN - MENUITEM "RGB &Color", IDM_VID_GRAY_RGB - MENUITEM "&RGB Grayscale", IDM_VID_GRAY_MONO - MENUITEM "&Amber monitor", IDM_VID_GRAY_AMBER - MENUITEM "&Green monitor", IDM_VID_GRAY_GREEN - MENUITEM "&White monitor", IDM_VID_GRAY_WHITE + MENUITEM "RGB &Color", IDM_VID_GRAY_RGB + MENUITEM "&RGB Grayscale", IDM_VID_GRAY_MONO + MENUITEM "&Amber monitor", IDM_VID_GRAY_AMBER + MENUITEM "&Green monitor", IDM_VID_GRAY_GREEN + MENUITEM "&White monitor", IDM_VID_GRAY_WHITE END POPUP "Grayscale &conversion type" BEGIN - MENUITEM "BT&601 (NTSC/PAL)", IDM_VID_GRAYCT_601 - MENUITEM "BT&709 (HDTV)", IDM_VID_GRAYCT_709 - MENUITEM "&Average", IDM_VID_GRAYCT_AVE + MENUITEM "BT&601 (NTSC/PAL)", IDM_VID_GRAYCT_601 + MENUITEM "BT&709 (HDTV)", IDM_VID_GRAYCT_709 + MENUITEM "&Average", IDM_VID_GRAYCT_AVE END END MENUITEM SEPARATOR MENUITEM "CGA/PCjr/Tandy/E&GA/(S)VGA overscan", IDM_VID_OVERSCAN MENUITEM "Change contrast for &monochrome display", IDM_VID_CGACON END - MENUITEM "&Media", IDM_MEDIA + MENUITEM "&Media", IDM_MEDIA POPUP "&Tools" BEGIN MENUITEM "&Settings...", IDM_CONFIG - MENUITEM "&Update status bar icons", IDM_UPDATE_ICONS + MENUITEM "&Update status bar icons", IDM_UPDATE_ICONS MENUITEM SEPARATOR MENUITEM "Take s&creenshot\tCtrl+F11", IDM_ACTION_SCREENSHOT MENUITEM SEPARATOR - MENUITEM "&Preferences...", IDM_PREFERENCES + MENUITEM "&Preferences...", IDM_PREFERENCES #ifdef DISCORD MENUITEM "Enable &Discord integration", IDM_DISCORD #endif @@ -123,8 +123,8 @@ BEGIN END POPUP "&Help" BEGIN - MENUITEM "&Documentation...", IDM_DOCS - MENUITEM "&About 86Box...", IDM_ABOUT + MENUITEM "&Documentation...", IDM_DOCS + MENUITEM "&About 86Box...", IDM_ABOUT END END @@ -137,17 +137,17 @@ CassetteSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&New image...", IDM_CASSETTE_IMAGE_NEW + MENUITEM "&New image...", IDM_CASSETTE_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&Existing image...", IDM_CASSETTE_IMAGE_EXISTING - MENUITEM "Existing image (&Write-protected)...", IDM_CASSETTE_IMAGE_EXISTING_WP + MENUITEM "&Existing image...", IDM_CASSETTE_IMAGE_EXISTING + MENUITEM "Existing image (&Write-protected)...", IDM_CASSETTE_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "&Record", IDM_CASSETTE_RECORD - MENUITEM "&Play", IDM_CASSETTE_PLAY - MENUITEM "&Rewind to the beginning", IDM_CASSETTE_REWIND - MENUITEM "&Fast forward to the end", IDM_CASSETTE_FAST_FORWARD + MENUITEM "&Record", IDM_CASSETTE_RECORD + MENUITEM "&Play", IDM_CASSETTE_PLAY + MENUITEM "&Rewind to the beginning", IDM_CASSETTE_REWIND + MENUITEM "&Fast forward to the end", IDM_CASSETTE_FAST_FORWARD MENUITEM SEPARATOR - MENUITEM "E&ject", IDM_CASSETTE_EJECT + MENUITEM "E&ject", IDM_CASSETTE_EJECT END END @@ -155,9 +155,9 @@ CartridgeSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Image...", IDM_CARTRIDGE_IMAGE + MENUITEM "&Image...", IDM_CARTRIDGE_IMAGE MENUITEM SEPARATOR - MENUITEM "E&ject", IDM_CARTRIDGE_EJECT + MENUITEM "E&ject", IDM_CARTRIDGE_EJECT END END @@ -165,14 +165,14 @@ FloppySubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&New image...", IDM_FLOPPY_IMAGE_NEW + MENUITEM "&New image...", IDM_FLOPPY_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&Existing image...", IDM_FLOPPY_IMAGE_EXISTING - MENUITEM "Existing image (&Write-protected)...", IDM_FLOPPY_IMAGE_EXISTING_WP + MENUITEM "&Existing image...", IDM_FLOPPY_IMAGE_EXISTING + MENUITEM "Existing image (&Write-protected)...", IDM_FLOPPY_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "E&xport to 86F...", IDM_FLOPPY_EXPORT_TO_86F + MENUITEM "E&xport to 86F...", IDM_FLOPPY_EXPORT_TO_86F MENUITEM SEPARATOR - MENUITEM "E&ject", IDM_FLOPPY_EJECT + MENUITEM "E&ject", IDM_FLOPPY_EJECT END END @@ -180,13 +180,13 @@ CdromSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Mute", IDM_CDROM_MUTE + MENUITEM "&Mute", IDM_CDROM_MUTE MENUITEM SEPARATOR - MENUITEM "E&mpty", IDM_CDROM_EMPTY - MENUITEM "&Reload previous image", IDM_CDROM_RELOAD + MENUITEM "E&mpty", IDM_CDROM_EMPTY + MENUITEM "&Reload previous image", IDM_CDROM_RELOAD MENUITEM SEPARATOR - MENUITEM "&Image...", IDM_CDROM_IMAGE - MENUITEM "&Folder...", IDM_CDROM_DIR + MENUITEM "&Image...", IDM_CDROM_IMAGE + MENUITEM "&Folder...", IDM_CDROM_DIR END END @@ -194,13 +194,13 @@ ZIPSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&New image...", IDM_ZIP_IMAGE_NEW + MENUITEM "&New image...", IDM_ZIP_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&Existing image...", IDM_ZIP_IMAGE_EXISTING - MENUITEM "Existing image (&Write-protected)...", IDM_ZIP_IMAGE_EXISTING_WP + MENUITEM "&Existing image...", IDM_ZIP_IMAGE_EXISTING + MENUITEM "Existing image (&Write-protected)...", IDM_ZIP_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "E&ject", IDM_ZIP_EJECT - MENUITEM "&Reload previous image", IDM_ZIP_RELOAD + MENUITEM "E&ject", IDM_ZIP_EJECT + MENUITEM "&Reload previous image", IDM_ZIP_RELOAD END END @@ -208,13 +208,13 @@ MOSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&New image...", IDM_MO_IMAGE_NEW + MENUITEM "&New image...", IDM_MO_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&Existing image...", IDM_MO_IMAGE_EXISTING - MENUITEM "Existing image (&Write-protected)...", IDM_MO_IMAGE_EXISTING_WP + MENUITEM "&Existing image...", IDM_MO_IMAGE_EXISTING + MENUITEM "Existing image (&Write-protected)...", IDM_MO_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "E&ject", IDM_MO_EJECT - MENUITEM "&Reload previous image", IDM_MO_RELOAD + MENUITEM "E&ject", IDM_MO_EJECT + MENUITEM "&Reload previous image", IDM_MO_RELOAD END END @@ -223,15 +223,15 @@ BEGIN POPUP "Target &framerate" BEGIN MENUITEM "&Sync with video", IDM_VID_GL_FPS_BLITTER - MENUITEM "&25 fps", IDM_VID_GL_FPS_25 - MENUITEM "&30 fps", IDM_VID_GL_FPS_30 - MENUITEM "&50 fps", IDM_VID_GL_FPS_50 - MENUITEM "&60 fps", IDM_VID_GL_FPS_60 - MENUITEM "&75 fps", IDM_VID_GL_FPS_75 + MENUITEM "&25 fps", IDM_VID_GL_FPS_25 + MENUITEM "&30 fps", IDM_VID_GL_FPS_30 + MENUITEM "&50 fps", IDM_VID_GL_FPS_50 + MENUITEM "&60 fps", IDM_VID_GL_FPS_60 + MENUITEM "&75 fps", IDM_VID_GL_FPS_75 END - MENUITEM "&VSync", IDM_VID_GL_VSYNC + MENUITEM "&VSync", IDM_VID_GL_VSYNC MENUITEM "&Select shader...", IDM_VID_GL_SHADER - MENUITEM "&Remove shader", IDM_VID_GL_NOSHADER + MENUITEM "&Remove shader", IDM_VID_GL_NOSHADER END @@ -240,150 +240,150 @@ END // Dialog // -#define STR_PREFERENCES "Preferences" -#define STR_SND_GAIN "Sound Gain" -#define STR_NEW_FLOPPY "New Image" -#define STR_CONFIG "Settings" -#define STR_SPECIFY_DIM "Specify Main Window Dimensions" +#define STR_PREFERENCES "Preferences" +#define STR_SND_GAIN "Sound Gain" +#define STR_NEW_FLOPPY "New Image" +#define STR_CONFIG "Settings" +#define STR_SPECIFY_DIM "Specify Main Window Dimensions" -#define STR_OK "OK" -#define STR_CANCEL "Cancel" -#define STR_GLOBAL "Save these settings as &global defaults" -#define STR_DEFAULT "&Default" -#define STR_LANGUAGE "Language:" -#define STR_ICONSET "Icon set:" +#define STR_OK "OK" +#define STR_CANCEL "Cancel" +#define STR_GLOBAL "Save these settings as &global defaults" +#define STR_DEFAULT "&Default" +#define STR_LANGUAGE "Language:" +#define STR_ICONSET "Icon set:" -#define STR_GAIN "Gain" +#define STR_GAIN "Gain" -#define STR_FILE_NAME "File name:" -#define STR_DISK_SIZE "Disk size:" -#define STR_RPM_MODE "RPM mode:" -#define STR_PROGRESS "Progress:" +#define STR_FILE_NAME "File name:" +#define STR_DISK_SIZE "Disk size:" +#define STR_RPM_MODE "RPM mode:" +#define STR_PROGRESS "Progress:" -#define STR_WIDTH "Width:" -#define STR_HEIGHT "Height:" -#define STR_LOCK_TO_SIZE "Lock to this size" +#define STR_WIDTH "Width:" +#define STR_HEIGHT "Height:" +#define STR_LOCK_TO_SIZE "Lock to this size" -#define STR_MACHINE_TYPE "Machine type:" -#define STR_MACHINE "Machine:" -#define STR_CONFIGURE "Configure" -#define STR_CPU_TYPE "CPU type:" -#define STR_CPU_SPEED "Speed:" -#define STR_FPU "FPU:" -#define STR_WAIT_STATES "Wait states:" -#define STR_MB "MB" -#define STR_MEMORY "Memory:" -#define STR_TIME_SYNC "Time synchronization" -#define STR_DISABLED "Disabled" -#define STR_ENABLED_LOCAL "Enabled (local time)" -#define STR_ENABLED_UTC "Enabled (UTC)" -#define STR_DYNAREC "Dynamic Recompiler" +#define STR_MACHINE_TYPE "Machine type:" +#define STR_MACHINE "Machine:" +#define STR_CONFIGURE "Configure" +#define STR_CPU_TYPE "CPU type:" +#define STR_CPU_SPEED "Speed:" +#define STR_FPU "FPU:" +#define STR_WAIT_STATES "Wait states:" +#define STR_MB "MB" +#define STR_MEMORY "Memory:" +#define STR_TIME_SYNC "Time synchronization" +#define STR_DISABLED "Disabled" +#define STR_ENABLED_LOCAL "Enabled (local time)" +#define STR_ENABLED_UTC "Enabled (UTC)" +#define STR_DYNAREC "Dynamic Recompiler" -#define STR_VIDEO "Video:" -#define STR_VIDEO_2 "Video 2:" -#define STR_VOODOO "Voodoo Graphics" -#define STR_IBM8514 "IBM 8514/a Graphics" -#define STR_XGA "XGA Graphics" +#define STR_VIDEO "Video:" +#define STR_VIDEO_2 "Video 2:" +#define STR_VOODOO "Voodoo Graphics" +#define STR_IBM8514 "IBM 8514/a Graphics" +#define STR_XGA "XGA Graphics" -#define STR_MOUSE "Mouse:" -#define STR_JOYSTICK "Joystick:" -#define STR_JOY1 "Joystick 1..." -#define STR_JOY2 "Joystick 2..." -#define STR_JOY3 "Joystick 3..." -#define STR_JOY4 "Joystick 4..." +#define STR_MOUSE "Mouse:" +#define STR_JOYSTICK "Joystick:" +#define STR_JOY1 "Joystick 1..." +#define STR_JOY2 "Joystick 2..." +#define STR_JOY3 "Joystick 3..." +#define STR_JOY4 "Joystick 4..." -#define STR_SOUND1 "Sound card 1:" -#define STR_SOUND2 "Sound card 2:" -#define STR_SOUND3 "Sound card 3:" -#define STR_SOUND4 "Sound card 4:" -#define STR_MIDI_OUT "MIDI Out Device:" -#define STR_MIDI_IN "MIDI In Device:" -#define STR_MPU401 "Standalone MPU-401" -#define STR_FLOAT "Use FLOAT32 sound" -#define STR_FM_DRIVER "FM synth driver" -#define STR_FM_DRV_NUKED "Nuked (more accurate)" -#define STR_FM_DRV_YMFM "YMFM (faster)" +#define STR_SOUND1 "Sound card 1:" +#define STR_SOUND2 "Sound card 2:" +#define STR_SOUND3 "Sound card 3:" +#define STR_SOUND4 "Sound card 4:" +#define STR_MIDI_OUT "MIDI Out Device:" +#define STR_MIDI_IN "MIDI In Device:" +#define STR_MPU401 "Standalone MPU-401" +#define STR_FLOAT "Use FLOAT32 sound" +#define STR_FM_DRIVER "FM synth driver" +#define STR_FM_DRV_NUKED "Nuked (more accurate)" +#define STR_FM_DRV_YMFM "YMFM (faster)" -#define STR_NET_TYPE "Network type:" -#define STR_PCAP "PCap device:" -#define STR_NET "Network adapter:" -#define STR_NET1 "Network card 1:" -#define STR_NET2 "Network card 2:" -#define STR_NET3 "Network card 3:" -#define STR_NET4 "Network card 4:" +#define STR_NET_TYPE "Network type:" +#define STR_PCAP "PCap device:" +#define STR_NET "Network adapter:" +#define STR_NET1 "Network card 1:" +#define STR_NET2 "Network card 2:" +#define STR_NET3 "Network card 3:" +#define STR_NET4 "Network card 4:" -#define STR_COM1 "COM1 Device:" -#define STR_COM2 "COM2 Device:" -#define STR_COM3 "COM3 Device:" -#define STR_COM4 "COM4 Device:" -#define STR_LPT1 "LPT1 Device:" -#define STR_LPT2 "LPT2 Device:" -#define STR_LPT3 "LPT3 Device:" -#define STR_LPT4 "LPT4 Device:" -#define STR_SERIAL1 "Serial port 1" -#define STR_SERIAL2 "Serial port 2" -#define STR_SERIAL3 "Serial port 3" -#define STR_SERIAL4 "Serial port 4" -#define STR_PARALLEL1 "Parallel port 1" -#define STR_PARALLEL2 "Parallel port 2" -#define STR_PARALLEL3 "Parallel port 3" -#define STR_PARALLEL4 "Parallel port 4" -#define STR_SERIAL_PASS1 "Serial port passthrough 1" -#define STR_SERIAL_PASS2 "Serial port passthrough 2" -#define STR_SERIAL_PASS3 "Serial port passthrough 3" -#define STR_SERIAL_PASS4 "Serial port passthrough 4" +#define STR_COM1 "COM1 Device:" +#define STR_COM2 "COM2 Device:" +#define STR_COM3 "COM3 Device:" +#define STR_COM4 "COM4 Device:" +#define STR_LPT1 "LPT1 Device:" +#define STR_LPT2 "LPT2 Device:" +#define STR_LPT3 "LPT3 Device:" +#define STR_LPT4 "LPT4 Device:" +#define STR_SERIAL1 "Serial port 1" +#define STR_SERIAL2 "Serial port 2" +#define STR_SERIAL3 "Serial port 3" +#define STR_SERIAL4 "Serial port 4" +#define STR_PARALLEL1 "Parallel port 1" +#define STR_PARALLEL2 "Parallel port 2" +#define STR_PARALLEL3 "Parallel port 3" +#define STR_PARALLEL4 "Parallel port 4" +#define STR_SERIAL_PASS1 "Serial port passthrough 1" +#define STR_SERIAL_PASS2 "Serial port passthrough 2" +#define STR_SERIAL_PASS3 "Serial port passthrough 3" +#define STR_SERIAL_PASS4 "Serial port passthrough 4" -#define STR_HDC "HD Controller:" -#define STR_FDC "FD Controller:" -#define STR_IDE_TER "Tertiary IDE Controller" -#define STR_IDE_QUA "Quaternary IDE Controller" -#define STR_SCSI "SCSI" -#define STR_SCSI_1 "Controller 1:" -#define STR_SCSI_2 "Controller 2:" -#define STR_SCSI_3 "Controller 3:" -#define STR_SCSI_4 "Controller 4:" -#define STR_CASSETTE "Cassette" +#define STR_HDC "HD Controller:" +#define STR_FDC "FD Controller:" +#define STR_IDE_TER "Tertiary IDE Controller" +#define STR_IDE_QUA "Quaternary IDE Controller" +#define STR_SCSI "SCSI" +#define STR_SCSI_1 "Controller 1:" +#define STR_SCSI_2 "Controller 2:" +#define STR_SCSI_3 "Controller 3:" +#define STR_SCSI_4 "Controller 4:" +#define STR_CASSETTE "Cassette" -#define STR_HDD "Hard disks:" -#define STR_NEW "&New..." -#define STR_EXISTING "&Existing..." -#define STR_REMOVE "&Remove" -#define STR_BUS "Bus:" -#define STR_CHANNEL "Channel:" -#define STR_ID "ID:" -#define STR_SPEED "Speed:" +#define STR_HDD "Hard disks:" +#define STR_NEW "&New..." +#define STR_EXISTING "&Existing..." +#define STR_REMOVE "&Remove" +#define STR_BUS "Bus:" +#define STR_CHANNEL "Channel:" +#define STR_ID "ID:" +#define STR_SPEED "Speed:" -#define STR_SPECIFY "&Specify..." -#define STR_SECTORS "Sectors:" -#define STR_HEADS "Heads:" -#define STR_CYLS "Cylinders:" -#define STR_SIZE_MB "Size (MB):" -#define STR_TYPE "Type:" -#define STR_IMG_FORMAT "Image Format:" -#define STR_BLOCK_SIZE "Block Size:" +#define STR_SPECIFY "&Specify..." +#define STR_SECTORS "Sectors:" +#define STR_HEADS "Heads:" +#define STR_CYLS "Cylinders:" +#define STR_SIZE_MB "Size (MB):" +#define STR_TYPE "Type:" +#define STR_IMG_FORMAT "Image Format:" +#define STR_BLOCK_SIZE "Block Size:" -#define STR_FLOPPY_DRIVES "Floppy drives:" -#define STR_TURBO "Turbo timings" -#define STR_CHECKBPB "Check BPB" -#define STR_CDROM_DRIVES "CD-ROM drives:" -#define STR_CD_SPEED "Speed:" -#define STR_EARLY "Earlier drive" +#define STR_FLOPPY_DRIVES "Floppy drives:" +#define STR_TURBO "Turbo timings" +#define STR_CHECKBPB "Check BPB" +#define STR_CDROM_DRIVES "CD-ROM drives:" +#define STR_CD_SPEED "Speed:" +#define STR_EARLY "Earlier drive" -#define STR_MO_DRIVES "MO drives:" -#define STR_ZIP_DRIVES "ZIP drives:" -#define STR_250 "ZIP 250" +#define STR_MO_DRIVES "MO drives:" +#define STR_ZIP_DRIVES "ZIP drives:" +#define STR_250 "ZIP 250" -#define STR_ISARTC "ISA RTC:" -#define STR_ISAMEM "ISA Memory Expansion" -#define STR_ISAMEM_1 "Card 1:" -#define STR_ISAMEM_2 "Card 2:" -#define STR_ISAMEM_3 "Card 3:" -#define STR_ISAMEM_4 "Card 4:" -#define STR_BUGGER "ISABugger device" -#define STR_POSTCARD "POST card" +#define STR_ISARTC "ISA RTC:" +#define STR_ISAMEM "ISA Memory Expansion" +#define STR_ISAMEM_1 "Card 1:" +#define STR_ISAMEM_2 "Card 2:" +#define STR_ISAMEM_3 "Card 3:" +#define STR_ISAMEM_4 "Card 4:" +#define STR_BUGGER "ISABugger device" +#define STR_POSTCARD "POST card" -#define FONT_SIZE 9 -#define FONT_NAME "Segoe UI" +#define FONT_SIZE 9 +#define FONT_NAME "Segoe UI" #include "dialogs.rc" @@ -394,149 +394,149 @@ END STRINGTABLE DISCARDABLE BEGIN - 2048 "86Box" - IDS_2049 "Error" - IDS_2050 "Fatal error" - IDS_2051 " - PAUSED" - IDS_2052 "Press Ctrl+Alt+PgDn to return to windowed mode." - IDS_2053 "Speed" - IDS_2054 "ZIP %03i %i (%s): %ls" - IDS_2055 "ZIP images (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" - IDS_2056 "86Box could not find any usable ROM images.\n\nPlease download a ROM set and extract it into the ""roms"" directory." - IDS_2057 "(empty)" - IDS_2058 "ZIP images (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0All files (*.*)\0*.*\0" - IDS_2059 "Turbo" - IDS_2060 "On" - IDS_2061 "Off" - IDS_2062 "All images (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0Basic sector images (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Surface images (*.86F)\0*.86F\0" - IDS_2063 "Machine ""%hs"" is not available due to missing ROMs in the roms/machines directory. Switching to an available machine." + 2048 "86Box" + IDS_2049 "Error" + IDS_2050 "Fatal error" + IDS_2051 " - PAUSED" + IDS_2052 "Press Ctrl+Alt+PgDn to return to windowed mode." + IDS_2053 "Speed" + IDS_2054 "ZIP %03i %i (%s): %ls" + IDS_2055 "ZIP images (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" + IDS_2056 "86Box could not find any usable ROM images.\n\nPlease download a ROM set and extract it into the ""roms"" directory." + IDS_2057 "(empty)" + IDS_2058 "ZIP images (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0All files (*.*)\0*.*\0" + IDS_2059 "Turbo" + IDS_2060 "On" + IDS_2061 "Off" + IDS_2062 "All images (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0Basic sector images (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Surface images (*.86F)\0*.86F\0" + IDS_2063 "Machine ""%hs"" is not available due to missing ROMs in the roms/machines directory. Switching to an available machine." END STRINGTABLE DISCARDABLE BEGIN - IDS_2064 "Video card ""%hs"" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." - IDS_2065 "Machine" - IDS_2066 "Display" - IDS_2067 "Input devices" - IDS_2068 "Sound" - IDS_2069 "Network" - IDS_2070 "Ports (COM & LPT)" - IDS_2071 "Storage controllers" - IDS_2072 "Hard disks" - IDS_2073 "Floppy & CD-ROM drives" - IDS_2074 "Other removable devices" - IDS_2075 "Other peripherals" - IDS_2076 "Surface images (*.86F)\0*.86F\0" - IDS_2077 "Click to capture mouse" - IDS_2078 "Press F8+F12 to release mouse" - IDS_2079 "Press F8+F12 or middle button to release mouse" + IDS_2064 "Video card ""%hs"" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." + IDS_2065 "Machine" + IDS_2066 "Display" + IDS_2067 "Input devices" + IDS_2068 "Sound" + IDS_2069 "Network" + IDS_2070 "Ports (COM & LPT)" + IDS_2071 "Storage controllers" + IDS_2072 "Hard disks" + IDS_2073 "Floppy & CD-ROM drives" + IDS_2074 "Other removable devices" + IDS_2075 "Other peripherals" + IDS_2076 "Surface images (*.86F)\0*.86F\0" + IDS_2077 "Click to capture mouse" + IDS_2078 "Press F8+F12 to release mouse" + IDS_2079 "Press F8+F12 or middle button to release mouse" END STRINGTABLE DISCARDABLE BEGIN - IDS_2080 "Unable to initialize FluidSynth" - IDS_2081 "Bus" - IDS_2082 "File" - IDS_2083 "C" - IDS_2084 "H" - IDS_2085 "S" - IDS_2086 "MB" + IDS_2080 "Unable to initialize FluidSynth" + IDS_2081 "Bus" + IDS_2082 "File" + IDS_2083 "C" + IDS_2084 "H" + IDS_2085 "S" + IDS_2086 "MB" IDS_2087 "Speed" - IDS_2088 "Check BPB" - IDS_2089 "KB" - IDS_2090 "Could not initialize the video renderer." - IDS_2091 "Default" - IDS_2092 "%i Wait state(s)" - IDS_2093 "Type" - IDS_2094 "Failed to set up PCap" - IDS_2095 "No PCap devices found" - IDS_2096 "Invalid PCap device" - IDS_2097 "Standard 2-button joystick(s)" - IDS_2098 "Standard 4-button joystick" - IDS_2099 "Standard 6-button joystick" - IDS_2100 "Standard 8-button joystick" - IDS_2101 "CH Flightstick Pro" - IDS_2102 "Microsoft SideWinder Pad" - IDS_2103 "Thrustmaster Flight Control System" - IDS_2104 "None" - IDS_2105 "Unable to load keyboard accelerators." - IDS_2106 "Unable to register raw input." - IDS_2107 "%u" - IDS_2108 "%u MB (CHS: %i, %i, %i)" - IDS_2109 "Floppy %i (%s): %ls" - IDS_2110 "All images (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Advanced sector images (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Basic sector images (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Flux images (*.FDI)\0*.FDI\0Surface images (*.86F;*.MFM)\0*.86F;*.MFM\0All files (*.*)\0*.*\0" - IDS_2111 "Unable to initialize FreeType" - IDS_2112 "Unable to initialize SDL, SDL2.dll is required" - IDS_2113 "Are you sure you want to hard reset the emulated machine?" - IDS_2114 "Are you sure you want to exit 86Box?" - IDS_2115 "Unable to initialize Ghostscript" - IDS_2116 "MO %i (%ls): %ls" - IDS_2117 "MO images (*.IM?;*.MDI)\0*.IM?;*.MDI\0All files (*.*)\0*.*\0" - IDS_2118 "Welcome to 86Box!" - IDS_2119 "Internal controller" - IDS_2120 "Exit" - IDS_2121 "No ROMs found" - IDS_2122 "Do you want to save the settings?" - IDS_2123 "This will hard reset the emulated machine." - IDS_2124 "Save" - IDS_2125 "About 86Box" - IDS_2126 "86Box v" EMU_VERSION + IDS_2088 "Check BPB" + IDS_2089 "KB" + IDS_2090 "Could not initialize the video renderer." + IDS_2091 "Default" + IDS_2092 "%i Wait state(s)" + IDS_2093 "Type" + IDS_2094 "Failed to set up PCap" + IDS_2095 "No PCap devices found" + IDS_2096 "Invalid PCap device" + IDS_2097 "Standard 2-button joystick(s)" + IDS_2098 "Standard 4-button joystick" + IDS_2099 "Standard 6-button joystick" + IDS_2100 "Standard 8-button joystick" + IDS_2101 "CH Flightstick Pro" + IDS_2102 "Microsoft SideWinder Pad" + IDS_2103 "Thrustmaster Flight Control System" + IDS_2104 "None" + IDS_2105 "Unable to load keyboard accelerators." + IDS_2106 "Unable to register raw input." + IDS_2107 "%u" + IDS_2108 "%u MB (CHS: %i, %i, %i)" + IDS_2109 "Floppy %i (%s): %ls" + IDS_2110 "All images (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Advanced sector images (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Basic sector images (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Flux images (*.FDI)\0*.FDI\0Surface images (*.86F;*.MFM)\0*.86F;*.MFM\0All files (*.*)\0*.*\0" + IDS_2111 "Unable to initialize FreeType" + IDS_2112 "Unable to initialize SDL, SDL2.dll is required" + IDS_2113 "Are you sure you want to hard reset the emulated machine?" + IDS_2114 "Are you sure you want to exit 86Box?" + IDS_2115 "Unable to initialize Ghostscript" + IDS_2116 "MO %i (%ls): %ls" + IDS_2117 "MO images (*.IM?;*.MDI)\0*.IM?;*.MDI\0All files (*.*)\0*.*\0" + IDS_2118 "Welcome to 86Box!" + IDS_2119 "Internal controller" + IDS_2120 "Exit" + IDS_2121 "No ROMs found" + IDS_2122 "Do you want to save the settings?" + IDS_2123 "This will hard reset the emulated machine." + IDS_2124 "Save" + IDS_2125 "About 86Box" + IDS_2126 "86Box v" EMU_VERSION - IDS_2127 "An emulator of old computers\n\nAuthors: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, Tiseno100, reenigne, leilei, JohnElliott, greatpsycho, and others.\n\nReleased under the GNU General Public License version 2 or later. See LICENSE for more information." - IDS_2128 "OK" - IDS_2129 "Hardware not available" + IDS_2127 "An emulator of old computers\n\nAuthors: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, Tiseno100, reenigne, leilei, JohnElliott, greatpsycho, and others.\n\nReleased under the GNU General Public License version 2 or later. See LICENSE for more information." + IDS_2128 "OK" + IDS_2129 "Hardware not available" #ifdef _WIN32 #define LIB_NAME_PCAP "WinPcap" #else #define LIB_NAME_PCAP "libpcap" #endif - IDS_2130 "Make sure " LIB_NAME_PCAP " is installed and that you are on a " LIB_NAME_PCAP "-compatible network connection." - IDS_2131 "Invalid configuration" + IDS_2130 "Make sure " LIB_NAME_PCAP " is installed and that you are on a " LIB_NAME_PCAP "-compatible network connection." + IDS_2131 "Invalid configuration" #ifdef _WIN32 #define LIB_NAME_FREETYPE "freetype.dll" #else #define LIB_NAME_FREETYPE "libfreetype" #endif - IDS_2132 LIB_NAME_FREETYPE " is required for ESC/P printer emulation." + IDS_2132 LIB_NAME_FREETYPE " is required for ESC/P printer emulation." #ifdef _WIN32 #define LIB_NAME_GS "gsdll32.dll" #else #define LIB_NAME_GS "libgs" #endif - IDS_2133 LIB_NAME_GS " is required for automatic conversion of PostScript files to PDF.\n\nAny documents sent to the generic PostScript printer will be saved as PostScript (.ps) files." + IDS_2133 LIB_NAME_GS " is required for automatic conversion of PostScript files to PDF.\n\nAny documents sent to the generic PostScript printer will be saved as PostScript (.ps) files." #ifdef _WIN32 #define LIB_NAME_FLUIDSYNTH "libfluidsynth.dll" #else #define LIB_NAME_FLUIDSYNTH "libfluidsynth" #endif - IDS_2134 LIB_NAME_FLUIDSYNTH " is required for FluidSynth MIDI output." - IDS_2135 "Entering fullscreen mode" - IDS_2136 "Don't show this message again" - IDS_2137 "Don't exit" - IDS_2138 "Reset" - IDS_2139 "Don't reset" - IDS_2140 "MO images (*.IM?;*.MDI)\0*.IM?;*.MDI\0All files (*.*)\0*.*\0" - IDS_2141 "CD-ROM images (*.ISO;*.CUE)\0*.ISO;*.CUE\0All files (*.*)\0*.*\0" - IDS_2142 "%hs Device Configuration" + IDS_2134 LIB_NAME_FLUIDSYNTH " is required for FluidSynth MIDI output." + IDS_2135 "Entering fullscreen mode" + IDS_2136 "Don't show this message again" + IDS_2137 "Don't exit" + IDS_2138 "Reset" + IDS_2139 "Don't reset" + IDS_2140 "MO images (*.IM?;*.MDI)\0*.IM?;*.MDI\0All files (*.*)\0*.*\0" + IDS_2141 "CD-ROM images (*.ISO;*.CUE)\0*.ISO;*.CUE\0All files (*.*)\0*.*\0" + IDS_2142 "%hs Device Configuration" IDS_2143 "Monitor in sleep mode" - IDS_2144 "OpenGL Shaders (*.GLSL)\0*.GLSL\0All files (*.*)\0*.*\0" - IDS_2145 "OpenGL options" - IDS_2146 "You are loading an unsupported configuration" - IDS_2147 "CPU type filtering based on selected machine is disabled for this emulated machine.\n\nThis makes it possible to choose a CPU that is otherwise incompatible with the selected machine. However, you may run into incompatibilities with the machine BIOS or other software.\n\nEnabling this setting is not officially supported and any bug reports filed may be closed as invalid." - IDS_2148 "Continue" - IDS_2149 "Cassette: %s" - IDS_2150 "Cassette images (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0All files (*.*)\0*.*\0" - IDS_2151 "Cartridge %i: %ls" - IDS_2152 "Cartridge images (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0All files (*.*)\0*.*\0" - IDS_2153 "Error initializing renderer" - IDS_2154 "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." - IDS_2155 "Resume execution" - IDS_2156 "Pause execution" - IDS_2157 "Press Ctrl+Alt+Del" - IDS_2158 "Press Ctrl+Alt+Esc" - IDS_2159 "Hard reset" - IDS_2160 "ACPI shutdown" - IDS_2161 "Settings" + IDS_2144 "OpenGL Shaders (*.GLSL)\0*.GLSL\0All files (*.*)\0*.*\0" + IDS_2145 "OpenGL options" + IDS_2146 "You are loading an unsupported configuration" + IDS_2147 "CPU type filtering based on selected machine is disabled for this emulated machine.\n\nThis makes it possible to choose a CPU that is otherwise incompatible with the selected machine. However, you may run into incompatibilities with the machine BIOS or other software.\n\nEnabling this setting is not officially supported and any bug reports filed may be closed as invalid." + IDS_2148 "Continue" + IDS_2149 "Cassette: %s" + IDS_2150 "Cassette images (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0All files (*.*)\0*.*\0" + IDS_2151 "Cartridge %i: %ls" + IDS_2152 "Cartridge images (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0All files (*.*)\0*.*\0" + IDS_2153 "Error initializing renderer" + IDS_2154 "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." + IDS_2155 "Resume execution" + IDS_2156 "Pause execution" + IDS_2157 "Press Ctrl+Alt+Del" + IDS_2158 "Press Ctrl+Alt+Esc" + IDS_2159 "Hard reset" + IDS_2160 "ACPI shutdown" + IDS_2161 "Settings" IDS_2162 "Earlier drive" IDS_2163 "No Dynarec" IDS_2164 "Old Dynarec" @@ -547,45 +547,45 @@ END STRINGTABLE DISCARDABLE BEGIN IDS_4096 "Hard disk (%s)" - IDS_4097 "%01i:%01i" - IDS_4098 "%01i" - IDS_4099 "MFM/RLL or ESDI CD-ROM drives never existed" - IDS_4100 "Custom..." - IDS_4101 "Custom (large)..." - IDS_4102 "Add New Hard Disk" - IDS_4103 "Add Existing Hard Disk" - IDS_4104 "HDI disk images cannot be larger than 4 GB." - IDS_4105 "Disk images cannot be larger than 127 GB." - IDS_4106 "Hard disk images (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0All files (*.*)\0*.*\0" - IDS_4107 "Unable to read file" - IDS_4108 "Unable to write file" - IDS_4109 "HDI or HDX images with a sector size other than 512 are not supported." - IDS_4110 "USB is not yet supported" - IDS_4111 "Disk image file already exists" - IDS_4112 "Please specify a valid file name." - IDS_4113 "Disk image created" - IDS_4114 "Make sure the file exists and is readable." - IDS_4115 "Make sure the file is being saved to a writable directory." - IDS_4116 "Disk image too large" - IDS_4117 "Remember to partition and format the newly-created drive." - IDS_4118 "The selected file will be overwritten. Are you sure you want to use it?" - IDS_4119 "Unsupported disk image" - IDS_4120 "Overwrite" - IDS_4121 "Don't overwrite" - IDS_4122 "Raw image (.img)" - IDS_4123 "HDI image (.hdi)" - IDS_4124 "HDX image (.hdx)" - IDS_4125 "Fixed-size VHD (.vhd)" - IDS_4126 "Dynamic-size VHD (.vhd)" - IDS_4127 "Differencing VHD (.vhd)" - IDS_4128 "Large blocks (2 MB)" - IDS_4129 "Small blocks (512 KB)" - IDS_4130 "VHD files (*.VHD)\0*.VHD\0All files (*.*)\0*.*\0" - IDS_4131 "Select the parent VHD" - IDS_4132 "This could mean that the parent image was modified after the differencing image was created.\n\nIt can also happen if the image files were moved or copied, or by a bug in the program that created this disk.\n\nDo you want to fix the timestamps?" - IDS_4133 "Parent and child disk timestamps do not match" - IDS_4134 "Could not fix VHD timestamp." - IDS_4135 "%01i:%02i" + IDS_4097 "%01i:%01i" + IDS_4098 "%01i" + IDS_4099 "MFM/RLL or ESDI CD-ROM drives never existed" + IDS_4100 "Custom..." + IDS_4101 "Custom (large)..." + IDS_4102 "Add New Hard Disk" + IDS_4103 "Add Existing Hard Disk" + IDS_4104 "HDI disk images cannot be larger than 4 GB." + IDS_4105 "Disk images cannot be larger than 127 GB." + IDS_4106 "Hard disk images (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0All files (*.*)\0*.*\0" + IDS_4107 "Unable to read file" + IDS_4108 "Unable to write file" + IDS_4109 "HDI or HDX images with a sector size other than 512 are not supported." + IDS_4110 "USB is not yet supported" + IDS_4111 "Disk image file already exists" + IDS_4112 "Please specify a valid file name." + IDS_4113 "Disk image created" + IDS_4114 "Make sure the file exists and is readable." + IDS_4115 "Make sure the file is being saved to a writable directory." + IDS_4116 "Disk image too large" + IDS_4117 "Remember to partition and format the newly-created drive." + IDS_4118 "The selected file will be overwritten. Are you sure you want to use it?" + IDS_4119 "Unsupported disk image" + IDS_4120 "Overwrite" + IDS_4121 "Don't overwrite" + IDS_4122 "Raw image (.img)" + IDS_4123 "HDI image (.hdi)" + IDS_4124 "HDX image (.hdx)" + IDS_4125 "Fixed-size VHD (.vhd)" + IDS_4126 "Dynamic-size VHD (.vhd)" + IDS_4127 "Differencing VHD (.vhd)" + IDS_4128 "Large blocks (2 MB)" + IDS_4129 "Small blocks (512 KB)" + IDS_4130 "VHD files (*.VHD)\0*.VHD\0All files (*.*)\0*.*\0" + IDS_4131 "Select the parent VHD" + IDS_4132 "This could mean that the parent image was modified after the differencing image was created.\n\nIt can also happen if the image files were moved or copied, or by a bug in the program that created this disk.\n\nDo you want to fix the timestamps?" + IDS_4133 "Parent and child disk timestamps do not match" + IDS_4134 "Could not fix VHD timestamp." + IDS_4135 "%01i:%02i" IDS_4352 "MFM/RLL" IDS_4353 "XTA" @@ -594,56 +594,56 @@ BEGIN IDS_4356 "ATAPI" IDS_4357 "SCSI" - IDS_4608 "MFM/RLL (%01i:%01i)" - IDS_4609 "XTA (%01i:%01i)" - IDS_4610 "ESDI (%01i:%01i)" - IDS_4611 "IDE (%01i:%01i)" - IDS_4612 "ATAPI (%01i:%01i)" - IDS_4613 "SCSI (%01i:%02i)" + IDS_4608 "MFM/RLL (%01i:%01i)" + IDS_4609 "XTA (%01i:%01i)" + IDS_4610 "ESDI (%01i:%01i)" + IDS_4611 "IDE (%01i:%01i)" + IDS_4612 "ATAPI (%01i:%01i)" + IDS_4613 "SCSI (%01i:%02i)" - IDS_5120 "CD-ROM %i (%s): %s" + IDS_5120 "CD-ROM %i (%s): %s" - IDS_5376 "Disabled" - IDS_5381 "ATAPI" + IDS_5376 "Disabled" + IDS_5381 "ATAPI" IDS_5382 "SCSI" - IDS_5632 "Disabled" - IDS_5637 "ATAPI (%01i:%01i)" + IDS_5632 "Disabled" + IDS_5637 "ATAPI (%01i:%01i)" IDS_5638 "SCSI (%01i:%02i)" - IDS_5888 "160 kB" - IDS_5889 "180 kB" - IDS_5890 "320 kB" - IDS_5891 "360 kB" - IDS_5892 "640 kB" - IDS_5893 "720 kB" - IDS_5894 "1.2 MB" - IDS_5895 "1.25 MB" - IDS_5896 "1.44 MB" - IDS_5897 "DMF (cluster 1024)" - IDS_5898 "DMF (cluster 2048)" - IDS_5899 "2.88 MB" - IDS_5900 "ZIP 100" - IDS_5901 "ZIP 250" - IDS_5902 "3.5"" 128 MB (ISO 10090)" - IDS_5903 "3.5"" 230 MB (ISO 13963)" - IDS_5904 "3.5"" 540 MB (ISO 15498)" - IDS_5905 "3.5"" 640 MB (ISO 15498)" - IDS_5906 "3.5"" 1.3 GB (GigaMO)" - IDS_5907 "3.5"" 2.3 GB (GigaMO 2)" - IDS_5908 "5.25"" 600 MB" - IDS_5909 "5.25"" 650 MB" - IDS_5910 "5.25"" 1 GB" - IDS_5911 "5.25"" 1.3 GB" + IDS_5888 "160 kB" + IDS_5889 "180 kB" + IDS_5890 "320 kB" + IDS_5891 "360 kB" + IDS_5892 "640 kB" + IDS_5893 "720 kB" + IDS_5894 "1.2 MB" + IDS_5895 "1.25 MB" + IDS_5896 "1.44 MB" + IDS_5897 "DMF (cluster 1024)" + IDS_5898 "DMF (cluster 2048)" + IDS_5899 "2.88 MB" + IDS_5900 "ZIP 100" + IDS_5901 "ZIP 250" + IDS_5902 "3.5"" 128 MB (ISO 10090)" + IDS_5903 "3.5"" 230 MB (ISO 13963)" + IDS_5904 "3.5"" 540 MB (ISO 15498)" + IDS_5905 "3.5"" 640 MB (ISO 15498)" + IDS_5906 "3.5"" 1.3 GB (GigaMO)" + IDS_5907 "3.5"" 2.3 GB (GigaMO 2)" + IDS_5908 "5.25"" 600 MB" + IDS_5909 "5.25"" 650 MB" + IDS_5910 "5.25"" 1 GB" + IDS_5911 "5.25"" 1.3 GB" - IDS_6144 "Perfect RPM" - IDS_6145 "1% below perfect RPM" - IDS_6146 "1.5% below perfect RPM" - IDS_6147 "2% below perfect RPM" + IDS_6144 "Perfect RPM" + IDS_6145 "1% below perfect RPM" + IDS_6146 "1.5% below perfect RPM" + IDS_6147 "2% below perfect RPM" - IDS_7168 "(System Default)" + IDS_7168 "(System Default)" END -#define IDS_LANG_ENUS IDS_7168 +#define IDS_LANG_ENUS IDS_7168 // English (U.S.) resources ///////////////////////////////////////////////////////////////////////////// diff --git a/src/win/languages/es-ES.rc b/src/win/languages/es-ES.rc index 593635dec..548c1fdcb 100644 --- a/src/win/languages/es-ES.rc +++ b/src/win/languages/es-ES.rc @@ -17,13 +17,13 @@ MainMenu MENU DISCARDABLE BEGIN POPUP "&Acción" BEGIN - MENUITEM "&Teclado requiere captura", IDM_ACTION_KBD_REQ_CAPTURE - MENUITEM "CTRL &derecho es ALT izquierdo", IDM_ACTION_RCTRL_IS_LALT + MENUITEM "&Teclado requiere captura", IDM_ACTION_KBD_REQ_CAPTURE + MENUITEM "CTRL &derecho es ALT izquierdo", IDM_ACTION_RCTRL_IS_LALT MENUITEM SEPARATOR MENUITEM "&Hard Reset...", IDM_ACTION_HRESET MENUITEM "&Ctrl+Alt+Del\tCtrl+F12", IDM_ACTION_RESET_CAD MENUITEM SEPARATOR - MENUITEM "Ctrl+Alt+&Esc", IDM_ACTION_CTRL_ALT_ESC + MENUITEM "Ctrl+Alt+&Esc", IDM_ACTION_CTRL_ALT_ESC MENUITEM SEPARATOR MENUITEM "&Pausa", IDM_ACTION_PAUSE MENUITEM SEPARATOR @@ -31,8 +31,8 @@ BEGIN END POPUP "&Vista" BEGIN - MENUITEM "&Ocultar barra de estado", IDM_VID_HIDE_STATUS_BAR - MENUITEM "Hide &toolbar", IDM_VID_HIDE_TOOLBAR + MENUITEM "&Ocultar barra de estado", IDM_VID_HIDE_STATUS_BAR + MENUITEM "Hide &toolbar", IDM_VID_HIDE_TOOLBAR MENUITEM SEPARATOR MENUITEM "&Show non-primary monitors", IDM_VID_MONITORS MENUITEM "&Ventana redimensionable", IDM_VID_RESIZE @@ -101,15 +101,15 @@ BEGIN MENUITEM "&Overscan CGA/PCjr/Tandy/EGA/(S)VGA", IDM_VID_OVERSCAN MENUITEM "Cambiar contraste para pantalla &monocroma", IDM_VID_CGACON END - MENUITEM "&Medios", IDM_MEDIA + MENUITEM "&Medios", IDM_MEDIA POPUP "&Herramientas" BEGIN MENUITEM "&Ajustes...", IDM_CONFIG - MENUITEM "&Actualizar iconos en barra de estado", IDM_UPDATE_ICONS + MENUITEM "&Actualizar iconos en barra de estado", IDM_UPDATE_ICONS MENUITEM SEPARATOR MENUITEM "Tomar c&aptura\tCtrl+F11", IDM_ACTION_SCREENSHOT MENUITEM SEPARATOR - MENUITEM "&Preferencias...", IDM_PREFERENCES + MENUITEM "&Preferencias...", IDM_PREFERENCES #ifdef DISCORD MENUITEM "Habilitar integración con &Discord", IDM_DISCORD #endif @@ -137,17 +137,17 @@ CassetteSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Nueva imagen...", IDM_CASSETTE_IMAGE_NEW + MENUITEM "&Nueva imagen...", IDM_CASSETTE_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "Imagen &Existente...", IDM_CASSETTE_IMAGE_EXISTING - MENUITEM "Imagen Existente (&Sólo-lectura)...", IDM_CASSETTE_IMAGE_EXISTING_WP + MENUITEM "Imagen &Existente...", IDM_CASSETTE_IMAGE_EXISTING + MENUITEM "Imagen Existente (&Sólo-lectura)...", IDM_CASSETTE_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "&Grabar", IDM_CASSETTE_RECORD - MENUITEM "&Reproducir", IDM_CASSETTE_PLAY - MENUITEM "&Rebobinar al inicio", IDM_CASSETTE_REWIND - MENUITEM "&Avance rápido al final", IDM_CASSETTE_FAST_FORWARD + MENUITEM "&Grabar", IDM_CASSETTE_RECORD + MENUITEM "&Reproducir", IDM_CASSETTE_PLAY + MENUITEM "&Rebobinar al inicio", IDM_CASSETTE_REWIND + MENUITEM "&Avance rápido al final", IDM_CASSETTE_FAST_FORWARD MENUITEM SEPARATOR - MENUITEM "E&xtraer", IDM_CASSETTE_EJECT + MENUITEM "E&xtraer", IDM_CASSETTE_EJECT END END @@ -155,9 +155,9 @@ CartridgeSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Imagen...", IDM_CARTRIDGE_IMAGE + MENUITEM "&Imagen...", IDM_CARTRIDGE_IMAGE MENUITEM SEPARATOR - MENUITEM "E&xtraer", IDM_CARTRIDGE_EJECT + MENUITEM "E&xtraer", IDM_CARTRIDGE_EJECT END END @@ -165,14 +165,14 @@ FloppySubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Nueva imagen...", IDM_FLOPPY_IMAGE_NEW + MENUITEM "&Nueva imagen...", IDM_FLOPPY_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "Imagen &existente...", IDM_FLOPPY_IMAGE_EXISTING - MENUITEM "Imagen existente (&sólo-lectura)...", IDM_FLOPPY_IMAGE_EXISTING_WP + MENUITEM "Imagen &existente...", IDM_FLOPPY_IMAGE_EXISTING + MENUITEM "Imagen existente (&sólo-lectura)...", IDM_FLOPPY_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "E&xportar a 86F...", IDM_FLOPPY_EXPORT_TO_86F + MENUITEM "E&xportar a 86F...", IDM_FLOPPY_EXPORT_TO_86F MENUITEM SEPARATOR - MENUITEM "E&xtraer", IDM_FLOPPY_EJECT + MENUITEM "E&xtraer", IDM_FLOPPY_EJECT END END @@ -180,13 +180,13 @@ CdromSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Silenciar", IDM_CDROM_MUTE + MENUITEM "&Silenciar", IDM_CDROM_MUTE MENUITEM SEPARATOR - MENUITEM "E&xtraer disco", IDM_CDROM_EMPTY - MENUITEM "&Recargar imagen previa", IDM_CDROM_RELOAD + MENUITEM "E&xtraer disco", IDM_CDROM_EMPTY + MENUITEM "&Recargar imagen previa", IDM_CDROM_RELOAD MENUITEM SEPARATOR - MENUITEM "&Imagen...", IDM_CDROM_IMAGE - MENUITEM "&Carpeta...", IDM_CDROM_DIR + MENUITEM "&Imagen...", IDM_CDROM_IMAGE + MENUITEM "&Carpeta...", IDM_CDROM_DIR END END @@ -194,13 +194,13 @@ ZIPSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Nueva imagen...", IDM_ZIP_IMAGE_NEW + MENUITEM "&Nueva imagen...", IDM_ZIP_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "Imagen &existente...", IDM_ZIP_IMAGE_EXISTING - MENUITEM "Imagen existente (&sólo-lectura)...", IDM_ZIP_IMAGE_EXISTING_WP + MENUITEM "Imagen &existente...", IDM_ZIP_IMAGE_EXISTING + MENUITEM "Imagen existente (&sólo-lectura)...", IDM_ZIP_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "E&xtraer", IDM_ZIP_EJECT - MENUITEM "&Recargar imagen previa", IDM_ZIP_RELOAD + MENUITEM "E&xtraer", IDM_ZIP_EJECT + MENUITEM "&Recargar imagen previa", IDM_ZIP_RELOAD END END @@ -208,13 +208,13 @@ MOSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Nueva imagen...", IDM_MO_IMAGE_NEW + MENUITEM "&Nueva imagen...", IDM_MO_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "Imagen &existente...", IDM_MO_IMAGE_EXISTING - MENUITEM "Imagen existente (&sólo-lectura)...", IDM_MO_IMAGE_EXISTING_WP + MENUITEM "Imagen &existente...", IDM_MO_IMAGE_EXISTING + MENUITEM "Imagen existente (&sólo-lectura)...", IDM_MO_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "E&xtraer", IDM_MO_EJECT - MENUITEM "&Recargar imagen previa", IDM_MO_RELOAD + MENUITEM "E&xtraer", IDM_MO_EJECT + MENUITEM "&Recargar imagen previa", IDM_MO_RELOAD END END @@ -240,150 +240,150 @@ END // Dialog // -#define STR_PREFERENCES "Preferencias" -#define STR_SND_GAIN "Ganancia de Sonido" -#define STR_NEW_FLOPPY "Nueva Imagen" -#define STR_CONFIG "Ajustes" -#define STR_SPECIFY_DIM "Especificar Dimensiones de la Ventana Principal" +#define STR_PREFERENCES "Preferencias" +#define STR_SND_GAIN "Ganancia de Sonido" +#define STR_NEW_FLOPPY "Nueva Imagen" +#define STR_CONFIG "Ajustes" +#define STR_SPECIFY_DIM "Especificar Dimensiones de la Ventana Principal" -#define STR_OK "Aceptar" -#define STR_CANCEL "Cancelar" -#define STR_GLOBAL "Salvar estos ajustes como por &defecto globalmente" -#define STR_DEFAULT "&Por defecto" -#define STR_LANGUAGE "Idioma:" -#define STR_ICONSET "Juego de iconos:" +#define STR_OK "Aceptar" +#define STR_CANCEL "Cancelar" +#define STR_GLOBAL "Salvar estos ajustes como por &defecto globalmente" +#define STR_DEFAULT "&Por defecto" +#define STR_LANGUAGE "Idioma:" +#define STR_ICONSET "Juego de iconos:" -#define STR_GAIN "Ganancia" +#define STR_GAIN "Ganancia" -#define STR_FILE_NAME "Nombre de archivo:" -#define STR_DISK_SIZE "Tamaño de disco:" -#define STR_RPM_MODE "Modo RPM:" -#define STR_PROGRESS "Progreso:" +#define STR_FILE_NAME "Nombre de archivo:" +#define STR_DISK_SIZE "Tamaño de disco:" +#define STR_RPM_MODE "Modo RPM:" +#define STR_PROGRESS "Progreso:" -#define STR_WIDTH "Ancho:" -#define STR_HEIGHT "Alto:" -#define STR_LOCK_TO_SIZE "Bloquear a este tamaño" +#define STR_WIDTH "Ancho:" +#define STR_HEIGHT "Alto:" +#define STR_LOCK_TO_SIZE "Bloquear a este tamaño" -#define STR_MACHINE_TYPE "Tipo de máquina:" -#define STR_MACHINE "Máquina:" -#define STR_CONFIGURE "Configurar" -#define STR_CPU_TYPE "Tipo de CPU:" -#define STR_CPU_SPEED "Velocidad:" -#define STR_FPU "FPU:" -#define STR_WAIT_STATES "Estados en espera:" -#define STR_MB "MB" -#define STR_MEMORY "Memoria:" -#define STR_TIME_SYNC "Sincronización horaria" -#define STR_DISABLED "Deshabilitado" -#define STR_ENABLED_LOCAL "Habilitado (hora local)" -#define STR_ENABLED_UTC "Habilitado (UTC)" -#define STR_DYNAREC "Recompilador Dinámico" +#define STR_MACHINE_TYPE "Tipo de máquina:" +#define STR_MACHINE "Máquina:" +#define STR_CONFIGURE "Configurar" +#define STR_CPU_TYPE "Tipo de CPU:" +#define STR_CPU_SPEED "Velocidad:" +#define STR_FPU "FPU:" +#define STR_WAIT_STATES "Estados en espera:" +#define STR_MB "MB" +#define STR_MEMORY "Memoria:" +#define STR_TIME_SYNC "Sincronización horaria" +#define STR_DISABLED "Deshabilitado" +#define STR_ENABLED_LOCAL "Habilitado (hora local)" +#define STR_ENABLED_UTC "Habilitado (UTC)" +#define STR_DYNAREC "Recompilador Dinámico" -#define STR_VIDEO "Vídeo:" -#define STR_VIDEO_2 "Vídeo 2:" -#define STR_VOODOO "Voodoo Graphics" -#define STR_IBM8514 "IBM 8514/a Graphics" -#define STR_XGA "XGA Graphics" +#define STR_VIDEO "Vídeo:" +#define STR_VIDEO_2 "Vídeo 2:" +#define STR_VOODOO "Voodoo Graphics" +#define STR_IBM8514 "IBM 8514/a Graphics" +#define STR_XGA "XGA Graphics" -#define STR_MOUSE "Ratón:" -#define STR_JOYSTICK "Mando:" -#define STR_JOY1 "Mando 1..." -#define STR_JOY2 "Mando 2..." -#define STR_JOY3 "Mando 3..." -#define STR_JOY4 "Mando 4..." +#define STR_MOUSE "Ratón:" +#define STR_JOYSTICK "Mando:" +#define STR_JOY1 "Mando 1..." +#define STR_JOY2 "Mando 2..." +#define STR_JOY3 "Mando 3..." +#define STR_JOY4 "Mando 4..." -#define STR_SOUND1 "Tarjeta de sonido 1:" -#define STR_SOUND2 "Tarjeta de sonido 2:" -#define STR_SOUND3 "Tarjeta de sonido 3:" -#define STR_SOUND4 "Tarjeta de sonido 4:" -#define STR_MIDI_OUT "Dispositivo MIDI de salida:" -#define STR_MIDI_IN "Dispositivo MIDI de entrada:" -#define STR_MPU401 "MPU-401 independiente" -#define STR_FLOAT "Usar sonido FLOAT32" -#define STR_FM_DRIVER "Controlador de sintet. FM" -#define STR_FM_DRV_NUKED "Nuked (más preciso)" -#define STR_FM_DRV_YMFM "YMFM (más rápido)" +#define STR_SOUND1 "Tarjeta de sonido 1:" +#define STR_SOUND2 "Tarjeta de sonido 2:" +#define STR_SOUND3 "Tarjeta de sonido 3:" +#define STR_SOUND4 "Tarjeta de sonido 4:" +#define STR_MIDI_OUT "Dispositivo MIDI de salida:" +#define STR_MIDI_IN "Dispositivo MIDI de entrada:" +#define STR_MPU401 "MPU-401 independiente" +#define STR_FLOAT "Usar sonido FLOAT32" +#define STR_FM_DRIVER "Controlador de sintet. FM" +#define STR_FM_DRV_NUKED "Nuked (más preciso)" +#define STR_FM_DRV_YMFM "YMFM (más rápido)" -#define STR_NET_TYPE "Tipo de red:" -#define STR_PCAP "Dispositivo PCap:" -#define STR_NET "Adaptador de red:" -#define STR_NET1 "Network card 1:" -#define STR_NET2 "Network card 2:" -#define STR_NET3 "Network card 3:" -#define STR_NET4 "Network card 4:" +#define STR_NET_TYPE "Tipo de red:" +#define STR_PCAP "Dispositivo PCap:" +#define STR_NET "Adaptador de red:" +#define STR_NET1 "Network card 1:" +#define STR_NET2 "Network card 2:" +#define STR_NET3 "Network card 3:" +#define STR_NET4 "Network card 4:" -#define STR_COM1 "Dispositivo COM1:" -#define STR_COM2 "Dispositivo COM2:" -#define STR_COM3 "Dispositivo COM3:" -#define STR_COM4 "Dispositivo COM4:" -#define STR_LPT1 "Dispositivo LPT1:" -#define STR_LPT2 "Dispositivo LPT2:" -#define STR_LPT3 "Dispositivo LPT3:" -#define STR_LPT4 "Dispositivo LPT4:" -#define STR_SERIAL1 "Puerto serie 1" -#define STR_SERIAL2 "Puerto serie 2" -#define STR_SERIAL3 "Puerto serie 3" -#define STR_SERIAL4 "Puerto serie 4" -#define STR_PARALLEL1 "Puerto paralelo 1" -#define STR_PARALLEL2 "Puerto paralelo 2" -#define STR_PARALLEL3 "Puerto paralelo 3" -#define STR_PARALLEL4 "Puerto paralelo 4" -#define STR_SERIAL_PASS1 "Serial port passthrough 1" -#define STR_SERIAL_PASS2 "Serial port passthrough 2" -#define STR_SERIAL_PASS3 "Serial port passthrough 3" -#define STR_SERIAL_PASS4 "Serial port passthrough 4" +#define STR_COM1 "Dispositivo COM1:" +#define STR_COM2 "Dispositivo COM2:" +#define STR_COM3 "Dispositivo COM3:" +#define STR_COM4 "Dispositivo COM4:" +#define STR_LPT1 "Dispositivo LPT1:" +#define STR_LPT2 "Dispositivo LPT2:" +#define STR_LPT3 "Dispositivo LPT3:" +#define STR_LPT4 "Dispositivo LPT4:" +#define STR_SERIAL1 "Puerto serie 1" +#define STR_SERIAL2 "Puerto serie 2" +#define STR_SERIAL3 "Puerto serie 3" +#define STR_SERIAL4 "Puerto serie 4" +#define STR_PARALLEL1 "Puerto paralelo 1" +#define STR_PARALLEL2 "Puerto paralelo 2" +#define STR_PARALLEL3 "Puerto paralelo 3" +#define STR_PARALLEL4 "Puerto paralelo 4" +#define STR_SERIAL_PASS1 "Serial port passthrough 1" +#define STR_SERIAL_PASS2 "Serial port passthrough 2" +#define STR_SERIAL_PASS3 "Serial port passthrough 3" +#define STR_SERIAL_PASS4 "Serial port passthrough 4" -#define STR_HDC "Controladora HD:" -#define STR_FDC "Controladora FD:" -#define STR_IDE_TER "Tercera controladora IDE" -#define STR_IDE_QUA "Cuarta controladora IDE" -#define STR_SCSI "SCSI" -#define STR_SCSI_1 "Controladora 1:" -#define STR_SCSI_2 "Controladora 2:" -#define STR_SCSI_3 "Controladora 3:" -#define STR_SCSI_4 "Controladora 4:" -#define STR_CASSETTE "Cassette" +#define STR_HDC "Controladora HD:" +#define STR_FDC "Controladora FD:" +#define STR_IDE_TER "Tercera controladora IDE" +#define STR_IDE_QUA "Cuarta controladora IDE" +#define STR_SCSI "SCSI" +#define STR_SCSI_1 "Controladora 1:" +#define STR_SCSI_2 "Controladora 2:" +#define STR_SCSI_3 "Controladora 3:" +#define STR_SCSI_4 "Controladora 4:" +#define STR_CASSETTE "Cassette" -#define STR_HDD "Discos duros:" -#define STR_NEW "&Nuevo..." -#define STR_EXISTING "&Existente..." -#define STR_REMOVE "E&liminar" -#define STR_BUS "Bus:" -#define STR_CHANNEL "Canal:" -#define STR_ID "ID:" -#define STR_SPEED "Speed:" +#define STR_HDD "Discos duros:" +#define STR_NEW "&Nuevo..." +#define STR_EXISTING "&Existente..." +#define STR_REMOVE "E&liminar" +#define STR_BUS "Bus:" +#define STR_CHANNEL "Canal:" +#define STR_ID "ID:" +#define STR_SPEED "Speed:" -#define STR_SPECIFY "E&specificar..." -#define STR_SECTORS "Sectores:" -#define STR_HEADS "Cabezas:" -#define STR_CYLS "Cilindros:" -#define STR_SIZE_MB "Tamaño (MB):" -#define STR_TYPE "Tipo:" -#define STR_IMG_FORMAT "Formato de imagen:" -#define STR_BLOCK_SIZE "Tamaño de bloque:" +#define STR_SPECIFY "E&specificar..." +#define STR_SECTORS "Sectores:" +#define STR_HEADS "Cabezas:" +#define STR_CYLS "Cilindros:" +#define STR_SIZE_MB "Tamaño (MB):" +#define STR_TYPE "Tipo:" +#define STR_IMG_FORMAT "Formato de imagen:" +#define STR_BLOCK_SIZE "Tamaño de bloque:" -#define STR_FLOPPY_DRIVES "Unidades de disquete:" -#define STR_TURBO "Temporizaciones Turbo" -#define STR_CHECKBPB "Chequear BPB" -#define STR_CDROM_DRIVES "Unidades de CD-ROM:" -#define STR_CD_SPEED "Velocidad:" -#define STR_EARLY "Unidad anterior" +#define STR_FLOPPY_DRIVES "Unidades de disquete:" +#define STR_TURBO "Temporizaciones Turbo" +#define STR_CHECKBPB "Chequear BPB" +#define STR_CDROM_DRIVES "Unidades de CD-ROM:" +#define STR_CD_SPEED "Velocidad:" +#define STR_EARLY "Unidad anterior" -#define STR_MO_DRIVES "Unidades MO:" -#define STR_ZIP_DRIVES "Unidades ZIP:" -#define STR_250 "ZIP 250" +#define STR_MO_DRIVES "Unidades MO:" +#define STR_ZIP_DRIVES "Unidades ZIP:" +#define STR_250 "ZIP 250" -#define STR_ISARTC "ISA RTC:" -#define STR_ISAMEM "Expansión de Memoria ISA" -#define STR_ISAMEM_1 "Tarjeta 1:" -#define STR_ISAMEM_2 "Tarjeta 2:" -#define STR_ISAMEM_3 "Tarjeta 3:" -#define STR_ISAMEM_4 "Tarjeta 4:" -#define STR_BUGGER "Dispositivo ISABugger" -#define STR_POSTCARD "Tarjeta POST" +#define STR_ISARTC "ISA RTC:" +#define STR_ISAMEM "Expansión de Memoria ISA" +#define STR_ISAMEM_1 "Tarjeta 1:" +#define STR_ISAMEM_2 "Tarjeta 2:" +#define STR_ISAMEM_3 "Tarjeta 3:" +#define STR_ISAMEM_4 "Tarjeta 4:" +#define STR_BUGGER "Dispositivo ISABugger" +#define STR_POSTCARD "Tarjeta POST" -#define FONT_SIZE 9 -#define FONT_NAME "Segoe UI" +#define FONT_SIZE 9 +#define FONT_NAME "Segoe UI" #include "dialogs.rc" @@ -394,149 +394,149 @@ END STRINGTABLE DISCARDABLE BEGIN - 2048 "86Box" - IDS_2049 "Error" - IDS_2050 "Error fatal" - IDS_2051 " - PAUSED" - IDS_2052 "Pulsa Ctrl+Alt+PgDn para volver a modo ventana." - IDS_2053 "Velocidad" - IDS_2054 "ZIP %03i %i (%s): %ls" - IDS_2055 "Imagenes ZIP (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" - IDS_2056 "86Box no pudo encontrar ninguna imagen ROM usable.\n\nPor favor descarga un grupo de imágenes y extráelas en el directorio ""roms""." - IDS_2057 "(vacío)" - IDS_2058 "Imagenes ZIP (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0All files (*.*)\0*.*\0" - IDS_2059 "Turbo" - IDS_2060 "On" - IDS_2061 "Off" - IDS_2062 "Todas las imagenes (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0Basic sector images (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Surface images (*.86F)\0*.86F\0" - IDS_2063 "La máquina ""%hs"" no está disponible debido a ROMs faltantes en el directorio roms/machines. Cambiando a una máquina disponible." + 2048 "86Box" + IDS_2049 "Error" + IDS_2050 "Error fatal" + IDS_2051 " - PAUSED" + IDS_2052 "Pulsa Ctrl+Alt+PgDn para volver a modo ventana." + IDS_2053 "Velocidad" + IDS_2054 "ZIP %03i %i (%s): %ls" + IDS_2055 "Imagenes ZIP (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" + IDS_2056 "86Box no pudo encontrar ninguna imagen ROM usable.\n\nPor favor descarga un grupo de imágenes y extráelas en el directorio ""roms""." + IDS_2057 "(vacío)" + IDS_2058 "Imagenes ZIP (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0All files (*.*)\0*.*\0" + IDS_2059 "Turbo" + IDS_2060 "On" + IDS_2061 "Off" + IDS_2062 "Todas las imagenes (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0Basic sector images (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Surface images (*.86F)\0*.86F\0" + IDS_2063 "La máquina ""%hs"" no está disponible debido a ROMs faltantes en el directorio roms/machines. Cambiando a una máquina disponible." END STRINGTABLE DISCARDABLE BEGIN - IDS_2064 "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." - IDS_2065 "Máquina" - IDS_2066 "Vídeo" - IDS_2067 "Dispositivos de Entrada" - IDS_2068 "Sonido" - IDS_2069 "Red" - IDS_2070 "Puertos (COM y LPT)" - IDS_2071 "Controladoras de Almacenamiento" - IDS_2072 "Discos Duros" - IDS_2073 "Disquetes y unidades de CD-ROM" - IDS_2074 "Otros dispositivos extraíbles" - IDS_2075 "Otros periféricos" - IDS_2076 "Imágenes de superficie (*.86F)\0*.86F\0" - IDS_2077 "Haz click para capturar el ratón" - IDS_2078 "Pulsa F8+F12 para liberar el ratón" - IDS_2079 "Pulsa F8+F12 o el botón central para liberar el ratón" + IDS_2064 "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." + IDS_2065 "Máquina" + IDS_2066 "Vídeo" + IDS_2067 "Dispositivos de Entrada" + IDS_2068 "Sonido" + IDS_2069 "Red" + IDS_2070 "Puertos (COM y LPT)" + IDS_2071 "Controladoras de Almacenamiento" + IDS_2072 "Discos Duros" + IDS_2073 "Disquetes y unidades de CD-ROM" + IDS_2074 "Otros dispositivos extraíbles" + IDS_2075 "Otros periféricos" + IDS_2076 "Imágenes de superficie (*.86F)\0*.86F\0" + IDS_2077 "Haz click para capturar el ratón" + IDS_2078 "Pulsa F8+F12 para liberar el ratón" + IDS_2079 "Pulsa F8+F12 o el botón central para liberar el ratón" END STRINGTABLE DISCARDABLE BEGIN - IDS_2080 "Incapaz de inicializar FluidSynth" - IDS_2081 "Bus" - IDS_2082 "Archivo" - IDS_2083 "C" - IDS_2084 "H" - IDS_2085 "S" - IDS_2086 "MB" + IDS_2080 "Incapaz de inicializar FluidSynth" + IDS_2081 "Bus" + IDS_2082 "Archivo" + IDS_2083 "C" + IDS_2084 "H" + IDS_2085 "S" + IDS_2086 "MB" IDS_2087 "Speed" - IDS_2088 "Chequear BPB" - IDS_2089 "KB" - IDS_2090 "Incapaz de inicializar el renderizador de vídeo." - IDS_2091 "Por defecto" - IDS_2092 "%i estado(s) de Espera" - IDS_2093 "Tipo" - IDS_2094 "Incapaz de configurar PCap" - IDS_2095 "No se encontraron dispositivos PCap" - IDS_2096 "Dispositivo PCap inválido" - IDS_2097 "Mando(s) de 2 botones estándar" - IDS_2098 "Mando de 4 botones estándar" - IDS_2099 "Mando de 6 botones estándar" - IDS_2100 "Mando de 8 botones estándar" - IDS_2101 "CH Flightstick Pro" - IDS_2102 "Microsoft SideWinder Pad" - IDS_2103 "Thrustmaster Flight Control System" - IDS_2104 "Ninguno" - IDS_2105 "Incapaz de cargar aceleradores de teclado." - IDS_2106 "Incapaz de registrar entrada directa." - IDS_2107 "%u" - IDS_2108 "%u MB (CHS: %i, %i, %i)" - IDS_2109 "Disquete %i (%s): %ls" - IDS_2110 "Todas las Imágenes (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Advanced sector images (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Basic sector images (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Flux images (*.FDI)\0*.FDI\0Surface images (*.86F;*.MFM)\0*.86F;*.MFM\0All files (*.*)\0*.*\0" - IDS_2111 "Incapaz de inicializar FreeType" - IDS_2112 "Incapaz de inicializar SDL, se requiere SDL2.dll" - IDS_2113 "¿Seguro que quieres resetear la máquina emulada?" - IDS_2114 "¿Seguro que quieres cerrar 86Box?" - IDS_2115 "Incapaz de inicializar Ghostscript" - IDS_2116 "MO %i (%ls): %ls" - IDS_2117 "Imágenes de MO (*.IM?;*.MDI)\0*.IM?;*.MDI\0All files (*.*)\0*.*\0" - IDS_2118 "¡Bienvenido a 86Box!" - IDS_2119 "Controladora interna" - IDS_2120 "Salir" - IDS_2121 "No se encontraron ROMs" - IDS_2122 "¿Quieres guardar los ajustes?" - IDS_2123 "Se hará hard reset de la máquina emulada." - IDS_2124 "Guardar" - IDS_2125 "Acerca de 86Box" - IDS_2126 "86Box v" EMU_VERSION + IDS_2088 "Chequear BPB" + IDS_2089 "KB" + IDS_2090 "Incapaz de inicializar el renderizador de vídeo." + IDS_2091 "Por defecto" + IDS_2092 "%i estado(s) de Espera" + IDS_2093 "Tipo" + IDS_2094 "Incapaz de configurar PCap" + IDS_2095 "No se encontraron dispositivos PCap" + IDS_2096 "Dispositivo PCap inválido" + IDS_2097 "Mando(s) de 2 botones estándar" + IDS_2098 "Mando de 4 botones estándar" + IDS_2099 "Mando de 6 botones estándar" + IDS_2100 "Mando de 8 botones estándar" + IDS_2101 "CH Flightstick Pro" + IDS_2102 "Microsoft SideWinder Pad" + IDS_2103 "Thrustmaster Flight Control System" + IDS_2104 "Ninguno" + IDS_2105 "Incapaz de cargar aceleradores de teclado." + IDS_2106 "Incapaz de registrar entrada directa." + IDS_2107 "%u" + IDS_2108 "%u MB (CHS: %i, %i, %i)" + IDS_2109 "Disquete %i (%s): %ls" + IDS_2110 "Todas las Imágenes (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Advanced sector images (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Basic sector images (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Flux images (*.FDI)\0*.FDI\0Surface images (*.86F;*.MFM)\0*.86F;*.MFM\0All files (*.*)\0*.*\0" + IDS_2111 "Incapaz de inicializar FreeType" + IDS_2112 "Incapaz de inicializar SDL, se requiere SDL2.dll" + IDS_2113 "¿Seguro que quieres resetear la máquina emulada?" + IDS_2114 "¿Seguro que quieres cerrar 86Box?" + IDS_2115 "Incapaz de inicializar Ghostscript" + IDS_2116 "MO %i (%ls): %ls" + IDS_2117 "Imágenes de MO (*.IM?;*.MDI)\0*.IM?;*.MDI\0All files (*.*)\0*.*\0" + IDS_2118 "¡Bienvenido a 86Box!" + IDS_2119 "Controladora interna" + IDS_2120 "Salir" + IDS_2121 "No se encontraron ROMs" + IDS_2122 "¿Quieres guardar los ajustes?" + IDS_2123 "Se hará hard reset de la máquina emulada." + IDS_2124 "Guardar" + IDS_2125 "Acerca de 86Box" + IDS_2126 "86Box v" EMU_VERSION - IDS_2127 "Un emulador de ordenadores antigüos\n\nAutores: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, Tiseno100, reenigne, 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." - IDS_2128 "Aceptar" - IDS_2129 "Hardware no disponible" + IDS_2127 "Un emulador de ordenadores antigüos\n\nAutores: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, Tiseno100, reenigne, 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." + IDS_2128 "Aceptar" + IDS_2129 "Hardware no disponible" #ifdef _WIN32 #define LIB_NAME_PCAP "WinPcap" #else #define LIB_NAME_PCAP "libpcap" #endif - IDS_2130 "Asegúrate de que " LIB_NAME_PCAP " está instalado y de que estás en una conexión de red compatible con " LIB_NAME_PCAP "." - IDS_2131 "Configuración inválida" + IDS_2130 "Asegúrate de que " LIB_NAME_PCAP " está instalado y de que estás en una conexión de red compatible con " LIB_NAME_PCAP "." + IDS_2131 "Configuración inválida" #ifdef _WIN32 #define LIB_NAME_FREETYPE "freetype.dll" #else #define LIB_NAME_FREETYPE "libfreetype" #endif - IDS_2132 LIB_NAME_FREETYPE " es necesaria para emulación de impresión ESC/P." + IDS_2132 LIB_NAME_FREETYPE " es necesaria para emulación de impresión ESC/P." #ifdef _WIN32 #define LIB_NAME_GS "gsdll32.dll" #else #define LIB_NAME_GS "libgs" #endif - IDS_2133 LIB_NAME_GS " 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)." + IDS_2133 LIB_NAME_GS " 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)." #ifdef _WIN32 #define LIB_NAME_FLUIDSYNTH "libfluidsynth.dll" #else #define LIB_NAME_FLUIDSYNTH "libfluidsynth" #endif - IDS_2134 LIB_NAME_FLUIDSYNTH " es necesario para salida MIDI FluidSynth." - IDS_2135 "Entrando en modo pantalla completa" - IDS_2136 "No mostrar más este mensaje" - IDS_2137 "No salir" - IDS_2138 "Resetear" - IDS_2139 "No resetear" - IDS_2140 "Imágenes de MO (*.IM?;*.MDI)\0*.IM?;*.MDI\0All files (*.*)\0*.*\0" - IDS_2141 "Imágenes de CD-ROM (*.ISO;*.CUE)\0*.ISO;*.CUE\0All files (*.*)\0*.*\0" - IDS_2142 "%hs Configuración de Dispositivo" + IDS_2134 LIB_NAME_FLUIDSYNTH " es necesario para salida MIDI FluidSynth." + IDS_2135 "Entrando en modo pantalla completa" + IDS_2136 "No mostrar más este mensaje" + IDS_2137 "No salir" + IDS_2138 "Resetear" + IDS_2139 "No resetear" + IDS_2140 "Imágenes de MO (*.IM?;*.MDI)\0*.IM?;*.MDI\0All files (*.*)\0*.*\0" + IDS_2141 "Imágenes de CD-ROM (*.ISO;*.CUE)\0*.ISO;*.CUE\0All files (*.*)\0*.*\0" + IDS_2142 "%hs Configuración de Dispositivo" IDS_2143 "Monitor en modo ahorro" - IDS_2144 "Shaders OpenGL (*.GLSL)\0*.GLSL\0All files (*.*)\0*.*\0" - IDS_2145 "Opciones OpenGL" - IDS_2146 "Estás cargando una configuración no soportada" - IDS_2147 "El Filtrado de tipo de CPU basado en máquina seleccionada está deshabilitado para la esta máquina.\n\nEsto hace posible seleccionar una CPU que sea incompatible con esta máquina. Por ello, pueden aparecer incompatibilidader con la BIOS de la máquina u otro software.\n\nActivar este ajuste no está oficialmente soportado y cualquier reporte de fallo puede ser cerrado como inválido." - IDS_2148 "Continuar" - IDS_2149 "Cassette: %s" - IDS_2150 "Imágenes de Cassette (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0All files (*.*)\0*.*\0" - IDS_2151 "Cartucho %i: %ls" - IDS_2152 "Imágenes de Cartucho (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0All files (*.*)\0*.*\0" - IDS_2153 "Error initializing renderer" - IDS_2154 "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." - IDS_2155 "Resume execution" - IDS_2156 "Pause execution" - IDS_2157 "Press Ctrl+Alt+Del" - IDS_2158 "Press Ctrl+Alt+Esc" - IDS_2159 "Hard reset" - IDS_2160 "ACPI shutdown" - IDS_2161 "Settings" + IDS_2144 "Shaders OpenGL (*.GLSL)\0*.GLSL\0All files (*.*)\0*.*\0" + IDS_2145 "Opciones OpenGL" + IDS_2146 "Estás cargando una configuración no soportada" + IDS_2147 "El Filtrado de tipo de CPU basado en máquina seleccionada está deshabilitado para la esta máquina.\n\nEsto hace posible seleccionar una CPU que sea incompatible con esta máquina. Por ello, pueden aparecer incompatibilidader con la BIOS de la máquina u otro software.\n\nActivar este ajuste no está oficialmente soportado y cualquier reporte de fallo puede ser cerrado como inválido." + IDS_2148 "Continuar" + IDS_2149 "Cassette: %s" + IDS_2150 "Imágenes de Cassette (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0All files (*.*)\0*.*\0" + IDS_2151 "Cartucho %i: %ls" + IDS_2152 "Imágenes de Cartucho (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0All files (*.*)\0*.*\0" + IDS_2153 "Error initializing renderer" + IDS_2154 "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." + IDS_2155 "Resume execution" + IDS_2156 "Pause execution" + IDS_2157 "Press Ctrl+Alt+Del" + IDS_2158 "Press Ctrl+Alt+Esc" + IDS_2159 "Hard reset" + IDS_2160 "ACPI shutdown" + IDS_2161 "Settings" IDS_2162 "Unidad anterior" IDS_2163 "No Dynarec" IDS_2164 "Old Dynarec" @@ -547,45 +547,45 @@ END STRINGTABLE DISCARDABLE BEGIN IDS_4096 "Disco duro (%s)" - IDS_4097 "%01i:%01i" - IDS_4098 "%01i" - IDS_4099 "Nunca hubo unidades de CD-ROM MFM/RLL o ESDI" - IDS_4100 "A medida..." - IDS_4101 "A medida (grande)..." - IDS_4102 "Añadir Nuevo Disco Duro" - IDS_4103 "Añadir Disco Duro Existente" - IDS_4104 "Las imágenes de disco HDI no pueden superar los 4 GB." - IDS_4105 "Las imágenes de disco no pueden superar los 127 GB." - IDS_4106 "Imágenes de Disco Duro (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0All files (*.*)\0*.*\0" - IDS_4107 "No se pudo leer el archivo" - IDS_4108 "No se pudo escribir el archivo" - IDS_4109 "No se soportan las imágenes HDI o HDX con un tamaño de sector diferente a 512." - IDS_4110 "No se soporta aún el USB" - IDS_4111 "La imagen de disco ya existe" - IDS_4112 "Por favor especifique un nombre de archivo válido." - IDS_4113 "Imagen de disco creada" - IDS_4114 "Asegúrese de que el archivo existe y es leíble." - IDS_4115 "Asegúrese de que el archivo en un directorio con permiso de escritura." - IDS_4116 "Imagen de disco demasiado grande" - IDS_4117 "Recuerde particionar y formatear la nueva unidad." - IDS_4118 "El archivo selecionado será sobreescrito. ¿Está seguro de querer usarlo?" - IDS_4119 "Imagen de disco no soportada" - IDS_4120 "Sobreescribir" - IDS_4121 "No sobreescribir" - IDS_4122 "Imagen plana (.img)" - IDS_4123 "Imagen HDI (.hdi)" - IDS_4124 "Imagen HDX (.hdx)" - IDS_4125 "VHD de tamaño fijo (.vhd)" - IDS_4126 "VHD de tamaño dinámico (.vhd)" - IDS_4127 "VHD diferencial (.vhd)" - IDS_4128 "Bloques grandes (2 MB)" - IDS_4129 "Bloques pequeños (512 KB)" - IDS_4130 "Archivos VHD (*.VHD)\0*.VHD\0All files (*.*)\0*.*\0" - IDS_4131 "Seleccione el VHD padre" - IDS_4132 "Esto puede deberse a que la imagen padre se modificó después de que la imagen diferencial se crease.\n\nTambién puede ocurrir si las imágenes fueron movidas o copiadas, o por un fallo en el programa que creó este disco.\n\n¿Quiere corregir los registros de tiempo?" - IDS_4133 "Las marcas de tiempo del padre e hijo no coinciden" - IDS_4134 "No se pudo corregir la marca de tiempo del VHD." - IDS_4135 "%01i:%02i" + IDS_4097 "%01i:%01i" + IDS_4098 "%01i" + IDS_4099 "Nunca hubo unidades de CD-ROM MFM/RLL o ESDI" + IDS_4100 "A medida..." + IDS_4101 "A medida (grande)..." + IDS_4102 "Añadir Nuevo Disco Duro" + IDS_4103 "Añadir Disco Duro Existente" + IDS_4104 "Las imágenes de disco HDI no pueden superar los 4 GB." + IDS_4105 "Las imágenes de disco no pueden superar los 127 GB." + IDS_4106 "Imágenes de Disco Duro (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0All files (*.*)\0*.*\0" + IDS_4107 "No se pudo leer el archivo" + IDS_4108 "No se pudo escribir el archivo" + IDS_4109 "No se soportan las imágenes HDI o HDX con un tamaño de sector diferente a 512." + IDS_4110 "No se soporta aún el USB" + IDS_4111 "La imagen de disco ya existe" + IDS_4112 "Por favor especifique un nombre de archivo válido." + IDS_4113 "Imagen de disco creada" + IDS_4114 "Asegúrese de que el archivo existe y es leíble." + IDS_4115 "Asegúrese de que el archivo en un directorio con permiso de escritura." + IDS_4116 "Imagen de disco demasiado grande" + IDS_4117 "Recuerde particionar y formatear la nueva unidad." + IDS_4118 "El archivo selecionado será sobreescrito. ¿Está seguro de querer usarlo?" + IDS_4119 "Imagen de disco no soportada" + IDS_4120 "Sobreescribir" + IDS_4121 "No sobreescribir" + IDS_4122 "Imagen plana (.img)" + IDS_4123 "Imagen HDI (.hdi)" + IDS_4124 "Imagen HDX (.hdx)" + IDS_4125 "VHD de tamaño fijo (.vhd)" + IDS_4126 "VHD de tamaño dinámico (.vhd)" + IDS_4127 "VHD diferencial (.vhd)" + IDS_4128 "Bloques grandes (2 MB)" + IDS_4129 "Bloques pequeños (512 KB)" + IDS_4130 "Archivos VHD (*.VHD)\0*.VHD\0All files (*.*)\0*.*\0" + IDS_4131 "Seleccione el VHD padre" + IDS_4132 "Esto puede deberse a que la imagen padre se modificó después de que la imagen diferencial se crease.\n\nTambién puede ocurrir si las imágenes fueron movidas o copiadas, o por un fallo en el programa que creó este disco.\n\n¿Quiere corregir los registros de tiempo?" + IDS_4133 "Las marcas de tiempo del padre e hijo no coinciden" + IDS_4134 "No se pudo corregir la marca de tiempo del VHD." + IDS_4135 "%01i:%02i" IDS_4352 "MFM/RLL" IDS_4353 "XTA" @@ -594,56 +594,56 @@ BEGIN IDS_4356 "ATAPI" IDS_4357 "SCSI" - IDS_4608 "MFM/RLL (%01i:%01i)" - IDS_4609 "XTA (%01i:%01i)" - IDS_4610 "ESDI (%01i:%01i)" - IDS_4611 "IDE (%01i:%01i)" - IDS_4612 "ATAPI (%01i:%01i)" - IDS_4613 "SCSI (%01i:%02i)" + IDS_4608 "MFM/RLL (%01i:%01i)" + IDS_4609 "XTA (%01i:%01i)" + IDS_4610 "ESDI (%01i:%01i)" + IDS_4611 "IDE (%01i:%01i)" + IDS_4612 "ATAPI (%01i:%01i)" + IDS_4613 "SCSI (%01i:%02i)" - IDS_5120 "CD-ROM %i (%s): %s" + IDS_5120 "CD-ROM %i (%s): %s" - IDS_5376 "Deshabilitado" - IDS_5381 "ATAPI" + IDS_5376 "Deshabilitado" + IDS_5381 "ATAPI" IDS_5382 "SCSI" - IDS_5632 "Deshabilitado" - IDS_5637 "ATAPI (%01i:%01i)" + IDS_5632 "Deshabilitado" + IDS_5637 "ATAPI (%01i:%01i)" IDS_5638 "SCSI (%01i:%02i)" - IDS_5888 "160 kB" - IDS_5889 "180 kB" - IDS_5890 "320 kB" - IDS_5891 "360 kB" - IDS_5892 "640 kB" - IDS_5893 "720 kB" - IDS_5894 "1.2 MB" - IDS_5895 "1.25 MB" - IDS_5896 "1.44 MB" - IDS_5897 "DMF (cluster 1024)" - IDS_5898 "DMF (cluster 2048)" - IDS_5899 "2.88 MB" - IDS_5900 "ZIP 100" - IDS_5901 "ZIP 250" - IDS_5902 "3.5"" 128 MB (ISO 10090)" - IDS_5903 "3.5"" 230 MB (ISO 13963)" - IDS_5904 "3.5"" 540 MB (ISO 15498)" - IDS_5905 "3.5"" 640 MB (ISO 15498)" - IDS_5906 "3.5"" 1.3 GB (GigaMO)" - IDS_5907 "3.5"" 2.3 GB (GigaMO 2)" - IDS_5908 "5.25"" 600 MB" - IDS_5909 "5.25"" 650 MB" - IDS_5910 "5.25"" 1 GB" - IDS_5911 "5.25"" 1.3 GB" + IDS_5888 "160 kB" + IDS_5889 "180 kB" + IDS_5890 "320 kB" + IDS_5891 "360 kB" + IDS_5892 "640 kB" + IDS_5893 "720 kB" + IDS_5894 "1.2 MB" + IDS_5895 "1.25 MB" + IDS_5896 "1.44 MB" + IDS_5897 "DMF (cluster 1024)" + IDS_5898 "DMF (cluster 2048)" + IDS_5899 "2.88 MB" + IDS_5900 "ZIP 100" + IDS_5901 "ZIP 250" + IDS_5902 "3.5"" 128 MB (ISO 10090)" + IDS_5903 "3.5"" 230 MB (ISO 13963)" + IDS_5904 "3.5"" 540 MB (ISO 15498)" + IDS_5905 "3.5"" 640 MB (ISO 15498)" + IDS_5906 "3.5"" 1.3 GB (GigaMO)" + IDS_5907 "3.5"" 2.3 GB (GigaMO 2)" + IDS_5908 "5.25"" 600 MB" + IDS_5909 "5.25"" 650 MB" + IDS_5910 "5.25"" 1 GB" + IDS_5911 "5.25"" 1.3 GB" - IDS_6144 "RPM perfectas" - IDS_6145 "1% por debajo de RPM perfectas" - IDS_6146 "1.5% por debajo de RPM perfectas" - IDS_6147 "2% por debajo de RPM perfectas" + IDS_6144 "RPM perfectas" + IDS_6145 "1% por debajo de RPM perfectas" + IDS_6146 "1.5% por debajo de RPM perfectas" + IDS_6147 "2% por debajo de RPM perfectas" - IDS_7168 "(Por defecto del sistema)" + IDS_7168 "(Por defecto del sistema)" END -#define IDS_LANG_ESES IDS_7168 +#define IDS_LANG_ESES IDS_7168 // Spanish (Spain) resources ///////////////////////////////////////////////////////////////////////////// diff --git a/src/win/languages/fi-FI.rc b/src/win/languages/fi-FI.rc index a36b92719..edcf7d53e 100644 --- a/src/win/languages/fi-FI.rc +++ b/src/win/languages/fi-FI.rc @@ -186,7 +186,7 @@ BEGIN MENUITEM "&Lataa edellinen levykuva uudelleen", IDM_CDROM_RELOAD MENUITEM SEPARATOR MENUITEM "L&evykuva...", IDM_CDROM_IMAGE - MENUITEM "&Kansio...", IDM_CDROM_DIR + MENUITEM "&Kansio...", IDM_CDROM_DIR END END @@ -282,7 +282,7 @@ END #define STR_VIDEO "Näytönohjain:" #define STR_VIDEO_2 "Näytönohjain 2:" #define STR_VOODOO "Voodoo-grafiikkasuoritin" -#define STR_IBM8514 "IBM 8514/a-grafiikkasuoritin" +#define STR_IBM8514 "IBM 8514/a-grafiikkasuoritin" #define STR_XGA "XGA-grafiikkasuoritin" #define STR_MOUSE "Hiiri:" @@ -351,7 +351,7 @@ END #define STR_BUS "Väylä:" #define STR_CHANNEL "Kanava:" #define STR_ID "ID:" -#define STR_SPEED "Speed:" +#define STR_SPEED "Speed:" #define STR_SPECIFY "&Määritä..." #define STR_SECTORS "Sektorit:" @@ -382,8 +382,8 @@ END #define STR_BUGGER "ISABugger-laite" #define STR_POSTCARD "POST-kortti" -#define FONT_SIZE 9 -#define FONT_NAME "Segoe UI" +#define FONT_SIZE 9 +#define FONT_NAME "Segoe UI" #include "dialogs.rc" @@ -528,15 +528,15 @@ BEGIN IDS_2150 "Kasettitiedostot (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Kaikki tiedostot (*.*)\0*.*\0" IDS_2151 "ROM-moduuli %i: %ls" IDS_2152 "ROM-moduulikuvat (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Kaikki tiedostot (*.*)\0*.*\0" - IDS_2153 "Virhe renderöijän alustuksessa" - IDS_2154 "OpenGL (3.0 Core) -renderöijän alustus epäonnistui. Käytä toista renderöijää." - IDS_2155 "Jatka suoritusta" - IDS_2156 "Pysäytä suoritus" - IDS_2157 "Paina Ctrl+Alt+Del" - IDS_2158 "Paina Ctrl+Alt+Esc" - IDS_2159 "Kylmä uudelleenkäynnistys" - IDS_2160 "ACPI-sammutus" - IDS_2161 "Asetukset" + IDS_2153 "Virhe renderöijän alustuksessa" + IDS_2154 "OpenGL (3.0 Core) -renderöijän alustus epäonnistui. Käytä toista renderöijää." + IDS_2155 "Jatka suoritusta" + IDS_2156 "Pysäytä suoritus" + IDS_2157 "Paina Ctrl+Alt+Del" + IDS_2158 "Paina Ctrl+Alt+Esc" + IDS_2159 "Kylmä uudelleenkäynnistys" + IDS_2160 "ACPI-sammutus" + IDS_2161 "Asetukset" IDS_2162 "Aiemmat asemat" IDS_2163 "No Dynarec" IDS_2164 "Old Dynarec" diff --git a/src/win/languages/fr-FR.rc b/src/win/languages/fr-FR.rc index 7d4d82650..15ab41645 100644 --- a/src/win/languages/fr-FR.rc +++ b/src/win/languages/fr-FR.rc @@ -17,13 +17,13 @@ MainMenu MENU DISCARDABLE BEGIN POPUP "&Action" BEGIN - MENUITEM "&Capturer le clavier", IDM_ACTION_KBD_REQ_CAPTURE - MENUITEM "CTRL &Droite devient ALT Gauche", IDM_ACTION_RCTRL_IS_LALT + MENUITEM "&Capturer le clavier", IDM_ACTION_KBD_REQ_CAPTURE + MENUITEM "CTRL &Droite devient ALT Gauche", IDM_ACTION_RCTRL_IS_LALT MENUITEM SEPARATOR MENUITEM "&Hard Reset...", IDM_ACTION_HRESET MENUITEM "&Ctrl+Alt+Del\tCtrl+F12", IDM_ACTION_RESET_CAD MENUITEM SEPARATOR - MENUITEM "Ctrl+Alt+&Esc", IDM_ACTION_CTRL_ALT_ESC + MENUITEM "Ctrl+Alt+&Esc", IDM_ACTION_CTRL_ALT_ESC MENUITEM SEPARATOR MENUITEM "&Pause", IDM_ACTION_PAUSE MENUITEM SEPARATOR @@ -31,8 +31,8 @@ BEGIN END POPUP "&Vue" BEGIN - MENUITEM "&Masquer la barre de status", IDM_VID_HIDE_STATUS_BAR - MENUITEM "Hide &toolbar", IDM_VID_HIDE_TOOLBAR + MENUITEM "&Masquer la barre de status", IDM_VID_HIDE_STATUS_BAR + MENUITEM "Hide &toolbar", IDM_VID_HIDE_TOOLBAR MENUITEM SEPARATOR MENUITEM "&Show non-primary monitors", IDM_VID_MONITORS MENUITEM "Fenètre &Retaillable", IDM_VID_RESIZE @@ -101,11 +101,11 @@ BEGIN MENUITEM "CGA/PCjr/Tandy/E&GA/(S)VGA overscan", IDM_VID_OVERSCAN MENUITEM "Modifier contraste affichage &monochrome", IDM_VID_CGACON END - MENUITEM "&Media", IDM_MEDIA + MENUITEM "&Media", IDM_MEDIA POPUP "Ou&tils" BEGIN MENUITEM "&Réglages...", IDM_CONFIG - MENUITEM "Mettre à jour la barre de stat&us", IDM_UPDATE_ICONS + MENUITEM "Mettre à jour la barre de stat&us", IDM_UPDATE_ICONS MENUITEM SEPARATOR MENUITEM "Copie &Ecran\tCtrl+F11", IDM_ACTION_SCREENSHOT MENUITEM SEPARATOR @@ -137,17 +137,17 @@ CassetteSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Nouvelle image...", IDM_CASSETTE_IMAGE_NEW + MENUITEM "&Nouvelle image...", IDM_CASSETTE_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "Image &Existante...", IDM_CASSETTE_IMAGE_EXISTING - MENUITEM "Image Existante(&Lecture seule)...", IDM_CASSETTE_IMAGE_EXISTING_WP + MENUITEM "Image &Existante...", IDM_CASSETTE_IMAGE_EXISTING + MENUITEM "Image Existante(&Lecture seule)...", IDM_CASSETTE_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "En®istrer", IDM_CASSETTE_RECORD - MENUITEM "&Jouer", IDM_CASSETTE_PLAY - MENUITEM "&Revenir au debut", IDM_CASSETTE_REWIND - MENUITEM "Aller à la &Fin", IDM_CASSETTE_FAST_FORWARD + MENUITEM "En®istrer", IDM_CASSETTE_RECORD + MENUITEM "&Jouer", IDM_CASSETTE_PLAY + MENUITEM "&Revenir au debut", IDM_CASSETTE_REWIND + MENUITEM "Aller à la &Fin", IDM_CASSETTE_FAST_FORWARD MENUITEM SEPARATOR - MENUITEM "E&jecter", IDM_CASSETTE_EJECT + MENUITEM "E&jecter", IDM_CASSETTE_EJECT END END @@ -155,9 +155,9 @@ CartridgeSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Image...", IDM_CARTRIDGE_IMAGE + MENUITEM "&Image...", IDM_CARTRIDGE_IMAGE MENUITEM SEPARATOR - MENUITEM "E&jecter", IDM_CARTRIDGE_EJECT + MENUITEM "E&jecter", IDM_CARTRIDGE_EJECT END END @@ -165,14 +165,14 @@ FloppySubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Nouvelle image...", IDM_FLOPPY_IMAGE_NEW + MENUITEM "&Nouvelle image...", IDM_FLOPPY_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "Image &Existante...", IDM_FLOPPY_IMAGE_EXISTING - MENUITEM "Image Existante(&Lecture seule)...", IDM_FLOPPY_IMAGE_EXISTING_WP + MENUITEM "Image &Existante...", IDM_FLOPPY_IMAGE_EXISTING + MENUITEM "Image Existante(&Lecture seule)...", IDM_FLOPPY_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "E&xport vers 86F...", IDM_FLOPPY_EXPORT_TO_86F + MENUITEM "E&xport vers 86F...", IDM_FLOPPY_EXPORT_TO_86F MENUITEM SEPARATOR - MENUITEM "E&jecter", IDM_FLOPPY_EJECT + MENUITEM "E&jecter", IDM_FLOPPY_EJECT END END @@ -180,13 +180,13 @@ CdromSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Couper", IDM_CDROM_MUTE + MENUITEM "&Couper", IDM_CDROM_MUTE MENUITEM SEPARATOR - MENUITEM "E&jecter", IDM_CDROM_EMPTY - MENUITEM "&Recharger image précedente", IDM_CDROM_RELOAD + MENUITEM "E&jecter", IDM_CDROM_EMPTY + MENUITEM "&Recharger image précedente", IDM_CDROM_RELOAD MENUITEM SEPARATOR - MENUITEM "&Image...", IDM_CDROM_IMAGE - MENUITEM "&Dossier...", IDM_CDROM_DIR + MENUITEM "&Image...", IDM_CDROM_IMAGE + MENUITEM "&Dossier...", IDM_CDROM_DIR END END @@ -194,13 +194,13 @@ ZIPSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Nouvelle image...", IDM_ZIP_IMAGE_NEW + MENUITEM "&Nouvelle image...", IDM_ZIP_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "Image &Existante...", IDM_ZIP_IMAGE_EXISTING - MENUITEM "Image Existante (&Lecture Seule)...", IDM_ZIP_IMAGE_EXISTING_WP + MENUITEM "Image &Existante...", IDM_ZIP_IMAGE_EXISTING + MENUITEM "Image Existante (&Lecture Seule)...", IDM_ZIP_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "E&jecter", IDM_ZIP_EJECT - MENUITEM "&Recharger image précédente", IDM_ZIP_RELOAD + MENUITEM "E&jecter", IDM_ZIP_EJECT + MENUITEM "&Recharger image précédente", IDM_ZIP_RELOAD END END @@ -208,13 +208,13 @@ MOSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Nouvelle image...", IDM_MO_IMAGE_NEW + MENUITEM "&Nouvelle image...", IDM_MO_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "Image &Existante...", IDM_MO_IMAGE_EXISTING - MENUITEM "Image Existante (&Lecture Seule)...", IDM_MO_IMAGE_EXISTING_WP + MENUITEM "Image &Existante...", IDM_MO_IMAGE_EXISTING + MENUITEM "Image Existante (&Lecture Seule)...", IDM_MO_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "E&jecter", IDM_MO_EJECT - MENUITEM "&Recharger image précédente", IDM_MO_RELOAD + MENUITEM "E&jecter", IDM_MO_EJECT + MENUITEM "&Recharger image précédente", IDM_MO_RELOAD END END @@ -240,150 +240,150 @@ END // Dialog // -#define STR_PREFERENCES "Préférences" -#define STR_SND_GAIN "Gain son" -#define STR_NEW_FLOPPY "Nouvelle image" -#define STR_CONFIG "Réglages" -#define STR_SPECIFY_DIM "Spécifier le détournement de la fenêtre principale" +#define STR_PREFERENCES "Préférences" +#define STR_SND_GAIN "Gain son" +#define STR_NEW_FLOPPY "Nouvelle image" +#define STR_CONFIG "Réglages" +#define STR_SPECIFY_DIM "Spécifier le détournement de la fenêtre principale" -#define STR_OK "OK" -#define STR_CANCEL "Annuler" -#define STR_GLOBAL "Sauvegarder ces paramètres comme valeurs par défaut &globales" -#define STR_DEFAULT "&Défaut" -#define STR_LANGUAGE "Langue:" -#define STR_ICONSET "Ensemble d'icônes:" +#define STR_OK "OK" +#define STR_CANCEL "Annuler" +#define STR_GLOBAL "Sauvegarder ces paramètres comme valeurs par défaut &globales" +#define STR_DEFAULT "&Défaut" +#define STR_LANGUAGE "Langue:" +#define STR_ICONSET "Ensemble d'icônes:" -#define STR_GAIN "Gain" +#define STR_GAIN "Gain" -#define STR_FILE_NAME "Nom fichier:" -#define STR_DISK_SIZE "Taille disque:" -#define STR_RPM_MODE "Mode RPM:" -#define STR_PROGRESS "Progrès:" +#define STR_FILE_NAME "Nom fichier:" +#define STR_DISK_SIZE "Taille disque:" +#define STR_RPM_MODE "Mode RPM:" +#define STR_PROGRESS "Progrès:" -#define STR_WIDTH "Largeur:" -#define STR_HEIGHT "Hauteur:" -#define STR_LOCK_TO_SIZE "Verrouiller à cette taille" +#define STR_WIDTH "Largeur:" +#define STR_HEIGHT "Hauteur:" +#define STR_LOCK_TO_SIZE "Verrouiller à cette taille" -#define STR_MACHINE_TYPE "Type de machine:" -#define STR_MACHINE "Machine:" -#define STR_CONFIGURE "Configurer" -#define STR_CPU_TYPE "Type du processeur:" -#define STR_CPU_SPEED "Vitesse:" -#define STR_FPU "FPU:" -#define STR_WAIT_STATES "États d'attente:" -#define STR_MB "Mo" -#define STR_MEMORY "Mémoire:" -#define STR_TIME_SYNC "Synchronisation du temps" -#define STR_DISABLED "Désactivé" -#define STR_ENABLED_LOCAL "Activé (heure locale)" -#define STR_ENABLED_UTC "Activé (UTC)" -#define STR_DYNAREC "Recompilateur dynamique" +#define STR_MACHINE_TYPE "Type de machine:" +#define STR_MACHINE "Machine:" +#define STR_CONFIGURE "Configurer" +#define STR_CPU_TYPE "Type du processeur:" +#define STR_CPU_SPEED "Vitesse:" +#define STR_FPU "FPU:" +#define STR_WAIT_STATES "États d'attente:" +#define STR_MB "Mo" +#define STR_MEMORY "Mémoire:" +#define STR_TIME_SYNC "Synchronisation du temps" +#define STR_DISABLED "Désactivé" +#define STR_ENABLED_LOCAL "Activé (heure locale)" +#define STR_ENABLED_UTC "Activé (UTC)" +#define STR_DYNAREC "Recompilateur dynamique" -#define STR_VIDEO "Vidéo:" -#define STR_VIDEO_2 "Vidéo 2:" -#define STR_VOODOO "Graphique Voodoo" -#define STR_IBM8514 "Graphique IBM 8514/a" -#define STR_XGA "Graphique XGA" +#define STR_VIDEO "Vidéo:" +#define STR_VIDEO_2 "Vidéo 2:" +#define STR_VOODOO "Graphique Voodoo" +#define STR_IBM8514 "Graphique IBM 8514/a" +#define STR_XGA "Graphique XGA" -#define STR_MOUSE "Souris:" -#define STR_JOYSTICK "Manette de commande:" -#define STR_JOY1 "Manette 1..." -#define STR_JOY2 "Manette 2..." -#define STR_JOY3 "Manette 3..." -#define STR_JOY4 "Manette 4..." +#define STR_MOUSE "Souris:" +#define STR_JOYSTICK "Manette de commande:" +#define STR_JOY1 "Manette 1..." +#define STR_JOY2 "Manette 2..." +#define STR_JOY3 "Manette 3..." +#define STR_JOY4 "Manette 4..." -#define STR_SOUND1 "Carte son 1:" -#define STR_SOUND2 "Carte son 2:" -#define STR_SOUND3 "Carte son 3:" -#define STR_SOUND4 "Carte son 4:" -#define STR_MIDI_OUT "Sortie MIDI:" -#define STR_MIDI_IN "Entrée MIDI:" -#define STR_MPU401 "MPU-401 autonome" -#define STR_FLOAT "Utiliser le son FLOAT32" -#define STR_FM_DRIVER "Pilote de synthétiseur FM" -#define STR_FM_DRV_NUKED "Nuked (plus précis)" -#define STR_FM_DRV_YMFM "YMFM (plus rapide)" +#define STR_SOUND1 "Carte son 1:" +#define STR_SOUND2 "Carte son 2:" +#define STR_SOUND3 "Carte son 3:" +#define STR_SOUND4 "Carte son 4:" +#define STR_MIDI_OUT "Sortie MIDI:" +#define STR_MIDI_IN "Entrée MIDI:" +#define STR_MPU401 "MPU-401 autonome" +#define STR_FLOAT "Utiliser le son FLOAT32" +#define STR_FM_DRIVER "Pilote de synthétiseur FM" +#define STR_FM_DRV_NUKED "Nuked (plus précis)" +#define STR_FM_DRV_YMFM "YMFM (plus rapide)" -#define STR_NET_TYPE "Type de réseau:" -#define STR_PCAP "Dispositif PCap:" -#define STR_NET "Adaptateur de réseau:" -#define STR_NET1 "Network card 1:" -#define STR_NET2 "Network card 2:" -#define STR_NET3 "Network card 3:" -#define STR_NET4 "Network card 4:" +#define STR_NET_TYPE "Type de réseau:" +#define STR_PCAP "Dispositif PCap:" +#define STR_NET "Adaptateur de réseau:" +#define STR_NET1 "Network card 1:" +#define STR_NET2 "Network card 2:" +#define STR_NET3 "Network card 3:" +#define STR_NET4 "Network card 4:" -#define STR_COM1 "Dispositif COM1:" -#define STR_COM2 "Dispositif COM2:" -#define STR_COM3 "Dispositif COM3:" -#define STR_COM4 "Dispositif COM4:" -#define STR_LPT1 "Dispositif LPT1:" -#define STR_LPT2 "Dispositif LPT2:" -#define STR_LPT3 "Dispositif LPT3:" -#define STR_LPT4 "Dispositif LPT4:" -#define STR_SERIAL1 "Port série 1" -#define STR_SERIAL2 "Port série 2" -#define STR_SERIAL3 "Port série 3" -#define STR_SERIAL4 "Port série 4" -#define STR_PARALLEL1 "Port parallèle 1" -#define STR_PARALLEL2 "Port parallèle 2" -#define STR_PARALLEL3 "Port parallèle 3" -#define STR_PARALLEL4 "Port parallèle 4" -#define STR_SERIAL_PASS1 "Serial port passthrough 1" -#define STR_SERIAL_PASS2 "Serial port passthrough 2" -#define STR_SERIAL_PASS3 "Serial port passthrough 3" -#define STR_SERIAL_PASS4 "Serial port passthrough 4" +#define STR_COM1 "Dispositif COM1:" +#define STR_COM2 "Dispositif COM2:" +#define STR_COM3 "Dispositif COM3:" +#define STR_COM4 "Dispositif COM4:" +#define STR_LPT1 "Dispositif LPT1:" +#define STR_LPT2 "Dispositif LPT2:" +#define STR_LPT3 "Dispositif LPT3:" +#define STR_LPT4 "Dispositif LPT4:" +#define STR_SERIAL1 "Port série 1" +#define STR_SERIAL2 "Port série 2" +#define STR_SERIAL3 "Port série 3" +#define STR_SERIAL4 "Port série 4" +#define STR_PARALLEL1 "Port parallèle 1" +#define STR_PARALLEL2 "Port parallèle 2" +#define STR_PARALLEL3 "Port parallèle 3" +#define STR_PARALLEL4 "Port parallèle 4" +#define STR_SERIAL_PASS1 "Serial port passthrough 1" +#define STR_SERIAL_PASS2 "Serial port passthrough 2" +#define STR_SERIAL_PASS3 "Serial port passthrough 3" +#define STR_SERIAL_PASS4 "Serial port passthrough 4" -#define STR_HDC "Contrôleur HD:" -#define STR_FDC "Contrôleur FD:" -#define STR_IDE_TER "Contrôleur IDE tertiaire" -#define STR_IDE_QUA "Contrôleur IDE quaternair" -#define STR_SCSI "SCSI" -#define STR_SCSI_1 "Contrôleur 1:" -#define STR_SCSI_2 "Contrôleur 2:" -#define STR_SCSI_3 "Contrôleur 3:" -#define STR_SCSI_4 "Contrôleur 4:" -#define STR_CASSETTE "Cassette" +#define STR_HDC "Contrôleur HD:" +#define STR_FDC "Contrôleur FD:" +#define STR_IDE_TER "Contrôleur IDE tertiaire" +#define STR_IDE_QUA "Contrôleur IDE quaternair" +#define STR_SCSI "SCSI" +#define STR_SCSI_1 "Contrôleur 1:" +#define STR_SCSI_2 "Contrôleur 2:" +#define STR_SCSI_3 "Contrôleur 3:" +#define STR_SCSI_4 "Contrôleur 4:" +#define STR_CASSETTE "Cassette" -#define STR_HDD "Disques durs:" -#define STR_NEW "&Nouveau..." -#define STR_EXISTING "&Existant..." -#define STR_REMOVE "&Supprimer" -#define STR_BUS "Bus:" -#define STR_CHANNEL "Canal:" -#define STR_ID "ID:" -#define STR_SPEED "Speed:" +#define STR_HDD "Disques durs:" +#define STR_NEW "&Nouveau..." +#define STR_EXISTING "&Existant..." +#define STR_REMOVE "&Supprimer" +#define STR_BUS "Bus:" +#define STR_CHANNEL "Canal:" +#define STR_ID "ID:" +#define STR_SPEED "Speed:" -#define STR_SPECIFY "&Spécifier..." -#define STR_SECTORS "Secteurs:" -#define STR_HEADS "Têtes:" -#define STR_CYLS "Cylindres:" -#define STR_SIZE_MB "Taille (Mo):" -#define STR_TYPE "Type:" -#define STR_IMG_FORMAT "Format Image:" -#define STR_BLOCK_SIZE "Taille du bloc:" +#define STR_SPECIFY "&Spécifier..." +#define STR_SECTORS "Secteurs:" +#define STR_HEADS "Têtes:" +#define STR_CYLS "Cylindres:" +#define STR_SIZE_MB "Taille (Mo):" +#define STR_TYPE "Type:" +#define STR_IMG_FORMAT "Format Image:" +#define STR_BLOCK_SIZE "Taille du bloc:" -#define STR_FLOPPY_DRIVES "Lecteurs de disquettes:" -#define STR_TURBO "Turbo" -#define STR_CHECKBPB "Vérifier BPB" -#define STR_CDROM_DRIVES "Lecterus CD-ROM:" -#define STR_CD_SPEED "Vitesse:" -#define STR_EARLY "Lecteur plus tôt" +#define STR_FLOPPY_DRIVES "Lecteurs de disquettes:" +#define STR_TURBO "Turbo" +#define STR_CHECKBPB "Vérifier BPB" +#define STR_CDROM_DRIVES "Lecterus CD-ROM:" +#define STR_CD_SPEED "Vitesse:" +#define STR_EARLY "Lecteur plus tôt" -#define STR_MO_DRIVES "Lecteurs magnéto-optiques:" -#define STR_ZIP_DRIVES "Lecteurs ZIP:" -#define STR_250 "ZIP 250" +#define STR_MO_DRIVES "Lecteurs magnéto-optiques:" +#define STR_ZIP_DRIVES "Lecteurs ZIP:" +#define STR_250 "ZIP 250" -#define STR_ISARTC "Horloge temps réel ISA:" -#define STR_ISAMEM "Expansion de la mémoire ISA" -#define STR_ISAMEM_1 "Carte 1:" -#define STR_ISAMEM_2 "Carte 2:" -#define STR_ISAMEM_3 "Carte 3:" -#define STR_ISAMEM_4 "Carte 4:" -#define STR_BUGGER "Dispositif ISABugger" -#define STR_POSTCARD "Carte POST" +#define STR_ISARTC "Horloge temps réel ISA:" +#define STR_ISAMEM "Expansion de la mémoire ISA" +#define STR_ISAMEM_1 "Carte 1:" +#define STR_ISAMEM_2 "Carte 2:" +#define STR_ISAMEM_3 "Carte 3:" +#define STR_ISAMEM_4 "Carte 4:" +#define STR_BUGGER "Dispositif ISABugger" +#define STR_POSTCARD "Carte POST" -#define FONT_SIZE 9 -#define FONT_NAME "Segoe UI" +#define FONT_SIZE 9 +#define FONT_NAME "Segoe UI" #include "dialogs.rc" @@ -394,149 +394,149 @@ END STRINGTABLE DISCARDABLE BEGIN - 2048 "86Box" - IDS_2049 "Erreur" - IDS_2050 "Erreur fatale" - IDS_2051 " - PAUSED" - IDS_2052 "Appuyez sur Ctrl+Alt+PgDn pour revenir au mode fenêtré." - IDS_2053 "Vitesse" - IDS_2054 "ZIP %03i %i (%s): %ls" - IDS_2055 "Images ZIP (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" - IDS_2056 "86Box n'a pas pu trouver d'images ROM utilisables.\n\nS'il vous plait, téléchargez un ensemble ROM et extrayez-le dans le répertoire ""roms""." - IDS_2057 "(vide)" - IDS_2058 "Images ZIP (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0Tous les fichiers (*.*)\0*.*\0" - IDS_2059 "Turbo" - IDS_2060 "Activé" - IDS_2061 "Désactivé" - IDS_2062 "Tous les images (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0Images basiques du secteur (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Images de la surface (*.86F)\0*.86F\0" - IDS_2063 "La machine ""%hs"" n'est pas disponible en raison de l'absence de ROMs dans le répertoire roms/machines. Basculer vers une machine disponible." + 2048 "86Box" + IDS_2049 "Erreur" + IDS_2050 "Erreur fatale" + IDS_2051 " - PAUSED" + IDS_2052 "Appuyez sur Ctrl+Alt+PgDn pour revenir au mode fenêtré." + IDS_2053 "Vitesse" + IDS_2054 "ZIP %03i %i (%s): %ls" + IDS_2055 "Images ZIP (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" + IDS_2056 "86Box n'a pas pu trouver d'images ROM utilisables.\n\nS'il vous plait, téléchargez un ensemble ROM et extrayez-le dans le répertoire ""roms""." + IDS_2057 "(vide)" + IDS_2058 "Images ZIP (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0Tous les fichiers (*.*)\0*.*\0" + IDS_2059 "Turbo" + IDS_2060 "Activé" + IDS_2061 "Désactivé" + IDS_2062 "Tous les images (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0Images basiques du secteur (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Images de la surface (*.86F)\0*.86F\0" + IDS_2063 "La machine ""%hs"" n'est pas disponible en raison de l'absence de ROMs dans le répertoire roms/machines. Basculer vers une machine disponible." END STRINGTABLE DISCARDABLE BEGIN - IDS_2064 "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." - IDS_2065 "Machine" - IDS_2066 "Affichage" - IDS_2067 "Dispositifs d'entrée" - IDS_2068 "Son" - IDS_2069 "Réseau" - IDS_2070 "Ports (COM et LPT)" - IDS_2071 "Contrôleurs de stockage" - IDS_2072 "Disques durs" - IDS_2073 "Lecteurs de disquette et CD-ROM" - IDS_2074 "Autres dispositifs amovibles" - IDS_2075 "Autres périfériques" - IDS_2076 "Images de surface (*.86F)\0*.86F\0" - IDS_2077 "Cliquer pour capturer la souris" - IDS_2078 "Appuyer sur F8+F12 pour libérer la souris" - IDS_2079 "Appuyer sur F8+F12 ou le bouton central pour libérer la souris" + IDS_2064 "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." + IDS_2065 "Machine" + IDS_2066 "Affichage" + IDS_2067 "Dispositifs d'entrée" + IDS_2068 "Son" + IDS_2069 "Réseau" + IDS_2070 "Ports (COM et LPT)" + IDS_2071 "Contrôleurs de stockage" + IDS_2072 "Disques durs" + IDS_2073 "Lecteurs de disquette et CD-ROM" + IDS_2074 "Autres dispositifs amovibles" + IDS_2075 "Autres périfériques" + IDS_2076 "Images de surface (*.86F)\0*.86F\0" + IDS_2077 "Cliquer pour capturer la souris" + IDS_2078 "Appuyer sur F8+F12 pour libérer la souris" + IDS_2079 "Appuyer sur F8+F12 ou le bouton central pour libérer la souris" END STRINGTABLE DISCARDABLE BEGIN - IDS_2080 "Impossible d'initialiser FluidSynth" - IDS_2081 "Bus" - IDS_2082 "File" - IDS_2083 "C" - IDS_2084 "T" - IDS_2085 "S" - IDS_2086 "Mo" + IDS_2080 "Impossible d'initialiser FluidSynth" + IDS_2081 "Bus" + IDS_2082 "File" + IDS_2083 "C" + IDS_2084 "T" + IDS_2085 "S" + IDS_2086 "Mo" IDS_2087 "Speed" - IDS_2088 "Vérifier BPB" - IDS_2089 "Ko" - IDS_2090 "Impossible d'initialiser le moteur de rendu vidéo." - IDS_2091 "Défaut" - IDS_2092 "%i état(s) d'attente" - IDS_2093 "Type" - IDS_2094 "Impossible d'initialiser PCap" - IDS_2095 "Aucun dispositif PCap trouvé" - IDS_2096 "Dispositif PCap non valide" - IDS_2097 "Manette(s) standard avec 2 boutons" - IDS_2098 "Manette standard avec 4 boutons" - IDS_2099 "Manette standard avec 6 boutons" - IDS_2100 "Manette standard avec 6 boutons" - IDS_2101 "CH Flightstick Pro" - IDS_2102 "Microsoft SideWinder Pad" - IDS_2103 "Système de contrôle de vol Thrustmaster" - IDS_2104 "Aucun" - IDS_2105 "Impossible de charger les accélérateurs de clavier." - IDS_2106 "Impossible de charger l'entrée raw." - IDS_2107 "%u" - IDS_2108 "%u Mo (CTS: %i, %i, %i)" - IDS_2109 "Disquette %i (%s): %ls" - IDS_2110 "Toutes les images (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Images du secteur avancés (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Images du secteur basiques (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Images du flux (*.FDI)\0*.FDI\0Images de surface (*.86F;*.MFM)\0*.86F;*.MFM\0Tous les fichiers (*.*)\0*.*\0" - IDS_2111 "Impossible d'initialiser FreeType" - IDS_2112 "Impossible d'initialiser SDL, SDL2.dll est nécessaire" - IDS_2113 "Etes-vous sûr de vouloir réinitialiser la machine émulée ?" - IDS_2114 "Etes-vous sûr de vouloir quitter 86Box?" - IDS_2115 "Impossible d'initialiser Ghostscript" - IDS_2116 "Magnéto-optique %i (%ls): %ls" - IDS_2117 "Images magnéto-optiques (*.IM?;*.MDI)\0*.IM?;*.MDI\0Tous les fichiers (*.*)\0*.*\0" - IDS_2118 "Bienvenue dans 86Box !" - IDS_2119 "Côntrolleur interne" - IDS_2120 "Sortir" - IDS_2121 "Pas de ROMs trouvées" - IDS_2122 "Voulez-vous sauvegarder les paramètres ?" - IDS_2123 "Cela entraînera la réinitialisation complète de la machine émulée." - IDS_2124 "Sauvegarder" - IDS_2125 "À propos de 86Box" - IDS_2126 "86Box v" EMU_VERSION + IDS_2088 "Vérifier BPB" + IDS_2089 "Ko" + IDS_2090 "Impossible d'initialiser le moteur de rendu vidéo." + IDS_2091 "Défaut" + IDS_2092 "%i état(s) d'attente" + IDS_2093 "Type" + IDS_2094 "Impossible d'initialiser PCap" + IDS_2095 "Aucun dispositif PCap trouvé" + IDS_2096 "Dispositif PCap non valide" + IDS_2097 "Manette(s) standard avec 2 boutons" + IDS_2098 "Manette standard avec 4 boutons" + IDS_2099 "Manette standard avec 6 boutons" + IDS_2100 "Manette standard avec 6 boutons" + IDS_2101 "CH Flightstick Pro" + IDS_2102 "Microsoft SideWinder Pad" + IDS_2103 "Système de contrôle de vol Thrustmaster" + IDS_2104 "Aucun" + IDS_2105 "Impossible de charger les accélérateurs de clavier." + IDS_2106 "Impossible de charger l'entrée raw." + IDS_2107 "%u" + IDS_2108 "%u Mo (CTS: %i, %i, %i)" + IDS_2109 "Disquette %i (%s): %ls" + IDS_2110 "Toutes les images (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Images du secteur avancés (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Images du secteur basiques (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Images du flux (*.FDI)\0*.FDI\0Images de surface (*.86F;*.MFM)\0*.86F;*.MFM\0Tous les fichiers (*.*)\0*.*\0" + IDS_2111 "Impossible d'initialiser FreeType" + IDS_2112 "Impossible d'initialiser SDL, SDL2.dll est nécessaire" + IDS_2113 "Etes-vous sûr de vouloir réinitialiser la machine émulée ?" + IDS_2114 "Etes-vous sûr de vouloir quitter 86Box?" + IDS_2115 "Impossible d'initialiser Ghostscript" + IDS_2116 "Magnéto-optique %i (%ls): %ls" + IDS_2117 "Images magnéto-optiques (*.IM?;*.MDI)\0*.IM?;*.MDI\0Tous les fichiers (*.*)\0*.*\0" + IDS_2118 "Bienvenue dans 86Box !" + IDS_2119 "Côntrolleur interne" + IDS_2120 "Sortir" + IDS_2121 "Pas de ROMs trouvées" + IDS_2122 "Voulez-vous sauvegarder les paramètres ?" + IDS_2123 "Cela entraînera la réinitialisation complète de la machine émulée." + IDS_2124 "Sauvegarder" + IDS_2125 "À propos de 86Box" + IDS_2126 "86Box v" EMU_VERSION - IDS_2127 "Un émulateur de vieux ordinateurs\n\nAuteurs: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, Tiseno100, reenigne, 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." - IDS_2128 "OK" - IDS_2129 "Matériel non disponible" + IDS_2127 "Un émulateur de vieux ordinateurs\n\nAuteurs: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, Tiseno100, reenigne, 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." + IDS_2128 "OK" + IDS_2129 "Matériel non disponible" #ifdef _WIN32 #define LIB_NAME_PCAP "WinPcap" #else #define LIB_NAME_PCAP "libpcap" #endif - IDS_2130 "Assurez-vous que " LIB_NAME_PCAP " est installé et que vou utilisez une connexion réseau compatible avec " LIB_NAME_PCAP "." - IDS_2131 "Configuration non valide" + IDS_2130 "Assurez-vous que " LIB_NAME_PCAP " est installé et que vou utilisez une connexion réseau compatible avec " LIB_NAME_PCAP "." + IDS_2131 "Configuration non valide" #ifdef _WIN32 #define LIB_NAME_FREETYPE "freetype.dll" #else #define LIB_NAME_FREETYPE "libfreetype" #endif - IDS_2132 LIB_NAME_FREETYPE " est nécessaire pour l'émulation de l'imprimante ESC/P." + IDS_2132 LIB_NAME_FREETYPE " est nécessaire pour l'émulation de l'imprimante ESC/P." #ifdef _WIN32 #define LIB_NAME_GS "gsdll32.dll" #else #define LIB_NAME_GS "libgs" #endif - IDS_2133 LIB_NAME_GS " 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)." + IDS_2133 LIB_NAME_GS " 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)." #ifdef _WIN32 #define LIB_NAME_FLUIDSYNTH "libfluidsynth.dll" #else #define LIB_NAME_FLUIDSYNTH "libfluidsynth" #endif - IDS_2134 LIB_NAME_FLUIDSYNTH " est nécessaire pour la sortie MIDI FluidSynth." - IDS_2135 "Entrer en mode plein écran" - IDS_2136 "Ne pas montrer ce message à nouveau" - IDS_2137 "Ne pas sortir" - IDS_2138 "Réinitialiser" - IDS_2139 "Ne pas réinitialiser" - IDS_2140 "Images magnéto-optiques (*.IM?;*.MDI)\0*.IM?;*.MDI\0Tous les fichiers (*.*)\0*.*\0" - IDS_2141 "Images CD-ROM (*.ISO;*.CUE)\0*.ISO;*.CUE\0Tous les fichiers (*.*)\0*.*\0" - IDS_2142 "Configuration du dispositif %hs" + IDS_2134 LIB_NAME_FLUIDSYNTH " est nécessaire pour la sortie MIDI FluidSynth." + IDS_2135 "Entrer en mode plein écran" + IDS_2136 "Ne pas montrer ce message à nouveau" + IDS_2137 "Ne pas sortir" + IDS_2138 "Réinitialiser" + IDS_2139 "Ne pas réinitialiser" + IDS_2140 "Images magnéto-optiques (*.IM?;*.MDI)\0*.IM?;*.MDI\0Tous les fichiers (*.*)\0*.*\0" + IDS_2141 "Images CD-ROM (*.ISO;*.CUE)\0*.ISO;*.CUE\0Tous les fichiers (*.*)\0*.*\0" + IDS_2142 "Configuration du dispositif %hs" IDS_2143 "Moniteur en mode veille" - IDS_2144 "Shaders OpenGL (*.GLSL)\0*.GLSL\0Tous les fichiers (*.*)\0*.*\0" - IDS_2145 "Options OpenGL" - IDS_2146 "Vous chargez une configuration non prise en charge" - IDS_2147 "La filtrage du type du processeur sur la base de la machine sélectionné est désactivé pur cette machine émulée.\n\nCela permet de sélectionner une processeur que est sinon incompatible avec la machine sélectionné. Cependant, il pourrait y avoir des incompatibilités avec le BIOS de la machine ou autres logiciels.\n\nL'activatione de cette configuration non est officiellement prise en charge et tout rapport de bogue peut être fermé comme étant invalide." - IDS_2148 "Continuer" - IDS_2149 "Cassette: %s" - IDS_2150 "Images cassette (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Tous les fichiers (*.*)\0*.*\0" - IDS_2151 "Cartouche %i: %ls" - IDS_2152 "Images cartouche (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Tous les fichiers (*.*)\0*.*\0" - IDS_2153 "Error initializing renderer" - IDS_2154 "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." - IDS_2155 "Resume execution" - IDS_2156 "Pause execution" - IDS_2157 "Press Ctrl+Alt+Del" - IDS_2158 "Press Ctrl+Alt+Esc" - IDS_2159 "Hard reset" - IDS_2160 "ACPI shutdown" - IDS_2161 "Settings" + IDS_2144 "Shaders OpenGL (*.GLSL)\0*.GLSL\0Tous les fichiers (*.*)\0*.*\0" + IDS_2145 "Options OpenGL" + IDS_2146 "Vous chargez une configuration non prise en charge" + IDS_2147 "La filtrage du type du processeur sur la base de la machine sélectionné est désactivé pur cette machine émulée.\n\nCela permet de sélectionner une processeur que est sinon incompatible avec la machine sélectionné. Cependant, il pourrait y avoir des incompatibilités avec le BIOS de la machine ou autres logiciels.\n\nL'activatione de cette configuration non est officiellement prise en charge et tout rapport de bogue peut être fermé comme étant invalide." + IDS_2148 "Continuer" + IDS_2149 "Cassette: %s" + IDS_2150 "Images cassette (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Tous les fichiers (*.*)\0*.*\0" + IDS_2151 "Cartouche %i: %ls" + IDS_2152 "Images cartouche (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Tous les fichiers (*.*)\0*.*\0" + IDS_2153 "Error initializing renderer" + IDS_2154 "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." + IDS_2155 "Resume execution" + IDS_2156 "Pause execution" + IDS_2157 "Press Ctrl+Alt+Del" + IDS_2158 "Press Ctrl+Alt+Esc" + IDS_2159 "Hard reset" + IDS_2160 "ACPI shutdown" + IDS_2161 "Settings" IDS_2162 "Lecteur plus tôt" IDS_2163 "No Dynarec" IDS_2164 "Old Dynarec" @@ -547,45 +547,45 @@ END STRINGTABLE DISCARDABLE BEGIN IDS_4096 "Disque dur (%s)" - IDS_4097 "%01i:%01i" - IDS_4098 "%01i" - IDS_4099 "Les lecteurs de CD-ROM MFM/RLL ou ESDI n'ont jamais existé" - IDS_4100 "Personnalisé..." - IDS_4101 "Personnalisé (grand)..." - IDS_4102 "Ajouter un nouveau disque dur" - IDS_4103 "Ajouter un disque dur existant" - IDS_4104 "Les images de disque HDI ne peuvent pas avoir une taille supériure à Go." - IDS_4105 "Les images de disque ne peuvent pas avoir un taille supérieure à 127 Go." - IDS_4106 "Images de dique dur (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0Tous les fichiers (*.*)\0*.*\0" - IDS_4107 "Impossible de lire le fichier" - IDS_4108 "Impossible d'écrire le fichier" - IDS_4109 "Les images HDI ou HDX avec une taille de secteur différente de 512 non sont pas prises en charge." - IDS_4110 "USB n'est pas encore pris en charge." - IDS_4111 "Le fichier de l'image disque existe déjà." - IDS_4112 "Veuillez spécifier un nom de fichier valide." - IDS_4113 "Image de disque créée" - IDS_4114 "Assurez-vous que le fichier existe et est lisible." - IDS_4115 "Assurez-vous que le fichier en cours d'enregistrement se trouve dans un répertoire accessible en écriture." - IDS_4116 "Image disque trop grande" - IDS_4117 "N'oubliez pas de partitionner et de formater le nouveau disque créé." - IDS_4118 "Le fichier sélectionné sera écrasé. Etes-vous sûr de vouloir l'utiliser?" - IDS_4119 "Image disque non prise en charge" - IDS_4120 "Écraser" - IDS_4121 "Ne pas écraser" - IDS_4122 "Image brute (.img)" - IDS_4123 "Image HDI (.hdi)" - IDS_4124 "Image HDX (.hdx)" - IDS_4125 "VHD à taille fixe (.vhd)" - IDS_4126 "VHD à taille dynamique (.vhd)" - IDS_4127 "VHD à différenciation (.vhd)" - IDS_4128 "Blocs grands (2 Mo)" - IDS_4129 "Blocs petits (512 Ko)" - IDS_4130 "Fichiers VHD (*.VHD)\0*.VHD\0Tous les fichiers (*.*)\0*.*\0" - IDS_4131 "Sélectionnez le VHD parent" - IDS_4132 "Il est possible que l'image parente a été modifié après la création de l'image à différenciation.\n\nIl est même possible que les fichiers de l'mage ont été déplacés ou copiés ou il existe un bogue dans le programme que a créé ce disque.\n\nVoulez-vous réparer l'horodatage?" - IDS_4133 "Les horodatages des disques parent et enfant ne correspondent pas" - IDS_4134 "Impossible de réparer l'horodatage du VHD." - IDS_4135 "%01i:%02i" + IDS_4097 "%01i:%01i" + IDS_4098 "%01i" + IDS_4099 "Les lecteurs de CD-ROM MFM/RLL ou ESDI n'ont jamais existé" + IDS_4100 "Personnalisé..." + IDS_4101 "Personnalisé (grand)..." + IDS_4102 "Ajouter un nouveau disque dur" + IDS_4103 "Ajouter un disque dur existant" + IDS_4104 "Les images de disque HDI ne peuvent pas avoir une taille supériure à Go." + IDS_4105 "Les images de disque ne peuvent pas avoir un taille supérieure à 127 Go." + IDS_4106 "Images de dique dur (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0Tous les fichiers (*.*)\0*.*\0" + IDS_4107 "Impossible de lire le fichier" + IDS_4108 "Impossible d'écrire le fichier" + IDS_4109 "Les images HDI ou HDX avec une taille de secteur différente de 512 non sont pas prises en charge." + IDS_4110 "USB n'est pas encore pris en charge." + IDS_4111 "Le fichier de l'image disque existe déjà." + IDS_4112 "Veuillez spécifier un nom de fichier valide." + IDS_4113 "Image de disque créée" + IDS_4114 "Assurez-vous que le fichier existe et est lisible." + IDS_4115 "Assurez-vous que le fichier en cours d'enregistrement se trouve dans un répertoire accessible en écriture." + IDS_4116 "Image disque trop grande" + IDS_4117 "N'oubliez pas de partitionner et de formater le nouveau disque créé." + IDS_4118 "Le fichier sélectionné sera écrasé. Etes-vous sûr de vouloir l'utiliser?" + IDS_4119 "Image disque non prise en charge" + IDS_4120 "Écraser" + IDS_4121 "Ne pas écraser" + IDS_4122 "Image brute (.img)" + IDS_4123 "Image HDI (.hdi)" + IDS_4124 "Image HDX (.hdx)" + IDS_4125 "VHD à taille fixe (.vhd)" + IDS_4126 "VHD à taille dynamique (.vhd)" + IDS_4127 "VHD à différenciation (.vhd)" + IDS_4128 "Blocs grands (2 Mo)" + IDS_4129 "Blocs petits (512 Ko)" + IDS_4130 "Fichiers VHD (*.VHD)\0*.VHD\0Tous les fichiers (*.*)\0*.*\0" + IDS_4131 "Sélectionnez le VHD parent" + IDS_4132 "Il est possible que l'image parente a été modifié après la création de l'image à différenciation.\n\nIl est même possible que les fichiers de l'mage ont été déplacés ou copiés ou il existe un bogue dans le programme que a créé ce disque.\n\nVoulez-vous réparer l'horodatage?" + IDS_4133 "Les horodatages des disques parent et enfant ne correspondent pas" + IDS_4134 "Impossible de réparer l'horodatage du VHD." + IDS_4135 "%01i:%02i" IDS_4352 "MFM/RLL" IDS_4353 "XTA" @@ -594,56 +594,56 @@ BEGIN IDS_4356 "ATAPI" IDS_4357 "SCSI" - IDS_4608 "MFM/RLL (%01i:%01i)" - IDS_4609 "XTA (%01i:%01i)" - IDS_4610 "ESDI (%01i:%01i)" - IDS_4611 "IDE (%01i:%01i)" - IDS_4612 "ATAPI (%01i:%01i)" - IDS_4613 "SCSI (%01i:%02i)" + IDS_4608 "MFM/RLL (%01i:%01i)" + IDS_4609 "XTA (%01i:%01i)" + IDS_4610 "ESDI (%01i:%01i)" + IDS_4611 "IDE (%01i:%01i)" + IDS_4612 "ATAPI (%01i:%01i)" + IDS_4613 "SCSI (%01i:%02i)" - IDS_5120 "CD-ROM %i (%s): %s" + IDS_5120 "CD-ROM %i (%s): %s" - IDS_5376 "Désactivé" - IDS_5381 "ATAPI" + IDS_5376 "Désactivé" + IDS_5381 "ATAPI" IDS_5382 "SCSI" - IDS_5632 "Désactivé" - IDS_5637 "ATAPI (%01i:%01i)" + IDS_5632 "Désactivé" + IDS_5637 "ATAPI (%01i:%01i)" IDS_5638 "SCSI (%01i:%02i)" - IDS_5888 "160 Ko" - IDS_5889 "180 Ko" - IDS_5890 "320 Ko" - IDS_5891 "360 Ko" - IDS_5892 "640 Ko" - IDS_5893 "720 Ko" - IDS_5894 "1.2 Mo" - IDS_5895 "1.25 Mo" - IDS_5896 "1.44 Mo" - IDS_5897 "DMF (cluster 1024)" - IDS_5898 "DMF (cluster 2048)" - IDS_5899 "2.88 Mo" - IDS_5900 "ZIP 100" - IDS_5901 "ZIP 250" - IDS_5902 "3.5"" 128 Mo (ISO 10090)" - IDS_5903 "3.5"" 230 Mo (ISO 13963)" - IDS_5904 "3.5"" 540 Mo (ISO 15498)" - IDS_5905 "3.5"" 640 Mo (ISO 15498)" - IDS_5906 "3.5"" 1.3 Go (GigaMO)" - IDS_5907 "3.5"" 2.3 Go (GigaMO 2)" - IDS_5908 "5.25"" 600 Mo" - IDS_5909 "5.25"" 650 Mo" - IDS_5910 "5.25"" 1 Go" - IDS_5911 "5.25"" 1.3 Go" + IDS_5888 "160 Ko" + IDS_5889 "180 Ko" + IDS_5890 "320 Ko" + IDS_5891 "360 Ko" + IDS_5892 "640 Ko" + IDS_5893 "720 Ko" + IDS_5894 "1.2 Mo" + IDS_5895 "1.25 Mo" + IDS_5896 "1.44 Mo" + IDS_5897 "DMF (cluster 1024)" + IDS_5898 "DMF (cluster 2048)" + IDS_5899 "2.88 Mo" + IDS_5900 "ZIP 100" + IDS_5901 "ZIP 250" + IDS_5902 "3.5"" 128 Mo (ISO 10090)" + IDS_5903 "3.5"" 230 Mo (ISO 13963)" + IDS_5904 "3.5"" 540 Mo (ISO 15498)" + IDS_5905 "3.5"" 640 Mo (ISO 15498)" + IDS_5906 "3.5"" 1.3 Go (GigaMO)" + IDS_5907 "3.5"" 2.3 Go (GigaMO 2)" + IDS_5908 "5.25"" 600 Mo" + IDS_5909 "5.25"" 650 Mo" + IDS_5910 "5.25"" 1 Go" + IDS_5911 "5.25"" 1.3 Go" - IDS_6144 "RPM précis" - IDS_6145 "Précision RPM de moins 1%" - IDS_6146 "Précision RPM de moins 1.5%" - IDS_6147 "Précision RPM de moins 2%" + IDS_6144 "RPM précis" + IDS_6145 "Précision RPM de moins 1%" + IDS_6146 "Précision RPM de moins 1.5%" + IDS_6147 "Précision RPM de moins 2%" - IDS_7168 "(Défaut du système)" + IDS_7168 "(Défaut du système)" END -#define IDS_LANG_ENUS IDS_7168 +#define IDS_LANG_ENUS IDS_7168 // French (F.R.) resources ///////////////////////////////////////////////////////////////////////////// diff --git a/src/win/languages/hr-HR.rc b/src/win/languages/hr-HR.rc index 43a90aa8a..487894acd 100644 --- a/src/win/languages/hr-HR.rc +++ b/src/win/languages/hr-HR.rc @@ -17,13 +17,13 @@ MainMenu MENU DISCARDABLE BEGIN POPUP "&Radnje" BEGIN - MENUITEM "&Tipkovnica zahtijeva hvatanje miša", IDM_ACTION_KBD_REQ_CAPTURE - MENUITEM "&Desni CTRL je lijevi ALT", IDM_ACTION_RCTRL_IS_LALT + MENUITEM "&Tipkovnica zahtijeva hvatanje miša", IDM_ACTION_KBD_REQ_CAPTURE + MENUITEM "&Desni CTRL je lijevi ALT", IDM_ACTION_RCTRL_IS_LALT MENUITEM SEPARATOR MENUITEM "&Ponovno pokretanje...", IDM_ACTION_HRESET MENUITEM "&Ctrl+Alt+Del\tCtrl+F12", IDM_ACTION_RESET_CAD MENUITEM SEPARATOR - MENUITEM "Ctrl+Alt+&Esc", IDM_ACTION_CTRL_ALT_ESC + MENUITEM "Ctrl+Alt+&Esc", IDM_ACTION_CTRL_ALT_ESC MENUITEM SEPARATOR MENUITEM "&Pauza", IDM_ACTION_PAUSE MENUITEM SEPARATOR @@ -31,8 +31,8 @@ BEGIN END POPUP "&Pogled" BEGIN - MENUITEM "&Sakrij statusni redak", IDM_VID_HIDE_STATUS_BAR - MENUITEM "&Sakrij alatni redak", IDM_VID_HIDE_TOOLBAR + MENUITEM "&Sakrij statusni redak", IDM_VID_HIDE_STATUS_BAR + MENUITEM "&Sakrij alatni redak", IDM_VID_HIDE_TOOLBAR MENUITEM SEPARATOR MENUITEM "&Show non-primary monitors", IDM_VID_MONITORS MENUITEM "&Prozor s promjenjivim veličinama", IDM_VID_RESIZE @@ -101,11 +101,11 @@ BEGIN MENUITEM "&Višak slike CGA/PCjr/Tandy/EGA/(S)VGA", IDM_VID_OVERSCAN MENUITEM "&Promjeni kontrast za crno-bijeli zaslon", IDM_VID_CGACON END - MENUITEM "&Mediji", IDM_MEDIA + MENUITEM "&Mediji", IDM_MEDIA POPUP "&Alati" BEGIN MENUITEM "&Opcije...", IDM_CONFIG - MENUITEM "&Ažuriraj ikone statusnog redka", IDM_UPDATE_ICONS + MENUITEM "&Ažuriraj ikone statusnog redka", IDM_UPDATE_ICONS MENUITEM SEPARATOR MENUITEM "Napravi &snimku zaslona\tCtrl+F11", IDM_ACTION_SCREENSHOT MENUITEM SEPARATOR @@ -137,17 +137,17 @@ CassetteSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Nova slika...", IDM_CASSETTE_IMAGE_NEW + MENUITEM "&Nova slika...", IDM_CASSETTE_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&Postojeća slika...", IDM_CASSETTE_IMAGE_EXISTING - MENUITEM "Postojeća slika (&zaštićena od pisanja)...", IDM_CASSETTE_IMAGE_EXISTING_WP + MENUITEM "&Postojeća slika...", IDM_CASSETTE_IMAGE_EXISTING + MENUITEM "Postojeća slika (&zaštićena od pisanja)...", IDM_CASSETTE_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "&Snimi", IDM_CASSETTE_RECORD - MENUITEM "&Pokreni", IDM_CASSETTE_PLAY - MENUITEM "P&remotaj na početak", IDM_CASSETTE_REWIND - MENUITEM "&Preskoči do kraja", IDM_CASSETTE_FAST_FORWARD + MENUITEM "&Snimi", IDM_CASSETTE_RECORD + MENUITEM "&Pokreni", IDM_CASSETTE_PLAY + MENUITEM "P&remotaj na početak", IDM_CASSETTE_REWIND + MENUITEM "&Preskoči do kraja", IDM_CASSETTE_FAST_FORWARD MENUITEM SEPARATOR - MENUITEM "&Izbaci", IDM_CASSETTE_EJECT + MENUITEM "&Izbaci", IDM_CASSETTE_EJECT END END @@ -155,9 +155,9 @@ CartridgeSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Slika...", IDM_CARTRIDGE_IMAGE + MENUITEM "&Slika...", IDM_CARTRIDGE_IMAGE MENUITEM SEPARATOR - MENUITEM "&Izbaci", IDM_CARTRIDGE_EJECT + MENUITEM "&Izbaci", IDM_CARTRIDGE_EJECT END END @@ -165,14 +165,14 @@ FloppySubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Nova slika...", IDM_FLOPPY_IMAGE_NEW + MENUITEM "&Nova slika...", IDM_FLOPPY_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&Postojeća slika...", IDM_FLOPPY_IMAGE_EXISTING - MENUITEM "Postojeća slika (&zaštićena od pisanja)...", IDM_FLOPPY_IMAGE_EXISTING_WP + MENUITEM "&Postojeća slika...", IDM_FLOPPY_IMAGE_EXISTING + MENUITEM "Postojeća slika (&zaštićena od pisanja)...", IDM_FLOPPY_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "&Izvozi u 86F...", IDM_FLOPPY_EXPORT_TO_86F + MENUITEM "&Izvozi u 86F...", IDM_FLOPPY_EXPORT_TO_86F MENUITEM SEPARATOR - MENUITEM "&Izbaci", IDM_FLOPPY_EJECT + MENUITEM "&Izbaci", IDM_FLOPPY_EJECT END END @@ -180,13 +180,13 @@ CdromSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Isključi zvuk", IDM_CDROM_MUTE + MENUITEM "&Isključi zvuk", IDM_CDROM_MUTE MENUITEM SEPARATOR - MENUITEM "&Prazno", IDM_CDROM_EMPTY - MENUITEM "&Ponovo učitaj prethodnu sliku", IDM_CDROM_RELOAD + MENUITEM "&Prazno", IDM_CDROM_EMPTY + MENUITEM "&Ponovo učitaj prethodnu sliku", IDM_CDROM_RELOAD MENUITEM SEPARATOR - MENUITEM "&Slika...", IDM_CDROM_IMAGE - MENUITEM "&Mapa...", IDM_CDROM_DIR + MENUITEM "&Slika...", IDM_CDROM_IMAGE + MENUITEM "&Mapa...", IDM_CDROM_DIR END END @@ -194,13 +194,13 @@ ZIPSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Nova slika...", IDM_ZIP_IMAGE_NEW + MENUITEM "&Nova slika...", IDM_ZIP_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&Postojeća slika...", IDM_ZIP_IMAGE_EXISTING - MENUITEM "Postojeća slika (&zaštićena od pisanja)...", IDM_ZIP_IMAGE_EXISTING_WP + MENUITEM "&Postojeća slika...", IDM_ZIP_IMAGE_EXISTING + MENUITEM "Postojeća slika (&zaštićena od pisanja)...", IDM_ZIP_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "&Izbaci", IDM_ZIP_EJECT - MENUITEM "&Ponovo učitaj prethodnu sliku", IDM_ZIP_RELOAD + MENUITEM "&Izbaci", IDM_ZIP_EJECT + MENUITEM "&Ponovo učitaj prethodnu sliku", IDM_ZIP_RELOAD END END @@ -208,13 +208,13 @@ MOSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Nova slika...", IDM_MO_IMAGE_NEW + MENUITEM "&Nova slika...", IDM_MO_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&Postojeća slika...", IDM_MO_IMAGE_EXISTING - MENUITEM "Postojeća slika (&zaštićena od pisanja)...", IDM_MO_IMAGE_EXISTING_WP + MENUITEM "&Postojeća slika...", IDM_MO_IMAGE_EXISTING + MENUITEM "Postojeća slika (&zaštićena od pisanja)...", IDM_MO_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "&Izbaci", IDM_MO_EJECT - MENUITEM "&Ponovo učitaj prethodnu sliku", IDM_MO_RELOAD + MENUITEM "&Izbaci", IDM_MO_EJECT + MENUITEM "&Ponovo učitaj prethodnu sliku", IDM_MO_RELOAD END END @@ -240,150 +240,150 @@ END // Dialog // -#define STR_PREFERENCES "Postavke" -#define STR_SND_GAIN "Pojačavanje zvuka" -#define STR_NEW_FLOPPY "Nova slika" -#define STR_CONFIG "Opcije" -#define STR_SPECIFY_DIM "Odredite glavne dimenzije prozora" +#define STR_PREFERENCES "Postavke" +#define STR_SND_GAIN "Pojačavanje zvuka" +#define STR_NEW_FLOPPY "Nova slika" +#define STR_CONFIG "Opcije" +#define STR_SPECIFY_DIM "Odredite glavne dimenzije prozora" -#define STR_OK "U redu" -#define STR_CANCEL "Otkaži" -#define STR_GLOBAL "Spremite ove postavke kao &globalne zadane postavke" -#define STR_DEFAULT "Zadano" -#define STR_LANGUAGE "Jezik:" -#define STR_ICONSET "Paket ikona:" +#define STR_OK "U redu" +#define STR_CANCEL "Otkaži" +#define STR_GLOBAL "Spremite ove postavke kao &globalne zadane postavke" +#define STR_DEFAULT "Zadano" +#define STR_LANGUAGE "Jezik:" +#define STR_ICONSET "Paket ikona:" -#define STR_GAIN "Pojačavanje" +#define STR_GAIN "Pojačavanje" -#define STR_FILE_NAME "Ime datoteke:" -#define STR_DISK_SIZE "Veličina diska:" -#define STR_RPM_MODE "Način broja okretaja:" -#define STR_PROGRESS "Napredak:" +#define STR_FILE_NAME "Ime datoteke:" +#define STR_DISK_SIZE "Veličina diska:" +#define STR_RPM_MODE "Način broja okretaja:" +#define STR_PROGRESS "Napredak:" -#define STR_WIDTH "Širina:" -#define STR_HEIGHT "Visina:" -#define STR_LOCK_TO_SIZE "Zaključajte na ovu veličinu" +#define STR_WIDTH "Širina:" +#define STR_HEIGHT "Visina:" +#define STR_LOCK_TO_SIZE "Zaključajte na ovu veličinu" -#define STR_MACHINE_TYPE "Tip sistema:" -#define STR_MACHINE "Sistem:" -#define STR_CONFIGURE "Namjesti" -#define STR_CPU_TYPE "Tip procesora:" -#define STR_CPU_SPEED "Brzina:" -#define STR_FPU "FPU uređaj:" -#define STR_WAIT_STATES "Stanja čekanja:" -#define STR_MB "MB" -#define STR_MEMORY "Memorija:" -#define STR_TIME_SYNC "Sinkronizacija vremena" -#define STR_DISABLED "Isključeno" -#define STR_ENABLED_LOCAL "Uključeno (lokalno vrijeme)" -#define STR_ENABLED_UTC "Uključeno (UTC)" -#define STR_DYNAREC "Dinamički rekompilator" +#define STR_MACHINE_TYPE "Tip sistema:" +#define STR_MACHINE "Sistem:" +#define STR_CONFIGURE "Namjesti" +#define STR_CPU_TYPE "Tip procesora:" +#define STR_CPU_SPEED "Brzina:" +#define STR_FPU "FPU uređaj:" +#define STR_WAIT_STATES "Stanja čekanja:" +#define STR_MB "MB" +#define STR_MEMORY "Memorija:" +#define STR_TIME_SYNC "Sinkronizacija vremena" +#define STR_DISABLED "Isključeno" +#define STR_ENABLED_LOCAL "Uključeno (lokalno vrijeme)" +#define STR_ENABLED_UTC "Uključeno (UTC)" +#define STR_DYNAREC "Dinamički rekompilator" -#define STR_VIDEO "Video:" -#define STR_VIDEO_2 "Video 2:" -#define STR_VOODOO "Voodoo grafika" -#define STR_IBM8514 "IBM 8514/a grafika" -#define STR_XGA "XGA grafika" +#define STR_VIDEO "Video:" +#define STR_VIDEO_2 "Video 2:" +#define STR_VOODOO "Voodoo grafika" +#define STR_IBM8514 "IBM 8514/a grafika" +#define STR_XGA "XGA grafika" -#define STR_MOUSE "Miš:" -#define STR_JOYSTICK "Palica za igru:" -#define STR_JOY1 "Palica za igru 1..." -#define STR_JOY2 "Palica za igru 2..." -#define STR_JOY3 "Palica za igru 3..." -#define STR_JOY4 "Palica za igru 4..." +#define STR_MOUSE "Miš:" +#define STR_JOYSTICK "Palica za igru:" +#define STR_JOY1 "Palica za igru 1..." +#define STR_JOY2 "Palica za igru 2..." +#define STR_JOY3 "Palica za igru 3..." +#define STR_JOY4 "Palica za igru 4..." -#define STR_SOUND1 "Zvučna kartica 1:" -#define STR_SOUND2 "Zvučna kartica 2:" -#define STR_SOUND3 "Zvučna kartica 3:" -#define STR_SOUND4 "Zvučna kartica 4:" -#define STR_MIDI_OUT "Izlazni uređaj MIDI:" -#define STR_MIDI_IN "Ulazni uređaj MIDI:" -#define STR_MPU401 "Samostalni MPU-401" -#define STR_FLOAT "Koristi FLOAT32 za zvuk" -#define STR_FM_DRIVER "Drajver za FM sintisajzer" -#define STR_FM_DRV_NUKED "Nuked (precizniji)" -#define STR_FM_DRV_YMFM "YMFM (brži)" +#define STR_SOUND1 "Zvučna kartica 1:" +#define STR_SOUND2 "Zvučna kartica 2:" +#define STR_SOUND3 "Zvučna kartica 3:" +#define STR_SOUND4 "Zvučna kartica 4:" +#define STR_MIDI_OUT "Izlazni uređaj MIDI:" +#define STR_MIDI_IN "Ulazni uređaj MIDI:" +#define STR_MPU401 "Samostalni MPU-401" +#define STR_FLOAT "Koristi FLOAT32 za zvuk" +#define STR_FM_DRIVER "Drajver za FM sintisajzer" +#define STR_FM_DRV_NUKED "Nuked (precizniji)" +#define STR_FM_DRV_YMFM "YMFM (brži)" -#define STR_NET_TYPE "Tip mreže:" -#define STR_PCAP "Uređaj PCap:" -#define STR_NET "Mrežna kartica:" -#define STR_NET1 "Network card 1:" -#define STR_NET2 "Network card 2:" -#define STR_NET3 "Network card 3:" -#define STR_NET4 "Network card 4:" +#define STR_NET_TYPE "Tip mreže:" +#define STR_PCAP "Uređaj PCap:" +#define STR_NET "Mrežna kartica:" +#define STR_NET1 "Network card 1:" +#define STR_NET2 "Network card 2:" +#define STR_NET3 "Network card 3:" +#define STR_NET4 "Network card 4:" -#define STR_COM1 "Uređaj COM1:" -#define STR_COM2 "Uređaj COM2:" -#define STR_COM3 "Uređaj COM3:" -#define STR_COM4 "Uređaj COM4:" -#define STR_LPT1 "Uređaj LPT1:" -#define STR_LPT2 "Uređaj LPT2:" -#define STR_LPT3 "Uređaj LPT3:" -#define STR_LPT4 "Uređaj LPT4:" -#define STR_SERIAL1 "Serijska vrata 1" -#define STR_SERIAL2 "Serijska vrata 2" -#define STR_SERIAL3 "Serijska vrata 3" -#define STR_SERIAL4 "Serijska vrata 4" -#define STR_PARALLEL1 "Paralelna vrata 1" -#define STR_PARALLEL2 "Paralelna vrata 2" -#define STR_PARALLEL3 "Paralelna vrata 3" -#define STR_PARALLEL4 "Paralelna vrata 4" -#define STR_SERIAL_PASS1 "Serial port passthrough 1" -#define STR_SERIAL_PASS2 "Serial port passthrough 2" -#define STR_SERIAL_PASS3 "Serial port passthrough 3" -#define STR_SERIAL_PASS4 "Serial port passthrough 4" +#define STR_COM1 "Uređaj COM1:" +#define STR_COM2 "Uređaj COM2:" +#define STR_COM3 "Uređaj COM3:" +#define STR_COM4 "Uređaj COM4:" +#define STR_LPT1 "Uređaj LPT1:" +#define STR_LPT2 "Uređaj LPT2:" +#define STR_LPT3 "Uređaj LPT3:" +#define STR_LPT4 "Uređaj LPT4:" +#define STR_SERIAL1 "Serijska vrata 1" +#define STR_SERIAL2 "Serijska vrata 2" +#define STR_SERIAL3 "Serijska vrata 3" +#define STR_SERIAL4 "Serijska vrata 4" +#define STR_PARALLEL1 "Paralelna vrata 1" +#define STR_PARALLEL2 "Paralelna vrata 2" +#define STR_PARALLEL3 "Paralelna vrata 3" +#define STR_PARALLEL4 "Paralelna vrata 4" +#define STR_SERIAL_PASS1 "Serial port passthrough 1" +#define STR_SERIAL_PASS2 "Serial port passthrough 2" +#define STR_SERIAL_PASS3 "Serial port passthrough 3" +#define STR_SERIAL_PASS4 "Serial port passthrough 4" -#define STR_HDC "Kontroler tvrdog diska:" -#define STR_FDC "Kontroler diskete:" -#define STR_IDE_TER "Tercijarni IDE kontroler" -#define STR_IDE_QUA "Kvaternarni IDE kontroler" -#define STR_SCSI "SCSI" -#define STR_SCSI_1 "Kontroler 1:" -#define STR_SCSI_2 "Kontroler 2:" -#define STR_SCSI_3 "Kontroler 3:" -#define STR_SCSI_4 "Kontroler 4:" -#define STR_CASSETTE "Audio kaseta" +#define STR_HDC "Kontroler tvrdog diska:" +#define STR_FDC "Kontroler diskete:" +#define STR_IDE_TER "Tercijarni IDE kontroler" +#define STR_IDE_QUA "Kvaternarni IDE kontroler" +#define STR_SCSI "SCSI" +#define STR_SCSI_1 "Kontroler 1:" +#define STR_SCSI_2 "Kontroler 2:" +#define STR_SCSI_3 "Kontroler 3:" +#define STR_SCSI_4 "Kontroler 4:" +#define STR_CASSETTE "Audio kaseta" -#define STR_HDD "Tvrdi diskovi:" -#define STR_NEW "&Novi..." -#define STR_EXISTING "&Postojeći..." -#define STR_REMOVE "&Ukloni" -#define STR_BUS "Sabirnica:" -#define STR_CHANNEL "Kanal:" -#define STR_ID "ID:" -#define STR_SPEED "Speed:" +#define STR_HDD "Tvrdi diskovi:" +#define STR_NEW "&Novi..." +#define STR_EXISTING "&Postojeći..." +#define STR_REMOVE "&Ukloni" +#define STR_BUS "Sabirnica:" +#define STR_CHANNEL "Kanal:" +#define STR_ID "ID:" +#define STR_SPEED "Speed:" -#define STR_SPECIFY "&Odredi..." -#define STR_SECTORS "Sektori:" -#define STR_HEADS "Glave:" -#define STR_CYLS "Cilindri:" -#define STR_SIZE_MB "Veličina (MB):" -#define STR_TYPE "Tip:" -#define STR_IMG_FORMAT "Format slike:" -#define STR_BLOCK_SIZE "Veličina slike:" +#define STR_SPECIFY "&Odredi..." +#define STR_SECTORS "Sektori:" +#define STR_HEADS "Glave:" +#define STR_CYLS "Cilindri:" +#define STR_SIZE_MB "Veličina (MB):" +#define STR_TYPE "Tip:" +#define STR_IMG_FORMAT "Format slike:" +#define STR_BLOCK_SIZE "Veličina slike:" -#define STR_FLOPPY_DRIVES "Disketni pogoni:" -#define STR_TURBO "Turbo vrijemena" -#define STR_CHECKBPB "Provjeraj BPB" -#define STR_CDROM_DRIVES "CD-ROM pogoni:" -#define STR_CD_SPEED "Brzina:" -#define STR_EARLY "Raniji pogon" +#define STR_FLOPPY_DRIVES "Disketni pogoni:" +#define STR_TURBO "Turbo vrijemena" +#define STR_CHECKBPB "Provjeraj BPB" +#define STR_CDROM_DRIVES "CD-ROM pogoni:" +#define STR_CD_SPEED "Brzina:" +#define STR_EARLY "Raniji pogon" -#define STR_MO_DRIVES "MO pogoni:" -#define STR_ZIP_DRIVES "ZIP pogoni:" -#define STR_250 "ZIP 250" +#define STR_MO_DRIVES "MO pogoni:" +#define STR_ZIP_DRIVES "ZIP pogoni:" +#define STR_250 "ZIP 250" -#define STR_ISARTC "Sat stvarnog vremena (RTC):" -#define STR_ISAMEM "Proširenje memorije ISA" -#define STR_ISAMEM_1 "Kartica 1:" -#define STR_ISAMEM_2 "Kartica 2:" -#define STR_ISAMEM_3 "Kartica 3:" -#define STR_ISAMEM_4 "Kartica 4:" -#define STR_BUGGER "Uređaj ISABugger" -#define STR_POSTCARD "Kartica POST" +#define STR_ISARTC "Sat stvarnog vremena (RTC):" +#define STR_ISAMEM "Proširenje memorije ISA" +#define STR_ISAMEM_1 "Kartica 1:" +#define STR_ISAMEM_2 "Kartica 2:" +#define STR_ISAMEM_3 "Kartica 3:" +#define STR_ISAMEM_4 "Kartica 4:" +#define STR_BUGGER "Uređaj ISABugger" +#define STR_POSTCARD "Kartica POST" -#define FONT_SIZE 9 -#define FONT_NAME "Segoe UI" +#define FONT_SIZE 9 +#define FONT_NAME "Segoe UI" #include "dialogs.rc" @@ -394,149 +394,149 @@ END STRINGTABLE DISCARDABLE BEGIN - 2048 "86Box" - IDS_2049 "Greška" - IDS_2050 "Fatalna greška" - IDS_2051 " - PAUSED" - IDS_2052 "Pritisnite Ctrl+Alt+PgDn za povratak u prozorski način rada." - IDS_2053 "Brzina" - IDS_2054 "ZIP %03i %i (%s): %ls" - IDS_2055 "ZIP slike (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" - IDS_2056 "86Box nije mogao pronaći upotrebljive ROM datoteke.\n\nMolimte posjetite sknite paket s ROM datotekama i ekstrahirajte paket u ""roms"" mapu." - IDS_2057 "(prazno)" - IDS_2058 "ZIP slike (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0Sve datoteke (*.*)\0*.*\0" - IDS_2059 "Turbo" - IDS_2060 "Uključeno" - IDS_2061 "Isključeno" - IDS_2062 "Sve slike (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0BOsnovne sektorske slike (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Površinske slike (*.86F)\0*.86F\0" - IDS_2063 "Sistem ""%hs"" nije dostupan jer ne postoje potrebni ROM-ovi u mapu roms/machines. Prebacivanje na dostupno računalo." + 2048 "86Box" + IDS_2049 "Greška" + IDS_2050 "Fatalna greška" + IDS_2051 " - PAUSED" + IDS_2052 "Pritisnite Ctrl+Alt+PgDn za povratak u prozorski način rada." + IDS_2053 "Brzina" + IDS_2054 "ZIP %03i %i (%s): %ls" + IDS_2055 "ZIP slike (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" + IDS_2056 "86Box nije mogao pronaći upotrebljive ROM datoteke.\n\nMolimte posjetite sknite paket s ROM datotekama i ekstrahirajte paket u ""roms"" mapu." + IDS_2057 "(prazno)" + IDS_2058 "ZIP slike (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0Sve datoteke (*.*)\0*.*\0" + IDS_2059 "Turbo" + IDS_2060 "Uključeno" + IDS_2061 "Isključeno" + IDS_2062 "Sve slike (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0BOsnovne sektorske slike (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Površinske slike (*.86F)\0*.86F\0" + IDS_2063 "Sistem ""%hs"" nije dostupan jer ne postoje potrebni ROM-ovi u mapu roms/machines. Prebacivanje na dostupno računalo." END STRINGTABLE DISCARDABLE BEGIN - IDS_2064 "Video kartica ""%hs"" nije dostupna jer ne postoje potrebni ROM-ovi u mapu roms/video. Prebacivanje na dostupnu video karticu." - IDS_2065 "Sistem" - IDS_2066 "Video" - IDS_2067 "Ulazni uređaji" - IDS_2068 "Zvuk" - IDS_2069 "Mreža" - IDS_2070 "Vrata (COM & LPT)" - IDS_2071 "Kontroleri za diskove" - IDS_2072 "Tvrdi diskovi" - IDS_2073 "Floppy & CD-ROM pogoni" - IDS_2074 "Ostali uklonjivi uređaji" - IDS_2075 "Ostali periferni uređaji" - IDS_2076 "Površinske slike (*.86F)\0*.86F\0" - IDS_2077 "Kliknite da uhvatite miš" - IDS_2078 "Pritisnite F8+F12 za otpustanje miša" - IDS_2079 "Pritisnite F8+F12 ili srednji gumb miša za otpuštanje miša" + IDS_2064 "Video kartica ""%hs"" nije dostupna jer ne postoje potrebni ROM-ovi u mapu roms/video. Prebacivanje na dostupnu video karticu." + IDS_2065 "Sistem" + IDS_2066 "Video" + IDS_2067 "Ulazni uređaji" + IDS_2068 "Zvuk" + IDS_2069 "Mreža" + IDS_2070 "Vrata (COM & LPT)" + IDS_2071 "Kontroleri za diskove" + IDS_2072 "Tvrdi diskovi" + IDS_2073 "Floppy & CD-ROM pogoni" + IDS_2074 "Ostali uklonjivi uređaji" + IDS_2075 "Ostali periferni uređaji" + IDS_2076 "Površinske slike (*.86F)\0*.86F\0" + IDS_2077 "Kliknite da uhvatite miš" + IDS_2078 "Pritisnite F8+F12 za otpustanje miša" + IDS_2079 "Pritisnite F8+F12 ili srednji gumb miša za otpuštanje miša" END STRINGTABLE DISCARDABLE BEGIN - IDS_2080 "Nije moguće inicijalizirati FluidSynth" - IDS_2081 "Bus" - IDS_2082 "Datoteka" - IDS_2083 "C" - IDS_2084 "H" - IDS_2085 "S" - IDS_2086 "MB" + IDS_2080 "Nije moguće inicijalizirati FluidSynth" + IDS_2081 "Bus" + IDS_2082 "Datoteka" + IDS_2083 "C" + IDS_2084 "H" + IDS_2085 "S" + IDS_2086 "MB" IDS_2087 "Speed" - IDS_2088 "Provjeri BPB" - IDS_2089 "KB" - IDS_2090 "Nije moguće inicijalizirati renderer." - IDS_2091 "Standard" - IDS_2092 "%i stanje čekanja" - IDS_2093 "Tip" - IDS_2094 "Postavljanje PCap-a nije uspjelo" - IDS_2095 "Nema PCap uređaja" - IDS_2096 "Nevažeći PCap uređaj" - IDS_2097 "Standardna palica za igru s 2 tipke" - IDS_2098 "Standardna palica za igru s 4 tipke" - IDS_2099 "Standardna palica za igru s 6 tipke" - IDS_2100 "Standardna palica za igru s 8 tipke" - IDS_2101 "CH Flightstick Pro" - IDS_2102 "Microsoft SideWinder Pad" - IDS_2103 "Thrustmaster Flight Control System" - IDS_2104 "Bez" - IDS_2105 "Nije moguće učitati ubrzivače tipkovnice." - IDS_2106 "Nije moguće registrirati neobrađeni unos." - IDS_2107 "%u" - IDS_2108 "%u MB (CHS: %i, %i, %i)" - IDS_2109 "Disketa %i (%s): %ls" - IDS_2110 "Sve slike (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Napredne sektorske slike (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Osnovne sektorske slike (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Flux slike (*.FDI)\0*.FDI\0Površinske slike (*.86F;*.MFM)\0*.86F;*.MFM\0Sve datoteke (*.*)\0*.*\0" - IDS_2111 "Nije moguće inicijalizirati FreeType" - IDS_2112 "Nije moguće inicijalizirati SDL, SDL2.dll je potrebno" - IDS_2113 "Jeste li sigurni da želite hard resetirati emulirani sistem?" - IDS_2114 "Jeste li sigurni da želite zatvoriti 86Box?" - IDS_2115 "Nije moguće inicijalizirati GhostScript" - IDS_2116 "MO %i (%ls): %ls" - IDS_2117 "MO slike (*.IM?;*.MDI)\0*.IM?;*.MDI\0Svi datoteke (*.*)\0*.*\0" - IDS_2118 "Dobrodošli u 86Box!" - IDS_2119 "Uunutarnji kontroler" - IDS_2120 "Izlazi" - IDS_2121 "Nisu pronađene ROM datoteke" - IDS_2122 "Želite li spremiti postavke?" - IDS_2123 "Ovo će napraviti hard resetiranje emuliranog sistema." - IDS_2124 "Spremaj" - IDS_2125 "O programu 86Box" - IDS_2126 "86Box verzija " EMU_VERSION + IDS_2088 "Provjeri BPB" + IDS_2089 "KB" + IDS_2090 "Nije moguće inicijalizirati renderer." + IDS_2091 "Standard" + IDS_2092 "%i stanje čekanja" + IDS_2093 "Tip" + IDS_2094 "Postavljanje PCap-a nije uspjelo" + IDS_2095 "Nema PCap uređaja" + IDS_2096 "Nevažeći PCap uređaj" + IDS_2097 "Standardna palica za igru s 2 tipke" + IDS_2098 "Standardna palica za igru s 4 tipke" + IDS_2099 "Standardna palica za igru s 6 tipke" + IDS_2100 "Standardna palica za igru s 8 tipke" + IDS_2101 "CH Flightstick Pro" + IDS_2102 "Microsoft SideWinder Pad" + IDS_2103 "Thrustmaster Flight Control System" + IDS_2104 "Bez" + IDS_2105 "Nije moguće učitati ubrzivače tipkovnice." + IDS_2106 "Nije moguće registrirati neobrađeni unos." + IDS_2107 "%u" + IDS_2108 "%u MB (CHS: %i, %i, %i)" + IDS_2109 "Disketa %i (%s): %ls" + IDS_2110 "Sve slike (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Napredne sektorske slike (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Osnovne sektorske slike (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Flux slike (*.FDI)\0*.FDI\0Površinske slike (*.86F;*.MFM)\0*.86F;*.MFM\0Sve datoteke (*.*)\0*.*\0" + IDS_2111 "Nije moguće inicijalizirati FreeType" + IDS_2112 "Nije moguće inicijalizirati SDL, SDL2.dll je potrebno" + IDS_2113 "Jeste li sigurni da želite hard resetirati emulirani sistem?" + IDS_2114 "Jeste li sigurni da želite zatvoriti 86Box?" + IDS_2115 "Nije moguće inicijalizirati GhostScript" + IDS_2116 "MO %i (%ls): %ls" + IDS_2117 "MO slike (*.IM?;*.MDI)\0*.IM?;*.MDI\0Svi datoteke (*.*)\0*.*\0" + IDS_2118 "Dobrodošli u 86Box!" + IDS_2119 "Uunutarnji kontroler" + IDS_2120 "Izlazi" + IDS_2121 "Nisu pronađene ROM datoteke" + IDS_2122 "Želite li spremiti postavke?" + IDS_2123 "Ovo će napraviti hard resetiranje emuliranog sistema." + IDS_2124 "Spremaj" + IDS_2125 "O programu 86Box" + IDS_2126 "86Box verzija " EMU_VERSION - IDS_2127 "Emulator starih računala\n\nAutori: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, Tiseno100, reenigne, 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." - IDS_2128 "U redu" - IDS_2129 "Hardver nije dostupan" + IDS_2127 "Emulator starih računala\n\nAutori: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, Tiseno100, reenigne, 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." + IDS_2128 "U redu" + IDS_2129 "Hardver nije dostupan" #ifdef _WIN32 #define LIB_NAME_PCAP "WinPcap" #else #define LIB_NAME_PCAP "libpcap" #endif - IDS_2130 "Provjerite je li " LIB_NAME_PCAP " instaliran i jeste li na mreži, kompadibilnoj s " LIB_NAME_PCAP "." - IDS_2131 "Nevažeća konfiguracija" + IDS_2130 "Provjerite je li " LIB_NAME_PCAP " instaliran i jeste li na mreži, kompadibilnoj s " LIB_NAME_PCAP "." + IDS_2131 "Nevažeća konfiguracija" #ifdef _WIN32 #define LIB_NAME_FREETYPE "freetype.dll" #else #define LIB_NAME_FREETYPE "libfreetype" #endif - IDS_2132 LIB_NAME_FREETYPE " je potrebno za emuliranje ESC/P pisača." + IDS_2132 LIB_NAME_FREETYPE " je potrebno za emuliranje ESC/P pisača." #ifdef _WIN32 #define LIB_NAME_GS "gsdll32.dll" #else #define LIB_NAME_GS "libgs" #endif - IDS_2133 LIB_NAME_GS " 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." + IDS_2133 LIB_NAME_GS " 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." #ifdef _WIN32 #define LIB_NAME_FLUIDSYNTH "libfluidsynth.dll" #else #define LIB_NAME_FLUIDSYNTH "libfluidsynth" #endif - IDS_2134 LIB_NAME_FLUIDSYNTH " je potrebno za FluidSynth MIDI izlaz." - IDS_2135 "Ulazim u cijelozaslonski način" - IDS_2136 "Ne pokazi više ovu poruku" - IDS_2137 "Ne izlazi" - IDS_2138 "Resetiraj" - IDS_2139 "Ne resetiraj" - IDS_2140 "MO slike (*.IM?;*.MDI)\0*.IM?;*.MDI\0Sve datoteke (*.*)\0*.*\0" - IDS_2141 "CD-ROM slike (*.ISO;*.CUE)\0*.ISO;*.CUE\0Sve datoteke (*.*)\0*.*\0" - IDS_2142 "Konfiguracija uređaja %hs " + IDS_2134 LIB_NAME_FLUIDSYNTH " je potrebno za FluidSynth MIDI izlaz." + IDS_2135 "Ulazim u cijelozaslonski način" + IDS_2136 "Ne pokazi više ovu poruku" + IDS_2137 "Ne izlazi" + IDS_2138 "Resetiraj" + IDS_2139 "Ne resetiraj" + IDS_2140 "MO slike (*.IM?;*.MDI)\0*.IM?;*.MDI\0Sve datoteke (*.*)\0*.*\0" + IDS_2141 "CD-ROM slike (*.ISO;*.CUE)\0*.ISO;*.CUE\0Sve datoteke (*.*)\0*.*\0" + IDS_2142 "Konfiguracija uređaja %hs " IDS_2143 "Ekran u stanju mirovanja" - IDS_2144 "OpenGL shaderi (*.GLSL)\0*.GLSL\0Sve datoteke (*.*)\0*.*\0" - IDS_2145 "OpenGL opcije" - IDS_2146 "Učitavate nepodržanu konfiguraciju" - IDS_2147 "Filtriranje tipa CPU-a na temelju odabranog sistema onemogućeno je za ovaj emulirani sistem.\n\nOvo omogućuje odabir procesora koji inače nisu kompatibilne s odabranog sistem. Međutim, možete naići na na nekompatibilnosti s BIOS-om sustava ili drugim softverom.\n\nOmogućavanje ove postavke nije službeno podržano i sva prijava o greškama mogu biti zatvorena kao ""invalid""." - IDS_2148 "Nastavi" - IDS_2149 "Audio kaseta: %s" - IDS_2150 "Slike audio kasete (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Sve datoteke (*.*)\0*.*\0" - IDS_2151 "Kaseta %i: %ls" - IDS_2152 "Slike kasete (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Sve datoteke (*.*)\0*.*\0" - IDS_2153 "Nije moguće inicijalizirati renderer" - IDS_2154 "Nije moguće inicijalizirati OpenGL (3.0 jezgra) renderer. Molimte koristite drugi renderer." - IDS_2155 "Nastavi" - IDS_2156 "Pauziraj" - IDS_2157 "Stisni Ctrl+Alt+Del" - IDS_2158 "Stisni Ctrl+Alt+Esc" - IDS_2159 "Ponovno pokretanje" - IDS_2160 "ACPI bazirano gašenje" - IDS_2161 "Postavke" + IDS_2144 "OpenGL shaderi (*.GLSL)\0*.GLSL\0Sve datoteke (*.*)\0*.*\0" + IDS_2145 "OpenGL opcije" + IDS_2146 "Učitavate nepodržanu konfiguraciju" + IDS_2147 "Filtriranje tipa CPU-a na temelju odabranog sistema onemogućeno je za ovaj emulirani sistem.\n\nOvo omogućuje odabir procesora koji inače nisu kompatibilne s odabranog sistem. Međutim, možete naići na na nekompatibilnosti s BIOS-om sustava ili drugim softverom.\n\nOmogućavanje ove postavke nije službeno podržano i sva prijava o greškama mogu biti zatvorena kao ""invalid""." + IDS_2148 "Nastavi" + IDS_2149 "Audio kaseta: %s" + IDS_2150 "Slike audio kasete (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Sve datoteke (*.*)\0*.*\0" + IDS_2151 "Kaseta %i: %ls" + IDS_2152 "Slike kasete (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Sve datoteke (*.*)\0*.*\0" + IDS_2153 "Nije moguće inicijalizirati renderer" + IDS_2154 "Nije moguće inicijalizirati OpenGL (3.0 jezgra) renderer. Molimte koristite drugi renderer." + IDS_2155 "Nastavi" + IDS_2156 "Pauziraj" + IDS_2157 "Stisni Ctrl+Alt+Del" + IDS_2158 "Stisni Ctrl+Alt+Esc" + IDS_2159 "Ponovno pokretanje" + IDS_2160 "ACPI bazirano gašenje" + IDS_2161 "Postavke" IDS_2162 "Raniji pogon" IDS_2163 "No Dynarec" IDS_2164 "Old Dynarec" @@ -547,45 +547,45 @@ END STRINGTABLE DISCARDABLE BEGIN IDS_4096 "Tvrdi disk (%s)" - IDS_4097 "%01i:%01i" - IDS_4098 "%01i" - IDS_4099 "MFM/RLL ili ESDI CD-ROM pogoni nisu nikada postojali" - IDS_4100 "Prilagođeno..." - IDS_4101 "Prilagođeno (veliko)..." - IDS_4102 "Dodajte novi tvrdi disk" - IDS_4103 "Dodajte postojeći tvrdi disk" - IDS_4104 "HDI disk image datoteke ne mogu biti veće od 4 GB." - IDS_4105 "Slike tvrdog diska ne mogu biti veće od 127 GB." - IDS_4106 "Slike za tvrde diskove (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0Sve datoteke (*.*)\0*.*\0" - IDS_4107 "Nije moguće pročitati datoteku" - IDS_4108 "Nije moguće napisati datoteku" - IDS_4109 "HDI ili HDX slike s veličinom sektora koja nije 512 kB nisu podržane." - IDS_4110 "USB nije još podržano" - IDS_4111 "Slika diska već postoji" - IDS_4112 "Molimte unesite važeći naziv datoteke." - IDS_4113 "Slika je stvorena" - IDS_4114 "Provjerite je li postoji datoteka i je li čitljiva." - IDS_4115 "Provjerite je li se datoteka sprema u mapu s dopuštenjima za pisanje." - IDS_4116 "Slika diska je prevelika" - IDS_4117 "Ne zaboravite stvoriti particije i formatirati ih na novom disku." - IDS_4118 "Odabrana datoteka bit će prebrisana. Jeste li sigurni da želite koristiti ovu daoteku?" - IDS_4119 "Nepodržana slika diska" - IDS_4120 "Prepiši" - IDS_4121 "Ne prepiši" - IDS_4122 "Slika neobrađenih podataka (.img)" - IDS_4123 "HDI slika (.hdi)" - IDS_4124 "HDX slika (.hdx)" - IDS_4125 "VHD fiksne veličine (.vhd)" - IDS_4126 "VHD dinamičke veličine (.vhd)" - IDS_4127 "Različiti VHD (.vhd)" - IDS_4128 "Veliki blokovi (2 MB)" - IDS_4129 "Mali blokovi (512 KB)" - IDS_4130 "VHD slike (*.VHD)\0*.VHD\0Sve datoteke (*.*)\0*.*\0" - IDS_4131 "Izaberi matičnu sliku VHD" - IDS_4132 "To bi moglo značiti da je matična slika promijenjena nakon što je stvorena različita slika.\n\nTo se također može dogoditi ako su slike premještene ili kopirane, ili greška u programu koji je stvorio ovaj disk.\n\nŽelite li popraviti vremenske oznake?" - IDS_4133 "Vremenske ozanke matične i poređenog diska ne odgovaraju." - IDS_4134 "Ne mogu popraviti vremensku oznaku slike VHD." - IDS_4135 "%01i:%02i" + IDS_4097 "%01i:%01i" + IDS_4098 "%01i" + IDS_4099 "MFM/RLL ili ESDI CD-ROM pogoni nisu nikada postojali" + IDS_4100 "Prilagođeno..." + IDS_4101 "Prilagođeno (veliko)..." + IDS_4102 "Dodajte novi tvrdi disk" + IDS_4103 "Dodajte postojeći tvrdi disk" + IDS_4104 "HDI disk image datoteke ne mogu biti veće od 4 GB." + IDS_4105 "Slike tvrdog diska ne mogu biti veće od 127 GB." + IDS_4106 "Slike za tvrde diskove (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0Sve datoteke (*.*)\0*.*\0" + IDS_4107 "Nije moguće pročitati datoteku" + IDS_4108 "Nije moguće napisati datoteku" + IDS_4109 "HDI ili HDX slike s veličinom sektora koja nije 512 kB nisu podržane." + IDS_4110 "USB nije još podržano" + IDS_4111 "Slika diska već postoji" + IDS_4112 "Molimte unesite važeći naziv datoteke." + IDS_4113 "Slika je stvorena" + IDS_4114 "Provjerite je li postoji datoteka i je li čitljiva." + IDS_4115 "Provjerite je li se datoteka sprema u mapu s dopuštenjima za pisanje." + IDS_4116 "Slika diska je prevelika" + IDS_4117 "Ne zaboravite stvoriti particije i formatirati ih na novom disku." + IDS_4118 "Odabrana datoteka bit će prebrisana. Jeste li sigurni da želite koristiti ovu daoteku?" + IDS_4119 "Nepodržana slika diska" + IDS_4120 "Prepiši" + IDS_4121 "Ne prepiši" + IDS_4122 "Slika neobrađenih podataka (.img)" + IDS_4123 "HDI slika (.hdi)" + IDS_4124 "HDX slika (.hdx)" + IDS_4125 "VHD fiksne veličine (.vhd)" + IDS_4126 "VHD dinamičke veličine (.vhd)" + IDS_4127 "Različiti VHD (.vhd)" + IDS_4128 "Veliki blokovi (2 MB)" + IDS_4129 "Mali blokovi (512 KB)" + IDS_4130 "VHD slike (*.VHD)\0*.VHD\0Sve datoteke (*.*)\0*.*\0" + IDS_4131 "Izaberi matičnu sliku VHD" + IDS_4132 "To bi moglo značiti da je matična slika promijenjena nakon što je stvorena različita slika.\n\nTo se također može dogoditi ako su slike premještene ili kopirane, ili greška u programu koji je stvorio ovaj disk.\n\nŽelite li popraviti vremenske oznake?" + IDS_4133 "Vremenske ozanke matične i poređenog diska ne odgovaraju." + IDS_4134 "Ne mogu popraviti vremensku oznaku slike VHD." + IDS_4135 "%01i:%02i" IDS_4352 "MFM/RLL" IDS_4353 "XTA" @@ -594,56 +594,56 @@ BEGIN IDS_4356 "ATAPI" IDS_4357 "SCSI" - IDS_4608 "MFM/RLL (%01i:%01i)" - IDS_4609 "XTA (%01i:%01i)" - IDS_4610 "ESDI (%01i:%01i)" - IDS_4611 "IDE (%01i:%01i)" - IDS_4612 "ATAPI (%01i:%01i)" - IDS_4613 "SCSI (%01i:%02i)" + IDS_4608 "MFM/RLL (%01i:%01i)" + IDS_4609 "XTA (%01i:%01i)" + IDS_4610 "ESDI (%01i:%01i)" + IDS_4611 "IDE (%01i:%01i)" + IDS_4612 "ATAPI (%01i:%01i)" + IDS_4613 "SCSI (%01i:%02i)" - IDS_5120 "CD-ROM %i (%s): %s" + IDS_5120 "CD-ROM %i (%s): %s" - IDS_5376 "Deaktivirano" - IDS_5381 "ATAPI" + IDS_5376 "Deaktivirano" + IDS_5381 "ATAPI" IDS_5382 "SCSI" - IDS_5632 "Deaktivirano" - IDS_5637 "ATAPI (%01i:%01i)" + IDS_5632 "Deaktivirano" + IDS_5637 "ATAPI (%01i:%01i)" IDS_5638 "SCSI (%01i:%02i)" - IDS_5888 "160 kB" - IDS_5889 "180 kB" - IDS_5890 "320 kB" - IDS_5891 "360 kB" - IDS_5892 "640 kB" - IDS_5893 "720 kB" - IDS_5894 "1,2 MB" - IDS_5895 "1,25 MB" - IDS_5896 "1,44 MB" - IDS_5897 "DMF (1024 clusteri)" - IDS_5898 "DMF (2048 clusteri)" - IDS_5899 "2,88 MB" - IDS_5900 "ZIP 100" - IDS_5901 "ZIP 250" - IDS_5902 "3,5"" 128 MB (ISO 10090)" - IDS_5903 "3,5"" 230 MB (ISO 13963)" - IDS_5904 "3,5"" 540 MB (ISO 15498)" - IDS_5905 "3,5"" 640 MB (ISO 15498)" - IDS_5906 "3,5"" 1.3 GB (GigaMO)" - IDS_5907 "3,5"" 2.3 GB (GigaMO 2)" - IDS_5908 "5,25"" 600 MB" - IDS_5909 "5,25"" 650 MB" - IDS_5910 "5,25"" 1 GB" - IDS_5911 "5,25"" 1.3 GB" + IDS_5888 "160 kB" + IDS_5889 "180 kB" + IDS_5890 "320 kB" + IDS_5891 "360 kB" + IDS_5892 "640 kB" + IDS_5893 "720 kB" + IDS_5894 "1,2 MB" + IDS_5895 "1,25 MB" + IDS_5896 "1,44 MB" + IDS_5897 "DMF (1024 clusteri)" + IDS_5898 "DMF (2048 clusteri)" + IDS_5899 "2,88 MB" + IDS_5900 "ZIP 100" + IDS_5901 "ZIP 250" + IDS_5902 "3,5"" 128 MB (ISO 10090)" + IDS_5903 "3,5"" 230 MB (ISO 13963)" + IDS_5904 "3,5"" 540 MB (ISO 15498)" + IDS_5905 "3,5"" 640 MB (ISO 15498)" + IDS_5906 "3,5"" 1.3 GB (GigaMO)" + IDS_5907 "3,5"" 2.3 GB (GigaMO 2)" + IDS_5908 "5,25"" 600 MB" + IDS_5909 "5,25"" 650 MB" + IDS_5910 "5,25"" 1 GB" + IDS_5911 "5,25"" 1.3 GB" - IDS_6144 "Savršeni broj okretaja u minuti" - IDS_6145 "1% ispod savršenog broja okretaja" - IDS_6146 "1,5% ispod savršenog broja okretaja" - IDS_6147 "2% ispod savršenog broja okretaja" + IDS_6144 "Savršeni broj okretaja u minuti" + IDS_6145 "1% ispod savršenog broja okretaja" + IDS_6146 "1,5% ispod savršenog broja okretaja" + IDS_6147 "2% ispod savršenog broja okretaja" - IDS_7168 "(Zadana postavka operativnog sustava)" + IDS_7168 "(Zadana postavka operativnog sustava)" END -#define IDS_LANG_ENUS IDS_7168 +#define IDS_LANG_ENUS IDS_7168 // Croatian (hr-HR) resources ///////////////////////////////////////////////////////////////////////////// diff --git a/src/win/languages/hu-HU.rc b/src/win/languages/hu-HU.rc index ece73eea2..ce380dfb4 100644 --- a/src/win/languages/hu-HU.rc +++ b/src/win/languages/hu-HU.rc @@ -22,13 +22,13 @@ MainMenu MENU DISCARDABLE BEGIN POPUP "&Művelet" BEGIN - MENUITEM "A &billentyűzet elfogást igényel", IDM_ACTION_KBD_REQ_CAPTURE - MENUITEM "A &jobb oldali CTRL a bal ALT", IDM_ACTION_RCTRL_IS_LALT + MENUITEM "A &billentyűzet elfogást igényel", IDM_ACTION_KBD_REQ_CAPTURE + MENUITEM "A &jobb oldali CTRL a bal ALT", IDM_ACTION_RCTRL_IS_LALT MENUITEM SEPARATOR MENUITEM "Hardveres &újraindítás...", IDM_ACTION_HRESET MENUITEM "&Ctrl+Alt+Del\tCtrl+F12", IDM_ACTION_RESET_CAD MENUITEM SEPARATOR - MENUITEM "Ctrl+Alt+&Esc", IDM_ACTION_CTRL_ALT_ESC + MENUITEM "Ctrl+Alt+&Esc", IDM_ACTION_CTRL_ALT_ESC MENUITEM SEPARATOR MENUITEM "&Szüneteltetés", IDM_ACTION_PAUSE MENUITEM SEPARATOR @@ -36,8 +36,8 @@ BEGIN END POPUP "&Nézet" BEGIN - MENUITEM "Állapotsor &elrejtése", IDM_VID_HIDE_STATUS_BAR - MENUITEM "Hide &toolbar", IDM_VID_HIDE_TOOLBAR + MENUITEM "Állapotsor &elrejtése", IDM_VID_HIDE_STATUS_BAR + MENUITEM "Hide &toolbar", IDM_VID_HIDE_TOOLBAR MENUITEM SEPARATOR MENUITEM "&Show non-primary monitors", IDM_VID_MONITORS MENUITEM "&Átméretezhető ablak", IDM_VID_RESIZE @@ -106,11 +106,11 @@ BEGIN MENUITEM "CGA/PCjr/Tandy/E&GA/(S)VGA túlpásztázás", IDM_VID_OVERSCAN MENUITEM "Kontraszt illesztése &monokróm kijelzőhöz", IDM_VID_CGACON END - MENUITEM "&Média", IDM_MEDIA + MENUITEM "&Média", IDM_MEDIA POPUP "&Eszközök" BEGIN MENUITEM "&Konfigurálás...", IDM_CONFIG - MENUITEM "Állapotsori ikonok &frissítése", IDM_UPDATE_ICONS + MENUITEM "Állapotsori ikonok &frissítése", IDM_UPDATE_ICONS MENUITEM SEPARATOR MENUITEM "&Képernyőkép készítése\tCtrl+F11", IDM_ACTION_SCREENSHOT MENUITEM SEPARATOR @@ -142,17 +142,17 @@ CassetteSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Új képfájl létrehozása...", IDM_CASSETTE_IMAGE_NEW + MENUITEM "&Új képfájl létrehozása...", IDM_CASSETTE_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "Meglévő képfájl &megnyitása...", IDM_CASSETTE_IMAGE_EXISTING - MENUITEM "Meglévő képfájl megnyitása (&írásvédett)...", IDM_CASSETTE_IMAGE_EXISTING_WP + MENUITEM "Meglévő képfájl &megnyitása...", IDM_CASSETTE_IMAGE_EXISTING + MENUITEM "Meglévő képfájl megnyitása (&írásvédett)...", IDM_CASSETTE_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "&Felvétel", IDM_CASSETTE_RECORD - MENUITEM "&Lejátszás", IDM_CASSETTE_PLAY - MENUITEM "&Visszatekerés az elejére", IDM_CASSETTE_REWIND - MENUITEM "&Előretekerés a végére", IDM_CASSETTE_FAST_FORWARD + MENUITEM "&Felvétel", IDM_CASSETTE_RECORD + MENUITEM "&Lejátszás", IDM_CASSETTE_PLAY + MENUITEM "&Visszatekerés az elejére", IDM_CASSETTE_REWIND + MENUITEM "&Előretekerés a végére", IDM_CASSETTE_FAST_FORWARD MENUITEM SEPARATOR - MENUITEM "&Kiadás", IDM_CASSETTE_EJECT + MENUITEM "&Kiadás", IDM_CASSETTE_EJECT END END @@ -160,9 +160,9 @@ CartridgeSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "Kép&fájl...", IDM_CARTRIDGE_IMAGE + MENUITEM "Kép&fájl...", IDM_CARTRIDGE_IMAGE MENUITEM SEPARATOR - MENUITEM "&Kiadás", IDM_CARTRIDGE_EJECT + MENUITEM "&Kiadás", IDM_CARTRIDGE_EJECT END END @@ -170,14 +170,14 @@ FloppySubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Új képfájl létrehozása...", IDM_FLOPPY_IMAGE_NEW + MENUITEM "&Új képfájl létrehozása...", IDM_FLOPPY_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "Meglévő képfájl &megnyitása...", IDM_FLOPPY_IMAGE_EXISTING - MENUITEM "Meglévő képfájl megnyitása (&írásvédett)...", IDM_FLOPPY_IMAGE_EXISTING_WP + MENUITEM "Meglévő képfájl &megnyitása...", IDM_FLOPPY_IMAGE_EXISTING + MENUITEM "Meglévő képfájl megnyitása (&írásvédett)...", IDM_FLOPPY_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "E&xportálás 86F formátumba...", IDM_FLOPPY_EXPORT_TO_86F + MENUITEM "E&xportálás 86F formátumba...", IDM_FLOPPY_EXPORT_TO_86F MENUITEM SEPARATOR - MENUITEM "&Kiadás", IDM_FLOPPY_EJECT + MENUITEM "&Kiadás", IDM_FLOPPY_EJECT END END @@ -185,13 +185,13 @@ CdromSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Némítás", IDM_CDROM_MUTE + MENUITEM "&Némítás", IDM_CDROM_MUTE MENUITEM SEPARATOR - MENUITEM "&Kiadás", IDM_CDROM_EMPTY - MENUITEM "Előző képfájl &újratöltése", IDM_CDROM_RELOAD + MENUITEM "&Kiadás", IDM_CDROM_EMPTY + MENUITEM "Előző képfájl &újratöltése", IDM_CDROM_RELOAD MENUITEM SEPARATOR - MENUITEM "&Meglévő képfájl &megnyitása...", IDM_CDROM_IMAGE - MENUITEM "&Mappa...", IDM_CDROM_DIR + MENUITEM "&Meglévő képfájl &megnyitása...", IDM_CDROM_IMAGE + MENUITEM "&Mappa...", IDM_CDROM_DIR END END @@ -199,13 +199,13 @@ ZIPSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Új képfájl létrehozása...", IDM_ZIP_IMAGE_NEW + MENUITEM "&Új képfájl létrehozása...", IDM_ZIP_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&Meglévő képfájl &megnyitása...", IDM_ZIP_IMAGE_EXISTING - MENUITEM "Meglévő képfájl megnyitása (&írásvédett)...", IDM_ZIP_IMAGE_EXISTING_WP + MENUITEM "&Meglévő képfájl &megnyitása...", IDM_ZIP_IMAGE_EXISTING + MENUITEM "Meglévő képfájl megnyitása (&írásvédett)...", IDM_ZIP_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "Kiadás", IDM_ZIP_EJECT - MENUITEM "Előző képfájl &újratöltése", IDM_ZIP_RELOAD + MENUITEM "Kiadás", IDM_ZIP_EJECT + MENUITEM "Előző képfájl &újratöltése", IDM_ZIP_RELOAD END END @@ -213,13 +213,13 @@ MOSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Új képfájl létrehozása...", IDM_MO_IMAGE_NEW + MENUITEM "&Új képfájl létrehozása...", IDM_MO_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&Meglévő képfájl &megnyitása...", IDM_MO_IMAGE_EXISTING - MENUITEM "Meglévő képfájl megnyitása (&írásvédett)...", IDM_MO_IMAGE_EXISTING_WP + MENUITEM "&Meglévő képfájl &megnyitása...", IDM_MO_IMAGE_EXISTING + MENUITEM "Meglévő képfájl megnyitása (&írásvédett)...", IDM_MO_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "Kiadás", IDM_MO_EJECT - MENUITEM "Előző képfájl &újratöltése", IDM_MO_RELOAD + MENUITEM "Kiadás", IDM_MO_EJECT + MENUITEM "Előző képfájl &újratöltése", IDM_MO_RELOAD END END @@ -245,150 +245,150 @@ END // Dialog // -#define STR_PREFERENCES "Beállítások" -#define STR_SND_GAIN "Hangerőszabályzó" -#define STR_NEW_FLOPPY "Új képfájl létrehozása" -#define STR_CONFIG "Konfigurálás" -#define STR_SPECIFY_DIM "Főablak méreteinek megadása" +#define STR_PREFERENCES "Beállítások" +#define STR_SND_GAIN "Hangerőszabályzó" +#define STR_NEW_FLOPPY "Új képfájl létrehozása" +#define STR_CONFIG "Konfigurálás" +#define STR_SPECIFY_DIM "Főablak méreteinek megadása" -#define STR_OK "OK" -#define STR_CANCEL "Mégse" -#define STR_GLOBAL "Beállítások mentése &globális alapértékként" -#define STR_DEFAULT "&Alapértelmezett" -#define STR_LANGUAGE "Nyelv:" -#define STR_ICONSET "Ikonkészlet:" +#define STR_OK "OK" +#define STR_CANCEL "Mégse" +#define STR_GLOBAL "Beállítások mentése &globális alapértékként" +#define STR_DEFAULT "&Alapértelmezett" +#define STR_LANGUAGE "Nyelv:" +#define STR_ICONSET "Ikonkészlet:" -#define STR_GAIN "Hangerő" +#define STR_GAIN "Hangerő" -#define STR_FILE_NAME "Fájlnév:" -#define STR_DISK_SIZE "Méret:" -#define STR_RPM_MODE "RPM-mód:" -#define STR_PROGRESS "Folyamat:" +#define STR_FILE_NAME "Fájlnév:" +#define STR_DISK_SIZE "Méret:" +#define STR_RPM_MODE "RPM-mód:" +#define STR_PROGRESS "Folyamat:" -#define STR_WIDTH "Szélesség:" -#define STR_HEIGHT "Magasság:" -#define STR_LOCK_TO_SIZE "Rögzítés a megadott méretre" +#define STR_WIDTH "Szélesség:" +#define STR_HEIGHT "Magasság:" +#define STR_LOCK_TO_SIZE "Rögzítés a megadott méretre" -#define STR_MACHINE_TYPE "Géptípus:" -#define STR_MACHINE "Számítógép:" -#define STR_CONFIGURE "Beállítások..." -#define STR_CPU_TYPE "Processzor:" -#define STR_CPU_SPEED "Seb.:" -#define STR_FPU "FPU-egység:" -#define STR_WAIT_STATES "Várak. ciklusok:" -#define STR_MB "MB" -#define STR_MEMORY "Memória:" -#define STR_TIME_SYNC "Idő szinkronizáció" -#define STR_DISABLED "Letiltva" -#define STR_ENABLED_LOCAL "Engedélyezve (helyi idő)" -#define STR_ENABLED_UTC "Engedélyezve (UTC)" -#define STR_DYNAREC "Dinamikus újrafordítás" +#define STR_MACHINE_TYPE "Géptípus:" +#define STR_MACHINE "Számítógép:" +#define STR_CONFIGURE "Beállítások..." +#define STR_CPU_TYPE "Processzor:" +#define STR_CPU_SPEED "Seb.:" +#define STR_FPU "FPU-egység:" +#define STR_WAIT_STATES "Várak. ciklusok:" +#define STR_MB "MB" +#define STR_MEMORY "Memória:" +#define STR_TIME_SYNC "Idő szinkronizáció" +#define STR_DISABLED "Letiltva" +#define STR_ENABLED_LOCAL "Engedélyezve (helyi idő)" +#define STR_ENABLED_UTC "Engedélyezve (UTC)" +#define STR_DYNAREC "Dinamikus újrafordítás" -#define STR_VIDEO "Videokártya:" -#define STR_VIDEO_2 "Videokártya 2:" -#define STR_VOODOO "Voodoo-gyorsítókártya" -#define STR_IBM8514 "IBM 8514/a-gyorsítókártya" -#define STR_XGA "XGA-gyorsítókártya" +#define STR_VIDEO "Videokártya:" +#define STR_VIDEO_2 "Videokártya 2:" +#define STR_VOODOO "Voodoo-gyorsítókártya" +#define STR_IBM8514 "IBM 8514/a-gyorsítókártya" +#define STR_XGA "XGA-gyorsítókártya" -#define STR_MOUSE "Egér:" -#define STR_JOYSTICK "Játékvezérlő:" -#define STR_JOY1 "Játékvez. 1..." -#define STR_JOY2 "Játékvez. 2..." -#define STR_JOY3 "Játékvez. 3..." -#define STR_JOY4 "Játékvez. 4..." +#define STR_MOUSE "Egér:" +#define STR_JOYSTICK "Játékvezérlő:" +#define STR_JOY1 "Játékvez. 1..." +#define STR_JOY2 "Játékvez. 2..." +#define STR_JOY3 "Játékvez. 3..." +#define STR_JOY4 "Játékvez. 4..." -#define STR_SOUND1 "Hangkártya 1:" -#define STR_SOUND2 "Hangkártya 2:" -#define STR_SOUND3 "Hangkártya 3:" -#define STR_SOUND4 "Hangkártya 4:" -#define STR_MIDI_OUT "MIDI-kimenet:" -#define STR_MIDI_IN "MIDI-bemenet:" -#define STR_MPU401 "Különálló MPU-401" -#define STR_FLOAT "FLOAT32 használata" -#define STR_FM_DRIVER "FM szintetizátor meghajtó" -#define STR_FM_DRV_NUKED "Nuked (pontosabb)" -#define STR_FM_DRV_YMFM "YMFM (gyorsabb)" +#define STR_SOUND1 "Hangkártya 1:" +#define STR_SOUND2 "Hangkártya 2:" +#define STR_SOUND3 "Hangkártya 3:" +#define STR_SOUND4 "Hangkártya 4:" +#define STR_MIDI_OUT "MIDI-kimenet:" +#define STR_MIDI_IN "MIDI-bemenet:" +#define STR_MPU401 "Különálló MPU-401" +#define STR_FLOAT "FLOAT32 használata" +#define STR_FM_DRIVER "FM szintetizátor meghajtó" +#define STR_FM_DRV_NUKED "Nuked (pontosabb)" +#define STR_FM_DRV_YMFM "YMFM (gyorsabb)" -#define STR_NET_TYPE "Hálózati típusa:" -#define STR_PCAP "PCap eszköz:" -#define STR_NET "Hálózati kártya:" -#define STR_NET1 "Network card 1:" -#define STR_NET2 "Network card 2:" -#define STR_NET3 "Network card 3:" -#define STR_NET4 "Network card 4:" +#define STR_NET_TYPE "Hálózati típusa:" +#define STR_PCAP "PCap eszköz:" +#define STR_NET "Hálózati kártya:" +#define STR_NET1 "Network card 1:" +#define STR_NET2 "Network card 2:" +#define STR_NET3 "Network card 3:" +#define STR_NET4 "Network card 4:" -#define STR_COM1 "COM1 eszköz:" -#define STR_COM2 "COM2 eszköz:" -#define STR_COM3 "COM3 eszköz:" -#define STR_COM4 "COM4 eszköz:" -#define STR_LPT1 "LPT1 eszköz:" -#define STR_LPT2 "LPT2 eszköz:" -#define STR_LPT3 "LPT3 eszköz:" -#define STR_LPT4 "LPT4 eszköz:" -#define STR_SERIAL1 "Soros port 1" -#define STR_SERIAL2 "Soros port 2" -#define STR_SERIAL3 "Soros port 3" -#define STR_SERIAL4 "Soros port 4" -#define STR_PARALLEL1 "Párhuzamos port 1" -#define STR_PARALLEL2 "Párhuzamos port 2" -#define STR_PARALLEL3 "Párhuzamos port 3" -#define STR_PARALLEL4 "Párhuzamos port 4" -#define STR_SERIAL_PASS1 "Serial port passthrough 1" -#define STR_SERIAL_PASS2 "Serial port passthrough 2" -#define STR_SERIAL_PASS3 "Serial port passthrough 3" -#define STR_SERIAL_PASS4 "Serial port passthrough 4" +#define STR_COM1 "COM1 eszköz:" +#define STR_COM2 "COM2 eszköz:" +#define STR_COM3 "COM3 eszköz:" +#define STR_COM4 "COM4 eszköz:" +#define STR_LPT1 "LPT1 eszköz:" +#define STR_LPT2 "LPT2 eszköz:" +#define STR_LPT3 "LPT3 eszköz:" +#define STR_LPT4 "LPT4 eszköz:" +#define STR_SERIAL1 "Soros port 1" +#define STR_SERIAL2 "Soros port 2" +#define STR_SERIAL3 "Soros port 3" +#define STR_SERIAL4 "Soros port 4" +#define STR_PARALLEL1 "Párhuzamos port 1" +#define STR_PARALLEL2 "Párhuzamos port 2" +#define STR_PARALLEL3 "Párhuzamos port 3" +#define STR_PARALLEL4 "Párhuzamos port 4" +#define STR_SERIAL_PASS1 "Serial port passthrough 1" +#define STR_SERIAL_PASS2 "Serial port passthrough 2" +#define STR_SERIAL_PASS3 "Serial port passthrough 3" +#define STR_SERIAL_PASS4 "Serial port passthrough 4" -#define STR_HDC "Merevl.-vezérlő:" -#define STR_FDC "Floppy-vezérlő:" -#define STR_IDE_TER "Harmadlagos IDE-vezérlő" -#define STR_IDE_QUA "Negyedleges IDE-vezérlő" -#define STR_SCSI "SCSI" -#define STR_SCSI_1 "Gazdaadapt. 1:" -#define STR_SCSI_2 "Gazdaadapt. 2:" -#define STR_SCSI_3 "Gazdaadapt. 3:" -#define STR_SCSI_4 "Gazdaadapt. 4:" -#define STR_CASSETTE "Magnókazetta" +#define STR_HDC "Merevl.-vezérlő:" +#define STR_FDC "Floppy-vezérlő:" +#define STR_IDE_TER "Harmadlagos IDE-vezérlő" +#define STR_IDE_QUA "Negyedleges IDE-vezérlő" +#define STR_SCSI "SCSI" +#define STR_SCSI_1 "Gazdaadapt. 1:" +#define STR_SCSI_2 "Gazdaadapt. 2:" +#define STR_SCSI_3 "Gazdaadapt. 3:" +#define STR_SCSI_4 "Gazdaadapt. 4:" +#define STR_CASSETTE "Magnókazetta" -#define STR_HDD "Merevlemezek:" -#define STR_NEW "&Új..." -#define STR_EXISTING "&Megnyitás..." -#define STR_REMOVE "&Eltávolítás" -#define STR_BUS "Busz:" -#define STR_CHANNEL "Csatorna:" -#define STR_ID "ID:" -#define STR_SPEED "Speed:" +#define STR_HDD "Merevlemezek:" +#define STR_NEW "&Új..." +#define STR_EXISTING "&Megnyitás..." +#define STR_REMOVE "&Eltávolítás" +#define STR_BUS "Busz:" +#define STR_CHANNEL "Csatorna:" +#define STR_ID "ID:" +#define STR_SPEED "Speed:" -#define STR_SPECIFY "&Kiválasztás..." -#define STR_SECTORS "Szektor:" -#define STR_HEADS "Fej:" -#define STR_CYLS "Cilinder:" -#define STR_SIZE_MB "Méret (MB):" -#define STR_TYPE "Típus:" -#define STR_IMG_FORMAT "Formátum:" -#define STR_BLOCK_SIZE "Blokkméret:" +#define STR_SPECIFY "&Kiválasztás..." +#define STR_SECTORS "Szektor:" +#define STR_HEADS "Fej:" +#define STR_CYLS "Cilinder:" +#define STR_SIZE_MB "Méret (MB):" +#define STR_TYPE "Típus:" +#define STR_IMG_FORMAT "Formátum:" +#define STR_BLOCK_SIZE "Blokkméret:" -#define STR_FLOPPY_DRIVES "Floppy-meghajtók:" -#define STR_TURBO "Turbó időzítés" -#define STR_CHECKBPB "BPB ellenőrzés" -#define STR_CDROM_DRIVES "CD-ROM meghajtók:" -#define STR_CD_SPEED "Seb.:" -#define STR_EARLY "Korábbi meghajtó" +#define STR_FLOPPY_DRIVES "Floppy-meghajtók:" +#define STR_TURBO "Turbó időzítés" +#define STR_CHECKBPB "BPB ellenőrzés" +#define STR_CDROM_DRIVES "CD-ROM meghajtók:" +#define STR_CD_SPEED "Seb.:" +#define STR_EARLY "Korábbi meghajtó" -#define STR_MO_DRIVES "MO-meghajtók:" -#define STR_ZIP_DRIVES "ZIP-meghajtók:" -#define STR_250 "ZIP 250" +#define STR_MO_DRIVES "MO-meghajtók:" +#define STR_ZIP_DRIVES "ZIP-meghajtók:" +#define STR_250 "ZIP 250" -#define STR_ISARTC "ISA RTC (óra):" -#define STR_ISAMEM "ISA memóriabővítők" -#define STR_ISAMEM_1 "Kártya 1:" -#define STR_ISAMEM_2 "Kártya 2:" -#define STR_ISAMEM_3 "Kártya 3:" -#define STR_ISAMEM_4 "Kártya 4:" -#define STR_BUGGER "ISABugger eszköz" -#define STR_POSTCARD "POST kártya" +#define STR_ISARTC "ISA RTC (óra):" +#define STR_ISAMEM "ISA memóriabővítők" +#define STR_ISAMEM_1 "Kártya 1:" +#define STR_ISAMEM_2 "Kártya 2:" +#define STR_ISAMEM_3 "Kártya 3:" +#define STR_ISAMEM_4 "Kártya 4:" +#define STR_BUGGER "ISABugger eszköz" +#define STR_POSTCARD "POST kártya" -#define FONT_SIZE 9 -#define FONT_NAME "Segoe UI" +#define FONT_SIZE 9 +#define FONT_NAME "Segoe UI" #include "dialogs.rc" @@ -399,148 +399,148 @@ END STRINGTABLE DISCARDABLE BEGIN - 2048 "86Box" - IDS_2049 "Hiba" - IDS_2050 "Végzetes hiba" - IDS_2051 " - PAUSED" - IDS_2052 "Használja a Ctrl+Alt+PgDn gombokat az ablakhoz való visszatéréshez." - IDS_2053 "Sebesség" - IDS_2054 "ZIP %03i %i (%s): %ls" - IDS_2055 "ZIP-lemezképek (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" - IDS_2056 "A 86Box nem talált használható ROM-képeket\n\nKérem töltse le a ROM készletet és bontsa ki a ""roms"" könyvtárba." - IDS_2057 "(üres)" - IDS_2058 "ZIP-lemezképek (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0Minden fájl (*.*)\0*.*\0" - IDS_2059 "Turbó" - IDS_2060 "Bekapcsolva" - IDS_2061 "Kikapcsolva" - IDS_2062 "Minden képfájl (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0Alapvető szektor képfájlok (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Felületi képfájlok (*.86F)\0*.86F\0" - IDS_2063 "A számítógép ""%hs"" nem elérhető a ""roms/machines"" mappából hiányzó ROM-képek miatt. Ehelyett egy másik gép kerül futtatásra." + 2048 "86Box" + IDS_2049 "Hiba" + IDS_2050 "Végzetes hiba" + IDS_2051 " - PAUSED" + IDS_2052 "Használja a Ctrl+Alt+PgDn gombokat az ablakhoz való visszatéréshez." + IDS_2053 "Sebesség" + IDS_2054 "ZIP %03i %i (%s): %ls" + IDS_2055 "ZIP-lemezképek (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" + IDS_2056 "A 86Box nem talált használható ROM-képeket\n\nKérem töltse le a ROM készletet és bontsa ki a ""roms"" könyvtárba." + IDS_2057 "(üres)" + IDS_2058 "ZIP-lemezképek (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0Minden fájl (*.*)\0*.*\0" + IDS_2059 "Turbó" + IDS_2060 "Bekapcsolva" + IDS_2061 "Kikapcsolva" + IDS_2062 "Minden képfájl (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0Alapvető szektor képfájlok (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Felületi képfájlok (*.86F)\0*.86F\0" + IDS_2063 "A számítógép ""%hs"" nem elérhető a ""roms/machines"" mappából hiányzó ROM-képek miatt. Ehelyett egy másik gép kerül futtatásra." END STRINGTABLE DISCARDABLE BEGIN - IDS_2064 "A videokártya ""%hs"" nem elérhető a ""roms/video"" mappából hiányzó ROM-képek miatt. Ehelyett egy másik kártya kerül futtatásra." - IDS_2065 "Számítógép" - IDS_2066 "Megjelenítő" - IDS_2067 "Beviteli eszközök" - IDS_2068 "Hang" - IDS_2069 "Hálózat" - IDS_2070 "Portok (COM és LPT)" - IDS_2071 "Tárolóvezérlők" - IDS_2072 "Merevlemezek" - IDS_2073 "Floppy és CD-ROM meghajtók" - IDS_2074 "Egyéb cserélhető tárolók" - IDS_2075 "Egyéb perifériák" - IDS_2076 "Felületi képfájlok (*.86F)\0*.86F\0" - IDS_2077 "Kattintson az egér elfogásához" - IDS_2078 "Nyomja meg az F8+F12-t az egér elengédéséhez" - IDS_2079 "Nyomja meg az F8+F12-t vagy a középső gombot az egér elengédéséhez" + IDS_2064 "A videokártya ""%hs"" nem elérhető a ""roms/video"" mappából hiányzó ROM-képek miatt. Ehelyett egy másik kártya kerül futtatásra." + IDS_2065 "Számítógép" + IDS_2066 "Megjelenítő" + IDS_2067 "Beviteli eszközök" + IDS_2068 "Hang" + IDS_2069 "Hálózat" + IDS_2070 "Portok (COM és LPT)" + IDS_2071 "Tárolóvezérlők" + IDS_2072 "Merevlemezek" + IDS_2073 "Floppy és CD-ROM meghajtók" + IDS_2074 "Egyéb cserélhető tárolók" + IDS_2075 "Egyéb perifériák" + IDS_2076 "Felületi képfájlok (*.86F)\0*.86F\0" + IDS_2077 "Kattintson az egér elfogásához" + IDS_2078 "Nyomja meg az F8+F12-t az egér elengédéséhez" + IDS_2079 "Nyomja meg az F8+F12-t vagy a középső gombot az egér elengédéséhez" END STRINGTABLE DISCARDABLE BEGIN - IDS_2080 "Nem sikerült a FluidSynth inicializálása" - IDS_2081 "Busz" - IDS_2082 "Fájl" - IDS_2083 "C" - IDS_2084 "H" - IDS_2085 "S" - IDS_2086 "MB" + IDS_2080 "Nem sikerült a FluidSynth inicializálása" + IDS_2081 "Busz" + IDS_2082 "Fájl" + IDS_2083 "C" + IDS_2084 "H" + IDS_2085 "S" + IDS_2086 "MB" IDS_2087 "Speed" - IDS_2088 "BPB ellenőrzése" - IDS_2089 "KB" - IDS_2090 "Nem sikerült inicializálni a videó megjelenítőt." - IDS_2091 "Alapértelmezett" - IDS_2092 "%i várakozási ciklus(ok)" - IDS_2093 "Típus" - IDS_2094 "Nem sikerült a PCap beállítása" - IDS_2095 "Nem találhatóak PCap eszközök" - IDS_2096 "Érvénytelen PCap eszköz" - IDS_2097 "Szabványos 2-gombos játékvezérlő(k)" - IDS_2098 "Szabványos 4-gombos játékvezérlő" - IDS_2099 "Szabványos 6-gombos játékvezérlő" - IDS_2100 "Szabványos 8-gombos játékvezérlő" - IDS_2101 "CH Flightstick Pro" - IDS_2102 "Microsoft SideWinder Pad" - IDS_2103 "Thrustmaster Flight Control System" - IDS_2104 "Nincs" - IDS_2105 "Nem lehet betölteni a billentyűzetgyorsítókat." - IDS_2106 "A közvetlen nyers bevitel regisztrálása nem sikerült." - IDS_2107 "%u" - IDS_2108 "%u MB (CHS: %i, %i, %i)" - IDS_2109 "Floppy %i (%s): %ls" - IDS_2110 "Minden képfájl (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Továbbfejlesztett szektor képek (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Alapvető szektor képek (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Flux képekfájlok (*.FDI)\0*.FDI\0Felületi képfájlok (*.86F;*.MFM)\0*.86F;*.MFM\0Minden fájl (*.*)\0*.*\0" - IDS_2111 "A FreeType inicializálása nem lehetséges" - IDS_2112 "Az SDL inicializálása nem lehetséges, az SDL2.dll fájl szükséges" - IDS_2113 "Biztosan szeretné újraindítani az emulált gépet?" - IDS_2114 "Biztos benne, hogy ki szeretne lépni a 86Box-ból?" - IDS_2115 "Nem sikerült inicializálni a Ghostscript-et" - IDS_2116 "MO %i (%ls): %ls" - IDS_2117 "MO-képfájlok (*.IM?;*.MDI)\0*.IM?;*.MDI\0Minden fájl (*.*)\0*.*\0" - IDS_2118 "Üdvözli önt az 86Box!" - IDS_2119 "Integrált vezérlő" - IDS_2120 "Kilépés" - IDS_2121 "Nem találhatóak meg a ROM-képek" - IDS_2122 "Szeretné menteni a beállításokat?" - IDS_2123 "Ezzel hardveresen újraindítja az emulált gépet." - IDS_2124 "Mentés" - IDS_2125 "A 86Box névjegye" - IDS_2126 "86Box v" EMU_VERSION - IDS_2127 "Régi számítógépek emulátora\n\nFejlesztők: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, Tiseno100, reenigne, leilei, JohnElliott, greatpsycho, and others.\n\nFordította: Laci bá'\n\nMegjelent a GNU General Public License v2 vagy újabb alatt. További információért lásd a LICENSE fájlt." - IDS_2128 "OK" - IDS_2129 "Hardver nem elérhető" + IDS_2088 "BPB ellenőrzése" + IDS_2089 "KB" + IDS_2090 "Nem sikerült inicializálni a videó megjelenítőt." + IDS_2091 "Alapértelmezett" + IDS_2092 "%i várakozási ciklus(ok)" + IDS_2093 "Típus" + IDS_2094 "Nem sikerült a PCap beállítása" + IDS_2095 "Nem találhatóak PCap eszközök" + IDS_2096 "Érvénytelen PCap eszköz" + IDS_2097 "Szabványos 2-gombos játékvezérlő(k)" + IDS_2098 "Szabványos 4-gombos játékvezérlő" + IDS_2099 "Szabványos 6-gombos játékvezérlő" + IDS_2100 "Szabványos 8-gombos játékvezérlő" + IDS_2101 "CH Flightstick Pro" + IDS_2102 "Microsoft SideWinder Pad" + IDS_2103 "Thrustmaster Flight Control System" + IDS_2104 "Nincs" + IDS_2105 "Nem lehet betölteni a billentyűzetgyorsítókat." + IDS_2106 "A közvetlen nyers bevitel regisztrálása nem sikerült." + IDS_2107 "%u" + IDS_2108 "%u MB (CHS: %i, %i, %i)" + IDS_2109 "Floppy %i (%s): %ls" + IDS_2110 "Minden képfájl (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Továbbfejlesztett szektor képek (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Alapvető szektor képek (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Flux képekfájlok (*.FDI)\0*.FDI\0Felületi képfájlok (*.86F;*.MFM)\0*.86F;*.MFM\0Minden fájl (*.*)\0*.*\0" + IDS_2111 "A FreeType inicializálása nem lehetséges" + IDS_2112 "Az SDL inicializálása nem lehetséges, az SDL2.dll fájl szükséges" + IDS_2113 "Biztosan szeretné újraindítani az emulált gépet?" + IDS_2114 "Biztos benne, hogy ki szeretne lépni a 86Box-ból?" + IDS_2115 "Nem sikerült inicializálni a Ghostscript-et" + IDS_2116 "MO %i (%ls): %ls" + IDS_2117 "MO-képfájlok (*.IM?;*.MDI)\0*.IM?;*.MDI\0Minden fájl (*.*)\0*.*\0" + IDS_2118 "Üdvözli önt az 86Box!" + IDS_2119 "Integrált vezérlő" + IDS_2120 "Kilépés" + IDS_2121 "Nem találhatóak meg a ROM-képek" + IDS_2122 "Szeretné menteni a beállításokat?" + IDS_2123 "Ezzel hardveresen újraindítja az emulált gépet." + IDS_2124 "Mentés" + IDS_2125 "A 86Box névjegye" + IDS_2126 "86Box v" EMU_VERSION + IDS_2127 "Régi számítógépek emulátora\n\nFejlesztők: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, Tiseno100, reenigne, leilei, JohnElliott, greatpsycho, and others.\n\nFordította: Laci bá'\n\nMegjelent a GNU General Public License v2 vagy újabb alatt. További információért lásd a LICENSE fájlt." + IDS_2128 "OK" + IDS_2129 "Hardver nem elérhető" #ifdef _WIN32 #define LIB_NAME_PCAP "WinPcap" #else #define LIB_NAME_PCAP "libpcap" #endif - IDS_2130 "Győződjön meg hogy a(z) " LIB_NAME_PCAP " telepítve van és jelenleg a " LIB_NAME_PCAP "-kompatibilis kapcsolatot használja." - IDS_2131 "Érvénytelen konfiguráció" + IDS_2130 "Győződjön meg hogy a(z) " LIB_NAME_PCAP " telepítve van és jelenleg a " LIB_NAME_PCAP "-kompatibilis kapcsolatot használja." + IDS_2131 "Érvénytelen konfiguráció" #ifdef _WIN32 #define LIB_NAME_FREETYPE "freetype.dll" #else #define LIB_NAME_FREETYPE "libfreetype" #endif - IDS_2132 LIB_NAME_FREETYPE " szükséges az ESC/P nyomtató emulációhoz." + IDS_2132 LIB_NAME_FREETYPE " szükséges az ESC/P nyomtató emulációhoz." #ifdef _WIN32 #define LIB_NAME_GS "gsdll32.dll" #else #define LIB_NAME_GS "libgs" #endif - IDS_2133 LIB_NAME_GS " szükséges a PostScript fájlok PDF formátumba való automatikus konvertálásához.\n\nAz általános PostScript nyomtatóra küldött dokumentumok PostScript (.ps) fájlként kerülnek mentésre." + IDS_2133 LIB_NAME_GS " szükséges a PostScript fájlok PDF formátumba való automatikus konvertálásához.\n\nAz általános PostScript nyomtatóra küldött dokumentumok PostScript (.ps) fájlként kerülnek mentésre." #ifdef _WIN32 #define LIB_NAME_FLUIDSYNTH "libfluidsynth.dll" #else #define LIB_NAME_FLUIDSYNTH "libfluidsynth" #endif - IDS_2134 LIB_NAME_FLUIDSYNTH " szükséges a FluidSynth MIDI kimenethez." - IDS_2135 "Teljes képernyős módra váltás" - IDS_2136 "Ne jelenítse meg újra ezt az üzenetet " - IDS_2137 "Ne lépjen ki" - IDS_2138 "Újraindítás" - IDS_2139 "Ne indítsa újra" - IDS_2140 "MO-képfájlok (*.IM?;*.MDI)\0*.IM?;*.MDI\0Minden fájl (*.*)\0*.*\0" - IDS_2141 "CD-ROM-képek (*.ISO;*.CUE)\0*.ISO;*.CUE\0Minden fájl (*.*)\0*.*\0" - IDS_2142 "%hs eszközkonfiguráció" + IDS_2134 LIB_NAME_FLUIDSYNTH " szükséges a FluidSynth MIDI kimenethez." + IDS_2135 "Teljes képernyős módra váltás" + IDS_2136 "Ne jelenítse meg újra ezt az üzenetet " + IDS_2137 "Ne lépjen ki" + IDS_2138 "Újraindítás" + IDS_2139 "Ne indítsa újra" + IDS_2140 "MO-képfájlok (*.IM?;*.MDI)\0*.IM?;*.MDI\0Minden fájl (*.*)\0*.*\0" + IDS_2141 "CD-ROM-képek (*.ISO;*.CUE)\0*.ISO;*.CUE\0Minden fájl (*.*)\0*.*\0" + IDS_2142 "%hs eszközkonfiguráció" IDS_2143 "Képernyő alvó módban" - IDS_2144 "OpenGL Shaderek (*.GLSL)\0*.GLSL\0Minden fájl (*.*)\0*.*\0" - IDS_2145 "OpenGL beállítások" - IDS_2146 "Egy nem támogatott konfigurációt tölt be" - IDS_2147 "A kiválasztott gépen alapuló CPU-típusszűrés le van tiltva ezen az emulált gépen.\n\nEz lehetővé teszi olyan CPU kiválasztását, amely egyébként nem kompatibilis a kiválasztott géppel. Előfordulhat azonban, hogy nem kompatibilis a gép BIOS-ával vagy más szoftverekkel.\n\nA beállítás engedélyezése hivatalosan nem támogatott, és a benyújtott hibajelentéseket érvénytelenként lezárhatjuk." - IDS_2148 "Folytatás" - IDS_2149 "Magnókazetta: %s" - IDS_2150 "Magnókazetta-képek (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Minden fájl (*.*)\0*.*\0" - IDS_2151 "ROM-kazetta %i: %ls" - IDS_2152 "ROM-kazetta képek (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Minden fájl (*.*)\0*.*\0" - IDS_2153 "Hiba történt a renderelő inicializálásakor" - IDS_2154 "Az OpenGL (3.0 Core) megjelenítő-motort nem sikerült inicializálni. Kérem használjon másik renderelőt." - IDS_2155 "Resume execution" - IDS_2156 "Pause execution" - IDS_2157 "Press Ctrl+Alt+Del" - IDS_2158 "Press Ctrl+Alt+Esc" - IDS_2159 "Hard reset" - IDS_2160 "ACPI shutdown" - IDS_2161 "Settings" + IDS_2144 "OpenGL Shaderek (*.GLSL)\0*.GLSL\0Minden fájl (*.*)\0*.*\0" + IDS_2145 "OpenGL beállítások" + IDS_2146 "Egy nem támogatott konfigurációt tölt be" + IDS_2147 "A kiválasztott gépen alapuló CPU-típusszűrés le van tiltva ezen az emulált gépen.\n\nEz lehetővé teszi olyan CPU kiválasztását, amely egyébként nem kompatibilis a kiválasztott géppel. Előfordulhat azonban, hogy nem kompatibilis a gép BIOS-ával vagy más szoftverekkel.\n\nA beállítás engedélyezése hivatalosan nem támogatott, és a benyújtott hibajelentéseket érvénytelenként lezárhatjuk." + IDS_2148 "Folytatás" + IDS_2149 "Magnókazetta: %s" + IDS_2150 "Magnókazetta-képek (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Minden fájl (*.*)\0*.*\0" + IDS_2151 "ROM-kazetta %i: %ls" + IDS_2152 "ROM-kazetta képek (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Minden fájl (*.*)\0*.*\0" + IDS_2153 "Hiba történt a renderelő inicializálásakor" + IDS_2154 "Az OpenGL (3.0 Core) megjelenítő-motort nem sikerült inicializálni. Kérem használjon másik renderelőt." + IDS_2155 "Resume execution" + IDS_2156 "Pause execution" + IDS_2157 "Press Ctrl+Alt+Del" + IDS_2158 "Press Ctrl+Alt+Esc" + IDS_2159 "Hard reset" + IDS_2160 "ACPI shutdown" + IDS_2161 "Settings" IDS_2162 "Korábbi meghajtó" IDS_2163 "No Dynarec" IDS_2164 "Old Dynarec" @@ -551,45 +551,45 @@ END STRINGTABLE DISCARDABLE BEGIN IDS_4096 "Merevlemez (%s)" - IDS_4097 "%01i:%01i" - IDS_4098 "%01i" - IDS_4099 "MFM/RLL vagy ESDI CD-ROM meghajtók soha nem léteztek" - IDS_4100 "Egyéni..." - IDS_4101 "Egyéni (nagy)..." - IDS_4102 "Új merevlemez hozzáadása" - IDS_4103 "Meglévő merevlemez hozzáadása" - IDS_4104 "A HDI lemezképek nem lehetnek nagyobbak 4 GB-nál." - IDS_4105 "A lemezképek mérete nem haladhatja meg a 127 GB-ot." - IDS_4106 "Merevlemez-képfájlok (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0Minden fájl (*.*)\0*.*\0" - IDS_4107 "A fájl nem olvasható" - IDS_4108 "A fájl nem írható" - IDS_4109 "Az 512-től eltérő szektorméretű HDI vagy HDX képek nem támogatottak." - IDS_4110 "Az USB még nem támogatott" - IDS_4111 "A lemezképfájl már létezik" - IDS_4112 "Adjon meg egy érvényes fájlnevet." - IDS_4113 "A lemezképfájl létrehozásra került" - IDS_4114 "Győződjön meg arról, hogy a fájl létezik és olvasható." - IDS_4115 "Győződjön meg arról, hogy a fájlt egy írható könyvtárba menti." - IDS_4116 "A lemezképfájl túl nagy" - IDS_4117 "Ne felejtse el particionálni és formázni az újonnan létrehozott meghajtót." - IDS_4118 "A kiválasztott fájl felülírásra kerül. Biztos, hogy ezt kívánja használni?" - IDS_4119 "Nem támogatott lemezkép" - IDS_4120 "Felülírás" - IDS_4121 "Ne írja felül" - IDS_4122 "Nyers lemezkép (.img)" - IDS_4123 "HDI-lemezkép (.hdi)" - IDS_4124 "HDX-lemezkép (.hdx)" - IDS_4125 "Rögzített méretű VHD (.vhd)" - IDS_4126 "Dinamikusan bővülő VHD (.vhd)" - IDS_4127 "Különbség-VHD (.vhd)" - IDS_4128 "Nagy blokkméret (2 MB)" - IDS_4129 "Kis blokkméret (512 KB)" - IDS_4130 "VHD fájlok (*.VHD)\0*.VHD\0Minden fájl (*.*)\0*.*\0" - IDS_4131 "Válassza ki a szülő VHD-t" - IDS_4132 "Ez azt jelentheti, hogy a szülőkép módosult az eltérő kép létrehozása után.\n\nEz akkor is előfordulhat, ha a képfájlokat áthelyezték vagy másolták, vagy a lemezt létrehozó program hibája miatt.\n\nSzeretné kijavítani az időbélyegeket?" - IDS_4133 "A szülő- és a gyermeklemez időbélyegei nem egyeznek" - IDS_4134 "Nem sikerült kijavítani a VHD időbélyegét." - IDS_4135 "%01i:%02i" + IDS_4097 "%01i:%01i" + IDS_4098 "%01i" + IDS_4099 "MFM/RLL vagy ESDI CD-ROM meghajtók soha nem léteztek" + IDS_4100 "Egyéni..." + IDS_4101 "Egyéni (nagy)..." + IDS_4102 "Új merevlemez hozzáadása" + IDS_4103 "Meglévő merevlemez hozzáadása" + IDS_4104 "A HDI lemezképek nem lehetnek nagyobbak 4 GB-nál." + IDS_4105 "A lemezképek mérete nem haladhatja meg a 127 GB-ot." + IDS_4106 "Merevlemez-képfájlok (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0Minden fájl (*.*)\0*.*\0" + IDS_4107 "A fájl nem olvasható" + IDS_4108 "A fájl nem írható" + IDS_4109 "Az 512-től eltérő szektorméretű HDI vagy HDX képek nem támogatottak." + IDS_4110 "Az USB még nem támogatott" + IDS_4111 "A lemezképfájl már létezik" + IDS_4112 "Adjon meg egy érvényes fájlnevet." + IDS_4113 "A lemezképfájl létrehozásra került" + IDS_4114 "Győződjön meg arról, hogy a fájl létezik és olvasható." + IDS_4115 "Győződjön meg arról, hogy a fájlt egy írható könyvtárba menti." + IDS_4116 "A lemezképfájl túl nagy" + IDS_4117 "Ne felejtse el particionálni és formázni az újonnan létrehozott meghajtót." + IDS_4118 "A kiválasztott fájl felülírásra kerül. Biztos, hogy ezt kívánja használni?" + IDS_4119 "Nem támogatott lemezkép" + IDS_4120 "Felülírás" + IDS_4121 "Ne írja felül" + IDS_4122 "Nyers lemezkép (.img)" + IDS_4123 "HDI-lemezkép (.hdi)" + IDS_4124 "HDX-lemezkép (.hdx)" + IDS_4125 "Rögzített méretű VHD (.vhd)" + IDS_4126 "Dinamikusan bővülő VHD (.vhd)" + IDS_4127 "Különbség-VHD (.vhd)" + IDS_4128 "Nagy blokkméret (2 MB)" + IDS_4129 "Kis blokkméret (512 KB)" + IDS_4130 "VHD fájlok (*.VHD)\0*.VHD\0Minden fájl (*.*)\0*.*\0" + IDS_4131 "Válassza ki a szülő VHD-t" + IDS_4132 "Ez azt jelentheti, hogy a szülőkép módosult az eltérő kép létrehozása után.\n\nEz akkor is előfordulhat, ha a képfájlokat áthelyezték vagy másolták, vagy a lemezt létrehozó program hibája miatt.\n\nSzeretné kijavítani az időbélyegeket?" + IDS_4133 "A szülő- és a gyermeklemez időbélyegei nem egyeznek" + IDS_4134 "Nem sikerült kijavítani a VHD időbélyegét." + IDS_4135 "%01i:%02i" IDS_4352 "MFM/RLL" IDS_4353 "XTA" @@ -598,56 +598,56 @@ BEGIN IDS_4356 "ATAPI" IDS_4357 "SCSI" - IDS_4608 "MFM/RLL (%01i:%01i)" - IDS_4609 "XTA (%01i:%01i)" - IDS_4610 "ESDI (%01i:%01i)" - IDS_4611 "IDE (%01i:%01i)" - IDS_4612 "ATAPI (%01i:%01i)" - IDS_4613 "SCSI (%01i:%02i)" + IDS_4608 "MFM/RLL (%01i:%01i)" + IDS_4609 "XTA (%01i:%01i)" + IDS_4610 "ESDI (%01i:%01i)" + IDS_4611 "IDE (%01i:%01i)" + IDS_4612 "ATAPI (%01i:%01i)" + IDS_4613 "SCSI (%01i:%02i)" - IDS_5120 "CD-ROM %i (%s): %s" + IDS_5120 "CD-ROM %i (%s): %s" - IDS_5376 "Letiltva" - IDS_5381 "ATAPI" + IDS_5376 "Letiltva" + IDS_5381 "ATAPI" IDS_5382 "SCSI" - IDS_5632 "Letiltva" - IDS_5637 "ATAPI (%01i:%01i)" + IDS_5632 "Letiltva" + IDS_5637 "ATAPI (%01i:%01i)" IDS_5638 "SCSI (%01i:%02i)" - IDS_5888 "160 kB" - IDS_5889 "180 kB" - IDS_5890 "320 kB" - IDS_5891 "360 kB" - IDS_5892 "640 kB" - IDS_5893 "720 kB" - IDS_5894 "1.2 MB" - IDS_5895 "1.25 MB" - IDS_5896 "1.44 MB" - IDS_5897 "DMF (1024 klaszter)" - IDS_5898 "DMF (2048 klaszter)" - IDS_5899 "2.88 MB" - IDS_5900 "ZIP 100" - IDS_5901 "ZIP 250" - IDS_5902 "3.5"" 128 MB (ISO 10090)" - IDS_5903 "3.5"" 230 MB (ISO 13963)" - IDS_5904 "3.5"" 540 MB (ISO 15498)" - IDS_5905 "3.5"" 640 MB (ISO 15498)" - IDS_5906 "3.5"" 1.3 GB (GigaMO)" - IDS_5907 "3.5"" 2.3 GB (GigaMO 2)" - IDS_5908 "5.25"" 600 MB" - IDS_5909 "5.25"" 650 MB" - IDS_5910 "5.25"" 1 GB" - IDS_5911 "5.25"" 1.3 GB" + IDS_5888 "160 kB" + IDS_5889 "180 kB" + IDS_5890 "320 kB" + IDS_5891 "360 kB" + IDS_5892 "640 kB" + IDS_5893 "720 kB" + IDS_5894 "1.2 MB" + IDS_5895 "1.25 MB" + IDS_5896 "1.44 MB" + IDS_5897 "DMF (1024 klaszter)" + IDS_5898 "DMF (2048 klaszter)" + IDS_5899 "2.88 MB" + IDS_5900 "ZIP 100" + IDS_5901 "ZIP 250" + IDS_5902 "3.5"" 128 MB (ISO 10090)" + IDS_5903 "3.5"" 230 MB (ISO 13963)" + IDS_5904 "3.5"" 540 MB (ISO 15498)" + IDS_5905 "3.5"" 640 MB (ISO 15498)" + IDS_5906 "3.5"" 1.3 GB (GigaMO)" + IDS_5907 "3.5"" 2.3 GB (GigaMO 2)" + IDS_5908 "5.25"" 600 MB" + IDS_5909 "5.25"" 650 MB" + IDS_5910 "5.25"" 1 GB" + IDS_5911 "5.25"" 1.3 GB" - IDS_6144 "Tökéletes RPM" - IDS_6145 "1%-kal a tökéletes RPM alatt" - IDS_6146 "1.5%-kal a tökéletes RPM alatt" - IDS_6147 "2%-kal a tökéletes RPM alatt" + IDS_6144 "Tökéletes RPM" + IDS_6145 "1%-kal a tökéletes RPM alatt" + IDS_6146 "1.5%-kal a tökéletes RPM alatt" + IDS_6147 "2%-kal a tökéletes RPM alatt" - IDS_7168 "(A rendszer nyelve)" + IDS_7168 "(A rendszer nyelve)" END -#define IDS_LANG_ENUS IDS_7168 +#define IDS_LANG_ENUS IDS_7168 // Hungarian resources ///////////////////////////////////////////////////////////////////////////// diff --git a/src/win/languages/it-IT.rc b/src/win/languages/it-IT.rc index 60a09d150..ce2d23262 100644 --- a/src/win/languages/it-IT.rc +++ b/src/win/languages/it-IT.rc @@ -18,13 +18,13 @@ MainMenu MENU DISCARDABLE BEGIN POPUP "&Azione" BEGIN - MENUITEM "&Tastiera richiede la cattura", IDM_ACTION_KBD_REQ_CAPTURE - MENUITEM "&CTRL destro è ALT sinistro", IDM_ACTION_RCTRL_IS_LALT + MENUITEM "&Tastiera richiede la cattura", IDM_ACTION_KBD_REQ_CAPTURE + MENUITEM "&CTRL destro è ALT sinistro", IDM_ACTION_RCTRL_IS_LALT MENUITEM SEPARATOR MENUITEM "&Riavvia...", IDM_ACTION_HRESET MENUITEM "&Ctrl+Alt+Del\tCtrl+F12", IDM_ACTION_RESET_CAD MENUITEM SEPARATOR - MENUITEM "Ctrl+Alt+&Esc", IDM_ACTION_CTRL_ALT_ESC + MENUITEM "Ctrl+Alt+&Esc", IDM_ACTION_CTRL_ALT_ESC MENUITEM SEPARATOR MENUITEM "&Pausa", IDM_ACTION_PAUSE MENUITEM SEPARATOR @@ -32,8 +32,8 @@ BEGIN END POPUP "&Visualizza" BEGIN - MENUITEM "&Nascondi barra di stato", IDM_VID_HIDE_STATUS_BAR - MENUITEM "Hide &toolbar", IDM_VID_HIDE_TOOLBAR + MENUITEM "&Nascondi barra di stato", IDM_VID_HIDE_STATUS_BAR + MENUITEM "Hide &toolbar", IDM_VID_HIDE_TOOLBAR MENUITEM SEPARATOR MENUITEM "&Show non-primary monitors", IDM_VID_MONITORS MENUITEM "&Finestra ridimensionabile", IDM_VID_RESIZE @@ -102,11 +102,11 @@ BEGIN MENUITEM "Sovrascansione CGA/PCjr/Tandy/E&GA/(S)VGA", IDM_VID_OVERSCAN MENUITEM "Cambia il contrasto per &display monocromatici", IDM_VID_CGACON END - MENUITEM "&Dispositivi", IDM_MEDIA + MENUITEM "&Dispositivi", IDM_MEDIA POPUP "&Strumenti" BEGIN MENUITEM "&Impostazioni...", IDM_CONFIG - MENUITEM "&Aggiorna icone della barra di stato", IDM_UPDATE_ICONS + MENUITEM "&Aggiorna icone della barra di stato", IDM_UPDATE_ICONS MENUITEM SEPARATOR MENUITEM "Cattura schermata\tCtrl+F11", IDM_ACTION_SCREENSHOT MENUITEM SEPARATOR @@ -138,17 +138,17 @@ CassetteSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Nuova immagine...", IDM_CASSETTE_IMAGE_NEW + MENUITEM "&Nuova immagine...", IDM_CASSETTE_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&Immagine esistente...", IDM_CASSETTE_IMAGE_EXISTING - MENUITEM "Immagine esistente (&protezione contro scrittura)...", IDM_CASSETTE_IMAGE_EXISTING_WP + MENUITEM "&Immagine esistente...", IDM_CASSETTE_IMAGE_EXISTING + MENUITEM "Immagine esistente (&protezione contro scrittura)...", IDM_CASSETTE_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "&Registra", IDM_CASSETTE_RECORD - MENUITEM "R&iproduci", IDM_CASSETTE_PLAY - MENUITEM "Ri&avvolgi all'inizio", IDM_CASSETTE_REWIND - MENUITEM "A&vanti veloce alla fine", IDM_CASSETTE_FAST_FORWARD + MENUITEM "&Registra", IDM_CASSETTE_RECORD + MENUITEM "R&iproduci", IDM_CASSETTE_PLAY + MENUITEM "Ri&avvolgi all'inizio", IDM_CASSETTE_REWIND + MENUITEM "A&vanti veloce alla fine", IDM_CASSETTE_FAST_FORWARD MENUITEM SEPARATOR - MENUITEM "&Espelli", IDM_CASSETTE_EJECT + MENUITEM "&Espelli", IDM_CASSETTE_EJECT END END @@ -156,9 +156,9 @@ CartridgeSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Immagine...", IDM_CARTRIDGE_IMAGE + MENUITEM "&Immagine...", IDM_CARTRIDGE_IMAGE MENUITEM SEPARATOR - MENUITEM "&Espelli", IDM_CARTRIDGE_EJECT + MENUITEM "&Espelli", IDM_CARTRIDGE_EJECT END END @@ -166,14 +166,14 @@ FloppySubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Nuova immagine...", IDM_FLOPPY_IMAGE_NEW + MENUITEM "&Nuova immagine...", IDM_FLOPPY_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&Immagine esistente...", IDM_FLOPPY_IMAGE_EXISTING - MENUITEM "Immagine esistente (&protezione contro scrittura)...", IDM_FLOPPY_IMAGE_EXISTING_WP + MENUITEM "&Immagine esistente...", IDM_FLOPPY_IMAGE_EXISTING + MENUITEM "Immagine esistente (&protezione contro scrittura)...", IDM_FLOPPY_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "E&sporta in 86F...", IDM_FLOPPY_EXPORT_TO_86F + MENUITEM "E&sporta in 86F...", IDM_FLOPPY_EXPORT_TO_86F MENUITEM SEPARATOR - MENUITEM "&Espelli", IDM_FLOPPY_EJECT + MENUITEM "&Espelli", IDM_FLOPPY_EJECT END END @@ -181,13 +181,13 @@ CdromSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Muto", IDM_CDROM_MUTE + MENUITEM "&Muto", IDM_CDROM_MUTE MENUITEM SEPARATOR - MENUITEM "&Espelli", IDM_CDROM_EMPTY - MENUITEM "&Ricarica l'immagine precedente", IDM_CDROM_RELOAD + MENUITEM "&Espelli", IDM_CDROM_EMPTY + MENUITEM "&Ricarica l'immagine precedente", IDM_CDROM_RELOAD MENUITEM SEPARATOR - MENUITEM "&Immagine...", IDM_CDROM_IMAGE - MENUITEM "&Cartella...", IDM_CDROM_DIR + MENUITEM "&Immagine...", IDM_CDROM_IMAGE + MENUITEM "&Cartella...", IDM_CDROM_DIR END END @@ -195,13 +195,13 @@ ZIPSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Nuova immagine...", IDM_ZIP_IMAGE_NEW + MENUITEM "&Nuova immagine...", IDM_ZIP_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&Immagine esistente...", IDM_ZIP_IMAGE_EXISTING - MENUITEM "Immagine esistente (&protezione contro scrittura)...", IDM_ZIP_IMAGE_EXISTING_WP + MENUITEM "&Immagine esistente...", IDM_ZIP_IMAGE_EXISTING + MENUITEM "Immagine esistente (&protezione contro scrittura)...", IDM_ZIP_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "&Espelli", IDM_ZIP_EJECT - MENUITEM "&Ricarica l'immagine precedente", IDM_ZIP_RELOAD + MENUITEM "&Espelli", IDM_ZIP_EJECT + MENUITEM "&Ricarica l'immagine precedente", IDM_ZIP_RELOAD END END @@ -209,13 +209,13 @@ MOSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Nuova immagine...", IDM_MO_IMAGE_NEW + MENUITEM "&Nuova immagine...", IDM_MO_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&Immagine esistente...", IDM_MO_IMAGE_EXISTING - MENUITEM "Immagine esistente (&protezione contro scrittura)...", IDM_MO_IMAGE_EXISTING_WP + MENUITEM "&Immagine esistente...", IDM_MO_IMAGE_EXISTING + MENUITEM "Immagine esistente (&protezione contro scrittura)...", IDM_MO_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "&Espelli", IDM_MO_EJECT - MENUITEM "&Ricarica l'immagine precedente", IDM_MO_RELOAD + MENUITEM "&Espelli", IDM_MO_EJECT + MENUITEM "&Ricarica l'immagine precedente", IDM_MO_RELOAD END END @@ -241,150 +241,150 @@ END // Dialog // -#define STR_PREFERENCES "Preferenze" -#define STR_SND_GAIN "Guadagno del suono" -#define STR_NEW_FLOPPY "Nuova immagine" -#define STR_CONFIG "Impostazioni" -#define STR_SPECIFY_DIM "Specifica dimensioni della finestra principale" +#define STR_PREFERENCES "Preferenze" +#define STR_SND_GAIN "Guadagno del suono" +#define STR_NEW_FLOPPY "Nuova immagine" +#define STR_CONFIG "Impostazioni" +#define STR_SPECIFY_DIM "Specifica dimensioni della finestra principale" -#define STR_OK "OK" -#define STR_CANCEL "Annulla" -#define STR_GLOBAL "Salva queste impostazioni come &predefinite globali" -#define STR_DEFAULT "&Predefinito" -#define STR_LANGUAGE "Lingua:" -#define STR_ICONSET "Pacchetto di icone:" +#define STR_OK "OK" +#define STR_CANCEL "Annulla" +#define STR_GLOBAL "Salva queste impostazioni come &predefinite globali" +#define STR_DEFAULT "&Predefinito" +#define STR_LANGUAGE "Lingua:" +#define STR_ICONSET "Pacchetto di icone:" -#define STR_GAIN "Guadagno" +#define STR_GAIN "Guadagno" -#define STR_FILE_NAME "Nome file:" -#define STR_DISK_SIZE "Dimensioni disco:" -#define STR_RPM_MODE "Modalità RPM:" -#define STR_PROGRESS "Progresso:" +#define STR_FILE_NAME "Nome file:" +#define STR_DISK_SIZE "Dimensioni disco:" +#define STR_RPM_MODE "Modalità RPM:" +#define STR_PROGRESS "Progresso:" -#define STR_WIDTH "Larghezza:" -#define STR_HEIGHT "Altezza:" -#define STR_LOCK_TO_SIZE "Blocca in queste dimensioni" +#define STR_WIDTH "Larghezza:" +#define STR_HEIGHT "Altezza:" +#define STR_LOCK_TO_SIZE "Blocca in queste dimensioni" -#define STR_MACHINE_TYPE "Tipo di piastra madre:" -#define STR_MACHINE "Piastra madre:" -#define STR_CONFIGURE "Configura" -#define STR_CPU_TYPE "Tipo del CPU:" -#define STR_CPU_SPEED "Veloc.:" -#define STR_FPU "FPU:" -#define STR_WAIT_STATES "Stati di attesa:" -#define STR_MB "MB" -#define STR_MEMORY "Memoria:" -#define STR_TIME_SYNC "Sincronizzazione dell'ora" -#define STR_DISABLED "Disabilitata" -#define STR_ENABLED_LOCAL "Abilitata (ora locale)" -#define STR_ENABLED_UTC "Abilitata (UTC)" -#define STR_DYNAREC "Ricompilatore dinamico" +#define STR_MACHINE_TYPE "Tipo di piastra madre:" +#define STR_MACHINE "Piastra madre:" +#define STR_CONFIGURE "Configura" +#define STR_CPU_TYPE "Tipo del CPU:" +#define STR_CPU_SPEED "Veloc.:" +#define STR_FPU "FPU:" +#define STR_WAIT_STATES "Stati di attesa:" +#define STR_MB "MB" +#define STR_MEMORY "Memoria:" +#define STR_TIME_SYNC "Sincronizzazione dell'ora" +#define STR_DISABLED "Disabilitata" +#define STR_ENABLED_LOCAL "Abilitata (ora locale)" +#define STR_ENABLED_UTC "Abilitata (UTC)" +#define STR_DYNAREC "Ricompilatore dinamico" -#define STR_VIDEO "Video:" -#define STR_VIDEO_2 "Video 2:" -#define STR_VOODOO "Grafica Voodoo" -#define STR_IBM8514 "Grafica IBM 8514/a" -#define STR_XGA "Grafica XGA" +#define STR_VIDEO "Video:" +#define STR_VIDEO_2 "Video 2:" +#define STR_VOODOO "Grafica Voodoo" +#define STR_IBM8514 "Grafica IBM 8514/a" +#define STR_XGA "Grafica XGA" -#define STR_MOUSE "Mouse:" -#define STR_JOYSTICK "Joystick:" -#define STR_JOY1 "Joystick 1..." -#define STR_JOY2 "Joystick 2..." -#define STR_JOY3 "Joystick 3..." -#define STR_JOY4 "Joystick 4..." +#define STR_MOUSE "Mouse:" +#define STR_JOYSTICK "Joystick:" +#define STR_JOY1 "Joystick 1..." +#define STR_JOY2 "Joystick 2..." +#define STR_JOY3 "Joystick 3..." +#define STR_JOY4 "Joystick 4..." -#define STR_SOUND1 "Scheda audio 1:" -#define STR_SOUND2 "Scheda audio 2:" -#define STR_SOUND3 "Scheda audio 3:" -#define STR_SOUND4 "Scheda audio 4:" -#define STR_MIDI_OUT "Uscita MIDI:" -#define STR_MIDI_IN "Entrata MIDI:" -#define STR_MPU401 "MPU-401 autonomo" -#define STR_FLOAT "Usa suono FLOAT32" -#define STR_FM_DRIVER "Driver sint. FM" -#define STR_FM_DRV_NUKED "Nuked (più accurato)" -#define STR_FM_DRV_YMFM "YMFM (più veloce)" +#define STR_SOUND1 "Scheda audio 1:" +#define STR_SOUND2 "Scheda audio 2:" +#define STR_SOUND3 "Scheda audio 3:" +#define STR_SOUND4 "Scheda audio 4:" +#define STR_MIDI_OUT "Uscita MIDI:" +#define STR_MIDI_IN "Entrata MIDI:" +#define STR_MPU401 "MPU-401 autonomo" +#define STR_FLOAT "Usa suono FLOAT32" +#define STR_FM_DRIVER "Driver sint. FM" +#define STR_FM_DRV_NUKED "Nuked (più accurato)" +#define STR_FM_DRV_YMFM "YMFM (più veloce)" -#define STR_NET_TYPE "Tipo di rete:" -#define STR_PCAP "Dispositivo PCap:" -#define STR_NET "Scheda di rete:" -#define STR_NET1 "Network card 1:" -#define STR_NET2 "Network card 2:" -#define STR_NET3 "Network card 3:" -#define STR_NET4 "Network card 4:" +#define STR_NET_TYPE "Tipo di rete:" +#define STR_PCAP "Dispositivo PCap:" +#define STR_NET "Scheda di rete:" +#define STR_NET1 "Network card 1:" +#define STR_NET2 "Network card 2:" +#define STR_NET3 "Network card 3:" +#define STR_NET4 "Network card 4:" -#define STR_COM1 "Dispositivo COM1:" -#define STR_COM2 "Dispositivo COM2:" -#define STR_COM3 "Dispositivo COM3:" -#define STR_COM4 "Dispositivo COM4:" -#define STR_LPT1 "Dispositivo LPT1:" -#define STR_LPT2 "Dispositivo LPT2:" -#define STR_LPT3 "Dispositivo LPT3:" -#define STR_LPT4 "Dispositivo LPT4:" -#define STR_SERIAL1 "Porta seriale 1" -#define STR_SERIAL2 "Porta seriale 2" -#define STR_SERIAL3 "Porta seriale 3" -#define STR_SERIAL4 "Porta seriale 4" -#define STR_PARALLEL1 "Porta parallela 1" -#define STR_PARALLEL2 "Porta parallela 2" -#define STR_PARALLEL3 "Porta parallela 3" -#define STR_PARALLEL4 "Porta parallela 4" -#define STR_SERIAL_PASS1 "Serial port passthrough 1" -#define STR_SERIAL_PASS2 "Serial port passthrough 2" -#define STR_SERIAL_PASS3 "Serial port passthrough 3" -#define STR_SERIAL_PASS4 "Serial port passthrough 4" +#define STR_COM1 "Dispositivo COM1:" +#define STR_COM2 "Dispositivo COM2:" +#define STR_COM3 "Dispositivo COM3:" +#define STR_COM4 "Dispositivo COM4:" +#define STR_LPT1 "Dispositivo LPT1:" +#define STR_LPT2 "Dispositivo LPT2:" +#define STR_LPT3 "Dispositivo LPT3:" +#define STR_LPT4 "Dispositivo LPT4:" +#define STR_SERIAL1 "Porta seriale 1" +#define STR_SERIAL2 "Porta seriale 2" +#define STR_SERIAL3 "Porta seriale 3" +#define STR_SERIAL4 "Porta seriale 4" +#define STR_PARALLEL1 "Porta parallela 1" +#define STR_PARALLEL2 "Porta parallela 2" +#define STR_PARALLEL3 "Porta parallela 3" +#define STR_PARALLEL4 "Porta parallela 4" +#define STR_SERIAL_PASS1 "Serial port passthrough 1" +#define STR_SERIAL_PASS2 "Serial port passthrough 2" +#define STR_SERIAL_PASS3 "Serial port passthrough 3" +#define STR_SERIAL_PASS4 "Serial port passthrough 4" -#define STR_HDC "Controller HD:" -#define STR_FDC "Controller FD:" -#define STR_IDE_TER "Controller IDE terziario" -#define STR_IDE_QUA "Controller IDE quaternario" -#define STR_SCSI "SCSI" -#define STR_SCSI_1 "Controller 1:" -#define STR_SCSI_2 "Controller 2:" -#define STR_SCSI_3 "Controller 3:" -#define STR_SCSI_4 "Controller 4:" -#define STR_CASSETTE "Cassetta" +#define STR_HDC "Controller HD:" +#define STR_FDC "Controller FD:" +#define STR_IDE_TER "Controller IDE terziario" +#define STR_IDE_QUA "Controller IDE quaternario" +#define STR_SCSI "SCSI" +#define STR_SCSI_1 "Controller 1:" +#define STR_SCSI_2 "Controller 2:" +#define STR_SCSI_3 "Controller 3:" +#define STR_SCSI_4 "Controller 4:" +#define STR_CASSETTE "Cassetta" -#define STR_HDD "Hard disk:" -#define STR_NEW "&Nuovo..." -#define STR_EXISTING "&Esistente..." -#define STR_REMOVE "&Rimouvi" -#define STR_BUS "Bus:" -#define STR_CHANNEL "Canale:" -#define STR_ID "ID:" -#define STR_SPEED "Speed:" +#define STR_HDD "Hard disk:" +#define STR_NEW "&Nuovo..." +#define STR_EXISTING "&Esistente..." +#define STR_REMOVE "&Rimouvi" +#define STR_BUS "Bus:" +#define STR_CHANNEL "Canale:" +#define STR_ID "ID:" +#define STR_SPEED "Speed:" -#define STR_SPECIFY "&Specifica..." -#define STR_SECTORS "Settori:" -#define STR_HEADS "Testine:" -#define STR_CYLS "Cilindri:" -#define STR_SIZE_MB "Dimensioni (MB):" -#define STR_TYPE "Tipo:" -#define STR_IMG_FORMAT "Formato immagine:" -#define STR_BLOCK_SIZE "Dimensioni blocco:" +#define STR_SPECIFY "&Specifica..." +#define STR_SECTORS "Settori:" +#define STR_HEADS "Testine:" +#define STR_CYLS "Cilindri:" +#define STR_SIZE_MB "Dimensioni (MB):" +#define STR_TYPE "Tipo:" +#define STR_IMG_FORMAT "Formato immagine:" +#define STR_BLOCK_SIZE "Dimensioni blocco:" -#define STR_FLOPPY_DRIVES "Unità floppy:" -#define STR_TURBO "Turbo" -#define STR_CHECKBPB "Verifica BPB" -#define STR_CDROM_DRIVES "Unità CD-ROM:" -#define STR_CD_SPEED "Veloc.:" -#define STR_EARLY "Unità anteriore" +#define STR_FLOPPY_DRIVES "Unità floppy:" +#define STR_TURBO "Turbo" +#define STR_CHECKBPB "Verifica BPB" +#define STR_CDROM_DRIVES "Unità CD-ROM:" +#define STR_CD_SPEED "Veloc.:" +#define STR_EARLY "Unità anteriore" -#define STR_MO_DRIVES "Unità magneto-ottiche:" -#define STR_ZIP_DRIVES "Unità ZIP:" -#define STR_250 "ZIP 250" +#define STR_MO_DRIVES "Unità magneto-ottiche:" +#define STR_ZIP_DRIVES "Unità ZIP:" +#define STR_250 "ZIP 250" -#define STR_ISARTC "RTC ISA:" -#define STR_ISAMEM "Espansione memoria ISA" -#define STR_ISAMEM_1 "Scheda 1:" -#define STR_ISAMEM_2 "Scheda 2:" -#define STR_ISAMEM_3 "Scheda 3:" -#define STR_ISAMEM_4 "Scheda 4:" -#define STR_BUGGER "Dispositivo ISABugger" -#define STR_POSTCARD "Scheda POST" +#define STR_ISARTC "RTC ISA:" +#define STR_ISAMEM "Espansione memoria ISA" +#define STR_ISAMEM_1 "Scheda 1:" +#define STR_ISAMEM_2 "Scheda 2:" +#define STR_ISAMEM_3 "Scheda 3:" +#define STR_ISAMEM_4 "Scheda 4:" +#define STR_BUGGER "Dispositivo ISABugger" +#define STR_POSTCARD "Scheda POST" -#define FONT_SIZE 9 -#define FONT_NAME "Segoe UI" +#define FONT_SIZE 9 +#define FONT_NAME "Segoe UI" #include "dialogs.rc" @@ -395,149 +395,149 @@ END STRINGTABLE DISCARDABLE BEGIN - 2048 "86Box" - IDS_2049 "Errore" - IDS_2050 "Errore fatale" - IDS_2051 " - PAUSED" - IDS_2052 "Usa Ctrl+Alt+PgDn per tornare alla modalità finestra." - IDS_2053 "Velocità" - IDS_2054 "ZIP %03i %i (%s): %ls" - IDS_2055 "Immagini ZIP (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" - IDS_2056 "86Box non può trovare immagini ROM utilizzabili.\n\nPlease download a ROM set and extract it into the ""roms"" directory." - IDS_2057 "(empty)" - IDS_2058 "Immagini ZIP (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0Tutti i file (*.*)\0*.*\0" - IDS_2059 "Turbo" - IDS_2060 "Acceso" - IDS_2061 "Spento" - IDS_2062 "Tutte le immagini (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0Immagini di settori base (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Immagini di superficie (*.86F)\0*.86F\0" - IDS_2063 "La macchina ""%hs"" non è disponibile a causa di immagini ROM mancanti nella directory roms/machines. Cambiando ad una macchina disponibile." + 2048 "86Box" + IDS_2049 "Errore" + IDS_2050 "Errore fatale" + IDS_2051 " - PAUSED" + IDS_2052 "Usa Ctrl+Alt+PgDn per tornare alla modalità finestra." + IDS_2053 "Velocità" + IDS_2054 "ZIP %03i %i (%s): %ls" + IDS_2055 "Immagini ZIP (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" + IDS_2056 "86Box non può trovare immagini ROM utilizzabili.\n\nPlease download a ROM set and extract it into the ""roms"" directory." + IDS_2057 "(empty)" + IDS_2058 "Immagini ZIP (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0Tutti i file (*.*)\0*.*\0" + IDS_2059 "Turbo" + IDS_2060 "Acceso" + IDS_2061 "Spento" + IDS_2062 "Tutte le immagini (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0Immagini di settori base (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Immagini di superficie (*.86F)\0*.86F\0" + IDS_2063 "La macchina ""%hs"" non è disponibile a causa di immagini ROM mancanti nella directory roms/machines. Cambiando ad una macchina disponibile." END STRINGTABLE DISCARDABLE BEGIN - IDS_2064 "La scheda video ""%hs"" non è disponibile a causa di immagini ROM mancanti nella directory roms/video. Cambiando ad una scheda video disponibile." - IDS_2065 "Piastra madre" - IDS_2066 "Schermo" - IDS_2067 "Dispositivi di entrata" - IDS_2068 "Audio" - IDS_2069 "Rete" - IDS_2070 "Porte (COM & LPT)" - IDS_2071 "Controller memoria" - IDS_2072 "Hard disk" - IDS_2073 "Unità CD-ROM e Floppy" - IDS_2074 "Altri dispositivi rimuovibili" - IDS_2075 "Altre periferiche" - IDS_2076 "Immagini di superficie (*.86F)\0*.86F\0" - IDS_2077 "Fare clic per catturare mouse" - IDS_2078 "Premi F8+F12 per rilasciare il mouse" - IDS_2079 "Premi F8+F12 o pulsante centrale per rilasciare il mouse" + IDS_2064 "La scheda video ""%hs"" non è disponibile a causa di immagini ROM mancanti nella directory roms/video. Cambiando ad una scheda video disponibile." + IDS_2065 "Piastra madre" + IDS_2066 "Schermo" + IDS_2067 "Dispositivi di entrata" + IDS_2068 "Audio" + IDS_2069 "Rete" + IDS_2070 "Porte (COM & LPT)" + IDS_2071 "Controller memoria" + IDS_2072 "Hard disk" + IDS_2073 "Unità CD-ROM e Floppy" + IDS_2074 "Altri dispositivi rimuovibili" + IDS_2075 "Altre periferiche" + IDS_2076 "Immagini di superficie (*.86F)\0*.86F\0" + IDS_2077 "Fare clic per catturare mouse" + IDS_2078 "Premi F8+F12 per rilasciare il mouse" + IDS_2079 "Premi F8+F12 o pulsante centrale per rilasciare il mouse" END STRINGTABLE DISCARDABLE BEGIN - IDS_2080 "Impossibile inizializzare FluidSynth" - IDS_2081 "Bus" - IDS_2082 "File" - IDS_2083 "C" - IDS_2084 "H" - IDS_2085 "S" - IDS_2086 "MB" + IDS_2080 "Impossibile inizializzare FluidSynth" + IDS_2081 "Bus" + IDS_2082 "File" + IDS_2083 "C" + IDS_2084 "H" + IDS_2085 "S" + IDS_2086 "MB" IDS_2087 "Speed" - IDS_2088 "Verifica BPB" - IDS_2089 "KB" - IDS_2090 "Impossibile inizializzare il renderer video." - IDS_2091 "Predefinito" - IDS_2092 "%i stati d'attesa" - IDS_2093 "Tipo" - IDS_2094 "Impossibile impostare PCap" - IDS_2095 "Nessun dispositivo PCap trovato" - IDS_2096 "Dispositivo PCap invalido" - IDS_2097 "Joystick comune da 2 pulsanti" - IDS_2098 "Joystick comune da 4 pulsanti" - IDS_2099 "Joystick comune da 6 pulsanti" - IDS_2100 "Joystick comune da 8 pulsanti" - IDS_2101 "CH Flightstick Pro" - IDS_2102 "Microsoft SideWinder Pad" - IDS_2103 "Thrustmaster Flight Control System" - IDS_2104 "Nessuno" - IDS_2105 "Impossibile caricare gli acceleratori da tastiera." - IDS_2106 "Impossibile registrare input raw." - IDS_2107 "%u" - IDS_2108 "%u MB (CHS: %i, %i, %i)" - IDS_2109 "Floppy %i (%s): %ls" - IDS_2110 "Tutte le immagini (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Immagini da settori avanzati (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Imagini da settori basilari (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Immagini flusso (*.FDI)\0*.FDI\0Immagini da superficie (*.86F;*.MFM)\0*.86F;*.MFM\0Tutti i file (*.*)\0*.*\0" - IDS_2111 "Impossibile inizializzare FreeType" - IDS_2112 "Impossibile inizializzare SDL, SDL2.dll è necessario" - IDS_2113 "Sei sicuro di voler riavviare la macchina emulata?" - IDS_2114 "Sei sicuro di voler uscire da 86Box?" - IDS_2115 "Impossibile inizializzare Ghostscript" - IDS_2116 "MO %i (%ls): %ls" - IDS_2117 "Immagini MO (*.IM?;*.MDI)\0*.IM?;*.MDI\0Tutti i file (*.*)\0*.*\0" - IDS_2118 "Benvenuti in 86Box!" - IDS_2119 "Controller interno" - IDS_2120 "Esci" - IDS_2121 "Nessune immagini ROM trovate" - IDS_2122 "Vuole salvare queste impostazioni?" - IDS_2123 "Questo riavvierà la macchina emulata." - IDS_2124 "Salva" - IDS_2125 "Informazioni su 86Box" - IDS_2126 "86Box v" EMU_VERSION + IDS_2088 "Verifica BPB" + IDS_2089 "KB" + IDS_2090 "Impossibile inizializzare il renderer video." + IDS_2091 "Predefinito" + IDS_2092 "%i stati d'attesa" + IDS_2093 "Tipo" + IDS_2094 "Impossibile impostare PCap" + IDS_2095 "Nessun dispositivo PCap trovato" + IDS_2096 "Dispositivo PCap invalido" + IDS_2097 "Joystick comune da 2 pulsanti" + IDS_2098 "Joystick comune da 4 pulsanti" + IDS_2099 "Joystick comune da 6 pulsanti" + IDS_2100 "Joystick comune da 8 pulsanti" + IDS_2101 "CH Flightstick Pro" + IDS_2102 "Microsoft SideWinder Pad" + IDS_2103 "Thrustmaster Flight Control System" + IDS_2104 "Nessuno" + IDS_2105 "Impossibile caricare gli acceleratori da tastiera." + IDS_2106 "Impossibile registrare input raw." + IDS_2107 "%u" + IDS_2108 "%u MB (CHS: %i, %i, %i)" + IDS_2109 "Floppy %i (%s): %ls" + IDS_2110 "Tutte le immagini (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Immagini da settori avanzati (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Imagini da settori basilari (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Immagini flusso (*.FDI)\0*.FDI\0Immagini da superficie (*.86F;*.MFM)\0*.86F;*.MFM\0Tutti i file (*.*)\0*.*\0" + IDS_2111 "Impossibile inizializzare FreeType" + IDS_2112 "Impossibile inizializzare SDL, SDL2.dll è necessario" + IDS_2113 "Sei sicuro di voler riavviare la macchina emulata?" + IDS_2114 "Sei sicuro di voler uscire da 86Box?" + IDS_2115 "Impossibile inizializzare Ghostscript" + IDS_2116 "MO %i (%ls): %ls" + IDS_2117 "Immagini MO (*.IM?;*.MDI)\0*.IM?;*.MDI\0Tutti i file (*.*)\0*.*\0" + IDS_2118 "Benvenuti in 86Box!" + IDS_2119 "Controller interno" + IDS_2120 "Esci" + IDS_2121 "Nessune immagini ROM trovate" + IDS_2122 "Vuole salvare queste impostazioni?" + IDS_2123 "Questo riavvierà la macchina emulata." + IDS_2124 "Salva" + IDS_2125 "Informazioni su 86Box" + IDS_2126 "86Box v" EMU_VERSION - IDS_2127 "Un emulatore di computer vecchi\n\nAutori: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, Tiseno100, reenigne, leilei, JohnElliott, greatpsycho, and others.\n\nTradotto da: explorerdotexe\n\nRilasciato sotto la Licenza Pubblica GNU versione 2 o dopo. Vedi LICENSE per maggior informazioni." - IDS_2128 "OK" - IDS_2129 "Hardware non disponibile" + IDS_2127 "Un emulatore di computer vecchi\n\nAutori: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, Tiseno100, reenigne, leilei, JohnElliott, greatpsycho, and others.\n\nTradotto da: explorerdotexe\n\nRilasciato sotto la Licenza Pubblica GNU versione 2 o dopo. Vedi LICENSE per maggior informazioni." + IDS_2128 "OK" + IDS_2129 "Hardware non disponibile" #ifdef _WIN32 #define LIB_NAME_PCAP "WinPcap" #else #define LIB_NAME_PCAP "libpcap" #endif - IDS_2130 "Controlla se " LIB_NAME_PCAP " è installato e che tu sia connesso ad una connessione " LIB_NAME_PCAP " compatibile." - IDS_2131 "Configurazione invalida" + IDS_2130 "Controlla se " LIB_NAME_PCAP " è installato e che tu sia connesso ad una connessione " LIB_NAME_PCAP " compatibile." + IDS_2131 "Configurazione invalida" #ifdef _WIN32 #define LIB_NAME_FREETYPE "freetype.dll" #else #define LIB_NAME_FREETYPE "libfreetype" #endif - IDS_2132 LIB_NAME_FREETYPE " è richesto per l'emuazione di stampanti ESC/P." + IDS_2132 LIB_NAME_FREETYPE " è richesto per l'emuazione di stampanti ESC/P." #ifdef _WIN32 #define LIB_NAME_GS "gsdll32.dll" #else #define LIB_NAME_GS "libgs" #endif - IDS_2133 LIB_NAME_GS " è richiesto per la conversione automatica di file PostScript a file PDF.\n\nQualsiasi documento mandato alla stampante generica PostScript sarà salvato come file PostScript. (.ps)" + IDS_2133 LIB_NAME_GS " è richiesto per la conversione automatica di file PostScript a file PDF.\n\nQualsiasi documento mandato alla stampante generica PostScript sarà salvato come file PostScript. (.ps)" #ifdef _WIN32 #define LIB_NAME_FLUIDSYNTH "libfluidsynth.dll" #else #define LIB_NAME_FLUIDSYNTH "libfluidsynth" #endif - IDS_2134 LIB_NAME_FLUIDSYNTH " è richiesto per l'output FluidSynth MIDI." - IDS_2135 "Entrando nella modalità schermo intero" - IDS_2136 "Non mostrare più questo messaggio" - IDS_2137 "Non uscire" - IDS_2138 "Riavvia" - IDS_2139 "Non riavviare" - IDS_2140 "Immagini MO (*.IM?;*.MDI)\0*.IM?;*.MDI\0Tutti i file (*.*)\0*.*\0" - IDS_2141 "Immagini CD-ROM (*.ISO;*.CUE)\0*.ISO;*.CUE\0Tutti i file (*.*)\0*.*\0" - IDS_2142 "Configurazione del dispositivo %hs" + IDS_2134 LIB_NAME_FLUIDSYNTH " è richiesto per l'output FluidSynth MIDI." + IDS_2135 "Entrando nella modalità schermo intero" + IDS_2136 "Non mostrare più questo messaggio" + IDS_2137 "Non uscire" + IDS_2138 "Riavvia" + IDS_2139 "Non riavviare" + IDS_2140 "Immagini MO (*.IM?;*.MDI)\0*.IM?;*.MDI\0Tutti i file (*.*)\0*.*\0" + IDS_2141 "Immagini CD-ROM (*.ISO;*.CUE)\0*.ISO;*.CUE\0Tutti i file (*.*)\0*.*\0" + IDS_2142 "Configurazione del dispositivo %hs" IDS_2143 "Monitor in modalità riposo" - IDS_2144 "Shader OpenGL (*.GLSL)\0*.GLSL\0Tutti i file (*.*)\0*.*\0" - IDS_2145 "Impostazioni OpenGL" - IDS_2146 "Stai caricando una configurazione non supportata" - IDS_2147 "Il filtraggio della tipologia di CPU è disabilitato per la macchina selezionata.\n\nQuesto lo rende possibile scegliere un CPU che è altrimenti incompatibile con la macchina selezionata. Tuttavia, portresti incorrere in incompatibilità con il BIOS della macchina o altri programmi. \n\nL'abilitare di questa impostazione non è ufficialmente supportato e tutte le segnalazioni di errori saranno considerate invalide." - IDS_2148 "Continua" - IDS_2149 "Cassetta: %s" - IDS_2150 "Immagini cassetta (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Tutti i file (*.*)\0*.*\0" - IDS_2151 "Cartuccia %i: %ls" - IDS_2152 "Immagini cartuccia (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Tutti i file (*.*)\0*.*\0" - IDS_2153 "Error initializing renderer" - IDS_2154 "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." - IDS_2155 "Resume execution" - IDS_2156 "Pause execution" - IDS_2157 "Press Ctrl+Alt+Del" - IDS_2158 "Press Ctrl+Alt+Esc" - IDS_2159 "Hard reset" - IDS_2160 "ACPI shutdown" - IDS_2161 "Settings" + IDS_2144 "Shader OpenGL (*.GLSL)\0*.GLSL\0Tutti i file (*.*)\0*.*\0" + IDS_2145 "Impostazioni OpenGL" + IDS_2146 "Stai caricando una configurazione non supportata" + IDS_2147 "Il filtraggio della tipologia di CPU è disabilitato per la macchina selezionata.\n\nQuesto lo rende possibile scegliere un CPU che è altrimenti incompatibile con la macchina selezionata. Tuttavia, portresti incorrere in incompatibilità con il BIOS della macchina o altri programmi. \n\nL'abilitare di questa impostazione non è ufficialmente supportato e tutte le segnalazioni di errori saranno considerate invalide." + IDS_2148 "Continua" + IDS_2149 "Cassetta: %s" + IDS_2150 "Immagini cassetta (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Tutti i file (*.*)\0*.*\0" + IDS_2151 "Cartuccia %i: %ls" + IDS_2152 "Immagini cartuccia (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Tutti i file (*.*)\0*.*\0" + IDS_2153 "Error initializing renderer" + IDS_2154 "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." + IDS_2155 "Resume execution" + IDS_2156 "Pause execution" + IDS_2157 "Press Ctrl+Alt+Del" + IDS_2158 "Press Ctrl+Alt+Esc" + IDS_2159 "Hard reset" + IDS_2160 "ACPI shutdown" + IDS_2161 "Settings" IDS_2162 "Unità anteriore" IDS_2163 "No Dynarec" IDS_2164 "Old Dynarec" @@ -548,45 +548,45 @@ END STRINGTABLE DISCARDABLE BEGIN IDS_4096 "Hard disk (%s)" - IDS_4097 "%01i:%01i" - IDS_4098 "%01i" - IDS_4099 "Le unità CD-ROM MFM/RLL o ESDI non sono mai esistite." - IDS_4100 "Personalizzata..." - IDS_4101 "Personalizzata (grande)..." - IDS_4102 "Aggiungi un nuovo disco rigido" - IDS_4103 "Aggiungi un disco rigido esistente" - IDS_4104 "Le immagini HDI non possono essere più grandi di 4 GB." - IDS_4105 "Le immmagini disco non possono essere più grandi di 127 GB." - IDS_4106 "Immagini disco rigido (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0Tutti i file (*.*)\0*.*\0" - IDS_4107 "Impossibile leggere il file" - IDS_4108 "Impossibile scrivere al file" - IDS_4109 "Le immagini HDI o HDX con settori di dimensioni diverse da 512 non sono supportati." - IDS_4110 "USB non è ancora supportato" - IDS_4111 "Immagine disco già esiste" - IDS_4112 "Specifica un nome file valido." - IDS_4113 "Immagine disco creata" - IDS_4114 "Controlla che il file esiste e che sia leggibile." - IDS_4115 "Controlla che il file viene salvato ad un percorso con diritti di scrittura" - IDS_4116 "Immagine disco troppo grande" - IDS_4117 "Ricordati di partizionare e formattare il disco appena creato." - IDS_4118 "Il file selezionato sarà sovrascritto, sei sicuro di volerlo usare?" - IDS_4119 "Immagine disco non supportata" - IDS_4120 "Sovrascrivi" - IDS_4121 "Non sovrascrivere" - IDS_4122 "Immagine raw (.img)" - IDS_4123 "Immagine HDI (.hdi)" - IDS_4124 "Immagine HDX (.hdx)" - IDS_4125 "VHD di dimensioni fisse (.vhd)" - IDS_4126 "VHD di dimensioni dinamiche (.vhd)" - IDS_4127 "VHD differenziato (.vhd)" - IDS_4128 "Blocchi larghi (2 MB)" - IDS_4129 "Blocchi piccoli (512 KB)" - IDS_4130 "File VHD (*.VHD)\0*.VHD\0Tutti i file (*.*)\0*.*\0" - IDS_4131 "Seleziona il VHD padre." - IDS_4132 "Questo potrebbe significare che l'immagine padre sia stata modificata dopo la creazione dell'immagine di differenziazione.\n\nPuò anche succedere se i file immagini sono stati spostati o copiati, o da un errore nel programma che ha creato questo disco.\n\nVuoi aggiustare le marcature di tempo?" - IDS_4133 "Le marcature di tempo padre e figlio non corrispondono" - IDS_4134 "Impossibile aggiustare marcature di tempo VHD." - IDS_4135 "%01i:%02i" + IDS_4097 "%01i:%01i" + IDS_4098 "%01i" + IDS_4099 "Le unità CD-ROM MFM/RLL o ESDI non sono mai esistite." + IDS_4100 "Personalizzata..." + IDS_4101 "Personalizzata (grande)..." + IDS_4102 "Aggiungi un nuovo disco rigido" + IDS_4103 "Aggiungi un disco rigido esistente" + IDS_4104 "Le immagini HDI non possono essere più grandi di 4 GB." + IDS_4105 "Le immmagini disco non possono essere più grandi di 127 GB." + IDS_4106 "Immagini disco rigido (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0Tutti i file (*.*)\0*.*\0" + IDS_4107 "Impossibile leggere il file" + IDS_4108 "Impossibile scrivere al file" + IDS_4109 "Le immagini HDI o HDX con settori di dimensioni diverse da 512 non sono supportati." + IDS_4110 "USB non è ancora supportato" + IDS_4111 "Immagine disco già esiste" + IDS_4112 "Specifica un nome file valido." + IDS_4113 "Immagine disco creata" + IDS_4114 "Controlla che il file esiste e che sia leggibile." + IDS_4115 "Controlla che il file viene salvato ad un percorso con diritti di scrittura" + IDS_4116 "Immagine disco troppo grande" + IDS_4117 "Ricordati di partizionare e formattare il disco appena creato." + IDS_4118 "Il file selezionato sarà sovrascritto, sei sicuro di volerlo usare?" + IDS_4119 "Immagine disco non supportata" + IDS_4120 "Sovrascrivi" + IDS_4121 "Non sovrascrivere" + IDS_4122 "Immagine raw (.img)" + IDS_4123 "Immagine HDI (.hdi)" + IDS_4124 "Immagine HDX (.hdx)" + IDS_4125 "VHD di dimensioni fisse (.vhd)" + IDS_4126 "VHD di dimensioni dinamiche (.vhd)" + IDS_4127 "VHD differenziato (.vhd)" + IDS_4128 "Blocchi larghi (2 MB)" + IDS_4129 "Blocchi piccoli (512 KB)" + IDS_4130 "File VHD (*.VHD)\0*.VHD\0Tutti i file (*.*)\0*.*\0" + IDS_4131 "Seleziona il VHD padre." + IDS_4132 "Questo potrebbe significare che l'immagine padre sia stata modificata dopo la creazione dell'immagine di differenziazione.\n\nPuò anche succedere se i file immagini sono stati spostati o copiati, o da un errore nel programma che ha creato questo disco.\n\nVuoi aggiustare le marcature di tempo?" + IDS_4133 "Le marcature di tempo padre e figlio non corrispondono" + IDS_4134 "Impossibile aggiustare marcature di tempo VHD." + IDS_4135 "%01i:%02i" IDS_4352 "MFM/RLL" IDS_4353 "XTA" @@ -595,56 +595,56 @@ BEGIN IDS_4356 "ATAPI" IDS_4357 "SCSI" - IDS_4608 "MFM/RLL (%01i:%01i)" - IDS_4609 "XTA (%01i:%01i)" - IDS_4610 "ESDI (%01i:%01i)" - IDS_4611 "IDE (%01i:%01i)" - IDS_4612 "ATAPI (%01i:%01i)" - IDS_4613 "SCSI (%01i:%02i)" + IDS_4608 "MFM/RLL (%01i:%01i)" + IDS_4609 "XTA (%01i:%01i)" + IDS_4610 "ESDI (%01i:%01i)" + IDS_4611 "IDE (%01i:%01i)" + IDS_4612 "ATAPI (%01i:%01i)" + IDS_4613 "SCSI (%01i:%02i)" - IDS_5120 "CD-ROM %i (%s): %s" + IDS_5120 "CD-ROM %i (%s): %s" - IDS_5376 "Disabilitato" - IDS_5381 "ATAPI" + IDS_5376 "Disabilitato" + IDS_5381 "ATAPI" IDS_5382 "SCSI" - IDS_5632 "Disabilitato" - IDS_5637 "ATAPI (%01i:%01i)" + IDS_5632 "Disabilitato" + IDS_5637 "ATAPI (%01i:%01i)" IDS_5638 "SCSI (%01i:%02i)" - IDS_5888 "160 kB" - IDS_5889 "180 kB" - IDS_5890 "320 kB" - IDS_5891 "360 kB" - IDS_5892 "640 kB" - IDS_5893 "720 kB" - IDS_5894 "1.2 MB" - IDS_5895 "1.25 MB" - IDS_5896 "1.44 MB" - IDS_5897 "DMF (cluster 1024)" - IDS_5898 "DMF (cluster 2048)" - IDS_5899 "2.88 MB" - IDS_5900 "ZIP 100" - IDS_5901 "ZIP 250" - IDS_5902 "3.5"" 128 MB (ISO 10090)" - IDS_5903 "3.5"" 230 MB (ISO 13963)" - IDS_5904 "3.5"" 540 MB (ISO 15498)" - IDS_5905 "3.5"" 640 MB (ISO 15498)" - IDS_5906 "3.5"" 1.3 GB (GigaMO)" - IDS_5907 "3.5"" 2.3 GB (GigaMO 2)" - IDS_5908 "5.25"" 600 MB" - IDS_5909 "5.25"" 650 MB" - IDS_5910 "5.25"" 1 GB" - IDS_5911 "5.25"" 1.3 GB" + IDS_5888 "160 kB" + IDS_5889 "180 kB" + IDS_5890 "320 kB" + IDS_5891 "360 kB" + IDS_5892 "640 kB" + IDS_5893 "720 kB" + IDS_5894 "1.2 MB" + IDS_5895 "1.25 MB" + IDS_5896 "1.44 MB" + IDS_5897 "DMF (cluster 1024)" + IDS_5898 "DMF (cluster 2048)" + IDS_5899 "2.88 MB" + IDS_5900 "ZIP 100" + IDS_5901 "ZIP 250" + IDS_5902 "3.5"" 128 MB (ISO 10090)" + IDS_5903 "3.5"" 230 MB (ISO 13963)" + IDS_5904 "3.5"" 540 MB (ISO 15498)" + IDS_5905 "3.5"" 640 MB (ISO 15498)" + IDS_5906 "3.5"" 1.3 GB (GigaMO)" + IDS_5907 "3.5"" 2.3 GB (GigaMO 2)" + IDS_5908 "5.25"" 600 MB" + IDS_5909 "5.25"" 650 MB" + IDS_5910 "5.25"" 1 GB" + IDS_5911 "5.25"" 1.3 GB" - IDS_6144 "RPM perfette" - IDS_6145 "RPM 1% sotto perfezione" - IDS_6146 "RPM 1.5% sotto perfezione" - IDS_6147 "RPM 2% sotto perfezione" + IDS_6144 "RPM perfette" + IDS_6145 "RPM 1% sotto perfezione" + IDS_6146 "RPM 1.5% sotto perfezione" + IDS_6147 "RPM 2% sotto perfezione" - IDS_7168 "(Predefinito del sistema)" + IDS_7168 "(Predefinito del sistema)" END -#define IDS_LANG_ENUS IDS_7168 +#define IDS_LANG_ENUS IDS_7168 // Italian (IT-it) resources ///////////////////////////////////////////////////////////////////////////// diff --git a/src/win/languages/ja-JP.rc b/src/win/languages/ja-JP.rc index caab14089..16a54a822 100644 --- a/src/win/languages/ja-JP.rc +++ b/src/win/languages/ja-JP.rc @@ -17,13 +17,13 @@ MainMenu MENU DISCARDABLE BEGIN POPUP "動作(&A)" BEGIN - MENUITEM "キーボードはキャプチャが必要(&K)", IDM_ACTION_KBD_REQ_CAPTURE - MENUITEM "右CTRLを左ALTへ(&R)", IDM_ACTION_RCTRL_IS_LALT + MENUITEM "キーボードはキャプチャが必要(&K)", IDM_ACTION_KBD_REQ_CAPTURE + MENUITEM "右CTRLを左ALTへ(&R)", IDM_ACTION_RCTRL_IS_LALT MENUITEM SEPARATOR MENUITEM "ハードリセット(&H)...", IDM_ACTION_HRESET MENUITEM "Ctrl+Alt+Del(&C)\tCtrl+F12", IDM_ACTION_RESET_CAD MENUITEM SEPARATOR - MENUITEM "Ctrl+Alt+Esc(&E)", IDM_ACTION_CTRL_ALT_ESC + MENUITEM "Ctrl+Alt+Esc(&E)", IDM_ACTION_CTRL_ALT_ESC MENUITEM SEPARATOR MENUITEM "一時停止(&P)", IDM_ACTION_PAUSE MENUITEM SEPARATOR @@ -31,8 +31,8 @@ BEGIN END POPUP "表示(&V)" BEGIN - MENUITEM "ステータスバーを隠す(&H)", IDM_VID_HIDE_STATUS_BAR - MENUITEM "ツールバーを隠す(&T)", IDM_VID_HIDE_TOOLBAR + MENUITEM "ステータスバーを隠す(&H)", IDM_VID_HIDE_STATUS_BAR + MENUITEM "ツールバーを隠す(&T)", IDM_VID_HIDE_TOOLBAR MENUITEM SEPARATOR MENUITEM "&Show non-primary monitors", IDM_VID_MONITORS MENUITEM "ウィンドウのサイズをリサイズ可能(&R)", IDM_VID_RESIZE @@ -101,11 +101,11 @@ BEGIN MENUITEM "CGA/PCjr/Tandy/EGA/(S)VGAオーバースキャン(&G)", IDM_VID_OVERSCAN MENUITEM "単色モニター用コントラストを変更(&M)", IDM_VID_CGACON END - MENUITEM "メディア(&M)", IDM_MEDIA + MENUITEM "メディア(&M)", IDM_MEDIA POPUP "ツール(&T)" BEGIN MENUITEM "設定(&S)...", IDM_CONFIG - MENUITEM "ステータスバーのアイコンを更新(&U)", IDM_UPDATE_ICONS + MENUITEM "ステータスバーのアイコンを更新(&U)", IDM_UPDATE_ICONS MENUITEM SEPARATOR MENUITEM "スクリーンショットを撮る(&C)\tCtrl+F11", IDM_ACTION_SCREENSHOT MENUITEM SEPARATOR @@ -137,17 +137,17 @@ CassetteSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "新規イメージ(&N)...", IDM_CASSETTE_IMAGE_NEW + MENUITEM "新規イメージ(&N)...", IDM_CASSETTE_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "既存のイメージを開く(&E)...", IDM_CASSETTE_IMAGE_EXISTING - MENUITEM "既存のイメージを開く(書き込み保護)(&W)...", IDM_CASSETTE_IMAGE_EXISTING_WP + MENUITEM "既存のイメージを開く(&E)...", IDM_CASSETTE_IMAGE_EXISTING + MENUITEM "既存のイメージを開く(書き込み保護)(&W)...", IDM_CASSETTE_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "録音(&R)", IDM_CASSETTE_RECORD - MENUITEM "再生(&P)", IDM_CASSETTE_PLAY - MENUITEM "冒頭に巻き戻す(&R)", IDM_CASSETTE_REWIND - MENUITEM "最後まで早送り(&F)", IDM_CASSETTE_FAST_FORWARD + MENUITEM "録音(&R)", IDM_CASSETTE_RECORD + MENUITEM "再生(&P)", IDM_CASSETTE_PLAY + MENUITEM "冒頭に巻き戻す(&R)", IDM_CASSETTE_REWIND + MENUITEM "最後まで早送り(&F)", IDM_CASSETTE_FAST_FORWARD MENUITEM SEPARATOR - MENUITEM "取り出す(&J)", IDM_CASSETTE_EJECT + MENUITEM "取り出す(&J)", IDM_CASSETTE_EJECT END END @@ -155,9 +155,9 @@ CartridgeSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "イメージ(&I)...", IDM_CARTRIDGE_IMAGE + MENUITEM "イメージ(&I)...", IDM_CARTRIDGE_IMAGE MENUITEM SEPARATOR - MENUITEM "取り出す(&J)", IDM_CARTRIDGE_EJECT + MENUITEM "取り出す(&J)", IDM_CARTRIDGE_EJECT END END @@ -165,14 +165,14 @@ FloppySubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "新規イメージ(&N)...", IDM_FLOPPY_IMAGE_NEW + MENUITEM "新規イメージ(&N)...", IDM_FLOPPY_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "既存のイメージを開く(&E)...", IDM_FLOPPY_IMAGE_EXISTING - MENUITEM "既存のイメージを開く(書き込み保護)(&W)...", IDM_FLOPPY_IMAGE_EXISTING_WP + MENUITEM "既存のイメージを開く(&E)...", IDM_FLOPPY_IMAGE_EXISTING + MENUITEM "既存のイメージを開く(書き込み保護)(&W)...", IDM_FLOPPY_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "86Fイメージにエクスポート(&X)...", IDM_FLOPPY_EXPORT_TO_86F + MENUITEM "86Fイメージにエクスポート(&X)...", IDM_FLOPPY_EXPORT_TO_86F MENUITEM SEPARATOR - MENUITEM "取り出す(&J)", IDM_FLOPPY_EJECT + MENUITEM "取り出す(&J)", IDM_FLOPPY_EJECT END END @@ -180,13 +180,13 @@ CdromSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "ミュート(&M)", IDM_CDROM_MUTE + MENUITEM "ミュート(&M)", IDM_CDROM_MUTE MENUITEM SEPARATOR - MENUITEM "空(&M)", IDM_CDROM_EMPTY - MENUITEM "前のイメージを再読み込み(&R)", IDM_CDROM_RELOAD + MENUITEM "空(&M)", IDM_CDROM_EMPTY + MENUITEM "前のイメージを再読み込み(&R)", IDM_CDROM_RELOAD MENUITEM SEPARATOR - MENUITEM "イメージ(&I)...", IDM_CDROM_IMAGE - MENUITEM "フォルダ(&F)...", IDM_CDROM_DIR + MENUITEM "イメージ(&I)...", IDM_CDROM_IMAGE + MENUITEM "フォルダ(&F)...", IDM_CDROM_DIR END END @@ -194,13 +194,13 @@ ZIPSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "新規イメージ(&N)...", IDM_ZIP_IMAGE_NEW + MENUITEM "新規イメージ(&N)...", IDM_ZIP_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "既存のイメージを開く(&E)...", IDM_ZIP_IMAGE_EXISTING - MENUITEM "既存のイメージを開く(書き込み保護)(&W)...", IDM_ZIP_IMAGE_EXISTING_WP + MENUITEM "既存のイメージを開く(&E)...", IDM_ZIP_IMAGE_EXISTING + MENUITEM "既存のイメージを開く(書き込み保護)(&W)...", IDM_ZIP_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "取り出す(&J)", IDM_ZIP_EJECT - MENUITEM "前のイメージを再読み込み(&R)", IDM_ZIP_RELOAD + MENUITEM "取り出す(&J)", IDM_ZIP_EJECT + MENUITEM "前のイメージを再読み込み(&R)", IDM_ZIP_RELOAD END END @@ -208,13 +208,13 @@ MOSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "新規イメージ(&N)...", IDM_MO_IMAGE_NEW + MENUITEM "新規イメージ(&N)...", IDM_MO_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "既存のイメージを開く(&E)...", IDM_MO_IMAGE_EXISTING - MENUITEM "既存のイメージを開く(書き込み保護)(&W)...", IDM_MO_IMAGE_EXISTING_WP + MENUITEM "既存のイメージを開く(&E)...", IDM_MO_IMAGE_EXISTING + MENUITEM "既存のイメージを開く(書き込み保護)(&W)...", IDM_MO_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "取り出す(&J)", IDM_MO_EJECT - MENUITEM "前のイメージを再読み込み(&R)", IDM_MO_RELOAD + MENUITEM "取り出す(&J)", IDM_MO_EJECT + MENUITEM "前のイメージを再読み込み(&R)", IDM_MO_RELOAD END END @@ -240,150 +240,150 @@ END // Dialog // -#define STR_PREFERENCES "環境設定" -#define STR_SND_GAIN "音量ゲイン" -#define STR_NEW_FLOPPY "新規のイメージ" -#define STR_CONFIG "設定" -#define STR_SPECIFY_DIM "メインウィンドウのサイズ指定" +#define STR_PREFERENCES "環境設定" +#define STR_SND_GAIN "音量ゲイン" +#define STR_NEW_FLOPPY "新規のイメージ" +#define STR_CONFIG "設定" +#define STR_SPECIFY_DIM "メインウィンドウのサイズ指定" -#define STR_OK "OK" -#define STR_CANCEL "キャンセル" -#define STR_GLOBAL "これらの設定をグローバル既定値として保存する(&G)" -#define STR_DEFAULT "既定値(&D)" -#define STR_LANGUAGE "言語:" -#define STR_ICONSET "アイコンセット:" +#define STR_OK "OK" +#define STR_CANCEL "キャンセル" +#define STR_GLOBAL "これらの設定をグローバル既定値として保存する(&G)" +#define STR_DEFAULT "既定値(&D)" +#define STR_LANGUAGE "言語:" +#define STR_ICONSET "アイコンセット:" -#define STR_GAIN "ゲイン値" +#define STR_GAIN "ゲイン値" -#define STR_FILE_NAME "ファイル名:" -#define STR_DISK_SIZE "ディスクサイズ:" -#define STR_RPM_MODE "回転数モード:" -#define STR_PROGRESS "進行状況:" +#define STR_FILE_NAME "ファイル名:" +#define STR_DISK_SIZE "ディスクサイズ:" +#define STR_RPM_MODE "回転数モード:" +#define STR_PROGRESS "進行状況:" -#define STR_WIDTH "幅:" -#define STR_HEIGHT "高さ:" -#define STR_LOCK_TO_SIZE "このサイズをロックする" +#define STR_WIDTH "幅:" +#define STR_HEIGHT "高さ:" +#define STR_LOCK_TO_SIZE "このサイズをロックする" -#define STR_MACHINE_TYPE "マシンタイプ:" -#define STR_MACHINE "マシン:" -#define STR_CONFIGURE "設定" -#define STR_CPU_TYPE "CPUタイプ:" -#define STR_CPU_SPEED "速度:" -#define STR_FPU "FPU:" -#define STR_WAIT_STATES "待機状態:" -#define STR_MB "MB" -#define STR_MEMORY "メモリ:" -#define STR_TIME_SYNC "時刻同期機能" -#define STR_DISABLED "無効にする" -#define STR_ENABLED_LOCAL "有効にする (現地時間)" -#define STR_ENABLED_UTC "有効にする (UTC)" -#define STR_DYNAREC "動的リコンパイラ" +#define STR_MACHINE_TYPE "マシンタイプ:" +#define STR_MACHINE "マシン:" +#define STR_CONFIGURE "設定" +#define STR_CPU_TYPE "CPUタイプ:" +#define STR_CPU_SPEED "速度:" +#define STR_FPU "FPU:" +#define STR_WAIT_STATES "待機状態:" +#define STR_MB "MB" +#define STR_MEMORY "メモリ:" +#define STR_TIME_SYNC "時刻同期機能" +#define STR_DISABLED "無効にする" +#define STR_ENABLED_LOCAL "有効にする (現地時間)" +#define STR_ENABLED_UTC "有効にする (UTC)" +#define STR_DYNAREC "動的リコンパイラ" -#define STR_VIDEO "ビデオカード:" -#define STR_VIDEO_2 "ビデオカード 2:" -#define STR_VOODOO "Voodooグラフィック" -#define STR_IBM8514 "IBM 8514/aグラフィック" -#define STR_XGA "XGAグラフィック" +#define STR_VIDEO "ビデオカード:" +#define STR_VIDEO_2 "ビデオカード 2:" +#define STR_VOODOO "Voodooグラフィック" +#define STR_IBM8514 "IBM 8514/aグラフィック" +#define STR_XGA "XGAグラフィック" -#define STR_MOUSE "マウス:" -#define STR_JOYSTICK "ジョイスティック:" -#define STR_JOY1 "ジョイスティック1..." -#define STR_JOY2 "ジョイスティック2..." -#define STR_JOY3 "ジョイスティック3..." -#define STR_JOY4 "ジョイスティック4..." +#define STR_MOUSE "マウス:" +#define STR_JOYSTICK "ジョイスティック:" +#define STR_JOY1 "ジョイスティック1..." +#define STR_JOY2 "ジョイスティック2..." +#define STR_JOY3 "ジョイスティック3..." +#define STR_JOY4 "ジョイスティック4..." -#define STR_SOUND1 "サウンドカード 1:" -#define STR_SOUND2 "サウンドカード 2:" -#define STR_SOUND3 "サウンドカード 3:" -#define STR_SOUND4 "サウンドカード 4:" -#define STR_MIDI_OUT "MIDI出力デバイス:" -#define STR_MIDI_IN "MIDI入力デバイス:" -#define STR_MPU401 "独立型MPU-401" -#define STR_FLOAT "FLOAT32サウンドを使用する" -#define STR_FM_DRIVER "FMシンセドライバー" -#define STR_FM_DRV_NUKED "Nuked (高精度化)" -#define STR_FM_DRV_YMFM "YMFM (より速く)" +#define STR_SOUND1 "サウンドカード 1:" +#define STR_SOUND2 "サウンドカード 2:" +#define STR_SOUND3 "サウンドカード 3:" +#define STR_SOUND4 "サウンドカード 4:" +#define STR_MIDI_OUT "MIDI出力デバイス:" +#define STR_MIDI_IN "MIDI入力デバイス:" +#define STR_MPU401 "独立型MPU-401" +#define STR_FLOAT "FLOAT32サウンドを使用する" +#define STR_FM_DRIVER "FMシンセドライバー" +#define STR_FM_DRV_NUKED "Nuked (高精度化)" +#define STR_FM_DRV_YMFM "YMFM (より速く)" -#define STR_NET_TYPE "ネットワークタイプ:" -#define STR_PCAP "PCapデバイス:" -#define STR_NET "ネットワークアダプター:" -#define STR_NET1 "Network card 1:" -#define STR_NET2 "Network card 2:" -#define STR_NET3 "Network card 3:" -#define STR_NET4 "Network card 4:" +#define STR_NET_TYPE "ネットワークタイプ:" +#define STR_PCAP "PCapデバイス:" +#define STR_NET "ネットワークアダプター:" +#define STR_NET1 "Network card 1:" +#define STR_NET2 "Network card 2:" +#define STR_NET3 "Network card 3:" +#define STR_NET4 "Network card 4:" -#define STR_COM1 "COM1デバイス:" -#define STR_COM2 "COM2デバイス:" -#define STR_COM3 "COM3デバイス:" -#define STR_COM4 "COM4デバイス:" -#define STR_LPT1 "LPT1デバイス:" -#define STR_LPT2 "LPT2デバイス:" -#define STR_LPT3 "LPT3デバイス:" -#define STR_LPT4 "LPT4デバイス:" -#define STR_SERIAL1 "シリアルポート1" -#define STR_SERIAL2 "シリアルポート2" -#define STR_SERIAL3 "シリアルポート3" -#define STR_SERIAL4 "シリアルポート4" -#define STR_PARALLEL1 "パラレルポート1" -#define STR_PARALLEL2 "パラレルポート2" -#define STR_PARALLEL3 "パラレルポート3" -#define STR_PARALLEL4 "パラレルポート4" -#define STR_SERIAL_PASS1 "Serial port passthrough 1" -#define STR_SERIAL_PASS2 "Serial port passthrough 2" -#define STR_SERIAL_PASS3 "Serial port passthrough 3" -#define STR_SERIAL_PASS4 "Serial port passthrough 4" +#define STR_COM1 "COM1デバイス:" +#define STR_COM2 "COM2デバイス:" +#define STR_COM3 "COM3デバイス:" +#define STR_COM4 "COM4デバイス:" +#define STR_LPT1 "LPT1デバイス:" +#define STR_LPT2 "LPT2デバイス:" +#define STR_LPT3 "LPT3デバイス:" +#define STR_LPT4 "LPT4デバイス:" +#define STR_SERIAL1 "シリアルポート1" +#define STR_SERIAL2 "シリアルポート2" +#define STR_SERIAL3 "シリアルポート3" +#define STR_SERIAL4 "シリアルポート4" +#define STR_PARALLEL1 "パラレルポート1" +#define STR_PARALLEL2 "パラレルポート2" +#define STR_PARALLEL3 "パラレルポート3" +#define STR_PARALLEL4 "パラレルポート4" +#define STR_SERIAL_PASS1 "Serial port passthrough 1" +#define STR_SERIAL_PASS2 "Serial port passthrough 2" +#define STR_SERIAL_PASS3 "Serial port passthrough 3" +#define STR_SERIAL_PASS4 "Serial port passthrough 4" -#define STR_HDC "HDコントローラー:" -#define STR_FDC "FDコントローラー:" -#define STR_IDE_TER "第三のIDEコントローラー" -#define STR_IDE_QUA "第四のIDEコントローラー" -#define STR_SCSI "SCSI" -#define STR_SCSI_1 "コントローラー1:" -#define STR_SCSI_2 "コントローラー2:" -#define STR_SCSI_3 "コントローラー3:" -#define STR_SCSI_4 "コントローラー4:" -#define STR_CASSETTE "カセット" +#define STR_HDC "HDコントローラー:" +#define STR_FDC "FDコントローラー:" +#define STR_IDE_TER "第三のIDEコントローラー" +#define STR_IDE_QUA "第四のIDEコントローラー" +#define STR_SCSI "SCSI" +#define STR_SCSI_1 "コントローラー1:" +#define STR_SCSI_2 "コントローラー2:" +#define STR_SCSI_3 "コントローラー3:" +#define STR_SCSI_4 "コントローラー4:" +#define STR_CASSETTE "カセット" -#define STR_HDD "ハードディスク:" -#define STR_NEW "新規(&N)..." -#define STR_EXISTING "既定(&E)..." -#define STR_REMOVE "除去(&R)" -#define STR_BUS "バス:" -#define STR_CHANNEL "チャンネル:" -#define STR_ID "ID:" -#define STR_SPEED "Speed:" +#define STR_HDD "ハードディスク:" +#define STR_NEW "新規(&N)..." +#define STR_EXISTING "既定(&E)..." +#define STR_REMOVE "除去(&R)" +#define STR_BUS "バス:" +#define STR_CHANNEL "チャンネル:" +#define STR_ID "ID:" +#define STR_SPEED "Speed:" -#define STR_SPECIFY "参照(&S)..." -#define STR_SECTORS "セクター:" -#define STR_HEADS "ヘッド:" -#define STR_CYLS "シリンダー:" -#define STR_SIZE_MB "サイズ(MB):" -#define STR_TYPE "タイプ:" -#define STR_IMG_FORMAT "イメージ形式:" -#define STR_BLOCK_SIZE "ブロックサイズ:" +#define STR_SPECIFY "参照(&S)..." +#define STR_SECTORS "セクター:" +#define STR_HEADS "ヘッド:" +#define STR_CYLS "シリンダー:" +#define STR_SIZE_MB "サイズ(MB):" +#define STR_TYPE "タイプ:" +#define STR_IMG_FORMAT "イメージ形式:" +#define STR_BLOCK_SIZE "ブロックサイズ:" -#define STR_FLOPPY_DRIVES "フロッピードライブ:" -#define STR_TURBO "高速タイミング" -#define STR_CHECKBPB "BPBをチェック" -#define STR_CDROM_DRIVES "CD-ROMドライブ:" -#define STR_CD_SPEED "速度:" -#define STR_EARLY "アーリードライブ" +#define STR_FLOPPY_DRIVES "フロッピードライブ:" +#define STR_TURBO "高速タイミング" +#define STR_CHECKBPB "BPBをチェック" +#define STR_CDROM_DRIVES "CD-ROMドライブ:" +#define STR_CD_SPEED "速度:" +#define STR_EARLY "アーリードライブ" -#define STR_MO_DRIVES "光磁気ドライブ:" -#define STR_ZIP_DRIVES "ZIPドライブ:" -#define STR_250 "ZIP 250" +#define STR_MO_DRIVES "光磁気ドライブ:" +#define STR_ZIP_DRIVES "ZIPドライブ:" +#define STR_250 "ZIP 250" -#define STR_ISARTC "ISA RTCカード:" -#define STR_ISAMEM "ISAメモリー拡張カード" -#define STR_ISAMEM_1 "カード1:" -#define STR_ISAMEM_2 "カード2:" -#define STR_ISAMEM_3 "カード3:" -#define STR_ISAMEM_4 "カード4:" -#define STR_BUGGER "ISABuggerデバイス" -#define STR_POSTCARD "POSTカード" +#define STR_ISARTC "ISA RTCカード:" +#define STR_ISAMEM "ISAメモリー拡張カード" +#define STR_ISAMEM_1 "カード1:" +#define STR_ISAMEM_2 "カード2:" +#define STR_ISAMEM_3 "カード3:" +#define STR_ISAMEM_4 "カード4:" +#define STR_BUGGER "ISABuggerデバイス" +#define STR_POSTCARD "POSTカード" -#define FONT_SIZE 9 -#define FONT_NAME "Meiryo UI" +#define FONT_SIZE 9 +#define FONT_NAME "Meiryo UI" #include "dialogs.rc" @@ -394,149 +394,149 @@ END STRINGTABLE DISCARDABLE BEGIN - 2048 "86Box" - IDS_2049 "エラー" - IDS_2050 "致命的なエラー" - IDS_2051 " - 一時停止" - IDS_2052 "Ctrl+Alt+PgDnでウィンドウモードに戻ります。" - IDS_2053 "速度" - IDS_2054 "ZIP %03i %i (%s): %ls" - IDS_2055 "ZIPイメージ (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" - IDS_2056 "86Boxで使用可能なROMイメージが見つかりませんでした。\n\nROMセットをダウンロードして、「roms」ディレクトリに解凍してください。" - IDS_2057 "(空)" - IDS_2058 "ZIPイメージ (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0すべてのファイル (*.*)\0*.*\0" - IDS_2059 "高速" - IDS_2060 "オン" - IDS_2061 "オフ" - IDS_2062 "すべてのイメージ (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0基本的なセクターイメージ (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0表面イメージ (*.86F)\0*.86F\0" - IDS_2063 "roms/machinesディレクトリにROMがないため、マシン「%hs」は使用できません。使用可能なマシンに切り替えます。" + 2048 "86Box" + IDS_2049 "エラー" + IDS_2050 "致命的なエラー" + IDS_2051 " - 一時停止" + IDS_2052 "Ctrl+Alt+PgDnでウィンドウモードに戻ります。" + IDS_2053 "速度" + IDS_2054 "ZIP %03i %i (%s): %ls" + IDS_2055 "ZIPイメージ (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" + IDS_2056 "86Boxで使用可能なROMイメージが見つかりませんでした。\n\nROMセットをダウンロードして、「roms」ディレクトリに解凍してください。" + IDS_2057 "(空)" + IDS_2058 "ZIPイメージ (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0すべてのファイル (*.*)\0*.*\0" + IDS_2059 "高速" + IDS_2060 "オン" + IDS_2061 "オフ" + IDS_2062 "すべてのイメージ (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0基本的なセクターイメージ (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0表面イメージ (*.86F)\0*.86F\0" + IDS_2063 "roms/machinesディレクトリにROMがないため、マシン「%hs」は使用できません。使用可能なマシンに切り替えます。" END STRINGTABLE DISCARDABLE BEGIN - IDS_2064 "roms/videoディレクトリにROMがないため、ビデオカード「%hs」は使用できません。使用可能なビデオカードに切り替えます。" - IDS_2065 "マシン" - IDS_2066 "画面表示" - IDS_2067 "入力デバイス" - IDS_2068 "サウンド" - IDS_2069 "ネットワーク" - IDS_2070 "ポート (COM & LPT)" - IDS_2071 "ストレージコントローラ" - IDS_2072 "ハードディスク" - IDS_2073 "フロッピー/CD-ROMドライブ" - IDS_2074 "その他のリムーバブルデバイス" - IDS_2075 "その他の周辺装置" - IDS_2076 "表面イメージ (*.86F)\0*.86F\0" - IDS_2077 "クリックするとマウスをキャプチャします" - IDS_2078 "F8+F12キーでマウスを解放します" - IDS_2079 "F8+F12キーまたは中ボタンでマウスを解放します" + IDS_2064 "roms/videoディレクトリにROMがないため、ビデオカード「%hs」は使用できません。使用可能なビデオカードに切り替えます。" + IDS_2065 "マシン" + IDS_2066 "画面表示" + IDS_2067 "入力デバイス" + IDS_2068 "サウンド" + IDS_2069 "ネットワーク" + IDS_2070 "ポート (COM & LPT)" + IDS_2071 "ストレージコントローラ" + IDS_2072 "ハードディスク" + IDS_2073 "フロッピー/CD-ROMドライブ" + IDS_2074 "その他のリムーバブルデバイス" + IDS_2075 "その他の周辺装置" + IDS_2076 "表面イメージ (*.86F)\0*.86F\0" + IDS_2077 "クリックするとマウスをキャプチャします" + IDS_2078 "F8+F12キーでマウスを解放します" + IDS_2079 "F8+F12キーまたは中ボタンでマウスを解放します" END STRINGTABLE DISCARDABLE BEGIN - IDS_2080 "FluidSynthが初期化できません" - IDS_2081 "バス" - IDS_2082 "ファイル" - IDS_2083 "C" - IDS_2084 "H" - IDS_2085 "S" - IDS_2086 "MB" + IDS_2080 "FluidSynthが初期化できません" + IDS_2081 "バス" + IDS_2082 "ファイル" + IDS_2083 "C" + IDS_2084 "H" + IDS_2085 "S" + IDS_2086 "MB" IDS_2087 "Speed" - IDS_2088 "BPBをチェック" - IDS_2089 "KB" - IDS_2090 "ビデオレンダラーが初期化できません。" - IDS_2091 "既定値" - IDS_2092 "%iつの待機状態" - IDS_2093 "タイプ" - IDS_2094 "PCapのセットアップに失敗しました" - IDS_2095 "PCapデバイスがありません" - IDS_2096 "不正なPCapデバイスです" - IDS_2097 "標準ジョイスティック(2ボタン)" - IDS_2098 "標準ジョイスティック(4ボタン)" - IDS_2099 "標準ジョイスティック(6ボタン)" - IDS_2100 "標準ジョイスティック(8ボタン)" - IDS_2101 "CH Flightstick Pro" - IDS_2102 "Microsoft SideWinder Pad" - IDS_2103 "Thrustmaster Flight Control System" - IDS_2104 "なし" - IDS_2105 "キーボードアクセラレータを読み込めません。" - IDS_2106 "生の入力が登録できません。" - IDS_2107 "%u" - IDS_2108 "%u MB (CHS: %i, %i, %i)" - IDS_2109 "フロッピー %i (%s): %ls" - IDS_2110 "すべてのイメージ (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0アドバンスドセクターイメージ (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0基本セクターイメージ (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0フラックスイメージ (*.FDI)\0*.FDI\0表面イメージ (*.86F;*.MFM)\0*.86F;*.MFM\0すべてのファイル (*.*)\0*.*\0" - IDS_2111 "FreeTypeが初期化できません" - IDS_2112 "SDLが初期化できません。SDL2.dllが必要です" - IDS_2113 "使用中のマシンをハードリセットしますか?" - IDS_2114 "86Boxを終了しますか?" - IDS_2115 "Ghostscriptが初期化できません" - IDS_2116 "光磁気 %i (%ls): %ls" - IDS_2117 "光磁気イメージ (*.IM?;*.MDI)\0*.IM?;*.MDI\0すべてのファイル (*.*)\0*.*\0" - IDS_2118 "86Boxへようこそ!" - IDS_2119 "内蔵コントローラー" - IDS_2120 "終了" - IDS_2121 "ROMが見つかりません" - IDS_2122 "設定を保存しますか?" - IDS_2123 "保存すると使用中のマシンがハードリセットされます。" - IDS_2124 "保存" - IDS_2125 "86Boxのバージョン情報" - IDS_2126 "86Box v" EMU_VERSION + IDS_2088 "BPBをチェック" + IDS_2089 "KB" + IDS_2090 "ビデオレンダラーが初期化できません。" + IDS_2091 "既定値" + IDS_2092 "%iつの待機状態" + IDS_2093 "タイプ" + IDS_2094 "PCapのセットアップに失敗しました" + IDS_2095 "PCapデバイスがありません" + IDS_2096 "不正なPCapデバイスです" + IDS_2097 "標準ジョイスティック(2ボタン)" + IDS_2098 "標準ジョイスティック(4ボタン)" + IDS_2099 "標準ジョイスティック(6ボタン)" + IDS_2100 "標準ジョイスティック(8ボタン)" + IDS_2101 "CH Flightstick Pro" + IDS_2102 "Microsoft SideWinder Pad" + IDS_2103 "Thrustmaster Flight Control System" + IDS_2104 "なし" + IDS_2105 "キーボードアクセラレータを読み込めません。" + IDS_2106 "生の入力が登録できません。" + IDS_2107 "%u" + IDS_2108 "%u MB (CHS: %i, %i, %i)" + IDS_2109 "フロッピー %i (%s): %ls" + IDS_2110 "すべてのイメージ (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0アドバンスドセクターイメージ (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0基本セクターイメージ (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0フラックスイメージ (*.FDI)\0*.FDI\0表面イメージ (*.86F;*.MFM)\0*.86F;*.MFM\0すべてのファイル (*.*)\0*.*\0" + IDS_2111 "FreeTypeが初期化できません" + IDS_2112 "SDLが初期化できません。SDL2.dllが必要です" + IDS_2113 "使用中のマシンをハードリセットしますか?" + IDS_2114 "86Boxを終了しますか?" + IDS_2115 "Ghostscriptが初期化できません" + IDS_2116 "光磁気 %i (%ls): %ls" + IDS_2117 "光磁気イメージ (*.IM?;*.MDI)\0*.IM?;*.MDI\0すべてのファイル (*.*)\0*.*\0" + IDS_2118 "86Boxへようこそ!" + IDS_2119 "内蔵コントローラー" + IDS_2120 "終了" + IDS_2121 "ROMが見つかりません" + IDS_2122 "設定を保存しますか?" + IDS_2123 "保存すると使用中のマシンがハードリセットされます。" + IDS_2124 "保存" + IDS_2125 "86Boxのバージョン情報" + IDS_2126 "86Box v" EMU_VERSION - IDS_2127 "古いパソコンのエミュレーター\n\n著者: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, Tiseno100, reenigne, leilei, JohnElliott, greatpsycho, and others.\n\nGNU General Public License version 2以降でリリースされています。詳しくは LICENSE をご覧ください。" - IDS_2128 "OK" - IDS_2129 "ハードウェアが利用できません" + IDS_2127 "古いパソコンのエミュレーター\n\n著者: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, Tiseno100, reenigne, leilei, JohnElliott, greatpsycho, and others.\n\nGNU General Public License version 2以降でリリースされています。詳しくは LICENSE をご覧ください。" + IDS_2128 "OK" + IDS_2129 "ハードウェアが利用できません" #ifdef _WIN32 #define LIB_NAME_PCAP "WinPcap" #else #define LIB_NAME_PCAP "libpcap" #endif - IDS_2130 LIB_NAME_PCAP "がインストールされてるか、" LIB_NAME_PCAP "に対応したネットワークに接続されてるか確認してください。" - IDS_2131 "不正な設定です" + IDS_2130 LIB_NAME_PCAP "がインストールされてるか、" LIB_NAME_PCAP "に対応したネットワークに接続されてるか確認してください。" + IDS_2131 "不正な設定です" #ifdef _WIN32 #define LIB_NAME_FREETYPE "freetype.dll" #else #define LIB_NAME_FREETYPE "libfreetype" #endif - IDS_2132 "ESC/Pプリンタのエミュレーションには" LIB_NAME_FREETYPE "が必要です。" + IDS_2132 "ESC/Pプリンタのエミュレーションには" LIB_NAME_FREETYPE "が必要です。" #ifdef _WIN32 #define LIB_NAME_GS "gsdll32.dll" #else #define LIB_NAME_GS "libgs" #endif - IDS_2133 "PostScriptファイルをPDFに自動変換するには" LIB_NAME_GS "が必要です。\n\n汎用PostScriptプリンターに送信されたドキュメントは、PostScript(.ps)ファイルとして保存されます。" + IDS_2133 "PostScriptファイルをPDFに自動変換するには" LIB_NAME_GS "が必要です。\n\n汎用PostScriptプリンターに送信されたドキュメントは、PostScript(.ps)ファイルとして保存されます。" #ifdef _WIN32 #define LIB_NAME_FLUIDSYNTH "libfluidsynth.dll" #else #define LIB_NAME_FLUIDSYNTH "libfluidsynth" #endif - IDS_2134 "FluidSynthのMIDI出力には" LIB_NAME_FLUIDSYNTH "が必要です。" - IDS_2135 "フルスクリーンに切り替えています" - IDS_2136 "今後、このメッセージを表示しない" - IDS_2137 "終了しない" - IDS_2138 "リセット" - IDS_2139 "リセットしない" - IDS_2140 "光磁気イメージ (*.IM?;*.MDI)\0*.IM?;*.MDI\0すべてのファイル (*.*)\0*.*\0" - IDS_2141 "CD-ROMイメージ (*.ISO;*.CUE)\0*.ISO;*.CUE\0すべてのファイル (*.*)\0*.*\0" - IDS_2142 "%hs デバイスの設定" + IDS_2134 "FluidSynthのMIDI出力には" LIB_NAME_FLUIDSYNTH "が必要です。" + IDS_2135 "フルスクリーンに切り替えています" + IDS_2136 "今後、このメッセージを表示しない" + IDS_2137 "終了しない" + IDS_2138 "リセット" + IDS_2139 "リセットしない" + IDS_2140 "光磁気イメージ (*.IM?;*.MDI)\0*.IM?;*.MDI\0すべてのファイル (*.*)\0*.*\0" + IDS_2141 "CD-ROMイメージ (*.ISO;*.CUE)\0*.ISO;*.CUE\0すべてのファイル (*.*)\0*.*\0" + IDS_2142 "%hs デバイスの設定" IDS_2143 "モニターのスリープモード" - IDS_2144 "OpenGLシェーダー (*.GLSL)\0*.GLSL\0すべてのファイル (*.*)\0*.*\0" - IDS_2145 "OpenGL設定" - IDS_2146 "サポートされていない設定を読み込んでいます" - IDS_2147 "選択したマシンに基づくCPUタイプのフィルタリングは、このエミュレートされたマシンでは無効になっています。\n\nこれにより、選択したマシンと互換性のないCPUが選択できます。ただし、マシンのBIOSまたは他のソフトウェアとの互換性が失われる可能性があります。\n\nこの設定の有効化は公式サポートができません。また、バグレポートが無効として閉じられる場合があります。" - IDS_2148 "続行" - IDS_2149 "カセット: %s" - IDS_2150 "カセットイメージ (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0すべてのファイル (*.*)\0*.*\0" - IDS_2151 "カートリッジ %i: %ls" - IDS_2152 "カートリッジイメージ (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0すべてのファイル (*.*)\0*.*\0" - IDS_2153 "レンダラーの初期化エラー" - IDS_2154 "OpenGL (3.0コア) レンダラーが初期化できませんでした。別のレンダラーを使用してください。" - IDS_2155 "実行を再開" - IDS_2156 "実行を一時停止" - IDS_2157 "Ctrl+Alt+DELを押し" - IDS_2158 "Ctrl+Alt+Escを押し" - IDS_2159 "ハードリセット" - IDS_2160 "ACPIシャットダウン" - IDS_2161 "設定" + IDS_2144 "OpenGLシェーダー (*.GLSL)\0*.GLSL\0すべてのファイル (*.*)\0*.*\0" + IDS_2145 "OpenGL設定" + IDS_2146 "サポートされていない設定を読み込んでいます" + IDS_2147 "選択したマシンに基づくCPUタイプのフィルタリングは、このエミュレートされたマシンでは無効になっています。\n\nこれにより、選択したマシンと互換性のないCPUが選択できます。ただし、マシンのBIOSまたは他のソフトウェアとの互換性が失われる可能性があります。\n\nこの設定の有効化は公式サポートができません。また、バグレポートが無効として閉じられる場合があります。" + IDS_2148 "続行" + IDS_2149 "カセット: %s" + IDS_2150 "カセットイメージ (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0すべてのファイル (*.*)\0*.*\0" + IDS_2151 "カートリッジ %i: %ls" + IDS_2152 "カートリッジイメージ (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0すべてのファイル (*.*)\0*.*\0" + IDS_2153 "レンダラーの初期化エラー" + IDS_2154 "OpenGL (3.0コア) レンダラーが初期化できませんでした。別のレンダラーを使用してください。" + IDS_2155 "実行を再開" + IDS_2156 "実行を一時停止" + IDS_2157 "Ctrl+Alt+DELを押し" + IDS_2158 "Ctrl+Alt+Escを押し" + IDS_2159 "ハードリセット" + IDS_2160 "ACPIシャットダウン" + IDS_2161 "設定" IDS_2162 "アーリードライブ" IDS_2163 "No Dynarec" IDS_2164 "Old Dynarec" @@ -547,45 +547,45 @@ END STRINGTABLE DISCARDABLE BEGIN IDS_4096 "ハードディスク (%s)" - IDS_4097 "%01i:%01i" - IDS_4098 "%01i" - IDS_4099 "MFM/RLLまたはESDIのCD-ROMドライブが存在しません" - IDS_4100 "カスタム..." - IDS_4101 "カスタム (大型)..." - IDS_4102 "新規のディスクを追加" - IDS_4103 "既定のディスクを追加" - IDS_4104 "HDIディスクイメージは4GBを超えることはできません。" - IDS_4105 "ディスクイメージは127GBを超えることはできません。" - IDS_4106 "ハードディスクイメージ (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0すべてのファイル (*.*)\0*.*\0" - IDS_4107 "ファイルの読み込みができません" - IDS_4108 "ファイルの書き込みができません" - IDS_4109 "512以外のセクタサイズを持つHDIまたはHDXイメージはサポートされていません。" - IDS_4110 "USBはまだサポートされていません" - IDS_4111 "ディスクイメージファイルが既に存在します" - IDS_4112 "有効なファイル名を指定してください。" - IDS_4113 "ディスクイメージが作成されました" - IDS_4114 "ファイルが存在し、読み取り可能であることを確認してください。" - IDS_4115 "ファイルが書き込み可能なディレクトリに保存されていることを確認してください。" - IDS_4116 "ディスクイメージのサイズが大きすぎます" - IDS_4117 "新規ドライブをパーティション分割し、フォーマットを必ずしといてください。" - IDS_4118 "選択したファイルが上書きされます。使っていいですか?" - IDS_4119 "サポートされていないディスクイメージ" - IDS_4120 "上書き" - IDS_4121 "上書きしない" - IDS_4122 "Rawイメージ (.img)" - IDS_4123 "HDIイメージ (.hdi)" - IDS_4124 "HDXイメージ (.hdx)" - IDS_4125 "VHD(容量固定)(.vhd)" - IDS_4126 "VHD(容量可変)(.vhd)" - IDS_4127 "VHD(差分)(.vhd)" - IDS_4128 "大型ブロック (2 MB)" - IDS_4129 "小型ブロック (512 KB)" - IDS_4130 "VHDファイル (*.VHD)\0*.VHD\0すべてのファイル (*.*)\0*.*\0" - IDS_4131 "親VHDの選択" - IDS_4132 "親イメージがディファレンシングイメージの作成の後に修正した可能性があります。\n\nイメージファイルの移動、コピーまたはこのディスクを作成したプログラムにバグが発生した可能性があります。\n\nタイムスタンプを修正しますか?" - IDS_4133 "親ディスクと子ディスクのタイムスタンプが一致しません" - IDS_4134 "VHD のタイムスタンプを修正できませんでした。" - IDS_4135 "%01i:%02i" + IDS_4097 "%01i:%01i" + IDS_4098 "%01i" + IDS_4099 "MFM/RLLまたはESDIのCD-ROMドライブが存在しません" + IDS_4100 "カスタム..." + IDS_4101 "カスタム (大型)..." + IDS_4102 "新規のディスクを追加" + IDS_4103 "既定のディスクを追加" + IDS_4104 "HDIディスクイメージは4GBを超えることはできません。" + IDS_4105 "ディスクイメージは127GBを超えることはできません。" + IDS_4106 "ハードディスクイメージ (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0すべてのファイル (*.*)\0*.*\0" + IDS_4107 "ファイルの読み込みができません" + IDS_4108 "ファイルの書き込みができません" + IDS_4109 "512以外のセクタサイズを持つHDIまたはHDXイメージはサポートされていません。" + IDS_4110 "USBはまだサポートされていません" + IDS_4111 "ディスクイメージファイルが既に存在します" + IDS_4112 "有効なファイル名を指定してください。" + IDS_4113 "ディスクイメージが作成されました" + IDS_4114 "ファイルが存在し、読み取り可能であることを確認してください。" + IDS_4115 "ファイルが書き込み可能なディレクトリに保存されていることを確認してください。" + IDS_4116 "ディスクイメージのサイズが大きすぎます" + IDS_4117 "新規ドライブをパーティション分割し、フォーマットを必ずしといてください。" + IDS_4118 "選択したファイルが上書きされます。使っていいですか?" + IDS_4119 "サポートされていないディスクイメージ" + IDS_4120 "上書き" + IDS_4121 "上書きしない" + IDS_4122 "Rawイメージ (.img)" + IDS_4123 "HDIイメージ (.hdi)" + IDS_4124 "HDXイメージ (.hdx)" + IDS_4125 "VHD(容量固定)(.vhd)" + IDS_4126 "VHD(容量可変)(.vhd)" + IDS_4127 "VHD(差分)(.vhd)" + IDS_4128 "大型ブロック (2 MB)" + IDS_4129 "小型ブロック (512 KB)" + IDS_4130 "VHDファイル (*.VHD)\0*.VHD\0すべてのファイル (*.*)\0*.*\0" + IDS_4131 "親VHDの選択" + IDS_4132 "親イメージがディファレンシングイメージの作成の後に修正した可能性があります。\n\nイメージファイルの移動、コピーまたはこのディスクを作成したプログラムにバグが発生した可能性があります。\n\nタイムスタンプを修正しますか?" + IDS_4133 "親ディスクと子ディスクのタイムスタンプが一致しません" + IDS_4134 "VHD のタイムスタンプを修正できませんでした。" + IDS_4135 "%01i:%02i" IDS_4352 "MFM/RLL" IDS_4353 "XTA" @@ -594,56 +594,56 @@ BEGIN IDS_4356 "ATAPI" IDS_4357 "SCSI" - IDS_4608 "MFM/RLL (%01i:%01i)" - IDS_4609 "XTA (%01i:%01i)" - IDS_4610 "ESDI (%01i:%01i)" - IDS_4611 "IDE (%01i:%01i)" - IDS_4612 "ATAPI (%01i:%01i)" - IDS_4613 "SCSI (%01i:%02i)" + IDS_4608 "MFM/RLL (%01i:%01i)" + IDS_4609 "XTA (%01i:%01i)" + IDS_4610 "ESDI (%01i:%01i)" + IDS_4611 "IDE (%01i:%01i)" + IDS_4612 "ATAPI (%01i:%01i)" + IDS_4613 "SCSI (%01i:%02i)" - IDS_5120 "CD-ROM %i (%s): %s" + IDS_5120 "CD-ROM %i (%s): %s" - IDS_5376 "使用しない" - IDS_5381 "ATAPI" + IDS_5376 "使用しない" + IDS_5381 "ATAPI" IDS_5382 "SCSI" - IDS_5632 "使用しない" - IDS_5637 "ATAPI (%01i:%01i)" + IDS_5632 "使用しない" + IDS_5637 "ATAPI (%01i:%01i)" IDS_5638 "SCSI (%01i:%02i)" - IDS_5888 "160 kB" - IDS_5889 "180 kB" - IDS_5890 "320 kB" - IDS_5891 "360 kB" - IDS_5892 "640 kB" - IDS_5893 "720 kB" - IDS_5894 "1.2 MB" - IDS_5895 "1.25 MB" - IDS_5896 "1.44 MB" - IDS_5897 "DMF (クラスター1024)" - IDS_5898 "DMF (クラスター2048)" - IDS_5899 "2.88 MB" - IDS_5900 "ZIP 100" - IDS_5901 "ZIP 250" - IDS_5902 "3.5"" 128 MB (ISO 10090)" - IDS_5903 "3.5"" 230 MB (ISO 13963)" - IDS_5904 "3.5"" 540 MB (ISO 15498)" - IDS_5905 "3.5"" 640 MB (ISO 15498)" - IDS_5906 "3.5"" 1.3 GB (GigaMO)" - IDS_5907 "3.5"" 2.3 GB (GigaMO 2)" - IDS_5908 "5.25"" 600 MB" - IDS_5909 "5.25"" 650 MB" - IDS_5910 "5.25"" 1 GB" - IDS_5911 "5.25"" 1.3 GB" + IDS_5888 "160 kB" + IDS_5889 "180 kB" + IDS_5890 "320 kB" + IDS_5891 "360 kB" + IDS_5892 "640 kB" + IDS_5893 "720 kB" + IDS_5894 "1.2 MB" + IDS_5895 "1.25 MB" + IDS_5896 "1.44 MB" + IDS_5897 "DMF (クラスター1024)" + IDS_5898 "DMF (クラスター2048)" + IDS_5899 "2.88 MB" + IDS_5900 "ZIP 100" + IDS_5901 "ZIP 250" + IDS_5902 "3.5"" 128 MB (ISO 10090)" + IDS_5903 "3.5"" 230 MB (ISO 13963)" + IDS_5904 "3.5"" 540 MB (ISO 15498)" + IDS_5905 "3.5"" 640 MB (ISO 15498)" + IDS_5906 "3.5"" 1.3 GB (GigaMO)" + IDS_5907 "3.5"" 2.3 GB (GigaMO 2)" + IDS_5908 "5.25"" 600 MB" + IDS_5909 "5.25"" 650 MB" + IDS_5910 "5.25"" 1 GB" + IDS_5911 "5.25"" 1.3 GB" - IDS_6144 "規定の回転数" - IDS_6145 "1%低い回転数" - IDS_6146 "1.5%低い回転数" - IDS_6147 "2%低い回転数" + IDS_6144 "規定の回転数" + IDS_6145 "1%低い回転数" + IDS_6146 "1.5%低い回転数" + IDS_6147 "2%低い回転数" - IDS_7168 "(システム既定値)" + IDS_7168 "(システム既定値)" END -#define IDS_LANG_ENUS IDS_7168 +#define IDS_LANG_ENUS IDS_7168 // Japanese resources ///////////////////////////////////////////////////////////////////////////// diff --git a/src/win/languages/ko-KR.rc b/src/win/languages/ko-KR.rc index bab31f72d..2ca9db02e 100644 --- a/src/win/languages/ko-KR.rc +++ b/src/win/languages/ko-KR.rc @@ -17,13 +17,13 @@ MainMenu MENU DISCARDABLE BEGIN POPUP "동작(&A)" BEGIN - MENUITEM "키보드는 캡쳐가 필요함(&K)", IDM_ACTION_KBD_REQ_CAPTURE - MENUITEM "우측CTRL로 좌측ALT 입력(&R)", IDM_ACTION_RCTRL_IS_LALT + MENUITEM "키보드는 캡쳐가 필요함(&K)", IDM_ACTION_KBD_REQ_CAPTURE + MENUITEM "우측CTRL로 좌측ALT 입력(&R)", IDM_ACTION_RCTRL_IS_LALT MENUITEM SEPARATOR MENUITEM "재시작(&H)...", IDM_ACTION_HRESET MENUITEM "Ctrl+Alt+Del(&C)\tCtrl+F12", IDM_ACTION_RESET_CAD MENUITEM SEPARATOR - MENUITEM "Ctrl+Alt+Esc(&E)", IDM_ACTION_CTRL_ALT_ESC + MENUITEM "Ctrl+Alt+Esc(&E)", IDM_ACTION_CTRL_ALT_ESC MENUITEM SEPARATOR MENUITEM "일시정지(&P)", IDM_ACTION_PAUSE MENUITEM SEPARATOR @@ -31,8 +31,8 @@ BEGIN END POPUP "표시(&V)" BEGIN - MENUITEM "상태 바 숨기기(&H)", IDM_VID_HIDE_STATUS_BAR - MENUITEM "Hide &toolbar", IDM_VID_HIDE_TOOLBAR + MENUITEM "상태 바 숨기기(&H)", IDM_VID_HIDE_STATUS_BAR + MENUITEM "Hide &toolbar", IDM_VID_HIDE_TOOLBAR MENUITEM SEPARATOR MENUITEM "&Show non-primary monitors", IDM_VID_MONITORS MENUITEM "창 크기 조절 가능하게 하기(&R)", IDM_VID_RESIZE @@ -101,11 +101,11 @@ BEGIN MENUITEM "CGA/PCjr/Tandy/EGA/(S)VGA 오버스캔(&G)", IDM_VID_OVERSCAN MENUITEM "흑백 표시를 위한 밝기 조정(&M)", IDM_VID_CGACON END - MENUITEM "미디어(&M)", IDM_MEDIA + MENUITEM "미디어(&M)", IDM_MEDIA POPUP "도구(&T)" BEGIN MENUITEM "설정(&S)...", IDM_CONFIG - MENUITEM "상태 바 아이콘 갱신하기(&U)", IDM_UPDATE_ICONS + MENUITEM "상태 바 아이콘 갱신하기(&U)", IDM_UPDATE_ICONS MENUITEM SEPARATOR MENUITEM "스크린샷 찍기(&C)\tCtrl+F11", IDM_ACTION_SCREENSHOT MENUITEM SEPARATOR @@ -137,17 +137,17 @@ CassetteSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "새 이미지(&N)...", IDM_CASSETTE_IMAGE_NEW + MENUITEM "새 이미지(&N)...", IDM_CASSETTE_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "이미지 불러오기(&E)...", IDM_CASSETTE_IMAGE_EXISTING - MENUITEM "이미지 불러오기 (쓰기방지)(&W)...", IDM_CASSETTE_IMAGE_EXISTING_WP + MENUITEM "이미지 불러오기(&E)...", IDM_CASSETTE_IMAGE_EXISTING + MENUITEM "이미지 불러오기 (쓰기방지)(&W)...", IDM_CASSETTE_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "녹음하기(&R)", IDM_CASSETTE_RECORD - MENUITEM "재생하기(&P)", IDM_CASSETTE_PLAY - MENUITEM "맨앞으로 되감기(&R)", IDM_CASSETTE_REWIND - MENUITEM "맨끝으로 빨리감기(&F)", IDM_CASSETTE_FAST_FORWARD + MENUITEM "녹음하기(&R)", IDM_CASSETTE_RECORD + MENUITEM "재생하기(&P)", IDM_CASSETTE_PLAY + MENUITEM "맨앞으로 되감기(&R)", IDM_CASSETTE_REWIND + MENUITEM "맨끝으로 빨리감기(&F)", IDM_CASSETTE_FAST_FORWARD MENUITEM SEPARATOR - MENUITEM "꺼내기(&J)", IDM_CASSETTE_EJECT + MENUITEM "꺼내기(&J)", IDM_CASSETTE_EJECT END END @@ -155,9 +155,9 @@ CartridgeSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "이미지(&I)...", IDM_CARTRIDGE_IMAGE + MENUITEM "이미지(&I)...", IDM_CARTRIDGE_IMAGE MENUITEM SEPARATOR - MENUITEM "꺼내기(&J)", IDM_CARTRIDGE_EJECT + MENUITEM "꺼내기(&J)", IDM_CARTRIDGE_EJECT END END @@ -165,14 +165,14 @@ FloppySubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "새 이미지(&N)...", IDM_FLOPPY_IMAGE_NEW + MENUITEM "새 이미지(&N)...", IDM_FLOPPY_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "이미지 불러오기(&E)...", IDM_FLOPPY_IMAGE_EXISTING - MENUITEM "이미지 불러오기 (쓰기방지)(&W)...", IDM_FLOPPY_IMAGE_EXISTING_WP + MENUITEM "이미지 불러오기(&E)...", IDM_FLOPPY_IMAGE_EXISTING + MENUITEM "이미지 불러오기 (쓰기방지)(&W)...", IDM_FLOPPY_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "86F로 보내기(&X)...", IDM_FLOPPY_EXPORT_TO_86F + MENUITEM "86F로 보내기(&X)...", IDM_FLOPPY_EXPORT_TO_86F MENUITEM SEPARATOR - MENUITEM "꺼내기(&J)", IDM_FLOPPY_EJECT + MENUITEM "꺼내기(&J)", IDM_FLOPPY_EJECT END END @@ -180,13 +180,13 @@ CdromSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "음소거(&M)", IDM_CDROM_MUTE + MENUITEM "음소거(&M)", IDM_CDROM_MUTE MENUITEM SEPARATOR - MENUITEM "비었음(&M)", IDM_CDROM_EMPTY - MENUITEM "이전 이미지 다시 불러오기(&R)", IDM_CDROM_RELOAD + MENUITEM "비었음(&M)", IDM_CDROM_EMPTY + MENUITEM "이전 이미지 다시 불러오기(&R)", IDM_CDROM_RELOAD MENUITEM SEPARATOR - MENUITEM "이미지(&I)...", IDM_CDROM_IMAGE - MENUITEM "폴더(&F)...", IDM_CDROM_DIR + MENUITEM "이미지(&I)...", IDM_CDROM_IMAGE + MENUITEM "폴더(&F)...", IDM_CDROM_DIR END END @@ -194,13 +194,13 @@ ZIPSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "새 이미지(&N)...", IDM_ZIP_IMAGE_NEW + MENUITEM "새 이미지(&N)...", IDM_ZIP_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "이미지 불러오기(&E)...", IDM_ZIP_IMAGE_EXISTING - MENUITEM "이미지 불러오기 (쓰기방지)(&W)...", IDM_ZIP_IMAGE_EXISTING_WP + MENUITEM "이미지 불러오기(&E)...", IDM_ZIP_IMAGE_EXISTING + MENUITEM "이미지 불러오기 (쓰기방지)(&W)...", IDM_ZIP_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "꺼내기(&J)", IDM_ZIP_EJECT - MENUITEM "이전 이미지 다시 불러오기(&R)", IDM_ZIP_RELOAD + MENUITEM "꺼내기(&J)", IDM_ZIP_EJECT + MENUITEM "이전 이미지 다시 불러오기(&R)", IDM_ZIP_RELOAD END END @@ -208,13 +208,13 @@ MOSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "새 이미지(&N)...", IDM_MO_IMAGE_NEW + MENUITEM "새 이미지(&N)...", IDM_MO_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "이미지 불러오기(&E)...", IDM_MO_IMAGE_EXISTING - MENUITEM "이미지 불러오기 (쓰기방지)(&W)...", IDM_MO_IMAGE_EXISTING_WP + MENUITEM "이미지 불러오기(&E)...", IDM_MO_IMAGE_EXISTING + MENUITEM "이미지 불러오기 (쓰기방지)(&W)...", IDM_MO_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "꺼내기(&J)", IDM_MO_EJECT - MENUITEM "이전 이미지 다시 불러오기(&R)", IDM_MO_RELOAD + MENUITEM "꺼내기(&J)", IDM_MO_EJECT + MENUITEM "이전 이미지 다시 불러오기(&R)", IDM_MO_RELOAD END END @@ -240,150 +240,150 @@ END // Dialog // -#define STR_PREFERENCES "환경설정" -#define STR_SND_GAIN "음량 증폭" -#define STR_NEW_FLOPPY "새 이미지" -#define STR_CONFIG "설정" -#define STR_SPECIFY_DIM "창 크기 지정" +#define STR_PREFERENCES "환경설정" +#define STR_SND_GAIN "음량 증폭" +#define STR_NEW_FLOPPY "새 이미지" +#define STR_CONFIG "설정" +#define STR_SPECIFY_DIM "창 크기 지정" -#define STR_OK "확인" -#define STR_CANCEL "취소" -#define STR_GLOBAL "이 설정들을 전역 기본값으로 저장하기(&G)" -#define STR_DEFAULT "기본값(&D)" -#define STR_LANGUAGE "언어:" -#define STR_ICONSET "아이콘셋:" +#define STR_OK "확인" +#define STR_CANCEL "취소" +#define STR_GLOBAL "이 설정들을 전역 기본값으로 저장하기(&G)" +#define STR_DEFAULT "기본값(&D)" +#define STR_LANGUAGE "언어:" +#define STR_ICONSET "아이콘셋:" -#define STR_GAIN "증가값" +#define STR_GAIN "증가값" -#define STR_FILE_NAME "파일명:" -#define STR_DISK_SIZE "디스크 용량:" -#define STR_RPM_MODE "RPM 모드:" -#define STR_PROGRESS "진행:" +#define STR_FILE_NAME "파일명:" +#define STR_DISK_SIZE "디스크 용량:" +#define STR_RPM_MODE "RPM 모드:" +#define STR_PROGRESS "진행:" -#define STR_WIDTH "가로:" -#define STR_HEIGHT "세로:" -#define STR_LOCK_TO_SIZE "크기 고정" +#define STR_WIDTH "가로:" +#define STR_HEIGHT "세로:" +#define STR_LOCK_TO_SIZE "크기 고정" -#define STR_MACHINE_TYPE "머신 종류:" -#define STR_MACHINE "기종:" -#define STR_CONFIGURE "설정" -#define STR_CPU_TYPE "CPU 종류:" -#define STR_CPU_SPEED "속도:" -#define STR_FPU "FPU:" -#define STR_WAIT_STATES "대기 상태:" -#define STR_MB "MB" -#define STR_MEMORY "메모리:" -#define STR_TIME_SYNC "시간 동기화" -#define STR_DISABLED "사용하지 않음" -#define STR_ENABLED_LOCAL "사용 (현지 시간)" -#define STR_ENABLED_UTC "사용 (UTC)" -#define STR_DYNAREC "동적 재컴파일" +#define STR_MACHINE_TYPE "머신 종류:" +#define STR_MACHINE "기종:" +#define STR_CONFIGURE "설정" +#define STR_CPU_TYPE "CPU 종류:" +#define STR_CPU_SPEED "속도:" +#define STR_FPU "FPU:" +#define STR_WAIT_STATES "대기 상태:" +#define STR_MB "MB" +#define STR_MEMORY "메모리:" +#define STR_TIME_SYNC "시간 동기화" +#define STR_DISABLED "사용하지 않음" +#define STR_ENABLED_LOCAL "사용 (현지 시간)" +#define STR_ENABLED_UTC "사용 (UTC)" +#define STR_DYNAREC "동적 재컴파일" -#define STR_VIDEO "비디오 카드:" -#define STR_VIDEO_2 "비디오 카드 2:" -#define STR_VOODOO "Voodoo 그래픽" -#define STR_IBM8514 "IBM 8514/a 그래픽" -#define STR_XGA "XGA 그래픽" +#define STR_VIDEO "비디오 카드:" +#define STR_VIDEO_2 "비디오 카드 2:" +#define STR_VOODOO "Voodoo 그래픽" +#define STR_IBM8514 "IBM 8514/a 그래픽" +#define STR_XGA "XGA 그래픽" -#define STR_MOUSE "마우스:" -#define STR_JOYSTICK "조이스틱:" -#define STR_JOY1 "조이스틱 1..." -#define STR_JOY2 "조이스틱 2..." -#define STR_JOY3 "조이스틱 3..." -#define STR_JOY4 "조이스틱 4..." +#define STR_MOUSE "마우스:" +#define STR_JOYSTICK "조이스틱:" +#define STR_JOY1 "조이스틱 1..." +#define STR_JOY2 "조이스틱 2..." +#define STR_JOY3 "조이스틱 3..." +#define STR_JOY4 "조이스틱 4..." -#define STR_SOUND1 "사운드 카드 1:" -#define STR_SOUND2 "사운드 카드 2:" -#define STR_SOUND3 "사운드 카드 3:" -#define STR_SOUND4 "사운드 카드 4:" -#define STR_MIDI_OUT "MIDI 출력 장치:" -#define STR_MIDI_IN "MIDI 입력 장치:" -#define STR_MPU401 "MPU-401 단독 사용" -#define STR_FLOAT "FLOAT32 사운드 사용" -#define STR_FM_DRIVER "FM 신디사이저 드라이버" -#define STR_FM_DRV_NUKED "Nuked (더 정확한)" -#define STR_FM_DRV_YMFM "YMFM (더 빠르게)" +#define STR_SOUND1 "사운드 카드 1:" +#define STR_SOUND2 "사운드 카드 2:" +#define STR_SOUND3 "사운드 카드 3:" +#define STR_SOUND4 "사운드 카드 4:" +#define STR_MIDI_OUT "MIDI 출력 장치:" +#define STR_MIDI_IN "MIDI 입력 장치:" +#define STR_MPU401 "MPU-401 단독 사용" +#define STR_FLOAT "FLOAT32 사운드 사용" +#define STR_FM_DRIVER "FM 신디사이저 드라이버" +#define STR_FM_DRV_NUKED "Nuked (더 정확한)" +#define STR_FM_DRV_YMFM "YMFM (더 빠르게)" -#define STR_NET_TYPE "네트워크 종류:" -#define STR_PCAP "PCap 장치:" -#define STR_NET "네트워크 어댑터:" -#define STR_NET1 "Network card 1:" -#define STR_NET2 "Network card 2:" -#define STR_NET3 "Network card 3:" -#define STR_NET4 "Network card 4:" +#define STR_NET_TYPE "네트워크 종류:" +#define STR_PCAP "PCap 장치:" +#define STR_NET "네트워크 어댑터:" +#define STR_NET1 "Network card 1:" +#define STR_NET2 "Network card 2:" +#define STR_NET3 "Network card 3:" +#define STR_NET4 "Network card 4:" -#define STR_COM1 "COM1 장치:" -#define STR_COM2 "COM2 장치:" -#define STR_COM3 "COM3 장치:" -#define STR_COM4 "COM4 장치:" -#define STR_LPT1 "LPT1 장치:" -#define STR_LPT2 "LPT2 장치:" -#define STR_LPT3 "LPT3 장치:" -#define STR_LPT4 "LPT4 장치:" -#define STR_SERIAL1 "직렬 포트 1" -#define STR_SERIAL2 "직렬 포트 2" -#define STR_SERIAL3 "직렬 포트 3" -#define STR_SERIAL4 "직렬 포트 4" -#define STR_PARALLEL1 "병렬 포트 1" -#define STR_PARALLEL2 "병렬 포트 2" -#define STR_PARALLEL3 "병렬 포트 3" -#define STR_PARALLEL4 "병렬 포트 4" -#define STR_SERIAL_PASS1 "Serial port passthrough 1" -#define STR_SERIAL_PASS2 "Serial port passthrough 2" -#define STR_SERIAL_PASS3 "Serial port passthrough 3" -#define STR_SERIAL_PASS4 "Serial port passthrough 4" +#define STR_COM1 "COM1 장치:" +#define STR_COM2 "COM2 장치:" +#define STR_COM3 "COM3 장치:" +#define STR_COM4 "COM4 장치:" +#define STR_LPT1 "LPT1 장치:" +#define STR_LPT2 "LPT2 장치:" +#define STR_LPT3 "LPT3 장치:" +#define STR_LPT4 "LPT4 장치:" +#define STR_SERIAL1 "직렬 포트 1" +#define STR_SERIAL2 "직렬 포트 2" +#define STR_SERIAL3 "직렬 포트 3" +#define STR_SERIAL4 "직렬 포트 4" +#define STR_PARALLEL1 "병렬 포트 1" +#define STR_PARALLEL2 "병렬 포트 2" +#define STR_PARALLEL3 "병렬 포트 3" +#define STR_PARALLEL4 "병렬 포트 4" +#define STR_SERIAL_PASS1 "Serial port passthrough 1" +#define STR_SERIAL_PASS2 "Serial port passthrough 2" +#define STR_SERIAL_PASS3 "Serial port passthrough 3" +#define STR_SERIAL_PASS4 "Serial port passthrough 4" -#define STR_HDC "HD 컨트롤러:" -#define STR_FDC "FD 컨트롤러:" -#define STR_IDE_TER "제3의 IDE 컨트롤러" -#define STR_IDE_QUA "제4의 IDE 컨트롤러" -#define STR_SCSI "SCSI" -#define STR_SCSI_1 "컨트롤러 1:" -#define STR_SCSI_2 "컨트롤러 2:" -#define STR_SCSI_3 "컨트롤러 3:" -#define STR_SCSI_4 "컨트롤러 4:" -#define STR_CASSETTE "카세트 테이프" +#define STR_HDC "HD 컨트롤러:" +#define STR_FDC "FD 컨트롤러:" +#define STR_IDE_TER "제3의 IDE 컨트롤러" +#define STR_IDE_QUA "제4의 IDE 컨트롤러" +#define STR_SCSI "SCSI" +#define STR_SCSI_1 "컨트롤러 1:" +#define STR_SCSI_2 "컨트롤러 2:" +#define STR_SCSI_3 "컨트롤러 3:" +#define STR_SCSI_4 "컨트롤러 4:" +#define STR_CASSETTE "카세트 테이프" -#define STR_HDD "하드 디스크:" -#define STR_NEW "새로 만들기(&N)..." -#define STR_EXISTING "불러오기(&E)..." -#define STR_REMOVE "목록에서 제거(&R)" -#define STR_BUS "버스:" -#define STR_CHANNEL "채널:" -#define STR_ID "ID:" -#define STR_SPEED "Speed:" +#define STR_HDD "하드 디스크:" +#define STR_NEW "새로 만들기(&N)..." +#define STR_EXISTING "불러오기(&E)..." +#define STR_REMOVE "목록에서 제거(&R)" +#define STR_BUS "버스:" +#define STR_CHANNEL "채널:" +#define STR_ID "ID:" +#define STR_SPEED "Speed:" -#define STR_SPECIFY "열기(&S)..." -#define STR_SECTORS "섹터:" -#define STR_HEADS "헤드:" -#define STR_CYLS "실린더:" -#define STR_SIZE_MB "용량(MB):" -#define STR_TYPE "형식:" -#define STR_IMG_FORMAT "이미지 포맷:" -#define STR_BLOCK_SIZE "블록 크기:" +#define STR_SPECIFY "열기(&S)..." +#define STR_SECTORS "섹터:" +#define STR_HEADS "헤드:" +#define STR_CYLS "실린더:" +#define STR_SIZE_MB "용량(MB):" +#define STR_TYPE "형식:" +#define STR_IMG_FORMAT "이미지 포맷:" +#define STR_BLOCK_SIZE "블록 크기:" -#define STR_FLOPPY_DRIVES "플로피 드라이브:" -#define STR_TURBO "고속 동작" -#define STR_CHECKBPB "BPB 확인" -#define STR_CDROM_DRIVES "CD-ROM 드라이브:" -#define STR_CD_SPEED "속도:" -#define STR_EARLY "이전 드라이브" +#define STR_FLOPPY_DRIVES "플로피 드라이브:" +#define STR_TURBO "고속 동작" +#define STR_CHECKBPB "BPB 확인" +#define STR_CDROM_DRIVES "CD-ROM 드라이브:" +#define STR_CD_SPEED "속도:" +#define STR_EARLY "이전 드라이브" -#define STR_MO_DRIVES "광자기 드라이브:" -#define STR_ZIP_DRIVES "ZIP 드라이브:" -#define STR_250 "ZIP 250" +#define STR_MO_DRIVES "광자기 드라이브:" +#define STR_ZIP_DRIVES "ZIP 드라이브:" +#define STR_250 "ZIP 250" -#define STR_ISARTC "ISA RTC 카드:" -#define STR_ISAMEM "ISA 메모리 확장 카드" -#define STR_ISAMEM_1 "카드 1:" -#define STR_ISAMEM_2 "카드 2:" -#define STR_ISAMEM_3 "카드 3:" -#define STR_ISAMEM_4 "카드 4:" -#define STR_BUGGER "ISABugger 장치" -#define STR_POSTCARD "POST 카드" +#define STR_ISARTC "ISA RTC 카드:" +#define STR_ISAMEM "ISA 메모리 확장 카드" +#define STR_ISAMEM_1 "카드 1:" +#define STR_ISAMEM_2 "카드 2:" +#define STR_ISAMEM_3 "카드 3:" +#define STR_ISAMEM_4 "카드 4:" +#define STR_BUGGER "ISABugger 장치" +#define STR_POSTCARD "POST 카드" -#define FONT_SIZE 9 -#define FONT_NAME "Malgun Gothic" +#define FONT_SIZE 9 +#define FONT_NAME "Malgun Gothic" #include "dialogs.rc" @@ -394,149 +394,149 @@ END STRINGTABLE DISCARDABLE BEGIN - 2048 "86Box" - IDS_2049 "오류" - IDS_2050 "치명적인 오류" - IDS_2051 " - PAUSED" - IDS_2052 "Ctrl+Alt+PgDn 키를 누르면 창 모드로 전환합니다." - IDS_2053 "속도" - IDS_2054 "ZIP %03i %i (%s): %ls" - IDS_2055 "ZIP 이미지 (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" - IDS_2056 "86Box에서 사용 가능한 ROM 이미지를 찾을 수 없습니다.\n\nROM 세트를다운로드 후 ""roms"" 디렉토리에 압축을 풀어 주세요." - IDS_2057 "(비었음)" - IDS_2058 "ZIP 이미지 (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0모든 파일 (*.*)\0*.*\0" - IDS_2059 "터보" - IDS_2060 "켜짐" - IDS_2061 "꺼짐" - IDS_2062 "모든 이미지 (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0기본 섹터 이미지 (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0표면 이미지 (*.86F)\0*.86F\0" - IDS_2063 "roms/machines 디렉토리에 필요한 롬파일이 없어 기종 ""%hs""을(를) 사용할 수 없습니다. 사용 가능한 기종으로 변경합니다." + 2048 "86Box" + IDS_2049 "오류" + IDS_2050 "치명적인 오류" + IDS_2051 " - PAUSED" + IDS_2052 "Ctrl+Alt+PgDn 키를 누르면 창 모드로 전환합니다." + IDS_2053 "속도" + IDS_2054 "ZIP %03i %i (%s): %ls" + IDS_2055 "ZIP 이미지 (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" + IDS_2056 "86Box에서 사용 가능한 ROM 이미지를 찾을 수 없습니다.\n\nROM 세트를다운로드 후 ""roms"" 디렉토리에 압축을 풀어 주세요." + IDS_2057 "(비었음)" + IDS_2058 "ZIP 이미지 (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0모든 파일 (*.*)\0*.*\0" + IDS_2059 "터보" + IDS_2060 "켜짐" + IDS_2061 "꺼짐" + IDS_2062 "모든 이미지 (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0기본 섹터 이미지 (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0표면 이미지 (*.86F)\0*.86F\0" + IDS_2063 "roms/machines 디렉토리에 필요한 롬파일이 없어 기종 ""%hs""을(를) 사용할 수 없습니다. 사용 가능한 기종으로 변경합니다." END STRINGTABLE DISCARDABLE BEGIN - IDS_2064 "roms/video 디렉토리에 필요한 롬파일이 없어 비디오 카드 ""%hs""을(를) 사용할 수 없습니다. 사용 가능한 기종으로 변경합니다." - IDS_2065 "기종" - IDS_2066 "디스플레이" - IDS_2067 "입력 장치" - IDS_2068 "사운드" - IDS_2069 "네트워크" - IDS_2070 "포트 (COM & LPT)" - IDS_2071 "장치 컨트롤러" - IDS_2072 "하드 디스크" - IDS_2073 "플로피 / CD-ROM" - IDS_2074 "기타 이동식 저장장치" - IDS_2075 "기타 주변기기" - IDS_2076 "표면 이미지 (*.86F)\0*.86F\0" - IDS_2077 "이 창을 클릭하면 마우스를 사용합니다" - IDS_2078 "F12+F8키를 누르면 마우스를 해제합니다" - IDS_2079 "F12+F8키 또는 가운데 버튼을 클릭하면 마우스를 해제합니다" + IDS_2064 "roms/video 디렉토리에 필요한 롬파일이 없어 비디오 카드 ""%hs""을(를) 사용할 수 없습니다. 사용 가능한 기종으로 변경합니다." + IDS_2065 "기종" + IDS_2066 "디스플레이" + IDS_2067 "입력 장치" + IDS_2068 "사운드" + IDS_2069 "네트워크" + IDS_2070 "포트 (COM & LPT)" + IDS_2071 "장치 컨트롤러" + IDS_2072 "하드 디스크" + IDS_2073 "플로피 / CD-ROM" + IDS_2074 "기타 이동식 저장장치" + IDS_2075 "기타 주변기기" + IDS_2076 "표면 이미지 (*.86F)\0*.86F\0" + IDS_2077 "이 창을 클릭하면 마우스를 사용합니다" + IDS_2078 "F12+F8키를 누르면 마우스를 해제합니다" + IDS_2079 "F12+F8키 또는 가운데 버튼을 클릭하면 마우스를 해제합니다" END STRINGTABLE DISCARDABLE BEGIN - IDS_2080 "FluidSynth를 초기화할 수 없습니다" - IDS_2081 "버스" - IDS_2082 "파일" - IDS_2083 "C" - IDS_2084 "H" - IDS_2085 "S" - IDS_2086 "MB" + IDS_2080 "FluidSynth를 초기화할 수 없습니다" + IDS_2081 "버스" + IDS_2082 "파일" + IDS_2083 "C" + IDS_2084 "H" + IDS_2085 "S" + IDS_2086 "MB" IDS_2087 "Speed" - IDS_2088 "BPB 확인" - IDS_2089 "KB" - IDS_2090 "비디오 렌더러를 초기화할 수 없습니다." - IDS_2091 "기본값" - IDS_2092 "%i 대기 상태" - IDS_2093 "형식" - IDS_2094 "PCap 설정에 실패했습니다" - IDS_2095 "PCap 장치가 없습니다" - IDS_2096 "PCap 장치가 올바르지 않습니다" - IDS_2097 "표준 2버튼 조이스틱" - IDS_2098 "표준 4버튼 조이스틱" - IDS_2099 "표준 6버튼 조이스틱" - IDS_2100 "표준 8버튼 조이스틱" - IDS_2101 "CH Flightstick Pro" - IDS_2102 "Microsoft SideWinder Pad" - IDS_2103 "Thrustmaster Flight Control System" - IDS_2104 "없음" - IDS_2105 "키보드 가속기를 불러올 수 없습니다." - IDS_2106 "Raw 입력을 등록할 수 없습니다." - IDS_2107 "%u" - IDS_2108 "%u MB (CHS: %i, %i, %i)" - IDS_2109 "플로피 %i (%s): %ls" - IDS_2110 "모든 이미지 (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0어드밴스드 섹터 이미지 (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0기본 섹터 이미지 (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0플럭스 이미지 (*.FDI)\0*.FDI\0표면 이미지 (*.86F;*.MFM)\0*.86F;*.MFM\0모든 파일 (*.*)\0*.*\0" - IDS_2111 "FreeType을 초기화할 수 없습니다" - IDS_2112 "SDL을 초기화할 수 없습니다. SDL2.dll이 필요합니다" - IDS_2113 "실행중인 머신을 재시작하시겠습니까?" - IDS_2114 "86Box를 끝내시겠습니까?" - IDS_2115 "Ghostscript를 초기화할 수 없습니다" - IDS_2116 "광자기 %i (%ls): %ls" - IDS_2117 "광자기 이미지 (*.IM?;*.MDI)\0*.IM?;*.MDI\0모든 파일 (*.*)\0*.*\0" - IDS_2118 "86Box에 어서오세요!" - IDS_2119 "내부 컨트롤러" - IDS_2120 "끝내기" - IDS_2121 "ROM을 불러올 수 없습니다" - IDS_2122 "설정을 저장하시겠습니까?" - IDS_2123 "사용중인 머신이 재부팅됩니다." - IDS_2124 "저장" - IDS_2125 "86Box에 대해" - IDS_2126 "86Box v" EMU_VERSION + IDS_2088 "BPB 확인" + IDS_2089 "KB" + IDS_2090 "비디오 렌더러를 초기화할 수 없습니다." + IDS_2091 "기본값" + IDS_2092 "%i 대기 상태" + IDS_2093 "형식" + IDS_2094 "PCap 설정에 실패했습니다" + IDS_2095 "PCap 장치가 없습니다" + IDS_2096 "PCap 장치가 올바르지 않습니다" + IDS_2097 "표준 2버튼 조이스틱" + IDS_2098 "표준 4버튼 조이스틱" + IDS_2099 "표준 6버튼 조이스틱" + IDS_2100 "표준 8버튼 조이스틱" + IDS_2101 "CH Flightstick Pro" + IDS_2102 "Microsoft SideWinder Pad" + IDS_2103 "Thrustmaster Flight Control System" + IDS_2104 "없음" + IDS_2105 "키보드 가속기를 불러올 수 없습니다." + IDS_2106 "Raw 입력을 등록할 수 없습니다." + IDS_2107 "%u" + IDS_2108 "%u MB (CHS: %i, %i, %i)" + IDS_2109 "플로피 %i (%s): %ls" + IDS_2110 "모든 이미지 (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0어드밴스드 섹터 이미지 (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0기본 섹터 이미지 (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0플럭스 이미지 (*.FDI)\0*.FDI\0표면 이미지 (*.86F;*.MFM)\0*.86F;*.MFM\0모든 파일 (*.*)\0*.*\0" + IDS_2111 "FreeType을 초기화할 수 없습니다" + IDS_2112 "SDL을 초기화할 수 없습니다. SDL2.dll이 필요합니다" + IDS_2113 "실행중인 머신을 재시작하시겠습니까?" + IDS_2114 "86Box를 끝내시겠습니까?" + IDS_2115 "Ghostscript를 초기화할 수 없습니다" + IDS_2116 "광자기 %i (%ls): %ls" + IDS_2117 "광자기 이미지 (*.IM?;*.MDI)\0*.IM?;*.MDI\0모든 파일 (*.*)\0*.*\0" + IDS_2118 "86Box에 어서오세요!" + IDS_2119 "내부 컨트롤러" + IDS_2120 "끝내기" + IDS_2121 "ROM을 불러올 수 없습니다" + IDS_2122 "설정을 저장하시겠습니까?" + IDS_2123 "사용중인 머신이 재부팅됩니다." + IDS_2124 "저장" + IDS_2125 "86Box에 대해" + IDS_2126 "86Box v" EMU_VERSION - IDS_2127 "고전 컴퓨터 에뮬레이터\n\n저자: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, Tiseno100, reenigne, leilei, JohnElliott, greatpsycho, and others.\n\nGNU General Public 라이선스 (버전 2 이상)에 의해 배포되었습니다. 자세한 내용은 LICENSE 파일을 읽어 주세요." - IDS_2128 "확인" - IDS_2129 "하드웨어를 이용할 수 없습니다" + IDS_2127 "고전 컴퓨터 에뮬레이터\n\n저자: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, Tiseno100, reenigne, leilei, JohnElliott, greatpsycho, and others.\n\nGNU General Public 라이선스 (버전 2 이상)에 의해 배포되었습니다. 자세한 내용은 LICENSE 파일을 읽어 주세요." + IDS_2128 "확인" + IDS_2129 "하드웨어를 이용할 수 없습니다" #ifdef _WIN32 #define LIB_NAME_PCAP "WinPcap" #else #define LIB_NAME_PCAP "libpcap" #endif - IDS_2130 LIB_NAME_PCAP "이 설치되었는지 " LIB_NAME_PCAP "에 대응하는 네트워크에 접속되어 있는지 확인해 주세요." - IDS_2131 "올바르지 않은 설정입니다" + IDS_2130 LIB_NAME_PCAP "이 설치되었는지 " LIB_NAME_PCAP "에 대응하는 네트워크에 접속되어 있는지 확인해 주세요." + IDS_2131 "올바르지 않은 설정입니다" #ifdef _WIN32 #define LIB_NAME_FREETYPE "freetype.dll" #else #define LIB_NAME_FREETYPE "libfreetype" #endif - IDS_2132 "ESC/P 프린터 에뮬레이션에 " LIB_NAME_FREETYPE "이(가) 필요합니다." + IDS_2132 "ESC/P 프린터 에뮬레이션에 " LIB_NAME_FREETYPE "이(가) 필요합니다." #ifdef _WIN32 #define LIB_NAME_GS "gsdll32.dll" #else #define LIB_NAME_GS "libgs" #endif - IDS_2133 LIB_NAME_GS "은(는) PostScript 파일을 PDF로 자동변환하는 데에 필요합니다.\n\n표준 PostScript 프린터로 보내신 임의의 문서는 PostScript (.ps) 파일로 저장됩니다." + IDS_2133 LIB_NAME_GS "은(는) PostScript 파일을 PDF로 자동변환하는 데에 필요합니다.\n\n표준 PostScript 프린터로 보내신 임의의 문서는 PostScript (.ps) 파일로 저장됩니다." #ifdef _WIN32 #define LIB_NAME_FLUIDSYNTH "libfluidsynth.dll" #else #define LIB_NAME_FLUIDSYNTH "libfluidsynth" #endif - IDS_2134 "FluidSynth의 MIDI 출력에 " LIB_NAME_FLUIDSYNTH "이(가) 필요합니다." - IDS_2135 "전체 화면으로 전환" - IDS_2136 "이 메시지 그만 보기" - IDS_2137 "끝내지 않기" - IDS_2138 "재시작" - IDS_2139 "재시작 안함" - IDS_2140 "광자기 이미지 (*.IM?;*.MDI)\0*.IM?;*.MDI\0모든 파일 (*.*)\0*.*\0" - IDS_2141 "CD-ROM 이미지 (*.ISO;*.CUE)\0*.ISO;*.CUE\0모든 파일 (*.*)\0*.*\0" - IDS_2142 "%hs 장치 설정" + IDS_2134 "FluidSynth의 MIDI 출력에 " LIB_NAME_FLUIDSYNTH "이(가) 필요합니다." + IDS_2135 "전체 화면으로 전환" + IDS_2136 "이 메시지 그만 보기" + IDS_2137 "끝내지 않기" + IDS_2138 "재시작" + IDS_2139 "재시작 안함" + IDS_2140 "광자기 이미지 (*.IM?;*.MDI)\0*.IM?;*.MDI\0모든 파일 (*.*)\0*.*\0" + IDS_2141 "CD-ROM 이미지 (*.ISO;*.CUE)\0*.ISO;*.CUE\0모든 파일 (*.*)\0*.*\0" + IDS_2142 "%hs 장치 설정" IDS_2143 "모니터 절전 모드" - IDS_2144 "OpenGL 쉐이더 (*.GLSL)\0*.GLSL\0모든 파일 (*.*)\0*.*\0" - IDS_2145 "OpenGL 설정" - IDS_2146 "지원하지 않는 설정입니다" - IDS_2147 "이 에뮬레이트된 기종에 대해 선택한 기종을 기반으로 하는 CPU 종류 필터링이 사용되지 않도록 설정되었습니다.\n\n따라서 선택된 머신과 호환되지 않는 CPU를 선택하실 수 있습니다. 하지만 BIOS 또는 다른 소프트웨어와 호환되지 않을 수 있습니다.\n\n이 설정을 활성화하는 것은 공식적으로 지원되지 않으며, 제출된 버그 보고서는 유효하지 않음으로 닫힐 수 있습니다." - IDS_2148 "계속" - IDS_2149 "카세트: %s" - IDS_2150 "카세트 이미지 (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0모든 파일 (*.*)\0*.*\0" - IDS_2151 "카트리지 %i: %ls" - IDS_2152 "카트리지 이미지 (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0모든 파일 (*.*)\0*.*\0" - IDS_2153 "렌더러 초기화 오류" - IDS_2154 "OpenGL (3.0 Core) 렌더러를 초기화할 수 없습니다. 다른 렌더러를 사용하십시오." - IDS_2155 "실행 재개" - IDS_2156 "실행 일시 중지" - IDS_2157 "Ctrl+Alt+Del" - IDS_2158 "Ctrl+Alt+Esc" - IDS_2159 "재시작" - IDS_2160 "ACPI 종료" - IDS_2161 "설정" + IDS_2144 "OpenGL 쉐이더 (*.GLSL)\0*.GLSL\0모든 파일 (*.*)\0*.*\0" + IDS_2145 "OpenGL 설정" + IDS_2146 "지원하지 않는 설정입니다" + IDS_2147 "이 에뮬레이트된 기종에 대해 선택한 기종을 기반으로 하는 CPU 종류 필터링이 사용되지 않도록 설정되었습니다.\n\n따라서 선택된 머신과 호환되지 않는 CPU를 선택하실 수 있습니다. 하지만 BIOS 또는 다른 소프트웨어와 호환되지 않을 수 있습니다.\n\n이 설정을 활성화하는 것은 공식적으로 지원되지 않으며, 제출된 버그 보고서는 유효하지 않음으로 닫힐 수 있습니다." + IDS_2148 "계속" + IDS_2149 "카세트: %s" + IDS_2150 "카세트 이미지 (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0모든 파일 (*.*)\0*.*\0" + IDS_2151 "카트리지 %i: %ls" + IDS_2152 "카트리지 이미지 (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0모든 파일 (*.*)\0*.*\0" + IDS_2153 "렌더러 초기화 오류" + IDS_2154 "OpenGL (3.0 Core) 렌더러를 초기화할 수 없습니다. 다른 렌더러를 사용하십시오." + IDS_2155 "실행 재개" + IDS_2156 "실행 일시 중지" + IDS_2157 "Ctrl+Alt+Del" + IDS_2158 "Ctrl+Alt+Esc" + IDS_2159 "재시작" + IDS_2160 "ACPI 종료" + IDS_2161 "설정" IDS_2162 "이전 드라이브" IDS_2163 "No Dynarec" IDS_2164 "Old Dynarec" @@ -547,45 +547,45 @@ END STRINGTABLE DISCARDABLE BEGIN IDS_4096 "하드 디스크 (%s)" - IDS_4097 "%01i:%01i" - IDS_4098 "%01i" - IDS_4099 "MFM/RLL 또는 ESDI CD-ROM 드라이브가 존재하지 않습니다" - IDS_4100 "사용자 설정..." - IDS_4101 "사용자 설정 (대용량)..." - IDS_4102 "새로 생성" - IDS_4103 "기존 이미지 사용" - IDS_4104 "HDI 디스크 이미지는 4GB 이상으로 지정할 수 없습니다" - IDS_4105 "디스크 이미지는 127GB 이상으로 지정할 수 없습니다" - IDS_4106 "하드 디스크 이미지 (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0모든 파일 (*.*)\0*.*\0" - IDS_4107 "파일을 읽을 수 없습니다" - IDS_4108 "파일을 저장할 수 없습니다" - IDS_4109 "512 바이트 이외의 섹터 크기를 가진 HDI 또는 HDX 형식의 이미지를 생성할 수 없습니다" - IDS_4110 "USB는 아직 지원하지 않습니다" - IDS_4111 "디스크 이미지 파일이 이미 존재합니다" - IDS_4112 "올바른 파일명을 지정해 주세요." - IDS_4113 "디스크 이미지가 생성되었습니다" - IDS_4114 "파일이 존재하며 읽을 수 있는지 확인합니다." - IDS_4115 "파일이 쓰기 가능한 디렉토리에 저장되고 있는지 확인합니다." - IDS_4116 "디스크 이미지가 너무 큽니다" - IDS_4117 "새로 생성한 드라이브의 파티션 설정과 포맷을 꼭 해주세요." - IDS_4118 "선택하신 파일을 덮어씌웁니다. 사용하시겠습니까?" - IDS_4119 "지원하지 않는 디스크 이미지입니다" - IDS_4120 "덮어쓰기" - IDS_4121 "덮어쓰지 않음" - IDS_4122 "Raw 이미지 (.img)" - IDS_4123 "HDI 이미지 (.hdi)" - IDS_4124 "HDX 이미지 (.hdx)" - IDS_4125 "고정 사이즈 VHD (.vhd)" - IDS_4126 "동적 사이즈 VHD (.vhd)" - IDS_4127 "디퍼런싱 VHD (.vhd)" - IDS_4128 "대형 블록 (2 MB)" - IDS_4129 "소형 블록 (512 KB)" - IDS_4130 "VHD 파일 (*.VHD)\0*.VHD\0모든 파일 (*.*)\0*.*\0" - IDS_4131 "부모 VHD 선택" - IDS_4132 "이는 디퍼런싱 이미지가 생성된 후 부모 이미지가 수정되었음을 의미할 수 있습니다.\n\n이미지 파일이 이동 또는 복사된 경우 또는 이 디스크를 만든 프로그램의 버그로 인해 발생할 수도 있습니다.\n\n타임스탬프를 수정하시겠습니까?" - IDS_4133 "부모 디스크와 자식 디스크의 타임스탬프가 일치하지 않습니다" - IDS_4134 "VHD 타임스탬프를 고칠 수 없습니다" - IDS_4135 "%01i:%02i" + IDS_4097 "%01i:%01i" + IDS_4098 "%01i" + IDS_4099 "MFM/RLL 또는 ESDI CD-ROM 드라이브가 존재하지 않습니다" + IDS_4100 "사용자 설정..." + IDS_4101 "사용자 설정 (대용량)..." + IDS_4102 "새로 생성" + IDS_4103 "기존 이미지 사용" + IDS_4104 "HDI 디스크 이미지는 4GB 이상으로 지정할 수 없습니다" + IDS_4105 "디스크 이미지는 127GB 이상으로 지정할 수 없습니다" + IDS_4106 "하드 디스크 이미지 (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0모든 파일 (*.*)\0*.*\0" + IDS_4107 "파일을 읽을 수 없습니다" + IDS_4108 "파일을 저장할 수 없습니다" + IDS_4109 "512 바이트 이외의 섹터 크기를 가진 HDI 또는 HDX 형식의 이미지를 생성할 수 없습니다" + IDS_4110 "USB는 아직 지원하지 않습니다" + IDS_4111 "디스크 이미지 파일이 이미 존재합니다" + IDS_4112 "올바른 파일명을 지정해 주세요." + IDS_4113 "디스크 이미지가 생성되었습니다" + IDS_4114 "파일이 존재하며 읽을 수 있는지 확인합니다." + IDS_4115 "파일이 쓰기 가능한 디렉토리에 저장되고 있는지 확인합니다." + IDS_4116 "디스크 이미지가 너무 큽니다" + IDS_4117 "새로 생성한 드라이브의 파티션 설정과 포맷을 꼭 해주세요." + IDS_4118 "선택하신 파일을 덮어씌웁니다. 사용하시겠습니까?" + IDS_4119 "지원하지 않는 디스크 이미지입니다" + IDS_4120 "덮어쓰기" + IDS_4121 "덮어쓰지 않음" + IDS_4122 "Raw 이미지 (.img)" + IDS_4123 "HDI 이미지 (.hdi)" + IDS_4124 "HDX 이미지 (.hdx)" + IDS_4125 "고정 사이즈 VHD (.vhd)" + IDS_4126 "동적 사이즈 VHD (.vhd)" + IDS_4127 "디퍼런싱 VHD (.vhd)" + IDS_4128 "대형 블록 (2 MB)" + IDS_4129 "소형 블록 (512 KB)" + IDS_4130 "VHD 파일 (*.VHD)\0*.VHD\0모든 파일 (*.*)\0*.*\0" + IDS_4131 "부모 VHD 선택" + IDS_4132 "이는 디퍼런싱 이미지가 생성된 후 부모 이미지가 수정되었음을 의미할 수 있습니다.\n\n이미지 파일이 이동 또는 복사된 경우 또는 이 디스크를 만든 프로그램의 버그로 인해 발생할 수도 있습니다.\n\n타임스탬프를 수정하시겠습니까?" + IDS_4133 "부모 디스크와 자식 디스크의 타임스탬프가 일치하지 않습니다" + IDS_4134 "VHD 타임스탬프를 고칠 수 없습니다" + IDS_4135 "%01i:%02i" IDS_4352 "MFM/RLL" IDS_4353 "XTA" @@ -594,56 +594,56 @@ BEGIN IDS_4356 "ATAPI" IDS_4357 "SCSI" - IDS_4608 "MFM/RLL (%01i:%01i)" - IDS_4609 "XTA (%01i:%01i)" - IDS_4610 "ESDI (%01i:%01i)" - IDS_4611 "IDE (%01i:%01i)" - IDS_4612 "ATAPI (%01i:%01i)" - IDS_4613 "SCSI (%01i:%02i)" + IDS_4608 "MFM/RLL (%01i:%01i)" + IDS_4609 "XTA (%01i:%01i)" + IDS_4610 "ESDI (%01i:%01i)" + IDS_4611 "IDE (%01i:%01i)" + IDS_4612 "ATAPI (%01i:%01i)" + IDS_4613 "SCSI (%01i:%02i)" - IDS_5120 "CD-ROM %i (%s): %s" + IDS_5120 "CD-ROM %i (%s): %s" - IDS_5376 "사용하지 않음" - IDS_5381 "ATAPI" + IDS_5376 "사용하지 않음" + IDS_5381 "ATAPI" IDS_5382 "SCSI" - IDS_5632 "사용하지 않음" - IDS_5637 "ATAPI (%01i:%01i)" + IDS_5632 "사용하지 않음" + IDS_5637 "ATAPI (%01i:%01i)" IDS_5638 "SCSI (%01i:%02i)" - IDS_5888 "160 kB" - IDS_5889 "180 kB" - IDS_5890 "320 kB" - IDS_5891 "360 kB" - IDS_5892 "640 kB" - IDS_5893 "720 kB" - IDS_5894 "1.2 MB" - IDS_5895 "1.25 MB" - IDS_5896 "1.44 MB" - IDS_5897 "DMF (클러스터 1024)" - IDS_5898 "DMF (클러스터 2048)" - IDS_5899 "2.88 MB" - IDS_5900 "ZIP 100" - IDS_5901 "ZIP 250" - IDS_5902 "3.5"" 128 MB (ISO 10090)" - IDS_5903 "3.5"" 230 MB (ISO 13963)" - IDS_5904 "3.5"" 540 MB (ISO 15498)" - IDS_5905 "3.5"" 640 MB (ISO 15498)" - IDS_5906 "3.5"" 1.3 GB (GigaMO)" - IDS_5907 "3.5"" 2.3 GB (GigaMO 2)" - IDS_5908 "5.25"" 600 MB" - IDS_5909 "5.25"" 650 MB" - IDS_5910 "5.25"" 1 GB" - IDS_5911 "5.25"" 1.3 GB" + IDS_5888 "160 kB" + IDS_5889 "180 kB" + IDS_5890 "320 kB" + IDS_5891 "360 kB" + IDS_5892 "640 kB" + IDS_5893 "720 kB" + IDS_5894 "1.2 MB" + IDS_5895 "1.25 MB" + IDS_5896 "1.44 MB" + IDS_5897 "DMF (클러스터 1024)" + IDS_5898 "DMF (클러스터 2048)" + IDS_5899 "2.88 MB" + IDS_5900 "ZIP 100" + IDS_5901 "ZIP 250" + IDS_5902 "3.5"" 128 MB (ISO 10090)" + IDS_5903 "3.5"" 230 MB (ISO 13963)" + IDS_5904 "3.5"" 540 MB (ISO 15498)" + IDS_5905 "3.5"" 640 MB (ISO 15498)" + IDS_5906 "3.5"" 1.3 GB (GigaMO)" + IDS_5907 "3.5"" 2.3 GB (GigaMO 2)" + IDS_5908 "5.25"" 600 MB" + IDS_5909 "5.25"" 650 MB" + IDS_5910 "5.25"" 1 GB" + IDS_5911 "5.25"" 1.3 GB" - IDS_6144 "완벽한 회전수" - IDS_6145 "1% 낮은 회전수" - IDS_6146 "1.5% 낮은 회전수" - IDS_6147 "2% 낮은 회전수" + IDS_6144 "완벽한 회전수" + IDS_6145 "1% 낮은 회전수" + IDS_6146 "1.5% 낮은 회전수" + IDS_6147 "2% 낮은 회전수" - IDS_7168 "(시스템 기본값)" + IDS_7168 "(시스템 기본값)" END -#define IDS_LANG_ENUS IDS_7168 +#define IDS_LANG_ENUS IDS_7168 // Korean resources ///////////////////////////////////////////////////////////////////////////// diff --git a/src/win/languages/pl-PL.rc b/src/win/languages/pl-PL.rc index ce9747d80..e1e7979de 100644 --- a/src/win/languages/pl-PL.rc +++ b/src/win/languages/pl-PL.rc @@ -17,13 +17,13 @@ MainMenu MENU DISCARDABLE BEGIN POPUP "&Akcje" BEGIN - MENUITEM "&Klawaitura wymaga przechwytu myszy", IDM_ACTION_KBD_REQ_CAPTURE - MENUITEM "&Prawy CTRL to lewy Alt", IDM_ACTION_RCTRL_IS_LALT + MENUITEM "&Klawaitura wymaga przechwytu myszy", IDM_ACTION_KBD_REQ_CAPTURE + MENUITEM "&Prawy CTRL to lewy Alt", IDM_ACTION_RCTRL_IS_LALT MENUITEM SEPARATOR MENUITEM "&Twardy reset...", IDM_ACTION_HRESET MENUITEM "&Ctrl+Alt+Del\tCtrl+F12", IDM_ACTION_RESET_CAD MENUITEM SEPARATOR - MENUITEM "Ctrl+Alt+&Esc", IDM_ACTION_CTRL_ALT_ESC + MENUITEM "Ctrl+Alt+&Esc", IDM_ACTION_CTRL_ALT_ESC MENUITEM SEPARATOR MENUITEM "&Pauza", IDM_ACTION_PAUSE MENUITEM SEPARATOR @@ -31,8 +31,8 @@ BEGIN END POPUP "&Widok" BEGIN - MENUITEM "&Ukryj pasek statusu", IDM_VID_HIDE_STATUS_BAR - MENUITEM "Ukryj &pasek narzędzi", IDM_VID_HIDE_TOOLBAR + MENUITEM "&Ukryj pasek statusu", IDM_VID_HIDE_STATUS_BAR + MENUITEM "Ukryj &pasek narzędzi", IDM_VID_HIDE_TOOLBAR MENUITEM SEPARATOR MENUITEM "&Show non-primary monitors", IDM_VID_MONITORS MENUITEM "&Okno o zmiennym rozmiarze", IDM_VID_RESIZE @@ -101,15 +101,15 @@ BEGIN MENUITEM "Overscan dla CGA/PCjr/Tandy/E&GA/(S)VGA", IDM_VID_OVERSCAN MENUITEM "Zmień kontrast dla &monochromatycznego ekranu", IDM_VID_CGACON END - MENUITEM "&Nośnik", IDM_MEDIA + MENUITEM "&Nośnik", IDM_MEDIA POPUP "&Narzędzia" BEGIN MENUITEM "&Ustawienia...", IDM_CONFIG - MENUITEM "&Aktualizuj ikony na pasku statusu", IDM_UPDATE_ICONS + MENUITEM "&Aktualizuj ikony na pasku statusu", IDM_UPDATE_ICONS MENUITEM SEPARATOR MENUITEM "Zrób &zrzut ekranu\tCtrl+F11", IDM_ACTION_SCREENSHOT MENUITEM SEPARATOR - MENUITEM "&Preferencje...", IDM_PREFERENCES + MENUITEM "&Preferencje...", IDM_PREFERENCES #ifdef DISCORD MENUITEM "Włącz integrację z &Discord", IDM_DISCORD #endif @@ -137,17 +137,17 @@ CassetteSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Nowy obraz...", IDM_CASSETTE_IMAGE_NEW + MENUITEM "&Nowy obraz...", IDM_CASSETTE_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&Istniejący obraz...", IDM_CASSETTE_IMAGE_EXISTING - MENUITEM "Istniejący obraz (&Chroniony przed zapisem)...", IDM_CASSETTE_IMAGE_EXISTING_WP + MENUITEM "&Istniejący obraz...", IDM_CASSETTE_IMAGE_EXISTING + MENUITEM "Istniejący obraz (&Chroniony przed zapisem)...", IDM_CASSETTE_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "&Nagraj", IDM_CASSETTE_RECORD - MENUITEM "&Odtwórz", IDM_CASSETTE_PLAY - MENUITEM "&Przewiń do początku", IDM_CASSETTE_REWIND - MENUITEM "&Przewiń do końca", IDM_CASSETTE_FAST_FORWARD + MENUITEM "&Nagraj", IDM_CASSETTE_RECORD + MENUITEM "&Odtwórz", IDM_CASSETTE_PLAY + MENUITEM "&Przewiń do początku", IDM_CASSETTE_REWIND + MENUITEM "&Przewiń do końca", IDM_CASSETTE_FAST_FORWARD MENUITEM SEPARATOR - MENUITEM "W&yjmij", IDM_CASSETTE_EJECT + MENUITEM "W&yjmij", IDM_CASSETTE_EJECT END END @@ -155,9 +155,9 @@ CartridgeSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Obraz...", IDM_CARTRIDGE_IMAGE + MENUITEM "&Obraz...", IDM_CARTRIDGE_IMAGE MENUITEM SEPARATOR - MENUITEM "W&yjmij", IDM_CARTRIDGE_EJECT + MENUITEM "W&yjmij", IDM_CARTRIDGE_EJECT END END @@ -165,14 +165,14 @@ FloppySubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Nowy obraz...", IDM_FLOPPY_IMAGE_NEW + MENUITEM "&Nowy obraz...", IDM_FLOPPY_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&Istniejący obraz...", IDM_FLOPPY_IMAGE_EXISTING - MENUITEM "Istniejący obraz (&Chroniony przed zapisem)...", IDM_FLOPPY_IMAGE_EXISTING_WP + MENUITEM "&Istniejący obraz...", IDM_FLOPPY_IMAGE_EXISTING + MENUITEM "Istniejący obraz (&Chroniony przed zapisem)...", IDM_FLOPPY_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "E&ksportuj do 86F...", IDM_FLOPPY_EXPORT_TO_86F + MENUITEM "E&ksportuj do 86F...", IDM_FLOPPY_EXPORT_TO_86F MENUITEM SEPARATOR - MENUITEM "W&yjmij", IDM_FLOPPY_EJECT + MENUITEM "W&yjmij", IDM_FLOPPY_EJECT END END @@ -180,13 +180,13 @@ CdromSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Ścisz", IDM_CDROM_MUTE + MENUITEM "&Ścisz", IDM_CDROM_MUTE MENUITEM SEPARATOR - MENUITEM "P&usty", IDM_CDROM_EMPTY - MENUITEM "&Przeładuj poprzedni obraz", IDM_CDROM_RELOAD + MENUITEM "P&usty", IDM_CDROM_EMPTY + MENUITEM "&Przeładuj poprzedni obraz", IDM_CDROM_RELOAD MENUITEM SEPARATOR - MENUITEM "&Obraz...", IDM_CDROM_IMAGE - MENUITEM "&Teczka...", IDM_CDROM_DIR + MENUITEM "&Obraz...", IDM_CDROM_IMAGE + MENUITEM "&Teczka...", IDM_CDROM_DIR END END @@ -194,13 +194,13 @@ ZIPSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Nowy obraz...", IDM_ZIP_IMAGE_NEW + MENUITEM "&Nowy obraz...", IDM_ZIP_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&Istniejący obraz...", IDM_ZIP_IMAGE_EXISTING - MENUITEM "Istniejący obraz (&Chroniony przed zapisem)...", IDM_ZIP_IMAGE_EXISTING_WP + MENUITEM "&Istniejący obraz...", IDM_ZIP_IMAGE_EXISTING + MENUITEM "Istniejący obraz (&Chroniony przed zapisem)...", IDM_ZIP_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "W&yjmij", IDM_ZIP_EJECT - MENUITEM "&Przeładuj poprzedni obraz", IDM_ZIP_RELOAD + MENUITEM "W&yjmij", IDM_ZIP_EJECT + MENUITEM "&Przeładuj poprzedni obraz", IDM_ZIP_RELOAD END END @@ -208,13 +208,13 @@ MOSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Nowy obraz...", IDM_MO_IMAGE_NEW + MENUITEM "&Nowy obraz...", IDM_MO_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&Istniejący obraz...", IDM_MO_IMAGE_EXISTING - MENUITEM "Istniejący obraz (&Chroniony przed zapisem)...", IDM_MO_IMAGE_EXISTING_WP + MENUITEM "&Istniejący obraz...", IDM_MO_IMAGE_EXISTING + MENUITEM "Istniejący obraz (&Chroniony przed zapisem)...", IDM_MO_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "W&yjmij", IDM_MO_EJECT - MENUITEM "&Przeładuj poprzedni obraz", IDM_MO_RELOAD + MENUITEM "W&yjmij", IDM_MO_EJECT + MENUITEM "&Przeładuj poprzedni obraz", IDM_MO_RELOAD END END @@ -240,150 +240,150 @@ END // Dialog // -#define STR_PREFERENCES "Preferencje" -#define STR_SND_GAIN "Wzmocnienie dźwięku" -#define STR_NEW_FLOPPY "Nowy obraz" -#define STR_CONFIG "Ustawienia" -#define STR_SPECIFY_DIM "Określ rozmiary okna" +#define STR_PREFERENCES "Preferencje" +#define STR_SND_GAIN "Wzmocnienie dźwięku" +#define STR_NEW_FLOPPY "Nowy obraz" +#define STR_CONFIG "Ustawienia" +#define STR_SPECIFY_DIM "Określ rozmiary okna" -#define STR_OK "OK" -#define STR_CANCEL "Anuluj" -#define STR_GLOBAL "Zapisz ustawienia jako &globalne ustawienia domyślne" -#define STR_DEFAULT "&Domyślny" -#define STR_LANGUAGE "Język:" -#define STR_ICONSET "Zestaw ikon:" +#define STR_OK "OK" +#define STR_CANCEL "Anuluj" +#define STR_GLOBAL "Zapisz ustawienia jako &globalne ustawienia domyślne" +#define STR_DEFAULT "&Domyślny" +#define STR_LANGUAGE "Język:" +#define STR_ICONSET "Zestaw ikon:" -#define STR_GAIN "Wzmacniacz" +#define STR_GAIN "Wzmacniacz" -#define STR_FILE_NAME "Nazwa pliku:" -#define STR_DISK_SIZE "Rozmiar dysku:" -#define STR_RPM_MODE "Tryb RPM:" -#define STR_PROGRESS "Postęp:" +#define STR_FILE_NAME "Nazwa pliku:" +#define STR_DISK_SIZE "Rozmiar dysku:" +#define STR_RPM_MODE "Tryb RPM:" +#define STR_PROGRESS "Postęp:" -#define STR_WIDTH "Szerokość:" -#define STR_HEIGHT "Wysokość:" -#define STR_LOCK_TO_SIZE "Stały rozmiar" +#define STR_WIDTH "Szerokość:" +#define STR_HEIGHT "Wysokość:" +#define STR_LOCK_TO_SIZE "Stały rozmiar" -#define STR_MACHINE_TYPE "Rodzaj maszyny:" -#define STR_MACHINE "Maszyna:" -#define STR_CONFIGURE "Konfiguruj" -#define STR_CPU_TYPE "Rodzaj procesora:" -#define STR_CPU_SPEED "Szybkość:" -#define STR_FPU "Jednostka FPU:" -#define STR_WAIT_STATES "Stany oczekiwania:" -#define STR_MB "MB" -#define STR_MEMORY "Pamięć:" -#define STR_TIME_SYNC "Synchronizacja czasu" -#define STR_DISABLED "Wyłączona" -#define STR_ENABLED_LOCAL "Włączona (czas lokalny)" -#define STR_ENABLED_UTC "Włączona (UTC)" -#define STR_DYNAREC "Dynamiczny rekompilator" +#define STR_MACHINE_TYPE "Rodzaj maszyny:" +#define STR_MACHINE "Maszyna:" +#define STR_CONFIGURE "Konfiguruj" +#define STR_CPU_TYPE "Rodzaj procesora:" +#define STR_CPU_SPEED "Szybkość:" +#define STR_FPU "Jednostka FPU:" +#define STR_WAIT_STATES "Stany oczekiwania:" +#define STR_MB "MB" +#define STR_MEMORY "Pamięć:" +#define STR_TIME_SYNC "Synchronizacja czasu" +#define STR_DISABLED "Wyłączona" +#define STR_ENABLED_LOCAL "Włączona (czas lokalny)" +#define STR_ENABLED_UTC "Włączona (UTC)" +#define STR_DYNAREC "Dynamiczny rekompilator" -#define STR_VIDEO "Wideo:" -#define STR_VIDEO_2 "Wideo 2:" -#define STR_VOODOO "Grafika Voodoo" -#define STR_IBM8514 "Grafika IBM 8514/a" -#define STR_XGA "Grafika XGA" +#define STR_VIDEO "Wideo:" +#define STR_VIDEO_2 "Wideo 2:" +#define STR_VOODOO "Grafika Voodoo" +#define STR_IBM8514 "Grafika IBM 8514/a" +#define STR_XGA "Grafika XGA" -#define STR_MOUSE "Mysz:" -#define STR_JOYSTICK "Joystick:" -#define STR_JOY1 "Joystick 1..." -#define STR_JOY2 "Joystick 2..." -#define STR_JOY3 "Joystick 3..." -#define STR_JOY4 "Joystick 4..." +#define STR_MOUSE "Mysz:" +#define STR_JOYSTICK "Joystick:" +#define STR_JOY1 "Joystick 1..." +#define STR_JOY2 "Joystick 2..." +#define STR_JOY3 "Joystick 3..." +#define STR_JOY4 "Joystick 4..." -#define STR_SOUND1 "Karta dźwiękowa 1:" -#define STR_SOUND2 "Karta dźwiękowa 2:" -#define STR_SOUND3 "Karta dźwiękowa 3:" -#define STR_SOUND4 "Karta dźwiękowa 4:" -#define STR_MIDI_OUT "Urządzenie wyjściowe MIDI:" -#define STR_MIDI_IN "Urządzenie wejściowe MIDI:" -#define STR_MPU401 "Samodzielne urządzenie MPU-401" -#define STR_FLOAT "Użyj dźwięku FLOAT32" -#define STR_FM_DRIVER "Sterownik syntezy FM" -#define STR_FM_DRV_NUKED "Nuked (dokładniejszy)" -#define STR_FM_DRV_YMFM "YMFM (szybszy)" +#define STR_SOUND1 "Karta dźwiękowa 1:" +#define STR_SOUND2 "Karta dźwiękowa 2:" +#define STR_SOUND3 "Karta dźwiękowa 3:" +#define STR_SOUND4 "Karta dźwiękowa 4:" +#define STR_MIDI_OUT "Urządzenie wyjściowe MIDI:" +#define STR_MIDI_IN "Urządzenie wejściowe MIDI:" +#define STR_MPU401 "Samodzielne urządzenie MPU-401" +#define STR_FLOAT "Użyj dźwięku FLOAT32" +#define STR_FM_DRIVER "Sterownik syntezy FM" +#define STR_FM_DRV_NUKED "Nuked (dokładniejszy)" +#define STR_FM_DRV_YMFM "YMFM (szybszy)" -#define STR_NET_TYPE "Rodzaj sieci:" -#define STR_PCAP "Urządzenie PCap:" -#define STR_NET "Karta sieciowa:" -#define STR_NET1 "Network card 1:" -#define STR_NET2 "Network card 2:" -#define STR_NET3 "Network card 3:" -#define STR_NET4 "Network card 4:" +#define STR_NET_TYPE "Rodzaj sieci:" +#define STR_PCAP "Urządzenie PCap:" +#define STR_NET "Karta sieciowa:" +#define STR_NET1 "Network card 1:" +#define STR_NET2 "Network card 2:" +#define STR_NET3 "Network card 3:" +#define STR_NET4 "Network card 4:" -#define STR_COM1 "Urządzenie COM1:" -#define STR_COM2 "Urządzenie COM2:" -#define STR_COM3 "Urządzenie COM3:" -#define STR_COM4 "Urządzenie COM4:" -#define STR_LPT1 "Urządzenie LPT1:" -#define STR_LPT2 "Urządzenie LPT2:" -#define STR_LPT3 "Urządzenie LPT3:" -#define STR_LPT4 "Urządzenie LPT4:" -#define STR_SERIAL1 "Port szeregowy 1" -#define STR_SERIAL2 "Port szeregowy 2" -#define STR_SERIAL3 "Port szeregowy 3" -#define STR_SERIAL4 "Port Szeregowy 4" -#define STR_PARALLEL1 "Port równoległy 1" -#define STR_PARALLEL2 "Port równoległy 2" -#define STR_PARALLEL3 "Port równoległy 3" -#define STR_PARALLEL4 "Port równoległy 4" -#define STR_SERIAL_PASS1 "Serial port passthrough 1" -#define STR_SERIAL_PASS2 "Serial port passthrough 2" -#define STR_SERIAL_PASS3 "Serial port passthrough 3" -#define STR_SERIAL_PASS4 "Serial port passthrough 4" +#define STR_COM1 "Urządzenie COM1:" +#define STR_COM2 "Urządzenie COM2:" +#define STR_COM3 "Urządzenie COM3:" +#define STR_COM4 "Urządzenie COM4:" +#define STR_LPT1 "Urządzenie LPT1:" +#define STR_LPT2 "Urządzenie LPT2:" +#define STR_LPT3 "Urządzenie LPT3:" +#define STR_LPT4 "Urządzenie LPT4:" +#define STR_SERIAL1 "Port szeregowy 1" +#define STR_SERIAL2 "Port szeregowy 2" +#define STR_SERIAL3 "Port szeregowy 3" +#define STR_SERIAL4 "Port Szeregowy 4" +#define STR_PARALLEL1 "Port równoległy 1" +#define STR_PARALLEL2 "Port równoległy 2" +#define STR_PARALLEL3 "Port równoległy 3" +#define STR_PARALLEL4 "Port równoległy 4" +#define STR_SERIAL_PASS1 "Serial port passthrough 1" +#define STR_SERIAL_PASS2 "Serial port passthrough 2" +#define STR_SERIAL_PASS3 "Serial port passthrough 3" +#define STR_SERIAL_PASS4 "Serial port passthrough 4" -#define STR_HDC "Kontroler dysku twardego:" -#define STR_FDC "Kontroler dyskietek:" -#define STR_IDE_TER "Trzeciorzędowy kontroler IDE" -#define STR_IDE_QUA "Czwartorzędowy kontroler IDE" -#define STR_SCSI "SCSI" -#define STR_SCSI_1 "Kontroler 1:" -#define STR_SCSI_2 "Kontroler 2:" -#define STR_SCSI_3 "Kontroler 3:" -#define STR_SCSI_4 "Kontroler 4:" -#define STR_CASSETTE "Kaseta" +#define STR_HDC "Kontroler dysku twardego:" +#define STR_FDC "Kontroler dyskietek:" +#define STR_IDE_TER "Trzeciorzędowy kontroler IDE" +#define STR_IDE_QUA "Czwartorzędowy kontroler IDE" +#define STR_SCSI "SCSI" +#define STR_SCSI_1 "Kontroler 1:" +#define STR_SCSI_2 "Kontroler 2:" +#define STR_SCSI_3 "Kontroler 3:" +#define STR_SCSI_4 "Kontroler 4:" +#define STR_CASSETTE "Kaseta" -#define STR_HDD "Dyski twarde:" -#define STR_NEW "&Nowy..." -#define STR_EXISTING "&Istniejący..." -#define STR_REMOVE "&Usuń" -#define STR_BUS "Magistrala:" -#define STR_CHANNEL "Kanał:" -#define STR_ID "ID:" -#define STR_SPEED "Speed:" +#define STR_HDD "Dyski twarde:" +#define STR_NEW "&Nowy..." +#define STR_EXISTING "&Istniejący..." +#define STR_REMOVE "&Usuń" +#define STR_BUS "Magistrala:" +#define STR_CHANNEL "Kanał:" +#define STR_ID "ID:" +#define STR_SPEED "Speed:" -#define STR_SPECIFY "&Określ..." -#define STR_SECTORS "Sektory:" -#define STR_HEADS "Głowice:" -#define STR_CYLS "Cylindry:" -#define STR_SIZE_MB "Rozmiar (MB):" -#define STR_TYPE "Rodzaj:" -#define STR_IMG_FORMAT "Format obrazu:" -#define STR_BLOCK_SIZE "Rozmiar bloku:" +#define STR_SPECIFY "&Określ..." +#define STR_SECTORS "Sektory:" +#define STR_HEADS "Głowice:" +#define STR_CYLS "Cylindry:" +#define STR_SIZE_MB "Rozmiar (MB):" +#define STR_TYPE "Rodzaj:" +#define STR_IMG_FORMAT "Format obrazu:" +#define STR_BLOCK_SIZE "Rozmiar bloku:" -#define STR_FLOPPY_DRIVES "Napędy dyskietek:" -#define STR_TURBO "Rozrządy Turbo" -#define STR_CHECKBPB "Sprawdzaj BPB" -#define STR_CDROM_DRIVES "Napędy CD-ROM:" -#define STR_CD_SPEED "Szybkość:" -#define STR_EARLY "Wcześniejszy napęd" +#define STR_FLOPPY_DRIVES "Napędy dyskietek:" +#define STR_TURBO "Rozrządy Turbo" +#define STR_CHECKBPB "Sprawdzaj BPB" +#define STR_CDROM_DRIVES "Napędy CD-ROM:" +#define STR_CD_SPEED "Szybkość:" +#define STR_EARLY "Wcześniejszy napęd" -#define STR_MO_DRIVES "Napędy MO:" -#define STR_ZIP_DRIVES "Napędy ZIP:" -#define STR_250 "ZIP 250" +#define STR_MO_DRIVES "Napędy MO:" +#define STR_ZIP_DRIVES "Napędy ZIP:" +#define STR_250 "ZIP 250" -#define STR_ISARTC "ISA RTC:" -#define STR_ISAMEM "Rozszerzenie pamięci ISA" -#define STR_ISAMEM_1 "Karta 1:" -#define STR_ISAMEM_2 "Karta 2:" -#define STR_ISAMEM_3 "Karta 3:" -#define STR_ISAMEM_4 "Karta 4:" -#define STR_BUGGER "Urządzenie ISABugger" -#define STR_POSTCARD "Karta POST" +#define STR_ISARTC "ISA RTC:" +#define STR_ISAMEM "Rozszerzenie pamięci ISA" +#define STR_ISAMEM_1 "Karta 1:" +#define STR_ISAMEM_2 "Karta 2:" +#define STR_ISAMEM_3 "Karta 3:" +#define STR_ISAMEM_4 "Karta 4:" +#define STR_BUGGER "Urządzenie ISABugger" +#define STR_POSTCARD "Karta POST" -#define FONT_SIZE 9 -#define FONT_NAME "Segoe UI" +#define FONT_SIZE 9 +#define FONT_NAME "Segoe UI" #include "dialogs.rc" @@ -394,149 +394,149 @@ END STRINGTABLE DISCARDABLE BEGIN - 2048 "86Box" - IDS_2049 "Błąd" - IDS_2050 "Fatalny błąd" - IDS_2051 " - PAUSED" - IDS_2052 "Naciśnij klawisze Ctrl+Alt+PgDn aby wrócić to trybu okna." - IDS_2053 "Szybkość" - IDS_2054 "ZIP %03i %i (%s): %ls" - IDS_2055 "Obrazy ZIP (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" - IDS_2056 "86Box nie może znaleźć obrazów ROM nadających się do użytku.\n\nProszę pobrać zestaw obrazów ROM ze strony download, i rozpakować je do katalogu ""roms""." - IDS_2057 "(pusty)" - IDS_2058 "Obrazy ZIP (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0Wszystkie pliki (*.*)\0*.*\0" - IDS_2059 "Turbo" - IDS_2060 "Włącz" - IDS_2061 "Wyłącz" - IDS_2062 "Wszystkie obrazy (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0Podstawowe obrazy sektorów(*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Obrazy powierzchniowe (*.86F)\0*.86F\0" - IDS_2063 "Maszyna ""%hs"" nie jest dostępna, ponieważ brakuje obrazów ROM w katalogu roms/machines. Przełączanie na dostępną maszynę." + 2048 "86Box" + IDS_2049 "Błąd" + IDS_2050 "Fatalny błąd" + IDS_2051 " - PAUSED" + IDS_2052 "Naciśnij klawisze Ctrl+Alt+PgDn aby wrócić to trybu okna." + IDS_2053 "Szybkość" + IDS_2054 "ZIP %03i %i (%s): %ls" + IDS_2055 "Obrazy ZIP (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" + IDS_2056 "86Box nie może znaleźć obrazów ROM nadających się do użytku.\n\nProszę pobrać zestaw obrazów ROM ze strony download, i rozpakować je do katalogu ""roms""." + IDS_2057 "(pusty)" + IDS_2058 "Obrazy ZIP (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0Wszystkie pliki (*.*)\0*.*\0" + IDS_2059 "Turbo" + IDS_2060 "Włącz" + IDS_2061 "Wyłącz" + IDS_2062 "Wszystkie obrazy (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0Podstawowe obrazy sektorów(*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Obrazy powierzchniowe (*.86F)\0*.86F\0" + IDS_2063 "Maszyna ""%hs"" nie jest dostępna, ponieważ brakuje obrazów ROM w katalogu roms/machines. Przełączanie na dostępną maszynę." END STRINGTABLE DISCARDABLE BEGIN - IDS_2064 "Karta wideo ""%hs"" nie jest dostępna, ponieważ brakuje obrazów ROM w katalogu roms/video. Przełączanie na dostępną kartę wideo." - IDS_2065 "Maszyna" - IDS_2066 "Ekran" - IDS_2067 "Urządzenia wejściowe" - IDS_2068 "Dźwięk" - IDS_2069 "Sieć" - IDS_2070 "Porty (COM & LPT)" - IDS_2071 "Kontrolery pamięci" - IDS_2072 "Dyski twarde" - IDS_2073 "Napędy dyskietek i CD-ROM" - IDS_2074 "Inne urządzenia wymienne" - IDS_2075 "Inne urządzenia peryferyjne" - IDS_2076 "Obrazy powierzchniowe (*.86F)\0*.86F\0" - IDS_2077 "Kliknij w celu przechwycenia myszy" - IDS_2078 "Naciśnij klawisze F8+F12 w celu uwolnienia myszy" - IDS_2079 "Naciśnij klawisze F8+F12 lub środkowy przycisk w celu uwolnienia myszy" + IDS_2064 "Karta wideo ""%hs"" nie jest dostępna, ponieważ brakuje obrazów ROM w katalogu roms/video. Przełączanie na dostępną kartę wideo." + IDS_2065 "Maszyna" + IDS_2066 "Ekran" + IDS_2067 "Urządzenia wejściowe" + IDS_2068 "Dźwięk" + IDS_2069 "Sieć" + IDS_2070 "Porty (COM & LPT)" + IDS_2071 "Kontrolery pamięci" + IDS_2072 "Dyski twarde" + IDS_2073 "Napędy dyskietek i CD-ROM" + IDS_2074 "Inne urządzenia wymienne" + IDS_2075 "Inne urządzenia peryferyjne" + IDS_2076 "Obrazy powierzchniowe (*.86F)\0*.86F\0" + IDS_2077 "Kliknij w celu przechwycenia myszy" + IDS_2078 "Naciśnij klawisze F8+F12 w celu uwolnienia myszy" + IDS_2079 "Naciśnij klawisze F8+F12 lub środkowy przycisk w celu uwolnienia myszy" END STRINGTABLE DISCARDABLE BEGIN - IDS_2080 "Nie można zainicjować FluidSynth" - IDS_2081 "Magistrala" - IDS_2082 "Plik" - IDS_2083 "C" - IDS_2084 "H" - IDS_2085 "S" - IDS_2086 "MB" + IDS_2080 "Nie można zainicjować FluidSynth" + IDS_2081 "Magistrala" + IDS_2082 "Plik" + IDS_2083 "C" + IDS_2084 "H" + IDS_2085 "S" + IDS_2086 "MB" IDS_2087 "Speed" - IDS_2088 "Sprawdzaj BPB" - IDS_2089 "KB" - IDS_2090 "Nie można zainicjować renderera wideo." - IDS_2091 "Domyślny" - IDS_2092 "%i Stany oczekiwania" - IDS_2093 "Rodzaj" - IDS_2094 "Nie udało się ustawić PCap" - IDS_2095 "Nie znaleziono urządzeń PCap" - IDS_2096 "Nieprawidłowe urządzenie PCap" - IDS_2097 "Standardowe joysticki 2-przyciskowe" - IDS_2098 "Standardowy joystick 4-przyciskowy" - IDS_2099 "Standardowy joystick 6-przyciskowy" - IDS_2100 "Standardowy joystick 8-przyciskowy" - IDS_2101 "CH Flightstick Pro" - IDS_2102 "Microsoft SideWinder Pad" - IDS_2103 "Thrustmaster Flight Control System" - IDS_2104 "Żaden" - IDS_2105 "Nie można załadować akceleratorów klawiaturowych." - IDS_2106 "Nie można zarejestrować surowych danych wejściowych." - IDS_2107 "%u" - IDS_2108 "%u MB (CHS: %i, %i, %i)" - IDS_2109 "Dyskietka %i (%s): %ls" - IDS_2110 "Wszystkie obrazy (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Zaawansowane obrazy sektorów (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Podstawowe obrazy sektorów (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Flux images (*.FDI)\0*.FDI\0Obrazy powierzchniowe (*.86F;*.MFM)\0*.86F;*.MFM\0All files (*.*)\0*.*\0" - IDS_2111 "Nie można zainicjować FreeType" - IDS_2112 "Nie można zainicjować SDL, wymagany SDL2.dll" - IDS_2113 "Jesteś pewien że chcesz wykonać twardy reset emulowanej maszyny?" - IDS_2114 "Jesteś pewien że chcesz zakończyć 86Box?" - IDS_2115 "Nie można zainicjować Ghostscript" - IDS_2116 "MO %i (%ls): %ls" - IDS_2117 "Obrazy MO (*.IM?;*.MDI)\0*.IM?;*.MDI\0All files (*.*)\0*.*\0" - IDS_2118 "Witamy w 86Box!" - IDS_2119 "Kontroler wewnętrzny" - IDS_2120 "Zakończ" - IDS_2121 "Nie znaleziono obrazów ROM" - IDS_2122 "Czy chcesz zapisać ustawienia?" - IDS_2123 "To spowoduje twardy reset wirtualnej maszyny." - IDS_2124 "Zapisz" - IDS_2125 "O 86Box" - IDS_2126 "86Box v" EMU_VERSION + IDS_2088 "Sprawdzaj BPB" + IDS_2089 "KB" + IDS_2090 "Nie można zainicjować renderera wideo." + IDS_2091 "Domyślny" + IDS_2092 "%i Stany oczekiwania" + IDS_2093 "Rodzaj" + IDS_2094 "Nie udało się ustawić PCap" + IDS_2095 "Nie znaleziono urządzeń PCap" + IDS_2096 "Nieprawidłowe urządzenie PCap" + IDS_2097 "Standardowe joysticki 2-przyciskowe" + IDS_2098 "Standardowy joystick 4-przyciskowy" + IDS_2099 "Standardowy joystick 6-przyciskowy" + IDS_2100 "Standardowy joystick 8-przyciskowy" + IDS_2101 "CH Flightstick Pro" + IDS_2102 "Microsoft SideWinder Pad" + IDS_2103 "Thrustmaster Flight Control System" + IDS_2104 "Żaden" + IDS_2105 "Nie można załadować akceleratorów klawiaturowych." + IDS_2106 "Nie można zarejestrować surowych danych wejściowych." + IDS_2107 "%u" + IDS_2108 "%u MB (CHS: %i, %i, %i)" + IDS_2109 "Dyskietka %i (%s): %ls" + IDS_2110 "Wszystkie obrazy (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Zaawansowane obrazy sektorów (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Podstawowe obrazy sektorów (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Flux images (*.FDI)\0*.FDI\0Obrazy powierzchniowe (*.86F;*.MFM)\0*.86F;*.MFM\0All files (*.*)\0*.*\0" + IDS_2111 "Nie można zainicjować FreeType" + IDS_2112 "Nie można zainicjować SDL, wymagany SDL2.dll" + IDS_2113 "Jesteś pewien że chcesz wykonać twardy reset emulowanej maszyny?" + IDS_2114 "Jesteś pewien że chcesz zakończyć 86Box?" + IDS_2115 "Nie można zainicjować Ghostscript" + IDS_2116 "MO %i (%ls): %ls" + IDS_2117 "Obrazy MO (*.IM?;*.MDI)\0*.IM?;*.MDI\0All files (*.*)\0*.*\0" + IDS_2118 "Witamy w 86Box!" + IDS_2119 "Kontroler wewnętrzny" + IDS_2120 "Zakończ" + IDS_2121 "Nie znaleziono obrazów ROM" + IDS_2122 "Czy chcesz zapisać ustawienia?" + IDS_2123 "To spowoduje twardy reset wirtualnej maszyny." + IDS_2124 "Zapisz" + IDS_2125 "O 86Box" + IDS_2126 "86Box v" EMU_VERSION - IDS_2127 "Emulator starych komputerów\n\nAutorzy: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, Tiseno100, reenigne, 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." - IDS_2128 "OK" - IDS_2129 "Sprzęt niedostępny" + IDS_2127 "Emulator starych komputerów\n\nAutorzy: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, Tiseno100, reenigne, 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." + IDS_2128 "OK" + IDS_2129 "Sprzęt niedostępny" #ifdef _WIN32 #define LIB_NAME_PCAP "WinPcap" #else #define LIB_NAME_PCAP "libpcap" #endif - IDS_2130 "Sprawdź, czy " LIB_NAME_PCAP " jest zainstalowany i czy posiadasz połączenie sieciowe kompatybilne z " LIB_NAME_PCAP "." - IDS_2131 "Nieprawidłowa konfiguracja" + IDS_2130 "Sprawdź, czy " LIB_NAME_PCAP " jest zainstalowany i czy posiadasz połączenie sieciowe kompatybilne z " LIB_NAME_PCAP "." + IDS_2131 "Nieprawidłowa konfiguracja" #ifdef _WIN32 #define LIB_NAME_FREETYPE "freetype.dll" #else #define LIB_NAME_FREETYPE "libfreetype" #endif - IDS_2132 LIB_NAME_FREETYPE " jest wymagany do emulacji drukarki ESC-P." + IDS_2132 LIB_NAME_FREETYPE " jest wymagany do emulacji drukarki ESC-P." #ifdef _WIN32 #define LIB_NAME_GS "gsdll32.dll" #else #define LIB_NAME_GS "libgs" #endif - IDS_2133 LIB_NAME_GS " 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)." + IDS_2133 LIB_NAME_GS " 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)." #ifdef _WIN32 #define LIB_NAME_FLUIDSYNTH "libfluidsynth.dll" #else #define LIB_NAME_FLUIDSYNTH "libfluidsynth" #endif - IDS_2134 LIB_NAME_FLUIDSYNTH " jest wymagany dla wyjścia FluidSynth MIDI." - IDS_2135 "Przechodzenie do trybu pełnoekranowego" - IDS_2136 "Nie pokazuj więcej tego komunikatu" - IDS_2137 "Nie kończ" - IDS_2138 "Przywróć" - IDS_2139 "Nie przywracaj" - IDS_2140 "Obrazy MO (*.IM?;*.MDI)\0*.IM?;*.MDI\0All files (*.*)\0*.*\0" - IDS_2141 "Obrazy CD-ROM (*.ISO;*.CUE)\0*.ISO;*.CUE\0All files (*.*)\0*.*\0" - IDS_2142 "Konfiguracja urządzenia %hs" + IDS_2134 LIB_NAME_FLUIDSYNTH " jest wymagany dla wyjścia FluidSynth MIDI." + IDS_2135 "Przechodzenie do trybu pełnoekranowego" + IDS_2136 "Nie pokazuj więcej tego komunikatu" + IDS_2137 "Nie kończ" + IDS_2138 "Przywróć" + IDS_2139 "Nie przywracaj" + IDS_2140 "Obrazy MO (*.IM?;*.MDI)\0*.IM?;*.MDI\0All files (*.*)\0*.*\0" + IDS_2141 "Obrazy CD-ROM (*.ISO;*.CUE)\0*.ISO;*.CUE\0All files (*.*)\0*.*\0" + IDS_2142 "Konfiguracja urządzenia %hs" IDS_2143 "Monitor w trybie czuwania" - IDS_2144 "Shadery OpenGL (*.GLSL)\0*.GLSL\0Wszystkie pliki (*.*)\0*.*\0" - IDS_2145 "Opcje OpenGL" - IDS_2146 "Ładujesz nieobsługiwaną konfigurację" - IDS_2147 "Wybór rodzaju procesora oparty na wybranej maszynie jest wyłączony dla tej emulowanej maszyny.\n\nPozwala to na wybór procesora który jest niekompatybilny z wybraną maszyną. Jednak możesz napotkać niezgodności z BIOS-em maszyny lub innym oprogramowaniem.\n\nAktywacja tego ustawienia nie jest wspierana i każde zgłoszenie błędu może zostać zamknięte jako nieważne." - IDS_2148 "Kontynuuj" - IDS_2149 "Kaseta: %s" - IDS_2150 "Obrazy kaset (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Wszystkie pliki (*.*)\0*.*\0" - IDS_2151 "Kartrydż %i: %ls" - IDS_2152 "Obrazy kartrydżu (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Wszystkie pliki (*.*)\0*.*\0" - IDS_2153 "Błąd inicjalizacji renderera" - IDS_2154 "Nie można zainicjować renderera OpenGL (3.0 Core). Użyj innego." - IDS_2155 "Wznów wykonywanie" - IDS_2156 "Zatrzymaj wykonywanie" - IDS_2157 "Naciśnij Ctrl+Alt+Del" - IDS_2158 "Naciśnij Ctrl+Alt+Esc" - IDS_2159 "Twardy reset" - IDS_2160 "Wyłączenie ACPI" - IDS_2161 "Ustawienia" + IDS_2144 "Shadery OpenGL (*.GLSL)\0*.GLSL\0Wszystkie pliki (*.*)\0*.*\0" + IDS_2145 "Opcje OpenGL" + IDS_2146 "Ładujesz nieobsługiwaną konfigurację" + IDS_2147 "Wybór rodzaju procesora oparty na wybranej maszynie jest wyłączony dla tej emulowanej maszyny.\n\nPozwala to na wybór procesora który jest niekompatybilny z wybraną maszyną. Jednak możesz napotkać niezgodności z BIOS-em maszyny lub innym oprogramowaniem.\n\nAktywacja tego ustawienia nie jest wspierana i każde zgłoszenie błędu może zostać zamknięte jako nieważne." + IDS_2148 "Kontynuuj" + IDS_2149 "Kaseta: %s" + IDS_2150 "Obrazy kaset (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Wszystkie pliki (*.*)\0*.*\0" + IDS_2151 "Kartrydż %i: %ls" + IDS_2152 "Obrazy kartrydżu (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Wszystkie pliki (*.*)\0*.*\0" + IDS_2153 "Błąd inicjalizacji renderera" + IDS_2154 "Nie można zainicjować renderera OpenGL (3.0 Core). Użyj innego." + IDS_2155 "Wznów wykonywanie" + IDS_2156 "Zatrzymaj wykonywanie" + IDS_2157 "Naciśnij Ctrl+Alt+Del" + IDS_2158 "Naciśnij Ctrl+Alt+Esc" + IDS_2159 "Twardy reset" + IDS_2160 "Wyłączenie ACPI" + IDS_2161 "Ustawienia" IDS_2162 "Wcześniejszy napęd" IDS_2163 "No Dynarec" IDS_2164 "Old Dynarec" @@ -547,45 +547,45 @@ END STRINGTABLE DISCARDABLE BEGIN IDS_4096 "Dysk twardy (%s)" - IDS_4097 "%01i:%01i" - IDS_4098 "%01i" - IDS_4099 "Napędy CD-ROM MFM/RLL lub ESDI nigdy nie istniały" - IDS_4100 "Niestandardowy..." - IDS_4101 "Niestandardowy (duży)..." - IDS_4102 "Dodaj nowy dysk twardy" - IDS_4103 "Dodaj istniejący dysk twardy" - IDS_4104 "Obrazy dysków HDI nie mogą być większe niż 4 GB." - IDS_4105 "Obrazy dysków nie mogą być większe niż 127 GB." - IDS_4106 "Obrazy dysku twardego (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0Wszystkie pliki (*.*)\0*.*\0" - IDS_4107 "Nie można odczytać pliku" - IDS_4108 "Nie można zapisać pliku" - IDS_4109 "Obrazy HDI lub HDX z rozmiarem sektora innym niż 512 nie są wspierane." - IDS_4110 "USB nie jest jeszcze wspierane" - IDS_4111 "Plik obrazu dysku już istnieje" - IDS_4112 "Określ prawidłową nazwę pliku." - IDS_4113 "Utworzono obraz dysku" - IDS_4114 "Sprawdź, czy plik istnieje i nadaje się do odczytu." - IDS_4115 "Sprawdź, czy plik jest zapiyswany w katalogu z możliwością zapisu." - IDS_4116 "Obraz dysku jest za duży" - IDS_4117 "Nie zapomnij o partycjonowaniu i sformatowaniu nowo utworzego dysku" - IDS_4118 "Wybrany plik zostanie nadpisany. Czy na pewno chcesz użyć tego pliku?" - IDS_4119 "Niewspierany obraz dysku" - IDS_4120 "Nadpisz" - IDS_4121 "Nie nadpisuj" - IDS_4122 "Obraz surowy (.img)" - IDS_4123 "Obraz HDI (.hdi)" - IDS_4124 "Obraz HDX (.hdx)" - IDS_4125 "VHD o stałym rozmiarze (.vhd)" - IDS_4126 "VHD o dynamicznym rozmiarze (.vhd)" - IDS_4127 "VHD różnicujący (.vhd)" - IDS_4128 "Duże bloki (2 MB)" - IDS_4129 "Małe bloki (512 KB)" - IDS_4130 "Pliki VHD (*.VHD)\0*.VHD\0Wszystkie pliki (*.*)\0*.*\0" - IDS_4131 "Wybierz nadrzędny plik VHD" - IDS_4132 "Może to oznaczać, że obraz nadrzędny został zmodyfikowany po utworzeniu obrazu różnicującego.\n\nMoże się to również zdarzyć, jeśli pliki obrazów zostały przeniesione lub skopiowane, lub wystąpił błąd w programie, który utworzył ten dysk\n\nCzy chcesz naprawić sygnatury czasowe?" - IDS_4133 "Sygnatury czasowe dysku nadrzędnego i podrzędnego nie zgadzają się" - IDS_4134 "Nie można naprawić sygnatury czasowej VHD." - IDS_4135 "%01i:%02i" + IDS_4097 "%01i:%01i" + IDS_4098 "%01i" + IDS_4099 "Napędy CD-ROM MFM/RLL lub ESDI nigdy nie istniały" + IDS_4100 "Niestandardowy..." + IDS_4101 "Niestandardowy (duży)..." + IDS_4102 "Dodaj nowy dysk twardy" + IDS_4103 "Dodaj istniejący dysk twardy" + IDS_4104 "Obrazy dysków HDI nie mogą być większe niż 4 GB." + IDS_4105 "Obrazy dysków nie mogą być większe niż 127 GB." + IDS_4106 "Obrazy dysku twardego (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0Wszystkie pliki (*.*)\0*.*\0" + IDS_4107 "Nie można odczytać pliku" + IDS_4108 "Nie można zapisać pliku" + IDS_4109 "Obrazy HDI lub HDX z rozmiarem sektora innym niż 512 nie są wspierane." + IDS_4110 "USB nie jest jeszcze wspierane" + IDS_4111 "Plik obrazu dysku już istnieje" + IDS_4112 "Określ prawidłową nazwę pliku." + IDS_4113 "Utworzono obraz dysku" + IDS_4114 "Sprawdź, czy plik istnieje i nadaje się do odczytu." + IDS_4115 "Sprawdź, czy plik jest zapiyswany w katalogu z możliwością zapisu." + IDS_4116 "Obraz dysku jest za duży" + IDS_4117 "Nie zapomnij o partycjonowaniu i sformatowaniu nowo utworzego dysku" + IDS_4118 "Wybrany plik zostanie nadpisany. Czy na pewno chcesz użyć tego pliku?" + IDS_4119 "Niewspierany obraz dysku" + IDS_4120 "Nadpisz" + IDS_4121 "Nie nadpisuj" + IDS_4122 "Obraz surowy (.img)" + IDS_4123 "Obraz HDI (.hdi)" + IDS_4124 "Obraz HDX (.hdx)" + IDS_4125 "VHD o stałym rozmiarze (.vhd)" + IDS_4126 "VHD o dynamicznym rozmiarze (.vhd)" + IDS_4127 "VHD różnicujący (.vhd)" + IDS_4128 "Duże bloki (2 MB)" + IDS_4129 "Małe bloki (512 KB)" + IDS_4130 "Pliki VHD (*.VHD)\0*.VHD\0Wszystkie pliki (*.*)\0*.*\0" + IDS_4131 "Wybierz nadrzędny plik VHD" + IDS_4132 "Może to oznaczać, że obraz nadrzędny został zmodyfikowany po utworzeniu obrazu różnicującego.\n\nMoże się to również zdarzyć, jeśli pliki obrazów zostały przeniesione lub skopiowane, lub wystąpił błąd w programie, który utworzył ten dysk\n\nCzy chcesz naprawić sygnatury czasowe?" + IDS_4133 "Sygnatury czasowe dysku nadrzędnego i podrzędnego nie zgadzają się" + IDS_4134 "Nie można naprawić sygnatury czasowej VHD." + IDS_4135 "%01i:%02i" IDS_4352 "MFM/RLL" IDS_4353 "XTA" @@ -594,56 +594,56 @@ BEGIN IDS_4356 "ATAPI" IDS_4357 "SCSI" - IDS_4608 "MFM/RLL (%01i:%01i)" - IDS_4609 "XTA (%01i:%01i)" - IDS_4610 "ESDI (%01i:%01i)" - IDS_4611 "IDE (%01i:%01i)" - IDS_4612 "ATAPI (%01i:%01i)" - IDS_4613 "SCSI (%01i:%02i)" + IDS_4608 "MFM/RLL (%01i:%01i)" + IDS_4609 "XTA (%01i:%01i)" + IDS_4610 "ESDI (%01i:%01i)" + IDS_4611 "IDE (%01i:%01i)" + IDS_4612 "ATAPI (%01i:%01i)" + IDS_4613 "SCSI (%01i:%02i)" - IDS_5120 "CD-ROM %i (%s): %s" + IDS_5120 "CD-ROM %i (%s): %s" - IDS_5376 "Wyłączony" - IDS_5381 "ATAPI" + IDS_5376 "Wyłączony" + IDS_5381 "ATAPI" IDS_5382 "SCSI" - IDS_5632 "Wyłączony" - IDS_5637 "ATAPI (%01i:%01i)" + IDS_5632 "Wyłączony" + IDS_5637 "ATAPI (%01i:%01i)" IDS_5638 "SCSI (%01i:%02i)" - IDS_5888 "160 kB" - IDS_5889 "180 kB" - IDS_5890 "320 kB" - IDS_5891 "360 kB" - IDS_5892 "640 kB" - IDS_5893 "720 kB" - IDS_5894 "1,2 MB" - IDS_5895 "1,25 MB" - IDS_5896 "1,44 MB" - IDS_5897 "DMF (klaster 1024)" - IDS_5898 "DMF (klaster 2048)" - IDS_5899 "2,88 MB" - IDS_5900 "ZIP 100" - IDS_5901 "ZIP 250" - IDS_5902 "3.5"" 128 MB (ISO 10090)" - IDS_5903 "3.5"" 230 MB (ISO 13963)" - IDS_5904 "3.5"" 540 MB (ISO 15498)" - IDS_5905 "3.5"" 640 MB (ISO 15498)" - IDS_5906 "3.5"" 1,3 GB (GigaMO)" - IDS_5907 "3.5"" 2,3 GB (GigaMO 2)" - IDS_5908 "5.25"" 600 MB" - IDS_5909 "5.25"" 650 MB" - IDS_5910 "5.25"" 1 GB" - IDS_5911 "5.25"" 1,3 GB" + IDS_5888 "160 kB" + IDS_5889 "180 kB" + IDS_5890 "320 kB" + IDS_5891 "360 kB" + IDS_5892 "640 kB" + IDS_5893 "720 kB" + IDS_5894 "1,2 MB" + IDS_5895 "1,25 MB" + IDS_5896 "1,44 MB" + IDS_5897 "DMF (klaster 1024)" + IDS_5898 "DMF (klaster 2048)" + IDS_5899 "2,88 MB" + IDS_5900 "ZIP 100" + IDS_5901 "ZIP 250" + IDS_5902 "3.5"" 128 MB (ISO 10090)" + IDS_5903 "3.5"" 230 MB (ISO 13963)" + IDS_5904 "3.5"" 540 MB (ISO 15498)" + IDS_5905 "3.5"" 640 MB (ISO 15498)" + IDS_5906 "3.5"" 1,3 GB (GigaMO)" + IDS_5907 "3.5"" 2,3 GB (GigaMO 2)" + IDS_5908 "5.25"" 600 MB" + IDS_5909 "5.25"" 650 MB" + IDS_5910 "5.25"" 1 GB" + IDS_5911 "5.25"" 1,3 GB" - IDS_6144 "Idealne obroty" - IDS_6145 "1% poniżej idealnych obrotów" - IDS_6146 "1.5% poniżej idealnych obrotów" - IDS_6147 "2% poniżej idealnych obrotów" + IDS_6144 "Idealne obroty" + IDS_6145 "1% poniżej idealnych obrotów" + IDS_6146 "1.5% poniżej idealnych obrotów" + IDS_6147 "2% poniżej idealnych obrotów" - IDS_7168 "(Domyślne ustawienie systemowe)" + IDS_7168 "(Domyślne ustawienie systemowe)" END -#define IDS_LANG_ENUS IDS_7168 +#define IDS_LANG_ENUS IDS_7168 // Polish (pl-PL) resources ///////////////////////////////////////////////////////////////////////////// diff --git a/src/win/languages/pt-BR.rc b/src/win/languages/pt-BR.rc index d73fb5c3d..657e2956c 100644 --- a/src/win/languages/pt-BR.rc +++ b/src/win/languages/pt-BR.rc @@ -20,13 +20,13 @@ MainMenu MENU DISCARDABLE BEGIN POPUP "&Ação" BEGIN - MENUITEM "&Teclado requer captura", IDM_ACTION_KBD_REQ_CAPTURE - MENUITEM "CTRL &direito é o ALT esquerdo", IDM_ACTION_RCTRL_IS_LALT + MENUITEM "&Teclado requer captura", IDM_ACTION_KBD_REQ_CAPTURE + MENUITEM "CTRL &direito é o ALT esquerdo", IDM_ACTION_RCTRL_IS_LALT MENUITEM SEPARATOR MENUITEM "&Reinicialização completa...", IDM_ACTION_HRESET MENUITEM "&Ctrl+Alt+Del\tCtrl+F12", IDM_ACTION_RESET_CAD MENUITEM SEPARATOR - MENUITEM "Ctrl+Alt+&Esc", IDM_ACTION_CTRL_ALT_ESC + MENUITEM "Ctrl+Alt+&Esc", IDM_ACTION_CTRL_ALT_ESC MENUITEM SEPARATOR MENUITEM "&Pausar", IDM_ACTION_PAUSE MENUITEM SEPARATOR @@ -34,8 +34,8 @@ BEGIN END POPUP "&Exibir" BEGIN - MENUITEM "&Ocultar barra de status", IDM_VID_HIDE_STATUS_BAR - MENUITEM "Ocultar &barra de ferramenta", IDM_VID_HIDE_TOOLBAR + MENUITEM "&Ocultar barra de status", IDM_VID_HIDE_STATUS_BAR + MENUITEM "Ocultar &barra de ferramenta", IDM_VID_HIDE_TOOLBAR MENUITEM SEPARATOR MENUITEM "&Mostrar monitores não-primários", IDM_VID_MONITORS MENUITEM "&Janela redimensionável", IDM_VID_RESIZE @@ -104,11 +104,11 @@ BEGIN MENUITEM "Overscan do CGA/PCjr/Tandy/E&GA/(S)VGA", IDM_VID_OVERSCAN MENUITEM "Alterar contraste para exibição &monocromática", IDM_VID_CGACON END - MENUITEM "&Mídia", IDM_MEDIA + MENUITEM "&Mídia", IDM_MEDIA POPUP "&Ferramentas" BEGIN MENUITEM "&Configurações...", IDM_CONFIG - MENUITEM "&Atualizar ícones da barra de status", IDM_UPDATE_ICONS + MENUITEM "&Atualizar ícones da barra de status", IDM_UPDATE_ICONS MENUITEM SEPARATOR MENUITEM "Capturar &tela\tCtrl+F11", IDM_ACTION_SCREENSHOT MENUITEM SEPARATOR @@ -140,17 +140,17 @@ CassetteSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Nova imagem...", IDM_CASSETTE_IMAGE_NEW + MENUITEM "&Nova imagem...", IDM_CASSETTE_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&Imagem existente...", IDM_CASSETTE_IMAGE_EXISTING - MENUITEM "Imagem existente (&protegida contra escrita)...", IDM_CASSETTE_IMAGE_EXISTING_WP + MENUITEM "&Imagem existente...", IDM_CASSETTE_IMAGE_EXISTING + MENUITEM "Imagem existente (&protegida contra escrita)...", IDM_CASSETTE_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "&Gravar", IDM_CASSETTE_RECORD - MENUITEM "&Reproduzir", IDM_CASSETTE_PLAY - MENUITEM "&Rebobinar até o começo", IDM_CASSETTE_REWIND - MENUITEM "&Avançar até o fim", IDM_CASSETTE_FAST_FORWARD + MENUITEM "&Gravar", IDM_CASSETTE_RECORD + MENUITEM "&Reproduzir", IDM_CASSETTE_PLAY + MENUITEM "&Rebobinar até o começo", IDM_CASSETTE_REWIND + MENUITEM "&Avançar até o fim", IDM_CASSETTE_FAST_FORWARD MENUITEM SEPARATOR - MENUITEM "E&jetar", IDM_CASSETTE_EJECT + MENUITEM "E&jetar", IDM_CASSETTE_EJECT END END @@ -158,9 +158,9 @@ CartridgeSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Imagem...", IDM_CARTRIDGE_IMAGE + MENUITEM "&Imagem...", IDM_CARTRIDGE_IMAGE MENUITEM SEPARATOR - MENUITEM "E&jetar", IDM_CARTRIDGE_EJECT + MENUITEM "E&jetar", IDM_CARTRIDGE_EJECT END END @@ -168,14 +168,14 @@ FloppySubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Nova imagem...", IDM_FLOPPY_IMAGE_NEW + MENUITEM "&Nova imagem...", IDM_FLOPPY_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&Imagem existente...", IDM_FLOPPY_IMAGE_EXISTING - MENUITEM "Imagem existente (&protegida contra escrita)...", IDM_FLOPPY_IMAGE_EXISTING_WP + MENUITEM "&Imagem existente...", IDM_FLOPPY_IMAGE_EXISTING + MENUITEM "Imagem existente (&protegida contra escrita)...", IDM_FLOPPY_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "E&xportar para 86F...", IDM_FLOPPY_EXPORT_TO_86F + MENUITEM "E&xportar para 86F...", IDM_FLOPPY_EXPORT_TO_86F MENUITEM SEPARATOR - MENUITEM "E&jetar", IDM_FLOPPY_EJECT + MENUITEM "E&jetar", IDM_FLOPPY_EJECT END END @@ -183,13 +183,13 @@ CdromSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Sem som", IDM_CDROM_MUTE + MENUITEM "&Sem som", IDM_CDROM_MUTE MENUITEM SEPARATOR - MENUITEM "&Vazio", IDM_CDROM_EMPTY - MENUITEM "&Recarregar imagem anterior", IDM_CDROM_RELOAD + MENUITEM "&Vazio", IDM_CDROM_EMPTY + MENUITEM "&Recarregar imagem anterior", IDM_CDROM_RELOAD MENUITEM SEPARATOR - MENUITEM "&Imagem...", IDM_CDROM_IMAGE - MENUITEM "&Pasta...", IDM_CDROM_DIR + MENUITEM "&Imagem...", IDM_CDROM_IMAGE + MENUITEM "&Pasta...", IDM_CDROM_DIR END END @@ -197,13 +197,13 @@ ZIPSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Nova imagem...", IDM_ZIP_IMAGE_NEW + MENUITEM "&Nova imagem...", IDM_ZIP_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&Imagem existente...", IDM_ZIP_IMAGE_EXISTING - MENUITEM "Imagem existente (&protegida contra escrita)...", IDM_ZIP_IMAGE_EXISTING_WP + MENUITEM "&Imagem existente...", IDM_ZIP_IMAGE_EXISTING + MENUITEM "Imagem existente (&protegida contra escrita)...", IDM_ZIP_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "E&jetar", IDM_ZIP_EJECT - MENUITEM "&Recarregar imagem anterior", IDM_ZIP_RELOAD + MENUITEM "E&jetar", IDM_ZIP_EJECT + MENUITEM "&Recarregar imagem anterior", IDM_ZIP_RELOAD END END @@ -211,13 +211,13 @@ MOSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Nova imagem...", IDM_MO_IMAGE_NEW + MENUITEM "&Nova imagem...", IDM_MO_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&Imagem existente...", IDM_MO_IMAGE_EXISTING - MENUITEM "Imagem existente (&protegida contra escrita)...", IDM_MO_IMAGE_EXISTING_WP + MENUITEM "&Imagem existente...", IDM_MO_IMAGE_EXISTING + MENUITEM "Imagem existente (&protegida contra escrita)...", IDM_MO_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "E&jetar", IDM_MO_EJECT - MENUITEM "&Recarregar imagem anterior", IDM_MO_RELOAD + MENUITEM "E&jetar", IDM_MO_EJECT + MENUITEM "&Recarregar imagem anterior", IDM_MO_RELOAD END END @@ -243,150 +243,150 @@ END // Dialog // -#define STR_PREFERENCES "Preferências" -#define STR_SND_GAIN "Ganho de som" -#define STR_NEW_FLOPPY "Nova imagem de disquete" -#define STR_CONFIG "Configurações" -#define STR_SPECIFY_DIM "Especifique as dimensões da janela principal" +#define STR_PREFERENCES "Preferências" +#define STR_SND_GAIN "Ganho de som" +#define STR_NEW_FLOPPY "Nova imagem de disquete" +#define STR_CONFIG "Configurações" +#define STR_SPECIFY_DIM "Especifique as dimensões da janela principal" -#define STR_OK "OK" -#define STR_CANCEL "Cancelar" -#define STR_GLOBAL "Usar estas configurações como &padrões globais" -#define STR_DEFAULT "&Padrão" -#define STR_LANGUAGE "Idioma:" -#define STR_ICONSET "Pacote de ícones:" +#define STR_OK "OK" +#define STR_CANCEL "Cancelar" +#define STR_GLOBAL "Usar estas configurações como &padrões globais" +#define STR_DEFAULT "&Padrão" +#define STR_LANGUAGE "Idioma:" +#define STR_ICONSET "Pacote de ícones:" -#define STR_GAIN "Ganho" +#define STR_GAIN "Ganho" -#define STR_FILE_NAME "Nome:" -#define STR_DISK_SIZE "Tamanho:" -#define STR_RPM_MODE "Modo RPM:" -#define STR_PROGRESS "Progresso:" +#define STR_FILE_NAME "Nome:" +#define STR_DISK_SIZE "Tamanho:" +#define STR_RPM_MODE "Modo RPM:" +#define STR_PROGRESS "Progresso:" -#define STR_WIDTH "Largura:" -#define STR_HEIGHT "Altura:" -#define STR_LOCK_TO_SIZE "Travar nesse tamanho" +#define STR_WIDTH "Largura:" +#define STR_HEIGHT "Altura:" +#define STR_LOCK_TO_SIZE "Travar nesse tamanho" -#define STR_MACHINE_TYPE "Tipo de máquina:" -#define STR_MACHINE "Máquina:" -#define STR_CONFIGURE "Configurar" -#define STR_CPU_TYPE "Tipo de CPU:" -#define STR_CPU_SPEED "Veloc.:" -#define STR_FPU "FPU:" -#define STR_WAIT_STATES "Estados de espera:" -#define STR_MB "MB" -#define STR_MEMORY "Memória:" -#define STR_TIME_SYNC "Sincronização da hora" -#define STR_DISABLED "Desativar" -#define STR_ENABLED_LOCAL "Ativar (hora local)" -#define STR_ENABLED_UTC "Ativar (UTC)" -#define STR_DYNAREC "Recompilador dinâmico" +#define STR_MACHINE_TYPE "Tipo de máquina:" +#define STR_MACHINE "Máquina:" +#define STR_CONFIGURE "Configurar" +#define STR_CPU_TYPE "Tipo de CPU:" +#define STR_CPU_SPEED "Veloc.:" +#define STR_FPU "FPU:" +#define STR_WAIT_STATES "Estados de espera:" +#define STR_MB "MB" +#define STR_MEMORY "Memória:" +#define STR_TIME_SYNC "Sincronização da hora" +#define STR_DISABLED "Desativar" +#define STR_ENABLED_LOCAL "Ativar (hora local)" +#define STR_ENABLED_UTC "Ativar (UTC)" +#define STR_DYNAREC "Recompilador dinâmico" -#define STR_VIDEO "Vídeo:" -#define STR_VIDEO_2 "Vídeo 2:" -#define STR_VOODOO "3DFX Voodoo" -#define STR_IBM8514 "Gráficos IBM 8514/a" -#define STR_XGA "Gráficos XGA" +#define STR_VIDEO "Vídeo:" +#define STR_VIDEO_2 "Vídeo 2:" +#define STR_VOODOO "3DFX Voodoo" +#define STR_IBM8514 "Gráficos IBM 8514/a" +#define STR_XGA "Gráficos XGA" -#define STR_MOUSE "Mouse:" -#define STR_JOYSTICK "Joystick:" -#define STR_JOY1 "Joystick 1..." -#define STR_JOY2 "Joystick 2..." -#define STR_JOY3 "Joystick 3..." -#define STR_JOY4 "Joystick 4..." +#define STR_MOUSE "Mouse:" +#define STR_JOYSTICK "Joystick:" +#define STR_JOY1 "Joystick 1..." +#define STR_JOY2 "Joystick 2..." +#define STR_JOY3 "Joystick 3..." +#define STR_JOY4 "Joystick 4..." -#define STR_SOUND1 "Placa de som 1:" -#define STR_SOUND2 "Placa de som 2:" -#define STR_SOUND3 "Placa de som 3:" -#define STR_SOUND4 "Placa de som 4:" -#define STR_MIDI_OUT "Disp. saída MIDI:" -#define STR_MIDI_IN "Disp. entrada MIDI:" -#define STR_MPU401 "MPU-401 autônomo" -#define STR_FLOAT "Usar som FLOAT32" -#define STR_FM_DRIVER "Controlador de sint. FM" -#define STR_FM_DRV_NUKED "Nuked (mais preciso)" -#define STR_FM_DRV_YMFM "YMFM (mais rápido)" +#define STR_SOUND1 "Placa de som 1:" +#define STR_SOUND2 "Placa de som 2:" +#define STR_SOUND3 "Placa de som 3:" +#define STR_SOUND4 "Placa de som 4:" +#define STR_MIDI_OUT "Disp. saída MIDI:" +#define STR_MIDI_IN "Disp. entrada MIDI:" +#define STR_MPU401 "MPU-401 autônomo" +#define STR_FLOAT "Usar som FLOAT32" +#define STR_FM_DRIVER "Controlador de sint. FM" +#define STR_FM_DRV_NUKED "Nuked (mais preciso)" +#define STR_FM_DRV_YMFM "YMFM (mais rápido)" -#define STR_NET_TYPE "Tipo de rede:" -#define STR_PCAP "Dispositivo PCap:" -#define STR_NET "Adaptador de rede:" -#define STR_NET1 "Network card 1:" -#define STR_NET2 "Network card 2:" -#define STR_NET3 "Network card 3:" -#define STR_NET4 "Network card 4:" +#define STR_NET_TYPE "Tipo de rede:" +#define STR_PCAP "Dispositivo PCap:" +#define STR_NET "Adaptador de rede:" +#define STR_NET1 "Network card 1:" +#define STR_NET2 "Network card 2:" +#define STR_NET3 "Network card 3:" +#define STR_NET4 "Network card 4:" -#define STR_COM1 "Dispositivo COM1:" -#define STR_COM2 "Dispositivo COM2:" -#define STR_COM3 "Dispositivo COM3:" -#define STR_COM4 "Dispositivo COM4:" -#define STR_LPT1 "Dispositivo LPT1:" -#define STR_LPT2 "Dispositivo LPT2:" -#define STR_LPT3 "Dispositivo LPT3:" -#define STR_LPT4 "Dispositivo LPT4:" -#define STR_SERIAL1 "Porta serial 1" -#define STR_SERIAL2 "Porta serial 2" -#define STR_SERIAL3 "Porta serial 3" -#define STR_SERIAL4 "Porta serial 4" -#define STR_PARALLEL1 "Porta paralela 1" -#define STR_PARALLEL2 "Porta paralela 2" -#define STR_PARALLEL3 "Porta paralela 3" -#define STR_PARALLEL4 "Porta paralela 4" -#define STR_SERIAL_PASS1 "Serial port passthrough 1" -#define STR_SERIAL_PASS2 "Serial port passthrough 2" -#define STR_SERIAL_PASS3 "Serial port passthrough 3" -#define STR_SERIAL_PASS4 "Serial port passthrough 4" +#define STR_COM1 "Dispositivo COM1:" +#define STR_COM2 "Dispositivo COM2:" +#define STR_COM3 "Dispositivo COM3:" +#define STR_COM4 "Dispositivo COM4:" +#define STR_LPT1 "Dispositivo LPT1:" +#define STR_LPT2 "Dispositivo LPT2:" +#define STR_LPT3 "Dispositivo LPT3:" +#define STR_LPT4 "Dispositivo LPT4:" +#define STR_SERIAL1 "Porta serial 1" +#define STR_SERIAL2 "Porta serial 2" +#define STR_SERIAL3 "Porta serial 3" +#define STR_SERIAL4 "Porta serial 4" +#define STR_PARALLEL1 "Porta paralela 1" +#define STR_PARALLEL2 "Porta paralela 2" +#define STR_PARALLEL3 "Porta paralela 3" +#define STR_PARALLEL4 "Porta paralela 4" +#define STR_SERIAL_PASS1 "Serial port passthrough 1" +#define STR_SERIAL_PASS2 "Serial port passthrough 2" +#define STR_SERIAL_PASS3 "Serial port passthrough 3" +#define STR_SERIAL_PASS4 "Serial port passthrough 4" -#define STR_HDC "Controlador HD:" -#define STR_FDC "Controlador FD:" -#define STR_IDE_TER "Controlador IDE terciário" -#define STR_IDE_QUA "Controlador IDE quaternário" -#define STR_SCSI "SCSI" -#define STR_SCSI_1 "Controlador 1:" -#define STR_SCSI_2 "Controlador 2:" -#define STR_SCSI_3 "Controlador 3:" -#define STR_SCSI_4 "Controlador 4:" -#define STR_CASSETTE "Cassete" +#define STR_HDC "Controlador HD:" +#define STR_FDC "Controlador FD:" +#define STR_IDE_TER "Controlador IDE terciário" +#define STR_IDE_QUA "Controlador IDE quaternário" +#define STR_SCSI "SCSI" +#define STR_SCSI_1 "Controlador 1:" +#define STR_SCSI_2 "Controlador 2:" +#define STR_SCSI_3 "Controlador 3:" +#define STR_SCSI_4 "Controlador 4:" +#define STR_CASSETTE "Cassete" -#define STR_HDD "Discos rígidos:" -#define STR_NEW "&Novo..." -#define STR_EXISTING "&Existente..." -#define STR_REMOVE "&Remover" -#define STR_BUS "Bar.:" -#define STR_CHANNEL "Canal:" -#define STR_ID "ID:" -#define STR_SPEED "Velocidade:" +#define STR_HDD "Discos rígidos:" +#define STR_NEW "&Novo..." +#define STR_EXISTING "&Existente..." +#define STR_REMOVE "&Remover" +#define STR_BUS "Bar.:" +#define STR_CHANNEL "Canal:" +#define STR_ID "ID:" +#define STR_SPEED "Velocidade:" -#define STR_SPECIFY "&Especificar..." -#define STR_SECTORS "Setores:" -#define STR_HEADS "Cabeças:" -#define STR_CYLS "Cilindros:" -#define STR_SIZE_MB "Tamanho (MB):" -#define STR_TYPE "Tipo:" -#define STR_IMG_FORMAT "Formato:" -#define STR_BLOCK_SIZE "Blocos:" +#define STR_SPECIFY "&Especificar..." +#define STR_SECTORS "Setores:" +#define STR_HEADS "Cabeças:" +#define STR_CYLS "Cilindros:" +#define STR_SIZE_MB "Tamanho (MB):" +#define STR_TYPE "Tipo:" +#define STR_IMG_FORMAT "Formato:" +#define STR_BLOCK_SIZE "Blocos:" -#define STR_FLOPPY_DRIVES "Unidades de disquete:" -#define STR_TURBO "Turbo" -#define STR_CHECKBPB "Verificar BPB" -#define STR_CDROM_DRIVES "Unidades de CD-ROM:" -#define STR_CD_SPEED "Veloc.:" -#define STR_EARLY "Unidade anterior" +#define STR_FLOPPY_DRIVES "Unidades de disquete:" +#define STR_TURBO "Turbo" +#define STR_CHECKBPB "Verificar BPB" +#define STR_CDROM_DRIVES "Unidades de CD-ROM:" +#define STR_CD_SPEED "Veloc.:" +#define STR_EARLY "Unidade anterior" -#define STR_MO_DRIVES "Unidades magneto-ópticas:" -#define STR_ZIP_DRIVES "Unidades ZIP:" -#define STR_250 "ZIP 250" +#define STR_MO_DRIVES "Unidades magneto-ópticas:" +#define STR_ZIP_DRIVES "Unidades ZIP:" +#define STR_250 "ZIP 250" -#define STR_ISARTC "RTC ISA:" -#define STR_ISAMEM "Expansão de memória ISA" -#define STR_ISAMEM_1 "Placa 1:" -#define STR_ISAMEM_2 "Placa 2:" -#define STR_ISAMEM_3 "Placa 3:" -#define STR_ISAMEM_4 "Placa 4:" -#define STR_BUGGER "Dispositivo ISABugger" -#define STR_POSTCARD "Placa de diagnóstico" +#define STR_ISARTC "RTC ISA:" +#define STR_ISAMEM "Expansão de memória ISA" +#define STR_ISAMEM_1 "Placa 1:" +#define STR_ISAMEM_2 "Placa 2:" +#define STR_ISAMEM_3 "Placa 3:" +#define STR_ISAMEM_4 "Placa 4:" +#define STR_BUGGER "Dispositivo ISABugger" +#define STR_POSTCARD "Placa de diagnóstico" -#define FONT_SIZE 9 -#define FONT_NAME "Segoe UI" +#define FONT_SIZE 9 +#define FONT_NAME "Segoe UI" #include "dialogs.rc" @@ -397,149 +397,149 @@ END STRINGTABLE DISCARDABLE BEGIN - 2048 "86Box" - IDS_2049 "Erro" - IDS_2050 "Erro fatal" - IDS_2051 " - PAUSADO" - IDS_2052 "Use Ctrl+Alt+PgDn para retornar ao modo janela" - IDS_2053 "Velocidade" - IDS_2054 "ZIP %03i %i (%s): %ls" - IDS_2055 "Imagens ZIP (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" - IDS_2056 "O 86Box não conseguiu encontrar nenhuma imagem de ROM utilizável.\n\nPor favor, baixe um conjunto de ROM e extraia no diretório ""roms""." - IDS_2057 "(vazio)" - IDS_2058 "Imagens ZIP (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0Todos os arquivos (*.*)\0*.*\0" - IDS_2059 "Turbo" - IDS_2060 "Lig." - IDS_2061 "Desl." - IDS_2062 "Todas as imagens (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0Imagens de setor básico (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Imagens de superfície (*.86F)\0*.86F\0" - IDS_2063 "A máquina ""%hs"" não está disponível devido à falta de ROMs no diretório roms/machines. Mudando para uma máquina disponível." + 2048 "86Box" + IDS_2049 "Erro" + IDS_2050 "Erro fatal" + IDS_2051 " - PAUSADO" + IDS_2052 "Use Ctrl+Alt+PgDn para retornar ao modo janela" + IDS_2053 "Velocidade" + IDS_2054 "ZIP %03i %i (%s): %ls" + IDS_2055 "Imagens ZIP (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" + IDS_2056 "O 86Box não conseguiu encontrar nenhuma imagem de ROM utilizável.\n\nPor favor, baixe um conjunto de ROM e extraia no diretório ""roms""." + IDS_2057 "(vazio)" + IDS_2058 "Imagens ZIP (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0Todos os arquivos (*.*)\0*.*\0" + IDS_2059 "Turbo" + IDS_2060 "Lig." + IDS_2061 "Desl." + IDS_2062 "Todas as imagens (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0Imagens de setor básico (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Imagens de superfície (*.86F)\0*.86F\0" + IDS_2063 "A máquina ""%hs"" não está disponível devido à falta de ROMs no diretório roms/machines. Mudando para uma máquina disponível." END STRINGTABLE DISCARDABLE BEGIN - IDS_2064 "A placa de vídeo ""%hs"" não está disponível devido à falta de ROMs no diretório roms/video. Mudando para uma placa de vídeo disponível." - IDS_2065 "Máquina" - IDS_2066 "Vídeo" - IDS_2067 "Dispositivos de entrada" - IDS_2068 "Som" - IDS_2069 "Rede" - IDS_2070 "Portas (COM & LPT)" - IDS_2071 "Controladores de armaz." - IDS_2072 "Discos rígidos" - IDS_2073 "Disquete & CD-ROM" - IDS_2074 "Dispos. removíveis" - IDS_2075 "Outros periféricos" - IDS_2076 "Imagens de superfície (*.86F)\0*.86F\0" - IDS_2077 "Clique para capturar o mouse" - IDS_2078 "Aperte F8+F12 para liberar o mouse" - IDS_2079 "Aperte F8+F12 ou botão do meio para liberar o mouse" + IDS_2064 "A placa de vídeo ""%hs"" não está disponível devido à falta de ROMs no diretório roms/video. Mudando para uma placa de vídeo disponível." + IDS_2065 "Máquina" + IDS_2066 "Vídeo" + IDS_2067 "Dispositivos de entrada" + IDS_2068 "Som" + IDS_2069 "Rede" + IDS_2070 "Portas (COM & LPT)" + IDS_2071 "Controladores de armaz." + IDS_2072 "Discos rígidos" + IDS_2073 "Disquete & CD-ROM" + IDS_2074 "Dispos. removíveis" + IDS_2075 "Outros periféricos" + IDS_2076 "Imagens de superfície (*.86F)\0*.86F\0" + IDS_2077 "Clique para capturar o mouse" + IDS_2078 "Aperte F8+F12 para liberar o mouse" + IDS_2079 "Aperte F8+F12 ou botão do meio para liberar o mouse" END STRINGTABLE DISCARDABLE BEGIN - IDS_2080 "Não foi possível inicializar o FluidSynth" - IDS_2081 "Barramento" - IDS_2082 "Arquivo" - IDS_2083 "CI" - IDS_2084 "CA" - IDS_2085 "SE" - IDS_2086 "MB" + IDS_2080 "Não foi possível inicializar o FluidSynth" + IDS_2081 "Barramento" + IDS_2082 "Arquivo" + IDS_2083 "CI" + IDS_2084 "CA" + IDS_2085 "SE" + IDS_2086 "MB" IDS_2087 "Velocidade" - IDS_2088 "Verificar BPB" - IDS_2089 "KB" - IDS_2090 "Não foi possível inicializar o renderizador de vídeo." - IDS_2091 "Padrão" - IDS_2092 "%i estado(s) de espera" - IDS_2093 "Tipo" - IDS_2094 "Não foi possível configurar o PCap" - IDS_2095 "Nenhum dispositivo PCap encontrado" - IDS_2096 "Dispositivo PCap inválido" - IDS_2097 "Joystick padrão de 2 botões" - IDS_2098 "Joystick padrão de 4 botões" - IDS_2099 "Joystick padrão de 6 botões" - IDS_2100 "Joystick padrão de 8 botões" - IDS_2101 "CH Flightstick Pro" - IDS_2102 "Microsoft SideWinder Pad" - IDS_2103 "Sistema de Controle de Voo Thrustmaster" - IDS_2104 "Nada" - IDS_2105 "Não foi possível carregar os aceleradores do teclado." - IDS_2106 "Não foi possível registrar a entrada bruta." - IDS_2107 "%u" - IDS_2108 "%u MB (CHS: %i, %i, %i)" - IDS_2109 "Disquete %i (%s): %ls" - IDS_2110 "Todas as imagens (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Imagens de setor avançado (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Imagens de setor básico (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Imagens de fluxo (*.FDI)\0*.FDI\0Imagens de superfície (*.86F;*.MFM)\0*.86F;*.MFM\0Todos os arquivos (*.*)\0*.*\0" - IDS_2111 "Não foi possível inicializar o FreeType" - IDS_2112 "Não é possível inicializar o SDL, é necessário o SDL2.dll" - IDS_2113 "Tem certeza de que deseja reiniciar completamente a máquina emulada?" - IDS_2114 "Tem certeza de que deseja sair do 86Box?" - IDS_2115 "Não é possível inicializar o Ghostscript" - IDS_2116 "Magneto-óptico %i (%ls): %ls" - IDS_2117 "Imagens magneto-ópticas (*.IM?;*.MDI)\0*.IM?;*.MDI\0Todos os arquivos (*.*)\0*.*\0" - IDS_2118 "Bem-vindo ao 86Box!" - IDS_2119 "Controlador interno" - IDS_2120 "Sair" - IDS_2121 "Nenhum ROM encontrada" - IDS_2122 "Você deseja salvar as configurações?" - IDS_2123 "Isto fará com que a máquina emulada seja reinicializada." - IDS_2124 "Salvar" - IDS_2125 "Sobre o 86Box" - IDS_2126 "86Box versão" EMU_VERSION + IDS_2088 "Verificar BPB" + IDS_2089 "KB" + IDS_2090 "Não foi possível inicializar o renderizador de vídeo." + IDS_2091 "Padrão" + IDS_2092 "%i estado(s) de espera" + IDS_2093 "Tipo" + IDS_2094 "Não foi possível configurar o PCap" + IDS_2095 "Nenhum dispositivo PCap encontrado" + IDS_2096 "Dispositivo PCap inválido" + IDS_2097 "Joystick padrão de 2 botões" + IDS_2098 "Joystick padrão de 4 botões" + IDS_2099 "Joystick padrão de 6 botões" + IDS_2100 "Joystick padrão de 8 botões" + IDS_2101 "CH Flightstick Pro" + IDS_2102 "Microsoft SideWinder Pad" + IDS_2103 "Sistema de Controle de Voo Thrustmaster" + IDS_2104 "Nada" + IDS_2105 "Não foi possível carregar os aceleradores do teclado." + IDS_2106 "Não foi possível registrar a entrada bruta." + IDS_2107 "%u" + IDS_2108 "%u MB (CHS: %i, %i, %i)" + IDS_2109 "Disquete %i (%s): %ls" + IDS_2110 "Todas as imagens (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Imagens de setor avançado (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Imagens de setor básico (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Imagens de fluxo (*.FDI)\0*.FDI\0Imagens de superfície (*.86F;*.MFM)\0*.86F;*.MFM\0Todos os arquivos (*.*)\0*.*\0" + IDS_2111 "Não foi possível inicializar o FreeType" + IDS_2112 "Não é possível inicializar o SDL, é necessário o SDL2.dll" + IDS_2113 "Tem certeza de que deseja reiniciar completamente a máquina emulada?" + IDS_2114 "Tem certeza de que deseja sair do 86Box?" + IDS_2115 "Não é possível inicializar o Ghostscript" + IDS_2116 "Magneto-óptico %i (%ls): %ls" + IDS_2117 "Imagens magneto-ópticas (*.IM?;*.MDI)\0*.IM?;*.MDI\0Todos os arquivos (*.*)\0*.*\0" + IDS_2118 "Bem-vindo ao 86Box!" + IDS_2119 "Controlador interno" + IDS_2120 "Sair" + IDS_2121 "Nenhum ROM encontrada" + IDS_2122 "Você deseja salvar as configurações?" + IDS_2123 "Isto fará com que a máquina emulada seja reinicializada." + IDS_2124 "Salvar" + IDS_2125 "Sobre o 86Box" + IDS_2126 "86Box versão" EMU_VERSION - IDS_2127 "Um emulador de computadores antigos\n\nAutores: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, Tiseno100, reenigne, leilei, JohnElliott, greatpsycho, e outros.\n\nTraduzido por: Altieres Lima da Silva\n\nLançado sob a Licença Pública Geral GNU versão 2 ou posterior. Veja o arquivo LICENSE para mais informações." - IDS_2128 "OK" - IDS_2129 "Hardware não disponível" + IDS_2127 "Um emulador de computadores antigos\n\nAutores: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, Tiseno100, reenigne, leilei, JohnElliott, greatpsycho, e outros.\n\nTraduzido por: Altieres Lima da Silva\n\nLançado sob a Licença Pública Geral GNU versão 2 ou posterior. Veja o arquivo LICENSE para mais informações." + IDS_2128 "OK" + IDS_2129 "Hardware não disponível" #ifdef _WIN32 #define LIB_NAME_PCAP "WinPcap" #else #define LIB_NAME_PCAP "libpcap" #endif - IDS_2130 "Certifique-se de que " LIB_NAME_PCAP " esteja instalado e que você tenha uma conexão de rede compatível com " LIB_NAME_PCAP "." - IDS_2131 "Configuração inválida" + IDS_2130 "Certifique-se de que " LIB_NAME_PCAP " esteja instalado e que você tenha uma conexão de rede compatível com " LIB_NAME_PCAP "." + IDS_2131 "Configuração inválida" #ifdef _WIN32 #define LIB_NAME_FREETYPE "freetype.dll" #else #define LIB_NAME_FREETYPE "libfreetype" #endif - IDS_2132 LIB_NAME_FREETYPE " é necessário para emulação de impressora ESC/P." + IDS_2132 LIB_NAME_FREETYPE " é necessário para emulação de impressora ESC/P." #ifdef _WIN32 #define LIB_NAME_GS "gsdll32.dll" #else #define LIB_NAME_GS "libgs" #endif - IDS_2133 LIB_NAME_GS " é necessário para a conversão automática de arquivos PostScript para PDF.\n\nQualquer documento enviado para a impressora genérica PostScript será salvo como arquivos PostScript (.ps)." + IDS_2133 LIB_NAME_GS " é necessário para a conversão automática de arquivos PostScript para PDF.\n\nQualquer documento enviado para a impressora genérica PostScript será salvo como arquivos PostScript (.ps)." #ifdef _WIN32 #define LIB_NAME_FLUIDSYNTH "libfluidsynth.dll" #else #define LIB_NAME_FLUIDSYNTH "libfluidsynth" #endif - IDS_2134 LIB_NAME_FLUIDSYNTH " é necessário para a saída MIDI FluidSynth." - IDS_2135 "Entrando no modo de tela cheia" - IDS_2136 "Não exibir esta mensagem novamente" - IDS_2137 "Não sair" - IDS_2138 "Reiniciar" - IDS_2139 "Não reiniciar" - IDS_2140 "Imagens magneto-ópticas (*.IM?;*.MDI)\0*.IM?;*.MDI\0Todos os arquivos (*.*)\0*.*\0" - IDS_2141 "Imagens de CD-ROM (*.ISO;*.CUE)\0*.ISO;*.CUE\0Todos os arquivos (*.*)\0*.*\0" - IDS_2142 "Configuração do dispositivo %hs" + IDS_2134 LIB_NAME_FLUIDSYNTH " é necessário para a saída MIDI FluidSynth." + IDS_2135 "Entrando no modo de tela cheia" + IDS_2136 "Não exibir esta mensagem novamente" + IDS_2137 "Não sair" + IDS_2138 "Reiniciar" + IDS_2139 "Não reiniciar" + IDS_2140 "Imagens magneto-ópticas (*.IM?;*.MDI)\0*.IM?;*.MDI\0Todos os arquivos (*.*)\0*.*\0" + IDS_2141 "Imagens de CD-ROM (*.ISO;*.CUE)\0*.ISO;*.CUE\0Todos os arquivos (*.*)\0*.*\0" + IDS_2142 "Configuração do dispositivo %hs" IDS_2143 "Monitor em modo de suspensão" - IDS_2144 "Shaders OpenGL (*.GLSL)\0*.GLSL\0Todos os arquivos (*.*)\0*.*\0" - IDS_2145 "Opções do OpenGL" - IDS_2146 "Você está carregando uma configuração não suportada" - IDS_2147 "A filtragem do tipo CPU baseada na máquina selecionada é desativada para esta máquina emulada.\n\nIsto torna possível escolher uma CPU que de outra forma seria incompatível com a máquina selecionada. Entretanto, você pode encontrar incompatibilidades com a BIOS da máquina ou outro software.\n\nA ativação desta configuração não é oficialmente suportada e qualquer relatório de erro arquivado pode ser fechado como inválido." - IDS_2148 "Continuar" - IDS_2149 "Cassete: %s" - IDS_2150 "Imagens de cassete (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Todos os arquivos (*.*)\0*.*\0" - IDS_2151 "Cartucho %i: %ls" - IDS_2152 "Imagens de cartucho (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Todos os arquivos (*.*)\0*.*\0" - IDS_2153 "Erro ao inicializar o renderizador" - IDS_2154 "O renderizador OpenGL (Núcleo 3.0) não pôde ser inicializado. Use outro renderizador." - IDS_2155 "Continuar a execução" - IDS_2156 "Pausar a execução" - IDS_2157 "Pressionar Ctrl+Alt+Del" - IDS_2158 "Pressionar Ctrl+Alt+Esc" - IDS_2159 "Reinicialização completa" - IDS_2160 "Desligamento por ACPI" - IDS_2161 "Configurações" + IDS_2144 "Shaders OpenGL (*.GLSL)\0*.GLSL\0Todos os arquivos (*.*)\0*.*\0" + IDS_2145 "Opções do OpenGL" + IDS_2146 "Você está carregando uma configuração não suportada" + IDS_2147 "A filtragem do tipo CPU baseada na máquina selecionada é desativada para esta máquina emulada.\n\nIsto torna possível escolher uma CPU que de outra forma seria incompatível com a máquina selecionada. Entretanto, você pode encontrar incompatibilidades com a BIOS da máquina ou outro software.\n\nA ativação desta configuração não é oficialmente suportada e qualquer relatório de erro arquivado pode ser fechado como inválido." + IDS_2148 "Continuar" + IDS_2149 "Cassete: %s" + IDS_2150 "Imagens de cassete (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Todos os arquivos (*.*)\0*.*\0" + IDS_2151 "Cartucho %i: %ls" + IDS_2152 "Imagens de cartucho (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Todos os arquivos (*.*)\0*.*\0" + IDS_2153 "Erro ao inicializar o renderizador" + IDS_2154 "O renderizador OpenGL (Núcleo 3.0) não pôde ser inicializado. Use outro renderizador." + IDS_2155 "Continuar a execução" + IDS_2156 "Pausar a execução" + IDS_2157 "Pressionar Ctrl+Alt+Del" + IDS_2158 "Pressionar Ctrl+Alt+Esc" + IDS_2159 "Reinicialização completa" + IDS_2160 "Desligamento por ACPI" + IDS_2161 "Configurações" IDS_2162 "Unidade anterior" IDS_2163 "No Dynarec" IDS_2164 "Old Dynarec" @@ -550,45 +550,45 @@ END STRINGTABLE DISCARDABLE BEGIN IDS_4096 "Disco rígido (%s)" - IDS_4097 "%01i:%01i" - IDS_4098 "%01i" - IDS_4099 "As unidades de CD-ROM MFM/RLL ou ESDI nunca existiram" - IDS_4100 "Personalizado..." - IDS_4101 "Personalizado (grande)..." - IDS_4102 "Adicionar novo disco rígido" - IDS_4103 "Adicionar disco rígido existente" - IDS_4104 "As imagens de disco HDI não podem ser maiores do que 4GB." - IDS_4105 "As imagens de disco não podem ser maiores do que 127GB." - IDS_4106 "Imagens de disco rígido (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0Todos os arquivos (*.*)\0*.*\0" - IDS_4107 "Não foi possível ler o arquivo" - IDS_4108 "Não foi possível escrever o arquivo" - IDS_4109 "Imagens HDI ou HDX com um tamanho de setor que não seja 512 não são suportadas." - IDS_4110 "O USB ainda não é suportado" - IDS_4111 "Esta imagem existe" - IDS_4112 "Digite um nome de arquivo válido." - IDS_4113 "A imagem foi criada com sucesso" - IDS_4114 "Certifique-se de que o arquivo existe e é legível." - IDS_4115 "Certifique-se de que o arquivo está sendo salvo em um diretório gravável." - IDS_4116 "A imagem do disco é muito grande" - IDS_4117 "Lembre-se de particionar e formatar a unidade recém-criada." - IDS_4118 "O arquivo selecionado será sobrescrito. Você tem certeza de que deseja usá-lo?" - IDS_4119 "Imagem de disco sem suporte" - IDS_4120 "Sobrescrever" - IDS_4121 "Não sobrescrever" - IDS_4122 "Imagem bruta (.img)" - IDS_4123 "Imagem HDI (.hdi)" - IDS_4124 "Imagem HDX (.hdx)" - IDS_4125 "VHD de tamanho fixo (.vhd)" - IDS_4126 "VHD de tamanho dinâmico (.vhd)" - IDS_4127 "VHD diferencial (.vhd)" - IDS_4128 "Blocos grandes (2 MB)" - IDS_4129 "Blocos pequenos (512 KB)" - IDS_4130 "Arquivos VHD (*.VHD)\0*.VHD\0Todos os arquivos (*.*)\0*.*\0" - IDS_4131 "Selecione o VHD pai" - IDS_4132 "Isto pode significar que a imagem de origem foi modificada após a criação da imagem diferencial.\n\nTambém pode acontecer caso os arquivos de imagem tenham sido movidos ou copiados, ou por um erro no programa que criou este disco.\n\nVocê quer consertar os marcadores de tempo?" - IDS_4133 "A data/hora dos arquivos de pais e filhos não correspondem" - IDS_4134 "Não foi possível consertar o carimbo de data/hora da VHD." - IDS_4135 "%01i:%02i" + IDS_4097 "%01i:%01i" + IDS_4098 "%01i" + IDS_4099 "As unidades de CD-ROM MFM/RLL ou ESDI nunca existiram" + IDS_4100 "Personalizado..." + IDS_4101 "Personalizado (grande)..." + IDS_4102 "Adicionar novo disco rígido" + IDS_4103 "Adicionar disco rígido existente" + IDS_4104 "As imagens de disco HDI não podem ser maiores do que 4GB." + IDS_4105 "As imagens de disco não podem ser maiores do que 127GB." + IDS_4106 "Imagens de disco rígido (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0Todos os arquivos (*.*)\0*.*\0" + IDS_4107 "Não foi possível ler o arquivo" + IDS_4108 "Não foi possível escrever o arquivo" + IDS_4109 "Imagens HDI ou HDX com um tamanho de setor que não seja 512 não são suportadas." + IDS_4110 "O USB ainda não é suportado" + IDS_4111 "Esta imagem existe" + IDS_4112 "Digite um nome de arquivo válido." + IDS_4113 "A imagem foi criada com sucesso" + IDS_4114 "Certifique-se de que o arquivo existe e é legível." + IDS_4115 "Certifique-se de que o arquivo está sendo salvo em um diretório gravável." + IDS_4116 "A imagem do disco é muito grande" + IDS_4117 "Lembre-se de particionar e formatar a unidade recém-criada." + IDS_4118 "O arquivo selecionado será sobrescrito. Você tem certeza de que deseja usá-lo?" + IDS_4119 "Imagem de disco sem suporte" + IDS_4120 "Sobrescrever" + IDS_4121 "Não sobrescrever" + IDS_4122 "Imagem bruta (.img)" + IDS_4123 "Imagem HDI (.hdi)" + IDS_4124 "Imagem HDX (.hdx)" + IDS_4125 "VHD de tamanho fixo (.vhd)" + IDS_4126 "VHD de tamanho dinâmico (.vhd)" + IDS_4127 "VHD diferencial (.vhd)" + IDS_4128 "Blocos grandes (2 MB)" + IDS_4129 "Blocos pequenos (512 KB)" + IDS_4130 "Arquivos VHD (*.VHD)\0*.VHD\0Todos os arquivos (*.*)\0*.*\0" + IDS_4131 "Selecione o VHD pai" + IDS_4132 "Isto pode significar que a imagem de origem foi modificada após a criação da imagem diferencial.\n\nTambém pode acontecer caso os arquivos de imagem tenham sido movidos ou copiados, ou por um erro no programa que criou este disco.\n\nVocê quer consertar os marcadores de tempo?" + IDS_4133 "A data/hora dos arquivos de pais e filhos não correspondem" + IDS_4134 "Não foi possível consertar o carimbo de data/hora da VHD." + IDS_4135 "%01i:%02i" IDS_4352 "MFM/RLL" IDS_4353 "XTA" @@ -597,56 +597,56 @@ BEGIN IDS_4356 "ATAPI" IDS_4357 "SCSI" - IDS_4608 "MFM/RLL (%01i:%01i)" - IDS_4609 "XTA (%01i:%01i)" - IDS_4610 "ESDI (%01i:%01i)" - IDS_4611 "IDE (%01i:%01i)" - IDS_4612 "ATAPI (%01i:%01i)" - IDS_4613 "SCSI (%01i:%02i)" + IDS_4608 "MFM/RLL (%01i:%01i)" + IDS_4609 "XTA (%01i:%01i)" + IDS_4610 "ESDI (%01i:%01i)" + IDS_4611 "IDE (%01i:%01i)" + IDS_4612 "ATAPI (%01i:%01i)" + IDS_4613 "SCSI (%01i:%02i)" - IDS_5120 "CD-ROM %i (%s): %s" + IDS_5120 "CD-ROM %i (%s): %s" - IDS_5376 "Desativado" - IDS_5381 "ATAPI" + IDS_5376 "Desativado" + IDS_5381 "ATAPI" IDS_5382 "SCSI" - IDS_5632 "Desativado" - IDS_5637 "ATAPI (%01i:%01i)" + IDS_5632 "Desativado" + IDS_5637 "ATAPI (%01i:%01i)" IDS_5638 "SCSI (%01i:%02i)" - IDS_5888 "160 kB" - IDS_5889 "180 kB" - IDS_5890 "320 kB" - IDS_5891 "360 kB" - IDS_5892 "640 kB" - IDS_5893 "720 kB" - IDS_5894 "1.2 MB" - IDS_5895 "1.25 MB" - IDS_5896 "1.44 MB" - IDS_5897 "DMF (cluster 1024)" - IDS_5898 "DMF (cluster 2048)" - IDS_5899 "2.88 MB" - IDS_5900 "ZIP 100" - IDS_5901 "ZIP 250" - IDS_5902 "3.5"" 128 MB (ISO 10090)" - IDS_5903 "3.5"" 230 MB (ISO 13963)" - IDS_5904 "3.5"" 540 MB (ISO 15498)" - IDS_5905 "3.5"" 640 MB (ISO 15498)" - IDS_5906 "3.5"" 1.3 GB (GigaMO)" - IDS_5907 "3.5"" 2.3 GB (GigaMO 2)" - IDS_5908 "5.25"" 600 MB" - IDS_5909 "5.25"" 650 MB" - IDS_5910 "5.25"" 1 GB" - IDS_5911 "5.25"" 1.3 GB" + IDS_5888 "160 kB" + IDS_5889 "180 kB" + IDS_5890 "320 kB" + IDS_5891 "360 kB" + IDS_5892 "640 kB" + IDS_5893 "720 kB" + IDS_5894 "1.2 MB" + IDS_5895 "1.25 MB" + IDS_5896 "1.44 MB" + IDS_5897 "DMF (cluster 1024)" + IDS_5898 "DMF (cluster 2048)" + IDS_5899 "2.88 MB" + IDS_5900 "ZIP 100" + IDS_5901 "ZIP 250" + IDS_5902 "3.5"" 128 MB (ISO 10090)" + IDS_5903 "3.5"" 230 MB (ISO 13963)" + IDS_5904 "3.5"" 540 MB (ISO 15498)" + IDS_5905 "3.5"" 640 MB (ISO 15498)" + IDS_5906 "3.5"" 1.3 GB (GigaMO)" + IDS_5907 "3.5"" 2.3 GB (GigaMO 2)" + IDS_5908 "5.25"" 600 MB" + IDS_5909 "5.25"" 650 MB" + IDS_5910 "5.25"" 1 GB" + IDS_5911 "5.25"" 1.3 GB" - IDS_6144 "RPM perfeita" - IDS_6145 "1% abaixo das RPM perfeita" - IDS_6146 "1.5% abaixo das RPM perfeita" - IDS_6147 "2% abaixo das RPM perfeita" + IDS_6144 "RPM perfeita" + IDS_6145 "1% abaixo das RPM perfeita" + IDS_6146 "1.5% abaixo das RPM perfeita" + IDS_6147 "2% abaixo das RPM perfeita" - IDS_7168 "(Padrão do sistema)" + IDS_7168 "(Padrão do sistema)" END -#define IDS_LANG_ENUS IDS_7168 +#define IDS_LANG_ENUS IDS_7168 // Portuguese (pt-BR) resources ///////////////////////////////////////////////////////////////////////////// diff --git a/src/win/languages/pt-PT.rc b/src/win/languages/pt-PT.rc index 1fca7d6ad..ffdd5f655 100644 --- a/src/win/languages/pt-PT.rc +++ b/src/win/languages/pt-PT.rc @@ -17,13 +17,13 @@ MainMenu MENU DISCARDABLE BEGIN POPUP "&Ação" BEGIN - MENUITEM "&Teclado requere captura", IDM_ACTION_KBD_REQ_CAPTURE + MENUITEM "&Teclado requere captura", IDM_ACTION_KBD_REQ_CAPTURE MENUITEM "&CTRL direito é ALT esquerdo",IDM_ACTION_RCTRL_IS_LALT MENUITEM SEPARATOR MENUITEM "&Reinicialização completa...",IDM_ACTION_HRESET MENUITEM "&Ctrl+Alt+Del\tCtrl+F12", IDM_ACTION_RESET_CAD MENUITEM SEPARATOR - MENUITEM "Ctrl+Alt+&Esc", IDM_ACTION_CTRL_ALT_ESC + MENUITEM "Ctrl+Alt+&Esc", IDM_ACTION_CTRL_ALT_ESC MENUITEM SEPARATOR MENUITEM "&Pausa", IDM_ACTION_PAUSE MENUITEM SEPARATOR @@ -31,8 +31,8 @@ BEGIN END POPUP "&Ver" BEGIN - MENUITEM "&Ocultar barra de estado", IDM_VID_HIDE_STATUS_BAR - MENUITEM "Hide &toolbar", IDM_VID_HIDE_TOOLBAR + MENUITEM "&Ocultar barra de estado", IDM_VID_HIDE_STATUS_BAR + MENUITEM "Hide &toolbar", IDM_VID_HIDE_TOOLBAR MENUITEM SEPARATOR MENUITEM "&Show non-primary monitors", IDM_VID_MONITORS MENUITEM "&Janela redimensionável", IDM_VID_RESIZE @@ -101,11 +101,11 @@ BEGIN MENUITEM "Overscan de CGA/PCjr/Tandy/E&GA/(S)VGA", IDM_VID_OVERSCAN MENUITEM "Mudar &contraste para ecrã monocromático", IDM_VID_CGACON END - MENUITEM "&Media", IDM_MEDIA + MENUITEM "&Media", IDM_MEDIA POPUP "&Ferramentas" BEGIN MENUITEM "&Definições...", IDM_CONFIG - MENUITEM "&Atualizar ícones da barra de estado", IDM_UPDATE_ICONS + MENUITEM "&Atualizar ícones da barra de estado", IDM_UPDATE_ICONS MENUITEM SEPARATOR MENUITEM "Gravar imagem de ecrã\tCtrl+F11", IDM_ACTION_SCREENSHOT MENUITEM SEPARATOR @@ -137,17 +137,17 @@ CassetteSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Nova imagem...", IDM_CASSETTE_IMAGE_NEW + MENUITEM "&Nova imagem...", IDM_CASSETTE_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "Imagem &existente...", IDM_CASSETTE_IMAGE_EXISTING - MENUITEM "Imagem existente (&Proteção contra escrita)...", IDM_CASSETTE_IMAGE_EXISTING_WP + MENUITEM "Imagem &existente...", IDM_CASSETTE_IMAGE_EXISTING + MENUITEM "Imagem existente (&Proteção contra escrita)...", IDM_CASSETTE_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "&Gravar", IDM_CASSETTE_RECORD - MENUITEM "&Reproduzir", IDM_CASSETTE_PLAY - MENUITEM "Re&bobinar para o início", IDM_CASSETTE_REWIND - MENUITEM "&Avanço rápido para o fim", IDM_CASSETTE_FAST_FORWARD + MENUITEM "&Gravar", IDM_CASSETTE_RECORD + MENUITEM "&Reproduzir", IDM_CASSETTE_PLAY + MENUITEM "Re&bobinar para o início", IDM_CASSETTE_REWIND + MENUITEM "&Avanço rápido para o fim", IDM_CASSETTE_FAST_FORWARD MENUITEM SEPARATOR - MENUITEM "E&jetar", IDM_CASSETTE_EJECT + MENUITEM "E&jetar", IDM_CASSETTE_EJECT END END @@ -155,9 +155,9 @@ CartridgeSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Imagem...", IDM_CARTRIDGE_IMAGE + MENUITEM "&Imagem...", IDM_CARTRIDGE_IMAGE MENUITEM SEPARATOR - MENUITEM "E&jetar", IDM_CARTRIDGE_EJECT + MENUITEM "E&jetar", IDM_CARTRIDGE_EJECT END END @@ -165,14 +165,14 @@ FloppySubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Nova imagem...", IDM_FLOPPY_IMAGE_NEW + MENUITEM "&Nova imagem...", IDM_FLOPPY_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "Imagem &existente...", IDM_FLOPPY_IMAGE_EXISTING - MENUITEM "Imagem existente (&Proteção contra escrita)...", IDM_FLOPPY_IMAGE_EXISTING_WP + MENUITEM "Imagem &existente...", IDM_FLOPPY_IMAGE_EXISTING + MENUITEM "Imagem existente (&Proteção contra escrita)...", IDM_FLOPPY_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "E&xportar para 86F...", IDM_FLOPPY_EXPORT_TO_86F + MENUITEM "E&xportar para 86F...", IDM_FLOPPY_EXPORT_TO_86F MENUITEM SEPARATOR - MENUITEM "E&jetar", IDM_FLOPPY_EJECT + MENUITEM "E&jetar", IDM_FLOPPY_EJECT END END @@ -180,13 +180,13 @@ CdromSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Mute", IDM_CDROM_MUTE + MENUITEM "&Mute", IDM_CDROM_MUTE MENUITEM SEPARATOR - MENUITEM "&CDROM vazio", IDM_CDROM_EMPTY - MENUITEM "&Recarregar imagem anterior", IDM_CDROM_RELOAD + MENUITEM "&CDROM vazio", IDM_CDROM_EMPTY + MENUITEM "&Recarregar imagem anterior", IDM_CDROM_RELOAD MENUITEM SEPARATOR - MENUITEM "&Imagem...", IDM_CDROM_IMAGE - MENUITEM "&Pasta...", IDM_CDROM_DIR + MENUITEM "&Imagem...", IDM_CDROM_IMAGE + MENUITEM "&Pasta...", IDM_CDROM_DIR END END @@ -194,13 +194,13 @@ ZIPSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Nova imagem...", IDM_ZIP_IMAGE_NEW + MENUITEM "&Nova imagem...", IDM_ZIP_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "Imagem &existente...", IDM_ZIP_IMAGE_EXISTING - MENUITEM "Imagem existente (&Proteção contra escrita)...", IDM_ZIP_IMAGE_EXISTING_WP + MENUITEM "Imagem &existente...", IDM_ZIP_IMAGE_EXISTING + MENUITEM "Imagem existente (&Proteção contra escrita)...", IDM_ZIP_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "E&jetar", IDM_ZIP_EJECT - MENUITEM "&Recarregar imagem anterior", IDM_ZIP_RELOAD + MENUITEM "E&jetar", IDM_ZIP_EJECT + MENUITEM "&Recarregar imagem anterior", IDM_ZIP_RELOAD END END @@ -208,13 +208,13 @@ MOSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Nova imagem...", IDM_MO_IMAGE_NEW + MENUITEM "&Nova imagem...", IDM_MO_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "Imagem &existente...", IDM_MO_IMAGE_EXISTING - MENUITEM "Imagem existente (&Proteção contra escrita)...", IDM_MO_IMAGE_EXISTING_WP + MENUITEM "Imagem &existente...", IDM_MO_IMAGE_EXISTING + MENUITEM "Imagem existente (&Proteção contra escrita)...", IDM_MO_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "E&jetar", IDM_MO_EJECT - MENUITEM "&Recarregar imagem anterior", IDM_MO_RELOAD + MENUITEM "E&jetar", IDM_MO_EJECT + MENUITEM "&Recarregar imagem anterior", IDM_MO_RELOAD END END @@ -240,150 +240,150 @@ END // Dialog // -#define STR_PREFERENCES "Preferências" -#define STR_SND_GAIN "Ganho de som" -#define STR_NEW_FLOPPY "Nova imagem" -#define STR_CONFIG "Definições" -#define STR_SPECIFY_DIM "Especificar dimensões da janela principal" +#define STR_PREFERENCES "Preferências" +#define STR_SND_GAIN "Ganho de som" +#define STR_NEW_FLOPPY "Nova imagem" +#define STR_CONFIG "Definições" +#define STR_SPECIFY_DIM "Especificar dimensões da janela principal" -#define STR_OK "OK" -#define STR_CANCEL "Cancelar" -#define STR_GLOBAL "Guardar estas definições como padrões &globais" -#define STR_DEFAULT "&Padrão" -#define STR_LANGUAGE "Idioma:" -#define STR_ICONSET "Pacote de ícones:" +#define STR_OK "OK" +#define STR_CANCEL "Cancelar" +#define STR_GLOBAL "Guardar estas definições como padrões &globais" +#define STR_DEFAULT "&Padrão" +#define STR_LANGUAGE "Idioma:" +#define STR_ICONSET "Pacote de ícones:" -#define STR_GAIN "Ganho" +#define STR_GAIN "Ganho" -#define STR_FILE_NAME "Nome:" -#define STR_DISK_SIZE "Tamanho:" -#define STR_RPM_MODE "Modo RPM:" -#define STR_PROGRESS "Progresso:" +#define STR_FILE_NAME "Nome:" +#define STR_DISK_SIZE "Tamanho:" +#define STR_RPM_MODE "Modo RPM:" +#define STR_PROGRESS "Progresso:" -#define STR_WIDTH "Largura:" -#define STR_HEIGHT "Altura:" -#define STR_LOCK_TO_SIZE "Fixar neste tamanho" +#define STR_WIDTH "Largura:" +#define STR_HEIGHT "Altura:" +#define STR_LOCK_TO_SIZE "Fixar neste tamanho" -#define STR_MACHINE_TYPE "Tipo de máquina:" -#define STR_MACHINE "Máquina:" -#define STR_CONFIGURE "Configurar" -#define STR_CPU_TYPE "Tipo do CPU:" -#define STR_CPU_SPEED "Velocidade:" -#define STR_FPU "FPU:" -#define STR_WAIT_STATES "Estados de espera:" -#define STR_MB "MB" -#define STR_MEMORY "Memória:" -#define STR_TIME_SYNC "Sincronização da hora" -#define STR_DISABLED "Desativada" -#define STR_ENABLED_LOCAL "Ativada (hora local)" -#define STR_ENABLED_UTC "Ativada (UTC)" -#define STR_DYNAREC "Recompilador dinâmico" +#define STR_MACHINE_TYPE "Tipo de máquina:" +#define STR_MACHINE "Máquina:" +#define STR_CONFIGURE "Configurar" +#define STR_CPU_TYPE "Tipo do CPU:" +#define STR_CPU_SPEED "Velocidade:" +#define STR_FPU "FPU:" +#define STR_WAIT_STATES "Estados de espera:" +#define STR_MB "MB" +#define STR_MEMORY "Memória:" +#define STR_TIME_SYNC "Sincronização da hora" +#define STR_DISABLED "Desativada" +#define STR_ENABLED_LOCAL "Ativada (hora local)" +#define STR_ENABLED_UTC "Ativada (UTC)" +#define STR_DYNAREC "Recompilador dinâmico" -#define STR_VIDEO "Vídeo:" -#define STR_VIDEO_2 "Vídeo 2:" -#define STR_VOODOO "Gráficos Voodoo" -#define STR_IBM8514 "Gráficos IBM 8514/a" -#define STR_XGA "Gráficos XGA" +#define STR_VIDEO "Vídeo:" +#define STR_VIDEO_2 "Vídeo 2:" +#define STR_VOODOO "Gráficos Voodoo" +#define STR_IBM8514 "Gráficos IBM 8514/a" +#define STR_XGA "Gráficos XGA" -#define STR_MOUSE "Rato:" -#define STR_JOYSTICK "Joystick:" -#define STR_JOY1 "Joystick 1..." -#define STR_JOY2 "Joystick 2..." -#define STR_JOY3 "Joystick 3..." -#define STR_JOY4 "Joystick 4..." +#define STR_MOUSE "Rato:" +#define STR_JOYSTICK "Joystick:" +#define STR_JOY1 "Joystick 1..." +#define STR_JOY2 "Joystick 2..." +#define STR_JOY3 "Joystick 3..." +#define STR_JOY4 "Joystick 4..." -#define STR_SOUND1 "Placa de som 1:" -#define STR_SOUND2 "Placa de som 2:" -#define STR_SOUND3 "Placa de som 3:" -#define STR_SOUND4 "Placa de som 4:" -#define STR_MIDI_OUT "Disp. saída MIDI:" -#define STR_MIDI_IN "Disp. entrada MIDI:" -#define STR_MPU401 "MPU-401 autónomo" -#define STR_FLOAT "Utilizar som FLOAT32" -#define STR_FM_DRIVER "Controlador de sint. FM" -#define STR_FM_DRV_NUKED "Nuked (mais exacto)" -#define STR_FM_DRV_YMFM "YMFM (mais rápido)" +#define STR_SOUND1 "Placa de som 1:" +#define STR_SOUND2 "Placa de som 2:" +#define STR_SOUND3 "Placa de som 3:" +#define STR_SOUND4 "Placa de som 4:" +#define STR_MIDI_OUT "Disp. saída MIDI:" +#define STR_MIDI_IN "Disp. entrada MIDI:" +#define STR_MPU401 "MPU-401 autónomo" +#define STR_FLOAT "Utilizar som FLOAT32" +#define STR_FM_DRIVER "Controlador de sint. FM" +#define STR_FM_DRV_NUKED "Nuked (mais exacto)" +#define STR_FM_DRV_YMFM "YMFM (mais rápido)" -#define STR_NET_TYPE "Tipo de rede:" -#define STR_PCAP "Dispositivo PCap:" -#define STR_NET "Placa de rede:" -#define STR_NET1 "Network card 1:" -#define STR_NET2 "Network card 2:" -#define STR_NET3 "Network card 3:" -#define STR_NET4 "Network card 4:" +#define STR_NET_TYPE "Tipo de rede:" +#define STR_PCAP "Dispositivo PCap:" +#define STR_NET "Placa de rede:" +#define STR_NET1 "Network card 1:" +#define STR_NET2 "Network card 2:" +#define STR_NET3 "Network card 3:" +#define STR_NET4 "Network card 4:" -#define STR_COM1 "Dispositivo COM1:" -#define STR_COM2 "Dispositivo COM2:" -#define STR_COM3 "Dispositivo COM3:" -#define STR_COM4 "Dispositivo COM4:" -#define STR_LPT1 "Dispositivo LPT1:" -#define STR_LPT2 "Dispositivo LPT2:" -#define STR_LPT3 "Dispositivo LPT3:" -#define STR_LPT4 "Dispositivo LPT4:" -#define STR_SERIAL1 "Porta de série 1" -#define STR_SERIAL2 "Porta de série 2" -#define STR_SERIAL3 "Porta de série 3" -#define STR_SERIAL4 "Porta de série 4" -#define STR_PARALLEL1 "Porta paralela 1" -#define STR_PARALLEL2 "Porta paralela 2" -#define STR_PARALLEL3 "Porta paralela 3" -#define STR_PARALLEL4 "Porta paralela 4" -#define STR_SERIAL_PASS1 "Serial port passthrough 1" -#define STR_SERIAL_PASS2 "Serial port passthrough 2" -#define STR_SERIAL_PASS3 "Serial port passthrough 3" -#define STR_SERIAL_PASS4 "Serial port passthrough 4" +#define STR_COM1 "Dispositivo COM1:" +#define STR_COM2 "Dispositivo COM2:" +#define STR_COM3 "Dispositivo COM3:" +#define STR_COM4 "Dispositivo COM4:" +#define STR_LPT1 "Dispositivo LPT1:" +#define STR_LPT2 "Dispositivo LPT2:" +#define STR_LPT3 "Dispositivo LPT3:" +#define STR_LPT4 "Dispositivo LPT4:" +#define STR_SERIAL1 "Porta de série 1" +#define STR_SERIAL2 "Porta de série 2" +#define STR_SERIAL3 "Porta de série 3" +#define STR_SERIAL4 "Porta de série 4" +#define STR_PARALLEL1 "Porta paralela 1" +#define STR_PARALLEL2 "Porta paralela 2" +#define STR_PARALLEL3 "Porta paralela 3" +#define STR_PARALLEL4 "Porta paralela 4" +#define STR_SERIAL_PASS1 "Serial port passthrough 1" +#define STR_SERIAL_PASS2 "Serial port passthrough 2" +#define STR_SERIAL_PASS3 "Serial port passthrough 3" +#define STR_SERIAL_PASS4 "Serial port passthrough 4" -#define STR_HDC "Controlador HD:" -#define STR_FDC "Controlador FD:" -#define STR_IDE_TER "Controlador IDE terciário" -#define STR_IDE_QUA "Controlador IDE quaternário" -#define STR_SCSI "SCSI" -#define STR_SCSI_1 "Controlador 1:" -#define STR_SCSI_2 "Controlador 2:" -#define STR_SCSI_3 "Controlador 3:" -#define STR_SCSI_4 "Controlador 4:" -#define STR_CASSETTE "Cassete" +#define STR_HDC "Controlador HD:" +#define STR_FDC "Controlador FD:" +#define STR_IDE_TER "Controlador IDE terciário" +#define STR_IDE_QUA "Controlador IDE quaternário" +#define STR_SCSI "SCSI" +#define STR_SCSI_1 "Controlador 1:" +#define STR_SCSI_2 "Controlador 2:" +#define STR_SCSI_3 "Controlador 3:" +#define STR_SCSI_4 "Controlador 4:" +#define STR_CASSETTE "Cassete" -#define STR_HDD "Discos rígidos:" -#define STR_NEW "&Novo..." -#define STR_EXISTING "&Existente..." -#define STR_REMOVE "&Remover" -#define STR_BUS "Barram.:" -#define STR_CHANNEL "Canal:" -#define STR_ID "ID:" -#define STR_SPEED "Speed:" +#define STR_HDD "Discos rígidos:" +#define STR_NEW "&Novo..." +#define STR_EXISTING "&Existente..." +#define STR_REMOVE "&Remover" +#define STR_BUS "Barram.:" +#define STR_CHANNEL "Canal:" +#define STR_ID "ID:" +#define STR_SPEED "Speed:" -#define STR_SPECIFY "&Especificar..." -#define STR_SECTORS "Sectores:" -#define STR_HEADS "Cabeças:" -#define STR_CYLS "Cilindros:" -#define STR_SIZE_MB "Tamanho (MB):" -#define STR_TYPE "Tipo:" -#define STR_IMG_FORMAT "Formato de imagem:" -#define STR_BLOCK_SIZE "Tamanho de bloco:" +#define STR_SPECIFY "&Especificar..." +#define STR_SECTORS "Sectores:" +#define STR_HEADS "Cabeças:" +#define STR_CYLS "Cilindros:" +#define STR_SIZE_MB "Tamanho (MB):" +#define STR_TYPE "Tipo:" +#define STR_IMG_FORMAT "Formato de imagem:" +#define STR_BLOCK_SIZE "Tamanho de bloco:" -#define STR_FLOPPY_DRIVES "Unidades de disquete:" -#define STR_TURBO "Velocidade turbo" -#define STR_CHECKBPB "Verificar BPB" -#define STR_CDROM_DRIVES "Unidades CD-ROM:" -#define STR_CD_SPEED "Velocidade:" -#define STR_EARLY "Unidade anterior" +#define STR_FLOPPY_DRIVES "Unidades de disquete:" +#define STR_TURBO "Velocidade turbo" +#define STR_CHECKBPB "Verificar BPB" +#define STR_CDROM_DRIVES "Unidades CD-ROM:" +#define STR_CD_SPEED "Velocidade:" +#define STR_EARLY "Unidade anterior" -#define STR_MO_DRIVES "Unidades magneto-ópticas:" -#define STR_ZIP_DRIVES "Unidades ZIP:" -#define STR_250 "ZIP 250" +#define STR_MO_DRIVES "Unidades magneto-ópticas:" +#define STR_ZIP_DRIVES "Unidades ZIP:" +#define STR_250 "ZIP 250" -#define STR_ISARTC "ISA RTC:" -#define STR_ISAMEM "Expansão de memória ISA" -#define STR_ISAMEM_1 "Placa 1:" -#define STR_ISAMEM_2 "Placa 2:" -#define STR_ISAMEM_3 "Placa 3:" -#define STR_ISAMEM_4 "Placa 4:" -#define STR_BUGGER "Dispositivo ISABugger" -#define STR_POSTCARD "Placa POST" +#define STR_ISARTC "ISA RTC:" +#define STR_ISAMEM "Expansão de memória ISA" +#define STR_ISAMEM_1 "Placa 1:" +#define STR_ISAMEM_2 "Placa 2:" +#define STR_ISAMEM_3 "Placa 3:" +#define STR_ISAMEM_4 "Placa 4:" +#define STR_BUGGER "Dispositivo ISABugger" +#define STR_POSTCARD "Placa POST" -#define FONT_SIZE 9 -#define FONT_NAME "Segoe UI" +#define FONT_SIZE 9 +#define FONT_NAME "Segoe UI" #include "dialogs.rc" @@ -394,149 +394,149 @@ END STRINGTABLE DISCARDABLE BEGIN - 2048 "86Box" - IDS_2049 "Erro" - IDS_2050 "Erro fatal" - IDS_2051 " - PAUSED" - IDS_2052 "Pressione Ctrl+Alt+PgDn para voltar ao modo de janela." - IDS_2053 "Velocidade" - IDS_2054 "ZIP %03i %i (%s): %ls" - IDS_2055 "Imagens ZIP (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" - IDS_2056 "O 86Box não conseguiu encontrar nenhuma imagem ROM utilizável.\n\nPor favor, vá a href=""https://github.com/86Box/roms/releases/latest"">descarregue um pacote ROM e instale-o na pasta ""roms""." - IDS_2057 "(empty)" - IDS_2058 "Imagens ZIP (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0Todos os ficheiros (*.*)\0*.*\0" - IDS_2059 "Turbo" - IDS_2060 "Ativado" - IDS_2061 "Desativado" - IDS_2062 "Todas as imagens (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0Imagens básicas de sector (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Imagens de superfície (*.86F)\0*.86F\0" - IDS_2063 "A máquina ""%hs"" não está disponível devido à falta de ROMs na pasta roms/machines. A mudar para uma máquina disponível." + 2048 "86Box" + IDS_2049 "Erro" + IDS_2050 "Erro fatal" + IDS_2051 " - PAUSED" + IDS_2052 "Pressione Ctrl+Alt+PgDn para voltar ao modo de janela." + IDS_2053 "Velocidade" + IDS_2054 "ZIP %03i %i (%s): %ls" + IDS_2055 "Imagens ZIP (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" + IDS_2056 "O 86Box não conseguiu encontrar nenhuma imagem ROM utilizável.\n\nPor favor, vá a href=""https://github.com/86Box/roms/releases/latest"">descarregue um pacote ROM e instale-o na pasta ""roms""." + IDS_2057 "(empty)" + IDS_2058 "Imagens ZIP (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0Todos os ficheiros (*.*)\0*.*\0" + IDS_2059 "Turbo" + IDS_2060 "Ativado" + IDS_2061 "Desativado" + IDS_2062 "Todas as imagens (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0Imagens básicas de sector (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Imagens de superfície (*.86F)\0*.86F\0" + IDS_2063 "A máquina ""%hs"" não está disponível devido à falta de ROMs na pasta roms/machines. A mudar para uma máquina disponível." END STRINGTABLE DISCARDABLE BEGIN - IDS_2064 "A placa vídeo ""%hs"" não está disponível devido à falta de ROMs na pasta roms/video. A mudar para uma placa vídeo disponível." - IDS_2065 "Máquina" - IDS_2066 "Apresentação" - IDS_2067 "Dispositivos de entrada" - IDS_2068 "Som" - IDS_2069 "Rede" - IDS_2070 "Portas (COM e LPT)" - IDS_2071 "Dispositivos de armazenamento" - IDS_2072 "Discos rígidos" - IDS_2073 "Unidades de disquete e CD-ROM" - IDS_2074 "Outros dispostivos removíveis" - IDS_2075 "Outros dispositivos" - IDS_2076 "Imagens de superfície (*.86F)\0*.86F\0" - IDS_2077 "Clique para capturar o rato" - IDS_2078 "Pressione F8+F12 para soltar o rato" - IDS_2079 "Pressione F8+F12 ou tecla média para soltar o rato" + IDS_2064 "A placa vídeo ""%hs"" não está disponível devido à falta de ROMs na pasta roms/video. A mudar para uma placa vídeo disponível." + IDS_2065 "Máquina" + IDS_2066 "Apresentação" + IDS_2067 "Dispositivos de entrada" + IDS_2068 "Som" + IDS_2069 "Rede" + IDS_2070 "Portas (COM e LPT)" + IDS_2071 "Dispositivos de armazenamento" + IDS_2072 "Discos rígidos" + IDS_2073 "Unidades de disquete e CD-ROM" + IDS_2074 "Outros dispostivos removíveis" + IDS_2075 "Outros dispositivos" + IDS_2076 "Imagens de superfície (*.86F)\0*.86F\0" + IDS_2077 "Clique para capturar o rato" + IDS_2078 "Pressione F8+F12 para soltar o rato" + IDS_2079 "Pressione F8+F12 ou tecla média para soltar o rato" END STRINGTABLE DISCARDABLE BEGIN - IDS_2080 "Não foi possível inicializar o FluidSynth" - IDS_2081 "Barramento" - IDS_2082 "Ficheiro" - IDS_2083 "C" - IDS_2084 "C" - IDS_2085 "S" - IDS_2086 "MB" + IDS_2080 "Não foi possível inicializar o FluidSynth" + IDS_2081 "Barramento" + IDS_2082 "Ficheiro" + IDS_2083 "C" + IDS_2084 "C" + IDS_2085 "S" + IDS_2086 "MB" IDS_2087 "Speed" - IDS_2088 "Verificar BPB" - IDS_2089 "KB" - IDS_2090 "Não foi possível inicializar o renderizador vídeo." - IDS_2091 "Padrão" - IDS_2092 "%i estado(s) de espera" - IDS_2093 "Tipo" - IDS_2094 "Falha na configuração de PCap" - IDS_2095 "Não foi encontrado um dispositivo PCap" - IDS_2096 "Dispositivo PCap inválido" - IDS_2097 "Joystick(s) standard de 2 botões" - IDS_2098 "Joystick(s) standard de 4 botões" - IDS_2099 "Joystick(s) standard de 6 botões" - IDS_2100 "Joystick(s) standard de 8 botões" - IDS_2101 "CH Flightstick Pro" - IDS_2102 "Microsoft SideWinder Pad" - IDS_2103 "Thrustmaster Flight Control System" - IDS_2104 "Nenhum" - IDS_2105 "Não foi possível inicializar os aceleradores de teclado." - IDS_2106 "Não foi possível registar a entrada bruta." - IDS_2107 "%u" - IDS_2108 "%u MB (CCS: %i, %i, %i)" - IDS_2109 "Disquete %i (%s): %ls" - IDS_2110 "Todas as imagens (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Imagens avançadas de sector (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Imagens básicas de sector (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Imagens de fluxo (*.FDI)\0*.FDI\0Imagens de superfície (*.86F;*.MFM)\0*.86F;*.MFM\0Todos os ficheiros (*.*)\0*.*\0" - IDS_2111 "Não foi possível inicializar o FreeType" - IDS_2112 "Não foi possível inicializar o SDL. O ficheiro SDL2.dll é necessário!" - IDS_2113 "Tem a certeza de que quer um reinício completo da máquina emulada?" - IDS_2114 "Tem a certeza de que quer sair do 86Box?" - IDS_2115 "Não foi possível inicializar o Ghostscript" - IDS_2116 "Magneto-óptico %i (%ls): %ls" - IDS_2117 "Imagens magneto-ópticas (*.IM?;*.MDI)\0*.IM?;*.MDI\0Todas as imagens (*.*)\0*.*\0" - IDS_2118 "Bem-vindos ao 86Box!" - IDS_2119 "Controlador interno" - IDS_2120 "Sair" - IDS_2121 "Não foi encontrada nenhuma ROM" - IDS_2122 "Deseja guardar as definições?" - IDS_2123 "Isto irá causar um reinício completo da máquina emulada." - IDS_2124 "Guardar" - IDS_2125 "Acerca do 86Box" - IDS_2126 "86Box v" EMU_VERSION + IDS_2088 "Verificar BPB" + IDS_2089 "KB" + IDS_2090 "Não foi possível inicializar o renderizador vídeo." + IDS_2091 "Padrão" + IDS_2092 "%i estado(s) de espera" + IDS_2093 "Tipo" + IDS_2094 "Falha na configuração de PCap" + IDS_2095 "Não foi encontrado um dispositivo PCap" + IDS_2096 "Dispositivo PCap inválido" + IDS_2097 "Joystick(s) standard de 2 botões" + IDS_2098 "Joystick(s) standard de 4 botões" + IDS_2099 "Joystick(s) standard de 6 botões" + IDS_2100 "Joystick(s) standard de 8 botões" + IDS_2101 "CH Flightstick Pro" + IDS_2102 "Microsoft SideWinder Pad" + IDS_2103 "Thrustmaster Flight Control System" + IDS_2104 "Nenhum" + IDS_2105 "Não foi possível inicializar os aceleradores de teclado." + IDS_2106 "Não foi possível registar a entrada bruta." + IDS_2107 "%u" + IDS_2108 "%u MB (CCS: %i, %i, %i)" + IDS_2109 "Disquete %i (%s): %ls" + IDS_2110 "Todas as imagens (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Imagens avançadas de sector (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Imagens básicas de sector (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Imagens de fluxo (*.FDI)\0*.FDI\0Imagens de superfície (*.86F;*.MFM)\0*.86F;*.MFM\0Todos os ficheiros (*.*)\0*.*\0" + IDS_2111 "Não foi possível inicializar o FreeType" + IDS_2112 "Não foi possível inicializar o SDL. O ficheiro SDL2.dll é necessário!" + IDS_2113 "Tem a certeza de que quer um reinício completo da máquina emulada?" + IDS_2114 "Tem a certeza de que quer sair do 86Box?" + IDS_2115 "Não foi possível inicializar o Ghostscript" + IDS_2116 "Magneto-óptico %i (%ls): %ls" + IDS_2117 "Imagens magneto-ópticas (*.IM?;*.MDI)\0*.IM?;*.MDI\0Todas as imagens (*.*)\0*.*\0" + IDS_2118 "Bem-vindos ao 86Box!" + IDS_2119 "Controlador interno" + IDS_2120 "Sair" + IDS_2121 "Não foi encontrada nenhuma ROM" + IDS_2122 "Deseja guardar as definições?" + IDS_2123 "Isto irá causar um reinício completo da máquina emulada." + IDS_2124 "Guardar" + IDS_2125 "Acerca do 86Box" + IDS_2126 "86Box v" EMU_VERSION - IDS_2127 "Um emulador de computadores antigos\n\nAutores: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, Tiseno100, reenigne, leilei, JohnElliott, greatpsycho, and others.\n\nUsado sob a licença GNU General Public License versão 2 ou posterior. Veja o ficheiro LICENSE para mais informações." - IDS_2128 "OK" - IDS_2129 "Hardware não disponível" + IDS_2127 "Um emulador de computadores antigos\n\nAutores: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, Tiseno100, reenigne, leilei, JohnElliott, greatpsycho, and others.\n\nUsado sob a licença GNU General Public License versão 2 ou posterior. Veja o ficheiro LICENSE para mais informações." + IDS_2128 "OK" + IDS_2129 "Hardware não disponível" #ifdef _WIN32 #define LIB_NAME_PCAP "WinPcap" #else #define LIB_NAME_PCAP "libpcap" #endif - IDS_2130 "Certifique-se de que a biblioteca " LIB_NAME_PCAP " está instalada e de que está a utilizar uma ligação de rede compatível com a biblioteca " LIB_NAME_PCAP "." - IDS_2131 "Configuração inválida" + IDS_2130 "Certifique-se de que a biblioteca " LIB_NAME_PCAP " está instalada e de que está a utilizar uma ligação de rede compatível com a biblioteca " LIB_NAME_PCAP "." + IDS_2131 "Configuração inválida" #ifdef _WIN32 #define LIB_NAME_FREETYPE "freetype.dll" #else #define LIB_NAME_FREETYPE "libfreetype" #endif - IDS_2132 LIB_NAME_FREETYPE " é requerida para a emulação de impressora ESC/P." + IDS_2132 LIB_NAME_FREETYPE " é requerida para a emulação de impressora ESC/P." #ifdef _WIN32 #define LIB_NAME_GS "gsdll32.dll" #else #define LIB_NAME_GS "libgs" #endif - IDS_2133 LIB_NAME_GS " é requerido para a conversão automática de ficheiros PostScript para ficheiros PDF.\n\nQualquer documento enviado para a impressora PostScript genérica será gravado como um ficheiro PostScript (.ps)." + IDS_2133 LIB_NAME_GS " é requerido para a conversão automática de ficheiros PostScript para ficheiros PDF.\n\nQualquer documento enviado para a impressora PostScript genérica será gravado como um ficheiro PostScript (.ps)." #ifdef _WIN32 #define LIB_NAME_FLUIDSYNTH "libfluidsynth.dll" #else #define LIB_NAME_FLUIDSYNTH "libfluidsynth" #endif - IDS_2134 LIB_NAME_FLUIDSYNTH " é necessário para a saída MIDI FluidSynth MIDI." - IDS_2135 "A entrar no modo de ecrã cheio" - IDS_2136 "Não mostrar mais esta mensagem" - IDS_2137 "Não sair" - IDS_2138 "Reiniciar" - IDS_2139 "Não reiniciar" - IDS_2140 "Imagens magneto-ópticas (*.IM?;*.MDI)\0*.IM?;*.MDI\0Todos os ficheiros (*.*)\0*.*\0" - IDS_2141 "Imagens CD-ROM (*.ISO;*.CUE)\0*.ISO;*.CUE\0Todos os ficheiros (*.*)\0*.*\0" - IDS_2142 "Configuração de dispositivo %hs" + IDS_2134 LIB_NAME_FLUIDSYNTH " é necessário para a saída MIDI FluidSynth MIDI." + IDS_2135 "A entrar no modo de ecrã cheio" + IDS_2136 "Não mostrar mais esta mensagem" + IDS_2137 "Não sair" + IDS_2138 "Reiniciar" + IDS_2139 "Não reiniciar" + IDS_2140 "Imagens magneto-ópticas (*.IM?;*.MDI)\0*.IM?;*.MDI\0Todos os ficheiros (*.*)\0*.*\0" + IDS_2141 "Imagens CD-ROM (*.ISO;*.CUE)\0*.ISO;*.CUE\0Todos os ficheiros (*.*)\0*.*\0" + IDS_2142 "Configuração de dispositivo %hs" IDS_2143 "Ecrã em modo de sono" - IDS_2144 "Shaders OpenGL (*.GLSL)\0*.GLSL\0Todos os ficheiros (*.*)\0*.*\0" - IDS_2145 "Opções de OpenGL" - IDS_2146 "Está a carregar uma configuração sem suporte!" - IDS_2147 "A filtragem do tipo de CPU baseada na máquina escolhida está desativada para esta máquina emulada.\n\nIsto torna possível escolher um CPU que, de outra forma, não seria compatível com a máquina escolhida. No entanto, pode não ser compatível com a BIOS da máquina ou outros programas.\n\nA activação desta definição não tem suporte oficial e qualquer relatório de erros pode ser fechado como inválido." - IDS_2148 "Continuar" - IDS_2149 "Cassete: %s" - IDS_2150 "Imagens de cassete (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Todos os ficheiros (*.*)\0*.*\0" - IDS_2151 "Cartucho %i: %ls" - IDS_2152 "Imagens de cartucho (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Todos os ficheiros (*.*)\0*.*\0" - IDS_2153 "Erro na inicialização do renderizador" - IDS_2154 "Não foi possível inicializar o renderizador OpenGL (3.0 Core). Utilize outro renderizador." - IDS_2155 "Retomar execução" - IDS_2156 "Pausar execução" - IDS_2157 "Ctrl+Alt+Del" - IDS_2158 "Ctrl+Alt+Esc" - IDS_2159 "Reinicialização completa" - IDS_2160 "Encerramento ACPI" - IDS_2161 "Definições" + IDS_2144 "Shaders OpenGL (*.GLSL)\0*.GLSL\0Todos os ficheiros (*.*)\0*.*\0" + IDS_2145 "Opções de OpenGL" + IDS_2146 "Está a carregar uma configuração sem suporte!" + IDS_2147 "A filtragem do tipo de CPU baseada na máquina escolhida está desativada para esta máquina emulada.\n\nIsto torna possível escolher um CPU que, de outra forma, não seria compatível com a máquina escolhida. No entanto, pode não ser compatível com a BIOS da máquina ou outros programas.\n\nA activação desta definição não tem suporte oficial e qualquer relatório de erros pode ser fechado como inválido." + IDS_2148 "Continuar" + IDS_2149 "Cassete: %s" + IDS_2150 "Imagens de cassete (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Todos os ficheiros (*.*)\0*.*\0" + IDS_2151 "Cartucho %i: %ls" + IDS_2152 "Imagens de cartucho (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Todos os ficheiros (*.*)\0*.*\0" + IDS_2153 "Erro na inicialização do renderizador" + IDS_2154 "Não foi possível inicializar o renderizador OpenGL (3.0 Core). Utilize outro renderizador." + IDS_2155 "Retomar execução" + IDS_2156 "Pausar execução" + IDS_2157 "Ctrl+Alt+Del" + IDS_2158 "Ctrl+Alt+Esc" + IDS_2159 "Reinicialização completa" + IDS_2160 "Encerramento ACPI" + IDS_2161 "Definições" IDS_2162 "Unidade anterior" IDS_2163 "No Dynarec" IDS_2164 "Old Dynarec" @@ -547,45 +547,45 @@ END STRINGTABLE DISCARDABLE BEGIN IDS_4096 "Disco rígido (%s)" - IDS_4097 "%01i:%01i" - IDS_4098 "%01i" - IDS_4099 "Unidades CD-ROM com barramento MFM/RLL ou ESDI nunca existiram!" - IDS_4100 "Personalizado..." - IDS_4101 "Personalizado (grande)..." - IDS_4102 "Adicionar novo disco rígido" - IDS_4103 "Adicionar disco rígido existente" - IDS_4104 "As imagens de disco HDI não podem ter mais de 4 GB." - IDS_4105 "As imagens de disco não podem ter mais de 127 GB." - IDS_4106 "Imagens de disco rígido (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0Todos os ficheiros (*.*)\0*.*\0" - IDS_4107 "Não foi possível ler o ficheiro" - IDS_4108 "Não foi possível escrever o ficheiro" - IDS_4109 "Imagens HDI ou HDX com um tamanho de sector diferente de 512 não são suportadas." - IDS_4110 "O barramento USB ainda não tem suporte" - IDS_4111 "A imagem de disco já existe" - IDS_4112 "Por favor, especifique um nome de ficheiro válido." - IDS_4113 "Imagem de disco criada" - IDS_4114 "Certifique-se de que o ficheiro existe e é legível." - IDS_4115 "Certifique-se de que o ficheiro está a ser guardado numa pasta editável." - IDS_4116 "Imagem de disco muito grande" - IDS_4117 "Lembre-se de particionar e formatar o novo disco criado." - IDS_4118 "O ficheiro selecionado será sobrescrito. Tem a certeza de que quer utilizá-lo?" - IDS_4119 "Imagem de disco sem suporte" - IDS_4120 "Sobrescrever" - IDS_4121 "Não sobrescrever" - IDS_4122 "Imagem bruta (.img)" - IDS_4123 "Imagem HDI (.hdi)" - IDS_4124 "Imagem HDX (.hdx)" - IDS_4125 "VHD com tamanho fixo (.vhd)" - IDS_4126 "VHD com tamanho dinâmico (.vhd)" - IDS_4127 "VHD diferenciador (.vhd)" - IDS_4128 "Blocos grandes (2 MB)" - IDS_4129 "Blocos pequenos (512 KB)" - IDS_4130 "Ficheiros VHD (*.VHD)\0*.VHD\0Todos os ficheiros (*.*)\0*.*\0" - IDS_4131 "Seleccione o VHD pai" - IDS_4132 "Isto pode significar que a imagem pai foi modificada depois da criação da imagem diferenciadora.\n\nTambém pode acontecer se os ficheiros da imagem foram movidos ou copiados ou por causa de um erro no programa que criou este disco.\n\nQuer corrigir os carimbos de data/hora?" - IDS_4133 "Os carimbos de data/hora dos discos pai e filho não correspondem!" - IDS_4134 "Não foi possível corrigir o carimbo de data/hora do VHD." - IDS_4135 "%01i:%02i" + IDS_4097 "%01i:%01i" + IDS_4098 "%01i" + IDS_4099 "Unidades CD-ROM com barramento MFM/RLL ou ESDI nunca existiram!" + IDS_4100 "Personalizado..." + IDS_4101 "Personalizado (grande)..." + IDS_4102 "Adicionar novo disco rígido" + IDS_4103 "Adicionar disco rígido existente" + IDS_4104 "As imagens de disco HDI não podem ter mais de 4 GB." + IDS_4105 "As imagens de disco não podem ter mais de 127 GB." + IDS_4106 "Imagens de disco rígido (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0Todos os ficheiros (*.*)\0*.*\0" + IDS_4107 "Não foi possível ler o ficheiro" + IDS_4108 "Não foi possível escrever o ficheiro" + IDS_4109 "Imagens HDI ou HDX com um tamanho de sector diferente de 512 não são suportadas." + IDS_4110 "O barramento USB ainda não tem suporte" + IDS_4111 "A imagem de disco já existe" + IDS_4112 "Por favor, especifique um nome de ficheiro válido." + IDS_4113 "Imagem de disco criada" + IDS_4114 "Certifique-se de que o ficheiro existe e é legível." + IDS_4115 "Certifique-se de que o ficheiro está a ser guardado numa pasta editável." + IDS_4116 "Imagem de disco muito grande" + IDS_4117 "Lembre-se de particionar e formatar o novo disco criado." + IDS_4118 "O ficheiro selecionado será sobrescrito. Tem a certeza de que quer utilizá-lo?" + IDS_4119 "Imagem de disco sem suporte" + IDS_4120 "Sobrescrever" + IDS_4121 "Não sobrescrever" + IDS_4122 "Imagem bruta (.img)" + IDS_4123 "Imagem HDI (.hdi)" + IDS_4124 "Imagem HDX (.hdx)" + IDS_4125 "VHD com tamanho fixo (.vhd)" + IDS_4126 "VHD com tamanho dinâmico (.vhd)" + IDS_4127 "VHD diferenciador (.vhd)" + IDS_4128 "Blocos grandes (2 MB)" + IDS_4129 "Blocos pequenos (512 KB)" + IDS_4130 "Ficheiros VHD (*.VHD)\0*.VHD\0Todos os ficheiros (*.*)\0*.*\0" + IDS_4131 "Seleccione o VHD pai" + IDS_4132 "Isto pode significar que a imagem pai foi modificada depois da criação da imagem diferenciadora.\n\nTambém pode acontecer se os ficheiros da imagem foram movidos ou copiados ou por causa de um erro no programa que criou este disco.\n\nQuer corrigir os carimbos de data/hora?" + IDS_4133 "Os carimbos de data/hora dos discos pai e filho não correspondem!" + IDS_4134 "Não foi possível corrigir o carimbo de data/hora do VHD." + IDS_4135 "%01i:%02i" IDS_4352 "MFM/RLL" IDS_4353 "XTA" @@ -594,56 +594,56 @@ BEGIN IDS_4356 "ATAPI" IDS_4357 "SCSI" - IDS_4608 "MFM/RLL (%01i:%01i)" - IDS_4609 "XTA (%01i:%01i)" - IDS_4610 "ESDI (%01i:%01i)" - IDS_4611 "IDE (%01i:%01i)" - IDS_4612 "ATAPI (%01i:%01i)" - IDS_4613 "SCSI (%01i:%02i)" + IDS_4608 "MFM/RLL (%01i:%01i)" + IDS_4609 "XTA (%01i:%01i)" + IDS_4610 "ESDI (%01i:%01i)" + IDS_4611 "IDE (%01i:%01i)" + IDS_4612 "ATAPI (%01i:%01i)" + IDS_4613 "SCSI (%01i:%02i)" - IDS_5120 "CD-ROM %i (%s): %s" + IDS_5120 "CD-ROM %i (%s): %s" - IDS_5376 "Desativado" - IDS_5381 "ATAPI" + IDS_5376 "Desativado" + IDS_5381 "ATAPI" IDS_5382 "SCSI" - IDS_5632 "Desativado" - IDS_5637 "ATAPI (%01i:%01i)" + IDS_5632 "Desativado" + IDS_5637 "ATAPI (%01i:%01i)" IDS_5638 "SCSI (%01i:%02i)" - IDS_5888 "160 kB" - IDS_5889 "180 kB" - IDS_5890 "320 kB" - IDS_5891 "360 kB" - IDS_5892 "640 kB" - IDS_5893 "720 kB" - IDS_5894 "1.2 MB" - IDS_5895 "1.25 MB" - IDS_5896 "1.44 MB" - IDS_5897 "DMF (cluster 1024)" - IDS_5898 "DMF (cluster 2048)" - IDS_5899 "2.88 MB" - IDS_5900 "ZIP 100" - IDS_5901 "ZIP 250" - IDS_5902 "3.5"" 128 MB (ISO 10090)" - IDS_5903 "3.5"" 230 MB (ISO 13963)" - IDS_5904 "3.5"" 540 MB (ISO 15498)" - IDS_5905 "3.5"" 640 MB (ISO 15498)" - IDS_5906 "3.5"" 1.3 GB (GigaMO)" - IDS_5907 "3.5"" 2.3 GB (GigaMO 2)" - IDS_5908 "5.25"" 600 MB" - IDS_5909 "5.25"" 650 MB" - IDS_5910 "5.25"" 1 GB" - IDS_5911 "5.25"" 1.3 GB" + IDS_5888 "160 kB" + IDS_5889 "180 kB" + IDS_5890 "320 kB" + IDS_5891 "360 kB" + IDS_5892 "640 kB" + IDS_5893 "720 kB" + IDS_5894 "1.2 MB" + IDS_5895 "1.25 MB" + IDS_5896 "1.44 MB" + IDS_5897 "DMF (cluster 1024)" + IDS_5898 "DMF (cluster 2048)" + IDS_5899 "2.88 MB" + IDS_5900 "ZIP 100" + IDS_5901 "ZIP 250" + IDS_5902 "3.5"" 128 MB (ISO 10090)" + IDS_5903 "3.5"" 230 MB (ISO 13963)" + IDS_5904 "3.5"" 540 MB (ISO 15498)" + IDS_5905 "3.5"" 640 MB (ISO 15498)" + IDS_5906 "3.5"" 1.3 GB (GigaMO)" + IDS_5907 "3.5"" 2.3 GB (GigaMO 2)" + IDS_5908 "5.25"" 600 MB" + IDS_5909 "5.25"" 650 MB" + IDS_5910 "5.25"" 1 GB" + IDS_5911 "5.25"" 1.3 GB" - IDS_6144 "RPM perfeito" - IDS_6145 "RPM 1% abaixo do RPM perfeito" - IDS_6146 "RPM 1.5% abaixo do RPM perfeito" - IDS_6147 "RPM 2% abaixo do RPM perfeito" + IDS_6144 "RPM perfeito" + IDS_6145 "RPM 1% abaixo do RPM perfeito" + IDS_6146 "RPM 1.5% abaixo do RPM perfeito" + IDS_6147 "RPM 2% abaixo do RPM perfeito" - IDS_7168 "(Padrão do sistema)" + IDS_7168 "(Padrão do sistema)" END -#define IDS_LANG_ENUS IDS_7168 +#define IDS_LANG_ENUS IDS_7168 // Portuguese (Portugal) resources ///////////////////////////////////////////////////////////////////////////// diff --git a/src/win/languages/ru-RU.rc b/src/win/languages/ru-RU.rc index 73b68c07b..f66923b57 100644 --- a/src/win/languages/ru-RU.rc +++ b/src/win/languages/ru-RU.rc @@ -17,13 +17,13 @@ MainMenu MENU DISCARDABLE BEGIN POPUP "&Действие" BEGIN - MENUITEM "&Клавиатура требует захвата", IDM_ACTION_KBD_REQ_CAPTURE - MENUITEM "&Правый CTRL - это левый ALT", IDM_ACTION_RCTRL_IS_LALT + MENUITEM "&Клавиатура требует захвата", IDM_ACTION_KBD_REQ_CAPTURE + MENUITEM "&Правый CTRL - это левый ALT", IDM_ACTION_RCTRL_IS_LALT MENUITEM SEPARATOR MENUITEM "&Холодная перезагрузка...", IDM_ACTION_HRESET MENUITEM "&Ctrl+Alt+Del\tCtrl+F12", IDM_ACTION_RESET_CAD MENUITEM SEPARATOR - MENUITEM "Ctrl+Alt+&Esc", IDM_ACTION_CTRL_ALT_ESC + MENUITEM "Ctrl+Alt+&Esc", IDM_ACTION_CTRL_ALT_ESC MENUITEM SEPARATOR MENUITEM "&Пауза", IDM_ACTION_PAUSE MENUITEM SEPARATOR @@ -31,8 +31,8 @@ BEGIN END POPUP "&Вид" BEGIN - MENUITEM "&Скрыть строку состояния", IDM_VID_HIDE_STATUS_BAR - MENUITEM "С&крыть панель инструментов", IDM_VID_HIDE_TOOLBAR + MENUITEM "&Скрыть строку состояния", IDM_VID_HIDE_STATUS_BAR + MENUITEM "С&крыть панель инструментов", IDM_VID_HIDE_TOOLBAR MENUITEM SEPARATOR MENUITEM "&Show non-primary monitors", IDM_VID_MONITORS MENUITEM "&Изменяемый размер окна", IDM_VID_RESIZE @@ -101,15 +101,15 @@ BEGIN MENUITEM "Вылеты развёртки CGA/PCjr/Tandy/E&GA/(S)VGA", IDM_VID_OVERSCAN MENUITEM "Изменить контрастность &монохромного дисплея", IDM_VID_CGACON END - MENUITEM "&Носители", IDM_MEDIA + MENUITEM "&Носители", IDM_MEDIA POPUP "&Инструменты" BEGIN MENUITEM "&Настройки машины...", IDM_CONFIG - MENUITEM "&Обновление значков строки состояния", IDM_UPDATE_ICONS + MENUITEM "&Обновление значков строки состояния", IDM_UPDATE_ICONS MENUITEM SEPARATOR MENUITEM "Сделать с&криншот\tCtrl+F11", IDM_ACTION_SCREENSHOT MENUITEM SEPARATOR - MENUITEM "&Параметры...", IDM_PREFERENCES + MENUITEM "&Параметры...", IDM_PREFERENCES #ifdef DISCORD MENUITEM "Включить интеграцию &Discord", IDM_DISCORD #endif @@ -137,17 +137,17 @@ CassetteSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Новый образ...", IDM_CASSETTE_IMAGE_NEW + MENUITEM "&Новый образ...", IDM_CASSETTE_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&Выбрать образ...", IDM_CASSETTE_IMAGE_EXISTING - MENUITEM "Выбрать образ (&Защита от записи)...", IDM_CASSETTE_IMAGE_EXISTING_WP + MENUITEM "&Выбрать образ...", IDM_CASSETTE_IMAGE_EXISTING + MENUITEM "Выбрать образ (&Защита от записи)...", IDM_CASSETTE_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "&Запись", IDM_CASSETTE_RECORD - MENUITEM "&Воспроизведение", IDM_CASSETTE_PLAY - MENUITEM "&Перемотка на начало", IDM_CASSETTE_REWIND - MENUITEM "&Перемотка в конец", IDM_CASSETTE_FAST_FORWARD + MENUITEM "&Запись", IDM_CASSETTE_RECORD + MENUITEM "&Воспроизведение", IDM_CASSETTE_PLAY + MENUITEM "&Перемотка на начало", IDM_CASSETTE_REWIND + MENUITEM "&Перемотка в конец", IDM_CASSETTE_FAST_FORWARD MENUITEM SEPARATOR - MENUITEM "И&звлечь", IDM_CASSETTE_EJECT + MENUITEM "И&звлечь", IDM_CASSETTE_EJECT END END @@ -155,9 +155,9 @@ CartridgeSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Образ...", IDM_CARTRIDGE_IMAGE + MENUITEM "&Образ...", IDM_CARTRIDGE_IMAGE MENUITEM SEPARATOR - MENUITEM "И&звлечь", IDM_CARTRIDGE_EJECT + MENUITEM "И&звлечь", IDM_CARTRIDGE_EJECT END END @@ -165,14 +165,14 @@ FloppySubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Новый образ...", IDM_FLOPPY_IMAGE_NEW + MENUITEM "&Новый образ...", IDM_FLOPPY_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&Выбрать образ...", IDM_FLOPPY_IMAGE_EXISTING - MENUITEM "Выбрать образ (&Защита от записи)...", IDM_FLOPPY_IMAGE_EXISTING_WP + MENUITEM "&Выбрать образ...", IDM_FLOPPY_IMAGE_EXISTING + MENUITEM "Выбрать образ (&Защита от записи)...", IDM_FLOPPY_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "Э&кспорт в 86F...", IDM_FLOPPY_EXPORT_TO_86F + MENUITEM "Э&кспорт в 86F...", IDM_FLOPPY_EXPORT_TO_86F MENUITEM SEPARATOR - MENUITEM "И&звлечь", IDM_FLOPPY_EJECT + MENUITEM "И&звлечь", IDM_FLOPPY_EJECT END END @@ -180,13 +180,13 @@ CdromSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "О&тключить звук", IDM_CDROM_MUTE + MENUITEM "О&тключить звук", IDM_CDROM_MUTE MENUITEM SEPARATOR - MENUITEM "П&устой", IDM_CDROM_EMPTY - MENUITEM "&Снова загрузить предыдущий образ", IDM_CDROM_RELOAD + MENUITEM "П&устой", IDM_CDROM_EMPTY + MENUITEM "&Снова загрузить предыдущий образ", IDM_CDROM_RELOAD MENUITEM SEPARATOR - MENUITEM "&Образ...", IDM_CDROM_IMAGE - MENUITEM "&Папка...", IDM_CDROM_DIR + MENUITEM "&Образ...", IDM_CDROM_IMAGE + MENUITEM "&Папка...", IDM_CDROM_DIR END END @@ -194,13 +194,13 @@ ZIPSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Новый образ...", IDM_ZIP_IMAGE_NEW + MENUITEM "&Новый образ...", IDM_ZIP_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&Выбрать образ...", IDM_ZIP_IMAGE_EXISTING - MENUITEM "Выбрать образ (&Защита от записи)...", IDM_ZIP_IMAGE_EXISTING_WP + MENUITEM "&Выбрать образ...", IDM_ZIP_IMAGE_EXISTING + MENUITEM "Выбрать образ (&Защита от записи)...", IDM_ZIP_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "И&звлечь", IDM_ZIP_EJECT - MENUITEM "&Снова загрузить предыдущий образ", IDM_ZIP_RELOAD + MENUITEM "И&звлечь", IDM_ZIP_EJECT + MENUITEM "&Снова загрузить предыдущий образ", IDM_ZIP_RELOAD END END @@ -208,13 +208,13 @@ MOSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Новый образ...", IDM_MO_IMAGE_NEW + MENUITEM "&Новый образ...", IDM_MO_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&Выбрать образ...", IDM_MO_IMAGE_EXISTING - MENUITEM "Выбрать образ (&Защита от записи)...", IDM_MO_IMAGE_EXISTING_WP + MENUITEM "&Выбрать образ...", IDM_MO_IMAGE_EXISTING + MENUITEM "Выбрать образ (&Защита от записи)...", IDM_MO_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "И&звлечь", IDM_MO_EJECT - MENUITEM "&Снова загрузить предыдущий образ", IDM_MO_RELOAD + MENUITEM "И&звлечь", IDM_MO_EJECT + MENUITEM "&Снова загрузить предыдущий образ", IDM_MO_RELOAD END END @@ -240,150 +240,150 @@ END // Dialog // -#define STR_PREFERENCES "Параметры" -#define STR_SND_GAIN "Усиление звука" -#define STR_NEW_FLOPPY "Новый образ" -#define STR_CONFIG "Настройки" -#define STR_SPECIFY_DIM "Указать размеры главного окна" +#define STR_PREFERENCES "Параметры" +#define STR_SND_GAIN "Усиление звука" +#define STR_NEW_FLOPPY "Новый образ" +#define STR_CONFIG "Настройки" +#define STR_SPECIFY_DIM "Указать размеры главного окна" -#define STR_OK "OK" -#define STR_CANCEL "Отмена" -#define STR_GLOBAL "Сохранить эти параметры как &глобальные по умолчанию" -#define STR_DEFAULT "&По умолчанию" -#define STR_LANGUAGE "Язык:" -#define STR_ICONSET "Набор иконок:" +#define STR_OK "OK" +#define STR_CANCEL "Отмена" +#define STR_GLOBAL "Сохранить эти параметры как &глобальные по умолчанию" +#define STR_DEFAULT "&По умолчанию" +#define STR_LANGUAGE "Язык:" +#define STR_ICONSET "Набор иконок:" -#define STR_GAIN "Усиление" +#define STR_GAIN "Усиление" -#define STR_FILE_NAME "Имя файла:" -#define STR_DISK_SIZE "Размер диска:" -#define STR_RPM_MODE "RPM режим:" -#define STR_PROGRESS "Прогресс:" +#define STR_FILE_NAME "Имя файла:" +#define STR_DISK_SIZE "Размер диска:" +#define STR_RPM_MODE "RPM режим:" +#define STR_PROGRESS "Прогресс:" -#define STR_WIDTH "Ширина:" -#define STR_HEIGHT "Высота:" -#define STR_LOCK_TO_SIZE "Зафиксировать размер" +#define STR_WIDTH "Ширина:" +#define STR_HEIGHT "Высота:" +#define STR_LOCK_TO_SIZE "Зафиксировать размер" -#define STR_MACHINE_TYPE "Тип машины:" -#define STR_MACHINE "Системная плата:" -#define STR_CONFIGURE "Настройка" -#define STR_CPU_TYPE "Тип ЦП:" -#define STR_CPU_SPEED "Скорость:" -#define STR_FPU "FPU:" -#define STR_WAIT_STATES "Циклы ожидания:" -#define STR_MB "МБ" -#define STR_MEMORY "Память:" -#define STR_TIME_SYNC "Синхронизация времени" -#define STR_DISABLED "Отключить" -#define STR_ENABLED_LOCAL "Включить (местное)" -#define STR_ENABLED_UTC "Включить (UTC)" -#define STR_DYNAREC "Динамический рекомпилятор" +#define STR_MACHINE_TYPE "Тип машины:" +#define STR_MACHINE "Системная плата:" +#define STR_CONFIGURE "Настройка" +#define STR_CPU_TYPE "Тип ЦП:" +#define STR_CPU_SPEED "Скорость:" +#define STR_FPU "FPU:" +#define STR_WAIT_STATES "Циклы ожидания:" +#define STR_MB "МБ" +#define STR_MEMORY "Память:" +#define STR_TIME_SYNC "Синхронизация времени" +#define STR_DISABLED "Отключить" +#define STR_ENABLED_LOCAL "Включить (местное)" +#define STR_ENABLED_UTC "Включить (UTC)" +#define STR_DYNAREC "Динамический рекомпилятор" -#define STR_VIDEO "Видеокарта:" -#define STR_VIDEO_2 "Видеокарта 2:" -#define STR_VOODOO "Ускоритель Voodoo" -#define STR_IBM8514 "Ускоритель IBM 8514/a" -#define STR_XGA "Ускоритель XGA" +#define STR_VIDEO "Видеокарта:" +#define STR_VIDEO_2 "Видеокарта 2:" +#define STR_VOODOO "Ускоритель Voodoo" +#define STR_IBM8514 "Ускоритель IBM 8514/a" +#define STR_XGA "Ускоритель XGA" -#define STR_MOUSE "Мышь:" -#define STR_JOYSTICK "Джойстик:" -#define STR_JOY1 "Джойстик 1..." -#define STR_JOY2 "Джойстик 2..." -#define STR_JOY3 "Джойстик 3..." -#define STR_JOY4 "Джойстик 4..." +#define STR_MOUSE "Мышь:" +#define STR_JOYSTICK "Джойстик:" +#define STR_JOY1 "Джойстик 1..." +#define STR_JOY2 "Джойстик 2..." +#define STR_JOY3 "Джойстик 3..." +#define STR_JOY4 "Джойстик 4..." -#define STR_SOUND1 "Звуковая карта 1:" -#define STR_SOUND2 "Звуковая карта 2:" -#define STR_SOUND3 "Звуковая карта 3:" -#define STR_SOUND4 "Звуковая карта 4:" -#define STR_MIDI_OUT "MIDI Out устр-во:" -#define STR_MIDI_IN "MIDI In устр-во:" -#define STR_MPU401 "Отдельный MPU-401" -#define STR_FLOAT "FLOAT32 звук" -#define STR_FM_DRIVER "Драйвер FM-синтезатора" -#define STR_FM_DRV_NUKED "Nuked (более точный)" -#define STR_FM_DRV_YMFM "YMFM (быстрей)" +#define STR_SOUND1 "Звуковая карта 1:" +#define STR_SOUND2 "Звуковая карта 2:" +#define STR_SOUND3 "Звуковая карта 3:" +#define STR_SOUND4 "Звуковая карта 4:" +#define STR_MIDI_OUT "MIDI Out устр-во:" +#define STR_MIDI_IN "MIDI In устр-во:" +#define STR_MPU401 "Отдельный MPU-401" +#define STR_FLOAT "FLOAT32 звук" +#define STR_FM_DRIVER "Драйвер FM-синтезатора" +#define STR_FM_DRV_NUKED "Nuked (более точный)" +#define STR_FM_DRV_YMFM "YMFM (быстрей)" -#define STR_NET_TYPE "Тип сети:" -#define STR_PCAP "Устройство PCap:" -#define STR_NET "Сетевая карта:" -#define STR_NET1 "Network card 1:" -#define STR_NET2 "Network card 2:" -#define STR_NET3 "Network card 3:" -#define STR_NET4 "Network card 4:" +#define STR_NET_TYPE "Тип сети:" +#define STR_PCAP "Устройство PCap:" +#define STR_NET "Сетевая карта:" +#define STR_NET1 "Network card 1:" +#define STR_NET2 "Network card 2:" +#define STR_NET3 "Network card 3:" +#define STR_NET4 "Network card 4:" -#define STR_COM1 "Устройство COM1:" -#define STR_COM2 "Устройство COM2:" -#define STR_COM3 "Устройство COM3:" -#define STR_COM4 "Устройство COM4:" -#define STR_LPT1 "Устройство LPT1:" -#define STR_LPT2 "Устройство LPT2:" -#define STR_LPT3 "Устройство LPT3:" -#define STR_LPT4 "Устройство LPT4:" -#define STR_SERIAL1 "Последов. порт COM1" -#define STR_SERIAL2 "Последов. порт COM2" -#define STR_SERIAL3 "Последов. порт COM3" -#define STR_SERIAL4 "Последов. порт COM4" -#define STR_PARALLEL1 "Параллельный порт LPT1" -#define STR_PARALLEL2 "Параллельный порт LPT2" -#define STR_PARALLEL3 "Параллельный порт LPT3" -#define STR_PARALLEL4 "Параллельный порт LPT4" -#define STR_SERIAL_PASS1 "Serial port passthrough 1" -#define STR_SERIAL_PASS2 "Serial port passthrough 2" -#define STR_SERIAL_PASS3 "Serial port passthrough 3" -#define STR_SERIAL_PASS4 "Serial port passthrough 4" +#define STR_COM1 "Устройство COM1:" +#define STR_COM2 "Устройство COM2:" +#define STR_COM3 "Устройство COM3:" +#define STR_COM4 "Устройство COM4:" +#define STR_LPT1 "Устройство LPT1:" +#define STR_LPT2 "Устройство LPT2:" +#define STR_LPT3 "Устройство LPT3:" +#define STR_LPT4 "Устройство LPT4:" +#define STR_SERIAL1 "Последов. порт COM1" +#define STR_SERIAL2 "Последов. порт COM2" +#define STR_SERIAL3 "Последов. порт COM3" +#define STR_SERIAL4 "Последов. порт COM4" +#define STR_PARALLEL1 "Параллельный порт LPT1" +#define STR_PARALLEL2 "Параллельный порт LPT2" +#define STR_PARALLEL3 "Параллельный порт LPT3" +#define STR_PARALLEL4 "Параллельный порт LPT4" +#define STR_SERIAL_PASS1 "Serial port passthrough 1" +#define STR_SERIAL_PASS2 "Serial port passthrough 2" +#define STR_SERIAL_PASS3 "Serial port passthrough 3" +#define STR_SERIAL_PASS4 "Serial port passthrough 4" -#define STR_HDC "Контроллер HD:" -#define STR_FDC "Контроллер FD:" -#define STR_IDE_TER "Третичный IDE контроллер" -#define STR_IDE_QUA "Четвертичный IDE контроллер" -#define STR_SCSI "SCSI" -#define STR_SCSI_1 "Контроллер 1:" -#define STR_SCSI_2 "Контроллер 2:" -#define STR_SCSI_3 "Контроллер 3:" -#define STR_SCSI_4 "Контроллер 4:" -#define STR_CASSETTE "Кассета" +#define STR_HDC "Контроллер HD:" +#define STR_FDC "Контроллер FD:" +#define STR_IDE_TER "Третичный IDE контроллер" +#define STR_IDE_QUA "Четвертичный IDE контроллер" +#define STR_SCSI "SCSI" +#define STR_SCSI_1 "Контроллер 1:" +#define STR_SCSI_2 "Контроллер 2:" +#define STR_SCSI_3 "Контроллер 3:" +#define STR_SCSI_4 "Контроллер 4:" +#define STR_CASSETTE "Кассета" -#define STR_HDD "Жёсткие диски:" -#define STR_NEW "&Создать..." -#define STR_EXISTING "&Выбрать..." -#define STR_REMOVE "&Убрать" -#define STR_BUS "Шина:" -#define STR_CHANNEL "Канал:" -#define STR_ID "ID:" -#define STR_SPEED "Speed:" +#define STR_HDD "Жёсткие диски:" +#define STR_NEW "&Создать..." +#define STR_EXISTING "&Выбрать..." +#define STR_REMOVE "&Убрать" +#define STR_BUS "Шина:" +#define STR_CHANNEL "Канал:" +#define STR_ID "ID:" +#define STR_SPEED "Speed:" -#define STR_SPECIFY "&Указать..." -#define STR_SECTORS "Сектора:" -#define STR_HEADS "Головки:" -#define STR_CYLS "Цилиндры:" -#define STR_SIZE_MB "Размер (МБ):" -#define STR_TYPE "Тип:" -#define STR_IMG_FORMAT "Тип образа:" -#define STR_BLOCK_SIZE "Размер блока:" +#define STR_SPECIFY "&Указать..." +#define STR_SECTORS "Сектора:" +#define STR_HEADS "Головки:" +#define STR_CYLS "Цилиндры:" +#define STR_SIZE_MB "Размер (МБ):" +#define STR_TYPE "Тип:" +#define STR_IMG_FORMAT "Тип образа:" +#define STR_BLOCK_SIZE "Размер блока:" -#define STR_FLOPPY_DRIVES "Гибкие диски:" -#define STR_TURBO "Турбо тайминги" -#define STR_CHECKBPB "Проверять BPB" -#define STR_CDROM_DRIVES "Дисководы CD-ROM:" -#define STR_CD_SPEED "Скорость:" -#define STR_EARLY "Предыдущий дисковод" +#define STR_FLOPPY_DRIVES "Гибкие диски:" +#define STR_TURBO "Турбо тайминги" +#define STR_CHECKBPB "Проверять BPB" +#define STR_CDROM_DRIVES "Дисководы CD-ROM:" +#define STR_CD_SPEED "Скорость:" +#define STR_EARLY "Предыдущий дисковод" -#define STR_MO_DRIVES "Магнитооптические дисководы:" -#define STR_ZIP_DRIVES "ZIP дисководы:" -#define STR_250 "ZIP 250" +#define STR_MO_DRIVES "Магнитооптические дисководы:" +#define STR_ZIP_DRIVES "ZIP дисководы:" +#define STR_250 "ZIP 250" -#define STR_ISARTC "ISA RTC:" -#define STR_ISAMEM "Карта расширения памяти (ISA)" -#define STR_ISAMEM_1 "Карта 1:" -#define STR_ISAMEM_2 "Карта 2:" -#define STR_ISAMEM_3 "Карта 3:" -#define STR_ISAMEM_4 "Карта 4:" -#define STR_BUGGER "Устройство ISABugger" -#define STR_POSTCARD "Карта POST" +#define STR_ISARTC "ISA RTC:" +#define STR_ISAMEM "Карта расширения памяти (ISA)" +#define STR_ISAMEM_1 "Карта 1:" +#define STR_ISAMEM_2 "Карта 2:" +#define STR_ISAMEM_3 "Карта 3:" +#define STR_ISAMEM_4 "Карта 4:" +#define STR_BUGGER "Устройство ISABugger" +#define STR_POSTCARD "Карта POST" -#define FONT_SIZE 9 -#define FONT_NAME "Segoe UI" +#define FONT_SIZE 9 +#define FONT_NAME "Segoe UI" #include "dialogs.rc" @@ -394,149 +394,149 @@ END STRINGTABLE DISCARDABLE BEGIN - 2048 "86Box" - IDS_2049 "Ошибка" - IDS_2050 "Неустранимая ошибка" - IDS_2051 " - ПАУЗА" - IDS_2052 "Нажмите Ctrl+Alt+PgDn для возврата в оконный режим." - IDS_2053 "Скорость" - IDS_2054 "ZIP %03i %i (%s): %ls" - IDS_2055 "Образы ZIP (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" - IDS_2056 "86Box не смог найти ни одного подходящего для использования файла с ПЗУ.\n\nПожалуйста скачайте набор ПЗУ и извлеките его в каталог ""roms""." - IDS_2057 "(пусто)" - IDS_2058 "Образы ZIP (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0Все файлы (*.*)\0*.*\0" - IDS_2059 "Турбо" - IDS_2060 "Вкл" - IDS_2061 "Выкл" - IDS_2062 "Все образы (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0Простые посекторные образы (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Surface образы (*.86F)\0*.86F\0" - IDS_2063 "Системная плата ""%hs"" недоступна из-за отсутствия файла её ПЗУ в каталоге roms/machines. Переключение на доступную системную плату." + 2048 "86Box" + IDS_2049 "Ошибка" + IDS_2050 "Неустранимая ошибка" + IDS_2051 " - ПАУЗА" + IDS_2052 "Нажмите Ctrl+Alt+PgDn для возврата в оконный режим." + IDS_2053 "Скорость" + IDS_2054 "ZIP %03i %i (%s): %ls" + IDS_2055 "Образы ZIP (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" + IDS_2056 "86Box не смог найти ни одного подходящего для использования файла с ПЗУ.\n\nПожалуйста скачайте набор ПЗУ и извлеките его в каталог ""roms""." + IDS_2057 "(пусто)" + IDS_2058 "Образы ZIP (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0Все файлы (*.*)\0*.*\0" + IDS_2059 "Турбо" + IDS_2060 "Вкл" + IDS_2061 "Выкл" + IDS_2062 "Все образы (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0Простые посекторные образы (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Surface образы (*.86F)\0*.86F\0" + IDS_2063 "Системная плата ""%hs"" недоступна из-за отсутствия файла её ПЗУ в каталоге roms/machines. Переключение на доступную системную плату." END STRINGTABLE DISCARDABLE BEGIN - IDS_2064 "Видеокарта ""%hs"" недоступна из-за отсутствия файла её ПЗУ в каталоге roms/video. Переключение на доступную видеокарту." - IDS_2065 "Компьютер" - IDS_2066 "Дисплей" - IDS_2067 "Устройства ввода" - IDS_2068 "Звук" - IDS_2069 "Сеть" - IDS_2070 "Порты (COM и LPT)" - IDS_2071 "Контроллеры дисков" - IDS_2072 "Жёсткие диски" - IDS_2073 "Гибкие диски и CD-ROM" - IDS_2074 "Другие съёмные устр-ва" - IDS_2075 "Другая периферия" - IDS_2076 "Образы Surface (*.86F)\0*.86F\0" - IDS_2077 "Щёлкните мышью для захвата курсора" - IDS_2078 "Нажмите F8+F12 чтобы освободить курсор" - IDS_2079 "Нажмите F8+F12 или среднюю кнопку мыши чтобы освободить курсор" + IDS_2064 "Видеокарта ""%hs"" недоступна из-за отсутствия файла её ПЗУ в каталоге roms/video. Переключение на доступную видеокарту." + IDS_2065 "Компьютер" + IDS_2066 "Дисплей" + IDS_2067 "Устройства ввода" + IDS_2068 "Звук" + IDS_2069 "Сеть" + IDS_2070 "Порты (COM и LPT)" + IDS_2071 "Контроллеры дисков" + IDS_2072 "Жёсткие диски" + IDS_2073 "Гибкие диски и CD-ROM" + IDS_2074 "Другие съёмные устр-ва" + IDS_2075 "Другая периферия" + IDS_2076 "Образы Surface (*.86F)\0*.86F\0" + IDS_2077 "Щёлкните мышью для захвата курсора" + IDS_2078 "Нажмите F8+F12 чтобы освободить курсор" + IDS_2079 "Нажмите F8+F12 или среднюю кнопку мыши чтобы освободить курсор" END STRINGTABLE DISCARDABLE BEGIN - IDS_2080 "Невозможно инициализировать FluidSynth" - IDS_2081 "Шина" - IDS_2082 "Файл" - IDS_2083 "C" - IDS_2084 "H" - IDS_2085 "S" - IDS_2086 "МБ" + IDS_2080 "Невозможно инициализировать FluidSynth" + IDS_2081 "Шина" + IDS_2082 "Файл" + IDS_2083 "C" + IDS_2084 "H" + IDS_2085 "S" + IDS_2086 "МБ" IDS_2087 "Speed" - IDS_2088 "Проверять BPB" - IDS_2089 "КБ" - IDS_2090 "Не удалось инициализировать рендерер видео." - IDS_2091 "По умолчанию" - IDS_2092 "%i WS" - IDS_2093 "Тип" - IDS_2094 "Не удалось настроить PCap" - IDS_2095 "Устройства PCap не найдены" - IDS_2096 "Неверное устройство PCap" - IDS_2097 "Стандартный 2-кнопочный джойстик" - IDS_2098 "Стандартный 4-кнопочный джойстик" - IDS_2099 "Стандартный 6-кнопочный джойстик" - IDS_2100 "Стандартный 8-кнопочный джойстик" - IDS_2101 "CH Flightstick Pro" - IDS_2102 "Microsoft SideWinder Pad" - IDS_2103 "Система управления полетом Thrustmaster" - IDS_2104 "Нет" - IDS_2105 "Невозможно загрузить ускорители клавиатуры." - IDS_2106 "Невозможно зарегистрировать необработанный (RAW) ввод." - IDS_2107 "%u" - IDS_2108 "%u МБ (CHS: %i, %i, %i)" - IDS_2109 "Дисковод %i (%s): %ls" - IDS_2110 "Все образы (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Расширенные образы секторов (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Основные образы секторов (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Образы Flux (*.FDI)\0*.FDI\0Образы Surface (*.86F;*.MFM)\0*.86F;*.MFM\0Все файлы (*.*)\0*.*\0" - IDS_2111 "Невозможно инициализировать FreeType" - IDS_2112 "Невозможно инициализировать SDL, требуется SDL2.dll" - IDS_2113 "Вы уверены, что хотите выполнить холодную перезагрузку эмулируемой машины?" - IDS_2114 "Вы уверены, что хотите выйти из 86Box?" - IDS_2115 "Невозможно инициализировать Ghostscript" - IDS_2116 "Магнитооптический %i (%ls): %ls" - IDS_2117 "Образы магнитооптических дисков (*.IM?;*.MDI)\0*.IM?;*.MDI\0Все файлы (*.*)\0*.*\0" - IDS_2118 "Добро пожаловать в 86Box!" - IDS_2119 "Встроенный контроллер" - IDS_2120 "Выход" - IDS_2121 "ПЗУ не найдены" - IDS_2122 "Хотите ли вы сохранить настройки?" - IDS_2123 "Это приведет к холодной перезагрузке эмулируемой машины." - IDS_2124 "Сохранить" - IDS_2125 "О 86Box" - IDS_2126 "86Box v." EMU_VERSION + IDS_2088 "Проверять BPB" + IDS_2089 "КБ" + IDS_2090 "Не удалось инициализировать рендерер видео." + IDS_2091 "По умолчанию" + IDS_2092 "%i WS" + IDS_2093 "Тип" + IDS_2094 "Не удалось настроить PCap" + IDS_2095 "Устройства PCap не найдены" + IDS_2096 "Неверное устройство PCap" + IDS_2097 "Стандартный 2-кнопочный джойстик" + IDS_2098 "Стандартный 4-кнопочный джойстик" + IDS_2099 "Стандартный 6-кнопочный джойстик" + IDS_2100 "Стандартный 8-кнопочный джойстик" + IDS_2101 "CH Flightstick Pro" + IDS_2102 "Microsoft SideWinder Pad" + IDS_2103 "Система управления полетом Thrustmaster" + IDS_2104 "Нет" + IDS_2105 "Невозможно загрузить ускорители клавиатуры." + IDS_2106 "Невозможно зарегистрировать необработанный (RAW) ввод." + IDS_2107 "%u" + IDS_2108 "%u МБ (CHS: %i, %i, %i)" + IDS_2109 "Дисковод %i (%s): %ls" + IDS_2110 "Все образы (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Расширенные образы секторов (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Основные образы секторов (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Образы Flux (*.FDI)\0*.FDI\0Образы Surface (*.86F;*.MFM)\0*.86F;*.MFM\0Все файлы (*.*)\0*.*\0" + IDS_2111 "Невозможно инициализировать FreeType" + IDS_2112 "Невозможно инициализировать SDL, требуется SDL2.dll" + IDS_2113 "Вы уверены, что хотите выполнить холодную перезагрузку эмулируемой машины?" + IDS_2114 "Вы уверены, что хотите выйти из 86Box?" + IDS_2115 "Невозможно инициализировать Ghostscript" + IDS_2116 "Магнитооптический %i (%ls): %ls" + IDS_2117 "Образы магнитооптических дисков (*.IM?;*.MDI)\0*.IM?;*.MDI\0Все файлы (*.*)\0*.*\0" + IDS_2118 "Добро пожаловать в 86Box!" + IDS_2119 "Встроенный контроллер" + IDS_2120 "Выход" + IDS_2121 "ПЗУ не найдены" + IDS_2122 "Хотите ли вы сохранить настройки?" + IDS_2123 "Это приведет к холодной перезагрузке эмулируемой машины." + IDS_2124 "Сохранить" + IDS_2125 "О 86Box" + IDS_2126 "86Box v." EMU_VERSION - IDS_2127 "Эмулятор старых компьютеров\n\nАвторы: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, Tiseno100, reenigne, leilei, JohnElliott, greatpsycho, and others.\n\nВыпускается под лицензией GNU General Public License версии 2 или более поздней. Дополнительную информацию см. в файле LICENSE." - IDS_2128 "OK" - IDS_2129 "Оборудование недоступно" + IDS_2127 "Эмулятор старых компьютеров\n\nАвторы: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, Tiseno100, reenigne, leilei, JohnElliott, greatpsycho, and others.\n\nВыпускается под лицензией GNU General Public License версии 2 или более поздней. Дополнительную информацию см. в файле LICENSE." + IDS_2128 "OK" + IDS_2129 "Оборудование недоступно" #ifdef _WIN32 #define LIB_NAME_PCAP "WinPcap" #else #define LIB_NAME_PCAP "libpcap" #endif - IDS_2130 "Убедитесь, что " LIB_NAME_PCAP " установлен и ваше сетевое соединение, совместимо с " LIB_NAME_PCAP "." - IDS_2131 "Недопустимая конфигурация" + IDS_2130 "Убедитесь, что " LIB_NAME_PCAP " установлен и ваше сетевое соединение, совместимо с " LIB_NAME_PCAP "." + IDS_2131 "Недопустимая конфигурация" #ifdef _WIN32 #define LIB_NAME_FREETYPE "freetype.dll" #else #define LIB_NAME_FREETYPE "libfreetype" #endif - IDS_2132 "Для эмуляции принтера ESC/P требуется " LIB_NAME_FREETYPE "." + IDS_2132 "Для эмуляции принтера ESC/P требуется " LIB_NAME_FREETYPE "." #ifdef _WIN32 #define LIB_NAME_GS "gsdll32.dll" #else #define LIB_NAME_GS "libgs" #endif - IDS_2133 LIB_NAME_GS " требуется для автоматического преобразования файлов PostScript в PDF.\n\nВсе документы, отправленные на общий принтер PostScript, будут сохранены в виде файлов PostScript (.ps)." + IDS_2133 LIB_NAME_GS " требуется для автоматического преобразования файлов PostScript в PDF.\n\nВсе документы, отправленные на общий принтер PostScript, будут сохранены в виде файлов PostScript (.ps)." #ifdef _WIN32 #define LIB_NAME_FLUIDSYNTH "libfluidsynth.dll" #else #define LIB_NAME_FLUIDSYNTH "libfluidsynth" #endif - IDS_2134 "Для FluidSynth MIDI-вывода требуется " LIB_NAME_FLUIDSYNTH "." - IDS_2135 "Вход в полноэкранный режим" - IDS_2136 "Больше не показывать это сообщение" - IDS_2137 "Не выходить" - IDS_2138 "Перезагрузить" - IDS_2139 "Не перезагружать" - IDS_2140 "Образы магнитооптических дисков (*.IM?;*.MDI)\0*.IM?;*.MDI\0Все файлы (*.*)\0*.*\0" - IDS_2141 "Образы CD-ROM (*.ISO;*.CUE)\0*.ISO;*.CUE\0Все файлы (*.*)\0*.*\0" - IDS_2142 "Конфигурация устройства %hs" + IDS_2134 "Для FluidSynth MIDI-вывода требуется " LIB_NAME_FLUIDSYNTH "." + IDS_2135 "Вход в полноэкранный режим" + IDS_2136 "Больше не показывать это сообщение" + IDS_2137 "Не выходить" + IDS_2138 "Перезагрузить" + IDS_2139 "Не перезагружать" + IDS_2140 "Образы магнитооптических дисков (*.IM?;*.MDI)\0*.IM?;*.MDI\0Все файлы (*.*)\0*.*\0" + IDS_2141 "Образы CD-ROM (*.ISO;*.CUE)\0*.ISO;*.CUE\0Все файлы (*.*)\0*.*\0" + IDS_2142 "Конфигурация устройства %hs" IDS_2143 "Монитор в спящем режиме" - IDS_2144 "Шейдеры OpenGL (*.GLSL)\0*.GLSL\0Все файлы (*.*)\0*.*\0" - IDS_2145 "Параметры OpenGL" - IDS_2146 "Вы загружаете неподдерживаемую конфигурацию" - IDS_2147 "Выбор типов ЦП для этой системной платы на данной эмулируемой машине отключен.\n\nЭто позволяет выбрать процессор, который в противном случае несовместим с выбранной материнской платой. Однако, вы можете столкнуться с несовместимостью с BIOS материнской платы или другим ПО.\n\nВключение этого параметра официально не поддерживается, и все поданные отчеты об ошибках могут быть закрыты как недействительные." - IDS_2148 "Продолжить" - IDS_2149 "Кассета: %s" - IDS_2150 "Образы кассет (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Все файлы (*.*)\0*.*\0" - IDS_2151 "Картридж %i: %ls" - IDS_2152 "Образы картриджей (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Все файлы (*.*)\0*.*\0" - IDS_2153 "Ошибка инициализации рендерера" - IDS_2154 "Невозможно инициализировать рендерер OpenGL (3.0). Пожалуйста, используйте другой рендерер." - IDS_2155 "Возобновить выполнение" - IDS_2156 "Приостановить выполнение" - IDS_2157 "Нажать Ctrl+Alt+Del" - IDS_2158 "Нажать Ctrl+Alt+Esc" - IDS_2159 "Холодная перезагрузка" - IDS_2160 "Сигнал завершения ACPI" - IDS_2161 "Настройки машины" + IDS_2144 "Шейдеры OpenGL (*.GLSL)\0*.GLSL\0Все файлы (*.*)\0*.*\0" + IDS_2145 "Параметры OpenGL" + IDS_2146 "Вы загружаете неподдерживаемую конфигурацию" + IDS_2147 "Выбор типов ЦП для этой системной платы на данной эмулируемой машине отключен.\n\nЭто позволяет выбрать процессор, который в противном случае несовместим с выбранной материнской платой. Однако, вы можете столкнуться с несовместимостью с BIOS материнской платы или другим ПО.\n\nВключение этого параметра официально не поддерживается, и все поданные отчеты об ошибках могут быть закрыты как недействительные." + IDS_2148 "Продолжить" + IDS_2149 "Кассета: %s" + IDS_2150 "Образы кассет (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Все файлы (*.*)\0*.*\0" + IDS_2151 "Картридж %i: %ls" + IDS_2152 "Образы картриджей (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Все файлы (*.*)\0*.*\0" + IDS_2153 "Ошибка инициализации рендерера" + IDS_2154 "Невозможно инициализировать рендерер OpenGL (3.0). Пожалуйста, используйте другой рендерер." + IDS_2155 "Возобновить выполнение" + IDS_2156 "Приостановить выполнение" + IDS_2157 "Нажать Ctrl+Alt+Del" + IDS_2158 "Нажать Ctrl+Alt+Esc" + IDS_2159 "Холодная перезагрузка" + IDS_2160 "Сигнал завершения ACPI" + IDS_2161 "Настройки машины" IDS_2162 "Предыдущий дисковод" IDS_2163 "No Dynarec" IDS_2164 "Old Dynarec" @@ -547,45 +547,45 @@ END STRINGTABLE DISCARDABLE BEGIN IDS_4096 "Жёсткий диск (%s)" - IDS_4097 "%01i:%01i" - IDS_4098 "%01i" - IDS_4099 "MFM/RLL или ESDI дисководов CD-ROM никогда не существовало" - IDS_4100 "Задать вручную..." - IDS_4101 "Задать вручную (large)..." - IDS_4102 "Создать новый жёсткий диск" - IDS_4103 "Выбрать существующий жёсткий диск" - IDS_4104 "Размер образов дисков HDI не может превышать 4 ГБ." - IDS_4105 "Размер образов дисков не может превышать 127 ГБ." - IDS_4106 "Образы жёстких дисков (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0Все файлы (*.*)\0*.*\0" - IDS_4107 "Невозможно прочитать файл" - IDS_4108 "Невозможно записать файл" - IDS_4109 "Образы HDI или HDX с размером сектора, отличным от 512, не поддерживаются." - IDS_4110 "USB пока не поддерживается" - IDS_4111 "Файл образа диска уже существует" - IDS_4112 "Пожалуйста, укажите правильное имя файла." - IDS_4113 "Образ диска создан" - IDS_4114 "Убедитесь, что файл существует и доступен для чтения." - IDS_4115 "Убедитесь, что файл сохраняется в директории доступной для записи." - IDS_4116 "Слишком большой образ диска" - IDS_4117 "Не забудьте разметить и отформатировать вновь созданный диск." - IDS_4118 "Выбранный файл будет перезаписан. Вы уверены, что хотите использовать его?" - IDS_4119 "Неподдерживаемый образ диска" - IDS_4120 "Перезаписать" - IDS_4121 "Не перезаписывать" - IDS_4122 "RAW образ (.img)" - IDS_4123 "Образ HDI (.hdi)" - IDS_4124 "Образ HDX (.hdx)" - IDS_4125 "VHD фиксированного размера (.vhd)" - IDS_4126 "VHD динамического размера (.vhd)" - IDS_4127 "Дифференцированный образ VHD (.vhd)" - IDS_4128 "Большие блоки (2 МБ)" - IDS_4129 "Маленькие блоки (512 КБ)" - IDS_4130 "Файлы VHD (*.VHD)\0*.VHD\0Все файлы (*.*)\0*.*\0" - IDS_4131 "Выберите родительский VHD" - IDS_4132 "Это может означать, что родительский образ был изменён после того, как был создан дифференцированный образ.\n\nЭто также может произойти, если файлы образа были перемещены или скопированы, или из-за ошибки в программе, создавшей этот диск.\n\nВы хотите исправить временные метки?" - IDS_4133 "Временные метки родительского и дочернего дисков не совпадают" - IDS_4134 "Не удалось исправить временную метку VHD." - IDS_4135 "%01i:%02i" + IDS_4097 "%01i:%01i" + IDS_4098 "%01i" + IDS_4099 "MFM/RLL или ESDI дисководов CD-ROM никогда не существовало" + IDS_4100 "Задать вручную..." + IDS_4101 "Задать вручную (large)..." + IDS_4102 "Создать новый жёсткий диск" + IDS_4103 "Выбрать существующий жёсткий диск" + IDS_4104 "Размер образов дисков HDI не может превышать 4 ГБ." + IDS_4105 "Размер образов дисков не может превышать 127 ГБ." + IDS_4106 "Образы жёстких дисков (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0Все файлы (*.*)\0*.*\0" + IDS_4107 "Невозможно прочитать файл" + IDS_4108 "Невозможно записать файл" + IDS_4109 "Образы HDI или HDX с размером сектора, отличным от 512, не поддерживаются." + IDS_4110 "USB пока не поддерживается" + IDS_4111 "Файл образа диска уже существует" + IDS_4112 "Пожалуйста, укажите правильное имя файла." + IDS_4113 "Образ диска создан" + IDS_4114 "Убедитесь, что файл существует и доступен для чтения." + IDS_4115 "Убедитесь, что файл сохраняется в директории доступной для записи." + IDS_4116 "Слишком большой образ диска" + IDS_4117 "Не забудьте разметить и отформатировать вновь созданный диск." + IDS_4118 "Выбранный файл будет перезаписан. Вы уверены, что хотите использовать его?" + IDS_4119 "Неподдерживаемый образ диска" + IDS_4120 "Перезаписать" + IDS_4121 "Не перезаписывать" + IDS_4122 "RAW образ (.img)" + IDS_4123 "Образ HDI (.hdi)" + IDS_4124 "Образ HDX (.hdx)" + IDS_4125 "VHD фиксированного размера (.vhd)" + IDS_4126 "VHD динамического размера (.vhd)" + IDS_4127 "Дифференцированный образ VHD (.vhd)" + IDS_4128 "Большие блоки (2 МБ)" + IDS_4129 "Маленькие блоки (512 КБ)" + IDS_4130 "Файлы VHD (*.VHD)\0*.VHD\0Все файлы (*.*)\0*.*\0" + IDS_4131 "Выберите родительский VHD" + IDS_4132 "Это может означать, что родительский образ был изменён после того, как был создан дифференцированный образ.\n\nЭто также может произойти, если файлы образа были перемещены или скопированы, или из-за ошибки в программе, создавшей этот диск.\n\nВы хотите исправить временные метки?" + IDS_4133 "Временные метки родительского и дочернего дисков не совпадают" + IDS_4134 "Не удалось исправить временную метку VHD." + IDS_4135 "%01i:%02i" IDS_4352 "MFM/RLL" IDS_4353 "XTA" @@ -594,56 +594,56 @@ BEGIN IDS_4356 "ATAPI" IDS_4357 "SCSI" - IDS_4608 "MFM/RLL (%01i:%01i)" - IDS_4609 "XTA (%01i:%01i)" - IDS_4610 "ESDI (%01i:%01i)" - IDS_4611 "IDE (%01i:%01i)" - IDS_4612 "ATAPI (%01i:%01i)" - IDS_4613 "SCSI (%01i:%02i)" + IDS_4608 "MFM/RLL (%01i:%01i)" + IDS_4609 "XTA (%01i:%01i)" + IDS_4610 "ESDI (%01i:%01i)" + IDS_4611 "IDE (%01i:%01i)" + IDS_4612 "ATAPI (%01i:%01i)" + IDS_4613 "SCSI (%01i:%02i)" - IDS_5120 "CD-ROM %i (%s): %s" + IDS_5120 "CD-ROM %i (%s): %s" - IDS_5376 "Отключён" - IDS_5381 "ATAPI" + IDS_5376 "Отключён" + IDS_5381 "ATAPI" IDS_5382 "SCSI" - IDS_5632 "Отключён" - IDS_5637 "ATAPI (%01i:%01i)" + IDS_5632 "Отключён" + IDS_5637 "ATAPI (%01i:%01i)" IDS_5638 "SCSI (%01i:%02i)" - IDS_5888 "160 кБ" - IDS_5889 "180 кБ" - IDS_5890 "320 кБ" - IDS_5891 "360 кБ" - IDS_5892 "640 кБ" - IDS_5893 "720 кБ" - IDS_5894 "1.2 МБ" - IDS_5895 "1.25 МБ" - IDS_5896 "1.44 МБ" - IDS_5897 "DMF (кластер 1024)" - IDS_5898 "DMF (кластер 2048)" - IDS_5899 "2.88 МБ" - IDS_5900 "ZIP 100" - IDS_5901 "ZIP 250" - IDS_5902 "3.5"" 128 МБ (ISO 10090)" - IDS_5903 "3.5"" 230 МБ (ISO 13963)" - IDS_5904 "3.5"" 540 МБ (ISO 15498)" - IDS_5905 "3.5"" 640 МБ (ISO 15498)" - IDS_5906 "3.5"" 1.3 ГБ (GigaMO)" - IDS_5907 "3.5"" 2.3 ГБ (GigaMO 2)" - IDS_5908 "5.25"" 600 МБ" - IDS_5909 "5.25"" 650 МБ" - IDS_5910 "5.25"" 1 ГБ" - IDS_5911 "5.25"" 1.3 ГБ" + IDS_5888 "160 кБ" + IDS_5889 "180 кБ" + IDS_5890 "320 кБ" + IDS_5891 "360 кБ" + IDS_5892 "640 кБ" + IDS_5893 "720 кБ" + IDS_5894 "1.2 МБ" + IDS_5895 "1.25 МБ" + IDS_5896 "1.44 МБ" + IDS_5897 "DMF (кластер 1024)" + IDS_5898 "DMF (кластер 2048)" + IDS_5899 "2.88 МБ" + IDS_5900 "ZIP 100" + IDS_5901 "ZIP 250" + IDS_5902 "3.5"" 128 МБ (ISO 10090)" + IDS_5903 "3.5"" 230 МБ (ISO 13963)" + IDS_5904 "3.5"" 540 МБ (ISO 15498)" + IDS_5905 "3.5"" 640 МБ (ISO 15498)" + IDS_5906 "3.5"" 1.3 ГБ (GigaMO)" + IDS_5907 "3.5"" 2.3 ГБ (GigaMO 2)" + IDS_5908 "5.25"" 600 МБ" + IDS_5909 "5.25"" 650 МБ" + IDS_5910 "5.25"" 1 ГБ" + IDS_5911 "5.25"" 1.3 ГБ" - IDS_6144 "Точный RPM" - IDS_6145 "На 1% медленнее точного RPM" - IDS_6146 "На 1.5% медленнее точного RPM" - IDS_6147 "На 2% медленнее точного RPM" + IDS_6144 "Точный RPM" + IDS_6145 "На 1% медленнее точного RPM" + IDS_6146 "На 1.5% медленнее точного RPM" + IDS_6147 "На 2% медленнее точного RPM" - IDS_7168 "(Системный)" + IDS_7168 "(Системный)" END -#define IDS_LANG_ENUS IDS_7168 +#define IDS_LANG_ENUS IDS_7168 // Russian resources ///////////////////////////////////////////////////////////////////////////// diff --git a/src/win/languages/sl-SI.rc b/src/win/languages/sl-SI.rc index a1240713e..671d8191b 100644 --- a/src/win/languages/sl-SI.rc +++ b/src/win/languages/sl-SI.rc @@ -17,13 +17,13 @@ MainMenu MENU DISCARDABLE BEGIN POPUP "&Dejanja" BEGIN - MENUITEM "&Tipkovnica potrebuje zajem", IDM_ACTION_KBD_REQ_CAPTURE - MENUITEM "&Desni CTRL je levi ALT", IDM_ACTION_RCTRL_IS_LALT + MENUITEM "&Tipkovnica potrebuje zajem", IDM_ACTION_KBD_REQ_CAPTURE + MENUITEM "&Desni CTRL je levi ALT", IDM_ACTION_RCTRL_IS_LALT MENUITEM SEPARATOR MENUITEM "&Ponovni zagon...", IDM_ACTION_HRESET MENUITEM "&Ctrl+Alt+Del\tCtrl+F12", IDM_ACTION_RESET_CAD MENUITEM SEPARATOR - MENUITEM "Ctrl+Alt+&Esc", IDM_ACTION_CTRL_ALT_ESC + MENUITEM "Ctrl+Alt+&Esc", IDM_ACTION_CTRL_ALT_ESC MENUITEM SEPARATOR MENUITEM "&Premor", IDM_ACTION_PAUSE MENUITEM SEPARATOR @@ -31,8 +31,8 @@ BEGIN END POPUP "&Pogled" BEGIN - MENUITEM "&Skrij statusno vrstico", IDM_VID_HIDE_STATUS_BAR - MENUITEM "Hide &toolbar", IDM_VID_HIDE_TOOLBAR + MENUITEM "&Skrij statusno vrstico", IDM_VID_HIDE_STATUS_BAR + MENUITEM "Hide &toolbar", IDM_VID_HIDE_TOOLBAR MENUITEM SEPARATOR MENUITEM "&Show non-primary monitors", IDM_VID_MONITORS MENUITEM "S&premenljiva velikost okna", IDM_VID_RESIZE @@ -101,11 +101,11 @@ BEGIN MENUITEM "&Presežek slike CGA/PCjr/Tandy/EGA/(S)VGA", IDM_VID_OVERSCAN MENUITEM "&Spremeni contrast za črno-beli zaslon", IDM_VID_CGACON END - MENUITEM "&Mediji", IDM_MEDIA + MENUITEM "&Mediji", IDM_MEDIA POPUP "&Orodja" BEGIN MENUITEM "&Nastavitve...", IDM_CONFIG - MENUITEM "&Posodabljaj ikone statusne vrstice", IDM_UPDATE_ICONS + MENUITEM "&Posodabljaj ikone statusne vrstice", IDM_UPDATE_ICONS MENUITEM SEPARATOR MENUITEM "&Zajemi posnetek zaslona\tCtrl+F11", IDM_ACTION_SCREENSHOT MENUITEM SEPARATOR @@ -137,17 +137,17 @@ CassetteSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Nova slika...", IDM_CASSETTE_IMAGE_NEW + MENUITEM "&Nova slika...", IDM_CASSETTE_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&Obstoječa slika...", IDM_CASSETTE_IMAGE_EXISTING - MENUITEM "Obstoječa slika (&samo za branje)...", IDM_CASSETTE_IMAGE_EXISTING_WP + MENUITEM "&Obstoječa slika...", IDM_CASSETTE_IMAGE_EXISTING + MENUITEM "Obstoječa slika (&samo za branje)...", IDM_CASSETTE_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "Snemaj", IDM_CASSETTE_RECORD - MENUITEM "Predvajaj", IDM_CASSETTE_PLAY - MENUITEM "Previj na začetek", IDM_CASSETTE_REWIND - MENUITEM "Preskoči na konec", IDM_CASSETTE_FAST_FORWARD + MENUITEM "Snemaj", IDM_CASSETTE_RECORD + MENUITEM "Predvajaj", IDM_CASSETTE_PLAY + MENUITEM "Previj na začetek", IDM_CASSETTE_REWIND + MENUITEM "Preskoči na konec", IDM_CASSETTE_FAST_FORWARD MENUITEM SEPARATOR - MENUITEM "Izvrzi", IDM_CASSETTE_EJECT + MENUITEM "Izvrzi", IDM_CASSETTE_EJECT END END @@ -155,9 +155,9 @@ CartridgeSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "Slika...", IDM_CARTRIDGE_IMAGE + MENUITEM "Slika...", IDM_CARTRIDGE_IMAGE MENUITEM SEPARATOR - MENUITEM "Izvrzi", IDM_CARTRIDGE_EJECT + MENUITEM "Izvrzi", IDM_CARTRIDGE_EJECT END END @@ -165,14 +165,14 @@ FloppySubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Nova slika...", IDM_FLOPPY_IMAGE_NEW + MENUITEM "&Nova slika...", IDM_FLOPPY_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&Obstoječa slika...", IDM_FLOPPY_IMAGE_EXISTING - MENUITEM "Obstoječa slika (&samo za branje)...", IDM_FLOPPY_IMAGE_EXISTING_WP + MENUITEM "&Obstoječa slika...", IDM_FLOPPY_IMAGE_EXISTING + MENUITEM "Obstoječa slika (&samo za branje)...", IDM_FLOPPY_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "&Izvozi v 86F...", IDM_FLOPPY_EXPORT_TO_86F + MENUITEM "&Izvozi v 86F...", IDM_FLOPPY_EXPORT_TO_86F MENUITEM SEPARATOR - MENUITEM "I&zvrzi", IDM_FLOPPY_EJECT + MENUITEM "I&zvrzi", IDM_FLOPPY_EJECT END END @@ -180,13 +180,13 @@ CdromSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Utišaj", IDM_CDROM_MUTE + MENUITEM "&Utišaj", IDM_CDROM_MUTE MENUITEM SEPARATOR - MENUITEM "&Prazen", IDM_CDROM_EMPTY - MENUITEM "&Naloži zadnjo sliko", IDM_CDROM_RELOAD + MENUITEM "&Prazen", IDM_CDROM_EMPTY + MENUITEM "&Naloži zadnjo sliko", IDM_CDROM_RELOAD MENUITEM SEPARATOR - MENUITEM "&Slika...", IDM_CDROM_IMAGE - MENUITEM "&Mapa...", IDM_CDROM_DIR + MENUITEM "&Slika...", IDM_CDROM_IMAGE + MENUITEM "&Mapa...", IDM_CDROM_DIR END END @@ -194,13 +194,13 @@ ZIPSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Nova slika...", IDM_ZIP_IMAGE_NEW + MENUITEM "&Nova slika...", IDM_ZIP_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&Obstoječa slika...", IDM_ZIP_IMAGE_EXISTING - MENUITEM "Obstoječa slika (&samo za branje)...", IDM_ZIP_IMAGE_EXISTING_WP + MENUITEM "&Obstoječa slika...", IDM_ZIP_IMAGE_EXISTING + MENUITEM "Obstoječa slika (&samo za branje)...", IDM_ZIP_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "I&zvrzi", IDM_ZIP_EJECT - MENUITEM "&Naloži zadnjo sliko", IDM_ZIP_RELOAD + MENUITEM "I&zvrzi", IDM_ZIP_EJECT + MENUITEM "&Naloži zadnjo sliko", IDM_ZIP_RELOAD END END @@ -208,13 +208,13 @@ MOSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Nova slika...", IDM_MO_IMAGE_NEW + MENUITEM "&Nova slika...", IDM_MO_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&Obstoječa slika...", IDM_MO_IMAGE_EXISTING - MENUITEM "Obstoječa slika (&samo za branje)...", IDM_MO_IMAGE_EXISTING_WP + MENUITEM "&Obstoječa slika...", IDM_MO_IMAGE_EXISTING + MENUITEM "Obstoječa slika (&samo za branje)...", IDM_MO_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "I&zvrzi", IDM_MO_EJECT - MENUITEM "&Naloži zadnjo sliko", IDM_MO_RELOAD + MENUITEM "I&zvrzi", IDM_MO_EJECT + MENUITEM "&Naloži zadnjo sliko", IDM_MO_RELOAD END END @@ -240,150 +240,150 @@ END // Dialog // -#define STR_PREFERENCES "Možnosti" -#define STR_SND_GAIN "Ojačanje zvoka" -#define STR_NEW_FLOPPY "Nova slika" -#define STR_CONFIG "Nastavitve" -#define STR_SPECIFY_DIM "Določi velikost glavnega okna" +#define STR_PREFERENCES "Možnosti" +#define STR_SND_GAIN "Ojačanje zvoka" +#define STR_NEW_FLOPPY "Nova slika" +#define STR_CONFIG "Nastavitve" +#define STR_SPECIFY_DIM "Določi velikost glavnega okna" -#define STR_OK "V redu" -#define STR_CANCEL "Prekliči" -#define STR_GLOBAL "Shrani te nastavitve kot globalne privzete" -#define STR_DEFAULT "Privzeto" -#define STR_LANGUAGE "Jezik:" -#define STR_ICONSET "Komplet ikon:" +#define STR_OK "V redu" +#define STR_CANCEL "Prekliči" +#define STR_GLOBAL "Shrani te nastavitve kot globalne privzete" +#define STR_DEFAULT "Privzeto" +#define STR_LANGUAGE "Jezik:" +#define STR_ICONSET "Komplet ikon:" -#define STR_GAIN "Ojačanje" +#define STR_GAIN "Ojačanje" -#define STR_FILE_NAME "Ime datoteke:" -#define STR_DISK_SIZE "Velikost diska:" -#define STR_RPM_MODE "Način števila obratov:" -#define STR_PROGRESS "Napredek:" +#define STR_FILE_NAME "Ime datoteke:" +#define STR_DISK_SIZE "Velikost diska:" +#define STR_RPM_MODE "Način števila obratov:" +#define STR_PROGRESS "Napredek:" -#define STR_WIDTH "Širina:" -#define STR_HEIGHT "Višina:" -#define STR_LOCK_TO_SIZE "Zakleni na to velikost" +#define STR_WIDTH "Širina:" +#define STR_HEIGHT "Višina:" +#define STR_LOCK_TO_SIZE "Zakleni na to velikost" -#define STR_MACHINE_TYPE "Vrsta sistema:" -#define STR_MACHINE "Sistem:" -#define STR_CONFIGURE "Nastavi" -#define STR_CPU_TYPE "Vrsta procesorja:" -#define STR_CPU_SPEED "Hitrost:" -#define STR_FPU "Procesor plavajoče vejice:" -#define STR_WAIT_STATES "Čakalna stanja:" -#define STR_MB "MB" -#define STR_MEMORY "Spomin:" -#define STR_TIME_SYNC "Sinhronizacija časa" -#define STR_DISABLED "Onemogočeno" -#define STR_ENABLED_LOCAL "Omogočeno (lokalni čas)" -#define STR_ENABLED_UTC "Omogočeno (UTC)" -#define STR_DYNAREC "Dinamični prevajalnik" +#define STR_MACHINE_TYPE "Vrsta sistema:" +#define STR_MACHINE "Sistem:" +#define STR_CONFIGURE "Nastavi" +#define STR_CPU_TYPE "Vrsta procesorja:" +#define STR_CPU_SPEED "Hitrost:" +#define STR_FPU "Procesor plavajoče vejice:" +#define STR_WAIT_STATES "Čakalna stanja:" +#define STR_MB "MB" +#define STR_MEMORY "Spomin:" +#define STR_TIME_SYNC "Sinhronizacija časa" +#define STR_DISABLED "Onemogočeno" +#define STR_ENABLED_LOCAL "Omogočeno (lokalni čas)" +#define STR_ENABLED_UTC "Omogočeno (UTC)" +#define STR_DYNAREC "Dinamični prevajalnik" -#define STR_VIDEO "Video:" -#define STR_VIDEO_2 "Video 2:" -#define STR_VOODOO "Voodoo grafika" -#define STR_IBM8514 "IBM 8514/a grafika" -#define STR_XGA "XGA grafika" +#define STR_VIDEO "Video:" +#define STR_VIDEO_2 "Video 2:" +#define STR_VOODOO "Voodoo grafika" +#define STR_IBM8514 "IBM 8514/a grafika" +#define STR_XGA "XGA grafika" -#define STR_MOUSE "Miška:" -#define STR_JOYSTICK "Igralna palica:" -#define STR_JOY1 "Igralna palica 1..." -#define STR_JOY2 "Igralna palica 2..." -#define STR_JOY3 "Igralna palica 3..." -#define STR_JOY4 "Igralna palica 4..." +#define STR_MOUSE "Miška:" +#define STR_JOYSTICK "Igralna palica:" +#define STR_JOY1 "Igralna palica 1..." +#define STR_JOY2 "Igralna palica 2..." +#define STR_JOY3 "Igralna palica 3..." +#define STR_JOY4 "Igralna palica 4..." -#define STR_SOUND1 "Zvočna kartica 1:" -#define STR_SOUND2 "Zvočna kartica 2:" -#define STR_SOUND3 "Zvočna kartica 3:" -#define STR_SOUND4 "Zvočna kartica 4:" -#define STR_MIDI_OUT "Izhodna naprava MIDI:" -#define STR_MIDI_IN "Vhodna naprava MIDI:" -#define STR_MPU401 "Samostojen MPU-401" -#define STR_FLOAT "Uporabi FLOAT32 za zvok" -#define STR_FM_DRIVER "Gonilnik sintetizacije FM" -#define STR_FM_DRV_NUKED "Nuked (točnejši)" -#define STR_FM_DRV_YMFM "YMFM (hitrejši)" +#define STR_SOUND1 "Zvočna kartica 1:" +#define STR_SOUND2 "Zvočna kartica 2:" +#define STR_SOUND3 "Zvočna kartica 3:" +#define STR_SOUND4 "Zvočna kartica 4:" +#define STR_MIDI_OUT "Izhodna naprava MIDI:" +#define STR_MIDI_IN "Vhodna naprava MIDI:" +#define STR_MPU401 "Samostojen MPU-401" +#define STR_FLOAT "Uporabi FLOAT32 za zvok" +#define STR_FM_DRIVER "Gonilnik sintetizacije FM" +#define STR_FM_DRV_NUKED "Nuked (točnejši)" +#define STR_FM_DRV_YMFM "YMFM (hitrejši)" -#define STR_NET_TYPE "Vrsta omrežja:" -#define STR_PCAP "Naprava PCap:" -#define STR_NET "Omrežna kartica:" -#define STR_NET1 "Network card 1:" -#define STR_NET2 "Network card 2:" -#define STR_NET3 "Network card 3:" -#define STR_NET4 "Network card 4:" +#define STR_NET_TYPE "Vrsta omrežja:" +#define STR_PCAP "Naprava PCap:" +#define STR_NET "Omrežna kartica:" +#define STR_NET1 "Network card 1:" +#define STR_NET2 "Network card 2:" +#define STR_NET3 "Network card 3:" +#define STR_NET4 "Network card 4:" -#define STR_COM1 "Naprava COM1:" -#define STR_COM2 "Naprava COM2:" -#define STR_COM3 "Naprava COM3:" -#define STR_COM4 "Naprava COM4:" -#define STR_LPT1 "Naprava LPT1:" -#define STR_LPT2 "Naprava LPT2:" -#define STR_LPT3 "Naprava LPT3:" -#define STR_LPT4 "Naprava LPT4:" -#define STR_SERIAL1 "Serijska vrata 1" -#define STR_SERIAL2 "Serijska vrata 2" -#define STR_SERIAL3 "Serijska vrata 3" -#define STR_SERIAL4 "Serijska vrata 4" -#define STR_PARALLEL1 "Paralelna vrata 1" -#define STR_PARALLEL2 "Paralelna vrata 2" -#define STR_PARALLEL3 "Paralelna vrata 3" -#define STR_PARALLEL4 "Paralelna vrata 4" -#define STR_SERIAL_PASS1 "Serial port passthrough 1" -#define STR_SERIAL_PASS2 "Serial port passthrough 2" -#define STR_SERIAL_PASS3 "Serial port passthrough 3" -#define STR_SERIAL_PASS4 "Serial port passthrough 4" +#define STR_COM1 "Naprava COM1:" +#define STR_COM2 "Naprava COM2:" +#define STR_COM3 "Naprava COM3:" +#define STR_COM4 "Naprava COM4:" +#define STR_LPT1 "Naprava LPT1:" +#define STR_LPT2 "Naprava LPT2:" +#define STR_LPT3 "Naprava LPT3:" +#define STR_LPT4 "Naprava LPT4:" +#define STR_SERIAL1 "Serijska vrata 1" +#define STR_SERIAL2 "Serijska vrata 2" +#define STR_SERIAL3 "Serijska vrata 3" +#define STR_SERIAL4 "Serijska vrata 4" +#define STR_PARALLEL1 "Paralelna vrata 1" +#define STR_PARALLEL2 "Paralelna vrata 2" +#define STR_PARALLEL3 "Paralelna vrata 3" +#define STR_PARALLEL4 "Paralelna vrata 4" +#define STR_SERIAL_PASS1 "Serial port passthrough 1" +#define STR_SERIAL_PASS2 "Serial port passthrough 2" +#define STR_SERIAL_PASS3 "Serial port passthrough 3" +#define STR_SERIAL_PASS4 "Serial port passthrough 4" -#define STR_HDC "Krmilnik trdega diska:" -#define STR_FDC "Krmilnik disketnika:" -#define STR_IDE_TER "Terciarni krmilnik IDE" -#define STR_IDE_QUA "Kvartarni krmilnik IDE" -#define STR_SCSI "SCSI" -#define STR_SCSI_1 "Krmilnik 1:" -#define STR_SCSI_2 "Krmilnik 2:" -#define STR_SCSI_3 "Krmilnik 3:" -#define STR_SCSI_4 "Krmilnik 4:" -#define STR_CASSETTE "Kasetnik" +#define STR_HDC "Krmilnik trdega diska:" +#define STR_FDC "Krmilnik disketnika:" +#define STR_IDE_TER "Terciarni krmilnik IDE" +#define STR_IDE_QUA "Kvartarni krmilnik IDE" +#define STR_SCSI "SCSI" +#define STR_SCSI_1 "Krmilnik 1:" +#define STR_SCSI_2 "Krmilnik 2:" +#define STR_SCSI_3 "Krmilnik 3:" +#define STR_SCSI_4 "Krmilnik 4:" +#define STR_CASSETTE "Kasetnik" -#define STR_HDD "Trdi diski:" -#define STR_NEW "Nov..." -#define STR_EXISTING "Obstoječ..." -#define STR_REMOVE "Odstrani" -#define STR_BUS "Vodilo:" -#define STR_CHANNEL "Kanal:" -#define STR_ID "ID:" -#define STR_SPEED "Speed:" +#define STR_HDD "Trdi diski:" +#define STR_NEW "Nov..." +#define STR_EXISTING "Obstoječ..." +#define STR_REMOVE "Odstrani" +#define STR_BUS "Vodilo:" +#define STR_CHANNEL "Kanal:" +#define STR_ID "ID:" +#define STR_SPEED "Speed:" -#define STR_SPECIFY "Določi..." -#define STR_SECTORS "Sektorji:" -#define STR_HEADS "Glave:" -#define STR_CYLS "Cilindri:" -#define STR_SIZE_MB "Velikost (MB):" -#define STR_TYPE "Vrsta:" -#define STR_IMG_FORMAT "Format slike:" -#define STR_BLOCK_SIZE "Velikost bloka:" +#define STR_SPECIFY "Določi..." +#define STR_SECTORS "Sektorji:" +#define STR_HEADS "Glave:" +#define STR_CYLS "Cilindri:" +#define STR_SIZE_MB "Velikost (MB):" +#define STR_TYPE "Vrsta:" +#define STR_IMG_FORMAT "Format slike:" +#define STR_BLOCK_SIZE "Velikost bloka:" -#define STR_FLOPPY_DRIVES "Disketni pogoni:" -#define STR_TURBO "Turbo časovniki" -#define STR_CHECKBPB "Preverjaj BPB" -#define STR_CDROM_DRIVES "Pogoni CD-ROM:" -#define STR_CD_SPEED "Hitrost:" -#define STR_EARLY "Zgodnejši pogon" +#define STR_FLOPPY_DRIVES "Disketni pogoni:" +#define STR_TURBO "Turbo časovniki" +#define STR_CHECKBPB "Preverjaj BPB" +#define STR_CDROM_DRIVES "Pogoni CD-ROM:" +#define STR_CD_SPEED "Hitrost:" +#define STR_EARLY "Zgodnejši pogon" -#define STR_MO_DRIVES "Magnetno-optični pogoni:" -#define STR_ZIP_DRIVES "Pogoni ZIP:" -#define STR_250 "ZIP 250" +#define STR_MO_DRIVES "Magnetno-optični pogoni:" +#define STR_ZIP_DRIVES "Pogoni ZIP:" +#define STR_250 "ZIP 250" -#define STR_ISARTC "Ura v realnem času ISA:" -#define STR_ISAMEM "Razširitev spomina ISA" -#define STR_ISAMEM_1 "Kartica 1:" -#define STR_ISAMEM_2 "Kartica 2:" -#define STR_ISAMEM_3 "Kartica 3:" -#define STR_ISAMEM_4 "Kartica 4:" -#define STR_BUGGER "Naprava ISABugger" -#define STR_POSTCARD "Kartica POST" +#define STR_ISARTC "Ura v realnem času ISA:" +#define STR_ISAMEM "Razširitev spomina ISA" +#define STR_ISAMEM_1 "Kartica 1:" +#define STR_ISAMEM_2 "Kartica 2:" +#define STR_ISAMEM_3 "Kartica 3:" +#define STR_ISAMEM_4 "Kartica 4:" +#define STR_BUGGER "Naprava ISABugger" +#define STR_POSTCARD "Kartica POST" -#define FONT_SIZE 9 -#define FONT_NAME "Segoe UI" +#define FONT_SIZE 9 +#define FONT_NAME "Segoe UI" #include "dialogs.rc" @@ -394,149 +394,149 @@ END STRINGTABLE DISCARDABLE BEGIN - 2048 "86Box" - IDS_2049 "Napaka" - IDS_2050 "Kritična napaka" - IDS_2051 " - PAUSED" - IDS_2052 "Pritisnite Ctrl+Alt+PgDn za povratek iz celozaslonskega načina." - IDS_2053 "Hitrost" - IDS_2054 "ZIP %03i %i (%s): %ls" - IDS_2055 "ZIP slike (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" - IDS_2056 "86Box ni našel nobenih uporabnih ROM slik.\n\nProsim prenesite set ROM-ov in ga razširite v mapo ""roms""." - IDS_2057 "(prazno)" - IDS_2058 "ZIP slike (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0Vse datoteke (*.*)\0*.*\0" - IDS_2059 "Turbo" - IDS_2060 "Vključeno" - IDS_2061 "Izključeno" - IDS_2062 "Vse slike (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0Osnovne sektorske slike (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Površinske slike (*.86F)\0*.86F\0" - IDS_2063 "Sistem ""%hs"" ni na voljo zaradi manjkajočih ROM-ov v mapi roms/machines. Preklapljam na drug sistem, ki je na voljo." + 2048 "86Box" + IDS_2049 "Napaka" + IDS_2050 "Kritična napaka" + IDS_2051 " - PAUSED" + IDS_2052 "Pritisnite Ctrl+Alt+PgDn za povratek iz celozaslonskega načina." + IDS_2053 "Hitrost" + IDS_2054 "ZIP %03i %i (%s): %ls" + IDS_2055 "ZIP slike (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" + IDS_2056 "86Box ni našel nobenih uporabnih ROM slik.\n\nProsim prenesite set ROM-ov in ga razširite v mapo ""roms""." + IDS_2057 "(prazno)" + IDS_2058 "ZIP slike (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0Vse datoteke (*.*)\0*.*\0" + IDS_2059 "Turbo" + IDS_2060 "Vključeno" + IDS_2061 "Izključeno" + IDS_2062 "Vse slike (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0Osnovne sektorske slike (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Površinske slike (*.86F)\0*.86F\0" + IDS_2063 "Sistem ""%hs"" ni na voljo zaradi manjkajočih ROM-ov v mapi roms/machines. Preklapljam na drug sistem, ki je na voljo." END STRINGTABLE DISCARDABLE BEGIN - IDS_2064 "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.." - IDS_2065 "Sistem" - IDS_2066 "Zaslon" - IDS_2067 "Vhodne naprave" - IDS_2068 "Zvok" - IDS_2069 "Omrežje" - IDS_2070 "Vrata (COM & LPT)" - IDS_2071 "Krmilniki shrambe" - IDS_2072 "Trdi diski" - IDS_2073 "Disketni in CD-ROM pogoni" - IDS_2074 "Druge odstranljive naprave" - IDS_2075 "Druga periferija" - IDS_2076 "Površinske slike (*.86F)\0*.86F\0" - IDS_2077 "Kliknite za zajem miške" - IDS_2078 "Pritisnite F8+F12 za izpust miške" - IDS_2079 "Pritisnite F8+F12 ali srednji gumb za izpust miške" + IDS_2064 "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.." + IDS_2065 "Sistem" + IDS_2066 "Zaslon" + IDS_2067 "Vhodne naprave" + IDS_2068 "Zvok" + IDS_2069 "Omrežje" + IDS_2070 "Vrata (COM & LPT)" + IDS_2071 "Krmilniki shrambe" + IDS_2072 "Trdi diski" + IDS_2073 "Disketni in CD-ROM pogoni" + IDS_2074 "Druge odstranljive naprave" + IDS_2075 "Druga periferija" + IDS_2076 "Površinske slike (*.86F)\0*.86F\0" + IDS_2077 "Kliknite za zajem miške" + IDS_2078 "Pritisnite F8+F12 za izpust miške" + IDS_2079 "Pritisnite F8+F12 ali srednji gumb za izpust miške" END STRINGTABLE DISCARDABLE BEGIN - IDS_2080 "Ne morem inicializirati FluidSynth" - IDS_2081 "Vodilo" - IDS_2082 "Datoteka" - IDS_2083 "C" - IDS_2084 "H" - IDS_2085 "S" - IDS_2086 "MB" + IDS_2080 "Ne morem inicializirati FluidSynth" + IDS_2081 "Vodilo" + IDS_2082 "Datoteka" + IDS_2083 "C" + IDS_2084 "H" + IDS_2085 "S" + IDS_2086 "MB" IDS_2087 "Speed" - IDS_2088 "Preveri BPB" - IDS_2089 "KB" - IDS_2090 "Ne morem inicializirati pogona upodabljanja." - IDS_2091 "Privzeto" - IDS_2092 "%i stanj čakanja" - IDS_2093 "Vrsta" - IDS_2094 "Nastavitev PCap ni uspela" - IDS_2095 "Nobena naprava PCap ni bila najdena" - IDS_2096 "Neveljavna naprava PCap" - IDS_2097 "Standardna krmilna palica z 2 gumboma" - IDS_2098 "Standardna krmilna palica s 4 gumbi" - IDS_2099 "Standardna krmilna palica s 6 gumbi" - IDS_2100 "Standardna krmilna palica z 8 gumbi" - IDS_2101 "CH Flightstick Pro" - IDS_2102 "Microsoft SideWinder Pad" - IDS_2103 "Thrustmaster Flight Control System" - IDS_2104 "Brez" - IDS_2105 "Ne morem naložiti pospeševalnikov tipkovnice." - IDS_2106 "Ne morem registrirati neobdelanega vnosa." - IDS_2107 "%u" - IDS_2108 "%u MB (CHS: %i, %i, %i)" - IDS_2109 "Disketa %i (%s): %ls" - IDS_2110 "Vse slike (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Napredne sektorske slike (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Osnovne sektorske slike (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Tokovne slike (*.FDI)\0*.FDI\0Površinske slike (*.86F;*.MFM)\0*.86F;*.MFM\0Vse datoteke (*.*)\0*.*\0" - IDS_2111 "Ne morem inicializirati FreeType" - IDS_2112 "Ne morem inicializirati SDL, potrebna je knjižica SDL2.dll" - IDS_2113 "Ste prepričani, da želite ponovno zagnati emulirani sistem?" - IDS_2114 "Ste prepričani, da želite zapreti 86Box?" - IDS_2115 "Ne morem inicializirati Ghostscript" - IDS_2116 "MO %i (%ls): %ls" - IDS_2117 "Slike MO (*.IM?;*.MDI)\0*.IM?;*.MDI\0Vse datoteke (*.*)\0*.*\0" - IDS_2118 "Dobrodošli v 86Box!" - IDS_2119 "Notranji krmilnik" - IDS_2120 "Izhod" - IDS_2121 "Nobeni ROM-i niso bili najdeni" - IDS_2122 "Želite shraniti nastavitve?" - IDS_2123 "To bo ponovno zagnalo emuliran sistem." - IDS_2124 "Shrani" - IDS_2125 "O programu 86Box" - IDS_2126 "86Box v" EMU_VERSION + IDS_2088 "Preveri BPB" + IDS_2089 "KB" + IDS_2090 "Ne morem inicializirati pogona upodabljanja." + IDS_2091 "Privzeto" + IDS_2092 "%i stanj čakanja" + IDS_2093 "Vrsta" + IDS_2094 "Nastavitev PCap ni uspela" + IDS_2095 "Nobena naprava PCap ni bila najdena" + IDS_2096 "Neveljavna naprava PCap" + IDS_2097 "Standardna krmilna palica z 2 gumboma" + IDS_2098 "Standardna krmilna palica s 4 gumbi" + IDS_2099 "Standardna krmilna palica s 6 gumbi" + IDS_2100 "Standardna krmilna palica z 8 gumbi" + IDS_2101 "CH Flightstick Pro" + IDS_2102 "Microsoft SideWinder Pad" + IDS_2103 "Thrustmaster Flight Control System" + IDS_2104 "Brez" + IDS_2105 "Ne morem naložiti pospeševalnikov tipkovnice." + IDS_2106 "Ne morem registrirati neobdelanega vnosa." + IDS_2107 "%u" + IDS_2108 "%u MB (CHS: %i, %i, %i)" + IDS_2109 "Disketa %i (%s): %ls" + IDS_2110 "Vse slike (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Napredne sektorske slike (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Osnovne sektorske slike (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Tokovne slike (*.FDI)\0*.FDI\0Površinske slike (*.86F;*.MFM)\0*.86F;*.MFM\0Vse datoteke (*.*)\0*.*\0" + IDS_2111 "Ne morem inicializirati FreeType" + IDS_2112 "Ne morem inicializirati SDL, potrebna je knjižica SDL2.dll" + IDS_2113 "Ste prepričani, da želite ponovno zagnati emulirani sistem?" + IDS_2114 "Ste prepričani, da želite zapreti 86Box?" + IDS_2115 "Ne morem inicializirati Ghostscript" + IDS_2116 "MO %i (%ls): %ls" + IDS_2117 "Slike MO (*.IM?;*.MDI)\0*.IM?;*.MDI\0Vse datoteke (*.*)\0*.*\0" + IDS_2118 "Dobrodošli v 86Box!" + IDS_2119 "Notranji krmilnik" + IDS_2120 "Izhod" + IDS_2121 "Nobeni ROM-i niso bili najdeni" + IDS_2122 "Želite shraniti nastavitve?" + IDS_2123 "To bo ponovno zagnalo emuliran sistem." + IDS_2124 "Shrani" + IDS_2125 "O programu 86Box" + IDS_2126 "86Box v" EMU_VERSION - IDS_2127 "Emulator starih računalnikov\n\nAvtorji: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, Tiseno100, reenigne, 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." - IDS_2128 "V redu" - IDS_2129 "Strojna oprema ni na voljo" + IDS_2127 "Emulator starih računalnikov\n\nAvtorji: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, Tiseno100, reenigne, 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." + IDS_2128 "V redu" + IDS_2129 "Strojna oprema ni na voljo" #ifdef _WIN32 #define LIB_NAME_PCAP "WinPcap" #else #define LIB_NAME_PCAP "libpcap" #endif - IDS_2130 "Prepičajte se, da je nameščen " LIB_NAME_PCAP " in da ste na omrežni povezavi, združljivi z " LIB_NAME_PCAP - IDS_2131 "Neveljavna konfiguracija" + IDS_2130 "Prepičajte se, da je nameščen " LIB_NAME_PCAP " in da ste na omrežni povezavi, združljivi z " LIB_NAME_PCAP + IDS_2131 "Neveljavna konfiguracija" #ifdef _WIN32 #define LIB_NAME_FREETYPE "freetype.dll" #else #define LIB_NAME_FREETYPE "libfreetype" #endif - IDS_2132 LIB_NAME_FREETYPE " je potreben za emuliranje ESC/P tiskalnika." + IDS_2132 LIB_NAME_FREETYPE " je potreben za emuliranje ESC/P tiskalnika." #ifdef _WIN32 #define LIB_NAME_GS "gsdll32.dll" #else #define LIB_NAME_GS "libgs" #endif - IDS_2133 LIB_NAME_GS " je potreben za samodejno pretvorbo PostScript datotek v PDF.\n\nVsi dokumenti, poslani generičnemu PostScript tiskalniku bodo shranjeni kot PostScript (.ps) datoteke." + IDS_2133 LIB_NAME_GS " je potreben za samodejno pretvorbo PostScript datotek v PDF.\n\nVsi dokumenti, poslani generičnemu PostScript tiskalniku bodo shranjeni kot PostScript (.ps) datoteke." #ifdef _WIN32 #define LIB_NAME_FLUIDSYNTH "libfluidsynth.dll" #else #define LIB_NAME_FLUIDSYNTH "libfluidsynth" #endif - IDS_2134 LIB_NAME_FLUIDSYNTH " je potreben za FluidSynth MIDI izhod." - IDS_2135 "Preklapljam v celozaslonski način" - IDS_2136 "Ne pokaži več tega sporočila" - IDS_2137 "Prekliči izhod" - IDS_2138 "Resetiraj" - IDS_2139 "Ne resetiraj" - IDS_2140 "Slike MO (*.IM?;*.MDI)\0*.IM?;*.MDI\0Vse datoteke (*.*)\0*.*\0" - IDS_2141 "Slike CD-ROM (*.ISO;*.CUE)\0*.ISO;*.CUE\0Vse datoteke (*.*)\0*.*\0" - IDS_2142 "Konfiguracija naprave %hs" + IDS_2134 LIB_NAME_FLUIDSYNTH " je potreben za FluidSynth MIDI izhod." + IDS_2135 "Preklapljam v celozaslonski način" + IDS_2136 "Ne pokaži več tega sporočila" + IDS_2137 "Prekliči izhod" + IDS_2138 "Resetiraj" + IDS_2139 "Ne resetiraj" + IDS_2140 "Slike MO (*.IM?;*.MDI)\0*.IM?;*.MDI\0Vse datoteke (*.*)\0*.*\0" + IDS_2141 "Slike CD-ROM (*.ISO;*.CUE)\0*.ISO;*.CUE\0Vse datoteke (*.*)\0*.*\0" + IDS_2142 "Konfiguracija naprave %hs" IDS_2143 "Zaslon v načinu spanja" - IDS_2144 "Senčilniki OpenGL (*.GLSL)\0*.GLSL\0Vse datoteke (*.*)\0*.*\0" - IDS_2145 "Možnosti OpenGL" - IDS_2146 "Nalagate nepodprto konfiguracijo" - IDS_2147 "Filtriranje vrste procesorja glede na izbran sistem je onemogočeno za ta emuliran sistem.\n\nTako lahko izberete procesor, ki je sicer nezdružljiv z izbranim sistemom. Vendar lahko naletite na nezdružljivosti z BIOS-om sistema ali drugo programsko opremo\n\nOmogočanje te nastavitve ni uradno podprto, vsa poročila o hroščih iz tega naslova pa bodo zaprta kot neveljavna." - IDS_2148 "Nadaljuj" - IDS_2149 "Kaseta: %s" - IDS_2150 "Slike kaset (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Vse datoteke (*.*)\0*.*\0" - IDS_2151 "Spominski vložek %i: %ls" - IDS_2152 "Slike spominskega vložka (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Vse datoteke (*.*)\0*.*\0" - IDS_2153 "Napaka pri zagonu sistema za upodabljanje" - IDS_2154 "Sistema za upodabljanje OpenGL (3.0 Core) ni bilo mogoče zagnati. Uporabite drug sistem za upodabljanje." - IDS_2155 "Nadaljuj izvajanje" - IDS_2156 "Prekini izvajanje" - IDS_2157 "Press Ctrl+Alt+Del" - IDS_2158 "Press Ctrl+Alt+Esc" - IDS_2159 "Ponovni zagon" - IDS_2160 "Zaustavitev ACPI" - IDS_2161 "Nastavitve" + IDS_2144 "Senčilniki OpenGL (*.GLSL)\0*.GLSL\0Vse datoteke (*.*)\0*.*\0" + IDS_2145 "Možnosti OpenGL" + IDS_2146 "Nalagate nepodprto konfiguracijo" + IDS_2147 "Filtriranje vrste procesorja glede na izbran sistem je onemogočeno za ta emuliran sistem.\n\nTako lahko izberete procesor, ki je sicer nezdružljiv z izbranim sistemom. Vendar lahko naletite na nezdružljivosti z BIOS-om sistema ali drugo programsko opremo\n\nOmogočanje te nastavitve ni uradno podprto, vsa poročila o hroščih iz tega naslova pa bodo zaprta kot neveljavna." + IDS_2148 "Nadaljuj" + IDS_2149 "Kaseta: %s" + IDS_2150 "Slike kaset (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Vse datoteke (*.*)\0*.*\0" + IDS_2151 "Spominski vložek %i: %ls" + IDS_2152 "Slike spominskega vložka (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Vse datoteke (*.*)\0*.*\0" + IDS_2153 "Napaka pri zagonu sistema za upodabljanje" + IDS_2154 "Sistema za upodabljanje OpenGL (3.0 Core) ni bilo mogoče zagnati. Uporabite drug sistem za upodabljanje." + IDS_2155 "Nadaljuj izvajanje" + IDS_2156 "Prekini izvajanje" + IDS_2157 "Press Ctrl+Alt+Del" + IDS_2158 "Press Ctrl+Alt+Esc" + IDS_2159 "Ponovni zagon" + IDS_2160 "Zaustavitev ACPI" + IDS_2161 "Nastavitve" IDS_2162 "Zgodnejši pogon" IDS_2163 "No Dynarec" IDS_2164 "Old Dynarec" @@ -547,45 +547,45 @@ END STRINGTABLE DISCARDABLE BEGIN IDS_4096 "Trdi disk (%s)" - IDS_4097 "%01i:%01i" - IDS_4098 "%01i" - IDS_4099 "MFM/RLL ali ESDI pogoni CD-ROM niso nikoli obstajali" - IDS_4100 "Po meri..." - IDS_4101 "Po meri (velik)..." - IDS_4102 "Dodaj nov trdi disk" - IDS_4103 "Dodaj obstoječ trdi disk" - IDS_4104 "Slike diska HDI ne morejo biti večje od 4 GB." - IDS_4105 "Slike diska ne morejo biti večje od 127 GB." - IDS_4106 "Slike trdega diska (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0Vse datoteke (*.*)\0*.*\0" - IDS_4107 "Ne morem prebrati datoteke" - IDS_4108 "Ne morem pisati v datoteko" - IDS_4109 "Slike HDI ali HDX, ki nimajo sektorjev velikosti 512 bajtov, niso podprte." - IDS_4110 "USB še ni podprt" - IDS_4111 "Datoteka s sliko diska že obstaja" - IDS_4112 "Prosim, navedite veljavno ime datoteke." - IDS_4113 "Slika diska ustvarjena" - IDS_4114 "Prepričajte se, da datoteka obstaja in je berljiva." - IDS_4115 "Prepričajte se, da datoteko shranjujete v zapisljivo mapo." - IDS_4116 "Slika diska je prevelika" - IDS_4117 "Ne pozabite na novem disku ustvariti particij in jih formatirati." - IDS_4118 "Izbrana datoteka bo prepisana. Ali jo res želite uporabiti?" - IDS_4119 "Nepodprta slika diska" - IDS_4120 "Prepiši" - IDS_4121 "Ne prepiši" - IDS_4122 "Surova slika (.img)" - IDS_4123 "Slika HDI (.hdi)" - IDS_4124 "Slika HDX (.hdx)" - IDS_4125 "VHD fiksne velikosti (.vhd)" - IDS_4126 "Dinamičen VHD (.vhd)" - IDS_4127 "Diferencialni VHD (.vhd)" - IDS_4128 "Veliki bloki (2 MB)" - IDS_4129 "Mali bloki (512 KB)" - IDS_4130 "Datoteke VHD (*.VHD)\0*.VHD\0Vse datoteke (*.*)\0*.*\0" - IDS_4131 "Izberite starševsko sliko VHD" - IDS_4132 "To lahko pomeni, da je bila starševska slika spremenjena potem, ko je že bila ustvarjena diferencialna slika.\n\nDo tega lahko pride tudi kadar so datoteke slik diska premaknjene ali kopirane, ali pa gre za hrošča v programu, ki je ustvaril ta disk.\n\nŽelite popraviti časovni žig?" - IDS_4133 "Časovna žiga starševske slike diska in slike diska otroka se ne ujemata" - IDS_4134 "Ne morem popraviti časovnega žiga slike VHD." - IDS_4135 "%01i:%02i" + IDS_4097 "%01i:%01i" + IDS_4098 "%01i" + IDS_4099 "MFM/RLL ali ESDI pogoni CD-ROM niso nikoli obstajali" + IDS_4100 "Po meri..." + IDS_4101 "Po meri (velik)..." + IDS_4102 "Dodaj nov trdi disk" + IDS_4103 "Dodaj obstoječ trdi disk" + IDS_4104 "Slike diska HDI ne morejo biti večje od 4 GB." + IDS_4105 "Slike diska ne morejo biti večje od 127 GB." + IDS_4106 "Slike trdega diska (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0Vse datoteke (*.*)\0*.*\0" + IDS_4107 "Ne morem prebrati datoteke" + IDS_4108 "Ne morem pisati v datoteko" + IDS_4109 "Slike HDI ali HDX, ki nimajo sektorjev velikosti 512 bajtov, niso podprte." + IDS_4110 "USB še ni podprt" + IDS_4111 "Datoteka s sliko diska že obstaja" + IDS_4112 "Prosim, navedite veljavno ime datoteke." + IDS_4113 "Slika diska ustvarjena" + IDS_4114 "Prepričajte se, da datoteka obstaja in je berljiva." + IDS_4115 "Prepričajte se, da datoteko shranjujete v zapisljivo mapo." + IDS_4116 "Slika diska je prevelika" + IDS_4117 "Ne pozabite na novem disku ustvariti particij in jih formatirati." + IDS_4118 "Izbrana datoteka bo prepisana. Ali jo res želite uporabiti?" + IDS_4119 "Nepodprta slika diska" + IDS_4120 "Prepiši" + IDS_4121 "Ne prepiši" + IDS_4122 "Surova slika (.img)" + IDS_4123 "Slika HDI (.hdi)" + IDS_4124 "Slika HDX (.hdx)" + IDS_4125 "VHD fiksne velikosti (.vhd)" + IDS_4126 "Dinamičen VHD (.vhd)" + IDS_4127 "Diferencialni VHD (.vhd)" + IDS_4128 "Veliki bloki (2 MB)" + IDS_4129 "Mali bloki (512 KB)" + IDS_4130 "Datoteke VHD (*.VHD)\0*.VHD\0Vse datoteke (*.*)\0*.*\0" + IDS_4131 "Izberite starševsko sliko VHD" + IDS_4132 "To lahko pomeni, da je bila starševska slika spremenjena potem, ko je že bila ustvarjena diferencialna slika.\n\nDo tega lahko pride tudi kadar so datoteke slik diska premaknjene ali kopirane, ali pa gre za hrošča v programu, ki je ustvaril ta disk.\n\nŽelite popraviti časovni žig?" + IDS_4133 "Časovna žiga starševske slike diska in slike diska otroka se ne ujemata" + IDS_4134 "Ne morem popraviti časovnega žiga slike VHD." + IDS_4135 "%01i:%02i" IDS_4352 "MFM/RLL" IDS_4353 "XTA" @@ -594,56 +594,56 @@ BEGIN IDS_4356 "ATAPI" IDS_4357 "SCSI" - IDS_4608 "MFM/RLL (%01i:%01i)" - IDS_4609 "XTA (%01i:%01i)" - IDS_4610 "ESDI (%01i:%01i)" - IDS_4611 "IDE (%01i:%01i)" - IDS_4612 "ATAPI (%01i:%01i)" - IDS_4613 "SCSI (%01i:%02i)" + IDS_4608 "MFM/RLL (%01i:%01i)" + IDS_4609 "XTA (%01i:%01i)" + IDS_4610 "ESDI (%01i:%01i)" + IDS_4611 "IDE (%01i:%01i)" + IDS_4612 "ATAPI (%01i:%01i)" + IDS_4613 "SCSI (%01i:%02i)" - IDS_5120 "CD-ROM %i (%s): %s" + IDS_5120 "CD-ROM %i (%s): %s" - IDS_5376 "Onemogočeno" - IDS_5381 "ATAPI" + IDS_5376 "Onemogočeno" + IDS_5381 "ATAPI" IDS_5382 "SCSI" - IDS_5632 "Onemogočeno" - IDS_5637 "ATAPI (%01i:%01i)" + IDS_5632 "Onemogočeno" + IDS_5637 "ATAPI (%01i:%01i)" IDS_5638 "SCSI (%01i:%02i)" - IDS_5888 "160 kB" - IDS_5889 "180 kB" - IDS_5890 "320 kB" - IDS_5891 "360 kB" - IDS_5892 "640 kB" - IDS_5893 "720 kB" - IDS_5894 "1.2 MB" - IDS_5895 "1.25 MB" - IDS_5896 "1.44 MB" - IDS_5897 "DMF (grozd 1024)" - IDS_5898 "DMF (grozd 2048)" - IDS_5899 "2.88 MB" - IDS_5900 "ZIP 100" - IDS_5901 "ZIP 250" - IDS_5902 "3.5"" 128 MB (ISO 10090)" - IDS_5903 "3.5"" 230 MB (ISO 13963)" - IDS_5904 "3.5"" 540 MB (ISO 15498)" - IDS_5905 "3.5"" 640 MB (ISO 15498)" - IDS_5906 "3.5"" 1.3 GB (GigaMO)" - IDS_5907 "3.5"" 2.3 GB (GigaMO 2)" - IDS_5908 "5.25"" 600 MB" - IDS_5909 "5.25"" 650 MB" - IDS_5910 "5.25"" 1 GB" - IDS_5911 "5.25"" 1.3 GB" + IDS_5888 "160 kB" + IDS_5889 "180 kB" + IDS_5890 "320 kB" + IDS_5891 "360 kB" + IDS_5892 "640 kB" + IDS_5893 "720 kB" + IDS_5894 "1.2 MB" + IDS_5895 "1.25 MB" + IDS_5896 "1.44 MB" + IDS_5897 "DMF (grozd 1024)" + IDS_5898 "DMF (grozd 2048)" + IDS_5899 "2.88 MB" + IDS_5900 "ZIP 100" + IDS_5901 "ZIP 250" + IDS_5902 "3.5"" 128 MB (ISO 10090)" + IDS_5903 "3.5"" 230 MB (ISO 13963)" + IDS_5904 "3.5"" 540 MB (ISO 15498)" + IDS_5905 "3.5"" 640 MB (ISO 15498)" + IDS_5906 "3.5"" 1.3 GB (GigaMO)" + IDS_5907 "3.5"" 2.3 GB (GigaMO 2)" + IDS_5908 "5.25"" 600 MB" + IDS_5909 "5.25"" 650 MB" + IDS_5910 "5.25"" 1 GB" + IDS_5911 "5.25"" 1.3 GB" - IDS_6144 "Popolni obrati na minuto" - IDS_6145 "1% pod popolnimi obrati" - IDS_6146 "1.5% pod popolnimi obrati" - IDS_6147 "2% pod popolnimi obrati" + IDS_6144 "Popolni obrati na minuto" + IDS_6145 "1% pod popolnimi obrati" + IDS_6146 "1.5% pod popolnimi obrati" + IDS_6147 "2% pod popolnimi obrati" - IDS_7168 "(Sistemsko privzeto)" + IDS_7168 "(Sistemsko privzeto)" END -#define IDS_LANG_ENUS IDS_7168 +#define IDS_LANG_ENUS IDS_7168 // Slovenian resources ///////////////////////////////////////////////////////////////////////////// diff --git a/src/win/languages/tr-TR.rc b/src/win/languages/tr-TR.rc index 189be0f5b..17f701d24 100644 --- a/src/win/languages/tr-TR.rc +++ b/src/win/languages/tr-TR.rc @@ -17,13 +17,13 @@ MainMenu MENU DISCARDABLE BEGIN POPUP "&Komutlar" BEGIN - MENUITEM "&Klavye sadece fare yakalandığında çalışsın", IDM_ACTION_KBD_REQ_CAPTURE - MENUITEM "&Sağ CTRL tuşunu sol ALT tuşu olarak ayarla", IDM_ACTION_RCTRL_IS_LALT + MENUITEM "&Klavye sadece fare yakalandığında çalışsın", IDM_ACTION_KBD_REQ_CAPTURE + MENUITEM "&Sağ CTRL tuşunu sol ALT tuşu olarak ayarla", IDM_ACTION_RCTRL_IS_LALT MENUITEM SEPARATOR MENUITEM "&Makineyi yeniden başlat...", IDM_ACTION_HRESET MENUITEM "&Ctrl+Alt+Del\tCtrl+F12", IDM_ACTION_RESET_CAD MENUITEM SEPARATOR - MENUITEM "Ctrl+Alt+&Esc", IDM_ACTION_CTRL_ALT_ESC + MENUITEM "Ctrl+Alt+&Esc", IDM_ACTION_CTRL_ALT_ESC MENUITEM SEPARATOR MENUITEM "&Duraklat", IDM_ACTION_PAUSE MENUITEM SEPARATOR @@ -31,8 +31,8 @@ BEGIN END POPUP "&Görüntüleme" BEGIN - MENUITEM "&Durum çubuğunu gizle", IDM_VID_HIDE_STATUS_BAR - MENUITEM "Hide &toolbar", IDM_VID_HIDE_TOOLBAR + MENUITEM "&Durum çubuğunu gizle", IDM_VID_HIDE_STATUS_BAR + MENUITEM "Hide &toolbar", IDM_VID_HIDE_TOOLBAR MENUITEM SEPARATOR MENUITEM "&Show non-primary monitors", IDM_VID_MONITORS MENUITEM "&Yeniden boyutlandırılabilir pencere", IDM_VID_RESIZE @@ -101,11 +101,11 @@ BEGIN MENUITEM "CGA/PCjr/Tandy/E&GA/(S)VGA aşırı taraması", IDM_VID_OVERSCAN MENUITEM "Gri to&nlamalı görüntü için kontrastı değiştir", IDM_VID_CGACON END - MENUITEM "&Medya", IDM_MEDIA + MENUITEM "&Medya", IDM_MEDIA POPUP "&Araçlar" BEGIN MENUITEM "&Ayarlar...", IDM_CONFIG - MENUITEM "Durum &çubuğu ikonlarını güncelle", IDM_UPDATE_ICONS + MENUITEM "Durum &çubuğu ikonlarını güncelle", IDM_UPDATE_ICONS MENUITEM SEPARATOR MENUITEM "&Ekran görüntüsü al\tCtrl+F11", IDM_ACTION_SCREENSHOT MENUITEM SEPARATOR @@ -137,17 +137,17 @@ CassetteSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Yeni imaj oluştur...", IDM_CASSETTE_IMAGE_NEW + MENUITEM "&Yeni imaj oluştur...", IDM_CASSETTE_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&İmaj seç...", IDM_CASSETTE_IMAGE_EXISTING - MENUITEM "İmaj &seç (Yazma-korumalı)...", IDM_CASSETTE_IMAGE_EXISTING_WP + MENUITEM "&İmaj seç...", IDM_CASSETTE_IMAGE_EXISTING + MENUITEM "İmaj &seç (Yazma-korumalı)...", IDM_CASSETTE_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "&Kaydet", IDM_CASSETTE_RECORD - MENUITEM "&Oynat", IDM_CASSETTE_PLAY - MENUITEM "&Başlangıca geri sar", IDM_CASSETTE_REWIND - MENUITEM "Sona doğru &ileri sar", IDM_CASSETTE_FAST_FORWARD + MENUITEM "&Kaydet", IDM_CASSETTE_RECORD + MENUITEM "&Oynat", IDM_CASSETTE_PLAY + MENUITEM "&Başlangıca geri sar", IDM_CASSETTE_REWIND + MENUITEM "Sona doğru &ileri sar", IDM_CASSETTE_FAST_FORWARD MENUITEM SEPARATOR - MENUITEM "&Çıkar", IDM_CASSETTE_EJECT + MENUITEM "&Çıkar", IDM_CASSETTE_EJECT END END @@ -155,9 +155,9 @@ CartridgeSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&İmaj...", IDM_CARTRIDGE_IMAGE + MENUITEM "&İmaj...", IDM_CARTRIDGE_IMAGE MENUITEM SEPARATOR - MENUITEM "&Çıkar", IDM_CARTRIDGE_EJECT + MENUITEM "&Çıkar", IDM_CARTRIDGE_EJECT END END @@ -165,14 +165,14 @@ FloppySubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Yeni imaj oluştur...", IDM_FLOPPY_IMAGE_NEW + MENUITEM "&Yeni imaj oluştur...", IDM_FLOPPY_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&İmaj seç...", IDM_FLOPPY_IMAGE_EXISTING - MENUITEM "İmaj &seç (Yazma-korumalı)...", IDM_FLOPPY_IMAGE_EXISTING_WP + MENUITEM "&İmaj seç...", IDM_FLOPPY_IMAGE_EXISTING + MENUITEM "İmaj &seç (Yazma-korumalı)...", IDM_FLOPPY_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "&86F dosyası olarak aktar...", IDM_FLOPPY_EXPORT_TO_86F + MENUITEM "&86F dosyası olarak aktar...", IDM_FLOPPY_EXPORT_TO_86F MENUITEM SEPARATOR - MENUITEM "&Çıkar", IDM_FLOPPY_EJECT + MENUITEM "&Çıkar", IDM_FLOPPY_EJECT END END @@ -180,13 +180,13 @@ CdromSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Sesi kapat", IDM_CDROM_MUTE + MENUITEM "&Sesi kapat", IDM_CDROM_MUTE MENUITEM SEPARATOR - MENUITEM "İmajı &çıkar", IDM_CDROM_EMPTY - MENUITEM "&Önceki imajı seç", IDM_CDROM_RELOAD + MENUITEM "İmajı &çıkar", IDM_CDROM_EMPTY + MENUITEM "&Önceki imajı seç", IDM_CDROM_RELOAD MENUITEM SEPARATOR - MENUITEM "&İmaj seç...", IDM_CDROM_IMAGE - MENUITEM "&Klasör...", IDM_CDROM_DIR + MENUITEM "&İmaj seç...", IDM_CDROM_IMAGE + MENUITEM "&Klasör...", IDM_CDROM_DIR END END @@ -194,13 +194,13 @@ ZIPSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Yeni imaj...", IDM_ZIP_IMAGE_NEW + MENUITEM "&Yeni imaj...", IDM_ZIP_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&İmaj seç...", IDM_ZIP_IMAGE_EXISTING - MENUITEM "İmaj &seç (Yazma-korumalı)...", IDM_ZIP_IMAGE_EXISTING_WP + MENUITEM "&İmaj seç...", IDM_ZIP_IMAGE_EXISTING + MENUITEM "İmaj &seç (Yazma-korumalı)...", IDM_ZIP_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "&Çıkar", IDM_ZIP_EJECT - MENUITEM "&Önceki imajı seç", IDM_ZIP_RELOAD + MENUITEM "&Çıkar", IDM_ZIP_EJECT + MENUITEM "&Önceki imajı seç", IDM_ZIP_RELOAD END END @@ -208,13 +208,13 @@ MOSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Yeni imaj...", IDM_MO_IMAGE_NEW + MENUITEM "&Yeni imaj...", IDM_MO_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&İmaj seç...", IDM_MO_IMAGE_EXISTING - MENUITEM "İmaj &seç (Yazma-korumalı)...", IDM_MO_IMAGE_EXISTING_WP + MENUITEM "&İmaj seç...", IDM_MO_IMAGE_EXISTING + MENUITEM "İmaj &seç (Yazma-korumalı)...", IDM_MO_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "&Çıkar", IDM_MO_EJECT - MENUITEM "&Önceki imajı seç", IDM_MO_RELOAD + MENUITEM "&Çıkar", IDM_MO_EJECT + MENUITEM "&Önceki imajı seç", IDM_MO_RELOAD END END @@ -240,150 +240,150 @@ END // Dialog // -#define STR_PREFERENCES "Tercihler" -#define STR_SND_GAIN "Ses Artırma" -#define STR_NEW_FLOPPY "Yeni İmaj" -#define STR_CONFIG "Ayarlar" -#define STR_SPECIFY_DIM "Ana Pencere Boyutunu Belirle" +#define STR_PREFERENCES "Tercihler" +#define STR_SND_GAIN "Ses Artırma" +#define STR_NEW_FLOPPY "Yeni İmaj" +#define STR_CONFIG "Ayarlar" +#define STR_SPECIFY_DIM "Ana Pencere Boyutunu Belirle" -#define STR_OK "Tamam" -#define STR_CANCEL "İptal et" -#define STR_GLOBAL "Bu ayarları &varsayılan olarak kaydet" -#define STR_DEFAULT "&Varsayılan" -#define STR_LANGUAGE "Dil:" -#define STR_ICONSET "Simge seti:" +#define STR_OK "Tamam" +#define STR_CANCEL "İptal et" +#define STR_GLOBAL "Bu ayarları &varsayılan olarak kaydet" +#define STR_DEFAULT "&Varsayılan" +#define STR_LANGUAGE "Dil:" +#define STR_ICONSET "Simge seti:" -#define STR_GAIN "Artırma" +#define STR_GAIN "Artırma" -#define STR_FILE_NAME "Dosya adı:" -#define STR_DISK_SIZE "Disk boyutu:" -#define STR_RPM_MODE "RPM modu:" -#define STR_PROGRESS "İşlem:" +#define STR_FILE_NAME "Dosya adı:" +#define STR_DISK_SIZE "Disk boyutu:" +#define STR_RPM_MODE "RPM modu:" +#define STR_PROGRESS "İşlem:" -#define STR_WIDTH "Genişlik:" -#define STR_HEIGHT "Yükseklik:" -#define STR_LOCK_TO_SIZE "Bu boyuta kilitle" +#define STR_WIDTH "Genişlik:" +#define STR_HEIGHT "Yükseklik:" +#define STR_LOCK_TO_SIZE "Bu boyuta kilitle" -#define STR_MACHINE_TYPE "Makine türü:" -#define STR_MACHINE "Makine:" -#define STR_CONFIGURE "Ayarla" -#define STR_CPU_TYPE "CPU türü:" -#define STR_CPU_SPEED "Hız:" -#define STR_FPU "FPU:" -#define STR_WAIT_STATES "Bekleme süreleri:" -#define STR_MB "MB" -#define STR_MEMORY "Bellek:" -#define STR_TIME_SYNC "Zaman senkronizasyonu" -#define STR_DISABLED "Devre dışı" -#define STR_ENABLED_LOCAL "Etkin (yerel zaman)" -#define STR_ENABLED_UTC "Etkin (UTC)" -#define STR_DYNAREC "Dinamik Derleyici" +#define STR_MACHINE_TYPE "Makine türü:" +#define STR_MACHINE "Makine:" +#define STR_CONFIGURE "Ayarla" +#define STR_CPU_TYPE "CPU türü:" +#define STR_CPU_SPEED "Hız:" +#define STR_FPU "FPU:" +#define STR_WAIT_STATES "Bekleme süreleri:" +#define STR_MB "MB" +#define STR_MEMORY "Bellek:" +#define STR_TIME_SYNC "Zaman senkronizasyonu" +#define STR_DISABLED "Devre dışı" +#define STR_ENABLED_LOCAL "Etkin (yerel zaman)" +#define STR_ENABLED_UTC "Etkin (UTC)" +#define STR_DYNAREC "Dinamik Derleyici" -#define STR_VIDEO "Ekran kartı:" -#define STR_VIDEO_2 "Ekran kartı 2:" -#define STR_VOODOO "Voodoo Grafikleri" -#define STR_IBM8514 "IBM 8514/a Grafikleri" -#define STR_XGA "XGA Grafikleri" +#define STR_VIDEO "Ekran kartı:" +#define STR_VIDEO_2 "Ekran kartı 2:" +#define STR_VOODOO "Voodoo Grafikleri" +#define STR_IBM8514 "IBM 8514/a Grafikleri" +#define STR_XGA "XGA Grafikleri" -#define STR_MOUSE "Fare:" -#define STR_JOYSTICK "Oyun kolu:" -#define STR_JOY1 "Oyun kolu 1..." -#define STR_JOY2 "Oyun kolu 2..." -#define STR_JOY3 "Oyun kolu 3..." -#define STR_JOY4 "Oyun kolu 4..." +#define STR_MOUSE "Fare:" +#define STR_JOYSTICK "Oyun kolu:" +#define STR_JOY1 "Oyun kolu 1..." +#define STR_JOY2 "Oyun kolu 2..." +#define STR_JOY3 "Oyun kolu 3..." +#define STR_JOY4 "Oyun kolu 4..." -#define STR_SOUND1 "Ses kartı 1:" -#define STR_SOUND2 "Ses kartı 2:" -#define STR_SOUND3 "Ses kartı 3:" -#define STR_SOUND4 "Ses kartı 4:" -#define STR_MIDI_OUT "MIDI Çıkış Cihazı:" -#define STR_MIDI_IN "MIDI Giriş Cihazı:" -#define STR_MPU401 "Bağımsız MPU-401" -#define STR_FLOAT "FLOAT32 ses kullan" -#define STR_FM_DRIVER "FM sentez sürücüsü" -#define STR_FM_DRV_NUKED "Nuked (daha doğru)" -#define STR_FM_DRV_YMFM "YMFM (daha hızlı)" +#define STR_SOUND1 "Ses kartı 1:" +#define STR_SOUND2 "Ses kartı 2:" +#define STR_SOUND3 "Ses kartı 3:" +#define STR_SOUND4 "Ses kartı 4:" +#define STR_MIDI_OUT "MIDI Çıkış Cihazı:" +#define STR_MIDI_IN "MIDI Giriş Cihazı:" +#define STR_MPU401 "Bağımsız MPU-401" +#define STR_FLOAT "FLOAT32 ses kullan" +#define STR_FM_DRIVER "FM sentez sürücüsü" +#define STR_FM_DRV_NUKED "Nuked (daha doğru)" +#define STR_FM_DRV_YMFM "YMFM (daha hızlı)" -#define STR_NET_TYPE "Ağ tipi:" -#define STR_PCAP "PCap cihazı:" -#define STR_NET "Ağ cihazı:" -#define STR_NET1 "Network card 1:" -#define STR_NET2 "Network card 2:" -#define STR_NET3 "Network card 3:" -#define STR_NET4 "Network card 4:" +#define STR_NET_TYPE "Ağ tipi:" +#define STR_PCAP "PCap cihazı:" +#define STR_NET "Ağ cihazı:" +#define STR_NET1 "Network card 1:" +#define STR_NET2 "Network card 2:" +#define STR_NET3 "Network card 3:" +#define STR_NET4 "Network card 4:" -#define STR_COM1 "COM1 Cihazı:" -#define STR_COM2 "COM2 Cihazı:" -#define STR_COM3 "COM3 Cihazı:" -#define STR_COM4 "COM4 Cihazı:" -#define STR_LPT1 "LPT1 Cihazı:" -#define STR_LPT2 "LPT2 Cihazı:" -#define STR_LPT3 "LPT3 Cihazı:" -#define STR_LPT4 "LPT4 Cihazı:" -#define STR_SERIAL1 "Seri port 1" -#define STR_SERIAL2 "Seri port 2" -#define STR_SERIAL3 "Seri port 3" -#define STR_SERIAL4 "Seri port 4" -#define STR_PARALLEL1 "Paralel port 1" -#define STR_PARALLEL2 "Paralel port 2" -#define STR_PARALLEL3 "Paralel port 3" -#define STR_PARALLEL4 "Paralel port 4" -#define STR_SERIAL_PASS1 "Serial port passthrough 1" -#define STR_SERIAL_PASS2 "Serial port passthrough 2" -#define STR_SERIAL_PASS3 "Serial port passthrough 3" -#define STR_SERIAL_PASS4 "Serial port passthrough 4" +#define STR_COM1 "COM1 Cihazı:" +#define STR_COM2 "COM2 Cihazı:" +#define STR_COM3 "COM3 Cihazı:" +#define STR_COM4 "COM4 Cihazı:" +#define STR_LPT1 "LPT1 Cihazı:" +#define STR_LPT2 "LPT2 Cihazı:" +#define STR_LPT3 "LPT3 Cihazı:" +#define STR_LPT4 "LPT4 Cihazı:" +#define STR_SERIAL1 "Seri port 1" +#define STR_SERIAL2 "Seri port 2" +#define STR_SERIAL3 "Seri port 3" +#define STR_SERIAL4 "Seri port 4" +#define STR_PARALLEL1 "Paralel port 1" +#define STR_PARALLEL2 "Paralel port 2" +#define STR_PARALLEL3 "Paralel port 3" +#define STR_PARALLEL4 "Paralel port 4" +#define STR_SERIAL_PASS1 "Serial port passthrough 1" +#define STR_SERIAL_PASS2 "Serial port passthrough 2" +#define STR_SERIAL_PASS3 "Serial port passthrough 3" +#define STR_SERIAL_PASS4 "Serial port passthrough 4" -#define STR_HDC "HD Kontrolcüsü:" -#define STR_FDC "FD Kontrolcüsü:" -#define STR_IDE_TER "Üçlü IDE Kontrolcüsü" -#define STR_IDE_QUA "Dörtlü IDE Kontrolcüsü" -#define STR_SCSI "SCSI" -#define STR_SCSI_1 "Kontrolcü 1:" -#define STR_SCSI_2 "Kontrolcü 2:" -#define STR_SCSI_3 "Kontrolcü 3:" -#define STR_SCSI_4 "Kontrolcü 4:" -#define STR_CASSETTE "Kaset" +#define STR_HDC "HD Kontrolcüsü:" +#define STR_FDC "FD Kontrolcüsü:" +#define STR_IDE_TER "Üçlü IDE Kontrolcüsü" +#define STR_IDE_QUA "Dörtlü IDE Kontrolcüsü" +#define STR_SCSI "SCSI" +#define STR_SCSI_1 "Kontrolcü 1:" +#define STR_SCSI_2 "Kontrolcü 2:" +#define STR_SCSI_3 "Kontrolcü 3:" +#define STR_SCSI_4 "Kontrolcü 4:" +#define STR_CASSETTE "Kaset" -#define STR_HDD "Hard diskler:" -#define STR_NEW "&Yeni..." -#define STR_EXISTING "&Var olan..." -#define STR_REMOVE "&Kaldır" -#define STR_BUS "Veri yolu:" -#define STR_CHANNEL "Kanal:" -#define STR_ID "ID:" -#define STR_SPEED "Speed:" +#define STR_HDD "Hard diskler:" +#define STR_NEW "&Yeni..." +#define STR_EXISTING "&Var olan..." +#define STR_REMOVE "&Kaldır" +#define STR_BUS "Veri yolu:" +#define STR_CHANNEL "Kanal:" +#define STR_ID "ID:" +#define STR_SPEED "Speed:" -#define STR_SPECIFY "&Belirle..." -#define STR_SECTORS "Sektörler:" -#define STR_HEADS "Veri Kafaları:" -#define STR_CYLS "Silindirler:" -#define STR_SIZE_MB "Boyut (MB):" -#define STR_TYPE "Tip:" -#define STR_IMG_FORMAT "İmaj Düzeni:" -#define STR_BLOCK_SIZE "Blok Boyutu:" +#define STR_SPECIFY "&Belirle..." +#define STR_SECTORS "Sektörler:" +#define STR_HEADS "Veri Kafaları:" +#define STR_CYLS "Silindirler:" +#define STR_SIZE_MB "Boyut (MB):" +#define STR_TYPE "Tip:" +#define STR_IMG_FORMAT "İmaj Düzeni:" +#define STR_BLOCK_SIZE "Blok Boyutu:" -#define STR_FLOPPY_DRIVES "Disket sürücüleri:" -#define STR_TURBO "Turbo zamanlamaları" -#define STR_CHECKBPB "BPB'yi denetle" -#define STR_CDROM_DRIVES "CD-ROM sürücüleri:" -#define STR_CD_SPEED "Hız:" -#define STR_EARLY "Daha erken sürüş" +#define STR_FLOPPY_DRIVES "Disket sürücüleri:" +#define STR_TURBO "Turbo zamanlamaları" +#define STR_CHECKBPB "BPB'yi denetle" +#define STR_CDROM_DRIVES "CD-ROM sürücüleri:" +#define STR_CD_SPEED "Hız:" +#define STR_EARLY "Daha erken sürüş" -#define STR_MO_DRIVES "MO sürücüleri:" -#define STR_ZIP_DRIVES "ZIP sürücüleri:" -#define STR_250 "ZIP 250" +#define STR_MO_DRIVES "MO sürücüleri:" +#define STR_ZIP_DRIVES "ZIP sürücüleri:" +#define STR_250 "ZIP 250" -#define STR_ISARTC "ISA RTC:" -#define STR_ISAMEM "ISA Bellek Artırma" -#define STR_ISAMEM_1 "Kart 1:" -#define STR_ISAMEM_2 "Kart 2:" -#define STR_ISAMEM_3 "Kart 3:" -#define STR_ISAMEM_4 "Kart 4:" -#define STR_BUGGER "ISABugger cihazı" -#define STR_POSTCARD "POST kartı" +#define STR_ISARTC "ISA RTC:" +#define STR_ISAMEM "ISA Bellek Artırma" +#define STR_ISAMEM_1 "Kart 1:" +#define STR_ISAMEM_2 "Kart 2:" +#define STR_ISAMEM_3 "Kart 3:" +#define STR_ISAMEM_4 "Kart 4:" +#define STR_BUGGER "ISABugger cihazı" +#define STR_POSTCARD "POST kartı" -#define FONT_SIZE 9 -#define FONT_NAME "Segoe UI" +#define FONT_SIZE 9 +#define FONT_NAME "Segoe UI" #include "dialogs.rc" @@ -394,149 +394,149 @@ END STRINGTABLE DISCARDABLE BEGIN - 2048 "86Box" - IDS_2049 "Hata" - IDS_2050 "Kritik hata" - IDS_2051 " - PAUSED" - IDS_2052 "Pencere moduna geri dönmek için Ctrl+Alt+PgDn tuşlarına basın." - IDS_2053 "Hız" - IDS_2054 "ZIP %03i %i (%s): %ls" - IDS_2055 "ZIP imajları (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" - IDS_2056 "86Box hiç bir kullanılabilir ROM imajı bulamadı.\n\nLütfen ROM setini indirin ve onu ""Roms"" klasörüne çıkarın." - IDS_2057 "(empty)" - IDS_2058 "ZIP imajları (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0All files (*.*)\0*.*\0" - IDS_2059 "Turbo" - IDS_2060 "Açık" - IDS_2061 "Kapalı" - IDS_2062 "Tüm imajlar (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0Basit sektör imajları (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Yüzey imajları (*.86F)\0*.86F\0" - IDS_2063 """%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." + 2048 "86Box" + IDS_2049 "Hata" + IDS_2050 "Kritik hata" + IDS_2051 " - PAUSED" + IDS_2052 "Pencere moduna geri dönmek için Ctrl+Alt+PgDn tuşlarına basın." + IDS_2053 "Hız" + IDS_2054 "ZIP %03i %i (%s): %ls" + IDS_2055 "ZIP imajları (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" + IDS_2056 "86Box hiç bir kullanılabilir ROM imajı bulamadı.\n\nLütfen ROM setini indirin ve onu ""Roms"" klasörüne çıkarın." + IDS_2057 "(empty)" + IDS_2058 "ZIP imajları (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0All files (*.*)\0*.*\0" + IDS_2059 "Turbo" + IDS_2060 "Açık" + IDS_2061 "Kapalı" + IDS_2062 "Tüm imajlar (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0Basit sektör imajları (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Yüzey imajları (*.86F)\0*.86F\0" + IDS_2063 """%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." END STRINGTABLE DISCARDABLE BEGIN - IDS_2064 """%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." - IDS_2065 "Makine" - IDS_2066 "Görüntü" - IDS_2067 "Giriş aygıtları" - IDS_2068 "Ses" - IDS_2069 "Ağ" - IDS_2070 "Portlar (COM & LPT)" - IDS_2071 "Depolama kontrolcüleri" - IDS_2072 "Hard diskler" - IDS_2073 "Disket & CD-ROM sürücüleri" - IDS_2074 "Diğer kaldırılabilir cihazlar" - IDS_2075 "Diğer cihazlar" - IDS_2076 "Yüzey imajları (*.86F)\0*.86F\0" - IDS_2077 "Farenin yakalanması için tıklayın" - IDS_2078 "Farenin bırakılması için F8+F12 tuşlarına basın" - IDS_2079 "Farenin bırakılması için F8+F12 veya farenin orta tuşuna basın" + IDS_2064 """%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." + IDS_2065 "Makine" + IDS_2066 "Görüntü" + IDS_2067 "Giriş aygıtları" + IDS_2068 "Ses" + IDS_2069 "Ağ" + IDS_2070 "Portlar (COM & LPT)" + IDS_2071 "Depolama kontrolcüleri" + IDS_2072 "Hard diskler" + IDS_2073 "Disket & CD-ROM sürücüleri" + IDS_2074 "Diğer kaldırılabilir cihazlar" + IDS_2075 "Diğer cihazlar" + IDS_2076 "Yüzey imajları (*.86F)\0*.86F\0" + IDS_2077 "Farenin yakalanması için tıklayın" + IDS_2078 "Farenin bırakılması için F8+F12 tuşlarına basın" + IDS_2079 "Farenin bırakılması için F8+F12 veya farenin orta tuşuna basın" END STRINGTABLE DISCARDABLE BEGIN - IDS_2080 "FluidSynth başlatılamadı" - IDS_2081 "Veri yolu" - IDS_2082 "Dosya" - IDS_2083 "C" - IDS_2084 "H" - IDS_2085 "S" - IDS_2086 "MB" + IDS_2080 "FluidSynth başlatılamadı" + IDS_2081 "Veri yolu" + IDS_2082 "Dosya" + IDS_2083 "C" + IDS_2084 "H" + IDS_2085 "S" + IDS_2086 "MB" IDS_2087 "Speed" - IDS_2088 "BPB'yi kontrol et" - IDS_2089 "KB" - IDS_2090 "Video işleyici başlatılamadı." - IDS_2091 "Varsayılan" - IDS_2092 "%i Bekleme durumları" - IDS_2093 "Tür" - IDS_2094 "PCap ayarlanamadı" - IDS_2095 "Herhangi bir PCap cihazı bulunamadı" - IDS_2096 "Geçersiz PCap cihazı" - IDS_2097 "Standart 2-button oyun kolları" - IDS_2098 "Standart 4-button oyun kolu" - IDS_2099 "Standart 6-button oyun kolu" - IDS_2100 "Standart 8-button oyun kolu" - IDS_2101 "CH Flightstick Pro" - IDS_2102 "Microsoft SideWinder Pad" - IDS_2103 "Thrustmaster Flight Kontrol Sistemi" - IDS_2104 "Hiçbiri" - IDS_2105 "Klavye ivdirgeçleri yüklenemedi." - IDS_2106 "Ham girdi kaydedilemedi." - IDS_2107 "%u" - IDS_2108 "%u MB (CHS: %i, %i, %i)" - IDS_2109 "Disket %i (%s): %ls" - IDS_2110 "Tüm imajlar (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Gelişmiş sektör imajları (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Basit sektör imajları (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Flux images (*.FDI)\0*.FDI\0Yüzey imajları (*.86F;*.MFM)\0*.86F;*.MFM\0All files (*.*)\0*.*\0" - IDS_2111 "FreeType başlatılamadı" - IDS_2112 "SDL başlatılamadı, SDL2.dll gerekmektedir" - IDS_2113 "Emüle edilen makineyi yeniden başlatmak istediğinizden emin misiniz?" - IDS_2114 "86Box'tan çıkmak istediğinize emin misiniz?" - IDS_2115 "Ghostscript başlatılamadı" - IDS_2116 "MO %i (%ls): %ls" - IDS_2117 "MO imajları (*.IM?;*.MDI)\0*.IM?;*.MDI\0All files (*.*)\0*.*\0" - IDS_2118 "86Box'a hoşgeldiniz!" - IDS_2119 "Dahili kontrolcü" - IDS_2120 "Çıkış" - IDS_2121 "Hiçbir ROM imajı bulunamadı" - IDS_2122 "Ayarları kaydetmek istediğinizden emin misiniz?" - IDS_2123 "Bu makineyi yeniden başlatacak." - IDS_2124 "Kaydet" - IDS_2125 "86Box Hakkında" - IDS_2126 "86Box v" EMU_VERSION + IDS_2088 "BPB'yi kontrol et" + IDS_2089 "KB" + IDS_2090 "Video işleyici başlatılamadı." + IDS_2091 "Varsayılan" + IDS_2092 "%i Bekleme durumları" + IDS_2093 "Tür" + IDS_2094 "PCap ayarlanamadı" + IDS_2095 "Herhangi bir PCap cihazı bulunamadı" + IDS_2096 "Geçersiz PCap cihazı" + IDS_2097 "Standart 2-button oyun kolları" + IDS_2098 "Standart 4-button oyun kolu" + IDS_2099 "Standart 6-button oyun kolu" + IDS_2100 "Standart 8-button oyun kolu" + IDS_2101 "CH Flightstick Pro" + IDS_2102 "Microsoft SideWinder Pad" + IDS_2103 "Thrustmaster Flight Kontrol Sistemi" + IDS_2104 "Hiçbiri" + IDS_2105 "Klavye ivdirgeçleri yüklenemedi." + IDS_2106 "Ham girdi kaydedilemedi." + IDS_2107 "%u" + IDS_2108 "%u MB (CHS: %i, %i, %i)" + IDS_2109 "Disket %i (%s): %ls" + IDS_2110 "Tüm imajlar (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Gelişmiş sektör imajları (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Basit sektör imajları (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Flux images (*.FDI)\0*.FDI\0Yüzey imajları (*.86F;*.MFM)\0*.86F;*.MFM\0All files (*.*)\0*.*\0" + IDS_2111 "FreeType başlatılamadı" + IDS_2112 "SDL başlatılamadı, SDL2.dll gerekmektedir" + IDS_2113 "Emüle edilen makineyi yeniden başlatmak istediğinizden emin misiniz?" + IDS_2114 "86Box'tan çıkmak istediğinize emin misiniz?" + IDS_2115 "Ghostscript başlatılamadı" + IDS_2116 "MO %i (%ls): %ls" + IDS_2117 "MO imajları (*.IM?;*.MDI)\0*.IM?;*.MDI\0All files (*.*)\0*.*\0" + IDS_2118 "86Box'a hoşgeldiniz!" + IDS_2119 "Dahili kontrolcü" + IDS_2120 "Çıkış" + IDS_2121 "Hiçbir ROM imajı bulunamadı" + IDS_2122 "Ayarları kaydetmek istediğinizden emin misiniz?" + IDS_2123 "Bu makineyi yeniden başlatacak." + IDS_2124 "Kaydet" + IDS_2125 "86Box Hakkında" + IDS_2126 "86Box v" EMU_VERSION - IDS_2127 "Bir eski bilgisayar emülatörü\n\nYapanlar: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, Tiseno100, reenigne, 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." - IDS_2128 "Tamam" - IDS_2129 "Donanım mevcut değil" + IDS_2127 "Bir eski bilgisayar emülatörü\n\nYapanlar: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, Tiseno100, reenigne, 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." + IDS_2128 "Tamam" + IDS_2129 "Donanım mevcut değil" #ifdef _WIN32 #define LIB_NAME_PCAP "WinPcap" #else #define LIB_NAME_PCAP "libpcap" #endif - IDS_2130 "" LIB_NAME_PCAP " kurulu olduğundan ve " LIB_NAME_PCAP "-uyumlu bir internet ağında bulunduğunuzdan emin olun." - IDS_2131 "Geçersiz konfigürasyon" + IDS_2130 "" LIB_NAME_PCAP " kurulu olduğundan ve " LIB_NAME_PCAP "-uyumlu bir internet ağında bulunduğunuzdan emin olun." + IDS_2131 "Geçersiz konfigürasyon" #ifdef _WIN32 #define LIB_NAME_FREETYPE "freetype.dll" #else #define LIB_NAME_FREETYPE "libfreetype" #endif - IDS_2132 LIB_NAME_FREETYPE " ESC/P yazıcı emülasyonu için gereklidir." + IDS_2132 LIB_NAME_FREETYPE " ESC/P yazıcı emülasyonu için gereklidir." #ifdef _WIN32 #define LIB_NAME_GS "gsdll32.dll" #else #define LIB_NAME_GS "libgs" #endif - IDS_2133 LIB_NAME_GS " 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." + IDS_2133 LIB_NAME_GS " 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." #ifdef _WIN32 #define LIB_NAME_FLUIDSYNTH "libfluidsynth.dll" #else #define LIB_NAME_FLUIDSYNTH "libfluidsynth" #endif - IDS_2134 LIB_NAME_FLUIDSYNTH " FluidSynth MIDI çıkışı için gereklidir." - IDS_2135 "Tam ekran moduna geçiliyor" - IDS_2136 "Bu mesajı bir daha gösterme" - IDS_2137 "Çıkış yapma" - IDS_2138 "Yeniden başlat" - IDS_2139 "Yeniden başlatma" - IDS_2140 "MO imajları (*.IM?;*.MDI)\0*.IM?;*.MDI\0Tüm dosyalar (*.*)\0*.*\0" - IDS_2141 "CD-ROM imajları (*.ISO;*.CUE)\0*.ISO;*.CUE\0Tüm dosyalar (*.*)\0*.*\0" - IDS_2142 "%hs Cihaz Konfigürasyonu" + IDS_2134 LIB_NAME_FLUIDSYNTH " FluidSynth MIDI çıkışı için gereklidir." + IDS_2135 "Tam ekran moduna geçiliyor" + IDS_2136 "Bu mesajı bir daha gösterme" + IDS_2137 "Çıkış yapma" + IDS_2138 "Yeniden başlat" + IDS_2139 "Yeniden başlatma" + IDS_2140 "MO imajları (*.IM?;*.MDI)\0*.IM?;*.MDI\0Tüm dosyalar (*.*)\0*.*\0" + IDS_2141 "CD-ROM imajları (*.ISO;*.CUE)\0*.ISO;*.CUE\0Tüm dosyalar (*.*)\0*.*\0" + IDS_2142 "%hs Cihaz Konfigürasyonu" IDS_2143 "Monitör uyku modunda" - IDS_2144 "OpenGL Gölgelendiricileri (*.GLSL)\0*.GLSL\0Tüm dosyalar (*.*)\0*.*\0" - IDS_2145 "OpenGL ayarları" - IDS_2146 "Desteklenmeyen bir konfigürasyon yüklüyorsunuz" - IDS_2147 "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." - IDS_2148 "Devam et" - IDS_2149 "Kaset: %s" - IDS_2150 "Kaset imajları (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Tüm dosyalar (*.*)\0*.*\0" - IDS_2151 "Kartuş %i: %ls" - IDS_2152 "Kartuş imajları (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Tüm dosyalar (*.*)\0*.*\0" - IDS_2153 "Oluşturucu başlatılırken hata oluştu" - IDS_2154 "OpenGL (3.0 Core) görüntüleyici başlatılamadı. Başka bir görüntüleyici kullanın." - IDS_2155 "Yürütmeye devam et" - IDS_2156 "Yürütmeyi duraklat" - IDS_2157 "Ctrl+Alt+Del" - IDS_2158 "Ctrl+Alt+Esc" - IDS_2159 "Makineyi yeniden başlat" - IDS_2160 "ACPI kapatma" - IDS_2161 "Ayarlar" + IDS_2144 "OpenGL Gölgelendiricileri (*.GLSL)\0*.GLSL\0Tüm dosyalar (*.*)\0*.*\0" + IDS_2145 "OpenGL ayarları" + IDS_2146 "Desteklenmeyen bir konfigürasyon yüklüyorsunuz" + IDS_2147 "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." + IDS_2148 "Devam et" + IDS_2149 "Kaset: %s" + IDS_2150 "Kaset imajları (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Tüm dosyalar (*.*)\0*.*\0" + IDS_2151 "Kartuş %i: %ls" + IDS_2152 "Kartuş imajları (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Tüm dosyalar (*.*)\0*.*\0" + IDS_2153 "Oluşturucu başlatılırken hata oluştu" + IDS_2154 "OpenGL (3.0 Core) görüntüleyici başlatılamadı. Başka bir görüntüleyici kullanın." + IDS_2155 "Yürütmeye devam et" + IDS_2156 "Yürütmeyi duraklat" + IDS_2157 "Ctrl+Alt+Del" + IDS_2158 "Ctrl+Alt+Esc" + IDS_2159 "Makineyi yeniden başlat" + IDS_2160 "ACPI kapatma" + IDS_2161 "Ayarlar" IDS_2162 "Daha erken sürüş" IDS_2163 "No Dynarec" IDS_2164 "Old Dynarec" @@ -547,45 +547,45 @@ END STRINGTABLE DISCARDABLE BEGIN IDS_4096 "Hard disk (%s)" - IDS_4097 "%01i:%01i" - IDS_4098 "%01i" - IDS_4099 "MFM/RLL veya ESDI CD-ROM sürücüleri hiçbir zaman var olmamıştır" - IDS_4100 "Diğer..." - IDS_4101 "Diğer (büyük)..." - IDS_4102 "Yeni Hard Disk Dosyası Oluştur" - IDS_4103 "Var Olan Hard Disk Dosyası Ekle" - IDS_4104 "HDI disk imajları 4 GB'tan daha büyük olamaz." - IDS_4105 "Disk imajları 127 GB'tan daha büyük olamaz." - IDS_4106 "Hard disk imajları (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0Tüm dosyalar (*.*)\0*.*\0" - IDS_4107 "Dosya okunamıyor" - IDS_4108 "Dosyanın üzerine yazılamıyor" - IDS_4109 "512 dışında sektör boyutu olan HDI veya HDX imajları desteklenmemektedir." - IDS_4110 "USB şu anda desteklenmemektedir" - IDS_4111 "Disk imaj dosyası zaten var olmakta" - IDS_4112 "Lütfen geçerli bir dosya ismi belirleyin." - IDS_4113 "Disk imajı oluşturuldu" - IDS_4114 "Dosyanın var olduğuna ve okunabildiğine emin olun." - IDS_4115 "Dosyanın yazılabilir bir klasöre kaydedildiğinden emin olun." - IDS_4116 "Disk imajı çok büyük" - IDS_4117 "Yeni oluşturulan diski bölmeyi ve formatlamayı unutmayın." - IDS_4118 "Seçili dosyanın üzerine yazılacaktır. Bunu yapmak istediğinizden emin misiniz?" - IDS_4119 "Desteklenmeyen disk imajı" - IDS_4120 "Üzerine yaz" - IDS_4121 "Üzerine yazma" - IDS_4122 "Ham imaj (.img)" - IDS_4123 "HDI imajı (.hdi)" - IDS_4124 "HDX imajı (.hdx)" - IDS_4125 "Sabit-boyutlu VHD (.vhd)" - IDS_4126 "Dinamik-boyutlu VHD (.vhd)" - IDS_4127 "Differencing VHD (.vhd)" - IDS_4128 "Büyük bloklar (2 MB)" - IDS_4129 "Küçük bloklar (512 KB)" - IDS_4130 "VHD dosyaları (*.VHD)\0*.VHD\0Tüm dosyalar (*.*)\0*.*\0" - IDS_4131 "Ana VHD dosyasını seçin" - IDS_4132 "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?" - IDS_4133 "Ana ve ek disk zaman damgaları uyuşmuyor" - IDS_4134 "VHD zaman damgası düzeltilemedi." - IDS_4135 "%01i:%02i" + IDS_4097 "%01i:%01i" + IDS_4098 "%01i" + IDS_4099 "MFM/RLL veya ESDI CD-ROM sürücüleri hiçbir zaman var olmamıştır" + IDS_4100 "Diğer..." + IDS_4101 "Diğer (büyük)..." + IDS_4102 "Yeni Hard Disk Dosyası Oluştur" + IDS_4103 "Var Olan Hard Disk Dosyası Ekle" + IDS_4104 "HDI disk imajları 4 GB'tan daha büyük olamaz." + IDS_4105 "Disk imajları 127 GB'tan daha büyük olamaz." + IDS_4106 "Hard disk imajları (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0Tüm dosyalar (*.*)\0*.*\0" + IDS_4107 "Dosya okunamıyor" + IDS_4108 "Dosyanın üzerine yazılamıyor" + IDS_4109 "512 dışında sektör boyutu olan HDI veya HDX imajları desteklenmemektedir." + IDS_4110 "USB şu anda desteklenmemektedir" + IDS_4111 "Disk imaj dosyası zaten var olmakta" + IDS_4112 "Lütfen geçerli bir dosya ismi belirleyin." + IDS_4113 "Disk imajı oluşturuldu" + IDS_4114 "Dosyanın var olduğuna ve okunabildiğine emin olun." + IDS_4115 "Dosyanın yazılabilir bir klasöre kaydedildiğinden emin olun." + IDS_4116 "Disk imajı çok büyük" + IDS_4117 "Yeni oluşturulan diski bölmeyi ve formatlamayı unutmayın." + IDS_4118 "Seçili dosyanın üzerine yazılacaktır. Bunu yapmak istediğinizden emin misiniz?" + IDS_4119 "Desteklenmeyen disk imajı" + IDS_4120 "Üzerine yaz" + IDS_4121 "Üzerine yazma" + IDS_4122 "Ham imaj (.img)" + IDS_4123 "HDI imajı (.hdi)" + IDS_4124 "HDX imajı (.hdx)" + IDS_4125 "Sabit-boyutlu VHD (.vhd)" + IDS_4126 "Dinamik-boyutlu VHD (.vhd)" + IDS_4127 "Differencing VHD (.vhd)" + IDS_4128 "Büyük bloklar (2 MB)" + IDS_4129 "Küçük bloklar (512 KB)" + IDS_4130 "VHD dosyaları (*.VHD)\0*.VHD\0Tüm dosyalar (*.*)\0*.*\0" + IDS_4131 "Ana VHD dosyasını seçin" + IDS_4132 "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?" + IDS_4133 "Ana ve ek disk zaman damgaları uyuşmuyor" + IDS_4134 "VHD zaman damgası düzeltilemedi." + IDS_4135 "%01i:%02i" IDS_4352 "MFM/RLL" IDS_4353 "XTA" @@ -594,56 +594,56 @@ BEGIN IDS_4356 "ATAPI" IDS_4357 "SCSI" - IDS_4608 "MFM/RLL (%01i:%01i)" - IDS_4609 "XTA (%01i:%01i)" - IDS_4610 "ESDI (%01i:%01i)" - IDS_4611 "IDE (%01i:%01i)" - IDS_4612 "ATAPI (%01i:%01i)" - IDS_4613 "SCSI (%01i:%02i)" + IDS_4608 "MFM/RLL (%01i:%01i)" + IDS_4609 "XTA (%01i:%01i)" + IDS_4610 "ESDI (%01i:%01i)" + IDS_4611 "IDE (%01i:%01i)" + IDS_4612 "ATAPI (%01i:%01i)" + IDS_4613 "SCSI (%01i:%02i)" - IDS_5120 "CD-ROM %i (%s): %s" + IDS_5120 "CD-ROM %i (%s): %s" - IDS_5376 "Devre dışı" - IDS_5381 "ATAPI" + IDS_5376 "Devre dışı" + IDS_5381 "ATAPI" IDS_5382 "SCSI" - IDS_5632 "Devre dışı" - IDS_5637 "ATAPI (%01i:%01i)" + IDS_5632 "Devre dışı" + IDS_5637 "ATAPI (%01i:%01i)" IDS_5638 "SCSI (%01i:%02i)" - IDS_5888 "160 kB" - IDS_5889 "180 kB" - IDS_5890 "320 kB" - IDS_5891 "360 kB" - IDS_5892 "640 kB" - IDS_5893 "720 kB" - IDS_5894 "1.2 MB" - IDS_5895 "1.25 MB" - IDS_5896 "1.44 MB" - IDS_5897 "DMF (cluster 1024)" - IDS_5898 "DMF (cluster 2048)" - IDS_5899 "2.88 MB" - IDS_5900 "ZIP 100" - IDS_5901 "ZIP 250" - IDS_5902 "3.5"" 128 MB (ISO 10090)" - IDS_5903 "3.5"" 230 MB (ISO 13963)" - IDS_5904 "3.5"" 540 MB (ISO 15498)" - IDS_5905 "3.5"" 640 MB (ISO 15498)" - IDS_5906 "3.5"" 1.3 GB (GigaMO)" - IDS_5907 "3.5"" 2.3 GB (GigaMO 2)" - IDS_5908 "5.25"" 600 MB" - IDS_5909 "5.25"" 650 MB" - IDS_5910 "5.25"" 1 GB" - IDS_5911 "5.25"" 1.3 GB" + IDS_5888 "160 kB" + IDS_5889 "180 kB" + IDS_5890 "320 kB" + IDS_5891 "360 kB" + IDS_5892 "640 kB" + IDS_5893 "720 kB" + IDS_5894 "1.2 MB" + IDS_5895 "1.25 MB" + IDS_5896 "1.44 MB" + IDS_5897 "DMF (cluster 1024)" + IDS_5898 "DMF (cluster 2048)" + IDS_5899 "2.88 MB" + IDS_5900 "ZIP 100" + IDS_5901 "ZIP 250" + IDS_5902 "3.5"" 128 MB (ISO 10090)" + IDS_5903 "3.5"" 230 MB (ISO 13963)" + IDS_5904 "3.5"" 540 MB (ISO 15498)" + IDS_5905 "3.5"" 640 MB (ISO 15498)" + IDS_5906 "3.5"" 1.3 GB (GigaMO)" + IDS_5907 "3.5"" 2.3 GB (GigaMO 2)" + IDS_5908 "5.25"" 600 MB" + IDS_5909 "5.25"" 650 MB" + IDS_5910 "5.25"" 1 GB" + IDS_5911 "5.25"" 1.3 GB" - IDS_6144 "Mükemmel RPM" - IDS_6145 "mükemmel RPM değerinin 1% altı" - IDS_6146 "mükemmel RPM değerinin 1.5% altı" - IDS_6147 "mükemmel RPM değerinin 2% altı" + IDS_6144 "Mükemmel RPM" + IDS_6145 "mükemmel RPM değerinin 1% altı" + IDS_6146 "mükemmel RPM değerinin 1.5% altı" + IDS_6147 "mükemmel RPM değerinin 2% altı" - IDS_7168 "(Sistem Varsayılanı)" + IDS_7168 "(Sistem Varsayılanı)" END -#define IDS_LANG_TRTR IDS_7168 +#define IDS_LANG_TRTR IDS_7168 // Turkish (TR) resources ///////////////////////////////////////////////////////////////////////////// diff --git a/src/win/languages/uk-UA.rc b/src/win/languages/uk-UA.rc index 8bf380e50..f22edf48e 100644 --- a/src/win/languages/uk-UA.rc +++ b/src/win/languages/uk-UA.rc @@ -17,13 +17,13 @@ MainMenu MENU DISCARDABLE BEGIN POPUP "&Дія" BEGIN - MENUITEM "&Клавіатура потребує захвату", IDM_ACTION_KBD_REQ_CAPTURE - MENUITEM "&Правий CTRL - це лівий ALT", IDM_ACTION_RCTRL_IS_LALT + MENUITEM "&Клавіатура потребує захвату", IDM_ACTION_KBD_REQ_CAPTURE + MENUITEM "&Правий CTRL - це лівий ALT", IDM_ACTION_RCTRL_IS_LALT MENUITEM SEPARATOR MENUITEM "&Холодне перезавантаження...", IDM_ACTION_HRESET MENUITEM "&Ctrl+Alt+Del\tCtrl+F12", IDM_ACTION_RESET_CAD MENUITEM SEPARATOR - MENUITEM "Ctrl+Alt+&Esc", IDM_ACTION_CTRL_ALT_ESC + MENUITEM "Ctrl+Alt+&Esc", IDM_ACTION_CTRL_ALT_ESC MENUITEM SEPARATOR MENUITEM "&Пауза", IDM_ACTION_PAUSE MENUITEM SEPARATOR @@ -31,8 +31,8 @@ BEGIN END POPUP "&Вигляд" BEGIN - MENUITEM "&Приховати рядок стану", IDM_VID_HIDE_STATUS_BAR - MENUITEM "&Приховати панель інструментів", IDM_VID_HIDE_TOOLBAR + MENUITEM "&Приховати рядок стану", IDM_VID_HIDE_STATUS_BAR + MENUITEM "&Приховати панель інструментів", IDM_VID_HIDE_TOOLBAR MENUITEM SEPARATOR MENUITEM "&Show non-primary monitors", IDM_VID_MONITORS MENUITEM "&Змінний розмір вікна", IDM_VID_RESIZE @@ -101,15 +101,15 @@ BEGIN MENUITEM "Вильоти розгортки CGA/PCjr/Tandy/E&GA/(S)VGA", IDM_VID_OVERSCAN MENUITEM "Змінити контрастність &монохромного дисплея", IDM_VID_CGACON END - MENUITEM "&Носії", IDM_MEDIA + MENUITEM "&Носії", IDM_MEDIA POPUP "&Інструменти" BEGIN MENUITEM "&Налаштування машини...", IDM_CONFIG - MENUITEM "&Обновлення значків рядка стану", IDM_UPDATE_ICONS + MENUITEM "&Обновлення значків рядка стану", IDM_UPDATE_ICONS MENUITEM SEPARATOR MENUITEM "Зробити &знімок\tCtrl+F11", IDM_ACTION_SCREENSHOT MENUITEM SEPARATOR - MENUITEM "&Параметри...", IDM_PREFERENCES + MENUITEM "&Параметри...", IDM_PREFERENCES #ifdef DISCORD MENUITEM "Увімкнути інтеграцію &Discord", IDM_DISCORD #endif @@ -137,17 +137,17 @@ CassetteSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Новий образ...", IDM_CASSETTE_IMAGE_NEW + MENUITEM "&Новий образ...", IDM_CASSETTE_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&Вибрати образ...", IDM_CASSETTE_IMAGE_EXISTING - MENUITEM "Вибрати образ (&Захист від запису)...", IDM_CASSETTE_IMAGE_EXISTING_WP + MENUITEM "&Вибрати образ...", IDM_CASSETTE_IMAGE_EXISTING + MENUITEM "Вибрати образ (&Захист від запису)...", IDM_CASSETTE_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "&Запис", IDM_CASSETTE_RECORD - MENUITEM "&Відтворення", IDM_CASSETTE_PLAY - MENUITEM "&Перемотування на початок", IDM_CASSETTE_REWIND - MENUITEM "&Перемотування у кінець", IDM_CASSETTE_FAST_FORWARD + MENUITEM "&Запис", IDM_CASSETTE_RECORD + MENUITEM "&Відтворення", IDM_CASSETTE_PLAY + MENUITEM "&Перемотування на початок", IDM_CASSETTE_REWIND + MENUITEM "&Перемотування у кінець", IDM_CASSETTE_FAST_FORWARD MENUITEM SEPARATOR - MENUITEM "&Вилучити", IDM_CASSETTE_EJECT + MENUITEM "&Вилучити", IDM_CASSETTE_EJECT END END @@ -155,9 +155,9 @@ CartridgeSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Образ...", IDM_CARTRIDGE_IMAGE + MENUITEM "&Образ...", IDM_CARTRIDGE_IMAGE MENUITEM SEPARATOR - MENUITEM "&Вилучити", IDM_CARTRIDGE_EJECT + MENUITEM "&Вилучити", IDM_CARTRIDGE_EJECT END END @@ -165,14 +165,14 @@ FloppySubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Новий образ...", IDM_FLOPPY_IMAGE_NEW + MENUITEM "&Новий образ...", IDM_FLOPPY_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&Вибрати образ...", IDM_FLOPPY_IMAGE_EXISTING - MENUITEM "Вибрати образ (&Захист від запису)...", IDM_FLOPPY_IMAGE_EXISTING_WP + MENUITEM "&Вибрати образ...", IDM_FLOPPY_IMAGE_EXISTING + MENUITEM "Вибрати образ (&Захист від запису)...", IDM_FLOPPY_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "&Експорт в 86F...", IDM_FLOPPY_EXPORT_TO_86F + MENUITEM "&Експорт в 86F...", IDM_FLOPPY_EXPORT_TO_86F MENUITEM SEPARATOR - MENUITEM "&Вилучити", IDM_FLOPPY_EJECT + MENUITEM "&Вилучити", IDM_FLOPPY_EJECT END END @@ -180,13 +180,13 @@ CdromSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Відключити звук", IDM_CDROM_MUTE + MENUITEM "&Відключити звук", IDM_CDROM_MUTE MENUITEM SEPARATOR - MENUITEM "&Пустий", IDM_CDROM_EMPTY - MENUITEM "&Знову завантажити попередній образ", IDM_CDROM_RELOAD + MENUITEM "&Пустий", IDM_CDROM_EMPTY + MENUITEM "&Знову завантажити попередній образ", IDM_CDROM_RELOAD MENUITEM SEPARATOR - MENUITEM "&Образ...", IDM_CDROM_IMAGE - MENUITEM "&Тека...", IDM_CDROM_DIR + MENUITEM "&Образ...", IDM_CDROM_IMAGE + MENUITEM "&Тека...", IDM_CDROM_DIR END END @@ -194,13 +194,13 @@ ZIPSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Новий образ...", IDM_ZIP_IMAGE_NEW + MENUITEM "&Новий образ...", IDM_ZIP_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&Вибрати образ...", IDM_ZIP_IMAGE_EXISTING - MENUITEM "Вибрати образ (&Захист від запису)...", IDM_ZIP_IMAGE_EXISTING_WP + MENUITEM "&Вибрати образ...", IDM_ZIP_IMAGE_EXISTING + MENUITEM "Вибрати образ (&Захист від запису)...", IDM_ZIP_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "&Вилучити", IDM_ZIP_EJECT - MENUITEM "&Знову завантажити попередній образ", IDM_ZIP_RELOAD + MENUITEM "&Вилучити", IDM_ZIP_EJECT + MENUITEM "&Знову завантажити попередній образ", IDM_ZIP_RELOAD END END @@ -208,13 +208,13 @@ MOSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Новий образ...", IDM_MO_IMAGE_NEW + MENUITEM "&Новий образ...", IDM_MO_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "&Вибрати образ...", IDM_MO_IMAGE_EXISTING - MENUITEM "Вибрати образ (&Захист від запису)...", IDM_MO_IMAGE_EXISTING_WP + MENUITEM "&Вибрати образ...", IDM_MO_IMAGE_EXISTING + MENUITEM "Вибрати образ (&Захист від запису)...", IDM_MO_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "&Вилучити", IDM_MO_EJECT - MENUITEM "&Знову завантажити попередній образ", IDM_MO_RELOAD + MENUITEM "&Вилучити", IDM_MO_EJECT + MENUITEM "&Знову завантажити попередній образ", IDM_MO_RELOAD END END @@ -240,150 +240,150 @@ END // Dialog // -#define STR_PREFERENCES "Параметри" -#define STR_SND_GAIN "Посилення звуку" -#define STR_NEW_FLOPPY "Новий образ" -#define STR_CONFIG "Налаштування" -#define STR_SPECIFY_DIM "Вказати розміри головного вікна" +#define STR_PREFERENCES "Параметри" +#define STR_SND_GAIN "Посилення звуку" +#define STR_NEW_FLOPPY "Новий образ" +#define STR_CONFIG "Налаштування" +#define STR_SPECIFY_DIM "Вказати розміри головного вікна" -#define STR_OK "OK" -#define STR_CANCEL "Відміна" -#define STR_GLOBAL "Зберегти ці параметри як &глобальні за замовчуванням" -#define STR_DEFAULT "&За замовчуванням" -#define STR_LANGUAGE "Язык:" -#define STR_ICONSET "Набір іконок:" +#define STR_OK "OK" +#define STR_CANCEL "Відміна" +#define STR_GLOBAL "Зберегти ці параметри як &глобальні за замовчуванням" +#define STR_DEFAULT "&За замовчуванням" +#define STR_LANGUAGE "Язык:" +#define STR_ICONSET "Набір іконок:" -#define STR_GAIN "Посилення" +#define STR_GAIN "Посилення" -#define STR_FILE_NAME "Ім'я файлу:" -#define STR_DISK_SIZE "Розмір диска:" -#define STR_RPM_MODE "RPM режим:" -#define STR_PROGRESS "Прогрес:" +#define STR_FILE_NAME "Ім'я файлу:" +#define STR_DISK_SIZE "Розмір диска:" +#define STR_RPM_MODE "RPM режим:" +#define STR_PROGRESS "Прогрес:" -#define STR_WIDTH "Ширина:" -#define STR_HEIGHT "Висота:" -#define STR_LOCK_TO_SIZE "Зафіксувати розмір" +#define STR_WIDTH "Ширина:" +#define STR_HEIGHT "Висота:" +#define STR_LOCK_TO_SIZE "Зафіксувати розмір" -#define STR_MACHINE_TYPE "Тип машини:" -#define STR_MACHINE "Системна плата:" -#define STR_CONFIGURE "Налаштування" -#define STR_CPU_TYPE "Тип ЦП:" -#define STR_CPU_SPEED "Швидкість:" -#define STR_FPU "FPU:" -#define STR_WAIT_STATES "Цикли очікування:" -#define STR_MB "МБ" -#define STR_MEMORY "Пам'ять:" -#define STR_TIME_SYNC "Синхронізація часу" -#define STR_DISABLED "Відключити" -#define STR_ENABLED_LOCAL "Увімкнути (місцеве)" -#define STR_ENABLED_UTC "Увімкнути (UTC)" -#define STR_DYNAREC "Динамічний рекомпілятор" +#define STR_MACHINE_TYPE "Тип машини:" +#define STR_MACHINE "Системна плата:" +#define STR_CONFIGURE "Налаштування" +#define STR_CPU_TYPE "Тип ЦП:" +#define STR_CPU_SPEED "Швидкість:" +#define STR_FPU "FPU:" +#define STR_WAIT_STATES "Цикли очікування:" +#define STR_MB "МБ" +#define STR_MEMORY "Пам'ять:" +#define STR_TIME_SYNC "Синхронізація часу" +#define STR_DISABLED "Відключити" +#define STR_ENABLED_LOCAL "Увімкнути (місцеве)" +#define STR_ENABLED_UTC "Увімкнути (UTC)" +#define STR_DYNAREC "Динамічний рекомпілятор" -#define STR_VIDEO "Відеокарта:" -#define STR_VIDEO_2 "Відеокарта 2:" -#define STR_VOODOO "Прискорювач Voodoo" -#define STR_IBM8514 "Прискорювач IBM 8514/a" -#define STR_XGA "Прискорювач XGA" +#define STR_VIDEO "Відеокарта:" +#define STR_VIDEO_2 "Відеокарта 2:" +#define STR_VOODOO "Прискорювач Voodoo" +#define STR_IBM8514 "Прискорювач IBM 8514/a" +#define STR_XGA "Прискорювач XGA" -#define STR_MOUSE "Миша:" -#define STR_JOYSTICK "Джойстик:" -#define STR_JOY1 "Джойстик 1..." -#define STR_JOY2 "Джойстик 2..." -#define STR_JOY3 "Джойстик 3..." -#define STR_JOY4 "Джойстик 4..." +#define STR_MOUSE "Миша:" +#define STR_JOYSTICK "Джойстик:" +#define STR_JOY1 "Джойстик 1..." +#define STR_JOY2 "Джойстик 2..." +#define STR_JOY3 "Джойстик 3..." +#define STR_JOY4 "Джойстик 4..." -#define STR_SOUND1 "Звукова карта 1:" -#define STR_SOUND2 "Звукова карта 2:" -#define STR_SOUND3 "Звукова карта 3:" -#define STR_SOUND4 "Звукова карта 4:" -#define STR_MIDI_OUT "MIDI Out при-ій:" -#define STR_MIDI_IN "MIDI In при-ій:" -#define STR_MPU401 "Окремий MPU-401" -#define STR_FLOAT "FLOAT32 звук" -#define STR_FM_DRIVER "Драйвер FM-синтезатора" -#define STR_FM_DRV_NUKED "Nuked (більш точний)" -#define STR_FM_DRV_YMFM "YMFM (швидший)" +#define STR_SOUND1 "Звукова карта 1:" +#define STR_SOUND2 "Звукова карта 2:" +#define STR_SOUND3 "Звукова карта 3:" +#define STR_SOUND4 "Звукова карта 4:" +#define STR_MIDI_OUT "MIDI Out при-ій:" +#define STR_MIDI_IN "MIDI In при-ій:" +#define STR_MPU401 "Окремий MPU-401" +#define STR_FLOAT "FLOAT32 звук" +#define STR_FM_DRIVER "Драйвер FM-синтезатора" +#define STR_FM_DRV_NUKED "Nuked (більш точний)" +#define STR_FM_DRV_YMFM "YMFM (швидший)" -#define STR_NET_TYPE "Тип мережі:" -#define STR_PCAP "Пристрій PCap:" -#define STR_NET "Мережева карта:" -#define STR_NET1 "Network card 1:" -#define STR_NET2 "Network card 2:" -#define STR_NET3 "Network card 3:" -#define STR_NET4 "Network card 4:" +#define STR_NET_TYPE "Тип мережі:" +#define STR_PCAP "Пристрій PCap:" +#define STR_NET "Мережева карта:" +#define STR_NET1 "Network card 1:" +#define STR_NET2 "Network card 2:" +#define STR_NET3 "Network card 3:" +#define STR_NET4 "Network card 4:" -#define STR_COM1 "Пристрій COM1:" -#define STR_COM2 "Пристрій COM2:" -#define STR_COM3 "Пристрій COM3:" -#define STR_COM4 "Пристрій COM4:" -#define STR_LPT1 "Пристрій LPT1:" -#define STR_LPT2 "Пристрій LPT2:" -#define STR_LPT3 "Пристрій LPT3:" -#define STR_LPT4 "Пристрій LPT4:" -#define STR_SERIAL1 "Послідов. порт COM1" -#define STR_SERIAL2 "Послідов. порт COM2" -#define STR_SERIAL3 "Послідов. порт COM3" -#define STR_SERIAL4 "Послідов. порт COM4" -#define STR_PARALLEL1 "Паралельний порт LPT1" -#define STR_PARALLEL2 "Паралельний порт LPT2" -#define STR_PARALLEL3 "Паралельний порт LPT3" -#define STR_PARALLEL4 "Паралельний порт LPT4" -#define STR_SERIAL_PASS1 "Serial port passthrough 1" -#define STR_SERIAL_PASS2 "Serial port passthrough 2" -#define STR_SERIAL_PASS3 "Serial port passthrough 3" -#define STR_SERIAL_PASS4 "Serial port passthrough 4" +#define STR_COM1 "Пристрій COM1:" +#define STR_COM2 "Пристрій COM2:" +#define STR_COM3 "Пристрій COM3:" +#define STR_COM4 "Пристрій COM4:" +#define STR_LPT1 "Пристрій LPT1:" +#define STR_LPT2 "Пристрій LPT2:" +#define STR_LPT3 "Пристрій LPT3:" +#define STR_LPT4 "Пристрій LPT4:" +#define STR_SERIAL1 "Послідов. порт COM1" +#define STR_SERIAL2 "Послідов. порт COM2" +#define STR_SERIAL3 "Послідов. порт COM3" +#define STR_SERIAL4 "Послідов. порт COM4" +#define STR_PARALLEL1 "Паралельний порт LPT1" +#define STR_PARALLEL2 "Паралельний порт LPT2" +#define STR_PARALLEL3 "Паралельний порт LPT3" +#define STR_PARALLEL4 "Паралельний порт LPT4" +#define STR_SERIAL_PASS1 "Serial port passthrough 1" +#define STR_SERIAL_PASS2 "Serial port passthrough 2" +#define STR_SERIAL_PASS3 "Serial port passthrough 3" +#define STR_SERIAL_PASS4 "Serial port passthrough 4" -#define STR_HDC "Контролер HD:" -#define STR_FDC "Контролер FD:" -#define STR_IDE_TER "Третинний IDE контролер" -#define STR_IDE_QUA "Четвертинний IDE контролер" -#define STR_SCSI "SCSI" -#define STR_SCSI_1 "Контролер 1:" -#define STR_SCSI_2 "Контролер 2:" -#define STR_SCSI_3 "Контролер 3:" -#define STR_SCSI_4 "Контролер 4:" -#define STR_CASSETTE "Касета" +#define STR_HDC "Контролер HD:" +#define STR_FDC "Контролер FD:" +#define STR_IDE_TER "Третинний IDE контролер" +#define STR_IDE_QUA "Четвертинний IDE контролер" +#define STR_SCSI "SCSI" +#define STR_SCSI_1 "Контролер 1:" +#define STR_SCSI_2 "Контролер 2:" +#define STR_SCSI_3 "Контролер 3:" +#define STR_SCSI_4 "Контролер 4:" +#define STR_CASSETTE "Касета" -#define STR_HDD "Жорсткі диски:" -#define STR_NEW "&Створити..." -#define STR_EXISTING "&Вибрати..." -#define STR_REMOVE "&Прибрати" -#define STR_BUS "Шина:" -#define STR_CHANNEL "Канал:" -#define STR_ID "ID:" -#define STR_SPEED "Speed:" +#define STR_HDD "Жорсткі диски:" +#define STR_NEW "&Створити..." +#define STR_EXISTING "&Вибрати..." +#define STR_REMOVE "&Прибрати" +#define STR_BUS "Шина:" +#define STR_CHANNEL "Канал:" +#define STR_ID "ID:" +#define STR_SPEED "Speed:" -#define STR_SPECIFY "&Вказати..." -#define STR_SECTORS "Сектора:" -#define STR_HEADS "Головки:" -#define STR_CYLS "Циліндри:" -#define STR_SIZE_MB "Розмір (МБ):" -#define STR_TYPE "Тип:" -#define STR_IMG_FORMAT "Тип образу:" -#define STR_BLOCK_SIZE "Розмір блоку:" +#define STR_SPECIFY "&Вказати..." +#define STR_SECTORS "Сектора:" +#define STR_HEADS "Головки:" +#define STR_CYLS "Циліндри:" +#define STR_SIZE_MB "Розмір (МБ):" +#define STR_TYPE "Тип:" +#define STR_IMG_FORMAT "Тип образу:" +#define STR_BLOCK_SIZE "Розмір блоку:" -#define STR_FLOPPY_DRIVES "Гнучкі диски:" -#define STR_TURBO "Турбо таймінги" -#define STR_CHECKBPB "Перевіряти BPB" -#define STR_CDROM_DRIVES "Дисководи CD-ROM:" -#define STR_CD_SPEED "Швидкість:" -#define STR_EARLY "Більш ранній дисковод" +#define STR_FLOPPY_DRIVES "Гнучкі диски:" +#define STR_TURBO "Турбо таймінги" +#define STR_CHECKBPB "Перевіряти BPB" +#define STR_CDROM_DRIVES "Дисководи CD-ROM:" +#define STR_CD_SPEED "Швидкість:" +#define STR_EARLY "Більш ранній дисковод" -#define STR_MO_DRIVES "Магнітооптичні дисководи:" -#define STR_ZIP_DRIVES "ZIP дисководи:" -#define STR_250 "ZIP 250" +#define STR_MO_DRIVES "Магнітооптичні дисководи:" +#define STR_ZIP_DRIVES "ZIP дисководи:" +#define STR_250 "ZIP 250" -#define STR_ISARTC "ISA RTC:" -#define STR_ISAMEM "Карта розширення пам'яті (ISA)" -#define STR_ISAMEM_1 "Карта 1:" -#define STR_ISAMEM_2 "Карта 2:" -#define STR_ISAMEM_3 "Карта 3:" -#define STR_ISAMEM_4 "Карта 4:" -#define STR_BUGGER "Пристрій ISABugger" -#define STR_POSTCARD "Карта POST" +#define STR_ISARTC "ISA RTC:" +#define STR_ISAMEM "Карта розширення пам'яті (ISA)" +#define STR_ISAMEM_1 "Карта 1:" +#define STR_ISAMEM_2 "Карта 2:" +#define STR_ISAMEM_3 "Карта 3:" +#define STR_ISAMEM_4 "Карта 4:" +#define STR_BUGGER "Пристрій ISABugger" +#define STR_POSTCARD "Карта POST" -#define FONT_SIZE 9 -#define FONT_NAME "Segoe UI" +#define FONT_SIZE 9 +#define FONT_NAME "Segoe UI" #include "dialogs.rc" @@ -394,136 +394,136 @@ END STRINGTABLE DISCARDABLE BEGIN - 2048 "86Box" - IDS_2049 "Помилка" - IDS_2050 "Непереробна помилка" - IDS_2051 " - PAUSED" - IDS_2052 "Натисніть Ctrl+Alt+PgDn для повернення у віконний режим." - IDS_2053 "Швидкість" - IDS_2054 "ZIP %03i %i (%s): %ls" - IDS_2055 "Образи ZIP (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" - IDS_2056 "86Box не зміг знайти жодного відповідного для використання файлу з ПЗУ.\n\nБудь ласка завантажте набір ПЗУ і витягніть його в каталог ""roms""." - IDS_2057 "(порожньо)" - IDS_2058 "Образи ZIP (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0Всі файли (*.*)\0*.*\0" - IDS_2059 "Турбо" - IDS_2060 "Увімк" - IDS_2061 "Вимк" - IDS_2062 "Всі образи (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0Прості посекторні образи (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Образ поверхні (*.86F)\0*.86F\0" - IDS_2063 "Системна плата ""%hs"" недоступна через відсутність файлу її ПЗУ в каталозі roms/machines. Переключення на доступну системну плату." + 2048 "86Box" + IDS_2049 "Помилка" + IDS_2050 "Непереробна помилка" + IDS_2051 " - PAUSED" + IDS_2052 "Натисніть Ctrl+Alt+PgDn для повернення у віконний режим." + IDS_2053 "Швидкість" + IDS_2054 "ZIP %03i %i (%s): %ls" + IDS_2055 "Образи ZIP (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" + IDS_2056 "86Box не зміг знайти жодного відповідного для використання файлу з ПЗУ.\n\nБудь ласка завантажте набір ПЗУ і витягніть його в каталог ""roms""." + IDS_2057 "(порожньо)" + IDS_2058 "Образи ZIP (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0Всі файли (*.*)\0*.*\0" + IDS_2059 "Турбо" + IDS_2060 "Увімк" + IDS_2061 "Вимк" + IDS_2062 "Всі образи (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0Прості посекторні образи (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Образ поверхні (*.86F)\0*.86F\0" + IDS_2063 "Системна плата ""%hs"" недоступна через відсутність файлу її ПЗУ в каталозі roms/machines. Переключення на доступну системну плату." END STRINGTABLE DISCARDABLE BEGIN - IDS_2064 "Відеокарта ""%hs"" недоступна через відсутність файлу її ПЗУ в каталозі roms/video. Переключення на доступну відеокарту." - IDS_2065 "Комп'ютер" - IDS_2066 "Дисплей" - IDS_2067 "Пристрій введення" - IDS_2068 "Звук" - IDS_2069 "Мережа" - IDS_2070 "Порти (COM и LPT)" - IDS_2071 "Контролери дисків" - IDS_2072 "Жорсткі диски" - IDS_2073 "Гнучкі диски і CD-ROM" - IDS_2074 "Інші знімні при-ої" - IDS_2075 "Інша периферія" - IDS_2076 "Образи Surface (*.86F)\0*.86F\0" - IDS_2077 "Клацніть мишею для захвату курсора" - IDS_2078 "Натисніть F8+F12, щоб звільнити курсор" - IDS_2079 "Натисніть F8+F12 або середню кнопку миші, щоб звільнити курсор" + IDS_2064 "Відеокарта ""%hs"" недоступна через відсутність файлу її ПЗУ в каталозі roms/video. Переключення на доступну відеокарту." + IDS_2065 "Комп'ютер" + IDS_2066 "Дисплей" + IDS_2067 "Пристрій введення" + IDS_2068 "Звук" + IDS_2069 "Мережа" + IDS_2070 "Порти (COM и LPT)" + IDS_2071 "Контролери дисків" + IDS_2072 "Жорсткі диски" + IDS_2073 "Гнучкі диски і CD-ROM" + IDS_2074 "Інші знімні при-ої" + IDS_2075 "Інша периферія" + IDS_2076 "Образи Surface (*.86F)\0*.86F\0" + IDS_2077 "Клацніть мишею для захвату курсора" + IDS_2078 "Натисніть F8+F12, щоб звільнити курсор" + IDS_2079 "Натисніть F8+F12 або середню кнопку миші, щоб звільнити курсор" END STRINGTABLE DISCARDABLE BEGIN - IDS_2080 "Неможливо ініціалізувати FluidSynth" - IDS_2081 "Шина" - IDS_2082 "Файл" - IDS_2083 "C" - IDS_2084 "H" - IDS_2085 "S" - IDS_2086 "МБ" + IDS_2080 "Неможливо ініціалізувати FluidSynth" + IDS_2081 "Шина" + IDS_2082 "Файл" + IDS_2083 "C" + IDS_2084 "H" + IDS_2085 "S" + IDS_2086 "МБ" IDS_2087 "Speed" - IDS_2088 "Перевіряти BPB" - IDS_2089 "КБ" - IDS_2090 "Не вдалося ініціалізувати рендер відео." - IDS_2091 "За замовчуванням" - IDS_2092 "%i WS" - IDS_2093 "Тип" - IDS_2094 "Не вдалося налаштувати PCap" - IDS_2095 "Пристрої PCap не знайдені" - IDS_2096 "Невірний пристрій PCap" - IDS_2097 "Стандартний 2-кнопковий джойстик" - IDS_2098 "Стандартний 4-кнопковий джойстик" - IDS_2099 "Стандартний 6-кнопковий джойстик" - IDS_2100 "Стандартний 8-кнопковий джойстик" - IDS_2101 "CH Flightstick Pro" - IDS_2102 "Microsoft SideWinder Pad" - IDS_2103 "Система управління польотом Thrustmaster" - IDS_2104 "Ні" - IDS_2105 "Неможливо завантажити прискорювачі клавіатури." - IDS_2106 "Неможливо зарреєструвати необроблене (RAW) введення." - IDS_2107 "%u" - IDS_2108 "%u МБ (CHS: %i, %i, %i)" - IDS_2109 "Дисковод %i (%s): %ls" - IDS_2110 "Всі образи (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Розширені образи секторів (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Основні образи секторів (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Образи Flux (*.FDI)\0*.FDI\0Образи Surface (*.86F;*.MFM)\0*.86F;*.MFM\0Всі файли (*.*)\0*.*\0" - IDS_2111 "Неможливо ініціалізувати FreeType" - IDS_2112 "Неможливо ініціалізувати SDL, потрібно SDL2.dll" - IDS_2113 "Ви впевнені, що хочете виконати холодне перезавантаження емульованої машини?" - IDS_2114 "Ви впевнені, що хочете вийти з 86Box?" - IDS_2115 "Неможливо ініціалізувати Ghostscript" - IDS_2116 "Магнітооптичний %i (%ls): %ls" - IDS_2117 "Образи магнітооптичних дисків (*.IM?;*.MDI)\0*.IM?;*.MDI\0Все файлы (*.*)\0*.*\0" - IDS_2118 "Ласкаво просимо в 86Box!" - IDS_2119 "Вбудований контролер" - IDS_2120 "Вихід" - IDS_2121 "ПЗУ не знайдені" - IDS_2122 "Чи бажаєте ви зберегти налаштування?" - IDS_2123 "Це призведе до холодної перезагрузки емульованої машини." - IDS_2124 "Зберегти" - IDS_2125 "Про 86Box" - IDS_2126 "86Box v." EMU_VERSION + IDS_2088 "Перевіряти BPB" + IDS_2089 "КБ" + IDS_2090 "Не вдалося ініціалізувати рендер відео." + IDS_2091 "За замовчуванням" + IDS_2092 "%i WS" + IDS_2093 "Тип" + IDS_2094 "Не вдалося налаштувати PCap" + IDS_2095 "Пристрої PCap не знайдені" + IDS_2096 "Невірний пристрій PCap" + IDS_2097 "Стандартний 2-кнопковий джойстик" + IDS_2098 "Стандартний 4-кнопковий джойстик" + IDS_2099 "Стандартний 6-кнопковий джойстик" + IDS_2100 "Стандартний 8-кнопковий джойстик" + IDS_2101 "CH Flightstick Pro" + IDS_2102 "Microsoft SideWinder Pad" + IDS_2103 "Система управління польотом Thrustmaster" + IDS_2104 "Ні" + IDS_2105 "Неможливо завантажити прискорювачі клавіатури." + IDS_2106 "Неможливо зарреєструвати необроблене (RAW) введення." + IDS_2107 "%u" + IDS_2108 "%u МБ (CHS: %i, %i, %i)" + IDS_2109 "Дисковод %i (%s): %ls" + IDS_2110 "Всі образи (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Розширені образи секторів (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Основні образи секторів (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Образи Flux (*.FDI)\0*.FDI\0Образи Surface (*.86F;*.MFM)\0*.86F;*.MFM\0Всі файли (*.*)\0*.*\0" + IDS_2111 "Неможливо ініціалізувати FreeType" + IDS_2112 "Неможливо ініціалізувати SDL, потрібно SDL2.dll" + IDS_2113 "Ви впевнені, що хочете виконати холодне перезавантаження емульованої машини?" + IDS_2114 "Ви впевнені, що хочете вийти з 86Box?" + IDS_2115 "Неможливо ініціалізувати Ghostscript" + IDS_2116 "Магнітооптичний %i (%ls): %ls" + IDS_2117 "Образи магнітооптичних дисків (*.IM?;*.MDI)\0*.IM?;*.MDI\0Все файлы (*.*)\0*.*\0" + IDS_2118 "Ласкаво просимо в 86Box!" + IDS_2119 "Вбудований контролер" + IDS_2120 "Вихід" + IDS_2121 "ПЗУ не знайдені" + IDS_2122 "Чи бажаєте ви зберегти налаштування?" + IDS_2123 "Це призведе до холодної перезагрузки емульованої машини." + IDS_2124 "Зберегти" + IDS_2125 "Про 86Box" + IDS_2126 "86Box v." EMU_VERSION - IDS_2127 "Емулятор старих комп'ютерів\n\nАвтори: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, Tiseno100, reenigne, leilei, JohnElliott, greatpsycho, and others.\n\nВипускаєтся під ліцензією GNU General Public License версії 2 або більше пізніше. Додадкову інформацію см. у файлі LICENSE." - IDS_2128 "OK" - IDS_2129 "Обладнання недоступне" + IDS_2127 "Емулятор старих комп'ютерів\n\nАвтори: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, Tiseno100, reenigne, leilei, JohnElliott, greatpsycho, and others.\n\nВипускаєтся під ліцензією GNU General Public License версії 2 або більше пізніше. Додадкову інформацію см. у файлі LICENSE." + IDS_2128 "OK" + IDS_2129 "Обладнання недоступне" #ifdef _WIN32 #define LIB_NAME_PCAP "WinPcap" #else #define LIB_NAME_PCAP "libpcap" #endif - IDS_2130 "Переконайтесь, що " LIB_NAME_PCAP " встановлений і ваше мережеве з'єднання, сумісне з " LIB_NAME_PCAP "." - IDS_2131 "Неприпустима конфігурація" + IDS_2130 "Переконайтесь, що " LIB_NAME_PCAP " встановлений і ваше мережеве з'єднання, сумісне з " LIB_NAME_PCAP "." + IDS_2131 "Неприпустима конфігурація" #ifdef _WIN32 #define LIB_NAME_FREETYPE "freetype.dll" #else #define LIB_NAME_FREETYPE "libfreetype" #endif - IDS_2132 "Для емуляції принтера ESC/P потрібно " LIB_NAME_FREETYPE "." + IDS_2132 "Для емуляції принтера ESC/P потрібно " LIB_NAME_FREETYPE "." #ifdef _WIN32 #define LIB_NAME_GS "gsdll32.dll" #else #define LIB_NAME_GS "libgs" #endif - IDS_2133 LIB_NAME_GS " потрібно для автоматичного перетворення файлів PostScript в PDF.\n\nВсі документи, відправлені на загальний принтер PostScript, будуть збережені у вигляді файлів PostScript (.ps)." + IDS_2133 LIB_NAME_GS " потрібно для автоматичного перетворення файлів PostScript в PDF.\n\nВсі документи, відправлені на загальний принтер PostScript, будуть збережені у вигляді файлів PostScript (.ps)." #ifdef _WIN32 #define LIB_NAME_FLUIDSYNTH "libfluidsynth.dll" #else #define LIB_NAME_FLUIDSYNTH "libfluidsynth" #endif - IDS_2134 "Для FluidSynth MIDI-висновку потрібно " LIB_NAME_FLUIDSYNTH "." - IDS_2135 "Вхід у повноекранний режим" - IDS_2136 "Більше не показувати це повідомлення" - IDS_2137 "Не виходити" - IDS_2138 "Перезавантажити" - IDS_2139 "Не перезавантажувати" - IDS_2140 "Образи магнітооптичних дисків (*.IM?;*.MDI)\0*.IM?;*.MDI\0Усі файли (*.*)\0*.*\0" - IDS_2141 "Образи CD-ROM (*.ISO;*.CUE)\0*.ISO;*.CUE\0Усі файли (*.*)\0*.*\0" - IDS_2142 "Конфігурація пристрою %hs" + IDS_2134 "Для FluidSynth MIDI-висновку потрібно " LIB_NAME_FLUIDSYNTH "." + IDS_2135 "Вхід у повноекранний режим" + IDS_2136 "Більше не показувати це повідомлення" + IDS_2137 "Не виходити" + IDS_2138 "Перезавантажити" + IDS_2139 "Не перезавантажувати" + IDS_2140 "Образи магнітооптичних дисків (*.IM?;*.MDI)\0*.IM?;*.MDI\0Усі файли (*.*)\0*.*\0" + IDS_2141 "Образи CD-ROM (*.ISO;*.CUE)\0*.ISO;*.CUE\0Усі файли (*.*)\0*.*\0" + IDS_2142 "Конфігурація пристрою %hs" IDS_2143 "Монітор у сплячому режимі" - IDS_2144 "Шейдери OpenGL (*.GLSL)\0*.GLSL\0Усі файли (*.*)\0*.*\0" - IDS_2145 "Параметри OpenGL" - IDS_2146 "Ви завантажуєте непідтримувану конфігурацію" - IDS_2147 "Вибір типів ЦП для цієї системної плати на даній емульованій машині відключено.\n\nЦе дозволяє вибрати процесор, який в іншому випадку не сумісний з вибраною материнською платою. Однак, ви можете зіткнутися з несумісністю з BIOS материнської плати або іншим ПО.\n\nВключення цього параметра офіційно не підтримується, і всі подані звіти про помилки можуть бути закриті як недійсні." - IDS_2148 "Продовжити" + IDS_2144 "Шейдери OpenGL (*.GLSL)\0*.GLSL\0Усі файли (*.*)\0*.*\0" + IDS_2145 "Параметри OpenGL" + IDS_2146 "Ви завантажуєте непідтримувану конфігурацію" + IDS_2147 "Вибір типів ЦП для цієї системної плати на даній емульованій машині відключено.\n\nЦе дозволяє вибрати процесор, який в іншому випадку не сумісний з вибраною материнською платою. Однак, ви можете зіткнутися з несумісністю з BIOS материнської плати або іншим ПО.\n\nВключення цього параметра офіційно не підтримується, і всі подані звіти про помилки можуть бути закриті як недійсні." + IDS_2148 "Продовжити" IDS_2149 "Касета: %s" IDS_2150 "Образи касет (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Усі файли (*.*)\0*. *\0" IDS_2151 "Картридж %i: %ls" diff --git a/src/win/languages/zh-CN.rc b/src/win/languages/zh-CN.rc index 81899ec7b..c84da1578 100644 --- a/src/win/languages/zh-CN.rc +++ b/src/win/languages/zh-CN.rc @@ -17,13 +17,13 @@ MainMenu MENU DISCARDABLE BEGIN POPUP "操作(&A)" BEGIN - MENUITEM "键盘需要捕捉(&K)", IDM_ACTION_KBD_REQ_CAPTURE - MENUITEM "将右 CTRL 键映射为左 ALT 键(&R)", IDM_ACTION_RCTRL_IS_LALT + MENUITEM "键盘需要捕捉(&K)", IDM_ACTION_KBD_REQ_CAPTURE + MENUITEM "将右 CTRL 键映射为左 ALT 键(&R)", IDM_ACTION_RCTRL_IS_LALT MENUITEM SEPARATOR MENUITEM "硬重置(&H)...", IDM_ACTION_HRESET MENUITEM "Ctrl+Alt+Del(&C)\tCtrl+F12", IDM_ACTION_RESET_CAD MENUITEM SEPARATOR - MENUITEM "Ctrl+Alt+Esc(&E)", IDM_ACTION_CTRL_ALT_ESC + MENUITEM "Ctrl+Alt+Esc(&E)", IDM_ACTION_CTRL_ALT_ESC MENUITEM SEPARATOR MENUITEM "暂停(&P)", IDM_ACTION_PAUSE MENUITEM SEPARATOR @@ -31,8 +31,8 @@ BEGIN END POPUP "查看(&V)" BEGIN - MENUITEM "隐藏状态栏(&H)", IDM_VID_HIDE_STATUS_BAR - MENUITEM "隐藏工具栏(&T)", IDM_VID_HIDE_TOOLBAR + MENUITEM "隐藏状态栏(&H)", IDM_VID_HIDE_STATUS_BAR + MENUITEM "隐藏工具栏(&T)", IDM_VID_HIDE_TOOLBAR MENUITEM SEPARATOR MENUITEM "Show non-primary monitors(&S)", IDM_VID_MONITORS MENUITEM "窗口大小可调(&R)", IDM_VID_RESIZE @@ -101,11 +101,11 @@ BEGIN MENUITEM "CGA/PCjr/Tandy/EGA/(S)VGA 过扫描(&G)", IDM_VID_OVERSCAN MENUITEM "更改单色显示对比度(&M)", IDM_VID_CGACON END - MENUITEM "介质(&M)", IDM_MEDIA + MENUITEM "介质(&M)", IDM_MEDIA POPUP "工具(&T)" BEGIN MENUITEM "设置(&S)...", IDM_CONFIG - MENUITEM "更新状态栏图标(&U)", IDM_UPDATE_ICONS + MENUITEM "更新状态栏图标(&U)", IDM_UPDATE_ICONS MENUITEM SEPARATOR MENUITEM "截图(&C)\tCtrl+F11", IDM_ACTION_SCREENSHOT MENUITEM SEPARATOR @@ -137,17 +137,17 @@ CassetteSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "新建镜像(&N)...", IDM_CASSETTE_IMAGE_NEW + MENUITEM "新建镜像(&N)...", IDM_CASSETTE_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "打开已存在的镜像(&E)...", IDM_CASSETTE_IMAGE_EXISTING - MENUITEM "打开已存在的镜像并写保护(&W)...", IDM_CASSETTE_IMAGE_EXISTING_WP + MENUITEM "打开已存在的镜像(&E)...", IDM_CASSETTE_IMAGE_EXISTING + MENUITEM "打开已存在的镜像并写保护(&W)...", IDM_CASSETTE_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "录制(&R)", IDM_CASSETTE_RECORD - MENUITEM "播放(&P)", IDM_CASSETTE_PLAY - MENUITEM "倒带至起点(&R)", IDM_CASSETTE_REWIND - MENUITEM "快进至终点(&F)", IDM_CASSETTE_FAST_FORWARD + MENUITEM "录制(&R)", IDM_CASSETTE_RECORD + MENUITEM "播放(&P)", IDM_CASSETTE_PLAY + MENUITEM "倒带至起点(&R)", IDM_CASSETTE_REWIND + MENUITEM "快进至终点(&F)", IDM_CASSETTE_FAST_FORWARD MENUITEM SEPARATOR - MENUITEM "弹出(&J)", IDM_CASSETTE_EJECT + MENUITEM "弹出(&J)", IDM_CASSETTE_EJECT END END @@ -155,9 +155,9 @@ CartridgeSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "镜像(&I)...", IDM_CARTRIDGE_IMAGE + MENUITEM "镜像(&I)...", IDM_CARTRIDGE_IMAGE MENUITEM SEPARATOR - MENUITEM "弹出(&J)", IDM_CARTRIDGE_EJECT + MENUITEM "弹出(&J)", IDM_CARTRIDGE_EJECT END END @@ -165,14 +165,14 @@ FloppySubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "新建镜像(&N)...", IDM_FLOPPY_IMAGE_NEW + MENUITEM "新建镜像(&N)...", IDM_FLOPPY_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "打开已存在的镜像(&E)...", IDM_FLOPPY_IMAGE_EXISTING - MENUITEM "打开已存在的镜像并写保护(&W)...", IDM_FLOPPY_IMAGE_EXISTING_WP + MENUITEM "打开已存在的镜像(&E)...", IDM_FLOPPY_IMAGE_EXISTING + MENUITEM "打开已存在的镜像并写保护(&W)...", IDM_FLOPPY_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "导出为 86F 格式(&x)...", IDM_FLOPPY_EXPORT_TO_86F + MENUITEM "导出为 86F 格式(&x)...", IDM_FLOPPY_EXPORT_TO_86F MENUITEM SEPARATOR - MENUITEM "弹出(&J)", IDM_FLOPPY_EJECT + MENUITEM "弹出(&J)", IDM_FLOPPY_EJECT END END @@ -180,13 +180,13 @@ CdromSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "静音(&M)", IDM_CDROM_MUTE + MENUITEM "静音(&M)", IDM_CDROM_MUTE MENUITEM SEPARATOR - MENUITEM "空置驱动器(&M)", IDM_CDROM_EMPTY - MENUITEM "载入上一个镜像(&R)", IDM_CDROM_RELOAD + MENUITEM "空置驱动器(&M)", IDM_CDROM_EMPTY + MENUITEM "载入上一个镜像(&R)", IDM_CDROM_RELOAD MENUITEM SEPARATOR - MENUITEM "镜像(&I)...", IDM_CDROM_IMAGE - MENUITEM "文件夹(&F)...", IDM_CDROM_DIR + MENUITEM "镜像(&I)...", IDM_CDROM_IMAGE + MENUITEM "文件夹(&F)...", IDM_CDROM_DIR END END @@ -194,13 +194,13 @@ ZIPSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "新建镜像(&N)...", IDM_ZIP_IMAGE_NEW + MENUITEM "新建镜像(&N)...", IDM_ZIP_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "打开已存在的镜像(&E)...", IDM_ZIP_IMAGE_EXISTING - MENUITEM "打开已存在的镜像并写保护(&W)...", IDM_ZIP_IMAGE_EXISTING_WP + MENUITEM "打开已存在的镜像(&E)...", IDM_ZIP_IMAGE_EXISTING + MENUITEM "打开已存在的镜像并写保护(&W)...", IDM_ZIP_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "弹出(&J)", IDM_ZIP_EJECT - MENUITEM "载入上一个镜像(&R)", IDM_ZIP_RELOAD + MENUITEM "弹出(&J)", IDM_ZIP_EJECT + MENUITEM "载入上一个镜像(&R)", IDM_ZIP_RELOAD END END @@ -208,13 +208,13 @@ MOSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "新建镜像(&N)...", IDM_MO_IMAGE_NEW + MENUITEM "新建镜像(&N)...", IDM_MO_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "打开已存在的镜像(&E)...", IDM_MO_IMAGE_EXISTING - MENUITEM "打开已存在的镜像并写保护(&W)...", IDM_MO_IMAGE_EXISTING_WP + MENUITEM "打开已存在的镜像(&E)...", IDM_MO_IMAGE_EXISTING + MENUITEM "打开已存在的镜像并写保护(&W)...", IDM_MO_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "弹出(&J)", IDM_MO_EJECT - MENUITEM "载入上一个镜像(&R)", IDM_MO_RELOAD + MENUITEM "弹出(&J)", IDM_MO_EJECT + MENUITEM "载入上一个镜像(&R)", IDM_MO_RELOAD END END @@ -240,150 +240,150 @@ END // Dialog // -#define STR_PREFERENCES "首选项" -#define STR_SND_GAIN "音量增益" -#define STR_NEW_FLOPPY "新建镜像" -#define STR_CONFIG "设置" -#define STR_SPECIFY_DIM "指定主窗口大小" +#define STR_PREFERENCES "首选项" +#define STR_SND_GAIN "音量增益" +#define STR_NEW_FLOPPY "新建镜像" +#define STR_CONFIG "设置" +#define STR_SPECIFY_DIM "指定主窗口大小" -#define STR_OK "确定" -#define STR_CANCEL "取消" -#define STR_GLOBAL "将以上设置存储为全局默认值(&G)" -#define STR_DEFAULT "默认(&D)" -#define STR_LANGUAGE "语言:" -#define STR_ICONSET "图标集:" +#define STR_OK "确定" +#define STR_CANCEL "取消" +#define STR_GLOBAL "将以上设置存储为全局默认值(&G)" +#define STR_DEFAULT "默认(&D)" +#define STR_LANGUAGE "语言:" +#define STR_ICONSET "图标集:" -#define STR_GAIN "增益" +#define STR_GAIN "增益" -#define STR_FILE_NAME "文件名:" -#define STR_DISK_SIZE "磁盘大小:" -#define STR_RPM_MODE "转速 (RPM) 模式:" -#define STR_PROGRESS "进度:" +#define STR_FILE_NAME "文件名:" +#define STR_DISK_SIZE "磁盘大小:" +#define STR_RPM_MODE "转速 (RPM) 模式:" +#define STR_PROGRESS "进度:" -#define STR_WIDTH "宽度:" -#define STR_HEIGHT "高度:" -#define STR_LOCK_TO_SIZE "锁定此大小" +#define STR_WIDTH "宽度:" +#define STR_HEIGHT "高度:" +#define STR_LOCK_TO_SIZE "锁定此大小" -#define STR_MACHINE_TYPE "机器类型:" -#define STR_MACHINE "机型:" -#define STR_CONFIGURE "配置" -#define STR_CPU_TYPE "CPU 类型:" -#define STR_CPU_SPEED "速度:" -#define STR_FPU "浮点处理器 (FPU):" -#define STR_WAIT_STATES "等待状态 (WS):" -#define STR_MB "MB" -#define STR_MEMORY "内存:" -#define STR_TIME_SYNC "时间同步" -#define STR_DISABLED "禁用" -#define STR_ENABLED_LOCAL "启用 (本地时间)" -#define STR_ENABLED_UTC "启用 (UTC)" -#define STR_DYNAREC "动态重编译器" +#define STR_MACHINE_TYPE "机器类型:" +#define STR_MACHINE "机型:" +#define STR_CONFIGURE "配置" +#define STR_CPU_TYPE "CPU 类型:" +#define STR_CPU_SPEED "速度:" +#define STR_FPU "浮点处理器 (FPU):" +#define STR_WAIT_STATES "等待状态 (WS):" +#define STR_MB "MB" +#define STR_MEMORY "内存:" +#define STR_TIME_SYNC "时间同步" +#define STR_DISABLED "禁用" +#define STR_ENABLED_LOCAL "启用 (本地时间)" +#define STR_ENABLED_UTC "启用 (UTC)" +#define STR_DYNAREC "动态重编译器" -#define STR_VIDEO "显卡:" -#define STR_VIDEO_2 "显卡 2:" -#define STR_VOODOO "Voodoo Graphics" -#define STR_IBM8514 "IBM 8514/a Graphics" -#define STR_XGA "XGA Graphics" +#define STR_VIDEO "显卡:" +#define STR_VIDEO_2 "显卡 2:" +#define STR_VOODOO "Voodoo Graphics" +#define STR_IBM8514 "IBM 8514/a Graphics" +#define STR_XGA "XGA Graphics" -#define STR_MOUSE "鼠标:" -#define STR_JOYSTICK "操纵杆:" -#define STR_JOY1 "操纵杆 1..." -#define STR_JOY2 "操纵杆 2..." -#define STR_JOY3 "操纵杆 3..." -#define STR_JOY4 "操纵杆 4..." +#define STR_MOUSE "鼠标:" +#define STR_JOYSTICK "操纵杆:" +#define STR_JOY1 "操纵杆 1..." +#define STR_JOY2 "操纵杆 2..." +#define STR_JOY3 "操纵杆 3..." +#define STR_JOY4 "操纵杆 4..." -#define STR_SOUND1 "声卡 1:" -#define STR_SOUND2 "声卡 2:" -#define STR_SOUND3 "声卡 3:" -#define STR_SOUND4 "声卡 4:" -#define STR_MIDI_OUT "MIDI 输出设备:" -#define STR_MIDI_IN "MIDI 输入设备:" -#define STR_MPU401 "独立 MPU-401" -#define STR_FLOAT "使用单精度浮点 (FLOAT32)" -#define STR_FM_DRIVER "调频合成器驱动器" -#define STR_FM_DRV_NUKED "Nuked (更准确)" -#define STR_FM_DRV_YMFM "YMFM (更快)" +#define STR_SOUND1 "声卡 1:" +#define STR_SOUND2 "声卡 2:" +#define STR_SOUND3 "声卡 3:" +#define STR_SOUND4 "声卡 4:" +#define STR_MIDI_OUT "MIDI 输出设备:" +#define STR_MIDI_IN "MIDI 输入设备:" +#define STR_MPU401 "独立 MPU-401" +#define STR_FLOAT "使用单精度浮点 (FLOAT32)" +#define STR_FM_DRIVER "调频合成器驱动器" +#define STR_FM_DRV_NUKED "Nuked (更准确)" +#define STR_FM_DRV_YMFM "YMFM (更快)" -#define STR_NET_TYPE "网络类型:" -#define STR_PCAP "PCap 设备:" -#define STR_NET "网络适配器:" -#define STR_NET1 "Network card 1:" -#define STR_NET2 "Network card 2:" -#define STR_NET3 "Network card 3:" -#define STR_NET4 "Network card 4:" +#define STR_NET_TYPE "网络类型:" +#define STR_PCAP "PCap 设备:" +#define STR_NET "网络适配器:" +#define STR_NET1 "Network card 1:" +#define STR_NET2 "Network card 2:" +#define STR_NET3 "Network card 3:" +#define STR_NET4 "Network card 4:" -#define STR_COM1 "COM1 设备:" -#define STR_COM2 "COM2 设备:" -#define STR_COM3 "COM3 设备:" -#define STR_COM4 "COM4 设备:" -#define STR_LPT1 "LPT1 设备:" -#define STR_LPT2 "LPT2 设备:" -#define STR_LPT3 "LPT3 设备:" -#define STR_LPT4 "LPT4 设备:" -#define STR_SERIAL1 "串口 1" -#define STR_SERIAL2 "串口 2" -#define STR_SERIAL3 "串口 3" -#define STR_SERIAL4 "串口 4" -#define STR_PARALLEL1 "并口 1" -#define STR_PARALLEL2 "并口 2" -#define STR_PARALLEL3 "并口 3" -#define STR_PARALLEL4 "并口 4" -#define STR_SERIAL_PASS1 "Serial port passthrough 1" -#define STR_SERIAL_PASS2 "Serial port passthrough 2" -#define STR_SERIAL_PASS3 "Serial port passthrough 3" -#define STR_SERIAL_PASS4 "Serial port passthrough 4" +#define STR_COM1 "COM1 设备:" +#define STR_COM2 "COM2 设备:" +#define STR_COM3 "COM3 设备:" +#define STR_COM4 "COM4 设备:" +#define STR_LPT1 "LPT1 设备:" +#define STR_LPT2 "LPT2 设备:" +#define STR_LPT3 "LPT3 设备:" +#define STR_LPT4 "LPT4 设备:" +#define STR_SERIAL1 "串口 1" +#define STR_SERIAL2 "串口 2" +#define STR_SERIAL3 "串口 3" +#define STR_SERIAL4 "串口 4" +#define STR_PARALLEL1 "并口 1" +#define STR_PARALLEL2 "并口 2" +#define STR_PARALLEL3 "并口 3" +#define STR_PARALLEL4 "并口 4" +#define STR_SERIAL_PASS1 "Serial port passthrough 1" +#define STR_SERIAL_PASS2 "Serial port passthrough 2" +#define STR_SERIAL_PASS3 "Serial port passthrough 3" +#define STR_SERIAL_PASS4 "Serial port passthrough 4" -#define STR_HDC "硬盘控制器:" -#define STR_FDC "软盘控制器:" -#define STR_IDE_TER "第三 IDE 控制器" -#define STR_IDE_QUA "第四 IDE 控制器" -#define STR_SCSI "SCSI" -#define STR_SCSI_1 "控制器 1:" -#define STR_SCSI_2 "控制器 2:" -#define STR_SCSI_3 "控制器 3:" -#define STR_SCSI_4 "控制器 4:" -#define STR_CASSETTE "磁带" +#define STR_HDC "硬盘控制器:" +#define STR_FDC "软盘控制器:" +#define STR_IDE_TER "第三 IDE 控制器" +#define STR_IDE_QUA "第四 IDE 控制器" +#define STR_SCSI "SCSI" +#define STR_SCSI_1 "控制器 1:" +#define STR_SCSI_2 "控制器 2:" +#define STR_SCSI_3 "控制器 3:" +#define STR_SCSI_4 "控制器 4:" +#define STR_CASSETTE "磁带" -#define STR_HDD "硬盘:" -#define STR_NEW "新建(&N)..." -#define STR_EXISTING "已有镜像(&E)..." -#define STR_REMOVE "移除(&R)" -#define STR_BUS "总线:" -#define STR_CHANNEL "通道:" -#define STR_ID "ID:" -#define STR_SPEED "Speed:" +#define STR_HDD "硬盘:" +#define STR_NEW "新建(&N)..." +#define STR_EXISTING "已有镜像(&E)..." +#define STR_REMOVE "移除(&R)" +#define STR_BUS "总线:" +#define STR_CHANNEL "通道:" +#define STR_ID "ID:" +#define STR_SPEED "Speed:" -#define STR_SPECIFY "指定(&S)..." -#define STR_SECTORS "扇区(S):" -#define STR_HEADS "磁头(H):" -#define STR_CYLS "柱面(C):" -#define STR_SIZE_MB "大小 (MB):" -#define STR_TYPE "类型:" -#define STR_IMG_FORMAT "镜像格式:" -#define STR_BLOCK_SIZE "块大小:" +#define STR_SPECIFY "指定(&S)..." +#define STR_SECTORS "扇区(S):" +#define STR_HEADS "磁头(H):" +#define STR_CYLS "柱面(C):" +#define STR_SIZE_MB "大小 (MB):" +#define STR_TYPE "类型:" +#define STR_IMG_FORMAT "镜像格式:" +#define STR_BLOCK_SIZE "块大小:" -#define STR_FLOPPY_DRIVES "软盘驱动器:" -#define STR_TURBO "加速时序" -#define STR_CHECKBPB "检查 BPB" -#define STR_CDROM_DRIVES "光盘驱动器:" -#define STR_CD_SPEED "速度:" -#define STR_EARLY "早先的驱动器" +#define STR_FLOPPY_DRIVES "软盘驱动器:" +#define STR_TURBO "加速时序" +#define STR_CHECKBPB "检查 BPB" +#define STR_CDROM_DRIVES "光盘驱动器:" +#define STR_CD_SPEED "速度:" +#define STR_EARLY "早先的驱动器" -#define STR_MO_DRIVES "磁光盘驱动器:" -#define STR_ZIP_DRIVES "ZIP 驱动器:" -#define STR_250 "ZIP 250" +#define STR_MO_DRIVES "磁光盘驱动器:" +#define STR_ZIP_DRIVES "ZIP 驱动器:" +#define STR_250 "ZIP 250" -#define STR_ISARTC "ISA 实时时钟:" -#define STR_ISAMEM "ISA 内存扩充" -#define STR_ISAMEM_1 "扩展卡 1:" -#define STR_ISAMEM_2 "扩展卡 2:" -#define STR_ISAMEM_3 "扩展卡 3:" -#define STR_ISAMEM_4 "扩展卡 4:" -#define STR_BUGGER "ISABugger 设备" -#define STR_POSTCARD "自检 (POST) 卡" +#define STR_ISARTC "ISA 实时时钟:" +#define STR_ISAMEM "ISA 内存扩充" +#define STR_ISAMEM_1 "扩展卡 1:" +#define STR_ISAMEM_2 "扩展卡 2:" +#define STR_ISAMEM_3 "扩展卡 3:" +#define STR_ISAMEM_4 "扩展卡 4:" +#define STR_BUGGER "ISABugger 设备" +#define STR_POSTCARD "自检 (POST) 卡" -#define FONT_SIZE 9 -#define FONT_NAME "Microsoft YaHei" +#define FONT_SIZE 9 +#define FONT_NAME "Microsoft YaHei" #include "dialogs.rc" @@ -394,149 +394,149 @@ END STRINGTABLE DISCARDABLE BEGIN - 2048 "86Box" - IDS_2049 "错误" - IDS_2050 "致命错误" - IDS_2051 " - 已暂停" - IDS_2052 "按下 Ctrl+Alt+PgDn 返回到窗口模式。" - IDS_2053 "速度" - IDS_2054 "ZIP %03i %i (%s): %ls" - IDS_2055 "ZIP 镜像 (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" - IDS_2056 "86Box 找不到任何可用的 ROM 镜像。\n\n请下载ROM 包并将其解压到 ""roms"" 文件夹。" - IDS_2057 "(空)" - IDS_2058 "ZIP 镜像 (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0所有文件 (*.*)\0*.*\0" - IDS_2059 "加速" - IDS_2060 "开" - IDS_2061 "关" - IDS_2062 "所有镜像 (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0基本扇区镜像 (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0表面镜像 (*.86F)\0*.86F\0" - IDS_2063 "由于 roms/machines 文件夹中缺少合适的 ROM,机型 ""%hs"" 不可用。将切换到其他可用机型。" + 2048 "86Box" + IDS_2049 "错误" + IDS_2050 "致命错误" + IDS_2051 " - 已暂停" + IDS_2052 "按下 Ctrl+Alt+PgDn 返回到窗口模式。" + IDS_2053 "速度" + IDS_2054 "ZIP %03i %i (%s): %ls" + IDS_2055 "ZIP 镜像 (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" + IDS_2056 "86Box 找不到任何可用的 ROM 镜像。\n\n请下载ROM 包并将其解压到 ""roms"" 文件夹。" + IDS_2057 "(空)" + IDS_2058 "ZIP 镜像 (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0所有文件 (*.*)\0*.*\0" + IDS_2059 "加速" + IDS_2060 "开" + IDS_2061 "关" + IDS_2062 "所有镜像 (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0基本扇区镜像 (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0表面镜像 (*.86F)\0*.86F\0" + IDS_2063 "由于 roms/machines 文件夹中缺少合适的 ROM,机型 ""%hs"" 不可用。将切换到其他可用机型。" END STRINGTABLE DISCARDABLE BEGIN - IDS_2064 "由于 roms/video 文件夹中缺少合适的 ROM,显卡 ""%hs"" 不可用。将切换到其他可用显卡。" - IDS_2065 "机型" - IDS_2066 "显示" - IDS_2067 "输入设备" - IDS_2068 "声音" - IDS_2069 "网络" - IDS_2070 "端口 (COM 和 LPT)" - IDS_2071 "存储控制器" - IDS_2072 "硬盘" - IDS_2073 "软盘/光盘驱动器" - IDS_2074 "其他可移动设备" - IDS_2075 "其他外围设备" - IDS_2076 "表面镜像 (*.86F)\0*.86F\0" - IDS_2077 "单击窗口捕捉鼠标" - IDS_2078 "按下 F8+F12 释放鼠标" - IDS_2079 "按下 F8+F12 或鼠标中键释放鼠标" + IDS_2064 "由于 roms/video 文件夹中缺少合适的 ROM,显卡 ""%hs"" 不可用。将切换到其他可用显卡。" + IDS_2065 "机型" + IDS_2066 "显示" + IDS_2067 "输入设备" + IDS_2068 "声音" + IDS_2069 "网络" + IDS_2070 "端口 (COM 和 LPT)" + IDS_2071 "存储控制器" + IDS_2072 "硬盘" + IDS_2073 "软盘/光盘驱动器" + IDS_2074 "其他可移动设备" + IDS_2075 "其他外围设备" + IDS_2076 "表面镜像 (*.86F)\0*.86F\0" + IDS_2077 "单击窗口捕捉鼠标" + IDS_2078 "按下 F8+F12 释放鼠标" + IDS_2079 "按下 F8+F12 或鼠标中键释放鼠标" END STRINGTABLE DISCARDABLE BEGIN - IDS_2080 "无法初始化 FluidSynth" - IDS_2081 "总线" - IDS_2082 "文件" - IDS_2083 "C" - IDS_2084 "H" - IDS_2085 "S" - IDS_2086 "MB" + IDS_2080 "无法初始化 FluidSynth" + IDS_2081 "总线" + IDS_2082 "文件" + IDS_2083 "C" + IDS_2084 "H" + IDS_2085 "S" + IDS_2086 "MB" IDS_2087 "Speed" - IDS_2088 "检查 BPB" - IDS_2089 "KB" - IDS_2090 "无法初始化视频渲染器。" - IDS_2091 "默认" - IDS_2092 "%i 等待状态 (WS)" - IDS_2093 "类型" - IDS_2094 "设置 PCap 失败" - IDS_2095 "未找到 PCap 设备" - IDS_2096 "无效 PCap 设备" - IDS_2097 "标准 2 键操纵杆" - IDS_2098 "标准 4 键操纵杆" - IDS_2099 "标准 6 键操纵杆" - IDS_2100 "标准 8 键操纵杆" - IDS_2101 "CH Flightstick Pro" - IDS_2102 "Microsoft SideWinder Pad" - IDS_2103 "Thrustmaster Flight Control System" - IDS_2104 "无" - IDS_2105 "无法加载键盘加速器。" - IDS_2106 "无法注册原始输入。" - IDS_2107 "%u" - IDS_2108 "%u MB (CHS: %i, %i, %i)" - IDS_2109 "软盘 %i (%s): %ls" - IDS_2110 "所有镜像 (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0高级扇区镜像 (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0基本扇区镜像 (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Flux 镜像 (*.FDI)\0*.FDI\0表面镜像 (*.86F;*.MFM)\0*.86F;*.MFM\0所有文件 (*.*)\0*.*\0" - IDS_2111 "无法初始化 FreeType" - IDS_2112 "无法初始化 SDL,需要 SDL2.dll" - IDS_2113 "确定要硬重置模拟器吗?" - IDS_2114 "确定要退出 86Box 吗?" - IDS_2115 "无法初始化 Ghostscript" - IDS_2116 "磁光盘 %i (%ls): %ls" - IDS_2117 "磁光盘镜像 (*.IM?;*.MDI)\0*.IM?;*.MDI\0所有文件 (*.*)\0*.*\0" - IDS_2118 "欢迎使用 86Box!" - IDS_2119 "内部控制器" - IDS_2120 "退出" - IDS_2121 "找不到 ROM" - IDS_2122 "要保存设置吗?" - IDS_2123 "此操作将硬重置模拟器。" - IDS_2124 "保存" - IDS_2125 "关于 86Box" - IDS_2126 "86Box v" EMU_VERSION + IDS_2088 "检查 BPB" + IDS_2089 "KB" + IDS_2090 "无法初始化视频渲染器。" + IDS_2091 "默认" + IDS_2092 "%i 等待状态 (WS)" + IDS_2093 "类型" + IDS_2094 "设置 PCap 失败" + IDS_2095 "未找到 PCap 设备" + IDS_2096 "无效 PCap 设备" + IDS_2097 "标准 2 键操纵杆" + IDS_2098 "标准 4 键操纵杆" + IDS_2099 "标准 6 键操纵杆" + IDS_2100 "标准 8 键操纵杆" + IDS_2101 "CH Flightstick Pro" + IDS_2102 "Microsoft SideWinder Pad" + IDS_2103 "Thrustmaster Flight Control System" + IDS_2104 "无" + IDS_2105 "无法加载键盘加速器。" + IDS_2106 "无法注册原始输入。" + IDS_2107 "%u" + IDS_2108 "%u MB (CHS: %i, %i, %i)" + IDS_2109 "软盘 %i (%s): %ls" + IDS_2110 "所有镜像 (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0高级扇区镜像 (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0基本扇区镜像 (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Flux 镜像 (*.FDI)\0*.FDI\0表面镜像 (*.86F;*.MFM)\0*.86F;*.MFM\0所有文件 (*.*)\0*.*\0" + IDS_2111 "无法初始化 FreeType" + IDS_2112 "无法初始化 SDL,需要 SDL2.dll" + IDS_2113 "确定要硬重置模拟器吗?" + IDS_2114 "确定要退出 86Box 吗?" + IDS_2115 "无法初始化 Ghostscript" + IDS_2116 "磁光盘 %i (%ls): %ls" + IDS_2117 "磁光盘镜像 (*.IM?;*.MDI)\0*.IM?;*.MDI\0所有文件 (*.*)\0*.*\0" + IDS_2118 "欢迎使用 86Box!" + IDS_2119 "内部控制器" + IDS_2120 "退出" + IDS_2121 "找不到 ROM" + IDS_2122 "要保存设置吗?" + IDS_2123 "此操作将硬重置模拟器。" + IDS_2124 "保存" + IDS_2125 "关于 86Box" + IDS_2126 "86Box v" EMU_VERSION - IDS_2127 "一个旧式计算机模拟器\n\n作者: Sarah Walker、Miran Grca、Fred N. van Kempen (waltje)、SA1988、Tiseno100、reenigne、leilei、JohnElliott、greatpsycho 等人。\n\n本软件依据 GNU 通用公共许可证第二版或更新版本发布。详情见 LICENSE 文件。" - IDS_2128 "确定" - IDS_2129 "硬件不可用" + IDS_2127 "一个旧式计算机模拟器\n\n作者: Sarah Walker、Miran Grca、Fred N. van Kempen (waltje)、SA1988、Tiseno100、reenigne、leilei、JohnElliott、greatpsycho 等人。\n\n本软件依据 GNU 通用公共许可证第二版或更新版本发布。详情见 LICENSE 文件。" + IDS_2128 "确定" + IDS_2129 "硬件不可用" #ifdef _WIN32 #define LIB_NAME_PCAP "WinPcap" #else #define LIB_NAME_PCAP "libpcap" #endif - IDS_2130 "请确认 " LIB_NAME_PCAP " 已安装且使用兼容 " LIB_NAME_PCAP " 的网络连接。" - IDS_2131 "无效配置" + IDS_2130 "请确认 " LIB_NAME_PCAP " 已安装且使用兼容 " LIB_NAME_PCAP " 的网络连接。" + IDS_2131 "无效配置" #ifdef _WIN32 #define LIB_NAME_FREETYPE "freetype.dll" #else #define LIB_NAME_FREETYPE "libfreetype" #endif - IDS_2132 "ESC/P 打印机模拟需要" LIB_NAME_FREETYPE + IDS_2132 "ESC/P 打印机模拟需要" LIB_NAME_FREETYPE #ifdef _WIN32 #define LIB_NAME_GS "gsdll32.dll" #else #define LIB_NAME_GS "libgs" #endif - IDS_2133 LIB_NAME_GS " 是将 PostScript 文件转换为 PDF 所需要的库。\n\n使用通用 PostScript 打印机打印的文档将被保存为 PostScript (.ps) 文件。" + IDS_2133 LIB_NAME_GS " 是将 PostScript 文件转换为 PDF 所需要的库。\n\n使用通用 PostScript 打印机打印的文档将被保存为 PostScript (.ps) 文件。" #ifdef _WIN32 #define LIB_NAME_FLUIDSYNTH "libfluidsynth.dll" #else #define LIB_NAME_FLUIDSYNTH "libfluidsynth" #endif - IDS_2134 "FluidSynth MIDI 输出需要" LIB_NAME_FLUIDSYNTH - IDS_2135 "正在进入全屏模式" - IDS_2136 "不要再显示此消息" - IDS_2137 "不退出" - IDS_2138 "重置" - IDS_2139 "不重置" - IDS_2140 "磁光盘镜像 (*.IM?;*.MDI)\0*.IM?;*.MDI\0所有文件 (*.*)\0*.*\0" - IDS_2141 "光盘镜像 (*.ISO;*.CUE)\0*.ISO;*.CUE\0所有文件 (*.*)\0*.*\0" - IDS_2142 "%hs 设备配置" + IDS_2134 "FluidSynth MIDI 输出需要" LIB_NAME_FLUIDSYNTH + IDS_2135 "正在进入全屏模式" + IDS_2136 "不要再显示此消息" + IDS_2137 "不退出" + IDS_2138 "重置" + IDS_2139 "不重置" + IDS_2140 "磁光盘镜像 (*.IM?;*.MDI)\0*.IM?;*.MDI\0所有文件 (*.*)\0*.*\0" + IDS_2141 "光盘镜像 (*.ISO;*.CUE)\0*.ISO;*.CUE\0所有文件 (*.*)\0*.*\0" + IDS_2142 "%hs 设备配置" IDS_2143 "显示器处在睡眠状态" - IDS_2144 "OpenGL 着色器 (*.GLSL)\0*.GLSL\0所有文件 (*.*)\0*.*\0" - IDS_2145 "OpenGL 选项" - IDS_2146 "正在载入一个不受支持的配置" - IDS_2147 "此模拟计算机禁用了基于选定计算机的 CPU 类型过滤。\n\n能够选中与所选机器本不兼容的 CPU,但是可能会遇到与机器 BIOS 或其他软件不兼容的问题。\n\n启用此设置不受官方支持,并且提交的任何错误报告可能会视为无效而关闭。" - IDS_2148 "继续" - IDS_2149 "磁带: %s" - IDS_2150 "磁带镜像 (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0所有文件 (*.*)\0*.*\0" - IDS_2151 "卡带 %i: %ls" - IDS_2152 "卡带镜像 (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0所有文件 (*.*)\0*.*\0" - IDS_2153 "初始化渲染器时出错" - IDS_2154 "无法初始化 OpenGL (3.0 核心) 渲染器。请使用其他渲染器。" - IDS_2155 "恢复执行" - IDS_2156 "暂停执行" - IDS_2157 "按下 Ctrl+Alt+Del" - IDS_2158 "按下 Ctrl+Alt+Esc" - IDS_2159 "硬重置" - IDS_2160 "ACPI 关机" - IDS_2161 "设置" + IDS_2144 "OpenGL 着色器 (*.GLSL)\0*.GLSL\0所有文件 (*.*)\0*.*\0" + IDS_2145 "OpenGL 选项" + IDS_2146 "正在载入一个不受支持的配置" + IDS_2147 "此模拟计算机禁用了基于选定计算机的 CPU 类型过滤。\n\n能够选中与所选机器本不兼容的 CPU,但是可能会遇到与机器 BIOS 或其他软件不兼容的问题。\n\n启用此设置不受官方支持,并且提交的任何错误报告可能会视为无效而关闭。" + IDS_2148 "继续" + IDS_2149 "磁带: %s" + IDS_2150 "磁带镜像 (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0所有文件 (*.*)\0*.*\0" + IDS_2151 "卡带 %i: %ls" + IDS_2152 "卡带镜像 (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0所有文件 (*.*)\0*.*\0" + IDS_2153 "初始化渲染器时出错" + IDS_2154 "无法初始化 OpenGL (3.0 核心) 渲染器。请使用其他渲染器。" + IDS_2155 "恢复执行" + IDS_2156 "暂停执行" + IDS_2157 "按下 Ctrl+Alt+Del" + IDS_2158 "按下 Ctrl+Alt+Esc" + IDS_2159 "硬重置" + IDS_2160 "ACPI 关机" + IDS_2161 "设置" IDS_2162 "早先的驱动器" IDS_2163 "No Dynarec" IDS_2164 "Old Dynarec" @@ -547,45 +547,45 @@ END STRINGTABLE DISCARDABLE BEGIN IDS_4096 "硬盘 (%s)" - IDS_4097 "%01i:%01i" - IDS_4098 "%01i" - IDS_4099 "不存在 MFM/RLL 或 ESDI CD-ROM 驱动器" - IDS_4100 "自定义..." - IDS_4101 "自定义 (大容量)..." - IDS_4102 "添加新硬盘" - IDS_4103 "添加已存在的硬盘" - IDS_4104 "HDI 磁盘镜像不能超过 4 GB。" - IDS_4105 "磁盘镜像不能超过 127 GB。" - IDS_4106 "硬盘镜像 (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0所有文件 (*.*)\0*.*\0" - IDS_4107 "无法读取文件" - IDS_4108 "无法写入文件" - IDS_4109 "不支持非 512 字节扇区大小的 HDI 或 HDX 镜像。" - IDS_4110 "尚未支持 USB" - IDS_4111 "磁盘镜像文件已存在" - IDS_4112 "请指定有效的文件名。" - IDS_4113 "已创建磁盘镜像" - IDS_4114 "请确定此文件已存在并可读取。" - IDS_4115 "请确定此文件保存在可写目录中。" - IDS_4116 "磁盘镜像太大" - IDS_4117 "请记得为新创建的镜像分区并格式化。" - IDS_4118 "选定的文件将被覆盖。确定继续使用此文件吗?" - IDS_4119 "不支持的磁盘镜像" - IDS_4120 "覆盖" - IDS_4121 "不覆盖" - IDS_4122 "原始镜像 (.img)" - IDS_4123 "HDI 镜像 (.hdi)" - IDS_4124 "HDX 镜像 (.hdx)" - IDS_4125 "固定大小 VHD (.vhd)" - IDS_4126 "动态大小 VHD (.vhd)" - IDS_4127 "差分 VHD (.vhd)" - IDS_4128 "大块 (2 MB)" - IDS_4129 "小块 (512 KB)" - IDS_4130 "VHD 文件 (*.VHD)\0*.VHD\0所有文件 (*.*)\0*.*\0" - IDS_4131 "选择父 VHD 文件" - IDS_4132 "父映像可能在创建差异镜像后被修改。\n\n如果镜像文件被移动或复制,或创建此磁盘的程序中存在错误,也可能发生这种情况。\n\n是否需要修复时间戳?" - IDS_4133 "父盘与子盘的时间戳不匹配" - IDS_4134 "无法修复 VHD 时间戳。" - IDS_4135 "%01i:%02i" + IDS_4097 "%01i:%01i" + IDS_4098 "%01i" + IDS_4099 "不存在 MFM/RLL 或 ESDI CD-ROM 驱动器" + IDS_4100 "自定义..." + IDS_4101 "自定义 (大容量)..." + IDS_4102 "添加新硬盘" + IDS_4103 "添加已存在的硬盘" + IDS_4104 "HDI 磁盘镜像不能超过 4 GB。" + IDS_4105 "磁盘镜像不能超过 127 GB。" + IDS_4106 "硬盘镜像 (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0所有文件 (*.*)\0*.*\0" + IDS_4107 "无法读取文件" + IDS_4108 "无法写入文件" + IDS_4109 "不支持非 512 字节扇区大小的 HDI 或 HDX 镜像。" + IDS_4110 "尚未支持 USB" + IDS_4111 "磁盘镜像文件已存在" + IDS_4112 "请指定有效的文件名。" + IDS_4113 "已创建磁盘镜像" + IDS_4114 "请确定此文件已存在并可读取。" + IDS_4115 "请确定此文件保存在可写目录中。" + IDS_4116 "磁盘镜像太大" + IDS_4117 "请记得为新创建的镜像分区并格式化。" + IDS_4118 "选定的文件将被覆盖。确定继续使用此文件吗?" + IDS_4119 "不支持的磁盘镜像" + IDS_4120 "覆盖" + IDS_4121 "不覆盖" + IDS_4122 "原始镜像 (.img)" + IDS_4123 "HDI 镜像 (.hdi)" + IDS_4124 "HDX 镜像 (.hdx)" + IDS_4125 "固定大小 VHD (.vhd)" + IDS_4126 "动态大小 VHD (.vhd)" + IDS_4127 "差分 VHD (.vhd)" + IDS_4128 "大块 (2 MB)" + IDS_4129 "小块 (512 KB)" + IDS_4130 "VHD 文件 (*.VHD)\0*.VHD\0所有文件 (*.*)\0*.*\0" + IDS_4131 "选择父 VHD 文件" + IDS_4132 "父映像可能在创建差异镜像后被修改。\n\n如果镜像文件被移动或复制,或创建此磁盘的程序中存在错误,也可能发生这种情况。\n\n是否需要修复时间戳?" + IDS_4133 "父盘与子盘的时间戳不匹配" + IDS_4134 "无法修复 VHD 时间戳。" + IDS_4135 "%01i:%02i" IDS_4352 "MFM/RLL" IDS_4353 "XTA" @@ -594,56 +594,56 @@ BEGIN IDS_4356 "ATAPI" IDS_4357 "SCSI" - IDS_4608 "MFM/RLL (%01i:%01i)" - IDS_4609 "XTA (%01i:%01i)" - IDS_4610 "ESDI (%01i:%01i)" - IDS_4611 "IDE (%01i:%01i)" - IDS_4612 "ATAPI (%01i:%01i)" - IDS_4613 "SCSI (%01i:%02i)" + IDS_4608 "MFM/RLL (%01i:%01i)" + IDS_4609 "XTA (%01i:%01i)" + IDS_4610 "ESDI (%01i:%01i)" + IDS_4611 "IDE (%01i:%01i)" + IDS_4612 "ATAPI (%01i:%01i)" + IDS_4613 "SCSI (%01i:%02i)" - IDS_5120 "光盘 %i (%s): %s" + IDS_5120 "光盘 %i (%s): %s" - IDS_5376 "禁用" - IDS_5381 "ATAPI" + IDS_5376 "禁用" + IDS_5381 "ATAPI" IDS_5382 "SCSI" - IDS_5632 "禁用" - IDS_5637 "ATAPI (%01i:%01i)" + IDS_5632 "禁用" + IDS_5637 "ATAPI (%01i:%01i)" IDS_5638 "SCSI (%01i:%02i)" - IDS_5888 "160 kB" - IDS_5889 "180 kB" - IDS_5890 "320 kB" - IDS_5891 "360 kB" - IDS_5892 "640 kB" - IDS_5893 "720 kB" - IDS_5894 "1.2 MB" - IDS_5895 "1.25 MB" - IDS_5896 "1.44 MB" - IDS_5897 "DMF (1024 簇)" - IDS_5898 "DMF (2048 簇)" - IDS_5899 "2.88 MB" - IDS_5900 "ZIP 100" - IDS_5901 "ZIP 250" - IDS_5902 "3.5 英寸 128 MB (ISO 10090)" - IDS_5903 "3.5 英寸 230 MB (ISO 13963)" - IDS_5904 "3.5 英寸 540 MB (ISO 15498)" - IDS_5905 "3.5 英寸 640 MB (ISO 15498)" - IDS_5906 "3.5 英寸 1.3 GB (GigaMO)" - IDS_5907 "3.5 英寸 2.3 GB (GigaMO 2)" - IDS_5908 "5.25 英寸 600 MB" - IDS_5909 "5.25 英寸 650 MB" - IDS_5910 "5.25 英寸 1 GB" - IDS_5911 "5.25 英寸 1.3 GB" + IDS_5888 "160 kB" + IDS_5889 "180 kB" + IDS_5890 "320 kB" + IDS_5891 "360 kB" + IDS_5892 "640 kB" + IDS_5893 "720 kB" + IDS_5894 "1.2 MB" + IDS_5895 "1.25 MB" + IDS_5896 "1.44 MB" + IDS_5897 "DMF (1024 簇)" + IDS_5898 "DMF (2048 簇)" + IDS_5899 "2.88 MB" + IDS_5900 "ZIP 100" + IDS_5901 "ZIP 250" + IDS_5902 "3.5 英寸 128 MB (ISO 10090)" + IDS_5903 "3.5 英寸 230 MB (ISO 13963)" + IDS_5904 "3.5 英寸 540 MB (ISO 15498)" + IDS_5905 "3.5 英寸 640 MB (ISO 15498)" + IDS_5906 "3.5 英寸 1.3 GB (GigaMO)" + IDS_5907 "3.5 英寸 2.3 GB (GigaMO 2)" + IDS_5908 "5.25 英寸 600 MB" + IDS_5909 "5.25 英寸 650 MB" + IDS_5910 "5.25 英寸 1 GB" + IDS_5911 "5.25 英寸 1.3 GB" - IDS_6144 "标准转速 (RPM)" - IDS_6145 "低于标准转速的 1%" - IDS_6146 "低于标准转速的 1.5%" - IDS_6147 "低于标准转速的 2%" + IDS_6144 "标准转速 (RPM)" + IDS_6145 "低于标准转速的 1%" + IDS_6146 "低于标准转速的 1.5%" + IDS_6147 "低于标准转速的 2%" - IDS_7168 "(系统默认)" + IDS_7168 "(系统默认)" END -#define IDS_LANG_ENUS IDS_7168 +#define IDS_LANG_ENUS IDS_7168 // Simplified Chinese resources ///////////////////////////////////////////////////////////////////////////// diff --git a/src/win/languages/zh-TW.rc b/src/win/languages/zh-TW.rc index 9294b1fbd..5325f0815 100644 --- a/src/win/languages/zh-TW.rc +++ b/src/win/languages/zh-TW.rc @@ -17,13 +17,13 @@ MainMenu MENU DISCARDABLE BEGIN POPUP "動作(&A)" BEGIN - MENUITEM "鍵盤需要捕捉(&K)", IDM_ACTION_KBD_REQ_CAPTURE - MENUITEM "將右 CTRL 鍵映射為左 ALT 鍵(&R)", IDM_ACTION_RCTRL_IS_LALT + MENUITEM "鍵盤需要捕捉(&K)", IDM_ACTION_KBD_REQ_CAPTURE + MENUITEM "將右 CTRL 鍵映射為左 ALT 鍵(&R)", IDM_ACTION_RCTRL_IS_LALT MENUITEM SEPARATOR MENUITEM "硬重設(&H)...", IDM_ACTION_HRESET MENUITEM "Ctrl+Alt+Del(&C)\tCtrl+F12", IDM_ACTION_RESET_CAD MENUITEM SEPARATOR - MENUITEM "Ctrl+Alt+Esc(&E)", IDM_ACTION_CTRL_ALT_ESC + MENUITEM "Ctrl+Alt+Esc(&E)", IDM_ACTION_CTRL_ALT_ESC MENUITEM SEPARATOR MENUITEM "暫停(&P)", IDM_ACTION_PAUSE MENUITEM SEPARATOR @@ -31,8 +31,8 @@ BEGIN END POPUP "檢視(&V)" BEGIN - MENUITEM "隱藏狀態列(&H)", IDM_VID_HIDE_STATUS_BAR - MENUITEM "隱藏工具列(&T)", IDM_VID_HIDE_TOOLBAR + MENUITEM "隱藏狀態列(&H)", IDM_VID_HIDE_STATUS_BAR + MENUITEM "隱藏工具列(&T)", IDM_VID_HIDE_TOOLBAR MENUITEM SEPARATOR MENUITEM "Show non-primary monitors(&S)", IDM_VID_MONITORS MENUITEM "視窗大小可調(&R)", IDM_VID_RESIZE @@ -101,11 +101,11 @@ BEGIN MENUITEM "CGA/PCjr/Tandy/EGA/(S)VGA 過掃描(&G)", IDM_VID_OVERSCAN MENUITEM "變更單色顯示對比度(&M)", IDM_VID_CGACON END - MENUITEM "介質(&M)", IDM_MEDIA + MENUITEM "介質(&M)", IDM_MEDIA POPUP "工具(&T)" BEGIN MENUITEM "設定(&S)...", IDM_CONFIG - MENUITEM "更新狀態列圖示(&U)", IDM_UPDATE_ICONS + MENUITEM "更新狀態列圖示(&U)", IDM_UPDATE_ICONS MENUITEM SEPARATOR MENUITEM "擷圖(&C)\tCtrl+F11", IDM_ACTION_SCREENSHOT MENUITEM SEPARATOR @@ -137,17 +137,17 @@ CassetteSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "新增鏡像(&N)...", IDM_CASSETTE_IMAGE_NEW + MENUITEM "新增鏡像(&N)...", IDM_CASSETTE_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "開啟已存在的鏡像(&E)...", IDM_CASSETTE_IMAGE_EXISTING - MENUITEM "開啟已存在的鏡像並寫保護(&W)...", IDM_CASSETTE_IMAGE_EXISTING_WP + MENUITEM "開啟已存在的鏡像(&E)...", IDM_CASSETTE_IMAGE_EXISTING + MENUITEM "開啟已存在的鏡像並寫保護(&W)...", IDM_CASSETTE_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "錄製(&R)", IDM_CASSETTE_RECORD - MENUITEM "播放(&P)", IDM_CASSETTE_PLAY - MENUITEM "倒帶至起點(&R)", IDM_CASSETTE_REWIND - MENUITEM "快進至終點(&F)", IDM_CASSETTE_FAST_FORWARD + MENUITEM "錄製(&R)", IDM_CASSETTE_RECORD + MENUITEM "播放(&P)", IDM_CASSETTE_PLAY + MENUITEM "倒帶至起點(&R)", IDM_CASSETTE_REWIND + MENUITEM "快進至終點(&F)", IDM_CASSETTE_FAST_FORWARD MENUITEM SEPARATOR - MENUITEM "彈出(&J)", IDM_CASSETTE_EJECT + MENUITEM "彈出(&J)", IDM_CASSETTE_EJECT END END @@ -155,9 +155,9 @@ CartridgeSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "鏡像(&I)...", IDM_CARTRIDGE_IMAGE + MENUITEM "鏡像(&I)...", IDM_CARTRIDGE_IMAGE MENUITEM SEPARATOR - MENUITEM "彈出(&J)", IDM_CARTRIDGE_EJECT + MENUITEM "彈出(&J)", IDM_CARTRIDGE_EJECT END END @@ -165,14 +165,14 @@ FloppySubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "新增鏡像(&N)...", IDM_FLOPPY_IMAGE_NEW + MENUITEM "新增鏡像(&N)...", IDM_FLOPPY_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "開啟已存在的鏡像(&E)...", IDM_FLOPPY_IMAGE_EXISTING - MENUITEM "開啟已存在的鏡像並寫保護(&W)...", IDM_FLOPPY_IMAGE_EXISTING_WP + MENUITEM "開啟已存在的鏡像(&E)...", IDM_FLOPPY_IMAGE_EXISTING + MENUITEM "開啟已存在的鏡像並寫保護(&W)...", IDM_FLOPPY_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "匯出為 86F 格式(&x)...", IDM_FLOPPY_EXPORT_TO_86F + MENUITEM "匯出為 86F 格式(&x)...", IDM_FLOPPY_EXPORT_TO_86F MENUITEM SEPARATOR - MENUITEM "彈出(&J)", IDM_FLOPPY_EJECT + MENUITEM "彈出(&J)", IDM_FLOPPY_EJECT END END @@ -180,13 +180,13 @@ CdromSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "靜音(&M)", IDM_CDROM_MUTE + MENUITEM "靜音(&M)", IDM_CDROM_MUTE MENUITEM SEPARATOR - MENUITEM "空置光碟機(&M)", IDM_CDROM_EMPTY - MENUITEM "載入上一個鏡像(&R)", IDM_CDROM_RELOAD + MENUITEM "空置光碟機(&M)", IDM_CDROM_EMPTY + MENUITEM "載入上一個鏡像(&R)", IDM_CDROM_RELOAD MENUITEM SEPARATOR - MENUITEM "鏡像(&I)...", IDM_CDROM_IMAGE - MENUITEM "資料夾(&F)...", IDM_CDROM_DIR + MENUITEM "鏡像(&I)...", IDM_CDROM_IMAGE + MENUITEM "資料夾(&F)...", IDM_CDROM_DIR END END @@ -194,13 +194,13 @@ ZIPSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "新增鏡像(&N)...", IDM_ZIP_IMAGE_NEW + MENUITEM "新增鏡像(&N)...", IDM_ZIP_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "開啟已存在的鏡像(&E)...", IDM_ZIP_IMAGE_EXISTING - MENUITEM "開啟已存在的鏡像並寫保護(&W)...", IDM_ZIP_IMAGE_EXISTING_WP + MENUITEM "開啟已存在的鏡像(&E)...", IDM_ZIP_IMAGE_EXISTING + MENUITEM "開啟已存在的鏡像並寫保護(&W)...", IDM_ZIP_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "彈出(&J)", IDM_ZIP_EJECT - MENUITEM "載入上一個鏡像(&R)", IDM_ZIP_RELOAD + MENUITEM "彈出(&J)", IDM_ZIP_EJECT + MENUITEM "載入上一個鏡像(&R)", IDM_ZIP_RELOAD END END @@ -208,13 +208,13 @@ MOSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "新增鏡像(&N)...", IDM_MO_IMAGE_NEW + MENUITEM "新增鏡像(&N)...", IDM_MO_IMAGE_NEW MENUITEM SEPARATOR - MENUITEM "開啟已存在的鏡像(&E)...", IDM_MO_IMAGE_EXISTING - MENUITEM "開啟已存在的鏡像並寫保護(&W)...", IDM_MO_IMAGE_EXISTING_WP + MENUITEM "開啟已存在的鏡像(&E)...", IDM_MO_IMAGE_EXISTING + MENUITEM "開啟已存在的鏡像並寫保護(&W)...", IDM_MO_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "鏡像(&J)", IDM_MO_EJECT - MENUITEM "載入上一個鏡像(&R)", IDM_MO_RELOAD + MENUITEM "鏡像(&J)", IDM_MO_EJECT + MENUITEM "載入上一個鏡像(&R)", IDM_MO_RELOAD END END @@ -240,150 +240,150 @@ END // Dialog // -#define STR_PREFERENCES "首選項" -#define STR_SND_GAIN "音量增益" -#define STR_NEW_FLOPPY "新增鏡像" -#define STR_CONFIG "設定" -#define STR_SPECIFY_DIM "指定主視窗大小" +#define STR_PREFERENCES "首選項" +#define STR_SND_GAIN "音量增益" +#define STR_NEW_FLOPPY "新增鏡像" +#define STR_CONFIG "設定" +#define STR_SPECIFY_DIM "指定主視窗大小" -#define STR_OK "確定" -#define STR_CANCEL "取消" -#define STR_GLOBAL "將以上設定存儲為全局預設值(&G)" -#define STR_DEFAULT "預設(&D)" -#define STR_LANGUAGE "語言:" -#define STR_ICONSET "圖示集:" +#define STR_OK "確定" +#define STR_CANCEL "取消" +#define STR_GLOBAL "將以上設定存儲為全局預設值(&G)" +#define STR_DEFAULT "預設(&D)" +#define STR_LANGUAGE "語言:" +#define STR_ICONSET "圖示集:" -#define STR_GAIN "增益" +#define STR_GAIN "增益" -#define STR_FILE_NAME "檔案名:" -#define STR_DISK_SIZE "磁碟大小:" -#define STR_RPM_MODE "轉速 (RPM) 模式:" -#define STR_PROGRESS "進度:" +#define STR_FILE_NAME "檔案名:" +#define STR_DISK_SIZE "磁碟大小:" +#define STR_RPM_MODE "轉速 (RPM) 模式:" +#define STR_PROGRESS "進度:" -#define STR_WIDTH "寬度:" -#define STR_HEIGHT "高度:" -#define STR_LOCK_TO_SIZE "鎖定此大小" +#define STR_WIDTH "寬度:" +#define STR_HEIGHT "高度:" +#define STR_LOCK_TO_SIZE "鎖定此大小" -#define STR_MACHINE_TYPE "機器類型:" -#define STR_MACHINE "機型:" -#define STR_CONFIGURE "配置" -#define STR_CPU_TYPE "CPU 類型:" -#define STR_CPU_SPEED "速度:" -#define STR_FPU "浮點處理器 (FPU):" -#define STR_WAIT_STATES "等待狀態 (WS):" -#define STR_MB "MB" -#define STR_MEMORY "記憶體:" -#define STR_TIME_SYNC "時間同步" -#define STR_DISABLED "禁用" -#define STR_ENABLED_LOCAL "啟用 (本地時間)" -#define STR_ENABLED_UTC "啟用 (UTC)" -#define STR_DYNAREC "動態重編譯器" +#define STR_MACHINE_TYPE "機器類型:" +#define STR_MACHINE "機型:" +#define STR_CONFIGURE "配置" +#define STR_CPU_TYPE "CPU 類型:" +#define STR_CPU_SPEED "速度:" +#define STR_FPU "浮點處理器 (FPU):" +#define STR_WAIT_STATES "等待狀態 (WS):" +#define STR_MB "MB" +#define STR_MEMORY "記憶體:" +#define STR_TIME_SYNC "時間同步" +#define STR_DISABLED "禁用" +#define STR_ENABLED_LOCAL "啟用 (本地時間)" +#define STR_ENABLED_UTC "啟用 (UTC)" +#define STR_DYNAREC "動態重編譯器" -#define STR_VIDEO "顯示卡:" -#define STR_VIDEO_2 "顯示卡 2:" -#define STR_VOODOO "Voodoo Graphics" -#define STR_IBM8514 "IBM 8514/a Graphics" -#define STR_XGA "XGA Graphics" +#define STR_VIDEO "顯示卡:" +#define STR_VIDEO_2 "顯示卡 2:" +#define STR_VOODOO "Voodoo Graphics" +#define STR_IBM8514 "IBM 8514/a Graphics" +#define STR_XGA "XGA Graphics" -#define STR_MOUSE "滑鼠:" -#define STR_JOYSTICK "搖桿:" -#define STR_JOY1 "搖桿 1..." -#define STR_JOY2 "搖桿 2..." -#define STR_JOY3 "搖桿 3..." -#define STR_JOY4 "搖桿 4..." +#define STR_MOUSE "滑鼠:" +#define STR_JOYSTICK "搖桿:" +#define STR_JOY1 "搖桿 1..." +#define STR_JOY2 "搖桿 2..." +#define STR_JOY3 "搖桿 3..." +#define STR_JOY4 "搖桿 4..." -#define STR_SOUND1 "音訊卡 1:" -#define STR_SOUND2 "音訊卡 2:" -#define STR_SOUND3 "音訊卡 3:" -#define STR_SOUND4 "音訊卡 4:" -#define STR_MIDI_OUT "MIDI 輸出裝置:" -#define STR_MIDI_IN "MIDI 輸入裝置:" -#define STR_MPU401 "獨立 MPU-401" -#define STR_FLOAT "使用單精度浮點 (FLOAT32)" -#define STR_FM_DRIVER "調頻合成器驅動器" -#define STR_FM_DRV_NUKED "Nuked (更準確)" -#define STR_FM_DRV_YMFM "YMFM (更快)" +#define STR_SOUND1 "音訊卡 1:" +#define STR_SOUND2 "音訊卡 2:" +#define STR_SOUND3 "音訊卡 3:" +#define STR_SOUND4 "音訊卡 4:" +#define STR_MIDI_OUT "MIDI 輸出裝置:" +#define STR_MIDI_IN "MIDI 輸入裝置:" +#define STR_MPU401 "獨立 MPU-401" +#define STR_FLOAT "使用單精度浮點 (FLOAT32)" +#define STR_FM_DRIVER "調頻合成器驅動器" +#define STR_FM_DRV_NUKED "Nuked (更準確)" +#define STR_FM_DRV_YMFM "YMFM (更快)" -#define STR_NET_TYPE "網路類型:" -#define STR_PCAP "PCap 裝置:" -#define STR_NET "網路配接器:" -#define STR_NET1 "Network card 1:" -#define STR_NET2 "Network card 2:" -#define STR_NET3 "Network card 3:" -#define STR_NET4 "Network card 4:" +#define STR_NET_TYPE "網路類型:" +#define STR_PCAP "PCap 裝置:" +#define STR_NET "網路配接器:" +#define STR_NET1 "Network card 1:" +#define STR_NET2 "Network card 2:" +#define STR_NET3 "Network card 3:" +#define STR_NET4 "Network card 4:" -#define STR_COM1 "COM1 裝置:" -#define STR_COM2 "COM2 裝置:" -#define STR_COM3 "COM3 裝置:" -#define STR_COM4 "COM4 裝置:" -#define STR_LPT1 "LPT1 裝置:" -#define STR_LPT2 "LPT2 裝置:" -#define STR_LPT3 "LPT3 裝置:" -#define STR_LPT4 "LPT4 裝置:" -#define STR_SERIAL1 "序列埠 1" -#define STR_SERIAL2 "序列埠 2" -#define STR_SERIAL3 "序列埠 3" -#define STR_SERIAL4 "序列埠 4" -#define STR_PARALLEL1 "並列埠 1" -#define STR_PARALLEL2 "並列埠 2" -#define STR_PARALLEL3 "並列埠 3" -#define STR_PARALLEL4 "並列埠 4" -#define STR_SERIAL_PASS1 "Serial port passthrough 1" -#define STR_SERIAL_PASS2 "Serial port passthrough 2" -#define STR_SERIAL_PASS3 "Serial port passthrough 3" -#define STR_SERIAL_PASS4 "Serial port passthrough 4" +#define STR_COM1 "COM1 裝置:" +#define STR_COM2 "COM2 裝置:" +#define STR_COM3 "COM3 裝置:" +#define STR_COM4 "COM4 裝置:" +#define STR_LPT1 "LPT1 裝置:" +#define STR_LPT2 "LPT2 裝置:" +#define STR_LPT3 "LPT3 裝置:" +#define STR_LPT4 "LPT4 裝置:" +#define STR_SERIAL1 "序列埠 1" +#define STR_SERIAL2 "序列埠 2" +#define STR_SERIAL3 "序列埠 3" +#define STR_SERIAL4 "序列埠 4" +#define STR_PARALLEL1 "並列埠 1" +#define STR_PARALLEL2 "並列埠 2" +#define STR_PARALLEL3 "並列埠 3" +#define STR_PARALLEL4 "並列埠 4" +#define STR_SERIAL_PASS1 "Serial port passthrough 1" +#define STR_SERIAL_PASS2 "Serial port passthrough 2" +#define STR_SERIAL_PASS3 "Serial port passthrough 3" +#define STR_SERIAL_PASS4 "Serial port passthrough 4" -#define STR_HDC "硬碟控制器:" -#define STR_FDC "軟碟控制器:" -#define STR_IDE_TER "第三 IDE 控制器" -#define STR_IDE_QUA "第四 IDE 控制器" -#define STR_SCSI "SCSI" -#define STR_SCSI_1 "控制器 1:" -#define STR_SCSI_2 "控制器 2:" -#define STR_SCSI_3 "控制器 3:" -#define STR_SCSI_4 "控制器 4:" -#define STR_CASSETTE "磁帶" +#define STR_HDC "硬碟控制器:" +#define STR_FDC "軟碟控制器:" +#define STR_IDE_TER "第三 IDE 控制器" +#define STR_IDE_QUA "第四 IDE 控制器" +#define STR_SCSI "SCSI" +#define STR_SCSI_1 "控制器 1:" +#define STR_SCSI_2 "控制器 2:" +#define STR_SCSI_3 "控制器 3:" +#define STR_SCSI_4 "控制器 4:" +#define STR_CASSETTE "磁帶" -#define STR_HDD "硬碟:" -#define STR_NEW "新增(&N)..." -#define STR_EXISTING "已有鏡像(&E)..." -#define STR_REMOVE "移除(&R)" -#define STR_BUS "匯流排:" -#define STR_CHANNEL "通道:" -#define STR_ID "ID:" -#define STR_SPEED "Speed:" +#define STR_HDD "硬碟:" +#define STR_NEW "新增(&N)..." +#define STR_EXISTING "已有鏡像(&E)..." +#define STR_REMOVE "移除(&R)" +#define STR_BUS "匯流排:" +#define STR_CHANNEL "通道:" +#define STR_ID "ID:" +#define STR_SPEED "Speed:" -#define STR_SPECIFY "指定(&S)..." -#define STR_SECTORS "磁區(S):" -#define STR_HEADS "磁頭(H):" -#define STR_CYLS "柱面(C):" -#define STR_SIZE_MB "大小 (MB):" -#define STR_TYPE "類型:" -#define STR_IMG_FORMAT "鏡像格式:" -#define STR_BLOCK_SIZE "塊大小:" +#define STR_SPECIFY "指定(&S)..." +#define STR_SECTORS "磁區(S):" +#define STR_HEADS "磁頭(H):" +#define STR_CYLS "柱面(C):" +#define STR_SIZE_MB "大小 (MB):" +#define STR_TYPE "類型:" +#define STR_IMG_FORMAT "鏡像格式:" +#define STR_BLOCK_SIZE "塊大小:" -#define STR_FLOPPY_DRIVES "軟碟機:" -#define STR_TURBO "加速時序" -#define STR_CHECKBPB "檢查 BPB" -#define STR_CDROM_DRIVES "光碟機:" -#define STR_CD_SPEED "速度:" -#define STR_EARLY "早先的光碟機" +#define STR_FLOPPY_DRIVES "軟碟機:" +#define STR_TURBO "加速時序" +#define STR_CHECKBPB "檢查 BPB" +#define STR_CDROM_DRIVES "光碟機:" +#define STR_CD_SPEED "速度:" +#define STR_EARLY "早先的光碟機" -#define STR_MO_DRIVES "磁光碟機:" -#define STR_ZIP_DRIVES "ZIP 磁碟機:" -#define STR_250 "ZIP 250" +#define STR_MO_DRIVES "磁光碟機:" +#define STR_ZIP_DRIVES "ZIP 磁碟機:" +#define STR_250 "ZIP 250" -#define STR_ISARTC "ISA 實時時鐘:" -#define STR_ISAMEM "ISA 記憶體擴充" -#define STR_ISAMEM_1 "擴充卡 1:" -#define STR_ISAMEM_2 "擴充卡 2:" -#define STR_ISAMEM_3 "擴充卡 3:" -#define STR_ISAMEM_4 "擴充卡 4:" -#define STR_BUGGER "ISABugger 裝置" -#define STR_POSTCARD "自檢 (POST) 卡" +#define STR_ISARTC "ISA 實時時鐘:" +#define STR_ISAMEM "ISA 記憶體擴充" +#define STR_ISAMEM_1 "擴充卡 1:" +#define STR_ISAMEM_2 "擴充卡 2:" +#define STR_ISAMEM_3 "擴充卡 3:" +#define STR_ISAMEM_4 "擴充卡 4:" +#define STR_BUGGER "ISABugger 裝置" +#define STR_POSTCARD "自檢 (POST) 卡" -#define FONT_SIZE 9 -#define FONT_NAME "Microsoft JhengHei" +#define FONT_SIZE 9 +#define FONT_NAME "Microsoft JhengHei" #include "dialogs.rc" @@ -394,149 +394,149 @@ END STRINGTABLE DISCARDABLE BEGIN - 2048 "86Box" - IDS_2049 "錯誤" - IDS_2050 "致命錯誤" - IDS_2051 " - 已暫停" - IDS_2052 "按下 Ctrl+Alt+PgDn 返回到視窗模式。" - IDS_2053 "速度" - IDS_2054 "ZIP %03i %i (%s): %ls" - IDS_2055 "ZIP 鏡像 (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" - IDS_2056 "86Box 找不到任何可用的 ROM 鏡像。\n\n請下載ROM 包並將其解壓到 ""roms"" 資料夾。" - IDS_2057 "(空)" - IDS_2058 "ZIP 鏡像 (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0所有檔案 (*.*)\0*.*\0" - IDS_2059 "加速" - IDS_2060 "開" - IDS_2061 "關" - IDS_2062 "所有鏡像 (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0基本磁區鏡像 (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0表面鏡像 (*.86F)\0*.86F\0" - IDS_2063 "由於 roms/machines 資料夾中缺少合適的 ROM,機型 ""%hs"" 不可用。將切換到其他可用機型。" + 2048 "86Box" + IDS_2049 "錯誤" + IDS_2050 "致命錯誤" + IDS_2051 " - 已暫停" + IDS_2052 "按下 Ctrl+Alt+PgDn 返回到視窗模式。" + IDS_2053 "速度" + IDS_2054 "ZIP %03i %i (%s): %ls" + IDS_2055 "ZIP 鏡像 (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" + IDS_2056 "86Box 找不到任何可用的 ROM 鏡像。\n\n請下載ROM 包並將其解壓到 ""roms"" 資料夾。" + IDS_2057 "(空)" + IDS_2058 "ZIP 鏡像 (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0所有檔案 (*.*)\0*.*\0" + IDS_2059 "加速" + IDS_2060 "開" + IDS_2061 "關" + IDS_2062 "所有鏡像 (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0基本磁區鏡像 (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0表面鏡像 (*.86F)\0*.86F\0" + IDS_2063 "由於 roms/machines 資料夾中缺少合適的 ROM,機型 ""%hs"" 不可用。將切換到其他可用機型。" END STRINGTABLE DISCARDABLE BEGIN - IDS_2064 "由於 roms/video 資料夾中缺少合適的 ROM,顯示卡 ""%hs"" 不可用。將切換到其他可用顯示卡。" - IDS_2065 "機型" - IDS_2066 "顯示" - IDS_2067 "輸入裝置" - IDS_2068 "聲音" - IDS_2069 "網路" - IDS_2070 "連接埠 (COM 和 LPT)" - IDS_2071 "存儲控制器" - IDS_2072 "硬碟" - IDS_2073 "軟碟/光碟機" - IDS_2074 "其他可移除裝置" - IDS_2075 "其他周邊裝置" - IDS_2076 "表面鏡像 (*.86F)\0*.86F\0" - IDS_2077 "點擊視窗捕捉滑鼠" - IDS_2078 "按下 F8+F12 釋放滑鼠" - IDS_2079 "按下 F8+F12 或滑鼠中鍵釋放滑鼠" + IDS_2064 "由於 roms/video 資料夾中缺少合適的 ROM,顯示卡 ""%hs"" 不可用。將切換到其他可用顯示卡。" + IDS_2065 "機型" + IDS_2066 "顯示" + IDS_2067 "輸入裝置" + IDS_2068 "聲音" + IDS_2069 "網路" + IDS_2070 "連接埠 (COM 和 LPT)" + IDS_2071 "存儲控制器" + IDS_2072 "硬碟" + IDS_2073 "軟碟/光碟機" + IDS_2074 "其他可移除裝置" + IDS_2075 "其他周邊裝置" + IDS_2076 "表面鏡像 (*.86F)\0*.86F\0" + IDS_2077 "點擊視窗捕捉滑鼠" + IDS_2078 "按下 F8+F12 釋放滑鼠" + IDS_2079 "按下 F8+F12 或滑鼠中鍵釋放滑鼠" END STRINGTABLE DISCARDABLE BEGIN - IDS_2080 "無法初始化 FluidSynth" - IDS_2081 "匯流排" - IDS_2082 "檔案" - IDS_2083 "C" - IDS_2084 "H" - IDS_2085 "S" - IDS_2086 "MB" + IDS_2080 "無法初始化 FluidSynth" + IDS_2081 "匯流排" + IDS_2082 "檔案" + IDS_2083 "C" + IDS_2084 "H" + IDS_2085 "S" + IDS_2086 "MB" IDS_2087 "Speed" - IDS_2088 "檢查 BPB" - IDS_2089 "KB" - IDS_2090 "無法初始化視訊渲染器。" - IDS_2091 "預設" - IDS_2092 "%i 等待狀態 (WS)" - IDS_2093 "類型" - IDS_2094 "設定 PCap 失敗" - IDS_2095 "未找到 PCap 裝置" - IDS_2096 "無效 PCap 裝置" - IDS_2097 "標準 2 鍵搖桿" - IDS_2098 "標準 4 鍵搖桿" - IDS_2099 "標準 6 鍵搖桿" - IDS_2100 "標準 8 鍵搖桿" - IDS_2101 "CH Flightstick Pro" - IDS_2102 "Microsoft SideWinder Pad" - IDS_2103 "Thrustmaster Flight Control System" - IDS_2104 "無" - IDS_2105 "無法載入鍵盤加速器。" - IDS_2106 "無法註冊原始輸入。" - IDS_2107 "%u" - IDS_2108 "%u MB (CHS: %i, %i, %i)" - IDS_2109 "軟碟 %i (%s): %ls" - IDS_2110 "所有鏡像 (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0進階磁區鏡像 (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0基本磁區鏡像 (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Flux 鏡像 (*.FDI)\0*.FDI\0表面鏡像 (*.86F;*.MFM)\0*.86F;*.MFM\0所有檔案 (*.*)\0*.*\0" - IDS_2111 "無法初始化 FreeType" - IDS_2112 "無法初始化 SDL,需要 SDL2.dll" - IDS_2113 "確定要硬重設模擬器嗎?" - IDS_2114 "確定要退出 86Box 嗎?" - IDS_2115 "無法初始化 Ghostscript" - IDS_2116 "磁光碟 %i (%ls): %ls" - IDS_2117 "磁光碟鏡像 (*.IM?;*.MDI)\0*.IM?;*.MDI\0所有檔案 (*.*)\0*.*\0" - IDS_2118 "歡迎使用 86Box!" - IDS_2119 "內部控制器" - IDS_2120 "退出" - IDS_2121 "找不到 ROM" - IDS_2122 "要保存設定嗎?" - IDS_2123 "此操作將硬重設模擬器。" - IDS_2124 "保存" - IDS_2125 "關於 86Box" - IDS_2126 "86Box v" EMU_VERSION + IDS_2088 "檢查 BPB" + IDS_2089 "KB" + IDS_2090 "無法初始化視訊渲染器。" + IDS_2091 "預設" + IDS_2092 "%i 等待狀態 (WS)" + IDS_2093 "類型" + IDS_2094 "設定 PCap 失敗" + IDS_2095 "未找到 PCap 裝置" + IDS_2096 "無效 PCap 裝置" + IDS_2097 "標準 2 鍵搖桿" + IDS_2098 "標準 4 鍵搖桿" + IDS_2099 "標準 6 鍵搖桿" + IDS_2100 "標準 8 鍵搖桿" + IDS_2101 "CH Flightstick Pro" + IDS_2102 "Microsoft SideWinder Pad" + IDS_2103 "Thrustmaster Flight Control System" + IDS_2104 "無" + IDS_2105 "無法載入鍵盤加速器。" + IDS_2106 "無法註冊原始輸入。" + IDS_2107 "%u" + IDS_2108 "%u MB (CHS: %i, %i, %i)" + IDS_2109 "軟碟 %i (%s): %ls" + IDS_2110 "所有鏡像 (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0進階磁區鏡像 (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0基本磁區鏡像 (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Flux 鏡像 (*.FDI)\0*.FDI\0表面鏡像 (*.86F;*.MFM)\0*.86F;*.MFM\0所有檔案 (*.*)\0*.*\0" + IDS_2111 "無法初始化 FreeType" + IDS_2112 "無法初始化 SDL,需要 SDL2.dll" + IDS_2113 "確定要硬重設模擬器嗎?" + IDS_2114 "確定要退出 86Box 嗎?" + IDS_2115 "無法初始化 Ghostscript" + IDS_2116 "磁光碟 %i (%ls): %ls" + IDS_2117 "磁光碟鏡像 (*.IM?;*.MDI)\0*.IM?;*.MDI\0所有檔案 (*.*)\0*.*\0" + IDS_2118 "歡迎使用 86Box!" + IDS_2119 "內部控制器" + IDS_2120 "退出" + IDS_2121 "找不到 ROM" + IDS_2122 "要保存設定嗎?" + IDS_2123 "此操作將硬重設模擬器。" + IDS_2124 "保存" + IDS_2125 "關於 86Box" + IDS_2126 "86Box v" EMU_VERSION - IDS_2127 "一個舊式電腦模擬器\n\n作者: Sarah Walker、Miran Grca、Fred N. van Kempen (waltje)、SA1988、Tiseno100、reenigne、leilei、JohnElliott、greatpsycho 等人。\n\n本軟體依據 GNU 通用公共授權第二版或更新版本發布。詳情見 LICENSE 檔案。" - IDS_2128 "確定" - IDS_2129 "硬體不可用" + IDS_2127 "一個舊式電腦模擬器\n\n作者: Sarah Walker、Miran Grca、Fred N. van Kempen (waltje)、SA1988、Tiseno100、reenigne、leilei、JohnElliott、greatpsycho 等人。\n\n本軟體依據 GNU 通用公共授權第二版或更新版本發布。詳情見 LICENSE 檔案。" + IDS_2128 "確定" + IDS_2129 "硬體不可用" #ifdef _WIN32 #define LIB_NAME_PCAP "WinPcap" #else #define LIB_NAME_PCAP "libpcap" #endif - IDS_2130 "請確認 " LIB_NAME_PCAP " 已安裝且使用相容 " LIB_NAME_PCAP " 的網路連線。" - IDS_2131 "無效配置" + IDS_2130 "請確認 " LIB_NAME_PCAP " 已安裝且使用相容 " LIB_NAME_PCAP " 的網路連線。" + IDS_2131 "無效配置" #ifdef _WIN32 #define LIB_NAME_FREETYPE "freetype.dll" #else #define LIB_NAME_FREETYPE "libfreetype" #endif - IDS_2132 "ESC/P 印表機模擬需要" LIB_NAME_FREETYPE + IDS_2132 "ESC/P 印表機模擬需要" LIB_NAME_FREETYPE #ifdef _WIN32 #define LIB_NAME_GS "gsdll32.dll" #else #define LIB_NAME_GS "libgs" #endif - IDS_2133 LIB_NAME_GS " 是將 PostScript 檔案轉換為 PDF 所需要的庫。\n\n使用通用 PostScript 印表機列印的文件將被保存為 PostScript (.ps) 檔案。" + IDS_2133 LIB_NAME_GS " 是將 PostScript 檔案轉換為 PDF 所需要的庫。\n\n使用通用 PostScript 印表機列印的文件將被保存為 PostScript (.ps) 檔案。" #ifdef _WIN32 #define LIB_NAME_FLUIDSYNTH "libfluidsynth.dll" #else #define LIB_NAME_FLUIDSYNTH "libfluidsynth" #endif - IDS_2134 "FluidSynth MIDI 輸出需要" LIB_NAME_FLUIDSYNTH - IDS_2135 "正在進入全螢幕模式" - IDS_2136 "不要再顯示此消息" - IDS_2137 "不退出" - IDS_2138 "重設" - IDS_2139 "不重設" - IDS_2140 "磁光碟鏡像 (*.IM?;*.MDI)\0*.IM?;*.MDI\0所有檔案 (*.*)\0*.*\0" - IDS_2141 "光碟鏡像 (*.ISO;*.CUE)\0*.ISO;*.CUE\0所有檔案 (*.*)\0*.*\0" - IDS_2142 "%hs 裝置配置" + IDS_2134 "FluidSynth MIDI 輸出需要" LIB_NAME_FLUIDSYNTH + IDS_2135 "正在進入全螢幕模式" + IDS_2136 "不要再顯示此消息" + IDS_2137 "不退出" + IDS_2138 "重設" + IDS_2139 "不重設" + IDS_2140 "磁光碟鏡像 (*.IM?;*.MDI)\0*.IM?;*.MDI\0所有檔案 (*.*)\0*.*\0" + IDS_2141 "光碟鏡像 (*.ISO;*.CUE)\0*.ISO;*.CUE\0所有檔案 (*.*)\0*.*\0" + IDS_2142 "%hs 裝置配置" IDS_2143 "顯示器處在睡眠狀態" - IDS_2144 "OpenGL 著色器 (*.GLSL)\0*.GLSL\0所有檔案 (*.*)\0*.*\0" - IDS_2145 "OpenGL 選項" - IDS_2146 "正在載入一個不受支援的配置" - IDS_2147 "此模擬電腦禁用了基於選定電腦的 CPU 類型過濾。\n\n能夠選中與所選機器本不相容的 CPU,但是可能會遇到與機器 BIOS 或其他軟體不相容的問題。\n\n啟用此設定不受官方支援,並且提交的任何錯誤報告可能會視為無效而關閉。" - IDS_2148 "繼續" - IDS_2149 "磁帶: %s" - IDS_2150 "磁帶鏡像 (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0所有檔案 (*.*)\0*.*\0" - IDS_2151 "卡帶 %i: %ls" - IDS_2152 "卡帶鏡像 (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0所有檔案 (*.*)\0*.*\0" - IDS_2153 "初始化渲染器時出錯" - IDS_2154 "無法初始化 OpenGL (3.0 核心) 渲染器。請使用其他渲染器。" - IDS_2155 "恢復執行" - IDS_2156 "暫停執行" - IDS_2157 "按下 Ctrl+Alt+Del" - IDS_2158 "按下 Ctrl+Alt+Esc" - IDS_2159 "硬重設" - IDS_2160 "ACPI 關機" - IDS_2161 "設定" + IDS_2144 "OpenGL 著色器 (*.GLSL)\0*.GLSL\0所有檔案 (*.*)\0*.*\0" + IDS_2145 "OpenGL 選項" + IDS_2146 "正在載入一個不受支援的配置" + IDS_2147 "此模擬電腦禁用了基於選定電腦的 CPU 類型過濾。\n\n能夠選中與所選機器本不相容的 CPU,但是可能會遇到與機器 BIOS 或其他軟體不相容的問題。\n\n啟用此設定不受官方支援,並且提交的任何錯誤報告可能會視為無效而關閉。" + IDS_2148 "繼續" + IDS_2149 "磁帶: %s" + IDS_2150 "磁帶鏡像 (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0所有檔案 (*.*)\0*.*\0" + IDS_2151 "卡帶 %i: %ls" + IDS_2152 "卡帶鏡像 (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0所有檔案 (*.*)\0*.*\0" + IDS_2153 "初始化渲染器時出錯" + IDS_2154 "無法初始化 OpenGL (3.0 核心) 渲染器。請使用其他渲染器。" + IDS_2155 "恢復執行" + IDS_2156 "暫停執行" + IDS_2157 "按下 Ctrl+Alt+Del" + IDS_2158 "按下 Ctrl+Alt+Esc" + IDS_2159 "硬重設" + IDS_2160 "ACPI 關機" + IDS_2161 "設定" IDS_2162 "早先的光碟機" IDS_2163 "No Dynarec" IDS_2164 "Old Dynarec" @@ -547,45 +547,45 @@ END STRINGTABLE DISCARDABLE BEGIN IDS_4096 "硬碟 (%s)" - IDS_4097 "%01i:%01i" - IDS_4098 "%01i" - IDS_4099 "不存在 MFM/RLL 或 ESDI CD-ROM 光碟機" - IDS_4100 "自訂..." - IDS_4101 "自訂 (大容量)..." - IDS_4102 "添加新硬碟" - IDS_4103 "添加已存在的硬碟" - IDS_4104 "HDI 磁碟鏡像不能超過 4 GB。" - IDS_4105 "磁碟鏡像不能超過 127 GB。" - IDS_4106 "硬碟鏡像 (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0所有檔案 (*.*)\0*.*\0" - IDS_4107 "無法讀取檔案" - IDS_4108 "無法寫入檔案" - IDS_4109 "不支援非 512 位元組磁區大小的 HDI 或 HDX 鏡像。" - IDS_4110 "尚未支援 USB" - IDS_4111 "磁碟鏡像檔案已存在" - IDS_4112 "請指定有效的檔案名。" - IDS_4113 "已創建磁碟鏡像" - IDS_4114 "請確定此檔案已存在並可讀取。" - IDS_4115 "請確定此檔案保存在可寫目錄中。" - IDS_4116 "磁碟鏡像太大" - IDS_4117 "請記得為新創建的鏡像分區並格式化。" - IDS_4118 "選定的檔案將被覆蓋。確定繼續使用此檔案嗎?" - IDS_4119 "不支援的磁碟鏡像" - IDS_4120 "覆蓋" - IDS_4121 "不覆蓋" - IDS_4122 "原始鏡像 (.img)" - IDS_4123 "HDI 鏡像 (.hdi)" - IDS_4124 "HDX 鏡像 (.hdx)" - IDS_4125 "固定大小 VHD (.vhd)" - IDS_4126 "動態大小 VHD (.vhd)" - IDS_4127 "差分 VHD (.vhd)" - IDS_4128 "大塊 (2 MB)" - IDS_4129 "小塊 (512 KB)" - IDS_4130 "VHD 檔案 (*.VHD)\0*.VHD\0所有檔案 (*.*)\0*.*\0" - IDS_4131 "選擇父 VHD 檔案" - IDS_4132 "父映像可能在創建差異鏡像後被修改。\n\n如果鏡像檔案被移動或複製,或創建此磁碟的程式中存在錯誤,也可能發生這種情況。\n\n是否需要修復時間戳?" - IDS_4133 "父碟與子碟的時間戳不匹配" - IDS_4134 "無法修復 VHD 時間戳。" - IDS_4135 "%01i:%02i" + IDS_4097 "%01i:%01i" + IDS_4098 "%01i" + IDS_4099 "不存在 MFM/RLL 或 ESDI CD-ROM 光碟機" + IDS_4100 "自訂..." + IDS_4101 "自訂 (大容量)..." + IDS_4102 "添加新硬碟" + IDS_4103 "添加已存在的硬碟" + IDS_4104 "HDI 磁碟鏡像不能超過 4 GB。" + IDS_4105 "磁碟鏡像不能超過 127 GB。" + IDS_4106 "硬碟鏡像 (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0所有檔案 (*.*)\0*.*\0" + IDS_4107 "無法讀取檔案" + IDS_4108 "無法寫入檔案" + IDS_4109 "不支援非 512 位元組磁區大小的 HDI 或 HDX 鏡像。" + IDS_4110 "尚未支援 USB" + IDS_4111 "磁碟鏡像檔案已存在" + IDS_4112 "請指定有效的檔案名。" + IDS_4113 "已創建磁碟鏡像" + IDS_4114 "請確定此檔案已存在並可讀取。" + IDS_4115 "請確定此檔案保存在可寫目錄中。" + IDS_4116 "磁碟鏡像太大" + IDS_4117 "請記得為新創建的鏡像分區並格式化。" + IDS_4118 "選定的檔案將被覆蓋。確定繼續使用此檔案嗎?" + IDS_4119 "不支援的磁碟鏡像" + IDS_4120 "覆蓋" + IDS_4121 "不覆蓋" + IDS_4122 "原始鏡像 (.img)" + IDS_4123 "HDI 鏡像 (.hdi)" + IDS_4124 "HDX 鏡像 (.hdx)" + IDS_4125 "固定大小 VHD (.vhd)" + IDS_4126 "動態大小 VHD (.vhd)" + IDS_4127 "差分 VHD (.vhd)" + IDS_4128 "大塊 (2 MB)" + IDS_4129 "小塊 (512 KB)" + IDS_4130 "VHD 檔案 (*.VHD)\0*.VHD\0所有檔案 (*.*)\0*.*\0" + IDS_4131 "選擇父 VHD 檔案" + IDS_4132 "父映像可能在創建差異鏡像後被修改。\n\n如果鏡像檔案被移動或複製,或創建此磁碟的程式中存在錯誤,也可能發生這種情況。\n\n是否需要修復時間戳?" + IDS_4133 "父碟與子碟的時間戳不匹配" + IDS_4134 "無法修復 VHD 時間戳。" + IDS_4135 "%01i:%02i" IDS_4352 "MFM/RLL" IDS_4353 "XTA" @@ -594,56 +594,56 @@ BEGIN IDS_4356 "ATAPI" IDS_4357 "SCSI" - IDS_4608 "MFM/RLL (%01i:%01i)" - IDS_4609 "XTA (%01i:%01i)" - IDS_4610 "ESDI (%01i:%01i)" - IDS_4611 "IDE (%01i:%01i)" - IDS_4612 "ATAPI (%01i:%01i)" - IDS_4613 "SCSI (%01i:%02i)" + IDS_4608 "MFM/RLL (%01i:%01i)" + IDS_4609 "XTA (%01i:%01i)" + IDS_4610 "ESDI (%01i:%01i)" + IDS_4611 "IDE (%01i:%01i)" + IDS_4612 "ATAPI (%01i:%01i)" + IDS_4613 "SCSI (%01i:%02i)" - IDS_5120 "光碟 %i (%s): %s" + IDS_5120 "光碟 %i (%s): %s" - IDS_5376 "禁用" - IDS_5381 "ATAPI" + IDS_5376 "禁用" + IDS_5381 "ATAPI" IDS_5382 "SCSI" - IDS_5632 "禁用" - IDS_5637 "ATAPI (%01i:%01i)" + IDS_5632 "禁用" + IDS_5637 "ATAPI (%01i:%01i)" IDS_5638 "SCSI (%01i:%02i)" - IDS_5888 "160 kB" - IDS_5889 "180 kB" - IDS_5890 "320 kB" - IDS_5891 "360 kB" - IDS_5892 "640 kB" - IDS_5893 "720 kB" - IDS_5894 "1.2 MB" - IDS_5895 "1.25 MB" - IDS_5896 "1.44 MB" - IDS_5897 "DMF (1024 簇)" - IDS_5898 "DMF (2048 簇)" - IDS_5899 "2.88 MB" - IDS_5900 "ZIP 100" - IDS_5901 "ZIP 250" - IDS_5902 "3.5 英寸 128 MB (ISO 10090)" - IDS_5903 "3.5 英寸 230 MB (ISO 13963)" - IDS_5904 "3.5 英寸 540 MB (ISO 15498)" - IDS_5905 "3.5 英寸 640 MB (ISO 15498)" - IDS_5906 "3.5 英寸 1.3 GB (GigaMO)" - IDS_5907 "3.5 英寸 2.3 GB (GigaMO 2)" - IDS_5908 "5.25 英寸 600 MB" - IDS_5909 "5.25 英寸 650 MB" - IDS_5910 "5.25 英寸 1 GB" - IDS_5911 "5.25 英寸 1.3 GB" + IDS_5888 "160 kB" + IDS_5889 "180 kB" + IDS_5890 "320 kB" + IDS_5891 "360 kB" + IDS_5892 "640 kB" + IDS_5893 "720 kB" + IDS_5894 "1.2 MB" + IDS_5895 "1.25 MB" + IDS_5896 "1.44 MB" + IDS_5897 "DMF (1024 簇)" + IDS_5898 "DMF (2048 簇)" + IDS_5899 "2.88 MB" + IDS_5900 "ZIP 100" + IDS_5901 "ZIP 250" + IDS_5902 "3.5 英寸 128 MB (ISO 10090)" + IDS_5903 "3.5 英寸 230 MB (ISO 13963)" + IDS_5904 "3.5 英寸 540 MB (ISO 15498)" + IDS_5905 "3.5 英寸 640 MB (ISO 15498)" + IDS_5906 "3.5 英寸 1.3 GB (GigaMO)" + IDS_5907 "3.5 英寸 2.3 GB (GigaMO 2)" + IDS_5908 "5.25 英寸 600 MB" + IDS_5909 "5.25 英寸 650 MB" + IDS_5910 "5.25 英寸 1 GB" + IDS_5911 "5.25 英寸 1.3 GB" - IDS_6144 "標準轉速 (RPM)" - IDS_6145 "低於標準轉速的 1%" - IDS_6146 "低於標準轉速的 1.5%" - IDS_6147 "低於標準轉速的 2%" + IDS_6144 "標準轉速 (RPM)" + IDS_6145 "低於標準轉速的 1%" + IDS_6146 "低於標準轉速的 1.5%" + IDS_6147 "低於標準轉速的 2%" - IDS_7168 "(系統預設)" + IDS_7168 "(系統預設)" END -#define IDS_LANG_ENUS IDS_7168 +#define IDS_LANG_ENUS IDS_7168 // Traditional Chinese resources ///////////////////////////////////////////////////////////////////////////// From e39dde34136dd6aec816572f8adfaa461df05ff9 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sun, 6 Nov 2022 23:45:35 -0500 Subject: [PATCH 285/285] Magic numbers for sound freq changed to defines --- src/include/86box/sound.h | 11 +++++++++-- src/sound/midi_fluidsynth.c | 2 +- src/sound/midi_mt32.c | 2 +- src/sound/openal.c | 2 +- src/sound/snd_ac97_via.c | 2 +- src/sound/snd_audiopci.c | 2 +- src/sound/snd_emu8k.c | 2 +- src/sound/snd_opl_nuked.c | 4 +++- src/sound/snd_opl_ymfm.cpp | 8 +++++--- src/sound/snd_resid.cc | 6 ++++-- src/sound/snd_sb.c | 4 ++-- src/sound/snd_sb_dsp.c | 4 ++-- src/sound/snd_sn76489.c | 2 +- src/sound/sound.c | 4 ++-- src/sound/xaudio2.c | 4 ++-- 15 files changed, 36 insertions(+), 23 deletions(-) diff --git a/src/include/86box/sound.h b/src/include/86box/sound.h index f0bfad7c7..dada9e164 100644 --- a/src/include/86box/sound.h +++ b/src/include/86box/sound.h @@ -24,9 +24,16 @@ extern int sound_gain; -#define SOUNDBUFLEN (48000 / 50) +#define FREQ_44100 44100 +#define FREQ_48000 48000 +#define FREQ_49716 49716 +#define FREQ_88200 88200 +#define FREQ_96000 96000 -#define CD_FREQ 44100 +#define SOUND_FREQ FREQ_48000 +#define SOUNDBUFLEN (SOUND_FREQ / 50) + +#define CD_FREQ FREQ_44100 #define CD_BUFLEN (CD_FREQ / 10) enum { diff --git a/src/sound/midi_fluidsynth.c b/src/sound/midi_fluidsynth.c index 4336670c6..2372203d7 100644 --- a/src/sound/midi_fluidsynth.c +++ b/src/sound/midi_fluidsynth.c @@ -130,7 +130,7 @@ fluidsynth_poll(void) { fluidsynth_t *data = &fsdev; data->midi_pos++; - if (data->midi_pos == 48000 / RENDER_RATE) { + if (data->midi_pos == SOUND_FREQ / RENDER_RATE) { data->midi_pos = 0; thread_set_event(data->event); } diff --git a/src/sound/midi_mt32.c b/src/sound/midi_mt32.c index 80b49112f..230914d72 100644 --- a/src/sound/midi_mt32.c +++ b/src/sound/midi_mt32.c @@ -202,7 +202,7 @@ void mt32_poll(void) { midi_pos++; - if (midi_pos == 48000 / RENDER_RATE) { + if (midi_pos == SOUND_FREQ / RENDER_RATE) { midi_pos = 0; thread_set_event(event); } diff --git a/src/sound/openal.c b/src/sound/openal.c index 48e4ee818..a1b870480 100644 --- a/src/sound/openal.c +++ b/src/sound/openal.c @@ -34,7 +34,7 @@ #include <86box/midi.h> #include <86box/sound.h> -#define FREQ 48000 +#define FREQ SOUND_FREQ #define BUFLEN SOUNDBUFLEN ALuint buffers[4]; /* front and back buffers */ diff --git a/src/sound/snd_ac97_via.c b/src/sound/snd_ac97_via.c index 9f83cd3f9..8e611ed44 100644 --- a/src/sound/snd_ac97_via.c +++ b/src/sound/snd_ac97_via.c @@ -746,7 +746,7 @@ ac97_via_speed_changed(void *priv) if (dev->vsr_enabled && dev->codec[0][0]) freq = ac97_codec_getrate(dev->codec[0][0], 0x2c); else - freq = 48000.0; + freq = (double) SOUND_FREQ; dev->sgd[0].timer_latch = (uint64_t) ((double) TIMER_USEC * (1000000.0 / freq)); dev->sgd[2].timer_latch = (uint64_t) ((double) TIMER_USEC * (1000000.0 / 24000.0)); diff --git a/src/sound/snd_audiopci.c b/src/sound/snd_audiopci.c index 7d029a169..105907ede 100644 --- a/src/sound/snd_audiopci.c +++ b/src/sound/snd_audiopci.c @@ -2045,7 +2045,7 @@ es1371_speed_changed(void *p) { es1371_t *dev = (es1371_t *) p; - dev->dac[1].latch = (uint64_t) ((double) TIMER_USEC * (1000000.0 / 48000.0)); + dev->dac[1].latch = (uint64_t) ((double) TIMER_USEC * (1000000.0 / (double) SOUND_FREQ)); } static const device_config_t es1371_config[] = { diff --git a/src/sound/snd_emu8k.c b/src/sound/snd_emu8k.c index 528a3ad50..b58def3a9 100644 --- a/src/sound/snd_emu8k.c +++ b/src/sound/snd_emu8k.c @@ -1659,7 +1659,7 @@ emu8k_vol_slide(emu8k_slide_t *slide, int32_t target) void emu8k_update(emu8k_t *emu8k) { - int new_pos = (sound_pos_global * 44100) / 48000; + int new_pos = (sound_pos_global * FREQ_44100) / SOUND_FREQ; if (emu8k->pos >= new_pos) return; diff --git a/src/sound/snd_opl_nuked.c b/src/sound/snd_opl_nuked.c index 3c0d22131..35049836a 100644 --- a/src/sound/snd_opl_nuked.c +++ b/src/sound/snd_opl_nuked.c @@ -55,6 +55,8 @@ #define WRBUF_DELAY 1 #define RSM_FRAC 10 +#define OPL_FREQ FREQ_48000 + // Channel types enum { ch_2op = 0, @@ -1481,7 +1483,7 @@ nuked_drv_init(const device_t *info) dev->status = 0x06; /* Initialize the NukedOPL object. */ - nuked_init(&dev->opl, 48000); + nuked_init(&dev->opl, OPL_FREQ); timer_add(&dev->timers[0], nuked_timer_1, dev, 0); timer_add(&dev->timers[1], nuked_timer_2, dev, 0); diff --git a/src/sound/snd_opl_ymfm.cpp b/src/sound/snd_opl_ymfm.cpp index 012e77bdb..a446ab01e 100644 --- a/src/sound/snd_opl_ymfm.cpp +++ b/src/sound/snd_opl_ymfm.cpp @@ -42,6 +42,8 @@ extern "C" { #define RSM_FRAC 10 +#define OPL_FREQ FREQ_48000 + enum { FLAG_CYCLES = (1 << 0) }; @@ -294,15 +296,15 @@ ymfm_drv_init(const device_t *info) switch (info->local) { case FM_YM3812: default: - fm = (YMFMChipBase *) new YMFMChip(3579545, FM_YM3812, 48000); + fm = (YMFMChipBase *) new YMFMChip(3579545, FM_YM3812, OPL_FREQ); break; case FM_YMF262: - fm = (YMFMChipBase *) new YMFMChip(14318181, FM_YMF262, 48000); + fm = (YMFMChipBase *) new YMFMChip(14318181, FM_YMF262, OPL_FREQ); break; case FM_YMF289B: - fm = (YMFMChipBase *) new YMFMChip(33868800, FM_YMF289B, 48000); + fm = (YMFMChipBase *) new YMFMChip(33868800, FM_YMF289B, OPL_FREQ); break; case FM_YMF278B: diff --git a/src/sound/snd_resid.cc b/src/sound/snd_resid.cc index 173039098..da46b7634 100644 --- a/src/sound/snd_resid.cc +++ b/src/sound/snd_resid.cc @@ -7,6 +7,8 @@ #include <86box/plat.h> #include <86box/snd_resid.h> +#define RESID_FREQ 48000 + typedef struct psid_t { /* resid sid implementation */ SIDFP *sid; @@ -42,7 +44,7 @@ sid_init(void) psid->sid->write(c, 0); if (!psid->sid->set_sampling_parameters((float) cycles_per_sec, method, - (float) 48000, 0.9 * 48000.0 / 2.0)) { + (float) RESID_FREQ, 0.9 * (float) RESID_FREQ / 2.0)) { // printf("reSID failed!\n"); } @@ -93,7 +95,7 @@ sid_write(uint16_t addr, uint8_t val, UNUSED(void *p)) psid->sid->write(addr & 0x1f, val); } -#define CLOCK_DELTA(n) (int) (((14318180.0 * n) / 16.0) / 48000.0) +#define CLOCK_DELTA(n) (int) (((14318180.0 * n) / 16.0) / (float) RESID_FREQ) static void fillbuf2(int &count, int16_t *buf, int len) diff --git a/src/sound/snd_sb.c b/src/sound/snd_sb.c index d67701180..086b954bb 100644 --- a/src/sound/snd_sb.c +++ b/src/sound/snd_sb.c @@ -364,7 +364,7 @@ sb_get_buffer_sb16_awe32(int32_t *buffer, int len, void *p) out_l = 0.0, out_r = 0.0; if (sb->dsp.sb_type > SB16) - c_emu8k = ((((c / 2) * 44100) / 48000) * 2); + c_emu8k = ((((c / 2) * FREQ_44100) / SOUND_FREQ) * 2); if (sb->opl_enabled) { out_l = ((double) opl_buf[c]) * mixer->fm_l * 0.7171630859375; @@ -433,7 +433,7 @@ sb_get_buffer_sb16_awe32(int32_t *buffer, int len, void *p) } if (sb->dsp.sb_enable_i) { - c_record = dsp_rec_pos + ((c * sb->dsp.sb_freq) / 48000); + c_record = dsp_rec_pos + ((c * sb->dsp.sb_freq) / SOUND_FREQ); in_l <<= mixer->input_gain_L; in_r <<= mixer->input_gain_R; diff --git a/src/sound/snd_sb_dsp.c b/src/sound/snd_sb_dsp.c index 3832c4485..e6a7b8312 100644 --- a/src/sound/snd_sb_dsp.c +++ b/src/sound/snd_sb_dsp.c @@ -145,7 +145,7 @@ recalc_sb16_filter(int c, int playback_freq) /* Cutoff frequency = playback / 2 */ int n; double w, h; - double fC = ((double) playback_freq) / 96000.0; + double fC = ((double) playback_freq) / (double) FREQ_96000; double gain; for (n = 0; n < SB16_NCoef; n++) { @@ -1139,7 +1139,7 @@ sb_dsp_init(sb_dsp_t *dsp, int type, int subtype, void *parent) /* 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); - recalc_sb16_filter(1, 44100); + recalc_sb16_filter(1, FREQ_44100); /* Initialize SB16 8051 RAM and ASP internal RAM */ memset(dsp->sb_8051_ram, 0x00, sizeof(dsp->sb_8051_ram)); diff --git a/src/sound/snd_sn76489.c b/src/sound/snd_sn76489.c index 3cbb44ec3..a28e5b848 100644 --- a/src/sound/snd_sn76489.c +++ b/src/sound/snd_sn76489.c @@ -192,7 +192,7 @@ sn76489_init(sn76489_t *sn76489, uint16_t base, uint16_t size, int type, int fre sn76489->noise = 3; sn76489->shift = 0x4000; sn76489->type = type; - sn76489->psgconst = (((double) freq / 64.0) / 48000.0); + sn76489->psgconst = (((double) freq / 64.0) / (double) FREQ_48000); sn76489_mute = 0; diff --git a/src/sound/sound.c b/src/sound/sound.c index 21c54d6ee..dbfaf0fdb 100644 --- a/src/sound/sound.c +++ b/src/sound/sound.c @@ -475,7 +475,7 @@ sound_poll(void *priv) if (cd_thread_enable) { cd_buf_update--; if (!cd_buf_update) { - cd_buf_update = (48000 / SOUNDBUFLEN) / (CD_FREQ / CD_BUFLEN); + cd_buf_update = (SOUND_FREQ / SOUNDBUFLEN) / (CD_FREQ / CD_BUFLEN); thread_set_event(sound_cd_event); } } @@ -487,7 +487,7 @@ sound_poll(void *priv) void sound_speed_changed(void) { - sound_poll_latch = (uint64_t) ((double) TIMER_USEC * (1000000.0 / 48000.0)); + sound_poll_latch = (uint64_t) ((double) TIMER_USEC * (1000000.0 / (double) SOUND_FREQ)); } void diff --git a/src/sound/xaudio2.c b/src/sound/xaudio2.c index dbe0215eb..0045135fc 100644 --- a/src/sound/xaudio2.c +++ b/src/sound/xaudio2.c @@ -44,7 +44,7 @@ static dllimp_t xaudio2_imports[] = { # define XAudio2Create pXAudio2Create #endif -static int midi_freq = 44100; +static int midi_freq = FREQ_44100; static int midi_buf_size = 4410; static int initialized = 0; static IXAudio2 *xaudio2 = NULL; @@ -53,7 +53,7 @@ static IXAudio2SourceVoice *srcvoice = NULL; static IXAudio2SourceVoice *srcvoicemidi = NULL; static IXAudio2SourceVoice *srcvoicecd = NULL; -#define FREQ 48000 +#define FREQ SOUND_FREQ #define BUFLEN SOUNDBUFLEN static void WINAPI

    yz)S*@7IXR}ept`A+v?r&I=?`s@FWp6neDv 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