mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2026-08-08 07:40:39 -09:00
GP-3606: Fixed 6x09 sub/cmp flags and 2-byte stack push/pop ordering
This commit is contained in:
@@ -505,56 +505,69 @@ macro clear(op)
|
||||
|
||||
macro addition(reg, op)
|
||||
{
|
||||
$(C) = carry(reg, op);
|
||||
$(V) = scarry(reg, op);
|
||||
local tmp = reg;
|
||||
local val = op;
|
||||
$(C) = carry(tmp, val);
|
||||
$(V) = scarry(tmp, val);
|
||||
|
||||
reg = reg + op;
|
||||
tmp = tmp + val;
|
||||
|
||||
setNZFlags(reg);
|
||||
setNZFlags(tmp);
|
||||
reg = tmp;
|
||||
}
|
||||
|
||||
macro additionWithCarry(reg, op)
|
||||
{
|
||||
local carryIn = zext($(C));
|
||||
local tmp = reg;
|
||||
local val = op;
|
||||
local mask = 0x0F; # Low nibble mask
|
||||
local tmpResult = reg + op;
|
||||
local result = tmp + val;
|
||||
|
||||
$(H) = (((reg & mask) + (op & mask) + carryIn) >> 4) & 1;
|
||||
$(C) = carry(reg, op) || carry(tmpResult, carryIn);
|
||||
$(V) = scarry(reg, op) ^^ scarry(tmpResult, carryIn);
|
||||
$(H) = (((tmp & mask) + (val & mask) + carryIn) >> 4) & 1;
|
||||
$(C) = carry(tmp, val) || carry(result, carryIn);
|
||||
$(V) = scarry(tmp, val) ^^ scarry(result, carryIn);
|
||||
|
||||
reg = tmpResult + carryIn;
|
||||
tmp = result + carryIn;
|
||||
|
||||
setNZFlags(reg);
|
||||
setNZFlags(tmp);
|
||||
reg = tmp;
|
||||
}
|
||||
|
||||
macro subtraction(reg, op)
|
||||
{
|
||||
$(V) = sborrow(reg, op);
|
||||
reg = reg - op;
|
||||
setNZFlags(reg);
|
||||
$(C) = (reg < op);
|
||||
local tmp = reg;
|
||||
local val = op;
|
||||
$(V) = sborrow(tmp, val);
|
||||
$(C) = (tmp < val);
|
||||
tmp = tmp - val;
|
||||
setNZFlags(tmp);
|
||||
reg = tmp;
|
||||
}
|
||||
|
||||
macro subtractionWithCarry(reg, op)
|
||||
{
|
||||
local carryIn = zext($(C));
|
||||
local tmpResult = reg - op;
|
||||
local tmp = reg;
|
||||
local val = op;
|
||||
local tmpResult = tmp - val;
|
||||
|
||||
$(C) = (reg < op) || (tmpResult < carryIn);
|
||||
$(V) = sborrow(reg, op) ^^ sborrow(tmpResult, carryIn);
|
||||
|
||||
reg = tmpResult - carryIn;
|
||||
|
||||
setNZFlags(reg);
|
||||
$(C) = (tmp < val) || (tmpResult < carryIn);
|
||||
$(V) = sborrow(tmp, val) ^^ sborrow(tmpResult, carryIn);
|
||||
tmp = tmpResult - carryIn;
|
||||
setNZFlags(tmp);
|
||||
reg = tmp;
|
||||
}
|
||||
|
||||
macro compare(reg, op)
|
||||
{
|
||||
$(V) = sborrow(reg, op);
|
||||
local tmp = reg - op;
|
||||
local tmp = reg;
|
||||
local val = op;
|
||||
$(V) = sborrow(tmp, val);
|
||||
$(C) = (tmp < val);
|
||||
tmp = tmp - val;
|
||||
setNZFlags(tmp);
|
||||
$(C) = (tmp < op);
|
||||
reg = tmp;
|
||||
}
|
||||
|
||||
macro logicalAnd(reg, op)
|
||||
@@ -609,9 +622,8 @@ macro Push1(reg, op)
|
||||
# Push 2 byte operand op2
|
||||
macro Push2(reg, op)
|
||||
{
|
||||
reg = reg - 1;
|
||||
reg = reg - 2;
|
||||
*:2 reg = op;
|
||||
reg = reg - 1;
|
||||
}
|
||||
|
||||
# Pull 1 byte operand op1
|
||||
@@ -624,9 +636,8 @@ macro Pull1(reg, op)
|
||||
# Pull 2 byte operand op2
|
||||
macro Pull2(reg, op)
|
||||
{
|
||||
reg = reg + 1;
|
||||
op = *:2 reg;
|
||||
reg = reg + 1;
|
||||
reg = reg + 2;
|
||||
}
|
||||
|
||||
macro PushUYXDpD()
|
||||
|
||||
Reference in New Issue
Block a user