summaryrefslogtreecommitdiff
path: root/libpcsxcore/ppc/pasm.s
diff options
context:
space:
mode:
authorSND\weimingzhi_cp <SND\weimingzhi_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2010-11-23 02:38:31 +0000
committerSND\weimingzhi_cp <SND\weimingzhi_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2010-11-23 02:38:31 +0000
commit6b375badafb8ddc0a1c1a0eeaa29a70fea86b0c6 (patch)
tree103860b5e72fff6699cde6b0e5c25950a0ed35ab /libpcsxcore/ppc/pasm.s
parent4953fde289c18efa91926fcf7e81cf979f4c6c3d (diff)
downloadpcsxr-6b375badafb8ddc0a1c1a0eeaa29a70fea86b0c6.tar.gz
git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@60002 e17a0e51-4ae3-4d35-97c3-1a29b211df97
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 00000000..96891b42
--- /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
+