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]); } }
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]); } }
void CALLBACK ZN_SPUwriteRegister(unsigned long reg, unsigned short val) { SPUwriteRegister(reg,val); }
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; }
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++; }