diff --git a/src/device/mouse_microtouch_touchscreen.c b/src/device/mouse_microtouch_touchscreen.c index 72ac9c53a..5d4d6bafb 100644 --- a/src/device/mouse_microtouch_touchscreen.c +++ b/src/device/mouse_microtouch_touchscreen.c @@ -10,7 +10,7 @@ * * * - * Authors: Cacodemon345 + * Authors: Cacodemon345, mourix * * Copyright 2024 Cacodemon345 */ @@ -415,7 +415,7 @@ static const device_config_t mtouch_config[] = { }; const device_t mouse_mtouch_device = { - .name = "3M MicroTouch TouchPen 4", + .name = "3M MicroTouch (Serial)", .internal_name = "microtouch_touchpen", .flags = DEVICE_COM, .local = 0, diff --git a/src/floppy/fdd_imd.c b/src/floppy/fdd_imd.c index a5cd8f056..fd6c59d01 100644 --- a/src/floppy/fdd_imd.c +++ b/src/floppy/fdd_imd.c @@ -45,6 +45,7 @@ typedef struct imd_track_t { uint32_t gap3_len; uint16_t side_flags; uint8_t max_sector_size; + uint8_t spt; } imd_track_t; typedef struct imd_t { @@ -711,6 +712,9 @@ imd_load(int drive, char *fn) imd[drive] = dev; while (1) { + imd_log("In : %02X %02X %02X %02X %02X\n", + buffer2[0], buffer2[1], buffer2[2], buffer2[3], buffer2[4]); + track = buffer2[1]; side = buffer2[2]; if (side & 1) @@ -718,16 +722,20 @@ imd_load(int drive, char *fn) extra = side & 0xC0; side &= 0x3F; + track_spt = buffer2[3]; + dev->tracks[track][side].spt = track_spt; + sector_size = buffer2[4]; + dev->tracks[track][side].side_flags = (buffer2[0] % 3); - if (!dev->tracks[track][side].side_flags) + if ((track_spt != 0x00) && (!dev->tracks[track][side].side_flags)) dev->disk_flags |= 0x02; - dev->tracks[track][side].side_flags |= (!(buffer2[0] - dev->tracks[track][side].side_flags) ? 0 : 8); + dev->tracks[track][side].side_flags |= + (!(buffer2[0] - dev->tracks[track][side].side_flags) ? 0 : 8); mfm = dev->tracks[track][side].side_flags & 8; track_total = mfm ? 146 : 73; pre_sector = mfm ? 60 : 42; - track_spt = buffer2[3]; - sector_size = buffer2[4]; + imd_log("Out : %02X %02X %02X %02X %02X\n", buffer2[0], track, side, track_spt, sector_size); if ((track_spt == 15) && (sector_size == 2)) dev->tracks[track][side].side_flags |= 0x20; if ((track_spt == 16) && (sector_size == 2)) @@ -744,7 +752,7 @@ imd_load(int drive, char *fn) dev->tracks[track][side].max_sector_size = 5; if (!mfm) dev->tracks[track][side].max_sector_size--; - imd_log("Side flags for (%02i)(%01i): %02X\n", track, side, dev->tracks[track][side].side_flags); + imd_log("Side flags for (%02i)(%01i): %02X\n", track, side, dev->tracks[track] [side].side_flags); dev->tracks[track][side].is_present = 1; dev->tracks[track][side].file_offs = (buffer2 - buffer); memcpy(dev->tracks[track][side].params, buffer2, 5); @@ -762,7 +770,6 @@ imd_load(int drive, char *fn) } if (track_spt == 0x00) { - dev->tracks[track][side].n_map_offs = last_offset; buffer2 = buffer + last_offset; last_offset += track_spt; dev->tracks[track][side].is_present = 0; @@ -872,7 +879,7 @@ imd_load(int drive, char *fn) } dev->tracks[track][side].gap3_len = (size_diff - minimum_gap4) / track_spt; - } else if ((track_spt == 0x00) || (gap3_sizes[converted_rate][sector_size][track_spt] != 0x00)) + } else dev->tracks[track][side].gap3_len = gap3_sizes[converted_rate][sector_size][track_spt]; /* imd_log("GAP3 length for (%02i)(%01i): %i bytes\n", track, side, dev->tracks[track][side].gap3_len); */ @@ -886,6 +893,32 @@ imd_load(int drive, char *fn) /* If more than 43 tracks, then the tracks are thin (96 tpi). */ dev->track_count++; + imd_log("In : dev->track_count = %i\n", dev->track_count); + + int empty_tracks = 0; + for (int i = 0; i < dev->track_count; i++) { + if ((dev->sides == 2) && (dev->tracks[i][0].spt == 0x00) && (dev->tracks[i][1].spt == 0x00)) + empty_tracks++; + else if ((dev->sides == 1) && (dev->tracks[i][0].spt == 0x00)) + empty_tracks++; + } + imd_log("empty_tracks = %i\n", empty_tracks); + + if (empty_tracks >= (dev->track_count >> 1)) { + for (int i = 0; i < dev->track_count; i += 2) { + imd_log("Thick %02X = Thin %02X\n", i >> 1, i); + dev->tracks[i >> 1][0] = dev->tracks[i][0]; + dev->tracks[i >> 1][1] = dev->tracks[i][1]; + } + for (int i = (dev->track_count >> 1); i < dev->track_count; i++) { + imd_log("Emptying %02X....\n", i); + memset(&(dev->tracks[i][0]), 1, sizeof(imd_track_t)); + memset(&(dev->tracks[i][1]), 1, sizeof(imd_track_t)); + } + dev->track_count >>= 1; + } + imd_log("Out: dev->track_count = %i\n", dev->track_count); + dev->track_width = 0; if (dev->track_count > 43) dev->track_width = 1; diff --git a/src/include/86box/snd_sb.h b/src/include/86box/snd_sb.h index b26c5f06e..70fcff387 100644 --- a/src/include/86box/snd_sb.h +++ b/src/include/86box/snd_sb.h @@ -187,6 +187,8 @@ typedef struct sb_t { uint8_t pnp_rom[512]; uint16_t opl_pnp_addr; + + uint16_t midi_addr; uint16_t gameport_addr; void *opl_mixer; diff --git a/src/include/86box/snd_sb_dsp.h b/src/include/86box/snd_sb_dsp.h index 9bc1d2308..0bc719d98 100644 --- a/src/include/86box/snd_sb_dsp.h +++ b/src/include/86box/snd_sb_dsp.h @@ -91,6 +91,8 @@ typedef struct sb_dsp_t { uint8_t sbref; int8_t sbstep; + uint8_t activity; + int sbdacpos; int sbleftright; diff --git a/src/sound/snd_sb.c b/src/sound/snd_sb.c index 364c01557..882eaceea 100644 --- a/src/sound/snd_sb.c +++ b/src/sound/snd_sb.c @@ -1374,6 +1374,70 @@ sb_ct1745_mixer_reset(sb_t *sb) } } +static void +ess_base_write(uint16_t addr, uint8_t val, void *priv) +{ + sb_t * ess = (sb_t *) priv; + + switch (addr & 0x000f) { + case 0x0002: + case 0x0003: + case 0x0006: + case 0x000c: + ess->dsp.activity &= 0xdf; + break; + case 0x0008: + case 0x0009: + ess->dsp.activity &= 0x7f; + break; + } +} + +static uint8_t +ess_base_read(uint16_t addr, void *priv) +{ + sb_t * ess = (sb_t *) priv; + + switch (addr & 0x000f) { + case 0x0002: + case 0x0003: + case 0x0004: /* Undocumented but tested by the LBA 2 ES688 driver. */ + case 0x000a: + ess->dsp.activity &= 0xdf; + break; + case 0x0008: + case 0x0009: + ess->dsp.activity &= 0x7f; + break; + case 0x000c: + case 0x000e: + ess->dsp.activity &= 0xbf; + break; + } + + sb_log("ess_base_read(%04X): %04X, activity now: %02X\n", addr, addr & 0x000f, ess->dsp.activity); + + return 0xff; +} + +static void +ess_fm_midi_write(uint16_t addr, uint8_t val, void *priv) +{ + sb_t * ess = (sb_t *) priv; + + ess->dsp.activity &= 0x7f; +} + +static uint8_t +ess_fm_midi_read(uint16_t addr, void *priv) +{ + sb_t * ess = (sb_t *) priv; + + ess->dsp.activity &= 0x7f; + + return 0xff; +} + void ess_mixer_write(uint16_t addr, uint8_t val, void *priv) { @@ -1500,6 +1564,12 @@ ess_mixer_write(uint16_t addr, uint8_t val, void *priv) { uint16_t mpu401_base_addr = 0x300 | ((mixer->regs[0x40] << 1) & 0x30); sb_log("mpu401_base_addr = %04X\n", mpu401_base_addr); + + io_removehandler(ess->midi_addr, 0x0002, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); + gameport_remap(ess->gameport, !(mixer->regs[0x40] & 0x2) ? 0x00 : 0x200); if (ess->dsp.sb_subtype != SB_SUBTYPE_ESS_ES1688) { @@ -1519,7 +1589,8 @@ ess_mixer_write(uint16_t addr, uint8_t val, void *priv) default: break; case 0: - mpu401_change_addr(ess->mpu, 0x00); + mpu401_base_addr = 0x0000; + mpu401_change_addr(ess->mpu, mpu401_base_addr); mpu401_setirq(ess->mpu, -1); break; case 1: @@ -1551,6 +1622,11 @@ ess_mixer_write(uint16_t addr, uint8_t val, void *priv) mpu401_setirq(ess->mpu, 10); break; } + ess->midi_addr = mpu401_base_addr; + io_sethandler(addr, 0x0002, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); break; } @@ -2166,15 +2242,36 @@ ess_x688_pnp_config_changed(UNUSED(const uint8_t ld), isapnp_device_config_t *co ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, ess->opl.priv); + io_removehandler(addr, 0x0004, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); io_removehandler(addr + 8, 0x0002, ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, ess->opl.priv); + io_removehandler(addr + 8, 0x0002, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); io_removehandler(addr + 4, 0x0002, ess_mixer_read, NULL, NULL, ess_mixer_write, NULL, NULL, ess); + io_removehandler(addr + 2, 0x0004, + ess_base_read, NULL, NULL, + ess_base_write, NULL, NULL, + ess); + io_removehandler(addr + 6, 0x0001, + ess_base_read, NULL, NULL, + ess_base_write, NULL, NULL, + ess); + io_removehandler(addr + 0x0a, 0x0006, + ess_base_read, NULL, NULL, + ess_base_write, NULL, NULL, + ess); + ess->mixer_ess.ess_id_str[2] = 0x00; ess->mixer_ess.ess_id_str[3] = 0x00; @@ -2185,10 +2282,23 @@ ess_x688_pnp_config_changed(UNUSED(const uint8_t ld), isapnp_device_config_t *co ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, ess->opl.priv); + io_removehandler(addr, 0x0004, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); } - if (ess->pnp == 3) - mpu401_change_addr(ess->mpu, 0); + if (ess->pnp == 3) { + addr = ess->midi_addr; + if (addr) { + ess->midi_addr = 0; + mpu401_change_addr(ess->mpu, 0); + io_removehandler(addr, 0x0002, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); + } + } sb_dsp_setaddr(&ess->dsp, 0); sb_dsp_setirq(&ess->dsp, 0); @@ -2204,16 +2314,36 @@ ess_x688_pnp_config_changed(UNUSED(const uint8_t ld), isapnp_device_config_t *co ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, ess->opl.priv); + io_sethandler(addr, 0x0004, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); io_sethandler(addr + 8, 0x0002, ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, ess->opl.priv); + io_sethandler(addr + 8, 0x0002, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); io_sethandler(addr + 4, 0x0002, ess_mixer_read, NULL, NULL, ess_mixer_write, NULL, NULL, ess); sb_dsp_setaddr(&ess->dsp, addr); + io_sethandler(addr + 2, 0x0004, + ess_base_read, NULL, NULL, + ess_base_write, NULL, NULL, + ess); + io_sethandler(addr + 6, 0x0001, + ess_base_read, NULL, NULL, + ess_base_write, NULL, NULL, + ess); + io_sethandler(addr + 0x0a, 0x0006, + ess_base_read, NULL, NULL, + ess_base_write, NULL, NULL, + ess); ess->mixer_ess.ess_id_str[2] = (addr >> 8) & 0xff; ess->mixer_ess.ess_id_str[3] = addr & 0xff; @@ -2226,12 +2356,21 @@ ess_x688_pnp_config_changed(UNUSED(const uint8_t ld), isapnp_device_config_t *co ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, ess->opl.priv); + io_sethandler(addr, 0x0004, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); } if (ess->pnp == 3) { addr = config->io[2].base; - if (addr != ISAPNP_IO_DISABLED) + if (addr != ISAPNP_IO_DISABLED) { mpu401_change_addr(ess->mpu, addr); + io_sethandler(addr, 0x0002, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); + } } val = config->irq[0].irq; @@ -2312,27 +2451,58 @@ ess_soundpiper_mca_write(const int port, const uint8_t val, void *priv) ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, ess->opl.priv); + io_removehandler(ess->dsp.sb_addr, 0x0004, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); io_removehandler(ess->dsp.sb_addr + 8, 0x0002, ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, ess->opl.priv); + io_removehandler(ess->dsp.sb_addr + 8, 0x0002, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); io_removehandler(0x0388, 0x0004, ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, ess->opl.priv); + io_removehandler(0x0388, 0x0004, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); io_removehandler(ess->dsp.sb_addr + 4, 0x0002, ess_mixer_read, NULL, NULL, ess_mixer_write, NULL, NULL, ess); + + io_removehandler(ess->dsp.sb_addr + 2, 0x0004, + ess_base_read, NULL, NULL, + ess_base_write, NULL, NULL, + ess); + io_removehandler(ess->dsp.sb_addr + 6, 0x0001, + ess_base_read, NULL, NULL, + ess_base_write, NULL, NULL, + ess); + io_removehandler(ess->dsp.sb_addr + 0x0a, 0x0006, + ess_base_read, NULL, NULL, + ess_base_write, NULL, NULL, + ess); } /* DSP I/O handler is activated in sb_dsp_setaddr */ sb_dsp_setaddr(&ess->dsp, 0); gameport_remap(ess->gameport, 0); - if (ess->dsp.sb_subtype == SB_SUBTYPE_ESS_ES1688) + if (ess->dsp.sb_subtype == SB_SUBTYPE_ESS_ES1688) { mpu401_change_addr(ess->mpu, 0); + io_removehandler(0x0330, 0x0002, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); + } + ess->pos_regs[port & 7] = val; if (ess->pos_regs[2] & 1) { @@ -2353,20 +2523,52 @@ ess_soundpiper_mca_write(const int port, const uint8_t val, void *priv) ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, ess->opl.priv); + io_sethandler(ess->dsp.sb_addr, 0x0004, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); io_sethandler(ess->dsp.sb_addr + 8, 0x0002, ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, ess->opl.priv); + io_sethandler(ess->dsp.sb_addr + 8, 0x0002, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); io_sethandler(0x0388, 0x0004, ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, ess->opl.priv); + io_sethandler(0x0388, 0x0004, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); io_sethandler(ess->dsp.sb_addr + 4, 0x0002, ess_mixer_read, NULL, NULL, ess_mixer_write, NULL, NULL, ess); - if (ess->dsp.sb_subtype == SB_SUBTYPE_ESS_ES1688) + io_sethandler(ess->dsp.sb_addr + 2, 0x0004, + ess_base_read, NULL, NULL, + ess_base_write, NULL, NULL, + ess); + io_sethandler(ess->dsp.sb_addr + 6, 0x0001, + ess_base_read, NULL, NULL, + ess_base_write, NULL, NULL, + ess); + io_sethandler(ess->dsp.sb_addr + 0x0a, 0x0006, + ess_base_read, NULL, NULL, + ess_base_write, NULL, NULL, + ess); + + if (ess->dsp.sb_subtype == SB_SUBTYPE_ESS_ES1688) { mpu401_change_addr(ess->mpu, ess->pos_regs[3] & 0x02 ? 0x0330 : 0); + + if (ess->pos_regs[3] & 0x02) + io_sethandler(0x0330, 0x0002, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); + } } /* DSP I/O handler is activated in sb_dsp_setaddr */ @@ -2420,25 +2622,57 @@ ess_chipchat_mca_write(int port, uint8_t val, void *priv) ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, ess->opl.priv); + io_removehandler(ess->dsp.sb_addr, 0x0004, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); io_removehandler(ess->dsp.sb_addr + 8, 0x0002, ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, ess->opl.priv); + io_removehandler(ess->dsp.sb_addr + 8, 0x0002, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); io_removehandler(0x0388, 0x0004, ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, ess->opl.priv); + io_removehandler(0x0388, 0x0004, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); io_removehandler(ess->dsp.sb_addr + 4, 0x0002, ess_mixer_read, NULL, NULL, ess_mixer_write, NULL, NULL, ess); + + io_removehandler(ess->dsp.sb_addr + 2, 0x0004, + ess_base_read, NULL, NULL, + ess_base_write, NULL, NULL, + ess); + io_removehandler(ess->dsp.sb_addr + 6, 0x0001, + ess_base_read, NULL, NULL, + ess_base_write, NULL, NULL, + ess); + io_removehandler(ess->dsp.sb_addr + 0x0a, 0x0006, + ess_base_read, NULL, NULL, + ess_base_write, NULL, NULL, + ess); } /* DSP I/O handler is activated in sb_dsp_setaddr */ sb_dsp_setaddr(&ess->dsp, 0); gameport_remap(ess->gameport, 0); - mpu401_change_addr(ess->mpu, 0); + if (ess->dsp.sb_subtype == SB_SUBTYPE_ESS_ES1688) { + mpu401_change_addr(ess->mpu, 0); + + io_removehandler(0x0330, 0x0002, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); + } ess->pos_regs[port & 7] = val; @@ -2450,20 +2684,52 @@ ess_chipchat_mca_write(int port, uint8_t val, void *priv) ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, ess->opl.priv); + io_sethandler(ess->dsp.sb_addr, 0x0004, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); io_sethandler(ess->dsp.sb_addr + 8, 0x0002, ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, ess->opl.priv); + io_sethandler(ess->dsp.sb_addr + 8, 0x0002, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); io_sethandler(0x0388, 0x0004, ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, ess->opl.priv); + io_sethandler(0x0388, 0x0004, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); io_sethandler(ess->dsp.sb_addr + 4, 0x0002, ess_mixer_read, NULL, NULL, ess_mixer_write, NULL, NULL, ess); - if (ess->dsp.sb_subtype == SB_SUBTYPE_ESS_ES1688) + io_sethandler(ess->dsp.sb_addr + 2, 0x0004, + ess_base_read, NULL, NULL, + ess_base_write, NULL, NULL, + ess); + io_sethandler(ess->dsp.sb_addr + 6, 0x0001, + ess_base_read, NULL, NULL, + ess_base_write, NULL, NULL, + ess); + io_sethandler(ess->dsp.sb_addr + 0x0a, 0x0006, + ess_base_read, NULL, NULL, + ess_base_write, NULL, NULL, + ess); + + if (ess->dsp.sb_subtype == SB_SUBTYPE_ESS_ES1688) { mpu401_change_addr(ess->mpu, (ess->pos_regs[2] == 0x51) ? 0x0330 : 0); + + if (ess->pos_regs[2] == 0x51) + io_sethandler(0x0330, 0x0002, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); + } } /* DSP I/O handler is activated in sb_dsp_setaddr */ @@ -3452,20 +3718,43 @@ ess_x688_init(UNUSED(const device_t *info)) ess_mixer_reset(ess); /* DSP I/O handler is activated in sb_dsp_setaddr */ - { - io_sethandler(addr, 0x0004, - ess->opl.read, NULL, NULL, - ess->opl.write, NULL, NULL, - ess->opl.priv); - io_sethandler(addr + 8, 0x0002, - ess->opl.read, NULL, NULL, - ess->opl.write, NULL, NULL, - ess->opl.priv); - io_sethandler(0x0388, 0x0004, - ess->opl.read, NULL, NULL, - ess->opl.write, NULL, NULL, - ess->opl.priv); - } + io_sethandler(addr, 0x0004, + ess->opl.read, NULL, NULL, + ess->opl.write, NULL, NULL, + ess->opl.priv); + io_sethandler(addr, 0x0004, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); + io_sethandler(addr + 8, 0x0002, + ess->opl.read, NULL, NULL, + ess->opl.write, NULL, NULL, + ess->opl.priv); + io_sethandler(addr + 8, 0x0002, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); + io_sethandler(0x0388, 0x0004, + ess->opl.read, NULL, NULL, + ess->opl.write, NULL, NULL, + ess->opl.priv); + io_sethandler(0x0388, 0x0004, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); + + io_sethandler(addr + 2, 0x0004, + ess_base_read, NULL, NULL, + ess_base_write, NULL, NULL, + ess); + io_sethandler(addr + 6, 0x0001, + ess_base_read, NULL, NULL, + ess_base_write, NULL, NULL, + ess); + io_sethandler(addr + 0x0a, 0x0006, + ess_base_read, NULL, NULL, + ess_base_write, NULL, NULL, + ess); ess->mixer_enabled = 1; ess->mixer_ess.regs[0x40] = 0x0a; diff --git a/src/sound/snd_sb_dsp.c b/src/sound/snd_sb_dsp.c index 53666f71d..f51ff4d25 100644 --- a/src/sound/snd_sb_dsp.c +++ b/src/sound/snd_sb_dsp.c @@ -726,6 +726,8 @@ sb_8_read_dma(void *priv) sb_dsp_t *dsp = (sb_dsp_t *) priv; int ret; + dsp->activity &= 0xdf; + if (dsp->sb_8_dmanum >= 4) { if (dsp->dma_ff) { uint32_t temp = (dsp->dma_data & 0xff00) >> 8; @@ -750,7 +752,9 @@ sb_8_read_dma(void *priv) int sb_8_write_dma(void *priv, uint8_t val) { - const sb_dsp_t *dsp = (sb_dsp_t *) priv; + sb_dsp_t *dsp = (sb_dsp_t *) priv; + + dsp->activity &= 0xdf; return dma_channel_write(dsp->sb_8_dmanum, val) == DMA_NODATA; } @@ -770,11 +774,13 @@ sb_8_write_dma(void *priv, uint8_t val) int sb_16_read_dma(void *priv) { - const sb_dsp_t *dsp = (sb_dsp_t *) priv; + sb_dsp_t *dsp = (sb_dsp_t *) priv; int ret; int dma_ch = dsp->sb_16_dmanum; + dsp->activity &= 0xdf; + if (dsp->sb_16_dma_enabled && dsp->sb_16_dma_supported && !dsp->sb_16_dma_translate && (dma_ch != 4)) ret = dma_channel_read(dma_ch); else { @@ -808,10 +814,12 @@ sb_16_read_dma(void *priv) int sb_16_write_dma(void *priv, uint16_t val) { - const sb_dsp_t *dsp = (sb_dsp_t *) priv; + sb_dsp_t *dsp = (sb_dsp_t *) priv; int dma_ch = dsp->sb_16_dmanum; int ret; + dsp->activity &= 0xdf; + if (dsp->sb_16_dma_enabled && dsp->sb_16_dma_supported && !dsp->sb_16_dma_translate && (dma_ch != 4)) ret = dma_channel_write(dma_ch, val) == DMA_NODATA; else { @@ -1723,17 +1731,14 @@ sb_exec_command(sb_dsp_t *dsp) break; case 0xF2: /* Trigger 8-bit IRQ */ sb_dsp_log("Trigger 8-bit IRQ\n"); - if (!timer_is_enabled(&dsp->irq_timer)) { - timer_set_delay_u64(&dsp->irq_timer, (100ULL * TIMER_USEC)); - } + timer_set_delay_u64(&dsp->irq_timer, (10ULL * TIMER_USEC)); break; case 0xF3: /* Trigger 16-bit IRQ */ sb_dsp_log("Trigger 16-bit IRQ\n"); if (IS_ESS(dsp)) dsp->ess_irq_generic = true; - else if (!timer_is_enabled(&dsp->irq16_timer)) { - timer_set_delay_u64(&dsp->irq16_timer, (100ULL * TIMER_USEC)); - } + else + timer_set_delay_u64(&dsp->irq16_timer, (10ULL * TIMER_USEC)); break; case 0xF8: if (dsp->sb_type < SB16) @@ -1886,7 +1891,11 @@ sb_read(uint16_t a, void *priv) switch (a & 0xf) { case 0x6: - ret = IS_ESS(dsp) ? 0x00 : 0xff; + if (IS_ESS(dsp)) { + ret = (dsp->espcm_fifo_reset & 0x03) | 0x08 | (dsp->activity & 0xe0); + dsp->activity |= 0xe0; + } else + ret = 0xff; break; case 0xA: /* Read data */ if (dsp->mpu && dsp->uart_midi) @@ -2075,6 +2084,7 @@ sb_dsp_init(sb_dsp_t *dsp, int type, int subtype, void *parent) dsp->sb_type = type; dsp->sb_subtype = subtype; dsp->parent = parent; + dsp->activity = 0xe0; /* Default values. Use sb_dsp_setxxx() methods to change. */ dsp->sb_irqnum = 7;