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