10
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"