Example #1
0
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;
    }
}
Example #2
0
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;
    }
}
Example #3
0
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;
    }
}
Example #4
0
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;
    }
}