10 REM > MonZ80
   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(A%)="Z80"
 1190 DEFFNDis_Code(A%,Ptr%,Data%):LOCALs%,d%,c%,xy%:!X%=0:num%=1:c%=?Data%
 1200 d%=c%AND7:s%=(c%AND&38)DIV8:$(X%+4)=EVAL("FNz80_"+STR$~(c%AND&C0))
 1210 X%?3=num%:=num%
 1220 DEFFNalu(A%)=MID$("ADDADCSUBSBCANDXOROR CP ",A%*3+1,3)
 1230 DEFFNrot(A%)=MID$("RLCRRCRL RR SLASRASLSSRL",A%*3+1,3)
 1240 DEFFNr(A%)=MID$("BCDEHLFA",A%+1,1)
 1250 DEFFNdrg(A%)=MID$("BCDEHLSPIXAFIY",(A%OR1)+((xy%*4)AND((A%AND6)=4)),2)
 1260 DEFFNreg(A%):IFxy%=0ANDA%<>6:=FNr(A%)
 1270 IFA%=6ANDxy%=0:="(HL)"
 1280 IFA%=6:num%=num%+1:="(I"+CHR$(87+xy%)+FNrel(Data%?2)+")"
 1290 IF(A%AND6)=4:="I"+CHR$(87+xy%)+FNr(A%)
 1300 =FNr(A%)
 1310 DEFFNrel(A%):IFA%<128:="+"+STR$A%ELSE=STR$(A%-256)
 1320 DEFFNjr(A%):IFA%<128:="&"+FNh0(Ptr%+A%+2,4)ELSE="&"+FNh0(Ptr%+A%+2-256,4)
 1330 DEFFNcc(A%)=MID$("NZZ NCC POPEP M ",A%*2+1,2-((A%AND1)AND(A%<4))-(1AND(A%>5)))
 1340 DEFFNz80_0:IFc%=0:="NOP"
 1350 IF(c%AND&F7)=&10:num%=2:=MID$("DJNZJR  ",s%*4-7,4)+" "+FNjr(Data%?1)
 1360 IFd%=7ANDs%<4:=LEFT$(FNrot(s%),3+(s%>1))+"A"
 1370 IFd%=7:=MID$("DAACPLSCFCCF",s%*3-11,3)
 1380 IFd%=6:num%=num%+1:="LD   "+FNreg(s%)+",&"+FNh0(?(Data%+num%-1),2)
 1390 IF(d%AND6)=4:=MID$("INCDEC",(d%AND1)*3+1,3)+"  "+FNreg(s%)
 1400 IFd%=3:=MID$("INCDEC",(s%AND1)*3+1,3)+"  "+FNdrg(s%)
 1410 IFc%=&22:num%=num%+2:="LD   (&"+FNh0(!(Data%+num%-2),4)+"),"+FNdrg(4)
 1420 IFc%=&2A:num%=num%+2:="LD   "+FNdrg(4)+",(&"+FNh0(!(Data%+num%-2),4)+")"
 1430 IFc%=&32:num%=num%+2:="LD   (&"+FNh0(Data%!1,4)+"),A"
 1440 IFc%=&3A:num%=num%+2:="LD   A,(&"+FNh0(Data%!1,4)+")"
 1450 IFd%=2AND(s%AND5)=0:="LD   ("+FNdrg(s%)+"),A"
 1460 IFd%=2:="LD   A,("+FNdrg(s%)+")"
 1470 IFd%=1AND(s%AND1)=1:="ADD  "+FNdrg(4)+","+FNdrg(s%)
 1480 IFd%=1:num%=num%+2:="LD   "+FNdrg(s%)+",&"+FNh0(!(Data%+num%-2),4)
 1490 IFd%=0ANDs%>3:num%=num%+1:="JR   "+FNcc(s%AND3)+","+FNjr(Data%?1)
 1500 ="EX   AF,AF'"
 1510 DEFFNz80_40:IFc%=&76:="HALT"
 1520 IFs%=6:="LD   "+FNreg(s%)+","+FNr(d%)
 1530 IFd%=6:="LD   "+FNr(s%)+","+FNreg(d%)
 1540 ="LD   "+FNreg(s%)+","+FNreg(d%)
 1550 DEFFNz80_80:=FNalu(s%)+"  "+LEFT$("A,",s%<2ORs%=3)+FNreg(d%)
 1560 DEFFNz80_C0:IFd%=5AND(s%AND1)=1:=EVAL("FNz80_"+STR$~c%)
 1570 IFc%=&CB:=FNz80_CB
 1580 IFd%=7:="RST  &"+FNh0(c%AND&38,2)
 1590 IFd%=6ANDs%<4:num%=2:=FNalu(s%)+"  A,&"+FNh0(Data%?1,2)
 1600 IFd%=6:num%=2:=FNalu(s%)+"  &"+FNh0(Data%?1,2)
 1610 IF(d%AND3)=1AND(s%AND1)=0:=MID$("POP PUSH",(d%DIV4)*4+1,4)+" "+FNdrg(s%-4*(s%>5))
 1620 IFd%=4:num%=num%+2:="CALL "+FNcc(s%)+",&"+FNh0(Data%!1,4)
 1630 IFd%=2:num%=num%+2:="JP   "+FNcc(s%)+",&"+FNh0(Data%!1,4)
 1640 IFd%=0:="RET  "+FNcc(s%)
 1650 IFc%=&C3:num%=3:="JP   &"+FNh0(Data%!1,4)
 1660 IFc%=&C9:="RET"
 1670 IFc%=&D3:num%=2:="OUT  (&"+FNh0(Data%?1,2)+"),A"
 1680 IFc%=&DB:num%=2:="IN   A,(&"+FNh0(Data%?1,2)+")"
 1690 IFc%=&D9:="EXX"
 1700 IFc%=&E3:="EX   (SP),"+FNdrg(4)
 1710 IFc%=&E9:="JP   ("+FNdrg(4)+")"
 1720 IFc%=&EB:="EX   DE,HL"
 1730 IFc%=&F9:="LD   SP,HL"
 1740 =MID$("DIEI",(s%AND1)*2+1,2)
 1750 DEFFNz80_CD:num%=3:="CALL &"+FNh0(Data%!1,4)
 1760 DEFFNz80_CB:num%=num%+1:IFxy%:c%=Data%?3ELSEc%=Data%?1
 1770 d%=c%AND7:s%=(c%AND&38)DIV8:IFc%<&40:=FNrot(s%)+"  "+FNreg(d%)
 1780 =MID$("BITRESSET",(c%DIV64)*3-2,3)+"  "+STR$(s%)+","+FNreg(d%)
 1790 DEFFNz80_DD
 1800 DEFFNz80_FD
 1810 IFxy%:num%=1:="DEFB &"+FNh0(xy%*&20+&BD,2)
 1820 LOCALA$:xy%=(c%AND&20)DIV&20+1:num%=num%+1
 1830 c%=Data%?1:d%=c%AND7:s%=(c%AND&38)DIV8:A$=EVAL("FNz80_"+STR$~(c%AND&C0))
 1840 IFINSTR(MID$(A$,4),"X")+INSTR(A$,"Y")=0:num%=1:="DEFB &"+FNh0(xy%*&20+&BD,2)ELSE=A$
 1850 DEFFNz80_ED:IFxy%:num%=1:="DEFB &"+FNh0(xy%*&20+&CD,2)
 1860 num%=num%+1:c%=Data%?1:d%=c%AND7:s%=(c%AND&38)DIV8
 1870 IFc%<&10:="DEFW &"+FNh0(c%*256+&ED,4)+":\ MOS_"+MID$("QUITCLI BYTEWORDWRCHRDCHFILEARGSBGETBPUTGBPBFINDFF0CFF0DFF0EFF0F",c%*4+1,4)
 1880 IFc%<&40ORc%>&C0:num%=1:="DEFB &ED"
 1890 IF(c%AND&C7)=&42:=FNalu(3-(s%AND1)*2)+"  HL,"+FNdrg(s%)
 1900 IF(c%AND&CF)=&4B:num%=num%+2:="LD   "+FNdrg(s%)+",(&"+FNh0(Data%!2,4)+")"
 1910 IF(c%AND&CF)=&43:num%=num%+2:="LD   (&"+FNh0(Data%!2,4)+"),"+FNdrg(s%)
 1920 IF(c%AND&C7)=&40:="IN   "+FNr(s%)+",(C)"
 1930 IF(c%AND&C7)=&41:="OUT  (C),"+FNr(s%)
 1940 IF(c%AND&E7)=&46ANDs%<>1:="IM   "+STR$(s%-1-(s%=0))
 1950 IF(c%AND&F7)=&67:=MID$("RRDRLD",s%*3-11,3)
 1960 IF(c%AND&F7)=&45:=MID$("RETNRETI",s%*4+1,4)
 1970 IFc%=&44:="NEG"
 1980 IF(c%AND&E7)=&47:="LD   "+CHR$(65-8*(s%=0)-17*(s%=1))+","+CHR$(65-8*(s%=2)-17*(s%=3))
 1990 IF(c%AND&E4)=&A0:=MID$("LDCPINOT",d%*2+1,2)+CHR$(73-5*(s%AND1))+CHR$(32+25*(s%AND2))
 2000 num%=1:="DEFB &ED"