10 REM > DisZ80 1.01 - 09-Jan-1989 - Z80 disassembly routines
   20 :
   30 DEFFNDis_Name(A%)="Z80"
   40 DEFFNDis_Code(A%,Ptr%,Data%):LOCAL s%,d%,c%,xy%:!X%=0:num%=1:c%=?Data%
   50 d%=c%AND7:s%=(c%AND&38)DIV8:$(X%+4)=EVAL("FNz80_"+STR$~(c%AND&C0))
   60 X%?3=num%:=num%
   70 :
   80 DEFFNalu(A%)=MID$("ADDADCSUBSBCANDXOROR CP ",A%*3+1,3)
   90 DEFFNrot(A%)=MID$("RLCRRCRL RR SLASRASLSSRL",A%*3+1,3)
  100 DEFFNr(A%)=MID$("BCDEHLFA",A%+1,1)
  110 DEFFNdrg(A%)=MID$("BCDEHLSPIXAFIY",(A%OR1)+((xy%*4)AND((A%AND6)=4)),2)
  120 DEFFNreg(A%):IFxy%=0 AND A%<>6:=FNr(A%)
  130 IFA%=6 AND xy%=0:="(HL)"
  140 IFA%=6:num%=num%+1:="(I"+CHR$(87+xy%)+FNrel(Data%?2)+")"
  150 IF(A%AND6)=4:="I"+CHR$(87+xy%)+FNr(A%)
  160 =FNr(A%)
  170 DEFFNrel(A%):IFA%<128:="+"+STR$A% ELSE =STR$(A%-256)
  180 DEFFNjr(A%):IFA%<128:="&"+FNh0(Ptr%+A%+2,4) ELSE ="&"+FNh0(Ptr%+A%+2-256,4)
  190 DEFFNcc(A%)=MID$("NZZ NCC POPEP M ",A%*2+1,2-((A% AND 1) AND (A%<4))-(1 AND (A%>5)))
  200 :
  210 DEFFNz80_0:IFc%=0:="NOP"
  220 IF(c%AND&F7)=&10:num%=2:=MID$("DJNZJR  ",s%*4-7,4)+" "+FNjr(Data%?1)
  230 IFd%=7 AND s%<4:=LEFT$(FNrot(s%),3+(s%>1))+"A"
  240 IFd%=7:=MID$("DAACPLSCFCCF",s%*3-11,3)
  250 IFd%=6:num%=num%+1:="LD   "+FNreg(s%)+",&"+FNh0(?(Data%+num%-1),2)
  260 IF(d%AND6)=4:=MID$("INCDEC",(d%AND1)*3+1,3)+"  "+FNreg(s%)
  270 IFd%=3:=MID$("INCDEC",(s%AND1)*3+1,3)+"  "+FNdrg(s%)
  280 IFc%=&22:num%=num%+2:="LD   (&"+FNh0(!(Data%+num%-2),4)+"),"+FNdrg(4)
  290 IFc%=&2A:num%=num%+2:="LD   "+FNdrg(4)+",(&"+FNh0(!(Data%+num%-2),4)+")"
  300 IFc%=&32:num%=num%+2:="LD   (&"+FNh0(Data%!1,4)+"),A"
  310 IFc%=&3A:num%=num%+2:="LD   A,(&"+FNh0(Data%!1,4)+")"
  320 IFd%=2 AND (s%AND5)=0:="LD   ("+FNdrg(s%)+"),A"
  330 IFd%=2:="LD   A,("+FNdrg(s%)+")"
  340 IFd%=1 AND (s%AND1)=1:="ADD  "+FNdrg(4)+","+FNdrg(s%)
  350 IFd%=1:num%=num%+2:="LD   "+FNdrg(s%)+",&"+FNh0(!(Data%+num%-2),4)
  360 IFd%=0 AND s%>3:num%=num%+1:="JR   "+FNcc(s%AND3)+","+FNjr(Data%?1)
  370 ="EX   AF,AF'"
  380 :
  390 DEFFNz80_40:IFc%=&76:="HALT"
  400 IF s%=6:="LD   "+FNreg(s%)+","+FNr(d%)
  410 IF d%=6:="LD   "+FNr(s%)+","+FNreg(d%)
  420 ="LD   "+FNreg(s%)+","+FNreg(d%)
  430 :
  440 DEFFNz80_80:=FNalu(s%)+"  "+LEFT$("A,",s%<2 OR s%=3)+FNreg(d%)
  450 DEFFNz80_C0:IFd%=5 AND (s%AND1)=1:=EVAL("FNz80_"+STR$~c%)
  460 IFc%=&CB:=FNz80_CB
  470 IFd%=7:="RST  &"+FNh0(c%AND&38,2)
  480 IFd%=6 AND s%<4:num%=2:=FNalu(s%)+"  A,&"+FNh0(Data%?1,2)
  490 IFd%=6:num%=2:=FNalu(s%)+"  &"+FNh0(Data%?1,2)
  500 IF(d%AND3)=1 AND(s%AND1)=0:=MID$("POP PUSH",(d%DIV4)*4+1,4)+" "+FNdrg(s%-4*(s%>5))
  510 IFd%=4:num%=num%+2:="CALL "+FNcc(s%)+",&"+FNh0(Data%!1,4)
  520 IFd%=2:num%=num%+2:="JP   "+FNcc(s%)+",&"+FNh0(Data%!1,4)
  530 IFd%=0:="RET  "+FNcc(s%)
  540 IFc%=&C3:num%=3:="JP   &"+FNh0(Data%!1,4)
  550 IFc%=&C9:="RET"
  560 IFc%=&D3:num%=2:="OUT  (&"+FNh0(Data%?1,2)+"),A"
  570 IFc%=&DB:num%=2:="IN   A,(&"+FNh0(Data%?1,2)+")"
  580 IFc%=&D9:="EXX"
  590 IFc%=&E3:="EX   (SP),"+FNdrg(4)
  600 IFc%=&E9:="JP   ("+FNdrg(4)+")"
  610 IFc%=&EB:="EX   DE,HL"
  620 IFc%=&F9:="LD   SP,HL"
  630 =MID$("DIEI",(s%AND1)*2+1,2)
  640 :
  650 DEFFNz80_CD:num%=3:="CALL &"+FNh0(Data%!1,4)
  660 DEFFNz80_CB:num%=num%+1:IFxy%:c%=Data%?3 ELSE c%=Data%?1
  670 d%=c%AND7:s%=(c%AND&38)DIV8:IFc%<&40:=FNrot(s%)+"  "+FNreg(d%)
  680 =MID$("BITRESSET",(c%DIV64)*3-2,3)+"  "+STR$(s%)+","+FNreg(d%)
  690 :
  700 DEFFNz80_DD
  710 DEFFNz80_FD
  720 IFxy%:num%=1:="DEFB &"+FNh0(xy%*&20+&BD,2)
  730 LOCAL A$:xy%=(c%AND&20)DIV&20+1:num%=num%+1
  740 c%=Data%?1:d%=c%AND7:s%=(c%AND&38)DIV8:A$=EVAL("FNz80_"+STR$~(c%AND&C0))
  750 IFINSTR(MID$(A$,4),"X")+INSTR(A$,"Y")=0:num%=1:="DEFB &"+FNh0(xy%*&20+&BD,2) ELSE =A$
  760 :
  770 DEFFNz80_ED:IFxy%:num%=1:="DEFB &"+FNh0(xy%*&20+&CD,2)
  780 num%=num%+1:c%=Data%?1:d%=c%AND7:s%=(c%AND&38)DIV8
  790 IFc%<&10:="DEFW &"+FNh0(c%*256+&ED,4)+":\ MOS_"+MID$("QUITCLI BYTEWORDWRCHRDCHFILEARGSBGETBPUTGBPBFINDFF0CFF0DFF0EFF0F",c%*4+1,4)
  800 IFc%<&40 ORc%>&C0:num%=1:="DEFB &ED"
  810 IF(c%AND&C7)=&42:=FNalu(3-(s%AND1)*2)+"  HL,"+FNdrg(s%)
  820 IF(c%AND&CF)=&4B:num%=num%+2:="LD   "+FNdrg(s%)+",(&"+FNh0(Data%!2,4)+")"
  830 IF(c%AND&CF)=&43:num%=num%+2:="LD   (&"+FNh0(Data%!2,4)+"),"+FNdrg(s%)
  840 IF(c%AND&C7)=&40:="IN   "+FNr(s%)+",(C)"
  850 IF(c%AND&C7)=&41:="OUT  (C),"+FNr(s%)
  860 IF(c%AND&E7)=&46 ANDs%<>1:="IM   "+STR$(s%-1-(s%=0))
  870 IF(c%AND&F7)=&67:=MID$("RRDRLD",s%*3-11,3)
  880 IF(c%AND&F7)=&45:=MID$("RETNRETI",s%*4+1,4)
  890 IFc%=&44:="NEG"
  900 IF(c%AND&E7)=&47:="LD   "+CHR$(65-8*(s%=0)-17*(s%=1))+","+CHR$(65-8*(s%=2)-17*(s%=3))
  910 IF(c%AND&E4)=&A0:=MID$("LDCPINOT",d%*2+1,2)+CHR$(73-5*(s%AND1))+CHR$(32+25*(s%AND2))
  920 num%=1:="DEFB &ED"