aboutsummaryrefslogtreecommitdiff
path: root/src/fake86/modregrm.h
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@gmail.com>2021-02-27 12:08:23 -0500
committerJoseph Hunkeler <jhunkeler@gmail.com>2021-02-27 12:08:23 -0500
commitd49887486c772592c0e8ecc158c1cc3efb3f7709 (patch)
treeea5af335e7cee87f07de50082dd6ff66f3231353 /src/fake86/modregrm.h
downloadfake86-d49887486c772592c0e8ecc158c1cc3efb3f7709.tar.gz
Initial commit 0.13.9.16
Diffstat (limited to 'src/fake86/modregrm.h')
-rw-r--r--src/fake86/modregrm.h129
1 files changed, 129 insertions, 0 deletions
diff --git a/src/fake86/modregrm.h b/src/fake86/modregrm.h
new file mode 100644
index 0000000..026e030
--- /dev/null
+++ b/src/fake86/modregrm.h
@@ -0,0 +1,129 @@
+#include "config.h"
+
+#ifdef CPU_ADDR_MODE_CACHE
+struct addrmodecache_s addrcache[0x100000];
+uint8_t addrcachevalid[0x100000];
+
+uint32_t addrdatalen, dataisvalid, setvalidptr;
+uint64_t cached_access_count = 0, uncached_access_count = 0;
+#define modregrm() { \
+ tempaddr32 = (((uint32_t)savecs << 4) + ip) & 0xFFFFF; \
+ if (addrcachevalid[tempaddr32]) { \
+ switch (addrcache[tempaddr32].len) { \
+ case 0: \
+ dataisvalid = 1; \
+ break; \
+ case 1: \
+ if (addrcachevalid[tempaddr32+1]) dataisvalid = 1; else dataisvalid = 0; \
+ break; \
+ case 2: \
+ if (addrcachevalid[tempaddr32+1] && addrcachevalid[tempaddr32+2]) dataisvalid = 1; else dataisvalid = 0; \
+ break; \
+ } \
+ } else dataisvalid = 0; \
+ if (dataisvalid) { \
+ cached_access_count++; \
+ disp16 = addrcache[tempaddr32].disp16; \
+ segregs[regcs] = addrcache[tempaddr32].exitcs; \
+ ip = addrcache[tempaddr32].exitip; \
+ mode = addrcache[tempaddr32].mode; \
+ reg = addrcache[tempaddr32].reg; \
+ rm = addrcache[tempaddr32].rm; \
+ if ((!segoverride) && addrcache[tempaddr32].forcess) useseg = segregs[regss]; \
+ } else { \
+ uncached_access_count++; \
+ addrbyte = getmem8(segregs[regcs], ip); \
+ StepIP(1); \
+ mode = addrbyte >> 6; \
+ reg = (addrbyte >> 3) & 7; \
+ rm = addrbyte & 7; \
+ addrdatalen = 0; \
+ addrcache[tempaddr32].forcess = 0; \
+ switch(mode) \
+ { \
+ case 0: \
+ if(rm == 6) { \
+ disp16 = getmem16(segregs[regcs], ip); \
+ addrdatalen = 2; \
+ StepIP(2); \
+ } \
+ if (((rm == 2) || (rm == 3))) { \
+ if (!segoverride) useseg = segregs[regss]; \
+ addrcache[tempaddr32].forcess = 1; \
+ } \
+ break; \
+ \
+ case 1: \
+ disp16 = signext(getmem8(segregs[regcs], ip)); \
+ addrdatalen = 1; \
+ StepIP(1); \
+ if (((rm == 2) || (rm == 3) || (rm == 6))) { \
+ if (!segoverride) useseg = segregs[regss]; \
+ addrcache[tempaddr32].forcess = 1; \
+ } \
+ break; \
+ \
+ case 2: \
+ disp16 = getmem16(segregs[regcs], ip); \
+ addrdatalen = 2; \
+ StepIP(2); \
+ if (((rm == 2) || (rm == 3) || (rm == 6))) { \
+ if (!segoverride) useseg = segregs[regss]; \
+ addrcache[tempaddr32].forcess = 1; \
+ } \
+ break; \
+ \
+ default: \
+ disp16 = 0; \
+ } \
+ addrcache[tempaddr32].disp16 = disp16; \
+ addrcache[tempaddr32].exitcs = segregs[regcs]; \
+ addrcache[tempaddr32].exitip = ip; \
+ addrcache[tempaddr32].mode = mode; \
+ addrcache[tempaddr32].reg = reg; \
+ addrcache[tempaddr32].rm = rm; \
+ addrcache[tempaddr32].len = addrdatalen; \
+ memset(&addrcachevalid[tempaddr32], 1, addrdatalen+1); \
+ } \
+}
+#else
+#define modregrm() { \
+ addrbyte = getmem8(segregs[regcs], ip); \
+ StepIP(1); \
+ mode = addrbyte >> 6; \
+ reg = (addrbyte >> 3) & 7; \
+ rm = addrbyte & 7; \
+ switch(mode) \
+ { \
+ case 0: \
+ if(rm == 6) { \
+ disp16 = getmem16(segregs[regcs], ip); \
+ StepIP(2); \
+ } \
+ if(((rm == 2) || (rm == 3)) && !segoverride) { \
+ useseg = segregs[regss]; \
+ } \
+ break; \
+ \
+ case 1: \
+ disp16 = signext(getmem8(segregs[regcs], ip)); \
+ StepIP(1); \
+ if(((rm == 2) || (rm == 3) || (rm == 6)) && !segoverride) { \
+ useseg = segregs[regss]; \
+ } \
+ break; \
+ \
+ case 2: \
+ disp16 = getmem16(segregs[regcs], ip); \
+ StepIP(2); \
+ if(((rm == 2) || (rm == 3) || (rm == 6)) && !segoverride) { \
+ useseg = segregs[regss]; \
+ } \
+ break; \
+ \
+ default: \
+ disp8 = 0; \
+ disp16 = 0; \
+ } \
+}
+#endif \ No newline at end of file