10 REM > Dis32 0.14 - 32000 disassembly routines
   20 REM v0.13 - updated CXP, EXT, nn(Rn), ACB, BPT, @addr
   30 REM v0.14 - bugfix to SUBC/TBIT/XOR
   40 :
   50 DEFFNDis_Name(A%):X%?3=2:="32000"
   60 DEFFNDis_Code(A%,Ptr%,Data%):LOCAL op%,num%,i%,g1%,g2%,op0%,dz%
   70 op%=!Data%:i%=op%AND3:g1%=Data%?1DIV8:g2%=(op%AND&7C0)DIV64
   80 X%!0=0:A$=FN_32:IFLENA$<35:$(X%+4)=A$ ELSE $(X%+4)=LEFT$(A$,32)+"..."
   90 IFnum%:IFnum%<13:X%?3=num%:=num%
  100 X%?2=&80:X%?3=1:$(X%+4)="EQUB   &"+FNh0(?Data%,2)+LEFT$(" ; num="+STR$num%,num%<>0):=1
  110 :
  120 DEFFN_32
  130 REM Format 10, 11, 13, 16, 17, 18, 19:
  140 IF(op%AND&1F)=&06 OR (op%AND&5F)=&5E OR (op%AND&EF)=&8E:num%=0:=""
  150 :
  160 num%=1
  170 REM Format 0:
  180 IF(op%AND&FF)=&EA:X%?2=&40:="BR     "+FNdispPC
  190 IF(op%AND&0F)=&0A:="B"+FNcc((op%AND&F0)DIV16)+"    "+FNdispPC
  200 :
  210 REM Format 1:
  220 IF(op%AND&FF)=&02:="BSR    "+FNdispPC
  230 IF(op%AND&FF)=&12:X%?2=&40:="RET    "+FNdisp
  240 IF(op%AND&FF)=&22:="CXP    "+FNdisp
  250 IF(op%AND&FF)=&32:X%?2=&40:="RXP    "+FNdisp
  260 IF(op%AND&FF)=&42:X%?2=&40:="RETT   "+FNdisp
  270 IF(op%AND&FF)=&52:X%?2=&40:="RETI"
  280 IF(op%AND&FF)=&62:="SAVE   "+FNlst(0)
  290 IF(op%AND&FF)=&72:="RESTORE "+FNlst(7)
  300 IF(op%AND&FF)=&82:="ENTER  "+FNlst(0)+","+FNdisp
  310 IF(op%AND&FF)=&92:="EXIT   "+FNlst(7)
  320 IF(op%AND&FF)=&A2:="NOP"
  330 IF(op%AND&FF)=&B2:="WAIT"
  340 IF(op%AND&FF)=&C2:="DIA"
  350 IF(op%AND&FF)=&D2:num%=2:="FLAG   &"+FNh0(Data%?1,2)
  360 IF(op%AND&FF)=&E2:num%=2:="SVC    &"+FNh0(Data%?1,2)
  370 IF(op%AND&FF)=&F2:num%=1:="BPT"
  380 :
  390 num%=2
  400 REM Format 2:
  410 IF(op%AND&7C)=&0C:IFi%<>2:="ADDQ"+FNsz(i%)+"  "+FNshort(g2%DIV2)+","+FNgen(g1%,i%)
  420 IF(op%AND&7C)=&1C:IFi%<>2:="CMPQ"+FNsz(i%)+"  "+FNshort(g2%DIV2)+","+FNgen(g1%,i%)
  430 IF(op%AND&7C)=&2C:IFi%<>2:="SPR"+FNsz(i%)+"   "+FNareg(g2%DIV2)+","+FNgen(g1%,i%)
  440 IF(op%AND&7C)=&3C:IFi%<>2:="S"+FNcc((op%AND&380)DIV128)+FNsz(i%)+"   "+FNgen(g1%,i%)
  450 IF(op%AND&7C)=&4C:IFi%<>2:="ACB"+FNsz(i%)+"   "+FNshort(g2%DIV2)+","+FNgen(g1%,i%)+","+FNdispPC
  460 IF(op%AND&7C)=&5C:IFi%<>2:="MOVQ"+FNsz(i%)+"  "+FNshort(g2%DIV2)+","+FNgen(g1%,i%)
  470 IF(op%AND&7C)=&6C:IFi%<>2:="LPR"+FNsz(i%)+"   "+FNareg(g2%DIV2)+","+FNgen(g1%,i%)
  480 :
  490 REM Format 3:
  500 IF(op%AND&7FC)=&27C:X%?2=&40
  510 IF(op%AND&FC)=&7C:IFi%<>2:=LEFT$(MID$("CXPD  BICPSRJUMP  BISPSRxxxx  ADJSP JSR   CASE",g2%DIV4*6+1,VALMID$("46464534",g2%DIV4+1,1))+FNsz(i%),5)+"  "+FNgen(g1%,i%)
  520 :
  530 REM Format 4:
  540 IF(op%AND&0C)<>&0C:IFi%<>2:A%=(op%AND&3C)DIV4:A$=FNgen(g1%,i%):=LEFT$(MID$("ADD CMP BIC xxx ADDCMOV OR  xxx SUB ADDRAND xxx SUBCTBITXOR",A%*4+1,VALMID$("333043203430443",A%+1,1))+FNsz(i%)+"  ",5)+"  "+A$+","+FNgen(g2%,i%)
  550 :
  560 num%=3:i%=(op%AND&300)DIV256:g1%=Data%?2DIV8:g2%=(op%AND&7C000)DIV&4000:op0%=(Data%?1AND&3C)DIV4
  570 REM Format 5:
  580 IF(op%AND&F87CFF)=&80E:IFi%<>2:="SETCFG"+FNsz(Data%?1 AND 3)+" "+FNcfg(g2%DIV2)
  590 IF(op%AND&F870FF)=&00E:IFi%<>2:IF(op%AND&60000)<>&40000:=MID$("MOVSCMPSxxxxSKPS",op0%*6+1,4)+FNsz(i%)+FNstr(g2%DIV2)
  600 :
  610 REM Format 6:
  620 IF(op%AND&0000FF)=&04E:IFi%<>2:=LEFT$(MID$("ROT  ASH  CBIT CBITIundefLSH  SBIT SBITINEG  NOT  undefSUBP ABS  COM  IBIT ADDP",op0%*5+1,VALMID$("3345534533543345",op0%+1,1))+FNsz(i%)+" ",5)+"  "+FNgen(g1%,0)+","+FNgen(g2%,i%)
  630 :
  640 REM Format 7:
  650 IF(op%AND&0038FF)=&00CE:IFi%<>2:=MID$("MOVCMP",op0%*3+1,3)+"M"+FNsz(i%)+"  "+FNgen(g1%,i%)+","+FNgen(g2%,i%)+","+FNdisp
  660 IF(op%AND&0038FF)=&08CE:IFi%<>2:A$=MID$("INSEXT",op0%*3-5,3)+"S"+FNsz(i%)+"  "+FNgen(g1%,i%)+","+FNgen(g2%,i%):num%=num%+1:=A$+","+STR$(Data%?(num%-1)DIV32)+","+STR$(1+(Data%?(num%-1)AND31))
  670 IF(op%AND&0020FF)=&20CE:IFi%<>2:=MID$("MULMEIundDEIQUOREMMODDIV",op0%*3-23,3)+FNsz(i%)+"   "+FNgen(g1%,i%)+","+FNgen(g2%,i%)
  680 IF(op%AND&0030FF)=&10CE:IFi%<>2:=MID$("MOVX"+FNsz(i%)+"WMOVZ"+FNsz(i%)+"WMOVZ"+FNsz(i%)+"DMOVX"+FNsz(i%)+"D",op0%*6-23,6)+" "+FNgen(g1%,i%)+","+FNgen(g2%,i%)
  690 :
  700 REM Format 8:
  710 IF(op%AND&00047F)=&002E:IFi%<>2:=MID$("EXTINS",(op%AND&80)DIV128*3+1,3)+FNsz(i%)+"   R"+STR$(op0%DIV2)+","+FNgen(g1%,i%)+","+FNgen(g2%,i%)+","+FNdisp
  720 IF(op%AND&00003F)=&002E:IFi%<>2:A%=(op%AND&C0)+(op%AND&400)DIV4:IFA%=&40 OR A%=&C0 OR A%=&100:=LEFT$(MID$("CVTP xxxxxCHECKINDEX",A%DIV64*5-4,5+(A%=64))+FNsz(i%)+" ",6)+" R"+STR$(op0%DIV2)+","+FNgen(g1%,i%)+","+FNgen(g2%,i%)
  730 IF(op%AND&0004FF)=&046E:IFi%<>2:="FFS"+FNsz(i%)+"   "+FNgen(g1%,i%)+","+FNgen(g2%,i%)
  740 IF(op%AND&002CFF)=&0CAE:IFi%<>2:="MOV"+MID$("SUUS",(op0%AND4)DIV2+1,2)+FNsz(i%)+"  "+FNgen(g1%,i%)+","+FNgen(g2%,i%)
  750 :
  760 REM Format 9:
  770 IF(op%AND&003FFF)=&083E:="LFSR   "+FNgen(g1%,i%)
  780 IF(op%AND&003FFF)=&303E:="SFSR   "+FNgen(g1%,i%)
  790 IF(op%AND&0000FF)=&003E:IFi%<>2:=MID$("MOV  xxxxxMOVLFMOVFLROUNDTRUNCxxxxxFLOOR",(op0%DIV2)*5+1,VALMID$("35555555",(op0%DIV2)+1,1))+FNfl(op%AND1)+FNsz(i%)+"  "+FNgen(g1%,i%)+","+FNgen(g2%,i%)
  800 :
  810 REM Format 11:
  820 IF(op%AND&0002FF)=&00BE:=MID$("ADDMOVCMPxxxSUBNEGundundDIVxxxundundMULABSundund",op0%*3+1,3)+FNfl(Data%?1AND1)+"   "+FNgen(g1%,i%)+","+FNgen(g2%,i%)
  830 :
  840 REM Format 14:
  850 IF(op%AND&0078FF)=&001E:=MID$("RDVALWRVAL",op0%*5+1,5)+FNsz(i%)+"  "+FNgen(g1%,i%)
  860 IF(op%AND&0078FF)=&081E:=MID$("LMR  SMR  ",op0%*5-9,5)+FNsz(i%)+"  "+FNmmu(g2%DIV2)+","+FNgen(g1%,i%)
  870 :
  880 REM Format 15:
  890 IF(op%AND&00001F)=&0016:="SLAVE  "+STR$((Data%?0)DIV32)+",&"+FNh0(Data%!1,4)
  900 :
  910 num%=1:X%?2=&80:="equb   &"+FNh0(op%,2)
  920 :
  930 DEFFNlst(A%):LOCAL rn%,n%,A$:rn%=Data%?num%:num%=num%+1
  940 FOR n%=0 TO 7:IF (rn% AND (2^n%)):A$=A$+",R"+STR$(n%EORA%)
  950 NEXT n%:="["+MID$(A$,2)+"]"
  960 DEFFNcfg(A%)=LEFT$("I",(A%AND1)=1)+LEFT$("F",(A%AND2)=2)+LEFT$("M",(A%AND4)=4)+LEFT$("C",(A%AND8)=8)
  970 DEFFNstr(A%)=LEFT$("T",(A%AND1)=1)+LEFT$("B",(A%AND2)=2)+LEFT$("W",(A%AND12)=4)+LEFT$("U",(A%AND12)=12)
  980 DEFFNcc(A%)=MID$("EQNECSCCHILSGTLEFSFCLOHSLTGEALNV",A%*2+1,2)
  990 DEFFNshort(A%):A%=A%AND15:IF A%<8:="+"+STR$A% ELSE =STR$(A%-16)
 1000 DEFFNsz(A%)=MID$("BW-D",A%+1,1)
 1010 DEFFNfl(A%)=MID$("LF",A%+1,1)
 1020 DEFFNgen(A%,sz%):LOCAL rn%:rn%=A%
 1030 IFA%<8:="R"+STR$A%
 1040 IFA%<16:=FNdispReg+"(R"+STR$(rn%-8)+")"
 1050 IFA%=16:A$=FNdisp+"(FP)":=FNdisp+"("+A$+")":REM These should be short displacements
 1060 IFA%=17:A$=FNdisp+"(SP)":=FNdisp+"("+A$+")"
 1070 IFA%=18:A$=FNdisp+"(SB)":=FNdisp+"("+A$+")"
 1080 IFA%=19:="revd"
 1090 IFA%=20:IFsz%=0:num%=num%+1:="&"+FNh0(Data%?(num%-1),2)
 1100 IFA%=20:IFsz%=1:num%=num%+2:="&"+FNh0(Data%!(num%-2),4)
 1110 IFA%=20:num%=num%+4:="&"+FNh0(Data%?(num%-4),2)+FNh0(Data%?(num%-3),2)+FNh0(Data%?(num%-2),2)+FNh0(Data%?(num%-1),2)
 1120 IFA%=21:="@&"+FNh0(FNdispOff,8)
 1130 IFA%=22:A$=FNdisp:="EXT("+A$+")+"+FNdisp
 1140 IFA%=23:="TOS"
 1150 IFA%=24:=FNdispReg+"(FP)"
 1160 IFA%=25:=FNdispReg+"(SP)"
 1170 IFA%=26:=FNdispReg+"(SB)"
 1180 IFA%=27:=FNdispPC
 1190 rn%=Data%?num%:num%=num%+1
 1200 IFA%=28:=FNgen(rn%DIV8,sz%)+"[R"+STR$(rn%AND7)+":B]"
 1210 IFA%=29:=FNgen(rn%DIV8,sz%)+"[R"+STR$(rn%AND7)+":W]"
 1220 IFA%=30:=FNgen(rn%DIV8,sz%)+"[R"+STR$(rn%AND7)+":D]"
 1230 IFA%=31:=FNgen(rn%DIV8,sz%)+"[R"+STR$(rn%AND7)+":Q]"
 1240 =""
 1250 DEFFNdisp:A%=FNdispVal:="&"+FNh0(A%,dz%*2+2)
 1260 DEFFNdispPC:="&"+FNh0(Ptr%+FNdispOff,8)
 1270 DEFFNdispReg:A%=FNdispOff:IFA%<0:=STR$A% ELSE ="&"+FNh0(A%,(1+LENSTR$~A%)AND-2)
 1280 DEFFNdispOff:A%=FNdispVal:dz%=EVAL("&"+MID$("0000003F00001FFF000000001FFFFFFF",dz%*8+1,8)):IFA%>dz%:=A%-2*dz%-2 ELSE =A%
 1290 DEFFNdispVal:dz%=(Data%?num%)DIV64:dz%=VALMID$("0013",dz%+1,1)
 1300 IFdz%=0:num%=num%+1:=Data%?(num%-1)
 1310 IFdz%=1:num%=num%+2:=Data%?(num%-1)+256*(Data%?(num%-2) AND 63)
 1320 num%=num%+4:=Data%?(num%-1)+256*Data%?(num%-2)+65536*Data%?(num%-3)+&1000000*(Data%?(num%-4) AND 63)
 1330 DEFFNareg(A%)
 1340 IFA%=0:="US"
 1350 IFA%=8:="FP"
 1360 IFA%=9:="SP"
 1370 IFA%=10:="SB"
 1380 IFA%=13:="PSR"
 1390 IFA%=14:="INTBASE"
 1400 IFA%=15:="MOD"
 1410 ="AR"+STR$A%
 1420 DEFFNmmu(A%)
 1430 IF(A%AND14)=0:="BPR"+STR$A%
 1440 IF(A%AND14)=4:="PF"+STR$(A%-4)
 1450 IFA%=8:="SC"
 1460 IFA%=10:="MSR"
 1470 IFA%=11:="BCNT"
 1480 IF(A%AND14)=12:="PTB"+STR$(A%-12)
 1490 IFA%=15:="EIA"
 1500 ="mmu"+STR$A%