10 REM > Mon65
   20 ONERRORREPORT:PRINTERL:PROCend:END
   30 os%=FNfx(0,1):MODE(FNfx(135,0)DIV256)OR((HIMEM<&FFFF)AND&80):IFHIMEM<&FFFF:HIMEM=FNfx(132,0)
   40 DIMctrl%39,data%15,zp%3:X%=ctrl%:Y%=X%DIV256
   50 blen%=HIMEM-LOMEM-&580+&C00*(HIMEM>&FFFF):buf%=HIMEM-blen%
   60 dmp%=0:ny%=0:dd$="isassembl":io%=(FNfx(130,0)=&FFFF)AND(os%<6):E%=E%AND3
   70 !X%=0:A$=FNDis_Name(M%):A%=X%?3:D%=(A%AND3)*2+4:Z%=(A%AND12)DIV4:hex%=(A%AND16)=0:ONERRORIFFNerr:PROCend:END
   80 REPEAT:CLS:PROCSetScr:REPEATX%=ctrl%:Y%=X%DIV256:IFPAGE>&FFFFF:IFP%<PAGEORP%>HIMEM+blen%:P%=buf%
   90 UNTILFNmenu:UNTILQ$="Q"ORQ$="X":PROCend:END
  100 DEFFNline(addr%):PRINTFNho(addr%-O%,D%);" ";:!data%=!addr%:data%!4=addr%!4:data%!8=addr%!8
  110 IFio%:IFaddr%<0:FORB%=0TO7:data%?B%=FNrm(addr%+B%):NEXT
  120 IFdmp%:FORB%=0TO7:PRINTFNho(data%?B%,2)" ";:NEXT:FORB%=0TO7:PRINTFNc(data%?B%);:NEXT:PRINT:=addr%+8
  130 N%=FNDis_Code(M%,addr%-O%,data%)
  140 IFZ%=0:FORB%=0TON%-1:PRINTFNho(data%?B%,2);" ";:NEXT
  150 IFZ%=1:FORB%=0TON%-1STEP2:PRINTFNho(data%!B%AND&FFFF,4);" ";:NEXT
  160 IFZ%=3:FORB%=0TON%-1STEP4:PRINTFNho(data%!B%,N%*2);" ";:NEXT
  170 PRINTTAB(t1%+D%);:FORB%=0TON%-1:PRINTFNc(data%?B%);:NEXT
  180 PRINTTAB(t2%+D%);" ";FNaddr($(X%+4)):IF(X%?2AND64):PRINT
  190 =addr%+N%
  200 DEFFNmenu:CLS:IFFNDis_Name(M%)="":M%=FNcpu:PROCSetScr
  210 PROCtop:addr%=FNline(P%):num%=addr%-P%
  220 REPEATaddr%=FNline(addr%):UNTILVPOS>hgh%-1+8*(wid%<40)
  230 REPEATQ$=GET$:V%=VPOS:IFQ$="*":PROCosc
  240   IFQ$=" ":addr%=FNline(addr%):PRINTTAB(0,(hgh%>19)AND2);:P%=P%+num%:num%=FNline(P%)-P%
  250   IFQ$>"`"ANDQ$<"{":Q$=CHR$(ASCQ$-32)
  260 UNTILINSTR(CHR$13+CHR$8+CHR$9+CHR$127+"+;-=GPQWSMHJOLTYZNR*0123456789ABCDEFX",Q$)
  270 IFQ$="*":=TRUE
  280 IFQ$=CHR$13:P%=P%+1:=0
  290 IFQ$=CHR$127ORQ$=CHR$8:P%=P%-1:=0
  300 IFQ$="+"ORQ$=";":P%=P%+8:=0
  310 IFQ$="-"ORQ$="=":P%=P%-8:=0
  320 IFQ$=CHR$9:dmp%=dmp%EOR2:=0
  330 IFQ$="W":D%=4+((D%-3)MOD5):=TRUE
  340 IFQ$="H":hex%=NOThex%:=0
  350 IFQ$="J":Z%=(Z%+1)AND3:=0
  360 IFQ$="M":PROCm:=0
  370 IFQ$="O":PROCo:PROCtop:=0
  380 IFQ$="L":PROClist(FALSE):=0
  390 IFQ$="S":PROCmode:=TRUE
  400 IFQ$="T":INPUTLINE"Text: "Q$:A%=?(P%+LENQ$):$(P%)=Q$:?(P%+LENQ$)=A%:P%=P%+LENQ$:=0
  410 IFQ$="Y":INPUTLINE"Message: "Q$:A%=?(P%+LENQ$):$P%=Q$:?(P%+LENQ$)=A%:?(P%-1+LENQ$)=&80OR?(P%-1+LENQ$):?(P%+LENQ$)=A%:P%=P%+LENQ$:=0
  420 IFQ$="Z":M%=FNcpu:PROCSetScr:=0
  430 IFQ$="N":E%=(E%+1)AND3:=0
  440 IFQ$="R"ANDio%:PROCrom:=0
  450 IFQ$="G":INPUTLINE"Get file: "A$:IFA$<>"":OSCLI"LOAD """+A$+""" "+STR$~buf%+LEFT$("+"+STR$~blen%,os%=32):=TRUE
  460 IFQ$="P":INPUTLINE"Put file: "A$:IFA$<>"":INPUT"Length: &"Q$:OSCLI"SAVE """+A$+""" "+STR$~buf%+"+"+Q$:=TRUE
  470 IF(Q$>"/"ANDQ$<":")OR(Q$>"@"ANDQ$<"G"):PROCbyte(Q$):=0
  480 IFQ$="Q"ORQ$="X":INPUT"Quit? "Q$:A%=(ASCQ$AND&DF)=89:Q$="":IFA%:Q$="Q"
  490 =Q$="X"ORQ$="Q"
  500 DEFPROCm:INPUT"Address: &"A$:A$=FNuc(A$):IFA$="":P%=buf%:O%=P%:ENDPROC
  510 A%=EVAL("&"+A$):IFio%:IFA%<&10000:P%=(P%AND&FFFF0000)+A%+O%ELSEP%=A%+O%
  520 ENDPROC
  530 DEFPROCo:INPUT"Address for code address 0000: &"A$:A$=FNuc(A$):IFA$="":A$=STR$~buf%
  540 IFLEFT$(A$,1)="=":O%=P%-EVAL("&"+MID$(A$,2)):ENDPROC
  550 A%=P%-O%:O%=EVAL("&"+A$):P%=O%+A%:ENDPROC
  560 DEFPROClist(T%)
  570 INPUT"Start address: &"A$:A$=FNuc(A$):IFA$="":addr%=P%ELSEaddr%=EVAL("&"+A$)+O%
  580 INPUT"End address:   &"A$:A$=FNuc(A$):IFA$="":end%=addr%+&8000ELSEend%=EVAL("&"+A$)+O%
  590 INPUT"Address for code address 0000: &"A$:A$=FNuc(A$):IFA$<>"":O%=EVAL("&"+A$)
  600 OSCLI"FX3":REPEATaddr%=FNline(addr%):UNTILaddr%>end%:OSCLI"FX3,16":ENDPROC
  610 DEFPROCbyte(Q$):PRINT"Bytes: &";Q$;:REPEAT:A%=GET:IFA%>96:A%=A%AND&DF
  620   IF(A%=95ORA%=8)ANDQ$<>"":VDU127:Q$=LEFT$(Q$,LENQ$-1)
  630   IF((A%>47ANDA%<58)OR(A%>64ANDA%<71))ANDLENQ$<30:VDUA%:Q$=Q$+CHR$A%
  640 UNTILA%=13:IFQ$<>"":REPEAT:?P%=EVAL("&"+LEFT$(Q$,2)):P%=P%+1:Q$=MID$(Q$,3):UNTILLENQ$<2
  650 ENDPROC
  660 DEFPROCrom:INPUT"ROM: &"A$:A$=FNuc(A$):IFA$="":P%=P%AND&FFFFFF:ENDPROC
  670 P%=(P%AND&FFFF)OR&FF000000OR65536*EVAL("&F"+A$):ENDPROC
  680 DEFPROCmode:INPUT"Mode: "A$:IFA$="":ENDPROC
  690 Q%=EVAL(A$)OR&80:IFio%:IFFNfx(133,Q%)<HIMEM:ENDPROC
  700 VDU22,Q%:ENDPROC
  710 DEFPROCosc:IFwid%>40:VDU26,31,0,hgh%
  720 REPEAT:INPUTLINE"*"A$:OSCLIA$:VDU58:REPEATQ$=GET$:UNTILINSTR(CHR$13+"GgPp*",Q$):VDU127
  730 UNTILQ$<>"*":IFQ$=CHR$13:Q$="*"
  740 ENDPROC
  750 DEFFNaddr(A$):PROCname:IFhex%:=A$
  760 A%=INSTR(A$,"&"):IFA%=0:=A$
  770 L%=A%:REPEATL%=L%+1:UNTILINSTR("0123456789ABCDEF",MID$(A$,L%,1))=0ORL%>LENA$
  780 =LEFT$(A$,A%)+"o"+FNo0(EVAL(MID$(A$,A%,L%-A%+1)),(L%-A%-1)*3/2)+MID$(A$,L%)
  790 DEFPROCname:IFE%=0:ENDPROCELSEA%=INSTR(A$,"&FF"):IFA%=0:ENDPROC
  800 L%=EVAL(MID$(A$,A%,5))-&FFCE:IFL%<0ORL%>43:ENDPROC
  810 IF((L%MOD3-(L%>27))MOD3-3*(L%=24)+(L%>24ANDL%<28)-3*(L%=27)-(L%=28)):ENDPROC
  820 IF(E%AND2):A$=A$+" :\ ":IF(E%AND1):A%=LENA$+1
  830 A$=LEFT$(A$,A%-1)+"OS"+MID$("FINDGBPBBPUTBGETARGSFILERDCHASCINEWLWRCRWRCHWORDBYTE_CLI",(L%DIV3)*4+1,4)+MID$(A$,A%+5):IFE%=2:A$=A$+"&"+STR$~(L%+&FFCE)
  840 ENDPROC
  850 DEFPROCtop:IFhgh%>20:VDU30:PRINT"Memory: &";FNh0(P%-O%,D%)SPC(19-POS);"Origin: &";FNh0(O%,D%+1);SPC(39-POS)'"Buffer: &"~buf%;SPC(19-POS)"Buffer size: &"~blen%'SPC(39):ENDPROC
  860 VDU28,47,hgh%,wid%,0:PRINTTAB(9,2);FNh0(P%-O%,D%+1);TAB(9,3);FNh0(O%,D%+1):VDU28,0,hgh%,45,0:ENDPROC
  870 DEFPROCSetScr:OSCLI"FX3,16":VDU3,26:C$=CHR$132:B$=CHR$135:IFFNfx(135,0)DIV256<>7:C$=" ":B$=" "
  880 t1%=13:wid%=FNfx(160,10):hgh%=FNfx(160,9)AND&FF:IFwid%>80:IFD%>4:t1%=(wid%-79)/8*3+13ELSEIFwid%<38:VDU22,&87:PROCSetScr:ENDPROC
  890 t2%=t1%+t1%DIV3:IFhgh%<20ORwid%>40:VDU28,wid%-33,hgh%,wid%,0:IFhgh%<20:PRINT"** "A$" D"dd$"er **"''"Memory: &";FNh0(P%-O%,D%+1)'"Origin: &";FNh0(O%,D%+1)'"Buffer addr: &";~buf%'"Buffer size: &";~blen%:VDU28,0,hgh%,45,0:ENDPROC
  900 W%=33-11*(wid%<40):PRINTSTRING$(W%/4-LENA$/2+(ny%>9),"*");" ";A$;" D"dd$"er ";ny%;" ";STRING$(W%-POS,"*")
  910 IFwid%<40:PRINTTAB(0,hgh%-6);C$"RETURN"B$"forward 1"SPC4;C$"+"B$"forward 8"SPC7;C$"DELETE"B$"back 1"SPC7;C$"-"B$"back 8"'C$"L"B$"List d"dd$"y "C$"TAB"B$"DUMP/LIST"SPC6;
  920 IFwid%<40:PRINTC$"M"B$"Set Memory address"C$"O"B$"Set code origin"'C$"T"B$"Enter text"SPC8;C$"Y"B$"Enter message   ";C$"Z"B$"Set machine"SPC6;C$"SPC"B$"Move past code";:VDU28,0,hgh%-7,wid%,1:ENDPROC
  930 PRINT"RETURN forward 1   + forward 8"'"DELETE backward 1  - backward 8"'"SPACE  move past code"''"  M: Set memory address"'"  O: Set code origin"'"  N: Display named labels"'"  W: Address width"'"  J: Data width"'"  H: Hex/Oct toggle"
  940 PRINT" TAB: Dump/List"''" 0-9, A-F: Enter bytes"'"  T: Enter text"'"  Y: Enter message"'"  L: List d"dd$"y"'"  G: Get to buffer"'"  P: Put from buffer"'"  Z: Set machine"'"  S: Screen mode":IFio%:PRINT"  R: ROM number"
  950 PRINT"  Q: Quit";:VDU28,0,hgh%,wid%-35,0:ENDPROC
  960 DEFFNcpu:IFFNDis_Name(0)<>"":=M%ELSE=FNDis_CPU
  970 DEFFNerr:IFERR<0:P%=P%DIV2:O%=O%DIV2:=INKEY-1
  980 REPORT:IFERR<>17:IFGET
  990 IFINKEY-1:PRINT" at line ";ERLELSECLS
 1000 =INKEY-1
 1010 DEFPROCend:OSCLI"FX3":ONERROREND
 1020 VDU26:PRINTTAB(0,hgh%);:*QUIT
 1030 ENDPROC
 1040 DEFFNho(A%,N%):IFhex%:=FNh0(A%,N%)ELSE=FNo0(A%,N%*3/2)
 1050 DEFFNc(A%):A%=A%AND127:IFA%=127ORA%<32:="."ELSE=CHR$A%
 1060 DEFFNuc(A$):LOCALB$:IFA$="":=""
 1070 REPEATB$=B$+CHR$(ASCA$AND((A$<"@")OR&DF)):A$=MID$(A$,2):UNTILA$="":=B$
 1080 DEFFNh0(A%,N%)=RIGHT$("0000000"+STR$~A%,N%)
 1090 DEFFNo0(A%,N%):LOCALA$,B%,L%:IFA%<0:B%=2:A%=A%AND&7FFFFFFF
 1100 REPEATA$=STR$(A%AND7)+A$:A%=A%DIV8:L%=L%+3:UNTILL%>27:=RIGHT$(STR$(A%+B%)+A$,N%)
 1110 DEFFNfx(A%,X%):LOCALY%:Y%=X%DIV256:IFPAGE<&FFFFF:=((USR&FFF4)AND&FFFF00)DIV256
 1120 IFA%=135:X%=MODE:IFX%>-1:=X%*256ELSEIFA%=135:=&A00
 1130 IFA%=160:IFX%=10:=@vdu%!28DIV@vdu%!216-1
 1140 IFA%=160:IFX%=9:=@vdu%!36DIV@vdu%!220-1
 1150 =((USR&FFF4)AND&FFFF00)DIV256
 1160 DEFFNrm(!&F6):LOCALY%:Y%=?&F8+&40:IFY%AND&40:IF?&F7>&BF:?&F9=0
 1170 IF!&F6<0:IF?&F7>&7FORY%=&3E:=(USR&FFB9)AND&FFELSE=?!&F6
 1180 DEFFNDis_Name(cpu%)="65x02"
 1190 DEFFNDis_Code(cpu%,Ptr%,Data%):LOCALop%,ins%,md%,b0%,num%
 1200 num%=1:op%=?Data%:ins%=op%DIV32:md%=(op%AND31)DIV4:b0%=(op%AND3)
 1210 X%!0=0:$(X%+4)=FN_diss:X%?3=num%:=num%
 1220 DEFFN_diss
 1230 IF(op%AND&F)=8:=MID$("PHPCLCPLPSECPHACLIPLASEIDEYTYATAYCLVINYCLDINXSED",1+3*(op%DIV16),3)
 1240 IF(op%AND&8F)=&8A:=MID$("TXATXSTAXTSXDEXPHXNOPPLX",3*(op%DIV16)-23,3)
 1250 IFop%=&20:="JSR "+FNmde(3)
 1260 IF(op%AND&9F)=0:X%?2=(op%AND64):=MID$("BRK***RTIRTS",ins%*3+1,3)
 1270 IF(op%AND&DF)=&5A:=MID$("PHYPLY",ins%*3-5,3)
 1280 IFop%=&89:="BIT "+FNmde(2)
 1290 IFb0%=1:=FNalu(ins%)+" "+FNmde(md%)
 1300 IF(op%AND31)=&12:=FNalu(ins%)+" "+FNmde(8)
 1310 IF(op%AND&EF)=&64:="STZ "+FNmde(md%)
 1320 IF(op%AND&FD)=&9C:="STZ "+FNmde(b0%*2+3)
 1330 IF(op%AND&D7)=&96:=FNrot(ins%)+" "+FNmde(md%AND3)+",Y"
 1340 IF(op%AND7)=6:=FNrot(ins%)+" "+FNmde(md%)
 1350 IF(op%AND&1F)=16:num%=2:="B"+MID$("PLMIVCVSCCCSNEEQ",1+2*ins%,2)+" "+FNjr(Data%?1)
 1360 IF(op%AND&8F)=10:=FNrot((ins%+(md%AND4)*1.5)EOR((md%>4)AND1))+" A"
 1370 IF(op%AND&E7)=4:="T"+MID$("SR",1+(md%DIV4),1)+"B "+FNmde(md%AND3)
 1380 IF(op%AND&D3)=&C0:=FNbxy(ins%)+" "+FNmde(((md%EOR3)-1)AND3)
 1390 IF(op%AND&E7)=&24:="BIT "+FNmde(md%)
 1400 IF(op%AND&C7)=&84:=FNbxy(ins%)+" "+FNmde(md%)
 1410 IF(op%AND&FD)=&A0:="LD"+MID$("YX",1+((op%AND2)DIV2),1)+" "+FNmde(2)
 1420 IF(op%AND&CF)=&4C:IFop%<>&5C:X%?2=64:="JMP "+LEFT$("(",op%>&5F)+FNmde(md%)+LEFT$(")",op%>&5F)
 1430 IFop%=&80:num%=2:X%?2=64:="BRA "+FNjr(Data%?1)
 1440 X%?2=128:="EQUB &"+FNh0(op%,2)
 1450 DEFFNalu(A%)=MID$("ORAANDEORADCSTALDACMPSBC",A%*3+1,3)
 1460 DEFFNrot(A%)=MID$("ASLROLLSRRORSTXLDXDECINC",A%*3+1,3)
 1470 DEFFNbxy(A%)=MID$("***BIT***STZSTYLDYCPYCPX",A%*3+1,3)
 1480 DEFFNmde(A%):num%=2:IFA%=2:="#&"+FNh0(Data%?1,2)
 1490 IF(A%AND2):num%=3:="&"+FNh0(Data%!1,4)+LEFT$(",X",A%=7)+LEFT$(",Y",A%=6)
 1500 IF(A%AND1):="&"+FNh0(Data%?1,2)+LEFT$(",X",A%=5)
 1510 ="(&"+FNh0(Data%!1,2)+LEFT$(",X",A%=0)+")"+LEFT$(",Y",A%=4)
 1520 DEFFNjr(A%):IFA%<128:="&"+FNh0(Ptr%+A%+2,4)ELSE="&"+FNh0(Ptr%+A%+2-256,4)