module Language.MIXAL.AST where

newtype MIXChar = MIXChar Char
    deriving (Eq, Show)

data MIXALStmt
    = Orig (Maybe DefinedSymbol) WValue
    | Equ (Maybe DefinedSymbol) WValue
    | Con (Maybe DefinedSymbol) WValue
    | Alf (Maybe DefinedSymbol) (MIXChar, MIXChar, MIXChar, MIXChar, MIXChar)
    | Inst (Maybe DefinedSymbol) OpCode (Maybe Address) (Maybe Index) (Maybe Field)
    | End (Maybe DefinedSymbol) WValue
      deriving (Eq, Show)

data Address = AddrExpr Expr
             | AddrRef SymbolRef
             | AddrLiteral WValue
             | LitConst WValue
               deriving (Eq, Show)

data DefinedSymbol = DefNormal Symbol
                   | DefLocal Integer
                     deriving (Eq, Show)

data SymbolRef = RefNormal Symbol
               | RefBackward Integer
               | RefForward Integer
                 deriving (Eq, Show)

data WValue = WValue Expr (Maybe Field) [(Expr, Maybe Field)]
              deriving (Eq, Show)

newtype Index = Index Integer
    deriving (Eq, Show)

data Field = FieldExpr Expr
    deriving (Eq, Show)

data AtomicExpr = Num Integer
                | Sym Symbol
                | Asterisk
                  deriving (Eq, Show)

data Expr = AtExpr AtomicExpr
          | Signed Bool AtomicExpr
          | BinOp Expr BinOp Expr [(BinOp, Expr)]
            deriving (Eq, Show)

data BinOp = Add
           | Subtract
           | Multiply
           | Divide
           | Frac
           | Field
             deriving (Eq, Show, Read)

data OpCode
    = LDA | LDX | LD1 | LD2 | LD3 | LD4 | LD5 | LD6
    | LDAN | LDXN | LD1N | LD2N | LD3N | LD4N | LD5N | LD6N
    | STA | STX | ST1 | ST2 | ST3 | ST4 | ST5 | ST6 | STJ | STZ
    | ADD | SUB | MUL | DIV
    | ENTA | ENTX | ENT1 | ENT2 | ENT3 | ENT4 | ENT5 | ENT6
    | ENNA | ENNX | ENN1 | ENN2 | ENN3 | ENN4 | ENN5 | ENN6
    | INCA | INCX | INC1 | INC2 | INC3 | INC4 | INC5 | INC6
    | DECA | DECX | DEC1 | DEC2 | DEC3 | DEC4 | DEC5 | DEC6
    | CMPA | CMPX | CMP1 | CMP2 | CMP3 | CMP4 | CMP5 | CMP6
    | JMP | JSJ | JOV | JNOV | JL | JE | JG | JGE | JNE | JLE
    | JAN | JAZ | JAP | JANN | JANZ | JANP
    | JXN | JXZ | JXP | JXNN | JXNZ | JXNP
    | J1N | J1Z | J1P | J1NN | J1NZ | J1NP
    | J2N | J2Z | J2P | J2NN | J2NZ | J2NP
    | J3N | J3Z | J3P | J3NN | J3NZ | J3NP
    | J4N | J4Z | J4P | J4NN | J4NZ | J4NP
    | J5N | J5Z | J5P | J5NN | J5NZ | J5NP
    | J6N | J6Z | J6P | J6NN | J6NZ | J6NP
    | IN | OUT | IOC | JRED | JBUS
    | NUM | CHAR
    | SLA | SRA | SLAX | SRAX | SLC | SRC
    | MOVE | NOP | HLT
      deriving (Eq, Show, Read)

newtype Symbol = Symbol String
    deriving (Eq, Show)