mirror of
https://github.com/notwa/mm
synced 2024-11-05 02:39:02 -08:00
implement some basic branch pseudo-instructions
This commit is contained in:
parent
c0be8f2ef2
commit
02fc5395a0
2 changed files with 52 additions and 42 deletions
|
@ -409,6 +409,8 @@ local instructions = {
|
||||||
-- pseudo-instructions
|
-- pseudo-instructions
|
||||||
B = {4, 'r', '00o'}, -- BEQ R0, R0, offset
|
B = {4, 'r', '00o'}, -- BEQ R0, R0, offset
|
||||||
BAL = {1, 'r', '0Co', 17}, -- BGEZAL R0, offset
|
BAL = {1, 'r', '0Co', 17}, -- BGEZAL R0, offset
|
||||||
|
BEQZ = {4, 'sr', 's0o'}, -- BEQ RS, R0, offset
|
||||||
|
BNEZ = {5, 'sr', 's0o'}, -- BNE RS, R0, offset
|
||||||
CL = {0, 'd', '00d0C', 37}, -- OR RD, R0, R0
|
CL = {0, 'd', '00d0C', 37}, -- OR RD, R0, R0
|
||||||
MOV = {0, 'ds', 's0d0C', 37}, -- OR RD, RS, R0
|
MOV = {0, 'ds', 's0d0C', 37}, -- OR RD, RS, R0
|
||||||
NEG = {0, 'dt', '0td0C', 34}, -- SUB RD, R0, RT
|
NEG = {0, 'dt', '0td0C', 34}, -- SUB RD, R0, RT
|
||||||
|
@ -437,37 +439,18 @@ local instructions = {
|
||||||
ROL = {}, -- SLL, SRL, OR
|
ROL = {}, -- SLL, SRL, OR
|
||||||
ROR = {}, -- SRL, SLL, OR
|
ROR = {}, -- SRL, SLL, OR
|
||||||
|
|
||||||
SEQ = {},
|
SEQ = {}, SEQI = {}, SEQIU = {}, SEQU = {},
|
||||||
SEQI = {},
|
SGE = {}, SGEI = {}, SGEIU = {}, SGEU = {},
|
||||||
SEQIU = {},
|
SGT = {}, SGTI = {}, SGTIU = {}, SGTU = {},
|
||||||
SEQU = {},
|
SLE = {}, SLEI = {}, SLEIU = {}, SLEU = {},
|
||||||
SGE = {},
|
SNE = {}, SNEI = {}, SNEIU = {}, SNEU = {},
|
||||||
SGEI = {},
|
|
||||||
SGEIU = {},
|
|
||||||
SGEU = {},
|
|
||||||
SGT = {},
|
|
||||||
SGTI = {},
|
|
||||||
SGTIU = {},
|
|
||||||
SGTU = {},
|
|
||||||
SLE = {},
|
|
||||||
SLEI = {},
|
|
||||||
SLEIU = {},
|
|
||||||
SLEU = {},
|
|
||||||
SNE = {},
|
|
||||||
SNEI = {},
|
|
||||||
SNEIU = {},
|
|
||||||
SNEU = {},
|
|
||||||
|
|
||||||
BEQI = {},
|
BEQI = {},
|
||||||
BNEI = {},
|
BNEI = {},
|
||||||
BGE = {},
|
BGE = {}, BGEI = {},
|
||||||
BGEI = {},
|
BLE = {}, BLEI = {},
|
||||||
BLE = {},
|
BLT = {}, BLTI = {},
|
||||||
BLEI = {},
|
BGT = {}, BGTI = {},
|
||||||
BLT = {},
|
|
||||||
BLTI = {},
|
|
||||||
BGT = {},
|
|
||||||
BGTI = {},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
local all_instructions = {}
|
local all_instructions = {}
|
||||||
|
@ -1263,6 +1246,34 @@ function overrides.JR(self, name)
|
||||||
self:format_out(jr[3], jr[1], args, jr[4], jr[5])
|
self:format_out(jr[3], jr[1], args, jr[4], jr[5])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local branch_basics = {
|
||||||
|
BEQI = "BEQ",
|
||||||
|
BNEI = "BNE",
|
||||||
|
}
|
||||||
|
|
||||||
|
function overrides.BEQI(self, name)
|
||||||
|
local addiu = instructions['ADDIU']
|
||||||
|
local branch = instructions[branch_basics[name]]
|
||||||
|
local args = {}
|
||||||
|
local reg = self:register()
|
||||||
|
self:optional_comma()
|
||||||
|
args.immediate = self:const()
|
||||||
|
self:optional_comma()
|
||||||
|
args.offset = {'SIGNED', self:const('relative')}
|
||||||
|
|
||||||
|
if reg == 'AT' then
|
||||||
|
self:error('register cannot be AT in this pseudo-instruction')
|
||||||
|
end
|
||||||
|
|
||||||
|
args.rt = 'AT'
|
||||||
|
args.rs = 'R0'
|
||||||
|
self:format_out(addiu[3], addiu[1], args, addiu[4], addiu[5])
|
||||||
|
|
||||||
|
args.rs = reg
|
||||||
|
self:format_out(branch[3], branch[1], args, branch[4], branch[5])
|
||||||
|
end
|
||||||
|
overrides.BNEI = overrides.BEQI
|
||||||
|
|
||||||
function Parser:instruction()
|
function Parser:instruction()
|
||||||
local name = self.tok
|
local name = self.tok
|
||||||
local h = instructions[name]
|
local h = instructions[name]
|
||||||
|
|
|
@ -20,34 +20,33 @@
|
||||||
lhu t9, @rupees_offset(t0)
|
lhu t9, @rupees_offset(t0)
|
||||||
lw s1, hold_delay
|
lw s1, hold_delay
|
||||||
andi t4, t2, @button_any
|
andi t4, t2, @button_any
|
||||||
bne t4, r0, +
|
bnez t4, +
|
||||||
addi s1, s1, 1
|
addi s1, s1, 1
|
||||||
li s1, 0
|
li s1, 0
|
||||||
+:
|
+:
|
||||||
subi t4, s1, 1
|
beqi s1, 1, +
|
||||||
beq t4, r0, +
|
|
||||||
nop
|
nop
|
||||||
subi t4, s1, @hold_delay_amount
|
subi t4, s1, @hold_delay_amount
|
||||||
bltz t4, return
|
bltz t4, return
|
||||||
nop
|
nop
|
||||||
+:
|
+:
|
||||||
andi t3, t2, @button_D_up
|
andi t3, t2, @button_D_up
|
||||||
beq t3, r0, +
|
beqz t3, +
|
||||||
nop
|
nop
|
||||||
addi t9, t9, 1
|
addi t9, t9, 1
|
||||||
+:
|
+:
|
||||||
andi t3, t2, @button_D_down
|
andi t3, t2, @button_D_down
|
||||||
beq t3, r0, +
|
beqz t3, +
|
||||||
nop
|
nop
|
||||||
subi t9, t9, 1
|
subi t9, t9, 1
|
||||||
+:
|
+:
|
||||||
andi t3, t2, @button_D_right
|
andi t3, t2, @button_D_right
|
||||||
beq t3, r0, +
|
beqz t3, +
|
||||||
nop
|
nop
|
||||||
addi t9, t9, 10
|
addi t9, t9, 10
|
||||||
+:
|
+:
|
||||||
andi t3, t2, @button_D_left
|
andi t3, t2, @button_D_left
|
||||||
beq t3, r0, +
|
beqz t3, +
|
||||||
nop
|
nop
|
||||||
subi t9, t9, 10
|
subi t9, t9, 10
|
||||||
+:
|
+:
|
||||||
|
@ -63,7 +62,7 @@
|
||||||
+:
|
+:
|
||||||
sh t9, @rupees_offset(t0)
|
sh t9, @rupees_offset(t0)
|
||||||
andi t3, t2, @button_L
|
andi t3, t2, @button_L
|
||||||
beq t3, r0, return
|
beqz t3, return
|
||||||
nop
|
nop
|
||||||
mov a0, t9
|
mov a0, t9
|
||||||
bal simple_spawn
|
bal simple_spawn
|
||||||
|
@ -76,7 +75,7 @@ simple_spawn: // args: a0 (actor to spawn)
|
||||||
push 4, 9, ra
|
push 4, 9, ra
|
||||||
jal load_object
|
jal load_object
|
||||||
sw a0, 56(sp) // keep me updated!
|
sw a0, 56(sp) // keep me updated!
|
||||||
bne v0, r0, simple_spawn_return
|
bnez v0, simple_spawn_return
|
||||||
lw a2, 56(sp) // keep me updated!
|
lw a2, 56(sp) // keep me updated!
|
||||||
li a1, @global_context
|
li a1, @global_context
|
||||||
addi a0, a1, @actor_spawn_offset
|
addi a0, a1, @actor_spawn_offset
|
||||||
|
@ -122,11 +121,11 @@ load_object:
|
||||||
sll t1, a0, 1
|
sll t1, a0, 1
|
||||||
addu t0, t0, t1
|
addu t0, t0, t1
|
||||||
lhu s0, 0(t0) // object number
|
lhu s0, 0(t0) // object number
|
||||||
beq s0, r0, +
|
beqz s0, +
|
||||||
nop
|
nop
|
||||||
bal is_object_loaded
|
bal is_object_loaded
|
||||||
mov a0, s0
|
mov a0, s0
|
||||||
bne v0, r0, +
|
bnez v0, +
|
||||||
cl v0
|
cl v0
|
||||||
li t8, @global_context
|
li t8, @global_context
|
||||||
li t9, @object_spawn_offset
|
li t9, @object_spawn_offset
|
||||||
|
@ -167,7 +166,7 @@ is_object_loaded:
|
||||||
beq a0, t2, +
|
beq a0, t2, +
|
||||||
subi t1, t1, 1 // TODO: double check there's no off-by-one error
|
subi t1, t1, 1 // TODO: double check there's no off-by-one error
|
||||||
addi t0, t0, 68
|
addi t0, t0, 68
|
||||||
bne t1, r0, -
|
bnez t1, -
|
||||||
nop
|
nop
|
||||||
cl v0
|
cl v0
|
||||||
+:
|
+:
|
||||||
|
|
Loading…
Reference in a new issue