about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-04-11 19:27:10 +0200
committerptitSeb <sebastien.chev@gmail.com>2021-04-11 19:27:10 +0200
commitd9967d7ea5d76a7009c2b5ba927989705744bab6 (patch)
tree149d8352878aa0d7da9c376fdb93e24a30b0af05 /src
parentd42031293d83f296863d2b2c03432748ab58eb60 (diff)
downloadbox64-d9967d7ea5d76a7009c2b5ba927989705744bab6.tar.gz
box64-d9967d7ea5d76a7009c2b5ba927989705744bab6.zip
Added A0/A2 opcodes ([DYNAREC] too)
Diffstat (limited to 'src')
-rwxr-xr-xsrc/dynarec/dynarec_arm64_00.c14
-rwxr-xr-xsrc/emu/x64run.c7
-rw-r--r--src/emu/x64runf0.c17
3 files changed, 32 insertions, 6 deletions
diff --git a/src/dynarec/dynarec_arm64_00.c b/src/dynarec/dynarec_arm64_00.c
index 783db2c3..88d4f8f9 100755
--- a/src/dynarec/dynarec_arm64_00.c
+++ b/src/dynarec/dynarec_arm64_00.c
@@ -1017,13 +1017,25 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             SET_DFNONE(x1);
             break;
 
+        case 0xA0:
+            INST_NAME("MOV AL,Ob");
+            u64 = F64;
+            MOV64x(x1, u64);
+            LDRB_U12(x2, x1, 0);
+            BFIx(xRAX, x2, 0, 8);
+            break;
         case 0xA1:
             INST_NAME("MOV EAX,Od");
             u64 = F64;
             MOV64x(x1, u64);
             LDRxw_U12(xRAX, x1, 0);
             break;
-
+        case 0xA2:
+            INST_NAME("MOV Ob,AL");
+            u64 = F64;
+            MOV64x(x1, u64);
+            STRB_U12(xRAX, x1, 0);
+            break;
         case 0xA3:
             INST_NAME("MOV Od,EAX");
             u64 = F64;
diff --git a/src/emu/x64run.c b/src/emu/x64run.c
index c0b7fea5..471aa8f2 100755
--- a/src/emu/x64run.c
+++ b/src/emu/x64run.c
@@ -539,13 +539,18 @@ x64emurun:
             RESET_FLAGS(emu);
             break;
 
+        case 0xA0:                      /* MOV AL,Ob */
+            R_AL = *(uint8_t*)F64;
+            break;
         case 0xA1:                      /* MOV EAX,Od */
             if(rex.w)
                 R_RAX = *(uint64_t*)F64;
             else
                 R_EAX = *(uint32_t*)F64;
             break;
-
+        case 0xA2:                      /* MOV Ob,AL */
+            *(uint8_t*)F64 = R_AL;
+            break;
         case 0xA3:                      /* MOV Od,EAX */
             if(rex.w)
                 *(uint64_t*)F64 = R_RAX;
diff --git a/src/emu/x64runf0.c b/src/emu/x64runf0.c
index 9ce3d01e..883b35ac 100644
--- a/src/emu/x64runf0.c
+++ b/src/emu/x64runf0.c
@@ -392,10 +392,19 @@ int RunF0(x64emu_t *emu, rex_t rex)
                         } while(arm64_lock_write_dd(ED, tmp64u2));

                         GD->q[0] = tmp64u;

                     } else {

-                        do {

-                            tmp32u = arm64_lock_read_d(ED);

-                            tmp32u2 = add32(emu, tmp32u, GD->dword[0]);

-                        } while(arm64_lock_write_d(ED, tmp32u2));

+                        if(((uintptr_t)ED)&3) {

+                            do {

+                                tmp32u = ED->dword[0] & ~0xff;

+                                tmp32u |= arm64_lock_read_b(ED);

+                                tmp32u2 = add32(emu, tmp32u, GD->dword[0]);

+                            } while(arm64_lock_write_b(ED, tmp32u2&0xff));

+                            ED->dword[0] = tmp32u2;

+                        } else {

+                            do {

+                                tmp32u = arm64_lock_read_d(ED);

+                                tmp32u2 = add32(emu, tmp32u, GD->dword[0]);

+                            } while(arm64_lock_write_d(ED, tmp32u2));

+                        }

                         GD->q[0] = tmp32u;

                         if(MODREG)

                             ED->dword[1] = 0;