1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2025-04-09 21:37:31 +00:00

Fixed problem with overlapping variables in threads.

This commit is contained in:
jespergravgaard 2019-04-02 22:31:26 +02:00
parent a2fece2ea2
commit de8c42eba8
9 changed files with 811 additions and 834 deletions

@ -109,7 +109,7 @@ public class Pass4ZeroPageCoalesce extends Pass2Base {
* @return True if the two equivalence classes can be coalesced into one without problems.
*/
private static boolean canCoalesceThreads(LiveRangeEquivalenceClass ec1, LiveRangeEquivalenceClass ec2, Collection<ScopeRef> threadHeads, Program program) {
if(threadHeads.size()>=1) {
if(threadHeads.size()<=1) {
return true;
}
CallGraph callGraph = program.getCallGraph();

@ -74,12 +74,12 @@ interrupt(kernel_min) void plex_irq() {
// The raster loop
void loop() {
// The current index into the y-sinus
volatile byte sin_idx = 0; // without volatile gives wrong asm
byte sin_idx = 0;
while(true) {
while(!framedone) { }
*BORDERCOL = RED;
// Assign sinus positions
volatile byte y_idx = sin_idx; // without volatile gives wrong asm
byte y_idx = sin_idx;
for(byte sy: 0..PLEX_COUNT-1) {
PLEX_YPOS[sy] = YSIN[y_idx];
y_idx += 8;

@ -93,9 +93,9 @@ sub_main: {
rts
}
irq: {
.label k = 4
.label j = 3
.label i = 2
.label k = 8
.label j = 7
.label i = 6
inc BGCOL
lda #0
sta i
@ -129,7 +129,7 @@ irq: {
jmp $ea81
}
sub_irq: {
.label i = 5
.label i = 9
lda #0
sta i
b1:

@ -1349,10 +1349,10 @@ Attempting to uplift remaining variables inzp ZP_BYTE:9 [ irq::j#4 irq::j#1 ]
Uplifting [irq] best 424175705 combination zp ZP_BYTE:9 [ irq::j#4 irq::j#1 ]
Attempting to uplift remaining variables inzp ZP_BYTE:8 [ irq::i#7 irq::i#1 ]
Uplifting [irq] best 424175705 combination zp ZP_BYTE:8 [ irq::i#7 irq::i#1 ]
Coalescing zero page register [ zp ZP_BYTE:2 [ main::i#7 main::i#1 ] ] with [ zp ZP_BYTE:8 [ irq::i#7 irq::i#1 ] ]
Coalescing zero page register [ zp ZP_BYTE:3 [ main::j#5 main::j#1 ] ] with [ zp ZP_BYTE:9 [ irq::j#4 irq::j#1 ] ]
Coalescing zero page register [ zp ZP_BYTE:4 [ main::k#2 main::k#1 ] ] with [ zp ZP_BYTE:10 [ irq::k#2 irq::k#1 ] ]
Coalescing zero page register [ zp ZP_BYTE:5 [ sub_main::i#6 sub_main::i#1 ] ] with [ zp ZP_BYTE:11 [ sub_irq::i#6 sub_irq::i#1 ] ]
Allocated (was zp ZP_BYTE:8) zp ZP_BYTE:6 [ irq::i#7 irq::i#1 ]
Allocated (was zp ZP_BYTE:9) zp ZP_BYTE:7 [ irq::j#4 irq::j#1 ]
Allocated (was zp ZP_BYTE:10) zp ZP_BYTE:8 [ irq::k#2 irq::k#1 ]
Allocated (was zp ZP_BYTE:11) zp ZP_BYTE:9 [ sub_irq::i#6 sub_irq::i#1 ]
ASSEMBLER BEFORE OPTIMIZATION
//SEG0 File Comments
@ -1578,9 +1578,9 @@ sub_main: {
}
//SEG77 irq
irq: {
.label k = 4
.label j = 3
.label i = 2
.label k = 8
.label j = 7
.label i = 6
//SEG78 entry interrupt(KERNEL_MIN)
//SEG79 [39] *((const byte*) BGCOL#0) ← ++ *((const byte*) BGCOL#0) -- _deref_pbuc1=_inc__deref_pbuc1
inc BGCOL
@ -1676,7 +1676,7 @@ irq: {
}
//SEG114 sub_irq
sub_irq: {
.label i = 5
.label i = 9
//SEG115 [57] phi from sub_irq to sub_irq::@1 [phi:sub_irq->sub_irq::@1]
b1_from_sub_irq:
//SEG116 [57] phi (byte) sub_irq::i#6 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:sub_irq->sub_irq::@1#0] -- vbuz1=vbuc1
@ -1906,14 +1906,14 @@ interrupt(KERNEL_MIN)(void()) irq()
(label) irq::@7
(label) irq::@return
(byte) irq::i
(byte) irq::i#1 i zp ZP_BYTE:2 16.5
(byte) irq::i#7 i zp ZP_BYTE:2 93.0
(byte) irq::i#1 i zp ZP_BYTE:6 16.5
(byte) irq::i#7 i zp ZP_BYTE:6 93.0
(byte) irq::j
(byte) irq::j#1 j zp ZP_BYTE:3 151.5
(byte) irq::j#4 j zp ZP_BYTE:3 150.375
(byte) irq::j#1 j zp ZP_BYTE:7 151.5
(byte) irq::j#4 j zp ZP_BYTE:7 150.375
(byte) irq::k
(byte) irq::k#1 k zp ZP_BYTE:4 1501.5
(byte) irq::k#2 k zp ZP_BYTE:4 600.5999999999999
(byte) irq::k#1 k zp ZP_BYTE:8 1501.5
(byte) irq::k#2 k zp ZP_BYTE:8 600.5999999999999
(void()) main()
(byte~) main::$1 reg byte a 20002.0
(byte~) main::$2 reg byte a 20002.0
@ -1943,8 +1943,8 @@ interrupt(KERNEL_MIN)(void()) irq()
(label) sub_irq::@5
(label) sub_irq::@return
(byte) sub_irq::i
(byte) sub_irq::i#1 i zp ZP_BYTE:5 15001.5
(byte) sub_irq::i#6 i zp ZP_BYTE:5 102000.30000000002
(byte) sub_irq::i#1 i zp ZP_BYTE:9 15001.5
(byte) sub_irq::i#6 i zp ZP_BYTE:9 102000.30000000002
(byte) sub_irq::j
(byte) sub_irq::j#1 reg byte x 150001.5
(byte) sub_irq::j#4 reg byte x 171428.99999999997
@ -1970,12 +1970,16 @@ interrupt(KERNEL_MIN)(void()) irq()
(byte) sub_main::k#1 reg byte y 1.50000015E7
(byte) sub_main::k#2 reg byte y 7500000.75
zp ZP_BYTE:2 [ main::i#7 main::i#1 irq::i#7 irq::i#1 ]
zp ZP_BYTE:3 [ main::j#5 main::j#1 irq::j#4 irq::j#1 ]
zp ZP_BYTE:4 [ main::k#2 main::k#1 irq::k#2 irq::k#1 ]
zp ZP_BYTE:5 [ sub_main::i#6 sub_main::i#1 sub_irq::i#6 sub_irq::i#1 ]
zp ZP_BYTE:2 [ main::i#7 main::i#1 ]
zp ZP_BYTE:3 [ main::j#5 main::j#1 ]
zp ZP_BYTE:4 [ main::k#2 main::k#1 ]
zp ZP_BYTE:5 [ sub_main::i#6 sub_main::i#1 ]
reg byte x [ sub_main::j#4 sub_main::j#1 ]
reg byte y [ sub_main::k#2 sub_main::k#1 ]
zp ZP_BYTE:6 [ irq::i#7 irq::i#1 ]
zp ZP_BYTE:7 [ irq::j#4 irq::j#1 ]
zp ZP_BYTE:8 [ irq::k#2 irq::k#1 ]
zp ZP_BYTE:9 [ sub_irq::i#6 sub_irq::i#1 ]
reg byte x [ sub_irq::j#4 sub_irq::j#1 ]
reg byte y [ sub_irq::k#2 sub_irq::k#1 ]
reg byte a [ main::$1 ]
@ -2164,9 +2168,9 @@ sub_main: {
}
//SEG77 irq
irq: {
.label k = 4
.label j = 3
.label i = 2
.label k = 8
.label j = 7
.label i = 6
//SEG78 entry interrupt(KERNEL_MIN)
//SEG79 [39] *((const byte*) BGCOL#0) ← ++ *((const byte*) BGCOL#0) -- _deref_pbuc1=_inc__deref_pbuc1
inc BGCOL
@ -2237,7 +2241,7 @@ irq: {
}
//SEG114 sub_irq
sub_irq: {
.label i = 5
.label i = 9
//SEG115 [57] phi from sub_irq to sub_irq::@1 [phi:sub_irq->sub_irq::@1]
//SEG116 [57] phi (byte) sub_irq::i#6 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:sub_irq->sub_irq::@1#0] -- vbuz1=vbuc1
lda #0

@ -33,14 +33,14 @@ interrupt(KERNEL_MIN)(void()) irq()
(label) irq::@7
(label) irq::@return
(byte) irq::i
(byte) irq::i#1 i zp ZP_BYTE:2 16.5
(byte) irq::i#7 i zp ZP_BYTE:2 93.0
(byte) irq::i#1 i zp ZP_BYTE:6 16.5
(byte) irq::i#7 i zp ZP_BYTE:6 93.0
(byte) irq::j
(byte) irq::j#1 j zp ZP_BYTE:3 151.5
(byte) irq::j#4 j zp ZP_BYTE:3 150.375
(byte) irq::j#1 j zp ZP_BYTE:7 151.5
(byte) irq::j#4 j zp ZP_BYTE:7 150.375
(byte) irq::k
(byte) irq::k#1 k zp ZP_BYTE:4 1501.5
(byte) irq::k#2 k zp ZP_BYTE:4 600.5999999999999
(byte) irq::k#1 k zp ZP_BYTE:8 1501.5
(byte) irq::k#2 k zp ZP_BYTE:8 600.5999999999999
(void()) main()
(byte~) main::$1 reg byte a 20002.0
(byte~) main::$2 reg byte a 20002.0
@ -70,8 +70,8 @@ interrupt(KERNEL_MIN)(void()) irq()
(label) sub_irq::@5
(label) sub_irq::@return
(byte) sub_irq::i
(byte) sub_irq::i#1 i zp ZP_BYTE:5 15001.5
(byte) sub_irq::i#6 i zp ZP_BYTE:5 102000.30000000002
(byte) sub_irq::i#1 i zp ZP_BYTE:9 15001.5
(byte) sub_irq::i#6 i zp ZP_BYTE:9 102000.30000000002
(byte) sub_irq::j
(byte) sub_irq::j#1 reg byte x 150001.5
(byte) sub_irq::j#4 reg byte x 171428.99999999997
@ -97,12 +97,16 @@ interrupt(KERNEL_MIN)(void()) irq()
(byte) sub_main::k#1 reg byte y 1.50000015E7
(byte) sub_main::k#2 reg byte y 7500000.75
zp ZP_BYTE:2 [ main::i#7 main::i#1 irq::i#7 irq::i#1 ]
zp ZP_BYTE:3 [ main::j#5 main::j#1 irq::j#4 irq::j#1 ]
zp ZP_BYTE:4 [ main::k#2 main::k#1 irq::k#2 irq::k#1 ]
zp ZP_BYTE:5 [ sub_main::i#6 sub_main::i#1 sub_irq::i#6 sub_irq::i#1 ]
zp ZP_BYTE:2 [ main::i#7 main::i#1 ]
zp ZP_BYTE:3 [ main::j#5 main::j#1 ]
zp ZP_BYTE:4 [ main::k#2 main::k#1 ]
zp ZP_BYTE:5 [ sub_main::i#6 sub_main::i#1 ]
reg byte x [ sub_main::j#4 sub_main::j#1 ]
reg byte y [ sub_main::k#2 sub_main::k#1 ]
zp ZP_BYTE:6 [ irq::i#7 irq::i#1 ]
zp ZP_BYTE:7 [ irq::j#4 irq::j#1 ]
zp ZP_BYTE:8 [ irq::k#2 irq::k#1 ]
zp ZP_BYTE:9 [ sub_irq::i#6 sub_irq::i#1 ]
reg byte x [ sub_irq::j#4 sub_irq::j#1 ]
reg byte y [ sub_irq::k#2 sub_irq::k#1 ]
reg byte a [ main::$1 ]

@ -34,14 +34,14 @@
.label YSIN = $2100
// The address of the sprite pointers on the current screen (screen+$3f8).
.label PLEX_SCREEN_PTR = $400+$3f8
.label plex_show_idx = 9
.label plex_sprite_idx = 8
.label plex_sprite_msb = $b
.label plex_sprite_idx_1 = $e
.label plex_free_next = $f
.label plex_show_idx = 8
.label plex_sprite_idx = 7
.label plex_sprite_msb = $a
.label plex_sprite_idx_1 = $d
.label plex_free_next = $e
.label framedone = 2
.label plex_free_next_27 = $a
.label plex_free_next_31 = $a
.label plex_free_next_27 = 9
.label plex_free_next_31 = 9
bbegin:
// The index in the PLEX tables of the next sprite to show
lda #0
@ -66,12 +66,8 @@ main: {
// The raster loop
loop: {
.label sin_idx = 3
.label y_idx = 4
// The current index into the y-sinus
lda #0
sta sin_idx
b1:
// without volatile gives wrong asm
b2:
lda framedone
cmp #0
@ -80,18 +76,13 @@ loop: {
b3:
lda #RED
sta BORDERCOL
// Assign sinus positions
lda sin_idx
sta y_idx
ldx sin_idx
ldy #0
// without volatile gives wrong asm
b4:
ldx y_idx
lda YSIN,x
sta PLEX_YPOS,y
lax y_idx
txa
axs #-[8]
stx y_idx
iny
cpy #PLEX_COUNT-1+1
bne b4
@ -107,7 +98,7 @@ loop: {
sta VIC_CONTROL
lda #0
sta RASTER
jmp b1
jmp b2
}
// Ensure that the indices in PLEX_SORTED_IDX is sorted based on the y-positions in PLEX_YPOS
// Assumes that the positions are nearly sorted already (as each sprite just moves a bit)
@ -119,9 +110,9 @@ loop: {
// elements before the marker are shifted right one at a time until encountering one smaller than the current one.
// It is then inserted at the spot. Now the marker can move forward.
plexSort: {
.label nxt_idx = $c
.label nxt_y = $d
.label m = 5
.label nxt_idx = $b
.label nxt_y = $c
.label m = 4
lda #0
sta m
b1:
@ -174,7 +165,7 @@ plexSort: {
}
// Initialize the program
init: {
.label xp = 6
.label xp = 5
lda #VIC_DEN|VIC_RSEL|3
sta D011
jsr plexInit
@ -239,7 +230,7 @@ plexInit: {
rts
}
plex_irq: {
.label _4 = 5
.label _4 = $f
lda #WHITE
sta BORDERCOL
b3:
@ -276,9 +267,9 @@ plex_irq: {
// Show the next sprite.
// plexSort() prepares showing the sprites
plexShowSprite: {
.label _7 = 8
.label plex_sprite_idx2 = 5
.label plexFreeAdd1__2 = $a
.label _7 = 7
.label plex_sprite_idx2 = $f
.label plexFreeAdd1__2 = 9
lda plex_sprite_idx
asl
sta plex_sprite_idx2

@ -43,10 +43,10 @@ main::@return: scope:[main] from main::@1
[15] return
to:@return
loop: scope:[loop] from main::@1
[16] (byte) loop::sin_idx#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
[16] phi()
to:loop::@1
loop::@1: scope:[loop] from loop loop::@6
[17] (byte) loop::sin_idx#6 ← phi( loop/(byte) loop::sin_idx#0 loop::@6/(byte) loop::sin_idx#1 )
[17] (byte) loop::sin_idx#6 ← phi( loop/(byte/signed byte/word/signed word/dword/signed dword) 0 loop::@6/(byte) loop::sin_idx#1 )
[17] (bool) framedone#12 ← phi( loop/(bool) framedone#19 loop::@6/(bool) framedone#5 )
to:loop::@2
loop::@2: scope:[loop] from loop::@1 loop::@2
@ -54,11 +54,11 @@ loop::@2: scope:[loop] from loop::@1 loop::@2
to:loop::@2
loop::@3: scope:[loop] from loop::@2
[19] *((const byte*) BORDERCOL#0) ← (const byte) RED#0
[20] (byte) loop::y_idx#0 ← (byte) loop::sin_idx#6
[20] (byte~) loop::y_idx#4 ← (byte) loop::sin_idx#6
to:loop::@4
loop::@4: scope:[loop] from loop::@3 loop::@4
[21] (byte) loop::sy#2 ← phi( loop::@4/(byte) loop::sy#1 loop::@3/(byte/signed byte/word/signed word/dword/signed dword) 0 )
[21] (byte) loop::y_idx#2 ← phi( loop::@4/(byte) loop::y_idx#1 loop::@3/(byte) loop::y_idx#0 )
[21] (byte) loop::y_idx#2 ← phi( loop::@4/(byte) loop::y_idx#1 loop::@3/(byte~) loop::y_idx#4 )
[22] *((const byte[PLEX_COUNT#0]) PLEX_YPOS#0 + (byte) loop::sy#2) ← *((const byte*) YSIN#0 + (byte) loop::y_idx#2)
[23] (byte) loop::y_idx#1 ← (byte) loop::y_idx#2 + (byte/signed byte/word/signed word/dword/signed dword) 8
[24] (byte) loop::sy#1 ← ++ (byte) loop::sy#2

File diff suppressed because it is too large Load Diff

@ -142,8 +142,8 @@
(byte) init::sx#1 reg byte x 16.5
(byte) init::sx#2 reg byte x 8.8
(word) init::xp
(word) init::xp#1 xp zp ZP_WORD:6 7.333333333333333
(word) init::xp#2 xp zp ZP_WORD:6 8.25
(word) init::xp#1 xp zp ZP_WORD:5 7.333333333333333
(word) init::xp#2 xp zp ZP_WORD:5 8.25
(void()) loop()
(label) loop::@1
(label) loop::@2
@ -152,16 +152,15 @@
(label) loop::@5
(label) loop::@6
(byte) loop::sin_idx
(byte) loop::sin_idx#0 sin_idx zp ZP_BYTE:3 4.0
(byte) loop::sin_idx#1 sin_idx zp ZP_BYTE:3 3.142857142857143
(byte) loop::sin_idx#6 sin_idx zp ZP_BYTE:3 3.8888888888888893
(byte) loop::sin_idx#6 sin_idx zp ZP_BYTE:3 3.666666666666667
(byte) loop::sy
(byte) loop::sy#1 reg byte y 151.5
(byte) loop::sy#2 reg byte y 101.0
(byte) loop::y_idx
(byte) loop::y_idx#0 y_idx zp ZP_BYTE:4 22.0
(byte) loop::y_idx#1 y_idx zp ZP_BYTE:4 67.33333333333333
(byte) loop::y_idx#2 y_idx zp ZP_BYTE:4 157.0
(byte) loop::y_idx#1 reg byte x 67.33333333333333
(byte) loop::y_idx#2 reg byte x 157.0
(byte~) loop::y_idx#4 reg byte x 22.0
(void()) main()
(label) main::@1
(label) main::@return
@ -180,7 +179,7 @@
(byte~) plexShowSprite::$3 reg byte a 4.0
(byte~) plexShowSprite::$4 reg byte a 4.0
(byte/signed word/word/dword/signed dword~) plexShowSprite::$6 reg byte x 4.0
(byte/word/dword~) plexShowSprite::$7 $7 zp ZP_BYTE:8 1.0833333333333333
(byte/word/dword~) plexShowSprite::$7 $7 zp ZP_BYTE:7 1.0833333333333333
(label) plexShowSprite::@1
(label) plexShowSprite::@2
(label) plexShowSprite::@3
@ -193,11 +192,11 @@
(byte/signed word/word/dword/signed dword~) plexShowSprite::plexFreeAdd1_$1
(byte/signed word/word/dword/signed dword) plexShowSprite::plexFreeAdd1_$1#0 reg byte x 4.0
(byte/word/dword~) plexShowSprite::plexFreeAdd1_$2
(byte/word/dword) plexShowSprite::plexFreeAdd1_$2#0 plexFreeAdd1_$2 zp ZP_BYTE:10 1.0434782608695652
(byte/word/dword) plexShowSprite::plexFreeAdd1_$2#0 plexFreeAdd1_$2 zp ZP_BYTE:9 1.0434782608695652
(byte) plexShowSprite::plexFreeAdd1_ypos
(byte) plexShowSprite::plexFreeAdd1_ypos#0 reg byte a 3.0
(byte) plexShowSprite::plex_sprite_idx2
(byte) plexShowSprite::plex_sprite_idx2#0 plex_sprite_idx2 zp ZP_BYTE:5 0.6000000000000001
(byte) plexShowSprite::plex_sprite_idx2#0 plex_sprite_idx2 zp ZP_BYTE:15 0.6000000000000001
(byte) plexShowSprite::xpos_idx
(byte) plexShowSprite::xpos_idx#0 reg byte x 2.0
(byte) plexShowSprite::ypos
@ -211,12 +210,12 @@
(label) plexSort::@7
(label) plexSort::@return
(byte) plexSort::m
(byte) plexSort::m#1 m zp ZP_BYTE:5 151.5
(byte) plexSort::m#2 m zp ZP_BYTE:5 42.08333333333333
(byte) plexSort::m#1 m zp ZP_BYTE:4 151.5
(byte) plexSort::m#2 m zp ZP_BYTE:4 42.08333333333333
(byte) plexSort::nxt_idx
(byte) plexSort::nxt_idx#0 nxt_idx zp ZP_BYTE:12 30.299999999999997
(byte) plexSort::nxt_idx#0 nxt_idx zp ZP_BYTE:11 30.299999999999997
(byte) plexSort::nxt_y
(byte) plexSort::nxt_y#0 nxt_y zp ZP_BYTE:13 150.375
(byte) plexSort::nxt_y#0 nxt_y zp ZP_BYTE:12 150.375
(label) plexSort::plexFreePrepare1
(bool~) plexSort::plexFreePrepare1_$0
(label) plexSort::plexFreePrepare1_@1
@ -230,11 +229,11 @@
(byte) plexSort::s#3 reg byte x 2052.5
(byte~) plexSort::s#6 reg byte x 202.0
(byte) plex_free_next
(byte) plex_free_next#0 plex_free_next zp ZP_BYTE:15 20.0
(byte) plex_free_next#27 plex_free_next#27 zp ZP_BYTE:10 2.8333333333333335
(byte) plex_free_next#31 plex_free_next#31 zp ZP_BYTE:10 4.0
(byte) plex_free_next#0 plex_free_next zp ZP_BYTE:14 20.0
(byte) plex_free_next#27 plex_free_next#27 zp ZP_BYTE:9 2.8333333333333335
(byte) plex_free_next#31 plex_free_next#31 zp ZP_BYTE:9 4.0
interrupt(KERNEL_MIN)(void()) plex_irq()
(byte/signed word/word/dword/signed dword~) plex_irq::$4 $4 zp ZP_BYTE:5 11.0
(byte/signed word/word/dword/signed dword~) plex_irq::$4 $4 zp ZP_BYTE:15 11.0
(label) plex_irq::@1
(label) plex_irq::@2
(label) plex_irq::@3
@ -248,44 +247,45 @@ interrupt(KERNEL_MIN)(void()) plex_irq()
(byte) plex_irq::plexFreeNextYpos1_return#0 reg byte x 4.0
(byte) plex_irq::rasterY
(byte) plex_show_idx
(byte) plex_show_idx#0 plex_show_idx zp ZP_BYTE:9 4.0
(byte) plex_show_idx#1 plex_show_idx zp ZP_BYTE:9 20.0
(byte) plex_show_idx#16 plex_show_idx zp ZP_BYTE:9 2.1666666666666665
(byte) plex_show_idx#27 plex_show_idx zp ZP_BYTE:9 1.1052631578947367
(byte) plex_show_idx#0 plex_show_idx zp ZP_BYTE:8 4.0
(byte) plex_show_idx#1 plex_show_idx zp ZP_BYTE:8 20.0
(byte) plex_show_idx#16 plex_show_idx zp ZP_BYTE:8 2.1666666666666665
(byte) plex_show_idx#27 plex_show_idx zp ZP_BYTE:8 1.1052631578947367
(byte) plex_sprite_idx
(byte) plex_sprite_idx#0 plex_sprite_idx zp ZP_BYTE:8 4.0
(byte) plex_sprite_idx#1 plex_sprite_idx#1 zp ZP_BYTE:14 20.0
(byte) plex_sprite_idx#25 plex_sprite_idx zp ZP_BYTE:8 1.1176470588235294
(byte) plex_sprite_idx#0 plex_sprite_idx zp ZP_BYTE:7 4.0
(byte) plex_sprite_idx#1 plex_sprite_idx#1 zp ZP_BYTE:13 20.0
(byte) plex_sprite_idx#25 plex_sprite_idx zp ZP_BYTE:7 1.1176470588235294
(byte) plex_sprite_msb
(byte) plex_sprite_msb#0 plex_sprite_msb zp ZP_BYTE:11 4.0
(byte) plex_sprite_msb#1 plex_sprite_msb zp ZP_BYTE:11 20.0
(byte) plex_sprite_msb#17 plex_sprite_msb zp ZP_BYTE:11 2.142857142857143
(byte) plex_sprite_msb#27 plex_sprite_msb zp ZP_BYTE:11 3.0
(byte) plex_sprite_msb#29 plex_sprite_msb zp ZP_BYTE:11 0.95
(byte) plex_sprite_msb#4 plex_sprite_msb zp ZP_BYTE:11 4.0
(byte) plex_sprite_msb#0 plex_sprite_msb zp ZP_BYTE:10 4.0
(byte) plex_sprite_msb#1 plex_sprite_msb zp ZP_BYTE:10 20.0
(byte) plex_sprite_msb#17 plex_sprite_msb zp ZP_BYTE:10 2.142857142857143
(byte) plex_sprite_msb#27 plex_sprite_msb zp ZP_BYTE:10 3.0
(byte) plex_sprite_msb#29 plex_sprite_msb zp ZP_BYTE:10 0.95
(byte) plex_sprite_msb#4 plex_sprite_msb zp ZP_BYTE:10 4.0
zp ZP_BOOL:2 [ framedone#12 framedone#19 framedone#5 framedone#3 ]
zp ZP_BYTE:3 [ loop::sin_idx#6 loop::sin_idx#0 loop::sin_idx#1 ]
zp ZP_BYTE:4 [ loop::y_idx#2 loop::y_idx#1 loop::y_idx#0 ]
zp ZP_BYTE:3 [ loop::sin_idx#6 loop::sin_idx#1 ]
reg byte x [ loop::y_idx#2 loop::y_idx#1 loop::y_idx#4 ]
reg byte y [ loop::sy#2 loop::sy#1 ]
zp ZP_BYTE:5 [ plexSort::m#2 plexSort::m#1 plex_irq::$4 plexShowSprite::plex_sprite_idx2#0 ]
zp ZP_BYTE:4 [ plexSort::m#2 plexSort::m#1 ]
reg byte x [ plexSort::s#3 plexSort::s#1 plexSort::s#6 ]
reg byte x [ plexSort::plexFreePrepare1_s#2 plexSort::plexFreePrepare1_s#1 ]
reg byte x [ init::sx#2 init::sx#1 ]
zp ZP_WORD:6 [ init::xp#2 init::xp#1 ]
zp ZP_WORD:5 [ init::xp#2 init::xp#1 ]
reg byte x [ init::ss#2 init::ss#1 ]
reg byte x [ plexInit::i#2 plexInit::i#1 ]
zp ZP_BYTE:8 [ plex_sprite_idx#25 plex_sprite_idx#0 plexShowSprite::$7 ]
zp ZP_BYTE:9 [ plex_show_idx#27 plex_show_idx#0 plex_show_idx#16 plex_show_idx#1 ]
zp ZP_BYTE:10 [ plex_free_next#27 plex_free_next#31 plexShowSprite::plexFreeAdd1_$2#0 ]
zp ZP_BYTE:11 [ plex_sprite_msb#29 plex_sprite_msb#0 plex_sprite_msb#17 plex_sprite_msb#27 plex_sprite_msb#4 plex_sprite_msb#1 ]
zp ZP_BYTE:12 [ plexSort::nxt_idx#0 ]
zp ZP_BYTE:13 [ plexSort::nxt_y#0 ]
zp ZP_BYTE:7 [ plex_sprite_idx#25 plex_sprite_idx#0 plexShowSprite::$7 ]
zp ZP_BYTE:8 [ plex_show_idx#27 plex_show_idx#0 plex_show_idx#16 plex_show_idx#1 ]
zp ZP_BYTE:9 [ plex_free_next#27 plex_free_next#31 plexShowSprite::plexFreeAdd1_$2#0 ]
zp ZP_BYTE:10 [ plex_sprite_msb#29 plex_sprite_msb#0 plex_sprite_msb#17 plex_sprite_msb#27 plex_sprite_msb#4 plex_sprite_msb#1 ]
zp ZP_BYTE:11 [ plexSort::nxt_idx#0 ]
zp ZP_BYTE:12 [ plexSort::nxt_y#0 ]
reg byte x [ plexSort::s#2 ]
zp ZP_BYTE:14 [ plex_sprite_idx#1 ]
zp ZP_BYTE:15 [ plex_free_next#0 ]
zp ZP_BYTE:13 [ plex_sprite_idx#1 ]
zp ZP_BYTE:14 [ plex_free_next#0 ]
reg byte a [ init::$7 ]
reg byte x [ plex_irq::plexFreeNextYpos1_return#0 ]
zp ZP_BYTE:15 [ plex_irq::$4 plexShowSprite::plex_sprite_idx2#0 ]
reg byte a [ plexShowSprite::plexFreeAdd1_ypos#0 ]
reg byte a [ plexShowSprite::plexFreeAdd1_$0#0 ]
reg byte x [ plexShowSprite::plexFreeAdd1_$1#0 ]