aboutsummaryrefslogtreecommitdiff
path: root/libpcsxcore/ppc/pasm.s
diff options
context:
space:
mode:
authorPCSX* teams2010-11-16 14:15:22 +0200
committerGrazvydas Ignotas2010-11-16 14:15:22 +0200
commitef79bbde537d6b9c745a7d86cb9df1d04c35590d (patch)
treeef8d2520dbb9e1e345b41b12c9959f300ca8fd10 /libpcsxcore/ppc/pasm.s
downloadpcsx_rearmed-ef79bbde537d6b9c745a7d86cb9df1d04c35590d.tar.gz
pcsx_rearmed-ef79bbde537d6b9c745a7d86cb9df1d04c35590d.tar.bz2
pcsx_rearmed-ef79bbde537d6b9c745a7d86cb9df1d04c35590d.zip
pcsxr-1.9.92
Diffstat (limited to 'libpcsxcore/ppc/pasm.s')
-rw-r--r--libpcsxcore/ppc/pasm.s124
1 files changed, 124 insertions, 0 deletions
diff --git a/libpcsxcore/ppc/pasm.s b/libpcsxcore/ppc/pasm.s
new file mode 100644
index 0000000..96891b4
--- /dev/null
+++ b/libpcsxcore/ppc/pasm.s
@@ -0,0 +1,124 @@
+
+
+#define OLD_REGISTER_OFFSET (19*4)
+#define SP_SIZE (OLD_REGISTER_OFFSET+4+8)
+
+/*asm void recRun(register void (*func)(), register u32 hw1, register u32 hw2)*/
+ .text
+ .align 4
+ .globl recRun
+recRun:
+ /* prologue code */
+ mflr r0
+ stmw r13, -(32-13)*4(r1)
+ stw r0, 4(r1)
+ stwu r1, -((32-13)*4+8)(r1)
+
+ /* execute code */
+ mtctr r3
+ mr r31, r4
+ mr r30, r5
+ bctrl
+/*
+}
+asm void returnPC()
+{*/
+ .text
+ .align 4
+ .globl returnPC
+returnPC:
+ // end code
+ lwz r0, (32-13)*4+8+4(r1)
+ addi r1, r1, (32-13)*4+8
+ mtlr r0
+ lmw r13, -(32-13)*4(r1)
+ blr
+//}*/
+
+// Memory functions that only works with a linear memory
+
+ .text
+ .align 4
+ .globl dynMemRead8
+dynMemRead8:
+// assumes that memory pointer is in r30
+ addis r2,r3,-0x1f80
+ srwi. r4,r2,16
+ bne+ .norm8
+ cmplwi r2,0x1000
+ blt- .norm8
+ b psxHwRead8
+.norm8:
+ clrlwi r5,r3,3
+ lbzx r3,r5,r30
+ blr
+
+ .text
+ .align 4
+ .globl dynMemRead16
+dynMemRead16:
+// assumes that memory pointer is in r30
+ addis r2,r3,-0x1f80
+ srwi. r4,r2,16
+ bne+ .norm16
+ cmplwi r2,0x1000
+ blt- .norm16
+ b psxHwRead16
+.norm16:
+ clrlwi r5,r3,3
+ lhbrx r3,r5,r30
+ blr
+
+ .text
+ .align 4
+ .globl dynMemRead32
+dynMemRead32:
+// assumes that memory pointer is in r30
+ addis r2,r3,-0x1f80
+ srwi. r4,r2,16
+ bne+ .norm32
+ cmplwi r2,0x1000
+ blt- .norm32
+ b psxHwRead32
+.norm32:
+ clrlwi r5,r3,3
+ lwbrx r3,r5,r30
+ blr
+
+/*
+ N P Z
+ 0 0 0 X
+- 0 0 1 X
+ 1 0 0 X
+ 1 0 1 X
+
+P | (!N & Z)
+P | !(N | !Z)
+*/
+
+ .text
+ .align 4
+ .globl dynMemWrite32
+dynMemWrite32:
+// assumes that memory pointer is in r30
+ addis r2,r3,-0x1f80
+ srwi. r5,r2,16
+ bne+ .normw32
+ cmplwi r2,0x1000
+ blt .normw32
+ b psxHwWrite32
+.normw32:
+ mtcrf 0xFF, r3
+ clrlwi r5,r3,3
+ crandc 0, 2, 0
+ cror 2, 1, 0
+ bne+ .okw32
+ // write test
+ li r2,0x0130
+ addis r2,r2,0xfffe
+ cmplw r3,r2
+ bnelr
+.okw32:
+ stwbrx r4,r5,r30
+ blr
+