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%)="6809"
820 DEFFNDis_Code(A%,Ptr%,Data%):num%=1
830 X%!0=0:$(X%+4)=FN_diss:IFnum%<1:num%=1:$(X%+4)="EQUB &"+FNh0(Data%?0,2)
840 X%?3=num%:=num%
850 DEFFN_diss:op%=?Data%:num%=1
860 IF(op%AND&CF)=&83:="SUBD "+FNmde2((op%AND&30)DIV16)
870 IF(op%AND&CF)=&C3:="ADDD "+FNmde2((op%AND&30)DIV16)
880 IFop%=&87:num%=0:=""
890 IFop%=&C7:num%=0:=""
900 IF(op%AND&CF)=&87:="ST"+CHR$(65+(op%AND64)DIV64)+" "+FNmde((op%AND&30)DIV16)
910 IF(op%AND&CF)=&8C:="CMPX "+FNmde2((op%AND&30)DIV16)
920 IF(op%AND&CF)=&CC:="LDD "+FNmde2((op%AND&30)DIV16)
930 IFop%=&8D:num%=2:="BSR &"+FNh0(FNjr(Data%?1),4)
940 IF(op%AND&CF)=&8D:="JSR "+FNmde((op%AND&30)DIV16)
950 IFop%=&CD:num%=0:=""
960 IF(op%AND&CF)=&CD:="STD "+FNmde2((op%AND&30)DIV16)
970 IF(op%AND&CF)=&8E:="LDX "+FNmde2((op%AND&30)DIV16)
980 IF(op%AND&CF)=&CE:="LDU "+FNmde2((op%AND&30)DIV16)
990 IFop%=&8F:num%=0:=""
1000 IF(op%AND&CF)=&8F:="STX "+FNmde2((op%AND&30)DIV16)
1010 IFop%=&CF:num%=0:=""
1020 IF(op%AND&CF)=&CF:="STU "+FNmde2((op%AND&30)DIV16)
1030 IF(op%AND&80)=&80:=FNalu(op%AND15)+CHR$(65+(op%AND64)DIV64)+" "+LEFT$(" ",(op%AND&8E)=&86)+FNmde((op%AND&30)DIV16)
1040 IF(op%AND&E0)=&40:=FNrot(op%AND15)+CHR$(65+(op%AND16)DIV16)
1050 IF(op%AND&EF)=&6E:="JMP "+FNmde2((op%AND&30)DIV16)
1060 IF(op%AND&E0)=&60:=FNrot(op%AND15)+" "+FNmde((op%AND&30)DIV16)
1070 IF(op%AND&F0)=&20:num%=num%+1:="B"+MID$("RARNHILSCCCSNEEQVCVSPLMIGELTGTLE",(op%AND15)*2+1,2)+" &"+FNh0(FNjr(Data%?1),4)
1080 IFop%=&0E:="JMP "+FNmde(1)
1090 IF(op%AND&F0)=&00:=FNrot(op%AND15)+" "+FNmde(1)
1100 IFop%=&10:=FNgrp10
1110 IFop%=&11:=FNgrp11
1120 IFop%=&12:="NOP"
1130 IFop%=&13:="SYNC"
1140 IFop%=&19:="DAA"
1150 IFop%=&1A:="ORCC "+FNmde(0)
1160 IFop%=&1C:="ANDCC "+FNmde(0)
1170 IFop%=&1D:="SEX"
1180 IF(op%AND&FE)=&1E:num%=num%+1:=MID$("EXGTFR",(op%AND1)*3+1,3)+" "+FNr(Data%?1DIV16)+","+FNr(Data%?1AND15)
1190 IF(op%AND&FC)=&30:="LEA"+FNreg2(op%AND3)+" "+FNmde(2)
1200 IFop%=&34:num%=num%+1:="PSHS "+FNstk(Data%?1)
1210 IFop%=&35:num%=num%+1:="PULS "+FNstk(Data%?1)
1220 IFop%=&36:num%=num%+1:="PSHU "+FNstk(Data%?1)
1230 IFop%=&37:num%=num%+1:="PULS "+FNstk(Data%?1)
1240 IFop%=&39:="RTS"
1250 IFop%=&3A:="ABX"
1260 IFop%=&3B:="RTI"
1270 IFop%=&3C:="CWAI"
1280 IFop%=&3D:="MUL"
1290 IFop%=&3F:="SWI"
1300 IFop%=&16:num%=3:="LBRA &"+FNh0(FNljr(256*Data%?1+Data%?2),4)
1310 IFop%=&17:num%=3:="LBSR &"+FNh0(FNljr(256*Data%?1+Data%?2),4)
1320 IFop%=&3E:="RESET"
1330 num%=0:=""
1340 DEFFNgrp10:num%=num%+1:op%=Data%?1
1350 IF(op%AND&E0)=&20:num%=num%+1:="LB"+MID$("RARNHILSCCCSNEEQVCVSPLMIGELTGTLE",(op%AND15)*2+1,2)+" &"+FNh0(FNljr(256*Data%?1+Data%?2),4)
1360 IFop%=&3F:="SWI2"
1370 IF(op%AND&CF)=&83:="CMPD "+FNmde2((op%AND&30)DIV16)
1380 IF(op%AND&CF)=&8C:="CMPY "+FNmde2((op%AND&30)DIV16)
1390 IF(op%AND&CF)=&8E:="LDY "+FNmde2((op%AND&30)DIV16)
1400 IFop%=&8F;num%=0:=""
1410 IF(op%AND&CF)=&8F:="STY "+FNmde2((op%AND&30)DIV16)
1420 IF(op%AND&CF)=&CE:="LDS "+FNmde2((op%AND&30)DIV16)
1430 IFop%=&CF:num%=0:=""
1440 IF(op%AND&CF)=&CF:="STS "+FNmde2((op%AND&30)DIV16)
1450 num%=0:=""
1460 DEFFNgrp11:num%=num%+1:op%=Data%?1
1470 IFop%=&3F:="SWI3"
1480 IF(op%AND&CF)=&83:="CMPU "+FNmde2((op%AND&30)DIV16)
1490 IF(op%AND&CF)=&8C:="CMPS "+FNmde2((op%AND&30)DIV16)
1500 num%=0:=""
1510 DEFFNalu(A%)=MID$("SUBCMPSBCxxxANDBITLD ST EORADCOR ADD",A%*3+1,3+(A%=6ORA%=7ORA%=10))
1520 DEFFNrot(A%):IFA%=1ORA%=2ORA%=5ORA%=11ORA%=14:num%=-9:=""
1530 =MID$("NEGxxxxxxCOMLSRxxxRORASRASLROLDECxxxINCTSTxxxCLR",A%*3+1,3)
1540 DEFFNmde2(A%):IFA%=0:num%=num%+2:="#&"+FNh0(Data%?(num%-2),2)+FNh0(Data%?(num%-1),2)
1550 DEFFNmde(A%):IFA%=0:num%=num%+1:="#&"+FNh0(Data%?(num%-1),2)
1560 IFA%=1:num%=num%+1:="&"+FNh0(Data%?(num%-1),2)
1570 IFA%=2:num%=num%+1:=FNidx(Data%?(num%-1))
1580 IFA%=3:num%=num%+2:="&"+FNh0(Data%?(num%-2),2)+FNh0(Data%?(num%-1),2)
1590 DEFFNidx(A%):R$=FNreg1((A%AND&60)DIV32):A%=A%AND&9F
1600 IFA%<16:=STR$(A%AND15)+","+R$
1610 IFA%<32:=STR$((A%AND15)-16)+","+R$
1620 O$="":C$="":IF(A%AND16):O$="[":C$="]"
1630 A%=A%AND15
1640 IFA%=0:IFO$<>"":num%=0:=""
1650 IFA%=0:=O$+R$+"+"+C$
1660 IFA%=1:=O$+R$+"++"+C$
1670 IFA%=2:IFO$<>"":num%=0:=""
1680 IFA%=2:=O$+"-"+R$+C$
1690 IFA%=3:=O$+"--"+R$+C$
1700 IFA%=4:=O$+R$+C$
1710 IFA%=5:=O$+"B,"+R$+C$
1720 IFA%=6:=O$+"A,"+R$+C$
1730 IFA%=7:num%=0:""
1740 IFA%=8:num%=num%+1:=O$+"&"+FNh0(Data%?(num%-1),2)+","+R$+C$
1750 IFA%=9:num%=num%+2:=O$+"&"+FNh0(Data%?(num%-2),2)+FNh0(Data%?(num%-1),2)+","+R$+C$
1760 IFA%=10:num%=0:=""
1770 IFA%=11:=O$+"D,"+R$+C$
1780 IFA%=12:num%=num%+1:=O$+"&"+FNh0(Data%?(num%-1),2)+",PC"+C$
1790 IFA%=13:num%=num%+2:=O$+"&"+FNh0(Data%?(num%-2),2)+FNh0(Data%?(num%-1),2)+",PC"+C$
1800 IFA%=14:num%=0:=""
1810 IFA%=14:IFO$="":num%=0:=""
1820 IFA%=15:num%=num%+2:=O$+"&"+FNh0(Data%?(num%-2),2)+FNh0(Data%?(num%-1),2)+C$
1830 =""
1840 DEFFNreg1(A%)=MID$("XYUS",A%+1,1)
1850 DEFFNreg2(A%)=MID$("XYSU",A%+1,1)
1860 DEFFNr(A%)=MID$("D X Y U S PC????A B CCDP????????",A%*2+1,1-(A%=5ORA%>9))
1870 DEFFNjr(A%):IFA%<128:=Ptr%+2+A%ELSE=Ptr%+2-256+A%
1880 DEFFNljr(A%):IFA%<32768:=Ptr%+3+A%ELSE=Ptr%+3-65536+A%
1890 DEFFNstk(A%):A$=""
1900 IF(A%AND1):A$="CC"
1910 IF(A%AND2):A$=A$+",A"
1920 IF(A%AND4):A$=A$+",B"
1930 IF(A%AND8):A$=A$+",DP"
1940 IF(A%AND16):A$=A$+",X"
1950 IF(A%AND32):A$=A$+",Y"
1960 IF(A%AND64):A$=A$+",S/U"
1970 IF(A%AND128):A$=A$+",PC"
1980 IFLEFT$(A$,1)=",":A$=MID$(A$,2)
1990 =A$