Adjacent pixel optimization yields like 2x performance :D
authorAlyssa Rosenzweig <alyssa@backtick.town>
Mon, 4 Jul 2016 17:24:27 +0000 (10:24 -0700)
committerAlyssa Rosenzweig <alyssa@backtick.town>
Mon, 4 Jul 2016 17:24:27 +0000 (10:24 -0700)
src/CPU/common.tosh
src/PPU/PPU.tosh

index c32490d..6a6f4de 100644 (file)
@@ -80,8 +80,16 @@ when p key pressed
 step CPU
 
 when f key pressed
+emulate frame
+emulate frame
+emulate frame
+emulate frame
+set line to 0
+show variable opcode
+reset timer
 forever
         emulate frame
+        set opcode to line / timer
 end
 
 define-atomic step CPU
index b691b97..3cf02e2 100644 (file)
@@ -52,17 +52,21 @@ delete all of oCHR
 set temp to 1
 repeat length of CHR-ROM
        set BG: Plane 0 to item (1 + (join "0x" (item temp of CHR-ROM))) of bitmask
-       set BG: Plane 1 to item (1 + (join "0x" (item (temp+8) of CHR-ROM))) of bitmask
-       set BG: Plane 0 to join "1" (BG: Plane 0)
-       set BG: Plane 1 to join "1" (BG: Plane 1)
-       add (BG: Plane 0) + (BG: Plane 1*2) to oCHR
+       set BG: Plane 1 to item (1 + (join "0x" (item (temp + 8) of CHR-ROM))) of bitmask
+       set BG: Plane 0 to (join "1" (BG: Plane 0))
+       set BG: Plane 1 to (join "1" (BG: Plane 1))
+       add BG: Plane 0 + BG: Plane 1 * 2 to oCHR
        change temp by 1
 end
 
+when q key pressed
+emulate frame
+
 define-atomic emulate frame
-clear
 go to x: -128 y: 128
 set mY to -1
+set adjacent count to 0
+set adjacent color to -1
 repeat 224
        change mY by 1
        evaluate sprites scanline:  (mY)
@@ -75,35 +79,47 @@ repeat 224
                        repeat cycles
                                if mX mod 8 = 0 then
                                        read PPU memory @ (8192 + mX / 8 + 32 * floor of (mY / 8))
-                                       set offset to 16 * M + PPU Background pattern table + mY mod 8 
+                                       set offset to 16 * M + PPU Background pattern table + mY mod 8
                                        set BG: Plane 0 to item (offset + 1) of oCHR
                                        read PPU memory @ (9152 + floor of (mX / 16) + 16 * floor of (mY / 16))
                                        set offset to 2 * <mX mod 16 > 7> + 4 * <mY mod 16 > 7>
                                        set BG: Palette to 8 * letter (offset + 1) of item (1 + M) of bitmask + 4 * letter (offset + 2) of item (1 + M) of bitmask + 1
                                end
-                               if item mX+1 of evaluation line < 1 then
-                                       set pen color to (item (BG: Palette + letter 2+mX mod 8 of BG: Plane 0) of Palette)
+                               if item (mX + 1) of evaluation line < 1 then
+                                       set color to item (BG: Palette + letter (2 + mX mod 8) of BG: Plane 0) of Palette
                                else
-                                       get pattern tile:  (item (item mX+1 of evaluation line + 1) of secondary OAM) scanline:  (mY - item item mX+1 of evaluation line of secondary OAM) table:  (PPU Sprite pattern table)
-                                       set offset to mX - item (item mX+1 of evaluation line + 3) of secondary OAM
-                                       set tmp to letter (offset + 2) of mask
+                                       get pattern tile:  (item (item (mX + 1) of evaluation line + 1) of secondary OAM) scanline:  (mY - item item (mX + 1) of evaluation line of secondary OAM) table:  (PPU Sprite pattern table)
+                                       set offset to mX - item (item (mX + 1) of evaluation line + 3) of secondary OAM
+                                       set tmp to letter (offset + 3) of mask
                                        if tmp = 0 then
-                                                set pen color to (item (BG: Palette + letter 2+mX mod 8 of BG: Plane 0) of Palette)
+                                               set color to item (BG: Palette + letter (2 + mX mod 8) of BG: Plane 0) of Palette
                                        else
-                                               set pen color to (item (17 + tmp) of Palette)
+                                               set color to item (17 + tmp) of Palette
                                        end
                                end
                                change mX by 1
-                               change x by 1
+                               if adjacent color = color then
+                                       change adjacent count by 1
+                               else
+                                       set pen color to (adjacent color)
+                                       change x by adjacent count
+                                       set adjacent count to 1
+                                       set adjacent color to color
+                               end
                        end
                else
                        change mX by 3 * cycles
                end
                set cycles to 0
        end
+       if adjacent count > 0 then
+               set pen color to (adjacent color)
+               change x by adjacent count
+               set adjacent count to 0
+       end
        pen up
 end
-set PPU vblank?111 to 1
+set PPU vblank?1112 to 1
 if PPU generate NMI = 1 then
        interrupt: vector "0xFFFA"
 end
@@ -121,7 +137,10 @@ repeat 256
        add "0" to OAM
 end
 delete all of Nametables
-repeat 2048
+repeat 960
+       add "36" to Nametables
+end
+repeat 2048 - 960
        add "0" to Nametables
 end
 delete all of Palette
@@ -132,9 +151,9 @@ hide
 
 define-atomic read PPU register (N)
 if N = 2 then
-       set M to 128 * PPU vblank?111 + 64 * PPU sprite 0?111 + 32 * PPU sprite overflow?111
+       set M to 128 * PPU vblank?1112 + 64 * PPU sprite 0?1112 + 32 * PPU sprite overflow?1112
        set PPU address latch to 0
-       set PPU vblank?111 to 0
+       set PPU vblank?1112 to 0
 else
        if N = 7 then
                read PPU memory
@@ -263,4 +282,4 @@ else
                        end
                end
        end
-end
+end
\ No newline at end of file
This page took 0.036296 seconds and 4 git commands to generate.