Merge branch '86Box:master' into master

This commit is contained in:
starfrost
2025-04-06 11:30:21 +01:00
committed by GitHub
8 changed files with 795 additions and 602 deletions

View File

@@ -1070,10 +1070,14 @@ write64_generic(void *priv, uint8_t val)
fixed_bits |= 8;
/* (B0 or F0) | (0x04 or 0x0c) */
kbc_delay_to_ob(dev, dev->p1 | fixed_bits, 0, 0x00);
} else if (((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1) && ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_GREEN))
} else if (((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1) && ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_GREEN)) {
/* (B0 or F0) | (0x08 or 0x0c) */
kbc_delay_to_ob(dev, ((dev->p1 | fixed_bits) & 0xf0) | (((dev->flags & KBC_VEN_MASK) == KBC_VEN_ACER) ? 0x08 : 0x0c), 0, 0x00);
else if (kbc_ven == KBC_VEN_COMPAQ)
uint8_t p1_out = ((dev->p1 | fixed_bits) & 0xf0) |
(((dev->flags & KBC_VEN_MASK) == KBC_VEN_ACER) ? 0x08 : 0x0c);
if (!strcmp(machine_get_internal_name(), "alfredo"))
p1_out &= 0xef;
kbc_delay_to_ob(dev, p1_out, 0, 0x00);
} else if (kbc_ven == KBC_VEN_COMPAQ)
kbc_delay_to_ob(dev, dev->p1 | (hasfpu ? 0x00 : 0x04), 0, 0x00);
else
/* (B0 or F0) | (0x04 or 0x44) */
@@ -1578,8 +1582,13 @@ write64_phoenix(void *priv, uint8_t val)
case 0xd5: /* Read MultiKey code revision level */
kbc_at_log("ATkbc: Phoenix - Read MultiKey code revision level\n");
if (dev->misc_flags & FLAG_PS2) {
kbc_at_queue_add(dev, 0x04);
kbc_at_queue_add(dev, 0x16);
if (dev->flags & DEVICE_PCI) {
kbc_at_queue_add(dev, 0x04);
kbc_at_queue_add(dev, 0x16);
} else {
kbc_at_queue_add(dev, 0x01);
kbc_at_queue_add(dev, 0x38);
}
} else {
kbc_at_queue_add(dev, 0x01);
kbc_at_queue_add(dev, 0x29);
@@ -1598,9 +1607,15 @@ write64_phoenix(void *priv, uint8_t val)
case 0xd7: /* Read MultiKey model numbers */
kbc_at_log("ATkbc: Phoenix - Read MultiKey model numbers\n");
if (dev->misc_flags & FLAG_PS2) {
kbc_at_queue_add(dev, 0x02);
kbc_at_queue_add(dev, 0x87);
kbc_at_queue_add(dev, 0x02);
if (dev->flags & DEVICE_PCI) {
kbc_at_queue_add(dev, 0x02);
kbc_at_queue_add(dev, 0x87);
kbc_at_queue_add(dev, 0x02);
} else {
kbc_at_queue_add(dev, 0x99);
kbc_at_queue_add(dev, 0x75);
kbc_at_queue_add(dev, 0x01);
}
} else {
kbc_at_queue_add(dev, 0x90);
kbc_at_queue_add(dev, 0x88);
@@ -2608,6 +2623,20 @@ const device_t keyboard_ps2_ami_device = {
.config = NULL
};
const device_t keyboard_ps2_compaq_device = {
.name = "PS/2 Keyboard (Compaq)",
.internal_name = "keyboard_at_compaq",
.flags = DEVICE_KBC,
.local = KBC_TYPE_PS2_1 | KBC_VEN_COMPAQ,
.init = kbc_at_init,
.close = kbc_at_close,
.reset = kbc_at_reset,
.available = NULL,
.speed_changed = NULL,
.force_redraw = NULL,
.config = NULL
};
const device_t keyboard_ps2_holtek_device = {
.name = "PS/2 Keyboard (Holtek)",
.internal_name = "keyboard_ps2_holtek",
@@ -2775,3 +2804,17 @@ const device_t keyboard_ps2_acer_pci_device = {
.force_redraw = NULL,
.config = NULL
};
const device_t keyboard_ps2_phoenix_pci_device = {
.name = "PS/2 Keyboard (Phoenix)",
.internal_name = "keyboard_ps2_acer_pci",
.flags = DEVICE_KBC | DEVICE_PCI,
.local = KBC_TYPE_PS2_1 | KBC_VEN_PHOENIX,
.init = kbc_at_init,
.close = kbc_at_close,
.reset = kbc_at_reset,
.available = NULL,
.speed_changed = NULL,
.force_redraw = NULL,
.config = NULL
};

View File

@@ -1281,14 +1281,15 @@ machine_at_ninja_init(const machine_t *model)
if (bios_only || !ret)
return ret;
machine_at_common_init(model);
machine_at_common_init_ex(model, 2);
device_add(&amstrad_megapc_nvr_device);
pci_init(PCI_CONFIG_TYPE_1);
pci_register_slot(0x05, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0);
pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 1, 2);
pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 1, 2, 1);
pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 1, 2, 1);
device_add(&keyboard_ps2_intel_ami_pci_device);
device_add(&keyboard_ps2_phoenix_device);
device_add(&intel_flash_bxt_ami_device);
device_add(&i420ex_device);

View File

@@ -194,8 +194,6 @@ win_keyboard_handle(uint32_t scancode, int up, int e0, int e1)
it's not an invalid scan code. */
if (scancode != 0xFFFF)
keyboard_input(!up, scancode);
main_window->checkFullscreenHotkey();
}
}
@@ -370,8 +368,6 @@ emu_LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
else if ((lpKdhs->scanCode == 0x3e) && (lpKdhs->flags & LLKHF_ALTDOWN) &&
!(lpKdhs->flags & (LLKHF_UP | LLKHF_EXTENDED)))
ret = TRUE;
else if ((lpKdhs->scanCode == 0x49) && bCtrlDown && !(lpKdhs->flags & LLKHF_UP))
ret = TRUE;
else if ((lpKdhs->scanCode >= 0x5b) && (lpKdhs->scanCode <= 0x5d) && (lpKdhs->flags & LLKHF_EXTENDED))
ret = TRUE;
else if (inhibit_multimedia_keys

View File

@@ -674,6 +674,13 @@ MainWindow::MainWindow(QWidget *parent)
/* Remove default Shift+F10 handler, which unfocuses keyboard input even with no context menu. */
connect(new QShortcut(QKeySequence(Qt::SHIFT + Qt::Key_F10), this), &QShortcut::activated, this, [](){});
auto windowedShortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::ALT + Qt::Key_PageDown), this);
windowedShortcut->setContext(Qt::ShortcutContext::ApplicationShortcut);
connect(windowedShortcut, &QShortcut::activated, this, [this] () {
if (video_fullscreen)
ui->actionFullscreen->trigger();
});
connect(this, &MainWindow::initRendererMonitor, this, &MainWindow::initRendererMonitorSlot);
connect(this, &MainWindow::initRendererMonitorForNonQtThread, this, &MainWindow::initRendererMonitorSlot, Qt::BlockingQueuedConnection);
connect(this, &MainWindow::destroyRendererMonitor, this, &MainWindow::destroyRendererMonitorSlot);
@@ -696,6 +703,22 @@ MainWindow::MainWindow(QWidget *parent)
});
#endif
QTimer::singleShot(0, this, [this]() {
for (auto curObj : this->menuBar()->children()) {
if (qobject_cast<QMenu *>(curObj)) {
auto menu = qobject_cast<QMenu *>(curObj);
for (auto curObj2 : menu->children()) {
if (qobject_cast<QAction *>(curObj2)) {
auto action = qobject_cast<QAction *>(curObj2);
if (!action->shortcut().isEmpty()) {
this->insertAction(nullptr, action);
}
}
}
}
}
});
actGroup = new QActionGroup(this);
actGroup->addAction(ui->actionCursor_Puck);
actGroup->addAction(ui->actionPen);
@@ -833,6 +856,11 @@ MainWindow::initRendererMonitorSlot(int monitor_index)
});
secondaryRenderer->setWindowFlags(Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint);
secondaryRenderer->setWindowTitle(QObject::tr("86Box Monitor #") + QString::number(monitor_index + 1));
secondaryRenderer->setContextMenuPolicy(Qt::PreventContextMenu);
for (int i = 0; i < this->actions().size(); i++) {
secondaryRenderer->addAction(this->actions()[i]);
}
if (vid_resize == 2)
secondaryRenderer->setFixedSize(fixed_size_x, fixed_size_y);
@@ -1360,18 +1388,9 @@ MainWindow::keyPressEvent(QKeyEvent *event)
#endif
}
checkFullscreenHotkey();
if (keyboard_ismsexit())
plat_mouse_capture(0);
if ((video_fullscreen > 0) && (keyboard_recv_ui(0x1D) || keyboard_recv_ui(0x11D))) {
if (keyboard_recv_ui(0x57))
ui->actionTake_screenshot->trigger();
else if (keyboard_recv_ui(0x58))
pc_send_cad();
}
event->accept();
}
@@ -1403,28 +1422,6 @@ MainWindow::keyReleaseEvent(QKeyEvent *event)
processKeyboardInput(false, event->nativeScanCode());
#endif
}
checkFullscreenHotkey();
}
void
MainWindow::checkFullscreenHotkey()
{
if (!fs_off_signal && video_fullscreen && keyboard_isfsexit()) {
/* Signal "exit fullscreen mode". */
fs_off_signal = true;
} else if (fs_off_signal && video_fullscreen && keyboard_isfsexit_up()) {
ui->actionFullscreen->trigger();
fs_off_signal = false;
}
if (!fs_on_signal && !video_fullscreen && keyboard_isfsenter()) {
/* Signal "enter fullscreen mode". */
fs_on_signal = true;
} else if (fs_on_signal && !video_fullscreen && keyboard_isfsenter_up()) {
ui->actionFullscreen->trigger();
fs_on_signal = false;
}
}
QSize

View File

@@ -31,7 +31,6 @@ public:
void blitToWidget(int x, int y, int w, int h, int monitor_index);
QSize getRenderWidgetSize();
void setSendKeyboardInput(bool enabled);
void checkFullscreenHotkey();
void reloadAllRenderers();
std::array<std::unique_ptr<RendererStack>, 8> renderers;

View File

@@ -1055,7 +1055,7 @@ scsi_cdrom_read_data(scsi_cdrom_t *dev, const int msf, const int type, const int
ret = -1;
} else {
ret = 1;
for (int i = 0; (i < num) && (ret > 0); i++) {
for (int i = 0; (i < num) && (ret > 0) && (dev->sector_len > 0); i++) {
ret = cdrom_readsector_raw(dev->drv, dev->buffer + dev->buffer_pos,
dev->sector_pos, msf, type,
flags, &temp_len, vendor_type);
@@ -1070,7 +1070,11 @@ scsi_cdrom_read_data(scsi_cdrom_t *dev, const int msf, const int type, const int
if ((dev->drv->bus_type != CDROM_BUS_SCSI) &&
(scsi_cdrom_current_mode(dev) != 2)) {
num = (dev->packet_len / dev->block_len);
num = (dev->tf->request_length < dev->block_len) ?
dev->block_len : dev->tf->request_length;
num = (num / dev->block_len) * dev->block_len;
if (num > dev->sector_len)
num = dev->sector_len;
}
}

View File

@@ -686,7 +686,7 @@ bochs_vbe_pci_read(const int func, const int addr, void *priv)
ret = dev->pci_rom_enable & 0x01;
break;
case 0x32:
ret = dev->rom_addr & 0xff;
ret = dev->rom_addr & 0xfc;
break;
case 0x33:
ret = (dev->rom_addr & 0xff00) >> 8;
@@ -743,6 +743,7 @@ bochs_vbe_pci_write(const int func, const int addr, const uint8_t val, void *pri
mem_mapping_disable(&dev->linear_mapping_2);
mem_mapping_disable(&dev->linear_mapping);
mem_mapping_disable(&dev->svga.mapping);
mem_mapping_disable(&dev->bios_rom.mapping);
if (dev->pci_conf_status & PCI_COMMAND_IO) {
io_sethandler(0x03c0, 0x0020, bochs_vbe_in, NULL, NULL,
bochs_vbe_out, NULL, NULL, dev);
@@ -751,11 +752,13 @@ bochs_vbe_pci_write(const int func, const int addr, const uint8_t val, void *pri
}
if (dev->pci_conf_status & PCI_COMMAND_MEM) {
mem_mapping_enable(&dev->svga.mapping);
if (dev->pci_regs[0x13] != 0x00) {
if ((dev->pci_regs[0x13] != 0x00) && (dev->pci_regs[0x13] != 0xff)) {
mem_mapping_enable(&dev->linear_mapping);
if (dev->pci_regs[0x13] != 0xe0)
mem_mapping_enable(&dev->linear_mapping_2);
}
if (dev->pci_rom_enable && (dev->rom_addr != 0x0000) && (dev->rom_addr < 0xfff8))
mem_mapping_set_addr(&dev->bios_rom.mapping, dev->rom_addr << 16, 0x10000);
}
break;
case 0x13:
@@ -764,7 +767,7 @@ bochs_vbe_pci_write(const int func, const int addr, const uint8_t val, void *pri
mem_mapping_disable(&dev->linear_mapping_2);
mem_mapping_disable(&dev->linear_mapping);
if ((dev->pci_conf_status & PCI_COMMAND_MEM) && (val != 0x00)) {
if ((dev->pci_conf_status & PCI_COMMAND_MEM) && (val != 0x00) && (val != 0xff)) {
mem_mapping_set_addr(&dev->linear_mapping, val << 24, 0x01000000);
if (val != 0xe0)
mem_mapping_set_addr(&dev->linear_mapping_2, 0xe0000000, 0x01000000);
@@ -776,18 +779,26 @@ bochs_vbe_pci_write(const int func, const int addr, const uint8_t val, void *pri
case 0x30:
dev->pci_rom_enable = val & 0x01;
mem_mapping_disable(&dev->bios_rom.mapping);
if (dev->pci_rom_enable)
if (dev->pci_rom_enable && (dev->pci_conf_status & PCI_COMMAND_MEM) &&
(dev->rom_addr != 0x0000) && (dev->rom_addr < 0xfff8)) {
mem_mapping_set_addr(&dev->bios_rom.mapping, dev->rom_addr << 16, 0x10000);
}
break;
case 0x32:
dev->rom_addr = (dev->rom_addr & 0xff00) | (val & 0xfc);
if (dev->pci_rom_enable)
mem_mapping_disable(&dev->bios_rom.mapping);
if (dev->pci_rom_enable && (dev->pci_conf_status & PCI_COMMAND_MEM) &&
(dev->rom_addr != 0x0000) && (dev->rom_addr < 0xfff8)) {
mem_mapping_set_addr(&dev->bios_rom.mapping, dev->rom_addr << 16, 0x10000);
}
break;
case 0x33:
dev->rom_addr = (dev->rom_addr & 0x00ff) | (val << 8);
if (dev->pci_rom_enable)
mem_mapping_disable(&dev->bios_rom.mapping);
if (dev->pci_rom_enable && (dev->pci_conf_status & PCI_COMMAND_MEM) &&
(dev->rom_addr != 0x0000) && (dev->rom_addr < 0xfff8)) {
mem_mapping_set_addr(&dev->bios_rom.mapping, dev->rom_addr << 16, 0x10000);
}
break;
}
}

File diff suppressed because it is too large Load Diff