Ejemplo n.º 1
0
void LoadStateUnknown(SPUFreeze_t * pF)
{
 int i;

 for(i=0;i<MAXCHAN;i++)
  {
   s_chan[i].bStop=0;
   s_chan[i].pLoop=spuMemC;
  }

 dwNewChannel=0;
 dwChannelOn=0;
 dwChannelDead=0;
 pSpuIrq=0;

 for(i=0;i<0xc0;i++)
  {
   SPUwriteRegister(0x1f801c00+i*2,regArea[i]);
  }
}
Ejemplo n.º 2
0
void LoadStateUnknown(SPUFreeze_t * pF)
{
	int i;
	
	for(i=0;i<MAXCHAN;i++)
  {
		s_chan[i].bOn=0;
		s_chan[i].bNew=0;
		s_chan[i].bStop=0;
		s_chan[i].ADSR.lVolume=0;
		s_chan[i].pLoop=spuMemC + (unsigned long)(0x1010);
		s_chan[i].pStart=spuMemC + (unsigned long)(0x1010);
		s_chan[i].iMute=0;
		s_chan[i].iIrqDone=0;
  }
	
	dwNewChannel=0;
	pSpuIrq=0;
	
	for(i=0;i<0xc0;i++)
  {
		SPUwriteRegister(0x1f801c00+i*2,regArea[i]);
  }
}
Ejemplo n.º 3
0
void CALLBACK ZN_SPUwriteRegister(unsigned long reg, unsigned short val)
{ 
	SPUwriteRegister(reg,val);
}
Ejemplo n.º 4
0
int32_t spx_start(uint8_t *buffer, uint32_t length)
{
	int i;
	uint16_t reg;

	if (strncmp((char *)buffer, "SPU", 3) && strncmp((char *)buffer, "SPX", 3))
	{
		return AO_FAIL;
	}

	start_of_file = buffer;

	SPUinit();
	SPUopen();
	setlength(~0, 0);

	// upload the SPU RAM image
	SPUinjectRAMImage((unsigned short *)&buffer[0]);

	// apply the register image
	for (i = 0; i < 512; i += 2)
	{
		reg = buffer[0x80000+i] | buffer[0x80000+i+1]<<8;

		SPUwriteRegister((i/2)+0x1f801c00, reg);
	}

	old_fmt = 1;

	if ((buffer[0x80200] != 0x44) || (buffer[0x80201] != 0xac) || (buffer[0x80202] != 0x00) || (buffer[0x80203] != 0x00))
	{
		old_fmt = 0;
	}

	if (old_fmt)
	{
		num_events = buffer[0x80204] | buffer[0x80205]<<8 | buffer[0x80206]<<16 | buffer[0x80207]<<24;

		if (((num_events * 12) + 0x80208) > length)
		{
			old_fmt = 0;
		}
		else
		{
			cur_tick = 0;
		}
	}

	if (!old_fmt)
	{
		end_tick = buffer[0x80200] | buffer[0x80201]<<8 | buffer[0x80202]<<16 | buffer[0x80203]<<24;
		cur_tick = buffer[0x80204] | buffer[0x80205]<<8 | buffer[0x80206]<<16 | buffer[0x80207]<<24;
		next_tick = cur_tick;
	}

	song_ptr = &buffer[0x80208];
	cur_event = 0;

	strncpy((char *)&buffer[4], name, 128);
	strncpy((char *)&buffer[0x44], song, 128);
	strncpy((char *)&buffer[0x84], company, 128);

	return AO_SUCCESS;
}
Ejemplo n.º 5
0
static void spx_tick(void)
{
	uint32_t time, reg, size;
	uint16_t rdata;
	uint8_t opcode;

	if (old_fmt)
	{
		time = song_ptr[0] | song_ptr[1]<<8 | song_ptr[2]<<16 | song_ptr[3]<<24;

		while ((time == cur_tick) && (cur_event < num_events))
		{
			reg = song_ptr[4] | song_ptr[5]<<8 | song_ptr[6]<<16 | song_ptr[7]<<24;
			rdata = song_ptr[8] | song_ptr[9]<<8;

			SPUwriteRegister(reg, rdata);

			cur_event++;
			song_ptr += 12;

			time = song_ptr[0] | song_ptr[1]<<8 | song_ptr[2]<<16 | song_ptr[3]<<24;
		}
	}
	else
	{
		if (cur_tick < end_tick)
		{
			while (cur_tick == next_tick)
			{
				opcode = song_ptr[0];
				song_ptr++;

				switch (opcode)
				{
					case 0:	// write register
						reg = song_ptr[0] | song_ptr[1]<<8 | song_ptr[2]<<16 | song_ptr[3]<<24;
						rdata = song_ptr[4] | song_ptr[5]<<8;

						SPUwriteRegister(reg, rdata);

						next_tick = song_ptr[6] | song_ptr[7]<<8 | song_ptr[8]<<16 | song_ptr[9]<<24;
						song_ptr += 10;
						break;

					case 1:	// read register
				 		reg = song_ptr[0] | song_ptr[1]<<8 | song_ptr[2]<<16 | song_ptr[3]<<24;
						SPUreadRegister(reg);
						next_tick = song_ptr[4] | song_ptr[5]<<8 | song_ptr[6]<<16 | song_ptr[7]<<24;
						song_ptr += 8;
						break;

					case 2: // dma write
						size = song_ptr[0] | song_ptr[1]<<8 | song_ptr[2]<<16 | song_ptr[3]<<24;
						song_ptr += (4 + size);
						next_tick = song_ptr[0] | song_ptr[1]<<8 | song_ptr[2]<<16 | song_ptr[3]<<24;
						song_ptr += 4;
						break;

					case 3: // dma read
						next_tick = song_ptr[4] | song_ptr[5]<<8 | song_ptr[6]<<16 | song_ptr[7]<<24;
						song_ptr += 8;
						break;

					case 4: // xa play
						song_ptr += (32 + 16384);
						next_tick = song_ptr[0] | song_ptr[1]<<8 | song_ptr[2]<<16 | song_ptr[3]<<24;
						song_ptr += 4;
						break;

					case 5: // cdda play
						size = song_ptr[0] | song_ptr[1]<<8 | song_ptr[2]<<16 | song_ptr[3]<<24;
						song_ptr += (4 + size);
						next_tick = song_ptr[0] | song_ptr[1]<<8 | song_ptr[2]<<16 | song_ptr[3]<<24;
						song_ptr += 4;
						break;

					default:
						printf("Unknown opcode %d\n", opcode);
						exit(-1);
						break;
				}
			}
		}
	}

	cur_tick++;
}