@@ -145,14 +145,14 @@ void PCSX::PS1Packer::pack(IO<File> src, IO<File> dest, uint32_t addr, uint32_t
145
145
pushBytes (stub, addiu (Reg::T8, Reg::RA, 0 ));
146
146
}
147
147
pushBytes (stub, lui (Reg::T1, getHI (offset)));
148
- pushBytes (stub, bgezal (Reg::R0, 4 ));
149
- pushBytes (stub, addiu (Reg::T1, Reg::T1, getLO (offset)));
148
+ pushBytes (stub, bal ( 4 ));
149
+ pushBytes (stub, addiu (Reg::T1, getLO (offset)));
150
150
pushBytes (stub, lui (Reg::T0, 0x1fff ));
151
- pushBytes (stub, ori (Reg::T0, Reg::T0, 0xffff ));
152
- pushBytes (stub, andd (Reg::RA, Reg::RA, Reg:: T0));
151
+ pushBytes (stub, ori (Reg::T0, 0xffff ));
152
+ pushBytes (stub, andd (Reg::RA, Reg::T0));
153
153
pushBytes (stub, lui (Reg::T0, 0x8000 ));
154
- pushBytes (stub, orr (Reg::RA, Reg::RA, Reg:: T0));
155
- pushBytes (stub, addu (Reg::T0, Reg::RA, Reg:: T1));
154
+ pushBytes (stub, orr (Reg::RA, Reg::T0));
155
+ pushBytes (stub, addu (Reg::T0, Reg::T1));
156
156
pushBytes (stub, jr (Reg::T0));
157
157
pushBytes (stub, addiu (Reg::A0, Reg::RA, 32 ));
158
158
@@ -196,11 +196,11 @@ void PCSX::PS1Packer::pack(IO<File> src, IO<File> dest, uint32_t addr, uint32_t
196
196
// Calls the ucl-nrv2e decompressor.
197
197
if (!options.raw ) {
198
198
pushBytes (dataOut, lui (Reg::A0, getHI (compLoad)));
199
- pushBytes (dataOut, addiu (Reg::A0, Reg::A0, getLO (compLoad)));
199
+ pushBytes (dataOut, addiu (Reg::A0, getLO (compLoad)));
200
200
}
201
201
pushBytes (dataOut, lui (Reg::A1, getHI (addr)));
202
- pushBytes (dataOut, bgezal (Reg::R0, -((int16_t )(dataOut.size () + 4 - n2estart))));
203
- pushBytes (dataOut, addiu (Reg::A1, Reg::A1, getLO (addr)));
202
+ pushBytes (dataOut, bal ( -((int16_t )(dataOut.size () + 4 - n2estart))));
203
+ pushBytes (dataOut, addiu (Reg::A1, getLO (addr)));
204
204
205
205
// Then, bootstrap our newly-decompressed binary.
206
206
if (options.shell ) {
@@ -218,16 +218,16 @@ void PCSX::PS1Packer::pack(IO<File> src, IO<File> dest, uint32_t addr, uint32_t
218
218
// binary in memory.
219
219
pushBytes (shellCode, nop ());
220
220
pushBytes (shellCode, lui (Reg::T0, getHI (pc)));
221
- pushBytes (shellCode, addiu (Reg::T0, Reg::T0, getLO (pc)));
221
+ pushBytes (shellCode, addiu (Reg::T0, getLO (pc)));
222
222
pushBytes (shellCode, lui (Reg::GP, getHI (gp)));
223
223
pushBytes (shellCode, jr (Reg::T0));
224
- pushBytes (shellCode, addiu (Reg::GP, Reg::GP, getLO (gp)));
224
+ pushBytes (shellCode, addiu (Reg::GP, getLO (gp)));
225
225
226
226
// Jumps over the two blocks of code above, grabbing their address
227
227
// in $ra using bal.
228
- pushBytes (dataOut, bgezal (Reg::R0, breakHandler.size () + shellCode.size ()));
228
+ pushBytes (dataOut, bal ( breakHandler.size () + shellCode.size ()));
229
229
// $s0 = 0xa0
230
- pushBytes (dataOut, addiu (Reg::S0, Reg::R0 , 0xa0 ));
230
+ pushBytes (dataOut, li (Reg::S0, 0xa0 ));
231
231
232
232
// Insert the two pieces of code we need to copy.
233
233
pushBytes (dataOut, breakHandler);
@@ -237,30 +237,30 @@ void PCSX::PS1Packer::pack(IO<File> src, IO<File> dest, uint32_t addr, uint32_t
237
237
// $s1 = address of the break handler.
238
238
pushBytes (dataOut, addiu (Reg::S1, Reg::RA, 0 ));
239
239
240
- pushBytes (dataOut, addiu (Reg::A0, Reg::R0 , 0x40 ));
240
+ pushBytes (dataOut, li (Reg::A0, 0x40 ));
241
241
pushBytes (dataOut, addiu (Reg::A1, Reg::S1, 0 ));
242
- pushBytes (dataOut, addiu (Reg::A2, Reg::R0 , breakHandler.size ()));
242
+ pushBytes (dataOut, li (Reg::A2, breakHandler.size ()));
243
243
// Call A0:2A - memcpy.
244
244
pushBytes (dataOut, jalr (Reg::S0));
245
- pushBytes (dataOut, addiu (Reg::T1, Reg::R0 , 0x2a ));
245
+ pushBytes (dataOut, li (Reg::T1, 0x2a ));
246
246
247
247
pushBytes (dataOut, lui (Reg::A0, 0x8003 ));
248
248
pushBytes (dataOut, addiu (Reg::A1, Reg::S1, breakHandler.size ()));
249
- pushBytes (dataOut, addiu (Reg::A2, Reg::R0 , shellCode.size ()));
249
+ pushBytes (dataOut, li (Reg::A2, shellCode.size ()));
250
250
// Call A0:2A - memcpy.
251
251
pushBytes (dataOut, jalr (Reg::S0));
252
- pushBytes (dataOut, addiu (Reg::T1, Reg::R0 , 0x2a ));
252
+ pushBytes (dataOut, li (Reg::T1, 0x2a ));
253
253
254
254
// And reboot, leaving cop0's registers set to break
255
255
// on writes to 0x80030000.
256
256
constexpr uint32_t partialReboot = 0xbfc00390 ;
257
257
258
258
pushBytes (dataOut, lui (Reg::RA, getHI (partialReboot)));
259
- pushBytes (dataOut, addiu (Reg::RA, Reg::RA, getLO (partialReboot)));
259
+ pushBytes (dataOut, addiu (Reg::RA, getLO (partialReboot)));
260
260
261
261
pushBytes (dataOut, lui (Reg::T0, 0b1100101010000000 ));
262
262
pushBytes (dataOut, lui (Reg::T1, 0x8003 ));
263
- pushBytes (dataOut, addiu (Reg::T2, Reg::R0 , -1 ));
263
+ pushBytes (dataOut, li (Reg::T2, -1 ));
264
264
pushBytes (dataOut, mtc0 (Reg::R0, 7 ));
265
265
pushBytes (dataOut, mtc0 (Reg::T1, 5 ));
266
266
pushBytes (dataOut, mtc0 (Reg::T2, 9 ));
@@ -271,35 +271,35 @@ void PCSX::PS1Packer::pack(IO<File> src, IO<File> dest, uint32_t addr, uint32_t
271
271
// skipping over SBUS settings, and the resetting
272
272
// of all the cop0 registers.
273
273
pushBytes (dataOut, jr (Reg::S0));
274
- pushBytes (dataOut, addiu (Reg::T1, Reg::R0 , 0x44 ));
274
+ pushBytes (dataOut, li (Reg::T1, 0x44 ));
275
275
} else if (options.nokernel ) {
276
276
// We can't call into the kernel, so we need to
277
277
// flush the cache ourselves first.
278
- pushBytes (dataOut, bgezal (Reg::R0, 4 ));
278
+ pushBytes (dataOut, bal ( 4 ));
279
279
pushBytes (dataOut, lui (Reg::T1, 0xa000 ));
280
280
pushBytes (dataOut, orr (Reg::T1, Reg::RA, Reg::T1));
281
- pushBytes (dataOut, addiu (Reg::T1, Reg::T1, 16 ));
281
+ pushBytes (dataOut, addiu (Reg::T1, 16 ));
282
282
pushBytes (dataOut, jr (Reg::T1));
283
283
pushBytes (dataOut, mtc0 (Reg::R0, 12 ));
284
284
pushBytes (dataOut, lui (Reg::T5, 0xfffe ));
285
285
pushBytes (dataOut, lui (Reg::T2, 0x0001 ));
286
- pushBytes (dataOut, ori (Reg::T2, Reg::T2, 0xe90c ));
286
+ pushBytes (dataOut, ori (Reg::T2, 0xe90c ));
287
287
pushBytes (dataOut, sw (Reg::T2, 0x0130 , Reg::T5));
288
288
pushBytes (dataOut, lui (Reg::T1, 1 ));
289
289
pushBytes (dataOut, mtc0 (Reg::T1, 12 ));
290
- pushBytes (dataOut, addu (Reg::T3, Reg::R0 , Reg::R0));
291
- pushBytes (dataOut, addiu (Reg::T4, Reg::R0 , 0x0ff0 ));
290
+ pushBytes (dataOut, move (Reg::T3, Reg::R0));
291
+ pushBytes (dataOut, li (Reg::T4, 0x0ff0 ));
292
292
pushBytes (dataOut, sw (Reg::R0, 0 , Reg::T3));
293
293
pushBytes (dataOut, bne (Reg::T3, Reg::T4, -8 ));
294
- pushBytes (dataOut, addiu (Reg::T3, Reg::T3, 0x10 ));
294
+ pushBytes (dataOut, addiu (Reg::T3, 0x10 ));
295
295
pushBytes (dataOut, mtc0 (Reg::R0, 12 ));
296
- pushBytes (dataOut, addiu (Reg::T2, Reg::T2, 0x7c ));
296
+ pushBytes (dataOut, addiu (Reg::T2, 0x7c ));
297
297
pushBytes (dataOut, sw (Reg::T2, 0x0130 , Reg::T5));
298
298
// Then jumps into the decompressed binary, restoring
299
299
// $ra if needed, so the decompressed binary can return
300
300
// to the caller gracefully.
301
301
pushBytes (dataOut, lui (Reg::T0, getHI (pc)));
302
- pushBytes (dataOut, addiu (Reg::T0, Reg::T0, getLO (pc)));
302
+ pushBytes (dataOut, addiu (Reg::T0, getLO (pc)));
303
303
pushBytes (dataOut, jr (Reg::T0));
304
304
if (options.resetstack ) {
305
305
pushBytes (dataOut, ori (Reg::SP, Reg::SP, 0xfff0 ));
@@ -308,17 +308,17 @@ void PCSX::PS1Packer::pack(IO<File> src, IO<File> dest, uint32_t addr, uint32_t
308
308
}
309
309
} else {
310
310
// Calls A0:44 - FlushCache
311
- pushBytes (dataOut, addiu (Reg::T0, Reg::R0 , 0xa0 ));
311
+ pushBytes (dataOut, li (Reg::T0, 0xa0 ));
312
312
pushBytes (dataOut, jalr (Reg::T0));
313
- pushBytes (dataOut, addiu (Reg::T1, Reg::R0 , 0x44 ));
313
+ pushBytes (dataOut, li (Reg::T1, 0x44 ));
314
314
// Then jumps into the decompressed binary, restoring
315
315
// $ra if needed, so the decompressed binary can return
316
316
// to the caller gracefully.
317
317
pushBytes (dataOut, lui (Reg::T0, getHI (pc)));
318
- pushBytes (dataOut, addiu (Reg::T0, Reg::T0, getLO (pc)));
318
+ pushBytes (dataOut, addiu (Reg::T0, getLO (pc)));
319
319
pushBytes (dataOut, jr (Reg::T0));
320
320
if (options.resetstack ) {
321
- pushBytes (dataOut, ori (Reg::SP, Reg::SP, 0xfff0 ));
321
+ pushBytes (dataOut, ori (Reg::SP, 0xfff0 ));
322
322
} else {
323
323
pushBytes (dataOut, addiu (Reg::RA, Reg::T8, 0 ));
324
324
}
@@ -351,21 +351,21 @@ void PCSX::PS1Packer::pack(IO<File> src, IO<File> dest, uint32_t addr, uint32_t
351
351
// in RAM. Once it's done, it'll jump to the start of
352
352
// the compressed binary through FlushCache.
353
353
/* 0x24 */ stage2.push_back (lw (Reg::A3, 0 , Reg::A1));
354
- /* 0x28 */ stage2.push_back (addiu (Reg::A2, Reg::A2, -1 ));
354
+ /* 0x28 */ stage2.push_back (addiu (Reg::A2, -1 ));
355
355
/* 0x2c */ stage2.push_back (sw (Reg::A3, 0 , Reg::A0));
356
- /* 0x30 */ stage2.push_back (bne (Reg::A2, Reg::R0 , -16 ));
357
- /* 0x34 */ stage2.push_back (addiu (Reg::A0, Reg::A0, 4 ));
356
+ /* 0x30 */ stage2.push_back (bnez (Reg::A2, -16 ));
357
+ /* 0x34 */ stage2.push_back (addiu (Reg::A0, 4 ));
358
358
/* 0x38 */ stage2.push_back (j (0xa0 ));
359
- /* 0x3c */ stage2.push_back (addiu (Reg::T1, Reg::R0 , 0x44 ));
359
+ /* 0x3c */ stage2.push_back (li (Reg::T1, 0x44 ));
360
360
// This is actually the entry point.
361
361
/* 0x40 */ stage2.push_back (mtc0 (Reg::R0, 7 ));
362
362
/* 0x44 */ stage2.push_back (lui (Reg::A0, compLoad >> 16 ));
363
363
if ((compLoad & 0xffff ) != 0 ) {
364
- /* 0x48 */ stage2.push_back (ori (Reg::A0, Reg::A0, compLoad));
364
+ /* 0x48 */ stage2.push_back (ori (Reg::A0, compLoad));
365
365
}
366
366
/* 0x4c */ stage2.push_back (lui (Reg::RA, newPC >> 16 ));
367
367
if ((newPC & 0xffff ) != 0 ) {
368
- /* 0x50 */ stage2.push_back (ori (Reg::RA, Reg::RA, newPC));
368
+ /* 0x50 */ stage2.push_back (ori (Reg::RA, newPC & 0xffff ));
369
369
}
370
370
/* 0x54 */ stage2.push_back (lui (Reg::A1, 0xbf00 ));
371
371
/* 0x58 */ stage2.push_back (j (0x24 ));
@@ -376,7 +376,7 @@ void PCSX::PS1Packer::pack(IO<File> src, IO<File> dest, uint32_t addr, uint32_t
376
376
// need roughly 3 or 4 instructions.
377
377
stage2.push_back (lui (Reg::V0, newPC >> 16 ));
378
378
if ((newPC & 0xffff ) != 0 ) {
379
- stage2.push_back (ori (Reg::V0, Reg::V0, newPC & 0xffff ));
379
+ stage2.push_back (ori (Reg::V0, newPC & 0xffff ));
380
380
}
381
381
stage2.push_back (jr (Reg::V0));
382
382
stage2.push_back (mtc0 (Reg::R0, 7 ));
@@ -408,7 +408,7 @@ void PCSX::PS1Packer::pack(IO<File> src, IO<File> dest, uint32_t addr, uint32_t
408
408
// Break on writes and/or exec, to call our break handler which we
409
409
// will place in memory next.
410
410
pushBytes (header, mtc0 (Reg::R0, 7 ));
411
- pushBytes (header, addiu (Reg::T2, Reg::R0 , -1 ));
411
+ pushBytes (header, li (Reg::T2, -1 ));
412
412
pushBytes (header, lui (Reg::T1, 0x8003 ));
413
413
pushBytes (header, lui (Reg::T0, 0b1100101010000000 ));
414
414
pushBytes (header, mtc0 (Reg::T2, 11 ));
@@ -430,7 +430,7 @@ void PCSX::PS1Packer::pack(IO<File> src, IO<File> dest, uint32_t addr, uint32_t
430
430
pushBytes (header, lui (Reg::T0, b >> 16 ));
431
431
uint16_t rest = b;
432
432
if (rest != 0 ) {
433
- pushBytes (header, ori (Reg::T0, Reg::T0, rest));
433
+ pushBytes (header, ori (Reg::T0, rest));
434
434
}
435
435
last = sw (Reg::T0, base, Reg::R0);
436
436
}
0 commit comments