mirror of
https://github.com/notwa/mm
synced 2025-02-05 05:23:22 -08:00
work on onscreen actor num/var control
This commit is contained in:
parent
c5eaf96e1a
commit
d80d9db0b2
7 changed files with 180 additions and 135 deletions
|
@ -8,8 +8,15 @@ local injection_points = {
|
||||||
['M US10'] = {
|
['M US10'] = {
|
||||||
inject_addr = 0x780000,
|
inject_addr = 0x780000,
|
||||||
inject_maxlen = 0x5A800,
|
inject_maxlen = 0x5A800,
|
||||||
ow_addr = 0x1749D0,
|
-- main rendering loop:
|
||||||
ow_before = 0x0C05CEC6,
|
-- the only other function (that literally just loads and returns)
|
||||||
|
--ow_addr = 0x1749D0,
|
||||||
|
--ow_before = 0x0C05CEC6,
|
||||||
|
-- just after the JALR in the actor(?) rendering loop
|
||||||
|
-- problem is we do processing AFTER it's all rendered
|
||||||
|
-- this causes an extra frame of delay for ingame changes
|
||||||
|
ow_addr = 0x1737C4,
|
||||||
|
ow_before = 0x0C05CD50,
|
||||||
},
|
},
|
||||||
['M JP10'] = {
|
['M JP10'] = {
|
||||||
inject_addr = 0x780000,
|
inject_addr = 0x780000,
|
||||||
|
|
19
Lua/inject/dpad control.asm
Normal file
19
Lua/inject/dpad control.asm
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
dpad_control:
|
||||||
|
// a0: number you want to control
|
||||||
|
// a1: button state
|
||||||
|
// v0: number after modifications
|
||||||
|
la t1, dpad_values
|
||||||
|
srl t0, a1, 8
|
||||||
|
andi t0, t0, 0xF
|
||||||
|
add t0, t0, t1
|
||||||
|
lb t0, 0(t0)
|
||||||
|
jr
|
||||||
|
add v0, a0, t0
|
||||||
|
|
||||||
|
dpad_values:
|
||||||
|
// use table of values for branchless operation
|
||||||
|
.byte 0, 1, -1, 0
|
||||||
|
.byte -10, -9, -11, -10
|
||||||
|
.byte +10, +11, +9, +10
|
||||||
|
.byte 0, 1, -1, 0
|
||||||
|
.align
|
|
@ -11,7 +11,7 @@
|
||||||
[SetTextXY]: 0x800FB41C
|
[SetTextXY]: 0x800FB41C
|
||||||
[SetTextString]: 0x800FBCB4
|
[SetTextString]: 0x800FBCB4
|
||||||
[TxtPrinter]: 0x800FBB60
|
[TxtPrinter]: 0x800FBB60
|
||||||
[InitTxtStruct]: 0x800FBB8C
|
[InitTxtStruct]: 0x800FBB8C // unused here; we set it up inline
|
||||||
[DoTxtStruct]: 0x800FBC1C
|
[DoTxtStruct]: 0x800FBC1C
|
||||||
[UpdateTxtStruct]: 0x800FBC64
|
[UpdateTxtStruct]: 0x800FBC64
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@
|
||||||
li a1, 0x88CCFFFF // rgba
|
li a1, 0x88CCFFFF // rgba
|
||||||
la a2, fmt
|
la a2, fmt
|
||||||
la a3, buffer
|
la a3, buffer
|
||||||
jal easytext
|
jal simple_text
|
||||||
nop
|
nop
|
||||||
// reset buffer position in our per-frame hook
|
// reset buffer position in our per-frame hook
|
||||||
la t0, buffer
|
la t0, buffer
|
||||||
|
@ -40,66 +40,7 @@ str:
|
||||||
.byte 0x68,0x65,0x79,0x00 // hey
|
.byte 0x68,0x65,0x79,0x00 // hey
|
||||||
.align
|
.align
|
||||||
|
|
||||||
textdata:
|
.include "simple text.asm"
|
||||||
.word 0, 0, 0, 0, 0
|
|
||||||
easytext:
|
|
||||||
// a0: xxxxyyyy
|
|
||||||
// a1: rrggbbaa
|
|
||||||
// a2: printf formatting string
|
|
||||||
// a3: first argument for format string (optional)
|
|
||||||
// TODO: support more than 4 args
|
|
||||||
push 4, 1, s0, s1, ra
|
|
||||||
|
|
||||||
la s0, textdata
|
|
||||||
|
|
||||||
sw a0, 32(sp)
|
|
||||||
sw a1, 36(sp)
|
|
||||||
sw a2, 40(sp)
|
|
||||||
sw a3, 44(sp)
|
|
||||||
|
|
||||||
li t0, @TxtPrinter
|
|
||||||
sw t0, 0(s0) // printer
|
|
||||||
sw r0, 4(s0) // dlist end
|
|
||||||
sh r0, 8(s0) // x
|
|
||||||
sh r0, 10(s0) // y
|
|
||||||
li t0, 0xC
|
|
||||||
sw t0, 12(s0) // unknown
|
|
||||||
sw r0, 16(s0) // color
|
|
||||||
|
|
||||||
li t0, @global_context
|
|
||||||
lw s1, 0(t0)
|
|
||||||
lw t2, @dlist_offset(s1)
|
|
||||||
|
|
||||||
mov a0, s0
|
|
||||||
mov a1, t2
|
|
||||||
jal @DoTxtStruct
|
|
||||||
nop
|
|
||||||
|
|
||||||
lbu a1, 36(sp)
|
|
||||||
lbu a2, 37(sp)
|
|
||||||
lbu a3, 38(sp)
|
|
||||||
lbu t1, 39(sp)
|
|
||||||
sw t1, 0x10(sp)
|
|
||||||
jal @SetTextRGBA
|
|
||||||
mov a0, s0
|
|
||||||
|
|
||||||
lh a1, 32(sp)
|
|
||||||
lh a2, 34(sp)
|
|
||||||
jal @SetTextXY
|
|
||||||
mov a0, s0
|
|
||||||
|
|
||||||
lw a1, 40(sp)
|
|
||||||
lw a2, 44(sp)
|
|
||||||
jal @SetTextString
|
|
||||||
mov a0, s0
|
|
||||||
|
|
||||||
mov a0, s0
|
|
||||||
jal @UpdateTxtStruct
|
|
||||||
nop
|
|
||||||
|
|
||||||
sw v0, @dlist_offset(s1)
|
|
||||||
|
|
||||||
jpop 4, 1, s0, s1, ra
|
|
||||||
|
|
||||||
ObjectSpawnWrap:
|
ObjectSpawnWrap:
|
||||||
// keep track of which objects we're spawning
|
// keep track of which objects we're spawning
|
||||||
|
|
34
Lua/inject/simple spawn.asm
Normal file
34
Lua/inject/simple spawn.asm
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
simple_spawn:
|
||||||
|
// a0: actor number
|
||||||
|
// a1: actor variable
|
||||||
|
push 4, 9, ra
|
||||||
|
mov a2, a0
|
||||||
|
mov t4, a1
|
||||||
|
li a1, @global_context
|
||||||
|
addi a0, a1, @actor_spawn_offset
|
||||||
|
li t0, @link_actor
|
||||||
|
lw t1, @actor_x(t0)
|
||||||
|
lw t2, @actor_y(t0)
|
||||||
|
lw t3, @actor_z(t0)
|
||||||
|
mov a3, t1 // X position
|
||||||
|
sw t2, 0x10(sp) // Y position
|
||||||
|
sw t3, 0x14(sp) // Z position
|
||||||
|
|
||||||
|
li t9, 0x0
|
||||||
|
sw t9, 0x18(sp) // rotation?
|
||||||
|
lhu t7, @actor_horiz_angle(t0)
|
||||||
|
sw t7, 0x1C(sp) // horizontal rotation
|
||||||
|
li t9, 0x0
|
||||||
|
sw t9, 0x20(sp) // rotation?
|
||||||
|
|
||||||
|
sw t4, 0x24(sp) // actor variable
|
||||||
|
|
||||||
|
li t9, 0x0000007F
|
||||||
|
sw t9, 0x28(sp) // unknown
|
||||||
|
li t9, 0x000003FF
|
||||||
|
sw t9, 0x2C(sp) // spawn time? (probably MM only)
|
||||||
|
li t9, 0x00000000
|
||||||
|
sw t9, 0x30(sp) // unknown
|
||||||
|
jal @actor_spawn
|
||||||
|
nop
|
||||||
|
jpop 4, 9, ra
|
61
Lua/inject/simple text.asm
Normal file
61
Lua/inject/simple text.asm
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
textdata:
|
||||||
|
.word 0, 0, 0, 0, 0
|
||||||
|
simple_text:
|
||||||
|
// a0: xxxxyyyy
|
||||||
|
// a1: rrggbbaa
|
||||||
|
// a2: printf formatting string
|
||||||
|
// a3: first argument for format string (optional)
|
||||||
|
// TODO: support more than 4 args
|
||||||
|
push 4, 1, s0, s1, ra
|
||||||
|
|
||||||
|
la s0, textdata
|
||||||
|
|
||||||
|
sw a0, 32(sp)
|
||||||
|
sw a1, 36(sp)
|
||||||
|
sw a2, 40(sp)
|
||||||
|
sw a3, 44(sp)
|
||||||
|
|
||||||
|
li t0, @TxtPrinter
|
||||||
|
sw t0, 0(s0) // printer
|
||||||
|
sw r0, 4(s0) // dlist end
|
||||||
|
sh r0, 8(s0) // x
|
||||||
|
sh r0, 10(s0) // y
|
||||||
|
li t0, 0xC
|
||||||
|
sw t0, 12(s0) // unknown
|
||||||
|
sw r0, 16(s0) // color
|
||||||
|
|
||||||
|
li t0, @global_context
|
||||||
|
lw s1, 0(t0)
|
||||||
|
lw t2, @dlist_offset(s1)
|
||||||
|
|
||||||
|
mov a0, s0
|
||||||
|
mov a1, t2
|
||||||
|
jal @DoTxtStruct
|
||||||
|
nop
|
||||||
|
|
||||||
|
lbu a1, 36(sp)
|
||||||
|
lbu a2, 37(sp)
|
||||||
|
lbu a3, 38(sp)
|
||||||
|
lbu t1, 39(sp)
|
||||||
|
sw t1, 0x10(sp)
|
||||||
|
jal @SetTextRGBA
|
||||||
|
mov a0, s0
|
||||||
|
|
||||||
|
lh a1, 32(sp)
|
||||||
|
lh a2, 34(sp)
|
||||||
|
jal @SetTextXY
|
||||||
|
mov a0, s0
|
||||||
|
|
||||||
|
lw a1, 40(sp)
|
||||||
|
lw a2, 44(sp)
|
||||||
|
jal @SetTextString
|
||||||
|
mov a0, s0
|
||||||
|
|
||||||
|
mov a0, s0
|
||||||
|
jal @UpdateTxtStruct
|
||||||
|
nop
|
||||||
|
|
||||||
|
sw v0, @dlist_offset(s1)
|
||||||
|
|
||||||
|
jpop 4, 1, s0, s1, ra
|
||||||
|
|
|
@ -19,6 +19,16 @@
|
||||||
[upgrades_offset]: 0xB8
|
[upgrades_offset]: 0xB8
|
||||||
[upgrades_2_offset]: 0xBA
|
[upgrades_2_offset]: 0xBA
|
||||||
|
|
||||||
|
[dlist_offset]: 0x2C0
|
||||||
|
|
||||||
|
[SetTextRGBA]: 0x800859BC
|
||||||
|
[SetTextXY]: 0x80085A2C
|
||||||
|
[SetTextString]: 0x800860D8
|
||||||
|
[TxtPrinter]: 0x80085FE4
|
||||||
|
[InitTxtStruct]: 0x80086010 // unused here; we set it up inline
|
||||||
|
[DoTxtStruct]: 0x8008606C
|
||||||
|
[UpdateTxtStruct]: 0x800860A0
|
||||||
|
|
||||||
.include "spawn.asm"
|
.include "spawn.asm"
|
||||||
|
|
||||||
[whatever]: 0x807D0000 // stupid hack since i can't store/restore PC (not yet!)
|
[whatever]: 0x807D0000 // stupid hack since i can't store/restore PC (not yet!)
|
||||||
|
|
|
@ -7,19 +7,13 @@
|
||||||
|
|
||||||
[hold_delay_amount]: 3
|
[hold_delay_amount]: 3
|
||||||
|
|
||||||
push 4, s1, ra
|
push 4, s0, s1, s2, ra
|
||||||
li t0, @link_save
|
li t0, @link_save
|
||||||
li t1, @global_context
|
li t1, @global_context
|
||||||
// give max rupee upgrade (set bit 13, clear bit 12 of lower halfword)
|
lhu s2, @buttons_offset(t1)
|
||||||
lhu t2, @upgrades_2_offset(t0)
|
lhu s0, anum
|
||||||
ori t2, t2, 0x2000
|
|
||||||
andi t2, t2, 0xEFFF
|
|
||||||
sh t2, @upgrades_2_offset(t0)
|
|
||||||
//
|
|
||||||
lhu t2, @buttons_offset(t1)
|
|
||||||
lhu t9, @rupees_offset(t0)
|
|
||||||
lw s1, hold_delay
|
lw s1, hold_delay
|
||||||
andi t4, t2, @button_any
|
andi t4, s2, @button_any
|
||||||
bnez t4, +
|
bnez t4, +
|
||||||
addi s1, s1, 1
|
addi s1, s1, 1
|
||||||
li s1, 0
|
li s1, 0
|
||||||
|
@ -30,80 +24,59 @@
|
||||||
bltz t4, return
|
bltz t4, return
|
||||||
nop
|
nop
|
||||||
+:
|
+:
|
||||||
andi t3, t2, @button_D_right
|
mov a0, s0
|
||||||
beqz t3, +
|
jal dpad_control
|
||||||
nop
|
mov a1, s2
|
||||||
addi t9, t9, 1
|
mov s0, v0
|
||||||
+:
|
|
||||||
andi t3, t2, @button_D_left
|
subi t4, s0, 1
|
||||||
beqz t3, +
|
|
||||||
nop
|
|
||||||
subi t9, t9, 1
|
|
||||||
+:
|
|
||||||
andi t3, t2, @button_D_up
|
|
||||||
beqz t3, +
|
|
||||||
nop
|
|
||||||
addi t9, t9, 10
|
|
||||||
+:
|
|
||||||
andi t3, t2, @button_D_down
|
|
||||||
beqz t3, +
|
|
||||||
nop
|
|
||||||
subi t9, t9, 10
|
|
||||||
+:
|
|
||||||
subi t4, t9, 1
|
|
||||||
bgez t4, +
|
bgez t4, +
|
||||||
nop
|
nop
|
||||||
li t9, @max_actor_no
|
li s0, @max_actor_no
|
||||||
+:
|
+:
|
||||||
subi t4, t9, @max_actor_no
|
subi t4, s0, @max_actor_no
|
||||||
blez t4, +
|
blez t4, +
|
||||||
nop
|
nop
|
||||||
li t9, 1
|
li s0, 1
|
||||||
+:
|
+:
|
||||||
sh t9, @rupees_offset(t0)
|
sh s0, anum
|
||||||
andi t3, t2, @button_L
|
andi t3, s2, @button_L
|
||||||
beqz t3, return
|
beqz t3, return
|
||||||
nop
|
nop
|
||||||
mov a0, t9
|
mov a0, s0
|
||||||
|
lhu a1, avar
|
||||||
bal simple_spawn
|
bal simple_spawn
|
||||||
nop
|
nop
|
||||||
return:
|
return:
|
||||||
sw s1, hold_delay
|
sw s1, hold_delay
|
||||||
jpop 4, s1, ra
|
// render actor number
|
||||||
|
li a0, 0x0001001C // xy
|
||||||
simple_spawn: // args: a0 (actor to spawn)
|
li a1, 0x88CCFFFF // rgba
|
||||||
push 4, 9, ra
|
la a2, fmt
|
||||||
mov a2, a0
|
mov a3, s0
|
||||||
li a1, @global_context
|
jal simple_text
|
||||||
addi a0, a1, @actor_spawn_offset
|
|
||||||
li t0, @link_actor
|
|
||||||
lw t1, @actor_x(t0)
|
|
||||||
lw t2, @actor_y(t0)
|
|
||||||
lw t3, @actor_z(t0)
|
|
||||||
mov a3, t1 // X position
|
|
||||||
sw t2, 0x10(sp) // Y position
|
|
||||||
sw t3, 0x14(sp) // Z position
|
|
||||||
|
|
||||||
li t9, 0x0
|
|
||||||
sw t9, 0x18(sp) // rotation?
|
|
||||||
lhu t7, @actor_horiz_angle(t0)
|
|
||||||
sw t7, 0x1C(sp) // horizontal rotation
|
|
||||||
li t9, 0x0
|
|
||||||
sw t9, 0x20(sp) // rotation?
|
|
||||||
|
|
||||||
// lhu t7, @actor_horiz_angle(t0)
|
|
||||||
li t7, 0
|
|
||||||
sw t7, 0x24(sp) // actor variable
|
|
||||||
|
|
||||||
li t9, 0x0000007F
|
|
||||||
sw t9, 0x28(sp) // unknown
|
|
||||||
li t9, 0x000003FF
|
|
||||||
sw t9, 0x2C(sp) // spawn time? (probably MM only)
|
|
||||||
li t9, 0x00000000
|
|
||||||
sw t9, 0x30(sp) // unknown
|
|
||||||
jal @actor_spawn
|
|
||||||
nop
|
nop
|
||||||
jpop 4, 9, ra
|
// render actor variable
|
||||||
|
li a0, 0x0006001C // xy
|
||||||
|
li a1, 0xFFCC88FF // rgba
|
||||||
|
la a2, fmt
|
||||||
|
lhu a3, avar
|
||||||
|
jal simple_text
|
||||||
|
nop
|
||||||
|
jpop 4, s0, s1, s2, ra
|
||||||
|
|
||||||
|
anum:
|
||||||
|
.word 0
|
||||||
|
avar:
|
||||||
|
.word 0
|
||||||
|
|
||||||
|
fmt:
|
||||||
|
.byte 0x25,0x30,0x34,0x58,0x00 // %04X
|
||||||
|
.align
|
||||||
|
|
||||||
|
.include "dpad control.asm"
|
||||||
|
.include "simple spawn.asm"
|
||||||
|
.include "simple text.asm"
|
||||||
|
|
||||||
hold_delay:
|
hold_delay:
|
||||||
.word 0
|
.word 0
|
||||||
|
|
Loading…
Add table
Reference in a new issue