10'Z80 Disassembler for SHARP PC-E220 20GOSUB *INIT 30*START:CLS :CLOSE 40PRINT " * Z80 Disassembler *":PRINT USING "######"; FRE ;" BASIC bytes free" 50INPUT "start address=";AD$:AD= VAL ("&H"+AD$) 51INPUT "output on display? ";OL$ 52INPUT "output on printer? ";OP$ 53INPUT "output on serial? ";OS$:IF OS$="Y" OR OS$="y" THEN OPEN "COM:" 54IF OL$<>"Y" AND OL$<>"y" THEN INPUT "stop address=";ST$:ST= VAL ("&H"+ST$) 55PRINT "hit any key to start" 60'DV=AD:DL=3:GOSUB *TOHEX 70'PRINT "disassembling from "; HX$ 80IF INKEY$ ="" THEN 80 90LC=0:IF OL$="Y" OR OL$="y" THEN CLS 100*LOOP:LI$(0)="":LI$(1)="" 110LC=LC+1:BY= PEEK AD 120ON ( INT (BY/64))+1 GOSUB *ZERO, *ONE, *TWO, *THREE 121DV=AD:DL=3:GOSUB *TOHEX:LI$(0)=HX$+": " 122FOR I=0 TO TL-1 123DV= PEEK (AD+I):DL=1:GOSUB *TOHEX:LI$(0)=LI$(0)+HX$+" " 124NEXT I 125LI$(1)=" "+MN$(0) 130IF OL$="Y" OR OL$="y" THEN PRINT LI$(0):PRINT LI$(1) 135IF OS$="Y" OR OS$="y" THEN PRINT #1,LI$(0),LI$(1) 140IF OP$="Y" OR OP$="y" THEN LPRINT LI$(0):LPRINT LI$(1) 144AD=AD+TL:IF OL$<>"Y" AND OL$<>"y" AND AD>ST THEN CLOSE :END 145IF AD>=65536 THEN AD=0 150IF (LC/2)<> INT (LC/2) THEN *LOOP 155IF OL$<>"Y" AND OL$<>"y" THEN *LOOP 160A$= INKEY$ 170IF A$="" THEN 160 180IF A$="X" THEN END 190IF A$="N" THEN *START 200CLS :GOTO *LOOP 1000*INIT 1010CLEAR :WAIT 0 1020DIM HL$(3)*1,TL$(0)*24 1030DIM LI$(1)*24,IR$(1)*2,HI$(63)*14,CB$(7)*3,HA(63),BL$(3,3)*4 1035DIM SR$(7)*4,DR$(3)*2,CO$(7)*3,LO$(63)*14,LA(63),MN$(0)*24,VZ$(1)*1 1040GOSUB *LOAD 1050RETURN 2000*LOAD 2010RESTORE *LODAT 2020FOR I=0 TO 63 2030READ LA(I),LO$(I) 2040NEXT I 2050RESTORE *SRDAT: FOR I=0 TO 7: READ SR$(I): NEXT I 2060RESTORE *DRDAT: FOR I=0 TO 3: READ DR$(I): NEXT I 2070RESTORE *CODAT: FOR I=0 TO 7: READ CO$(I): NEXT I 2080RESTORE *CBDAT: FOR I=0 TO 7: READ CB$(I): NEXT I 2090RESTORE *IRDAT: FOR I=0 TO 1: READ IR$(I): NEXT I 2095RESTORE *VZDAT: FOR I=0 TO 1: READ VZ$(I): NEXT I 2100RESTORE *HIDAT 2110FOR I=0 TO 63 2120READ HA(I),HI$(I) 2130NEXT I 2140RESTORE *BLDAT 2150FOR I=0 TO 3: FOR J=0 TO 3 2160READ BL$(J,I) 2170NEXT J:NEXT I 2180RETURN 3000*ZERO:TL=1+LA(BY):MN$(0)=LO$(BY):GOSUB *XCHG:RETURN 3210*XCHG:TL$(0)="":IF BY<64 THEN *LO 3211*HI:IF HA(BY-192)=0 THEN RETURN 3212GOTO *GO 3213*LO:IF LA(BY)=0 THEN RETURN 3220*GO: FOR I=1 TO LEN MN$(0) 3230A$= MID$ (MN$(0),I,1) 3240IF A$<>"!" AND A$<>"0" AND A$<>"1" THEN TL$(0)=TL$(0)+A$ 3250IF A$="!" THEN DV= PEEK (AD+1):GOSUB *CNVBIN:DV=AD+2+BT:DL=3:GOSUB *TOHEX:TL$(0)=TL$(0)+HX$ 3260IF A$="0" THEN DV= PEEK (AD+1):DL=1:GOSUB *TOHEX:TL$(0)=TL$(0)+HX$ 3270IF A$="1" THEN DV= PEEK (AD+2):DL=1:GOSUB *TOHEX:TL$(0)=TL$(0)+HX$ 3280NEXT I 3290MN$(0)=TL$(0) 3300RETURN 4000*ONE:TL=1 4010MN$(0)="LD "+SR$((BY/8) AND 7)+","+SR$(BY AND 7) 4015IF BY=&H76 THEN MN$(0)="HALT" 4020RETURN 5000*TWO:TL=1:MN$(0)=CO$((BY/8) AND 7)+" "+SR$(BY AND 7):RETURN 6000*THREE 6050IF BY=&HCB THEN *CB 6060IF BY=&HDD THEN *DD 6070IF BY=&HED THEN *ED 6080IF BY=&HFD THEN *DD 6081TL=1+HA(BY-192): MN$(0)=HI$(BY-192):GOSUB *XCHG 6082RETURN 6090*CB 6100TL=2:TE= PEEK (AD+1) 6110ON ( INT (TE/64))+1 GOSUB *OTHER,*BIT,*RES,*SET 6120RETURN 6125*OTHER:MN$(0)=CB$((TE/8) AND 7)+" "+SR$(TE AND 7):RETURN 6130*BIT:MN$(0)="BIT "+ STR$ ((TE/8) AND 7)+","+SR$(TE AND 7):RETURN 6135*RES:MN$(0)="RES "+ STR$ ((TE/8) AND 7)+","+SR$(TE AND 7):RETURN 6140*SET:MN$(0)="SET "+ STR$ ((TE/8) AND 7)+","+SR$(TE AND 7):RETURN 6150*DD:TE= PEEK (AD+1) 6160IF TE=&HCB THEN *DDCB 6170ON ( INT (TE/64)+1) GOSUB *DIFF,*DDLD,*DDCO,*DIFF2 6180RETURN 6190*DDCB 6200TL=4:TE= PEEK (AD+3):DV= PEEK (AD+2):GOSUB *CNVBIN:DV= ABS BT:DL=1:GOSUB *TOHEX 6210ON ( INT (TE/64)+1) GOSUB *DDOTHER,*DDBIT,*DDRES,*DDSET 6220RETURN 6230*DDOTHER: MN$(0)=CB$((TE/8) AND 7)+" ("+IR$((BY/32) AND 1)+" "+VZ$( INT (2^BT)/2^BT)+" "+HX$+")": RETURN 6240*DDBIT:MN$(0)="BIT "+((TE/8) AND 7)+",("+IR$((BY/32) AND 1)+" "+VZ$( INT (2^BT)/2^BT)+" "+HX$+")":RETURN 6250*DDRES:MN$(0)="RES "+((TE/8) AND 7)+",("+IR$((BY/32) AND 1)+" "+VZ$( INT (2^BT)/2^BT)+" "+HX$+")":RETURN 6260*DDSET:MN$(0)="SET "+((TE/8) AND 7)+",("+IR$((BY/32) AND 1)+" "+VZ$( INT (2^BT)/2^BT)+" "+HX$+")":RETURN 6270*DDCO:IF ((TE AND 7)<>6) THEN *DDCOILL 6275TL=3:DV= PEEK (AD+2):GOSUB *CNVBIN:DV= ABS BT:DL=1:GOSUB *TOHEX 6280MN$(0)=CO$((TE/8) AND 7)+" ("+IR$((BY/32) AND 1)+" "+VZ$( INT (2^BT)/2^BT)+" "+HX$+")":RETURN 6285*DDCOILL:TL=1:MN$(0)="illegal" 6290*DDLD:IF (TE=&H76) THEN *DDLDILL 6295TL=3:DV= PEEK (AD+2):GOSUB *CNVBIN:DV= ABS BT:DL=1:GOSUB *TOHEX 6300IF ((TE AND 7)=6) THEN *DDLD1 6310IF (((TE/16) AND 7)=7) THEN *DDLD2 6315*DDLDILL:MN$(0)="illegal":TL=2:RETURN 6320*DDLD1:MN$(0)="LD "+SR$((TE/8) AND 7)+",("+IR$((BY/32) AND 1)+" "+VZ$( INT (2^BT)/2^BT)+" "+HX$+")":RETURN 6330*DDLD2:MN$(0)="LD "+"("+IR$((BY/32) AND 1)+" "+VZ$( INT (2^BT)/2^BT)+" "+HX$+")"+","+SR$(TE AND 7):RETURN 6340*DIFF2:TL=2:MN$(0)= "illegal" 6350IF (TE=&HE1) THEN MN$(0)="POP "+IR$((BY/32) AND 1) 6360IF (TE=&HE3) THEN MN$(0)="EX (SP),"+IR$((BY/32) AND 1) 6370IF (TE=&HE5) THEN MN$(0)="PUSH "+IR$((BY/32) AND 1) 6380IF (TE=&HE9) THEN MN$(0)="JP ("+IR$((BY/32) AND 1) 6390IF (TE=&HF9) THEN MN$(0)="LD SP,"+IR$((BY/32) AND 1) 6400IF (MN$(0)="illegal") THEN TL=1+HA(TE) 6405RETURN 6410*DIFF 6420IF ((TE AND 15)=9) THEN *DIFFADD 6430IF (TE=&H21) THEN *DIFF21 6440IF (TE=&H22) THEN *DIFF22 6450IF (TE=&H23) THEN *DIFF23 6460IF (TE=&H2A) THEN *DIFF2A 6470IF (TE=&H2B) THEN *DIFF2B 6480IF (TE=&H34) THEN *DIFF34 6490IF (TE=&H35) THEN *DIFF35 6500IF (TE=&H36) THEN *DIFF36 6505MN$(0)="illegal":TL=1+LA(TE):RETURN 6510*DIFF36:DV= PEEK (AD+2):GOSUB *CNVBIN:DV= ABS BT:IG=1:GOSUB *TOHEX 6520MN$(0)="LD ("+IR$((BY/32) AND 1)+" "+VZ$( INT (2^BT)/2^BT)+" "+HX$+")," 6530DV= PEEK (AD+3):DL=1:GOSUB *TOHEX 6540MN$(0)=MN$(0)+HX$ 6550TL=4:RETURN 6560*DIFF35 6570DV= PEEK (AD+2):GOSUB *CNVBIN:DV= ABS BT:DL=1:GOSUB *TOHEX 6580MN$(0)="DEC ("+IR$((BY/32) AND 1)+" "+VZ$( INT (2^BT)/2^BT)+" "+HX$+")" 6590TL=3:RETURN 6600*DIFF34 6610DV= PEEK (AD+2):GOSUB *CNVBIN:DV= ABS BT:DL=1:GOSUB *TOHEX 6620MN$(0)="INC ("+IR$((BY/32) AND 1)+" "+VZ$( INT (2^BT)/2^BT)+" "+HX$+")" 6630TL=3:RETURN 6640*DIFF2B:MN$(0)="DEC "+IR$((BY/32) AND 1):TL=2:RETURN 6650*DIFF2A 6660DV= PEEK (AD+2)+ PEEK (AD+3)*256:DL=3:GOSUB *TOHEX 6670MN$(0)="LD "+IR$((BY/32) AND 1)+",("+HX$+")" 6680TL=4:RETURN 6690*DIFF23 6700MN$(0)="INC "+IR$((BY/32) AND 1) 6710TL=2:RETURN 6720*DIFF22 6730DV= PEEK (AD+2)+ PEEK (AD+3)*256:DL=3:GOSUB *TOHEX 6740MN$(0)="LD ("+HX$+"),"+IR$((BY/32) AND 1) 6750TL=4:RETURN 6760*DIFF21 6770DV= PEEK (AD+2)+ PEEK (AD+3)*256:DL=3:GOSUB *TOHEX 6780MN$(0)="LD "+IR$((BY/32) AND 1)+","+HX$ 6790TL=4:RETURN 6800*DIFFADD:TL=2:MN$(0)="ADD "+IR$((BY/32) AND 1)+","+DR$((TE/16) AND 3):RETURN 6810*ED:TE= PEEK (AD+1) 6820IF INT (TE/128)=1 THEN *BLOCK 6830IF INT (TE/64)<>1 THEN *EDILL 6840IF TE=&H44 THEN *ED44 6850IF TE=&H45 THEN *ED45 6860IF TE=&H47 THEN *ED47 6870IF TE=&H4F THEN *ED4F 6880IF TE=&H57 THEN *ED57 6890IF TE=&H5F THEN *ED5F 6900IF TE=&H67 THEN *ED67 6910IF TE=&H6F THEN *ED6F 6920IF (TE AND 15)=&H02 THEN *EDSBC 6930IF (TE AND 15)=&H03 THEN *EDLD1 6940IF (TE AND 15)=&H0A THEN *EDADC 6950IF (TE AND 15)=&H0B THEN *EDLD2 6960IF (TE AND 7)=0 THEN *EDIN 6965IF (TE AND 7)=1 THEN *EDOUT 6970IF (TE AND 7)=6 THEN *EDIM 6980GOTO *EDILL 6990*EDIN:MN$(0)="IN "+SR$((TE/8) AND 7)+",(C)":TL=2:RETURN 7000*EDOUT:MN$(0)="OUT (C),"+SR$((TE/8) AND 7):TL=2:RETURN 7010*EDIM:IM=((TE/8) AND 3)-1:IF IM<0 THEN IM=0 7015MN$(0)="IM "+ STR$ (IM):TL=2:RETURN 7020*EDLD1:DV= PEEK (AD+2)+ PEEK (AD+3)*256:DL=3:GOSUB *TOHEX:MN$(0)="LD ("+HX$+"),"+DR$((TE/16) AND 3):TL=4:RETURN 7030*EDLD2:DV= PEEK (AD+2)+ PEEK (AD+3)*256:DL=3:GOSUB *TOHEX:MN$(0)="LD "+DR$((TE/16) AND 3)+",("+HX$+")":TL=4:RETURN 7040*EDSBC:MN$(0)="SBC HL,"+DR$((TE/16) AND 3):TL=2:RETURN 7050*EDADC:MN$(0)="ADC HL,"+DR$((TE/16) AND 3):TL=2:RETURN 7060*ED44:MN$(0)="NEG":TL=2:RETURN 7070*ED45:MN$(0)="RETN":TL=2:RETURN 7080*ED47:MN$(0)="LD I,A":TL=2:RETURN 7090*ED4D:MN$(0)="RETI":TL=2:RETURN 7100*ED4F:MN$(0)="LD R,A":TL=2:RETURN 7110*ED57:MN$(0)="LD A,I":TL=2:RETURN 7120*ED5F:MN$(0)="LD A,R":TL=2:RETURN 7130*ED67:MN$(0)="RRD":TL=2:RETURN 7140*ED6F:MN$(0)="RLD":TL=2:RETURN 7150*BLOCK 7160IF ((TE/4) AND 1)=1 THEN *EDILL 7170IF ((TE/64) AND 1)=1 THEN *EDILL 7180MN$(0)=BL$((TE AND 3),((TE/8) AND 3)) 7190TL=2:RETURN 7200*EDILL:MN$(0)="illegal":TL=2:RETURN 50000*TOHEX:TM=DV 50010FOR HX=0 TO DL 50020TM= INT (TM/16):RT=DV-TM*16:DV=TM 50030IF RT>9 THEN *BIGHEX 50040HL$(HX)= STR$ (RT): GOTO *ENDHEX 50050*BIGHEX:RT=RT-10 50060HL$(HX)= CHR$ (RT+65) 50070*ENDHEX:NEXT HX 50080HX$="" 50090FOR HX=0 TO DL 50100HX$=HL$(HX)+HX$ 50110NEXT HX 50120RETURN 51000*CNVBIN:BT=0 51010IF DV>127 THEN *TWOCMP 51020BT=DV:RETURN 51030*TWOCMP 51040BT=-256+DV:RETURN 59999*LODAT 60000DATA 0,"NOP" 60001DATA 2,"LD BC,10" 60002DATA 0,"LD (BC),A" 60003DATA 0,"INC BC" 60004DATA 0,"INC B" 60005DATA 0,"DEC B" 60006DATA 1,"LD B,0" 60007DATA 0,"RLCA" 60008DATA 0,"EX AF,AF'" 60009DATA 0,"ADD HL,BC" 60010DATA 0,"LD A,(BC)" 60011DATA 0,"DEC BC" 60012DATA 0,"INC C" 60013DATA 0,"DEC C" 60014DATA 1,"LD C,0" 60015DATA 0,"RRCC" 60016DATA 1,"DJNZ !" 60017DATA 2,"LD DE,10" 60018DATA 0,"LD (DE),A" 60019DATA 0,"INC DE" 60020DATA 0,"INC D" 60021DATA 0,"DEC D" 60022DATA 1,"LD D,0" 60023DATA 0,"RLA" 60024DATA 1,"JR !" 60025DATA 0,"ADD HL,DE" 60026DATA 0,"LD A,(DE)" 60027DATA 0,"DEC DE" 60028DATA 0,"INC E" 60029DATA 0,"DEC E" 60030DATA 1,"LD E,0" 60031DATA 0,"RRA" 60032DATA 1,"JR NZ,!" 60033DATA 2,"LD HL,10" 60034DATA 2,"LD (10),HL" 60035DATA 0,"INC HL" 60036DATA 0,"INC H" 60037DATA 0,"DEC H" 60038DATA 1,"LD H,0" 60039DATA 0,"DAA" 60040DATA 1,"JR Z,!" 60041DATA 0,"ADD HL,HL" 60042DATA 2,"LD HL,(10) 60043DATA 0,"DEC HL" 60044DATA 0,"INC L" 60045DATA 0,"DEC L" 60046DATA 1,"LD L,0" 60047DATA 0,"CPL" 60048DATA 1,"JR NC,!" 60049DATA 2,"LD SP,10" 60050DATA 2,"LD (10),A" 60051DATA 0,"INC SP" 60052DATA 0,"INC (HL)" 60053DATA 0,"DEC (HL) 60054DATA 1,"LD (HL),0" 60055DATA 0,"SCF" 60056DATA 1,"JR C,!" 60057DATA 0,"ADD HL,SP" 60058DATA 2,"LD A,(10) 60059DATA 0,"DEC SP" 60060DATA 0,"INC A" 60061DATA 0,"DEC A" 60062DATA 1,"LD A,0" 60063DATA 0,"CCF" 60191*HIDAT 60192DATA 0,"RET NZ" 60193DATA 0,"POP BC" 60194DATA 2,"JP NZ,10" 60195DATA 2,"JP 10" 60196DATA 2,"CALL NZ,10" 60197DATA 0,"PUSH BC" 60198DATA 1,"ADD A,0" 60199DATA 0,"RST 00" 60200DATA 0,"RET Z" 60201DATA 0,"RET" 60202DATA 2,"JP Z,10" 60203DATA 0,"" 60204DATA 2,"CALL Z,10" 60205DATA 2,"CALL 10" 60206DATA 1,"ADC A,0" 60207DATA 0,"RST 08" 60208DATA 0,"RET NC" 60209DATA 0,"POP DE" 60210DATA 2,"JP NC,10" 60211DATA 1,"OUT (0),A" 60212DATA 2,"CALL NC,10" 60213DATA 0,"PUSH DE" 60214DATA 1,"SUB 0" 60215DATA 0,"RST 10" 60216DATA 0,"RET C" 60217DATA 0,"EXX" 60218DATA 2,"JP C,10" 60219DATA 1,"IN A,(0)" 60220DATA 2,"CALL C,10" 60221DATA 0,"" 60222DATA 1,"SBC A,0" 60223DATA 0,"RST 18" 60224DATA 0,"RET PO" 60225DATA 0,"POP HL" 60226DATA 2,"JP PO,10" 60227DATA 0,"EX (SP),HL" 60228DATA 2,"CALL PO,10" 60229DATA 0,"PUSH HL" 60230DATA 1,"AND 0" 60231DATA 0,"RST 20" 60232DATA 0,"RET PE" 60233DATA 0,"JP (HL)" 60234DATA 2,"JP PE,10" 60235DATA 0,"EX DE,HL" 60236DATA 2,"CALL PE,10" 60237DATA 0,"" 60238DATA 1,"XOR 0" 60239DATA 0,"RST 28" 60240DATA 0,"RET P" 60241DATA 0,"POP AF" 60242DATA 2,"JP P,10" 60243DATA 0,"DI" 60244DATA 2,"CALL P,10" 60245DATA 0,"PUSH AF" 60246DATA 1,"OR 0" 60247DATA 0,"RST 30" 60248DATA 0,"RET M" 60249DATA 0,"LD SP,HL" 60250DATA 2,"JP M,10" 60251DATA 0,"EI" 60252DATA 2,"CALL M,10" 60253DATA 0,"" 60254DATA 1,"CP 0" 60255DATA 0,"RST 38" 62000*SRDAT:DATA "B", "C", "D", "E", "H", "L", "(HL)","A" 62010*DRDAT:DATA "BC", "DE", "HL", "SP" 62020*CODAT:DATA "ADD", "ADC", "SUB", "SBC", "AND", "XOR", "OR ", "CP " 62030*IRDAT: DATA "IX", "IY" 62040*CBDAT: DATA "RLC", "RRC", "RL ", "RR ", "SLA", "SLR", "SLL", "SRL" 62050*VZDAT: DATA "-","+" 62060*BLDAT 62070DATA "LDI","CPI","INI","OUTI" 62080DATA "LDD","CPD","IND","OUTD" 62090DATA "LDIR","CPIR","INIR","OTIR" 62100DATA "LDDR","CPDR","INDR","OTDR"