static __inline__ void ahi_handler (int nr) { struct audio_channel_data *cdp = audio_channel + nr; switch (audio_channel_state[nr]) { case 0: write_log ("Bug in sound code\n"); break; case 1: audio_channel_evtime[nr] = cdp->per; cdp->intreq2 = 0; audio_channel_state[nr] = 2; if (cdp->wlen != 1) cdp->wlen = (cdp->wlen - 1) & 0xFFFF; cdp->dat = CHIPMEM_WGET (cdp->pt); cdp->pt += 2; break; case 2: if (nr == 4 && cdp->intreq2) INTREQ (0x8080); cdp->intreq2 = 0; audio_channel_evtime[nr] = cdp->per; cdp->dat = CHIPMEM_WGET (cdp->pt); cdp->pt += 2; if (cdp->wlen == 1) { cdp->pt = cdp->lc; cdp->wlen = cdp->len; cdp->intreq2 = 1; } else cdp->wlen = (cdp->wlen - 1) & 0xFFFF; break; default: audio_channel_state[nr] = 0; break; } }
void AUDxDAT (int nr, uae_u16 v) { struct audio_channel_data *cdp = audio_channel + nr; TEXT_SCOPE(cycles, nr, PET_DAT, v); update_audio (); cdp->dat = v; cdp->datpt = 0; if (cdp->state == 0 && !(INTREQR() & (0x80 << nr))) { cdp->state = 2; INTREQ(0x8000 | (0x80 << nr)); /* data_written = 2 ???? */ cdp->evtime = cdp->per; } }
static void audio_handler (int nr) { struct audio_channel_data *cdp = audio_channel + nr; switch (cdp->state) { case 0: fprintf(stderr, "Bug in sound code\n"); break; case 1: /* We come here at the first hsync after DMA was turned on. */ cdp->evtime = maxhpos; cdp->state = 5; INTREQ(0x8000 | (0x80 << nr)); if (cdp->wlen != 1) cdp->wlen = (cdp->wlen - 1) & 0xFFFF; cdp->nextdat = chipmem_bank.wget(cdp->pt); cdp->nextdatpt = cdp->pt; cdp->nextdatptend = cdp->ptend; /* BUG in UAE. Only hsync handler should increase DMA pointer cdp->pt += 2; */ break; case 5: /* We come here at the second hsync after DMA was turned on. */ cdp->evtime = cdp->per; cdp->dat = cdp->nextdat; cdp->datpt = cdp->nextdatpt; cdp->datptend = cdp->nextdatptend; cdp->current_sample = (uae_s8)(cdp->dat >> 8); cdp->state = 2; { int audav = adkcon & (1 << nr); int audap = adkcon & (16 << nr); int napnav = (!audav && !audap) || audav; if (napnav) cdp->data_written = 2; } break; case 2: /* We come here when a 2->3 transition occurs */ cdp->current_sample = (uae_s8)(cdp->dat & 0xFF); cdp->evtime = cdp->per; cdp->state = 3; /* Period attachment? */ if (adkcon & (0x10 << nr)) { if (cdp->intreq2 && cdp->dmaen) { INTREQ(0x8000 | (0x80 << nr)); } cdp->intreq2 = 0; cdp->dat = cdp->nextdat; cdp->datpt = cdp->nextdatpt; cdp->datptend = cdp->nextdatptend; if (cdp->dmaen) cdp->data_written = 2; if (nr < 3) { if (cdp->dat == 0) (cdp+1)->per = 65535; else (cdp+1)->per = cdp->dat; } } break; case 3: /* We come here when a 3->2 transition occurs */ cdp->evtime = cdp->per; if ((INTREQR() & (0x80 << nr)) && !cdp->dmaen) { cdp->state = 0; cdp->current_sample = 0; break; } else { int audav = adkcon & (1 << nr); int audap = adkcon & (16 << nr); int napnav = (!audav && !audap) || audav; cdp->state = 2; if ((cdp->intreq2 && cdp->dmaen && napnav) || (napnav && !cdp->dmaen)) { INTREQ(0x8000 | (0x80 << nr)); } cdp->intreq2 = 0; cdp->dat = cdp->nextdat; cdp->datpt = cdp->nextdatpt; cdp->datptend = cdp->nextdatptend; cdp->current_sample = (uae_s8)(cdp->dat >> 8); if (cdp->dmaen && napnav) cdp->data_written = 2; /* Volume attachment? */ if (audav) { if (nr < 3) { (cdp+1)->vol = cdp->dat; } } } break; default: cdp->state = 0; break; } }
static __inline__ void audio_handler (int nr) { struct audio_channel_data *cdp = audio_channel + nr; // int evtime = audio_channel_evtime[nr]; audio_channel_evtime[nr] = MAX_EV; switch (audio_channel_state[nr]) { case 0: //write_log ("Bug in sound code\n"); break; case 1: audio_channel_evtime[nr] = maxhpos * CYCLE_UNIT; audio_channel_state[nr] = 5; INTREQ(0x8000 | (0x80 << nr)); if (cdp->wlen != 1) cdp->wlen = (cdp->wlen - 1) & 0xFFFF; cdp->nextdat = CHIPMEM_WGET (cdp->pt); //cdp->pt += 2; break; case 5: audio_channel_evtime[nr] = cdp->per; cdp->dat = cdp->nextdat; cdp->last_sample = audio_channel_current_sample[nr]; audio_channel_current_sample[nr] = (sample8_t)(cdp->dat >> 8); audio_channel_state[nr] = 2; { int audav = adkcon & (1 << nr); int audap = adkcon & (16 << nr); int napnav = (!audav && !audap) || audav; if (napnav) cdp->data_written = 2; } break; case 2: cdp->last_sample = audio_channel_current_sample[nr]; audio_channel_current_sample[nr] = (sample8_t)(cdp->dat & 0xFF); audio_channel_evtime[nr] = cdp->per; audio_channel_state[nr] = 3; if (adkcon & (0x10 << nr)) { if (cdp->intreq2 && cdp->dmaen) INTREQ (0x8000 | (0x80 << nr)); cdp->intreq2 = 0; cdp->dat = cdp->nextdat; if (cdp->dmaen) cdp->data_written = 2; if (nr < 3) { if (cdp->dat == 0) (cdp+1)->per = PERIOD_MAX; else if (cdp->dat < maxhpos * CYCLE_UNIT / 2) (cdp+1)->per = maxhpos * CYCLE_UNIT / 2; else (cdp+1)->per = cdp->dat * CYCLE_UNIT; } } break; case 3: audio_channel_evtime[nr] = cdp->per; if ((INTREQR() & (0x80 << nr)) && !cdp->dmaen) { audio_channel_state[nr] = 0; cdp->last_sample = 0; audio_channel_current_sample[nr] = 0; break; } else { int audav = adkcon & (1 << nr); int audap = adkcon & (16 << nr); int napnav = (!audav && !audap) || audav; audio_channel_state[nr] = 2; if ((cdp->intreq2 && cdp->dmaen && napnav) || (napnav && !cdp->dmaen)) INTREQ(0x8000 | (0x80 << nr)); cdp->intreq2 = 0; cdp->dat = cdp->nextdat; cdp->last_sample = audio_channel_current_sample[nr]; audio_channel_current_sample[nr] = (sample8_t)(cdp->dat >> 8); if (cdp->dmaen && napnav) cdp->data_written = 2; if (audav) { if (nr < 3) { audio_channel_vol[nr+1] = cdp->dat; } } } break; default: audio_channel_state[nr] = 0; break; } }