10 REM > Dis86 1.00 - 12-Feb-2007 - 80x86 disassembly routines
   20 REM **** INCOMPLETE ***
   30 :
   40 DEFFNDis_Name(A%)="80x86 (INCOMPLETE)"
   50 DEFFNDis_Code(A%,Ptr%,Data%):LOCAL s%,d%,c%,w%,num%
   60 num%=1:c%=?Data%:w%=c%AND1:d%=c%AND7:s%=(c%AND&38)DIV8
   70 !X%=0:$(X%+4)=FN_86:X%?3=num%:=num%
   80 DEFFN_86:num%=1
   90 IF(c%AND&C6)=0:=FNalu(s%)+" "+FNmr+","+FNreg((Data%?1AND&38)DIV8) :REM alu rm,r8
  100 IF(c%AND&C6)=0:=FNalu(s%)+" "+FNreg((Data%?1AND&38)DIV8)+","+FNmr :REM alu rm,r8
  110 ="???"
  120 
  130 ="DB   &"+FNh0(op%,2)
  140 :
  150 DEFFNalu(A%)=MID$("ADDOR ADCSBBANDSUBXORCMP",A%*3+1,3)
  160 :
  170 DEFFNmr:num%=num%+1:A%=Data%?1:mod%=(A%AND&C0):reg%=(A%AND&38)DIV8:rm%=(A%AND7)
  180 IFmod%=&C0:=FNreg(rm%)
  190 IFmod%=&00:=FNea(A%)+"]"
  200 IFmod%=&80:num%=num%+1:=FNea(A%)+"+&"+FNh0(Data%?(num%-1),2)+"]"
  210 IFmod%=&40:num%=num%+2:=FNea(A%)+"+&"+FNh0(Data%?(num%-2),4)+"]"
  220 ="?"
  230 :
  240 DEFFNreg(A%):IFw%:=MID$("AXCXDXBXSPBPSIDI",A%*2+1,2)
  250 =MID$("ALCLDLBLAHCHDHBH",A%*2+1,2)
  260 :
  270 DEFFNea(A%)
  280 IFA%=0:="[BX+SI"
  290 IFA%=1:="[BX+DI"
  300 IFA%=2:="[BP+SI"
  310 IFA%=3:="[BP+DI"
  320 IFA%=4:="[SI"
  330 IFA%=5:="[DI"
  340 IFA%=7:="[BX"
  350 num%=num%+2:="[&"+FNh0(Data%!(num%-2),4)
  360 :
  370 
  380 
  390 
  400 
  410 
  420 :
  430 REM DEFFNalu(A%)=MID$("ADDADCSUBSBCANDXOROR CP ",A%*3+1,3)
  440 DEFFNrot(A%)=MID$("RLCRRCRL RR SLASRASLSSRL",A%*3+1,3)
  450 DEFFNr(A%)=MID$("BCDEHLFA",A%+1,1)
  460 DEFFNdrg(A%)=MID$("BCDEHLSPIXAFIY",(A%OR1)+((xy%*4)AND((A%AND6)=4)),2)
  470 DEFFNreg(A%):IFxy%=0 AND A%<>6:=FNr(A%)
  480 IFA%=6 AND xy%=0:="(HL)"
  490 IFA%=6:num%=num%+1:="(I"+CHR$(87+xy%)+FNrel(Data%?2)+")"
  500 IF(A%AND6)=4:="I"+CHR$(87+xy%)+FNr(A%)
  510 =FNr(A%)
  520 DEFFNrel(A%):IFA%<128:="+"+STR$A% ELSE =STR$(A%-256)
  530 DEFFNjr(A%):IFA%<128:="&"+FNh0(Ptr%+A%+2,4) ELSE ="&"+FNh0(Ptr%+A%+2-256,4)
  540 DEFFNcc(A%)=MID$("NZZ NCC POPEP M ",A%*2+1,2-((A% AND 1) AND (A%<4))-(1 AND (A%>5)))
  550 :
  560 DEFFNz80_0:IFc%=0:="NOP"
  570 IF(c%AND&F7)=&10:num%=2:=MID$("DJNZJR  ",s%*4-7,4)+" "+FNjr(Data%?1)
  580 IFd%=7 AND s%<4:=LEFT$(FNrot(s%),3+(s%>1))+"A"
  590 IFd%=7:=MID$("DAACPLSCFCCF",s%*3-11,3)
  600 IFd%=6:num%=num%+1:="LD   "+FNreg(s%)+",&"+FNh0(?(Data%+num%-1),2)
  610 IF(d%AND6)=4:=MID$("INCDEC",(d%AND1)*3+1,3)+"  "+FNreg(s%)
  620 IFd%=3:=MID$("INCDEC",(s%AND1)*3+1,3)+"  "+FNdrg(s%)
  630 IFc%=&22:num%=num%+2:="LD   (&"+FNh0(!(Data%+num%-2),4)+"),"+FNdrg(4)
  640 IFc%=&2A:num%=num%+2:="LD   "+FNdrg(4)+",(&"+FNh0(!(Data%+num%-2),4)+")"
  650 IFc%=&32:num%=num%+2:="LD   (&"+FNh0(Data%!1,4)+"),A"
  660 IFc%=&3A:num%=num%+2:="LD   A,(&"+FNh0(Data%!1,4)+")"
  670 IFd%=2 AND (s%AND5)=0:="LD   ("+FNdrg(s%)+"),A"
  680 IFd%=2:="LD   A,("+FNdrg(s%)+")"
  690 IFd%=1 AND (s%AND1)=1:="ADD  "+FNdrg(4)+","+FNdrg(s%)
  700 IFd%=1:num%=num%+2:="LD   "+FNdrg(s%)+",&"+FNh0(!(Data%+num%-2),4)
  710 IFd%=0 AND s%>3:num%=num%+1:="JR   "+FNcc(s%AND3)+","+FNjr(Data%?1)
  720 ="EX   AF,AF'"
  730 :
  740 DEFFNz80_40:IFc%=&76:="HALT"
  750 IF s%=6:="LD   "+FNreg(s%)+","+FNr(d%)
  760 IF d%=6:="LD   "+FNr(s%)+","+FNreg(d%)
  770 ="LD   "+FNreg(s%)+","+FNreg(d%)
  780 :
  790 DEFFNz80_80:IFs%<4:=FNalu(s%)+"  A,"+FNreg(d%) ELSE=FNalu(s%)+"  "+FNreg(d%)
  800 DEFFNz80_C0:IFd%=5 AND (s%AND1)=1:=EVAL("FNz80_"+STR$~c%)
  810 IFc%=&CB:=FNz80_CB
  820 IFd%=7:="RST  &"+FNh0(c%AND&38,2)
  830 IFd%=6 AND s%<4:num%=2:=FNalu(s%)+"  A,&"+FNh0(Data%?1,2)
  840 IFd%=6:num%=2:=FNalu(s%)+"  &"+FNh0(Data%?1,2)
  850 IF(d%AND3)=1 AND(s%AND1)=0:=MID$("POP PUSH",(d%DIV4)*4+1,4)+" "+FNdrg(s%-4*(s%>5))
  860 IFd%=4:num%=num%+2:="CALL "+FNcc(s%)+",&"+FNh0(Data%!1,4)
  870 IFd%=2:num%=num%+2:="JP   "+FNcc(s%)+",&"+FNh0(Data%!1,4)
  880 IFd%=0:="RET  "+FNcc(s%)
  890 IFc%=&C3:num%=3:="JP   &"+FNh0(Data%!1,4)
  900 IFc%=&C9:="RET"
  910 IFc%=&D3:num%=2:="OUT  (&"+FNh0(Data%?1,2)+"),A"
  920 IFc%=&DB:num%=2:="IN   A,(&"+FNh0(Data%?1,2)+")"
  930 IFc%=&D9:="EXX"
  940 IFc%=&E3:="EX   (SP),"+FNdrg(4)
  950 IFc%=&E9:="JP   ("+FNdrg(4)+")"
  960 IFc%=&EB:="EX   DE,HL"
  970 IFc%=&F9:="LD   SP,HL"
  980 =MID$("DIEI",(s%AND1)*2+1,2)
  990 :
 1000 DEFFNz80_CD:num%=3:="CALL &"+FNh0(Data%!1,4)
 1010 DEFFNz80_CB:num%=num%+1:IFxy%:c%=Data%?3 ELSE c%=Data%?1
 1020 d%=c%AND7:s%=(c%AND&38)DIV8:IFc%<&40:=FNrot(s%)+"  "+FNreg(d%)
 1030 =MID$("BITRESSET",(c%DIV64)*3-2,3)+"  "+STR$(s%)+","+FNreg(d%)
 1040 :
 1050 DEFFNz80_DD
 1060 DEFFNz80_FD
 1070 IFxy%:num%=1:="DEFB &"+FNh0(xy%*&20+&BD,2)
 1080 LOCAL A$:xy%=(c%AND&20)DIV&20+1:num%=num%+1
 1090 c%=Data%?1:d%=c%AND7:s%=(c%AND&38)DIV8:A$=EVAL("FNz80_"+STR$~(c%AND&C0))
 1100 IFINSTR(MID$(A$,4),"X")+INSTR(A$,"Y")=0:num%=1:="DEFB &"+FNh0(xy%*&20+&BD,2) ELSE =A$
 1110 :
 1120 DEFFNz80_ED:IFxy%:num%=1:="DEFB &"+FNh0(xy%*&20+&CD,2)
 1130 num%=num%+1:c%=Data%?1:d%=c%AND7:s%=(c%AND&38)DIV8
 1140 IFc%<&10:="DEFW &"+FNh0(c%*256+&ED,4)+":\ MOS_"+MID$("QUITCLI BYTEWORDWRCHRDCHFILEARGSBGETBPUTGBPBFINDFF0CFF0DFF0EFF0F",c%*4+1,4)
 1150 IFc%<&40 ORc%>&C0:num%=1:="DEFB &ED"
 1160 IF(c%AND&C7)=&42:=FNalu(3-(s%AND1)*2)+"  HL,"+FNdrg(s%)
 1170 IF(c%AND&CF)=&4B:num%=num%+2:="LD   "+FNdrg(s%)+",(&"+FNh0(Data%!2,4)+")"
 1180 IF(c%AND&CF)=&43:num%=num%+2:="LD   (&"+FNh0(Data%!2,4)+"),"+FNdrg(s%)
 1190 IF(c%AND&C7)=&40:="IN   "+FNr(s%)+",(C)"
 1200 IF(c%AND&C7)=&41:="OUT  (C),"+FNr(s%)
 1210 IF(c%AND&E7)=&46 ANDs%<>1:="IM   "+STR$(s%-1-(s%=0))
 1220 IF(c%AND&F7)=&67:=MID$("RRDRLD",s%*3-11,3)
 1230 IF(c%AND&F7)=&45:=MID$("RETNRETI",s%*4+1,4)
 1240 IFc%=&44:="NEG"
 1250 IF(c%AND&E7)=&47:="LD   "+CHR$(65-8*(s%=0)-17*(s%=1))+","+CHR$(65-8*(s%=2)-17*(s%=3))
 1260 IF(c%AND&E4)=&A0:=MID$("LDCPINOT",d%*2+1,2)+CHR$(73-5*(s%AND1))+CHR$(32+25*(s%AND2))
 1270 num%=1:="DEFB &ED"