Trying to wrap my head around scrolling
[ScratchNES.git] / src / PPU / PPU.tosh
index d7d7f9f..d1bce91 100644 (file)
@@ -15,7 +15,7 @@ end
 set evaluation n to 1
 set evaluation slot to 1
 repeat 64
-       if <evaluation slot < 32> and <N > item evaluation n of OAM> and <item evaluation n of OAM + 8 > N> then
+       if <evaluation slot < 32> and <not N < item evaluation n of OAM> 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
@@ -37,20 +37,33 @@ end
 ; "TODO: buggy sprite overflow flag"
 
 define get pattern tile: (tile) scanline: (scanline)
-get bit mask (join "0x" ((item (16 * tile + scanline) of CHR-ROM)))
+get bit mask (join "0x" ((item (16 * tile + scanline+1) of CHR-ROM)))
 set lower mask to mask
-get bit mask (join "0x" ((item (16 * tile + scanline+8) of CHR-ROM)))
+get bit mask (join "0x" ((item (16 * tile + scanline+9) of CHR-ROM)))
+
+define-atomic compute background pixel
+; "Fetch it from CHR and decode, not unlike sprites"
+; "Only a bit different indexing"
+set tmp to BG: Nametable*160000
 
 define-atomic compute pixel
-if item mX+1 of evaluation line = -1 then
-       ; "Background pixel. TODO nametables"
-       set tmp to 0
+; "Perform BACKGROUND tasks"
+if mX mod 8 = 0 then
+       show variable PPU high address
+       show variable PPU low address
+       show variable BG: Nametable
+       set PPU high address to 32 + (PPU base nametable address*4) +  floor of (_)
+       set PPU low address to (mX / 8) + ((mY mod 7) * 32)
+       read PPU memory
+       set BG: Nametable to M
+end
+if item mX of evaluation line = -1 then
+       compute background pixel
 else
        ; "A sprite! That I can do! Fetch it from CHR and decode"
-       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))
-       set offset to mX - item (item mX+1 of evaluation line + 3) of secondary OAM
-       change offset by 1
-       set tmp to (2 * letter offset of lower mask) + letter offset of mask
+       get pattern tile:  item ((item mX of evaluation line))+1 of secondary OAM scanline:  (mY - (item (item mX of evaluation line) of secondary OAM))
+       set offset to mX - item (item mX of evaluation line + 3) of secondary OAM
+       set tmp to (2 * letter offset+1 of lower mask) + letter offset+1 of mask
        if tmp > 1 then
                if tmp = 2 then
                        set tmp to "0xFF0000"
@@ -67,6 +80,8 @@ else
 end
 
 define emulate frame
+set PPU high address to "0x20"
+set PPU low address to 0
 go to x: -128 y: 128
 set mY to -1
 ; "show variable mX"
@@ -114,6 +129,10 @@ delete all of OAM
 repeat 256
        add "0" to OAM
 end
+delete all of Nametables
+repeat 2048
+       add "0" to Nametables
+end
 hide
 
 define read PPU register (N)
@@ -217,6 +236,15 @@ else
        end
 end
 
+define incremement VRAM address
+change PPU low address by 1
+if PPU low address > 255 then
+       set PPU low address to 0
+       change PPU high address by 1
+       show variable PPU high address
+       show variable PPU low address
+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
@@ -234,4 +262,4 @@ else
                        end
                end
        end
-end
+end
\ No newline at end of file
This page took 0.027943 seconds and 4 git commands to generate.