diff --git a/debian/rules b/debian/rules old mode 100755 new mode 100644 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/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/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/cpu/cpu.c b/src/cpu/cpu.c index 4970be519..e7e1c10e8 100644 --- a/src/cpu/cpu.c +++ b/src/cpu/cpu.c @@ -1167,7 +1167,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); 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/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/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/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 diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index 77678a4dd..a7304caa1 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -683,6 +683,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 *); @@ -704,7 +705,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/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/mac/icons/beta/86Box.icns b/src/mac/icons/beta/86Box.icns index 0068beeda..e1e78daa7 100644 Binary files a/src/mac/icons/beta/86Box.icns and b/src/mac/icons/beta/86Box.icns differ diff --git a/src/mac/icons/branch/86Box.icns b/src/mac/icons/branch/86Box.icns index a2631c66e..f466bfe3f 100644 Binary files a/src/mac/icons/branch/86Box.icns and b/src/mac/icons/branch/86Box.icns differ diff --git a/src/mac/icons/dev/86Box.icns b/src/mac/icons/dev/86Box.icns index 5ff137b55..9663821d5 100644 Binary files a/src/mac/icons/dev/86Box.icns and b/src/mac/icons/dev/86Box.icns differ diff --git a/src/mac/icons/release/86Box.icns b/src/mac/icons/release/86Box.icns index 4f15661ed..8d375d4bf 100644 Binary files a/src/mac/icons/release/86Box.icns and b/src/mac/icons/release/86Box.icns differ diff --git a/src/machine/m_at_slot1.c b/src/machine/m_at_slot1.c index 3623d55c9..21f9109de 100644 --- a/src/machine/m_at_slot1.c +++ b/src/machine/m_at_slot1.c @@ -646,6 +646,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) { @@ -765,7 +807,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/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) { diff --git a/src/machine/m_ps2_mca.c b/src/machine/m_ps2_mca.c index 90c69aa3c..cfe6ba6bd 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; @@ -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; diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 50666841f..d9d2a64ee 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, diff --git a/src/mem/sst_flash.c b/src/mem/sst_flash.c index 8bf0dc6c9..5ad110fa5 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 = "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", diff --git a/src/nvr_at.c b/src/nvr_at.c index 1c6bfc484..4cff5ed63 100644 --- a/src/nvr_at.c +++ b/src/nvr_at.c @@ -938,6 +938,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, + 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, + NULL, NULL, NULL, nvr_write, NULL, NULL, nvr); + io_handler(1, 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) { @@ -1043,13 +1060,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; @@ -1125,7 +1142,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) || ((info->local & 0x1f) == 0x17)) { io_sethandler(0x0072, 2, nvr_read, NULL, NULL, nvr_write, NULL, NULL, nvr); } 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/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 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; diff --git a/src/sound/snd_optimc.c b/src/sound/snd_optimc.c index b54174ce0..7a76d3258 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) @@ -102,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 @@ -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 }; 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; 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 diff --git a/src/win/win_settings.c b/src/win/win_settings.c index afb283adc..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; @@ -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;