This commit is contained in:
Jonathan Campbell
2020-06-03 06:52:58 -07:00
parent 8019bbe9b2
commit 09c3b340f0

View File

@@ -311,14 +311,12 @@ define encoding "sib" {
subset "base" bit range(2:0);
}
define function "mrm_dataseg" {
return type segment reference;
define register "mrm_dataseg" {
if segref != null {
return segref;
}
return segment reference "DS";
return register "DS";
}
define function "mrm16_eaofs" {
@@ -353,12 +351,12 @@ define function "mrm16_eaofs" {
return null;
}
define function "mrm16_eadisp" {
define effective address "mrm16_eadisp" {
return type memory reference;
input "x" encoding "mrm";
input "mrm" encoding "mrm";
input "disp" type int16_t;
require !(x.mod == 0 && x.rm == 6); /* make sure it's not [offset] */
require x.mod != 3; /* mod == 3 means r/m is register */
require !(mrm.mod == 0 && mrm.rm == 6); /* make sure it's not [offset] */
require mrm.mod != 3; /* mod == 3 means r/m is register */
define var "ofs" description "offset" type uint16_t;
define var "seg" description "segment" type segment reference;
@@ -366,7 +364,7 @@ define function "mrm16_eadisp" {
if segref != null {
seg = segref;
}
else if x.rm == 2 || x.rm == 3 || x.rm == 6 {
else if mrm.rm == 2 || mrm.rm == 3 || mrm.rm == 6 {
/* anything involving BP refers by default to the stack segment */
seg = segment reference "SS";
}
@@ -380,7 +378,7 @@ define function "mrm16_eadisp" {
}
define effective address "mrm16" {
input "x" encoding "mrm";
input "mrm" encoding "mrm";
input "w" type boolean;
if x.mod == 3 {
return register map "genreg" with param "w" = w;
@@ -388,7 +386,7 @@ define effective address "mrm16" {
else if x.mod == 0 && x.rm == 6 {
define var "disp" description "offset" type uint16_t;
disp = cpu instruction fetch uint16_t;
return memory reference segment mrm_dataseg() offset disp;
return memory reference offset "mrm_dataseg" offset disp;
}
else {
define var "disp" description "displacement" type int16_t; /* signed two's complement */
@@ -403,7 +401,7 @@ define effective address "mrm16" {
disp = 0;
}
return mrm16_eadisp(x,disp);
return effective address "mem16_eadisp" with param "mrm" = mrm with param "disp" = disp;
}
}