mirror of
https://github.com/notwa/mm
synced 2025-02-05 13:23:23 -08:00
hook debug printing in OoT debug rom
This commit is contained in:
parent
bb5c778b0f
commit
488aeb9bd0
3 changed files with 85 additions and 1 deletions
|
@ -23,6 +23,12 @@ local injection_points = {
|
||||||
ow_addr = 0x0A19C8,
|
ow_addr = 0x0A19C8,
|
||||||
ow_before = 0x0C0283EE,
|
ow_before = 0x0C0283EE,
|
||||||
},
|
},
|
||||||
|
['O EUDB MQ'] = {
|
||||||
|
inject_addr = 0x700000,
|
||||||
|
inject_maxlen = 0x100000,
|
||||||
|
ow_addr = 0x0C6940,
|
||||||
|
ow_before = 0x0C03151F,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
local header = [[
|
local header = [[
|
||||||
|
@ -89,10 +95,13 @@ function inject(fn)
|
||||||
assemble(asm_path, write, {unsafe=true, offset=true_offset + length})
|
assemble(asm_path, write, {unsafe=true, offset=true_offset + length})
|
||||||
|
|
||||||
printf("length: %i words", length/4)
|
printf("length: %i words", length/4)
|
||||||
|
--[[
|
||||||
|
-- FIXME: this only works properly when the asm doesn't use any .orgs
|
||||||
if length > inject_maxlen then
|
if length > inject_maxlen then
|
||||||
print("Assembly too large!")
|
print("Assembly too large!")
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
--]]
|
||||||
|
|
||||||
for pos, val in pairs(inject_bytes) do
|
for pos, val in pairs(inject_bytes) do
|
||||||
W1(pos, val)
|
W1(pos, val)
|
||||||
|
@ -114,7 +123,11 @@ function inject(fn)
|
||||||
end
|
end
|
||||||
|
|
||||||
if oot then
|
if oot then
|
||||||
|
if version == 'O EUDB MQ' then
|
||||||
|
inject('print.asm')
|
||||||
|
else
|
||||||
inject('spawn oot.asm')
|
inject('spawn oot.asm')
|
||||||
|
end
|
||||||
else
|
else
|
||||||
if version == 'M JP10' or version == 'M JP11' then
|
if version == 'M JP10' or version == 'M JP11' then
|
||||||
inject('spawn mm early.asm')
|
inject('spawn mm early.asm')
|
||||||
|
|
40
Lua/inject/print.asm
Normal file
40
Lua/inject/print.asm
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
// translates calls to 800021F8
|
||||||
|
// to copy strings to memory instead
|
||||||
|
// for Lua to later pick up on
|
||||||
|
|
||||||
|
// reset buffer position in our per-frame hook
|
||||||
|
la t0, buffer
|
||||||
|
sw t0, buffer_pos
|
||||||
|
// and set the string to null
|
||||||
|
sb r0, 0(t0)
|
||||||
|
jr
|
||||||
|
nop
|
||||||
|
|
||||||
|
// keep track of where we are in the buffer
|
||||||
|
buffer_pos:
|
||||||
|
.word 0
|
||||||
|
|
||||||
|
// set up 2048 bytes of text buffer
|
||||||
|
// each line is 32 words, or 128 bytes
|
||||||
|
// i don't think this is enough, actually
|
||||||
|
.align 8
|
||||||
|
buffer:
|
||||||
|
.word 0
|
||||||
|
|
||||||
|
// overwrite (not hook) the debug printing function
|
||||||
|
.org 0x800021B0
|
||||||
|
// a0: unknown
|
||||||
|
// a1: char *msg
|
||||||
|
// a2: size_t len
|
||||||
|
lw t0, buffer_pos
|
||||||
|
copy_loop:
|
||||||
|
lb t1, 0(a1)
|
||||||
|
sb t1, 0(t0)
|
||||||
|
addi t0, t0, 1
|
||||||
|
addi a1, a1, 1
|
||||||
|
subi a2, a2, 1
|
||||||
|
bne a2, r0, copy_loop
|
||||||
|
sb r0, 0(t0) // null terminate
|
||||||
|
sw t0, buffer_pos
|
||||||
|
jr
|
||||||
|
nop
|
31
Lua/print.lua
Normal file
31
Lua/print.lua
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
require = require "depend"
|
||||||
|
require "boilerplate"
|
||||||
|
|
||||||
|
local buffer = 0x700070
|
||||||
|
|
||||||
|
local vfc = A(0x168960, 4)
|
||||||
|
|
||||||
|
while true do
|
||||||
|
local pos = buffer
|
||||||
|
local str = ''
|
||||||
|
while true do
|
||||||
|
local b = R1(pos)
|
||||||
|
pos = pos + 1
|
||||||
|
if b == 0 then
|
||||||
|
break
|
||||||
|
end
|
||||||
|
if b < 0x80 then
|
||||||
|
str = str..string.char(b)
|
||||||
|
else
|
||||||
|
str = str..'?'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
print(str)
|
||||||
|
local old = vfc()
|
||||||
|
for i=1,30 do
|
||||||
|
emu.frameadvance()
|
||||||
|
local new = vfc()
|
||||||
|
if new ~= old then break end
|
||||||
|
end
|
||||||
|
console.clear() -- delete this if you want
|
||||||
|
end
|
Loading…
Add table
Reference in a new issue