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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�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
!x?OekBfR+ucg%PF>@U`9wWa9AhHHk&)zXmgZVZ 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 literal 169574 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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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%0DsqX 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%0DBKK4+uV7W`Nc@U%-ESJT(Klo<(Bc!9Q9o& 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

#|dUXB@)#i9@o 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 QLuN33MF0Bp@9*XR2V!1ByZ`_I literal 194973 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

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

{_+Lg{Pk1snq`62q$sKV;CNR*R(%L3>% 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 hANM-1q_nKOvfU{{xu1b@%`P 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