packages feed

unmed2-0.0: src/BlockCmdPageTable.hs

module BlockCmdPageTable where

import Amiga

import qualified CmdPageData
import CmdPageData(CmdPageData)

data BlockCmdPageTable = BlockCmdPageTable
  { num_pages :: UWORD
  , reserved  :: UWORD
  , pages     :: [ Maybe [ [ CmdPageData ] ] ]
  }
  deriving (Show)

peek :: UWORD -> UWORD -> MEM -> PTR -> IO BlockCmdPageTable
peek tracks numlines m p = do
  num_pages' <- peekUWORD m p
  reserved'  <- peekUWORD m (p+2)
  pages''    <- mapM (peekPTR m) $ pointerRangeGen (p+4) 4 num_pages'
  pages'     <- mapM (peekPage tracks numlines m) pages''
  return $ BlockCmdPageTable
    num_pages' reserved' pages'

peekPage :: UWORD -> UWORD -> MEM -> PTR -> IO (Maybe [ [ CmdPageData ] ])
peekPage tracks numlines m p =
  skipIf (p == 0) $ fmap (chunk tracks) $
    mapM (CmdPageData.peek m) $ pointerRangeGen2 p 2 tracks numlines