+ flags=(int)start[1];
+ if(flags&4)
+ s_chan[ch].pLoop=start; // loop adress
+
+ start+=16;
+
+ if(flags&1) { // 1: stop/loop
+ start = s_chan[ch].pLoop;
+ ret |= check_irq(ch, start); // hack.. :(
+ }
+
+ if (start - spuMemC >= 0x80000)
+ start = spuMemC;
+
+ s_chan[ch].pCurr = start; // store values for next cycle
+ s_chan[ch].prevflags = flags;
+
+ return ret;
+}
+
+// do block, but ignore sample data
+static int skip_block(int ch)
+{
+ unsigned char *start = s_chan[ch].pCurr;
+ int flags = start[1];
+ int ret = check_irq(ch, start);
+
+ if(s_chan[ch].prevflags & 1)
+ start = s_chan[ch].pLoop;
+
+ if(flags & 4)
+ s_chan[ch].pLoop = start;
+
+ start += 16;
+
+ if(flags & 1)
+ start = s_chan[ch].pLoop;
+
+ s_chan[ch].pCurr = start;
+ s_chan[ch].prevflags = flags;
+
+ return ret;
+}
+
+// if irq is going to trigger sooner than in upd_samples, set upd_samples
+static void scan_for_irq(int ch, unsigned int *upd_samples)
+{
+ int pos, sinc, sinc_inv, end;
+ unsigned char *block;
+ int flags;
+
+ block = s_chan[ch].pCurr;
+ pos = s_chan[ch].spos;
+ sinc = s_chan[ch].sinc;
+ end = pos + *upd_samples * sinc;
+
+ pos += (28 - s_chan[ch].iSBPos) << 16;
+ while (pos < end)