From: Bernhard Urban Date: Tue, 21 Dec 2010 16:59:07 +0000 (+0100) Subject: 3a_asm: .ifill magic :) X-Git-Tag: bootrom_v1~50 X-Git-Url: http://wien.tomnetworks.com/gitweb/?p=calu.git;a=commitdiff_plain;h=1a0cc16a34af48c3a1a922bd161cdfe5bb0f6336 3a_asm: .ifill magic :) --- diff --git a/3_test/deepjit.s b/3_test/deepjit.s index a73e080..ae87d68 100644 --- a/3_test/deepjit.s +++ b/3_test/deepjit.s @@ -29,86 +29,86 @@ instrtable: .fill 42, 0 prog_eof: -.fill 1, 0xE701FFFC;ldw r0, 0-4(r3) -.fill 1, 0xEB00000A;ret+ +.ifill ldw r0, 0-4(r3);0xE701FFFC +.ifill ret+ prog_mul: -.fill 1, 0xE1998020;subi r3, r3, 4 -.fill 1, 0xe7318000;ldw r6, 0(r3) -.fill 1, 0xe739fffc;ldw r7, 0-4(r3) -.fill 1, 0xed400004;ldis r8, 0 -.fill 1, 0xe1038000;mov r0, r7 -.fill 1, 0xe2800008;andx r0, 1 -.fill 1, 0x00443001;adddnz r8, r8, r6 -.fill 1, 0x01bb8008;subinz r7, r7, 1 -.fill 1, 0x113b8000;addizs r7, r7, 0 +.ifill subi r3, r3, 4;0xE1998020 +.ifill ldw r6, 0(r3);0xe7318000 +.ifill ldw r7, 0-4(r3);0xe739fffc +.ifill ldis r8, 0;0xed400004 +.ifill mov r0, r7;0xe1038000 +.ifill andx r0, 1;0xe2800008 +.ifill adddnz r8, r8, r6;0x00443001 +.ifill subinz r7, r7, 1;0x01bb8008 +.ifill addizs r7, r7, 0;0x113b8000 ;loop: -.fill 1, 0x00443001;adddnz r8, r8, r6 -.fill 1, 0x00443001;adddnz r8, r8, r6 -.fill 1, 0xe1bb8010;subi r7, r7, 2 -.fill 1, 0x0b7ffe83;brnz+ loop -.fill 1, 0xe7c1fffc;stw r8, 0-4(r3) +.ifill adddnz r8, r8, r6;0x00443001 +.ifill adddnz r8, r8, r6;0x00443001 +.ifill subi r7, r7, 2;0xe1bb8010 +.fill 0x0b7ffe83;brnz+ loop +.ifill stw r8, 0-4(r3);0xe7c1fffc prog_consts: -.fill 1, 0xed300004;ldis r6, CONST -.fill 1, 0xe7b18000;stw r6, 0(r3) -.fill 1, 0xe1198020;addi r3, r3, 4 +.fill 0xed300004;ldis r6, CONST +.ifill stw r6, 0(r3);0xe7b18000 +.ifill addi r3, r3, 4;0xe1198020 prog_add: -.fill 1, 0xe1998020;subi r3, r3, 4 -.fill 1, 0xe7318000;ldw r6, 0(r3) -.fill 1, 0xe739fffc;ldw r7, 0-4(r3) -.fill 1, 0xe03bb000;add r7, r7, r6 -.fill 1, 0xe7b9fffc;stw r7, 0-4(r3) +.ifill subi r3, r3, 4;0xe1998020 +.ifill ldw r6, 0(r3);0xe7318000 +.ifill ldw r7, 0-4(r3);0xe739fffc +.ifill add r7, r7, r6;0xe03bb000 +.ifill stw r7, 0-4(r3);0xe7b9fffc prog_sub: -.fill 1, 0xe1998020;subi r3, r3, 4 -.fill 1, 0xe7318000;ldw r6, 0(r3) -.fill 1, 0xe739fffc;ldw r7, 0-4(r3) -.fill 1, 0xe0bbb000;sub r7, r7, r6 -.fill 1, 0xe7b9fffc;stw r7, 0-4(r3) +.ifill subi r3, r3, 4;0xe1998020 +.ifill ldw r6, 0(r3);0xe7318000 +.ifill ldw r7, 0-4(r3);0xe739fffc +.ifill sub r7, r7, r6;0xe0bbb000 +.ifill stw r7, 0-4(r3);0xe7b9fffc prog_lessthan: -.fill 1, 0xe1998020;subi r3, r3, 4 -.fill 1, 0xe7318000;ldw r6, 0(r3) -.fill 1, 0xe739fffc;ldw r7, 0-4(r3) -.fill 1, 0xed400004;ldis r8, 0 -.fill 1, 0xec3b0000;cmp r7, r6 -.fill 1, 0xbd4007fc;ldislt r8, 0xFF -.fill 1, 0xe7c1fffc;stw r8, 0-4(r3) +.ifill subi r3, r3, 4;0xe1998020 +.ifill ldw r6, 0(r3);0xe7318000 +.ifill ldw r7, 0-4(r3);0xe739fffc +.ifill ldis r8, 0;0xed400004 +.ifill cmp r7, r6;0xec3b0000 +.ifill ldislt r8, 0xFF;0xbd4007fc +.ifill stw r8, 0-4(r3);0xe7c1fffc prog_dup: -.fill 1, 0xe731fffc;ldw r6, 0-4(r3) -.fill 1, 0xe7b18000;stw r6, 0(r3) -.fill 1, 0xe1198020;addi r3, r3, 4 +.ifill ldw r6, 0-4(r3);0xe731fffc +.ifill stw r6, 0(r3);0xe7b18000 +.ifill addi r3, r3, 4;0xe1198020 prog_jmp: -.fill 1, 0xe1998020;subi r3, r3, 4 -.fill 1, 0xe7318000;ldw r6, 0(r3) -.fill 1, 0xecb00000;cmpi r6,0 +.ifill subi r3, r3, 4;0xe1998020 +.ifill ldw r6, 0(r3);0xe7318000 +.ifill cmpi r6,0;0xecb00000 ;static calced .fill 1, 0xbb000103;breq- vm_next -.fill 1, 0xeb000003;br+ #CONST +.fill 1, 0xeb000003;br+ CONST prog_imm: .fill 1, 0xed400000;ldil r6, CONST .fill 1, 0xed400002;ldih r6, CONST -.fill 1, 0xe7b18000;stw r6, 0(r3) -.fill 1, 0xe1198020;addi r3, r3, 4 +.ifill stw r6, 0(r3);0xe7b18000 +.ifill addi r3, r3, 4;0xe1198020 prog_pop: -.fill 1, 0xe1998020;subi r3, r3, 4 +.ifill subi r3, r3, 4;0xe1998020 prog_xch: -.fill 1, 0xe731fffc;ldw r6, 0-4(r3) -.fill 1, 0xe739fff8;ldw r7, 0-8(r3) -.fill 1, 0xe7b1fff8;stw r6, 0-8(r3) -.fill 1, 0xe7b9fffc;stw r7, 0-4(r3) +.ifill ldw r6, 0-4(r3);0xe731fffc +.ifill ldw r7, 0-8(r3);0xe739fff8 +.ifill stw r6, 0-8(r3);0xe7b1fff8 +.ifill stw r7, 0-4(r3);0xe7b9fffc prog_not: -.fill 1, 0xe731fffc;ldw r6, 0-4(r3) -.fill 1, 0xe4b7fffa;not r6 -.fill 1, 0xe7b1fffc;stw r6, 0-4(r3) +.ifill ldw r6, 0-4(r3);0xe731fffc +.ifill not r6;0xe4b7fffa +.ifill stw r6, 0-4(r3);0xe7b1fffc .text main: diff --git a/3a_asm/Main.hs b/3a_asm/Main.hs index 8160012..08522c6 100644 --- a/3a_asm/Main.hs +++ b/3a_asm/Main.hs @@ -140,7 +140,7 @@ testDTF input = parseDTFLine :: [DictElem] -> Parser DTF parseDTFLine dict = foldl1 (<|>) (fmap (\x -> try (x dict)) lineFormats) <* char '\n' -lineFormats = [lf_define, 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_ifill, lf_comment, lf_toparse, lf_label] -- helper parseIdent :: Parser String @@ -182,6 +182,17 @@ lf_data d = do comment <- try(parseComment) <|> parseMySpaces return $ DTF_Fill r val (fill ++ (if repeat == "1" then "" else repeat) ++ code) l comment +lf_ifill d = do + l <- try (parseLabel) <|> string "" + skipMany space + fill <- string ".ifill " + code <- many1 $ noneOf "\n;" + let val = case parse (instruction (0,d)) "" (code++"\n") of + Right v -> v + Left err -> error $ show err + comment <- try(parseComment) <|> parseMySpaces + return $ DTF_Fill 1 val (fill ++ code) l comment + lf_comment _ = do comment <- parseComment return $ DTF_Comment comment