DISA-Z Disassembler

Related Articles: DISA-Z: A Z80 Disassembler
Developer(s): Ray Kingsley
Date: 1983
Type: Program
Platform(s): TS 1000

Appears on

Assembled by Tim Ward from many sources. Contains programs 10051 – 10121.

Gallery

DISA-Z Disassembler

Source Code

  10 REM ***********************               DISA-Z         
  20 REM ***********************         A Z80 DISASSEMBLER              FOR TS COMPUTERS
  30 REM ***********************
  40 REM ***********************         COPYRIGHT, 1983                 RAY KINGSLEY
  50 REM ***********************         RUN AND ENTER START             ADDRESS IN DECIMAL
  60 REM ***********************
  70 REM ***********************
  90 REM DATA STRINGS
 100 LET O$="ADDADCSUBSBCANDXOROR CP "
 110 LET D$="BCDEHLSPAFIXIY"
 120 LET B$="BITRESSET"
 130 LET C$="RSLRC AL"
 140 LET R$="BCDEHLXA"
 150 LET E$="NZZ NCC POPEP M "
 160 LET F$="RLCARRCARLA RRA DAA CPL SCF CCF "
 170 LET G$="LDCPINOT"
 180 REM FOR TS2068 SET TS2=1
 190 LET TS2=0
 200 LET NCOD=28+20*TS2
 220 GOTO 3500
 230 REM OCTAL DIGITS
 240 FOR K=0 TO 3
 250 IF X0>=K*64 AND X0<(K+1)*64 THEN LET X=X0-K*64
 260 NEXT K
 270 LET C=INT (X/8)
 280 LET T=X-C*8
 290 RETURN 
 295 REM BYTE HEXER
 300 LET X=PEEK J
 310 LET Y=INT (X/16)
 320 LET Z=X-Y*16
 330 LET H$=H$+CHR$ (NCOD+Y+7*(Y>9)*TS2)+CHR$ (NCOD+Z+7*(Z>9)*TS2)
 340 RETURN 
 350 REM ADDRESS HEXER
 360 LET X=INT (J/256)
 370 GOSUB 310
 380 LET X=J-256*X
 390 GOSUB 310
 400 LET H$=H$+" "
 410 RETURN 
 420 REM GET INSTRUCTION LENGTH
 430 LET L=0
 440 IF X<>221 AND X<>253 THEN GOTO 540
 450 IF L THEN RETURN 
 460 GOSUB 480
 470 GOTO 440
 480 LET L=1
 490 LET J=J+1
 500 GOSUB 300
 510 LET J=J-1
 520 LET H$=H$( TO LEN H$-2)
 530 RETURN 
 535 REM I-LENGTH FOR PREFIXES
 540 IF L THEN LET L=L+((X>51) AND (X<55) OR X=203)
 550 IF X=203 THEN GOTO 940
 560 IF X<>237 THEN GOTO 710
 570 GOSUB 480
 580 IF X<64 OR X>188 THEN RETURN 
 590 IF X<160 AND X>123 THEN RETURN 
 600 IF X<124 THEN GOTO 630
 610 IF X-INT (X/8)*8<5 THEN GOTO 950
 620 RETURN 
 630 IF X=78 OR X=102 OR X=110 OR X=112 OR X=113 OR X=118 OR X=119 THEN RETURN 
 640 LET W=X-67
 650 IF NOT (W-INT (W/8)*8) THEN GOTO 920
 660 LET W=X-76
 670 IF W>=0 AND NOT (W-INT (W/8)*8) THEN RETURN 
 680 LET W=X-85
 690 IF W>=0 AND NOT (W-INT (W/8)*8) THEN RETURN 
 700 GOTO 950
 705 REM WITHOUT PREFIXES
 710 IF X<64 OR X>191 THEN GOTO 740
 720 IF L THEN LET L=L+(X-8*INT (X/8)=6)
 730 GOTO 950
 740 IF X>191 THEN GOTO 830
 750 IF Z=1 THEN GOTO 920
 760 LET W=X-34
 770 IF W>=0 AND NOT (W-INT (W/8)*8) THEN GOTO 920
 780 LET W=X-6
 790 IF W>=0 AND NOT (W-INT (W/8)*8) THEN GOTO 940
 800 LET W=X-16
 810 IF W>=0 AND NOT (W-INT (W/8)*8) THEN GOTO 940
 820 GOTO 950
 830 IF X=195 OR X=205 THEN GOTO 920
 840 IF X=211 OR X=219 THEN GOTO 940
 850 LET W=X-194
 860 IF NOT (W-INT (W/8)*8) THEN GOTO 920
 870 LET W=W-2
 880 IF NOT (W-INT (W/8)*8) THEN GOTO 920
 890 LET W=W-2
 900 IF NOT (W-INT (W/8)*8) THEN GOTO 940
 910 GOTO 950
 920 IF L=2 THEN GOTO 940
 930 LET L=L+1
 940 LET L=L+1
 950 LET L=L+1
 960 RETURN 
 970 REM MNEMONICS
 980 LET H$=H$+" "
 990 IF LEN H$<14 THEN GOTO 980
1000 IF X0=118 THEN GOTO 1290
1010 GOSUB 230
1020 IF X0<64 OR X0>191 THEN GOTO 1400
1030 IF X0>127 THEN GOTO 1310
1035 REM EIGHT-BIT REG LDS.
1040 LET P$=R$(C+1)
1050 LET Q$=R$(T+1)
1060 IF P$="X" OR Q$="X" THEN GOSUB 1170
1070 LET H$=H$+"LD "+P$+","+Q$
1080 RETURN 
1085 REM ADD POINTER REGS TO H$
1090 IF NOT DD THEN GOTO 1120
1100 LET H$=H$+"IX"
1110 RETURN 
1120 IF NOT FD THEN GOTO 1150
1130 LET H$=H$+"IY"
1140 RETURN 
1150 LET H$=H$+"HL"
1160 RETURN 
1165 REM CHECK FOR FD OR DD
1170 IF FD OR DD THEN GOTO 1210
1180 IF P$="X" THEN LET P$="(HL)"
1190 IF Q$="X" THEN LET Q$="(HL)"
1200 RETURN 
1205 REM ADD INDEX REGS TO H$
1210 IF FD THEN LET W$="(IY+"
1220 IF DD THEN LET W$="(IX+"
1230 IF P$="X" THEN LET P$=W$+H$(10 TO 11)+")"
1240 IF Q$="X" THEN LET Q$=W$+H$(10 TO 11)+")"
1250 RETURN 
1260 GOSUB 1170
1270 LET H$=H$+P$+","+R$(1+T)
1280 RETURN 
1290 LET H$=H$+"HLT"
1300 RETURN 
1310 REM ARITH/LOGIC OPS
1320 LET I=C*3+1
1330 LET Q$=R$(T+1)
1340 GOSUB 1170
1350 LET I$=" "
1360 IF I<7 OR I=10 THEN LET I$=" A,"
1370 IF I>18 THEN LET I$=""
1380 LET H$=H$+O$(I TO I+2)+I$+Q$
1390 RETURN 
1395 REM 1ST AND 4TH GROUPS
1400 IF X0=203 THEN GOTO 3170
1410 IF X0=253 OR X0=221 THEN GOTO 3420
1420 IF X0>191 THEN GOTO 1570
1425 REM 1ST GROUP
1430 IF T=1 THEN GOTO 2020
1440 IF T=3 THEN GOTO 2240
1450 IF T=4 OR T=5 THEN GOTO 2300
1460 IF T=2 THEN GOTO 2370
1470 IF NOT T THEN GOTO 2080
1480 IF T<>6 THEN GOTO 1540
1490 LET Q$=R$(C+1)
1500 GOSUB 1170
1510 LET W=4*(FD OR DD)
1520 LET H$=H$+"LD "+Q$+","+H$(8+W TO 9+W)
1530 RETURN 
1540 LET W=4*C+1
1550 LET H$=H$+F$(W TO W+3)
1560 RETURN 
1570 REM DIRECT ARITHMETIC
1580 IF T<>6 THEN GOTO 1660
1590 LET I=3*C+1
1600 LET I$=" "
1610 IF I<7 OR I=10 THEN LET I$=" A,"
1620 IF I>18 THEN LET I$=""
1630 LET H$=H$+O$(I TO I+2)+I$
1640 LET H$=H$+H$(8 TO 9)
1650 RETURN 
1660 REM 4TH GROUP
1670 IF X0=237 THEN GOTO 2700
1680 IF T=1 AND NOT (C-INT (C/2)*2) THEN GOTO 1920
1690 IF T=7 THEN GOTO 1990
1700 IF T=5 AND NOT (C-INT (C/2)*2) THEN GOTO 1940
1710 LET FL=0
1720 IF X0=205 OR T=4 THEN GOSUB 1830
1730 IF X0=195 OR T=2 THEN GOSUB 1800
1740 IF X0=201 OR NOT T THEN GOSUB 1870
1750 IF NOT T OR T=2 OR T=4 THEN GOSUB 1890
1760 IF T=3 AND NOT FL THEN GOTO 2510
1770 IF T=1 AND NOT FL THEN GOTO 2610
1780 IF FL THEN GOSUB 1850
1790 RETURN 
1795 REM MAIN CONDITIONALS
1800 LET H$=H$+"JP "
1810 LET FL=1
1820 RETURN 
1830 LET H$=H$+"CALL "
1840 GOTO 1810
1850 LET H$=H$+H$(10 TO 11)+H$(8 TO 9)
1860 RETURN 
1870 LET H$=H$+"RET "
1880 GOTO 1810
1890 LET H$=H$+E$(2*C+1 TO 2*(C+1))
1900 IF NOT (C=1 OR C=3 OR C>5) THEN LET H$=H$+" "
1910 RETURN 
1915 REM GROUP 4:C EVEN,T=1 OR 5
1920 LET H$=H$+"POP "
1930 GOTO 1950
1940 LET H$=H$+"PUSH "
1950 IF C=6 THEN LET C=8
1960 IF C=4 THEN LET C=C+6*(FD OR DD)
1970 LET H$=H$+D$(1+C TO 2+C)
1980 RETURN 
1985 REM GROUP 4:T=7
1990 LET W=INT (C/2)
2000 LET H$=H$+"RST "+STR$ (W)+STR$ (8*(C-2*W))
2010 RETURN 
2020 REM GROUP 1:T=1
2030 IF C-2*INT (C/2) THEN GOTO 2060
2040 LET H$=H$+"LD "+D$(C+1 TO C+2)+","
2050 GOTO 1850
2060 LET H$=H$+"ADD HL,"+D$(C TO C+1)
2070 RETURN 
2080 REM GROUP 1:T=0 (JRS)
2090 IF C=0 THEN LET H$=H$+"NOP"
2100 IF C=1 THEN LET H$=H$+"EX AF,AF"""
2110 IF C=2 THEN LET H$=H$+"DJNZ"
2120 IF C>1 THEN GOTO 2140
2130 RETURN 
2140 IF C>2 THEN LET H$=H$+"JR "
2150 LET W=C*2-7
2160 IF C>3 THEN LET H$=H$+E$(W TO W+1)
2170 IF NOT (C-2*INT (C/2)) THEN LET H$=H$+" "
2180 LET W=(PEEK (J-1) AND (PEEK (J-1)<128))+((PEEK (J-1)-256) AND (PEEK (J-1)>127))
2190 LET J0=J
2200 LET J=J+W
2210 GOSUB 350
2220 LET J=J0
2230 RETURN 
2240 REM GROUP 1:T=3
2250 LET Q$="INC "
2260 IF C-2*INT (C/2) THEN LET Q$="DEC "
2270 LET W=2*INT (C/2)+1
2280 LET H$=H$+Q$+D$(W TO W+1)
2290 RETURN 
2300 REM GROUP 1:T=4 OR 5
2310 LET Q$=R$(C+1)
2320 GOSUB 1170
2330 LET P$="INC "
2340 IF T-2*INT (T/2) THEN LET P$="DEC "
2350 LET H$=H$+P$+Q$
2360 RETURN 
2370 REM GROUP 1:T=2
2380 LET H$=H$+"LD "
2390 IF NOT (C-2*INT (C/2)) THEN GOTO 2460
2400 IF C=5 THEN GOSUB 1090
2410 IF C=5 THEN GOTO 2430
2420 LET H$=H$+"A"
2430 IF C>3 THEN LET H$=H$+",("+H$(10 TO 11)+H$(8 TO 9)+")"
2440 IF C<4 THEN LET H$=H$+",("+D$(C TO C+1)+")"
2450 RETURN 
2460 IF C<4 THEN LET H$=H$+"("+D$(C+1 TO C+2)+"),"
2470 IF C>3 THEN LET H$=H$+"("+H$(10 TO 11)+H$(8 TO 9)+"),"
2480 IF C=4 THEN GOTO 1090
2490 LET H$=H$+"A"
2500 RETURN 
2510 REM GROUP 4:T=3
2530 IF C=2 THEN LET H$=H$+"OUT "+H$(8 TO 9)+",A"
2540 IF C=3 THEN LET H$=H$+"IN A,"+H$(8 TO 9)
2550 IF C=4 THEN LET H$=H$+"EX(SP),HL"
2560 IF C=5 THEN LET H$=H$+"EX DE,HL"
2580 IF C=6 THEN LET H$=H$+"DI"
2590 IF C=7 THEN LET H$=H$+"EI"
2600 RETURN 
2610 REM GROUP 4:T=1
2620 IF C=3 THEN LET H$=H$+"EXX"
2630 IF C=5 THEN LET H$=H$+"JP("
2640 IF C=7 THEN LET H$=H$+"LD SP,"
2650 IF C<5 THEN RETURN 
2660 GOSUB 1090
2670 IF C=7 THEN RETURN 
2680 LET H$=H$+")"
2690 RETURN 
2700 REM ED PREFIXES TO 3610
2710 IF L=1 THEN GOTO 3460
2720 LET X0=PEEK (J-L+1)
2730 GOSUB 230
2740 IF X0<160 OR X0>187 THEN GOTO 2850
2750 IF T>3 THEN RETURN 
2760 IF T=3 AND C<6 THEN LET Q$="OUT"
2770 IF T=3 AND C<6 THEN GOTO 2800
2780 LET W=2*T+1
2790 LET Q$=G$(W TO W+1)
2800 IF (C-2*INT (C/2)) THEN LET Q$=Q$+"D"
2810 IF NOT (C-2*INT (C/2)) THEN LET Q$=Q$+"I"
2820 IF C>5 THEN LET Q$=Q$+"R"
2830 LET H$=H$+Q$
2840 RETURN 
2850 IF X0<64 OR X0>123 THEN RETURN 
2860 IF T>1 THEN GOTO 2910
2870 LET Q$=R$(C+1)
2880 IF T THEN LET H$=H$+"OUT(C),"+Q$
2890 IF NOT T THEN LET H$=H$+"IN "+Q$+",(C)"
2900 RETURN 
2910 LET W=INT (C/2)
2920 IF T<>2 THEN GOTO 2960
2930 IF C-2*W THEN LET H$=H$+"ADD HL,"+D$(2*W+1 TO 2*W+2)
2940 IF NOT (C-2*W) THEN LET H$=H$+"SBC HL,"+D$(2*W+1 TO 2*W+2)
2950 RETURN 
2960 IF T<>3 THEN GOTO 3020
2970 IF C-2*W THEN GOTO 3000
2980 LET H$=H$+"LD("+H$(12 TO 13)+H$(10 TO 11)+"),"+D$(2*W+1 TO 2*W+2)
2990 RETURN 
3000 LET H$=H$+"LD "+D$(2*W+1 TO 2*W+2)+",("+H$(12 TO 13)+H$(10 TO 11)+")"
3010 RETURN 
3020 IF T<>7 THEN GOTO 3120
3030 IF C>3 THEN GOTO 3090
3040 IF C=2*W THEN LET Q$="I"
3050 IF C<>2*W THEN LET Q$="R"
3060 IF C>1 THEN LET H$=H$+"LD A,"+Q$
3070 IF C<2 THEN LET H$=H$+"LD "+Q$+",A"
3080 RETURN 
3090 IF C=4 THEN LET H$=H$+"RRD"
3100 IF C=5 THEN LET H$=H$+"RLD"
3110 RETURN 
3120 IF T=6 AND C<4 AND C<>1 THEN LET H$=H$+"IM "+STR$ ((C>0)*(C-1))
3130 IF X0=68 THEN LET H$=H$+"NEG"
3140 IF X0=69 THEN LET H$=H$+"RETN"
3150 IF X0=77 THEN LET H$=H$+"RETI"
3160 RETURN 
3170 REM BIT OPS
3180 LET CB=1
3190 LET X0=PEEK (J-1)
3200 LET W=INT (X0/64)
3210 LET X0=X0-W*64
3220 IF W THEN GOTO 3350
3230 LET B1=1+INT (X0/32)
3240 LET B2=INT (X0/16)
3250 LET X0=X0-B2*16
3260 LET B3=INT (X0/8)+3
3270 LET B2=B2+5
3280 LET X0=1+X0-(B3-3)*8
3290 LET Q$=R$(X0)
3300 GOSUB 1170
3310 LET H$=H$+C$(B1)+C$(B3)+C$(B2)
3320 IF B2<>6 THEN LET H$=H$+" "
3330 LET H$=H$+Q$
3340 RETURN 
3350 LET W=3*W-2
3360 LET D=INT (X0/8)
3370 LET X0=X0-D*8+1
3380 LET Q$=R$(X0)
3390 GOSUB 1170
3400 LET H$=H$+B$(W TO W+2)+" "+STR$ (D)+","+Q$
3410 RETURN 
3420 REM FD,DD PREFIXES
3430 LET DD=X0=221
3440 LET FD=X0=253
3450 IF L>1 THEN GOTO 3480
3460 LET H$=H$+"DATA"
3470 RETURN 
3480 LET X0=PEEK (J-L+1)
3490 GOTO 1000
3500 REM MAIN LOOP
3510 INPUT J
3520 LET H$=""
3530 LET P$=H$
3540 LET Q$=H$
3550 LET DD=0
3560 LET FD=DD
3570 LET CB=DD
3580 GOSUB 350
3590 GOSUB 300
3600 GOSUB 420
3610 LET H$=H$( TO LEN H$-2)
3620 LET X0=PEEK J
3630 FOR K=1 TO L
3640 GOSUB 300
3650 LET J=J+1
3660 NEXT K
3670 GOSUB 970
3680 LPRINT H$
3700 GOTO 3520
3710 SAVE "1008%3"
3720 LIST 
Scroll to Top