module Sound.MED.Raw.BlockInfo where

import qualified Sound.MED.Raw.BlockCmdPageTable as BlockCmdPageTable
import Sound.MED.Raw.BlockCmdPageTable(BlockCmdPageTable)

import Sound.MED.Basic.Amiga
import Sound.MED.Basic.Utility

data BlockInfo = BlockInfo
  { BlockInfo -> Maybe [ULONG]
hlmask       :: Maybe [ ULONG ]
  , BlockInfo -> Maybe [UBYTE]
blockname    :: Maybe [ UBYTE ]
  , BlockInfo -> ULONG
blocknamelen :: ULONG
  , BlockInfo -> Maybe BlockCmdPageTable
pagetable    :: Maybe BlockCmdPageTable
  , BlockInfo -> [ULONG]
reserved     :: [ ULONG ]
  }
  deriving (Int -> BlockInfo -> ShowS
[BlockInfo] -> ShowS
BlockInfo -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [BlockInfo] -> ShowS
$cshowList :: [BlockInfo] -> ShowS
show :: BlockInfo -> String
$cshow :: BlockInfo -> String
showsPrec :: Int -> BlockInfo -> ShowS
$cshowsPrec :: Int -> BlockInfo -> ShowS
Show)

{-# SPECIALISE peek :: UWORD -> UWORD -> PTR -> StorableReader BlockInfo #-}
{-# SPECIALISE peek :: UWORD -> UWORD -> PTR -> ByteStringReader BlockInfo #-}
peek :: (Reader m) => UWORD -> UWORD -> PTR -> m BlockInfo
peek :: forall (m :: * -> *).
Reader m =>
UWORD -> UWORD -> ULONG -> m BlockInfo
peek UWORD
tracks UWORD
numlines ULONG
p = do
  let hlmasklen :: UWORD
hlmasklen = (UWORD
numlines forall a. Num a => a -> a -> a
+ UWORD
31) forall a. Integral a => a -> a -> a
`div` UWORD
32
  ULONG
hlmask'''     <- forall (m :: * -> *). Reader m => Peek m ULONG
peekPTR ULONG
p
  Maybe [ULONG]
hlmask'       <-
    forall (m :: * -> *) a. Monad m => Bool -> m a -> m (Maybe a)
skipIf (ULONG
hlmask''' forall a. Eq a => a -> a -> Bool
== ULONG
0) forall a b. (a -> b) -> a -> b
$
    forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM forall (m :: * -> *). Reader m => Peek m ULONG
peekULONG forall a b. (a -> b) -> a -> b
$ forall i. Integral i => ULONG -> ULONG -> i -> [ULONG]
pointerRangeGen ULONG
hlmask''' ULONG
4 UWORD
hlmasklen
  ULONG
blocknamelen' <- forall (m :: * -> *). Reader m => Peek m ULONG
peekULONG (ULONG
pforall a. Num a => a -> a -> a
+ULONG
8)
  ULONG
blockname'''  <- forall (m :: * -> *). Reader m => Peek m ULONG
peekPTR (ULONG
pforall a. Num a => a -> a -> a
+ULONG
4)
  Maybe [UBYTE]
blockname'    <-
    forall (m :: * -> *) a. Monad m => Bool -> m a -> m (Maybe a)
skipIf (ULONG
blockname''' forall a. Eq a => a -> a -> Bool
== ULONG
0) forall a b. (a -> b) -> a -> b
$
    forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM forall (m :: * -> *). Reader m => Peek m UBYTE
peekUBYTE forall a b. (a -> b) -> a -> b
$ forall i. Integral i => ULONG -> ULONG -> i -> [ULONG]
pointerRangeGen ULONG
blockname''' ULONG
1 ULONG
blocknamelen'
  ULONG
pagetable'''  <- forall (m :: * -> *). Reader m => Peek m ULONG
peekPTR (ULONG
pforall a. Num a => a -> a -> a
+ULONG
12)
  Maybe BlockCmdPageTable
pagetable'    <- forall (m :: * -> *).
Reader m =>
UWORD -> UWORD -> ULONG -> m BlockCmdPageTable
BlockCmdPageTable.peek UWORD
tracks UWORD
numlines forall (m :: * -> *) a.
Monad m =>
(ULONG -> m a) -> ULONG -> m (Maybe a)
$? ULONG
pagetable'''
  [ULONG]
reserved'     <- forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM forall (m :: * -> *). Reader m => Peek m ULONG
peekULONG forall a b. (a -> b) -> a -> b
$ ULONG -> ULONG -> Int -> [ULONG]
pointerRange (ULONG
pforall a. Num a => a -> a -> a
+ULONG
16) ULONG
4 Int
5
  forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ Maybe [ULONG]
-> Maybe [UBYTE]
-> ULONG
-> Maybe BlockCmdPageTable
-> [ULONG]
-> BlockInfo
BlockInfo
    Maybe [ULONG]
hlmask' Maybe [UBYTE]
blockname' ULONG
blocknamelen' Maybe BlockCmdPageTable
pagetable' [ULONG]
reserved'