10 REM > Dis816 0.00 - 21-May-2017 - 65816 disassembly routines
   20 :
   30 DEFFNDis_Name(cpu%):IFcpu%=65:="65x02" ELSE ="65816"
   40 DEFFNDis_Code(cpu%,Ptr%,Data%):LOCAL op%,ins%,md%,b0%,num%,sz%
   50 num%=1:op%=?Data%:ins%=op%DIV32:md%=(op%AND31)DIV4:b0%=(op%AND3):sz%=2:IFcpu%=65:sz%=1
   60 X%!0=0:$(X%+4)=FN_diss:X%?3=num%:=num%
   70 DEFFN_diss
   80 IF(op%AND&F)=8:=MID$("PHPCLCPLPSECPHACLIPLASEIDEYTYATAYCLVINYCLDINXSED",1+3*(op%DIV16),3)
   90 IF(op%AND&8F)=&8A:=MID$("TXATXSTAXTSXDEXPHXNOPPLX",3*(op%DIV16)-23,3)
  100 IFop%=&20:="JSR "+FNmde(3)
  110 IF(op%AND&9F)=0:X%?2=(op%AND64):=MID$("BRK***RTIRTS",ins%*3+1,3)
  120 IF(op%AND&DF)=&5A:=MID$("PHYPLY",ins%*3-5,3)
  130 IFop%=&89:="BIT "+FNmde(2)
  140 IFb0%=1:=FNalu(ins%)+" "+FNmde(md%)
  150 IF(op%AND31)=&12:=FNalu(ins%)+" "+FNmde(16)
  160 IF(op%AND&EF)=&64:="STZ "+FNmde(md%)
  170 IF(op%AND&FD)=&9C:="STZ "+FNmde(b0%*2+3)
  180 IF(op%AND&D7)=&96:=FNrot(ins%)+" "+FNmde(md%AND3)+",Y"
  190 IF(op%AND7)=6:=FNrot(ins%)+" "+FNmde(md%)
  200 IF(op%AND&1F)=16:num%=2:="B"+MID$("PLMIVCVSCCCSNEEQ",1+2*ins%,2)+" "+FNjr(Data%?1,1)
  210 IF(op%AND&8F)=10:=FNrot((ins%+(md%AND4)*1.5)EOR((md%>4)AND1))+" A"
  220 IF(op%AND&E7)=4:="T"+MID$("SR",1+(md%DIV4),1)+"B "+FNmde(md%AND3)
  230 IF(op%AND&D3)=&C0:=FNbxy(ins%)+" "+FNmde(((md%EOR3)-1)AND3)
  240 IF(op%AND&E7)=&24:="BIT "+FNmde(md%)
  250 IF(op%AND&C7)=&84:=FNbxy(ins%)+" "+FNmde(md%)
  260 IF(op%AND&FD)=&A0:="LD"+MID$("YX",1+((op%AND2)DIV2),1)+" "+FNmde(2)
  270 IF(op%AND&CF)=&4C:IFop%<>&5C:X%?2=64:="JMP "+LEFT$("(",op%>&5F)+FNmde(md%)+LEFT$(")",op%>&5F)
  280 IFop%=&80:num%=2:X%?2=64:="BRA "+FNjr(Data%?1,1)
  290 REM 65816 instructions
  300 IFb0%=3:IF(md%AND3)<>2:=FNalu(ins%)+" "+FNmde(md%+8)
  310 IF(op%AND&0F)=&0B:X%?2=((op%=&6B)AND64):=MID$("PHDTCSPLDTSCPHKTCDRTLTDCPHBTXYPLBTYXWAISTPXBAXCE",(op%DIV16)*3+1,3)
  320 IF((op%-&20)AND&DF)=&42:X%?2=((op%=&82)AND64):num%=3:=MID$("PERBRL",(op%DIV128)*3+1,3)+" "+FNjr(Data%!1 AND &FFFF,2)
  330 IF(op%AND&DF)=&C2 OR op%=2:num%=2:=MID$("REPSEPCOP",(ins%AND1)*3+1-6*(op%=2),3)+" #&"+FNh0(Data%?1,2)
  340 IFop%=&22:="JSL "+FNmde(11)
  350 IFop%=&5C:="JMP "+FNmde(11)
  360 IFop%=&FC:num%=3:="JSR (&"+FNh0(Data%!1,4)+",X)"
  370 IFop%=&DC:X%?2=64:num%=3:="JMP [&"+FNh0(Data%!1,4)+"]"
  380 IF(op%AND&EF)=&44:num%=3:=MID$("MVPMVN",(op%DIV16)*3-11,3)+" &"+FNh0(Data%?1,2)+",&"+FNh0(Data%?2,2)
  390 IF(op%AND&DF)=&D4:=MID$("PEIPEA",ins%*3-17,3)+" "+FNmde((ins%AND1)*2+1)
  400 IFop%=&42:="WDM"
  410 X%?2=128:="EQUB &"+FNh0(op%,2)
  420 :
  430 DEFFNalu(A%)=MID$("ORAANDEORADCSTALDACMPSBC",A%*3+1,3)
  440 DEFFNrot(A%)=MID$("ASLROLLSRRORSTXLDXDECINC",A%*3+1,3)
  450 DEFFNbxy(A%)=MID$("***BIT***STZSTYLDYCPYCPX",A%*3+1,3)
  460 :
  470 REM 0  - (&nn,X)               8 - &nn,S
  480 REM 1  - &nn                   9 - [&nn]
  490 REM 2  - #&nn     #&nnnn      10 -
  500 REM 3  - &nnnn                11 - &nnnnnn
  510 REM 4  - (&nn),Y              12 - (&nn,S),Y
  520 REM 5  - &nn,X                13 - [&nn],Y
  530 REM 6  - &nnnn,Y              14 -
  540 REM 7  - &nnnn,X              15 - &nnnnnn,X
  550 REM 16 - (&nn)
  560 DEFFNmde(A%)
  570 IF A%=0 OR A%=4 OR A%=16:num%=2:="(&"+FNh0(Data%?1,2)+LEFT$(",X",A%=0)+")"+LEFT$(",Y",A%=4)
  580 IF A%=1 OR A%=5         :num%=2:="&"+FNh0(Data%!1,2)+LEFT$(",X",A%=5)
  590 IF A%=2                 :num%=1+sz%:="#&"+FNh0(Data%!1,sz%*2)
  600 IF A%=3 OR A%=6 OR A%=7 :num%=3:="&"+FNh0(Data%!1,4)+LEFT$(",Y",A%=6)+LEFT$(",X",A%=7)
  610 IF A%=8 OR A%=12        :num%=2:=LEFT$("(",A%=12)+"&"+FNh0(Data%?1,2)+",S"+LEFT$("),Y",A%=12)
  620 IF A%=9 OR A%=13        :num%=2:="[&"+FNh0(Data%?1,2)+"]"+LEFT$(",Y",A%=13)
  630 IF A%=11 OR A%=15       :num%=4:="&"+FNh0(Data%!1,6)+LEFT$(",X",A%=15)
  640 ="?"
  650 :
  660 DEFFNjr(A%,sz%):IFsz%=1:IFA%<128:="&"+FNh0(Ptr%+A%+2,4) ELSE IFsz%=1:="&"+FNh0(Ptr%+A%+2-256,4)
  670 IFA%<32768:="&"+FNh0(Ptr%+A%+3,4) ELSE ="&"+FNh0(Ptr%+A%+2-32768,4)