static void HandleSubroutine(struct namcona *chip, struct sequence *pSequence ) { int addr = ReadMetaDataWord(chip, pSequence->addr ); PushSequenceAddr(chip, pSequence, pSequence->addr+2 ); pSequence->addr = addr; } /* HandleSubroutine */
static void PanCtrlTable(struct namcona *chip, struct sequence *pSequence, int chan, UINT8 data ) { struct voice *pVoice = &chip->mVoice[pSequence->channel[chan]]; int addr = ReadMetaDataWord(chip,12) + data*4; pVoice->panCtrlTable = addr; pVoice->panCtrlSpeed = ReadMetaDataByte(chip,addr+3); if( pVoice->panCtrlSpeed & 0x80) pVoice->panCtrlSpeed = -(0x100 - pVoice->panCtrlSpeed); } /* PanCtrlTable */
static void UpdateSequence(struct namcona *chip, struct sequence *pSequence ) { UINT16 *pStatus = GetSequenceStatusAddr(chip,pSequence); UINT16 data = *pStatus; if( data&0x0040 ) { /* bit 0x0040 indicates that a sound request was written by the main CPU */ int offs = ReadMetaDataWord(chip,0)+(data>>8)*2; memset( pSequence, 0x00, sizeof(struct sequence) ); if( pSequence == &chip->mSequence[0] ) Silence(chip); /* hack! */ pSequence->addr = ReadMetaDataWord(chip,offs); *pStatus = (data&0xffbf)|0x0080; /* set "sequence-is-playing" flag */ }
static void HandleRepeatOut( struct sequence *pSequence ) { int count = ReadMetaDataByte( pSequence->addr++ ); int addr = ReadMetaDataWord( pSequence->addr ); if( pSequence->count2 < count ) { pSequence->count2++; pSequence->addr += 2; } else { pSequence->count2 = 0; pSequence->addr = addr; } } /* HandleRepeatOut */
static void HandleRepeat(struct namcona *chip, struct sequence *pSequence ) { int count = ReadMetaDataByte( chip, pSequence->addr++ ); int addr = ReadMetaDataWord(chip, pSequence->addr ); if( pSequence->count < count ) { pSequence->count++; pSequence->addr = addr; } else { pSequence->count = 0; pSequence->addr += 2; } } /* HandleRepeat */
static void SelectWave( struct sequence *pSequence, int chan, data8_t data ) { struct voice *pVoice = &mVoice[pSequence->channel[chan]]; int bank = 0x20000 + pVoice->bank*0x20000; int addr = ReadMetaDataWord(2)+10*data; pVoice->flags = ReadMetaDataWord(addr+0*2); pVoice->start = ReadMetaDataWord(addr+1*2)*2+bank; pVoice->end = ReadMetaDataWord(addr+2*2)*2+bank; pVoice->loop = ReadMetaDataWord(addr+3*2)*2+bank; pVoice->baseFreq = ReadMetaDataWord(addr+4*2); /* unsure what this is; not currently used */ pVoice->start <<= FIXED_POINT_SHIFT; pVoice->end <<= FIXED_POINT_SHIFT; pVoice->loop <<= FIXED_POINT_SHIFT; pVoice->bActive = 0; pVoice->dnote = 0; pVoice->detune = 0; } /* SelectWave */