-- | This module defines the structure of a TI-85 backup file.
-- A backup file contains system memory (data section 1), user
-- memory (section 2), and a variable table that maps where
-- user variables are located in data section 2.
module Data.TI85.File.Backup where

import Data.ByteString (ByteString)
import Data.Text (Text)
import Data.Word (Word8,Word16)

import Data.TI85.File.Variable (VarType)

-- | An entry in the variable table.
-- Note: the variable table is stored in
-- reverse byte order (including 2-byte
-- words!).
data VarTableEntry = VarTableEntry {
    VarTableEntry -> Word8
entryId :: Word8,
    VarTableEntry -> Word16
entryAddr :: Word16,
    VarTableEntry -> Word8
entryNameLen :: Word8,
    VarTableEntry -> ByteString
entryName :: ByteString
    } deriving Int -> VarTableEntry -> ShowS
[VarTableEntry] -> ShowS
VarTableEntry -> String
(Int -> VarTableEntry -> ShowS)
-> (VarTableEntry -> String)
-> ([VarTableEntry] -> ShowS)
-> Show VarTableEntry
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> VarTableEntry -> ShowS
showsPrec :: Int -> VarTableEntry -> ShowS
$cshow :: VarTableEntry -> String
show :: VarTableEntry -> String
$cshowList :: [VarTableEntry] -> ShowS
showList :: [VarTableEntry] -> ShowS
Show

-- | A list of variable table entries
type VarTable = [VarTableEntry]

-- | Backup-specific header. This header comes after
-- the more general `Data.TI85.File.TIHeader`.
data TIBackupHeader = TIBackupHeader {
    TIBackupHeader -> Word16
hdrDataLenOffset :: Word16, -- Always 9
    TIBackupHeader -> Word16
hdrData1Len :: Word16,
    TIBackupHeader -> Word8
hdrTypeID :: Word8, -- Always 0x1D
    TIBackupHeader -> Word16
hdrData2Len :: Word16,
    TIBackupHeader -> Word16
hdrData3Len :: Word16,
    TIBackupHeader -> Word16
hdrData2Addr :: Word16
    } deriving Int -> TIBackupHeader -> ShowS
[TIBackupHeader] -> ShowS
TIBackupHeader -> String
(Int -> TIBackupHeader -> ShowS)
-> (TIBackupHeader -> String)
-> ([TIBackupHeader] -> ShowS)
-> Show TIBackupHeader
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TIBackupHeader -> ShowS
showsPrec :: Int -> TIBackupHeader -> ShowS
$cshow :: TIBackupHeader -> String
show :: TIBackupHeader -> String
$cshowList :: [TIBackupHeader] -> ShowS
showList :: [TIBackupHeader] -> ShowS
Show

-- | The top-level structure of a backup
-- file.
data TIBackupData = TIBackupData {
    TIBackupData -> TIBackupHeader
backupHeader :: TIBackupHeader,
    TIBackupData -> Word16
data1Len :: Word16,
    TIBackupData -> ByteString
data1 :: ByteString,
    TIBackupData -> Word16
data2Len :: Word16,
    TIBackupData -> ByteString
data2 :: ByteString,
    TIBackupData -> Word16
varTableLen :: Word16,
    TIBackupData -> [VarTableEntry]
varTable :: VarTable
    } deriving Int -> TIBackupData -> ShowS
[TIBackupData] -> ShowS
TIBackupData -> String
(Int -> TIBackupData -> ShowS)
-> (TIBackupData -> String)
-> ([TIBackupData] -> ShowS)
-> Show TIBackupData
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TIBackupData -> ShowS
showsPrec :: Int -> TIBackupData -> ShowS
$cshow :: TIBackupData -> String
show :: TIBackupData -> String
$cshowList :: [TIBackupData] -> ShowS
showList :: [TIBackupData] -> ShowS
Show