BCParseToReasonable=0,BCParseToEoF=-1,BCParseToEndMarker=-2,BCInvalidFormat=-1
var debug=0
function MUAP98CmdStr(e,r,a){if(2<(a="number"!=typeof a?0:a))return"…"
var t=["FM1: ","FM2: ","FM3: ","SSGA: ","SSGB: ","SSGC: ","FM4: ","FM5: ","FM6: ","RHY: ","PCM: ","FM7: ","FM8: ","FM9: ","FM10: ","FM11: ","FM12: "],s=X.U8(r),n=9==e?"rhy":10==e?"pcm":3<=e&&e<=5?"ssg":"fm",c=["=",">","<","!="]
if("fm"==n&&s<64)return t[e]+'note "'+Hex(s)+'" '+["C#","D","D#","E","F","F#","G","G#","A","A#","B","C"][s%12]+(1+Util.divu64(s,12))+" ~"+X.U8(r+1)
if("ssg"==n&&s<16)return t[e]+'key-on "'+Hex(s)+'"  ~'+X.U8(r+1)
switch(s){case 255:return t[e]+"rest"
case 254:return t[e]+"reset & play"
case 253:return t[e]+"reset & stop"
case 252:return"-= "+t[e]+"End. =-"
case 251:return t[e]+"wait on '"
case 250:return t[e]+(9==e||10==e?"x9 nop":"3ch 4harm play "+outArray(X.readBytes(r+1,8),16))
case 249:return t[e]+(9==e||10==e?"rhy cmd end":"same freq play")
case 248:return t[e]+"add freq "+outArray(X.readBytes(r+1,3),16)
case 247:return t[e]+"loop @"+Hex(r-X.I16(r+1))+" x"+Hex(X.U8(r+3))
case 246:return t[e]+("ssg"==n?"noise freq ":"pan ")+Hex(X.U8(r+1))
case 245:return t[e]+"Timer-A tempo "+Hex(X.U16(r+1))
case 244:return t[e]+"set length "+Hex(X.U8(r+1))+", ratio "+Hex(X.U8(r+2))
case 243:return"wait all channels"
case 242:return t[e]+(9==e||10==e?"DSP mode, level, delay"+outArray(X.readBytes(r+1,3),16):"ssg"==n?"set start decay data"+outArray(X.readBytes(r+1,3),16):"nop")
case 241:return t[e]+"R"+Hex(X.U8(r+1))+" = "+Hex(X.U8(r+2))
case 240:return t[e]+(9==e||10==e?"Rhythm Key On ":"set system detune ")+Hex(X.U8(r+1))
case 239:return t[e]+(9==e||10==e?"Rhythm Dump ":"hard LFO speed ")+Hex(X.U8(r+1))
case 238:return t[e]+(9==e||10==e?"Rhythm pan/vol ":"hard LFO AMD,PMD,AMon")+outArray(X.readBytes(r+1,2),16)
case 237:return t[e]+(9==e||10==e?"x2 nop":"3ch 4harm mode "+outArray(X.readBytes(r+1,2),16))
case 236:return t[e]+"key display mask on/off & colour "+Hex(X.U8(r+1))
case 235:return t[e]+(9==e||10==e?"PCM Tone ":"ssg"==n?"mixer mode ":"tone ")+Hex(X.U8(r))
case 234:return t[e]+"@jump "+Hex(r+X.I16(r+1))
case 233:return t[e]+"@call "+Hex(r+X.I16(r+1))+' ("'+MUAP98CmdStr(e,r+X.I16(r+1),a+1)+'"...)'
case 232:return t[e]+"@ret"
case 231:return t[e]+"Source Line symbolic info "+Hex(X.U16(r+1))
case 230:return t[e]+(9==e||10==e||"ssg"==n?"x27 nop":"USR Tone")
case 229:return t[e]+"Play Stack init"
case 228:return t[e]+"@if x"+((15&X.U8(r+1))-6)+" "+c[X.U8(r+1)>>4]+" "+X.U8(r+2)+" jump "+Hex(o=r+2+X.I16(r+3))+' ("'+MUAP98CmdStr(e,o,a+1)+'"...)'
case 227:return t[e]+"@if x"+((15&X.U8(r+1))-6)+" "+c[X.U8(r+1)>>4]+" "+X.U8(r+2)+" call "+Hex(o=r+2+X.I16(r+3))+' ("'+MUAP98CmdStr(e,o,a+1)+'")...'
case 226:return t[e]+"change vol data "+Hex(X.U8(r+1))
case 225:return t[e]+"tie"
case 224:return t[e]+"loopcnt clear"
case 223:return t[e]+"slur"
case 222:return t[e]+"set ratio "+Hex(X.U8(r+1))
case 221:return t[e]+"cmt len "+Hex(X.U8(r+1))
case 220:return t[e]+"init Skip_data "+outArray(X.readBytes(r+1,3),16)
case 219:return t[e]+"cmt: "+Hex(X.U8(r+1))+" "+Hex(X.U8(r+2))+': "'+X.SC(r+4,X.U8(r+3),"SJIS")+'"'
case 218:return t[e]+"set X: "+outArray(X.readBytes(r+1,3),16)
case 217:return t[e]+"set LFO pars. "+outArray(X.readBytes(r+1,6),16)
case 216:return t[e]+"LFO start(p,a)/stop "+Hex(X.U8(r+1))
case 215:return t[e]+"vol += "+Hex(X.U8(r+1))
case 214:return t[e]+"vol -= "+Hex(X.U8(r+1))
case 213:return t[e]+(9==e||10==e?"PCM play ":"ssg"==n?"Start vol/Attack rate ":"x3 nop ")+X.U16(r)
case 212:return t[e]+(9==e||10==e?"PCM addr "+X.U32(r+1):"x5 nop")
case 211:var o=(15&X.U8(r+1))-6
return t[e]+"@if "+(0<=o?"x"+o:"lpcnt")+" "+c[X.U8(r+1)>>4]+" "+X.U8(r+2)+" exit "+Hex(r+5+X.U16(r+3))
case 210:return t[e]+"Play Stack +1"
case 209:return t[e]+"fade out"
case 208:return t[e]+"ssg||pcm "+Hex(X.U8(r+1))
case 207:return t[e]+"channel change "+Hex(X.U8(r+1))
case 206:return t[e]+(9==e||10==e?"set last tone,vol,pan":"ssg"==n?"set last tone,vol":"?? FM: CEh ??")
default:return t[e]+"unk. cmd "+Hex(s)}}function parseMUAP98(e,r,a){for(var s,n=e=e||0,c=(r=r||BCParseToReasonable)==BCParseToReasonable?Math.min(65536,X.Sz(),e+1024):r==BCParseToEoF||r==BCParseToEndMarker?Math.min(65536,X.Sz()):e+r,o=9==a?"rhy":10==a?"pcm":3<=a&&a<=5?"ssg":"fm",u=0,i=!1,d="",U=ifd=mp=ic=0,l=[],f=n;f<c;f++)l[f]=!1
function m(e,r){return 1<debug&&_l2r("muap98",e,"ch"+a+": "+r),[BCInvalidFormat,e,0]}for(;n<=e&&e<c&&!i;)if(ifd<0&&sus++,l[e]=!0,e>mp&&(mp=e),(s=X.U8(e))<64){if(15<s&&"ssg"==o)return m(e,"!badSSGnote")
X.U8(e+1)||ic++,u++,e+=2}else{if(s<206)return m(e,"!badcmd"+Hex(s))
switch(s){case 255:e++
break
case 254:e++
break
case 253:e++,i=!0
break
case 252:i=!0,e++,mp<e&&(mp=e)
break
case 251:e++
break
case 249:9!=a&&u++,e++
break
case 248:e+=4
break
case 247:if(t=e-X.I16(e+1),!isWithin(t,24,c)||Math.abs(t-e)<2)return m(e,"loop@"+Hex(t))
isWithin(t,n,c)||sus++,e+=4
break
case 246:e+=2
break
case 245:if(!isWithin(X.U16(e+1),16,4095))return m(e,"!badtempo")
e+=3
break
case 244:e+=3
break
case 243:e++
break
case 242:e+=4
break
case 241:e+=3
break
case 240:9!=a&&10!=a||(u++,X.U8(e+1))||m(e,"RHY F0: 0"),e+=2
break
case 223:case 210:case 209:e++
break
case 250:e+=9
break
case 239:e+=2
break
case 238:e+=3
break
case 237:case 236:case 235:e+=2
break
case 234:if(t=e+X.I16(e+1),!isWithin(t,24,c)||Math.abs(t-e)<2)return m(e,"!"+MUAP98CmdStr(a,e,1))
t<n&&ic++,l[t]&&(i=!0),e=t
break
case 233:if(t=e+X.I16(e+1),!isWithin(t,24,c)||Math.abs(t-e)<2)return m(e,"!"+MUAP98CmdStr(a,e,1))
t<n&&ic++,U++,e+=3
break
case 232:if(--U<0)return m(e,"!RetW/oSub")
e++
break
case 231:e+=3
break
case 230:e+=27
break
case 229:e++
break
case 228:case 227:if(t=e+2+X.I16(e+3),!isWithin(t,24,c)||Math.abs(t-e)<2||3<X.U8(e+1)>>4)return m(e,"!"+MUAP98CmdStr(a,e,1))
t<n&&ic++,227==s&&U++,228==s?(l[t]&&(i=!0),e=t):e+=5
break
case 226:e+=2
break
case 225:e++
break
case 224:e++
break
case 222:e+=2
break
case 221:X.U8(e+1),e+=2
break
case 220:e+=4
break
case 219:d=d.appendS(X.SC(e+4,X.U8(e+3),"SJIS")," / "),e+=X.U8(e+3)+4
break
case 218:e+=4
break
case 217:e+=7
break
case 216:e+=2
break
case 215:case 214:e+=2
break
case 213:e+=3,9!=a&&10!=a||u++
break
case 212:case 211:e+=5
break
case 208:m(e,"ssg/pcm:"+Hex(X.U8(e+1))),e+=2
break
case 207:o=9==(a=X.U8(e+1))?"rhy":10==a?"pcm":3<=a&&a<=5?"ssg":"fm",e+=2
break
case 206:e++}}return[u,e,0,d,mp,ic]}function MDXCmdStr(e,r){var a=["A","B","C","D","E","F","G","H","P","Q","R","S","T","U","V","W"],t=X.U8(r)
if(t<128)return a[e]+": rest "+(t+1)
if(t<=223)return t-=128,8<e?a[e]+": smp#"+t:a[e]+": "+["D#","E","F","F#","G","G#","A","A#","B","B#","C","C#","D"][t%12]+Util.divu64(t,12)+" ~"+(X.U8(r+1)+1)
switch(t){case 255:return a[e]+": bpm "+X.U8(r+1)
case 254:return a[e]+": R "+YM2151RegStr(X.U8(r+1),X.U8(r+2))
case 253:return a[e]+": voicedata "+X.U8(r+1)
case 252:return a[e]+": pan "+X.U8(r+1)
case 251:return 128&X.U8(r+1)?a[e]+": @vol "+(127&X.U8(r+1)):a[e]+": vol "+X.U8(r+1)
case 250:return a[e]+": vol-"
case 249:return a[e]+": vol+"
case 248:return a[e]+": staccato "+X.U8(r+1)
case 247:return a[e]+": legato"
case 246:return a[e]+": rep."+X.U8(r+1)+" ["+(X.U8(r+2)?"/"+X.U8(r+2):"")+"..."
case 245:return a[e]+": ...]rep.,ret→"+Hex(r+X.I16(r+1,_BE))
case 244:return a[e]+": .../rep.esc→"+Hex(r+X.I16(r+1,_BE))
case 243:return a[e]+": detune "+X.I16(r+1,_BE)/64
case 242:return a[e]+": portamento "+X.I16(r+1,_BE)/16384+" ↓"
case 241:return X.U8(r+1)?a[e]+": loop from "+Hex(r+3+X.I16(r+1,_BE))+".":a[e]+" ends."
case 240:return a[e]+": delay key-on "+X.U8(r+1)
case 239:return a[e]+": sync send on ch"+X.U8(r+1)
case 238:return a[e]+": sync wait on ch"+X.U8(r+1)
case 237:return a[e]+": noise/smp freq "+X.U8(r+1)
case 236:return 128==X.U8(r+1)?a[e]+": pitch LFO off":129==X.U8(r+1)?a[e]+": pitch LFO on":a[e]+": LFO pitch wf "+X.U8(r+1)+" freq "+X.U16(r+2,_BE)+" amp "+X.U16(r+4,_BE)
case 235:return 128==X.U8(r+1)?a[e]+": vol LFO off":129==X.U8(r+1)?a[e]+": vol LFO on":a[e]+": LFO vol wf "+X.U8(r+1)+" freq "+X.U16(r+2,_BE)+" amp "+X.U16(r+4,_BE)
case 234:return 128==X.U8(r+1)?a[e]+": OPM LFO off":129==X.U8(r+1)?a[e]+": OPM LFO on":a[e]+": LFO OPM syn/wf "+X.U8(r+1)+" lfrq "+X.U8(r+2)+" PMD "+X.U8(r+3)+" AMD "+X.U8(r+4)+" P/AMS "+X.U8(r+5)
case 233:return a[e]+": LFO key-on dly "+X.U8(r+1)
case 232:return a[e]+": PCM8 on"
case 231:return a[e]+": Fadeout"+(1==X.U8(r+1)?"":Hex(X.U8(r+1)))+" spd "+X.U8(r+2)
default:return a[e]+": unknown command "+Hex(X.U8(r))}}function isYM2151Reg(e){return[0,2,3,4,5,6,7,9,10,11,12,13,14,16,19,21,22,23,26,28,29,30,31].indexOf(e)<0}function YM2151RegStr(e,r){return isYM2151Reg(e)?1==e?(2&r)==r?"LFOR":"TEST"+Bin(r):8==e?"keyon ch"+(7&r)+" slot"+Bin(r>>3&15):15==e?"noise"+["off","on"][r>>7]+" freq"+Hex(r>>31):17==e?"CLKA MSB freq"+Hex(r):18==e?"CLKA LSB freq"+Hex(3&r):19==e?"CLKB freq"+Hex(r):20==e?"Clk CSM"+(r>>7)+" FResetBA"+Bin(r>>4&3,2)+" IRQEnBA"+Bin(r>>2&3,2)+" LoadBA"+Bin(3&r,2):24==e?"LowOscFreq "+Hex(r):25==e?["Amp","Phase"][r>>7]+"Mod depth"+Hex(127&r):27==e?"LFOWave ctl"+(r>>6)+" "+["saw","sqr","tri","noise"][3&r]:e<=39?"Ch "+(7&e)+" ctl "+(128&r?"R":"")+(64&r?"L":"")+" FB"+(r>>3&7)+" con"+(7&r):e<=47?"KC/prep note-on ch"+(7&e)+" "+((o=r>>4&7)?["C#","D","D#","","E","F","F#","","G","G#","A","","A#","B","C",""][15&r]+o:"--"):e<=55?"KF/prep p.bend ch"+(7&e)+" kf"+(r>>2):e<=63?"ModSensy. ch"+(7&e)+" phase"+(r>>4&7)+" amp"+(3&r):e<=71?"OP1 ch"+(7&e)+" dt1:"+(r>>4&7)+" mul"+(15&r):e<=79?"OP3 ch"+(7&e)+" dt1:"+(r>>4&7)+" mul"+(15&r):e<=87?"OP2 ch"+(7&e)+" dt1:"+(r>>4&7)+" mul"+(15&r):e<=95?"OP4 ch"+(7&e)+" dt1:"+(r>>4&7)+" mul"+(15&r):e<=103?"OP1 ch"+(7&e)+" TL"+(127&r):e<=111?"OP3 ch"+(7&e)+" TL"+(127&r):e<=119?"OP2 ch"+(7&e)+" TL"+(127&r):e<=127?"OP4 ch"+(7&e)+" TL"+(127&r):e<=135?"OP1 ch"+(7&e)+" KeyScl"+(r>>6)+" atk"+(31&r):e<=143?"OP3 ch"+(7&e)+" KeyScl"+(r>>6)+" atk"+(31&r):e<=151?"OP2 ch"+(7&e)+" KeyScl"+(r>>6)+" atk"+(31&r):e<=159?"OP4 ch"+(7&e)+" KeyScl"+(r>>6)+" atk"+(31&r):e<=167?"OP1 ch"+(7&e)+" AMS"+["off","on"][r>>7]+" dcy1R:"+(31&r):e<=175?"OP3 ch"+(7&e)+" AMS"+["off","on"][r>>7]+" dcy1R:"+(31&r):e<=183?"OP2 ch"+(7&e)+" AMS"+["off","on"][r>>7]+" dcy1R:"+(31&r):e<=191?"OP4 ch"+(7&e)+" AMS"+["off","on"][r>>7]+" dcy1R:"+(31&r):e<=199?"OP1 ch"+(7&e)+" dt2:"+(r>>6)+" dcy2R:"+(31&r):e<=207?"OP3 ch"+(7&e)+" dt2:"+(r>>6)+" dcy2R:"+(31&r):e<=215?"OP2 ch"+(7&e)+" dt2:"+(r>>6)+" dcy2R:"+(31&r):e<=223?"OP4 ch"+(7&e)+" dt2:"+(r>>6)+" dcy2R:"+(31&r):e<=231?"OP1 ch"+(7&e)+" dcy2L:"+(r>>4)+" rel:"+(15&r):e<=239?"OP3 ch"+(7&e)+" dcy2L:"+(r>>4)+" rel:"+(15&r):e<=247?"OP2 ch"+(7&e)+" dcy2L:"+(r>>4)+" rel:"+(15&r):"OP4 ch"+(7&e)+" dcy2L:"+(r>>4)+" rel:"+(15&r):"!bad#"+Hex(e)}function parseYM2151RegLog(e,r){r=r||BCParseToReasonable,e=e||0
for(var a,t,s=r==BCParseToEoF?X.Sz():Math.min(X.Sz(),e+8192),n=0,c=0,o=!1,u=[0,0,0,0,0],i=[],d=0;d<8;i[d++]=0);function U(){0<debug&&_l2r("opm",e-2,Hex(a)+" - "+Hex(t)+": invalid value"),c++}for(;!X.U8(e)&&e<2048;)e++
if(!X.U8(e))return[BCInvalidFormat,e,0]
for(;e<s&&c<10;)if(a=X.U8(e++)){if(t=X.U8(e++),isYM2151Reg(a)||U(),1<debug&&_logIt(YM2151RegStr(a,t)),a<=39)if(1==a){if(253&t)break}else 8==a?120&t?(n+=bitCount(t>>3&15),u[0]++):128&t&&U():15==a?96&t&&U():17==a?3<t&&U():20==a?64&t&&U():27==a&&60&t&&U()
else a<=47?(128&t||0<=[3,7,11,15].indexOf(15&t))&&U():a<=55||(a<=63?140&t&&U():(a<=127?(128&t&&U(),u[1]++):a<=159?(32&t&&U(),u[2]++):a<=191?(96&t&&U(),u[3]++):(a<=223&&32&t&&U(),u[4]++),i[7&a]++))
if(!o&&4096<e){if(40<=c||n<20||u[0]<24||u[1]<24||u[2]<24||u[3]<24||u[4]<24)return[BCInvalidFormat]
o=!0}}for(var l=0,d=0;d<8;d++)5<i[d]&&l++
return 0<debug&&_logIt(outArray([n,u,l,e],16)),o&&0<l?[n,e,l]:[BCInvalidFormat,e,l]}function isYM2612Reg(e){return!(e<34||35==e||183<e||isWithin(e,44,47))}function parseMDGYM(e,r){r=r||BCParseToReasonable,e=e||0,0<debug&&(a=new CheckpointTimer).init(300)
var a,t,s,n,c,o=r==BCParseToEoF?X.Sz():Math.min(X.Sz(),e+8192),u=0,i=[0,0,0,0,0],d=0,U=!1
for(;!X.U8(e)&&e<2048;)e++
for(;e<o&&d<10;)switch(t=X.U8(e++)){case 0:U=!1
break
case 1:case 2:if(s=X.U8(e++),2==t&&s<33)return
n=X.U8(e++),isYM2612Reg(s)||(d++,0<debug&&_l2r("gym",e-2,t+": R "+Hex(s))),40==s&&n>>4?(u+=bitCount(n>>4),0<debug&&_l2r("gym",e-2,"#")):42==s?i[4]++:48==(240&s)?(i[0]++,0<debug&&_l2r("gym",e-2,"ML/DT")):64==(240&s)&&0<X.U8(e)?(i[1]++,0<debug&&_l2r("gym",e-2,"TL")):80==(240&s)?(i[2]++,0<debug&&_l2r("gym",e-2,"AR/RS")):96==(240&s)?(i[3]++,0<debug&&_l2r("gym",e-2,"DR/AM")):0<debug&&_l2r("gym",e-2,t+": R "+Hex(s))
break
case 3:if(s=X.U8(e++),0<debug&&_l2r("gym",e-2,"PSG"),128&s)U=!(16&s)&&s<224
else{if(!(U&&s<64))return[BCInvalidFormat,e,0]
U=!1}break
default:return n=e-1,c="!cmd"+Hex(t),0<debug&&_l2r("gym",n,c),[BCInvalidFormat,n,0]}return 0<debug&&a.next("GYM: end of tested area @"+Hex(e)+" ir="+d),0<debug&&_l2r("gym",e,outArray([u,i],16)),(!u||i[0]<8||i[1]<8||i[2]<8||i[3]<8)&&i[0]+i[1]+i[2]+i[3]+i[4]<100?[BCInvalidFormat,e,0]:[u,e,0]}function isYM3812Reg(e){return isWithinRanges(e,[1,2,3,4,8,189,[32,53]])||isWithinRanges(e,[[64,85],[96,117],[128,149],[224,245]])&&[6,7,14,15].indexOf(31&e)<0||isWithinRanges(e,[[160,168],[176,184],[192,200]])}for(var __adlibnote=[],_0=0;_0<9;_0++)__adlibnote.push([-1,-1,-1])
function YM3812CmdStr(e,r){var a=["1.1:","2.1:","3.1:","1.2:","2.2:","3.2:","!6:","!7:","4.1:","5.1:","6.1:","4.2:","5.2:","6.2:","!E:","!F:","7.1:","8.1:","9.1:","7.2:","8.2:","9.2:"],t=X.U8(e)
return 224<=t?a[31&t]+"wf "+["sine","/￣\\_","/￣\\/￣\\","/|_/|_"][X.U8(e+1)]:192<=t?1+(15&t)+":fb/conn"+Hex(X.U8(e+1)):189==t?"AMdepth/VD/Rhy "+Hex(X.U8(e+1)):176<=t?1+(15&t)+"oct/F_msb/key-on "+Hex(X.U8(e+1)):160<=t?1+(15&t)+"F_lsb "+Hex(X.U8(e+1)):128<=t?a[31&t]+"S/R "+Hex(X.U8(e+1)):96<=t?a[31&t]+"A/D "+Hex(X.U8(e+1)):64<=t?a[31&t]+"level "+Hex(X.U8(e+1)):32<=t?a[31&t]+"AM/vib/envgen/keyscale/MFmul "+Hex(X.U8(e+1)):8==t?"CSM/keysplit "+Hex(X.U8(e+1)):4==t?"tmrctl "+Hex(X.U8(e+1)):3==t?"tmr2 "+Hex(X.U8(e+1)):2==t?"tmr1 "+Hex(X.U8(e+1)):4==t?"test/wfctl "+Hex(X.U8(e+1)):void 0}function parseYM3812RegLog(e,r){e=e||0
var a,t,s,n,c,o=(r=r||BCParseToReasonable)==BCParseToEoF?X.Sz()-2:Math.min(X.Sz()-2,e+8192),u=0,i=[0,0,0,0]
for(0<debug&&(s=new CheckpointTimer).init(300);!X.U8(e)&&e<2048;)e++
if(!X.U8(e))return[BCInvalidFormat,e,0]
for(;e<o;){if(a=X.U8(e++),t=X.U8(e++),!isYM3812Reg(a))return n=e-2,c="R "+Hex(a)+" : "+Hex(t),1<debug&&_l2r("adlib",n,c),[BCInvalidFormat,n,0]
40==a&&t>>4&&(u+=bitCount(t>>4)),48==(240&a)&&i[0]++,64==(240&a)&&0<X.U8(e)&&i[1]++,80==(240&a)&&i[2]++,96==(240&a)&&i[3]++}return 0<debug&&s.next("OPM chiptune: end of parsed data"),0<debug&&_logIt(outArray([u,i,e],16)),!u||i[0]<24||i[1]<24||i[2]<24||i[3]<24?[BCInvalidFormat,e,0]:[u,e,0]}