PPU registers emulation
authorAlyssa Rosenzweig <alyssa@backtick.town>
Tue, 28 Jun 2016 19:07:41 +0000 (12:07 -0700)
committerAlyssa Rosenzweig <alyssa@backtick.town>
Tue, 28 Jun 2016 19:07:41 +0000 (12:07 -0700)
src/PPU/NTSCBox.tosh

index 70ebc41..8771c27 100644 (file)
@@ -3,6 +3,7 @@
 ; "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
@@ -21,60 +22,40 @@ end
 set evaluation n to 1
 set evaluation slot to 1
 repeat 64
-       if evaluation slot < 32 then
-               if item evaluation n of OAM > N and item evaluation n of OAM - 8 < N then
-                       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
+       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 I to 1
 set Y to -1
 pen down
 repeat 224
-       delete all of scanline
        change Y by 1
        evaluate sprites scanline:  (Y)
-       set X to 0
-       set flag to 0
-       repeat 240
-               set color to <not item X of evaluation line = -1> * 16000000
-               add color to scanline
-               change X by 1
-               change flag by <item I of view = color>
-               change I by 1
-       end
-       if not flag = 240 then
-               set x to -128
-               change I by -240
-               set X to 1
-               repeat 120
-                       set color to item X of scanline
-                       set color2 to item (X + 1) of scanline
-                       replace item I of view with color
-                       replace item I + 1 of view with color2
-                       change I by 2
-                       change X by 2
-                       set pen color to ((color + color2) * 0.5)
-                       change x by 2
-               end
+       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.5)
+               change x by 4
        end
        change y by -1
 end
@@ -84,35 +65,121 @@ when flag clicked
 initialize framebuffer
 initialize OAM
 hide
-reset timer
+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
-       replace item 1 of OAM with floor of (64 + 48 * sin of (20 * count))
-       replace item 4 of OAM with floor of (84 + 64 * cos of (10 * count))
-       replace item 5 of OAM with floor of (87 + 16 * sin of (10 * count))
-       replace item 8 of OAM with floor of (91 + 80 * cos of (20 * count))
-       replace item 9 of OAM with floor of (170 + 32 * sin of (15 * count))
-       replace item 12 of OAM with floor of (90 + 90 * cos of (20 * count))
-       replace item 13 of OAM with floor of (120 + 32 * sin of (30 * count))
-       replace item 1+16 of OAM with floor of (64 + 48 * sin of (20 * count))
-       replace item 4+16 of OAM with floor of (84 + 64 * cos of (10 * count)) + 8
-       replace item 5+16 of OAM with floor of (87 + 16 * sin of (10 * count))
-       replace item 8+16 of OAM with floor of (91 + 80 * cos of (20 * count)) + 8
-       replace item 9+16 of OAM with floor of (170 + 32 * sin of (15 * count)) 
-       replace item 12+16 of OAM with floor of (90 + 90 * cos of (20 * count)) + 8
-       replace item 13+16 of OAM with floor of (120 + 32 * sin of (30 * count))
-       replace item 16+16 of OAM with floor of (91 + 80 * sin of (10 * count)) + 8
+       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 timer / count
+       set q to times / count
 end
 
-define initialize framebuffer
-delete all of view
-repeat 240 * 224
-       add "-1" to view
+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 mapper read (addr)
+; "stub"
+
+define read PPU memory
+; "stub"
+
+define write PPU memory (V)
+; "stub"
+
+define initialize framebuffer
 pen up
 clear
 set pen size to 1
This page took 0.032629 seconds and 4 git commands to generate.