mirror of
https://github.com/notwa/mm
synced 2024-11-04 22:49:03 -08:00
allow dumb injection
This commit is contained in:
parent
f73760f200
commit
25cbd24a2e
1 changed files with 34 additions and 18 deletions
|
@ -4,6 +4,8 @@ local addrs = require "addrs"
|
|||
require "messages"
|
||||
local assemble = require "lips"
|
||||
|
||||
local unpack = unpack or table.unpack
|
||||
|
||||
local injection_points = {
|
||||
['M US10'] = {
|
||||
inject_addr = 0x780000,
|
||||
|
@ -46,6 +48,13 @@ local injection_points = {
|
|||
}
|
||||
injection_points['O JP10'] = injection_points['O US10']
|
||||
|
||||
local no_point = {
|
||||
inject_addr = 0,
|
||||
inject_maxlen = 0x800000,
|
||||
ow_addr = 0,
|
||||
ow_before = 0,
|
||||
}
|
||||
|
||||
local hook = [[
|
||||
[hooked]: 0x%08X
|
||||
// note: this will fail when the hooked function takes args on stack
|
||||
|
@ -66,18 +75,18 @@ local hook = [[
|
|||
start:
|
||||
]]
|
||||
|
||||
local function inject(fn)
|
||||
local function inject(fn, dumb)
|
||||
local asm_dir = bizstring and 'inject/' or './mm/Lua/inject/'
|
||||
local asm_path = asm_dir..fn
|
||||
|
||||
local point = injection_points[version]
|
||||
local point = dumb and no_point or injection_points[version]
|
||||
if point == nil then
|
||||
print("Sorry, inject.lua is unimplemented for your game version.")
|
||||
return
|
||||
end
|
||||
|
||||
-- seemingly unused region of memory
|
||||
local inject_addr = point.inject_addr
|
||||
local inject_addr = point.inject_addr % 0x80000000
|
||||
-- how much room we have to work with
|
||||
local inject_maxlen = point.inject_maxlen
|
||||
-- the jal instruction to overwrite with our hook
|
||||
|
@ -89,7 +98,7 @@ local function inject(fn)
|
|||
|
||||
-- encode our jal instruction
|
||||
local ow_after = 0x0C000000 + math.floor(inject_addr/4)
|
||||
if R4(ow_addr) ~= ow_before and R4(ow_addr) ~= ow_after then
|
||||
if not dumb and R4(ow_addr) ~= ow_before and R4(ow_addr) ~= ow_after then
|
||||
print("Can't inject -- game code is different!")
|
||||
return
|
||||
end
|
||||
|
@ -117,12 +126,16 @@ local function inject(fn)
|
|||
|
||||
-- offset assembly labels so they work properly, and assemble!
|
||||
local true_offset = 0x80000000 + inject_addr
|
||||
assemble(hook, write, {unsafe=true, offset=true_offset})
|
||||
assemble(asm_path, write, {unsafe=true, offset=true_offset + size})
|
||||
if not dumb then
|
||||
assemble(hook, write, {unsafe=true, offset=true_offset})
|
||||
assemble(asm_path, write, {unsafe=true, offset=true_offset + size})
|
||||
else
|
||||
assemble(asm_path, write, {unsafe=true, offset=true_offset})
|
||||
end
|
||||
|
||||
print_deferred()
|
||||
printf("size: %i words", size/4)
|
||||
if cons_pos >= inject_end then
|
||||
if not dumb and cons_pos >= inject_end then
|
||||
print("Assembly too large!")
|
||||
print("The game will probably crash.")
|
||||
end
|
||||
|
@ -131,9 +144,11 @@ local function inject(fn)
|
|||
W1(pos, val)
|
||||
end
|
||||
|
||||
-- finally, write our new jump over the original
|
||||
printf('%08X: %08X', ow_addr, ow_after)
|
||||
W4(ow_addr, ow_after)
|
||||
if not dumb then
|
||||
-- finally, write our new jump over the original
|
||||
printf('%08X: %08X', ow_addr, ow_after)
|
||||
W4(ow_addr, ow_after)
|
||||
end
|
||||
|
||||
-- force code cache to be reloaded
|
||||
if bizstring then
|
||||
|
@ -146,17 +161,18 @@ local function inject(fn)
|
|||
end
|
||||
|
||||
local asms = {
|
||||
['O US10'] = 'spawn oot.asm',
|
||||
['O JP10'] = 'spawn oot.asm',
|
||||
['O EUDB MQ'] = 'widescreen.asm',
|
||||
['O US10'] = {'spawn oot.asm'},
|
||||
['O JP10'] = {'spawn oot.asm'},
|
||||
['O EUDB MQ'] = {'widescreen.asm'},
|
||||
-- ['O EUDB MQ'] = {'widescreen-inline.asm', true},
|
||||
|
||||
['M US10'] = 'beta.asm',
|
||||
['M JP10'] = 'spawn mm early.asm',
|
||||
['M US10'] = {'beta.asm'},
|
||||
['M JP10'] = {'spawn mm early.asm'},
|
||||
}
|
||||
|
||||
local asm = asms[version]
|
||||
if asm then
|
||||
inject(asm)
|
||||
local args = asms[version]
|
||||
if args then
|
||||
inject(unpack(args))
|
||||
else
|
||||
print('no appropriate assembly found for this game')
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue