10
20 A%=0:X%=1:os%=((USR&FFF4)AND&FF00)DIV256
30 DIMctrl% 79,name% 127:X%=ctrl%:Y%=X%DIV256:cpu%=0
40 eol$=CHR$(10-3*(os%<6)):IFos%AND32:eol$=CHR$13+CHR$10
50 ONERRORREPORT:PROCClose_All:PRINT:END
60 INPUT"Input object file: "in$
70 IFFNfile(in$,5)<>1:PRINT"File '"in$"' not found":END
80 len%=X%!10:IFHIMEM-TOP-2000<len%:PRINT"File '"in$"' too long":END
90 load%=X%!2:exec%=X%!6:DIMmem% len%:OSCLI"LOAD """+in$+""" "+STR$~mem%
100 INPUT"Output source file: "out$:out%=0:IFout$<>"":out%=OPENOUT(out$)
110 A%=load%AND&FFFFFF00
120 IFA%=&FFF70000:load%=&0000:exec%=&0000
130 IFA%=&FFFBBC00:load%=&8000:exec%=&8000:IFmem%!0=0:IFmem%!4=0:load%=&C000:exec%=&C000
140 IFA%=&FFFFF800:load%=&8000:exec%=&8000
150 IFA%=&FFFFFA00:load%=&0000:exec%=&0000
160 IFA%=&FFFFFC00:load%=&0000:exec%=&0000
170 PRINT"Disassembly address: (&";~load%;:INPUT") &"A$:IFA$<>"":load%=EVAL("&"+A$):exec%=load%
180 REPEAT:X%!0=0:A$=FNDis_Name(cpu%):IFA$="":INPUT"CPU number:"SPC11;""cpu%
190 UNTILA$<>"":dat%=X%?3AND12:wth%=(X%?3AND3)*2+4:mask%=EVAL("&"+STRING$(wth%,"F"))
200 IFdat%=0:dat%=wth%+12ELSEIFdat%=12:dat%=21ELSEdat%=9
210 INPUT"(B)asic or (T)ext output? "A$:text%=(LEFT$(A$,1)="T"ORLEFT$(A$,1)="t")
220 INPUT"Output byte dump in comments? "A$:cmmt%=(LEFT$(A$,1)="Y"ORLEFT$(A$,1)="y")
230 INPUT"Output byte dump in disassembly? "A$:dump%=(LEFT$(A$,1)="Y"ORLEFT$(A$,1)="y")
240 cmmt%=cmmt%ORdump%
250 FORB%=0TO1:addr%=load%:lbmax%=0
260 IFB%:PRINT"Creating labels";STRING$(7+wth%,".");ELSEPRINT"Scanning for labels";STRING$(3+wth%,".");
270 REPEAT:PRINTSTRING$(wth%,CHR$8);FNh0(addr%,wth%);:L$=FNline:A%=INSTR(L$,"&")
280 IFA%:IFMID$(L$,A%+1,1)>="0":L%=EVALMID$(L$,A%):IFL%>&FF:IFL%>=(load%ANDmask%)ANDL%<(load%ANDmask%)+len%:lbmax%=lbmax%+4:IFB%:!lb%=L%:lb%=lb%+4
290 addr%=addr%+num%:UNTILaddr%>load%+len%:IFB%=0:DIMlabel% lbmax%:lb%=label%
300 PRINT:NEXTB%
310 PRINT"Outputting source.....";FNh0(load%,wth%);
320 PROCout("REM",CHR$&F4+" > "+out$)
330 PROCout("REM",CHR$&F4+" Source for "+in$)
340 PROCout(""," ")
350 PROCout("","OS_CLI=&FFF7:OSBYTE=&FFF4:OSWORD=&FFF1:OSWRCH=&FFEE")
360 PROCout("","OSWRCR=&FFEC:OSNEWL=&FFE7:OSASCI=&FFE3:OSRDCH=&FFE0")
370 PROCout("","OSFILE=&FFDD:OSARGS=&FFDA:OSBGET=&FFD7:OSBPUT=&FFD4")
380 PROCout("","OSGBPB=&FFD1:OSFIND=&FFCE")
390 PROCout(""," ")
400 PROCout("","load%=&"+STR$~load%)
410 PROCout("DIM",CHR$&DE+" mcode% &"+STR$~(len%+20))
420 IFtext%:PROCout("","FOR P=0 TO 1")ELSEPROCout("",CHR$&E3+" P=0 "+CHR$&B8+" 1")
430 PROCout("","P%=load%:O%=mcode%")
440 PROCout("","[OPT P*3+4")
450 addr%=load%:REPEAT:PRINTSTRING$(wth%,CHR$8);FNh0(addr%,wth%);:L$=FNline:IFaddr%=exec%:PROCout("",".exec%")
460 lb%=label%-4:REPEATlb%=lb%+4:UNTILlb%>label%+lbmax%OR!lb%=(addr%ANDmask%):IF!lb%=(addr%ANDmask%):PROCout("",".L"+FNh0(addr%ANDmask%,wth%))
470 A$="":A%=INSTR(L$,"&"):IFA%:IFMID$(L$,A%+1,1)>="0":L%=EVALMID$(L$,A%):IFL%>=(load%ANDmask%)ANDL%<(load%ANDmask%)+len%:L$=LEFT$(L$,A%-1)+"L"+MID$(L$,A%+1)
480 IFcmmt%:A$=FNh0(addr%,wth%):B$="":FORA%=0TOnum%-1:B%=?(addr%-load%+mem%+A%):A$=A$+" "+FNh0(B%,2):B$=B$+FNch(B%):NEXT:A$=A$+STRING$((dat%-LENA$)AND(LENA$<dat%)," ")+" "+B$
490 IFdump%:IFLENA$<dat%+5:A$=A$+STRING$(dat%+5-LENA$," ")
500 IFcmmt%:IFdump%=0:PROCout("",L$+STRING$((20-LENL$)AND(LENL$<20)," ")+" :\ "+A$)
510 IFcmmt%:IFdump%:PROCout("",A$+" : "+L$)
520 IFcmmt%=0:PROCout("",L$)
530 IF(flg%AND64):PROCout(""," ")
540 addr%=addr%+num%:UNTILaddr%>load%+len%
550 IFtext%:PROCout("","]NEXT")ELSEPROCout("","]"+CHR$&ED)
560 PROCout("PRINT",CHR$&F1+" ""*SAVE <file> "";~mcode%;"" "";~O%;"" "";~exec%;"" "";~load%")
570 IFout%:IFNOTtext%:BPUT#out%,13:BPUT#out%,255
580 IFout%:CLOSE#out%:out%=0:X%!2=&FFFFFB00-1024*text%:A%=FNfile(out$,2)
590 PRINT:END
600 DEFFNline:num%=FNDis_Code(cpu%,addr%,addr%-load%+mem%):L$=$(X%+4)
610 num%=X%?3:flg%=X%?2:A%=INSTR(L$,"&FF"):IFA%=0:=L$
620 L%=EVAL(MID$(L$,A%,5))-&FFCE:IFL%<0ORL%>43:=L$
630 IF((L%MOD3-(L%>27))MOD3-3*(L%=24)+(L%>24ANDL%<28)-3*(L%=27)-(L%=28)):=L$
640 =LEFT$(L$,A%-1)+"OS"+MID$("FINDGBPBBPUTBGETARGSFILERDCHASCINEWLWRCRWRCHWORDBYTE_CLI",(L%DIV3)*4+1,4)+MID$(L$,A%+5)
650 DEFPROCout(T$,A$):IFout%=0:ENDPROC
660 IFtext%:A$=T$+MID$(A$,(T$="")+2)+eol$:$name%=A$:PROCgbpb(2,out%,name%,LENA$,0):ENDPROC
670 line%=line%+1:?name%=13:name%?1=line%DIV256:name%?2=line%
680 name%?3=LENA$+4:$(name%+4)=A$:PROCgbpb(2,out%,name%,LENA$+4,0):ENDPROC
690 DEFPROCClose_All:out%=out%:IFout%:A%=out%:out%=0:CLOSE#A%
700 ENDPROC
710 DEFFNch(A%):A%=A%AND127:IFA%<32ORA%=127:="."ELSE=CHR$A%
720 DEFFNh0(A%,N%)=RIGHT$("0000000"+STR$~A%,N%)
730 DEFPROCgbpb(A%,chn%,addr%,num%,ptr%)
740 ?X%=chn%:X%!1=addr%:X%!5=num%:X%!9=ptr%:IF(os%AND32)=0:CALL&FFD1:ENDPROC
750 IFA%=1ORA%=3:PTR#?X%=X%!9
760 REPEAT:IFA%=1ORA%=2:BPUT#?X%,?X%!1ELSEIFA%=3ORA%=4:?X%!1=BGET#?X%
770 X%!1=X%!1+1:X%!5=X%!5-1:UNTIL(EOF#?X%ANDA%>2)ORX%!5<1:ENDPROC
780 DEFFNfile(A$,A%):IF(os%AND32)=0:$name%=A$:?X%=name%:X%?1=name%DIV256:=(USR&FFDD)AND&FF
790 IFA%=5:X%!14=OPENIN(A$):IFX%!14:X%!10=EXT#X%!14:CLOSE#X%!14:X%!2=0:X%!6=0:X%!14=&33:=1
800 =0
810 DEFFNDis_Name(A%):X%?3=2:="32000"
820 DEFFNDis_Code(A%,Ptr%,Data%):LOCALop%,num%,i%,g1%,g2%,op0%,dz%
830 op%=!Data%:i%=op%AND3:g1%=Data%?1DIV8:g2%=(op%AND&7C0)DIV64
840 X%!0=0:A$=FN_32:IFLENA$<35:$(X%+4)=A$ELSE$(X%+4)=LEFT$(A$,32)+"..."
850 IFnum%:IFnum%<13:X%?3=num%:=num%
860 X%?2=&80:X%?3=1:$(X%+4)="EQUB &"+FNh0(?Data%,2)+LEFT$(" ; num="+STR$num%,num%<>0):=1
870 DEFFN_32
880 IF(op%AND&1F)=&06OR(op%AND&5F)=&5EOR(op%AND&EF)=&8E:num%=0:=""
890 num%=1
900 IF(op%AND&FF)=&EA:X%?2=&40:="BR "+FNdispPC
910 IF(op%AND&0F)=&0A:="B"+FNcc((op%AND&F0)DIV16)+" "+FNdispPC
920 IF(op%AND&FF)=&02:="BSR "+FNdispPC
930 IF(op%AND&FF)=&12:X%?2=&40:="RET "+FNdisp
940 IF(op%AND&FF)=&22:="CXP "+FNdisp
950 IF(op%AND&FF)=&32:X%?2=&40:="RXP "+FNdisp
960 IF(op%AND&FF)=&42:X%?2=&40:="RETT "+FNdisp
970 IF(op%AND&FF)=&52:X%?2=&40:="RETI"
980 IF(op%AND&FF)=&62:="SAVE "+FNlst(0)
990 IF(op%AND&FF)=&72:="RESTORE "+FNlst(7)
1000 IF(op%AND&FF)=&82:="ENTER "+FNlst(0)+","+FNdisp
1010 IF(op%AND&FF)=&92:="EXIT "+FNlst(7)
1020 IF(op%AND&FF)=&A2:="NOP"
1030 IF(op%AND&FF)=&B2:="WAIT"
1040 IF(op%AND&FF)=&C2:="DIA"
1050 IF(op%AND&FF)=&D2:num%=2:="FLAG &"+FNh0(Data%?1,2)
1060 IF(op%AND&FF)=&E2:num%=2:="SVC &"+FNh0(Data%?1,2)
1070 IF(op%AND&FF)=&F2:num%=1:="BPT"
1080 num%=2
1090 IF(op%AND&7C)=&0C:IFi%<>2:="ADDQ"+FNsz(i%)+" "+FNshort(g2%DIV2)+","+FNgen(g1%,i%)
1100 IF(op%AND&7C)=&1C:IFi%<>2:="CMPQ"+FNsz(i%)+" "+FNshort(g2%DIV2)+","+FNgen(g1%,i%)
1110 IF(op%AND&7C)=&2C:IFi%<>2:="SPR"+FNsz(i%)+" "+FNareg(g2%DIV2)+","+FNgen(g1%,i%)
1120 IF(op%AND&7C)=&3C:IFi%<>2:="S"+FNcc((op%AND&380)DIV128)+FNsz(i%)+" "+FNgen(g1%,i%)
1130 IF(op%AND&7C)=&4C:IFi%<>2:="ACB"+FNsz(i%)+" "+FNshort(g2%DIV2)+","+FNgen(g1%,i%)+","+FNdispPC
1140 IF(op%AND&7C)=&5C:IFi%<>2:="MOVQ"+FNsz(i%)+" "+FNshort(g2%DIV2)+","+FNgen(g1%,i%)
1150 IF(op%AND&7C)=&6C:IFi%<>2:="LPR"+FNsz(i%)+" "+FNareg(g2%DIV2)+","+FNgen(g1%,i%)
1160 IF(op%AND&7FC)=&27C:X%?2=&40
1170 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%)
1180 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%)
1190 num%=3:i%=(op%AND&300)DIV256:g1%=Data%?2DIV8:g2%=(op%AND&7C000)DIV&4000:op0%=(Data%?1AND&3C)DIV4
1200 IF(op%AND&F87CFF)=&80E:IFi%<>2:="SETCFG"+FNsz(Data%?1AND3)+" "+FNcfg(g2%DIV2)
1210 IF(op%AND&F870FF)=&00E:IFi%<>2:IF(op%AND&60000)<>&40000:=MID$("MOVSCMPSxxxxSKPS",op0%*6+1,4)+FNsz(i%)+FNstr(g2%DIV2)
1220 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%)
1230 IF(op%AND&0038FF)=&00CE:IFi%<>2:=MID$("MOVCMP",op0%*3+1,3)+"M"+FNsz(i%)+" "+FNgen(g1%,i%)+","+FNgen(g2%,i%)+","+FNdisp
1240 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))
1250 IF(op%AND&0020FF)=&20CE:IFi%<>2:=MID$("MULMEIundDEIQUOREMMODDIV",op0%*3-23,3)+FNsz(i%)+" "+FNgen(g1%,i%)+","+FNgen(g2%,i%)
1260 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%)
1270 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
1280 IF(op%AND&00003F)=&002E:IFi%<>2:A%=(op%AND&C0)+(op%AND&400)DIV4:IFA%=&40ORA%=&C0ORA%=&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%)
1290 IF(op%AND&0004FF)=&046E:IFi%<>2:="FFS"+FNsz(i%)+" "+FNgen(g1%,i%)+","+FNgen(g2%,i%)
1300 IF(op%AND&002CFF)=&0CAE:IFi%<>2:="MOV"+MID$("SUUS",(op0%AND4)DIV2+1,2)+FNsz(i%)+" "+FNgen(g1%,i%)+","+FNgen(g2%,i%)
1310 IF(op%AND&003FFF)=&083E:="LFSR "+FNgen(g1%,i%)
1320 IF(op%AND&003FFF)=&303E:="SFSR "+FNgen(g1%,i%)
1330 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%)
1340 IF(op%AND&0002FF)=&00BE:=MID$("ADDMOVCMPxxxSUBNEGundundDIVxxxundundMULABSundund",op0%*3+1,3)+FNfl(Data%?1AND1)+" "+FNgen(g1%,i%)+","+FNgen(g2%,i%)
1350 IF(op%AND&0078FF)=&001E:=MID$("RDVALWRVAL",op0%*5+1,5)+FNsz(i%)+" "+FNgen(g1%,i%)
1360 IF(op%AND&0078FF)=&081E:=MID$("LMR SMR ",op0%*5-9,5)+FNsz(i%)+" "+FNmmu(g2%DIV2)+","+FNgen(g1%,i%)
1370 IF(op%AND&00001F)=&0016:="SLAVE "+STR$((Data%?0)DIV32)+",&"+FNh0(Data%!1,4)
1380 num%=1:X%?2=&80:="equb &"+FNh0(op%,2)
1390 DEFFNlst(A%):LOCALrn%,n%,A$:rn%=Data%?num%:num%=num%+1
1400 FORn%=0TO7:IF(rn%AND(2^n%)):A$=A$+",R"+STR$(n%EORA%)
1410 NEXTn%:="["+MID$(A$,2)+"]"
1420 DEFFNcfg(A%)=LEFT$("I",(A%AND1)=1)+LEFT$("F",(A%AND2)=2)+LEFT$("M",(A%AND4)=4)+LEFT$("C",(A%AND8)=8)
1430 DEFFNstr(A%)=LEFT$("T",(A%AND1)=1)+LEFT$("B",(A%AND2)=2)+LEFT$("W",(A%AND12)=4)+LEFT$("U",(A%AND12)=12)
1440 DEFFNcc(A%)=MID$("EQNECSCCHILSGTLEFSFCLOHSLTGEALNV",A%*2+1,2)
1450 DEFFNshort(A%):A%=A%AND15:IFA%<8:="+"+STR$A%ELSE=STR$(A%-16)
1460 DEFFNsz(A%)=MID$("BW-D",A%+1,1)
1470 DEFFNfl(A%)=MID$("LF",A%+1,1)
1480 DEFFNgen(A%,sz%):LOCALrn%:rn%=A%
1490 IFA%<8:="R"+STR$A%
1500 IFA%<16:=FNdispReg+"(R"+STR$(rn%-8)+")"
1510 IFA%=16:A$=FNdisp+"(FP)":=FNdisp+"("+A$+")"
1520 IFA%=17:A$=FNdisp+"(SP)":=FNdisp+"("+A$+")"
1530 IFA%=18:A$=FNdisp+"(SB)":=FNdisp+"("+A$+")"
1540 IFA%=19:="revd"
1550 IFA%=20:IFsz%=0:num%=num%+1:="&"+FNh0(Data%?(num%-1),2)
1560 IFA%=20:IFsz%=1:num%=num%+2:="&"+FNh0(Data%!(num%-2),4)
1570 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)
1580 IFA%=21:="@&"+FNh0(FNdispOff,8)
1590 IFA%=22:A$=FNdisp:="EXT("+A$+")+"+FNdisp
1600 IFA%=23:="TOS"
1610 IFA%=24:=FNdispReg+"(FP)"
1620 IFA%=25:=FNdispReg+"(SP)"
1630 IFA%=26:=FNdispReg+"(SB)"
1640 IFA%=27:=FNdispPC
1650 rn%=Data%?num%:num%=num%+1
1660 IFA%=28:=FNgen(rn%DIV8,sz%)+"[R"+STR$(rn%AND7)+":B]"
1670 IFA%=29:=FNgen(rn%DIV8,sz%)+"[R"+STR$(rn%AND7)+":W]"
1680 IFA%=30:=FNgen(rn%DIV8,sz%)+"[R"+STR$(rn%AND7)+":D]"
1690 IFA%=31:=FNgen(rn%DIV8,sz%)+"[R"+STR$(rn%AND7)+":Q]"
1700 =""
1710 DEFFNdisp:A%=FNdispVal:="&"+FNh0(A%,dz%*2+2)
1720 DEFFNdispPC:="&"+FNh0(Ptr%+FNdispOff,8)
1730 DEFFNdispReg:A%=FNdispOff:IFA%<0:=STR$A%ELSE="&"+FNh0(A%,(1+LENSTR$~A%)AND-2)
1740 DEFFNdispOff:A%=FNdispVal:dz%=EVAL("&"+MID$("0000003F00001FFF000000001FFFFFFF",dz%*8+1,8)):IFA%>dz%:=A%-2*dz%-2ELSE=A%
1750 DEFFNdispVal:dz%=(Data%?num%)DIV64:dz%=VALMID$("0013",dz%+1,1)
1760 IFdz%=0:num%=num%+1:=Data%?(num%-1)
1770 IFdz%=1:num%=num%+2:=Data%?(num%-1)+256*(Data%?(num%-2)AND63)
1780 num%=num%+4:=Data%?(num%-1)+256*Data%?(num%-2)+65536*Data%?(num%-3)+&1000000*(Data%?(num%-4)AND63)
1790 DEFFNareg(A%)
1800 IFA%=0:="US"
1810 IFA%=8:="FP"
1820 IFA%=9:="SP"
1830 IFA%=10:="SB"
1840 IFA%=13:="PSR"
1850 IFA%=14:="INTBASE"
1860 IFA%=15:="MOD"
1870 ="AR"+STR$A%
1880 DEFFNmmu(A%)
1890 IF(A%AND14)=0:="BPR"+STR$A%
1900 IF(A%AND14)=4:="PF"+STR$(A%-4)
1910 IFA%=8:="SC"
1920 IFA%=10:="MSR"
1930 IFA%=11:="BCNT"
1940 IF(A%AND14)=12:="PTB"+STR$(A%-12)
1950 IFA%=15:="EIA"
1960 ="mmu"+STR$A%