mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2026-09-28 17:11:11 -09:00
GT-3050 Reworked too complicated flag setting logic.
This commit is contained in:
@@ -144,7 +144,7 @@ OP1: oprx8_8_X is op4_6=6; oprx8_8_X { export oprx8_8_X; }
|
|||||||
OP1: comma_X is op4_6=7 & comma_X { export comma_X; }
|
OP1: comma_X is op4_6=7 & comma_X { export comma_X; }
|
||||||
|
|
||||||
@if defined(HCS08) || defined(HC08)
|
@if defined(HCS08) || defined(HC08)
|
||||||
op2_opr8a: opr8a_8 is opr8a_8 { export opr8a_8; }
|
op2_opr8a: imm8 is imm8 { export *:1 imm8; }
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
|
|
||||||
@@ -167,48 +167,100 @@ NthBit: nthbit is nIndex [ nthbit = (1 << nIndex); ] { export *[const]:1 nthbit
|
|||||||
# Macros
|
# Macros
|
||||||
################################################################
|
################################################################
|
||||||
|
|
||||||
|
|
||||||
@if defined(HCS08) || defined(HC08)
|
@if defined(HCS08) || defined(HC08)
|
||||||
macro addition_flags(operand, result) {
|
|
||||||
complement_result:1 = ~result;
|
macro additionFlags(operand1, operand2, result) {
|
||||||
|
local AFmask = -1 >> 4;
|
||||||
$(V) = ( ((A & operand & complement_result) | (~A & ~operand & result)) & 0b10000000 ) != 0;
|
$(H) = (((operand1 & AFmask) + (operand2 & AFmask)) & (AFmask + 1)) != 0;
|
||||||
carries:1 = (A & operand) | (operand & complement_result) | (complement_result & A);
|
$(V) = scarry(operand1, operand2);
|
||||||
$(H) = ( carries & 0b00001000 ) != 0;
|
$(N) = result s< 0;
|
||||||
$(N) = (result s< 0);
|
$(C) = carry(operand1, operand2);
|
||||||
$(Z) = (result == 0);
|
$(Z) = (result == 0);
|
||||||
$(C) = ( carries & 0b10000000 ) != 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
macro additionWithCarry(operand1, operand2, result) {
|
||||||
|
local Ccopy = zext($(C));
|
||||||
|
local AFmask = -1 >> 4;
|
||||||
|
$(H) = (((operand1 & AFmask) + (operand2 & AFmask) + Ccopy) & (AFmask + 1)) != 0;
|
||||||
|
$(V) = scarry(operand1, operand2);
|
||||||
|
$(C) = carry(operand1, operand2);
|
||||||
|
local tempResult = operand1 + operand2;
|
||||||
|
$(C) = $(C) || carry(tempResult, Ccopy);
|
||||||
|
$(V) = $(V) ^^ scarry(tempResult, Ccopy);
|
||||||
|
result = tempResult + Ccopy;
|
||||||
|
$(N) =result s< 0;
|
||||||
|
$(Z) = (result == 0);
|
||||||
|
}
|
||||||
|
|
||||||
@elif defined(HC05)
|
@elif defined(HC05)
|
||||||
macro addition_flags(operand, result) {
|
|
||||||
complement_result:1 = ~result;
|
# V is not implemented in HC05
|
||||||
|
|
||||||
# V is not implemented in HC05
|
macro additionFlags(operand1, operand2, result) {
|
||||||
carries:1 = (A & operand) | (operand & complement_result) | (complement_result & A);
|
local AFmask = -1 >> 4;
|
||||||
$(H) = ( carries & 0b00001000 ) != 0;
|
$(H) = (((operand1 & AFmask) + (operand2 & AFmask)) & (AFmask + 1)) != 0;
|
||||||
$(N) = (result s< 0);
|
$(N) =result s< 0;
|
||||||
$(Z) = (result == 0);
|
$(Z) = (result == 0);
|
||||||
$(C) = ( carries & 0b10000000 ) != 0;
|
$(C) = carry(operand1, operand2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
macro additionWithCarry(operand1, operand2, result) {
|
||||||
|
local Ccopy = zext($(C));
|
||||||
|
local AFmask = -1 >> 4;
|
||||||
|
$(H) = (((operand1 & AFmask) + (operand2 & AFmask) + Ccopy) & (AFmask + 1)) != 0;
|
||||||
|
$(C) = carry(operand1, operand2);
|
||||||
|
local tempResult = operand1 + operand2;
|
||||||
|
$(C) = $(C) || carry(tempResult, Ccopy);
|
||||||
|
result = tempResult + Ccopy;
|
||||||
|
$(N) =result s< 0;
|
||||||
|
$(Z) = (result == 0);
|
||||||
|
}
|
||||||
|
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
@if defined(HCS08) || defined(HC08)
|
|
||||||
macro subtraction_flags(operand, result) {
|
|
||||||
complement_A:1 = ~A;
|
|
||||||
|
|
||||||
$(V) = ( ((A & ~operand & ~result) | (complement_A & operand & result)) & 0b10000000 ) != 0;
|
|
||||||
$(N) = (result s< 0);
|
|
||||||
$(Z) = (result == 0);
|
|
||||||
$(C) = ( ((complement_A & operand) | (operand & result) | (result & complement_A)) & 0b10000000 ) != 0;
|
|
||||||
}
|
|
||||||
@elif defined(HC05)
|
|
||||||
macro subtraction_flags(operand, result) {
|
|
||||||
complement_A:1 = ~A;
|
|
||||||
|
|
||||||
# V is not implemented in HC05
|
@if defined(HCS08) || defined(HC08)
|
||||||
|
|
||||||
|
macro subtractionFlags(operand1, operand2, result) {
|
||||||
|
$(V) = sborrow(operand1, operand2);
|
||||||
$(N) = (result s< 0);
|
$(N) = (result s< 0);
|
||||||
$(Z) = (result == 0);
|
$(Z) = (result == 0);
|
||||||
$(C) = ( ((complement_A & operand) | (operand & result) | (result & complement_A)) & 0b10000000 ) != 0;
|
$(C) = operand1 < operand2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
macro subtractWithCarry(operand1, operand2, result) {
|
||||||
|
local Ccopy = zext($(C));
|
||||||
|
$(V) = sborrow(operand1, operand2);
|
||||||
|
|
||||||
|
$(C) = operand1 < operand2;
|
||||||
|
local tempResult = operand1 - operand2;
|
||||||
|
$(C) = $(C) || (tempResult < Ccopy);
|
||||||
|
$(V) = $(V) ^^ sborrow(tempResult, Ccopy);
|
||||||
|
result = tempResult - Ccopy;
|
||||||
|
$(N) = result s< 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@elif defined(HC05)
|
||||||
|
macro subtractionFlags(operand1, operand2, result) {
|
||||||
|
# V is not implemented in HC05
|
||||||
|
|
||||||
|
$(N) = (result s< 0);
|
||||||
|
$(Z) = (result == 0);
|
||||||
|
$(C) = operand1 < operand2;
|
||||||
|
}
|
||||||
|
|
||||||
|
macro subtractWithCarry(operand1, operand2, result) {
|
||||||
|
local Ccopy = zext($(C));
|
||||||
|
# V is not implemented in HC05
|
||||||
|
|
||||||
|
$(C) = operand1 < operand2;
|
||||||
|
local tempResult = operand1 - operand2;
|
||||||
|
$(C) = $(C) || (tempResult < Ccopy);
|
||||||
|
result = tempResult - Ccopy;
|
||||||
|
$(N) = result s< 0;
|
||||||
|
}
|
||||||
|
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
@if defined(HCS08) || defined(HC08)
|
@if defined(HCS08) || defined(HC08)
|
||||||
@@ -322,9 +374,7 @@ macro Push2(operand) {
|
|||||||
{
|
{
|
||||||
op1:1 = OP1;
|
op1:1 = OP1;
|
||||||
|
|
||||||
result:1 = A + op1 + $(C);
|
additionWithCarry(A, op1, A);
|
||||||
addition_flags(op1, result);
|
|
||||||
A = result;
|
|
||||||
}
|
}
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
@@ -333,9 +383,7 @@ macro Push2(operand) {
|
|||||||
{
|
{
|
||||||
op1:1 = oprx16_8_SP;
|
op1:1 = oprx16_8_SP;
|
||||||
|
|
||||||
result:1 = A + op1 + $(C);
|
additionWithCarry(A, op1, A);
|
||||||
addition_flags(op1, result);
|
|
||||||
A = result;
|
|
||||||
}
|
}
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
@@ -344,9 +392,7 @@ macro Push2(operand) {
|
|||||||
{
|
{
|
||||||
op1:1 = oprx8_8_SP;
|
op1:1 = oprx8_8_SP;
|
||||||
|
|
||||||
result:1 = A + op1 + $(C);
|
additionWithCarry(A, op1, A);
|
||||||
addition_flags(op1, result);
|
|
||||||
A = result;
|
|
||||||
}
|
}
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
@@ -356,7 +402,7 @@ macro Push2(operand) {
|
|||||||
op1:1 = OP1;
|
op1:1 = OP1;
|
||||||
|
|
||||||
result:1 = A + op1;
|
result:1 = A + op1;
|
||||||
addition_flags(op1, result);
|
additionFlags(A, op1,result);
|
||||||
A = result;
|
A = result;
|
||||||
}
|
}
|
||||||
@endif
|
@endif
|
||||||
@@ -367,7 +413,7 @@ macro Push2(operand) {
|
|||||||
op1:1 = oprx16_8_SP;
|
op1:1 = oprx16_8_SP;
|
||||||
|
|
||||||
result:1 = A + op1;
|
result:1 = A + op1;
|
||||||
addition_flags(op1, result);
|
additionFlags(A, op1,result);
|
||||||
A = result;
|
A = result;
|
||||||
}
|
}
|
||||||
@endif
|
@endif
|
||||||
@@ -378,7 +424,7 @@ macro Push2(operand) {
|
|||||||
op1:1 = oprx8_8_SP;
|
op1:1 = oprx8_8_SP;
|
||||||
|
|
||||||
result:1 = A + op1;
|
result:1 = A + op1;
|
||||||
addition_flags(op1, result);
|
additionFlags(A, op1,result);
|
||||||
A = result;
|
A = result;
|
||||||
}
|
}
|
||||||
@endif
|
@endif
|
||||||
@@ -1761,9 +1807,7 @@ macro Push2(operand) {
|
|||||||
{
|
{
|
||||||
op1:1 = OP1;
|
op1:1 = OP1;
|
||||||
|
|
||||||
result:1 = A - op1 - $(C);
|
subtractWithCarry(A, op1, A);
|
||||||
subtraction_flags(op1, result);
|
|
||||||
A = result;
|
|
||||||
}
|
}
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
@@ -1772,9 +1816,7 @@ macro Push2(operand) {
|
|||||||
{
|
{
|
||||||
op1:1 = oprx16_8_SP;
|
op1:1 = oprx16_8_SP;
|
||||||
|
|
||||||
result:1 = A - op1 - $(C);
|
subtractWithCarry(A, op1, A);
|
||||||
subtraction_flags(op1, result);
|
|
||||||
A = result;
|
|
||||||
}
|
}
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
@@ -1783,9 +1825,7 @@ macro Push2(operand) {
|
|||||||
{
|
{
|
||||||
op1:1 = oprx8_8_SP;
|
op1:1 = oprx8_8_SP;
|
||||||
|
|
||||||
result:1 = A - op1 - $(C);
|
subtractWithCarry(A, op1, A);
|
||||||
subtraction_flags(op1, result);
|
|
||||||
A = result;
|
|
||||||
}
|
}
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
@@ -1907,7 +1947,7 @@ macro Push2(operand) {
|
|||||||
op1:1 = OP1;
|
op1:1 = OP1;
|
||||||
|
|
||||||
result:1 = A - op1;
|
result:1 = A - op1;
|
||||||
subtraction_flags(op1, result);
|
subtractionFlags(A, op1,result);
|
||||||
A = result;
|
A = result;
|
||||||
}
|
}
|
||||||
@endif
|
@endif
|
||||||
@@ -1918,7 +1958,7 @@ macro Push2(operand) {
|
|||||||
op1:1 = oprx16_8_SP;
|
op1:1 = oprx16_8_SP;
|
||||||
|
|
||||||
result:1 = A - op1;
|
result:1 = A - op1;
|
||||||
subtraction_flags(op1, result);
|
subtractionFlags(A, op1,result);
|
||||||
A = result;
|
A = result;
|
||||||
}
|
}
|
||||||
@endif
|
@endif
|
||||||
@@ -1929,7 +1969,7 @@ macro Push2(operand) {
|
|||||||
op1:1 = oprx8_8_SP;
|
op1:1 = oprx8_8_SP;
|
||||||
|
|
||||||
result:1 = A - op1;
|
result:1 = A - op1;
|
||||||
subtraction_flags(op1, result);
|
subtractionFlags(A, op1,result);
|
||||||
A = result;
|
A = result;
|
||||||
}
|
}
|
||||||
@endif
|
@endif
|
||||||
|
|||||||
Reference in New Issue
Block a user