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:
@@ -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_set_stereo(sb_dsp_t *dsp, int stereo);
|
||||||
|
|
||||||
void sb_dsp_update(sb_dsp_t *dsp);
|
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 */
|
#endif /* SOUND_SND_SB_DSP_H */
|
@@ -858,10 +858,7 @@ sb_ct1745_mixer_write(uint16_t addr, uint8_t val, void *p)
|
|||||||
|
|
||||||
case 0x83:
|
case 0x83:
|
||||||
/* Interrupt mask. */
|
/* Interrupt mask. */
|
||||||
sb->dsp.sb_irqm8 = !(val & 0x01);
|
sb_update_mask(&sb->dsp, !(val & 0x01), !(val & 0x02), !(val & 0x04));
|
||||||
sb->dsp.sb_irqm16 = !(val & 0x02);
|
|
||||||
sb->dsp.sb_irqm401 = !(val & 0x04);
|
|
||||||
sb_update_irq(&sb->dsp);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x84:
|
case 0x84:
|
||||||
|
@@ -178,17 +178,21 @@ recalc_sb16_filter(int c, int playback_freq)
|
|||||||
|
|
||||||
|
|
||||||
void
|
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) ||
|
if (!dsp->sb_irqm8 && irqm8)
|
||||||
(dsp->sb_irq16 && !dsp->sb_irqm16) ||
|
clear |= 1;
|
||||||
(dsp->sb_irq401 && !dsp->sb_irqm401);
|
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)
|
if (clear)
|
||||||
picint(1 << dsp->sb_irqnum);
|
|
||||||
else
|
|
||||||
picintc(1 << dsp->sb_irqnum);
|
picintc(1 << dsp->sb_irqnum);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -196,20 +200,28 @@ sb_update_irq(sb_dsp_t *dsp)
|
|||||||
void
|
void
|
||||||
sb_update_status(sb_dsp_t *dsp, int bit, int set)
|
sb_update_status(sb_dsp_t *dsp, int bit, int set)
|
||||||
{
|
{
|
||||||
|
int masked = 0;
|
||||||
|
|
||||||
switch (bit) {
|
switch (bit) {
|
||||||
case 0:
|
case 0:
|
||||||
default:
|
default:
|
||||||
dsp->sb_irq8 = set;
|
dsp->sb_irq8 = set;
|
||||||
|
masked = dsp->sb_irqm8;
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
dsp->sb_irq16 = set;
|
dsp->sb_irq16 = set;
|
||||||
|
masked = dsp->sb_irqm16;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
dsp->sb_irq401 = set;
|
dsp->sb_irq401 = set;
|
||||||
|
masked = dsp->sb_irqm401;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
sb_update_irq(dsp);
|
if (set && !masked)
|
||||||
|
picint(1 << dsp->sb_irqnum);
|
||||||
|
else if (!set)
|
||||||
|
picintc(1 << dsp->sb_irqnum);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -258,8 +270,8 @@ sb_dsp_set_mpu(sb_dsp_t *dsp, mpu_t *mpu)
|
|||||||
void
|
void
|
||||||
sb_dsp_reset(sb_dsp_t *dsp)
|
sb_dsp_reset(sb_dsp_t *dsp)
|
||||||
{
|
{
|
||||||
midi_clear_buffer();
|
midi_clear_buffer();
|
||||||
|
|
||||||
timer_disable(&dsp->output_timer);
|
timer_disable(&dsp->output_timer);
|
||||||
timer_disable(&dsp->input_timer);
|
timer_disable(&dsp->input_timer);
|
||||||
|
|
||||||
@@ -271,9 +283,8 @@ sb_dsp_reset(sb_dsp_t *dsp)
|
|||||||
dsp->sb_irq8 = 0;
|
dsp->sb_irq8 = 0;
|
||||||
dsp->sb_irq16 = 0;
|
dsp->sb_irq16 = 0;
|
||||||
dsp->sb_irq401 = 0;
|
dsp->sb_irq401 = 0;
|
||||||
sb_update_irq(dsp);
|
|
||||||
dsp->sb_16_pause = 0;
|
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_data_stat = -1;
|
||||||
dsp->sb_speaker = 0;
|
dsp->sb_speaker = 0;
|
||||||
dsp->sb_pausetime = -1LL;
|
dsp->sb_pausetime = -1LL;
|
||||||
|
Reference in New Issue
Block a user