Advertisement
nowhereman999

QB64 CoCo3 Sprite Compiler V1.00

Aug 26th, 2017
501
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 113.08 KB | None | 0 0
  1. DIM array(50000) AS _UNSIGNED _BYTE, sp(100, 100), calc(100, 100), comp(100), hx$(100, 100), t$(100), tw$(100), junk$(100), jc(100), pre$(100, 3)
  2.  
  3. check = 0
  4. WIDTH 80, 50
  5. proname$ = "cmpblsp": v$ = "1.00"
  6. 'width below is the number of bytes for the width of the sprite
  7. FI = 0: osw = 0: osh = 0: ow = 0: oh = 0: w = 0: h = 0: sw = 320: comment = 0: cyc = 0:: rv = 0: rest$ = "": autocenter = 0
  8. count = _COMMANDCOUNT
  9. IF count > 2 THEN GOTO 2
  10. 1 PRINT proname$; " V"; v$; " by Glen Hewlett"
  11. PRINT "Creates a compiled & blasted sprite in 6809 assembly language from a binary file"
  12. PRINT "The sprite data must be for a 16 colour screen."
  13. PRINT "Usage: "; proname$; " -wX -hY [-oswX -oshY -owX -ohY -aa] [as] [-ac] [-odd] [-sX]"
  14. PRINT " [-rXXXX] [-rvX] [-nSubroutine] [-c] [cyc] [-done] spritename"
  15. PRINT "Where: -w - X is the width in bytes for the width of the sprite"
  16. PRINT " -h - Y is the number of rows for the height of the sprite"
  17. PRINT " -osw - Offset used - width in bytes of the entire data file"
  18. PRINT " -osh - Offset used - height of the entire data file"
  19. PRINT " -ow - X offset, from the left side to where the sprite data starts"
  20. PRINT " -oh - Y offset, from the top row to where the sprite data starts"
  21. PRINT " -aa - Autocenter point is the middle of the entire data file"
  22. PRINT " -as - Autocenter, usually the top left corner of the sprite is used as"
  23. PRINT " the starting point of the sprite, this makes it the middle"
  24. PRINT " -odd - Also make an odd version of the sprite, by shifting the data one"
  25. PRINT " nibble to the right, outputs a seperate _odd.asm file"
  26. PRINT " -s - Sets the screen width the sprite will be used with"
  27. PRINT " (usually 256 or 320) defaults to 320"
  28. PRINT " -r - Creates a restore sprite that loads the data behind the sprite"
  29. PRINT " from address offset XXXX which is a 4 digit hex number"
  30. PRINT " -rv - Creates a restore sprite that stores the value X which is a hex"
  31. PRINT " value between 0 to F. This value is substituted wherever any"
  32. PRINT " non Zero byte is in the sprite data. This is useful if the"
  33. PRINT " background behind your sprite is always a known palette, such"
  34. PRINT " as black. This is faster then having to load the background."
  35. PRINT " -n - Name of the subroutine that is created, if not used the routine"
  36. PRINT " name created will be _spritename:"
  37. PRINT " -c - Add comments that shows the values of the registers"
  38. PRINT " -cyc - Add cycle count instructions for lwasm"
  39. PRINT " -done - When the program is complete it wont wait for you to press a key"
  40. PRINT " The program will exit and close this window (useful for scripts)"
  41. PRINT " sprite This is the name of the sprite to compile"
  42. PRINT " Output name will be sprite with .asm extension added"
  43. PRINT
  44. PRINT "A few notes on compiling sprites:"
  45. PRINT "- The Sprite must use palette 0 for transparency."
  46. PRINT "- Sprites are more efficient on a 256 pixel wide screen. Since pointers will"
  47. PRINT " then be less then 128 which means shorter pointers (-128 to 127)"
  48. PRINT "- If possible use palette 15 (0xF) for the edge/border of your sprite character"
  49. PRINT " compiling 0x0F or 0xF0 doesn't need to use an AND instruction."
  50. PRINT "Example:"
  51. PRINT "./cmpblsp -osw40 -osh57 -ow13 -oh20 -w10 -h19 -odd -s256 -c -done 000016.bin"
  52. PRINT "Will convert the data in file 000016.bin to a compiled/blasted .asm sprite where"
  53. PRINT "the entire width of the data file is 40 bytes and the entire height is 57 rows."
  54. PRINT "The sprite data starts at byte 13 from the left edge and is 10 bytes wide."
  55. PRINT "The sprite data starts at row 20 and the sprite is 19 rows high."
  56. PRINT "Make an odd version of the sprite too, the sprite will be used on a 256 pixel"
  57. PRINT "wide screen. Add comments to the .asm file and when done close the window."
  58. END
  59.  
  60. 2 nt = 0: newp = 0: endp = 0: odd = 0: dn = 0: subname$ = ""
  61. FOR check = 1 TO count
  62. N$ = COMMAND$(check)
  63. IF LCASE$(LEFT$(N$, 2)) = "-w" THEN w = VAL(RIGHT$(N$, LEN(N$) - 2)): GOTO 4
  64. IF LCASE$(LEFT$(N$, 2)) = "-h" THEN h = VAL(RIGHT$(N$, LEN(N$) - 2)): GOTO 4
  65. IF LCASE$(LEFT$(N$, 4)) = "-osw" THEN osw = VAL(RIGHT$(N$, LEN(N$) - 4)): GOTO 4
  66. IF LCASE$(LEFT$(N$, 4)) = "-osh" THEN osh = VAL(RIGHT$(N$, LEN(N$) - 4)): GOTO 4
  67. IF LCASE$(LEFT$(N$, 3)) = "-ow" THEN ow = VAL(RIGHT$(N$, LEN(N$) - 3)): GOTO 4
  68. IF LCASE$(LEFT$(N$, 3)) = "-oh" THEN oh = VAL(RIGHT$(N$, LEN(N$) - 3)): GOTO 4
  69. IF LCASE$(LEFT$(N$, 4)) = "-odd" THEN odd = 1: GOTO 4
  70. IF LCASE$(LEFT$(N$, 2)) = "-s" THEN sw = VAL(RIGHT$(N$, LEN(N$) - 2)): GOTO 4
  71. IF LCASE$(LEFT$(N$, 5)) = "-done" THEN dn = 1: GOTO 4
  72. IF LCASE$(LEFT$(N$, 3)) = "-rv" THEN rv = 1: rest$ = UCASE$(RIGHT$(N$, LEN(N$) - 3)): rest$ = rest$ + rest$: GOTO 4
  73. IF LCASE$(LEFT$(N$, 2)) = "-r" THEN r = 1: rest$ = UCASE$(RIGHT$(N$, LEN(N$) - 2)): GOTO 4
  74. IF LCASE$(LEFT$(N$, 2)) = "-n" THEN subname$ = RIGHT$(N$, LEN(N$) - 2): GOTO 4
  75. IF LCASE$(LEFT$(N$, 4)) = "-cyc" THEN cyc = 1: GOTO 4
  76. IF LCASE$(LEFT$(N$, 2)) = "-c" THEN comment = 1: GOTO 4
  77. IF LCASE$(LEFT$(N$, 3)) = "-aa" THEN autocenter = 1: GOTO 4
  78. IF LCASE$(LEFT$(N$, 3)) = "-as" THEN autocenter = 2: GOTO 4
  79. 'check if we got a file name yet if so then error
  80. IF FI > 0 THEN 1
  81. FI = 1
  82. Basename$ = N$
  83. IF _FILEEXISTS(Basename$) THEN
  84. OPEN Basename$ FOR APPEND AS #1
  85. length = LOF(1)
  86. CLOSE #1
  87. ELSE
  88. PRINT "Error file: "; Basename$; " Doesn't exits.": GOTO 1
  89. END IF
  90. IF length < 1 THEN PRINT "Error file: "; Basename$; " is 0 bytes.": GOTO 1
  91. PRINT "Length of Input file "; Basename$; " is:"; length
  92. OPEN Basename$ FOR BINARY AS #1
  93. GET #1, , array()
  94. CLOSE #1
  95. 4 NEXT check
  96. 5 Fname$ = Basename$ + ".asm"
  97. 6 IF w = 0 OR h = 0 THEN PRINT "No width or Height info": GOTO 1
  98. count = 0
  99. 'PRINT osw, osh, ow, oh
  100. IF osw > 0 AND osh = 0 THEN PRINT "Need both offset size width and height": GOTO 1
  101. IF osh > 0 AND osw = 0 THEN PRINT "Need both offset size width and height": GOTO 1
  102. IF ow > osw OR oh > osh THEN PRINT "Sprite Offset is bigger then the size of the entire data file": GOTO 1
  103. IF ow + w > osw OR oh + h > osh THEN PRINT "Sprite Offset and the size of the sprite is bigger then the size of the entire data file": GOTO 1
  104. PRINT: PRINT "Output filename is: "; Fname$
  105.  
  106. sw = INT(sw / 2)
  107. sw$ = RIGHT$(STR$(sw), LEN(STR$(sw)) - 1)
  108. mr = 0: md = 0: mv = 0
  109. IF autocenter = 1 THEN 'use the entire bitmap center point
  110. middle = INT(osw / 2)
  111. mr = w - (ow + w - middle)
  112. mr = mr - 4
  113. middle = INT(osh / 2)
  114. md = h - (oh + h - middle)
  115. md = md + 1
  116. mr = -mr
  117. md = -md * sw
  118. mv = mr + md
  119. END IF
  120. IF autocenter = 2 THEN
  121. mr = INT(w / 2) - 2 'use the center of the sprite itself
  122. md = INT(h / 2)
  123. mr = -mr
  124. md = -md * sw
  125. mv = mr + md
  126. END IF
  127. count = 0
  128. IF osw > 0 THEN
  129. FOR t1 = 1 TO oh
  130. FOR t2 = 1 TO osw
  131. count = count + 1
  132. NEXT t2
  133. NEXT t1
  134. FOR y = 1 TO h
  135. FOR t1 = 1 TO ow
  136. count = count + 1
  137. NEXT t1
  138. FOR x = 1 TO w
  139. sp(x, y) = array(count)
  140. count = count + 1
  141. NEXT x
  142. FOR t1 = ow + w TO osw - 1
  143. count = count + 1
  144. NEXT t1
  145. NEXT y
  146. ELSE
  147. FOR y = 1 TO h
  148. FOR x = 1 TO w
  149. sp(x, y) = array(count)
  150. count = count + 1
  151. NEXT x, y
  152. END IF
  153. FOR y = 1 TO h
  154. FOR x = 1 TO w
  155. IF sp(x, y) > 15 THEN
  156. hx$(x, y) = HEX$(sp(x, y))
  157. ELSE
  158. hx$(x, y) = "0" + HEX$(sp(x, y))
  159. END IF
  160. NEXT x
  161. NEXT y
  162. check = 0
  163. IF subname$ <> "" THEN sn$ = subname$
  164. GOSUB 50
  165. IF rv = 1 OR rest$ <> "" THEN
  166. PRINT "Generating a Restore Sprite."
  167. FOR y = 1 TO h
  168. FOR x = 1 TO w
  169. IF sp(x, y) > 15 THEN
  170. hx$(x, y) = HEX$(sp(x, y))
  171. ELSE
  172. hx$(x, y) = "0" + HEX$(sp(x, y))
  173. END IF
  174. NEXT x
  175. NEXT y
  176. IF rv = 1 THEN
  177. GOSUB 2000
  178. ELSE
  179. rest$ = "$" + rest$ + ",U"
  180. GOSUB 1000
  181. END IF
  182. END IF
  183. CLOSE #1
  184.  
  185. ' added an option to make odd version of sprite too, which shifts the data one nibble to the right
  186. IF odd = 1 THEN
  187. FOR y = 1 TO h
  188. FOR x = w TO 2 STEP -1
  189. tl = sp(x - 1, y): tr = sp(x, y)
  190. tr = INT(tr / 16)
  191. t = INT(tl / 16) * 16
  192. t = tl - t
  193. t = t * 16
  194. tr = tr + t
  195. sp(x, y) = tr
  196. NEXT x
  197. tr = sp(1, y)
  198. tr = INT(tr / 16)
  199. sp(1, y) = tr
  200. NEXT y
  201. FOR y = 1 TO h
  202. FOR x = 1 TO w
  203. IF sp(x, y) > 15 THEN
  204. hx$(x, y) = HEX$(sp(x, y))
  205. ELSE
  206. hx$(x, y) = "0" + HEX$(sp(x, y))
  207. END IF
  208. NEXT x
  209. NEXT y
  210. PRINT: PRINT "-odd option was selected."
  211. PRINT "Also creating another sprite with the data shifted to the right one nibble"
  212. Fname$ = Basename$ + "_Odd.asm"
  213. PRINT "Output filename is: "; Fname$
  214. IF subname$ <> "" THEN
  215. IF RIGHT$(subname$, 1) = ":" THEN sn$ = LEFT$(subname$, LEN(subname$) - 1) + "_Odd:"
  216. ELSE
  217. sn$ = subname$ + "_Odd"
  218. END IF
  219. GOSUB 50
  220. IF rv = 1 OR rest$ <> "" THEN
  221. PRINT "Generating a Restore Sprite."
  222. FOR y = 1 TO h
  223. FOR x = 1 TO w
  224. IF sp(x, y) > 15 THEN
  225. hx$(x, y) = HEX$(sp(x, y))
  226. ELSE
  227. hx$(x, y) = "0" + HEX$(sp(x, y))
  228. END IF
  229. NEXT x
  230. NEXT y
  231. IF rv = 1 THEN
  232. GOSUB 2000
  233. ELSE
  234. GOSUB 1000
  235. END IF
  236. END IF
  237. CLOSE #1
  238. END IF
  239. PRINT "Done."
  240. IF dn = 1 THEN SYSTEM
  241. END
  242.  
  243. 10 precount = precount + 1
  244. pt$ = ""
  245. FOR p = 1 TO LEN(p2$)
  246. IF MID$(p2$, p, 1) <> " " THEN pt$ = pt$ + MID$(p2$, p, 1)
  247. NEXT p
  248. pre$(precount, 1) = p1$: pre$(precount, 2) = pt$
  249. IF LEN(pt$) = 5 THEN
  250. IF RIGHT$(pt$, 2) = ",U" THEN
  251. tl = VAL(LEFT$(pt$, 3))
  252. pre$(precount, 0) = "Check"
  253. END IF
  254. END IF
  255. IF comment = 1 THEN
  256. pre$(precount, 3) = LEFT$(" ", 12 - LEN(pre$(precount, 2)))
  257. pre$(precount, 3) = pre$(precount, 3) + " * A=" + a$ + ", B=" + b$ + ", X=" + x$ + ", Y=" + y$
  258. END IF
  259. RETURN
  260.  
  261. ' Analyze row and see if it can be optimized even more
  262. 15 FOR p = 1 TO precount
  263. IF LEFT$(pre$(p, 1), 3) = "AND" THEN
  264. IF pre$(p + 1, 2) = "#$F0" OR pre$(p + 1, 2) = "#$0F" THEN GOTO 17
  265. END IF
  266. IF LEN(pre$(p, 1)) = 3 THEN pre$(p, 1) = pre$(p, 1) + " "
  267. p$ = " " + pre$(p, 1) + " " + pre$(p, 2) + pre$(p, 3)
  268. PRINT #1, p$
  269. pre$(p, 0) = ""
  270. 17 NEXT p
  271. precount = 0
  272. RETURN
  273.  
  274. ' sort list of words in tw$() with count entries and arrange them from least used to most used
  275. 20 FOR s = 1 TO count
  276. junk$(s) = tw$(s)
  277. NEXT s
  278. FOR s = 1 TO count - 1
  279. jc(s) = 1
  280. temp$ = junk$(s)
  281. IF temp$ = "XXXX" THEN
  282. jc(s) = 0
  283. ELSE
  284. FOR n = s + 1 TO count
  285. IF temp$ = junk$(n) THEN junk$(n) = "XXXX": jc(s) = jc(s) + 1
  286. NEXT n
  287. END IF
  288. NEXT s
  289. IF junk$(count) = "XXXX" OR junk$(count) = "XX" THEN
  290. jc(count) = 0
  291. ELSE
  292. jc(count) = 1
  293. END IF
  294. newcount = 0
  295. FOR s = count TO 1 STEP -1
  296. FOR n = 1 TO count
  297. IF jc(n) = s THEN
  298. newcount = newcount + 1: tw$(newcount) = junk$(n)
  299. END IF
  300. NEXT n
  301. NEXT s
  302. RETURN
  303.  
  304. 45 PRINT #1, "* ";
  305. FOR k = 1 TO w
  306. PRINT #1, hx$(k, yp); " ";
  307. NEXT k
  308. PRINT #1,
  309. RETURN
  310.  
  311. 50 OPEN Fname$ FOR OUTPUT AS #1 ' open sequential file for writing
  312. PRINT #1, "**************************************************"
  313. FOR y = 1 TO h
  314. PRINT #1, "* ";
  315. FOR x = 1 TO w
  316. PRINT #1, hx$(x, y); " ";
  317. NEXT x
  318. PRINT #1, "-"; y
  319. NEXT y
  320. PRINT #1, "**************************************************"
  321. IF subname$ = "" THEN
  322. PRINT #1, "_"; LEFT$(Fname$, LEN(Fname$) - 4); ":"
  323. ELSE
  324. PRINT #1, sn$
  325. END IF
  326. IF cyc = 1 THEN
  327. PRINT #1, " opt c "
  328. PRINT #1, " opt ct"
  329. PRINT #1, " opt cd"
  330. PRINT #1, " opt cc"
  331. END IF
  332. ' position the starting point
  333. fb = w
  334. yp = h
  335. xp = w
  336. FOR y = 1 TO h
  337. FOR x = 1 TO w
  338. bcode = 0
  339. byte = sp(x, y)
  340. IF byte = 0 THEN GOTO 120
  341. bcode = 1
  342. IF byte < 16 THEN bcode = 2
  343. IF byte = (byte AND 240) THEN bcode = 3
  344. 120 calc(x, y) = bcode
  345. NEXT x
  346. NEXT y
  347.  
  348. 'FOR y = 1 TO h
  349. 'FOR x = 1 TO w
  350. 'PRINT calc(x, y);
  351. 'NEXT x
  352. 'PRINT
  353. 'NEXT y
  354.  
  355. FOR yp = h TO 1 STEP -1
  356. 'fl = 0 then no stack usage, just do load/store on this row
  357. 'fl = 1 then no stack usage, do load/store on this row and the row below it
  358. 'fl = 2 then use stack on this line and do load/store on line below
  359. 'fl = 3 then use stack on this line
  360. 'fl = 4 then skip this row, row above will handle it
  361. 'fl = 5 then ignore this row (no data to process)
  362. fl = 0
  363. FOR x = 1 TO w - 2
  364. IF calc(x, yp) = 1 AND calc(x + 1, yp) = 1 AND calc(x + 2, yp) = 1 THEN fl = 3
  365. IF calc(x, yp) = 2 AND calc(x + 1, yp) = 1 AND calc(x + 2, yp) = 1 THEN fl = 3
  366. IF calc(x, yp) = 3 AND calc(x + 1, yp) = 1 AND calc(x + 2, yp) = 1 THEN fl = 3
  367. NEXT x
  368. IF fl = 3 THEN GOTO 200
  369. FOR x = 1 TO w - 3
  370. IF calc(x, yp) <> 0 AND calc(x + 1, yp) <> 0 AND calc(x + 2, yp) = 1 AND calc(x + 3, yp) = 1 THEN fl = 3
  371. NEXT x
  372. IF fl = 3 THEN GOTO 200
  373. fl = 0
  374. count = 0
  375. FOR x = 1 TO w
  376. count = count + calc(x, yp)
  377. NEXT x
  378. IF count = 0 THEN fl = 5
  379. 200
  380. comp(yp) = fl
  381. NEXT yp
  382.  
  383. y = h
  384. 210
  385. IF comp(y) = 0 AND comp(y - 1) = 0 THEN comp(y) = 4: comp(y - 1) = 1: y = y - 2: GOTO 250
  386. IF comp(y) = 0 AND comp(y - 1) = 3 THEN comp(y) = 4: comp(y - 1) = 2: y = y - 2: GOTO 250
  387. y = y - 1
  388. 250 IF y > 1 THEN 210
  389.  
  390. 'FOR y = 1 TO h
  391. 'PRINT y - 1;
  392. 'PRINT comp(y);
  393. 'FOR x = 1 TO w
  394. 'PRINT calc(x, y);
  395. 'NEXT x
  396. 'PRINT
  397. 'NEXT y
  398.  
  399. yp = h
  400. 280 IF comp(yp) < 4 THEN 300
  401. yp = yp - 1
  402. IF yp > 1 THEN GOTO 280
  403.  
  404. 300 IF comp(yp) > 1 THEN 310
  405. FOR x = w TO 1 STEP -1
  406. IF sp(x, yp) <> 0 THEN xp = x: GOTO 390
  407. NEXT x
  408. PRINT "Error... Should not get here. While finding starting point."
  409. END
  410.  
  411. 310 FOR x = w - 3 TO 1 STEP -1
  412. IF calc(x, yp) = 1 AND calc(x + 1, yp) = 1 AND calc(x + 2, yp) = 1 THEN xp = x + 2: GOTO 390
  413. IF calc(x, yp) = 2 AND calc(x + 1, yp) = 1 AND calc(x + 2, yp) = 1 THEN xp = x + 2: GOTO 390
  414. IF calc(x, yp) = 3 AND calc(x + 1, yp) = 1 AND calc(x + 2, yp) = 1 THEN xp = x + 2: GOTO 390
  415. NEXT x
  416.  
  417. 'Starting location move down from the top left corner
  418. 390 PRINT #1, "* Row"; yp
  419. p1$ = "LEAU": p2$ = sw$ + "*" + STR$(yp - 1) + "+" + STR$(xp) + STR$(mv) + ",U": up = xp: leauFlag = 1
  420. GOSUB 10
  421.  
  422. 395 yp = h: lastrow = yp
  423. a$ = "": b$ = "": x$ = "": y$ = ""
  424. 'yp = the current line to start on
  425. 'comp(yp) tells us how to handle the current row
  426.  
  427. 'fl = 0 then no stack usage, just do load/store on this row
  428. 'fl = 1 then no stack usage, do load/store on this row and the row below it
  429. 'fl = 2 then use stack on this line and do load/store on line below
  430. 'fl = 3 then use stack on this line
  431. 'fl = 4 then skip this row, row above will handle it
  432. 'fl = 5 then ignore this row (no data to process)
  433.  
  434. 'main loop - start of a new row to work on
  435. 400 IF comp(yp) < 4 THEN GOSUB 15: GOTO 410
  436. 405 yp = yp - 1
  437. IF yp > 0 THEN GOTO 400
  438. ' If we get here then we are done.
  439. p1$ = "RTS": p2$ = ""
  440. GOSUB 10: GOSUB 15
  441. RETURN
  442.  
  443.  
  444. 410 IF comp(yp) = 0 THEN 500
  445. 420 IF comp(yp) = 1 THEN 600
  446. 430 IF comp(yp) = 2 THEN 700
  447. 440 IF comp(yp) = 3 THEN 800
  448. PRINT "Error. Stopping, weird 1": END
  449.  
  450.  
  451.  
  452.  
  453. 'fl = then no stack usage, do load/store on this row only
  454. 500 PRINT #1, "* Row"; yp; "500": GOSUB 45
  455. 'PRINT #1, "up="; up
  456. IF leauFlag = 1 THEN leauFlag = 0: GOTO 510
  457. 'Setup U pointer
  458. FOR x = 1 TO w
  459. IF calc(x, yp) > 0 THEN p = x
  460. NEXT x
  461. IF calc(p, yp) > 1 THEN p = p - 1
  462. move = p - up
  463.  
  464. xp = p
  465. up = p
  466. 'PRINT #1, "up="; up
  467. p1$ = "LEAU"
  468. IF move > 0 THEN
  469. p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + "+" + STR$(move) + ",U"
  470. ELSE
  471. IF move < 0 THEN
  472. p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + STR$(move) + ",U"
  473. ELSE
  474. p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + ",U"
  475. END IF
  476. END IF
  477. GOSUB 10
  478.  
  479. x = up + 1
  480. 'PRINT #1, "x="; x; "Calc(x,yp)="; calc(x, yp)
  481. IF calc(x, yp) = 2 THEN
  482. p1$ = "LDA": p2$ = ",U": GOSUB 10
  483. p1$ = "ANDA": p2$ = "#$F0": GOSUB 10
  484. p1$ = "ORA": p2$ = "#$" + hx$(x, yp): GOSUB 10: a$ = "XX"
  485. p1$ = "STA": p2$ = ",U": GOSUB 10
  486. calc(x, yp) = -1
  487. END IF
  488. IF calc(x, yp) = 3 THEN
  489. p1$ = "LDA": p2$ = ",U": GOSUB 10
  490. p1$ = "ANDA": p2$ = "#$0F": GOSUB 10
  491. p1$ = "ORA": p2$ = "#$" + hx$(x, yp): GOSUB 10: a$ = "XX"
  492. p1$ = "STA": p2$ = ",U": GOSUB 10
  493. calc(x, yp) = -1
  494. END IF
  495. 508
  496. FOR x = 1 TO w
  497. IF calc(x, yp + 1) > 0 THEN p2 = x
  498. NEXT x
  499.  
  500.  
  501. 510 a = 0: b = 0: d = 0: x = 0: y = 0
  502. FOR x = 1 TO xp - 1
  503. IF calc(x, yp) = 1 AND calc(x + 1, yp) = 1 THEN
  504. IF hx$(x, yp) + hx$(x + 1, yp) = d$ THEN d = d + 1: hx$(x, yp) = "ud1": hx$(x + 1, yp) = "ud2": calc(x, yp) = -1: calc(x + 1, yp) = -1
  505. IF hx$(x, yp) + hx$(x + 1, yp) = x$ THEN x = x + 1: hx$(x, yp) = "ux1": hx$(x + 1, yp) = "ux2": calc(x, yp) = -1: calc(x + 1, yp) = -1
  506. IF hx$(x, yp) + hx$(x + 1, yp) = y$ THEN y = y + 1: hx$(x, yp) = "uy1": hx$(x + 1, yp) = "uy2": calc(x, yp) = -1: calc(x + 1, yp) = -1
  507. END IF
  508. NEXT x
  509.  
  510. FOR x = 1 TO xp
  511. IF calc(x, yp) = 1 THEN
  512. IF hx$(x, yp) = a$ THEN a = a + 1: hx$(x, yp) = "ua": calc(x, yp) = -1
  513. IF hx$(x, yp) = b$ THEN b = b + 1: hx$(x, yp) = "ub": calc(x, yp) = -1
  514. END IF
  515. NEXT x
  516.  
  517. FOR x = 1 TO xp - 1
  518. IF hx$(x, yp) = "ud1" THEN p1$ = "STD": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  519. IF hx$(x, yp) = "ux1" THEN p1$ = "STX": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  520. IF hx$(x, yp) = "uy1" THEN p1$ = "STY": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  521. NEXT x
  522.  
  523. FOR x = 1 TO xp
  524. IF hx$(x, yp) = "ua" AND calc(x + 1, yp) <> 3 THEN p1$ = "STA": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  525. IF hx$(x, yp) = "ub" AND calc(x - 1, yp) <> 2 THEN p1$ = "STB": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  526. NEXT x
  527.  
  528. found = 0
  529. FOR x = 1 TO xp
  530. IF calc(x, yp) = 2 AND hx$(x + 1, yp) = "ub" THEN
  531. p1$ = "LDA": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  532. p1$ = "ANDA": p2$ = "#$F0": GOSUB 10
  533. p1$ = "ORA": p2$ = "#$" + hx$(x, yp): GOSUB 10: a$ = "XX"
  534. p1$ = "STD": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  535. found = 1
  536. calc(x, yp) = -1
  537. END IF
  538. NEXT x
  539.  
  540. IF found = 0 THEN
  541. FOR x = 1 TO xp
  542. IF hx$(x, yp) = "ua" AND calc(x + 1, yp) = 3 THEN
  543. p1$ = "LDB": p2$ = STR$(x - xp + 1 - 1) + ",U": GOSUB 10
  544. p1$ = "ANDB": p2$ = "#$0F": GOSUB 10
  545. p1$ = "ORB": p2$ = "#$" + hx$(x + 1, yp): GOSUB 10: b$ = "XX"
  546. p1$ = "STD": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  547. found = 1
  548. calc(x + 1, yp) = -1
  549. END IF
  550. NEXT x
  551. END IF
  552. FOR x = 1 TO xp
  553. IF calc(x, yp) = 2 THEN
  554. p1$ = "LDB": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  555. p1$ = "ANDB": p2$ = "#$F0": GOSUB 10
  556. p1$ = "ORB": p2$ = "#$" + hx$(x, yp): GOSUB 10: b$ = "XX"
  557. p1$ = "STB": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  558. calc(x, yp) = -1
  559. END IF
  560. IF calc(x, yp) = 3 THEN
  561. p1$ = "LDB": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  562. p1$ = "ANDB": p2$ = "#$0F": GOSUB 10
  563. p1$ = "ORB": p2$ = "#$" + hx$(x, yp): GOSUB 10: b$ = "XX"
  564. p1$ = "STB": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  565. calc(x, yp) = -1
  566. END IF
  567. NEXT x
  568. 'Check to see if we can use any 16 bit values
  569. count = 0
  570. FOR x = 1 TO xp
  571. IF calc(x, yp) = 1 AND calc(x + 1, yp) = 1 THEN count = count + 1: tw$(count) = hx$(x, yp) + hx$(x + 1, yp): wordp(count) = x: x = x + 1
  572. NEXT x
  573. IF count > 1 THEN
  574. GOSUB 20
  575. IF newcount > 1 THEN
  576. FOR x = 1 TO newcount
  577. p1$ = "LDD": p2$ = "#$" + tw$(x): GOSUB 10
  578. a$ = LEFT$(tw$(x), 2): b$ = RIGHT$(tw$(x), 2)
  579. FOR n = 1 TO xp
  580. IF tw$(x) = hx$(n, yp) + hx$(n + 1, yp) THEN
  581. p1$ = "STD": p2$ = STR$(n - xp - 1) + ",U": GOSUB 10
  582. hx$(n, yp) = "ud1": hx$(n + 1, yp) = "ud2"
  583. calc(n, yp) = -1: calc(n + 1, yp) = -1: n = n + 1
  584. END IF
  585. NEXT n
  586. NEXT x
  587. ELSE
  588. count = 1
  589. END IF
  590. END IF
  591. IF count = 1 THEN
  592. x = count
  593. p1$ = "LDD": p2$ = "#$" + tw$(x): GOSUB 10
  594. a$ = LEFT$(tw$(x), 2): b$ = RIGHT$(tw$(x), 2)
  595. FOR n = 1 TO xp
  596. IF tw$(x) = hx$(n, yp) + hx$(n + 1, yp) THEN
  597. p1$ = "STD": p2$ = STR$(n - xp - 1) + ",U": GOSUB 10
  598. hx$(n, yp) = "ud1": hx$(n + 1, yp) = "ud2"
  599. calc(n, yp) = -1: calc(n + 1, yp) = -1: n = n + 1
  600. END IF
  601. NEXT n
  602. END IF
  603.  
  604. 'Check if we can use A or B with the current value
  605. FOR x = 1 TO xp
  606. IF calc(x, yp) = 1 THEN
  607. IF a$ = hx$(x, yp) THEN
  608. hx$(x, yp) = "ua": calc(x, yp) = -1
  609. p1$ = "STA": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  610. END IF
  611. IF b$ = hx$(x, yp) THEN
  612. hx$(x, yp) = "ub": calc(x, yp) = -1
  613. p1$ = "STB": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  614. END IF
  615. END IF
  616. NEXT x
  617.  
  618. 'Check to see if we can use any 8 bit values (if not then we are done)
  619. count = 0
  620. FOR x = 1 TO xp
  621. IF calc(x, yp) = 1 THEN count = count + 1: tw$(count) = hx$(x, yp): wordp(count) = x
  622. NEXT x
  623. 'PRINT #1, "Count"; count, "newcount"; newcount
  624. IF count > 1 THEN
  625. GOSUB 20
  626. IF newcount > 1 THEN
  627. FOR x = 1 TO newcount
  628. p1$ = "LDB": p2$ = "#$" + tw$(x): GOSUB 10: b$ = tw$(x)
  629. FOR n = 1 TO xp
  630. IF tw$(x) = hx$(n, yp) THEN p1$ = "STB": p2$ = STR$(n - xp - 1) + ",U": GOSUB 10: calc(n, yp) = -1: hx$(n, yp) = "ub"
  631. NEXT n
  632. NEXT x
  633. ELSE
  634. count = 1
  635. END IF
  636. END IF
  637. IF count = 1 THEN
  638. x = count
  639. p1$ = "LDB": p2$ = "#$" + tw$(x): GOSUB 10: b$ = tw$(x)
  640. FOR n = 1 TO xp
  641. IF tw$(x) = hx$(n, yp) THEN p1$ = "STB": p2$ = STR$(n - xp - 1) + ",U": GOSUB 10: calc(n, yp) = -1: hx$(n, yp) = "ub"
  642. NEXT n
  643. END IF
  644. lastrow = yp
  645. GOTO 405
  646.  
  647.  
  648. 'fl = 1 then no stack usage, do load/store on this row and the row below it
  649. 600 PRINT #1, "* Row"; yp; "and row"; yp + 1; "600": GOSUB 45: yp = yp + 1: GOSUB 45: yp = yp - 1
  650. 'PRINT #1, "up="; up
  651. IF leauFlag = 1 THEN leauFlag = 0: GOTO 610
  652. 'Setup U pointer
  653. FOR x = 1 TO w
  654. IF calc(x, yp) > 0 THEN p = x
  655. IF calc(x, yp + 1) > 0 THEN p2 = x
  656. NEXT x
  657. IF p2 >= p THEN
  658. p = p2
  659. ELSE
  660. IF calc(p, yp) > 1 THEN p = p - 1
  661. END IF
  662. move = p - up
  663.  
  664. xp = p
  665. up = p
  666. 'PRINT #1, "up="; up
  667. p1$ = "LEAU"
  668. IF move > 0 THEN
  669. p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + "+" + STR$(move) + ",U"
  670. ELSE
  671. IF move < 0 THEN
  672. p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + STR$(move) + ",U"
  673. ELSE
  674. p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + ",U"
  675. END IF
  676. END IF
  677. GOSUB 10
  678.  
  679. x = up + 1
  680. 'PRINT #1, "x="; x; "Calc(x,yp)="; calc(x, yp)
  681. IF calc(x, yp) = 2 THEN
  682. p1$ = "LDA": p2$ = ",U": GOSUB 10
  683. p1$ = "ANDA": p2$ = "#$F0": GOSUB 10
  684. p1$ = "ORA": p2$ = "#$" + hx$(x, yp): GOSUB 10: a$ = "XX"
  685. p1$ = "STA": p2$ = ",U": GOSUB 10
  686. calc(x, yp) = -1
  687. END IF
  688. IF calc(x, yp) = 3 THEN
  689. p1$ = "LDA": p2$ = ",U": GOSUB 10
  690. p1$ = "ANDA": p2$ = "#$0F": GOSUB 10
  691. p1$ = "ORA": p2$ = "#$" + hx$(x, yp): GOSUB 10: a$ = "XX"
  692. p1$ = "STA": p2$ = ",U": GOSUB 10
  693. calc(x, yp) = -1
  694. END IF
  695. 608
  696. FOR x = 1 TO w
  697. IF calc(x, yp + 1) > 0 THEN p2 = x
  698. NEXT x
  699.  
  700.  
  701. 610 a = 0: b = 0: d = 0: x = 0: y = 0
  702. FOR x = 1 TO xp - 1
  703. IF calc(x, yp) = 1 AND calc(x + 1, yp) = 1 THEN
  704. IF hx$(x, yp) + hx$(x + 1, yp) = d$ THEN d = d + 1: hx$(x, yp) = "ud1": hx$(x + 1, yp) = "ud2": calc(x, yp) = -1: calc(x + 1, yp) = -1
  705. IF hx$(x, yp) + hx$(x + 1, yp) = x$ THEN x = x + 1: hx$(x, yp) = "ux1": hx$(x + 1, yp) = "ux2": calc(x, yp) = -1: calc(x + 1, yp) = -1
  706. IF hx$(x, yp) + hx$(x + 1, yp) = y$ THEN y = y + 1: hx$(x, yp) = "uy1": hx$(x + 1, yp) = "uy2": calc(x, yp) = -1: calc(x + 1, yp) = -1
  707. END IF
  708. NEXT x
  709. 'Check row below
  710. FOR x = 1 TO xp - 1
  711. IF calc(x, yp + 1) = 1 AND calc(x + 1, yp + 1) = 1 THEN
  712. IF hx$(x, yp + 1) + hx$(x + 1, yp + 1) = d$ THEN d = d + 1: hx$(x, yp + 1) = "ud1": hx$(x + 1, yp + 1) = "ud2": calc(x, yp + 1) = -1: calc(x + 1, yp + 1) = -1
  713. IF hx$(x, yp + 1) + hx$(x + 1, yp + 1) = x$ THEN x = x + 1: hx$(x, yp + 1) = "ux1": hx$(x + 1, yp + 1) = "ux2": calc(x, yp + 1) = -1: calc(x + 1, yp + 1) = -1
  714. IF hx$(x, yp + 1) + hx$(x + 1, yp + 1) = y$ THEN y = y + 1: hx$(x, yp + 1) = "uy1": hx$(x + 1, yp + 1) = "uy2": calc(x, yp + 1) = -1: calc(x + 1, yp + 1) = -1
  715. END IF
  716. NEXT x
  717.  
  718. FOR x = 1 TO xp
  719. IF calc(x, yp) = 1 THEN
  720. IF hx$(x, yp) = a$ THEN a = a + 1: hx$(x, yp) = "ua": calc(x, yp) = -1
  721. IF hx$(x, yp) = b$ THEN b = b + 1: hx$(x, yp) = "ub": calc(x, yp) = -1
  722. END IF
  723. NEXT x
  724. 'Check row below
  725. FOR x = 1 TO xp
  726. IF calc(x, yp + 1) = 1 THEN
  727. IF hx$(x, yp + 1) = a$ THEN a = a + 1: hx$(x, yp + 1) = "ua": calc(x, yp + 1) = -1
  728. IF hx$(x, yp + 1) = b$ THEN b = b + 1: hx$(x, yp + 1) = "ub": calc(x, yp + 1) = -1
  729. END IF
  730. NEXT x
  731.  
  732. FOR x = 1 TO xp - 1
  733. IF hx$(x, yp) = "ud1" THEN p1$ = "STD": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  734. IF hx$(x, yp) = "ux1" THEN p1$ = "STX": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  735. IF hx$(x, yp) = "uy1" THEN p1$ = "STY": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  736. NEXT x
  737. 'Check and handle row below
  738. FOR x = 1 TO xp - 1
  739. IF hx$(x, yp + 1) = "ud1" THEN p1$ = "STD": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
  740. IF hx$(x, yp + 1) = "ux1" THEN p1$ = "STX": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
  741. IF hx$(x, yp + 1) = "uy1" THEN p1$ = "STY": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
  742. NEXT x
  743.  
  744. FOR x = 1 TO xp
  745. IF hx$(x, yp) = "ua" AND calc(x + 1, yp) <> 3 THEN p1$ = "STA": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  746. IF hx$(x, yp) = "ub" AND calc(x - 1, yp) <> 2 THEN p1$ = "STB": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  747. NEXT x
  748. 'Check and handle row below
  749. FOR x = 1 TO xp
  750. IF hx$(x, yp + 1) = "ua" AND calc(x + 1, yp + 1) <> 3 THEN p1$ = "STA": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
  751. IF hx$(x, yp + 1) = "ub" AND calc(x - 1, yp + 1) <> 2 THEN p1$ = "STB": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
  752. NEXT x
  753.  
  754. found = 0
  755. FOR x = 1 TO xp
  756. IF calc(x, yp) = 2 AND hx$(x + 1, yp) = "ub" THEN
  757. p1$ = "LDA": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  758. p1$ = "ANDA": p2$ = "#$F0": GOSUB 10
  759. p1$ = "ORA": p2$ = "#$" + hx$(x, yp): GOSUB 10: a$ = "XX"
  760. p1$ = "STD": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  761. found = 1
  762. calc(x, yp) = -1
  763. END IF
  764. NEXT x
  765. 'Check row below
  766. FOR x = 1 TO xp
  767. IF calc(x, yp + 1) = 2 AND hx$(x + 1, yp + 1) = "ub" THEN
  768. p1$ = "LDA": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
  769. p1$ = "ANDA": p2$ = "#$F0": GOSUB 10
  770. p1$ = "ORA": p2$ = "#$" + hx$(x, yp + 1): GOSUB 10: a$ = "XX"
  771. p1$ = "STD": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
  772. found = 1
  773. calc(x, yp + 1) = -1
  774. END IF
  775. NEXT x
  776.  
  777. IF found = 0 THEN
  778. FOR x = 1 TO xp
  779. IF hx$(x, yp) = "ua" AND calc(x + 1, yp) = 3 THEN
  780. p1$ = "LDB": p2$ = STR$(x - xp + 1 - 1) + ",U": GOSUB 10
  781. p1$ = "ANDB": p2$ = "#$0F": GOSUB 10
  782. p1$ = "ORB": p2$ = "#$" + hx$(x + 1, yp): GOSUB 10: b$ = "XX"
  783. p1$ = "STD": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  784. found = 1
  785. calc(x + 1, yp) = -1
  786. END IF
  787. NEXT x
  788. 'Check row below
  789. FOR x = 1 TO xp
  790. IF hx$(x, yp + 1) = "ua" AND calc(x + 1, yp + 1) = 3 THEN
  791. p1$ = "LDB": p2$ = STR$(x - xp + sw + 1 - 1) + ",U": GOSUB 10
  792. p1$ = "ANDB": p2$ = "#$0F": GOSUB 10
  793. p1$ = "ORB": p2$ = "#$" + hx$(x + 1, yp + 1): GOSUB 10: b$ = "XX"
  794. p1$ = "STD": p2$ = STR$(x - xp + sw - 1) + ",U": GOSUB 10
  795. found = 1
  796. calc(x + 1, yp + 1) = -1
  797. END IF
  798. NEXT x
  799. END IF
  800. FOR x = 1 TO xp
  801. IF calc(x, yp) = 2 THEN
  802. p1$ = "LDB": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  803. p1$ = "ANDB": p2$ = "#$F0": GOSUB 10
  804. p1$ = "ORB": p2$ = "#$" + hx$(x, yp): GOSUB 10: b$ = "XX"
  805. p1$ = "STB": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  806. calc(x, yp) = -1
  807. END IF
  808. IF calc(x, yp) = 3 THEN
  809. p1$ = "LDB": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  810. p1$ = "ANDB": p2$ = "#$0F": GOSUB 10
  811. p1$ = "ORB": p2$ = "#$" + hx$(x, yp): GOSUB 10: b$ = "XX"
  812. p1$ = "STB": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  813. calc(x, yp) = -1
  814. END IF
  815. 'Check row below
  816. IF calc(x, yp + 1) = 2 THEN
  817. p1$ = "LDB": p2$ = STR$(x - xp + sw - 1) + ",U": GOSUB 10
  818. p1$ = "ANDB": p2$ = "#$F0": GOSUB 10
  819. p1$ = "ORB": p2$ = "#$" + hx$(x, yp + 1): GOSUB 10: b$ = "XX"
  820. p1$ = "STB": p2$ = STR$(x - xp + sw - 1) + ",U": GOSUB 10
  821. calc(x, yp + 1) = -1
  822. END IF
  823. IF calc(x, yp + 1) = 3 THEN
  824. p1$ = "LDB": p2$ = STR$(x - xp + sw - 1) + ",U": GOSUB 10
  825. p1$ = "ANDB": p2$ = "#$0F": GOSUB 10
  826. p1$ = "ORB": p2$ = "#$" + hx$(x, yp + 1): GOSUB 10: b$ = "XX"
  827. p1$ = "STB": p2$ = STR$(x - xp + sw - 1) + ",U": GOSUB 10
  828. calc(x, yp + 1) = -1
  829. END IF
  830. NEXT x
  831. 'Check to see if we can use any 16 bit values
  832. count = 0
  833. FOR x = 1 TO xp
  834. IF calc(x, yp) = 1 AND calc(x + 1, yp) = 1 THEN count = count + 1: tw$(count) = hx$(x, yp) + hx$(x + 1, yp): wordp(count) = x: x = x + 1
  835. 'Check row below
  836. IF calc(x, yp + 1) = 1 AND calc(x + 1, yp + 1) = 1 THEN count = count + 1: tw$(count) = hx$(x, yp + 1) + hx$(x + 1, yp + 1): wordp(count) = x: x = x + 1
  837. NEXT x
  838. IF count > 1 THEN
  839. GOSUB 20
  840. IF newcount > 1 THEN
  841. FOR x = 1 TO newcount
  842. p1$ = "LDD": p2$ = "#$" + tw$(x): GOSUB 10
  843. a$ = LEFT$(tw$(x), 2): b$ = RIGHT$(tw$(x), 2)
  844. FOR n = 1 TO xp
  845. IF tw$(x) = hx$(n, yp) + hx$(n + 1, yp) THEN
  846. p1$ = "STD": p2$ = STR$(n - xp - 1) + ",U": GOSUB 10
  847. hx$(n, yp) = "ud1": hx$(n + 1, yp) = "ud2"
  848. calc(n, yp) = -1: calc(n + 1, yp) = -1: n = n + 1
  849. END IF
  850. NEXT n
  851. FOR n = 1 TO xp
  852. 'Check row below
  853. IF tw$(x) = hx$(n, yp + 1) + hx$(n + 1, yp + 1) THEN
  854. p1$ = "STD": p2$ = STR$(n - xp + sw - 1) + ",U": GOSUB 10
  855. hx$(n, yp + 1) = "ud1": hx$(n + 1, yp + 1) = "ud2"
  856. calc(n, yp + 1) = -1: calc(n + 1, yp + 1) = -1: n = n + 1
  857. END IF
  858. NEXT n
  859. NEXT x
  860. ELSE
  861. count = 1
  862. END IF
  863. END IF
  864. IF count = 1 THEN
  865. x = count
  866. p1$ = "LDD": p2$ = "#$" + tw$(x): GOSUB 10
  867. a$ = LEFT$(tw$(x), 2): b$ = RIGHT$(tw$(x), 2)
  868. FOR n = 1 TO xp
  869. IF tw$(x) = hx$(n, yp) + hx$(n + 1, yp) THEN
  870. p1$ = "STD": p2$ = STR$(n - xp - 1) + ",U": GOSUB 10
  871. hx$(n, yp) = "ud1": hx$(n + 1, yp) = "ud2"
  872. calc(n, yp) = -1: calc(n + 1, yp) = -1: n = n + 1
  873. END IF
  874. NEXT n
  875. FOR n = 1 TO xp
  876. 'Check row below
  877. IF tw$(x) = hx$(n, yp + 1) + hx$(n + 1, yp + 1) THEN
  878. p1$ = "STD": p2$ = STR$(n - xp + sw - 1) + ",U": GOSUB 10
  879. hx$(n, yp + 1) = "ud1": hx$(n + 1, yp + 1) = "ud2"
  880. calc(n, yp + 1) = -1: calc(n + 1, yp + 1) = -1: n = n + 1
  881. END IF
  882. NEXT n
  883. END IF
  884.  
  885. 'Check if we can use A or B with the current value
  886. FOR x = 1 TO xp
  887. IF calc(x, yp) = 1 THEN
  888. IF a$ = hx$(x, yp) THEN
  889. hx$(x, yp) = "ua": calc(x, yp) = -1
  890. p1$ = "STA": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  891. END IF
  892. IF b$ = hx$(x, yp) THEN
  893. hx$(x, yp) = "ub": calc(x, yp) = -1
  894. p1$ = "STB": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  895. END IF
  896. END IF
  897. 'Check row below
  898. IF calc(x, yp + 1) = 1 THEN
  899. IF a$ = hx$(x, yp + 1) THEN
  900. hx$(x, yp + 1) = "ua": calc(x, yp + 1) = -1
  901. p1$ = "STA": p2$ = STR$(x - xp + sw - 1) + ",U": GOSUB 10
  902. END IF
  903. IF b$ = hx$(x, yp + 1) THEN
  904. hx$(x, yp + 1) = "ub": calc(x, yp + 1) = -1
  905. p1$ = "STB": p2$ = STR$(x - xp + sw - 1) + ",U": GOSUB 10
  906. END IF
  907. END IF
  908. NEXT x
  909.  
  910. 'Check to see if we can use any 8 bit values (if not then we are done)
  911. count = 0
  912. newcount = 0
  913. FOR x = 1 TO xp
  914. IF calc(x, yp) = 1 THEN count = count + 1: tw$(count) = hx$(x, yp): wordp(count) = x
  915. IF calc(x, yp + 1) = 1 THEN count = count + 1: tw$(count) = hx$(x, yp + 1): wordp(count) = x
  916. NEXT x
  917. 'PRINT #1, "Count"; count, "newcount"; newcount
  918. IF count > 1 THEN
  919. GOSUB 20
  920. IF newcount > 1 THEN
  921. FOR x = 1 TO newcount
  922. p1$ = "LDB": p2$ = "#$" + tw$(x): GOSUB 10: b$ = tw$(x)
  923. FOR n = 1 TO xp
  924. IF tw$(x) = hx$(n, yp) THEN p1$ = "STB": p2$ = STR$(n - xp - 1) + ",U": GOSUB 10: calc(n, yp) = -1: hx$(n, yp) = "ub"
  925. 'Check row below
  926. IF tw$(x) = hx$(n, yp + 1) THEN p1$ = "STB": p2$ = STR$(n - xp + sw - 1) + ",U": GOSUB 10: calc(n, yp + 1) = -1: hx$(n, yp + 1) = "ub"
  927. NEXT n
  928. NEXT x
  929. ELSE
  930. count = 1
  931. END IF
  932. END IF
  933. IF count = 1 THEN
  934. x = count
  935. p1$ = "LDB": p2$ = "#$" + tw$(x): GOSUB 10: b$ = tw$(x)
  936. FOR n = 1 TO xp
  937. IF tw$(x) = hx$(n, yp) THEN p1$ = "STB": p2$ = STR$(n - xp - 1) + ",U": GOSUB 10: calc(n, yp) = -1: hx$(n, yp) = "ub"
  938. IF tw$(x) = hx$(n, yp + 1) THEN p1$ = "STB": p2$ = STR$(n - xp + sw - 1) + ",U": GOSUB 10: calc(n, yp + 1) = -1: hx$(n, yp + 1) = "ub"
  939. NEXT n
  940. END IF
  941. lastrow = yp
  942. GOTO 405
  943.  
  944.  
  945.  
  946.  
  947.  
  948.  
  949. 'fl = 2 then use stack on this line and do load/store on line below
  950. 700 PRINT #1, "* Row"; yp; "and row"; yp + 1; "700": GOSUB 45: yp = yp + 1: GOSUB 45: yp = yp - 1
  951. IF leauFlag = 1 THEN leauFlag = 0: x = up + 1: GOTO 704
  952. 'Setup U pointer
  953. FOR x = 1 TO w
  954. IF calc(x, yp) > 0 THEN p = x
  955. NEXT x
  956. FOR x = 1 TO w
  957. IF calc(x, yp + 1) > 0 THEN p2 = x
  958. NEXT x
  959. IF p2 > p THEN p = p2
  960. move = p - up
  961.  
  962. xp = p
  963. up = p
  964. p1$ = "LEAU"
  965. IF move > 0 THEN
  966. p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + "+" + STR$(move) + ",U"
  967. ELSE
  968. IF move < 0 THEN
  969. p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + STR$(move) + ",U"
  970. ELSE
  971. p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + ",U"
  972. END IF
  973. END IF
  974. GOSUB 10
  975.  
  976. x = p + 1
  977. x = x - count
  978. 704
  979. count = -1
  980. 705 IF calc(x, yp) = 2 OR calc(x, yp) = 3 THEN
  981. IF calc(x, yp) = 2 THEN
  982. count = count + 1
  983. p1$ = "LDA"
  984. IF count = 0 THEN
  985. p2$ = ",U"
  986. ELSE
  987. p2$ = STR$(count) + ",U"
  988. END IF
  989. GOSUB 10
  990. p1$ = "ANDA": p2$ = "#$F0": GOSUB 10
  991. p1$ = "ORA": p2$ = "#$" + hx$(x, yp): GOSUB 10: a$ = "XX"
  992. p1$ = "STA"
  993. IF count = 0 THEN
  994. p2$ = ",U"
  995. ELSE
  996. p2$ = STR$(count) + ",U"
  997. END IF
  998. GOSUB 10
  999. calc(x, yp) = -1
  1000. END IF
  1001. IF calc(x, yp) = 3 THEN
  1002. count = count + 1
  1003. p1$ = "LDA"
  1004. IF count = 0 THEN
  1005. p2$ = ",U"
  1006. ELSE
  1007. p2$ = STR$(count) + ",U"
  1008. END IF
  1009. GOSUB 10
  1010. p1$ = "ANDA": p2$ = "#$0F": GOSUB 10
  1011. p1$ = "ORA": p2$ = "#$" + hx$(x, yp): GOSUB 10: a$ = "XX"
  1012. p1$ = "STA"
  1013. IF count = 0 THEN
  1014. p2$ = ",U"
  1015. ELSE
  1016. p2$ = STR$(count) + ",U"
  1017. END IF
  1018. GOSUB 10
  1019. calc(x, yp) = -1
  1020. END IF
  1021. x = x + 1
  1022. ELSE GOTO 708
  1023. END IF
  1024. GOTO 705
  1025. 708
  1026. FOR x = 1 TO w
  1027. IF calc(x, yp + 1) > 0 THEN p2 = x
  1028. NEXT x
  1029.  
  1030. 710 a = 0: b = 0: d = 0: x1 = 0: y = 0
  1031. 'Check row below to see if we can store the value of any registers/accumulators with their current values
  1032. FOR x = 1 TO p2 - 1
  1033. IF calc(x, yp + 1) = 1 AND calc(x + 1, yp + 1) = 1 THEN
  1034. IF hx$(x, yp + 1) + hx$(x + 1, yp + 1) = d$ THEN d = d + 1: hx$(x, yp + 1) = "ud1": hx$(x + 1, yp + 1) = "ud2": calc(x, yp + 1) = -1: calc(x + 1, yp + 1) = -1
  1035. IF hx$(x, yp + 1) + hx$(x + 1, yp + 1) = x$ THEN x1 = x1 + 1: hx$(x, yp + 1) = "ux1": hx$(x + 1, yp + 1) = "ux2": calc(x, yp + 1) = -1: calc(x + 1, yp + 1) = -1
  1036. IF hx$(x, yp + 1) + hx$(x + 1, yp + 1) = y$ THEN y = y + 1: hx$(x, yp + 1) = "uy1": hx$(x + 1, yp + 1) = "uy2": calc(x, yp + 1) = -1: calc(x + 1, yp + 1) = -1
  1037. END IF
  1038. NEXT x
  1039. 'Check row below
  1040. FOR x = 1 TO p2
  1041. IF calc(x, yp + 1) = 1 THEN
  1042. IF hx$(x, yp + 1) = a$ THEN a = a + 1: hx$(x, yp + 1) = "ua": calc(x, yp + 1) = -1
  1043. IF hx$(x, yp + 1) = b$ THEN b = b + 1: hx$(x, yp + 1) = "ub": calc(x, yp + 1) = -1
  1044. END IF
  1045. NEXT x
  1046. 'Check and handle row below
  1047. FOR x = 1 TO p2 - 1
  1048. IF hx$(x, yp + 1) = "ud1" THEN p1$ = "STD": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
  1049. IF hx$(x, yp + 1) = "ux1" THEN p1$ = "STX": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
  1050. IF hx$(x, yp + 1) = "uy1" THEN p1$ = "STY": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
  1051. NEXT x
  1052. 'Check and handle row below
  1053. FOR x = 1 TO p2
  1054. IF hx$(x, yp + 1) = "ua" AND calc(x + 1, yp + 1) <> 3 THEN p1$ = "STA": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
  1055. IF hx$(x, yp + 1) = "ub" AND calc(x - 1, yp + 1) <> 2 THEN p1$ = "STB": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
  1056. NEXT x
  1057.  
  1058. 'See if we can stack blast with the current values in D (A or B) ,X or Y
  1059. pflag = 1
  1060. 720 IF pflag = 0 THEN GOTO 750
  1061. pflag = 0
  1062. 725 IF up > 5 THEN
  1063. IF hx$(up - 5, yp) + hx$(up - 4, yp) = d$ AND hx$(up - 3, yp) + hx$(up - 2, yp) = x$ AND hx$(up - 1, yp) + hx$(up, yp) = y$ THEN
  1064. p1$ = "PSHU": p2$ = "D,X,Y": GOSUB 10
  1065. hx$(up - 5, yp) = "ud1": hx$(up - 4, yp) = "ud2": hx$(up - 3, yp) = "ux1": hx$(up - 2, yp) = "ux2": hx$(up - 1, yp) = "uy1": hx$(up, yp) = "uy2"
  1066. calc(up - 5, yp) = -1: calc(up - 4, yp) = -1: calc(up - 3, yp) = -1: calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
  1067. up = up - 6: xp = xp - 6
  1068. pflag = 1
  1069. END IF
  1070. END IF
  1071. IF up > 3 THEN
  1072. IF hx$(up - 3, yp) + hx$(up - 2, yp) = d$ AND hx$(up - 1, yp) + hx$(up, yp) = x$ THEN
  1073. p1$ = "PSHU": p2$ = "D,X": GOSUB 10
  1074. hx$(up - 3, yp) = "ud1": hx$(up - 2, yp) = "ud2": hx$(up - 1, yp) = "ux1": hx$(up, yp) = "ux2"
  1075. calc(up - 3, yp) = -1: calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
  1076. up = up - 4: xp = xp - 4
  1077. pflag = 1
  1078. END IF
  1079. IF hx$(up - 3, yp) + hx$(up - 2, yp) = d$ AND hx$(up - 1, yp) + hx$(up, yp) = y$ THEN
  1080. p1$ = "PSHU": p2$ = "D,Y": GOSUB 10
  1081. hx$(up - 3, yp) = "ud1": hx$(up - 2, yp) = "ud2": hx$(up - 1, yp) = "uy1": hx$(up, yp) = "uy2"
  1082. calc(up - 3, yp) = -1: calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
  1083. up = up - 4: xp = xp - 4
  1084. pflag = 1
  1085. END IF
  1086. IF hx$(up - 3, yp) + hx$(up - 2, yp) = x$ AND hx$(up - 1, yp) + hx$(up, yp) = y$ THEN
  1087. p1$ = "PSHU": p2$ = "X,Y": GOSUB 10
  1088. hx$(up - 3, yp) = "ux1": hx$(up - 2, yp) = "ux2": hx$(up - 1, yp) = "uy1": hx$(up, yp) = "uy2"
  1089. calc(up - 3, yp) = -1: calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
  1090. up = up - 4: xp = xp - 4
  1091. pflag = 1
  1092. END IF
  1093. END IF
  1094. IF up > 2 THEN
  1095. IF hx$(up - 2, yp) = a$ AND hx$(up - 1, yp) + hx$(up, yp) = x$ THEN
  1096. p1$ = "PSHU": p2$ = "A,X": GOSUB 10
  1097. hx$(up - 2, yp) = "ua": hx$(up - 1, yp) = "ux1": hx$(up, yp) = "ux2"
  1098. calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
  1099. up = up - 3: xp = xp - 3
  1100. pflag = 1
  1101. END IF
  1102. IF hx$(up - 2, yp) = a$ AND hx$(up - 1, yp) + hx$(up, yp) = y$ THEN
  1103. p1$ = "PSHU": p2$ = "A,Y": GOSUB 10
  1104. hx$(up - 2, yp) = "ua": hx$(up - 1, yp) = "uy1": hx$(up, yp) = "uy2"
  1105. calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
  1106. up = up - 3: xp = xp - 3
  1107. pflag = 1
  1108. END IF
  1109. END IF
  1110.  
  1111. 'Check if A can be loaded with transparent data and then blast D,X,Y
  1112. IF up > 5 THEN
  1113. IF calc(up - 5, yp) = 2 AND hx$(up - 4, yp) = b$ AND hx$(up - 3, yp) + hx$(up - 2, yp) = x$ AND hx$(up - 1, yp) + hx$(up, yp) = y$ THEN
  1114. p1$ = "LDA": p2$ = STR$(-6) + ",U": GOSUB 10
  1115. p1$ = "ANDA": p2$ = "#$F0": GOSUB 10
  1116. p1$ = "ORA": p2$ = "#$" + hx$(up - 5, yp): GOSUB 10: a$ = "XX"
  1117. p1$ = "PSHU": p2$ = "D,X": GOSUB 10
  1118. hx$(up - 5, yp) = "ud1": hx$(up - 4, yp) = "ud2": hx$(up - 3, yp) = "ux1": hx$(up - 2, yp) = "ux2": hx$(up - 1, yp) = "uy1": hx$(up - 0, yp) = "uy2"
  1119. calc(up - 5, yp) = -1: calc(up - 4, yp) = -1: calc(up - 3, yp) = -1: calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
  1120. up = up - 6: xp = xp - 6
  1121. pflag = 1
  1122. END IF
  1123. END IF
  1124.  
  1125. 'Check if A can be loaded with transparent data and then blast D,X or D,Y
  1126. IF up > 3 THEN
  1127. IF calc(up - 3, yp) = 2 AND hx$(up - 2, yp) = b$ AND hx$(up - 1, yp) + hx$(up, yp) = x$ THEN
  1128. p1$ = "LDA": p2$ = STR$(-4) + ",U": GOSUB 10
  1129. p1$ = "ANDA": p2$ = "#$F0": GOSUB 10
  1130. p1$ = "ORA": p2$ = "#$" + hx$(x, yp): GOSUB 10: a$ = "XX"
  1131. p1$ = "PSHU": p2$ = "D,X": GOSUB 10
  1132. hx$(up - 3, yp) = "ud1": hx$(up - 2, yp) = "ud2": hx$(up - 1, yp) = "ux1": hx$(up, yp) = "ux2"
  1133. calc(up - 3, yp) = -1: calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
  1134. up = up - 4: xp = xp - 4
  1135. pflag = 1
  1136. END IF
  1137. IF calc(up - 3, yp) = 3 AND hx$(up - 2, yp) = b$ AND hx$(up - 1, yp) + hx$(up, yp) = x$ THEN
  1138. p1$ = "LDA": p2$ = STR$(-4) + ",U": GOSUB 10
  1139. p1$ = "ANDA": p2$ = "#$0F": GOSUB 10
  1140. p1$ = "ORA": p2$ = "#$" + hx$(x, yp): GOSUB 10: a$ = "XX"
  1141. p1$ = "PSHU": p2$ = "D,X": GOSUB 10
  1142. hx$(up - 3, yp) = "ud1": hx$(up - 2, yp) = "ud2": hx$(up - 1, yp) = "ux1": hx$(up, yp) = "ux2"
  1143. calc(up - 3, yp) = -1: calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
  1144. up = up - 4: xp = xp - 4
  1145. pflag = 1
  1146. END IF
  1147. IF calc(up - 3, yp) = 2 AND hx$(up - 2, yp) = b$ AND hx$(up - 1, yp) + hx$(up, yp) = y$ THEN
  1148. p1$ = "LDA": p2$ = STR$(-4) + ",U": GOSUB 10
  1149. p1$ = "ANDA": p2$ = "#$F0": GOSUB 10
  1150. p1$ = "ORA": p2$ = "#$" + hx$(x, yp): GOSUB 10: a$ = "XX"
  1151. p1$ = "PSHU": p2$ = "D,Y": GOSUB 10
  1152. hx$(up - 3, yp) = "ud1": hx$(up - 2, yp) = "ud2": hx$(up - 1, yp) = "uy1": hx$(up, yp) = "uy2"
  1153. calc(up - 3, yp) = -1: calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
  1154. up = up - 4: xp = xp - 4
  1155. pflag = 1
  1156. END IF
  1157. IF calc(up - 3, yp) = 3 AND hx$(up - 2, yp) = b$ AND hx$(up - 1, yp) + hx$(up, yp) = y$ THEN
  1158. p1$ = "LDA": p2$ = STR$(-4) + ",U": GOSUB 10
  1159. p1$ = "ANDA": p2$ = "#$0F": GOSUB 10
  1160. p1$ = "ORA": p2$ = "#$" + hx$(x, yp): GOSUB 10: a$ = "XX"
  1161. p1$ = "PSHU": p2$ = "D,Y": GOSUB 10
  1162. hx$(up - 3, yp) = "ud1": hx$(up - 2, yp) = "ud2": hx$(up - 1, yp) = "uy1": hx$(up, yp) = "uy2"
  1163. calc(up - 3, yp) = -1: calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
  1164. up = up - 4: xp = xp - 4
  1165. pflag = 1
  1166. END IF
  1167. END IF
  1168. IF up > 2 THEN
  1169. IF hx$(up - 2, yp) = b$ AND hx$(up - 1, yp) + hx$(up, yp) = x$ THEN
  1170. p1$ = "PSHU": p2$ = "B,X": GOSUB 10
  1171. hx$(up - 2, yp) = "ub": hx$(up - 1, yp) = "ux1": hx$(up, yp) = "ux2"
  1172. calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
  1173. up = up - 3: xp = xp - 3
  1174. pflag = 1
  1175. END IF
  1176. IF hx$(up - 2, yp) = b$ AND hx$(up - 1, yp) + hx$(up, yp) = y$ THEN
  1177. p1$ = "PSHU": p2$ = "B,Y": GOSUB 10
  1178. hx$(up - 2, yp) = "ub": hx$(up - 1, yp) = "uy1": hx$(up, yp) = "uy2"
  1179. calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
  1180. up = up - 3: xp = xp - 3
  1181. pflag = 1
  1182. END IF
  1183. 'Check if we can do transparency nibble then blast B,X or B,Y
  1184. IF calc(up - 2, yp) = 2 AND hx$(up - 1, yp) + hx$(up, yp) = x$ THEN
  1185. p1$ = "LDB": p2$ = STR$(-3) + ",U": GOSUB 10
  1186. p1$ = "ANDB": p2$ = "#$F0": GOSUB 10
  1187. p1$ = "ORB": p2$ = "#$" + hx$(up - 3, yp): GOSUB 10: b$ = "XX"
  1188. p1$ = "PSHU": p2$ = "B,X": GOSUB 10
  1189. hx$(up - 2, yp) = "ub": hx$(up - 1, yp) = "ux1": hx$(up, yp) = "ux2"
  1190. up = up - 3: xp = xp - 3
  1191. pflag = 1
  1192. END IF
  1193. IF calc(up - 2, yp) = 3 AND hx$(up - 1, yp) + hx$(up, yp) = x$ THEN
  1194. p1$ = "LDB": p2$ = STR$(-3) + ",U": GOSUB 10
  1195. p1$ = "ANDB": p2$ = "#$0F": GOSUB 10
  1196. p1$ = "ORB": p2$ = "#$" + hx$(up - 3, yp): GOSUB 10: b$ = "XX"
  1197. p1$ = "PSHU": p2$ = "B,X": GOSUB 10
  1198. hx$(up - 2, yp) = "ub": hx$(up - 1, yp) = "ux1": hx$(up, yp) = "ux2"
  1199. up = up - 3: xp = xp - 3
  1200. pflag = 1
  1201. END IF
  1202. IF calc(up - 2, yp) = 2 AND hx$(up - 1, yp) + hx$(up, yp) = y$ THEN
  1203. p1$ = "LDB": p2$ = STR$(-3) + ",U": GOSUB 10
  1204. p1$ = "ANDB": p2$ = "#$F0": GOSUB 10
  1205. p1$ = "ORB": p2$ = "#$" + hx$(up - 3, yp): GOSUB 10: b$ = "XX"
  1206. p1$ = "PSHU": p2$ = "B,X": GOSUB 10
  1207. hx$(up - 2, yp) = "ub": hx$(up - 1, yp) = "ux1": hx$(up, yp) = "ux2"
  1208. up = up - 3: xp = xp - 3
  1209. pflag = 1
  1210. END IF
  1211. IF calc(up - 2, yp) = 3 AND hx$(up - 1, yp) + hx$(up, yp) = y$ THEN
  1212. p1$ = "LDB": p2$ = STR$(-3) + ",U": GOSUB 10
  1213. p1$ = "ANDB": p2$ = "#$0F": GOSUB 10
  1214. p1$ = "ORB": p2$ = "#$" + hx$(up - 3, yp): GOSUB 10: b$ = "XX"
  1215. p1$ = "PSHU": p2$ = "B,Y": GOSUB 10
  1216. hx$(up - 2, yp) = "ub": hx$(up - 1, yp) = "uy1": hx$(up, yp) = "uy2"
  1217. up = up - 3: xp = xp - 3
  1218. pflag = 1
  1219. END IF
  1220. END IF
  1221. GOTO 720
  1222.  
  1223. 'Handle 8 bit locations that have transparency (nibble as a 0)
  1224. 750 found = 0
  1225. FOR x = 1 TO xp
  1226. IF calc(x, yp) = 2 AND hx$(x + 1, yp) = "ub" THEN
  1227. p1$ = "LDA": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  1228. p1$ = "ANDA": p2$ = "#$F0": GOSUB 10
  1229. p1$ = "ORA": p2$ = "#$" + hx$(x, yp): GOSUB 10: a$ = "XX"
  1230. p1$ = "STD": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  1231. found = 1
  1232. calc(x, yp) = -1
  1233. END IF
  1234. NEXT x
  1235. 'Check row below
  1236. FOR x = 1 TO p2 - 1
  1237. IF calc(x, yp + 1) = 2 AND hx$(x + 1, yp + 1) = "ub" THEN
  1238. p1$ = "LDA": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
  1239. p1$ = "ANDA": p2$ = "#$F0": GOSUB 10
  1240. p1$ = "ORA": p2$ = "#$" + hx$(x, yp + 1): GOSUB 10: a$ = "XX"
  1241. p1$ = "STD": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
  1242. found = 1
  1243. calc(x, yp + 1) = -1
  1244. END IF
  1245. NEXT x
  1246.  
  1247. IF found = 0 THEN
  1248. FOR x = 1 TO xp
  1249. IF hx$(x, yp) = "ua" AND calc(x + 1, yp) = 3 THEN
  1250. p1$ = "LDB": p2$ = STR$(x - xp + 1 - 1) + ",U": GOSUB 10
  1251. p1$ = "ANDB": p2$ = "#$0F": GOSUB 10
  1252. p1$ = "ORB": p2$ = "#$" + hx$(x + 1, yp): GOSUB 10: b$ = "XX"
  1253. p1$ = "STD": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  1254. found = 1
  1255. calc(x + 1, yp) = -1
  1256. END IF
  1257. NEXT x
  1258. 'Check row below
  1259. FOR x = 1 TO p2 - 1
  1260. IF hx$(x, yp + 1) = "ua" AND calc(x + 1, yp + 1) = 3 THEN
  1261. p1$ = "LDB": p2$ = STR$(x - p2 + sw + 1 - 1) + ",U": GOSUB 10
  1262. p1$ = "ANDB": p2$ = "#$0F": GOSUB 10
  1263. p1$ = "ORB": p2$ = "#$" + hx$(x + 1, yp + 1): GOSUB 10: b$ = "XX"
  1264. p1$ = "STD": p2$ = STR$(x - p2 + sw - 1) + ",U": GOSUB 10
  1265. found = 1
  1266. calc(x + 1, yp + 1) = -1
  1267. END IF
  1268. NEXT x
  1269. END IF
  1270. FOR x = 1 TO p2
  1271. 'Check row below
  1272. IF calc(x, yp + 1) = 2 THEN
  1273. p1$ = "LDB": p2$ = STR$(x - xp + sw - 1) + ",U": GOSUB 10
  1274. p1$ = "ANDB": p2$ = "#$F0": GOSUB 10
  1275. p1$ = "ORB": p2$ = "#$" + hx$(x, yp + 1): GOSUB 10: b$ = "XX"
  1276. p1$ = "STB": p2$ = STR$(x - xp + sw - 1) + ",U": GOSUB 10
  1277. calc(x, yp + 1) = -1
  1278. END IF
  1279. IF calc(x, yp + 1) = 3 THEN
  1280. p1$ = "LDB": p2$ = STR$(x - xp + sw - 1) + ",U": GOSUB 10
  1281. p1$ = "ANDB": p2$ = "#$0F": GOSUB 10
  1282. p1$ = "ORB": p2$ = "#$" + hx$(x, yp + 1): GOSUB 10: b$ = "XX"
  1283. p1$ = "STB": p2$ = STR$(x - xp + sw - 1) + ",U": GOSUB 10
  1284. calc(x, yp + 1) = -1
  1285. END IF
  1286. NEXT x
  1287.  
  1288. IF calc(xp - 2, yp) = 2 AND calc(xp - 1, yp) = 1 AND calc(xp, yp) = 1 THEN
  1289. p1$ = "LDB": p2$ = STR$(-3) + ",U": GOSUB 10
  1290. p1$ = "ANDB": p2$ = "#$F0": GOSUB 10
  1291. p1$ = "ORB": p2$ = "#$" + hx$(xp - 2, yp): GOSUB 10: b$ = "XX"
  1292. p1$ = "LDX": p2$ = "#$" + hx$(xp - 1, yp) + hx$(xp, yp): GOSUB 10: x$ = hx$(xp - 1, yp) + hx$(xp, yp)
  1293. p1$ = "PSHU": p2$ = "B,X": GOSUB 10
  1294. calc(xp - 2, yp) = -1: calc(xp - 1, yp) = -1: calc(xp, yp) = -1: xp = xp - 3: up = up - 3
  1295. END IF
  1296.  
  1297. FOR x = 1 TO xp
  1298. IF calc(x, yp) = 2 THEN
  1299. p1$ = "LDB": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  1300. p1$ = "ANDB": p2$ = "#$F0": GOSUB 10
  1301. p1$ = "ORB": p2$ = "#$" + hx$(x, yp): GOSUB 10: b$ = "XX"
  1302. p1$ = "STB": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  1303. calc(x, yp) = -1
  1304. END IF
  1305. IF calc(x, yp) = 3 THEN
  1306. p1$ = "LDB": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  1307. p1$ = "ANDB": p2$ = "#$0F": GOSUB 10
  1308. p1$ = "ORB": p2$ = "#$" + hx$(x, yp): GOSUB 10: b$ = "XX"
  1309. p1$ = "STB": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  1310. calc(x, yp) = -1
  1311. END IF
  1312. NEXT x
  1313.  
  1314.  
  1315. 'Check to see if we can use any 16 bit values from the row below to stack blast
  1316. 'We don't need to sort this data, just in case D,X,Y can all be the same value (for repeated data)
  1317. count = 0
  1318. FOR x = 1 TO p2 - 1
  1319. 'Check row below
  1320. IF calc(x, yp + 1) = 1 AND calc(x + 1, yp + 1) = 1 THEN count = count + 1: tw$(count) = hx$(x, yp + 1) + hx$(x + 1, yp + 1): wordp(count) = x: x = x + 1
  1321. NEXT x
  1322. 'If the 16 bit values can be used to stack blast then load them and store them in the row below then blast them
  1323. d1 = 0: x1 = 0: y1 = 0
  1324. IF count > 0 THEN
  1325. FOR x = 1 TO count
  1326. IF up > 5 THEN
  1327. IF hx$(up - 5, yp) + hx$(up - 4, yp) = tw$(x) THEN d$ = hx$(up - 5, yp) + hx$(up - 4, yp): d1 = 1
  1328. IF hx$(up - 3, yp) + hx$(up - 2, yp) = tw$(x) THEN x$ = hx$(up - 3, yp) + hx$(up - 2, yp): x1 = 1
  1329. IF hx$(up - 1, yp) + hx$(up, yp) = tw$(x) THEN y$ = hx$(up - 1, yp) + hx$(up, yp): y1 = 1
  1330. END IF
  1331. NEXT x
  1332. FOR x = 1 TO count
  1333. IF up > 3 THEN
  1334. IF hx$(up - 3, yp) + hx$(up - 2, yp) = tw$(x) THEN x$ = hx$(up - 3, yp) + hx$(up - 2, yp): x1 = 1
  1335. IF hx$(up - 1, yp) + hx$(up, yp) = tw$(x) THEN y$ = hx$(up - 1, yp) + hx$(up, yp): y1 = 1
  1336. END IF
  1337. NEXT x
  1338. END IF
  1339.  
  1340. IF d1 > 0 AND x1 > 0 AND y1 > 0 THEN
  1341. p1$ = "LDD": p2$ = "#$" + d$: GOSUB 10: d1 = 2
  1342. p1$ = "LDX": p2$ = "#$" + x$: GOSUB 10: x1 = 2
  1343. IF x$ = y$ THEN
  1344. p1$ = "LEAY": p2$ = ",X": GOSUB 10: y1 = 2
  1345. ELSE
  1346. p1$ = "LDY": p2$ = "#$" + y$: GOSUB 10: y1 = 2
  1347. END IF
  1348. ELSE
  1349. IF d1 > 0 AND x1 > 0 AND calc(up - 1, yp) = 1 AND calc(up, yp) = 1 THEN
  1350. p1$ = "LDD": p2$ = "#$" + d$: GOSUB 10: d1 = 2
  1351. p1$ = "LDX": p2$ = "#$" + x$: GOSUB 10: x1 = 2
  1352. IF x$ = y$ THEN
  1353. p1$ = "LEAY": p2$ = ",X": GOSUB 10: y1 = 2
  1354. ELSE
  1355. p1$ = "LDY": p2$ = "#$" + y$: GOSUB 10: y1 = 2
  1356. END IF
  1357. END IF
  1358. IF d1 > 0 AND y1 > 0 AND calc(up - 3, yp) = 1 AND calc(up - 2, yp) = 1 THEN
  1359. p1$ = "LDD": p2$ = "#$" + d$: GOSUB 10: d1 = 2
  1360. p1$ = "LDX": p2$ = "#$" + x$: GOSUB 10: x1 = 2
  1361. IF x$ = y$ THEN
  1362. p1$ = "LEAY": p2$ = ",X": GOSUB 10: y1 = 2
  1363. ELSE
  1364. p1$ = "LDY": p2$ = "#$" + y$: GOSUB 10: y1 = 2
  1365. END IF
  1366. END IF
  1367. IF x1 > 0 AND y1 > 0 THEN
  1368. p1$ = "LDX": p2$ = "#$" + x$: GOSUB 10: x1 = 2
  1369. IF x$ = y$ THEN
  1370. p1$ = "LEAY": p2$ = ",X": GOSUB 10: y1 = 2
  1371. ELSE
  1372. p1$ = "LDY": p2$ = "#$" + y$: GOSUB 10: y1 = 2
  1373. END IF
  1374. END IF
  1375. END IF
  1376.  
  1377. IF d1 > 0 THEN
  1378. IF d1 = 1 THEN
  1379. p1$ = "LDD": p2$ = "#$" + d$: GOSUB 10
  1380. END IF
  1381. FOR x = 1 TO p2
  1382. IF hx$(x, yp + 1) + hx$(x + 1, yp + 1) = d$ THEN
  1383. p1$ = "STD": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
  1384. hx$(x, yp + 1) = "XX": hx$(x + 1, yp + 1) = "XX"
  1385. calc(x, yp + 1) = -1: calc(x + 1, yp + 1) = -1: x = x + 1
  1386. END IF
  1387. NEXT x
  1388. END IF
  1389. IF x1 > 0 THEN
  1390. IF x1 = 1 THEN
  1391. p1$ = "LDX": p2$ = "#$" + x$: GOSUB 10
  1392. END IF
  1393. FOR x = 1 TO p2
  1394. IF hx$(x, yp + 1) + hx$(x + 1, yp + 1) = x$ THEN
  1395. p1$ = "STX": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
  1396. hx$(x, yp + 1) = "XX": hx$(x + 1, yp + 1) = "XX"
  1397. calc(x, yp + 1) = -1: calc(x + 1, yp + 1) = -1: x = x + 1
  1398. END IF
  1399. NEXT x
  1400. END IF
  1401. IF y1 > 0 THEN
  1402. IF y1 = 1 THEN
  1403. p1$ = "LDY": p2$ = "#$" + y$: GOSUB 10
  1404. END IF
  1405. FOR x = 1 TO p2
  1406. IF hx$(x, yp + 1) + hx$(x + 1, yp + 1) = y$ THEN
  1407. p1$ = "STY": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
  1408. hx$(x, yp + 1) = "XX": hx$(x + 1, yp + 1) = "XX"
  1409. calc(x, yp + 1) = -1: calc(x + 1, yp + 1) = -1: x = x + 1
  1410. END IF
  1411. NEXT x
  1412. END IF
  1413.  
  1414. IF d1 = 2 AND x1 = 2 AND y1 = 2 THEN
  1415. p1$ = "PSHU": p2$ = "D,X,Y": GOSUB 10
  1416. up = up - 6: xp = xp - 6
  1417. ELSE
  1418. IF d1 = 2 AND x1 = 2 AND calc(up - 1, yp) = 1 AND calc(up, yp) = 1 THEN
  1419. p1$ = "PSHU": p2$ = "D,X,Y": GOSUB 10
  1420. up = up - 6: xp = xp - 6
  1421. END IF
  1422. IF d1 = 2 AND y1 = 2 AND calc(up - 3, yp) = 1 AND calc(up - 2, yp) = 1 THEN
  1423. p1$ = "PSHU": p2$ = "D,X,Y": GOSUB 10
  1424. up = up - 6: xp = xp - 6
  1425. END IF
  1426. IF x1 = 2 AND y1 = 2 THEN
  1427. p1$ = "PSHU": p2$ = "X,Y": GOSUB 10
  1428. up = up - 4: xp = xp - 4
  1429. END IF
  1430. END IF
  1431.  
  1432.  
  1433. 'Check if used and just stack blasted, if so go back and look at the values at the new location (maybe we can blast again)
  1434. IF d1 = 2 AND x1 = 2 THEN 725
  1435. IF d1 = 2 AND y1 = 2 THEN 725
  1436. IF x1 = 2 AND y1 = 2 THEN 725
  1437.  
  1438.  
  1439. 'See if we can use X or Y as they are top row
  1440. FOR x = 1 TO up - 1
  1441. IF calc(x, yp) = 1 AND calc(x + 1, yp) = 1 THEN
  1442. IF hx$(x, yp) + hx$(x + 1, yp) = x$ THEN
  1443. p1$ = "STX": p2$ = STR$(x - up - 1) + ",U": GOSUB 10
  1444. hx$(x, yp) = "ux1": hx$(x + 1, yp) = "ux2"
  1445. calc(x, yp) = -1: calc(x + 1, yp) = -1
  1446. END IF
  1447. IF hx$(x, yp) + hx$(x + 1, yp) = yx$ THEN
  1448. p1$ = "STY": p2$ = STR$(x - up - 1) + ",U": GOSUB 10
  1449. hx$(x, yp) = "uy1": hx$(x + 1, yp) = "uy2"
  1450. calc(x, yp) = -1: calc(x + 1, yp) = -1
  1451. END IF
  1452. END IF
  1453. NEXT x
  1454. 'See if we can use X or Y as they are bottom row
  1455. FOR x = 1 TO p2 - 1
  1456. IF calc(x, yp + 1) = 1 AND calc(x + 1, yp + 1) = 1 THEN
  1457. IF hx$(x, yp + 1) + hx$(x + 1, yp + 1) = x$ THEN
  1458. p1$ = "STX": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
  1459. hx$(x, yp + 1) = "ux1": hx$(x + 1, yp + 1) = "ux2"
  1460. calc(x, yp + 1) = -1: calc(x + 1, yp + 1) = -1
  1461. END IF
  1462. IF hx$(x, yp + 1) + hx$(x + 1, yp + 1) = y$ THEN
  1463. p1$ = "STY": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
  1464. hx$(x, yp + 1) = "uy1": hx$(x + 1, yp + 1) = "uy2"
  1465. calc(x, yp + 1) = -1: calc(x + 1, yp + 1) = -1
  1466. END IF
  1467. END IF
  1468. NEXT x
  1469.  
  1470. 730 count = 0
  1471. FOR x = 1 TO up - 1
  1472. 'Check top row
  1473. IF calc(x, yp) = 1 AND calc(x + 1, yp) = 1 THEN count = count + 1: tw$(count) = hx$(x, yp) + hx$(x + 1, yp): wordp(count) = x: x = x + 1
  1474. NEXT x
  1475. FOR x = 1 TO p2 - 1
  1476. 'Check row below
  1477. IF calc(x, yp + 1) = 1 AND calc(x + 1, yp + 1) = 1 THEN count = count + 1: tw$(count) = hx$(x, yp + 1) + hx$(x + 1, yp + 1): wordp(count) = x: x = x + 1
  1478. NEXT x
  1479.  
  1480. IF count > 1 THEN
  1481. GOSUB 20
  1482. IF newcount > 1 THEN
  1483. FOR x = 1 TO newcount
  1484. found = 0
  1485. p1$ = "LDD": p2$ = "#$" + tw$(x): GOSUB 10
  1486. a$ = LEFT$(tw$(x), 2): b$ = RIGHT$(tw$(x), 2)
  1487. FOR n = 1 TO up - 1
  1488. IF tw$(x) = hx$(n, yp) + hx$(n + 1, yp) THEN
  1489. p1$ = "STD": p2$ = STR$(n - up - 1) + ",U": GOSUB 10
  1490. hx$(n, yp) = "ud1": hx$(n + 1, yp) = "ud2"
  1491. calc(n, yp) = -1: calc(n + 1, yp) = -1: n = n + 1
  1492. found = 1
  1493. END IF
  1494. NEXT n
  1495. FOR n = 1 TO p2 - 1
  1496. 'Check row below
  1497. IF tw$(x) = hx$(n, yp + 1) + hx$(n + 1, yp + 1) THEN
  1498. p1$ = "STD": p2$ = STR$(n - up + sw - 1) + ",U": GOSUB 10
  1499. hx$(n, yp + 1) = "ud1": hx$(n + 1, yp + 1) = "ud2"
  1500. calc(n, yp + 1) = -1: calc(n + 1, yp + 1) = -1: n = n + 1
  1501. found = 1
  1502. END IF
  1503. NEXT n
  1504. 'check if we can store A or B
  1505. FOR n = 1 TO up
  1506. IF LEFT$(tw$(x), 2) = hx$(n, yp) THEN
  1507. p1$ = "STA": p2$ = STR$(n - up - 1) + ",U": GOSUB 10
  1508. hx$(n, yp) = "ua"
  1509. calc(n, yp) = -1
  1510. found = 1
  1511. END IF
  1512. IF RIGHT$(tw$(x), 2) = hx$(n, yp) THEN
  1513. p1$ = "STB": p2$ = STR$(n - up - 1) + ",U": GOSUB 10
  1514. hx$(n, yp) = "ub"
  1515. calc(n, yp) = -1
  1516. found = 1
  1517. END IF
  1518. NEXT n
  1519. FOR n = 1 TO p2
  1520. 'Check row below
  1521. IF LEFT$(tw$(x), 2) = hx$(n, yp + 1) THEN
  1522. p1$ = "STA": p2$ = STR$(n - up + sw - 1) + ",U": GOSUB 10
  1523. hx$(n, yp + 1) = "ua"
  1524. calc(n, yp + 1) = -1
  1525. found = 1
  1526. END IF
  1527. IF RIGHT$(tw$(x), 2) = hx$(n, yp + 1) THEN
  1528. p1$ = "STB": p2$ = STR$(n - up + sw - 1) + ",U": GOSUB 10
  1529. hx$(n, yp + 1) = "ub"
  1530. calc(n, yp + 1) = -1
  1531. found = 1
  1532. END IF
  1533. NEXT n
  1534. IF found = 1 THEN GOTO 730
  1535. NEXT x
  1536. ELSE
  1537. count = 1
  1538. END IF
  1539. END IF
  1540.  
  1541. IF count = 1 THEN
  1542. x = count
  1543. p1$ = "LDD": p2$ = "#$" + tw$(x): GOSUB 10
  1544. a$ = LEFT$(tw$(x), 2): b$ = RIGHT$(tw$(x), 2)
  1545. FOR n = 1 TO up
  1546. IF tw$(x) = hx$(n, yp) + hx$(n + 1, yp) THEN
  1547. p1$ = "STD": p2$ = STR$(n - up - 1) + ",U": GOSUB 10
  1548. hx$(n, yp) = "ud1": hx$(n + 1, yp) = "ud2"
  1549. calc(n, yp) = -1: calc(n + 1, yp) = -1: n = n + 1
  1550. END IF
  1551. NEXT n
  1552. FOR n = 1 TO p2
  1553. 'Check row below
  1554. IF tw$(x) = hx$(n, yp + 1) + hx$(n + 1, yp + 1) THEN
  1555. p1$ = "STD": p2$ = STR$(n - up + sw - 1) + ",U": GOSUB 10
  1556. hx$(n, yp + 1) = "ud1": hx$(n + 1, yp + 1) = "ud2"
  1557. calc(n, yp + 1) = -1: calc(n + 1, yp + 1) = -1: n = n + 1
  1558. END IF
  1559. NEXT n
  1560. 'check if we can store A or B
  1561. FOR n = 1 TO up
  1562. IF LEFT$(tw$(x), 2) = hx$(n, yp) THEN
  1563. p1$ = "STA": p2$ = STR$(n - up - 1) + ",U": GOSUB 10
  1564. hx$(n, yp) = "ua"
  1565. calc(n, yp) = -1
  1566. END IF
  1567. IF RIGHT$(tw$(x), 2) = hx$(n, yp) THEN
  1568. p1$ = "STB": p2$ = STR$(n - up - 1) + ",U": GOSUB 10
  1569. hx$(n, yp) = "ub"
  1570. calc(n, yp) = -1
  1571. END IF
  1572. NEXT n
  1573. FOR n = 1 TO p2
  1574. 'Check row below
  1575. IF LEFT$(tw$(x), 2) = hx$(n, yp + 1) THEN
  1576. p1$ = "STA": p2$ = STR$(n - up + sw - 1) + ",U": GOSUB 10
  1577. hx$(n, yp + 1) = "ua"
  1578. calc(n, yp + 1) = -1
  1579. END IF
  1580. IF RIGHT$(tw$(x), 2) = hx$(n, yp + 1) THEN
  1581. p1$ = "STB": p2$ = STR$(n - up + sw - 1) + ",U": GOSUB 10
  1582. hx$(n, yp + 1) = "ub"
  1583. calc(n, yp + 1) = -1
  1584. END IF
  1585. NEXT n
  1586.  
  1587. END IF
  1588.  
  1589. 'Check to see if we can use any 8 bit values (if not then we are done)
  1590. count = 0
  1591. FOR x = 1 TO xp
  1592. IF calc(x, yp) = 1 THEN count = count + 1: tw$(count) = hx$(x, yp): wordp(count) = x
  1593. NEXT x
  1594. FOR x = 1 TO p2
  1595. IF calc(x, yp + 1) = 1 THEN count = count + 1: tw$(count) = hx$(x, yp + 1): wordp(count) = x
  1596. NEXT x
  1597. IF count > 1 THEN
  1598. GOSUB 20
  1599. IF newcount > 1 THEN
  1600. FOR x = 1 TO newcount
  1601. p1$ = "LDB": p2$ = "#$" + tw$(x): GOSUB 10: b$ = tw$(x)
  1602. FOR n = 1 TO xp
  1603. IF tw$(x) = hx$(n, yp) THEN p1$ = "STB": p2$ = STR$(n - xp - 1) + ",U": GOSUB 10: calc(n, yp) = -1: hx$(n, yp) = "ub"
  1604. NEXT n
  1605. 'Check row below
  1606. FOR n = 1 TO p2
  1607. IF tw$(x) = hx$(n, yp + 1) THEN p1$ = "STB": p2$ = STR$(n - xp + sw - 1) + ",U": GOSUB 10: calc(n, yp + 1) = -1: hx$(n, yp + 1) = "ub"
  1608. NEXT n
  1609. NEXT x
  1610. ELSE
  1611. count = 1
  1612. END IF
  1613. END IF
  1614. IF count = 1 THEN
  1615. x = count
  1616. p1$ = "LDB": p2$ = "#$" + tw$(x): GOSUB 10: b$ = tw$(x)
  1617. FOR n = 1 TO xp
  1618. IF tw$(x) = hx$(n, yp) THEN p1$ = "STB": p2$ = STR$(n - xp - 1) + ",U": GOSUB 10: calc(n, yp) = -1: hx$(n, yp) = "ub"
  1619. NEXT n
  1620. FOR n = 1 TO p2
  1621. IF tw$(x) = hx$(n, yp + 1) THEN p1$ = "STB": p2$ = STR$(n - xp + sw - 1) + ",U": GOSUB 10: calc(n, yp + 1) = -1: hx$(n, yp + 1) = "ub"
  1622. NEXT n
  1623. END IF
  1624. lastrow = yp
  1625. GOTO 405
  1626.  
  1627.  
  1628.  
  1629.  
  1630.  
  1631.  
  1632. 'fl = 3 then use stack on this line
  1633. 800 PRINT #1, "* Row"; yp; "800": GOSUB 45
  1634. IF leauFlag = 1 THEN leauFlag = 0: GOTO 810
  1635. 'Setup U pointer
  1636. FOR x = 1 TO w
  1637. IF calc(x, yp) > 0 THEN p = x
  1638. NEXT x
  1639.  
  1640. x = p
  1641. x1 = p
  1642. count = 0
  1643. 802 IF calc(x1, yp) = 2 OR calc(x1, yp) = 3 THEN
  1644. x1 = x1 - 1
  1645. count = count + 1
  1646. ELSE GOTO 803
  1647. END IF
  1648. GOTO 802
  1649.  
  1650. 803 p = x1
  1651.  
  1652. move = p - up
  1653. xp = p
  1654. up = p
  1655.  
  1656. p1$ = "LEAU"
  1657. IF move > 0 THEN
  1658. p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + "+" + STR$(move) + ",U"
  1659. ELSE
  1660. IF move < 0 THEN
  1661. p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + STR$(move) + ",U"
  1662. ELSE
  1663. p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + ",U"
  1664. END IF
  1665. END IF
  1666. GOSUB 10
  1667.  
  1668. x = x + 1
  1669. x = x - count
  1670. count = -1
  1671. 805 IF calc(x, yp) = 2 OR calc(x, yp) = 3 THEN
  1672. IF calc(x, yp) = 2 THEN
  1673. count = count + 1
  1674. p1$ = "LDA"
  1675. IF count = 0 THEN
  1676. p2$ = ",U"
  1677. ELSE
  1678. p2$ = STR$(count) + ",U"
  1679. END IF
  1680. GOSUB 10
  1681. p1$ = "ANDA": p2$ = "#$F0": GOSUB 10
  1682. p1$ = "ORA": p2$ = "#$" + hx$(x, yp): GOSUB 10: a$ = "XX"
  1683. p1$ = "STA"
  1684. IF count = 0 THEN
  1685. p2$ = ",U"
  1686. ELSE
  1687. p2$ = STR$(count) + ",U"
  1688. END IF
  1689. GOSUB 10
  1690. calc(x, yp) = -1
  1691. END IF
  1692. IF calc(x, yp) = 3 THEN
  1693. count = count + 1
  1694. p1$ = "LDA"
  1695. IF count = 0 THEN
  1696. p2$ = ",U"
  1697. ELSE
  1698. p2$ = STR$(count) + ",U"
  1699. END IF
  1700. GOSUB 10
  1701. p1$ = "ANDA": p2$ = "#$0F": GOSUB 10
  1702. p1$ = "ORA": p2$ = "#$" + hx$(x, yp): GOSUB 10: a$ = "XX"
  1703. p1$ = "STA"
  1704. IF count = 0 THEN
  1705. p2$ = ",U"
  1706. ELSE
  1707. p2$ = STR$(count) + ",U"
  1708. END IF
  1709. GOSUB 10
  1710. calc(x, yp) = -1
  1711. END IF
  1712. x = x + 1
  1713. ELSE GOTO 808
  1714. END IF
  1715. GOTO 805
  1716. 808
  1717. d$ = a$ + b$
  1718. 810
  1719. 'See if we can stack blast with the current values in D (A or B) ,X or Y
  1720. pflag = 1
  1721. 820 IF pflag = 0 THEN GOTO 850
  1722. pflag = 0
  1723. 825 IF up > 5 THEN
  1724. IF hx$(up - 5, yp) + hx$(up - 4, yp) = d$ AND hx$(up - 3, yp) + hx$(up - 2, yp) = x$ AND hx$(up - 1, yp) + hx$(up, yp) = y$ THEN
  1725. p1$ = "PSHU": p2$ = "D,X,Y": GOSUB 10
  1726. hx$(up - 5, yp) = "ud1": hx$(up - 4, yp) = "ud2": hx$(up - 3, yp) = "ux1": hx$(up - 2, yp) = "ux2": hx$(up - 1, yp) = "uy1": hx$(up, yp) = "uy2"
  1727. calc(up - 5, yp) = -1: calc(up - 4, yp) = -1: calc(up - 3, yp) = -1: calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
  1728. up = up - 6: xp = xp - 6
  1729. pflag = 1: GOTO 825
  1730. END IF
  1731. END IF
  1732. IF up > 3 THEN
  1733. IF hx$(up - 3, yp) + hx$(up - 2, yp) = d$ AND hx$(up - 1, yp) + hx$(up, yp) = x$ THEN
  1734. p1$ = "PSHU": p2$ = "D,X": GOSUB 10
  1735. hx$(up - 3, yp) = "ud1": hx$(up - 2, yp) = "ud2": hx$(up - 1, yp) = "ux1": hx$(up, yp) = "ux2"
  1736. calc(up - 3, yp) = -1: calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
  1737. up = up - 4: xp = xp - 4
  1738. pflag = 1: GOTO 825
  1739. END IF
  1740. IF hx$(up - 3, yp) + hx$(up - 2, yp) = d$ AND hx$(up - 1, yp) + hx$(up, yp) = y$ THEN
  1741. p1$ = "PSHU": p2$ = "D,Y": GOSUB 10
  1742. hx$(up - 3, yp) = "ud1": hx$(up - 2, yp) = "ud2": hx$(up - 1, yp) = "uy1": hx$(up, yp) = "uy2"
  1743. calc(up - 3, yp) = -1: calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
  1744. up = up - 4: xp = xp - 4
  1745. pflag = 1: GOTO 825
  1746. END IF
  1747. IF hx$(up - 3, yp) + hx$(up - 2, yp) = x$ AND hx$(up - 1, yp) + hx$(up, yp) = y$ THEN
  1748. p1$ = "PSHU": p2$ = "X,Y": GOSUB 10
  1749. hx$(up - 3, yp) = "ux1": hx$(up - 2, yp) = "ux2": hx$(up - 1, yp) = "uy1": hx$(up, yp) = "uy2"
  1750. calc(up - 3, yp) = -1: calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
  1751. up = up - 4: xp = xp - 4
  1752. pflag = 1: GOTO 825
  1753. END IF
  1754. END IF
  1755. IF up > 2 THEN
  1756. IF hx$(up - 2, yp) = a$ AND hx$(up - 1, yp) + hx$(up, yp) = x$ THEN
  1757. p1$ = "PSHU": p2$ = "A,X": GOSUB 10
  1758. hx$(up - 2, yp) = "ua": hx$(up - 1, yp) = "ux1": hx$(up, yp) = "ux2"
  1759. calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
  1760. up = up - 3: xp = xp - 3
  1761. pflag = 1: GOTO 825
  1762. END IF
  1763. IF hx$(up - 2, yp) = a$ AND hx$(up - 1, yp) + hx$(up, yp) = y$ THEN
  1764. p1$ = "PSHU": p2$ = "A,Y": GOSUB 10
  1765. hx$(up - 2, yp) = "ua": hx$(up - 1, yp) = "uy1": hx$(up, yp) = "uy2"
  1766. calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
  1767. up = up - 3: xp = xp - 3
  1768. pflag = 1: GOTO 825
  1769. END IF
  1770. END IF
  1771.  
  1772. 'Check if A can be loaded with transparent data and then blast D,X,Y
  1773. IF up > 5 THEN
  1774. IF calc(up - 5, yp) = 2 AND hx$(up - 4, yp) = b$ AND hx$(up - 3, yp) + hx$(up - 2, yp) = x$ AND hx$(up - 1, yp) + hx$(up, yp) = y$ THEN
  1775. p1$ = "LDA": p2$ = STR$(-6) + ",U": GOSUB 10
  1776. p1$ = "ANDA": p2$ = "#$F0": GOSUB 10
  1777. p1$ = "ORA": p2$ = "#$" + hx$(up - 5, yp): GOSUB 10: a$ = "XX"
  1778. p1$ = "PSHU": p2$ = "D,X": GOSUB 10
  1779. hx$(up - 5, yp) = "ud1": hx$(up - 4, yp) = "ud2": hx$(up - 3, yp) = "ux1": hx$(up - 2, yp) = "ux2": hx$(up - 1, yp) = "uy1": hx$(up - 0, yp) = "uy2"
  1780. calc(up - 5, yp) = -1: calc(up - 4, yp) = -1: calc(up - 3, yp) = -1: calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
  1781. up = up - 6: xp = xp - 6
  1782. pflag = 1: GOTO 825
  1783. END IF
  1784. END IF
  1785.  
  1786. 'Check if A can be loaded with transparent data and then blast D,X or D,Y
  1787. IF up > 3 THEN
  1788. IF calc(up - 3, yp) = 2 AND hx$(up - 2, yp) = b$ AND hx$(up - 1, yp) + hx$(up, yp) = x$ THEN
  1789. p1$ = "LDA": p2$ = STR$(-4) + ",U": GOSUB 10
  1790. p1$ = "ANDA": p2$ = "#$F0": GOSUB 10
  1791. p1$ = "ORA": p2$ = "#$" + hx$(up - 3, yp): GOSUB 10: a$ = "XX"
  1792. p1$ = "PSHU": p2$ = "D,X": GOSUB 10
  1793. hx$(up - 3, yp) = "ud1": hx$(up - 2, yp) = "ud2": hx$(up - 1, yp) = "ux1": hx$(up, yp) = "ux2"
  1794. calc(up - 3, yp) = -1: calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
  1795. up = up - 4: xp = xp - 4
  1796. pflag = 1: GOTO 825
  1797. END IF
  1798. IF calc(up - 3, yp) = 3 AND hx$(up - 2, yp) = b$ AND hx$(up - 1, yp) + hx$(up, yp) = x$ THEN
  1799. p1$ = "LDA": p2$ = STR$(-4) + ",U": GOSUB 10
  1800. p1$ = "ANDA": p2$ = "#$0F": GOSUB 10
  1801. p1$ = "ORA": p2$ = "#$" + hx$(up - 3, yp): GOSUB 10: a$ = "XX"
  1802. p1$ = "PSHU": p2$ = "D,X": GOSUB 10
  1803. hx$(up - 3, yp) = "ud1": hx$(up - 2, yp) = "ud2": hx$(up - 1, yp) = "ux1": hx$(up, yp) = "ux2"
  1804. calc(up - 3, yp) = -1: calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
  1805. up = up - 4: xp = xp - 4
  1806. pflag = 1: GOTO 825
  1807. END IF
  1808. IF calc(up - 3, yp) = 2 AND hx$(up - 2, yp) = b$ AND hx$(up - 1, yp) + hx$(up, yp) = y$ THEN
  1809. p1$ = "LDA": p2$ = STR$(-4) + ",U": GOSUB 10
  1810. p1$ = "ANDA": p2$ = "#$F0": GOSUB 10
  1811. p1$ = "ORA": p2$ = "#$" + hx$(up - 3, yp): GOSUB 10: a$ = "XX"
  1812. p1$ = "PSHU": p2$ = "D,Y": GOSUB 10
  1813. hx$(up - 3, yp) = "ud1": hx$(up - 2, yp) = "ud2": hx$(up - 1, yp) = "uy1": hx$(up, yp) = "uy2"
  1814. calc(up - 3, yp) = -1: calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
  1815. up = up - 4: xp = xp - 4
  1816. pflag = 1: GOTO 825
  1817. END IF
  1818. IF calc(up - 3, yp) = 3 AND hx$(up - 2, yp) = b$ AND hx$(up - 1, yp) + hx$(up, yp) = y$ THEN
  1819. p1$ = "LDA": p2$ = STR$(-4) + ",U": GOSUB 10
  1820. p1$ = "ANDA": p2$ = "#$0F": GOSUB 10
  1821. p1$ = "ORA": p2$ = "#$" + hx$(up - 3, yp): GOSUB 10: a$ = "XX"
  1822. p1$ = "PSHU": p2$ = "D,Y": GOSUB 10
  1823. hx$(up - 3, yp) = "ud1": hx$(up - 2, yp) = "ud2": hx$(up - 1, yp) = "uy1": hx$(up, yp) = "uy2"
  1824. calc(up - 3, yp) = -1: calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
  1825. up = up - 4: xp = xp - 4
  1826. pflag = 1: GOTO 825
  1827. END IF
  1828. END IF
  1829. IF up > 2 THEN
  1830. IF hx$(up - 2, yp) = b$ AND hx$(up - 1, yp) + hx$(up, yp) = x$ THEN
  1831. p1$ = "PSHU": p2$ = "B,X": GOSUB 10
  1832. hx$(up - 2, yp) = "ub": hx$(up - 1, yp) = "ux1": hx$(up, yp) = "ux2"
  1833. calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
  1834. up = up - 3: xp = xp - 3
  1835. pflag = 1: GOTO 825
  1836. END IF
  1837. 'PRINT up, yp
  1838. IF hx$(up - 2, yp) = b$ AND hx$(up - 1, yp) + hx$(up, yp) = y$ THEN
  1839. p1$ = "PSHU": p2$ = "B,Y": GOSUB 10
  1840. hx$(up - 2, yp) = "ub": hx$(up - 1, yp) = "uy1": hx$(up, yp) = "uy2"
  1841. calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
  1842. up = up - 3: xp = xp - 3
  1843. pflag = 1: GOTO 825
  1844. END IF
  1845. 'Check if we can do transparency nibble then blast B,X or B,Y
  1846. IF calc(up - 2, yp) = 2 AND hx$(up - 1, yp) + hx$(up, yp) = x$ THEN
  1847. p1$ = "LDB": p2$ = STR$(-3) + ",U": GOSUB 10
  1848. p1$ = "ANDB": p2$ = "#$F0": GOSUB 10
  1849. p1$ = "ORB": p2$ = "#$" + hx$(up - 2, yp): GOSUB 10: b$ = "XX"
  1850. p1$ = "PSHU": p2$ = "B,X": GOSUB 10
  1851. hx$(up - 2, yp) = "ub": hx$(up - 1, yp) = "ux1": hx$(up, yp) = "ux2"
  1852. up = up - 3: xp = xp - 3
  1853. pflag = 1: GOTO 825
  1854. END IF
  1855. IF calc(up - 2, yp) = 3 AND hx$(up - 1, yp) + hx$(up, yp) = x$ THEN
  1856. p1$ = "LDB": p2$ = STR$(-3) + ",U": GOSUB 10
  1857. p1$ = "ANDB": p2$ = "#$0F": GOSUB 10
  1858. p1$ = "ORB": p2$ = "#$" + hx$(up - 2, yp): GOSUB 10: b$ = "XX"
  1859. p1$ = "PSHU": p2$ = "B,X": GOSUB 10
  1860. hx$(up - 2, yp) = "ub": hx$(up - 1, yp) = "ux1": hx$(up, yp) = "ux2"
  1861. up = up - 3: xp = xp - 3
  1862. pflag = 1: GOTO 825
  1863. END IF
  1864. IF calc(up - 2, yp) = 2 AND hx$(up - 1, yp) + hx$(up, yp) = y$ THEN
  1865. p1$ = "LDB": p2$ = STR$(-3) + ",U": GOSUB 10
  1866. p1$ = "ANDB": p2$ = "#$F0": GOSUB 10
  1867. p1$ = "ORB": p2$ = "#$" + hx$(up - 2, yp): GOSUB 10: b$ = "XX"
  1868. p1$ = "PSHU": p2$ = "B,Y": GOSUB 10
  1869. hx$(up - 2, yp) = "ub": hx$(up - 1, yp) = "uy1": hx$(up, yp) = "uy2"
  1870. up = up - 3: xp = xp - 3
  1871. pflag = 1: GOTO 825
  1872. END IF
  1873. IF calc(up - 2, yp) = 3 AND hx$(up - 1, yp) + hx$(up, yp) = y$ THEN
  1874. p1$ = "LDB": p2$ = STR$(-3) + ",U": GOSUB 10
  1875. p1$ = "ANDB": p2$ = "#$0F": GOSUB 10
  1876. p1$ = "ORB": p2$ = "#$" + hx$(up - 2, yp): GOSUB 10: b$ = "XX"
  1877. p1$ = "PSHU": p2$ = "B,Y": GOSUB 10
  1878. hx$(up - 2, yp) = "ub": hx$(up - 1, yp) = "uy1": hx$(up, yp) = "uy2"
  1879. up = up - 3: xp = xp - 3
  1880. pflag = 1: GOTO 825
  1881. END IF
  1882. END IF
  1883. GOTO 820
  1884.  
  1885. 'Handle 8 bit locations that have transparency (nibble as a 0)
  1886. 850 found = 0
  1887. 'p1$ = "this is it": p2$ = "": GOSUB 10
  1888. FOR x = 1 TO xp
  1889. IF calc(x, yp) = 2 AND hx$(x + 1, yp) = "ub" THEN
  1890. p1$ = "LDA": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  1891. p1$ = "ANDA": p2$ = "#$F0": GOSUB 10
  1892. p1$ = "ORA": p2$ = "#$" + hx$(x, yp): GOSUB 10: a$ = "XX"
  1893. p1$ = "STD": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  1894. found = 1
  1895. calc(x, yp) = -1
  1896. END IF
  1897. NEXT x
  1898. IF found = 0 THEN
  1899. FOR x = 1 TO xp
  1900. IF hx$(x, yp) = "ua" AND calc(x + 1, yp) = 3 THEN
  1901. p1$ = "LDB": p2$ = STR$(x - xp + 1 - 1) + ",U": GOSUB 10
  1902. p1$ = "ANDB": p2$ = "#$0F": GOSUB 10
  1903. p1$ = "ORB": p2$ = "#$" + hx$(x + 1, yp): GOSUB 10: b$ = "XX"
  1904. p1$ = "STD": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  1905. found = 1
  1906. calc(x + 1, yp) = -1
  1907. END IF
  1908. NEXT x
  1909. END IF
  1910. FOR x = 1 TO xp
  1911. IF calc(x, yp) = 2 THEN
  1912. p1$ = "LDB": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  1913. p1$ = "ANDB": p2$ = "#$F0": GOSUB 10
  1914. p1$ = "ORB": p2$ = "#$" + hx$(x, yp): GOSUB 10: b$ = "XX"
  1915. p1$ = "STB": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  1916. calc(x, yp) = -1
  1917. END IF
  1918. IF calc(x, yp) = 3 THEN
  1919. p1$ = "LDB": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  1920. p1$ = "ANDB": p2$ = "#$0F": GOSUB 10
  1921. p1$ = "ORB": p2$ = "#$" + hx$(x, yp): GOSUB 10: b$ = "XX"
  1922. p1$ = "STB": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  1923. calc(x, yp) = -1
  1924. END IF
  1925. NEXT x
  1926.  
  1927.  
  1928. 'See if we can use X or Y as they are top row
  1929. FOR x = 1 TO up - 1
  1930. IF calc(x, yp) = 1 AND calc(x + 1, yp) = 1 THEN
  1931. IF hx$(x, yp) + hx$(x + 1, yp) = x$ THEN
  1932. p1$ = "STX": p2$ = STR$(x - up - 1) + ",U": GOSUB 10
  1933. hx$(x, yp) = "ux1": hx$(x + 1, yp) = "ux2"
  1934. calc(x, yp) = -1: calc(x + 1, yp) = -1
  1935. END IF
  1936. IF hx$(x, yp) + hx$(x + 1, yp) = yx$ THEN
  1937. p1$ = "STY": p2$ = STR$(x - up - 1) + ",U": GOSUB 10
  1938. hx$(x, yp) = "uy1": hx$(x + 1, yp) = "uy2"
  1939. calc(x, yp) = -1: calc(x + 1, yp) = -1
  1940. END IF
  1941. END IF
  1942. NEXT x
  1943.  
  1944. count = 0
  1945. FOR x = 1 TO up - 1
  1946. 'PRINT #1, "Got here"
  1947. IF calc(x, yp) = 1 AND calc(x + 1, yp) = 1 THEN count = count + 1: tw$(count) = hx$(x, yp) + hx$(x + 1, yp): wordp(count) = x: x = x + 1
  1948. NEXT x
  1949.  
  1950. 'If the 16 bit values can be used to stack blast then load them, then blast them
  1951. d1 = 0: x1 = 0: y1 = 0: a1 = 0: b1 = 0
  1952.  
  1953. IF up > 5 THEN
  1954. IF calc(up - 5, yp) = 1 AND calc(up - 4, yp) = 1 AND calc(up - 3, yp) = 1 AND calc(up - 2, yp) = 1 AND calc(up - 1, yp) = 1 AND calc(up, yp) = 1 THEN
  1955. IF hx$(up - 5, yp) = a$ AND hx$(up - 4, yp) = b$ THEN d1 = 2 ELSE d1 = 1
  1956. IF hx$(up - 3, yp) + hx$(up - 2, yp) = x$ THEN x1 = 2 ELSE x1 = 1
  1957. IF hx$(up - 1, yp) + hx$(up, yp) = y$ THEN y1 = 2 ELSE y1 = 1
  1958. END IF
  1959. IF d1 = 1 THEN
  1960. IF a$ = hx$(up - 5, yp) THEN a1 = 2
  1961. IF b$ = hx$(up - 4, yp) THEN b1 = 2
  1962. IF a1 = 0 AND b1 = 0 THEN a$ = hx$(up - 5, yp): b$ = hx$(up - 4, yp): d$ = a$ + b$: p1$ = "LDD": p2$ = "#$" + d$: GOSUB 10: d1 = 2: a1 = 2: b1 = 2
  1963. IF d1 = 1 AND a1 = 2 THEN b$ = hx$(up - 4, yp): d$ = a$ + b$: p1$ = "LDB": p2$ = "#$" + b$: GOSUB 10: d1 = 2: a1 = 2: b1 = 2
  1964. IF d1 = 1 AND b1 = 2 THEN a$ = hx$(up - 5, yp): d$ = a$ + b$: p1$ = "LDA": p2$ = "#$" + a$: GOSUB 10: d1 = 2: a1 = 2: b1 = 2
  1965. END IF
  1966. IF x1 = 1 THEN
  1967. x$ = hx$(up - 3, yp) + hx$(up - 2, yp): p1$ = "LDX": p2$ = "#$" + x$: GOSUB 10: x1 = 2
  1968. END IF
  1969. IF y1 = 1 THEN
  1970. IF x$ = hx$(up - 1, yp) + hx$(up, yp) THEN
  1971. y$ = x$: p1$ = "LEAY": p2$ = ",X": GOSUB 10: y1 = 2
  1972. ELSE
  1973. y$ = hx$(up - 1, yp) + hx$(up, yp): p1$ = "LDY": p2$ = "#$" + y$: GOSUB 10: y1 = 2
  1974. END IF
  1975. END IF
  1976. ELSE
  1977. IF up > 4 THEN
  1978. IF calc(up - 4, yp) = 1 AND calc(up - 3, yp) = 1 AND calc(up - 2, yp) = 1 AND calc(up - 1, yp) = 1 AND calc(up, yp) = 1 THEN
  1979. IF hx$(up - 4, yp) = a$ THEN a1 = 2
  1980. IF hx$(up - 4, yp) = b$ THEN b1 = 2
  1981. IF a1 = 0 AND b1 = 0 THEN b1 = 1
  1982. IF hx$(up - 3, yp) + hx$(up - 2, yp) = x$ THEN x1 = 2 ELSE x1 = 1
  1983. IF hx$(up - 1, yp) + hx$(up, yp) = y$ THEN y1 = 2 ELSE y1 = 1
  1984. END IF
  1985. IF b1 = 1 THEN
  1986. b$ = hx$(up - 4, yp): d$ = a$ + b$: p1$ = "LDB": p2$ = "#$" + b$: GOSUB 10: d1 = 2: a1 = 2: b1 = 2
  1987. END IF
  1988. IF x1 = 1 THEN
  1989. x$ = hx$(up - 3, yp) + hx$(up - 2, yp): p1$ = "LDX": p2$ = "#$" + x$: GOSUB 10: x1 = 2
  1990. END IF
  1991. IF y1 = 1 THEN
  1992. IF x$ = hx$(up - 1, yp) + hx$(up, yp) THEN
  1993. y$ = x$: p1$ = "LEAY": p2$ = ",X": GOSUB 10: y1 = 2
  1994. ELSE
  1995. y$ = hx$(up - 1, yp) + hx$(up, yp): p1$ = "LDY": p2$ = "#$" + y$: GOSUB 10: y1 = 2
  1996. END IF
  1997. END IF
  1998. ELSE
  1999. IF up > 4 THEN
  2000. IF calc(up - 3, yp) = 1 AND calc(up - 2, yp) = 1 AND calc(up - 1, yp) = 1 AND calc(up, yp) = 1 THEN
  2001. IF hx$(up - 3, yp) + hx$(up - 2, yp) = x$ THEN x1 = 2 ELSE x1 = 1
  2002. IF hx$(up - 1, yp) + hx$(up, yp) = y$ THEN y1 = 2 ELSE y1 = 1
  2003. END IF
  2004. IF x1 = 1 THEN
  2005. x$ = hx$(up - 3, yp) + hx$(up - 2, yp): p1$ = "LDX": p2$ = "#$" + x$: GOSUB 10: x1 = 2
  2006. END IF
  2007. IF y1 = 1 THEN
  2008. IF x$ = hx$(up - 1, yp) + hx$(up, yp) THEN
  2009. y$ = x$: p1$ = "LEAY": p2$ = ",X": GOSUB 10: y1 = 2
  2010. ELSE
  2011. y$ = hx$(up - 1, yp) + hx$(up, yp): p1$ = "LDY": p2$ = "#$" + y$: GOSUB 10: y1 = 2
  2012. END IF
  2013. END IF
  2014. ELSE
  2015. IF up > 3 THEN
  2016. IF calc(up - 2, yp) = 1 AND calc(up - 1, yp) = 1 AND calc(up, yp) = 1 THEN
  2017. IF hx$(up - 2, yp) = a$ THEN a1 = 2
  2018. IF hx$(up - 2, yp) = b$ THEN b1 = 2
  2019. IF a1 = 0 AND b1 = 0 THEN b1 = 1
  2020. IF hx$(up - 1, yp) + hx$(up, yp) = x$ THEN x1 = 2 ELSE x1 = 1
  2021. END IF
  2022. IF b1 = 1 THEN
  2023. b$ = hx$(up - 2, yp): d$ = a$ + b$: p1$ = "LDB": p2$ = "#$" + b$: GOSUB 10: d1 = 2: a1 = 2: b1 = 2
  2024. END IF
  2025. IF x1 = 1 THEN
  2026. x$ = hx$(up - 1, yp) + hx$(up, yp): p1$ = "LDX": p2$ = "#$" + x$: GOSUB 10: x1 = 2
  2027. END IF
  2028. END IF
  2029. END IF
  2030. END IF
  2031. END IF
  2032.  
  2033. 'Check if used loaded, if so go back and look at the values at the new location (maybe we can blast again)
  2034. IF x1 = 2 THEN 825
  2035.  
  2036. 830 count = 0
  2037. FOR x = 1 TO up - 1
  2038. 'PRINT #1, "Got here"
  2039. IF calc(x, yp) = 1 AND calc(x + 1, yp) = 1 THEN count = count + 1: tw$(count) = hx$(x, yp) + hx$(x + 1, yp): wordp(count) = x: x = x + 1
  2040. NEXT x
  2041. IF count > 1 THEN
  2042. 'PRINT #1, "Got here 1"
  2043. 'p1$ = "count=": p2$ = STR$(count): GOSUB 10
  2044. GOSUB 20
  2045. IF newcount > 1 THEN
  2046. 'p1$ = "newcount": p2$ = STR$(newcount): GOSUB 10
  2047. FOR x = 1 TO newcount
  2048. IF a$ <> LEFT$(tw$(x), 2) AND b$ <> RIGHT$(tw$(x), 2) THEN
  2049. p1$ = "LDD": p2$ = "#$" + tw$(x): GOSUB 10
  2050. a$ = LEFT$(tw$(x), 2): b$ = RIGHT$(tw$(x), 2)
  2051. 'PRINT #1, "Got here 2"
  2052. END IF
  2053. IF a$ = LEFT$(tw$(x), 2) AND b$ <> RIGHT$(tw$(x), 2) THEN
  2054. p1$ = "LDB": p2$ = "#$" + RIGHT$(tw$(x), 2): GOSUB 10
  2055. b$ = RIGHT$(tw$(x), 2)
  2056. END IF
  2057. IF b$ = RIGHT$(tw$(x), 2) AND a$ <> LEFT$(tw$(x), 2) THEN
  2058. p1$ = "LDA": p2$ = "#$" + LEFT$(tw$(x), 2): GOSUB 10
  2059. a$ = LEFT$(tw$(x), 2)
  2060. END IF
  2061. 'PRINT #1, "Checking to see if we can use STD"
  2062. found = 0
  2063. FOR n = 1 TO up - 1
  2064. 'PRINT #1, p1$, p2$, n, tw$(x), a$, b$, hx$(n, yp), hx$(n + 1, yp)
  2065. IF tw$(x) = hx$(n, yp) + hx$(n + 1, yp) THEN
  2066. p1$ = "STD": p2$ = STR$(n - up - 1) + ",U": GOSUB 10
  2067. hx$(n, yp) = "ud1": hx$(n + 1, yp) = "ud2"
  2068. calc(n, yp) = -1: calc(n + 1, yp) = -1
  2069. found = 1
  2070. 'PRINT #1, "Got here 3"
  2071. END IF
  2072. NEXT n
  2073. 'check if we can store A or B
  2074. 'PRINT #1, "Checking to see if we can use STA or STB"
  2075. FOR n = 1 TO up
  2076. 'PRINT #1, "A", n, LEFT$(tw$(x), 2), a$, hx$(n, yp)
  2077. IF LEFT$(tw$(x), 2) = hx$(n, yp) THEN
  2078. p1$ = "STA": p2$ = STR$(n - up - 1) + ",U": GOSUB 10
  2079. hx$(n, yp) = "ua"
  2080. calc(n, yp) = -1
  2081. found = 1
  2082. 'PRINT #1, "Got here 3 - sta"
  2083. END IF
  2084. 'PRINT #1, "B"; x; n, RIGHT$(tw$(x), 2), b$, hx$(n, yp)
  2085. IF RIGHT$(tw$(x), 2) = hx$(n, yp) THEN
  2086. p1$ = "STB": p2$ = STR$(n - up - 1) + ",U": GOSUB 10
  2087. hx$(n, yp) = "ub"
  2088. calc(n, yp) = -1
  2089. found = 1
  2090. 'p1$ = "Got here 3 - stb": p2$ = "": GOSUB 10
  2091. END IF
  2092. NEXT n
  2093. IF found = 1 THEN GOTO 830
  2094. NEXT x
  2095. ELSE
  2096. count = 1
  2097. END IF
  2098. END IF
  2099.  
  2100. IF count = 1 THEN
  2101. x = count
  2102. IF a$ <> LEFT$(tw$(x), 2) AND b$ <> RIGHT$(tw$(x), 2) THEN
  2103. p1$ = "LDD": p2$ = "#$" + tw$(x): GOSUB 10
  2104. a$ = LEFT$(tw$(x), 2): b$ = RIGHT$(tw$(x), 2)
  2105. ELSE
  2106. IF a$ = LEFT$(tw$(x), 2) THEN
  2107. p1$ = "LDB": p2$ = "#$" + RIGHT$(tw$(x), 2): GOSUB 10
  2108. b$ = RIGHT$(tw$(x), 2)
  2109. END IF
  2110. IF b$ = RIGHT$(tw$(x), 2) THEN
  2111. p1$ = "LDA": p2$ = "#$" + LEFT$(tw$(x), 2): GOSUB 10
  2112. a$ = LEFT$(tw$(x), 2)
  2113. END IF
  2114. END IF
  2115. FOR n = 1 TO up
  2116. IF tw$(x) = hx$(n, yp) + hx$(n + 1, yp) THEN
  2117. p1$ = "STD": p2$ = STR$(n - up - 1) + ",U": GOSUB 10
  2118. hx$(n, yp) = "ud1": hx$(n + 1, yp) = "ud2"
  2119. calc(n, yp) = -1: calc(n + 1, yp) = -1
  2120. 'PRINT #1, "Got here 4"
  2121. END IF
  2122. NEXT n
  2123.  
  2124. 'check if we can store A or B
  2125. FOR n = 1 TO up
  2126. IF LEFT$(tw$(x), 2) = hx$(n, yp) THEN
  2127. p1$ = "STA": p2$ = STR$(n - up - 1) + ",U": GOSUB 10
  2128. hx$(n, yp) = "ua"
  2129. calc(n, yp) = -1
  2130. END IF
  2131. IF RIGHT$(tw$(x), 2) = hx$(n, yp) THEN
  2132. p1$ = "STB": p2$ = STR$(n - up - 1) + ",U": GOSUB 10
  2133. hx$(n, yp) = "ub"
  2134. calc(n, yp) = -1
  2135. 'p1$ = "Got here 4 - stb": p2$ = "": GOSUB 10
  2136. END IF
  2137. NEXT n
  2138. END IF
  2139.  
  2140. 'Check to see if we can use any 8 bit values (if not then we are done)
  2141. count = 0
  2142. FOR x = 1 TO xp
  2143. IF calc(x, yp) = 1 THEN count = count + 1: tw$(count) = hx$(x, yp)
  2144. NEXT x
  2145. IF count > 1 THEN
  2146. GOSUB 20
  2147. IF newcount > 1 THEN
  2148. FOR x = 1 TO newcount
  2149. p1$ = "LDB": p2$ = "#$" + tw$(x): GOSUB 10: b$ = tw$(x)
  2150. FOR n = 1 TO xp
  2151. IF tw$(x) = hx$(n, yp) THEN p1$ = "STB": p2$ = STR$(n - xp - 1) + ",U": GOSUB 10: calc(n, yp) = -1: hx$(n, yp) = "ub"
  2152. NEXT n
  2153. NEXT x
  2154. ELSE
  2155. count = 1
  2156. END IF
  2157. END IF
  2158. IF count = 1 THEN
  2159. x = count
  2160. p1$ = "LDB": p2$ = "#$" + tw$(x): GOSUB 10: b$ = tw$(x)
  2161. FOR n = 1 TO xp
  2162. IF tw$(x) = hx$(n, yp) THEN p1$ = "STB": p2$ = STR$(n - xp - 1) + ",U": GOSUB 10: calc(n, yp) = -1: hx$(n, yp) = "ub"
  2163. NEXT n
  2164. END IF
  2165. lastrow = yp
  2166. GOTO 405
  2167.  
  2168.  
  2169.  
  2170. 1000 yval = 0: ym = 0
  2171. 1050 PRINT #1, "**************************************************"
  2172. FOR y = 1 TO h
  2173. PRINT #1, "* ";
  2174. FOR x = 1 TO w
  2175. PRINT #1, hx$(x, y); " ";
  2176. NEXT x
  2177. PRINT #1, "-"; y
  2178. NEXT y
  2179. PRINT #1, "**************************************************"
  2180. IF subname$ = "" THEN
  2181. PRINT #1, "_Restore_"; LEFT$(Fname$, LEN(Fname$) - 4); ":"
  2182. ELSE
  2183. PRINT #1, "Restore_"; sn$
  2184. END IF
  2185. IF cyc = 1 THEN
  2186. PRINT #1, " opt cd"
  2187. PRINT #1, " opt cc"
  2188. END IF
  2189. ' position the starting point
  2190. fb = w
  2191. yp = h
  2192. xp = w
  2193. FOR y = 1 TO h
  2194. FOR x = 1 TO w
  2195. bcode = 0
  2196. byte = sp(x, y)
  2197. IF byte = 0 THEN GOTO 1120
  2198. bcode = 1
  2199. IF byte < 16 THEN bcode = 2
  2200. IF byte = (byte AND 240) THEN bcode = 3
  2201. 1120 calc(x, y) = bcode
  2202. 'IF y = 19 THEN PRINT x, y, calc(x, y), bcode
  2203. NEXT x
  2204. NEXT y
  2205.  
  2206. 'FOR y = 1 TO h
  2207. 'FOR x = 1 TO w
  2208. 'PRINT calc(x, y);
  2209. 'NEXT x
  2210. 'PRINT
  2211. 'NEXT y
  2212.  
  2213. FOR yp = h TO 1 STEP -1
  2214. 'fl = 0 then no stack usage, just do load/store on this row
  2215. 'fl = 1 then no stack usage, do load/store on this row and the row below it
  2216. 'fl = 2 then use stack on this line and do load/store on line below
  2217. 'fl = 3 then use stack on this line
  2218. 'fl = 4 then skip this row, row above will handle it
  2219. 'fl = 5 then ignore this row (no data to process)
  2220. fl = 0
  2221. FOR x = 1 TO w - 2
  2222. IF calc(x, yp) = 1 AND calc(x + 1, yp) = 1 AND calc(x + 2, yp) = 1 THEN fl = 3
  2223. IF calc(x, yp) = 2 AND calc(x + 1, yp) = 1 AND calc(x + 2, yp) = 1 THEN fl = 3
  2224. IF calc(x, yp) = 3 AND calc(x + 1, yp) = 1 AND calc(x + 2, yp) = 1 THEN fl = 3
  2225. NEXT x
  2226. IF fl = 3 THEN GOTO 1200
  2227. FOR x = 1 TO w - 3
  2228. IF calc(x, yp) <> 0 AND calc(x + 1, yp) <> 0 AND calc(x + 2, yp) = 1 AND calc(x + 3, yp) = 1 THEN fl = 3
  2229. NEXT x
  2230. IF fl = 3 THEN GOTO 1200
  2231. fl = 0
  2232. count = 0
  2233. FOR x = 1 TO w
  2234. count = count + calc(x, yp)
  2235. NEXT x
  2236. IF count = 0 THEN fl = 5
  2237. 1200
  2238. comp(yp) = fl
  2239. NEXT yp
  2240.  
  2241. y = h
  2242. 1210
  2243. IF comp(y) = 0 AND comp(y - 1) = 0 THEN comp(y) = 4: comp(y - 1) = 1: y = y - 2: GOTO 1250
  2244. IF comp(y) = 0 AND comp(y - 1) = 3 THEN comp(y) = 4: comp(y - 1) = 2: y = y - 2: GOTO 1250
  2245. y = y - 1
  2246. 1250 IF y > 1 THEN 1210
  2247.  
  2248. 'FOR y = 1 TO h
  2249. 'PRINT y - 1;
  2250. 'PRINT comp(y);
  2251. 'FOR x = 1 TO w
  2252. 'PRINT calc(x, y);
  2253. 'NEXT x
  2254. 'PRINT
  2255. 'NEXT y
  2256.  
  2257. yp = h
  2258. 1280 IF comp(yp) < 4 THEN 1300
  2259. yp = yp - 1
  2260. IF yp > 1 THEN GOTO 1280
  2261.  
  2262. 1300 IF comp(yp) > 1 THEN 1310
  2263. FOR x = w TO 1 STEP -1
  2264. IF sp(x, yp) <> 0 THEN xp = x: GOTO 1390
  2265. NEXT x
  2266. PRINT "Error... Should not get here. While finding starting point."
  2267. END
  2268.  
  2269. 1310 ' FOR x = w - 3 TO 1 STEP -1
  2270. 'IF calc(x, yp) = 1 AND calc(x + 1, yp) = 1 AND calc(x + 2, yp) = 1 THEN xp = x + 2: GOTO 1390
  2271. 'IF calc(x, yp) = 2 AND calc(x + 1, yp) = 1 AND calc(x + 2, yp) = 1 THEN xp = x + 2: GOTO 1390
  2272. 'IF calc(x, yp) = 3 AND calc(x + 1, yp) = 1 AND calc(x + 2, yp) = 1 THEN xp = x + 2: GOTO 1390
  2273. 'NEXT x
  2274.  
  2275. xp = 0
  2276. FOR x = 1 TO w
  2277. IF calc(x, yp) > 0 THEN xp = x
  2278. NEXT x
  2279.  
  2280. 'Starting location move down from the top left corner
  2281. 1390 PRINT #1, "* Row"; yp
  2282. a$ = "": b$ = "": x$ = "": y$ = ""
  2283. p1$ = "LEAU": p2$ = sw$ + "*" + STR$(yp - 1) + "+" + STR$(xp) + STR$(mv) + ",U": up = xp: leauFlag = 1: GOSUB 10
  2284. p1$ = "LEAY": p2$ = rest$: GOSUB 10
  2285.  
  2286. 1395 yp = h: lastrow = yp
  2287. 'yp = the current line to start on
  2288. 'comp(yp) tells us how to handle the current row
  2289.  
  2290. 'fl = 0 then no stack usage, just do load/store on this row
  2291. 'fl = 1 then no stack usage, do load/store on this row and the row below it
  2292. 'fl = 2 then use stack on this line and do load/store on line below
  2293. 'fl = 3 then use stack on this line
  2294. 'fl = 4 then skip this row, row above will handle it
  2295. 'fl = 5 then ignore this row (no data to process)
  2296.  
  2297. 'main loop - start of a new row to work on
  2298. 1400 IF comp(yp) < 4 THEN GOSUB 15: GOTO 1410
  2299. 1405 yp = yp - 1
  2300. IF yp > 0 THEN GOTO 1400
  2301. ' If we get here then we are done.
  2302. p1$ = "RTS": p2$ = ""
  2303. GOSUB 10: GOSUB 15
  2304. RETURN
  2305.  
  2306. 1410 IF comp(yp) = 0 THEN 1500
  2307. 1420 IF comp(yp) = 1 THEN 1600
  2308. 1430 IF comp(yp) = 2 THEN 1700
  2309. 1440 IF comp(yp) = 3 THEN 1800
  2310. PRINT "Error. Stopping, weird 1": END
  2311.  
  2312.  
  2313.  
  2314. 'fl = then no stack usage, do load/store on this row only
  2315. 1500 PRINT #1, "* Row"; yp; "1500": GOSUB 45
  2316. 'PRINT #1, "up="; up
  2317. IF leauFlag = 1 THEN leauFlag = 0: GOTO 1510
  2318. 'Setup U pointer
  2319. FOR x = 1 TO w
  2320. IF calc(x, yp) > 0 THEN p = x
  2321. NEXT x
  2322. IF calc(p, yp) > 1 THEN p = p - 1
  2323. move = p - up
  2324.  
  2325. xp = p
  2326. up = p
  2327. 'PRINT #1, "up="; up
  2328. p1$ = "LEAU"
  2329. IF move > 0 THEN
  2330. p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + "+" + STR$(move) + ",U"
  2331. ELSE
  2332. IF move < 0 THEN
  2333. p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + STR$(move) + ",U"
  2334. ELSE
  2335. p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + ",U"
  2336. END IF
  2337. END IF
  2338. GOSUB 10
  2339. p1$ = "LEAY": p2$ = rest$: GOSUB 10
  2340.  
  2341. x = up + 1
  2342. 'PRINT #1, "x="; x; "Calc(x,yp)="; calc(x, yp)
  2343. IF calc(x, yp) = 2 THEN
  2344. p1$ = "LDA": p2$ = ",Y": GOSUB 10
  2345. p1$ = "STA": p2$ = ",U": GOSUB 10
  2346. calc(x, yp) = -1
  2347. END IF
  2348. IF calc(x, yp) = 3 THEN
  2349. p1$ = "LDA": p2$ = ",Y": GOSUB 10
  2350. p1$ = "STA": p2$ = ",U": GOSUB 10
  2351. calc(x, yp) = -1
  2352. END IF
  2353.  
  2354. 1510 a = 0: b = 0: d = 0: x = 0: y = 0
  2355.  
  2356. FOR x = 1 TO xp - 1
  2357. IF calc(x, yp) > 0 AND calc(x + 1, yp) > 0 THEN
  2358. hx$(x, yp) = "ux1": hx$(x + 1, yp) = "ux2": calc(x, yp) = -1: calc(x + 1, yp) = -1: x = x + 1
  2359. END IF
  2360. NEXT x
  2361.  
  2362. FOR x = 1 TO xp
  2363. IF calc(x, yp) > 0 THEN
  2364. hx$(x, yp) = "ua": calc(x, yp) = -1
  2365. END IF
  2366. NEXT x
  2367.  
  2368. FOR x = 1 TO xp - 1
  2369. IF hx$(x, yp) = "ux1" THEN
  2370. p1$ = "LDX": p2$ = STR$(x - xp - 1) + ",Y": GOSUB 10
  2371. p1$ = "STX": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  2372. END IF
  2373. NEXT x
  2374.  
  2375. FOR x = 1 TO xp
  2376. IF hx$(x, yp) = "ua" THEN
  2377. p1$ = "LDA": p2$ = STR$(x - xp - 1) + ",Y": GOSUB 10
  2378. p1$ = "STA": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  2379. END IF
  2380. NEXT x
  2381. lastrow = yp
  2382. GOTO 1405
  2383.  
  2384. 'fl = 1 then no stack usage, do load/store on this row and the row below it
  2385. 1600 PRINT #1, "* Row"; yp; "and row"; yp + 1; "1600": GOSUB 45: yp = yp + 1: GOSUB 45: yp = yp - 1
  2386. 'PRINT #1, "up="; up
  2387. IF leauFlag = 1 THEN leauFlag = 0: GOTO 1608
  2388. 'Setup U pointer
  2389. FOR x = 1 TO w
  2390. IF calc(x, yp) > 0 THEN p = x
  2391. IF calc(x, yp + 1) > 0 THEN p2 = x
  2392. NEXT x
  2393. IF p2 >= p THEN
  2394. p = p2
  2395. ELSE
  2396. IF calc(p, yp) > 1 THEN p = p - 1
  2397. END IF
  2398. move = p - up
  2399.  
  2400. xp = p
  2401. up = p
  2402. 'PRINT #1, "up="; up
  2403. p1$ = "LEAU"
  2404. IF move > 0 THEN
  2405. p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + "+" + STR$(move) + ",U"
  2406. ELSE
  2407. IF move < 0 THEN
  2408. p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + STR$(move) + ",U"
  2409. ELSE
  2410. p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + ",U"
  2411. END IF
  2412. END IF
  2413. GOSUB 10
  2414. p1$ = "LEAY": p2$ = rest$: GOSUB 10: yval = 0
  2415. x = up + 1
  2416. 'PRINT #1, "x="; x; "Calc(x,yp)="; calc(x, yp)
  2417. IF calc(x, yp) = 2 THEN
  2418. p1$ = "LDA": p2$ = ",Y": GOSUB 10
  2419. p1$ = "STA": p2$ = ",U": GOSUB 10
  2420. calc(x, yp) = -1
  2421. END IF
  2422. IF calc(x, yp) = 3 THEN
  2423. p1$ = "LDA": p2$ = ",Y": GOSUB 10
  2424. p1$ = "STA": p2$ = ",U": GOSUB 10
  2425. calc(x, yp) = -1
  2426. END IF
  2427. 1608
  2428. FOR x = 1 TO w
  2429. IF calc(x, yp + 1) > 0 THEN p2 = x
  2430. NEXT x
  2431.  
  2432. 1610 a = 0: b = 0: d = 0: x = 0: y = 0
  2433. FOR x = 1 TO xp - 1
  2434. IF calc(x, yp) > 0 AND calc(x + 1, yp) > 0 THEN
  2435. hx$(x, yp) = "ux1": hx$(x + 1, yp) = "ux2": calc(x, yp) = -1: calc(x + 1, yp) = -1
  2436. END IF
  2437. NEXT x
  2438. 'Check row below
  2439. FOR x = 1 TO p2 - 1
  2440. IF calc(x, yp + 1) > 0 AND calc(x + 1, yp + 1) > 0 THEN
  2441. hx$(x, yp + 1) = "ux1": hx$(x + 1, yp + 1) = "ux2": calc(x, yp + 1) = -1: calc(x + 1, yp + 1) = -1
  2442. END IF
  2443. NEXT x
  2444.  
  2445. FOR x = 1 TO xp
  2446. IF calc(x, yp) > 0 THEN
  2447. hx$(x, yp) = "ua": calc(x, yp) = -1
  2448. END IF
  2449. NEXT x
  2450. 'Check row below
  2451. FOR x = 1 TO p2
  2452. IF calc(x, yp + 1) > 0 THEN
  2453. hx$(x, yp + 1) = "ua": calc(x, yp + 1) = -1
  2454. END IF
  2455. NEXT x
  2456.  
  2457. FOR x = 1 TO xp - 1
  2458. IF hx$(x, yp) = "ux1" THEN
  2459. p1$ = "LDX": p2$ = STR$(x - xp - 1) + ",Y": GOSUB 10
  2460. p1$ = "STX": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  2461. END IF
  2462. NEXT x
  2463. 'Check and handle row below
  2464. FOR x = 1 TO p2 - 1
  2465. IF hx$(x, yp + 1) = "ux1" THEN
  2466. p1$ = "LDX": p2$ = STR$(x - up + sw - 1) + ",Y": GOSUB 10
  2467. p1$ = "STX": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
  2468. END IF
  2469. NEXT x
  2470. FOR x = 1 TO xp
  2471. IF hx$(x, yp) = "ua" THEN
  2472. p1$ = "LDA": p2$ = STR$(x - xp - 1) + ",Y": GOSUB 10
  2473. p1$ = "STA": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  2474. END IF
  2475. NEXT x
  2476. 'Check and handle row below
  2477. FOR x = 1 TO p2
  2478. IF hx$(x, yp + 1) = "ua" THEN
  2479. p1$ = "LDA": p2$ = STR$(x - up + sw - 1) + ",Y": GOSUB 10
  2480. p1$ = "STA": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
  2481. END IF
  2482. NEXT x
  2483. lastrow = yp
  2484. GOTO 1405
  2485.  
  2486.  
  2487.  
  2488. 'fl = 2 then use stack on this line and do load/store on line below
  2489. 1700 PRINT #1, "* Row"; yp; "and row"; yp + 1; "1700": GOSUB 45: yp = yp + 1: GOSUB 45: yp = yp - 1
  2490. IF leauFlag = 1 THEN leauFlag = 0: GOTO 1704
  2491. 'Setup U pointer
  2492. FOR x = 1 TO w
  2493. IF calc(x, yp) > 0 THEN p = x
  2494. NEXT x
  2495. FOR x = 1 TO w
  2496. IF calc(x, yp + 1) > 0 THEN p2 = x
  2497. NEXT x
  2498. IF p2 > p THEN p = p2
  2499. move = p - up
  2500.  
  2501. xp = p
  2502. up = p
  2503. p1$ = "LEAU"
  2504. IF move > 0 THEN
  2505. p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + "+" + STR$(move) + ",U"
  2506. ELSE
  2507. IF move < 0 THEN
  2508. p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + STR$(move) + ",U"
  2509. ELSE
  2510. p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + ",U"
  2511. END IF
  2512. END IF
  2513. GOSUB 10
  2514. p1$ = "LEAY": p2$ = rest$: GOSUB 10
  2515.  
  2516. 1704
  2517. x = x + 1
  2518. 1705 IF calc(x, yp) > 0 THEN
  2519. p1$ = "LDA": p2$ = ",Y": GOSUB 10
  2520. p1$ = "STA": p2$ = ",U": GOSUB 10
  2521. calc(x, yp) = -1
  2522. END IF
  2523.  
  2524. 1710 a = 0: b = 0: d = 0: x = 0: y = 0
  2525. 'Check row below to see if we can store the value of any registers/accumulators with their current values
  2526. FOR x = 1 TO p2 - 1
  2527. IF calc(x, yp + 1) > 0 AND calc(x + 1, yp + 1) > 0 THEN
  2528. hx$(x, yp + 1) = "ux1": hx$(x + 1, yp + 1) = "ux2": calc(x, yp + 1) = -1: calc(x + 1, yp + 1) = -1
  2529. END IF
  2530. NEXT x
  2531. 'Check row below
  2532. FOR x = 1 TO p2
  2533. IF calc(x, yp + 1) > 0 THEN
  2534. hx$(x, yp + 1) = "ua": calc(x, yp + 1) = -1
  2535. END IF
  2536. NEXT x
  2537. 'Check and handle row below
  2538. FOR x = 1 TO p2 - 1
  2539. IF hx$(x, yp + 1) = "ux1" THEN
  2540. p1$ = "LDX": p2$ = STR$(x - up + sw - 1) + ",Y": GOSUB 10
  2541. p1$ = "STX": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
  2542. END IF
  2543. NEXT x
  2544. 'Check and handle row below
  2545. FOR x = 1 TO p2
  2546. IF hx$(x, yp + 1) = "ua" THEN
  2547. p1$ = "LDA": p2$ = STR$(x - up + sw - 1) + ",Y": GOSUB 10
  2548. p1$ = "STA": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
  2549. END IF
  2550. NEXT x
  2551.  
  2552. 'See if we can stack blast D (A or B) ,X
  2553. pflag = 1: yval = 0: stp = 0
  2554. 1725 IF up > 3 THEN
  2555. IF calc(up - 3, yp) > 0 AND calc(up - 2, yp) > 0 AND calc(up - 1, yp) > 0 AND calc(up, yp) > 0 THEN
  2556. p1$ = "LDX": p2$ = STR$(stp - 2) + ",Y": GOSUB 10
  2557. p1$ = "LDD": p2$ = STR$(stp - 4) + ",Y": GOSUB 10
  2558. p1$ = "PSHU": p2$ = "D,X": GOSUB 10
  2559. up = up - 4: yval = yval + 4: stp = stp - 4
  2560. GOTO 1725
  2561. END IF
  2562. END IF
  2563. IF up > 2 THEN
  2564. IF calc(up - 2, yp) > 0 AND calc(up - 1, yp) > 0 AND calc(up, yp) > 0 THEN
  2565. p1$ = "LDX": p2$ = STR$(stp - 2) + ",Y": GOSUB 10
  2566. p1$ = "LDA": p2$ = STR$(stp - 3) + ",Y": GOSUB 10
  2567. p1$ = "PSHU": p2$ = "A,X": GOSUB 10
  2568. up = up - 3: yval = yval + 3: stp = stp - 3
  2569. pflag = 1
  2570. GOTO 1725
  2571. END IF
  2572. END IF
  2573. 'Do Load/Store for the rest of the top line
  2574. FOR x = 1 TO up - 1
  2575. IF calc(x, yp) > 0 AND calc(x + 1, yp) > 0 THEN
  2576. hx$(x, yp) = "ux1": hx$(x + 1, yp) = "ux2": calc(x, yp) = -1: calc(x + 1, yp) = -1: x = x + 1
  2577. END IF
  2578. NEXT x
  2579. FOR x = 1 TO up
  2580. IF calc(x, yp) > 0 THEN
  2581. hx$(x, yp) = "ua": calc(x, yp) = -1
  2582. END IF
  2583. NEXT x
  2584. FOR x = 1 TO up - 1
  2585. IF hx$(x, yp) = "ux1" THEN
  2586. p1$ = "LDX": p2$ = STR$(x - up - 1 - yval) + ",Y": GOSUB 10
  2587. p1$ = "STX": p2$ = STR$(x - up - 1) + ",U": GOSUB 10
  2588. END IF
  2589. NEXT x
  2590. FOR x = 1 TO up
  2591. IF hx$(x, yp) = "ua" THEN
  2592. p1$ = "LDA": p2$ = STR$(x - up - 1 - yval) + ",Y": GOSUB 10
  2593. p1$ = "STA": p2$ = STR$(x - up - 1) + ",U": GOSUB 10
  2594. END IF
  2595. NEXT x
  2596. lastrow = yp
  2597. GOTO 1405
  2598.  
  2599.  
  2600.  
  2601. 'fl = 3 then use stack on this line
  2602. 1800 PRINT #1, "* Row"; yp; "1800": GOSUB 45
  2603. x = up + 1
  2604. IF leauFlag = 1 THEN leauFlag = 0: GOTO 1805
  2605. 'Setup U pointer
  2606. FOR x = 1 TO w
  2607. IF calc(x, yp) > 0 THEN p = x
  2608. NEXT x
  2609.  
  2610. move = p - up
  2611. xp = p
  2612. up = p
  2613. p1$ = "LEAU"
  2614. IF move > 0 THEN
  2615. p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + "+" + STR$(move) + ",U"
  2616. ELSE
  2617. IF move < 0 THEN
  2618. p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + STR$(move) + ",U"
  2619. ELSE
  2620. p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + ",U"
  2621. END IF
  2622. END IF
  2623. GOSUB 10
  2624. p1$ = "LEAY"
  2625. IF move <> 0 THEN
  2626. p2$ = STR$(-VAL(sw$) - yval + move) + ",Y"
  2627. ELSE
  2628. p2$ = STR$(-VAL(sw$) - yval) + ",Y"
  2629. END IF
  2630. GOSUB 10
  2631. x = p
  2632. 1804 GOTO 1808
  2633. 1805 IF calc(x, yp) > 0 THEN
  2634. p1$ = "LDA": p2$ = ",Y": GOSUB 10
  2635. p1$ = "STA": p2$ = ",U": GOSUB 10
  2636. calc(x, yp) = -1
  2637. END IF
  2638. 1808
  2639. 1810 a = 0: b = 0: d = 0: x = 0: y = 0
  2640. 'See if we can stack blast D or A and X
  2641. pflag = 1: yval = 0
  2642. 1825 IF up > 3 THEN
  2643. IF calc(up - 3, yp) > 0 AND calc(up - 2, yp) > 0 AND calc(up - 1, yp) > 0 AND calc(up, yp) > 0 THEN
  2644. p1$ = "LDX": p2$ = STR$(-2 - yval) + ",Y": GOSUB 10
  2645. p1$ = "LDD": p2$ = STR$(-4 - yval) + ",Y": GOSUB 10
  2646. p1$ = "PSHU": p2$ = "D,X": GOSUB 10
  2647. up = up - 4: yval = yval + 4
  2648. GOTO 1825
  2649. END IF
  2650. END IF
  2651. IF up > 2 THEN
  2652. IF calc(up - 2, yp) > 0 AND calc(up - 1, yp) > 0 AND calc(up, yp) > 0 THEN
  2653. p1$ = "LDX": p2$ = STR$(-2 - yval) + ",Y": GOSUB 10
  2654. p1$ = "LDA": p2$ = STR$(-3 - yval) + ",Y": GOSUB 10
  2655. p1$ = "PSHU": p2$ = "A,X": GOSUB 10
  2656. up = up - 3: yval = yval + 3
  2657. pflag = 1
  2658. GOTO 1825
  2659. END IF
  2660. END IF
  2661.  
  2662. 'Do Load/Store for the rest of the line
  2663. FOR x = 1 TO up - 1
  2664. IF calc(x, yp) > 0 AND calc(x + 1, yp) > 0 THEN
  2665. hx$(x, yp) = "ux1": hx$(x + 1, yp) = "ux2": calc(x, yp) = -1: calc(x + 1, yp) = -1: x = x + 1
  2666. END IF
  2667. NEXT x
  2668. FOR x = 1 TO up
  2669. IF calc(x, yp) > 0 THEN
  2670. hx$(x, yp) = "ua": calc(x, yp) = -1
  2671. END IF
  2672. NEXT x
  2673. FOR x = 1 TO up - 1
  2674. IF hx$(x, yp) = "ux1" THEN
  2675. p1$ = "LDX": p2$ = STR$(x - up - 1 - yval) + ",Y": GOSUB 10
  2676. p1$ = "STX": p2$ = STR$(x - up - 1) + ",U": GOSUB 10
  2677. END IF
  2678. NEXT x
  2679. FOR x = 1 TO up
  2680. IF hx$(x, yp) = "ua" THEN
  2681. p1$ = "LDA": p2$ = STR$(x - up - 1 - yval) + ",Y": GOSUB 10
  2682. p1$ = "STA": p2$ = STR$(x - up - 1) + ",U": GOSUB 10
  2683. END IF
  2684. NEXT x
  2685. lastrow = yp
  2686. GOTO 1405
  2687.  
  2688.  
  2689.  
  2690.  
  2691. 'Restore behind the sprite with the hex value in rest$
  2692. 2000 yval = 0: ym = 0
  2693. 2050 PRINT #1, "**************************************************"
  2694. FOR y = 1 TO h
  2695. PRINT #1, "* ";
  2696. FOR x = 1 TO w
  2697. PRINT #1, hx$(x, y); " ";
  2698. NEXT x
  2699. PRINT #1, "-"; y
  2700. NEXT y
  2701. PRINT #1, "**************************************************"
  2702. IF subname$ = "" THEN
  2703. PRINT #1, "_Restore_"; LEFT$(Fname$, LEN(Fname$) - 4); ":"
  2704. ELSE
  2705. PRINT #1, "Restore_"; sn$
  2706. END IF
  2707. IF cyc = 1 THEN
  2708. PRINT #1, " opt cd"
  2709. PRINT #1, " opt cc"
  2710. END IF
  2711. ' position the starting point
  2712. fb = w
  2713. yp = h
  2714. xp = w
  2715. FOR y = 1 TO h
  2716. FOR x = 1 TO w
  2717. bcode = 0
  2718. byte = sp(x, y)
  2719. IF byte = 0 THEN GOTO 2120
  2720. bcode = 1
  2721. IF byte < 16 THEN bcode = 2
  2722. IF byte = (byte AND 240) THEN bcode = 3
  2723. 2120 calc(x, y) = bcode
  2724. 'IF y = 19 THEN PRINT x, y, calc(x, y), bcode
  2725. NEXT x
  2726. NEXT y
  2727.  
  2728. FOR yp = h TO 1 STEP -1
  2729. 'fl = 0 then no stack usage, just do store on this row
  2730. 'fl = 1 then no stack usage, do store on this row and the row below it
  2731. 'fl = 2 then use stack on this line and do store on line below
  2732. 'fl = 3 then use stack on this line
  2733. 'fl = 4 then skip this row, row above will handle it
  2734. 'fl = 5 then ignore this row (no data to process)
  2735. fl = 0
  2736. FOR x = 1 TO w - 2
  2737. IF calc(x, yp) = 1 AND calc(x + 1, yp) = 1 AND calc(x + 2, yp) = 1 THEN fl = 3
  2738. IF calc(x, yp) = 2 AND calc(x + 1, yp) = 1 AND calc(x + 2, yp) = 1 THEN fl = 3
  2739. IF calc(x, yp) = 3 AND calc(x + 1, yp) = 1 AND calc(x + 2, yp) = 1 THEN fl = 3
  2740. NEXT x
  2741. IF fl = 3 THEN GOTO 2200
  2742. FOR x = 1 TO w - 3
  2743. IF calc(x, yp) <> 0 AND calc(x + 1, yp) <> 0 AND calc(x + 2, yp) = 1 AND calc(x + 3, yp) = 1 THEN fl = 3
  2744. NEXT x
  2745. IF fl = 3 THEN GOTO 2200
  2746. fl = 0
  2747. count = 0
  2748. FOR x = 1 TO w
  2749. count = count + calc(x, yp)
  2750. NEXT x
  2751. IF count = 0 THEN fl = 5
  2752. 2200
  2753. comp(yp) = fl
  2754. NEXT yp
  2755.  
  2756. y = h
  2757. 2210
  2758. IF comp(y) = 0 AND comp(y - 1) = 0 THEN comp(y) = 4: comp(y - 1) = 1: y = y - 2: GOTO 2250
  2759. IF comp(y) = 0 AND comp(y - 1) = 3 THEN comp(y) = 4: comp(y - 1) = 2: y = y - 2: GOTO 2250
  2760. y = y - 1
  2761. 2250 IF y > 1 THEN 2210
  2762.  
  2763. yp = h
  2764. 2280 IF comp(yp) < 4 THEN 2300
  2765. yp = yp - 1
  2766. IF yp > 1 THEN GOTO 2280
  2767.  
  2768. 2300 IF comp(yp) > 1 THEN 2310
  2769. FOR x = w TO 1 STEP -1
  2770. IF sp(x, yp) <> 0 THEN xp = x: GOTO 2390
  2771. NEXT x
  2772. PRINT "Error... Should not get here. While finding starting point."
  2773. END
  2774.  
  2775. 2310 ' FOR x = w - 3 TO 1 STEP -1
  2776. 'IF calc(x, yp) = 1 AND calc(x + 1, yp) = 1 AND calc(x + 2, yp) = 1 THEN xp = x + 2: GOTO 1390
  2777. 'IF calc(x, yp) = 2 AND calc(x + 1, yp) = 1 AND calc(x + 2, yp) = 1 THEN xp = x + 2: GOTO 1390
  2778. 'IF calc(x, yp) = 3 AND calc(x + 1, yp) = 1 AND calc(x + 2, yp) = 1 THEN xp = x + 2: GOTO 1390
  2779. 'NEXT x
  2780.  
  2781. xp = 0
  2782. FOR x = 1 TO w
  2783. IF calc(x, yp) > 0 THEN xp = x
  2784. NEXT x
  2785.  
  2786. 'Starting location move down from the top left corner
  2787. 2390 PRINT #1, "* Row"; yp
  2788. a$ = rest$: b$ = a$: d$ = a$ + b$: x$ = d$: y$ = x$
  2789. p1$ = "LDD": p2$ = "#$" + rest$ + rest$: GOSUB 10
  2790. p1$ = "LDX": p2$ = "#$" + rest$ + rest$: GOSUB 10
  2791. p1$ = "LEAY": p2$ = ",X": GOSUB 10
  2792.  
  2793. p1$ = "LEAU": p2$ = sw$ + "*" + STR$(yp - 1) + "+" + STR$(xp) + STR$(mv) + ",U": up = xp: leauFlag = 1: GOSUB 10
  2794. 'p1$ = "LEAY": p2$ = rest$: GOSUB 10
  2795.  
  2796. 2395 yp = h: lastrow = yp
  2797. 'yp = the current line to start on
  2798. 'comp(yp) tells us how to handle the current row
  2799.  
  2800. 'fl = 0 then no stack usage, just do store on this row
  2801. 'fl = 1 then no stack usage, do store on this row and the row below it
  2802. 'fl = 2 then use stack on this line and do store on line below
  2803. 'fl = 3 then use stack on this line
  2804. 'fl = 4 then skip this row, row above will handle it
  2805. 'fl = 5 then ignore this row (no data to process)
  2806.  
  2807. 'main loop - start of a new row to work on
  2808. 2400 IF comp(yp) < 4 THEN GOSUB 15: GOTO 2410
  2809. 2405 yp = yp - 1
  2810. IF yp > 0 THEN GOTO 2400
  2811. ' If we get here then we are done.
  2812. p1$ = "RTS": p2$ = ""
  2813. GOSUB 10: GOSUB 15
  2814. RETURN
  2815.  
  2816. 2410 IF comp(yp) = 0 THEN 2500
  2817. 2420 IF comp(yp) = 1 THEN 2600
  2818. 2430 IF comp(yp) = 2 THEN 2700
  2819. 2440 IF comp(yp) = 3 THEN 2800
  2820. PRINT "Error. Stopping, weird 1": END
  2821.  
  2822.  
  2823. 'fl = 0 then no stack usage, do store on this row only
  2824. 2500 PRINT #1, "* Row"; yp; "2500": GOSUB 45
  2825. 'PRINT #1, "up="; up
  2826. IF leauFlag = 1 THEN leauFlag = 0: GOTO 2510
  2827. 'Setup U pointer
  2828. FOR x = 1 TO w
  2829. IF calc(x, yp) > 0 THEN p = x
  2830. NEXT x
  2831. IF calc(p, yp) > 1 THEN p = p - 1
  2832. move = p - up
  2833.  
  2834. xp = p
  2835. up = p
  2836. 'PRINT #1, "up="; up
  2837. p1$ = "LEAU"
  2838. IF move > 0 THEN
  2839. p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + "+" + STR$(move) + ",U"
  2840. ELSE
  2841. IF move < 0 THEN
  2842. p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + STR$(move) + ",U"
  2843. ELSE
  2844. p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + ",U"
  2845. END IF
  2846. END IF
  2847. GOSUB 10
  2848. 'p1$ = "LEAY": p2$ = rest$: GOSUB 10
  2849.  
  2850. x = up + 1
  2851. 'PRINT #1, "x="; x; "Calc(x,yp)="; calc(x, yp)
  2852. IF calc(x, yp) = 2 THEN
  2853. ' p1$ = "LDA": p2$ = ",Y": GOSUB 10
  2854. p1$ = "STA": p2$ = ",U": GOSUB 10
  2855. calc(x, yp) = -1
  2856. END IF
  2857. IF calc(x, yp) = 3 THEN
  2858. ' p1$ = "LDA": p2$ = ",Y": GOSUB 10
  2859. p1$ = "STA": p2$ = ",U": GOSUB 10
  2860. calc(x, yp) = -1
  2861. END IF
  2862.  
  2863. 2510 a = 0: b = 0: d = 0: x = 0: y = 0
  2864. FOR x = 1 TO xp - 1
  2865. IF calc(x, yp) > 0 AND calc(x + 1, yp) > 0 THEN
  2866. hx$(x, yp) = "ux1": hx$(x + 1, yp) = "ux2": calc(x, yp) = -1: calc(x + 1, yp) = -1: x = x + 1
  2867. END IF
  2868. NEXT x
  2869.  
  2870. FOR x = 1 TO xp
  2871. IF calc(x, yp) > 0 THEN
  2872. hx$(x, yp) = "ua": calc(x, yp) = -1
  2873. END IF
  2874. NEXT x
  2875.  
  2876. FOR x = 1 TO xp - 1
  2877. IF hx$(x, yp) = "ux1" THEN
  2878. ' p1$ = "LDX": p2$ = STR$(x - xp - 1) + ",Y": GOSUB 10
  2879. p1$ = "STX": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  2880. END IF
  2881. NEXT x
  2882.  
  2883. FOR x = 1 TO xp
  2884. IF hx$(x, yp) = "ua" THEN
  2885. ' p1$ = "LDA": p2$ = STR$(x - xp - 1) + ",Y": GOSUB 10
  2886. p1$ = "STA": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  2887. END IF
  2888. NEXT x
  2889. lastrow = yp
  2890. GOTO 2405
  2891.  
  2892. 'fl = 1 then no stack usage, do store on this row and the row below it
  2893. 2600 PRINT #1, "* Row"; yp; "and row"; yp + 1; "2600": GOSUB 45: yp = yp + 1: GOSUB 45: yp = yp - 1
  2894. 'PRINT #1, "up="; up
  2895. IF leauFlag = 1 THEN leauFlag = 0: GOTO 2608
  2896. 'Setup U pointer
  2897. FOR x = 1 TO w
  2898. IF calc(x, yp) > 0 THEN p = x
  2899. IF calc(x, yp + 1) > 0 THEN p2 = x
  2900. NEXT x
  2901. IF p2 >= p THEN
  2902. p = p2
  2903. ELSE
  2904. IF calc(p, yp) > 1 THEN p = p - 1
  2905. END IF
  2906. move = p - up
  2907.  
  2908. xp = p
  2909. up = p
  2910. 'PRINT #1, "up="; up
  2911. p1$ = "LEAU"
  2912. IF move > 0 THEN
  2913. p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + "+" + STR$(move) + ",U"
  2914. ELSE
  2915. IF move < 0 THEN
  2916. p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + STR$(move) + ",U"
  2917. ELSE
  2918. p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + ",U"
  2919. END IF
  2920. END IF
  2921. GOSUB 10
  2922. 'p1$ = "LEAY": p2$ = rest$: GOSUB 10: yval = 0
  2923. x = up + 1
  2924. 'PRINT #1, "x="; x; "Calc(x,yp)="; calc(x, yp)
  2925. IF calc(x, yp) = 2 THEN
  2926. ' p1$ = "LDA": p2$ = ",Y": GOSUB 10
  2927. p1$ = "STA": p2$ = ",U": GOSUB 10
  2928. calc(x, yp) = -1
  2929. END IF
  2930. IF calc(x, yp) = 3 THEN
  2931. ' p1$ = "LDA": p2$ = ",Y": GOSUB 10
  2932. p1$ = "STA": p2$ = ",U": GOSUB 10
  2933. calc(x, yp) = -1
  2934. END IF
  2935. 2608
  2936. FOR x = 1 TO w
  2937. IF calc(x, yp + 1) > 0 THEN p2 = x
  2938. NEXT x
  2939.  
  2940. 2610 a = 0: b = 0: d = 0: x = 0: y = 0
  2941. FOR x = 1 TO xp - 1
  2942. IF calc(x, yp) > 0 AND calc(x + 1, yp) > 0 THEN
  2943. hx$(x, yp) = "ux1": hx$(x + 1, yp) = "ux2": calc(x, yp) = -1: calc(x + 1, yp) = -1
  2944. END IF
  2945. NEXT x
  2946. 'Check row below
  2947. FOR x = 1 TO p2 - 1
  2948. IF calc(x, yp + 1) > 0 AND calc(x + 1, yp + 1) > 0 THEN
  2949. hx$(x, yp + 1) = "ux1": hx$(x + 1, yp + 1) = "ux2": calc(x, yp + 1) = -1: calc(x + 1, yp + 1) = -1
  2950. END IF
  2951. NEXT x
  2952.  
  2953. FOR x = 1 TO xp
  2954. IF calc(x, yp) > 0 THEN
  2955. hx$(x, yp) = "ua": calc(x, yp) = -1
  2956. END IF
  2957. NEXT x
  2958. 'Check row below
  2959. FOR x = 1 TO p2
  2960. IF calc(x, yp + 1) > 0 THEN
  2961. hx$(x, yp + 1) = "ua": calc(x, yp + 1) = -1
  2962. END IF
  2963. NEXT x
  2964.  
  2965. FOR x = 1 TO xp - 1
  2966. IF hx$(x, yp) = "ux1" THEN
  2967. ' p1$ = "LDX": p2$ = STR$(x - xp - 1) + ",Y": GOSUB 10
  2968. p1$ = "STX": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  2969. END IF
  2970. NEXT x
  2971. 'Check and handle row below
  2972. FOR x = 1 TO p2 - 1
  2973. IF hx$(x, yp + 1) = "ux1" THEN
  2974. ' p1$ = "LDX": p2$ = STR$(x - up + sw - 1) + ",Y": GOSUB 10
  2975. p1$ = "STX": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
  2976. END IF
  2977. NEXT x
  2978. FOR x = 1 TO xp
  2979. IF hx$(x, yp) = "ua" THEN
  2980. ' p1$ = "LDA": p2$ = STR$(x - xp - 1) + ",Y": GOSUB 10
  2981. p1$ = "STA": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
  2982. END IF
  2983. NEXT x
  2984. 'Check and handle row below
  2985. FOR x = 1 TO p2
  2986. IF hx$(x, yp + 1) = "ua" THEN
  2987. ' p1$ = "LDA": p2$ = STR$(x - up + sw - 1) + ",Y": GOSUB 10
  2988. p1$ = "STA": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
  2989. END IF
  2990. NEXT x
  2991. lastrow = yp
  2992. GOTO 2405
  2993.  
  2994.  
  2995.  
  2996. 'fl = 2 then use stack on this line and do load/store on line below
  2997. 2700 PRINT #1, "* Row"; yp; "and row"; yp + 1; "2700": GOSUB 45: yp = yp + 1: GOSUB 45: yp = yp - 1
  2998. IF leauFlag = 1 THEN leauFlag = 0: GOTO 2704
  2999. 'Setup U pointer
  3000. FOR x = 1 TO w
  3001. IF calc(x, yp) > 0 THEN p = x
  3002. NEXT x
  3003. FOR x = 1 TO w
  3004. IF calc(x, yp + 1) > 0 THEN p2 = x
  3005. NEXT x
  3006. IF p2 > p THEN p = p2
  3007. move = p - up
  3008.  
  3009. xp = p
  3010. up = p
  3011. p1$ = "LEAU"
  3012. IF move > 0 THEN
  3013. p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + "+" + STR$(move) + ",U"
  3014. ELSE
  3015. IF move < 0 THEN
  3016. p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + STR$(move) + ",U"
  3017. ELSE
  3018. p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + ",U"
  3019. END IF
  3020. END IF
  3021. GOSUB 10
  3022. 'p1$ = "LEAY": p2$ = rest$: GOSUB 10
  3023.  
  3024. 2704
  3025. x = x + 1
  3026. 2705 IF calc(x, yp) > 0 THEN
  3027. ' p1$ = "LDA": p2$ = ",Y": GOSUB 10
  3028. p1$ = "STA": p2$ = ",U": GOSUB 10
  3029. calc(x, yp) = -1
  3030. END IF
  3031.  
  3032. 2710 a = 0: b = 0: d = 0: x = 0: y = 0
  3033. 'Check row below to see if we can store the value of any registers/accumulators with their current values
  3034. FOR x = 1 TO p2 - 1
  3035. IF calc(x, yp + 1) > 0 AND calc(x + 1, yp + 1) > 0 THEN
  3036. hx$(x, yp + 1) = "ux1": hx$(x + 1, yp + 1) = "ux2": calc(x, yp + 1) = -1: calc(x + 1, yp + 1) = -1
  3037. END IF
  3038. NEXT x
  3039. 'Check row below
  3040. FOR x = 1 TO p2
  3041. IF calc(x, yp + 1) > 0 THEN
  3042. hx$(x, yp + 1) = "ua": calc(x, yp + 1) = -1
  3043. END IF
  3044. NEXT x
  3045. 'Check and handle row below
  3046. FOR x = 1 TO p2 - 1
  3047. IF hx$(x, yp + 1) = "ux1" THEN
  3048. ' p1$ = "LDX": p2$ = STR$(x - up + sw - 1) + ",Y": GOSUB 10
  3049. p1$ = "STX": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
  3050. END IF
  3051. NEXT x
  3052. 'Check and handle row below
  3053. FOR x = 1 TO p2
  3054. IF hx$(x, yp + 1) = "ua" THEN
  3055. ' p1$ = "LDA": p2$ = STR$(x - up + sw - 1) + ",Y": GOSUB 10
  3056. p1$ = "STA": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
  3057. END IF
  3058. NEXT x
  3059.  
  3060. 'See if we can stack blast D (A or B) ,X,Y
  3061. pflag = 1: yval = 0: stp = 0
  3062. 2725 IF up > 5 THEN
  3063. IF calc(up - 5, yp) > 0 AND calc(up - 4, yp) > 0 AND calc(up - 3, yp) > 0 AND calc(up - 2, yp) > 0 AND calc(up - 1, yp) > 0 AND calc(up, yp) > 0 THEN
  3064. ' p1$ = "LDX": p2$ = STR$(stp - 2) + ",Y": GOSUB 10
  3065. ' p1$ = "LDD": p2$ = STR$(stp - 4) + ",Y": GOSUB 10
  3066. p1$ = "PSHU": p2$ = "D,X,Y": GOSUB 10
  3067. up = up - 6: yval = yval + 6: stp = stp - 6
  3068. GOTO 2725
  3069. END IF
  3070. END IF
  3071. IF up > 4 THEN
  3072. IF calc(up - 4, yp) > 0 AND calc(up - 3, yp) > 0 AND calc(up - 2, yp) > 0 AND calc(up - 1, yp) > 0 AND calc(up, yp) > 0 THEN
  3073. ' p1$ = "LDX": p2$ = STR$(stp - 2) + ",Y": GOSUB 10
  3074. ' p1$ = "LDD": p2$ = STR$(stp - 4) + ",Y": GOSUB 10
  3075. p1$ = "PSHU": p2$ = "A,X,Y": GOSUB 10
  3076. up = up - 5: yval = yval + 5: stp = stp - 5
  3077. GOTO 2725
  3078. END IF
  3079. END IF
  3080. IF up > 3 THEN
  3081. IF calc(up - 3, yp) > 0 AND calc(up - 2, yp) > 0 AND calc(up - 1, yp) > 0 AND calc(up, yp) > 0 THEN
  3082. ' p1$ = "LDX": p2$ = STR$(stp - 2) + ",Y": GOSUB 10
  3083. ' p1$ = "LDD": p2$ = STR$(stp - 4) + ",Y": GOSUB 10
  3084. p1$ = "PSHU": p2$ = "D,X": GOSUB 10
  3085. up = up - 4: yval = yval + 4: stp = stp - 4
  3086. GOTO 2725
  3087. END IF
  3088. END IF
  3089. IF up > 2 THEN
  3090. IF calc(up - 2, yp) > 0 AND calc(up - 1, yp) > 0 AND calc(up, yp) > 0 THEN
  3091. 'p1$ = "LDX": p2$ = STR$(stp - 2) + ",Y": GOSUB 10
  3092. 'p1$ = "LDA": p2$ = STR$(stp - 3) + ",Y": GOSUB 10
  3093. p1$ = "PSHU": p2$ = "A,X": GOSUB 10
  3094. up = up - 3: yval = yval + 3: stp = stp - 3
  3095. pflag = 1
  3096. GOTO 2725
  3097. END IF
  3098. END IF
  3099. 'Do Load/Store for the rest of the top line
  3100. FOR x = 1 TO up - 1
  3101. IF calc(x, yp) > 0 AND calc(x + 1, yp) > 0 THEN
  3102. hx$(x, yp) = "ux1": hx$(x + 1, yp) = "ux2": calc(x, yp) = -1: calc(x + 1, yp) = -1: x = x + 1
  3103. END IF
  3104. NEXT x
  3105. FOR x = 1 TO up
  3106. IF calc(x, yp) > 0 THEN
  3107. hx$(x, yp) = "ua": calc(x, yp) = -1
  3108. END IF
  3109. NEXT x
  3110. FOR x = 1 TO up - 1
  3111. IF hx$(x, yp) = "ux1" THEN
  3112. 'p1$ = "LDX": p2$ = STR$(x - up - 1 - yval) + ",Y": GOSUB 10
  3113. p1$ = "STX": p2$ = STR$(x - up - 1) + ",U": GOSUB 10
  3114. END IF
  3115. NEXT x
  3116. FOR x = 1 TO up
  3117. IF hx$(x, yp) = "ua" THEN
  3118. 'p1$ = "LDA": p2$ = STR$(x - up - 1 - yval) + ",Y": GOSUB 10
  3119. p1$ = "STA": p2$ = STR$(x - up - 1) + ",U": GOSUB 10
  3120. END IF
  3121. NEXT x
  3122. lastrow = yp
  3123. GOTO 2405
  3124.  
  3125.  
  3126.  
  3127. 'fl = 3 then use stack on this line
  3128. 2800 PRINT #1, "* Row"; yp; "2800": GOSUB 45
  3129. x = up + 1
  3130. IF leauFlag = 1 THEN leauFlag = 0: GOTO 2805
  3131. 'Setup U pointer
  3132. FOR x = 1 TO w
  3133. IF calc(x, yp) > 0 THEN p = x
  3134. NEXT x
  3135.  
  3136. move = p - up
  3137. xp = p
  3138. up = p
  3139. p1$ = "LEAU"
  3140. IF move > 0 THEN
  3141. p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + "+" + STR$(move) + ",U"
  3142. ELSE
  3143. IF move < 0 THEN
  3144. p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + STR$(move) + ",U"
  3145. ELSE
  3146. p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + ",U"
  3147. END IF
  3148. END IF
  3149. GOSUB 10
  3150. 'p1$ = "LEAY"
  3151. 'IF move <> 0 THEN
  3152. ' p2$ = STR$(-VAL(sw$) - yval + move) + ",Y"
  3153. 'ELSE
  3154. ' p2$ = STR$(-VAL(sw$) - yval) + ",Y"
  3155. 'END IF
  3156. 'GOSUB 10
  3157. x = p
  3158. 2804 GOTO 2808
  3159. 2805 IF calc(x, yp) > 0 THEN
  3160. ' p1$ = "LDA": p2$ = ",Y": GOSUB 10
  3161. p1$ = "STA": p2$ = ",U": GOSUB 10
  3162. calc(x, yp) = -1
  3163. END IF
  3164. 2808
  3165. 2810 a = 0: b = 0: d = 0: x = 0: y = 0
  3166. 'See if we can stack blast D or A and X,Y
  3167. pflag = 1: yval = 0
  3168. 2825 IF up > 5 THEN
  3169. IF calc(up - 5, yp) > 0 AND calc(up - 4, yp) > 0 AND calc(up - 3, yp) > 0 AND calc(up - 2, yp) > 0 AND calc(up - 1, yp) > 0 AND calc(up, yp) > 0 THEN
  3170. ' p1$ = "LDX": p2$ = STR$(-2 - yval) + ",Y": GOSUB 10
  3171. ' p1$ = "LDD": p2$ = STR$(-4 - yval) + ",Y": GOSUB 10
  3172. p1$ = "PSHU": p2$ = "D,X,Y": GOSUB 10
  3173. up = up - 4: yval = yval + 4
  3174. GOTO 2825
  3175. END IF
  3176. END IF
  3177. IF up > 4 THEN
  3178. IF calc(up - 4, yp) > 0 AND calc(up - 3, yp) > 0 AND calc(up - 2, yp) > 0 AND calc(up - 1, yp) > 0 AND calc(up, yp) > 0 THEN
  3179. ' p1$ = "LDX": p2$ = STR$(-2 - yval) + ",Y": GOSUB 10
  3180. ' p1$ = "LDD": p2$ = STR$(-4 - yval) + ",Y": GOSUB 10
  3181. p1$ = "PSHU": p2$ = "A,X,Y": GOSUB 10
  3182. up = up - 4: yval = yval + 4
  3183. GOTO 2825
  3184. END IF
  3185. END IF
  3186. IF up > 3 THEN
  3187. IF calc(up - 3, yp) > 0 AND calc(up - 2, yp) > 0 AND calc(up - 1, yp) > 0 AND calc(up, yp) > 0 THEN
  3188. ' p1$ = "LDX": p2$ = STR$(-2 - yval) + ",Y": GOSUB 10
  3189. ' p1$ = "LDD": p2$ = STR$(-4 - yval) + ",Y": GOSUB 10
  3190. p1$ = "PSHU": p2$ = "D,X": GOSUB 10
  3191. up = up - 4: yval = yval + 4
  3192. GOTO 2825
  3193. END IF
  3194. END IF
  3195. IF up > 2 THEN
  3196. IF calc(up - 2, yp) > 0 AND calc(up - 1, yp) > 0 AND calc(up, yp) > 0 THEN
  3197. ' p1$ = "LDX": p2$ = STR$(-2 - yval) + ",Y": GOSUB 10
  3198. ' p1$ = "LDA": p2$ = STR$(-3 - yval) + ",Y": GOSUB 10
  3199. p1$ = "PSHU": p2$ = "A,X": GOSUB 10
  3200. up = up - 3: yval = yval + 3
  3201. pflag = 1
  3202. GOTO 2825
  3203. END IF
  3204. END IF
  3205.  
  3206. 'Do Load/Store for the rest of the line
  3207. FOR x = 1 TO up - 1
  3208. IF calc(x, yp) > 0 AND calc(x + 1, yp) > 0 THEN
  3209. hx$(x, yp) = "ux1": hx$(x + 1, yp) = "ux2": calc(x, yp) = -1: calc(x + 1, yp) = -1: x = x + 1
  3210. END IF
  3211. NEXT x
  3212. FOR x = 1 TO up
  3213. IF calc(x, yp) > 0 THEN
  3214. hx$(x, yp) = "ua": calc(x, yp) = -1
  3215. END IF
  3216. NEXT x
  3217. FOR x = 1 TO up - 1
  3218. IF hx$(x, yp) = "ux1" THEN
  3219. ' p1$ = "LDX": p2$ = STR$(x - up - 1 - yval) + ",Y": GOSUB 10
  3220. p1$ = "STX": p2$ = STR$(x - up - 1) + ",U": GOSUB 10
  3221. END IF
  3222. NEXT x
  3223. FOR x = 1 TO up
  3224. IF hx$(x, yp) = "ua" THEN
  3225. ' p1$ = "LDA": p2$ = STR$(x - up - 1 - yval) + ",Y": GOSUB 10
  3226. p1$ = "STA": p2$ = STR$(x - up - 1) + ",U": GOSUB 10
  3227. END IF
  3228. NEXT x
  3229. lastrow = yp
  3230. GOTO 2405
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement