1000 'Z80 DISASSEMBLER BY JIM BATTLE '82 ---10/81 1010 GOTO 1900 1020 DEFFNQ(Q)=(Q>32767)*(65536-Q)-(Q<32768)*Q 1030 DEFFNH$(I)=MID$(HH$,I/16+N1,N1)+MID$(HH$,I-INT(I/16)*16+N1,N1) 1040 DEFFNJ$(Q)=FNH$(Q/256)+FNH$(Q-INT(Q/256)*256) 1050 ' 1060 CLS:INPUT "START ADDRESS";S! 1070 IF S!<-32768 OR S!>65535 OR S!<>INT(S!) THEN 1060 1080 IF S!<0 THEN S!=S!+65536 1090 PRINT:INPUT "END ADDRESS";E! 1100 IF E!<-32768 OR E!>65535 OR E!<>INT(E!) THEN 1060 1110 IF E!<0 THEN E!=E!+65536 1120 PRINT:PRINT "OUTPUT TO PRINTER (Y/N)" 1130 A$=INKEY$:IF A$="Y" OR A$="N" THEN LP$=A$ ELSE 1130 1140 IF LP$="N" THEN 1190 1150 LPRINT CHR$(14) 'PREVENT UNDERLINE 1160 INPUT "PUT THE PAPER TO THE TOP OF THE PAGE";X$ 1170 LL=0 1180 INPUT "WHAT PAGE NUMBER";PN 1190 ' 1200 CLS 1210 FOR A=S! TO E!:FOR Z=N0 TO N3:A(Z)=FNQ(A+Z):P(Z)=PEEK(A(Z)):NEXT 1220 B0=P(N0):B1=P(N1):B2=P(N2):B3=P(N3) 1230 ' 1240 ' 1250 'EXTENDED INSTRUCTION (ED)? 1260 IF B0<>237 THEN 1300 1270 FOR Z=0 TO 55:IF B1=ED(Z) THEN 1290 ELSE NEXT 1280 I$="**ED ERROR**":L=N1:GOTO 1730 1290 L=L(Z):I$=ED$(Z):GOTO 1530 1300 IR$="" 1310 'INDEX REGISTER INSTRUCTION 1320 IF B0<>221 AND B0<>253 THEN 1370 1330 IF B0=221 THEN IR$="IX" ELSE IR$="IY" 1340 B0=B1:B1=B2:B2=B3:B3=-999 1350 ' 1360 'EXTENDED OPERATION? (CBH) 1370 IF B0<>203 THEN 1460 1380 ON INT(B1/64)+N1 GOTO 1390 ,1400 ,1410 ,1420 1390 I$="BIT "+CHR$((B1AND56)/N8+48)+R$(B1ANDN7):L=N2:GOTO 1530 1400 I$="RES "+CHR$((B1AND56)/N8+48)+","+R$(B1ANDN7):L=N2:GOTO 1530 1410 I$="SET "+CHR$((B1AND56)/N8+48)+","+R$(B1ANDN7):L=N2:GOTO01530 1420 IF (B1ANDN7)=6 THEN "**CB ERROR**":L=N1:GOTO 1530 1430 I$=S$((B1-192)/N8)+" "+R$(B1ANDN7):L=N2:GOTO 1530 1440 ' 1450 'NORMAL INSTRUCTIONS 1460 IF B0<64 THEN I$=I1$(B0):L=L1(B0):GOTO 1530 1470 IF B0=118 THEN I$="HALT":L=N1:GOTO 1530 1480 IF B0<128 THEN I$="LD "+R$((B0AND56)/N8)+","+R$(B0ANDN7):L=N1:GOTO 1530 1490 IF B0<192 THEN I$=A$((B0AND56)/N8)+R$(B0ANDN7):L=N1:GOTO 1530 1500 I$=I2$(B0-192):L=L2(B0-192) 1510 ' 1520 ' 1530 'WAS IT AN INDEX REGISTER INSTRUCTION? 1540 IF IR$="" THEN 1630 1550 P=INSTR(I$,"(HL)"):IF P=0 THEN 1590 1560 IF B1<128 THEN D$="+"+FNH$(B1) ELSE D$="-"+FNH$(256-B1) 1570 IF B1=0 THEN D$="" 1580 I$=LEFT$(I$,P)+IR$+D$+MID$(I$,P+N3):L=L+N2:GOTO 1630 1590 P=INSTR(I$,"HL"):IF P=N0 THEN I$="**"+IR$+" ERROR**":L=N1:GOTO 1730 1600 I$=LEFT$(I$,P-N1)+IR$+MID$(I$,P+N2):L=L+N1 1610 ' 1620 ' 1630 'REPLACE ADDRESSES 1640 P=INSTR(I$,"+1"):IF P=N0 THEN 1660 1650 I$=LEFT$(I$,P-N1)+FNH$(P(L-N1))+MID$(I$,P+N2):GOTO 1730 1660 P=INSTR(I$,"+2"):IF P=N0 THEN 1680 1670 I$=LEFT$(I$,P-N1)+FNH$(P(L-N1))+FNH$(P(L-N2))+MID$(I$,P+N2):GOTO 1730 1680 P=INSTR(I$,"-1"):IF P=N0 THEN 1730 1690 D=B1:IF D>127 THEN D=D-256 1700 I$=LEFT$(I$,P-N1)+FNJ$(A+N2+D) 1710 ' 1720 ' 1730 J$=FNJ$(A)+" " 1740 FOR Z=N0 TO L-N1:J$=J$+FNH$(P(Z)):NEXT 1750 J$=J$+LEFT$(" ",2*(6-L))+I$ 1760 PRINT J$ 1770 IF LP$="N" THEN 1840 1780 IF LL>0 THEN 1820 1790 LPRINT TAB(49);"DISASSEMBLER" 1800 LPRINT TAB(52);"PAGE";PN 1810 LPRINT " ":LPRINT " ":LPRINT " ":LPRINT " " 1820 LPRINT TAB(15);J$:LL=LL+1 1830 IF LL=53 THEN LPRINT CHR$(12):LL=0:PN=PN+1 1840 A=A+L-N1:NEXT A 1850 END 1860 ' 1870 ' 1880 ' 1890 ' 1900 'INITIALIZATION ROUTINE 1910 CLEAR 1000:DEFINT B-P,R-Z 1920 CLS:PRINT CHR$(23) 1930 PRINT @522,"DISASSEMBLER" 1940 PRINT @648,"by Jim Battle '82" 1950 DIM I1$(63),L1(63),I2$(63),L2(63),A(3),P(3),R$(7),S$(7),A$(7),ED(55),ED$(55),L(55) 1960 HH$="0123456789ABCDEF" 1970 N0=0:N1=1:N2=2:N3=3:N7=7:N8=8 1980 RESTORE 1990 FOR Z=0 TO 7:READ R$(Z):NEXT 2000 DATA B,C,D,E,H,L,(HL),A 2010 FOR Z=0 TO 7:READ S$(Z):NEXT 2020 DATA RLC,RRC,"RL ","RR ",SLA,SRA,?,SRL 2030 FOR Z=0 TO 7:READ A$(Z):NEXT 2040 DATA "ADD A,","ADC A,","SUB ","SBC A,","AND ","XOR ","OR ","CP " 2050 FOR Z=0 TO 63:READ I1$(Z),L1(Z):NEXT 2060 DATA NOP,1,"LD BC,+2",3,"LD (BC),A",1,INC BC,1,INC B,1,DEC B,1 2070 DATA "LD B,+1",2,RLCA,1,"EX AF,AF'",1,"ADD BC,HL",1,"LD A,(BC)",1 2080 DATA DEC BC,1,INC C,1,DEC C,1,"LD C,+1",2,RRCA,1,DJNZ -1,2 2090 DATA "LD DE,+2",3,"LD (DE),A",1,INC DE,1,INC D,1,DEC D,1,"LD D,+1",2 2100 DATA RLA,1,JR -1,2,"ADD HL,DE",1,"LD A,(DE)",1,DEC DE,1,INC E,1,DEC E,1 2110 DATA "LD E,+1",2,RRA,1,"JR NZ,-1",2,"LD HL,+2",3,"LD (+2),HL",3 2120 DATA INC HL,1,INC H,1,DEC H,1,"LD H,+1",2,DAA,1,"JR Z,-1",2,"ADD HL,HL",1 2130 DATA "LD HL,(+2)",3,DEC HL,1,INC L,1,DEC L,1,"LD L,+1",2,CPL,1 2140 DATA "JR NC,-1",2,"LD SP,+2",3,"LD (+2),A",3,INC SP,1,INC (HL),1 2150 DATA DEC (HL),1,"LD (HL),+1",2,SCF,1,"JR C,-1",2,"ADD HL,SP",1 2160 DATA "LD A,(+2)",3,DEC SP,1,INC A,1,DEC A,1,"LD A,+1",2,CCF,1 2170 FOR Z=N0 TO 63:READ I2$(Z),L2(Z):NEXT 2180 DATA RET NZ,1,POP BC,1,"JP NZ,+2",3,"JP +2",3,"CALL NZ,+2",3 2190 DATA PUSH BC,1,"ADD A,+1",2,RST 00H,1,RET Z,1,RET,1,"JP Z,+2",3 2200 DATA XXX,1,"CALL Z,+2",3,CALL +2,3,"ADC A,+1",2,RST 08H,1,RET NC,1,POP DE,1 2210 DATA "JP NC,+2",3,"OUT (+1),A",2,"CALL NC,+2",3,PUSH DE,1,SUB +1,2 2220 DATA RST 10H,1,RET S,1,EXX,1,"JP C,+2",3,"IN A,(+1)",2 2230 DATA "CALL C,+2",3,XXX,1,"SBC A,+1",2,RST 18H,1,RET PO,1,POP HL,1 2240 DATA "JP PO,+2",3,"EX (SP),HL",1,"CALL PO,+2",3,PUSH HL,1,AND +1,2,RST 20H,1 2250 DATA RET PE,1,JP (HL),1,"JP PE,+2",3,"EX DE,HL",1,"CALL PE,+2",3 2260 DATA XXX,1,XOR +1,2,RST 028H,1,RET P,1,POP AF,1,JP +2,3 2270 DATA DI,1,"CALL P,+2",3,PUSH AF,1,OR +1,2,RST 30H,1,RET M,1,"LD SP,HL",1 2280 DATA "JP M,+2",3,EI,1,"CALL M,+2",3,XXX,1,CP +1,2,RST 38H,1 2290 FOR Z=0 TO 55:READ ED$(Z),ED(Z),L(Z):NEXT 2300 DATA "IN B,(C)",64,2,"OUT (C),B",65,2,"SBC HL,BC",66,2,"LD (+2),BC",67,4,NEG,68,2 2310 DATA RETN,69,2,IM 00,70,2,"LD I,A",71,2,"IN C,(C)",72,2,"OUT (C),C",73,2 2320 DATA "ADC HL,BC",74,2,"LD BC,(+2)",75,2,RETI,77,2,"LD R,A",79,2,"IN D,(C)",80,2,"OUT (C),D",81,2 2330 DATA "SBC HL,DE",82,2,"LD (+2),DE",83,4,IM 1,86,2,"LD A,I",87,2,"IN E,(C)",88,2 2340 DATA "OUT (C),E",89,2,"ADC HL,DE",90,2,"LD TE,(+2)",91,4,IM 2,94,2,"LD A,R",95,2 2350 DATA "IN H,(C)",96,2,"OUT (C),H",97,2,"SBC HL,HL",98,2,RRD,103,2,"IN L,(C)",104,2 2360 DATA "OUT (C),L",105,2,"ADC HL,HL",106,2,RLD,111,2,"SBC HL,SP",114,2,"LD (+2),SP",115,2 2370 DATA "IN A,(C)",120,2,"OUT (C),A",121,2,"ADC HL,SP",122,2,"LD SP,(+2)",123,4 2380 DATA LDI,160,2,CPI,161,2,INI,162,2,OUTI,163,2,LDD,168,2,CPD,169,2,IND,170,2,OUTD,171,2,LDIR,176,2 2390 DATA CPIR,177,2,INIR,178,2,OTIR,179,2,LDDR,184,2,CPDR,185,2,INDR,186,2,OTDR,187,2 2400 GOTO 1020