module Ivory.HW.Reg where
import Numeric (showHex)
import Ivory.Language
import Ivory.HW.IOArea
import Ivory.HW.Prim
import Ivory.HW.Machine
data Reg t = Reg Integer
mkReg :: forall t. IvoryIOReg t => Integer -> Reg t
mkReg addr =
if (any (addrInBounds addr (ioRegSize (undefined :: t))) ioAreas)
then Reg addr
else error $ "I/O register out of bounds at address 0x" ++
(showHex addr "")
readReg :: IvoryIOReg a => Reg a -> Ivory eff a
readReg (Reg addr) = call ioRegRead (fromIntegral addr)
writeReg :: IvoryIOReg a => Reg a -> a -> Ivory eff ()
writeReg (Reg addr) val = call_ ioRegWrite (fromIntegral addr) val