diff -rtu mrifk.orig/Makefile mrifk/Makefile
--- mrifk.orig/Makefile 2004-01-31 18:36:30.000000000 +0300
+++ mrifk/Makefile      2016-03-21 10:55:48.195396805 +0300
@@ -4,5 +4,8 @@
all : mrifk$(EXE)

mrifk$(EXE) : Mrifk*.hs
-        ghc --make -fglasgow-exts -o $@ ${HFLAGS} Mrifk.hs
+        ghc --make -XParallelListComp -o $@ ${HFLAGS} Mrifk.hs
        strip $@
+
+clean :
+        -rm *.o *.hi mrifk$(EXE)
diff -rtu mrifk.orig/Mrifk_decompile.hs mrifk/Mrifk_decompile.hs
--- mrifk.orig/Mrifk_decompile.hs       2005-05-24 22:35:18.000000000 +0400
+++ mrifk/Mrifk_decompile.hs    2016-03-21 13:32:35.210335369 +0300
@@ -25,7 +25,7 @@
import Mrifk_code
import Mrifk_util

-import List (sort)
+import Data.List (sort)


updateLabels code = updateLabels' (sort (findJumps code)) code
diff -rtu mrifk.orig/Mrifk_disasm.hs mrifk/Mrifk_disasm.hs
--- mrifk.orig/Mrifk_disasm.hs  2004-01-31 18:36:30.000000000 +0300
+++ mrifk/Mrifk_disasm.hs       2016-03-21 14:06:37.206022400 +0300
@@ -190,6 +190,7 @@
  (0x70,("streamchar",  1,0,0,  OStreamChar)),
  (0x71,("streamnum",   1,0,0,  OStreamNum)),
  (0x72,("streamstr",   1,0,0,  OStreamStr)),
+  (0x73,("streamunichar",       1,0,0,  OStreamChar)),
  (0x100,("gestalt",    2,1,0,  OSpecial)),
  (0x101,("debugtrap",  1,0,0,  OSpecial)),
  (0x102,("getmemsize", 0,1,0,  OSpecial)),
@@ -216,4 +217,39 @@
  (0x160,("callf",      1,1,0,  OCallI)),
  (0x161,("callfi",     2,1,0,  OCallI)),
  (0x162,("callfii",    3,1,0,  OCallI)),
-  (0x163,("callfiii",   4,1,0,  OCallI))]
+  (0x163,("callfiii",   4,1,0,  OCallI)),
+  (0x170,("mzero",      2,0,0,  OSpecial)),
+  (0x171,("mcopy",      3,0,0,  OSpecial)),
+  (0x178,("malloc",     1,1,0,  OSpecial)),
+  (0x179,("mfree",      1,0,0,  OSpecial)),
+  (0x180,("accelfunc",  2,0,0,  OSpecial)),
+  (0x181,("accelparam", 2,0,0,  OSpecial)),
+  (0x190,("numtof",     1,1,0,  OSpecial)),
+  (0x191,("ftonumz",    1,1,0,  OSpecial)),
+  (0x192,("ftonumn",    1,1,0,  OSpecial)),
+  (0x198,("ceil",       1,1,0,  OSpecial)),
+  (0x199,("floor",      1,1,0,  OSpecial)),
+  (0x1A0,("fadd",       2,1,0,  OBinary (NormalOp " + " 5))),
+  (0x1A1,("fsub",       2,1,0,  OBinary (NormalOp " - " 5))),
+  (0x1A2,("fmul",       2,1,0,  OBinary (NormalOp " * " 6))),
+  (0x1A3,("fdiv",       2,1,0,  OBinary (NormalOp " / " 6))),
+  (0x1A4,("fmod",       2,2,0,  OBinary (NormalOp " % " 6))),
+  (0x1A8,("sqrt",       1,1,0,  OSpecial)),
+  (0x1A9,("exp",        1,1,0,  OSpecial)),
+  (0x1AA,("log",        1,1,0,  OSpecial)),
+  (0x1AB,("pow",        2,1,0,  OSpecial)),
+  (0x1B0,("sin",        1,1,0,  OSpecial)),
+  (0x1B1,("cos",        1,1,0,  OSpecial)),
+  (0x1B2,("tan",        1,1,0,  OSpecial)),
+  (0x1B3,("asin",       1,1,0,  OSpecial)),
+  (0x1B4,("acos",       1,1,0,  OSpecial)),
+  (0x1B5,("atan",       1,1,0,  OSpecial)),
+  (0x1B6,("atan2",      2,1,0,  OSpecial)),
+  (0x1C0,("jfeq",       3,0,1,  OSpecial)),
+  (0x1C1,("jfne",       3,0,1,  OSpecial)),
+  (0x1C2,("jflt",       2,0,1,  OJCond binopLT)),
+  (0x1C3,("jfle",       2,0,1,  OJCond binopLE)),
+  (0x1C4,("jfgt",       2,0,1,  OJCond binopGT)),
+  (0x1C5,("jfge",       2,0,1,  OJCond binopGE)),
+  (0x1C8,("jisnan",     1,0,1,  OSpecial)),
+  (0x1C9,("jisinf",     1,0,1,  OSpecial))]
diff -rtu mrifk.orig/Mrifk_grammar.hs mrifk/Mrifk_grammar.hs
--- mrifk.orig/Mrifk_grammar.hs 2004-01-31 18:36:30.000000000 +0300
+++ mrifk/Mrifk_grammar.hs      2016-03-14 13:36:05.000000000 +0300
@@ -30,11 +30,11 @@
import Mrifk_memmap


-import Char (chr)
+import Data.Char (chr)
import Control.Monad
import Data.Array
import Data.Bits
-import Maybe (isJust)
+import Data.Maybe (isJust)
import Numeric (showHex)


diff -rtu mrifk.orig/Mrifk.hs mrifk/Mrifk.hs
--- mrifk.orig/Mrifk.hs 2005-05-24 22:36:48.000000000 +0400
+++ mrifk/Mrifk.hs      2016-03-21 12:39:24.052082317 +0300
@@ -17,7 +17,9 @@
-}


-module Main () where
+module Main (
+    main
+) where


import Mrifk_cmdline
@@ -33,12 +35,12 @@
import Control.Monad.State (evalState)
import Data.Array
import Data.Tree
-import Maybe (fromJust)
+import Data.Maybe (fromJust)
import Numeric (showHex)


-mrifkRelease = "1"
-mrifkSerial  = "040131"
+mrifkRelease = "1-patched-v2"
+mrifkSerial  = "160321"


main =
diff -rtu mrifk.orig/Mrifk_memmap.hs mrifk/Mrifk_memmap.hs
--- mrifk.orig/Mrifk_memmap.hs  2004-01-31 18:36:30.000000000 +0300
+++ mrifk/Mrifk_memmap.hs       2016-03-21 11:23:36.091904329 +0300
@@ -28,9 +28,9 @@
import Mrifk_storyfile
import Mrifk_strings

-import Array (Array,listArray)
+import Data.Array (Array,listArray)
import Data.Bits (shiftR)
-import Maybe (mapMaybe)
+import Data.Maybe (mapMaybe)
import Numeric (showHex)


@@ -190,7 +190,7 @@


isStringPtr p =
-  p == 0 || (p >= hdrDecodingTbl && p < hdrExtStart && byteAt p `elem` [0xE0,0xE1])
+  p == 0 || (p >= hdrDecodingTbl && p < hdrExtStart && byteAt p `elem` [0xE0,0xE1,0xE2])

maybeStringAt 0 = Nothing
maybeStringAt addr = Just (evalFrom addr decodeString)
diff -rtu mrifk.orig/Mrifk_objects.hs mrifk/Mrifk_objects.hs
--- mrifk.orig/Mrifk_objects.hs 2004-01-31 18:36:30.000000000 +0300
+++ mrifk/Mrifk_objects.hs      2016-03-14 13:36:31.000000000 +0300
@@ -33,7 +33,7 @@
import Data.Array
import Data.Bits (testBit)
import Data.Tree
-import Maybe (fromJust)
+import Data.Maybe (fromJust)


--                    name  attrs prop# priv data
diff -rtu mrifk.orig/Mrifk_print.hs mrifk/Mrifk_print.hs
--- mrifk.orig/Mrifk_print.hs   2004-01-31 18:36:30.000000000 +0300
+++ mrifk/Mrifk_print.hs        2016-03-14 13:34:06.000000000 +0300
@@ -30,10 +30,10 @@
import Mrifk_strings
import Mrifk_util

-import Char (ord,isDigit)
+import Data.Char (ord,isDigit)
import Data.Array
-import Ix (inRange)
-import Maybe (fromMaybe)
+import Data.Ix (inRange)
+import Data.Maybe (fromMaybe)
import Numeric (showHex)


diff -rtu mrifk.orig/Mrifk_strings.hs mrifk/Mrifk_strings.hs
--- mrifk.orig/Mrifk_strings.hs 2004-01-31 18:36:30.000000000 +0300
+++ mrifk/Mrifk_strings.hs      2016-03-21 13:05:41.098560075 +0300
@@ -24,7 +24,7 @@

import Mrifk_storyfile

-import Char (chr)
+import Data.Char (chr)
import Data.Bits (testBit)
import Control.Monad.State (evalState)

@@ -99,6 +99,7 @@
     case type_ of
       0xE0 -> getCString
       0xE1 -> huffDecode
+       0xE2 -> getCString

getCString =
  do x <- getUByte
diff -rtu mrifk.orig/Mrifk_util.hs mrifk/Mrifk_util.hs
--- mrifk.orig/Mrifk_util.hs    2004-01-31 18:36:30.000000000 +0300
+++ mrifk/Mrifk_util.hs 2016-03-14 13:34:33.000000000 +0300
@@ -24,7 +24,7 @@
) where


-import List (sortBy)
+import Data.List (sortBy)


onFst f (a,b) = (f a,b)
diff -rtu mrifk.orig/ReadBinary.hs mrifk/ReadBinary.hs
--- mrifk.orig/ReadBinary.hs    2004-01-31 18:36:30.000000000 +0300
+++ mrifk/ReadBinary.hs 2016-03-15 09:52:50.883079265 +0300
@@ -4,10 +4,11 @@
        byteAt
) where

-import Foreign (unsafePerformIO,peekElemOff)
+import System.IO.Unsafe (unsafePerformIO)
+import Foreign (peekElemOff)
import Foreign.Marshal.Alloc (mallocBytes)
import Foreign.Ptr (Ptr,nullPtr)
-import Foreign.C.Types (CUChar,CInt,CLong,CSize,CFile)
+import Foreign.C.Types (CUChar,CInt(..),CLong(..),CSize(..),CFile)
import Foreign.C.String (CString,withCString)