Rewrote the Sound Blaster IRQ system because the old one was designed with a level-triggered IRQ in mind while these are ISA cards with edge-triggered IRQ's.

This commit is contained in:
OBattler
2021-04-02 08:51:39 +02:00
parent 80095e7a30
commit 3bf216d645
3 changed files with 26 additions and 18 deletions

View File

@@ -117,6 +117,6 @@ void sb_dsp_poll(sb_dsp_t *dsp, int16_t *l, int16_t *r);
void sb_dsp_set_stereo(sb_dsp_t *dsp, int stereo);
void sb_dsp_update(sb_dsp_t *dsp);
void sb_update_irq(sb_dsp_t *dsp);
void sb_update_mask(sb_dsp_t *dsp, int irqm8, int irqm16, int irqm401);
#endif /* SOUND_SND_SB_DSP_H */

View File

@@ -858,10 +858,7 @@ sb_ct1745_mixer_write(uint16_t addr, uint8_t val, void *p)
case 0x83:
/* Interrupt mask. */
sb->dsp.sb_irqm8 = !(val & 0x01);
sb->dsp.sb_irqm16 = !(val & 0x02);
sb->dsp.sb_irqm401 = !(val & 0x04);
sb_update_irq(&sb->dsp);
sb_update_mask(&sb->dsp, !(val & 0x01), !(val & 0x02), !(val & 0x04));
break;
case 0x84:

View File

@@ -178,17 +178,21 @@ recalc_sb16_filter(int c, int playback_freq)
void
sb_update_irq(sb_dsp_t *dsp)
sb_update_mask(sb_dsp_t *dsp, int irqm8, int irqm16, int irqm401)
{
int irq_pending;
int clear = 0;
irq_pending = (dsp->sb_irq8 && !dsp->sb_irqm8) ||
(dsp->sb_irq16 && !dsp->sb_irqm16) ||
(dsp->sb_irq401 && !dsp->sb_irqm401);
if (!dsp->sb_irqm8 && irqm8)
clear |= 1;
dsp->sb_irqm8 = irqm8;
if (!dsp->sb_irqm16 && irqm16)
clear |= 1;
dsp->sb_irqm16 = irqm16;
if (!dsp->sb_irqm401 && irqm401)
clear |= 1;
dsp->sb_irqm401 = irqm401;
if (irq_pending)
picint(1 << dsp->sb_irqnum);
else
if (clear)
picintc(1 << dsp->sb_irqnum);
}
@@ -196,20 +200,28 @@ sb_update_irq(sb_dsp_t *dsp)
void
sb_update_status(sb_dsp_t *dsp, int bit, int set)
{
int masked = 0;
switch (bit) {
case 0:
default:
dsp->sb_irq8 = set;
masked = dsp->sb_irqm8;
break;
case 1:
dsp->sb_irq16 = set;
masked = dsp->sb_irqm16;
break;
case 2:
dsp->sb_irq401 = set;
masked = dsp->sb_irqm401;
break;
}
sb_update_irq(dsp);
if (set && !masked)
picint(1 << dsp->sb_irqnum);
else if (!set)
picintc(1 << dsp->sb_irqnum);
}
@@ -258,7 +270,7 @@ sb_dsp_set_mpu(sb_dsp_t *dsp, mpu_t *mpu)
void
sb_dsp_reset(sb_dsp_t *dsp)
{
midi_clear_buffer();
midi_clear_buffer();
timer_disable(&dsp->output_timer);
timer_disable(&dsp->input_timer);
@@ -271,9 +283,8 @@ sb_dsp_reset(sb_dsp_t *dsp)
dsp->sb_irq8 = 0;
dsp->sb_irq16 = 0;
dsp->sb_irq401 = 0;
sb_update_irq(dsp);
dsp->sb_16_pause = 0;
dsp->sb_read_wp = dsp->sb_read_rp = 0;
dsp->sb_read_wp = dsp->sb_read_rp = 0;
dsp->sb_data_stat = -1;
dsp->sb_speaker = 0;
dsp->sb_pausetime = -1LL;