Proper PPU
authorAlyssa Rosenzweig <alyssa@backtick.town>
Wed, 29 Jun 2016 23:19:28 +0000 (16:19 -0700)
committerAlyssa Rosenzweig <alyssa@backtick.town>
Wed, 29 Jun 2016 23:19:28 +0000 (16:19 -0700)
src/PPU/NTSCBox.tosh [deleted file]
src/PPU/PPU.tosh [new file with mode: 0644]
src/tools/rip.js

diff --git a/src/PPU/NTSCBox.tosh b/src/PPU/NTSCBox.tosh
deleted file mode 100644 (file)
index f636d52..0000000
+++ /dev/null
@@ -1,236 +0,0 @@
-; "240x224 framebuffer"
-; "Uses smart double buffering with a poking rendering method"
-; "Designed for use with ScratchNES"
-
-define-atomic evaluate pixel x: (mX) y: (mY)
-set color to <not item mX of evaluation line = -1> * 16000000
-
-define-atomic evaluate sprites scanline: (N)
-delete all of secondary OAM
-delete all of evaluation line
-repeat 32
-       add "255" to secondary OAM
-       add "-1" to evaluation line
-       add "-1" to evaluation line
-       add "-1" to evaluation line
-       add "-1" to evaluation line
-       add "-1" to evaluation line
-       add "-1" to evaluation line
-       add "-1" to evaluation line
-       add "-1" to evaluation line
-end
-set evaluation n to 1
-set evaluation slot to 1
-repeat 64
-       if evaluation slot < 32 and item evaluation n of OAM > N and item evaluation n of OAM - 8 < N then
-               replace item evaluation slot of secondary OAM with item evaluation n of OAM
-               replace item evaluation slot + 1 of secondary OAM with item (evaluation n + 1) of OAM
-               replace item evaluation slot + 2 of secondary OAM with item (evaluation n + 2) of OAM
-               set temp to item (evaluation n + 3) of OAM
-               replace item evaluation slot + 3 of secondary OAM with temp
-               change evaluation slot by 4
-               replace item temp of evaluation line with evaluation n
-               replace item temp + 1 of evaluation line with evaluation n
-               replace item temp + 2 of evaluation line with evaluation n
-               replace item temp + 3 of evaluation line with evaluation n
-               replace item temp + 4 of evaluation line with evaluation n
-               replace item temp + 5 of evaluation line with evaluation n
-               replace item temp + 6 of evaluation line with evaluation n
-               replace item temp + 7 of evaluation line with evaluation n
-       end
-       change evaluation n by 4
-end
-; "TODO: evaluate sprites in secondary OAM"
-; "TODO: buggy sprite overflow flag"
-
-define-atomic fast phosphorus paint
-go to x: -128 y: 128
-set Y to -1
-pen down
-repeat 224
-       change Y by 1
-       evaluate sprites scanline:  (Y)
-       set x to -128
-       set X to 1
-       repeat 60
-               change X by 4
-               set pen color to ((<not item X of evaluation line = -1> * 16000000 + <not item (X + 1) of evaluation line = -1> * 16000000 + <not item (X + 2) of evaluation line = -1> * 16000000 + <not item (X + 3) of evaluation line = -1> * 16000000) * 0.25)
-               change x by 4
-       end
-       change y by -1
-end
-pen up
-
-when flag clicked
-initialize framebuffer
-initialize OAM
-clear log
-hide
-write PPU register 0 value: 0
-show variable M
-set temp to 1
-repeat 64
-       replace item temp of OAM with pick random 1 to 255
-       replace item temp + 3 of OAM with pick random 1 to 255
-       change temp by 4
-end
-set count to 0
-set times to 0
-show variable q
-forever
-       set temp to 1
-       repeat 64
-               replace item temp of OAM with (item temp of OAM + pick random -2 to 4) mod 255
-               replace item temp + 3 of OAM with (item (temp + 3) of OAM + pick random -2 to 4) mod 255
-               change temp by 4
-       end
-       reset timer
-       fast phosphorus paint
-       change times by timer
-       change count by 1
-       set q to times / count
-end
-
-define read PPU register (N)
-if N = 2 then
-       set M to 128 * PPU vblank? + 64 * PPU sprite 0? + 32 * PPU sprite overflow?
-       set PPU address latch to 0
-       set PPU vblank? to 0
-else
-       if N = 7 then
-               read PPU memory
-       end
-end
-
-define get bit mask (N)
-set temp to N
-set mask to ""
-repeat 8
-       set mask to (join (<temp mod 2 = 1> * 1) (mask))
-       set temp to (temp - temp mod 2) * 0.5
-end
-
-; "TODO: use O(logN) lookup instead of O(N)"
-
-define write PPU register (N) value: (V)
-log join "Writing " join (V) join " to register " (N)
-if N = 0 then
-       get bit mask (V)
-       set PPU base nametable address to 2 * letter 7 of mask + letter 8 of mask
-       set PPU VRAM increment to letter 6 of mask * 31 + 1
-       set PPU Sprite pattern table to letter 5 of mask * 4096
-       set PPU Background pattern table to letter 4 of mask * 4096
-       set PPU Sprite size to letter 3 of mask
-       set PPU master slave select to letter 2 of mask
-       set PPU generate NMI to letter 1 of mask
-else
-       if N = 1 then
-               get bit mask (V)
-               set PPU grayscale to letter 8 of mask
-               set PPU show left8 bg to letter 7 of mask
-               set PPU show left8 sprites to letter 6 of mask
-               set PPU show bg to letter 5 of mask
-               set PPU show sprites to letter 4 of mask
-               set PPU emphasize blue to letter 3 of mask
-               set PPU emphasize green to letter 2 of mask
-               set PPU emphasize red to letter 1 of mask
-       else
-               if N = 3 then
-                       set PPU OAMADDR to V
-               else
-                       if N = 4 then
-                               replace item PPU OAMADDR mod 256 + 1 of OAM with V
-                               change PPU OAMADDR by 1
-                       else
-                               if N = 5 then
-                                       if PPU address latch = 0 then
-                                               set PPU fine x scroll to V
-                                       else
-                                               set PPU fine y scroll to V
-                                       end
-                               else
-                                       if N = 6 then
-                                               if PPU address latch = 0 then
-                                                       set PPU high address to V
-                                               else
-                                                       set PPU low address to V
-                                               end
-                                       else
-                                               if N = 7 then
-                                                       write PPU memory (V)
-                                               end
-                                       end
-                               end
-                       end
-               end
-       end
-end
-
-define OAM DMA (pagebase)
-set temp to 1
-repeat 256
-       mapper read (pagebase + temp)
-       replace item temp of OAM with M
-       change temp by 1
-end
-
-define mapper read (addr)
-; "stub"
-
-define read PPU memory
-if PPU high address < 32 then
-       set M to item (1 + PPU high address * 256 + PPU low address) of Pattern tables
-else
-       if PPU high address < 48 then
-               set M to item ((PPU high address * 256) + PPU low address - 8191) of Nametables
-       else
-               if PPU high address < 63 then
-                       set M to item ((PPU high address * 256) + PPU low address - 12287) of Nametables
-               else
-                       if PPU high address < 64 then
-                               set M to item (PPU low address mod 32) + 1 of Palette
-                       else
-                               ; "TODO: PPU memory mirroring"
-                       end
-               end
-       end
-end
-
-define write PPU memory (V)
-if PPU high address < 32 then
-       replace item (1 + PPU high address * 256 + PPU low address) of Pattern tables with V
-else
-       if PPU high address < 48 then
-               replace item ((PPU high address * 256) + PPU low address - 8191) of Nametables with V
-       else
-               if PPU high address < 63 then
-                       replace item ((PPU high address * 256) + PPU low address - 12287) of Nametables with V
-               else
-                       if PPU high address < 64 then
-                               replace item (PPU low address mod 32) + 1 of Palette with V
-                       else
-                               ; "TODO: PPU memory mirroring"
-                       end
-               end
-       end
-end
-
-define initialize framebuffer
-pen up
-clear
-set pen size to 1
-
-define initialize OAM
-delete all of OAM
-repeat 256
-       add "0" to OAM
-end
-
-define ; [comment]
-
-define clear log
-set log to ""
-show variable log
-
-define log [comment]
-set log to join (log) (join "n" (comment))
\ No newline at end of file
diff --git a/src/PPU/PPU.tosh b/src/PPU/PPU.tosh
new file mode 100644 (file)
index 0000000..44a2fa0
--- /dev/null
@@ -0,0 +1,185 @@
+define-atomic evaluate sprites scanline: (N)
+delete all of secondary OAM
+delete all of evaluation line
+repeat 32
+       add "255" to secondary OAM
+       add "-1" to evaluation line
+       add "-1" to evaluation line
+       add "-1" to evaluation line
+       add "-1" to evaluation line
+       add "-1" to evaluation line
+       add "-1" to evaluation line
+       add "-1" to evaluation line
+       add "-1" to evaluation line
+end
+set evaluation n to 1
+set evaluation slot to 1
+repeat 64
+       if evaluation slot < 32 and item evaluation n of OAM > N and item evaluation n of OAM - 8 < N then
+               replace item evaluation slot of secondary OAM with item evaluation n of OAM
+               replace item evaluation slot + 1 of secondary OAM with item (evaluation n + 1) of OAM
+               replace item evaluation slot + 2 of secondary OAM with item (evaluation n + 2) of OAM
+               set temp to item (evaluation n + 3) of OAM
+               replace item evaluation slot + 3 of secondary OAM with temp
+               change evaluation slot by 4
+               replace item temp of evaluation line with evaluation n
+               replace item temp + 1 of evaluation line with evaluation n
+               replace item temp + 2 of evaluation line with evaluation n
+               replace item temp + 3 of evaluation line with evaluation n
+               replace item temp + 4 of evaluation line with evaluation n
+               replace item temp + 5 of evaluation line with evaluation n
+               replace item temp + 6 of evaluation line with evaluation n
+               replace item temp + 7 of evaluation line with evaluation n
+       end
+       change evaluation n by 4
+end
+; "TODO: evaluate sprites in secondary OAM"
+; "TODO: buggy sprite overflow flag"
+
+define-atomic fast phosphorus paint
+go to x: -128 y: 128
+set Y to -1
+pen down
+repeat 224
+       change Y by 1
+       evaluate sprites scanline:  (Y)
+       set x to -128
+       set X to 1
+       repeat 60
+               change X by 4
+               set pen color to ((<not item X of evaluation line = -1> * 16000000 + <not item (X + 1) of evaluation line = -1> * 16000000 + <not item (X + 2) of evaluation line = -1> * 16000000 + <not item (X + 3) of evaluation line = -1> * 16000000) * 0.25)
+               change x by 4
+       end
+       change y by -1
+end
+pen up
+
+define initialize PPU
+pen up
+clear
+set pen size to 1
+delete all of OAM
+repeat 256
+       add "0" to OAM
+end
+hide
+
+define read PPU register (N)
+if N = 2 then
+       set M to 128 * PPU vblank? + 64 * PPU sprite 0? + 32 * PPU sprite overflow?
+       set PPU address latch to 0
+       set PPU vblank? to 0
+else
+       if N = 7 then
+               read PPU memory
+       end
+end
+
+define get bit mask (N)
+set temp to N
+set mask to ""
+repeat 8
+       set mask to (join (<temp mod 2 = 1> * 1) (mask))
+       set temp to (temp - temp mod 2) * 0.5
+end
+
+; "TODO: use O(logN) lookup instead of O(N)"
+
+define write PPU register (N) value: (V)
+if N = 0 then
+       get bit mask (V)
+       set PPU base nametable address to 2 * letter 7 of mask + letter 8 of mask
+       set PPU VRAM increment to letter 6 of mask * 31 + 1
+       set PPU Sprite pattern table to letter 5 of mask * 4096
+       set PPU Background pattern table to letter 4 of mask * 4096
+       set PPU Sprite size to letter 3 of mask
+       set PPU master slave select to letter 2 of mask
+       set PPU generate NMI to letter 1 of mask
+else
+       if N = 1 then
+               get bit mask (V)
+               set PPU grayscale to letter 8 of mask
+               set PPU show left8 bg to letter 7 of mask
+               set PPU show left8 sprites to letter 6 of mask
+               set PPU show bg to letter 5 of mask
+               set PPU show sprites to letter 4 of mask
+               set PPU emphasize blue to letter 3 of mask
+               set PPU emphasize green to letter 2 of mask
+               set PPU emphasize red to letter 1 of mask
+       else
+               if N = 3 then
+                       set PPU OAMADDR to V
+               else
+                       if N = 4 then
+                               replace item PPU OAMADDR mod 256 + 1 of OAM with V
+                               change PPU OAMADDR by 1
+                       else
+                               if N = 5 then
+                                       if PPU address latch = 0 then
+                                               set PPU fine x scroll to V
+                                       else
+                                               set PPU fine y scroll to V
+                                       end
+                               else
+                                       if N = 6 then
+                                               if PPU address latch = 0 then
+                                                       set PPU high address to V
+                                               else
+                                                       set PPU low address to V
+                                               end
+                                       else
+                                               if N = 7 then
+                                                       write PPU memory (V)
+                                               end
+                                       end
+                               end
+                       end
+               end
+       end
+end
+
+define OAM DMA (pagebase)
+set temp to 1
+repeat 256
+       mapper read (pagebase + temp)
+       replace item temp of OAM with M
+       change temp by 1
+end
+
+define read PPU memory
+if PPU high address < 32 then
+       set M to item (1 + PPU high address * 256 + PPU low address) of Pattern tables
+else
+       if PPU high address < 48 then
+               set M to item ((PPU high address * 256) + PPU low address - 8191) of Nametables
+       else
+               if PPU high address < 63 then
+                       set M to item ((PPU high address * 256) + PPU low address - 12287) of Nametables
+               else
+                       if PPU high address < 64 then
+                               set M to item (PPU low address mod 32) + 1 of Palette
+                       else
+                               ; "TODO: PPU memory mirroring"
+                       end
+               end
+       end
+end
+
+define write PPU memory (V)
+if PPU high address < 32 then
+       replace item (1 + PPU high address * 256 + PPU low address) of Pattern tables with V
+else
+       if PPU high address < 48 then
+               replace item ((PPU high address * 256) + PPU low address - 8191) of Nametables with V
+       else
+               if PPU high address < 63 then
+                       replace item ((PPU high address * 256) + PPU low address - 12287) of Nametables with V
+               else
+                       if PPU high address < 64 then
+                               replace item (PPU low address mod 32) + 1 of Palette with V
+                       else
+                               ; "TODO: PPU memory mirroring"
+                       end
+               end
+       end
+end
index ab26ac6..4080811 100644 (file)
@@ -5,5 +5,5 @@
 var fs = require("fs");
 var name = process.argv[2].split(".").slice(0, -1).join(".");
 var game = fs.readFileSync(process.argv[2]);
-var PRGROM = game.slice(16, 16 + 32768);
+var PRGROM = game.slice(16, 16 + 16384);
 fs.writeFileSync(name + ".hex", PRGROM);
This page took 0.041876 seconds and 4 git commands to generate.