module Nes.PPU.Pointers (
    PPUPointers (paletteTable, vram, oamData),
    newPPUPointers,
) where

import Nes.Memory
import Nes.Memory.Internal
import Nes.PPU.Constants

data PPUPointers = MkPPUPtr
    { PPUPointers -> MemoryPointer
paletteTable :: {-# UNPACK #-} !MemoryPointer
    , PPUPointers -> MemoryPointer
vram :: {-# UNPACK #-} !MemoryPointer
    , PPUPointers -> MemoryPointer
oamData :: {-# UNPACK #-} !MemoryPointer
    }

newPPUPointers :: IO PPUPointers
newPPUPointers :: IO PPUPointers
newPPUPointers = do
    MemoryPointer
paletteTable <- Int -> IO MemoryPointer
callocForeignPtr Int
paletteTableSize
    MemoryPointer
vram <- Int -> IO MemoryPointer
callocForeignPtr Int
vramSize
    MemoryPointer
oamData <- Int -> IO MemoryPointer
callocForeignPtr Int
oamDataSize
    PPUPointers -> IO PPUPointers
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return MkPPUPtr{MemoryPointer
paletteTable :: MemoryPointer
vram :: MemoryPointer
oamData :: MemoryPointer
paletteTable :: MemoryPointer
vram :: MemoryPointer
oamData :: MemoryPointer
..}