Merge branch 'master' into pc98x1

This commit is contained in:
TC1995
2024-07-23 17:25:29 +02:00
6 changed files with 377 additions and 41 deletions

View File

@@ -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,

View File

@@ -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;

View File

@@ -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;

View File

@@ -91,6 +91,8 @@ typedef struct sb_dsp_t {
uint8_t sbref;
int8_t sbstep;
uint8_t activity;
int sbdacpos;
int sbleftright;

View File

@@ -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;

View File

@@ -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;