DTF_InstrToParse Address ValueToParse Code Label Comment |
DTF_SectionToDet Address Value Code Label Comment |
DTF_Org Address |
+ DTF_Define Label Value Comment |
DTF_State DT_State
instance Show (DTF) where
showsDTF (DTF_InstrToParse a v c l s) = (++) (printf "itp;%08x;%s;%s;%s;%s\n" a v c l s)
showsDTF (DTF_SectionToDet a v c l s) = (++) (datins "std" a v c l s)
showsDTF (DTF_Org a) = (++) (printf "org;%08x\n" a)
+showsDTF (DTF_Define l a c) = (++) (printf "def;%s;%08X;%s\n" l a c)
showsDTF (DTF_State s) = (++) (printf "sta;%s\n" (show s))
datins :: String -> Address -> Value -> Code -> Label -> Comment -> String
where
actlist (DTF_Org _) = next
actlist (DTF_State _) = next
+ actlist (DTF_Define _ _ _) = next
actlist y = y:next
(newdict,next) = convertDTF xs (nstate newdtf) (ndatacnt newdtf) (ninstrcnt newdtf) (ndict newdtf)
ndict (DTF_InstrToParse a _ _ l _) = dict `add_elem` (l,a)
ndict (DTF_Data a _ _ l _) = dict `add_elem` (l,a)
ndict (DTF_Instr a _ _ l _) = dict `add_elem` (l,a)
+ ndict (DTF_Define l v _) = dict `add_elem` (l,v)
ndict _ = dict
newdtf = case (parse parseDTFLine "" (str++"\n")) of
NoState -> error "missing .data or .text"
InData -> (DTF_Label l c datacnt)
InText -> (DTF_Label l c instrcnt)
- Right z -> z -- DTF_Comment, DTF_State
+ Right z -> z -- DTF_Comment, DTF_State, DTF_Define
parseDTFLine :: Parser DTF
parseDTFLine = foldl1 (<|>) (fmap try lineFormats) <* char '\n'
-lineFormats = [lf_sdata, lf_stext, lf_org, lf_data, lf_comment, lf_toparse, lf_label]
+lineFormats = [lf_define, lf_sdata, lf_stext, lf_org, lf_data, lf_comment, lf_toparse, lf_label]
-- helper
+parseIdent :: Parser String
+parseIdent = do
+ ident <- letter
+ idents <- many $ (letter <|> digit <|> char '_')
+ return $ (ident:idents)
+
parseLabel :: Parser String
parseLabel = do
- label <- letter
- labels <- many $ (letter <|> digit <|> char '_')
+ l <- parseIdent
char ':'
- return $ (label:labels)
+ return $ l
parseComment :: Parser String
parseComment = do
parseMySpaces
return $ DTF_State InText
+lf_define = do
+ skipMany space
+ string ".define"
+ parseMySpaces
+ id <- parseIdent
+ parseMySpaces; char ','; parseMySpaces
+ ret <- parseConst
+ comment <- try(parseComment) <|> parseMySpaces
+ return $ DTF_Define id ret comment