@@ -14,6 +14,10 @@ import System.Random
1414import Text.Parsec
1515import Text.Printf
1616
17+ import ChipiChapa.CPU.Flow
18+ import ChipiChapa.CPU.Input
19+ import ChipiChapa.CPU.Math
20+ import ChipiChapa.CPU.Regs
1721import ChipiChapa.Parser
1822import ChipiChapa.Types
1923
@@ -68,112 +72,22 @@ update = do
6872 when (bs V. ! pc) $ halted .= AtBreakpoint
6973 getOpcode
7074 >>= trace
71- <&> (fromE . parse parseOpcode " " . showHex')
75+ <&> (fromE . parse opcode " " . showHex')
7276 >>= trace'
7377 >>= (\ a -> pointer += 2 >> pure a)
7478 >>= \ case
7579 None -> pure ()
80+ Flow f -> execFlow f
81+ Regs r -> execRegs r
82+ Math m -> execMath m
83+ Input i -> execInput i
7684 DispClear -> display .= V. replicate 64 0
77- Goto nnn -> pointer .= nnn
78- Return -> do
79- use (stack . singular _head) >>= assign pointer
80- stack %= drop 1
81- Call nnn -> do
82- ptr <- use pointer
83- stack %= (ptr : )
84- pointer .= nnn
85- SkipIfEq x nn -> do
86- cur <- use $ registers @ x
87- when (cur == nn) $ pointer += 2
88- SkipIfREq x y -> do
89- vx <- use $ registers @ x
90- vy <- use $ registers @ y
91- when (vx == vy) $ pointer += 2
92- SkipIfNotEq x nn -> do
93- cur <- use $ registers @ x
94- when (cur /= nn) $ pointer += 2
95- SkipIfRNotEq x y -> do
96- vx <- use $ registers @ x
97- vy <- use $ registers @ y
98- when (vx /= vy) $ pointer += 2
99- RegSet x nn -> (registers @ x) .= nn
100- CAdd x nn -> (registers @ x) += nn
101- Move x y -> use (registers @ y) >>= assign (registers @ x)
102- BOr x y ->
103- use (registers @ y)
104- >>= (\ vx vy -> vx %= (.|.) vy) (registers @ x)
105- BAnd x y ->
106- use (registers @ y)
107- >>= (\ vx vy -> vx %= (.&.) vy) (registers @ x)
108- BXor x y ->
109- use (registers @ y)
110- >>= (\ vx vy -> vx %= xor vy) (registers @ x)
111- Add x y -> do
112- ! vx <- use $ registers @ x
113- ! vy <- use $ registers @ y
114- registers @ x += vy
115- if fromIntegral @ _ @ Int vx + fromIntegral vy > 255
116- then (registers @ 15 ) .= 1
117- else (registers @ 15 ) .= 0
118- Sub x y -> do
119- ! vx <- use $ registers @ x
120- ! vy <- use $ registers @ y
121- registers @ x -= vy
122- if vx >= vy
123- then registers @ 15 .= 1
124- else registers @ 15 .= 0
125- SubFrom x y -> do
126- ! vx <- use $ registers @ x
127- ! vy <- use $ registers @ y
128- registers @ x .= vy - vx
129- if vy >= vx
130- then registers @ 15 .= 1
131- else registers @ 15 .= 0
132- RShift x -> do
133- registers @ x %= (`shiftR` 1 )
134- vx <- use (registers @ x)
135- registers @ 15 .= fromIntegral (vx .&. 1 )
136- LShift x -> do
137- registers @ x %= (`shiftL` 1 )
138- vx <- use (registers @ x)
139- registers @ 15 .= fromIntegral (vx .&. bit 8 )
140- SetI nnn -> iReg .= nnn
141- JmpV0Plus nnn -> do
142- v0 <- fromIntegral <$> use (registers @ 0 )
143- pointer .= v0 + nnn
14485 RandomAnd x nn -> do
14586 rnd <- liftIO $ randomRIO (0 , 255 )
14687 registers @ x .= rnd .&. nn
14788 GetDelay x -> use dt >>= assign (registers @ x) . fromIntegral
14889 SetDelay x -> use (registers @ x) >>= assign dt . fromIntegral
14990 SetSound x -> use (registers @ x) >>= assign st . fromIntegral
150- SkipIfNotPressed x -> do
151- ! vx <- use $ registers @ x
152- isUp <- liftIO $ isKeyUp $ key vx
153- when isUp $ pointer += 2
154- SkipIfPressed x -> do
155- ! vx <- use $ registers @ x
156- isDown <- liftIO $ isKeyDown $ key vx
157- when isDown $ pointer += 2
158- WaitForKey x -> halted .= Waiting x
159- AddI x -> use (registers @ x) >>= (iReg += ) . fromIntegral
160- StoreBCD x -> do
161- vx <- use $ registers @ x
162-
163- i <- use iReg
164- memory @ (i + 2 ) .= vx `mod` 10
165- memory @ (i + 1 ) .= vx `div` 10
166- memory @ i .= vx `div` 100
167- DumpRegs x -> do
168- i <- use iReg
169- forM_ [0 .. x] $ \ l -> do
170- r <- use $ registers @ l
171- memory @ (i + l) .= r
172- LoadRegs x -> do
173- i <- use iReg
174- forM_ [0 .. x] $ \ l -> do
175- r <- use $ memory @ (i + l)
176- registers @ l .= r
17791 FontSprite x -> do
17892 vx <- use $ registers @ x
17993 iReg .= fromIntegral vx * 5
0 commit comments