From 17f9ed66da73c054bdc6e92697d164eb9f7bd35b Mon Sep 17 00:00:00 2001 From: TC1995 Date: Tue, 31 Dec 2024 20:43:02 +0100 Subject: [PATCH 1/2] DMA change of the day (December 31st, 2024) Actually add DMA PS/2 (MCA) XFER commands 0x9 (Set DMA Mask), 0xa (Reset DMA mask) and 0xb to addr 0x1a in both r/w parts. --- src/dma.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/dma.c b/src/dma.c index 86c29fe26..4edeb39f8 100644 --- a/src/dma.c +++ b/src/dma.c @@ -665,6 +665,19 @@ dma_ps2_read(uint16_t addr, UNUSED(void *priv)) temp = dma_c->arb_level; break; + case 9: /*Set DMA mask*/ + dma_m |= (1 << dma_ps2.xfr_channel); + break; + + case 0xa: /*Reset DMA mask*/ + dma_m &= ~(1 << dma_ps2.xfr_channel); + break; + + case 0xb: + if (!(dma_m & (1 << dma_ps2.xfr_channel))) + dma_ps2_run(dma_ps2.xfr_channel); + break; + default: fatal("Bad XFR Read command %i channel %i\n", dma_ps2.xfr_command, dma_ps2.xfr_channel); } @@ -767,6 +780,19 @@ dma_ps2_write(uint16_t addr, uint8_t val, UNUSED(void *priv)) dma_c->arb_level = val; break; + case 9: /*Set DMA mask*/ + dma_m |= (1 << dma_ps2.xfr_channel); + break; + + case 0xa: /*Reset DMA mask*/ + dma_m &= ~(1 << dma_ps2.xfr_channel); + break; + + case 0xb: + if (!(dma_m & (1 << dma_ps2.xfr_channel))) + dma_ps2_run(dma_ps2.xfr_channel); + break; + default: fatal("Bad XFR command %i channel %i val %02x\n", dma_ps2.xfr_command, dma_ps2.xfr_channel, val); } From e0daf34629ff5aca65ff92a5acaebcae7183841d Mon Sep 17 00:00:00 2001 From: TC1995 Date: Tue, 31 Dec 2024 21:29:59 +0100 Subject: [PATCH 2/2] SCSI CD-ROM change of the day (December 31st, 2024) Added undocumented 0xC5 NEC SCSI-2 CD-ROM command (most likely a no op command like 0x0D). --- src/include/86box/scsi_device.h | 1 + src/scsi/scsi_cdrom.c | 12 +++++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/include/86box/scsi_device.h b/src/include/86box/scsi_device.h index 3f9f3791b..6fdac5ebd 100644 --- a/src/include/86box/scsi_device.h +++ b/src/include/86box/scsi_device.h @@ -129,6 +129,7 @@ #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_UNKNOWN_SCSI2_NEC 0xc5 /* NEC Vendor Unique Command */ #define GPCMD_STOP_CHINON 0xc6 /* Chinon Vendor Unique command */ #define GPCMD_PLAY_TRACK_SONY 0xc6 /* Sony Vendor Unique command */ #define GPCMD_READ_SUBCODEQ_PLAYING_STATUS_TOSHIBA 0xc6 /* Toshiba Vendor Unique command */ diff --git a/src/scsi/scsi_cdrom.c b/src/scsi/scsi_cdrom.c index fc8f93e51..ad7f0d1c0 100644 --- a/src/scsi/scsi_cdrom.c +++ b/src/scsi/scsi_cdrom.c @@ -2114,7 +2114,7 @@ scsi_cdrom_command_matsushita(void *sc, uint8_t *cdb, int32_t *BufLen) dev->current_cdb[0] = cdb[0]; /* Keep cmd_stat at 0x00, therefore, it's going to process it as GPCMD_PLAY_AUDIO_MSF. */ break; - + case GPCMD_PLAY_AUDIO_TRACK_INDEX_MATSUSHITA: cdb[0] = GPCMD_PLAY_AUDIO_TRACK_INDEX; dev->current_cdb[0] = cdb[0]; @@ -2166,6 +2166,12 @@ scsi_cdrom_command_nec(void *sc, uint8_t *cdb, int32_t *BufLen) cmd_stat = 0x01; break; + case GPCMD_UNKNOWN_SCSI2_NEC: + scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS); + scsi_cdrom_command_complete(dev); + cmd_stat = 0x01; + break; + case GPCMD_AUDIO_TRACK_SEARCH_NEC: scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS); if ((dev->drv->image_path[0] == 0x00) || (dev->drv->cd_status <= CD_STATUS_DATA_ONLY)) @@ -2305,7 +2311,7 @@ scsi_cdrom_command_pioneer(void *sc, uint8_t *cdb, int32_t *BufLen) else { ret = cdrom_read_disc_info_toc(dev->drv, dev->buffer, cdb[2], cdb[1] & 3); len = 4; - + if (ret) { scsi_cdrom_set_buf_len(dev, BufLen, &len); scsi_cdrom_data_command_finish(dev, len, len, len, 0); @@ -2844,7 +2850,7 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb) } } else ret = scsi_cdrom_read_blocks(dev, &alloc_length, 1, 0); - + if (ret > 0) { dev->requested_blocks = max_len; dev->packet_len = alloc_length;