----------------------------------------------------------------------
-- 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
----------------------------------------------------------------------