1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
|
.text
#ifndef __MWERKS__
.set r0,0; .set r1,1; .set r2,2; .set r3,3; .set r4,4
.set r5,5; .set r6,6; .set r7,7; .set r8,8; .set r9,9
.set r10,10; .set r11,11; .set r12,12; .set r13,13; .set r14,14
.set r15,15; .set r16,16; .set r17,17; .set r18,18; .set r19,19
.set r20,20; .set r21,21; .set r22,22; .set r23,23; .set r24,24
.set r25,25; .set r26,26; .set r27,27; .set r28,28; .set r29,29
.set r30,30; .set r31,31; .set f0,0; .set f2,2; .set f3,3
#endif
.extern frozen_value
.extern regbuffer
.extern bpbuffer
.extern command_handler__Fv
.extern get_frozenvalue__Fv
.extern exisendbyte__FUc
.extern OSReport
.globl _start
gameid:
.long 0,0
cheatdata:
.long frozenvalue
.space 39*4
_start:
stwu r1,-168(r1) # stores sp
stw r0,8(r1) # stores r0
mflr r0
stw r0,172(r1) # stores lr
mfcr r0
stw r0,12(r1) # stores cr
mfctr r0
stw r0,16(r1) # stores ctr
mfxer r0
stw r0,20(r1) # stores xer
stmw r3,24(r1) # saves r3-r31
mfmsr r25
ori r26,r25,0x2000 #enable floating point ?
andi. r26,r26,0xF9FF
mtmsr r26
stfd f2,152(r1) # stores f2
stfd f3,160(r1) # stores f3
lis r20, 0xCC00
lhz r28, 0x4010(r20)
ori r21, r28, 0xFF
sth r21, 0x4010(r20) # disable MP3 memory protection
_setvalues:
li r21,0
li r22,0x19
li r23,0xD0
lis r24,0xCD00
lis r18, frozenvalue@h
ori r18, r18, frozenvalue@l # read buffer just store in lowmem
lwz r0,172(r1) # loads lr
stw r0,4(r18) # stores lr
stw r21, 0x643C(r24) # exi speed up
_check_frozen:
lis r18, frozen_value@h
ori r18, r18, frozen_value@l
lwz r0, 0x0(r18)
cmpwi r0, 2
bne frozen
#TESTING FOR EXECUTION
lis r3, stringer@h
ori r3, r3, stringer@l
bl OSReport
frozen:
bl command_handler__Fv
cmpwi r3, 0
beq resumegame
b finish
#******************************************************************
# subroutine: bphandler
# Data/Instruction address breakpoint handler, save context and return
#******************************************************************
.global bphandler
bphandler:
mtsprg 0, r3
lis r3, regbuffer@h
ori r3, r3, regbuffer@l
stmw r4, 0x2C(r3) # Store r4 - r31
stw r0, 0x1C(r3) # Store r0
stw r1, 0x20(r3) # Store r1
stw r2, 0x24(r3) # Store r2
mr r4, r3
mfsprg r3, 0
stw r3, 0x28(r4) # Store r3
mfsrr1 r3
rlwinm r3, r3,0,22,20 # clear trace
stw r3, 0x18(r4) # Store SRR1
rlwinm r3, r3,0,24,15
ori r3, r3,0x2000
# rlwinm r3, r3,0,17,15 # clear hw interrupt
mtsrr1 r3 # restore srr1 with hw interrupt & trace cleared
mfsrr0 r3
stw r3, 0x14(r4) # Store SRR0
mflr r3
stw r3, 0x9C(r4) # Store LR
mfcr r3
stw r3, 0x0(r4) # Store CR
mfxer r3
stw r3, 0x4(r4) # Store XER
mfctr r3
stw r3, 0x8(r4) # Store CTR
mfdsisr r3
stw r3, 0xC(r4) # Store DSISR
mfdar r3
stw r3, 0x10(r4) # Store DAR
lis r3, break@h
ori r3, r3, break@l
mtsrr0 r3
rfi
break:
li r3, 0
mtspr 1010, r3 # Clear IABR
mtspr 1013, r3 # Clear DABR
#BACKUP FPR
lis r4, regbuffer@h
ori r4, r4, regbuffer@l
stfs f0, 0xA0(r4)
stfs f1, 0xA4(r4)
stfs f2, 0xA8(r4)
stfs f3, 0xAC(r4)
stfs f4, 0xB0(r4)
stfs f5, 0xB4(r4)
stfs f6, 0xB8(r4)
stfs f7, 0xBC(r4)
stfs f8, 0xC0(r4)
stfs f9, 0xC4(r4)
stfs f10, 0xC8(r4)
stfs f11, 0xCC(r4)
stfs f12, 0xD0(r4)
stfs f13, 0xD4(r4)
stfs f14, 0xD8(r4)
stfs f15, 0xDC(r4)
stfs f16, 0xE0(r4)
stfs f17, 0xE4(r4)
stfs f18, 0xE8(r4)
stfs f19, 0xEC(r4)
stfs f20, 0xF0(r4)
stfs f21, 0xF4(r4)
stfs f22, 0xF8(r4)
stfs f23, 0xFC(r4)
stfs f24, 0x100(r4)
stfs f25, 0x104(r4)
stfs f26, 0x108(r4)
stfs f27, 0x10C(r4)
stfs f28, 0x110(r4)
stfs f29, 0x114(r4)
stfs f30, 0x118(r4)
stfs f31, 0x11C(r4)
#TESTING FOR EXECUTION
# lis r3, stringer@h
# ori r3, r3, stringer@l
# bl OSReport
# r4=regbuffer, r=bpbuffer
# r16=instBp, r17=dataBp, r19=lastBp
#HANDLE MORE STUFF
lis r5, bpbuffer@h
ori r5, r5, bpbuffer@l
lwz r16, 0x0(r5) # inst bp
lwz r17, 0x4(r5) # data bp
lwz r19, 0xC(r5) # last break address
cmpwi r19, 0
beq _redobp # last break was 0. redo bp
cmpwi r19, 2
bne addr_1
lwz r9, 0x14(r4) # SRR0
addi r9, r19, 3
stw r9, 0x0(r5) # inst bp
stw r9, 0xC(r5) # last broken on address
b _executebp
addr_1:
cmpw r16, r19
beq _step
cmpw r17, r19
beq _step
add r9, r16, r17
stw r9, 0xC(r5) # counter for alignment
_alignementcheck:
lwz r16, 0x8(r5) # bp alignment check
cmpwi r16, 0
beq _executebp # no alignement = normal break
lwz r3, 0x10(r4) # DAR
cmpw r16, r3 # we check if address = aligned address
bne _step # if no, we need to set a bp on the next instruction
li r16, 0
stw r16, 0x8(r5) # if we are on the good address we clear the aligned bp check
b _executebp # and we break
_step:
li r17, 0
stw r17, 0xC(r5) # we set last broken on address to 0
lwz r9, 0x18(r4)
ori r9, r9, 0x400
stw r9, 0x18(r4) # SRR1 |= 0x400
b _skipbp # and we don't break right now
_redobp:
mtspr 1010, r16 # we set back the instbp with the original value
mtspr 1013, r17 # we set back the databp with the original value
li r9, 1
stw r9, 0xC(r5) # we set last broken on address to 1
b _skipbp # and we don't break
_executebp:
# lis r1, temp_stack@h
# ori r1, r1, temp_stack@l # setup temp stack
lis r4, frozen_value@h
ori r4, r4, frozen_value@l
li r5, 2
stw r5, 0x0(r4) # Freeze once returned to let user know there is a breakpoint hit
li r3, 0x11
bl exisendbyte__FUc # tell the PC a bp has happened (send 0x11)
bl _start # bl mainloop, so you can set up a new breakpoint.
_skipbp:
mfmsr r1
rlwinm r1,r1,0,31,29
rlwinm r1,r1,0,17,15
mtmsr r1 # we disable the interrupt so nothing interfers with the restore
lis r1, regbuffer@h
ori r1, r1, regbuffer@l
lwz r3,0x0(r1)
mtcr r3 # restores CR
lwz r3,0x14(r1)
mtsrr0 r3 # restores SRR0
lwz r3,0x18(r1)
mtsrr1 r3 # restores SRR1
lwz r3,0x9C(r1)
mtlr r3 # restores LR
lmw r2,0x24(r1) # restores r2-r31
lwz r0,0x1C(r1) # restores r0
lwz r1,0x20(r1) # restores r1
rfi # back to the game
#******************************************************************
# Finish
# Check if the gecko has been paused. if no return to game
#******************************************************************
finish:
bl get_frozenvalue__Fv
cmpwi r3, 0 # check to see if we have frozen the game
bne frozen # loop around if we have
# (changed to return for the bp)
resumegame:
sth r28,0x4010(r20) # restore memory protection value
lfd f2,152(r1) # loads f2
lfd f3,160(r1) # loads f3
mtmsr r25
lwz r0,172(r1)
mtlr r0 # restores lr
lwz r0,12(r1)
mtcr r0 # restores cr
lwz r0,16(r1)
mtctr r0 # restores ctr
lwz r0,20(r1)
mtxer r0 # restores xer
lmw r3,24(r1) # restores r3-r31
lwz r0,8(r1) # loads r0
addi r1,r1,168
isync
blr # return back to game
#******************************************************************
# Write branch
# r3 - source (our mastercode location)
# r4 - destination (lowmem area 0x80001800 address which will branch to
#******************************************************************
.global writebranch
writebranch:
subf r6, r3, r4 # subtract r3 from r4 and place in r17
lis r5, 0x4800 # 0x48000000
rlwimi r5,r6,0,6,29
stw r5, 0(r3) # result in r3
dcbf r0, r3 # data cache block flush
sync
icbi r0, r3
isync
blr # return
#==================================================================
frozenvalue: #frozen value, then LR
.long 0,0
command:
.byte 0,0,0,0
.align 4
.long 0
stringer:
.ascii "I found a codez 1\n"
stringer2:
.ascii "I found a codez 2\n"
stringer3:
.ascii "I found a codez 3\n"
.end
|