Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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)
- check = 0
- WIDTH 80, 50
- proname$ = "cmpblsp": v$ = "1.00"
- 'width below is the number of bytes for the width of the sprite
- 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
- count = _COMMANDCOUNT
- IF count > 2 THEN GOTO 2
- 1 PRINT proname$; " V"; v$; " by Glen Hewlett"
- PRINT "Creates a compiled & blasted sprite in 6809 assembly language from a binary file"
- PRINT "The sprite data must be for a 16 colour screen."
- PRINT "Usage: "; proname$; " -wX -hY [-oswX -oshY -owX -ohY -aa] [as] [-ac] [-odd] [-sX]"
- PRINT " [-rXXXX] [-rvX] [-nSubroutine] [-c] [cyc] [-done] spritename"
- PRINT "Where: -w - X is the width in bytes for the width of the sprite"
- PRINT " -h - Y is the number of rows for the height of the sprite"
- PRINT " -osw - Offset used - width in bytes of the entire data file"
- PRINT " -osh - Offset used - height of the entire data file"
- PRINT " -ow - X offset, from the left side to where the sprite data starts"
- PRINT " -oh - Y offset, from the top row to where the sprite data starts"
- PRINT " -aa - Autocenter point is the middle of the entire data file"
- PRINT " -as - Autocenter, usually the top left corner of the sprite is used as"
- PRINT " the starting point of the sprite, this makes it the middle"
- PRINT " -odd - Also make an odd version of the sprite, by shifting the data one"
- PRINT " nibble to the right, outputs a seperate _odd.asm file"
- PRINT " -s - Sets the screen width the sprite will be used with"
- PRINT " (usually 256 or 320) defaults to 320"
- PRINT " -r - Creates a restore sprite that loads the data behind the sprite"
- PRINT " from address offset XXXX which is a 4 digit hex number"
- PRINT " -rv - Creates a restore sprite that stores the value X which is a hex"
- PRINT " value between 0 to F. This value is substituted wherever any"
- PRINT " non Zero byte is in the sprite data. This is useful if the"
- PRINT " background behind your sprite is always a known palette, such"
- PRINT " as black. This is faster then having to load the background."
- PRINT " -n - Name of the subroutine that is created, if not used the routine"
- PRINT " name created will be _spritename:"
- PRINT " -c - Add comments that shows the values of the registers"
- PRINT " -cyc - Add cycle count instructions for lwasm"
- PRINT " -done - When the program is complete it wont wait for you to press a key"
- PRINT " The program will exit and close this window (useful for scripts)"
- PRINT " sprite This is the name of the sprite to compile"
- PRINT " Output name will be sprite with .asm extension added"
- PRINT
- PRINT "A few notes on compiling sprites:"
- PRINT "- The Sprite must use palette 0 for transparency."
- PRINT "- Sprites are more efficient on a 256 pixel wide screen. Since pointers will"
- PRINT " then be less then 128 which means shorter pointers (-128 to 127)"
- PRINT "- If possible use palette 15 (0xF) for the edge/border of your sprite character"
- PRINT " compiling 0x0F or 0xF0 doesn't need to use an AND instruction."
- PRINT "Example:"
- PRINT "./cmpblsp -osw40 -osh57 -ow13 -oh20 -w10 -h19 -odd -s256 -c -done 000016.bin"
- PRINT "Will convert the data in file 000016.bin to a compiled/blasted .asm sprite where"
- PRINT "the entire width of the data file is 40 bytes and the entire height is 57 rows."
- PRINT "The sprite data starts at byte 13 from the left edge and is 10 bytes wide."
- PRINT "The sprite data starts at row 20 and the sprite is 19 rows high."
- PRINT "Make an odd version of the sprite too, the sprite will be used on a 256 pixel"
- PRINT "wide screen. Add comments to the .asm file and when done close the window."
- END
- 2 nt = 0: newp = 0: endp = 0: odd = 0: dn = 0: subname$ = ""
- FOR check = 1 TO count
- N$ = COMMAND$(check)
- IF LCASE$(LEFT$(N$, 2)) = "-w" THEN w = VAL(RIGHT$(N$, LEN(N$) - 2)): GOTO 4
- IF LCASE$(LEFT$(N$, 2)) = "-h" THEN h = VAL(RIGHT$(N$, LEN(N$) - 2)): GOTO 4
- IF LCASE$(LEFT$(N$, 4)) = "-osw" THEN osw = VAL(RIGHT$(N$, LEN(N$) - 4)): GOTO 4
- IF LCASE$(LEFT$(N$, 4)) = "-osh" THEN osh = VAL(RIGHT$(N$, LEN(N$) - 4)): GOTO 4
- IF LCASE$(LEFT$(N$, 3)) = "-ow" THEN ow = VAL(RIGHT$(N$, LEN(N$) - 3)): GOTO 4
- IF LCASE$(LEFT$(N$, 3)) = "-oh" THEN oh = VAL(RIGHT$(N$, LEN(N$) - 3)): GOTO 4
- IF LCASE$(LEFT$(N$, 4)) = "-odd" THEN odd = 1: GOTO 4
- IF LCASE$(LEFT$(N$, 2)) = "-s" THEN sw = VAL(RIGHT$(N$, LEN(N$) - 2)): GOTO 4
- IF LCASE$(LEFT$(N$, 5)) = "-done" THEN dn = 1: GOTO 4
- IF LCASE$(LEFT$(N$, 3)) = "-rv" THEN rv = 1: rest$ = UCASE$(RIGHT$(N$, LEN(N$) - 3)): rest$ = rest$ + rest$: GOTO 4
- IF LCASE$(LEFT$(N$, 2)) = "-r" THEN r = 1: rest$ = UCASE$(RIGHT$(N$, LEN(N$) - 2)): GOTO 4
- IF LCASE$(LEFT$(N$, 2)) = "-n" THEN subname$ = RIGHT$(N$, LEN(N$) - 2): GOTO 4
- IF LCASE$(LEFT$(N$, 4)) = "-cyc" THEN cyc = 1: GOTO 4
- IF LCASE$(LEFT$(N$, 2)) = "-c" THEN comment = 1: GOTO 4
- IF LCASE$(LEFT$(N$, 3)) = "-aa" THEN autocenter = 1: GOTO 4
- IF LCASE$(LEFT$(N$, 3)) = "-as" THEN autocenter = 2: GOTO 4
- 'check if we got a file name yet if so then error
- IF FI > 0 THEN 1
- FI = 1
- Basename$ = N$
- IF _FILEEXISTS(Basename$) THEN
- OPEN Basename$ FOR APPEND AS #1
- length = LOF(1)
- CLOSE #1
- ELSE
- PRINT "Error file: "; Basename$; " Doesn't exits.": GOTO 1
- END IF
- IF length < 1 THEN PRINT "Error file: "; Basename$; " is 0 bytes.": GOTO 1
- PRINT "Length of Input file "; Basename$; " is:"; length
- OPEN Basename$ FOR BINARY AS #1
- GET #1, , array()
- CLOSE #1
- 4 NEXT check
- 5 Fname$ = Basename$ + ".asm"
- 6 IF w = 0 OR h = 0 THEN PRINT "No width or Height info": GOTO 1
- count = 0
- 'PRINT osw, osh, ow, oh
- IF osw > 0 AND osh = 0 THEN PRINT "Need both offset size width and height": GOTO 1
- IF osh > 0 AND osw = 0 THEN PRINT "Need both offset size width and height": GOTO 1
- IF ow > osw OR oh > osh THEN PRINT "Sprite Offset is bigger then the size of the entire data file": GOTO 1
- 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
- PRINT: PRINT "Output filename is: "; Fname$
- sw = INT(sw / 2)
- sw$ = RIGHT$(STR$(sw), LEN(STR$(sw)) - 1)
- mr = 0: md = 0: mv = 0
- IF autocenter = 1 THEN 'use the entire bitmap center point
- middle = INT(osw / 2)
- mr = w - (ow + w - middle)
- mr = mr - 4
- middle = INT(osh / 2)
- md = h - (oh + h - middle)
- md = md + 1
- mr = -mr
- md = -md * sw
- mv = mr + md
- END IF
- IF autocenter = 2 THEN
- mr = INT(w / 2) - 2 'use the center of the sprite itself
- md = INT(h / 2)
- mr = -mr
- md = -md * sw
- mv = mr + md
- END IF
- count = 0
- IF osw > 0 THEN
- FOR t1 = 1 TO oh
- FOR t2 = 1 TO osw
- count = count + 1
- NEXT t2
- NEXT t1
- FOR y = 1 TO h
- FOR t1 = 1 TO ow
- count = count + 1
- NEXT t1
- FOR x = 1 TO w
- sp(x, y) = array(count)
- count = count + 1
- NEXT x
- FOR t1 = ow + w TO osw - 1
- count = count + 1
- NEXT t1
- NEXT y
- ELSE
- FOR y = 1 TO h
- FOR x = 1 TO w
- sp(x, y) = array(count)
- count = count + 1
- NEXT x, y
- END IF
- FOR y = 1 TO h
- FOR x = 1 TO w
- IF sp(x, y) > 15 THEN
- hx$(x, y) = HEX$(sp(x, y))
- ELSE
- hx$(x, y) = "0" + HEX$(sp(x, y))
- END IF
- NEXT x
- NEXT y
- check = 0
- IF subname$ <> "" THEN sn$ = subname$
- GOSUB 50
- IF rv = 1 OR rest$ <> "" THEN
- PRINT "Generating a Restore Sprite."
- FOR y = 1 TO h
- FOR x = 1 TO w
- IF sp(x, y) > 15 THEN
- hx$(x, y) = HEX$(sp(x, y))
- ELSE
- hx$(x, y) = "0" + HEX$(sp(x, y))
- END IF
- NEXT x
- NEXT y
- IF rv = 1 THEN
- GOSUB 2000
- ELSE
- rest$ = "$" + rest$ + ",U"
- GOSUB 1000
- END IF
- END IF
- CLOSE #1
- ' added an option to make odd version of sprite too, which shifts the data one nibble to the right
- IF odd = 1 THEN
- FOR y = 1 TO h
- FOR x = w TO 2 STEP -1
- tl = sp(x - 1, y): tr = sp(x, y)
- tr = INT(tr / 16)
- t = INT(tl / 16) * 16
- t = tl - t
- t = t * 16
- tr = tr + t
- sp(x, y) = tr
- NEXT x
- tr = sp(1, y)
- tr = INT(tr / 16)
- sp(1, y) = tr
- NEXT y
- FOR y = 1 TO h
- FOR x = 1 TO w
- IF sp(x, y) > 15 THEN
- hx$(x, y) = HEX$(sp(x, y))
- ELSE
- hx$(x, y) = "0" + HEX$(sp(x, y))
- END IF
- NEXT x
- NEXT y
- PRINT: PRINT "-odd option was selected."
- PRINT "Also creating another sprite with the data shifted to the right one nibble"
- Fname$ = Basename$ + "_Odd.asm"
- PRINT "Output filename is: "; Fname$
- IF subname$ <> "" THEN
- IF RIGHT$(subname$, 1) = ":" THEN sn$ = LEFT$(subname$, LEN(subname$) - 1) + "_Odd:"
- ELSE
- sn$ = subname$ + "_Odd"
- END IF
- GOSUB 50
- IF rv = 1 OR rest$ <> "" THEN
- PRINT "Generating a Restore Sprite."
- FOR y = 1 TO h
- FOR x = 1 TO w
- IF sp(x, y) > 15 THEN
- hx$(x, y) = HEX$(sp(x, y))
- ELSE
- hx$(x, y) = "0" + HEX$(sp(x, y))
- END IF
- NEXT x
- NEXT y
- IF rv = 1 THEN
- GOSUB 2000
- ELSE
- GOSUB 1000
- END IF
- END IF
- CLOSE #1
- END IF
- PRINT "Done."
- IF dn = 1 THEN SYSTEM
- END
- 10 precount = precount + 1
- pt$ = ""
- FOR p = 1 TO LEN(p2$)
- IF MID$(p2$, p, 1) <> " " THEN pt$ = pt$ + MID$(p2$, p, 1)
- NEXT p
- pre$(precount, 1) = p1$: pre$(precount, 2) = pt$
- IF LEN(pt$) = 5 THEN
- IF RIGHT$(pt$, 2) = ",U" THEN
- tl = VAL(LEFT$(pt$, 3))
- pre$(precount, 0) = "Check"
- END IF
- END IF
- IF comment = 1 THEN
- pre$(precount, 3) = LEFT$(" ", 12 - LEN(pre$(precount, 2)))
- pre$(precount, 3) = pre$(precount, 3) + " * A=" + a$ + ", B=" + b$ + ", X=" + x$ + ", Y=" + y$
- END IF
- RETURN
- ' Analyze row and see if it can be optimized even more
- 15 FOR p = 1 TO precount
- IF LEFT$(pre$(p, 1), 3) = "AND" THEN
- IF pre$(p + 1, 2) = "#$F0" OR pre$(p + 1, 2) = "#$0F" THEN GOTO 17
- END IF
- IF LEN(pre$(p, 1)) = 3 THEN pre$(p, 1) = pre$(p, 1) + " "
- p$ = " " + pre$(p, 1) + " " + pre$(p, 2) + pre$(p, 3)
- PRINT #1, p$
- pre$(p, 0) = ""
- 17 NEXT p
- precount = 0
- RETURN
- ' sort list of words in tw$() with count entries and arrange them from least used to most used
- 20 FOR s = 1 TO count
- junk$(s) = tw$(s)
- NEXT s
- FOR s = 1 TO count - 1
- jc(s) = 1
- temp$ = junk$(s)
- IF temp$ = "XXXX" THEN
- jc(s) = 0
- ELSE
- FOR n = s + 1 TO count
- IF temp$ = junk$(n) THEN junk$(n) = "XXXX": jc(s) = jc(s) + 1
- NEXT n
- END IF
- NEXT s
- IF junk$(count) = "XXXX" OR junk$(count) = "XX" THEN
- jc(count) = 0
- ELSE
- jc(count) = 1
- END IF
- newcount = 0
- FOR s = count TO 1 STEP -1
- FOR n = 1 TO count
- IF jc(n) = s THEN
- newcount = newcount + 1: tw$(newcount) = junk$(n)
- END IF
- NEXT n
- NEXT s
- RETURN
- 45 PRINT #1, "* ";
- FOR k = 1 TO w
- PRINT #1, hx$(k, yp); " ";
- NEXT k
- PRINT #1,
- RETURN
- 50 OPEN Fname$ FOR OUTPUT AS #1 ' open sequential file for writing
- PRINT #1, "**************************************************"
- FOR y = 1 TO h
- PRINT #1, "* ";
- FOR x = 1 TO w
- PRINT #1, hx$(x, y); " ";
- NEXT x
- PRINT #1, "-"; y
- NEXT y
- PRINT #1, "**************************************************"
- IF subname$ = "" THEN
- PRINT #1, "_"; LEFT$(Fname$, LEN(Fname$) - 4); ":"
- ELSE
- PRINT #1, sn$
- END IF
- IF cyc = 1 THEN
- PRINT #1, " opt c "
- PRINT #1, " opt ct"
- PRINT #1, " opt cd"
- PRINT #1, " opt cc"
- END IF
- ' position the starting point
- fb = w
- yp = h
- xp = w
- FOR y = 1 TO h
- FOR x = 1 TO w
- bcode = 0
- byte = sp(x, y)
- IF byte = 0 THEN GOTO 120
- bcode = 1
- IF byte < 16 THEN bcode = 2
- IF byte = (byte AND 240) THEN bcode = 3
- 120 calc(x, y) = bcode
- NEXT x
- NEXT y
- 'FOR y = 1 TO h
- 'FOR x = 1 TO w
- 'PRINT calc(x, y);
- 'NEXT x
- 'PRINT
- 'NEXT y
- FOR yp = h TO 1 STEP -1
- 'fl = 0 then no stack usage, just do load/store on this row
- 'fl = 1 then no stack usage, do load/store on this row and the row below it
- 'fl = 2 then use stack on this line and do load/store on line below
- 'fl = 3 then use stack on this line
- 'fl = 4 then skip this row, row above will handle it
- 'fl = 5 then ignore this row (no data to process)
- fl = 0
- FOR x = 1 TO w - 2
- IF calc(x, yp) = 1 AND calc(x + 1, yp) = 1 AND calc(x + 2, yp) = 1 THEN fl = 3
- IF calc(x, yp) = 2 AND calc(x + 1, yp) = 1 AND calc(x + 2, yp) = 1 THEN fl = 3
- IF calc(x, yp) = 3 AND calc(x + 1, yp) = 1 AND calc(x + 2, yp) = 1 THEN fl = 3
- NEXT x
- IF fl = 3 THEN GOTO 200
- FOR x = 1 TO w - 3
- 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
- NEXT x
- IF fl = 3 THEN GOTO 200
- fl = 0
- count = 0
- FOR x = 1 TO w
- count = count + calc(x, yp)
- NEXT x
- IF count = 0 THEN fl = 5
- 200
- comp(yp) = fl
- NEXT yp
- y = h
- 210
- IF comp(y) = 0 AND comp(y - 1) = 0 THEN comp(y) = 4: comp(y - 1) = 1: y = y - 2: GOTO 250
- IF comp(y) = 0 AND comp(y - 1) = 3 THEN comp(y) = 4: comp(y - 1) = 2: y = y - 2: GOTO 250
- y = y - 1
- 250 IF y > 1 THEN 210
- 'FOR y = 1 TO h
- 'PRINT y - 1;
- 'PRINT comp(y);
- 'FOR x = 1 TO w
- 'PRINT calc(x, y);
- 'NEXT x
- 'PRINT
- 'NEXT y
- yp = h
- 280 IF comp(yp) < 4 THEN 300
- yp = yp - 1
- IF yp > 1 THEN GOTO 280
- 300 IF comp(yp) > 1 THEN 310
- FOR x = w TO 1 STEP -1
- IF sp(x, yp) <> 0 THEN xp = x: GOTO 390
- NEXT x
- PRINT "Error... Should not get here. While finding starting point."
- END
- 310 FOR x = w - 3 TO 1 STEP -1
- IF calc(x, yp) = 1 AND calc(x + 1, yp) = 1 AND calc(x + 2, yp) = 1 THEN xp = x + 2: GOTO 390
- IF calc(x, yp) = 2 AND calc(x + 1, yp) = 1 AND calc(x + 2, yp) = 1 THEN xp = x + 2: GOTO 390
- IF calc(x, yp) = 3 AND calc(x + 1, yp) = 1 AND calc(x + 2, yp) = 1 THEN xp = x + 2: GOTO 390
- NEXT x
- 'Starting location move down from the top left corner
- 390 PRINT #1, "* Row"; yp
- p1$ = "LEAU": p2$ = sw$ + "*" + STR$(yp - 1) + "+" + STR$(xp) + STR$(mv) + ",U": up = xp: leauFlag = 1
- GOSUB 10
- 395 yp = h: lastrow = yp
- a$ = "": b$ = "": x$ = "": y$ = ""
- 'yp = the current line to start on
- 'comp(yp) tells us how to handle the current row
- 'fl = 0 then no stack usage, just do load/store on this row
- 'fl = 1 then no stack usage, do load/store on this row and the row below it
- 'fl = 2 then use stack on this line and do load/store on line below
- 'fl = 3 then use stack on this line
- 'fl = 4 then skip this row, row above will handle it
- 'fl = 5 then ignore this row (no data to process)
- 'main loop - start of a new row to work on
- 400 IF comp(yp) < 4 THEN GOSUB 15: GOTO 410
- 405 yp = yp - 1
- IF yp > 0 THEN GOTO 400
- ' If we get here then we are done.
- p1$ = "RTS": p2$ = ""
- GOSUB 10: GOSUB 15
- RETURN
- 410 IF comp(yp) = 0 THEN 500
- 420 IF comp(yp) = 1 THEN 600
- 430 IF comp(yp) = 2 THEN 700
- 440 IF comp(yp) = 3 THEN 800
- PRINT "Error. Stopping, weird 1": END
- 'fl = then no stack usage, do load/store on this row only
- 500 PRINT #1, "* Row"; yp; "500": GOSUB 45
- 'PRINT #1, "up="; up
- IF leauFlag = 1 THEN leauFlag = 0: GOTO 510
- 'Setup U pointer
- FOR x = 1 TO w
- IF calc(x, yp) > 0 THEN p = x
- NEXT x
- IF calc(p, yp) > 1 THEN p = p - 1
- move = p - up
- xp = p
- up = p
- 'PRINT #1, "up="; up
- p1$ = "LEAU"
- IF move > 0 THEN
- p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + "+" + STR$(move) + ",U"
- ELSE
- IF move < 0 THEN
- p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + STR$(move) + ",U"
- ELSE
- p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + ",U"
- END IF
- END IF
- GOSUB 10
- x = up + 1
- 'PRINT #1, "x="; x; "Calc(x,yp)="; calc(x, yp)
- IF calc(x, yp) = 2 THEN
- p1$ = "LDA": p2$ = ",U": GOSUB 10
- p1$ = "ANDA": p2$ = "#$F0": GOSUB 10
- p1$ = "ORA": p2$ = "#$" + hx$(x, yp): GOSUB 10: a$ = "XX"
- p1$ = "STA": p2$ = ",U": GOSUB 10
- calc(x, yp) = -1
- END IF
- IF calc(x, yp) = 3 THEN
- p1$ = "LDA": p2$ = ",U": GOSUB 10
- p1$ = "ANDA": p2$ = "#$0F": GOSUB 10
- p1$ = "ORA": p2$ = "#$" + hx$(x, yp): GOSUB 10: a$ = "XX"
- p1$ = "STA": p2$ = ",U": GOSUB 10
- calc(x, yp) = -1
- END IF
- 508
- FOR x = 1 TO w
- IF calc(x, yp + 1) > 0 THEN p2 = x
- NEXT x
- 510 a = 0: b = 0: d = 0: x = 0: y = 0
- FOR x = 1 TO xp - 1
- IF calc(x, yp) = 1 AND calc(x + 1, yp) = 1 THEN
- 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
- 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
- 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
- END IF
- NEXT x
- FOR x = 1 TO xp
- IF calc(x, yp) = 1 THEN
- IF hx$(x, yp) = a$ THEN a = a + 1: hx$(x, yp) = "ua": calc(x, yp) = -1
- IF hx$(x, yp) = b$ THEN b = b + 1: hx$(x, yp) = "ub": calc(x, yp) = -1
- END IF
- NEXT x
- FOR x = 1 TO xp - 1
- IF hx$(x, yp) = "ud1" THEN p1$ = "STD": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- IF hx$(x, yp) = "ux1" THEN p1$ = "STX": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- IF hx$(x, yp) = "uy1" THEN p1$ = "STY": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- NEXT x
- FOR x = 1 TO xp
- IF hx$(x, yp) = "ua" AND calc(x + 1, yp) <> 3 THEN p1$ = "STA": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- IF hx$(x, yp) = "ub" AND calc(x - 1, yp) <> 2 THEN p1$ = "STB": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- NEXT x
- found = 0
- FOR x = 1 TO xp
- IF calc(x, yp) = 2 AND hx$(x + 1, yp) = "ub" THEN
- p1$ = "LDA": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- p1$ = "ANDA": p2$ = "#$F0": GOSUB 10
- p1$ = "ORA": p2$ = "#$" + hx$(x, yp): GOSUB 10: a$ = "XX"
- p1$ = "STD": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- found = 1
- calc(x, yp) = -1
- END IF
- NEXT x
- IF found = 0 THEN
- FOR x = 1 TO xp
- IF hx$(x, yp) = "ua" AND calc(x + 1, yp) = 3 THEN
- p1$ = "LDB": p2$ = STR$(x - xp + 1 - 1) + ",U": GOSUB 10
- p1$ = "ANDB": p2$ = "#$0F": GOSUB 10
- p1$ = "ORB": p2$ = "#$" + hx$(x + 1, yp): GOSUB 10: b$ = "XX"
- p1$ = "STD": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- found = 1
- calc(x + 1, yp) = -1
- END IF
- NEXT x
- END IF
- FOR x = 1 TO xp
- IF calc(x, yp) = 2 THEN
- p1$ = "LDB": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- p1$ = "ANDB": p2$ = "#$F0": GOSUB 10
- p1$ = "ORB": p2$ = "#$" + hx$(x, yp): GOSUB 10: b$ = "XX"
- p1$ = "STB": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- calc(x, yp) = -1
- END IF
- IF calc(x, yp) = 3 THEN
- p1$ = "LDB": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- p1$ = "ANDB": p2$ = "#$0F": GOSUB 10
- p1$ = "ORB": p2$ = "#$" + hx$(x, yp): GOSUB 10: b$ = "XX"
- p1$ = "STB": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- calc(x, yp) = -1
- END IF
- NEXT x
- 'Check to see if we can use any 16 bit values
- count = 0
- FOR x = 1 TO xp
- 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
- NEXT x
- IF count > 1 THEN
- GOSUB 20
- IF newcount > 1 THEN
- FOR x = 1 TO newcount
- p1$ = "LDD": p2$ = "#$" + tw$(x): GOSUB 10
- a$ = LEFT$(tw$(x), 2): b$ = RIGHT$(tw$(x), 2)
- FOR n = 1 TO xp
- IF tw$(x) = hx$(n, yp) + hx$(n + 1, yp) THEN
- p1$ = "STD": p2$ = STR$(n - xp - 1) + ",U": GOSUB 10
- hx$(n, yp) = "ud1": hx$(n + 1, yp) = "ud2"
- calc(n, yp) = -1: calc(n + 1, yp) = -1: n = n + 1
- END IF
- NEXT n
- NEXT x
- ELSE
- count = 1
- END IF
- END IF
- IF count = 1 THEN
- x = count
- p1$ = "LDD": p2$ = "#$" + tw$(x): GOSUB 10
- a$ = LEFT$(tw$(x), 2): b$ = RIGHT$(tw$(x), 2)
- FOR n = 1 TO xp
- IF tw$(x) = hx$(n, yp) + hx$(n + 1, yp) THEN
- p1$ = "STD": p2$ = STR$(n - xp - 1) + ",U": GOSUB 10
- hx$(n, yp) = "ud1": hx$(n + 1, yp) = "ud2"
- calc(n, yp) = -1: calc(n + 1, yp) = -1: n = n + 1
- END IF
- NEXT n
- END IF
- 'Check if we can use A or B with the current value
- FOR x = 1 TO xp
- IF calc(x, yp) = 1 THEN
- IF a$ = hx$(x, yp) THEN
- hx$(x, yp) = "ua": calc(x, yp) = -1
- p1$ = "STA": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- END IF
- IF b$ = hx$(x, yp) THEN
- hx$(x, yp) = "ub": calc(x, yp) = -1
- p1$ = "STB": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- END IF
- END IF
- NEXT x
- 'Check to see if we can use any 8 bit values (if not then we are done)
- count = 0
- FOR x = 1 TO xp
- IF calc(x, yp) = 1 THEN count = count + 1: tw$(count) = hx$(x, yp): wordp(count) = x
- NEXT x
- 'PRINT #1, "Count"; count, "newcount"; newcount
- IF count > 1 THEN
- GOSUB 20
- IF newcount > 1 THEN
- FOR x = 1 TO newcount
- p1$ = "LDB": p2$ = "#$" + tw$(x): GOSUB 10: b$ = tw$(x)
- FOR n = 1 TO xp
- 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"
- NEXT n
- NEXT x
- ELSE
- count = 1
- END IF
- END IF
- IF count = 1 THEN
- x = count
- p1$ = "LDB": p2$ = "#$" + tw$(x): GOSUB 10: b$ = tw$(x)
- FOR n = 1 TO xp
- 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"
- NEXT n
- END IF
- lastrow = yp
- GOTO 405
- 'fl = 1 then no stack usage, do load/store on this row and the row below it
- 600 PRINT #1, "* Row"; yp; "and row"; yp + 1; "600": GOSUB 45: yp = yp + 1: GOSUB 45: yp = yp - 1
- 'PRINT #1, "up="; up
- IF leauFlag = 1 THEN leauFlag = 0: GOTO 610
- 'Setup U pointer
- FOR x = 1 TO w
- IF calc(x, yp) > 0 THEN p = x
- IF calc(x, yp + 1) > 0 THEN p2 = x
- NEXT x
- IF p2 >= p THEN
- p = p2
- ELSE
- IF calc(p, yp) > 1 THEN p = p - 1
- END IF
- move = p - up
- xp = p
- up = p
- 'PRINT #1, "up="; up
- p1$ = "LEAU"
- IF move > 0 THEN
- p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + "+" + STR$(move) + ",U"
- ELSE
- IF move < 0 THEN
- p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + STR$(move) + ",U"
- ELSE
- p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + ",U"
- END IF
- END IF
- GOSUB 10
- x = up + 1
- 'PRINT #1, "x="; x; "Calc(x,yp)="; calc(x, yp)
- IF calc(x, yp) = 2 THEN
- p1$ = "LDA": p2$ = ",U": GOSUB 10
- p1$ = "ANDA": p2$ = "#$F0": GOSUB 10
- p1$ = "ORA": p2$ = "#$" + hx$(x, yp): GOSUB 10: a$ = "XX"
- p1$ = "STA": p2$ = ",U": GOSUB 10
- calc(x, yp) = -1
- END IF
- IF calc(x, yp) = 3 THEN
- p1$ = "LDA": p2$ = ",U": GOSUB 10
- p1$ = "ANDA": p2$ = "#$0F": GOSUB 10
- p1$ = "ORA": p2$ = "#$" + hx$(x, yp): GOSUB 10: a$ = "XX"
- p1$ = "STA": p2$ = ",U": GOSUB 10
- calc(x, yp) = -1
- END IF
- 608
- FOR x = 1 TO w
- IF calc(x, yp + 1) > 0 THEN p2 = x
- NEXT x
- 610 a = 0: b = 0: d = 0: x = 0: y = 0
- FOR x = 1 TO xp - 1
- IF calc(x, yp) = 1 AND calc(x + 1, yp) = 1 THEN
- 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
- 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
- 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
- END IF
- NEXT x
- 'Check row below
- FOR x = 1 TO xp - 1
- IF calc(x, yp + 1) = 1 AND calc(x + 1, yp + 1) = 1 THEN
- 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
- 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
- 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
- END IF
- NEXT x
- FOR x = 1 TO xp
- IF calc(x, yp) = 1 THEN
- IF hx$(x, yp) = a$ THEN a = a + 1: hx$(x, yp) = "ua": calc(x, yp) = -1
- IF hx$(x, yp) = b$ THEN b = b + 1: hx$(x, yp) = "ub": calc(x, yp) = -1
- END IF
- NEXT x
- 'Check row below
- FOR x = 1 TO xp
- IF calc(x, yp + 1) = 1 THEN
- IF hx$(x, yp + 1) = a$ THEN a = a + 1: hx$(x, yp + 1) = "ua": calc(x, yp + 1) = -1
- IF hx$(x, yp + 1) = b$ THEN b = b + 1: hx$(x, yp + 1) = "ub": calc(x, yp + 1) = -1
- END IF
- NEXT x
- FOR x = 1 TO xp - 1
- IF hx$(x, yp) = "ud1" THEN p1$ = "STD": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- IF hx$(x, yp) = "ux1" THEN p1$ = "STX": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- IF hx$(x, yp) = "uy1" THEN p1$ = "STY": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- NEXT x
- 'Check and handle row below
- FOR x = 1 TO xp - 1
- IF hx$(x, yp + 1) = "ud1" THEN p1$ = "STD": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
- IF hx$(x, yp + 1) = "ux1" THEN p1$ = "STX": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
- IF hx$(x, yp + 1) = "uy1" THEN p1$ = "STY": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
- NEXT x
- FOR x = 1 TO xp
- IF hx$(x, yp) = "ua" AND calc(x + 1, yp) <> 3 THEN p1$ = "STA": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- IF hx$(x, yp) = "ub" AND calc(x - 1, yp) <> 2 THEN p1$ = "STB": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- NEXT x
- 'Check and handle row below
- FOR x = 1 TO xp
- 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
- 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
- NEXT x
- found = 0
- FOR x = 1 TO xp
- IF calc(x, yp) = 2 AND hx$(x + 1, yp) = "ub" THEN
- p1$ = "LDA": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- p1$ = "ANDA": p2$ = "#$F0": GOSUB 10
- p1$ = "ORA": p2$ = "#$" + hx$(x, yp): GOSUB 10: a$ = "XX"
- p1$ = "STD": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- found = 1
- calc(x, yp) = -1
- END IF
- NEXT x
- 'Check row below
- FOR x = 1 TO xp
- IF calc(x, yp + 1) = 2 AND hx$(x + 1, yp + 1) = "ub" THEN
- p1$ = "LDA": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
- p1$ = "ANDA": p2$ = "#$F0": GOSUB 10
- p1$ = "ORA": p2$ = "#$" + hx$(x, yp + 1): GOSUB 10: a$ = "XX"
- p1$ = "STD": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
- found = 1
- calc(x, yp + 1) = -1
- END IF
- NEXT x
- IF found = 0 THEN
- FOR x = 1 TO xp
- IF hx$(x, yp) = "ua" AND calc(x + 1, yp) = 3 THEN
- p1$ = "LDB": p2$ = STR$(x - xp + 1 - 1) + ",U": GOSUB 10
- p1$ = "ANDB": p2$ = "#$0F": GOSUB 10
- p1$ = "ORB": p2$ = "#$" + hx$(x + 1, yp): GOSUB 10: b$ = "XX"
- p1$ = "STD": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- found = 1
- calc(x + 1, yp) = -1
- END IF
- NEXT x
- 'Check row below
- FOR x = 1 TO xp
- IF hx$(x, yp + 1) = "ua" AND calc(x + 1, yp + 1) = 3 THEN
- p1$ = "LDB": p2$ = STR$(x - xp + sw + 1 - 1) + ",U": GOSUB 10
- p1$ = "ANDB": p2$ = "#$0F": GOSUB 10
- p1$ = "ORB": p2$ = "#$" + hx$(x + 1, yp + 1): GOSUB 10: b$ = "XX"
- p1$ = "STD": p2$ = STR$(x - xp + sw - 1) + ",U": GOSUB 10
- found = 1
- calc(x + 1, yp + 1) = -1
- END IF
- NEXT x
- END IF
- FOR x = 1 TO xp
- IF calc(x, yp) = 2 THEN
- p1$ = "LDB": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- p1$ = "ANDB": p2$ = "#$F0": GOSUB 10
- p1$ = "ORB": p2$ = "#$" + hx$(x, yp): GOSUB 10: b$ = "XX"
- p1$ = "STB": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- calc(x, yp) = -1
- END IF
- IF calc(x, yp) = 3 THEN
- p1$ = "LDB": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- p1$ = "ANDB": p2$ = "#$0F": GOSUB 10
- p1$ = "ORB": p2$ = "#$" + hx$(x, yp): GOSUB 10: b$ = "XX"
- p1$ = "STB": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- calc(x, yp) = -1
- END IF
- 'Check row below
- IF calc(x, yp + 1) = 2 THEN
- p1$ = "LDB": p2$ = STR$(x - xp + sw - 1) + ",U": GOSUB 10
- p1$ = "ANDB": p2$ = "#$F0": GOSUB 10
- p1$ = "ORB": p2$ = "#$" + hx$(x, yp + 1): GOSUB 10: b$ = "XX"
- p1$ = "STB": p2$ = STR$(x - xp + sw - 1) + ",U": GOSUB 10
- calc(x, yp + 1) = -1
- END IF
- IF calc(x, yp + 1) = 3 THEN
- p1$ = "LDB": p2$ = STR$(x - xp + sw - 1) + ",U": GOSUB 10
- p1$ = "ANDB": p2$ = "#$0F": GOSUB 10
- p1$ = "ORB": p2$ = "#$" + hx$(x, yp + 1): GOSUB 10: b$ = "XX"
- p1$ = "STB": p2$ = STR$(x - xp + sw - 1) + ",U": GOSUB 10
- calc(x, yp + 1) = -1
- END IF
- NEXT x
- 'Check to see if we can use any 16 bit values
- count = 0
- FOR x = 1 TO xp
- 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
- 'Check row below
- 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
- NEXT x
- IF count > 1 THEN
- GOSUB 20
- IF newcount > 1 THEN
- FOR x = 1 TO newcount
- p1$ = "LDD": p2$ = "#$" + tw$(x): GOSUB 10
- a$ = LEFT$(tw$(x), 2): b$ = RIGHT$(tw$(x), 2)
- FOR n = 1 TO xp
- IF tw$(x) = hx$(n, yp) + hx$(n + 1, yp) THEN
- p1$ = "STD": p2$ = STR$(n - xp - 1) + ",U": GOSUB 10
- hx$(n, yp) = "ud1": hx$(n + 1, yp) = "ud2"
- calc(n, yp) = -1: calc(n + 1, yp) = -1: n = n + 1
- END IF
- NEXT n
- FOR n = 1 TO xp
- 'Check row below
- IF tw$(x) = hx$(n, yp + 1) + hx$(n + 1, yp + 1) THEN
- p1$ = "STD": p2$ = STR$(n - xp + sw - 1) + ",U": GOSUB 10
- hx$(n, yp + 1) = "ud1": hx$(n + 1, yp + 1) = "ud2"
- calc(n, yp + 1) = -1: calc(n + 1, yp + 1) = -1: n = n + 1
- END IF
- NEXT n
- NEXT x
- ELSE
- count = 1
- END IF
- END IF
- IF count = 1 THEN
- x = count
- p1$ = "LDD": p2$ = "#$" + tw$(x): GOSUB 10
- a$ = LEFT$(tw$(x), 2): b$ = RIGHT$(tw$(x), 2)
- FOR n = 1 TO xp
- IF tw$(x) = hx$(n, yp) + hx$(n + 1, yp) THEN
- p1$ = "STD": p2$ = STR$(n - xp - 1) + ",U": GOSUB 10
- hx$(n, yp) = "ud1": hx$(n + 1, yp) = "ud2"
- calc(n, yp) = -1: calc(n + 1, yp) = -1: n = n + 1
- END IF
- NEXT n
- FOR n = 1 TO xp
- 'Check row below
- IF tw$(x) = hx$(n, yp + 1) + hx$(n + 1, yp + 1) THEN
- p1$ = "STD": p2$ = STR$(n - xp + sw - 1) + ",U": GOSUB 10
- hx$(n, yp + 1) = "ud1": hx$(n + 1, yp + 1) = "ud2"
- calc(n, yp + 1) = -1: calc(n + 1, yp + 1) = -1: n = n + 1
- END IF
- NEXT n
- END IF
- 'Check if we can use A or B with the current value
- FOR x = 1 TO xp
- IF calc(x, yp) = 1 THEN
- IF a$ = hx$(x, yp) THEN
- hx$(x, yp) = "ua": calc(x, yp) = -1
- p1$ = "STA": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- END IF
- IF b$ = hx$(x, yp) THEN
- hx$(x, yp) = "ub": calc(x, yp) = -1
- p1$ = "STB": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- END IF
- END IF
- 'Check row below
- IF calc(x, yp + 1) = 1 THEN
- IF a$ = hx$(x, yp + 1) THEN
- hx$(x, yp + 1) = "ua": calc(x, yp + 1) = -1
- p1$ = "STA": p2$ = STR$(x - xp + sw - 1) + ",U": GOSUB 10
- END IF
- IF b$ = hx$(x, yp + 1) THEN
- hx$(x, yp + 1) = "ub": calc(x, yp + 1) = -1
- p1$ = "STB": p2$ = STR$(x - xp + sw - 1) + ",U": GOSUB 10
- END IF
- END IF
- NEXT x
- 'Check to see if we can use any 8 bit values (if not then we are done)
- count = 0
- newcount = 0
- FOR x = 1 TO xp
- IF calc(x, yp) = 1 THEN count = count + 1: tw$(count) = hx$(x, yp): wordp(count) = x
- IF calc(x, yp + 1) = 1 THEN count = count + 1: tw$(count) = hx$(x, yp + 1): wordp(count) = x
- NEXT x
- 'PRINT #1, "Count"; count, "newcount"; newcount
- IF count > 1 THEN
- GOSUB 20
- IF newcount > 1 THEN
- FOR x = 1 TO newcount
- p1$ = "LDB": p2$ = "#$" + tw$(x): GOSUB 10: b$ = tw$(x)
- FOR n = 1 TO xp
- 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"
- 'Check row below
- 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"
- NEXT n
- NEXT x
- ELSE
- count = 1
- END IF
- END IF
- IF count = 1 THEN
- x = count
- p1$ = "LDB": p2$ = "#$" + tw$(x): GOSUB 10: b$ = tw$(x)
- FOR n = 1 TO xp
- 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"
- 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"
- NEXT n
- END IF
- lastrow = yp
- GOTO 405
- 'fl = 2 then use stack on this line and do load/store on line below
- 700 PRINT #1, "* Row"; yp; "and row"; yp + 1; "700": GOSUB 45: yp = yp + 1: GOSUB 45: yp = yp - 1
- IF leauFlag = 1 THEN leauFlag = 0: x = up + 1: GOTO 704
- 'Setup U pointer
- FOR x = 1 TO w
- IF calc(x, yp) > 0 THEN p = x
- NEXT x
- FOR x = 1 TO w
- IF calc(x, yp + 1) > 0 THEN p2 = x
- NEXT x
- IF p2 > p THEN p = p2
- move = p - up
- xp = p
- up = p
- p1$ = "LEAU"
- IF move > 0 THEN
- p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + "+" + STR$(move) + ",U"
- ELSE
- IF move < 0 THEN
- p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + STR$(move) + ",U"
- ELSE
- p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + ",U"
- END IF
- END IF
- GOSUB 10
- x = p + 1
- x = x - count
- 704
- count = -1
- 705 IF calc(x, yp) = 2 OR calc(x, yp) = 3 THEN
- IF calc(x, yp) = 2 THEN
- count = count + 1
- p1$ = "LDA"
- IF count = 0 THEN
- p2$ = ",U"
- ELSE
- p2$ = STR$(count) + ",U"
- END IF
- GOSUB 10
- p1$ = "ANDA": p2$ = "#$F0": GOSUB 10
- p1$ = "ORA": p2$ = "#$" + hx$(x, yp): GOSUB 10: a$ = "XX"
- p1$ = "STA"
- IF count = 0 THEN
- p2$ = ",U"
- ELSE
- p2$ = STR$(count) + ",U"
- END IF
- GOSUB 10
- calc(x, yp) = -1
- END IF
- IF calc(x, yp) = 3 THEN
- count = count + 1
- p1$ = "LDA"
- IF count = 0 THEN
- p2$ = ",U"
- ELSE
- p2$ = STR$(count) + ",U"
- END IF
- GOSUB 10
- p1$ = "ANDA": p2$ = "#$0F": GOSUB 10
- p1$ = "ORA": p2$ = "#$" + hx$(x, yp): GOSUB 10: a$ = "XX"
- p1$ = "STA"
- IF count = 0 THEN
- p2$ = ",U"
- ELSE
- p2$ = STR$(count) + ",U"
- END IF
- GOSUB 10
- calc(x, yp) = -1
- END IF
- x = x + 1
- ELSE GOTO 708
- END IF
- GOTO 705
- 708
- FOR x = 1 TO w
- IF calc(x, yp + 1) > 0 THEN p2 = x
- NEXT x
- 710 a = 0: b = 0: d = 0: x1 = 0: y = 0
- 'Check row below to see if we can store the value of any registers/accumulators with their current values
- FOR x = 1 TO p2 - 1
- IF calc(x, yp + 1) = 1 AND calc(x + 1, yp + 1) = 1 THEN
- 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
- 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
- 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
- END IF
- NEXT x
- 'Check row below
- FOR x = 1 TO p2
- IF calc(x, yp + 1) = 1 THEN
- IF hx$(x, yp + 1) = a$ THEN a = a + 1: hx$(x, yp + 1) = "ua": calc(x, yp + 1) = -1
- IF hx$(x, yp + 1) = b$ THEN b = b + 1: hx$(x, yp + 1) = "ub": calc(x, yp + 1) = -1
- END IF
- NEXT x
- 'Check and handle row below
- FOR x = 1 TO p2 - 1
- IF hx$(x, yp + 1) = "ud1" THEN p1$ = "STD": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
- IF hx$(x, yp + 1) = "ux1" THEN p1$ = "STX": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
- IF hx$(x, yp + 1) = "uy1" THEN p1$ = "STY": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
- NEXT x
- 'Check and handle row below
- FOR x = 1 TO p2
- 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
- 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
- NEXT x
- 'See if we can stack blast with the current values in D (A or B) ,X or Y
- pflag = 1
- 720 IF pflag = 0 THEN GOTO 750
- pflag = 0
- 725 IF up > 5 THEN
- 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
- p1$ = "PSHU": p2$ = "D,X,Y": GOSUB 10
- 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"
- 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
- up = up - 6: xp = xp - 6
- pflag = 1
- END IF
- END IF
- IF up > 3 THEN
- IF hx$(up - 3, yp) + hx$(up - 2, yp) = d$ AND hx$(up - 1, yp) + hx$(up, yp) = x$ THEN
- p1$ = "PSHU": p2$ = "D,X": GOSUB 10
- hx$(up - 3, yp) = "ud1": hx$(up - 2, yp) = "ud2": hx$(up - 1, yp) = "ux1": hx$(up, yp) = "ux2"
- calc(up - 3, yp) = -1: calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
- up = up - 4: xp = xp - 4
- pflag = 1
- END IF
- IF hx$(up - 3, yp) + hx$(up - 2, yp) = d$ AND hx$(up - 1, yp) + hx$(up, yp) = y$ THEN
- p1$ = "PSHU": p2$ = "D,Y": GOSUB 10
- hx$(up - 3, yp) = "ud1": hx$(up - 2, yp) = "ud2": hx$(up - 1, yp) = "uy1": hx$(up, yp) = "uy2"
- calc(up - 3, yp) = -1: calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
- up = up - 4: xp = xp - 4
- pflag = 1
- END IF
- IF hx$(up - 3, yp) + hx$(up - 2, yp) = x$ AND hx$(up - 1, yp) + hx$(up, yp) = y$ THEN
- p1$ = "PSHU": p2$ = "X,Y": GOSUB 10
- hx$(up - 3, yp) = "ux1": hx$(up - 2, yp) = "ux2": hx$(up - 1, yp) = "uy1": hx$(up, yp) = "uy2"
- calc(up - 3, yp) = -1: calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
- up = up - 4: xp = xp - 4
- pflag = 1
- END IF
- END IF
- IF up > 2 THEN
- IF hx$(up - 2, yp) = a$ AND hx$(up - 1, yp) + hx$(up, yp) = x$ THEN
- p1$ = "PSHU": p2$ = "A,X": GOSUB 10
- hx$(up - 2, yp) = "ua": hx$(up - 1, yp) = "ux1": hx$(up, yp) = "ux2"
- calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
- up = up - 3: xp = xp - 3
- pflag = 1
- END IF
- IF hx$(up - 2, yp) = a$ AND hx$(up - 1, yp) + hx$(up, yp) = y$ THEN
- p1$ = "PSHU": p2$ = "A,Y": GOSUB 10
- hx$(up - 2, yp) = "ua": hx$(up - 1, yp) = "uy1": hx$(up, yp) = "uy2"
- calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
- up = up - 3: xp = xp - 3
- pflag = 1
- END IF
- END IF
- 'Check if A can be loaded with transparent data and then blast D,X,Y
- IF up > 5 THEN
- 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
- p1$ = "LDA": p2$ = STR$(-6) + ",U": GOSUB 10
- p1$ = "ANDA": p2$ = "#$F0": GOSUB 10
- p1$ = "ORA": p2$ = "#$" + hx$(up - 5, yp): GOSUB 10: a$ = "XX"
- p1$ = "PSHU": p2$ = "D,X": GOSUB 10
- 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"
- 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
- up = up - 6: xp = xp - 6
- pflag = 1
- END IF
- END IF
- 'Check if A can be loaded with transparent data and then blast D,X or D,Y
- IF up > 3 THEN
- IF calc(up - 3, yp) = 2 AND hx$(up - 2, yp) = b$ AND hx$(up - 1, yp) + hx$(up, yp) = x$ THEN
- p1$ = "LDA": p2$ = STR$(-4) + ",U": GOSUB 10
- p1$ = "ANDA": p2$ = "#$F0": GOSUB 10
- p1$ = "ORA": p2$ = "#$" + hx$(x, yp): GOSUB 10: a$ = "XX"
- p1$ = "PSHU": p2$ = "D,X": GOSUB 10
- hx$(up - 3, yp) = "ud1": hx$(up - 2, yp) = "ud2": hx$(up - 1, yp) = "ux1": hx$(up, yp) = "ux2"
- calc(up - 3, yp) = -1: calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
- up = up - 4: xp = xp - 4
- pflag = 1
- END IF
- IF calc(up - 3, yp) = 3 AND hx$(up - 2, yp) = b$ AND hx$(up - 1, yp) + hx$(up, yp) = x$ THEN
- p1$ = "LDA": p2$ = STR$(-4) + ",U": GOSUB 10
- p1$ = "ANDA": p2$ = "#$0F": GOSUB 10
- p1$ = "ORA": p2$ = "#$" + hx$(x, yp): GOSUB 10: a$ = "XX"
- p1$ = "PSHU": p2$ = "D,X": GOSUB 10
- hx$(up - 3, yp) = "ud1": hx$(up - 2, yp) = "ud2": hx$(up - 1, yp) = "ux1": hx$(up, yp) = "ux2"
- calc(up - 3, yp) = -1: calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
- up = up - 4: xp = xp - 4
- pflag = 1
- END IF
- IF calc(up - 3, yp) = 2 AND hx$(up - 2, yp) = b$ AND hx$(up - 1, yp) + hx$(up, yp) = y$ THEN
- p1$ = "LDA": p2$ = STR$(-4) + ",U": GOSUB 10
- p1$ = "ANDA": p2$ = "#$F0": GOSUB 10
- p1$ = "ORA": p2$ = "#$" + hx$(x, yp): GOSUB 10: a$ = "XX"
- p1$ = "PSHU": p2$ = "D,Y": GOSUB 10
- hx$(up - 3, yp) = "ud1": hx$(up - 2, yp) = "ud2": hx$(up - 1, yp) = "uy1": hx$(up, yp) = "uy2"
- calc(up - 3, yp) = -1: calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
- up = up - 4: xp = xp - 4
- pflag = 1
- END IF
- IF calc(up - 3, yp) = 3 AND hx$(up - 2, yp) = b$ AND hx$(up - 1, yp) + hx$(up, yp) = y$ THEN
- p1$ = "LDA": p2$ = STR$(-4) + ",U": GOSUB 10
- p1$ = "ANDA": p2$ = "#$0F": GOSUB 10
- p1$ = "ORA": p2$ = "#$" + hx$(x, yp): GOSUB 10: a$ = "XX"
- p1$ = "PSHU": p2$ = "D,Y": GOSUB 10
- hx$(up - 3, yp) = "ud1": hx$(up - 2, yp) = "ud2": hx$(up - 1, yp) = "uy1": hx$(up, yp) = "uy2"
- calc(up - 3, yp) = -1: calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
- up = up - 4: xp = xp - 4
- pflag = 1
- END IF
- END IF
- IF up > 2 THEN
- IF hx$(up - 2, yp) = b$ AND hx$(up - 1, yp) + hx$(up, yp) = x$ THEN
- p1$ = "PSHU": p2$ = "B,X": GOSUB 10
- hx$(up - 2, yp) = "ub": hx$(up - 1, yp) = "ux1": hx$(up, yp) = "ux2"
- calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
- up = up - 3: xp = xp - 3
- pflag = 1
- END IF
- IF hx$(up - 2, yp) = b$ AND hx$(up - 1, yp) + hx$(up, yp) = y$ THEN
- p1$ = "PSHU": p2$ = "B,Y": GOSUB 10
- hx$(up - 2, yp) = "ub": hx$(up - 1, yp) = "uy1": hx$(up, yp) = "uy2"
- calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
- up = up - 3: xp = xp - 3
- pflag = 1
- END IF
- 'Check if we can do transparency nibble then blast B,X or B,Y
- IF calc(up - 2, yp) = 2 AND hx$(up - 1, yp) + hx$(up, yp) = x$ THEN
- p1$ = "LDB": p2$ = STR$(-3) + ",U": GOSUB 10
- p1$ = "ANDB": p2$ = "#$F0": GOSUB 10
- p1$ = "ORB": p2$ = "#$" + hx$(up - 3, yp): GOSUB 10: b$ = "XX"
- p1$ = "PSHU": p2$ = "B,X": GOSUB 10
- hx$(up - 2, yp) = "ub": hx$(up - 1, yp) = "ux1": hx$(up, yp) = "ux2"
- up = up - 3: xp = xp - 3
- pflag = 1
- END IF
- IF calc(up - 2, yp) = 3 AND hx$(up - 1, yp) + hx$(up, yp) = x$ THEN
- p1$ = "LDB": p2$ = STR$(-3) + ",U": GOSUB 10
- p1$ = "ANDB": p2$ = "#$0F": GOSUB 10
- p1$ = "ORB": p2$ = "#$" + hx$(up - 3, yp): GOSUB 10: b$ = "XX"
- p1$ = "PSHU": p2$ = "B,X": GOSUB 10
- hx$(up - 2, yp) = "ub": hx$(up - 1, yp) = "ux1": hx$(up, yp) = "ux2"
- up = up - 3: xp = xp - 3
- pflag = 1
- END IF
- IF calc(up - 2, yp) = 2 AND hx$(up - 1, yp) + hx$(up, yp) = y$ THEN
- p1$ = "LDB": p2$ = STR$(-3) + ",U": GOSUB 10
- p1$ = "ANDB": p2$ = "#$F0": GOSUB 10
- p1$ = "ORB": p2$ = "#$" + hx$(up - 3, yp): GOSUB 10: b$ = "XX"
- p1$ = "PSHU": p2$ = "B,X": GOSUB 10
- hx$(up - 2, yp) = "ub": hx$(up - 1, yp) = "ux1": hx$(up, yp) = "ux2"
- up = up - 3: xp = xp - 3
- pflag = 1
- END IF
- IF calc(up - 2, yp) = 3 AND hx$(up - 1, yp) + hx$(up, yp) = y$ THEN
- p1$ = "LDB": p2$ = STR$(-3) + ",U": GOSUB 10
- p1$ = "ANDB": p2$ = "#$0F": GOSUB 10
- p1$ = "ORB": p2$ = "#$" + hx$(up - 3, yp): GOSUB 10: b$ = "XX"
- p1$ = "PSHU": p2$ = "B,Y": GOSUB 10
- hx$(up - 2, yp) = "ub": hx$(up - 1, yp) = "uy1": hx$(up, yp) = "uy2"
- up = up - 3: xp = xp - 3
- pflag = 1
- END IF
- END IF
- GOTO 720
- 'Handle 8 bit locations that have transparency (nibble as a 0)
- 750 found = 0
- FOR x = 1 TO xp
- IF calc(x, yp) = 2 AND hx$(x + 1, yp) = "ub" THEN
- p1$ = "LDA": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- p1$ = "ANDA": p2$ = "#$F0": GOSUB 10
- p1$ = "ORA": p2$ = "#$" + hx$(x, yp): GOSUB 10: a$ = "XX"
- p1$ = "STD": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- found = 1
- calc(x, yp) = -1
- END IF
- NEXT x
- 'Check row below
- FOR x = 1 TO p2 - 1
- IF calc(x, yp + 1) = 2 AND hx$(x + 1, yp + 1) = "ub" THEN
- p1$ = "LDA": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
- p1$ = "ANDA": p2$ = "#$F0": GOSUB 10
- p1$ = "ORA": p2$ = "#$" + hx$(x, yp + 1): GOSUB 10: a$ = "XX"
- p1$ = "STD": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
- found = 1
- calc(x, yp + 1) = -1
- END IF
- NEXT x
- IF found = 0 THEN
- FOR x = 1 TO xp
- IF hx$(x, yp) = "ua" AND calc(x + 1, yp) = 3 THEN
- p1$ = "LDB": p2$ = STR$(x - xp + 1 - 1) + ",U": GOSUB 10
- p1$ = "ANDB": p2$ = "#$0F": GOSUB 10
- p1$ = "ORB": p2$ = "#$" + hx$(x + 1, yp): GOSUB 10: b$ = "XX"
- p1$ = "STD": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- found = 1
- calc(x + 1, yp) = -1
- END IF
- NEXT x
- 'Check row below
- FOR x = 1 TO p2 - 1
- IF hx$(x, yp + 1) = "ua" AND calc(x + 1, yp + 1) = 3 THEN
- p1$ = "LDB": p2$ = STR$(x - p2 + sw + 1 - 1) + ",U": GOSUB 10
- p1$ = "ANDB": p2$ = "#$0F": GOSUB 10
- p1$ = "ORB": p2$ = "#$" + hx$(x + 1, yp + 1): GOSUB 10: b$ = "XX"
- p1$ = "STD": p2$ = STR$(x - p2 + sw - 1) + ",U": GOSUB 10
- found = 1
- calc(x + 1, yp + 1) = -1
- END IF
- NEXT x
- END IF
- FOR x = 1 TO p2
- 'Check row below
- IF calc(x, yp + 1) = 2 THEN
- p1$ = "LDB": p2$ = STR$(x - xp + sw - 1) + ",U": GOSUB 10
- p1$ = "ANDB": p2$ = "#$F0": GOSUB 10
- p1$ = "ORB": p2$ = "#$" + hx$(x, yp + 1): GOSUB 10: b$ = "XX"
- p1$ = "STB": p2$ = STR$(x - xp + sw - 1) + ",U": GOSUB 10
- calc(x, yp + 1) = -1
- END IF
- IF calc(x, yp + 1) = 3 THEN
- p1$ = "LDB": p2$ = STR$(x - xp + sw - 1) + ",U": GOSUB 10
- p1$ = "ANDB": p2$ = "#$0F": GOSUB 10
- p1$ = "ORB": p2$ = "#$" + hx$(x, yp + 1): GOSUB 10: b$ = "XX"
- p1$ = "STB": p2$ = STR$(x - xp + sw - 1) + ",U": GOSUB 10
- calc(x, yp + 1) = -1
- END IF
- NEXT x
- IF calc(xp - 2, yp) = 2 AND calc(xp - 1, yp) = 1 AND calc(xp, yp) = 1 THEN
- p1$ = "LDB": p2$ = STR$(-3) + ",U": GOSUB 10
- p1$ = "ANDB": p2$ = "#$F0": GOSUB 10
- p1$ = "ORB": p2$ = "#$" + hx$(xp - 2, yp): GOSUB 10: b$ = "XX"
- p1$ = "LDX": p2$ = "#$" + hx$(xp - 1, yp) + hx$(xp, yp): GOSUB 10: x$ = hx$(xp - 1, yp) + hx$(xp, yp)
- p1$ = "PSHU": p2$ = "B,X": GOSUB 10
- calc(xp - 2, yp) = -1: calc(xp - 1, yp) = -1: calc(xp, yp) = -1: xp = xp - 3: up = up - 3
- END IF
- FOR x = 1 TO xp
- IF calc(x, yp) = 2 THEN
- p1$ = "LDB": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- p1$ = "ANDB": p2$ = "#$F0": GOSUB 10
- p1$ = "ORB": p2$ = "#$" + hx$(x, yp): GOSUB 10: b$ = "XX"
- p1$ = "STB": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- calc(x, yp) = -1
- END IF
- IF calc(x, yp) = 3 THEN
- p1$ = "LDB": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- p1$ = "ANDB": p2$ = "#$0F": GOSUB 10
- p1$ = "ORB": p2$ = "#$" + hx$(x, yp): GOSUB 10: b$ = "XX"
- p1$ = "STB": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- calc(x, yp) = -1
- END IF
- NEXT x
- 'Check to see if we can use any 16 bit values from the row below to stack blast
- 'We don't need to sort this data, just in case D,X,Y can all be the same value (for repeated data)
- count = 0
- FOR x = 1 TO p2 - 1
- 'Check row below
- 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
- NEXT x
- 'If the 16 bit values can be used to stack blast then load them and store them in the row below then blast them
- d1 = 0: x1 = 0: y1 = 0
- IF count > 0 THEN
- FOR x = 1 TO count
- IF up > 5 THEN
- IF hx$(up - 5, yp) + hx$(up - 4, yp) = tw$(x) THEN d$ = hx$(up - 5, yp) + hx$(up - 4, yp): d1 = 1
- IF hx$(up - 3, yp) + hx$(up - 2, yp) = tw$(x) THEN x$ = hx$(up - 3, yp) + hx$(up - 2, yp): x1 = 1
- IF hx$(up - 1, yp) + hx$(up, yp) = tw$(x) THEN y$ = hx$(up - 1, yp) + hx$(up, yp): y1 = 1
- END IF
- NEXT x
- FOR x = 1 TO count
- IF up > 3 THEN
- IF hx$(up - 3, yp) + hx$(up - 2, yp) = tw$(x) THEN x$ = hx$(up - 3, yp) + hx$(up - 2, yp): x1 = 1
- IF hx$(up - 1, yp) + hx$(up, yp) = tw$(x) THEN y$ = hx$(up - 1, yp) + hx$(up, yp): y1 = 1
- END IF
- NEXT x
- END IF
- IF d1 > 0 AND x1 > 0 AND y1 > 0 THEN
- p1$ = "LDD": p2$ = "#$" + d$: GOSUB 10: d1 = 2
- p1$ = "LDX": p2$ = "#$" + x$: GOSUB 10: x1 = 2
- IF x$ = y$ THEN
- p1$ = "LEAY": p2$ = ",X": GOSUB 10: y1 = 2
- ELSE
- p1$ = "LDY": p2$ = "#$" + y$: GOSUB 10: y1 = 2
- END IF
- ELSE
- IF d1 > 0 AND x1 > 0 AND calc(up - 1, yp) = 1 AND calc(up, yp) = 1 THEN
- p1$ = "LDD": p2$ = "#$" + d$: GOSUB 10: d1 = 2
- p1$ = "LDX": p2$ = "#$" + x$: GOSUB 10: x1 = 2
- IF x$ = y$ THEN
- p1$ = "LEAY": p2$ = ",X": GOSUB 10: y1 = 2
- ELSE
- p1$ = "LDY": p2$ = "#$" + y$: GOSUB 10: y1 = 2
- END IF
- END IF
- IF d1 > 0 AND y1 > 0 AND calc(up - 3, yp) = 1 AND calc(up - 2, yp) = 1 THEN
- p1$ = "LDD": p2$ = "#$" + d$: GOSUB 10: d1 = 2
- p1$ = "LDX": p2$ = "#$" + x$: GOSUB 10: x1 = 2
- IF x$ = y$ THEN
- p1$ = "LEAY": p2$ = ",X": GOSUB 10: y1 = 2
- ELSE
- p1$ = "LDY": p2$ = "#$" + y$: GOSUB 10: y1 = 2
- END IF
- END IF
- IF x1 > 0 AND y1 > 0 THEN
- p1$ = "LDX": p2$ = "#$" + x$: GOSUB 10: x1 = 2
- IF x$ = y$ THEN
- p1$ = "LEAY": p2$ = ",X": GOSUB 10: y1 = 2
- ELSE
- p1$ = "LDY": p2$ = "#$" + y$: GOSUB 10: y1 = 2
- END IF
- END IF
- END IF
- IF d1 > 0 THEN
- IF d1 = 1 THEN
- p1$ = "LDD": p2$ = "#$" + d$: GOSUB 10
- END IF
- FOR x = 1 TO p2
- IF hx$(x, yp + 1) + hx$(x + 1, yp + 1) = d$ THEN
- p1$ = "STD": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
- hx$(x, yp + 1) = "XX": hx$(x + 1, yp + 1) = "XX"
- calc(x, yp + 1) = -1: calc(x + 1, yp + 1) = -1: x = x + 1
- END IF
- NEXT x
- END IF
- IF x1 > 0 THEN
- IF x1 = 1 THEN
- p1$ = "LDX": p2$ = "#$" + x$: GOSUB 10
- END IF
- FOR x = 1 TO p2
- IF hx$(x, yp + 1) + hx$(x + 1, yp + 1) = x$ THEN
- p1$ = "STX": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
- hx$(x, yp + 1) = "XX": hx$(x + 1, yp + 1) = "XX"
- calc(x, yp + 1) = -1: calc(x + 1, yp + 1) = -1: x = x + 1
- END IF
- NEXT x
- END IF
- IF y1 > 0 THEN
- IF y1 = 1 THEN
- p1$ = "LDY": p2$ = "#$" + y$: GOSUB 10
- END IF
- FOR x = 1 TO p2
- IF hx$(x, yp + 1) + hx$(x + 1, yp + 1) = y$ THEN
- p1$ = "STY": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
- hx$(x, yp + 1) = "XX": hx$(x + 1, yp + 1) = "XX"
- calc(x, yp + 1) = -1: calc(x + 1, yp + 1) = -1: x = x + 1
- END IF
- NEXT x
- END IF
- IF d1 = 2 AND x1 = 2 AND y1 = 2 THEN
- p1$ = "PSHU": p2$ = "D,X,Y": GOSUB 10
- up = up - 6: xp = xp - 6
- ELSE
- IF d1 = 2 AND x1 = 2 AND calc(up - 1, yp) = 1 AND calc(up, yp) = 1 THEN
- p1$ = "PSHU": p2$ = "D,X,Y": GOSUB 10
- up = up - 6: xp = xp - 6
- END IF
- IF d1 = 2 AND y1 = 2 AND calc(up - 3, yp) = 1 AND calc(up - 2, yp) = 1 THEN
- p1$ = "PSHU": p2$ = "D,X,Y": GOSUB 10
- up = up - 6: xp = xp - 6
- END IF
- IF x1 = 2 AND y1 = 2 THEN
- p1$ = "PSHU": p2$ = "X,Y": GOSUB 10
- up = up - 4: xp = xp - 4
- END IF
- END IF
- '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)
- IF d1 = 2 AND x1 = 2 THEN 725
- IF d1 = 2 AND y1 = 2 THEN 725
- IF x1 = 2 AND y1 = 2 THEN 725
- 'See if we can use X or Y as they are top row
- FOR x = 1 TO up - 1
- IF calc(x, yp) = 1 AND calc(x + 1, yp) = 1 THEN
- IF hx$(x, yp) + hx$(x + 1, yp) = x$ THEN
- p1$ = "STX": p2$ = STR$(x - up - 1) + ",U": GOSUB 10
- hx$(x, yp) = "ux1": hx$(x + 1, yp) = "ux2"
- calc(x, yp) = -1: calc(x + 1, yp) = -1
- END IF
- IF hx$(x, yp) + hx$(x + 1, yp) = yx$ THEN
- p1$ = "STY": p2$ = STR$(x - up - 1) + ",U": GOSUB 10
- hx$(x, yp) = "uy1": hx$(x + 1, yp) = "uy2"
- calc(x, yp) = -1: calc(x + 1, yp) = -1
- END IF
- END IF
- NEXT x
- 'See if we can use X or Y as they are bottom row
- FOR x = 1 TO p2 - 1
- IF calc(x, yp + 1) = 1 AND calc(x + 1, yp + 1) = 1 THEN
- IF hx$(x, yp + 1) + hx$(x + 1, yp + 1) = x$ THEN
- p1$ = "STX": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
- hx$(x, yp + 1) = "ux1": hx$(x + 1, yp + 1) = "ux2"
- calc(x, yp + 1) = -1: calc(x + 1, yp + 1) = -1
- END IF
- IF hx$(x, yp + 1) + hx$(x + 1, yp + 1) = y$ THEN
- p1$ = "STY": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
- hx$(x, yp + 1) = "uy1": hx$(x + 1, yp + 1) = "uy2"
- calc(x, yp + 1) = -1: calc(x + 1, yp + 1) = -1
- END IF
- END IF
- NEXT x
- 730 count = 0
- FOR x = 1 TO up - 1
- 'Check top row
- 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
- NEXT x
- FOR x = 1 TO p2 - 1
- 'Check row below
- 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
- NEXT x
- IF count > 1 THEN
- GOSUB 20
- IF newcount > 1 THEN
- FOR x = 1 TO newcount
- found = 0
- p1$ = "LDD": p2$ = "#$" + tw$(x): GOSUB 10
- a$ = LEFT$(tw$(x), 2): b$ = RIGHT$(tw$(x), 2)
- FOR n = 1 TO up - 1
- IF tw$(x) = hx$(n, yp) + hx$(n + 1, yp) THEN
- p1$ = "STD": p2$ = STR$(n - up - 1) + ",U": GOSUB 10
- hx$(n, yp) = "ud1": hx$(n + 1, yp) = "ud2"
- calc(n, yp) = -1: calc(n + 1, yp) = -1: n = n + 1
- found = 1
- END IF
- NEXT n
- FOR n = 1 TO p2 - 1
- 'Check row below
- IF tw$(x) = hx$(n, yp + 1) + hx$(n + 1, yp + 1) THEN
- p1$ = "STD": p2$ = STR$(n - up + sw - 1) + ",U": GOSUB 10
- hx$(n, yp + 1) = "ud1": hx$(n + 1, yp + 1) = "ud2"
- calc(n, yp + 1) = -1: calc(n + 1, yp + 1) = -1: n = n + 1
- found = 1
- END IF
- NEXT n
- 'check if we can store A or B
- FOR n = 1 TO up
- IF LEFT$(tw$(x), 2) = hx$(n, yp) THEN
- p1$ = "STA": p2$ = STR$(n - up - 1) + ",U": GOSUB 10
- hx$(n, yp) = "ua"
- calc(n, yp) = -1
- found = 1
- END IF
- IF RIGHT$(tw$(x), 2) = hx$(n, yp) THEN
- p1$ = "STB": p2$ = STR$(n - up - 1) + ",U": GOSUB 10
- hx$(n, yp) = "ub"
- calc(n, yp) = -1
- found = 1
- END IF
- NEXT n
- FOR n = 1 TO p2
- 'Check row below
- IF LEFT$(tw$(x), 2) = hx$(n, yp + 1) THEN
- p1$ = "STA": p2$ = STR$(n - up + sw - 1) + ",U": GOSUB 10
- hx$(n, yp + 1) = "ua"
- calc(n, yp + 1) = -1
- found = 1
- END IF
- IF RIGHT$(tw$(x), 2) = hx$(n, yp + 1) THEN
- p1$ = "STB": p2$ = STR$(n - up + sw - 1) + ",U": GOSUB 10
- hx$(n, yp + 1) = "ub"
- calc(n, yp + 1) = -1
- found = 1
- END IF
- NEXT n
- IF found = 1 THEN GOTO 730
- NEXT x
- ELSE
- count = 1
- END IF
- END IF
- IF count = 1 THEN
- x = count
- p1$ = "LDD": p2$ = "#$" + tw$(x): GOSUB 10
- a$ = LEFT$(tw$(x), 2): b$ = RIGHT$(tw$(x), 2)
- FOR n = 1 TO up
- IF tw$(x) = hx$(n, yp) + hx$(n + 1, yp) THEN
- p1$ = "STD": p2$ = STR$(n - up - 1) + ",U": GOSUB 10
- hx$(n, yp) = "ud1": hx$(n + 1, yp) = "ud2"
- calc(n, yp) = -1: calc(n + 1, yp) = -1: n = n + 1
- END IF
- NEXT n
- FOR n = 1 TO p2
- 'Check row below
- IF tw$(x) = hx$(n, yp + 1) + hx$(n + 1, yp + 1) THEN
- p1$ = "STD": p2$ = STR$(n - up + sw - 1) + ",U": GOSUB 10
- hx$(n, yp + 1) = "ud1": hx$(n + 1, yp + 1) = "ud2"
- calc(n, yp + 1) = -1: calc(n + 1, yp + 1) = -1: n = n + 1
- END IF
- NEXT n
- 'check if we can store A or B
- FOR n = 1 TO up
- IF LEFT$(tw$(x), 2) = hx$(n, yp) THEN
- p1$ = "STA": p2$ = STR$(n - up - 1) + ",U": GOSUB 10
- hx$(n, yp) = "ua"
- calc(n, yp) = -1
- END IF
- IF RIGHT$(tw$(x), 2) = hx$(n, yp) THEN
- p1$ = "STB": p2$ = STR$(n - up - 1) + ",U": GOSUB 10
- hx$(n, yp) = "ub"
- calc(n, yp) = -1
- END IF
- NEXT n
- FOR n = 1 TO p2
- 'Check row below
- IF LEFT$(tw$(x), 2) = hx$(n, yp + 1) THEN
- p1$ = "STA": p2$ = STR$(n - up + sw - 1) + ",U": GOSUB 10
- hx$(n, yp + 1) = "ua"
- calc(n, yp + 1) = -1
- END IF
- IF RIGHT$(tw$(x), 2) = hx$(n, yp + 1) THEN
- p1$ = "STB": p2$ = STR$(n - up + sw - 1) + ",U": GOSUB 10
- hx$(n, yp + 1) = "ub"
- calc(n, yp + 1) = -1
- END IF
- NEXT n
- END IF
- 'Check to see if we can use any 8 bit values (if not then we are done)
- count = 0
- FOR x = 1 TO xp
- IF calc(x, yp) = 1 THEN count = count + 1: tw$(count) = hx$(x, yp): wordp(count) = x
- NEXT x
- FOR x = 1 TO p2
- IF calc(x, yp + 1) = 1 THEN count = count + 1: tw$(count) = hx$(x, yp + 1): wordp(count) = x
- NEXT x
- IF count > 1 THEN
- GOSUB 20
- IF newcount > 1 THEN
- FOR x = 1 TO newcount
- p1$ = "LDB": p2$ = "#$" + tw$(x): GOSUB 10: b$ = tw$(x)
- FOR n = 1 TO xp
- 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"
- NEXT n
- 'Check row below
- FOR n = 1 TO p2
- 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"
- NEXT n
- NEXT x
- ELSE
- count = 1
- END IF
- END IF
- IF count = 1 THEN
- x = count
- p1$ = "LDB": p2$ = "#$" + tw$(x): GOSUB 10: b$ = tw$(x)
- FOR n = 1 TO xp
- 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"
- NEXT n
- FOR n = 1 TO p2
- 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"
- NEXT n
- END IF
- lastrow = yp
- GOTO 405
- 'fl = 3 then use stack on this line
- 800 PRINT #1, "* Row"; yp; "800": GOSUB 45
- IF leauFlag = 1 THEN leauFlag = 0: GOTO 810
- 'Setup U pointer
- FOR x = 1 TO w
- IF calc(x, yp) > 0 THEN p = x
- NEXT x
- x = p
- x1 = p
- count = 0
- 802 IF calc(x1, yp) = 2 OR calc(x1, yp) = 3 THEN
- x1 = x1 - 1
- count = count + 1
- ELSE GOTO 803
- END IF
- GOTO 802
- 803 p = x1
- move = p - up
- xp = p
- up = p
- p1$ = "LEAU"
- IF move > 0 THEN
- p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + "+" + STR$(move) + ",U"
- ELSE
- IF move < 0 THEN
- p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + STR$(move) + ",U"
- ELSE
- p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + ",U"
- END IF
- END IF
- GOSUB 10
- x = x + 1
- x = x - count
- count = -1
- 805 IF calc(x, yp) = 2 OR calc(x, yp) = 3 THEN
- IF calc(x, yp) = 2 THEN
- count = count + 1
- p1$ = "LDA"
- IF count = 0 THEN
- p2$ = ",U"
- ELSE
- p2$ = STR$(count) + ",U"
- END IF
- GOSUB 10
- p1$ = "ANDA": p2$ = "#$F0": GOSUB 10
- p1$ = "ORA": p2$ = "#$" + hx$(x, yp): GOSUB 10: a$ = "XX"
- p1$ = "STA"
- IF count = 0 THEN
- p2$ = ",U"
- ELSE
- p2$ = STR$(count) + ",U"
- END IF
- GOSUB 10
- calc(x, yp) = -1
- END IF
- IF calc(x, yp) = 3 THEN
- count = count + 1
- p1$ = "LDA"
- IF count = 0 THEN
- p2$ = ",U"
- ELSE
- p2$ = STR$(count) + ",U"
- END IF
- GOSUB 10
- p1$ = "ANDA": p2$ = "#$0F": GOSUB 10
- p1$ = "ORA": p2$ = "#$" + hx$(x, yp): GOSUB 10: a$ = "XX"
- p1$ = "STA"
- IF count = 0 THEN
- p2$ = ",U"
- ELSE
- p2$ = STR$(count) + ",U"
- END IF
- GOSUB 10
- calc(x, yp) = -1
- END IF
- x = x + 1
- ELSE GOTO 808
- END IF
- GOTO 805
- 808
- d$ = a$ + b$
- 810
- 'See if we can stack blast with the current values in D (A or B) ,X or Y
- pflag = 1
- 820 IF pflag = 0 THEN GOTO 850
- pflag = 0
- 825 IF up > 5 THEN
- 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
- p1$ = "PSHU": p2$ = "D,X,Y": GOSUB 10
- 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"
- 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
- up = up - 6: xp = xp - 6
- pflag = 1: GOTO 825
- END IF
- END IF
- IF up > 3 THEN
- IF hx$(up - 3, yp) + hx$(up - 2, yp) = d$ AND hx$(up - 1, yp) + hx$(up, yp) = x$ THEN
- p1$ = "PSHU": p2$ = "D,X": GOSUB 10
- hx$(up - 3, yp) = "ud1": hx$(up - 2, yp) = "ud2": hx$(up - 1, yp) = "ux1": hx$(up, yp) = "ux2"
- calc(up - 3, yp) = -1: calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
- up = up - 4: xp = xp - 4
- pflag = 1: GOTO 825
- END IF
- IF hx$(up - 3, yp) + hx$(up - 2, yp) = d$ AND hx$(up - 1, yp) + hx$(up, yp) = y$ THEN
- p1$ = "PSHU": p2$ = "D,Y": GOSUB 10
- hx$(up - 3, yp) = "ud1": hx$(up - 2, yp) = "ud2": hx$(up - 1, yp) = "uy1": hx$(up, yp) = "uy2"
- calc(up - 3, yp) = -1: calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
- up = up - 4: xp = xp - 4
- pflag = 1: GOTO 825
- END IF
- IF hx$(up - 3, yp) + hx$(up - 2, yp) = x$ AND hx$(up - 1, yp) + hx$(up, yp) = y$ THEN
- p1$ = "PSHU": p2$ = "X,Y": GOSUB 10
- hx$(up - 3, yp) = "ux1": hx$(up - 2, yp) = "ux2": hx$(up - 1, yp) = "uy1": hx$(up, yp) = "uy2"
- calc(up - 3, yp) = -1: calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
- up = up - 4: xp = xp - 4
- pflag = 1: GOTO 825
- END IF
- END IF
- IF up > 2 THEN
- IF hx$(up - 2, yp) = a$ AND hx$(up - 1, yp) + hx$(up, yp) = x$ THEN
- p1$ = "PSHU": p2$ = "A,X": GOSUB 10
- hx$(up - 2, yp) = "ua": hx$(up - 1, yp) = "ux1": hx$(up, yp) = "ux2"
- calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
- up = up - 3: xp = xp - 3
- pflag = 1: GOTO 825
- END IF
- IF hx$(up - 2, yp) = a$ AND hx$(up - 1, yp) + hx$(up, yp) = y$ THEN
- p1$ = "PSHU": p2$ = "A,Y": GOSUB 10
- hx$(up - 2, yp) = "ua": hx$(up - 1, yp) = "uy1": hx$(up, yp) = "uy2"
- calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
- up = up - 3: xp = xp - 3
- pflag = 1: GOTO 825
- END IF
- END IF
- 'Check if A can be loaded with transparent data and then blast D,X,Y
- IF up > 5 THEN
- 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
- p1$ = "LDA": p2$ = STR$(-6) + ",U": GOSUB 10
- p1$ = "ANDA": p2$ = "#$F0": GOSUB 10
- p1$ = "ORA": p2$ = "#$" + hx$(up - 5, yp): GOSUB 10: a$ = "XX"
- p1$ = "PSHU": p2$ = "D,X": GOSUB 10
- 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"
- 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
- up = up - 6: xp = xp - 6
- pflag = 1: GOTO 825
- END IF
- END IF
- 'Check if A can be loaded with transparent data and then blast D,X or D,Y
- IF up > 3 THEN
- IF calc(up - 3, yp) = 2 AND hx$(up - 2, yp) = b$ AND hx$(up - 1, yp) + hx$(up, yp) = x$ THEN
- p1$ = "LDA": p2$ = STR$(-4) + ",U": GOSUB 10
- p1$ = "ANDA": p2$ = "#$F0": GOSUB 10
- p1$ = "ORA": p2$ = "#$" + hx$(up - 3, yp): GOSUB 10: a$ = "XX"
- p1$ = "PSHU": p2$ = "D,X": GOSUB 10
- hx$(up - 3, yp) = "ud1": hx$(up - 2, yp) = "ud2": hx$(up - 1, yp) = "ux1": hx$(up, yp) = "ux2"
- calc(up - 3, yp) = -1: calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
- up = up - 4: xp = xp - 4
- pflag = 1: GOTO 825
- END IF
- IF calc(up - 3, yp) = 3 AND hx$(up - 2, yp) = b$ AND hx$(up - 1, yp) + hx$(up, yp) = x$ THEN
- p1$ = "LDA": p2$ = STR$(-4) + ",U": GOSUB 10
- p1$ = "ANDA": p2$ = "#$0F": GOSUB 10
- p1$ = "ORA": p2$ = "#$" + hx$(up - 3, yp): GOSUB 10: a$ = "XX"
- p1$ = "PSHU": p2$ = "D,X": GOSUB 10
- hx$(up - 3, yp) = "ud1": hx$(up - 2, yp) = "ud2": hx$(up - 1, yp) = "ux1": hx$(up, yp) = "ux2"
- calc(up - 3, yp) = -1: calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
- up = up - 4: xp = xp - 4
- pflag = 1: GOTO 825
- END IF
- IF calc(up - 3, yp) = 2 AND hx$(up - 2, yp) = b$ AND hx$(up - 1, yp) + hx$(up, yp) = y$ THEN
- p1$ = "LDA": p2$ = STR$(-4) + ",U": GOSUB 10
- p1$ = "ANDA": p2$ = "#$F0": GOSUB 10
- p1$ = "ORA": p2$ = "#$" + hx$(up - 3, yp): GOSUB 10: a$ = "XX"
- p1$ = "PSHU": p2$ = "D,Y": GOSUB 10
- hx$(up - 3, yp) = "ud1": hx$(up - 2, yp) = "ud2": hx$(up - 1, yp) = "uy1": hx$(up, yp) = "uy2"
- calc(up - 3, yp) = -1: calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
- up = up - 4: xp = xp - 4
- pflag = 1: GOTO 825
- END IF
- IF calc(up - 3, yp) = 3 AND hx$(up - 2, yp) = b$ AND hx$(up - 1, yp) + hx$(up, yp) = y$ THEN
- p1$ = "LDA": p2$ = STR$(-4) + ",U": GOSUB 10
- p1$ = "ANDA": p2$ = "#$0F": GOSUB 10
- p1$ = "ORA": p2$ = "#$" + hx$(up - 3, yp): GOSUB 10: a$ = "XX"
- p1$ = "PSHU": p2$ = "D,Y": GOSUB 10
- hx$(up - 3, yp) = "ud1": hx$(up - 2, yp) = "ud2": hx$(up - 1, yp) = "uy1": hx$(up, yp) = "uy2"
- calc(up - 3, yp) = -1: calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
- up = up - 4: xp = xp - 4
- pflag = 1: GOTO 825
- END IF
- END IF
- IF up > 2 THEN
- IF hx$(up - 2, yp) = b$ AND hx$(up - 1, yp) + hx$(up, yp) = x$ THEN
- p1$ = "PSHU": p2$ = "B,X": GOSUB 10
- hx$(up - 2, yp) = "ub": hx$(up - 1, yp) = "ux1": hx$(up, yp) = "ux2"
- calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
- up = up - 3: xp = xp - 3
- pflag = 1: GOTO 825
- END IF
- 'PRINT up, yp
- IF hx$(up - 2, yp) = b$ AND hx$(up - 1, yp) + hx$(up, yp) = y$ THEN
- p1$ = "PSHU": p2$ = "B,Y": GOSUB 10
- hx$(up - 2, yp) = "ub": hx$(up - 1, yp) = "uy1": hx$(up, yp) = "uy2"
- calc(up - 2, yp) = -1: calc(up - 1, yp) = -1: calc(up, yp) = -1
- up = up - 3: xp = xp - 3
- pflag = 1: GOTO 825
- END IF
- 'Check if we can do transparency nibble then blast B,X or B,Y
- IF calc(up - 2, yp) = 2 AND hx$(up - 1, yp) + hx$(up, yp) = x$ THEN
- p1$ = "LDB": p2$ = STR$(-3) + ",U": GOSUB 10
- p1$ = "ANDB": p2$ = "#$F0": GOSUB 10
- p1$ = "ORB": p2$ = "#$" + hx$(up - 2, yp): GOSUB 10: b$ = "XX"
- p1$ = "PSHU": p2$ = "B,X": GOSUB 10
- hx$(up - 2, yp) = "ub": hx$(up - 1, yp) = "ux1": hx$(up, yp) = "ux2"
- up = up - 3: xp = xp - 3
- pflag = 1: GOTO 825
- END IF
- IF calc(up - 2, yp) = 3 AND hx$(up - 1, yp) + hx$(up, yp) = x$ THEN
- p1$ = "LDB": p2$ = STR$(-3) + ",U": GOSUB 10
- p1$ = "ANDB": p2$ = "#$0F": GOSUB 10
- p1$ = "ORB": p2$ = "#$" + hx$(up - 2, yp): GOSUB 10: b$ = "XX"
- p1$ = "PSHU": p2$ = "B,X": GOSUB 10
- hx$(up - 2, yp) = "ub": hx$(up - 1, yp) = "ux1": hx$(up, yp) = "ux2"
- up = up - 3: xp = xp - 3
- pflag = 1: GOTO 825
- END IF
- IF calc(up - 2, yp) = 2 AND hx$(up - 1, yp) + hx$(up, yp) = y$ THEN
- p1$ = "LDB": p2$ = STR$(-3) + ",U": GOSUB 10
- p1$ = "ANDB": p2$ = "#$F0": GOSUB 10
- p1$ = "ORB": p2$ = "#$" + hx$(up - 2, yp): GOSUB 10: b$ = "XX"
- p1$ = "PSHU": p2$ = "B,Y": GOSUB 10
- hx$(up - 2, yp) = "ub": hx$(up - 1, yp) = "uy1": hx$(up, yp) = "uy2"
- up = up - 3: xp = xp - 3
- pflag = 1: GOTO 825
- END IF
- IF calc(up - 2, yp) = 3 AND hx$(up - 1, yp) + hx$(up, yp) = y$ THEN
- p1$ = "LDB": p2$ = STR$(-3) + ",U": GOSUB 10
- p1$ = "ANDB": p2$ = "#$0F": GOSUB 10
- p1$ = "ORB": p2$ = "#$" + hx$(up - 2, yp): GOSUB 10: b$ = "XX"
- p1$ = "PSHU": p2$ = "B,Y": GOSUB 10
- hx$(up - 2, yp) = "ub": hx$(up - 1, yp) = "uy1": hx$(up, yp) = "uy2"
- up = up - 3: xp = xp - 3
- pflag = 1: GOTO 825
- END IF
- END IF
- GOTO 820
- 'Handle 8 bit locations that have transparency (nibble as a 0)
- 850 found = 0
- 'p1$ = "this is it": p2$ = "": GOSUB 10
- FOR x = 1 TO xp
- IF calc(x, yp) = 2 AND hx$(x + 1, yp) = "ub" THEN
- p1$ = "LDA": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- p1$ = "ANDA": p2$ = "#$F0": GOSUB 10
- p1$ = "ORA": p2$ = "#$" + hx$(x, yp): GOSUB 10: a$ = "XX"
- p1$ = "STD": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- found = 1
- calc(x, yp) = -1
- END IF
- NEXT x
- IF found = 0 THEN
- FOR x = 1 TO xp
- IF hx$(x, yp) = "ua" AND calc(x + 1, yp) = 3 THEN
- p1$ = "LDB": p2$ = STR$(x - xp + 1 - 1) + ",U": GOSUB 10
- p1$ = "ANDB": p2$ = "#$0F": GOSUB 10
- p1$ = "ORB": p2$ = "#$" + hx$(x + 1, yp): GOSUB 10: b$ = "XX"
- p1$ = "STD": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- found = 1
- calc(x + 1, yp) = -1
- END IF
- NEXT x
- END IF
- FOR x = 1 TO xp
- IF calc(x, yp) = 2 THEN
- p1$ = "LDB": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- p1$ = "ANDB": p2$ = "#$F0": GOSUB 10
- p1$ = "ORB": p2$ = "#$" + hx$(x, yp): GOSUB 10: b$ = "XX"
- p1$ = "STB": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- calc(x, yp) = -1
- END IF
- IF calc(x, yp) = 3 THEN
- p1$ = "LDB": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- p1$ = "ANDB": p2$ = "#$0F": GOSUB 10
- p1$ = "ORB": p2$ = "#$" + hx$(x, yp): GOSUB 10: b$ = "XX"
- p1$ = "STB": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- calc(x, yp) = -1
- END IF
- NEXT x
- 'See if we can use X or Y as they are top row
- FOR x = 1 TO up - 1
- IF calc(x, yp) = 1 AND calc(x + 1, yp) = 1 THEN
- IF hx$(x, yp) + hx$(x + 1, yp) = x$ THEN
- p1$ = "STX": p2$ = STR$(x - up - 1) + ",U": GOSUB 10
- hx$(x, yp) = "ux1": hx$(x + 1, yp) = "ux2"
- calc(x, yp) = -1: calc(x + 1, yp) = -1
- END IF
- IF hx$(x, yp) + hx$(x + 1, yp) = yx$ THEN
- p1$ = "STY": p2$ = STR$(x - up - 1) + ",U": GOSUB 10
- hx$(x, yp) = "uy1": hx$(x + 1, yp) = "uy2"
- calc(x, yp) = -1: calc(x + 1, yp) = -1
- END IF
- END IF
- NEXT x
- count = 0
- FOR x = 1 TO up - 1
- 'PRINT #1, "Got here"
- 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
- NEXT x
- 'If the 16 bit values can be used to stack blast then load them, then blast them
- d1 = 0: x1 = 0: y1 = 0: a1 = 0: b1 = 0
- IF up > 5 THEN
- 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
- IF hx$(up - 5, yp) = a$ AND hx$(up - 4, yp) = b$ THEN d1 = 2 ELSE d1 = 1
- IF hx$(up - 3, yp) + hx$(up - 2, yp) = x$ THEN x1 = 2 ELSE x1 = 1
- IF hx$(up - 1, yp) + hx$(up, yp) = y$ THEN y1 = 2 ELSE y1 = 1
- END IF
- IF d1 = 1 THEN
- IF a$ = hx$(up - 5, yp) THEN a1 = 2
- IF b$ = hx$(up - 4, yp) THEN b1 = 2
- 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
- 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
- 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
- END IF
- IF x1 = 1 THEN
- x$ = hx$(up - 3, yp) + hx$(up - 2, yp): p1$ = "LDX": p2$ = "#$" + x$: GOSUB 10: x1 = 2
- END IF
- IF y1 = 1 THEN
- IF x$ = hx$(up - 1, yp) + hx$(up, yp) THEN
- y$ = x$: p1$ = "LEAY": p2$ = ",X": GOSUB 10: y1 = 2
- ELSE
- y$ = hx$(up - 1, yp) + hx$(up, yp): p1$ = "LDY": p2$ = "#$" + y$: GOSUB 10: y1 = 2
- END IF
- END IF
- ELSE
- IF up > 4 THEN
- 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
- IF hx$(up - 4, yp) = a$ THEN a1 = 2
- IF hx$(up - 4, yp) = b$ THEN b1 = 2
- IF a1 = 0 AND b1 = 0 THEN b1 = 1
- IF hx$(up - 3, yp) + hx$(up - 2, yp) = x$ THEN x1 = 2 ELSE x1 = 1
- IF hx$(up - 1, yp) + hx$(up, yp) = y$ THEN y1 = 2 ELSE y1 = 1
- END IF
- IF b1 = 1 THEN
- b$ = hx$(up - 4, yp): d$ = a$ + b$: p1$ = "LDB": p2$ = "#$" + b$: GOSUB 10: d1 = 2: a1 = 2: b1 = 2
- END IF
- IF x1 = 1 THEN
- x$ = hx$(up - 3, yp) + hx$(up - 2, yp): p1$ = "LDX": p2$ = "#$" + x$: GOSUB 10: x1 = 2
- END IF
- IF y1 = 1 THEN
- IF x$ = hx$(up - 1, yp) + hx$(up, yp) THEN
- y$ = x$: p1$ = "LEAY": p2$ = ",X": GOSUB 10: y1 = 2
- ELSE
- y$ = hx$(up - 1, yp) + hx$(up, yp): p1$ = "LDY": p2$ = "#$" + y$: GOSUB 10: y1 = 2
- END IF
- END IF
- ELSE
- IF up > 4 THEN
- IF calc(up - 3, yp) = 1 AND calc(up - 2, yp) = 1 AND calc(up - 1, yp) = 1 AND calc(up, yp) = 1 THEN
- IF hx$(up - 3, yp) + hx$(up - 2, yp) = x$ THEN x1 = 2 ELSE x1 = 1
- IF hx$(up - 1, yp) + hx$(up, yp) = y$ THEN y1 = 2 ELSE y1 = 1
- END IF
- IF x1 = 1 THEN
- x$ = hx$(up - 3, yp) + hx$(up - 2, yp): p1$ = "LDX": p2$ = "#$" + x$: GOSUB 10: x1 = 2
- END IF
- IF y1 = 1 THEN
- IF x$ = hx$(up - 1, yp) + hx$(up, yp) THEN
- y$ = x$: p1$ = "LEAY": p2$ = ",X": GOSUB 10: y1 = 2
- ELSE
- y$ = hx$(up - 1, yp) + hx$(up, yp): p1$ = "LDY": p2$ = "#$" + y$: GOSUB 10: y1 = 2
- END IF
- END IF
- ELSE
- IF up > 3 THEN
- IF calc(up - 2, yp) = 1 AND calc(up - 1, yp) = 1 AND calc(up, yp) = 1 THEN
- IF hx$(up - 2, yp) = a$ THEN a1 = 2
- IF hx$(up - 2, yp) = b$ THEN b1 = 2
- IF a1 = 0 AND b1 = 0 THEN b1 = 1
- IF hx$(up - 1, yp) + hx$(up, yp) = x$ THEN x1 = 2 ELSE x1 = 1
- END IF
- IF b1 = 1 THEN
- b$ = hx$(up - 2, yp): d$ = a$ + b$: p1$ = "LDB": p2$ = "#$" + b$: GOSUB 10: d1 = 2: a1 = 2: b1 = 2
- END IF
- IF x1 = 1 THEN
- x$ = hx$(up - 1, yp) + hx$(up, yp): p1$ = "LDX": p2$ = "#$" + x$: GOSUB 10: x1 = 2
- END IF
- END IF
- END IF
- END IF
- END IF
- 'Check if used loaded, if so go back and look at the values at the new location (maybe we can blast again)
- IF x1 = 2 THEN 825
- 830 count = 0
- FOR x = 1 TO up - 1
- 'PRINT #1, "Got here"
- 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
- NEXT x
- IF count > 1 THEN
- 'PRINT #1, "Got here 1"
- 'p1$ = "count=": p2$ = STR$(count): GOSUB 10
- GOSUB 20
- IF newcount > 1 THEN
- 'p1$ = "newcount": p2$ = STR$(newcount): GOSUB 10
- FOR x = 1 TO newcount
- IF a$ <> LEFT$(tw$(x), 2) AND b$ <> RIGHT$(tw$(x), 2) THEN
- p1$ = "LDD": p2$ = "#$" + tw$(x): GOSUB 10
- a$ = LEFT$(tw$(x), 2): b$ = RIGHT$(tw$(x), 2)
- 'PRINT #1, "Got here 2"
- END IF
- IF a$ = LEFT$(tw$(x), 2) AND b$ <> RIGHT$(tw$(x), 2) THEN
- p1$ = "LDB": p2$ = "#$" + RIGHT$(tw$(x), 2): GOSUB 10
- b$ = RIGHT$(tw$(x), 2)
- END IF
- IF b$ = RIGHT$(tw$(x), 2) AND a$ <> LEFT$(tw$(x), 2) THEN
- p1$ = "LDA": p2$ = "#$" + LEFT$(tw$(x), 2): GOSUB 10
- a$ = LEFT$(tw$(x), 2)
- END IF
- 'PRINT #1, "Checking to see if we can use STD"
- found = 0
- FOR n = 1 TO up - 1
- 'PRINT #1, p1$, p2$, n, tw$(x), a$, b$, hx$(n, yp), hx$(n + 1, yp)
- IF tw$(x) = hx$(n, yp) + hx$(n + 1, yp) THEN
- p1$ = "STD": p2$ = STR$(n - up - 1) + ",U": GOSUB 10
- hx$(n, yp) = "ud1": hx$(n + 1, yp) = "ud2"
- calc(n, yp) = -1: calc(n + 1, yp) = -1
- found = 1
- 'PRINT #1, "Got here 3"
- END IF
- NEXT n
- 'check if we can store A or B
- 'PRINT #1, "Checking to see if we can use STA or STB"
- FOR n = 1 TO up
- 'PRINT #1, "A", n, LEFT$(tw$(x), 2), a$, hx$(n, yp)
- IF LEFT$(tw$(x), 2) = hx$(n, yp) THEN
- p1$ = "STA": p2$ = STR$(n - up - 1) + ",U": GOSUB 10
- hx$(n, yp) = "ua"
- calc(n, yp) = -1
- found = 1
- 'PRINT #1, "Got here 3 - sta"
- END IF
- 'PRINT #1, "B"; x; n, RIGHT$(tw$(x), 2), b$, hx$(n, yp)
- IF RIGHT$(tw$(x), 2) = hx$(n, yp) THEN
- p1$ = "STB": p2$ = STR$(n - up - 1) + ",U": GOSUB 10
- hx$(n, yp) = "ub"
- calc(n, yp) = -1
- found = 1
- 'p1$ = "Got here 3 - stb": p2$ = "": GOSUB 10
- END IF
- NEXT n
- IF found = 1 THEN GOTO 830
- NEXT x
- ELSE
- count = 1
- END IF
- END IF
- IF count = 1 THEN
- x = count
- IF a$ <> LEFT$(tw$(x), 2) AND b$ <> RIGHT$(tw$(x), 2) THEN
- p1$ = "LDD": p2$ = "#$" + tw$(x): GOSUB 10
- a$ = LEFT$(tw$(x), 2): b$ = RIGHT$(tw$(x), 2)
- ELSE
- IF a$ = LEFT$(tw$(x), 2) THEN
- p1$ = "LDB": p2$ = "#$" + RIGHT$(tw$(x), 2): GOSUB 10
- b$ = RIGHT$(tw$(x), 2)
- END IF
- IF b$ = RIGHT$(tw$(x), 2) THEN
- p1$ = "LDA": p2$ = "#$" + LEFT$(tw$(x), 2): GOSUB 10
- a$ = LEFT$(tw$(x), 2)
- END IF
- END IF
- FOR n = 1 TO up
- IF tw$(x) = hx$(n, yp) + hx$(n + 1, yp) THEN
- p1$ = "STD": p2$ = STR$(n - up - 1) + ",U": GOSUB 10
- hx$(n, yp) = "ud1": hx$(n + 1, yp) = "ud2"
- calc(n, yp) = -1: calc(n + 1, yp) = -1
- 'PRINT #1, "Got here 4"
- END IF
- NEXT n
- 'check if we can store A or B
- FOR n = 1 TO up
- IF LEFT$(tw$(x), 2) = hx$(n, yp) THEN
- p1$ = "STA": p2$ = STR$(n - up - 1) + ",U": GOSUB 10
- hx$(n, yp) = "ua"
- calc(n, yp) = -1
- END IF
- IF RIGHT$(tw$(x), 2) = hx$(n, yp) THEN
- p1$ = "STB": p2$ = STR$(n - up - 1) + ",U": GOSUB 10
- hx$(n, yp) = "ub"
- calc(n, yp) = -1
- 'p1$ = "Got here 4 - stb": p2$ = "": GOSUB 10
- END IF
- NEXT n
- END IF
- 'Check to see if we can use any 8 bit values (if not then we are done)
- count = 0
- FOR x = 1 TO xp
- IF calc(x, yp) = 1 THEN count = count + 1: tw$(count) = hx$(x, yp)
- NEXT x
- IF count > 1 THEN
- GOSUB 20
- IF newcount > 1 THEN
- FOR x = 1 TO newcount
- p1$ = "LDB": p2$ = "#$" + tw$(x): GOSUB 10: b$ = tw$(x)
- FOR n = 1 TO xp
- 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"
- NEXT n
- NEXT x
- ELSE
- count = 1
- END IF
- END IF
- IF count = 1 THEN
- x = count
- p1$ = "LDB": p2$ = "#$" + tw$(x): GOSUB 10: b$ = tw$(x)
- FOR n = 1 TO xp
- 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"
- NEXT n
- END IF
- lastrow = yp
- GOTO 405
- 1000 yval = 0: ym = 0
- 1050 PRINT #1, "**************************************************"
- FOR y = 1 TO h
- PRINT #1, "* ";
- FOR x = 1 TO w
- PRINT #1, hx$(x, y); " ";
- NEXT x
- PRINT #1, "-"; y
- NEXT y
- PRINT #1, "**************************************************"
- IF subname$ = "" THEN
- PRINT #1, "_Restore_"; LEFT$(Fname$, LEN(Fname$) - 4); ":"
- ELSE
- PRINT #1, "Restore_"; sn$
- END IF
- IF cyc = 1 THEN
- PRINT #1, " opt cd"
- PRINT #1, " opt cc"
- END IF
- ' position the starting point
- fb = w
- yp = h
- xp = w
- FOR y = 1 TO h
- FOR x = 1 TO w
- bcode = 0
- byte = sp(x, y)
- IF byte = 0 THEN GOTO 1120
- bcode = 1
- IF byte < 16 THEN bcode = 2
- IF byte = (byte AND 240) THEN bcode = 3
- 1120 calc(x, y) = bcode
- 'IF y = 19 THEN PRINT x, y, calc(x, y), bcode
- NEXT x
- NEXT y
- 'FOR y = 1 TO h
- 'FOR x = 1 TO w
- 'PRINT calc(x, y);
- 'NEXT x
- 'PRINT
- 'NEXT y
- FOR yp = h TO 1 STEP -1
- 'fl = 0 then no stack usage, just do load/store on this row
- 'fl = 1 then no stack usage, do load/store on this row and the row below it
- 'fl = 2 then use stack on this line and do load/store on line below
- 'fl = 3 then use stack on this line
- 'fl = 4 then skip this row, row above will handle it
- 'fl = 5 then ignore this row (no data to process)
- fl = 0
- FOR x = 1 TO w - 2
- IF calc(x, yp) = 1 AND calc(x + 1, yp) = 1 AND calc(x + 2, yp) = 1 THEN fl = 3
- IF calc(x, yp) = 2 AND calc(x + 1, yp) = 1 AND calc(x + 2, yp) = 1 THEN fl = 3
- IF calc(x, yp) = 3 AND calc(x + 1, yp) = 1 AND calc(x + 2, yp) = 1 THEN fl = 3
- NEXT x
- IF fl = 3 THEN GOTO 1200
- FOR x = 1 TO w - 3
- 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
- NEXT x
- IF fl = 3 THEN GOTO 1200
- fl = 0
- count = 0
- FOR x = 1 TO w
- count = count + calc(x, yp)
- NEXT x
- IF count = 0 THEN fl = 5
- 1200
- comp(yp) = fl
- NEXT yp
- y = h
- 1210
- IF comp(y) = 0 AND comp(y - 1) = 0 THEN comp(y) = 4: comp(y - 1) = 1: y = y - 2: GOTO 1250
- IF comp(y) = 0 AND comp(y - 1) = 3 THEN comp(y) = 4: comp(y - 1) = 2: y = y - 2: GOTO 1250
- y = y - 1
- 1250 IF y > 1 THEN 1210
- 'FOR y = 1 TO h
- 'PRINT y - 1;
- 'PRINT comp(y);
- 'FOR x = 1 TO w
- 'PRINT calc(x, y);
- 'NEXT x
- 'PRINT
- 'NEXT y
- yp = h
- 1280 IF comp(yp) < 4 THEN 1300
- yp = yp - 1
- IF yp > 1 THEN GOTO 1280
- 1300 IF comp(yp) > 1 THEN 1310
- FOR x = w TO 1 STEP -1
- IF sp(x, yp) <> 0 THEN xp = x: GOTO 1390
- NEXT x
- PRINT "Error... Should not get here. While finding starting point."
- END
- 1310 ' FOR x = w - 3 TO 1 STEP -1
- 'IF calc(x, yp) = 1 AND calc(x + 1, yp) = 1 AND calc(x + 2, yp) = 1 THEN xp = x + 2: GOTO 1390
- 'IF calc(x, yp) = 2 AND calc(x + 1, yp) = 1 AND calc(x + 2, yp) = 1 THEN xp = x + 2: GOTO 1390
- 'IF calc(x, yp) = 3 AND calc(x + 1, yp) = 1 AND calc(x + 2, yp) = 1 THEN xp = x + 2: GOTO 1390
- 'NEXT x
- xp = 0
- FOR x = 1 TO w
- IF calc(x, yp) > 0 THEN xp = x
- NEXT x
- 'Starting location move down from the top left corner
- 1390 PRINT #1, "* Row"; yp
- a$ = "": b$ = "": x$ = "": y$ = ""
- p1$ = "LEAU": p2$ = sw$ + "*" + STR$(yp - 1) + "+" + STR$(xp) + STR$(mv) + ",U": up = xp: leauFlag = 1: GOSUB 10
- p1$ = "LEAY": p2$ = rest$: GOSUB 10
- 1395 yp = h: lastrow = yp
- 'yp = the current line to start on
- 'comp(yp) tells us how to handle the current row
- 'fl = 0 then no stack usage, just do load/store on this row
- 'fl = 1 then no stack usage, do load/store on this row and the row below it
- 'fl = 2 then use stack on this line and do load/store on line below
- 'fl = 3 then use stack on this line
- 'fl = 4 then skip this row, row above will handle it
- 'fl = 5 then ignore this row (no data to process)
- 'main loop - start of a new row to work on
- 1400 IF comp(yp) < 4 THEN GOSUB 15: GOTO 1410
- 1405 yp = yp - 1
- IF yp > 0 THEN GOTO 1400
- ' If we get here then we are done.
- p1$ = "RTS": p2$ = ""
- GOSUB 10: GOSUB 15
- RETURN
- 1410 IF comp(yp) = 0 THEN 1500
- 1420 IF comp(yp) = 1 THEN 1600
- 1430 IF comp(yp) = 2 THEN 1700
- 1440 IF comp(yp) = 3 THEN 1800
- PRINT "Error. Stopping, weird 1": END
- 'fl = then no stack usage, do load/store on this row only
- 1500 PRINT #1, "* Row"; yp; "1500": GOSUB 45
- 'PRINT #1, "up="; up
- IF leauFlag = 1 THEN leauFlag = 0: GOTO 1510
- 'Setup U pointer
- FOR x = 1 TO w
- IF calc(x, yp) > 0 THEN p = x
- NEXT x
- IF calc(p, yp) > 1 THEN p = p - 1
- move = p - up
- xp = p
- up = p
- 'PRINT #1, "up="; up
- p1$ = "LEAU"
- IF move > 0 THEN
- p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + "+" + STR$(move) + ",U"
- ELSE
- IF move < 0 THEN
- p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + STR$(move) + ",U"
- ELSE
- p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + ",U"
- END IF
- END IF
- GOSUB 10
- p1$ = "LEAY": p2$ = rest$: GOSUB 10
- x = up + 1
- 'PRINT #1, "x="; x; "Calc(x,yp)="; calc(x, yp)
- IF calc(x, yp) = 2 THEN
- p1$ = "LDA": p2$ = ",Y": GOSUB 10
- p1$ = "STA": p2$ = ",U": GOSUB 10
- calc(x, yp) = -1
- END IF
- IF calc(x, yp) = 3 THEN
- p1$ = "LDA": p2$ = ",Y": GOSUB 10
- p1$ = "STA": p2$ = ",U": GOSUB 10
- calc(x, yp) = -1
- END IF
- 1510 a = 0: b = 0: d = 0: x = 0: y = 0
- FOR x = 1 TO xp - 1
- IF calc(x, yp) > 0 AND calc(x + 1, yp) > 0 THEN
- hx$(x, yp) = "ux1": hx$(x + 1, yp) = "ux2": calc(x, yp) = -1: calc(x + 1, yp) = -1: x = x + 1
- END IF
- NEXT x
- FOR x = 1 TO xp
- IF calc(x, yp) > 0 THEN
- hx$(x, yp) = "ua": calc(x, yp) = -1
- END IF
- NEXT x
- FOR x = 1 TO xp - 1
- IF hx$(x, yp) = "ux1" THEN
- p1$ = "LDX": p2$ = STR$(x - xp - 1) + ",Y": GOSUB 10
- p1$ = "STX": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- END IF
- NEXT x
- FOR x = 1 TO xp
- IF hx$(x, yp) = "ua" THEN
- p1$ = "LDA": p2$ = STR$(x - xp - 1) + ",Y": GOSUB 10
- p1$ = "STA": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- END IF
- NEXT x
- lastrow = yp
- GOTO 1405
- 'fl = 1 then no stack usage, do load/store on this row and the row below it
- 1600 PRINT #1, "* Row"; yp; "and row"; yp + 1; "1600": GOSUB 45: yp = yp + 1: GOSUB 45: yp = yp - 1
- 'PRINT #1, "up="; up
- IF leauFlag = 1 THEN leauFlag = 0: GOTO 1608
- 'Setup U pointer
- FOR x = 1 TO w
- IF calc(x, yp) > 0 THEN p = x
- IF calc(x, yp + 1) > 0 THEN p2 = x
- NEXT x
- IF p2 >= p THEN
- p = p2
- ELSE
- IF calc(p, yp) > 1 THEN p = p - 1
- END IF
- move = p - up
- xp = p
- up = p
- 'PRINT #1, "up="; up
- p1$ = "LEAU"
- IF move > 0 THEN
- p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + "+" + STR$(move) + ",U"
- ELSE
- IF move < 0 THEN
- p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + STR$(move) + ",U"
- ELSE
- p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + ",U"
- END IF
- END IF
- GOSUB 10
- p1$ = "LEAY": p2$ = rest$: GOSUB 10: yval = 0
- x = up + 1
- 'PRINT #1, "x="; x; "Calc(x,yp)="; calc(x, yp)
- IF calc(x, yp) = 2 THEN
- p1$ = "LDA": p2$ = ",Y": GOSUB 10
- p1$ = "STA": p2$ = ",U": GOSUB 10
- calc(x, yp) = -1
- END IF
- IF calc(x, yp) = 3 THEN
- p1$ = "LDA": p2$ = ",Y": GOSUB 10
- p1$ = "STA": p2$ = ",U": GOSUB 10
- calc(x, yp) = -1
- END IF
- 1608
- FOR x = 1 TO w
- IF calc(x, yp + 1) > 0 THEN p2 = x
- NEXT x
- 1610 a = 0: b = 0: d = 0: x = 0: y = 0
- FOR x = 1 TO xp - 1
- IF calc(x, yp) > 0 AND calc(x + 1, yp) > 0 THEN
- hx$(x, yp) = "ux1": hx$(x + 1, yp) = "ux2": calc(x, yp) = -1: calc(x + 1, yp) = -1
- END IF
- NEXT x
- 'Check row below
- FOR x = 1 TO p2 - 1
- IF calc(x, yp + 1) > 0 AND calc(x + 1, yp + 1) > 0 THEN
- hx$(x, yp + 1) = "ux1": hx$(x + 1, yp + 1) = "ux2": calc(x, yp + 1) = -1: calc(x + 1, yp + 1) = -1
- END IF
- NEXT x
- FOR x = 1 TO xp
- IF calc(x, yp) > 0 THEN
- hx$(x, yp) = "ua": calc(x, yp) = -1
- END IF
- NEXT x
- 'Check row below
- FOR x = 1 TO p2
- IF calc(x, yp + 1) > 0 THEN
- hx$(x, yp + 1) = "ua": calc(x, yp + 1) = -1
- END IF
- NEXT x
- FOR x = 1 TO xp - 1
- IF hx$(x, yp) = "ux1" THEN
- p1$ = "LDX": p2$ = STR$(x - xp - 1) + ",Y": GOSUB 10
- p1$ = "STX": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- END IF
- NEXT x
- 'Check and handle row below
- FOR x = 1 TO p2 - 1
- IF hx$(x, yp + 1) = "ux1" THEN
- p1$ = "LDX": p2$ = STR$(x - up + sw - 1) + ",Y": GOSUB 10
- p1$ = "STX": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
- END IF
- NEXT x
- FOR x = 1 TO xp
- IF hx$(x, yp) = "ua" THEN
- p1$ = "LDA": p2$ = STR$(x - xp - 1) + ",Y": GOSUB 10
- p1$ = "STA": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- END IF
- NEXT x
- 'Check and handle row below
- FOR x = 1 TO p2
- IF hx$(x, yp + 1) = "ua" THEN
- p1$ = "LDA": p2$ = STR$(x - up + sw - 1) + ",Y": GOSUB 10
- p1$ = "STA": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
- END IF
- NEXT x
- lastrow = yp
- GOTO 1405
- 'fl = 2 then use stack on this line and do load/store on line below
- 1700 PRINT #1, "* Row"; yp; "and row"; yp + 1; "1700": GOSUB 45: yp = yp + 1: GOSUB 45: yp = yp - 1
- IF leauFlag = 1 THEN leauFlag = 0: GOTO 1704
- 'Setup U pointer
- FOR x = 1 TO w
- IF calc(x, yp) > 0 THEN p = x
- NEXT x
- FOR x = 1 TO w
- IF calc(x, yp + 1) > 0 THEN p2 = x
- NEXT x
- IF p2 > p THEN p = p2
- move = p - up
- xp = p
- up = p
- p1$ = "LEAU"
- IF move > 0 THEN
- p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + "+" + STR$(move) + ",U"
- ELSE
- IF move < 0 THEN
- p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + STR$(move) + ",U"
- ELSE
- p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + ",U"
- END IF
- END IF
- GOSUB 10
- p1$ = "LEAY": p2$ = rest$: GOSUB 10
- 1704
- x = x + 1
- 1705 IF calc(x, yp) > 0 THEN
- p1$ = "LDA": p2$ = ",Y": GOSUB 10
- p1$ = "STA": p2$ = ",U": GOSUB 10
- calc(x, yp) = -1
- END IF
- 1710 a = 0: b = 0: d = 0: x = 0: y = 0
- 'Check row below to see if we can store the value of any registers/accumulators with their current values
- FOR x = 1 TO p2 - 1
- IF calc(x, yp + 1) > 0 AND calc(x + 1, yp + 1) > 0 THEN
- hx$(x, yp + 1) = "ux1": hx$(x + 1, yp + 1) = "ux2": calc(x, yp + 1) = -1: calc(x + 1, yp + 1) = -1
- END IF
- NEXT x
- 'Check row below
- FOR x = 1 TO p2
- IF calc(x, yp + 1) > 0 THEN
- hx$(x, yp + 1) = "ua": calc(x, yp + 1) = -1
- END IF
- NEXT x
- 'Check and handle row below
- FOR x = 1 TO p2 - 1
- IF hx$(x, yp + 1) = "ux1" THEN
- p1$ = "LDX": p2$ = STR$(x - up + sw - 1) + ",Y": GOSUB 10
- p1$ = "STX": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
- END IF
- NEXT x
- 'Check and handle row below
- FOR x = 1 TO p2
- IF hx$(x, yp + 1) = "ua" THEN
- p1$ = "LDA": p2$ = STR$(x - up + sw - 1) + ",Y": GOSUB 10
- p1$ = "STA": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
- END IF
- NEXT x
- 'See if we can stack blast D (A or B) ,X
- pflag = 1: yval = 0: stp = 0
- 1725 IF up > 3 THEN
- IF calc(up - 3, yp) > 0 AND calc(up - 2, yp) > 0 AND calc(up - 1, yp) > 0 AND calc(up, yp) > 0 THEN
- p1$ = "LDX": p2$ = STR$(stp - 2) + ",Y": GOSUB 10
- p1$ = "LDD": p2$ = STR$(stp - 4) + ",Y": GOSUB 10
- p1$ = "PSHU": p2$ = "D,X": GOSUB 10
- up = up - 4: yval = yval + 4: stp = stp - 4
- GOTO 1725
- END IF
- END IF
- IF up > 2 THEN
- IF calc(up - 2, yp) > 0 AND calc(up - 1, yp) > 0 AND calc(up, yp) > 0 THEN
- p1$ = "LDX": p2$ = STR$(stp - 2) + ",Y": GOSUB 10
- p1$ = "LDA": p2$ = STR$(stp - 3) + ",Y": GOSUB 10
- p1$ = "PSHU": p2$ = "A,X": GOSUB 10
- up = up - 3: yval = yval + 3: stp = stp - 3
- pflag = 1
- GOTO 1725
- END IF
- END IF
- 'Do Load/Store for the rest of the top line
- FOR x = 1 TO up - 1
- IF calc(x, yp) > 0 AND calc(x + 1, yp) > 0 THEN
- hx$(x, yp) = "ux1": hx$(x + 1, yp) = "ux2": calc(x, yp) = -1: calc(x + 1, yp) = -1: x = x + 1
- END IF
- NEXT x
- FOR x = 1 TO up
- IF calc(x, yp) > 0 THEN
- hx$(x, yp) = "ua": calc(x, yp) = -1
- END IF
- NEXT x
- FOR x = 1 TO up - 1
- IF hx$(x, yp) = "ux1" THEN
- p1$ = "LDX": p2$ = STR$(x - up - 1 - yval) + ",Y": GOSUB 10
- p1$ = "STX": p2$ = STR$(x - up - 1) + ",U": GOSUB 10
- END IF
- NEXT x
- FOR x = 1 TO up
- IF hx$(x, yp) = "ua" THEN
- p1$ = "LDA": p2$ = STR$(x - up - 1 - yval) + ",Y": GOSUB 10
- p1$ = "STA": p2$ = STR$(x - up - 1) + ",U": GOSUB 10
- END IF
- NEXT x
- lastrow = yp
- GOTO 1405
- 'fl = 3 then use stack on this line
- 1800 PRINT #1, "* Row"; yp; "1800": GOSUB 45
- x = up + 1
- IF leauFlag = 1 THEN leauFlag = 0: GOTO 1805
- 'Setup U pointer
- FOR x = 1 TO w
- IF calc(x, yp) > 0 THEN p = x
- NEXT x
- move = p - up
- xp = p
- up = p
- p1$ = "LEAU"
- IF move > 0 THEN
- p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + "+" + STR$(move) + ",U"
- ELSE
- IF move < 0 THEN
- p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + STR$(move) + ",U"
- ELSE
- p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + ",U"
- END IF
- END IF
- GOSUB 10
- p1$ = "LEAY"
- IF move <> 0 THEN
- p2$ = STR$(-VAL(sw$) - yval + move) + ",Y"
- ELSE
- p2$ = STR$(-VAL(sw$) - yval) + ",Y"
- END IF
- GOSUB 10
- x = p
- 1804 GOTO 1808
- 1805 IF calc(x, yp) > 0 THEN
- p1$ = "LDA": p2$ = ",Y": GOSUB 10
- p1$ = "STA": p2$ = ",U": GOSUB 10
- calc(x, yp) = -1
- END IF
- 1808
- 1810 a = 0: b = 0: d = 0: x = 0: y = 0
- 'See if we can stack blast D or A and X
- pflag = 1: yval = 0
- 1825 IF up > 3 THEN
- IF calc(up - 3, yp) > 0 AND calc(up - 2, yp) > 0 AND calc(up - 1, yp) > 0 AND calc(up, yp) > 0 THEN
- p1$ = "LDX": p2$ = STR$(-2 - yval) + ",Y": GOSUB 10
- p1$ = "LDD": p2$ = STR$(-4 - yval) + ",Y": GOSUB 10
- p1$ = "PSHU": p2$ = "D,X": GOSUB 10
- up = up - 4: yval = yval + 4
- GOTO 1825
- END IF
- END IF
- IF up > 2 THEN
- IF calc(up - 2, yp) > 0 AND calc(up - 1, yp) > 0 AND calc(up, yp) > 0 THEN
- p1$ = "LDX": p2$ = STR$(-2 - yval) + ",Y": GOSUB 10
- p1$ = "LDA": p2$ = STR$(-3 - yval) + ",Y": GOSUB 10
- p1$ = "PSHU": p2$ = "A,X": GOSUB 10
- up = up - 3: yval = yval + 3
- pflag = 1
- GOTO 1825
- END IF
- END IF
- 'Do Load/Store for the rest of the line
- FOR x = 1 TO up - 1
- IF calc(x, yp) > 0 AND calc(x + 1, yp) > 0 THEN
- hx$(x, yp) = "ux1": hx$(x + 1, yp) = "ux2": calc(x, yp) = -1: calc(x + 1, yp) = -1: x = x + 1
- END IF
- NEXT x
- FOR x = 1 TO up
- IF calc(x, yp) > 0 THEN
- hx$(x, yp) = "ua": calc(x, yp) = -1
- END IF
- NEXT x
- FOR x = 1 TO up - 1
- IF hx$(x, yp) = "ux1" THEN
- p1$ = "LDX": p2$ = STR$(x - up - 1 - yval) + ",Y": GOSUB 10
- p1$ = "STX": p2$ = STR$(x - up - 1) + ",U": GOSUB 10
- END IF
- NEXT x
- FOR x = 1 TO up
- IF hx$(x, yp) = "ua" THEN
- p1$ = "LDA": p2$ = STR$(x - up - 1 - yval) + ",Y": GOSUB 10
- p1$ = "STA": p2$ = STR$(x - up - 1) + ",U": GOSUB 10
- END IF
- NEXT x
- lastrow = yp
- GOTO 1405
- 'Restore behind the sprite with the hex value in rest$
- 2000 yval = 0: ym = 0
- 2050 PRINT #1, "**************************************************"
- FOR y = 1 TO h
- PRINT #1, "* ";
- FOR x = 1 TO w
- PRINT #1, hx$(x, y); " ";
- NEXT x
- PRINT #1, "-"; y
- NEXT y
- PRINT #1, "**************************************************"
- IF subname$ = "" THEN
- PRINT #1, "_Restore_"; LEFT$(Fname$, LEN(Fname$) - 4); ":"
- ELSE
- PRINT #1, "Restore_"; sn$
- END IF
- IF cyc = 1 THEN
- PRINT #1, " opt cd"
- PRINT #1, " opt cc"
- END IF
- ' position the starting point
- fb = w
- yp = h
- xp = w
- FOR y = 1 TO h
- FOR x = 1 TO w
- bcode = 0
- byte = sp(x, y)
- IF byte = 0 THEN GOTO 2120
- bcode = 1
- IF byte < 16 THEN bcode = 2
- IF byte = (byte AND 240) THEN bcode = 3
- 2120 calc(x, y) = bcode
- 'IF y = 19 THEN PRINT x, y, calc(x, y), bcode
- NEXT x
- NEXT y
- FOR yp = h TO 1 STEP -1
- 'fl = 0 then no stack usage, just do store on this row
- 'fl = 1 then no stack usage, do store on this row and the row below it
- 'fl = 2 then use stack on this line and do store on line below
- 'fl = 3 then use stack on this line
- 'fl = 4 then skip this row, row above will handle it
- 'fl = 5 then ignore this row (no data to process)
- fl = 0
- FOR x = 1 TO w - 2
- IF calc(x, yp) = 1 AND calc(x + 1, yp) = 1 AND calc(x + 2, yp) = 1 THEN fl = 3
- IF calc(x, yp) = 2 AND calc(x + 1, yp) = 1 AND calc(x + 2, yp) = 1 THEN fl = 3
- IF calc(x, yp) = 3 AND calc(x + 1, yp) = 1 AND calc(x + 2, yp) = 1 THEN fl = 3
- NEXT x
- IF fl = 3 THEN GOTO 2200
- FOR x = 1 TO w - 3
- 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
- NEXT x
- IF fl = 3 THEN GOTO 2200
- fl = 0
- count = 0
- FOR x = 1 TO w
- count = count + calc(x, yp)
- NEXT x
- IF count = 0 THEN fl = 5
- 2200
- comp(yp) = fl
- NEXT yp
- y = h
- 2210
- IF comp(y) = 0 AND comp(y - 1) = 0 THEN comp(y) = 4: comp(y - 1) = 1: y = y - 2: GOTO 2250
- IF comp(y) = 0 AND comp(y - 1) = 3 THEN comp(y) = 4: comp(y - 1) = 2: y = y - 2: GOTO 2250
- y = y - 1
- 2250 IF y > 1 THEN 2210
- yp = h
- 2280 IF comp(yp) < 4 THEN 2300
- yp = yp - 1
- IF yp > 1 THEN GOTO 2280
- 2300 IF comp(yp) > 1 THEN 2310
- FOR x = w TO 1 STEP -1
- IF sp(x, yp) <> 0 THEN xp = x: GOTO 2390
- NEXT x
- PRINT "Error... Should not get here. While finding starting point."
- END
- 2310 ' FOR x = w - 3 TO 1 STEP -1
- 'IF calc(x, yp) = 1 AND calc(x + 1, yp) = 1 AND calc(x + 2, yp) = 1 THEN xp = x + 2: GOTO 1390
- 'IF calc(x, yp) = 2 AND calc(x + 1, yp) = 1 AND calc(x + 2, yp) = 1 THEN xp = x + 2: GOTO 1390
- 'IF calc(x, yp) = 3 AND calc(x + 1, yp) = 1 AND calc(x + 2, yp) = 1 THEN xp = x + 2: GOTO 1390
- 'NEXT x
- xp = 0
- FOR x = 1 TO w
- IF calc(x, yp) > 0 THEN xp = x
- NEXT x
- 'Starting location move down from the top left corner
- 2390 PRINT #1, "* Row"; yp
- a$ = rest$: b$ = a$: d$ = a$ + b$: x$ = d$: y$ = x$
- p1$ = "LDD": p2$ = "#$" + rest$ + rest$: GOSUB 10
- p1$ = "LDX": p2$ = "#$" + rest$ + rest$: GOSUB 10
- p1$ = "LEAY": p2$ = ",X": GOSUB 10
- p1$ = "LEAU": p2$ = sw$ + "*" + STR$(yp - 1) + "+" + STR$(xp) + STR$(mv) + ",U": up = xp: leauFlag = 1: GOSUB 10
- 'p1$ = "LEAY": p2$ = rest$: GOSUB 10
- 2395 yp = h: lastrow = yp
- 'yp = the current line to start on
- 'comp(yp) tells us how to handle the current row
- 'fl = 0 then no stack usage, just do store on this row
- 'fl = 1 then no stack usage, do store on this row and the row below it
- 'fl = 2 then use stack on this line and do store on line below
- 'fl = 3 then use stack on this line
- 'fl = 4 then skip this row, row above will handle it
- 'fl = 5 then ignore this row (no data to process)
- 'main loop - start of a new row to work on
- 2400 IF comp(yp) < 4 THEN GOSUB 15: GOTO 2410
- 2405 yp = yp - 1
- IF yp > 0 THEN GOTO 2400
- ' If we get here then we are done.
- p1$ = "RTS": p2$ = ""
- GOSUB 10: GOSUB 15
- RETURN
- 2410 IF comp(yp) = 0 THEN 2500
- 2420 IF comp(yp) = 1 THEN 2600
- 2430 IF comp(yp) = 2 THEN 2700
- 2440 IF comp(yp) = 3 THEN 2800
- PRINT "Error. Stopping, weird 1": END
- 'fl = 0 then no stack usage, do store on this row only
- 2500 PRINT #1, "* Row"; yp; "2500": GOSUB 45
- 'PRINT #1, "up="; up
- IF leauFlag = 1 THEN leauFlag = 0: GOTO 2510
- 'Setup U pointer
- FOR x = 1 TO w
- IF calc(x, yp) > 0 THEN p = x
- NEXT x
- IF calc(p, yp) > 1 THEN p = p - 1
- move = p - up
- xp = p
- up = p
- 'PRINT #1, "up="; up
- p1$ = "LEAU"
- IF move > 0 THEN
- p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + "+" + STR$(move) + ",U"
- ELSE
- IF move < 0 THEN
- p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + STR$(move) + ",U"
- ELSE
- p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + ",U"
- END IF
- END IF
- GOSUB 10
- 'p1$ = "LEAY": p2$ = rest$: GOSUB 10
- x = up + 1
- 'PRINT #1, "x="; x; "Calc(x,yp)="; calc(x, yp)
- IF calc(x, yp) = 2 THEN
- ' p1$ = "LDA": p2$ = ",Y": GOSUB 10
- p1$ = "STA": p2$ = ",U": GOSUB 10
- calc(x, yp) = -1
- END IF
- IF calc(x, yp) = 3 THEN
- ' p1$ = "LDA": p2$ = ",Y": GOSUB 10
- p1$ = "STA": p2$ = ",U": GOSUB 10
- calc(x, yp) = -1
- END IF
- 2510 a = 0: b = 0: d = 0: x = 0: y = 0
- FOR x = 1 TO xp - 1
- IF calc(x, yp) > 0 AND calc(x + 1, yp) > 0 THEN
- hx$(x, yp) = "ux1": hx$(x + 1, yp) = "ux2": calc(x, yp) = -1: calc(x + 1, yp) = -1: x = x + 1
- END IF
- NEXT x
- FOR x = 1 TO xp
- IF calc(x, yp) > 0 THEN
- hx$(x, yp) = "ua": calc(x, yp) = -1
- END IF
- NEXT x
- FOR x = 1 TO xp - 1
- IF hx$(x, yp) = "ux1" THEN
- ' p1$ = "LDX": p2$ = STR$(x - xp - 1) + ",Y": GOSUB 10
- p1$ = "STX": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- END IF
- NEXT x
- FOR x = 1 TO xp
- IF hx$(x, yp) = "ua" THEN
- ' p1$ = "LDA": p2$ = STR$(x - xp - 1) + ",Y": GOSUB 10
- p1$ = "STA": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- END IF
- NEXT x
- lastrow = yp
- GOTO 2405
- 'fl = 1 then no stack usage, do store on this row and the row below it
- 2600 PRINT #1, "* Row"; yp; "and row"; yp + 1; "2600": GOSUB 45: yp = yp + 1: GOSUB 45: yp = yp - 1
- 'PRINT #1, "up="; up
- IF leauFlag = 1 THEN leauFlag = 0: GOTO 2608
- 'Setup U pointer
- FOR x = 1 TO w
- IF calc(x, yp) > 0 THEN p = x
- IF calc(x, yp + 1) > 0 THEN p2 = x
- NEXT x
- IF p2 >= p THEN
- p = p2
- ELSE
- IF calc(p, yp) > 1 THEN p = p - 1
- END IF
- move = p - up
- xp = p
- up = p
- 'PRINT #1, "up="; up
- p1$ = "LEAU"
- IF move > 0 THEN
- p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + "+" + STR$(move) + ",U"
- ELSE
- IF move < 0 THEN
- p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + STR$(move) + ",U"
- ELSE
- p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + ",U"
- END IF
- END IF
- GOSUB 10
- 'p1$ = "LEAY": p2$ = rest$: GOSUB 10: yval = 0
- x = up + 1
- 'PRINT #1, "x="; x; "Calc(x,yp)="; calc(x, yp)
- IF calc(x, yp) = 2 THEN
- ' p1$ = "LDA": p2$ = ",Y": GOSUB 10
- p1$ = "STA": p2$ = ",U": GOSUB 10
- calc(x, yp) = -1
- END IF
- IF calc(x, yp) = 3 THEN
- ' p1$ = "LDA": p2$ = ",Y": GOSUB 10
- p1$ = "STA": p2$ = ",U": GOSUB 10
- calc(x, yp) = -1
- END IF
- 2608
- FOR x = 1 TO w
- IF calc(x, yp + 1) > 0 THEN p2 = x
- NEXT x
- 2610 a = 0: b = 0: d = 0: x = 0: y = 0
- FOR x = 1 TO xp - 1
- IF calc(x, yp) > 0 AND calc(x + 1, yp) > 0 THEN
- hx$(x, yp) = "ux1": hx$(x + 1, yp) = "ux2": calc(x, yp) = -1: calc(x + 1, yp) = -1
- END IF
- NEXT x
- 'Check row below
- FOR x = 1 TO p2 - 1
- IF calc(x, yp + 1) > 0 AND calc(x + 1, yp + 1) > 0 THEN
- hx$(x, yp + 1) = "ux1": hx$(x + 1, yp + 1) = "ux2": calc(x, yp + 1) = -1: calc(x + 1, yp + 1) = -1
- END IF
- NEXT x
- FOR x = 1 TO xp
- IF calc(x, yp) > 0 THEN
- hx$(x, yp) = "ua": calc(x, yp) = -1
- END IF
- NEXT x
- 'Check row below
- FOR x = 1 TO p2
- IF calc(x, yp + 1) > 0 THEN
- hx$(x, yp + 1) = "ua": calc(x, yp + 1) = -1
- END IF
- NEXT x
- FOR x = 1 TO xp - 1
- IF hx$(x, yp) = "ux1" THEN
- ' p1$ = "LDX": p2$ = STR$(x - xp - 1) + ",Y": GOSUB 10
- p1$ = "STX": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- END IF
- NEXT x
- 'Check and handle row below
- FOR x = 1 TO p2 - 1
- IF hx$(x, yp + 1) = "ux1" THEN
- ' p1$ = "LDX": p2$ = STR$(x - up + sw - 1) + ",Y": GOSUB 10
- p1$ = "STX": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
- END IF
- NEXT x
- FOR x = 1 TO xp
- IF hx$(x, yp) = "ua" THEN
- ' p1$ = "LDA": p2$ = STR$(x - xp - 1) + ",Y": GOSUB 10
- p1$ = "STA": p2$ = STR$(x - xp - 1) + ",U": GOSUB 10
- END IF
- NEXT x
- 'Check and handle row below
- FOR x = 1 TO p2
- IF hx$(x, yp + 1) = "ua" THEN
- ' p1$ = "LDA": p2$ = STR$(x - up + sw - 1) + ",Y": GOSUB 10
- p1$ = "STA": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
- END IF
- NEXT x
- lastrow = yp
- GOTO 2405
- 'fl = 2 then use stack on this line and do load/store on line below
- 2700 PRINT #1, "* Row"; yp; "and row"; yp + 1; "2700": GOSUB 45: yp = yp + 1: GOSUB 45: yp = yp - 1
- IF leauFlag = 1 THEN leauFlag = 0: GOTO 2704
- 'Setup U pointer
- FOR x = 1 TO w
- IF calc(x, yp) > 0 THEN p = x
- NEXT x
- FOR x = 1 TO w
- IF calc(x, yp + 1) > 0 THEN p2 = x
- NEXT x
- IF p2 > p THEN p = p2
- move = p - up
- xp = p
- up = p
- p1$ = "LEAU"
- IF move > 0 THEN
- p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + "+" + STR$(move) + ",U"
- ELSE
- IF move < 0 THEN
- p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + STR$(move) + ",U"
- ELSE
- p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + ",U"
- END IF
- END IF
- GOSUB 10
- 'p1$ = "LEAY": p2$ = rest$: GOSUB 10
- 2704
- x = x + 1
- 2705 IF calc(x, yp) > 0 THEN
- ' p1$ = "LDA": p2$ = ",Y": GOSUB 10
- p1$ = "STA": p2$ = ",U": GOSUB 10
- calc(x, yp) = -1
- END IF
- 2710 a = 0: b = 0: d = 0: x = 0: y = 0
- 'Check row below to see if we can store the value of any registers/accumulators with their current values
- FOR x = 1 TO p2 - 1
- IF calc(x, yp + 1) > 0 AND calc(x + 1, yp + 1) > 0 THEN
- hx$(x, yp + 1) = "ux1": hx$(x + 1, yp + 1) = "ux2": calc(x, yp + 1) = -1: calc(x + 1, yp + 1) = -1
- END IF
- NEXT x
- 'Check row below
- FOR x = 1 TO p2
- IF calc(x, yp + 1) > 0 THEN
- hx$(x, yp + 1) = "ua": calc(x, yp + 1) = -1
- END IF
- NEXT x
- 'Check and handle row below
- FOR x = 1 TO p2 - 1
- IF hx$(x, yp + 1) = "ux1" THEN
- ' p1$ = "LDX": p2$ = STR$(x - up + sw - 1) + ",Y": GOSUB 10
- p1$ = "STX": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
- END IF
- NEXT x
- 'Check and handle row below
- FOR x = 1 TO p2
- IF hx$(x, yp + 1) = "ua" THEN
- ' p1$ = "LDA": p2$ = STR$(x - up + sw - 1) + ",Y": GOSUB 10
- p1$ = "STA": p2$ = STR$(x - up + sw - 1) + ",U": GOSUB 10
- END IF
- NEXT x
- 'See if we can stack blast D (A or B) ,X,Y
- pflag = 1: yval = 0: stp = 0
- 2725 IF up > 5 THEN
- 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
- ' p1$ = "LDX": p2$ = STR$(stp - 2) + ",Y": GOSUB 10
- ' p1$ = "LDD": p2$ = STR$(stp - 4) + ",Y": GOSUB 10
- p1$ = "PSHU": p2$ = "D,X,Y": GOSUB 10
- up = up - 6: yval = yval + 6: stp = stp - 6
- GOTO 2725
- END IF
- END IF
- IF up > 4 THEN
- 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
- ' p1$ = "LDX": p2$ = STR$(stp - 2) + ",Y": GOSUB 10
- ' p1$ = "LDD": p2$ = STR$(stp - 4) + ",Y": GOSUB 10
- p1$ = "PSHU": p2$ = "A,X,Y": GOSUB 10
- up = up - 5: yval = yval + 5: stp = stp - 5
- GOTO 2725
- END IF
- END IF
- IF up > 3 THEN
- IF calc(up - 3, yp) > 0 AND calc(up - 2, yp) > 0 AND calc(up - 1, yp) > 0 AND calc(up, yp) > 0 THEN
- ' p1$ = "LDX": p2$ = STR$(stp - 2) + ",Y": GOSUB 10
- ' p1$ = "LDD": p2$ = STR$(stp - 4) + ",Y": GOSUB 10
- p1$ = "PSHU": p2$ = "D,X": GOSUB 10
- up = up - 4: yval = yval + 4: stp = stp - 4
- GOTO 2725
- END IF
- END IF
- IF up > 2 THEN
- IF calc(up - 2, yp) > 0 AND calc(up - 1, yp) > 0 AND calc(up, yp) > 0 THEN
- 'p1$ = "LDX": p2$ = STR$(stp - 2) + ",Y": GOSUB 10
- 'p1$ = "LDA": p2$ = STR$(stp - 3) + ",Y": GOSUB 10
- p1$ = "PSHU": p2$ = "A,X": GOSUB 10
- up = up - 3: yval = yval + 3: stp = stp - 3
- pflag = 1
- GOTO 2725
- END IF
- END IF
- 'Do Load/Store for the rest of the top line
- FOR x = 1 TO up - 1
- IF calc(x, yp) > 0 AND calc(x + 1, yp) > 0 THEN
- hx$(x, yp) = "ux1": hx$(x + 1, yp) = "ux2": calc(x, yp) = -1: calc(x + 1, yp) = -1: x = x + 1
- END IF
- NEXT x
- FOR x = 1 TO up
- IF calc(x, yp) > 0 THEN
- hx$(x, yp) = "ua": calc(x, yp) = -1
- END IF
- NEXT x
- FOR x = 1 TO up - 1
- IF hx$(x, yp) = "ux1" THEN
- 'p1$ = "LDX": p2$ = STR$(x - up - 1 - yval) + ",Y": GOSUB 10
- p1$ = "STX": p2$ = STR$(x - up - 1) + ",U": GOSUB 10
- END IF
- NEXT x
- FOR x = 1 TO up
- IF hx$(x, yp) = "ua" THEN
- 'p1$ = "LDA": p2$ = STR$(x - up - 1 - yval) + ",Y": GOSUB 10
- p1$ = "STA": p2$ = STR$(x - up - 1) + ",U": GOSUB 10
- END IF
- NEXT x
- lastrow = yp
- GOTO 2405
- 'fl = 3 then use stack on this line
- 2800 PRINT #1, "* Row"; yp; "2800": GOSUB 45
- x = up + 1
- IF leauFlag = 1 THEN leauFlag = 0: GOTO 2805
- 'Setup U pointer
- FOR x = 1 TO w
- IF calc(x, yp) > 0 THEN p = x
- NEXT x
- move = p - up
- xp = p
- up = p
- p1$ = "LEAU"
- IF move > 0 THEN
- p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + "+" + STR$(move) + ",U"
- ELSE
- IF move < 0 THEN
- p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + STR$(move) + ",U"
- ELSE
- p2$ = "-" + sw$ + "*" + STR$(lastrow - yp) + ",U"
- END IF
- END IF
- GOSUB 10
- 'p1$ = "LEAY"
- 'IF move <> 0 THEN
- ' p2$ = STR$(-VAL(sw$) - yval + move) + ",Y"
- 'ELSE
- ' p2$ = STR$(-VAL(sw$) - yval) + ",Y"
- 'END IF
- 'GOSUB 10
- x = p
- 2804 GOTO 2808
- 2805 IF calc(x, yp) > 0 THEN
- ' p1$ = "LDA": p2$ = ",Y": GOSUB 10
- p1$ = "STA": p2$ = ",U": GOSUB 10
- calc(x, yp) = -1
- END IF
- 2808
- 2810 a = 0: b = 0: d = 0: x = 0: y = 0
- 'See if we can stack blast D or A and X,Y
- pflag = 1: yval = 0
- 2825 IF up > 5 THEN
- 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
- ' p1$ = "LDX": p2$ = STR$(-2 - yval) + ",Y": GOSUB 10
- ' p1$ = "LDD": p2$ = STR$(-4 - yval) + ",Y": GOSUB 10
- p1$ = "PSHU": p2$ = "D,X,Y": GOSUB 10
- up = up - 4: yval = yval + 4
- GOTO 2825
- END IF
- END IF
- IF up > 4 THEN
- 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
- ' p1$ = "LDX": p2$ = STR$(-2 - yval) + ",Y": GOSUB 10
- ' p1$ = "LDD": p2$ = STR$(-4 - yval) + ",Y": GOSUB 10
- p1$ = "PSHU": p2$ = "A,X,Y": GOSUB 10
- up = up - 4: yval = yval + 4
- GOTO 2825
- END IF
- END IF
- IF up > 3 THEN
- IF calc(up - 3, yp) > 0 AND calc(up - 2, yp) > 0 AND calc(up - 1, yp) > 0 AND calc(up, yp) > 0 THEN
- ' p1$ = "LDX": p2$ = STR$(-2 - yval) + ",Y": GOSUB 10
- ' p1$ = "LDD": p2$ = STR$(-4 - yval) + ",Y": GOSUB 10
- p1$ = "PSHU": p2$ = "D,X": GOSUB 10
- up = up - 4: yval = yval + 4
- GOTO 2825
- END IF
- END IF
- IF up > 2 THEN
- IF calc(up - 2, yp) > 0 AND calc(up - 1, yp) > 0 AND calc(up, yp) > 0 THEN
- ' p1$ = "LDX": p2$ = STR$(-2 - yval) + ",Y": GOSUB 10
- ' p1$ = "LDA": p2$ = STR$(-3 - yval) + ",Y": GOSUB 10
- p1$ = "PSHU": p2$ = "A,X": GOSUB 10
- up = up - 3: yval = yval + 3
- pflag = 1
- GOTO 2825
- END IF
- END IF
- 'Do Load/Store for the rest of the line
- FOR x = 1 TO up - 1
- IF calc(x, yp) > 0 AND calc(x + 1, yp) > 0 THEN
- hx$(x, yp) = "ux1": hx$(x + 1, yp) = "ux2": calc(x, yp) = -1: calc(x + 1, yp) = -1: x = x + 1
- END IF
- NEXT x
- FOR x = 1 TO up
- IF calc(x, yp) > 0 THEN
- hx$(x, yp) = "ua": calc(x, yp) = -1
- END IF
- NEXT x
- FOR x = 1 TO up - 1
- IF hx$(x, yp) = "ux1" THEN
- ' p1$ = "LDX": p2$ = STR$(x - up - 1 - yval) + ",Y": GOSUB 10
- p1$ = "STX": p2$ = STR$(x - up - 1) + ",U": GOSUB 10
- END IF
- NEXT x
- FOR x = 1 TO up
- IF hx$(x, yp) = "ua" THEN
- ' p1$ = "LDA": p2$ = STR$(x - up - 1 - yval) + ",Y": GOSUB 10
- p1$ = "STA": p2$ = STR$(x - up - 1) + ",U": GOSUB 10
- END IF
- NEXT x
- lastrow = yp
- GOTO 2405
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement