never executed always true always false
1 module HelVM.HelMA.Automata.Piet.Combiner.ALU
2 ( -- | I/O Instructions
3 pietInChar
4 , pietInNumber
5 , pietOutChar
6 , pietOutNumber
7 -- | Stack & Arithmetic Instructions
8 , pietAdd
9 , pietDivide
10 , pietDuplicate
11 , pietGreater
12 , pietMod
13 , pietMultiply
14 , pietNot
15 , pietPop
16 , pietPush
17 , pietRoll
18 , pietSubtract
19 ) where
20
21 import HelVM.HelMA.Automata.Piet.Types.InstructionMemory
22 import HelVM.HelMA.Automata.Piet.Types.Memory
23
24 import HelVM.HelMA.Automaton.Combiner.ALU hiding ( Stack )
25 import HelVM.HelMA.Automaton.Eff.MonadEff
26 import HelVM.HelMA.Automaton.Instruction.Groups.SMInstruction
27
28 import Prelude hiding ( getLine )
29
30 -- | I/O Instructions
31 pietInNumber ∷ AppSafeEff m ⇒ Memory → m Memory
32 pietInNumber = modifyStack "in_number" inputDec
33
34 pietInChar ∷ AppSafeEff m ⇒ Memory → m Memory
35 pietInChar = modifyStack "in_char" inputChar
36
37 pietOutNumber ∷ AppSafeEff m ⇒ Memory → m Memory
38 pietOutNumber = modifyStack "out_number" outputDecMaybe
39
40 pietOutChar ∷ AppSafeEff m ⇒ Memory → m Memory
41 pietOutChar = modifyStack "out_char" outputCharMaybe
42
43 -- | Push / Pop
44 pietPush ∷ AppSafeEff m ⇒ Int → Memory → m Memory
45 pietPush n = modifyStack ("push " <> show n) (pure . push1 n)
46
47 pietPop ∷ (ALU m Stack Int) ⇒ Memory → m Memory
48 pietPop = modifyStack "pop" discard
49
50 -- | Binary & Unary Arithmetic Instructions
51 pietAdd ∷ (ALU m Stack Int) ⇒ Memory → m Memory
52 pietAdd = modifyStack "add" (binaryInstruction Add)
53
54 pietSubtract ∷ (ALU m Stack Int) ⇒ Memory → m Memory
55 pietSubtract = modifyStack "subtract" (binaryInstruction Sub)
56
57 pietMultiply ∷ (ALU m Stack Int) ⇒ Memory → m Memory
58 pietMultiply = modifyStack "multiply" (binaryInstruction Mul)
59
60 pietDivide ∷ (ALU m Stack Int) ⇒ Memory → m Memory
61 pietDivide = modifyStack "divide" (binaryInstruction Div)
62
63 pietMod ∷ (ALU m Stack Int) ⇒ Memory → m Memory
64 pietMod = modifyStack "mod" (binaryInstruction Mod)
65
66 pietNot ∷ (ALU m Stack Int) ⇒ Memory → m Memory
67 pietNot = modifyStack "not" lNot
68
69 pietGreater ∷ (ALU m Stack Int) ⇒ Memory → m Memory
70 pietGreater = modifyStack "greater" (binaryInstruction LGT)
71
72 -- | Stack Manipulation Instructions
73 pietDuplicate ∷ (ALU m Stack Int) ⇒ Memory → m Memory
74 pietDuplicate = modifyStack "duplicate" (copy 0)
75
76 pietRoll ∷ (ALU m Stack Int) ⇒ Memory → m Memory
77 pietRoll = modifyStack "roll" roll
78
79 -- | Utils
80 modifyStack ∷ AppSafeEff m ⇒ Text → (Stack → m Stack) → Memory → m Memory
81 modifyStack name f (Memory im s) = logWithPosition name im *> (Memory im <$> f s)