1 2#if defined (__ppc__) || defined (__ppc64__) || defined (__powerpc__) || defined (__powerpc64__) || defined (__POWERPC__) 3 4#if defined (ELF) || defined (__linux__) 5#define C(label) label 6#else 7#define C(label) _##label 8#endif 9 10#define OLD_REGISTER_OFFSET (19*4) 11#define SP_SIZE (OLD_REGISTER_OFFSET+4+8) 12 13/*asm void recRun(register void (*func)(), register u32 hw1, register u32 hw2)*/ 14 .text 15 .align 4 16 .globl C(recRun) 17C(recRun): 18 /* prologue code */ 19 mflr r0 20 stmw r13, -(32-13)*4(r1) 21 stw r0, 4(r1) 22 stwu r1, -((32-13)*4+8)(r1) 23 24 /* execute code */ 25 mtctr r3 26 mr r31, r4 27 mr r30, r5 28 bctrl 29/* 30} 31asm void returnPC() 32{*/ 33 .text 34 .align 4 35 .globl C(returnPC) 36C(returnPC): 37 // end code 38 lwz r0, (32-13)*4+8+4(r1) 39 addi r1, r1, (32-13)*4+8 40 mtlr r0 41 lmw r13, -(32-13)*4(r1) 42 blr 43//}*/ 44 45// Memory functions that only works with a linear memory 46 47 .text 48 .align 4 49 .globl C(dynMemRead8) 50C(dynMemRead8): 51// assumes that memory pointer is in r30 52 addis r2,r3,-0x1f80 53 srwi. r4,r2,16 54 bne+ .norm8 55 cmplwi r2,0x1000 56 blt- .norm8 57 b C(psxHwRead8) 58.norm8: 59 clrlwi r5,r3,3 60 lbzx r3,r5,r30 61 blr 62 63 .text 64 .align 4 65 .globl C(dynMemRead16) 66C(dynMemRead16): 67// assumes that memory pointer is in r30 68 addis r2,r3,-0x1f80 69 srwi. r4,r2,16 70 bne+ .norm16 71 cmplwi r2,0x1000 72 blt- .norm16 73 b C(psxHwRead16) 74.norm16: 75 clrlwi r5,r3,3 76 lhbrx r3,r5,r30 77 blr 78 79 .text 80 .align 4 81 .globl C(dynMemRead32) 82C(dynMemRead32): 83// assumes that memory pointer is in r30 84 addis r2,r3,-0x1f80 85 srwi. r4,r2,16 86 bne+ .norm32 87 cmplwi r2,0x1000 88 blt- .norm32 89 b C(psxHwRead32) 90.norm32: 91 clrlwi r5,r3,3 92 lwbrx r3,r5,r30 93 blr 94 95/* 96 N P Z 97 0 0 0 X 98- 0 0 1 X 99 1 0 0 X 100 1 0 1 X 101 102P | (!N & Z) 103P | !(N | !Z) 104*/ 105 106 .text 107 .align 4 108 .globl C(dynMemWrite32) 109C(dynMemWrite32): 110// assumes that memory pointer is in r30 111 addis r2,r3,-0x1f80 112 srwi. r5,r2,16 113 bne+ .normw32 114 cmplwi r2,0x1000 115 blt .normw32 116 b C(psxHwWrite32) 117.normw32: 118 mtcrf 0xFF, r3 119 clrlwi r5,r3,3 120 crandc 0, 2, 0 121 cror 2, 1, 0 122 bne+ .okw32 123 // write test 124 li r2,0x0130 125 addis r2,r2,0xfffe 126 cmplw r3,r2 127 bnelr 128.okw32: 129 stwbrx r4,r5,r30 130 blr 131 132#endif 133