Created
April 29, 2018 02:16
-
-
Save nwtgck/b7fe10303afd10cf77d2dc668a633d42 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Data.Array.IO | |
import Data.IORef | |
import Data.Char | |
import Data.Bits | |
import System.Exit | |
import Control.Exception | |
main :: IO () | |
main = do | |
aRef <- newIORef 0 :: IO (IORef Int) | |
bRef <- newIORef 0 :: IO (IORef Int) | |
cRef <- newIORef 0 :: IO (IORef Int) | |
dRef <- newIORef 0 :: IO (IORef Int) | |
bpRef <- newIORef 0 :: IO (IORef Int) | |
spRef <- newIORef 0 :: IO (IORef Int) | |
pcRef <- newIORef 0 :: IO (IORef Int) | |
mem <- newArray (0, 16777215) 0 :: IO (IOArray Int Int) | |
let init0 :: IO () | |
init0 = do | |
writeArray mem 0 104 | |
writeArray mem 1 101 | |
writeArray mem 2 108 | |
writeArray mem 3 108 | |
writeArray mem 4 111 | |
writeArray mem 5 32 | |
writeArray mem 6 72 | |
writeArray mem 7 97 | |
writeArray mem 8 115 | |
writeArray mem 9 107 | |
writeArray mem 10 101 | |
writeArray mem 11 108 | |
writeArray mem 12 108 | |
writeArray mem 13 32 | |
writeArray mem 14 119 | |
writeArray mem 15 111 | |
writeArray mem 16 114 | |
writeArray mem 17 108 | |
writeArray mem 18 100 | |
writeArray mem 19 33 | |
writeArray mem 21 22 | |
return () | |
let func0 :: IO () | |
func0 = do | |
let whileLoop :: IO () | |
whileLoop = do | |
pc <- readIORef pcRef | |
if 0 <= pc && pc < 128 | |
then do | |
case pc of | |
-1 -> return () -- dummy | |
0 -> do | |
if (True) then (writeIORef pcRef (1 - 1)) else return () | |
1 -> do | |
sp <- readIORef spRef | |
writeIORef dRef sp; | |
d <- readIORef dRef | |
writeIORef dRef ((d + 16777215) .&. 16777215) | |
bp <- readIORef bpRef | |
d <- readIORef dRef | |
writeArray mem d bp | |
d <- readIORef dRef | |
writeIORef spRef d; | |
sp <- readIORef spRef | |
writeIORef bpRef sp; | |
writeIORef aRef 0; | |
sp <- readIORef spRef | |
writeIORef dRef sp; | |
d <- readIORef dRef | |
writeIORef dRef ((d + 16777215) .&. 16777215) | |
a <- readIORef aRef | |
d <- readIORef dRef | |
writeArray mem d a | |
d <- readIORef dRef | |
writeIORef spRef d; | |
writeIORef aRef 2; | |
sp <- readIORef spRef | |
writeIORef dRef sp; | |
d <- readIORef dRef | |
writeIORef dRef ((d + 16777215) .&. 16777215) | |
a <- readIORef aRef | |
d <- readIORef dRef | |
writeArray mem d a | |
d <- readIORef dRef | |
writeIORef spRef d; | |
if (True) then (writeIORef pcRef (10 - 1)) else return () | |
2 -> do | |
b <- readIORef bRef | |
writeIORef aRef b; | |
sp <- readIORef spRef | |
writeIORef spRef ((sp + 1) .&. 16777215) | |
writeIORef aRef 0; | |
a <- readIORef aRef | |
writeIORef bRef a; | |
exitSuccess | |
exitSuccess | |
3 -> do | |
sp <- readIORef spRef | |
writeIORef dRef sp; | |
d <- readIORef dRef | |
writeIORef dRef ((d + 16777215) .&. 16777215) | |
bp <- readIORef bpRef | |
d <- readIORef dRef | |
writeArray mem d bp | |
d <- readIORef dRef | |
writeIORef spRef d; | |
sp <- readIORef spRef | |
writeIORef bpRef sp; | |
4 -> do | |
bp <- readIORef bpRef | |
writeIORef bRef bp; | |
b <- readIORef bRef | |
writeIORef bRef ((b + 2) .&. 16777215) | |
b <- readIORef bRef | |
a <- readArray mem b | |
writeIORef aRef a | |
a <- readIORef aRef | |
writeIORef bRef a; | |
b <- readIORef bRef | |
a <- readArray mem b | |
writeIORef aRef a | |
a <- readIORef aRef | |
if (a == 0) then (writeIORef pcRef (6 - 1)) else return () | |
5 -> do | |
if (True) then (writeIORef pcRef (7 - 1)) else return () | |
6 -> do | |
if (True) then (writeIORef pcRef (9 - 1)) else return () | |
7 -> do | |
bp <- readIORef bpRef | |
writeIORef bRef bp; | |
b <- readIORef bRef | |
writeIORef bRef ((b + 2) .&. 16777215) | |
b <- readIORef bRef | |
a <- readArray mem b | |
writeIORef aRef a | |
a <- readIORef aRef | |
writeIORef bRef a; | |
b <- readIORef bRef | |
a <- readArray mem b | |
writeIORef aRef a | |
sp <- readIORef spRef | |
writeIORef dRef sp; | |
d <- readIORef dRef | |
writeIORef dRef ((d + 16777215) .&. 16777215) | |
a <- readIORef aRef | |
d <- readIORef dRef | |
writeArray mem d a | |
d <- readIORef dRef | |
writeIORef spRef d; | |
a <- readIORef aRef | |
putChar(chr a) | |
sp <- readIORef spRef | |
writeIORef spRef ((sp + 1) .&. 16777215) | |
8 -> do | |
bp <- readIORef bpRef | |
writeIORef bRef bp; | |
b <- readIORef bRef | |
writeIORef bRef ((b + 2) .&. 16777215) | |
b <- readIORef bRef | |
a <- readArray mem b | |
writeIORef aRef a | |
sp <- readIORef spRef | |
writeIORef dRef sp; | |
d <- readIORef dRef | |
writeIORef dRef ((d + 16777215) .&. 16777215) | |
a <- readIORef aRef | |
d <- readIORef dRef | |
writeArray mem d a | |
d <- readIORef dRef | |
writeIORef spRef d; | |
a <- readIORef aRef | |
writeIORef aRef ((a + 1) .&. 16777215) | |
bp <- readIORef bpRef | |
writeIORef bRef bp; | |
b <- readIORef bRef | |
writeIORef bRef ((b + 2) .&. 16777215) | |
a <- readIORef aRef | |
b <- readIORef bRef | |
writeArray mem b a | |
sp <- readIORef spRef | |
a <- readArray mem sp | |
writeIORef aRef a | |
sp <- readIORef spRef | |
writeIORef spRef ((sp + 1) .&. 16777215) | |
if (True) then (writeIORef pcRef (4 - 1)) else return () | |
9 -> do | |
bp <- readIORef bpRef | |
writeIORef spRef bp; | |
sp <- readIORef spRef | |
a <- readArray mem sp | |
writeIORef aRef a | |
sp <- readIORef spRef | |
writeIORef spRef ((sp + 1) .&. 16777215) | |
a <- readIORef aRef | |
writeIORef bpRef a; | |
sp <- readIORef spRef | |
a <- readArray mem sp | |
writeIORef aRef a | |
sp <- readIORef spRef | |
writeIORef spRef ((sp + 1) .&. 16777215) | |
a <- readIORef aRef | |
if (True) then (writeIORef pcRef (a - 1)) else return () | |
10 -> do | |
sp <- readIORef spRef | |
writeIORef dRef sp; | |
d <- readIORef dRef | |
writeIORef dRef ((d + 16777215) .&. 16777215) | |
bp <- readIORef bpRef | |
d <- readIORef dRef | |
writeArray mem d bp | |
d <- readIORef dRef | |
writeIORef spRef d; | |
sp <- readIORef spRef | |
writeIORef bpRef sp; | |
bp <- readIORef bpRef | |
writeIORef bRef bp; | |
b <- readIORef bRef | |
writeIORef bRef ((b + 2) .&. 16777215) | |
b <- readIORef bRef | |
a <- readArray mem b | |
writeIORef aRef a | |
sp <- readIORef spRef | |
writeIORef dRef sp; | |
d <- readIORef dRef | |
writeIORef dRef ((d + 16777215) .&. 16777215) | |
a <- readIORef aRef | |
d <- readIORef dRef | |
writeArray mem d a | |
d <- readIORef dRef | |
writeIORef spRef d; | |
writeIORef aRef 11; | |
sp <- readIORef spRef | |
writeIORef dRef sp; | |
d <- readIORef dRef | |
writeIORef dRef ((d + 16777215) .&. 16777215) | |
a <- readIORef aRef | |
d <- readIORef dRef | |
writeArray mem d a | |
d <- readIORef dRef | |
writeIORef spRef d; | |
if (True) then (writeIORef pcRef (3 - 1)) else return () | |
11 -> do | |
b <- readIORef bRef | |
writeIORef aRef b; | |
sp <- readIORef spRef | |
writeIORef spRef ((sp + 1) .&. 16777215) | |
writeIORef aRef 10; | |
sp <- readIORef spRef | |
writeIORef dRef sp; | |
d <- readIORef dRef | |
writeIORef dRef ((d + 16777215) .&. 16777215) | |
a <- readIORef aRef | |
d <- readIORef dRef | |
writeArray mem d a | |
d <- readIORef dRef | |
writeIORef spRef d; | |
a <- readIORef aRef | |
putChar(chr a) | |
sp <- readIORef spRef | |
writeIORef spRef ((sp + 1) .&. 16777215) | |
bp <- readIORef bpRef | |
writeIORef spRef bp; | |
sp <- readIORef spRef | |
a <- readArray mem sp | |
writeIORef aRef a | |
sp <- readIORef spRef | |
writeIORef spRef ((sp + 1) .&. 16777215) | |
a <- readIORef aRef | |
writeIORef bpRef a; | |
sp <- readIORef spRef | |
a <- readArray mem sp | |
writeIORef aRef a | |
sp <- readIORef spRef | |
writeIORef spRef ((sp + 1) .&. 16777215) | |
a <- readIORef aRef | |
if (True) then (writeIORef pcRef (a - 1)) else return () | |
modifyIORef pcRef (+1) | |
whileLoop | |
else return () | |
whileLoop | |
init0 | |
let mainLoop :: IO () | |
mainLoop = do | |
pc <- readIORef pcRef | |
case pc `div` 128 .|. 0 of | |
0 -> func0 | |
mainLoop | |
mainLoop |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment