Skip to content

Instantly share code, notes, and snippets.

@nwtgck
Created April 29, 2018 02:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nwtgck/b7fe10303afd10cf77d2dc668a633d42 to your computer and use it in GitHub Desktop.
Save nwtgck/b7fe10303afd10cf77d2dc668a633d42 to your computer and use it in GitHub Desktop.
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