HARM-0.1.2: Arm/Memory.hs
----------------------------------------------------------------------
-- FILE: Memory.hs
-- DATE: 02/17/2001
-- PROJECT: HARM (was VARM (Virtual ARM)), for CSE240 Spring 2001
-- LANGUAGE PLATFORM: HUGS
-- OS PLATFORM: RedHat Linux 6.2
-- AUTHOR: Jeffrey A. Meunier
-- EMAIL: jeffm@cse.uconn.edu
-- MAINTAINER: Alex Mason
-- EMAIL: axman6@gmail.com
----------------------------------------------------------------------
module Arm.Memory
where
----------------------------------------------------------------------
-- Standard libraries.
----------------------------------------------------------------------
-- import IOExts
import Data.Array.IO
import Data.Word
----------------------------------------------------------------------
-- Local libraries.
----------------------------------------------------------------------
----------------------------------------------------------------------
-- Memory is an array of Word32 indexed by an Address.
----------------------------------------------------------------------
type Memory
= IOArray Address Word32
type Address
= Word32
type WordAddress
= Address
type ByteAddress
= Address
----------------------------------------------------------------------
-- Create a new memory array.
----------------------------------------------------------------------
emptyMem
:: Address
-> IO Memory
emptyMem size
= newArray (0, size-1) 0
-- = listArray (0, size-1) (repeat 0)
----------------------------------------------------------------------
-- Return the word_32 address of a byte address.
-- This can be read as ``the word address of the nth byte in memory''.
----------------------------------------------------------------------
wordAddress
:: ByteAddress
-> WordAddress
wordAddress addr
= addr `div` 4
----------------------------------------------------------------------
-- Get the value at a memory location.
----------------------------------------------------------------------
getMemWord
:: Memory
-> WordAddress
-> IO Word32
getMemWord mem addr
= readArray mem addr
-- = mem ! addr
----------------------------------------------------------------------
-- Set the value at a memory location.
----------------------------------------------------------------------
setMemWord
:: Memory
-> WordAddress
-> Word32
-> IO ()
setMemWord mem addr val
= writeArray mem addr val
-- = mem // [(addr, val)]
----------------------------------------------------------------------
-- Read memory. The byte address of the memory location is given.
----------------------------------------------------------------------
readMem
:: Memory
-> Address
-> IO Word32
readMem mem byteAddr
= getMemWord mem (wordAddress byteAddr)
----------------------------------------------------------------------
-- Write memory. The byte address of the memory location is given.
----------------------------------------------------------------------
writeMem
:: Memory
-> Address
-> Word32
-> IO ()
writeMem mem byteAddr val
= setMemWord mem (wordAddress byteAddr) val
----------------------------------------------------------------------
-- eof
----------------------------------------------------------------------