1
0
Fork 0
mirror of https://github.com/notwa/mm synced 2024-05-05 08:33:23 -07:00
mm/asm/spawn.asm

169 lines
3.2 KiB
NASM

[button_L]: 0x0020
[button_R]: 0x0010
[button_any]: 0x0F20
[min_actor_no]: 0
[hold_delay_amount]: 3
spawn:
push 4, s0, s1, s2, s3, s4, ra,
li t1, @global_context
lhu s0, anum
lw s1, hold_delay
lhu s2, @buttons_offset(t1)
lhu s3, avar
lw s4, selected
// set selected
// andi t2, s2, @button_R
srl s4, s2, 4
andi s4, 1
// handle hold delay
andi t4, s2, @button_any
bnez t4, +
addi s1, s1, 1
li s1, 0
+:
beqi s1, 1, +
nop
subi t4, s1, @hold_delay_amount
bltz t4, return
nop
+: // handle dpad
bnez s4, +
mov a1, s2
call dpad_control, s0, a1
mov s0, v0
b ++
nop
+:
call dpad_control, s3, a1
andi s3, v0, 0xFFFF
+: // set min/max on actor number
subi t4, s0, @min_actor_no
bgez t4, +
nop
li s0, @max_actor_no
+:
subi t4, s0, @max_actor_no
blez t4, +
nop
li s0, @min_actor_no
+: // spawn
andi t3, s2, @button_L
beqz t3, return
nop
mov a0, s0
mov a1, s3
bal simple_spawn
nop
return:
// render actor number
call simple_text, 0x000F001B, 0x88CCFFFF, fmt, s0
// render actor variable
call simple_text, 0x0014001B, 0xFFCC88FF, fmt, s3
// done
sh s0, anum
sw s1, hold_delay
sh s3, avar
sw s4, selected
ret 4, s0, s1, s2, s3, s4, ra,
.word 0xDEADBEEF
.word textdata
anum:
.word 0
avar:
.word 0
selected:
.word 0
fmt:
.asciiz "%04X"
.align
/* old version that didn't account for negative arguments
object_index_hook:
push 4, 1, ra
mov t0, a0
lbu t1, 8(a0) // remaining items
cl v0
sll a1, 0x10
sra a1, 0x10
abs a1
-:
lhu t2, 12(t0) // item's object number
abs t2
beq a1, t2, +
subi t1, 1
addiu v0, 1
bnez t1, -
addi t0, 68
call @object_spawn, a0, a1
; subiu v0, r0, -1 // original code
+:
ret 4, 1, ra
*/
; based on game code
object_index_hook:
// a0: object table
// a1: object number
sll t1, a1, 0x10
sra t1, 0x10
lbu t3, 8(a0)
cl v0
mov t2, a0
blez t3, +give_up ; interesting: give up if object number read is <= 0
-:
lh t0, 12(t2)
abs t0
bne t0, t1, +
nop
jr ra
nop
+:
addiu v0, 1
blt v0, t3, - ; if we still have some left... v0 is number of objects
addiu t2, 68
+give_up:
; ; dump failed object number to ram
; la t0, DEBUG
; lw t2, (t0)
; addiu t2, 1
; sw t2, (t0)
; sll t1, t2, 2
; addu t1, t0
; sw a1, (t1)
; beqi t2, 2, +
push 4, s0, s1, 1, ra
mov s1, a0
lbu s0, 9(s1)
call @object_spawn, a0, a1
sb s0, 9(s1)
ret 4, s0, s1, 1, ra
+:
jr
li v0, -1
/*
.word 0xDEADBEEF
DEBUG:
.skip 0x100 0
*/
.include "dpad control.asm"
.include "simple spawn.asm"
.include "simple text.asm"
hold_delay:
.word 0
.org @object_index
// a0: object table
// a1: object number
// we have space for 22 instructions (on debug, 23 on 1.0?)
j object_index_hook
nop