10 REM > MkSrc32 - Make a 320xx source file
   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%