HARM-0.1.2: Arm/Register.hs
----------------------------------------------------------------------
-- FILE: Register.hs
-- DATE: 1/6/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.Register
where
----------------------------------------------------------------------
-- Standard libraries.
----------------------------------------------------------------------
-- import IOExts
import Data.Bits
import Data.Word
import Data.Array.IO
----------------------------------------------------------------------
-- Local libraries.
----------------------------------------------------------------------
import Arm.RegisterName
----------------------------------------------------------------------
-- This is the register set type.
----------------------------------------------------------------------
type Registers
= IOArray RegisterName Word32
----------------------------------------------------------------------
-- Create a new set of empty registers.
----------------------------------------------------------------------
emptyRegs
:: IO Registers
emptyRegs
= newArray (R0, CPSR) 0
----------------------------------------------------------------------
-- Get the value in a register.
----------------------------------------------------------------------
getReg
:: Registers
-> RegisterName
-> IO Word32
getReg regs regName
= readArray regs regName
----------------------------------------------------------------------
-- Set a register with a new value.
----------------------------------------------------------------------
setReg
:: Registers
-> RegisterName
-> Word32
-> IO ()
setReg regs regName regVal
= writeArray regs regName regVal
----------------------------------------------------------------------
-- CPSR functions.
----------------------------------------------------------------------
showCPSRFlags regs
= do n <- cpsrGetN regs
z <- cpsrGetZ regs
c <- cpsrGetC regs
v <- cpsrGetV regs
putStr ("N=" ++ show n ++ " Z=" ++ show z ++ " C=" ++ show c ++ " V=" ++ show v)
cpsrGetN = cpsrGet 31
cpsrSetN = cpsrSet 31
cpsrGetZ = cpsrGet 30
cpsrSetZ = cpsrSet 30
cpsrGetC = cpsrGet 29
cpsrSetC = cpsrSet 29
cpsrGetV = cpsrGet 28
cpsrSetV = cpsrSet 28
cpsrGet
:: Int
-> Registers
-> IO Word32
cpsrGet bit regs
= do cpsr <- getReg regs CPSR
if cpsr `testBit` bit
then return 1
else return 0
cpsrSet
:: Int
-> Registers
-> IO ()
cpsrSet bit regs
= do cpsr <- getReg regs CPSR
let cpsr' = cpsr `setBit` bit
setReg regs CPSR cpsr'
----------------------------------------------------------------------
-- eof
----------------------------------------------------------------------