(linenum→info "unix/slp.c:2238")

qemu/0.9.1/hw/fmopl.c

    1: /*
    2: **
    3: ** File: fmopl.c -- software implementation of FM sound generator
    4: **
    5: ** Copyright (C) 1999,2000 Tatsuyuki Satoh , MultiArcadeMachineEmurator development
    6: **
    7: ** Version 0.37a
    8: **
    9: */
   10: 
   11: /*
   12:         preliminary :
   13:         Problem :
   14:         note:
   15: */
   16: 
   17: /* This version of fmopl.c is a fork of the MAME one, relicensed under the LGPL.
   18:  *
   19:  * This library is free software; you can redistribute it and/or
   20:  * modify it under the terms of the GNU Lesser General Public
   21:  * License as published by the Free Software Foundation; either
   22:  * version 2.1 of the License, or (at your option) any later version.
   23:  *
   24:  * This library is distributed in the hope that it will be useful,
   25:  * but WITHOUT ANY WARRANTY; without even the implied warranty of
   26:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   27:  * Lesser General Public License for more details.
   28:  *
   29:  * You should have received a copy of the GNU Lesser General Public
   30:  * License along with this library; if not, write to the Free Software
   31:  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   32:  */
   33: 
   34: #define INLINE          __inline
   35: #define HAS_YM3812      1
   36: 
   37: #include <stdio.h>
   38: #include <stdlib.h>
   39: #include <string.h>
   40: #include <stdarg.h>
   41: #include <math.h>
   42: //#include "driver.h"           /* use M.A.M.E. */
   43: #include "fmopl.h"
   44: 
   45: #ifndef PI
   46: #define PI 3.14159265358979323846
   47: #endif
   48: 
   49: /* -------------------- for debug --------------------- */
   50: /* #define OPL_OUTPUT_LOG */
   51: #ifdef OPL_OUTPUT_LOG
   52: static FILE *opl_dbg_fp = NULL;
   53: static FM_OPL *opl_dbg_opl[16];
   54: static int opl_dbg_maxchip,opl_dbg_chip;
   55: #endif
   56: 
   57: /* -------------------- preliminary define section --------------------- */
   58: /* attack/decay rate time rate */
   59: #define OPL_ARRATE     141280  /* RATE 4 =  2826.24ms @ 3.6MHz */
   60: #define OPL_DRRATE    1956000  /* RATE 4 = 39280.64ms @ 3.6MHz */
   61: 
   62: #define DELTAT_MIXING_LEVEL (1) /* DELTA-T ADPCM MIXING LEVEL */
   63: 
   64: #define FREQ_BITS 24                    /* frequency turn          */
   65: 
   66: /* counter bits = 20 , octerve 7 */
   67: #define FREQ_RATE   (1<<(FREQ_BITS-20))
   68: #define TL_BITS    (FREQ_BITS+2)
   69: 
   70: /* final output shift , limit minimum and maximum */
   71: #define OPL_OUTSB   (TL_BITS+3-16)              /* OPL output final shift 16bit */
   72: #define OPL_MAXOUT (0x7fff<<OPL_OUTSB)
   73: #define OPL_MINOUT (-0x8000<<OPL_OUTSB)
   74: 
   75: /* -------------------- quality selection --------------------- */
   76: 
   77: /* sinwave entries */
   78: /* used static memory = SIN_ENT * 4 (byte) */
   79: #define SIN_ENT 2048
   80: 
   81: /* output level entries (envelope,sinwave) */
   82: /* envelope counter lower bits */
   83: #define ENV_BITS 16
   84: /* envelope output entries */
   85: #define EG_ENT   4096
   86: /* used dynamic memory = EG_ENT*4*4(byte)or EG_ENT*6*4(byte) */
   87: /* used static  memory = EG_ENT*4 (byte)                     */
   88: 
   89: #define EG_OFF   ((2*EG_ENT)<<ENV_BITS)  /* OFF          */
   90: #define EG_DED   EG_OFF
   91: #define EG_DST   (EG_ENT<<ENV_BITS)      /* DECAY  START */
   92: #define EG_AED   EG_DST
   93: #define EG_AST   0                       /* ATTACK START */
   94: 
   95: #define EG_STEP (96.0/EG_ENT) /* OPL is 0.1875 dB step  */
   96: 
   97: /* LFO table entries */
   98: #define VIB_ENT 512
   99: #define VIB_SHIFT (32-9)
  100: #define AMS_ENT 512
  101: #define AMS_SHIFT (32-9)
  102: 
  103: #define VIB_RATE 256
  104: 
  105: /* -------------------- local defines , macros --------------------- */
  106: 
  107: /* register number to channel number , slot offset */
  108: #define SLOT1 0
  109: #define SLOT2 1
  110: 
  111: /* envelope phase */
  112: #define ENV_MOD_RR  0x00
  113: #define ENV_MOD_DR  0x01
  114: #define ENV_MOD_AR  0x02
  115: 
  116: /* -------------------- tables --------------------- */
  117: static const int slot_array[32]=
  118: {
  119:          0, 2, 4, 1, 3, 5,-1,-1,
  120:          6, 8,10, 7, 9,11,-1,-1,
  121:         12,14,16,13,15,17,-1,-1,
  122:         -1,-1,-1,-1,-1,-1,-1,-1
  123: };
  124: 
  125: /* key scale level */
  126: /* table is 3dB/OCT , DV converts this in TL step at 6dB/OCT */
  127: #define DV (EG_STEP/2)
  128: static const UINT32 KSL_TABLE[8*16]=
  129: {
  130:         /* OCT 0 */
  131:          0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV,
  132:          0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV,
  133:          0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV,
  134:          0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV,
  135:         /* OCT 1 */
  136:          0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV,
  137:          0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV,
  138:          0.000/DV, 0.750/DV, 1.125/DV, 1.500/DV,
  139:          1.875/DV, 2.250/DV, 2.625/DV, 3.000/DV,
  140:         /* OCT 2 */
  141:          0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV,
  142:          0.000/DV, 1.125/DV, 1.875/DV, 2.625/DV,
  143:          3.000/DV, 3.750/DV, 4.125/DV, 4.500/DV,
  144:          4.875/DV, 5.250/DV, 5.625/DV, 6.000/DV,
  145:         /* OCT 3 */
  146:          0.000/DV, 0.000/DV, 0.000/DV, 1.875/DV,
  147:          3.000/DV, 4.125/DV, 4.875/DV, 5.625/DV,
  148:          6.000/DV, 6.750/DV, 7.125/DV, 7.500/DV,
  149:          7.875/DV, 8.250/DV, 8.625/DV, 9.000/DV,
  150:         /* OCT 4 */
  151:          0.000/DV, 0.000/DV, 3.000/DV, 4.875/DV,
  152:          6.000/DV, 7.125/DV, 7.875/DV, 8.625/DV,
  153:          9.000/DV, 9.750/DV,10.125/DV,10.500/DV,
  154:         10.875/DV,11.250/DV,11.625/DV,12.000/DV,
  155:         /* OCT 5 */
  156:          0.000/DV, 3.000/DV, 6.000/DV, 7.875/DV,
  157:          9.000/DV,10.125/DV,10.875/DV,11.625/DV,
  158:         12.000/DV,12.750/DV,13.125/DV,13.500/DV,
  159:         13.875/DV,14.250/DV,14.625/DV,15.000/DV,
  160:         /* OCT 6 */
  161:          0.000/DV, 6.000/DV, 9.000/DV,10.875/DV,
  162:         12.000/DV,13.125/DV,13.875/DV,14.625/DV,
  163:         15.000/DV,15.750/DV,16.125/DV,16.500/DV,
  164:         16.875/DV,17.250/DV,17.625/DV,18.000/DV,
  165:         /* OCT 7 */
  166:          0.000/DV, 9.000/DV,12.000/DV,13.875/DV,
  167:         15.000/DV,16.125/DV,16.875/DV,17.625/DV,
  168:         18.000/DV,18.750/DV,19.125/DV,19.500/DV,
  169:         19.875/DV,20.250/DV,20.625/DV,21.000/DV
  170: };
  171: #undef DV
  172: 
  173: /* sustain lebel table (3db per step) */
  174: /* 0 - 15: 0, 3, 6, 9,12,15,18,21,24,27,30,33,36,39,42,93 (dB)*/
  175: #define SC(db) (db*((3/EG_STEP)*(1<<ENV_BITS)))+EG_DST
  176: static const INT32 SL_TABLE[16]={
  177:  SC( 0),SC( 1),SC( 2),SC(3 ),SC(4 ),SC(5 ),SC(6 ),SC( 7),
  178:  SC( 8),SC( 9),SC(10),SC(11),SC(12),SC(13),SC(14),SC(31)
  179: };
  180: #undef SC
  181: 
  182: #define TL_MAX (EG_ENT*2) /* limit(tl + ksr + envelope) + sinwave */
  183: /* TotalLevel : 48 24 12  6  3 1.5 0.75 (dB) */
  184: /* TL_TABLE[ 0      to TL_MAX          ] : plus  section */
  185: /* TL_TABLE[ TL_MAX to TL_MAX+TL_MAX-1 ] : minus section */
  186: static INT32 *TL_TABLE;
  187: 
  188: /* pointers to TL_TABLE with sinwave output offset */
  189: static INT32 **SIN_TABLE;
  190: 
  191: /* LFO table */
  192: static INT32 *AMS_TABLE;
  193: static INT32 *VIB_TABLE;
  194: 
  195: /* envelope output curve table */
  196: /* attack + decay + OFF */
  197: static INT32 ENV_CURVE[2*EG_ENT+1];
  198: 
  199: /* multiple table */
  200: #define ML 2
  201: static const UINT32 MUL_TABLE[16]= {
  202: /* 1/2, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15 */
  203:    0.50*ML, 1.00*ML, 2.00*ML, 3.00*ML, 4.00*ML, 5.00*ML, 6.00*ML, 7.00*ML,
  204:    8.00*ML, 9.00*ML,10.00*ML,10.00*ML,12.00*ML,12.00*ML,15.00*ML,15.00*ML
  205: };
  206: #undef ML
  207: 
  208: /* dummy attack / decay rate ( when rate == 0 ) */
  209: static INT32 RATE_0[16]=
  210: {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
  211: 
  212: /* -------------------- static state --------------------- */
  213: 
  214: /* lock level of common table */
  215: static int num_lock = 0;
  216: 
  217: /* work table */
  218: static void *cur_chip = NULL;   /* current chip point */
  219: /* currenct chip state */
  220: /* static OPLSAMPLE  *bufL,*bufR; */
  221: static OPL_CH *S_CH;
  222: static OPL_CH *E_CH;
  223: OPL_SLOT *SLOT7_1,*SLOT7_2,*SLOT8_1,*SLOT8_2;
  224: 
  225: static INT32 outd[1];
  226: static INT32 ams;
  227: static INT32 vib;
  228: INT32  *ams_table;
  229: INT32  *vib_table;
  230: static INT32 amsIncr;
  231: static INT32 vibIncr;
  232: static INT32 feedback2;         /* connect for SLOT 2 */
  233: 
  234: /* log output level */
  235: #define LOG_ERR  3      /* ERROR       */
  236: #define LOG_WAR  2      /* WARNING     */
  237: #define LOG_INF  1      /* INFORMATION */
  238: 
  239: //#define LOG_LEVEL LOG_INF
  240: #define LOG_LEVEL       LOG_ERR
  241: 
  242: //#define LOG(n,x) if( (n)>=LOG_LEVEL ) logerror x
  243: #define LOG(n,x)
  244: 
  245: /* --------------------- subroutines  --------------------- */
  246: 
  247: INLINE int Limit( int val, int max, int min ) {
  248:         if ( val > max )
  249:                 val = max;
  250:         else if ( val < min )
  251:                 val = min;
  252: 
  253:         return val;
  254: }
  255: 
  256: /* status set and IRQ handling */
  257: INLINE void OPL_STATUS_SET(FM_OPL *OPL,int flag)
  258: {
  259:         /* set status flag */
  260:         OPL->status |= flag;
  261:         if(!(OPL->status & 0x80))
  262:         {
  263:                 if(OPL->status & OPL->statusmask)
  264:                 {     /* IRQ on */
  265:                         OPL->status |= 0x80;
  266:                         /* callback user interrupt handler (IRQ is OFF to ON) */
  267:                         if(OPL->IRQHandler) (OPL->IRQHandler)(OPL->IRQParam,1);
  268:                 }
  269:         }
  270: }
  271: 
  272: /* status reset and IRQ handling */
  273: INLINE void OPL_STATUS_RESET(FM_OPL *OPL,int flag)
  274: {
  275:         /* reset status flag */
  276:         OPL->status &=~flag;
  277:         if((OPL->status & 0x80))
  278:         {
  279:                 if (!(OPL->status & OPL->statusmask) )
  280:                 {
  281:                         OPL->status &= 0x7f;
  282:                         /* callback user interrupt handler (IRQ is ON to OFF) */
  283:                         if(OPL->IRQHandler) (OPL->IRQHandler)(OPL->IRQParam,0);
  284:                 }
  285:         }
  286: }
  287: 
  288: /* IRQ mask set */
  289: INLINE void OPL_STATUSMASK_SET(FM_OPL *OPL,int flag)
  290: {
  291:         OPL->statusmask = flag;
  292:         /* IRQ handling check */
  293:         OPL_STATUS_SET(OPL,0);
  294:         OPL_STATUS_RESET(OPL,0);
  295: }
  296: 
  297: /* ----- key on  ----- */
  298: INLINE void OPL_KEYON(OPL_SLOT *SLOT)
  299: {
  300:         /* sin wave restart */
  301:         SLOT->Cnt = 0;
  302:         /* set attack */
  303:         SLOT->evm = ENV_MOD_AR;
  304:         SLOT->evs = SLOT->evsa;
  305:         SLOT->evc = EG_AST;
  306:         SLOT->eve = EG_AED;
  307: }
  308: /* ----- key off ----- */
  309: INLINE void OPL_KEYOFF(OPL_SLOT *SLOT)
  310: {
  311:         if( SLOT->evm > ENV_MOD_RR)
  312:         {
  313:                 /* set envelope counter from envleope output */
  314:                 SLOT->evm = ENV_MOD_RR;
  315:                 if( !(SLOT->evc&EG_DST) )
  316:                         //SLOT->evc = (ENV_CURVE[SLOT->evc>>ENV_BITS]<<ENV_BITS) + EG_DST;
  317:                         SLOT->evc = EG_DST;
  318:                 SLOT->eve = EG_DED;
  319:                 SLOT->evs = SLOT->evsr;
  320:         }
  321: }
  322: 
  323: /* ---------- calcrate Envelope Generator & Phase Generator ---------- */
  324: /* return : envelope output */
  325: INLINE UINT32 OPL_CALC_SLOT( OPL_SLOT *SLOT )
  326: {
  327:         /* calcrate envelope generator */
  328:         if( (SLOT->evc+=SLOT->evs) >= SLOT->eve )
  329:         {
  330:                 switch( SLOT->evm ){
  331:                 case ENV_MOD_AR: /* ATTACK -> DECAY1 */
  332:                         /* next DR */
  333:                         SLOT->evm = ENV_MOD_DR;
  334:                         SLOT->evc = EG_DST;
  335:                         SLOT->eve = SLOT->SL;
  336:                         SLOT->evs = SLOT->evsd;
  337:                         break;
  338:                 case ENV_MOD_DR: /* DECAY -> SL or RR */
  339:                         SLOT->evc = SLOT->SL;
  340:                         SLOT->eve = EG_DED;
  341:                         if(SLOT->eg_typ)
  342:                         {
  343:                                 SLOT->evs = 0;
  344:                         }
  345:                         else
  346:                         {
  347:                                 SLOT->evm = ENV_MOD_RR;
  348:                                 SLOT->evs = SLOT->evsr;
  349:                         }
  350:                         break;
  351:                 case ENV_MOD_RR: /* RR -> OFF */
  352:                         SLOT->evc = EG_OFF;
  353:                         SLOT->eve = EG_OFF+1;
  354:                         SLOT->evs = 0;
  355:                         break;
  356:                 }
  357:         }
  358:         /* calcrate envelope */
  359:         return SLOT->TLL+ENV_CURVE[SLOT->evc>>ENV_BITS]+(SLOT->ams ? ams : 0);
  360: }
  361: 
  362: /* set algorythm connection */
  363: static void set_algorythm( OPL_CH *CH)
  364: {
  365:         INT32 *carrier = &outd[0];
  366:         CH->connect1 = CH->CON ? carrier : &feedback2;
  367:         CH->connect2 = carrier;
  368: }
  369: 
  370: /* ---------- frequency counter for operater update ---------- */
  371: INLINE void CALC_FCSLOT(OPL_CH *CH,OPL_SLOT *SLOT)
  372: {
  373:         int ksr;
  374: 
  375:         /* frequency step counter */
  376:         SLOT->Incr = CH->fc * SLOT->mul;
  377:         ksr = CH->kcode >> SLOT->KSR;
  378: 
  379:         if( SLOT->ksr != ksr )
  380:         {
  381:                 SLOT->ksr = ksr;
  382:                 /* attack , decay rate recalcration */
  383:                 SLOT->evsa = SLOT->AR[ksr];
  384:                 SLOT->evsd = SLOT->DR[ksr];
  385:                 SLOT->evsr = SLOT->RR[ksr];
  386:         }
  387:         SLOT->TLL = SLOT->TL + (CH->ksl_base>>SLOT->ksl);
  388: }
  389: 
  390: /* set multi,am,vib,EG-TYP,KSR,mul */
  391: INLINE void set_mul(FM_OPL *OPL,int slot,int v)
  392: {
  393:         OPL_CH   *CH   = &OPL->P_CH[slot/2];
  394:         OPL_SLOT *SLOT = &CH->SLOT[slot&1];
  395: 
  396:         SLOT->mul    = MUL_TABLE[v&0x0f];
  397:         SLOT->KSR    = (v&0x10) ? 0 : 2;
  398:         SLOT->eg_typ = (v&0x20)>>5;
  399:         SLOT->vib    = (v&0x40);
  400:         SLOT->ams    = (v&0x80);
  401:         CALC_FCSLOT(CH,SLOT);
  402: }
  403: 
  404: /* set ksl & tl */
  405: INLINE void set_ksl_tl(FM_OPL *OPL,int slot,int v)
  406: {
  407:         OPL_CH   *CH   = &OPL->P_CH[slot/2];
  408:         OPL_SLOT *SLOT = &CH->SLOT[slot&1];
  409:         int ksl = v>>6; /* 0 / 1.5 / 3 / 6 db/OCT */
  410: 
  411:         SLOT->ksl = ksl ? 3-ksl : 31;
  412:         SLOT->TL  = (v&0x3f)*(0.75/EG_STEP); /* 0.75db step */
  413: 
  414:         if( !(OPL->mode&0x80) )
  415:         {      /* not CSM latch total level */
  416:                 SLOT->TLL = SLOT->TL + (CH->ksl_base>>SLOT->ksl);
  417:         }
  418: }
  419: 
  420: /* set attack rate & decay rate  */
  421: INLINE void set_ar_dr(FM_OPL *OPL,int slot,int v)
  422: {
  423:         OPL_CH   *CH   = &OPL->P_CH[slot/2];
  424:         OPL_SLOT *SLOT = &CH->SLOT[slot&1];
  425:         int ar = v>>4;
  426:         int dr = v&0x0f;
  427: 
  428:         SLOT->AR = ar ? &OPL->AR_TABLE[ar<<2] : RATE_0;
  429:         SLOT->evsa = SLOT->AR[SLOT->ksr];
  430:         if( SLOT->evm == ENV_MOD_AR ) SLOT->evs = SLOT->evsa;
  431: 
  432:         SLOT->DR = dr ? &OPL->DR_TABLE[dr<<2] : RATE_0;
  433:         SLOT->evsd = SLOT->DR[SLOT->ksr];
  434:         if( SLOT->evm == ENV_MOD_DR ) SLOT->evs = SLOT->evsd;
  435: }
  436: 
  437: /* set sustain level & release rate */
  438: INLINE void set_sl_rr(FM_OPL *OPL,int slot,int v)
  439: {
  440:         OPL_CH   *CH   = &OPL->P_CH[slot/2];
  441:         OPL_SLOT *SLOT = &CH->SLOT[slot&1];
  442:         int sl = v>>4;
  443:         int rr = v & 0x0f;
  444: 
  445:         SLOT->SL = SL_TABLE[sl];
  446:         if( SLOT->evm == ENV_MOD_DR ) SLOT->eve = SLOT->SL;
  447:         SLOT->RR = &OPL->DR_TABLE[rr<<2];
  448:         SLOT->evsr = SLOT->RR[SLOT->ksr];
  449:         if( SLOT->evm == ENV_MOD_RR ) SLOT->evs = SLOT->evsr;
  450: }
  451: 
  452: /* operator output calcrator */
  453: #define OP_OUT(slot,env,con)   slot->wavetable[((slot->Cnt+con)/(0x1000000/SIN_ENT))&(SIN_ENT-1)][env]
  454: /* ---------- calcrate one of channel ---------- */
  455: INLINE void OPL_CALC_CH( OPL_CH *CH )
  456: {
  457:         UINT32 env_out;
  458:         OPL_SLOT *SLOT;
  459: 
  460:         feedback2 = 0;
  461:         /* SLOT 1 */
  462:         SLOT = &CH->SLOT[SLOT1];
  463:         env_out=OPL_CALC_SLOT(SLOT);
  464:         if( env_out < EG_ENT-1 )
  465:         {
  466:                 /* PG */
  467:                 if(SLOT->vib) SLOT->Cnt += (SLOT->Incr*vib/VIB_RATE);
  468:                 else          SLOT->Cnt += SLOT->Incr;
  469:                 /* connectoion */
  470:                 if(CH->FB)
  471:                 {
  472:                         int feedback1 = (CH->op1_out[0]+CH->op1_out[1])>>CH->FB;
  473:                         CH->op1_out[1] = CH->op1_out[0];
  474:                         *CH->connect1 += CH->op1_out[0] = OP_OUT(SLOT,env_out,feedback1);
  475:                 }
  476:                 else
  477:                 {
  478:                         *CH->connect1 += OP_OUT(SLOT,env_out,0);
  479:                 }
  480:         }else
  481:         {
  482:                 CH->op1_out[1] = CH->op1_out[0];
  483:                 CH->op1_out[0] = 0;
  484:         }
  485:         /* SLOT 2 */
  486:         SLOT = &CH->SLOT[SLOT2];
  487:         env_out=OPL_CALC_SLOT(SLOT);
  488:         if( env_out < EG_ENT-1 )
  489:         {
  490:                 /* PG */
  491:                 if(SLOT->vib) SLOT->Cnt += (SLOT->Incr*vib/VIB_RATE);
  492:                 else          SLOT->Cnt += SLOT->Incr;
  493:                 /* connectoion */
  494:                 outd[0] += OP_OUT(SLOT,env_out, feedback2);
  495:         }
  496: }
  497: 
  498: /* ---------- calcrate rythm block ---------- */
  499: #define WHITE_NOISE_db 6.0
  500: INLINE void OPL_CALC_RH( OPL_CH *CH )
  501: {
  502:         UINT32 env_tam,env_sd,env_top,env_hh;
  503:         int whitenoise = (rand()&1)*(WHITE_NOISE_db/EG_STEP);
  504:         INT32 tone8;
  505: 
  506:         OPL_SLOT *SLOT;
  507:         int env_out;
  508: 
  509:         /* BD : same as FM serial mode and output level is large */
  510:         feedback2 = 0;
  511:         /* SLOT 1 */
  512:         SLOT = &CH[6].SLOT[SLOT1];
  513:         env_out=OPL_CALC_SLOT(SLOT);
  514:         if( env_out < EG_ENT-1 )
  515:         {
  516:                 /* PG */
  517:                 if(SLOT->vib) SLOT->Cnt += (SLOT->Incr*vib/VIB_RATE);
  518:                 else          SLOT->Cnt += SLOT->Incr;
  519:                 /* connectoion */
  520:                 if(CH[6].FB)
  521:                 {
  522:                         int feedback1 = (CH[6].op1_out[0]+CH[6].op1_out[1])>>CH[6].FB;
  523:                         CH[6].op1_out[1] = CH[6].op1_out[0];
  524:                         feedback2 = CH[6].op1_out[0] = OP_OUT(SLOT,env_out,feedback1);