#include <stdio.h>
#include "ps2.h"
#include "ee_regs.h"
#include "dma.h"

struct DmaChannel {
	uint64 chcr; uint64 pad0;
	uint64 madr; uint64 pad1;
	uint64 qwc; uint64 pad2;
	uint64 tadr; uint64 pad3;
	uint64 asr0; uint64 pad4;
	uint64 asr1; uint64 pad5;
	uint64 pad6[4];
	uint64 sadr;
};

static struct DmaChannel *dmaChannels[] = {
	(struct DmaChannel *) D0_CHCR,
	(struct DmaChannel *) D1_CHCR,
	(struct DmaChannel *) D2_CHCR,
	(struct DmaChannel *) D3_CHCR,
	(struct DmaChannel *) D4_CHCR,
	(struct DmaChannel *) D5_CHCR,
	(struct DmaChannel *) D6_CHCR,
	(struct DmaChannel *) D7_CHCR,
	(struct DmaChannel *) D8_CHCR,
	(struct DmaChannel *) D9_CHCR
};

void
dmaReset(int enable)
{
	/* don't clear the SIF channels */
	int doclear[] = { 1, 1, 1, 1, 1, 0, 0, 0, 1, 1 };
	int i;

	printf("%x %x %x %x %x %x %x\n",
		&dmaChannels[0]->chcr,
		&dmaChannels[0]->madr,
		&dmaChannels[0]->qwc,
		&dmaChannels[0]->tadr,
		&dmaChannels[0]->asr0,
		&dmaChannels[0]->asr1,
		&dmaChannels[0]->sadr);

	SET_REG64(D_CTRL, 0);
	for(i = 0; i < 10; i++)
		if(doclear[i]){
			dmaChannels[i]->chcr = 0;
			dmaChannels[i]->madr = 0;
			dmaChannels[i]->qwc = 0;
			dmaChannels[i]->tadr = 0;
			dmaChannels[i]->asr0 = 0;
			dmaChannels[i]->asr1 = 0;
			dmaChannels[i]->sadr = 0;
		}

	if(enable)
		SET_REG64(D_CTRL, MAKE_D_CTRL(1,0,0,0,0,0));
}