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