summaryrefslogtreecommitdiff
path: root/src/codehandler.s
blob: bf9ce139c265e7949b4164763c42a9f1f65ca194 (plain)
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