static void PopSequenceAddr( struct sequence *pSequence ) { if( pSequence->stackSize ) { pSequence->addr = pSequence->stackData[--pSequence->stackSize]; } else { data16_t *pStatus = GetSequenceStatusAddr(pSequence); *pStatus &= 0xff7f; /* wipe "sequence-is-playing" flag */ } } /* PopSequenceAddr */
static void PopSequenceAddr(struct namcona *chip, struct sequence *pSequence ) { if( pSequence->stackSize ) { pSequence->addr = pSequence->stackData[--pSequence->stackSize]; } else { UINT16 *pStatus = GetSequenceStatusAddr(chip,pSequence); *pStatus &= 0xff7f; /* wipe "sequence-is-playing" flag */ } } /* PopSequenceAddr */
static void Silence( void ) { int i; for( i=0; i<MAX_VOICE; i++ ) { mVoice[i].bActive = 0; } for( i=0; i<MAX_SEQUENCE; i++ ) { data16_t *pStatus = GetSequenceStatusAddr(&mSequence[i]); *pStatus &= 0xff7f; /* wipe "sequence-is-playing" flag */ } }
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 Silence( struct namcona *chip ) { int i; for( i=0; i<MAX_SEQUENCE_VOICE; i++ ) { chip->mVoice[i].bActive = 0; } for( i=0; i<MAX_SEQUENCE; i++ ) { UINT16 *pStatus = GetSequenceStatusAddr(chip, &chip->mSequence[i]); *pStatus &= 0xff7f; /* wipe "sequence-is-playing" flag */ } }