module Sound.MED.Raw.MMDARexxTrigCmd where

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

data MMDARexxTrigCmd = MMDARexxTrigCmd
  { MMDARexxTrigCmd -> Maybe MMDARexxTrigCmd
next     :: Maybe MMDARexxTrigCmd
  , MMDARexxTrigCmd -> UBYTE
cmdnum   :: UBYTE
  , MMDARexxTrigCmd -> UBYTE
pad      :: UBYTE
  , MMDARexxTrigCmd -> WORD
cmdtype  :: WORD
  , MMDARexxTrigCmd -> [UBYTE]
cmd      :: [ UBYTE ]
  , MMDARexxTrigCmd -> [UBYTE]
port     :: [ UBYTE ]
  , MMDARexxTrigCmd -> UWORD
cmd_len  :: UWORD
  , MMDARexxTrigCmd -> UWORD
port_len :: UWORD
  }
  deriving (Int -> MMDARexxTrigCmd -> ShowS
[MMDARexxTrigCmd] -> ShowS
MMDARexxTrigCmd -> String
(Int -> MMDARexxTrigCmd -> ShowS)
-> (MMDARexxTrigCmd -> String)
-> ([MMDARexxTrigCmd] -> ShowS)
-> Show MMDARexxTrigCmd
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MMDARexxTrigCmd] -> ShowS
$cshowList :: [MMDARexxTrigCmd] -> ShowS
show :: MMDARexxTrigCmd -> String
$cshow :: MMDARexxTrigCmd -> String
showsPrec :: Int -> MMDARexxTrigCmd -> ShowS
$cshowsPrec :: Int -> MMDARexxTrigCmd -> ShowS
Show)

{-# SPECIALISE peek :: PTR -> StorableReader MMDARexxTrigCmd #-}
{-# SPECIALISE peek :: PTR -> ByteStringReader MMDARexxTrigCmd #-}
peek :: (Reader m) => PTR -> m MMDARexxTrigCmd
peek :: PTR -> m MMDARexxTrigCmd
peek PTR
p = do
  PTR
next'''    <- Peek m PTR
forall (m :: * -> *). Reader m => Peek m PTR
peekPTR PTR
p
  Maybe MMDARexxTrigCmd
next'      <- PTR -> m MMDARexxTrigCmd
forall (m :: * -> *). Reader m => PTR -> m MMDARexxTrigCmd
peek (PTR -> m MMDARexxTrigCmd) -> PTR -> m (Maybe MMDARexxTrigCmd)
forall (m :: * -> *) a.
Monad m =>
(PTR -> m a) -> PTR -> m (Maybe a)
$? PTR
next'''
  UBYTE
cmdnum'    <- Peek m UBYTE
forall (m :: * -> *). Reader m => Peek m UBYTE
peekUBYTE (PTR
pPTR -> PTR -> PTR
forall a. Num a => a -> a -> a
+PTR
4)
  UBYTE
pad'       <- Peek m UBYTE
forall (m :: * -> *). Reader m => Peek m UBYTE
peekUBYTE (PTR
pPTR -> PTR -> PTR
forall a. Num a => a -> a -> a
+PTR
5)
  WORD
cmdtype'   <- Peek m WORD
forall (m :: * -> *). Reader m => Peek m WORD
peekWORD  (PTR
pPTR -> PTR -> PTR
forall a. Num a => a -> a -> a
+PTR
6)
  PTR
cmd''      <- Peek m PTR
forall (m :: * -> *). Reader m => Peek m PTR
peekPTR   (PTR
pPTR -> PTR -> PTR
forall a. Num a => a -> a -> a
+PTR
8)
  PTR
port''     <- Peek m PTR
forall (m :: * -> *). Reader m => Peek m PTR
peekPTR   (PTR
pPTR -> PTR -> PTR
forall a. Num a => a -> a -> a
+PTR
12)
  UWORD
cmd_len'   <- Peek m UWORD
forall (m :: * -> *). Reader m => Peek m UWORD
peekUWORD (PTR
pPTR -> PTR -> PTR
forall a. Num a => a -> a -> a
+PTR
16)
  UWORD
port_len'  <- Peek m UWORD
forall (m :: * -> *). Reader m => Peek m UWORD
peekUWORD (PTR
pPTR -> PTR -> PTR
forall a. Num a => a -> a -> a
+PTR
18)
  [UBYTE]
cmd'       <- Peek m UBYTE -> [PTR] -> m [UBYTE]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM Peek m UBYTE
forall (m :: * -> *). Reader m => Peek m UBYTE
peekUBYTE ([PTR] -> m [UBYTE]) -> [PTR] -> m [UBYTE]
forall a b. (a -> b) -> a -> b
$ PTR -> PTR -> UWORD -> [PTR]
forall i. Integral i => PTR -> PTR -> i -> [PTR]
pointerRangeGenCheck PTR
cmd'' PTR
1 (UWORD
cmd_len'UWORD -> UWORD -> UWORD
forall a. Num a => a -> a -> a
+UWORD
1)
  [UBYTE]
port'      <- Peek m UBYTE -> [PTR] -> m [UBYTE]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM Peek m UBYTE
forall (m :: * -> *). Reader m => Peek m UBYTE
peekUBYTE ([PTR] -> m [UBYTE]) -> [PTR] -> m [UBYTE]
forall a b. (a -> b) -> a -> b
$ PTR -> PTR -> UWORD -> [PTR]
forall i. Integral i => PTR -> PTR -> i -> [PTR]
pointerRangeGenCheck PTR
port'' PTR
1 (UWORD
port_len'UWORD -> UWORD -> UWORD
forall a. Num a => a -> a -> a
+UWORD
1)
  MMDARexxTrigCmd -> m MMDARexxTrigCmd
forall (m :: * -> *) a. Monad m => a -> m a
return (MMDARexxTrigCmd -> m MMDARexxTrigCmd)
-> MMDARexxTrigCmd -> m MMDARexxTrigCmd
forall a b. (a -> b) -> a -> b
$ Maybe MMDARexxTrigCmd
-> UBYTE
-> UBYTE
-> WORD
-> [UBYTE]
-> [UBYTE]
-> UWORD
-> UWORD
-> MMDARexxTrigCmd
MMDARexxTrigCmd
    Maybe MMDARexxTrigCmd
next' UBYTE
cmdnum' UBYTE
pad' WORD
cmdtype' [UBYTE]
cmd' [UBYTE]
port' UWORD
cmd_len' UWORD
port_len'