module Gcode ( GALT(..),Gcode(..),showCLabel,strGcode,strGcodeRel , IntState, Prim(..), PrimOp(..),Pos) where import Prim(Prim(..),PrimOp(..),strPrim) import IntState(tidIS,strIS,IntState) import TokenId(dropM) import Util.Extra(Pos) data GALT = GALT_CON Int | GALT_INT Int deriving (Eq) data Gcode = STARTFUN Int Int | NEEDHEAP Int | NEEDSTACK Int | LABEL Int | LOCAL String Int | GLOBAL String Int | JUMP Int | JUMPFALSE Int -- DAVID | PRIMITIVE | CASE [(GALT,Int)] (Maybe (Int,Int)) -- alt and maybe default | PRIM Prim | NOP | TABLESWITCH Int Int [Int] -- size, pad, labels DAVID | LOOKUPSWITCH Int Int [(Int,Int)] Int -- size, pad, [(tag,label)] def DAVID | MKIORETURN -- for FFI, added by MW {---------------- DAVID ------------------ | MATCHCON -- set matchreg to constructor of value on top of stack | MATCHINT -- set matchreg to int on top of stack | JUMPS_T | JUMPTABLE Int -- label 2 bytes | JUMPS_L | JUMPLENGTH Int Int -- size default | JUMPLIST Int Int -- if matchreg == first int jump to label in second int ----------------- DAVID -------------------} | ZAP_STACK Int | ZAP_ARG Int -- Stack | PUSH_CADR Int | PUSH_CVAL Int | PUSH_INT Int | PUSH_CHAR Int | PUSH_INTEGER Integer | PUSH_FLOAT Float | PUSH_DOUBLE Double | PUSH_STRING String | PUSH_ARG Int -- arg(1..) | PUSH_ZAP_ARG Int -- arg(1..) | PUSH Int -- stackoffset(0..) | PUSH_HEAP | PUSH_GLB String Int | POP Int -- size | SLIDE Int -- remove | UNPACK Int -- selector functions | SELECTOR_EVAL -- push the first (and only) argument and evaluate is | SELECT Int -- TOS is a constructor, replace it with it's i:th argument -- evaluation | APPLY Int -- extra arguments on the stack (1..) | EVAL | EVALUATED -- message from FixGcode to GcodeOp1 that tos i evaluated | RETURN | RETURN_EVAL -- Heap | HEAP_CADR Int | HEAP_CVAL Int | HEAP_INT Int | HEAP_CHAR Int | HEAP_INTEGER Integer | HEAP_FLOAT Float | HEAP_DOUBLE Double | HEAP_STRING String | HEAP_ARG Int -- arg(1..) | HEAP_ARG_ARG Int Int-- arg(1..) arg(1..) | HEAP_ARG_ARG_RET_EVAL Int Int-- arg(1..) arg(1..) then RETURN_EVAL | HEAP Int -- stackoffset(0..) | HEAP_GLB String Int | HEAP_CON Int -- ident | HEAP_VAP Int -- ident | HEAP_CAP Int Int -- ident size | HEAP_OFF Int -- hpoffset | HEAP_STATIC Int Int -- Producer Construction (Module and Type is easy to get later) | HEAP_CREATE -- Initiate dynamic | HEAP_SPACE -- empty word, used for retainer and enumeration fields | ALIGN -- pointer | ALIGN_CONST -- double | DATA_CREATE | DATA_CAPITEM Int Int -- little endian | DATA_CONSTHEADER Int Int | DATA_W Int | DATA_S String | DATA_F Float | DATA_D Double | DATA_NOP -- does not generate anything, used after DATA_D to keep 1 DATA/WORD | DATA_CLABEL Int -- call primitive C function | DATA_FLABEL Int -- call foreign imported function | DATA_GLB String Int | DATA_VAP Int | DATA_CAP Int Int | DATA_CON Int Int -- size cno | DATA_CONW Int Int -- size extra | DATA_CONP Int Int -- size extra deriving (Eq) showsL l s = "L_" ++ shows l s showsR l s = shows l s strGcode state g = strGcodePrim showsL state g strGcodeRel state g = strGcodePrim showsR state g strGcodePrim sL state (STARTFUN pos i) = "STARTFUN " ++ shows i "(" ++ strIS state (toEnum i) ++ ")\n" strGcodePrim sL state (NEEDHEAP i) = " NEEDHEAP " ++ shows i "\n" strGcodePrim sL state (NEEDSTACK i) = " NEEDSTACK " ++ shows i "\n" strGcodePrim sL state (LABEL i) = showsL i ":\n" strGcodePrim sL state (LOCAL s i) = s++strIS state (toEnum i) ++ ":\n" strGcodePrim sL state (GLOBAL s i) = let str = s++strIS state (toEnum i) in " EXPORT " ++ str ++ "\n" ++ str ++ ":\n" strGcodePrim sL state (JUMP i) = " JUMP " ++ sL i "\n" strGcodePrim sL state (JUMPFALSE i) = " JUMPFALSE " ++ sL i "\n" strGcodePrim sL state (PRIMITIVE) = " PRIMITIVE\n" strGcodePrim sL state (PRIM prim) = " " ++ strPrim prim ++ "\n" strGcodePrim sL state (CASE alts def) = " CASE\n" ++ concatMap (strGalt state) alts ++ (case def of Just (def,pop) -> " _ => " ++ sL def " (pop " ++ shows pop ")" Nothing -> "") ++ "\n" strGcodePrim sL state (NOP) = " NOP\n" strGcodePrim sL state (TABLESWITCH size pad ls) = -- DAVID " TABLESWITCH " ++ show size ++ " " ++ show pad ++ " { " ++ foldr (\i s -> sL i (' ' : s)) "}\n" ls strGcodePrim sL state (LOOKUPSWITCH size pad tls def) = -- DAVID " LOOKUPSWITCH " ++ show size ++ " " ++ show pad ++ " { " ++ foldr (\(t,i) s -> '(' : show t ++ "," ++ sL i (") " ++ s)) (show def ++ "}\n") tls strGcodePrim sL state (MKIORETURN) = " MKIORETURN\n" -- MW {------------ DAVID ---------------- strGcodePrim sL state (MATCHCON) = " MATCHCON\n" strGcodePrim sL state (MATCHINT) = " MATCHINT\n" strGcodePrim sL state (JUMPS_T) = " JUMPS_T\n" strGcodePrim sL state (JUMPTABLE l) = " JUMPTABLE " ++ sL l "\n" strGcodePrim sL state (JUMPS_L) = " JUMPS_L\n" strGcodePrim sL state (JUMPLENGTH s l) = " JUMPLENGTH " ++ shows s ( " def " ++ sL l "\n") strGcodePrim sL state (JUMPLIST v l) = " JUMPLIST con:" ++ shows v ( " => " ++ sL l "\n") ------------ DAVID -------------- -} strGcodePrim sL state (ZAP_STACK i) = " ZAP_STACK " ++ shows i "\n" strGcodePrim sL state (ZAP_ARG i) = " ZAP_ARG " ++ shows i "\n" -- Stack strGcodePrim sL state (PUSH_CADR i) = " PUSH_CADR " ++ shows i "\n" strGcodePrim sL state (PUSH_CVAL i) = " PUSH_CVAL " ++ shows i "\n" strGcodePrim sL state (PUSH_INT i) = " PUSH_INT " ++ shows i "\n" strGcodePrim sL state (PUSH_CHAR i) = " PUSH_CHAR " ++ shows i "\n" strGcodePrim sL state (PUSH_STRING i) = " PUSH_STRING " ++ shows i "\n" strGcodePrim sL state (PUSH_INTEGER i)= " PUSH_INTEGER " ++ shows i "\n" strGcodePrim sL state (PUSH_FLOAT i) = " PUSH_FLOAT " ++ shows i "\n" strGcodePrim sL state (PUSH_DOUBLE i) = " PUSH_DOUBLE " ++ shows i "\n" strGcodePrim sL state (PUSH_ARG i) = " PUSH_ARG " ++ shows i "\n" strGcodePrim sL state (PUSH_ZAP_ARG i) = " PUSH_ZAP_ARG " ++ shows i "\n" strGcodePrim sL state (PUSH i) = " PUSH " ++ shows i "\n" strGcodePrim sL state (PUSH_HEAP) = " PUSH_HEAP\n" strGcodePrim sL state (PUSH_GLB s i) = " PUSH_GLB " ++ s ++ strIS state (toEnum i) ++ " (" ++ shows i ")\n" strGcodePrim sL state (POP i) = " POP " ++ shows i "\n" strGcodePrim sL state (SLIDE i) = " SLIDE " ++ shows i "\n" strGcodePrim sL state (UNPACK i) = " UNPACK " ++ shows i "\n" -- selector strGcodePrim sL state (SELECTOR_EVAL) = " SELECTOR_EVAL\n" strGcodePrim sL state (SELECT i) = " SELECT " ++ shows i "\n" -- evaluation strGcodePrim sL state (APPLY i) = " APPLY " ++ shows i "\n" strGcodePrim sL state (EVAL) = " EVAL\n" strGcodePrim sL state (EVALUATED) = " EVALUATED\n" strGcodePrim sL state (RETURN) = " RETURN\n" strGcodePrim sL state (RETURN_EVAL) = " RETURN_EVAL\n" -- Heap strGcodePrim sL state (HEAP_CADR i) = " HEAP_CADR " ++ shows i "\n" strGcodePrim sL state (HEAP_CVAL i) = " HEAP_CVAL " ++ shows i "\n" strGcodePrim sL state (HEAP_INT i) = " HEAP_INT " ++ shows i "\n" strGcodePrim sL state (HEAP_CHAR i) = " HEAP_CHAR " ++ shows i "\n" strGcodePrim sL state (HEAP_STRING i) = " HEAP_STRING " ++ shows i "\n" strGcodePrim sL state (HEAP_INTEGER i)= " HEAP_INTEGER " ++ shows i "\n" strGcodePrim sL state (HEAP_FLOAT i) = " HEAP_FLOAT " ++ shows i "\n" strGcodePrim sL state (HEAP_DOUBLE i) = " HEAP_DOUBLE " ++ shows i "\n" strGcodePrim sL state (HEAP_ARG i) = " HEAP_ARG " ++ shows i "\n" strGcodePrim sL state (HEAP_ARG_ARG i j)=" HEAP_ARG_ARG " ++ shows i " " ++ shows j "\n" strGcodePrim sL state (HEAP_ARG_ARG_RET_EVAL i j)=" HEAP_ARG_ARG_RET_EVAL " ++ shows i " " ++ shows j "\n" strGcodePrim sL state (HEAP i) = " HEAP " ++ shows i "\n" strGcodePrim sL state (HEAP_GLB s i) = " HEAP_GLB " ++ s ++ strIS state (toEnum i) ++ " (" ++ shows i ")\n" strGcodePrim sL state (HEAP_CON i) = " HEAP_CON " ++ shows i (" (" ++ strIS state (toEnum i) ++ ")\n") strGcodePrim sL state (HEAP_VAP i) = " HEAP_VAP " ++ shows i (" (" ++ strIS state (toEnum i) ++ ")\n") strGcodePrim sL state (HEAP_CAP i s) = " HEAP_CAP " ++ strIS state (toEnum i) ++ ":" ++ shows s (" (" ++ shows i ")\n" ) strGcodePrim sL state (HEAP_OFF i) = " HEAP_OFF " ++ shows i "\n" strGcodePrim sL state (HEAP_STATIC p c) = " HEAP_STATIC " ++ strIS state (toEnum p) ++ " " ++ strIS state (toEnum c) ++ "\n" strGcodePrim sL state (HEAP_CREATE) = " HEAP_CREATE\n" strGcodePrim sL state (HEAP_SPACE) = " HEAP_SPACE\n" strGcodePrim sL state (DATA_CREATE) = " DATA_CREATE\n" strGcodePrim sL state (DATA_CAPITEM a b) = " DATA_CAPITEM " ++ shows a (' ':shows b "\n") strGcodePrim sL state (DATA_CONSTHEADER a b) = " DATA_CONSTHEADER " ++ shows a (' ':shows b "\n") strGcodePrim sL state (DATA_W i) = " DATA_W " ++ shows i "\n" strGcodePrim sL state (DATA_F f) = " DATA_F " ++ shows f "\n" strGcodePrim sL state (DATA_S s) = " DATA_S " ++ shows s "\n" strGcodePrim sL state (DATA_D d) = " DATA_D " ++ shows d "\n" strGcodePrim sL state (DATA_NOP) = " DATA_NOP\n" strGcodePrim sL state (DATA_CLABEL i) = " DATA_CLABEL " ++ showCLabel state i ( " (" ++ shows i ")\n") strGcodePrim sL state (DATA_FLABEL i) = " DATA_FLABEL " ++ showCLabel state i ( " (" ++ shows i ")\n") strGcodePrim sL state (DATA_GLB s i) = " DATA_GLB " ++ s ++ strIS state (toEnum i) ++ " (" ++ shows i ")\n" strGcodePrim sL state (DATA_VAP i) = " DATA_VAP " ++ shows i "(" ++ strIS state (toEnum i) ++ ")\n" strGcodePrim sL state (DATA_CAP i s) = " DATA_CAP " ++ strIS state (toEnum i) ++ ":" ++ shows s (" (" ++ shows i ")\n" ) strGcodePrim sL state (DATA_CON s c) = " DATA_CON " ++ shows s (' ':shows c "\n") strGcodePrim sL state (DATA_CONW s e) = " DATA_CONW " ++ shows s (' ':shows e "\n") strGcodePrim sL state (DATA_CONP s e) = " DATA_CONP " ++ shows s (' ':shows e "\n") strGcodePrim sL state (ALIGN) = "\n\n ALIGN\n" strGcodePrim sL state (ALIGN_CONST) = "\n\n ALIGN_CONST\n" strGalt state (GALT_CON i,l) = " " ++ shows i " (" ++ strIS state (toEnum i) ++ ")=> " ++ showsL l "\n" strGalt state (GALT_INT i,l) = " " ++ shows i " => " ++ showsL l "\n" showCLabel state i = shows (dropM (tidIS state (toEnum i)))