Add support for RXY instructions (20-bit displacements).

This commit is contained in:
Michael Munday 2016-12-01 19:25:32 -05:00
parent 77f283c328
commit 6ae327df75
2 changed files with 28 additions and 5 deletions

View File

@ -233,8 +233,11 @@ void dasm_put(Dst_DECL, int start, ...)
break;
case DASM_IMM16:
case DASM_IMM32:
case DASM_DISP20:
fprintf(stderr, "not implemented\n");
case DASM_DISP20:
CK(-(1<<19) <= n && n < (1<<19), RANGE_I);
b[pos++] = n;
break;
case DASM_DISP12:
CK((n>>12) == 0, RANGE_I);
b[pos++] = n;
@ -365,9 +368,12 @@ int dasm_encode(Dst_DECL, void *buffer)
case DASM_LABEL_PC: break;
case DASM_IMM16:
case DASM_IMM32:
case DASM_DISP20:
fprintf(stderr, "not implemented\n");
break;
case DASM_DISP20:
cp[-2] |= n&0xfff;
cp[-1] |= (n>>4)&0xff00;
break;
case DASM_DISP12:
cp[-1] |= n&0xfff;
break;

View File

@ -346,8 +346,18 @@ end
-- and b and x are GPRs.
-- Encoded as: xblllhh (ls are the low-bits of d, and hs are the high bits).
local function parse_mem_bxy(arg)
werror("parse_mem_bxy: not implemented")
return nil
local d, x, b = split_memop(arg)
local dval = tonumber(d)
if dval then
if not is_int20(dval) then
werror("displacement out of range: ", dval)
end
return dval, x, b, nil
end
if match(d, "^[rf]1?[0-9]?") then
werror("expected immediate operand, got register")
end
return 0, x, b, function() waction("DISP20", nil, d) end
end
local function parse_label(label, def)
@ -1024,7 +1034,14 @@ local function parse_template(params, template, nparams, pos)
elseif p == "k" then
elseif p == "l" then
local d, x, b, a = parse_mem_bxy(params[2])
op0 = op0 + shl(parse_gpr(params[1]), 4) + x
op1 = op1 + shl(b, 12) + band(d, 0xfff)
op2 = op2 + band(shr(d, 4), 0xff00)
wputhw(op0); wputhw(op1); wputhw(op2)
if a then
a()
end
elseif p == "m" then
elseif p == "n" then