commit 22afddcc9fd179aa0df4f1709aaf5213d7370c84
parent 40ac32e5ac6e9caeda669cbb4a3bd099b1b4d7f9
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date: Mon, 18 Dec 2017 14:58:13 +0000
[as-z80] Add call and return group
Diffstat:
4 files changed, 26 insertions(+), 1 deletion(-)
diff --git a/as/target/gen.awk b/as/target/gen.awk
@@ -77,6 +77,8 @@ function str2args(s, args, i, out, n)
out = out "AIMM64"
} else if (match(a, /^imm3/)) {
out = out "AIMM3"
+ } else if (match(a, /^rst/)) {
+ out = out "ARST"
} else if (match(a, /^\(IY\+n\)/)) {
out = out "AINDEX_IY"
} else if (match(a, /^\(IX\+n\)/)) {
diff --git a/as/target/x80/ins.c b/as/target/x80/ins.c
@@ -375,8 +375,22 @@ cc_imm16(Op *op, Node **args)
}
void
+cc(Op *op, Node **args)
+{
+ /* TODO */
+ abort();
+}
+
+void
jr(Op *op, Node **args)
{
/* TODO */
abort();
}
+
+void
+rst(Op *op, Node **args)
+{
+ /* TODO */
+ abort();
+}
diff --git a/as/target/x80/proc.h b/as/target/x80/proc.h
@@ -58,6 +58,7 @@ enum args {
AIMM3, /* 3 bit immediate */
AZERO, /* a literal 0 */
+ ARST, /* 0h, 08h, 10h, 18h, 20h, 28h, 30h, 38h */
};
extern int rclass(int reg);
diff --git a/as/target/x80/x80.dat b/as/target/x80/x80.dat
@@ -33,7 +33,6 @@
.ALIGN imm16+ 0 none align Z80,R800,GB80
.END none 0 none end Z80,R800,GB80
-RET none 1 0xc9 noargs Z80,R800,GB80
# p is any register from B, C, D, E, IXL, IXH, A
@@ -339,3 +338,12 @@ JR imm8 2 0x18 jr Z80,R800,GB80
JR ss,imm8 2 0x00 jr Z80,R800,GB80
JP IY 2 0xfd,0xe9 noargs Z80,R800
DJNZ imm8 2 0x10 jr Z80,R800,GB80
+
+# Call and return group
+CALL imm16 3 0xcd imm16 Z80,R800,GB80
+CALL cc,imm16 3 0xc6 cc_imm16 Z80,R800
+RET none 1 0xc9 noargs Z80,R800,GB80
+RET cc 1 0xc0 cc Z80,R800
+RETI none 2 0xed,0x4d noargs Z80,R800
+RETN none 2 0xed,0x45 noargs Z80,R800
+RST rst 1 0xc7 rst Z80,R800,GB80