From 04b384a6c013f11549189b14981042c42435ba18 Mon Sep 17 00:00:00 2001 From: Aearnus Date: Thu, 31 May 2018 00:27:57 -0700 Subject: [PATCH] Added typed --- src/DSL/SixtyFiveOhTwo/Types.hs | 47 +++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 src/DSL/SixtyFiveOhTwo/Types.hs diff --git a/src/DSL/SixtyFiveOhTwo/Types.hs b/src/DSL/SixtyFiveOhTwo/Types.hs new file mode 100644 index 0000000..1cd1e09 --- /dev/null +++ b/src/DSL/SixtyFiveOhTwo/Types.hs @@ -0,0 +1,47 @@ +{-# LANGUAGE TypeFamilies, TypeOperators, GADTs, DataKinds, KindSignatures, PolyKinds #-} + +module DSL.SixtyFiveOhTwo.Types where + +import Data.Word +import Data.Int +import Data.Bits + +-- Remember, it's little endian +data AddressingKind = + ImpliedKind | + AccumulatorKind | + ImmediateKind | + RelativeKind | + ZeroPageRelativeKind | + AbsoluteKind | + AbsoluteXKind | + AbsoluteYKind | + ZeroPageKind | + ZeroPageXKind | + ZeroPageYKind | + ZeroPageIndirectKind | + IndirectKind | + IndirectXKind | + IndirectYKind + +data AddressingMode (k :: AddressingKind) where + Implied :: AddressingMode 'ImpliedKind + Accumulator :: AddressingMode 'AccumulatorKind + Immediate :: Word8 -> AddressingMode 'ImmediateKind + Relative :: Int8 -> AddressingMode 'RelativeKind -- Signed + ZeroPageRelative :: Int8 -> AddressingMode 'ZeroPageKind -- Signed + Absolute :: Word16 -> AddressingMode 'AbsoluteKind + AbsoluteX :: Word16 -> AddressingMode 'AbsoluteXKind + AbsoluteY :: Word16 -> AddressingMode 'AbsoluteYKind + ZeroPage :: Word8 -> AddressingMode 'ZeroPageKind + ZeroPageX :: Word8 -> AddressingMode 'ZeroPageXKind + ZeroPageY :: Word8 -> AddressingMode 'ZeroPageYKind + ZeroPageIndirect :: Word8 -> AddressingMode 'ZeroPageIndirectKind + Indirect :: Word16 -> AddressingMode 'IndirectKind + IndirectX :: Word8 -> AddressingMode 'IndirectXKind + IndirectY :: Word8 -> AddressingMode 'IndirectYKind + +type family IsElem (e :: k) (es :: [k]) where + IsElem e '[] = 'False + IsElem e (e ': es) = 'True + IsElem e (x ': es) = IsElem e es