packages feed

unmed2-0.0: src/MMD0exp.hs

module MMD0exp where

import Amiga

import qualified InstrExt
import InstrExt(InstrExt)
import qualified MMDInstrInfo
import MMDInstrInfo(MMDInstrInfo)
import qualified NotationInfo
import NotationInfo(NotationInfo)
import qualified MMDDumpData
import MMDDumpData(MMDDumpData)
import qualified MMDInfo
import MMDInfo(MMDInfo)
import qualified MMDARexx
import MMDARexx(MMDARexx)
import qualified MMDMIDICmd3x
import MMDMIDICmd3x(MMDMIDICmd3x)

data MMD0exp = MMD0exp
  { nextmod       :: PTR -- FIXME
  , exp_smp       :: [ InstrExt ]
  , s_ext_entries :: UWORD
  , s_ext_entrsz  :: UWORD
  , annotxt       :: [ UBYTE ]
  , annolen       :: ULONG
  , iinfo         :: [ MMDInstrInfo ]
  , i_ext_entries :: UWORD
  , i_ext_entrsz  :: UWORD
  , jumpmask      :: ULONG
  , rgbtable      :: [ UWORD ]
  , channelsplit  :: [ UBYTE ]
  , n_info        :: Maybe NotationInfo
  , songname      :: [ UBYTE ]
  , songnamelen   :: ULONG
  , dumps         :: Maybe MMDDumpData
  , mmdinfo       :: Maybe MMDInfo
  , mmdrexx       :: Maybe MMDARexx
  , mmdcmd3x      :: Maybe MMDMIDICmd3x
  , reserved2     :: [ ULONG ]
  , tag_end       :: ULONG
  }
  deriving (Show)

peek :: MEM -> PTR -> IO MMD0exp
peek m p = do
  nextmod'       <- peekPTR   m (p+0)
  exp_smp''      <- peekPTR   m (p+4)
  s_ext_entries' <- peekUWORD m (p+8)
  s_ext_entrsz'  <- peekUWORD m (p+10)
  exp_smp'       <- mapM (InstrExt.peek s_ext_entrsz' m) $ pointerRangeGenCheck exp_smp'' (fromIntegral s_ext_entrsz') s_ext_entries'
  annotxt''      <- peekPTR   m (p+12)
  annolen'       <- peekULONG m (p+16)
  annotxt'       <- mapM (peekUBYTE m) $ pointerRangeGenCheck annotxt'' 1 annolen'
  iinfo''        <- peekPTR   m (p+20)
  i_ext_entries' <- peekUWORD m (p+24)
  i_ext_entrsz'  <- peekUWORD m (p+26)
  iinfo'         <- mapM (MMDInstrInfo.peek i_ext_entrsz' m) $ pointerRangeGenCheck iinfo'' (fromIntegral i_ext_entrsz') i_ext_entries'
  jumpmask'      <- peekULONG m (p+28)
  rgbtable''     <- peekPTR   m (p+32)
  rgbtable'      <- mapM (peekUWORD m) $ pointerRangeGenCheck rgbtable'' 2 (8::Int)
  channelsplit'  <- mapM (peekUBYTE m) $ pointerRange (p+36) 1 4
  n_info'''      <- peekPTR   m (p+40)
  n_info'        <- NotationInfo.peek m $? n_info'''
  songname''     <- peekPTR   m (p+44)
  songnamelen'   <- peekULONG m (p+48)
  songname'      <- mapM (peekUBYTE m) $ pointerRangeGenCheck songname'' 1 songnamelen'
  dumps'''       <- peekPTR   m (p+52)
  dumps'         <- MMDDumpData.peek m $? dumps'''
  mmdinfo'''     <- peekPTR   m (p+56)
  mmdinfo'       <- MMDInfo.peek m $? mmdinfo'''
  mmdrexx'''     <- peekPTR   m (p+60)
  mmdrexx'       <- MMDARexx.peek m $? mmdrexx'''
  mmdcmd3x'''    <- peekPTR   m (p+64)
  mmdcmd3x'      <- MMDMIDICmd3x.peek m $? mmdcmd3x'''
  reserved2'     <- mapM (peekULONG m) $ pointerRange (p+68) 4 3
  tag_end'       <- peekULONG m (p+80)
  return $ MMD0exp
    nextmod' exp_smp' i_ext_entries' s_ext_entrsz' annotxt' annolen'
    iinfo' i_ext_entries' i_ext_entrsz' jumpmask' rgbtable'
    channelsplit' n_info' songname' songnamelen' dumps' mmdinfo'
    mmdrexx' mmdcmd3x' reserved2' tag_end'