home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib26b.dsk / BASIC.DISASM.bas < prev    next >
BASIC Source File  |  2023-02-26  |  18KB  |  415 lines

  1. 10  REM  **********************
  2. 20  REM  * BASIC DISASSEMBLER *
  3. 30  REM  * BY GARRETT P SMITH *
  4. 40  REM  * COPYRIGHT (C) 1985 *
  5. 50  REM  * BY MICROSPARC, INC *
  6. 60  REM  * CONCORD, MA. 01742 *
  7. 70  REM  **********************
  8. 80  GOTO 2830
  9. 90  REM  BUILD REFERENCE LIST
  10. 100 AD = AD -32768:K = R%(0):I = 1
  11. 110  IF K = 0  THEN K = 1: GOTO 230
  12. 120  IF AD >R%(I)  THEN  GOTO 150
  13. 130  IF AD = R%(I)  THEN  RETURN 
  14. 140 K = 1: GOTO 230
  15. 150  IF AD <R%(K)  THEN  GOTO 180
  16. 160  IF AD = R%(K)  THEN  RETURN 
  17. 170 K = K +1: GOTO 250
  18. 180  IF K -I < = 1  THEN  GOTO 230
  19. 190 J =  INT((I +K)/2)
  20. 200  IF AD >R%(J)  THEN I = J: GOTO 180
  21. 210  IF AD <R%(J)  THEN K = J: GOTO 180
  22. 220  RETURN 
  23. 230  FOR I = R%(0) TO K  STEP  -1:R%(I +1) = R%(I): NEXT 
  24. 240  IF AD =  -32768  THEN I =  PEEK(108) *256 + PEEK(107): POKE I +9,128: POKE I +10,0: GOTO 260
  25. 250 R%(K) = AD
  26. 260 R%(0) = R%(0) +1: IF R%(0) +1 >RL  THEN  VTAB 17: PRINT "NOT ENOUGH MEMORY": PRINT RL;" REFERENCES FOUND": PRINT "BY BYTE ";PC;" OF ";L: POP : GOTO 360
  27. 270  RETURN 
  28. 280  REM  CALCULATE RELATIVE ADDRESS
  29. 290 AD = A +PC +2 +BL% +( -256) *(BL% >127)
  30. 300  RETURN 
  31. 310  REM  PRINT PC
  32. 320  VTAB 15: HTAB 13: PRINT PC: RETURN 
  33. 330  REM  ONERR FOR OPEN FILES
  34. 340  PRINT "ERROR #"; PEEK(222);" DETECTED"
  35. 350  PRINT "AT LINE "; PEEK(218) + PEEK(219) *256
  36. 360  PRINT : PRINT  CHR$(4);"CLOSE"
  37. 370  POKE 216,0
  38. 380  GOTO 3820
  39. 390  REM  OPEN FILES
  40. 400 EC = 1: ONERR  GOTO 3840
  41. 410 F2$ = ".TEXT": GOSUB 440
  42. 420 F2$ = ".TEMP": GOSUB 440
  43. 430  RETURN 
  44. 440  PRINT : PRINT D$"OPEN "F$;F2$;",D";DN
  45. 450  PRINT D$"CLOSE "F$;F2$
  46. 460  PRINT D$"DELETE "F$;F2$
  47. 470  PRINT D$"OPEN "F$;F2$;",D";DN
  48. 480  RETURN 
  49. 490 EC = 2: ONERR  GOTO 3840
  50. 500  PRINT : PRINT D$;"WRITE ";F$;F2$
  51. 510  PRINT RS$;
  52. 520  FOR I = 0 TO PI -1
  53. 530  PRINT P$(I);
  54. 540  NEXT 
  55. 550  PRINT RE$
  56. 560  PRINT D$
  57. 570  RETURN 
  58. 580  REM  UNRESOLVED REFERENCE
  59. 590  GOSUB 950
  60. 600 P$(PI) = M1$:PI = PI +1:PN = PN + LEN(M1$)
  61. 610 CT = CT +1
  62. 620  RETURN 
  63. 630  REM  BUILD EQU STATEMENT
  64. 640  GOSUB 770
  65. 650  GOSUB 950
  66. 660 P$(PI) = PS$(1)
  67. 670 PI = PI +1:PN = PN + LEN(PS$(1))
  68. 680  GOSUB 950: GOSUB 820
  69. 690  IF F2 < >0  THEN  GOSUB 590
  70. 700 F2 = 0:F2$ = ".TEXT": VTAB 16: GOSUB 490
  71. 710  RETURN 
  72. 720  REM  SPLIT AD INTO BL% AND BH%
  73. 730 BH% =  INT(AD/256)
  74. 740 BL% = AD -BH% *256
  75. 750  RETURN 
  76. 760  REM  BUILD A LABEL
  77. 770  GOSUB 730
  78. 780 P$(PI) = LB$:PI = PI +1:PN = PN +1
  79. 790  GOSUB 840
  80. 800  RETURN 
  81. 810  REM  HEX NUMBER
  82. 820 P$(PI) = DS$
  83. 830 PI = PI +1:PN = PN +1
  84. 840  IF BH% = 0  AND FL%(0) = 0  THEN  GOTO 860
  85. 850 I = BH%: GOSUB 880
  86. 860 I = BL%: GOSUB 880
  87. 870  RETURN 
  88. 880 J =  INT(I/16): GOSUB 910
  89. 890 J = I -J *16: GOSUB 910
  90. 900  RETURN 
  91. 910 P$(PI) = NB$(J)
  92. 920 PI = PI +1:PN = PN +1
  93. 930  RETURN 
  94. 940  REM  PAD FIELD WITH BLANKS AND ADD DELIMITER
  95. 950 J = 0
  96. 960  FOR I = 1 TO 3
  97. 970  IF PN <FL%(I)  THEN J = FL%(I) -PN:I = 3
  98. 980  NEXT 
  99. 990  IF J = 0  THEN  GOTO 1030
  100. 1000  FOR I = 1 TO J
  101. 1010 P$(PI) = SP$:PI = PI +1:PN = PN +1
  102. 1020  NEXT 
  103. 1030 P$(PI) = FD$
  104. 1040 PI = PI +1:PN = PN + LEN(FD$)
  105. 1050  RETURN 
  106. 1060  REM  ADD X OR Y FOR INDEXED ADDRESSING
  107. 1070 I = AM% -5 * INT(AM%/5)
  108. 1080  ON I GOTO 1130,1090,1100
  109. 1090 A$ = LX$: GOTO 1110
  110. 1100 A$ = LY$
  111. 1110 P$(PI) = CM$:PI = PI +1:PN = PN +1
  112. 1120 P$(PI) = A$:PI = PI +1:PN = PN +1
  113. 1130  RETURN 
  114. 1140  REM  TWO BYTE REFERENCE TO PAGE ZERO
  115. 1150  IF (AM% = 13  AND MN < >31)  OR (MN = 28  OR MN = 29)  THEN  GOTO 2030
  116. 1160 PI = PI -1:PN = PN - LEN(P$(PI)): IF P$(PI) < >MN$(MN)  THEN 1160
  117. 1170 P$(PI) = PS$(0):PI = PI +1:PN = PN + LEN(PS$(0))
  118. 1180 K = BL%:BL% = B%: GOSUB 950: GOSUB 820
  119. 1190  GOSUB 950:P$(PI) = NU$:PI = PI +1:PN = PN +1
  120. 1200 F2$ = ".TEMP": GOSUB 490:PI = 0:PN = 0
  121. 1210  GOSUB 950:P$(PI) = PS$(0):PI = PI +1:PN = PN + LEN(PS$(0))
  122. 1220 BL% = K: GOSUB 950: GOSUB 820
  123. 1230  GOSUB 950:P$(PI) = MN$(MN):PI = PI +1:P$(PI) = CM$:PI = PI +1:P$(PI) = AM$(AM% -1):PI = PI +1:PN = PN + LEN(MN$) +CM$ +AM$(AM% -1))
  124. 1240  GOSUB 490:PI = 0:PN = 0
  125. 1250  GOSUB 950:P$(PI) = PS$(0):PI = PI +1:PN = PN + LEN(PS$(0))
  126. 1260 BL% = 0: GOSUB 950: GOSUB 820
  127. 1270  GOSUB 950:P$(PI) = NU$:PI = PI +1:PN = PN +1
  128. 1280 CZ = CZ +1
  129. 1290  GOTO 2110
  130. 1300  REM  FIRST PASS
  131. 1310 IC = 0:FC = 0: HOME : VTAB 15: PRINT "FIRST PASS"
  132. 1320 PC = PC +IC
  133. 1330  IF PC > = L  THEN  RETURN 
  134. 1340 B% =  PEEK(PC +BA): GOSUB 320
  135. 1350 AM% =  INT(XC%(B%)/100) +1
  136. 1360 IC =  INT((AM% +10)/7)
  137. 1370  ON AM% GOTO 1320,1320,1320,1320,1390,1400,1400,1400,1400,1400,1410,1410,1410,1410
  138. 1380  PRINT "BAD ADDRESS MODE": GOTO 3820
  139. 1390 BL% =  PEEK(PC +BA +1): GOSUB 290: GOSUB 100: GOTO 1320
  140. 1400 AD =  PEEK(PC +BA +1): GOSUB 100: GOTO 1320
  141. 1410 AD =  PEEK(PC +BA +1) +256 * PEEK(PC +BA +2): GOSUB 100: GOTO 1320
  142. 1420  REM  SECOND PASS
  143. 1430 PC = 0:RI = 1:IC = 0:CT = 0: GOSUB 400: VTAB 15: HTAB 1: PRINT "SECOND PASS      ": REM  6 BLANKS
  144. 1440  GOSUB 950:P$(PI) = PS$(2):PI = PI +1:PN = PN + LEN(PS$(2))
  145. 1450  GOSUB 950:AD = A: GOSUB 730: GOSUB 820
  146. 1460 F2$ = ".TEXT": GOSUB 490: POKE 216,0
  147. 1470 PN = 0:PI = 0
  148. 1480 PC = PC +IC
  149. 1490  IF R%(0) <RI  AND PC > = L  THEN  RETURN 
  150. 1500  IF R%(0) <RI  THEN  GOTO 1550
  151. 1510 AD = R%(RI) +32768
  152. 1520  IF PC > = L  THEN  GOTO 2130
  153. 1530  IF AD <A +PC  THEN F2 = (PC >0): GOSUB 640:RI = RI +1:IC = 0: GOTO 1470
  154. 1540  IF AD = A +PC  THEN  GOSUB 770:RI = RI +1
  155. 1550  GOSUB 950: GOSUB 320
  156. 1560 B% =  PEEK(PC +BA)
  157. 1570 AM% =  INT(XC%(B%)/100) +1
  158. 1580 MN = XC%(B%) -(AM% -1) *100
  159. 1590 P$(PI) = MN$(MN)
  160. 1600 PI = PI +1:PN = PN + LEN(MN$(MN))
  161. 1610  GOSUB 950
  162. 1620 IC =  INT((AM% +10)/7)
  163. 1630  ON AM% GOTO 1660,1700,1720,1770,1820,1870,1870,1870,1920,1920,2000,2000,2000,2060
  164. 1640  PRINT "BAD ADDRESS MODE": GOTO 3820
  165. 1650  REM  UNDEFINED
  166. 1660 BH% = 0:BL% = B%
  167. 1670  GOSUB 820: GOSUB 950:P$(PI) = M2$:PI = PI +1:PN = PN + LEN(M2$)
  168. 1680  GOTO 2110
  169. 1690  REM  IMPLIED
  170. 1700  GOTO 2110
  171. 1710  REM  ACCUMULATOR
  172. 1720  IF AF$ = NL$  THEN  GOTO 2110
  173. 1730 P$(PI) = AF$
  174. 1740 PI = PI +1:PN = PN + LEN(AF$)
  175. 1750  GOTO 2110
  176. 1760  REM  IMPLIED
  177. 1770 P$(PI) = NU$:PI = PI +1:PN = PN +1
  178. 1780 BH% = 0:BL% =  PEEK(PC +BA +1)
  179. 1790  GOSUB 820
  180. 1800  GOTO 2110
  181. 1810  REM  RELATIVE BRANCH
  182. 1820 BL% =  PEEK(PC +BA +1)
  183. 1830  GOSUB 290
  184. 1840  GOSUB 770
  185. 1850  GOTO 2110
  186. 1860  REM  ZERO PAGE; ZP,X; ZP,Y
  187. 1870 BH% = 0:BL% =  PEEK(PC +BA +1)
  188. 1880  GOSUB 780
  189. 1890  GOSUB 1070
  190. 1900  GOTO 2110
  191. 1910  REM  (INDIRECT,X); (INDIRECT),Y
  192. 1920 BH% = 0:BL% =  PEEK(PC +BA +1)
  193. 1930 P$(PI) = LP$:PI = PI +1:PN = PN +1
  194. 1940  GOSUB 780
  195. 1950 P$(PI) = IX$
  196. 1960  IF AM% = 10  THEN P$(PI) = IY$
  197. 1970 PI = PI +1:PN = PN +3
  198. 1980  GOTO 2110
  199. 1990  REM  ABSOLUTE; ABS,X; ABS,Y
  200. 2000 BL% =  PEEK(PC +BA +1)
  201. 2010 BH% =  PEEK(PC +BA +2)
  202. 2020  IF BH% = 0  THEN  GOTO 1150
  203. 2030  GOSUB 780: GOSUB 1070
  204. 2040  GOTO 2110
  205. 2050  REM  (INDIRECT)
  206. 2060 BL% =  PEEK(PC +BA +1)
  207. 2070 BH% =  PEEK(PC +BA +2)
  208. 2080 P$(PI) = LP$:PI = PI +1:PN = PN +1
  209. 2090  GOSUB 780
  210. 2100 P$(PI) = RP$:PI = PI +1:PN = PN +1
  211. 2110 F2$ = ".TEMP": GOSUB 490: GOTO 1470
  212. 2120  REM  NO-MORE-PROGRAM LOOP
  213. 2130 AD = R%(RI) +32768
  214. 2140  GOSUB 640
  215. 2150 RI = RI +1:PI = 0:PN = 0
  216. 2160  IF R%(0) <RI  THEN  RETURN 
  217. 2170  GOTO 2130
  218. 2180  REM  TITLE PAGE
  219. 2190  TEXT : HOME 
  220. 2200  HTAB 11: INVERSE : PRINT "BASIC DISASSEMBLER": NORMAL 
  221. 2210  POKE 34,1: PRINT 
  222. 2220  PRINT "COPYRIGHT 1985 BY MICROSPARC, INC"
  223. 2230  PRINT "WRITTEN BY GARRETT P SMITH"
  224. 2240  RETURN 
  225. 2250  REM  GET A & L FROM DISK (48+K/3.3 DOS)
  226. 2260 EC = 3: ONERR  GOTO 2370
  227. 2270  IF  PEEK(41868) < >113  THEN  POP : VTAB 23: PRINT "ERR --- STANDARD 48K DOS 3.3 NOT BOOTED": VTAB 13: CALL  -868: GOTO 3040
  228. 2280  POKE 41868,13: REM  CRIPPLE BLOAD
  229. 2290  PRINT  CHR$(4);"BLOAD ";F$;",D";DA
  230. 2300  REM  BLOAD DID NOT LOAD FILE; IT ONLY LOOKED UP A & L
  231. 2310  POKE 41868,113: REM  FIX IT
  232. 2320  POKE 216,0
  233. 2330 A =  PEEK( -21902) +256 * PEEK( -21901)
  234. 2340 L =  PEEK( -21920) +256 * PEEK( -21919)
  235. 2350  VTAB 22: PRINT "FYI:  A = ";A;"  L = ";L: PRINT "PRESS <RETURN> TO CONTINUE ";: GET A$: PRINT A$: RETURN 
  236. 2360  REM  ERROR ROUTINE FOR CRIPPLED BLOAD
  237. 2370  POKE 41868,113
  238. 2380  IF  PEEK(222) < >6  THEN  GOTO 3840
  239. 2390  POKE 216,0: CALL  -3288
  240. 2400  IF A$ =  CHR$(91)  THEN 3840
  241. 2410  IF A$ =  CHR$(92)  THEN  PRINT : PRINT "'BASIC.DISAS.AUX' NOT FOUND": PRINT "PLEASE PLACE PROPER DISK IN DRIVE #1": PRINT "HIT <RETURN> TO CONT --- <ESC> TO EXIT ";: GET A$: PRINT A$:F1 = (A$ =  CHR$(27)): HOME : GOTO 3790
  242. 2420  IF DA <DN  THEN DA = DN: HOME : GOTO 3010
  243. 2430  HOME : VTAB 8: PRINT "FILE '";F$;"' NOT FOUND": VTAB 21: PRINT "HIT <RESET> TO EXIT": GOTO 2870
  244. 2440  REM  INPUT A & L FOR NON 3.3 DOS
  245. 2450 EC = 4: ONERR  GOTO 3840
  246. 2460  PRINT  CHR$(4);"VERIFY ";F$;",D";DA
  247. 2470  POKE 216,0
  248. 2480  VTAB 15: PRINT "PLEASE SUPPLY SOME INFORMATION ABOUT": PRINT F$;"  (DECIMAL OR $HEX)"
  249. 2490  VTAB 18: CALL  -868: INPUT "STARTING ADDRESS? ";A$
  250. 2500  GOSUB 2540:A = L: IF K = 0  THEN 2490
  251. 2510  VTAB 19: CALL  -868: INPUT "LENGTH? ";A$
  252. 2520  GOSUB 2540: IF K = 0  THEN 2510
  253. 2530  RETURN 
  254. 2540 J = 1:L = 0:IC = 10:K =  LEN(A$): IF K >5  THEN K = 0: RETURN 
  255. 2550  IF  MID$ (A$,1,1) = "$"  THEN J = 2:IC = 16
  256. 2560  IF J >K  THEN K = 0: RETURN 
  257. 2570  FOR I = J TO K
  258. 2580 B% =  ASC( MID$ (A$,I,1)) -48
  259. 2590  IF B% >9  AND IC = 16  THEN B% = B% -7
  260. 2600  IF B% >IC -1  THEN B% =  -1
  261. 2610  IF B% <0  THEN I = K: NEXT I:K = 0: RETURN 
  262. 2620 L = L *IC +B%
  263. 2630  NEXT I: RETURN 
  264. 2640  REM  READ ASSEMBLER CODES
  265. 2650  FOR I = 0 TO 3
  266. 2660  READ FL%(I)
  267. 2670  NEXT 
  268. 2680  READ FD$
  269. 2690  READ AF$
  270. 2700  READ EF$
  271. 2710  READ EF
  272. 2720  READ I:RS$ =  CHR$(I): IF I = 0  THEN RS$ = ""
  273. 2730  READ I:RE$ =  CHR$(I): IF I = 0  THEN RE$ = ""
  274. 2740  FOR I = 0 TO 2: READ PS$(I): NEXT 
  275. 2750  RETURN 
  276. 2760  REM  READ DUMMY CODES
  277. 2770  READ I,I,I,I
  278. 2780  READ F2$,F2$,F2$
  279. 2790  READ I,I,I
  280. 2800  READ F2$,F2$,F2$
  281. 2810  RETURN 
  282. 2820  REM  MAIN ROUTINE
  283. 2830  GOSUB 2190
  284. 2840  VTAB 8: CALL  -868: PRINT "DO YOU USE 1 OR 2 DISK DRIVES? (1/2) ";: GET A$: PRINT A$
  285. 2850 DN =  VAL(A$): IF DN < >1  AND DN < >2  THEN  GOTO 2840
  286. 2860 DA = 1
  287. 2870  HOME : VTAB 22: PRINT "<RETURN> WITH NO FILE NAME FOR CATALOG": PRINT "PLACE BINARY FILE IN DISK DRIVE";: IF DN = 2  THEN  PRINT " 1 OR 2"
  288. 2880  PRINT : VTAB 11: PRINT "(NO COMMAS, SPACES, OR COLONS)": VTAB 9: PRINT : INPUT "BINARY FILE NAME: ";F$
  289. 2890  VTAB 22: CALL  -868: IF F$ < >""  THEN 2930
  290. 2900  HOME : IF DN = 1  THEN 2920
  291. 2910  VTAB 6: CALL  -868: PRINT "CATALOG FOR DRIVE 1 OR 2? (1/2) ";: GET A$: PRINT A$:DA =  VAL(A$): IF DA < >1  AND DA < >2  THEN  GOTO 2910
  292. 2920  PRINT  CHR$(4);"CATALOG,D";DA: PRINT "HIT <RETURN> TO CONTINUE ";: GET A$: PRINT A$: HOME : GOTO 2870
  293. 2930  HOME 
  294. 2940  VTAB 5: HTAB 5
  295. 2950  PRINT "WHICH DOS ARE YOU USING?": PRINT 
  296. 2960  HTAB 10: INVERSE : PRINT "D";: NORMAL : PRINT "OS 3.3 (STANDARD)": PRINT 
  297. 2970  HTAB 10: INVERSE : PRINT "P";: NORMAL : PRINT "RODOS OR COMPATIBLE": PRINT 
  298. 2980  HTAB 10: INVERSE : PRINT "O";: NORMAL : PRINT "THER (NON-STANDARD 3.3)": PRINT 
  299. 2990  HTAB 5: PRINT "PLEASE ENTER (D/P/O)";: GET A$: PRINT A$
  300. 3000 K = 0
  301. 3010  IF A$ = "D"  THEN PD = 0: GOSUB 2260:K = 1
  302. 3020  IF A$ = "P"  THEN PD = 1: GOSUB 2450:K = 1
  303. 3030  IF A$ = "O"  THEN PD = 0: GOSUB 2450:K = 1
  304. 3040  IF K = 0  THEN  VTAB 13: CALL  -868: FOR I = 1 TO 20: NEXT : GOTO 2990
  305. 3050 BS =  PEEK(115) +256 * PEEK(116):BA = BS -256 *(1 + INT((L -1)/256)): HIMEM: BA: REM  PRODOS LIKES EVEN PAGES
  306. 3060 F$ = F$ +"": REM  RESET OLD STRINGS
  307. 3070 A$ = ""
  308. 3080 D$ =  CHR$(4)
  309. 3090 AD = 0:AM% = 0:B% = 0:BH% = 0:BL% = 0:CT = 0:CZ = 0:EF = 0:F1 = 0:F2 = 0:I = 0:IC = 0:J = 0:K = 0:MN = 0:PC = 0:PI = 0:PN = 0:RI = 0:RL = 0
  310. 3100 NL$ = "":AF$ = NL$:CM$ = ",":DS$ = "$":EF$ = NL$:F2$ = NL$:FD$ = NL$:IX$ = ",X)":IY$ = "),Y":LB$ = "L":LP$ = "(":LX$ = "X":LY$ = "Y":M1$ = "?REF":M2$ = "?DEF":NU$ = "#":RE$ = NL$:RP$ = ")":RS$ = NL$:SP$ = " "
  311. 3110 RL =  INT(( FRE(0) -1000)/2)
  312. 3120 RL = RL -(1150 *PD): IF RL <1  THEN  PRINT : PRINT "NOT ENOUGH MEMORY": GOTO 3820: REM  PRODOS NEEDS ONE PAGE FOR STRINGS AND 2K FOR FILES
  313. 3130  IF RL >L  THEN RL = L
  314. 3140  DIM R%(RL)
  315. 3150  DIM FL%(3),NB$(15),MN$(56),P$(39),XC%(255),AM$(13),PS$(2)
  316. 3160  HOME : VTAB 8: PRINT "RATIO OF PROGRAM LENGTH TO LABELS: "; INT(L/RL *10 +0.5)/10: PRINT : PRINT 
  317. 3170  IF L/RL <4  THEN 3200
  318. 3180  PRINT "SINCE THE PROGRAM BEING DISASSEMBLED IS": PRINT "LARGE, THERE MAY NOT BE ENOUGH MEMORY.": PRINT : PRINT "THIS CAN BE AVOIDED BY SECTIONING THE": PRINT "TARGET PROGRAM INTO 2 OR MORE PIECES.": PRINT 
  319. 3190  VTAB 22: PRINT "BINARY FILE SHOULD STILL BE IN DRIVE ";DA
  320. 3200  PRINT "<ESC> TO QUIT --- ANY OTHER KEY TO CONT";: GET A$: PRINT A$: IF  ASC(A$) = 27  THEN  GOTO 3820
  321. 3210 A$ =  CHR$(91)
  322. 3220 EC = 5: ONERR  GOTO 3840
  323. 3230 BA = BA +1024 *PD: REM  PRODOS WANTS 1K ABOVE HIMEM LEFT OPEN
  324. 3240  PRINT D$"BLOAD "F$",A";BA;",D";DA
  325. 3250  POKE 216,0
  326. 3260 F$ =  LEFT$(F$,10)
  327. 3270  HOME 
  328. 3280  VTAB 5: HTAB 5
  329. 3290  PRINT "WHICH ASSEMBLER DO YOU USE?": PRINT 
  330. 3300  HTAB 10: INVERSE : PRINT "T";: NORMAL : PRINT "OOLKIT ASSEMBLER (APPLE)": PRINT 
  331. 3310  HTAB 10: INVERSE : PRINT "B";: NORMAL : PRINT "ASIC ASSEMBLER (NIBBLE)": PRINT 
  332. 3320  HTAB 10: INVERSE : PRINT "O";: NORMAL : PRINT "THER": PRINT 
  333. 3330  HTAB 5: PRINT "PLEASE ENTER (T/B/O)";: GET A$: PRINT A$
  334. 3340  RESTORE :K = 0
  335. 3350  IF A$ = "T"  THEN  GOSUB 2650:K = 1
  336. 3360  GOSUB 2770
  337. 3370  IF A$ = "B"  THEN  GOSUB 2650:K = 1
  338. 3380  GOSUB 2770
  339. 3390  IF A$ = "O"  THEN  GOSUB 2650:K = 1
  340. 3400  IF K = 0  THEN  VTAB 13: CALL  -868: FOR I = 1 TO 20: NEXT : GOTO 3330
  341. 3410  IF FL%(0) = 99  THEN  VTAB 15: PRINT "FLAGS FOR OTHER ASSEMBLER OPTION HAVE": PRINT "NOT BEEN SET.  SEEN LINE # 3870.": PRINT "<RESET> TO EXIT":K = 0: GOTO 3400
  342. 3420  HOME : VTAB 5: PRINT "TYPE A LETTER TO BE USED WITH LABELS";: GET A$: PRINT A$
  343. 3430  IF A$ < > CHR$(13)  THEN LB$ = A$: IF  ASC(LB$) <65  OR  ASC(LB$) >90  THEN  PRINT "*** MUST BE A LETTER ***":LB$ = "L": FOR I = 1 TO 1000: NEXT : GOTO 3420
  344. 3440  VTAB 19: PRINT "PLACE A DISK IN DRIVE #";DN;" WITH PLENTY OF": PRINT "SPACE TO RECEIVE DISASSEMBLER OUTPUT.": PRINT 
  345. 3450  PRINT "IF 'BASIC.DISAS.AUX' IS NOT ON DISK IN": PRINT "DRIVE #1 THEN YOU WILL BE PROMPTED": PRINT "BEFORE 'FILE CLEAN UP' STEP.";
  346. 3460  HTAB 1: VTAB 10: PRINT "TYPE <ESC> TO SKIP FINAL FILE CLEAN UP": PRINT "TYPE <RETURN> TO CONTINUE ";: GET A$: PRINT A$: IF A$ =  CHR$(27)  THEN F1 = 1
  347. 3470  FOR I = 0 TO 255: READ XC%(I): NEXT 
  348. 3480  FOR I = 0 TO 15: READ NB$(I): NEXT 
  349. 3490  FOR I = 1 TO 56: READ MN$(I): NEXT :MN$(0) = PS$(0)
  350. 3500  FOR I = 0 TO 13: READ AM$(I): NEXT 
  351. 3510  GOSUB 1310: REM  FIRST PASS
  352. 3520  GOSUB 1430: REM  SECOND PASS
  353. 3530 PI = 0:PN = 0
  354. 3540  ON EF GOTO 3580,3570,3560
  355. 3550  GOTO 3600
  356. 3560  GOSUB 950
  357. 3570  GOSUB 950
  358. 3580 P$(PI) = EF$:PI = PI +1:PN = PN + LEN(EF$)
  359. 3590 F2$ = ".TEMP": GOSUB 490
  360. 3600  POKE 216,0
  361. 3610  PRINT : PRINT D$"CLOSE"
  362. 3620  REM  CLEAN UP
  363. 3630 PI = 768:K = 0
  364. 3640  POKE PI,DN: REM  PASS INFO TO AUX ON PAGE THREE
  365. 3650  POKE PI +1, LEN(F$)
  366. 3660  FOR I = 1 TO  LEN(F$)
  367. 3670 J =  ASC( MID$ (F$,I,1))
  368. 3680  POKE PI +1 +I,J
  369. 3690 K = K +J: REM  SUM USED TO CHECK DATA VALIDITY
  370. 3700  NEXT I
  371. 3710  POKE PI +2 +I, INT(K/256)
  372. 3720  POKE PI +1 +I,K -256 *( INT(K/256))
  373. 3730  HIMEM: BS
  374. 3740  HOME 
  375. 3750  IF F1 = 1  THEN  VTAB 6: PRINT F$".TEMP AND"
  376. 3760  VTAB 5: PRINT "DISASSEMBLED LISTING CAN BE FOUND IN": VTAB 7: PRINT F$".TEXT": PRINT : PRINT 
  377. 3770  IF CT >0  THEN  PRINT : PRINT "THERE WERE ";CT;" ILLEGAL": PRINT "REFERENCES WITHIN THE RANGE OF THE": PRINT "PROGRAM.  THEY ARE LISTED AS 'EQU' STMT"
  378. 3780  IF CZ >0  THEN  PRINT : PRINT "THERE WERE ";CZ;" TWO BYTE": PRINT "REFERENCES TO PAGE ZERO.  CHECK LISTING": PRINT "FOR MESSAGES"
  379. 3790 A$ =  CHR$(92)
  380. 3800 EC = 6: ON ER GOTO 3840
  381. 3810  IF F1 = 0  THEN  PRINT D$"RUN BASIC.DISAS.AUX,D1"
  382. 3820  POKE 34,0: POKE 216,0: IF BS < >0  THEN  HIMEM: BS
  383. 3830  END 
  384. 3840 E =  PEEK(222):EL =  PEEK(218) +256 * PEEK(219): POKE 216,0: CALL  -3288
  385. 3850  HOME : VTAB 12: IF E = 4  THEN  PRINT "DISK IS WRITE PROTECTED": GOTO 3900
  386. 3860  IF E = 6  THEN  PRINT "FILE: "F$: PRINT "WAS NOT FOUND.": GOTO 3900
  387. 3870  IF E = 8  THEN  PRINT "I/O ERROR--CHECK DRIVE DOOR.": GOTO 3900
  388. 3880  IF E = 13  THEN  PRINT "FILE TYPE MISMATCH.": GOTO 3900
  389. 3890  PRINT "ERROR #"E: PRINT "IN LINE "EL".": PRINT "PRESS SPACE BAR TO CONTINUE";: GET A$: PRINT : GOTO 2830
  390. 3900  VTAB 22: HTAB 1: PRINT "PRESS <RETURN> TO CONTINUE.";: GET Z$: POKE 49168,0: PRINT : HOME : PRINT  CHR$(4);"CLOSE"
  391. 3910  ON EC GOTO 400,490,2260,2870,3220,3800
  392. 3920  REM  DATA STATEMENTS
  393. 3930  DATA  0,0,0,0," ","A","",0,0,0,"DFB","EQU","ORG"
  394. 3940  DATA  1,9,13,29,"","","EOF",2,34,34,"DFB","EQU","ORG"
  395. 3950  DATA  99,0,0,0,"","","",0,0,0,"","",""
  396. 3960  REM  NEXT 16 ARE FOR 256 XC%
  397. 3970  DATA  111,835,0,0,0,535,503,0,137,335,203,0,0,1035,1003,0
  398. 3980  DATA  410,935,0,0,0,635,603,0,114,1235,0,0,0,1135,1103,0
  399. 3990  DATA  1029,802,0,0,507,502,540,0,139,302,240,0,1007,1002,1040,0
  400. 4000  DATA  408,902,0,0,0,602,640,0,145,1202,0,0,0,1102,1140,0
  401. 4010  DATA  142,824,0,0,0,524,533,0,136,324,233,0,1028,1024,1033,0
  402. 4020  DATA  412,924,0,0,0,624,633,0,116,1224,0,0,0,1124,1133,0
  403. 4030  DATA  143,801,0,0,0,501,541,0,138,301,241,0,1328,1001,1041,0
  404. 4040  DATA  413,901,0,0,0,601,0,0,147,1201,0,0,0,1101,0,0
  405. 4050  DATA  0,848,0,0,550,548,549,0,123,0,154,0,1050,1048,1049,0
  406. 4060  DATA  404,948,0,0,650,648,749,0,156,1248,155,0,0,1148,0,0
  407. 4070  DATA  332,830,331,0,532,530,531,0,152,330,151,0,1032,1030,1031,0
  408. 4080  DATA  405,930,0,0,632,630,731,0,117,1230,153,0,1132,1130,1231,0
  409. 4090  DATA  320,818,0,0,520,518,521,0,127,318,122,0,1020,1018,1021,0
  410. 4100  DATA  409,918,0,0,0,618,621,0,115,1218,0,0,0,1118,1121,0
  411. 4110  DATA  319,844,0,0,519,544,525,0,126,344,134,0,1019,1044,1025,0
  412. 4120  DATA  406,944,0,0,0,644,625,0,146,1244,0,0,0,1144,1125,0
  413. 4130  DATA  0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
  414. 4140  DATA  ADC,AND,ASL,BCC,BCS,BEQ,BIT,BMI,BNE,BPL,BRK,BVC,BVS,CLC,CLD,CLI,CLV,CMP,CPX,CPY,DEC,DEX,DEY,EOR,INC,INX,INY,JMP,JSR,LDA,LDX,LDY,LSR,NOP,ORA,PHA,PHP,PLA,PLP,ROL,ROR,RTI,RTS,SBC,SEC,SED,SEI,STA,STX,STY,TAX,TAY,TSX,TXA,TXS,TYA
  415. 4150  DATA  UND,IMP,ACC,IMM,REL,Z-P,ZPX,ZPY,I-X,I-Y,ABS,ABX,ABY,IND