mirror of
https://github.com/notwa/mm
synced 2024-11-04 22:39:02 -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_before = 0x0C0283EE,
|
||||
},
|
||||
['O EUDB MQ'] = {
|
||||
inject_addr = 0x700000,
|
||||
inject_maxlen = 0x100000,
|
||||
ow_addr = 0x0C6940,
|
||||
ow_before = 0x0C03151F,
|
||||
},
|
||||
}
|
||||
|
||||
local header = [[
|
||||
|
@ -89,10 +95,13 @@ function inject(fn)
|
|||
assemble(asm_path, write, {unsafe=true, offset=true_offset + length})
|
||||
|
||||
printf("length: %i words", length/4)
|
||||
--[[
|
||||
-- FIXME: this only works properly when the asm doesn't use any .orgs
|
||||
if length > inject_maxlen then
|
||||
print("Assembly too large!")
|
||||
return
|
||||
end
|
||||
--]]
|
||||
|
||||
for pos, val in pairs(inject_bytes) do
|
||||
W1(pos, val)
|
||||
|
@ -114,7 +123,11 @@ function inject(fn)
|
|||
end
|
||||
|
||||
if oot then
|
||||
inject('spawn oot.asm')
|
||||
if version == 'O EUDB MQ' then
|
||||
inject('print.asm')
|
||||
else
|
||||
inject('spawn oot.asm')
|
||||
end
|
||||
else
|
||||
if version == 'M JP10' or version == 'M JP11' then
|
||||
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…
Reference in a new issue