packages feed

ascii85x-0.2.4.1: src/Data/TI85/IO.hs

-- | Various utilities for printing file and
-- variable data.
module Data.TI85.IO where

import Prelude hiding (putStrLn)
import Control.Monad
import Data.ByteString (ByteString)
import qualified Data.ByteString as BS
import Data.Text (Text, intercalate, pack)
import Data.Text.Encoding (decodeLatin1)
import Data.Text.IO (putStrLn)
import Data.Word
import Numeric (showHex)

import Data.TI85.Encoding
import Data.TI85.File
import Data.TI85.Parsers
import Data.TI85.Var

-- | A backup file contains a variable table that lists
-- all user data, and indexes into the user memory area.
printVariableTable :: Word16 -> VarTable -> IO ()
printVariableTable baseAddr vars = do
    forM_ vars printEntry
  where
    printEntry (VarTableEntry idNum addr _ name) = do
        let idName = (showType.idToType) idNum
        let offset = addr - baseAddr 
        putStrLn $ "Name: " <> tiDecode name <> "\n" <>
            "Type: " <> idName <> "\n" <>
            "Addr: " <> pack (showHex addr "") <> " (offset " <> (pack.show) offset <> ")\n"

-- | User the variable table to lookup variable data
-- in user memory and display it.
extractVariableTable :: Word16 -> TIBackupData -> IO ()
extractVariableTable baseAddr tiBackup = do
    let table = varTable tiBackup
    let userData = data2 tiBackup
    let vars = readUserMem baseAddr table userData
    forM_ table $ \entry@(VarTableEntry idNum addr _nameLen name) -> do
        let var = readVarMem baseAddr entry userData
        putStrLn $ "\n" <> (showType . idToType ) idNum <> " \"" <> tiDecode name <> "\""
            <> " at 0x" <> hexify addr <> " (0x" <> hexify (addr-baseAddr) <> "):\n"
        printVariable var
  where
    hexify :: Word16 -> Text
    hexify w = pack (showHex w "")

-- | Print file metadata.
printFileSummary :: TIFile -> IO ()
printFileSummary tiFile =
    let hdr = tiHeader tiFile
        check = tiChecksum tiFile
        sig = decodeLatin1 $ hdrSig hdr
        comment = decodeLatin1 $ hdrComment hdr
        fileType = case tiData tiFile of
            BackupData _ -> "Backup"
            VariableData _ -> "Variable"
    in do
        putStrLn $
            "\nTI " <> fileType <> " File <" <> sig <> ">\n" <>
            "\"" <> comment <> "\"\n\n"
        case tiData tiFile of
            BackupData backupData -> printBackupSummary backupData
            VariableData variableData -> printVariableSummary variableData

-- | Print backup-specific top-level iniformation.
printBackupSummary :: TIBackupData -> IO ()
printBackupSummary tiBackup = do
    let backupHdr = backupHeader tiBackup
    let data2Addr = hdrData2Addr backupHdr
    putStrLn $ pack $ "Data Section 1 (" <> show (data1Len tiBackup) <> "):"
    putStrLn $ pack $ "Data Section 2 (" <> show (data2Len tiBackup) <> "):"
    putStrLn $ pack $ "Data 2 Address: " <> showHex data2Addr "\n"

-- | Print variable-specific metadata.
printVariableSummary :: TIVarData -> IO ()
printVariableSummary (TIVarData vars) =
    putStrLn $
        "Variables:\n" <>
        intercalate "\n" (map varSummary vars)
  where
    varSummary :: TIVar -> Text
    varSummary var =
        let varIdStr = (pack.show.fromEnum) (varId var)
            varIdType = (showType.idToType) (varId var)
        in  "\tName: " <> tiDecode (varName var) <> "\n" <>
            "\tType: " <> varIdType <> " (" <> varIdStr <> ")\n" <>
            "\tLength : " <> (pack.show.fromEnum) (varDataLen var) <> "\n"