home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / MBUG / MBUG182.ARC / DISASSEM.BAS < prev    next >
BASIC Source File  |  1979-12-31  |  16KB  |  505 lines

  1. 10000 ' Z-80 Dissassembler
  2. 10010 ' Based on disassembler on page 42
  3. 10020 ' of Dr. Dobbs Journal number 26
  4. 10030 '
  5. 10040 DEFINT A-Z
  6. 10050 '
  7. 10060 ' Convert letter to upper case
  8. 10070 DEF FNUPPER$(CC$)=CHR$(ASC(CC$)+(CC$>="a" AND CC$<="z")*32)
  9. 10080 '
  10. 10090 DIM B(6),BB(12),BIT(7),REG$(7),RP$(3),AI$(7)
  11. 10100 DIM JR$(7),CC$(7),C1$(7),C3$(7),C5$(7)
  12. 10110 DIM O7$(7),O2$(7),CB$(3),RT$(7),ED$(7)
  13. 10120 DIM CP$(7),TS(80)
  14. 10130 '
  15. 10140 RECLN=128
  16. 10150 ON ERROR GOTO 14950
  17. 10160 '
  18. 10170 GOSUB 14350: 'initialize arrays and constants
  19. 10180 GOSUB 14630
  20. 10190 PRINT CS$;: GOSUB 14010
  21. 10200 PRINT "Z-80 Disassembler"
  22. 10210 RESET
  23. 10220 PRINT
  24. 10230 LINE INPUT "File name? ",S$: IF S$="" THEN END
  25. 10240 FILE$=""
  26. 10250 FOR I=1 TO LEN(S$): FILE$=FILE$+FNUPPER$(MID$(S$,I,1)): NEXT I
  27. 10260 N=INSTR(FILE$,".")
  28. 10270 IF N THEN FLNAME$=LEFT$(FILE$,N-1) ELSE FLNAME$=FILE$
  29. 10280 IF N=0 THEN FILE$=FILE$+".COM"
  30. 10290 FILEERR=FALSE
  31. 10300 OPEN "I",#1,FILE$
  32. 10310 IF FILEERR THEN 10230
  33. 10320 CLOSE#1
  34. 10330 OPEN "R",#1,FILE$,RECLN
  35. 10340 FIELD#1,128 AS INREC$
  36. 10350 LINE INPUT "Address of start of file? ",S$
  37. 10360 IF S$="" THEN ASTRT!=&H100
  38. 10370 IF S$<>"" THEN GOSUB 14450: ASTRT!=T!: IF BAD THEN 10350
  39. 10380 LINE INPUT "Start address? ",S$
  40. 10390 IF S$="" THEN T!=ASTRT!
  41. 10400 IF S$<>"" THEN GOSUB 14450: IF BAD THEN 10380
  42. 10410 IF T!<ASTRT! THEN 10380
  43. 10420 PC!=T!
  44. 10430 LINE INPUT "End   address? ",S$
  45. 10440 IF S$="" THEN PE!=1E+10: GOTO 10470
  46. 10450 GOSUB 14450: IF BAD THEN 10380
  47. 10460 PE!=T!
  48. 10470 INPUT "Output file( *=LST, **=CON)? ",S$
  49. 10480 IF S$="*" THEN OUTOPT=1: GOTO 10580
  50. 10490 IF S$="**" THEN OUTOPT=2: GOTO 10580
  51. 10500 IF S$="" THEN S$=FLNAME$
  52. 10510 OUTOPT=3
  53. 10520 FILE$=""
  54. 10530 FOR I=1 TO LEN(S$)
  55. 10540   FILE$=FILE$+FNUPPER$(MID$(S$,I,1))
  56. 10550 NEXT I
  57. 10560 IF INSTR(FILE$,".")=0 THEN FILE$=FILE$+".ASM"
  58. 10570 OPEN "O",#2,FILE$
  59. 10580 DL!=1E+10: DH!=1E+10
  60. 10590 LINE INPUT "DEFB Control file (Y OR N)? ",C$
  61. 10600 IF C$="" THEN 10710
  62. 10610 IF FNUPPER$(C$)<>"Y" THEN 10710
  63. 10620 FILE$=FLNAME$+".CTL"
  64. 10630 FILEERR=FALSE
  65. 10640 OPEN "I",#3,FILE$
  66. 10650 IF NOT FILEERR THEN 10690
  67. 10660 INPUT "Continue without control file? ",C$
  68. 10670 IF C$="" THEN 10210
  69. 10680 IF FNUPPER$(C$)<>"Y" THEN 10210 ELSE 10740
  70. 10690 DL!=-1: DH!=-1
  71. 10700 '
  72. 10710 PRINT: PRINT
  73. 10720 '
  74. 10730 ' initialize input file
  75. 10740 N=INT((PC!-ASTRT!)/RECLN): RECPT=PC!-ASTRT!-RECLN*N
  76. 10750 GET#1,N+1
  77. 10760 IF EOF(1) THEN 11380
  78. 10770 ENDFILE=FALSE: NBB=0
  79. 10780 '
  80. 10790 ' put org statement
  81. 10800 DLINE$=SPACE$(7)+"ORG"+SPACE$(5)
  82. 10810 X!=PC!
  83. 10820 GOSUB 12600
  84. 10830 GOSUB 11340
  85. 10840 '
  86. 10850 ' Main loop
  87. 10860 NB=0: BADOP=FALSE
  88. 10870 WHILE PC!>DH!
  89. 10880   IF EOF(3) THEN DL!=1E+10: DH!=1E+10: GOTO 11010
  90. 10890   LINE INPUT#3,DLINE$
  91. 10900   C$=DLINE$: GOSUB 14820
  92. 10910   I=INSTR(C$," "): IF I=0 THEN GOSUB 14890: GOTO 11010
  93. 10920   S$=LEFT$(C$,I-1): C$=RIGHT$(C$,LEN(C$)-I): GOSUB 14450
  94. 10930   IF BAD THEN GOSUB 14890: GOTO 11010
  95. 10940   DL!=T!
  96. 10950   GOSUB 14820
  97. 10960   I=INSTR(C$," "): IF I THEN C$=LEFT$(C$,I-1)
  98. 10970   S$=C$: GOSUB 14450
  99. 10980   IF BAD THEN GOSUB 14890: GOTO 11010
  100. 10990   IF T!<DL! THEN GOSUB 14890: GOTO 11010
  101. 11000   DH!=T!
  102. 11010 WEND
  103. 11020 HOLDPC!=PC!
  104. 11030 IF PC!>=DL! THEN 11120
  105. 11040 DLINE$=SPACE$(7)
  106. 11050 GOSUB 12310: OP=X!
  107. 11060 GOSUB 11490
  108. 11070 IF ENDFILE AND NOT NB THEN 11300
  109. 11080 IF NOT BADOP THEN 11140
  110. 11090 FOR NB=NB TO 1 STEP -1
  111. 11100   NBB=NBB+1: BB(NBB)=B(NB): PC!=PC!-1
  112. 11110 NEXT NB
  113. 11120 BADOP=FALSE: GOSUB 11410
  114. 11130 IF BADOP THEN 11300
  115. 11140 TB=32: GOSUB 14590: DLINE$=DLINE$+";"
  116. 11150 X!=HOLDPC!: GOSUB 12630: DLINE$=DLINE$+" "
  117. 11160 FOR I=1 TO NB
  118. 11170   X!=B(I)
  119. 11180   DLINE$=DLINE$+" "
  120. 11190   GOSUB 12480
  121. 11200 NEXT I
  122. 11210 TB=52: GOSUB 14590
  123. 11220 FOR I=1 TO NB
  124. 11230   C$=".": IF B(I)>=32 AND B(I)<127 THEN C$=CHR$(B(I))
  125. 11240   IF B(I)>=160 AND B(I)<255 THEN C$=CHR$(B(I))
  126. 11250   DLINE$=DLINE$+C$
  127. 11260 NEXT I
  128. 11270 GOSUB 11340
  129. 11280 IF PC!<PE! THEN 10860
  130. 11290 '
  131. 11300 RESET
  132. 11310 GOTO 10210
  133. 11320 '
  134. 11330 ' output line
  135. 11340 ON OUTOPT GOTO 11350,11360,11370
  136. 11350 LPRINT DLINE$: GOTO 11380
  137. 11360 PRINT DLINE$: GOTO 11380
  138. 11370 S$=DLINE$: GOSUB 14690: PRINT#2,DLINE$
  139. 11380 RETURN
  140. 11390 '
  141. 11400 ' Generate a defb
  142. 11410 DLINE$=SPACE$(7)+"DEFB"+SPACE$(4)
  143. 11420 GOSUB 12310: GOSUB 12450
  144. 11430 RETURN
  145. 11440 '
  146. 11450 ' Separate parts of op code
  147. 11460 L=OP\BIT(6): M=OP\BIT(3) AND 7: K=OP AND 7: RETURN
  148. 11470 '
  149. 11480 ' Disassemble one op
  150. 11490 GOSUB 11460: ON L GOTO 11890,11950,11970
  151. 11500 ON K GOTO 11580,11660,11740,11800,11800,11840,11880
  152. 11510 IF M=1 THEN S$="EX AF,AF'"
  153. 11520 IF M=0 THEN S$="NOP"
  154. 11530 IF M=1 OR M=0 THEN 12690
  155. 11540 S$=JR$(M): GOSUB 12690: GOSUB 12770
  156. 11550 GOSUB 12310: IF X!>127 THEN X!=X!-256
  157. 11560 X!=PC!+X!: GOSUB 12600: RETURN
  158. 11570 '
  159. 11580 K=M\BIT(1)
  160. 11590 IF OP AND BIT(3) THEN 11640
  161. 11600 S$="LD ": GOSUB 12690:
  162. 11610 S$=RP$(K): GOSUB 12690
  163. 11620 S$=",": GOSUB 12690
  164. 11630 GOSUB 12540: RETURN
  165. 11640 S$="ADD HL,": GOSUB 12690
  166. 11650 S$=RP$(K): GOTO 12690
  167. 11660 S$=O2$(M): GOSUB 12690
  168. 11670 IF M<4 THEN RETURN
  169. 11680 GOSUB 12770: GOSUB 12510: GOSUB 12570
  170. 11690 IF M=4 THEN S$=",HL": GOSUB 12690
  171. 11700 IF M=6 THEN S$=",A": GOSUB 12690
  172. 11710 RETURN
  173. 11720 GOSUB 12540: RETURN
  174. 11730 '
  175. 11740 K=M\BIT(1)
  176. 11750 M=M AND BIT(0)
  177. 11760 IF M=0 THEN S$="INC "
  178. 11770 IF M=1 THEN S$="DEC "
  179. 11780 GOSUB 12690
  180. 11790 S$=RP$(K): GOTO 12690
  181. 11800 IF K=4 THEN S$="INC "
  182. 11810 IF K=5 THEN S$="DEC "
  183. 11820 GOSUB 12690
  184. 11830 S$=REG$(M): GOTO 12690
  185. 11840 S$="LD ": GOSUB 12690
  186. 11850 S$=REG$(M): GOSUB 12690
  187. 11860 S$=",": GOSUB 12690
  188. 11870 GOSUB 12490: RETURN
  189. 11880 S$=O7$(M): GOTO 12690
  190. 11890 IF M=6 AND K=6 THEN 11940
  191. 11900 S$="LD ": GOSUB 12690
  192. 11910 S$=REG$(M): GOSUB 12690
  193. 11920 S$=",": GOSUB 12690
  194. 11930 S$=REG$(K): GOTO 12690
  195. 11940 S$="HLT": GOTO 12690
  196. 11950 S$=AI$(M): GOSUB 12690
  197. 11960 GOSUB 12770: GOTO 11930
  198. 11970 ON K GOTO 12000,12010,12080,12020,12180,12260,12280
  199. 11980 S$="RET ": GOSUB 12690
  200. 11990 S$=CC$(M): GOTO 12690
  201. 12000 S$=C1$(M): GOTO 12690
  202. 12010 S$="JP ": GOTO 12030
  203. 12020 S$="CALL ":
  204. 12030 GOSUB 12690
  205. 12040 S$=CC$(M): GOSUB 12690
  206. 12050 S$=",": GOSUB 12690
  207. 12060 GOSUB 12540
  208. 12070 RETURN
  209. 12080 IF M=1 THEN 12790
  210. 12090 S$=C3$(M): IF S$="???" THEN BADOP=TRUE: RETURN
  211. 12100 GOSUB 12690
  212. 12110 IF M=0 THEN 12140
  213. 12120 IF M=2 OR M=3 THEN 12150
  214. 12130 RETURN
  215. 12140 GOSUB 12770:GOSUB 12540: RETURN
  216. 12150 GOSUB 12770: GOSUB 12310: GOSUB 12420
  217. 12160 IF M=2 THEN S$=",A": GOSUB 12690
  218. 12170 RETURN
  219. 12180 IF M=5 THEN 12900
  220. 12190 IF M=3 THEN I$="IX"
  221. 12200 IF M=7 THEN I$="IY"
  222. 12210 IF M=3 OR M=7 THEN 13320
  223. 12220 S$=C5$(M): IF S$="???" THEN BADOP=TRUE: RETURN
  224. 12230 GOSUB 12690
  225. 12240 IF M<>1 THEN RETURN
  226. 12250 GOSUB 12770: GOSUB 12540: RETURN
  227. 12260 S$=AI$(M): GOSUB 12690: GOSUB 12770
  228. 12270 GOSUB 12490: RETURN
  229. 12280 S$="RST ": GOSUB 12690
  230. 12290 X!=8*M: GOSUB 12450
  231. 12300 RETURN
  232. 12310 IF NBB THEN X!=BB(NBB): NBB=NBB-1: PC!=PC!+1: RETURN
  233. 12320 IF ENDFILE THEN BADOP=TRUE: X!=0: RETURN
  234. 12330 RECPT=RECPT+1: IF RECPT<=RECLN THEN 12370
  235. 12340 GET#1
  236. 12350 IF EOF(1) THEN X!=0: ENDFILE=TRUE: RETURN
  237. 12360 RECPT=1
  238. 12370 X!=ASC(MID$(INREC$,RECPT,1)): PC!=PC!+1
  239. 12380 NB=NB+1: B(NB)=X!
  240. 12390 RETURN
  241. 12400 '
  242. 12410 ' Insert (1 byte hex)
  243. 12420 DLINE$=DLINE$+"(": GOSUB 12450: DLINE$=DLINE$+")": RETURN
  244. 12430 '
  245. 12440 ' Insert a 1 byte hex constant in assembly
  246. 12450 DLINE$=DLINE$+"0": GOSUB 12480: DLINE$=DLINE$+"H": RETURN
  247. 12460 '
  248. 12470 ' Insert a one byte hex number
  249. 12480 DLINE$=DLINE$+RIGHT$("0"+HEX$(X!),2): RETURN
  250. 12490 GOSUB 12310: GOSUB 12450: RETURN
  251. 12500 '
  252. 12510 GOSUB 12310: XL=X!
  253. 12520 GOSUB 12310: XH=X!
  254. 12530 X!=XL+256*XH: RETURN
  255. 12540 GOSUB 12510: GOSUB 12600: RETURN
  256. 12550 '
  257. 12560 ' Insert (hex)
  258. 12570 DLINE$=DLINE$+"(": GOSUB 12600: DLINE$=DLINE$+")": RETURN
  259. 12580 '
  260. 12590 ' Insert a 2 byte hex constant in assembly
  261. 12600 DLINE$=DLINE$+"0": GOSUB 12630: DLINE$=DLINE$+"H": RETURN
  262. 12610 '
  263. 12620 ' Insert a 2 byte hex number
  264. 12630 DLINE$=DLINE$+RIGHT$("000"+HEX$(X!),4): RETURN
  265. 12640 '
  266. 12650 ' Insert (alpha)
  267. 12660 DLINE$=DLINE$+"(": GOSUB 12690: DLINE$=DLINE$+")": RETURN
  268. 12670 '
  269. 12680 ' Add code to line
  270. 12690 FOR I=1 TO LEN(S$)
  271. 12700   C$=MID$(S$,I,1)
  272. 12710   IF C$=" " THEN GOSUB 12770: GOTO 12730
  273. 12720   DLINE$=DLINE$+C$
  274. 12730 NEXT I
  275. 12740 RETURN
  276. 12750 '
  277. 12760 ' Start operand field
  278. 12770 TB=16: GOSUB 14590: RETURN
  279. 12780 '
  280. 12790 GOSUB 12310: OP=X!
  281. 12800 L=OP\BIT(6)
  282. 12810 M=(OP\BIT(3)) AND 7
  283. 12820 K=OP AND 7
  284. 12830 IF L=0 THEN 12870
  285. 12840 S$=CB$(L): GOSUB 12690: GOSUB 12770
  286. 12850 S$=CHR$(48+M): GOSUB 12690: S$=",": GOSUB 12690
  287. 12860 S$=REG$(K): GOTO 12690
  288. 12870 S$=RT$(M): IF S$="???" THEN BADOP=TRUE: RETURN
  289. 12880 GOSUB 12690
  290. 12890 S$=REG$(K): GOTO 12690
  291. 12900 GOSUB 12310: OP=X!
  292. 12910 L=OP\BIT(6): M=(OP\BIT(3)) AND 7: K=OP AND 7
  293. 12920 ON L GOTO 12940,13300,12930
  294. 12930 BADOP=TRUE: RETURN
  295. 12940 ON K GOTO 12970,12990,13040,13150,13180,13230,13280
  296. 12950 S$="IN": GOSUB 12690
  297. 12960 S$=REG$(M): GOSUB 12690: S$=",(C)": GOTO 12690
  298. 12970 S$="OUT (C),": GOSUB 12690
  299. 12980 S$=REG$(M): GOTO 12690
  300. 12990 K=M\BIT(1): M=M AND BIT(0)
  301. 13000 IF M=1 THEN S$="ADC HL,"
  302. 13010 IF M=0 THEN S$="SBC HL,"
  303. 13020 GOSUB 12690
  304. 13030 S$=RP$(K): GOTO 12690
  305. 13040 K=M\BIT(1): M=M AND BIT(0)
  306. 13050 S$="LD ": GOSUB 12690
  307. 13060 IF M=1 THEN 13110
  308. 13070 GOSUB 12510: GOSUB 12570
  309. 13080 S$=",": GOSUB 12690
  310. 13090 S$=RP$(K): GOSUB 12690
  311. 13100 RETURN
  312. 13110 S$=RP$(K): GOSUB 12690
  313. 13120 S$=",": GOSUB 12690
  314. 13130 GOSUB 12510: GOSUB 12570
  315. 13140 RETURN
  316. 13150 IF M=0 THEN 13170
  317. 13160 BADOP=TRUE: RETURN
  318. 13170 S$="NEG": GOTO 12690
  319. 13180 IF M<=1 THEN 13200
  320. 13190 GOTO 13160
  321. 13200 IF M=1 THEN S$="RETI"
  322. 13210 IF M=0 THEN S$="RETN"
  323. 13220 GOTO 12690
  324. 13230 IF M=1 OR M>3 THEN BADOP=TRUE: RETURN
  325. 13240 IF M=0 THEN S$="IM0"
  326. 13250 IF M=2 THEN S$="IM1"
  327. 13260 IF M=3 THEN S$="IM2"
  328. 13270 GOTO 12690
  329. 13280 S$=ED$(M): IF S$="???" THEN BADOP=TRUE: RETURN
  330. 13290 GOTO 12690
  331. 13300 S$=CP$(K)+CP$(M): IF S$="OUTIR" THEN S$="OTIR
  332. 13310 GOTO 12690
  333. 13320 GOSUB 12310: OP=X!
  334. 13330 IF OP=203 THEN 13870
  335. 13340 L=OP\BIT(6): M=(OP\BIT(3)) AND 7
  336. 13350 K=OP AND 7
  337. 13360 ON L GOTO 13650,13710,13740
  338. 13370 ON K GOTO 13390,13480,13530,13560,13560,13620
  339. 13380 S$="==": GOTO 12690
  340. 13390 IF M=4 THEN 13460
  341. 13400 K=M\BIT(1): M=M AND BIT(0)
  342. 13410 S$="ADD ": GOSUB 12690: S$=I$: GOSUB 12690
  343. 13420 S$=",": GOSUB 12690
  344. 13430 IF K=2 THEN 13450
  345. 13440 S$=RP$(K): GOTO 12690
  346. 13450 S$=I$: GOTO 12690
  347. 13460 S$="LD ": GOSUB 12690: S$=I$: GOSUB 12690
  348. 13470 S$=",": GOSUB 12690: GOSUB 12510: GOSUB 12600: RETURN
  349. 13480 IF M=4 THEN 13510
  350. 13490 S$="LD ": GOSUB 12690: S$=I$: GOSUB 12690
  351. 13500 S$=",": GOSUB 12690: GOSUB 12510: GOSUB 12570: RETURN
  352. 13510 S$="LD ": GOSUB 12690: GOSUB 12510: GOSUB 12570: S$=",": GOSUB 12690
  353. 13520 S$=I$: GOTO 12690
  354. 13530 IF M=4 THEN S$="INC "
  355. 13540 IF M=5 THEN S$="DEC "
  356. 13550 GOSUB 12690: S$=I$: GOTO 12690
  357. 13560 IF K=4 THEN S$="INC "
  358. 13570 IF K=5 THEN S$="DEC "
  359. 13580 GOSUB 12690
  360. 13590 S$="(": GOSUB 12690: S$=I$: GOSUB 12690
  361. 13600 S$="+": GOSUB 12690: GOSUB 12310: GOSUB 12450
  362. 13610 S$=")": GOTO 12690
  363. 13620 IF M<>6 THEN 13380
  364. 13630 S$="LD ": GOSUB 13580: S$=",": GOSUB 12690
  365. 13640 GOSUB 12310: GOSUB 12450: RETURN
  366. 13650 S$="LD "
  367. 13660 IF K=6 THEN 13690
  368. 13670 GOSUB 13580: S$=",": GOSUB 12690
  369. 13680 S$=REG$(K): GOTO 12690
  370. 13690 GOSUB 12690: S$=REG$(M): GOSUB 12690: S$=","
  371. 13700 GOSUB 13580:RETURN
  372. 13710 IF K<>6 THEN 13730
  373. 13720 S$=AI$(M): GOSUB 13580: RETURN
  374. 13730 BADOP=TRUE: RETURN
  375. 13740 IF M<>4 THEN 13820
  376. 13750 ON K GOTO 13770,13760,13780,13760,13800,13760,13760
  377. 13760 BADOP=TRUE: RETURN
  378. 13770 S$="POP ": GOTO 13810
  379. 13780 S$="EX (SP),": GOTO 13810
  380. 13790 S$="LD SP,": GOTO 13810
  381. 13800 S$="PUSH "
  382. 13810 GOSUB 12690: S$=I$: GOTO 12690
  383. 13820 IF M<>5 THEN 13860
  384. 13830 IF K<>1 THEN 13760
  385. 13840 S$="JP ": S$="(" GOSUB 12690:
  386. 13850 S$=D$: GOSUB 12690: S$=")": GOSUB 12690: RETURN
  387. 13860 IF M=7 AND K=1 THEN 13790
  388. 13870 GOSUB 12310: D=X!
  389. 13880 GOSUB 12310: OP=X!
  390. 13890 GOSUB 11460
  391. 13900 IF L>0 THEN 13960
  392. 13910 IF K<>6 THEN 13760
  393. 13920 S$=RT$(M): IF S$="???" THEN BADOP=TRUE: RETURN
  394. 13930 GOSUB 12760: GOSUB 12690: GOSUB 12770
  395. 13940 S$="("+I$+"+": GOSUB 12690
  396. 13950 X!=D: GOSUB 12450: S$=")": GOSUB 12690: RETURN
  397. 13960 S$=CB$(L): GOSUB 12690
  398. 13970 S$=CHR$(48+M): GOSUB 12690
  399. 13980 S$=",": GOSUB 12690: GOTO 13940
  400. 13990 '
  401. 14000 ' initialize tables
  402. 14010 FOR I=0 TO 7: READ BIT(I): NEXT I
  403. 14020 DATA 1,2,4,8,16,32,64,128
  404. 14030 FOR I=0 TO 7: READ REG$(I): NEXT I
  405. 14040 DATA B,C,D,E,H,L,(HL),A
  406. 14050 FOR I=0 TO 3: READ RP$(I): NEXT I
  407. 14060 DATA BC,DE,HL,SP
  408. 14070 FOR I=0 TO 7: READ AI$(I): NEXT I
  409. 14080 DATA ADD,"ADC A,",SUB,"SBC A,",AND,XOR,OR,CP
  410. 14090 FOR I=2 TO 7: READ JR$(I): NEXT I
  411. 14100 DATA DJNZ,JR,"JR NZ,","JR Z,","JR NC,","JR C,"
  412. 14110 FOR I=0 TO 7: READ CC$(I): NEXT I
  413. 14120 DATA NZ,Z,NC,C,PO,PE,P,M
  414. 14130 FOR I=0 TO 7: READ C1$(I): NEXT I
  415. 14140 DATA POP BC,RET,POP DE,EXX,POP HL,JP (HL),POP AF,"LD SP,HL"
  416. 14150 FOR I=0 TO 7: READ C3$(I): NEXT I
  417. 14160 DATA JP,???,OUT,"IN A,","EX (SP),HL","EX DE,HL",DI,EI
  418. 14170 FOR I=0 TO 7: READ C5$(I): NEXT I
  419. 14180 DATA PUSH BC,CALL,PUSH DE,???,PUSH HL,???,PUSH AF,???
  420. 14190 FOR I=0 TO 7: READ O7$(I): NEXT I
  421. 14200 DATA RLCA,RRCA,RLA,RRA,DAA,CPL,SCF,CCF
  422. 14210 FOR I=0 TO 7: READ O2$(I): NEXT I
  423. 14220 DATA "LD (BC),A","LD A,(BC)"
  424. 14230 DATA "LD (DE),A","LD A,(DE)"
  425. 14240 DATA LD,"LD HL,",LD,"LD A,"
  426. 14250 FOR I=1 TO 3: READ CB$(I): NEXT I
  427. 14260 DATA BIT,RES,SET
  428. 14270 FOR I=0 TO 7: READ RT$(I): NEXT I
  429. 14280 DATA RLC,RRC,RAL,RAR,SLA,SRA,???,SRL
  430. 14290 FOR I=0 TO 7: READ ED$(I): NEXT I
  431. 14300 DATA "LD I,A","LD R,A"
  432. 14310 DATA "LD A,I","LD A,R",RRD,RLD,???,???
  433. 14320 FOR I=0 TO 7: READ CP$(I): NEXT I
  434. 14330 DATA LD,CP,IN,OUT,I,D,IR,DR
  435. 14340 TRUE=-1: FALSE=0: RETURN
  436. 14350 TS=2: TD=3: KB=2: SB=2
  437. 14360 BS$=CHR$(8)
  438. 14370 HT$=CHR$(9)
  439. 14380 ES$=CHR$(27)
  440. 14390 CS$=CHR$(26)+ES$+"S"+CHR$(0)+CHR$(32)
  441. 14400 EL$=ES$+"R"
  442. 14410 CR$=CHR$(13)
  443. 14420 RETURN
  444. 14430 '
  445. 14440 ' Convert input hex
  446. 14450 IF LEN(S$)=0 OR LEN(S$)>4 THEN BAD = -1: RETURN
  447. 14460 T!=0
  448. 14470 FOR II=1 TO LEN(S$)
  449. 14480   CC$=MID$(S$,II,1)
  450. 14490   IF CC$>="0" AND CC$<="9" THEN D=ASC(CC$)-ASC("0"): GOTO 14530
  451. 14500   IF CC$>="A" AND CC$<="F" THEN D=10+ASC(CC$)-ASC("A"): GOTO 14530
  452. 14510   IF CC$>="a" AND CC$<="f" THEN D=10+ASC(CC$)-ASC("a"): GOTO 14530
  453. 14520   BAD=-1: RETURN
  454. 14530   T!=D+16*T!
  455. 14540 NEXT II
  456. 14550 BAD=0
  457. 14560 RETURN
  458. 14570 '
  459. 14580 ' Tab line to field
  460. 14590 IF LEN(DLINE$)<TB-1 THEN DLINE$=DLINE$+SPACE$(TB-1-LEN(DLINE$))
  461. 14600 RETURN
  462. 14610 '
  463. 14620 ' Setab
  464. 14630 FOR II=1 TO 80
  465. 14640   TS(II)=(II MOD 8=0)
  466. 14650 NEXT II
  467. 14660 RETURN
  468. 14670 '
  469. 14680 ' Entab
  470. 14690 DLINE$="": BCNT=0: POSN=0
  471. 14700 FOR II=1 TO LEN(S$)
  472. 14710   POSN=POSN+1
  473. 14720   IF POSN>80 THEN 14740
  474. 14730   IF BCNT THEN IF TS(POSN) THEN DLINE$=DLINE$+HT$: BCNT=0
  475. 14740   C$=MID$(S$,II,1)
  476. 14750   IF C$=" " THEN BCNT=BCNT+1: GOTO 14780
  477. 14760   DLINE$=DLINE$+SPACE$(BCNT)+C$
  478. 14770   BCNT=0
  479. 14780 NEXT II
  480. 14790 RETURN
  481. 14800 '
  482. 14810 ' Remove leading blanks
  483. 14820 FOR II=1 TO LEN(C$)
  484. 14830   IF MID$(C$,II,1)<>" " THEN C$=RIGHT$(C$,LEN(C$)-II+1): RETURN
  485. 14840 NEXT II
  486. 14850 C$=""
  487. 14860 RETURN
  488. 14870 '
  489. 14880 ' Error on ctl file
  490. 14890 PRINT "Invalid ctl record:"
  491. 14900 PRINT DLINE$
  492. 14910 PRINT
  493. 14920 RETURN
  494. 14930 '
  495. 14940 ' error handling
  496. 14950 IF ERR<>53 THEN 14990
  497. 14960 FILEERR=TRUE
  498. 14970 PRINT "File not found"
  499. 14980 RESUME NEXT
  500. 14990 IF ERR<>64 THEN 15030
  501. 15000 FILEERR=TRUE
  502. 15010 PRINT "Invalid file name"
  503. 15020 RESUME NEXT
  504. 15030 ON ERROR GOTO 0
  505.