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