public static void YM_DELTAT_ADPCM_CALC(YM_DELTAT DELTAT) {
	/*UINT32*/int step;
	int data;
	int old_m;
	int now_leveling;
	int delta_next;

	DELTAT.now_step += DELTAT.step;
	if ( DELTAT.now_step >= (1<<YM_DELTAT_SHIFT) )
	{
		step = (int)(DELTAT.now_step >> YM_DELTAT_SHIFT);
		DELTAT.now_step &= (1<<YM_DELTAT_SHIFT)-1;
		do{
			if ( DELTAT.now_addr > (DELTAT.end<<1) ) {
				if(( DELTAT.portstate&0x10 )!=0){
					/**** repeat start ****/
					DELTAT.now_addr = DELTAT.start<<1;
					DELTAT.adpcmx   = 0;
					DELTAT.adpcmd   = YM_DELTAT_DELTA_DEF;
					DELTAT.next_leveling = 0;
					DELTAT.flag     = 1;
				}else{
					DELTAT.arrivedFlag |= DELTAT.flagMask;
					DELTAT.flag = 0;
					DELTAT.adpcml = 0;
					now_leveling = 0;
					return;
				}
			}
			if(( DELTAT.now_addr&1 )!=0) data = DELTAT.now_data & 0x0f;
			else
			{
				DELTAT.now_data = (ym_deltat_memory.read((int)(DELTAT.now_addr>>1)));
				data = DELTAT.now_data >> 4;
			}
			DELTAT.now_addr++;
			/* shift Measurement value */
			old_m      = DELTAT.adpcmx/*adpcmm*/;
			/* ch.adpcmm = YM_DELTAT_Limit( ch.adpcmx + (decode_tableB3[data] * ch.adpcmd / 8) ,YM_DELTAT_DECODE_MAX, YM_DELTAT_DECODE_MIN ); */
			/* Forecast to next Forecast */
			DELTAT.adpcmx += (ym_deltat_decode_tableB1[data] * DELTAT.adpcmd / 8);
		//	YM_DELTAT_Limit(DELTAT.adpcmx,YM_DELTAT_DECODE_MAX, YM_DELTAT_DECODE_MIN);
                        if ( DELTAT.adpcmx > YM_DELTAT_DECODE_MAX ) DELTAT.adpcmx = YM_DELTAT_DECODE_MAX;			
                        else if ( DELTAT.adpcmx < YM_DELTAT_DECODE_MIN ) DELTAT.adpcmx = YM_DELTAT_DECODE_MIN;
			/* delta to next delta */
			DELTAT.adpcmd = (DELTAT.adpcmd * ym_deltat_decode_tableB2[data] ) / 64;
		//	YM_DELTAT_Limit(DELTAT.adpcmd,YM_DELTAT_DELTA_MAX, YM_DELTAT_DELTA_MIN );
                        if ( DELTAT.adpcmd > YM_DELTAT_DELTA_MAX ) DELTAT.adpcmd = YM_DELTAT_DELTA_MAX;			
                        else if ( DELTAT.adpcmd < YM_DELTAT_DELTA_MIN ) DELTAT.adpcmd = YM_DELTAT_DELTA_MIN;
			/* shift leveling value */
			delta_next        = DELTAT.adpcmx/*adpcmm*/ - old_m;
			now_leveling      = DELTAT.next_leveling;
			DELTAT.next_leveling = old_m + (delta_next / 2);
		}while(--step!=0);
		/* delta step of re-sampling */
		DELTAT.sample_step = (DELTAT.next_leveling - now_leveling) * DELTAT.volume_w_step;
		/* output of start point */
		DELTAT.adpcml  = now_leveling * DELTAT.volume;
		/* adjust to now */
		DELTAT.adpcml += (int)((double)DELTAT.sample_step * ((double)DELTAT.now_step/(double)DELTAT.step));
	}
	DELTAT.adpcml += DELTAT.sample_step;

	/* output for work of output channels (outd[OPNxxxx])*/
	DELTAT.pan.write(DELTAT.pan.read() + DELTAT.adpcml);//*(DELTAT.pan) += DELTAT.adpcml;
    }