10 REM > Dis09 1.00 - 24Sep2007 - 6809 disassembly routines
   20 :
   30 DEFFNDis_Name(A%)="6809"
   40 DEFFNDis_Code(A%,Ptr%,Data%):num%=1
   50 X%!0=0:$(X%+4)=FN_diss:IFnum%<1:num%=1:$(X%+4)="EQUB &"+FNh0(Data%?0,2)
   60 X%?3=num%:=num%
   70 DEFFN_diss:op%=?Data%:num%=1
   80 IF(op%AND&CF)=&83:="SUBD "+FNmde2((op%AND&30)DIV16)
   90 IF(op%AND&CF)=&C3:="ADDD "+FNmde2((op%AND&30)DIV16)
  100 IFop%=&87:num%=0:=""
  110 IFop%=&C7:num%=0:=""
  120 IF(op%AND&CF)=&87:="ST"+CHR$(65+(op%AND64)DIV64)+"  "+FNmde((op%AND&30)DIV16)
  130 IF(op%AND&CF)=&8C:="CMPX "+FNmde2((op%AND&30)DIV16)
  140 IF(op%AND&CF)=&CC:="LDD  "+FNmde2((op%AND&30)DIV16)
  150 IFop%=&8D:num%=2:="BSR  &"+FNh0(FNjr(Data%?1),4)
  160 IF(op%AND&CF)=&8D:="JSR  "+FNmde((op%AND&30)DIV16)
  170 IFop%=&CD:num%=0:=""
  180 IF(op%AND&CF)=&CD:="STD  "+FNmde2((op%AND&30)DIV16)
  190 IF(op%AND&CF)=&8E:="LDX  "+FNmde2((op%AND&30)DIV16)
  200 IF(op%AND&CF)=&CE:="LDU  "+FNmde2((op%AND&30)DIV16)
  210 IFop%=&8F:num%=0:=""
  220 IF(op%AND&CF)=&8F:="STX  "+FNmde2((op%AND&30)DIV16)
  230 IFop%=&CF:num%=0:=""
  240 IF(op%AND&CF)=&CF:="STU  "+FNmde2((op%AND&30)DIV16)
  250 IF(op%AND&80)=&80:=FNalu(op%AND15)+CHR$(65+(op%AND64)DIV64)+" "+LEFT$(" ",(op%AND&8E)=&86)+FNmde((op%AND&30)DIV16)
  260 IF(op%AND&E0)=&40:=FNrot(op%AND15)+CHR$(65+(op%AND16)DIV16)
  270 IF(op%AND&EF)=&6E:="JMP  "+FNmde2((op%AND&30)DIV16)
  280 IF(op%AND&E0)=&60:=FNrot(op%AND15)+"  "+FNmde((op%AND&30)DIV16)
  290 IF(op%AND&F0)=&20:num%=num%+1:="B"+MID$("RARNHILSCCCSNEEQVCVSPLMIGELTGTLE",(op%AND15)*2+1,2)+"  &"+FNh0(FNjr(Data%?1),4)
  300 IFop%=&0E:="JMP  "+FNmde(1)
  310 IF(op%AND&F0)=&00:=FNrot(op%AND15)+"  "+FNmde(1)
  320 IFop%=&10:=FNgrp10
  330 IFop%=&11:=FNgrp11
  340 IFop%=&12:="NOP"
  350 IFop%=&13:="SYNC"
  360 IFop%=&19:="DAA"
  370 IFop%=&1A:="ORCC "+FNmde(0)
  380 IFop%=&1C:="ANDCC "+FNmde(0)
  390 IFop%=&1D:="SEX"
  400 IF(op%AND&FE)=&1E:num%=num%+1:=MID$("EXGTFR",(op%AND1)*3+1,3)+"  "+FNr(Data%?1 DIV16)+","+FNr(Data%?1 AND15)
  410 IF(op%AND&FC)=&30:="LEA"+FNreg2(op%AND3)+" "+FNmde(2)
  420 IFop%=&34:num%=num%+1:="PSHS "+FNstk(Data%?1)
  430 IFop%=&35:num%=num%+1:="PULS "+FNstk(Data%?1)
  440 IFop%=&36:num%=num%+1:="PSHU "+FNstk(Data%?1)
  450 IFop%=&37:num%=num%+1:="PULS "+FNstk(Data%?1)
  460 IFop%=&39:="RTS"
  470 IFop%=&3A:="ABX"
  480 IFop%=&3B:="RTI"
  490 IFop%=&3C:="CWAI"
  500 IFop%=&3D:="MUL"
  510 IFop%=&3F:="SWI"
  520 IFop%=&16:num%=3:="LBRA &"+FNh0(FNljr(256*Data%?1+Data%?2),4)
  530 IFop%=&17:num%=3:="LBSR &"+FNh0(FNljr(256*Data%?1+Data%?2),4)
  540 IFop%=&3E:="RESET"
  550 num%=0:=""
  560 DEFFNgrp10:num%=num%+1:op%=Data%?1
  570 IF(op%AND&E0)=&20:num%=num%+1:="LB"+MID$("RARNHILSCCCSNEEQVCVSPLMIGELTGTLE",(op%AND15)*2+1,2)+" &"+FNh0(FNljr(256*Data%?1+Data%?2),4)
  580 IFop%=&3F:="SWI2"
  590 IF(op%AND&CF)=&83:="CMPD "+FNmde2((op%AND&30)DIV16)
  600 IF(op%AND&CF)=&8C:="CMPY "+FNmde2((op%AND&30)DIV16)
  610 IF(op%AND&CF)=&8E:="LDY  "+FNmde2((op%AND&30)DIV16)
  620 IFop%=&8F;num%=0:=""
  630 IF(op%AND&CF)=&8F:="STY  "+FNmde2((op%AND&30)DIV16)
  640 IF(op%AND&CF)=&CE:="LDS  "+FNmde2((op%AND&30)DIV16)
  650 IFop%=&CF:num%=0:=""
  660 IF(op%AND&CF)=&CF:="STS  "+FNmde2((op%AND&30)DIV16)
  670 num%=0:=""
  680 DEFFNgrp11:num%=num%+1:op%=Data%?1
  690 IFop%=&3F:="SWI3"
  700 IF(op%AND&CF)=&83:="CMPU "+FNmde2((op%AND&30)DIV16)
  710 IF(op%AND&CF)=&8C:="CMPS "+FNmde2((op%AND&30)DIV16)
  720 num%=0:=""
  730 DEFFNalu(A%)=MID$("SUBCMPSBCxxxANDBITLD ST EORADCOR ADD",A%*3+1,3+(A%=6 OR A%=7 OR A%=10))
  740 DEFFNrot(A%):IFA%=1ORA%=2ORA%=5ORA%=11ORA%=14:num%=-9:=""
  750 =MID$("NEGxxxxxxCOMLSRxxxRORASRASLROLDECxxxINCTSTxxxCLR",A%*3+1,3)
  760 DEFFNmde2(A%):IFA%=0:num%=num%+2:="#&"+FNh0(Data%?(num%-2),2)+FNh0(Data%?(num%-1),2)
  770 DEFFNmde(A%):IFA%=0:num%=num%+1:="#&"+FNh0(Data%?(num%-1),2)
  780 IFA%=1:num%=num%+1:="&"+FNh0(Data%?(num%-1),2)
  790 IFA%=2:num%=num%+1:=FNidx(Data%?(num%-1))
  800 IFA%=3:num%=num%+2:="&"+FNh0(Data%?(num%-2),2)+FNh0(Data%?(num%-1),2)
  810 DEFFNidx(A%):R$=FNreg1((A%AND&60)DIV32):A%=A%AND&9F
  820 IFA%<16:=STR$(A%AND15)+","+R$
  830 IFA%<32:=STR$((A%AND15)-16)+","+R$
  840 O$="":C$="":IF(A%AND16):O$="[":C$="]"
  850 A%=A%AND15
  860 IFA%=0:IFO$<>"":num%=0:=""
  870 IFA%=0:=O$+R$+"+"+C$
  880 IFA%=1:=O$+R$+"++"+C$
  890 IFA%=2:IFO$<>"":num%=0:=""
  900 IFA%=2:=O$+"-"+R$+C$
  910 IFA%=3:=O$+"--"+R$+C$
  920 IFA%=4:=O$+R$+C$
  930 IFA%=5:=O$+"B,"+R$+C$
  940 IFA%=6:=O$+"A,"+R$+C$
  950 IFA%=7:num%=0:""
  960 IFA%=8:num%=num%+1:=O$+"&"+FNh0(Data%?(num%-1),2)+","+R$+C$
  970 IFA%=9:num%=num%+2:=O$+"&"+FNh0(Data%?(num%-2),2)+FNh0(Data%?(num%-1),2)+","+R$+C$
  980 IFA%=10:num%=0:=""
  990 IFA%=11:=O$+"D,"+R$+C$
 1000 IFA%=12:num%=num%+1:=O$+"&"+FNh0(Data%?(num%-1),2)+",PC"+C$
 1010 IFA%=13:num%=num%+2:=O$+"&"+FNh0(Data%?(num%-2),2)+FNh0(Data%?(num%-1),2)+",PC"+C$
 1020 IFA%=14:num%=0:=""
 1030 IFA%=14:IFO$="":num%=0:=""
 1040 IFA%=15:num%=num%+2:=O$+"&"+FNh0(Data%?(num%-2),2)+FNh0(Data%?(num%-1),2)+C$
 1050 =""
 1060 DEFFNreg1(A%)=MID$("XYUS",A%+1,1)
 1070 DEFFNreg2(A%)=MID$("XYSU",A%+1,1)
 1080 DEFFNr(A%)=MID$("D X Y U S PC????A B CCDP????????",A%*2+1,1-(A%=5 OR A%>9))
 1090 DEFFNjr(A%):IFA%<128:=Ptr%+2+A% ELSE =Ptr%+2-256+A%
 1100 DEFFNljr(A%):IFA%<32768:=Ptr%+3+A% ELSE =Ptr%+3-65536+A%
 1110 DEFFNstk(A%):A$=""
 1120 IF(A%AND1):A$="CC"
 1130 IF(A%AND2):A$=A$+",A"
 1140 IF(A%AND4):A$=A$+",B"
 1150 IF(A%AND8):A$=A$+",DP"
 1160 IF(A%AND16):A$=A$+",X"
 1170 IF(A%AND32):A$=A$+",Y"
 1180 IF(A%AND64):A$=A$+",S/U"
 1190 IF(A%AND128):A$=A$+",PC"
 1200 IFLEFT$(A$,1)=",":A$=MID$(A$,2)
 1210 =A$