From: Bernhard Urban Date: Mon, 1 Nov 2010 13:48:45 +0000 (+0100) Subject: 3a_asm: more .fill power and better 'make test' target X-Git-Tag: bootrom_v1~199 X-Git-Url: http://wien.tomnetworks.com/gitweb/?p=calu.git;a=commitdiff_plain;h=3a2288ae3051e72f93b1e87dfaef7132425ad124 3a_asm: more .fill power and better 'make test' target --- diff --git a/2_isa/callingconv.tex b/2_isa/callingconv.tex index e5388d5..951ef0b 100644 --- a/2_isa/callingconv.tex +++ b/2_isa/callingconv.tex @@ -61,9 +61,9 @@ assembler, a list is given in table~\ref{tab:asmdirs}. address in data or instruction memory, depending on the current section \\ \hline - \texttt{.fill \textit{repeat}, \textit{size}, \textit{value}} & place a - value of a specific size \texttt{\textit{repeat}}-times, while - \texttt{\textit{repeat}} and \texttt{\texttt{size}} are optional. + \texttt{.fill \textit{repeat}, \textit{value}} & place a + 32 bit value \texttt{\textit{repeat}}-times, while + \texttt{\textit{repeat}} is optional. When one parameter is given, the value is placed at the current address. Note that a given value will be rounded up to a full byte, e.g. diff --git a/3a_asm/DTFormat.hs b/3a_asm/DTFormat.hs index be9aafe..3a43eb8 100644 --- a/3a_asm/DTFormat.hs +++ b/3a_asm/DTFormat.hs @@ -14,6 +14,7 @@ data DT_State = NoState | InData | InText deriving (Show,Eq) type Address = Word32 type Value = Word32 +type Repeat = Word32 type ValueToParse = String type Code = String type Label = String @@ -29,6 +30,7 @@ data DTF = DTF_SectionToDet Address Value Code Label Comment | DTF_Org Address | DTF_Define Label Value Comment | + DTF_Fill Repeat Value Label Code Comment | DTF_State DT_State instance Show (DTF) where @@ -42,7 +44,8 @@ showsDTF (DTF_Label l c _) = (++) (printf "3;%s;%s\n" l c) 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_Define l a c) = (++) (printf "def;%s;%08x;%s\n" l a c) +showsDTF (DTF_Fill r v code l c) = (++) (printf "fill;%08x;%08x;%s;%s;%s\n" r v code l c) showsDTF (DTF_State s) = (++) (printf "sta;%s\n" (show s)) datins :: String -> Address -> Value -> Code -> Label -> Comment -> String diff --git a/3a_asm/Main.hs b/3a_asm/Main.hs index 2e99807..f3a6fc1 100644 --- a/3a_asm/Main.hs +++ b/3a_asm/Main.hs @@ -58,6 +58,13 @@ convertDTF ((lno,str):xs) state datacnt instrcnt dict = (newdict, (actlist newdt actlist (DTF_Org _) = next actlist (DTF_State _) = next actlist (DTF_Define _ _ _) = next + actlist (DTF_Fill rep val code l c) = if state == InData then + (DTF_Data datacnt val code l c):[(DTF_Data dc val "" "" "") | i<-[2..repi], let dc = [(datacnt+0x4),(datacnt+0x8)..]!!(i-2)] ++ next + else + (DTF_Instr instrcnt val code l c):[(DTF_Instr ic val "" "" "") | i<-[2..repi], let ic = [(instrcnt+0x4),(instrcnt+0x8)..]!!(i-2)] ++ next + where + repi :: Int + repi = fromInteger (toInteger rep) actlist y = y:next (newdict,next) = convertDTF xs (nstate newdtf) (ndatacnt newdtf) (ninstrcnt newdtf) (ndict newdtf) @@ -65,12 +72,18 @@ convertDTF ((lno,str):xs) state datacnt instrcnt dict = (newdict, (actlist newdt ndatacnt (DTF_Org adr) | state == InData = adr | otherwise = datacnt + ndatacnt (DTF_Fill rep _ _ _ _) + | state == InData = datacnt + (4*rep) + | otherwise = datacnt ndatacnt (DTF_Data _ _ _ _ _) = inc datacnt ndatacnt _ = datacnt ninstrcnt (DTF_Org adr) | state == InText = adr | otherwise = instrcnt + ninstrcnt (DTF_Fill rep _ _ _ _) + | state == InText = instrcnt + (4*rep) + | otherwise = instrcnt ninstrcnt (DTF_Instr _ _ _ _ _) = inc instrcnt ninstrcnt (DTF_InstrToParse _ _ _ _ _) = inc instrcnt ninstrcnt _ = instrcnt @@ -84,6 +97,9 @@ convertDTF ((lno,str):xs) state datacnt instrcnt dict = (newdict, (actlist newdt 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 (DTF_Fill _ _ _ l _) + | state == InText = dict `add_elem` (l,instrcnt) + | state == InData = dict `add_elem` (l,datacnt) ndict _ = dict newdtf = case (parse (parseDTFLine dict) "" (str++"\n")) of @@ -104,7 +120,7 @@ convertDTF ((lno,str):xs) state datacnt instrcnt dict = (newdict, (actlist newdt 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, DTF_Define + Right z -> z -- DTF_Comment, DTF_State, DTF_Define, DTF_Fill @@ -149,12 +165,14 @@ lf_data d = do l <- try (parseLabel) <|> string "" skipMany space fill <- string ".fill " + repeat <- try (do {size <- many1 $ noneOf "\n;,"; char ','; return $ size}) <|> return "1" -- TODO: atm 32bit imm only code <- many1 $ noneOf "\n;" -- TODO: this is quite ugly here :/ let (Right val) = parse (parseConst d) "" code + let (Right r) = parse (parseConst d) "" repeat comment <- try(parseComment) <|> parseMySpaces - return $ DTF_SectionToDet 0 val (fill ++ code) l comment + return $ DTF_Fill r val (fill ++ (if repeat == "1" then "" else repeat) ++ code) l comment lf_comment _ = do comment <- parseComment diff --git a/3a_asm/Makefile b/3a_asm/Makefile index c38230d..4b3da7e 100644 --- a/3a_asm/Makefile +++ b/3a_asm/Makefile @@ -5,7 +5,13 @@ all: .PHONY: clean test clean: - rm -Rf **/**.o **/**.hi dtas + -rm -Rf **/**.o **/**.hi dtas -test: all - cat ../2_isa/src/sum.s && echo '==== here comes the DT ASM output ====' && cat ../2_isa/src/sum.s | ./dtas +TESTFILES := $(shell ls tst/*.s) $(shell ls ../2_isa/src/*.s) +test: all $(TESTFILES:.s=.out) + +%.out: %.s + @echo "=== testing file $<" + @cat $< + @echo "=== here comes the DT ASM output ===" + @./dtas < $< diff --git a/3a_asm/tst/fill.s b/3a_asm/tst/fill.s new file mode 100644 index 0000000..44e3b79 --- /dev/null +++ b/3a_asm/tst/fill.s @@ -0,0 +1,13 @@ +.data +.fill 5, 0x14732 +yeah: .fill 0x1111 + +.text +addi r0,r0,0; +ldil r3, 0x444 +.org 0x1000 +.fill 0x10-8, 0x987655 + +.data +.org 0x500 +.fill 10, 0x1337