pmd-red/asm/m4a_3.s
nullableVoidPtr c7045ae369 Identify, split, decompile m4a, and more
ResetSprites, gCharMemCursor, gSpriteCount; analysed subheaps; identified more file pointers
2018-11-20 15:04:02 +08:00

575 lines
8.5 KiB
ArmAsm

.include "asm/macros.inc"
.include "constants/gba_constants.inc"
.include "constants/m4a_constants.inc"
.syntax unified
.text
thumb_func_start CgbSound
CgbSound:
push {r4-r7,lr}
mov r7, r10
mov r6, r9
mov r5, r8
push {r5-r7}
sub sp, 0x1C
ldr r0, =SOUND_INFO_PTR
ldr r0, [r0]
str r0, [sp, 0x4]
ldrb r0, [r0, 0xA]
cmp r0, 0
beq _080AFB00
subs r0, 0x1
ldr r1, [sp, 0x4]
strb r0, [r1, 0xA]
b _080AFB06
.pool
_080AFB00:
movs r0, 0xE
ldr r2, [sp, 0x4]
strb r0, [r2, 0xA]
_080AFB06:
movs r6, 0x1
ldr r0, [sp, 0x4]
ldr r4, [r0, 0x1C]
_080AFB0C:
ldrb r1, [r4]
movs r0, 0xC7
ands r0, r1
adds r2, r6, 0x1
mov r10, r2
movs r2, 0x40
adds r2, r4
mov r9, r2
cmp r0, 0
bne _080AFB22
b _080AFF0C
_080AFB22:
cmp r6, 0x2
beq _080AFB54
cmp r6, 0x2
bgt _080AFB30
cmp r6, 0x1
beq _080AFB36
b _080AFB8C
_080AFB30:
cmp r6, 0x3
beq _080AFB6C
b _080AFB8C
_080AFB36:
ldr r0, =REG_NR10
str r0, [sp, 0x8]
ldr r7, =REG_NR11
ldr r2, =REG_NR12
str r2, [sp, 0xC]
adds r0, 0x4
str r0, [sp, 0x10]
adds r2, 0x2
b _080AFB9C
.pool
_080AFB54:
ldr r0, =REG_NR10 + 1
str r0, [sp, 0x8]
ldr r7, =REG_NR21
ldr r2, =REG_NR22
b _080AFB94
.pool
_080AFB6C:
ldr r0, =REG_NR30
str r0, [sp, 0x8]
ldr r7, =REG_NR31
ldr r2, =REG_NR32
str r2, [sp, 0xC]
adds r0, 0x4
str r0, [sp, 0x10]
adds r2, 0x2
b _080AFB9C
.pool
_080AFB8C:
ldr r0, =REG_NR30 + 1
str r0, [sp, 0x8]
ldr r7, =REG_NR41
ldr r2, =REG_NR42
_080AFB94:
str r2, [sp, 0xC]
adds r0, 0xB
str r0, [sp, 0x10]
adds r2, 0x4
_080AFB9C:
str r2, [sp, 0x14]
ldr r0, [sp, 0x4]
ldrb r0, [r0, 0xA]
str r0, [sp]
ldr r2, [sp, 0xC]
ldrb r0, [r2]
mov r8, r0
adds r2, r1, 0
movs r0, 0x80
ands r0, r2
cmp r0, 0
beq _080AFC92
movs r3, 0x40
adds r0, r3, 0
ands r0, r2
lsls r0, 24
lsrs r5, r0, 24
adds r0, r6, 0x1
mov r10, r0
movs r1, 0x40
adds r1, r4
mov r9, r1
cmp r5, 0
bne _080AFCB6
movs r0, 0x3
strb r0, [r4]
strb r0, [r4, 0x1D]
adds r0, r4, 0
str r3, [sp, 0x18]
bl CgbModVol
ldr r3, [sp, 0x18]
cmp r6, 0x2
beq _080AFC04
cmp r6, 0x2
bgt _080AFBF8
cmp r6, 0x1
beq _080AFBFE
b _080AFC58
.pool
_080AFBF8:
cmp r6, 0x3
beq _080AFC10
b _080AFC58
_080AFBFE:
ldrb r0, [r4, 0x1F]
ldr r2, [sp, 0x8]
strb r0, [r2]
_080AFC04:
ldr r0, [r4, 0x24]
lsls r0, 6
ldrb r1, [r4, 0x1E]
adds r0, r1, r0
strb r0, [r7]
b _080AFC64
_080AFC10:
ldr r1, [r4, 0x24]
ldr r0, [r4, 0x28]
cmp r1, r0
beq _080AFC38
ldr r2, [sp, 0x8]
strb r3, [r2]
ldr r1, =REG_WAVE_RAM
ldr r2, [r4, 0x24]
ldr r0, [r2]
str r0, [r1]
adds r1, 0x4
ldr r0, [r2, 0x4]
str r0, [r1]
adds r1, 0x4
ldr r0, [r2, 0x8]
str r0, [r1]
adds r1, 0x4
ldr r0, [r2, 0xC]
str r0, [r1]
str r2, [r4, 0x28]
_080AFC38:
ldr r0, [sp, 0x8]
strb r5, [r0]
ldrb r0, [r4, 0x1E]
strb r0, [r7]
ldrb r0, [r4, 0x1E]
cmp r0, 0
beq _080AFC50
movs r0, 0xC0
b _080AFC72
.pool
_080AFC50:
movs r1, 0x80
negs r1, r1
strb r1, [r4, 0x1A]
b _080AFC74
_080AFC58:
ldrb r0, [r4, 0x1E]
strb r0, [r7]
ldr r0, [r4, 0x24]
lsls r0, 3
ldr r2, [sp, 0x10]
strb r0, [r2]
_080AFC64:
ldrb r0, [r4, 0x4]
adds r0, 0x8
mov r8, r0
ldrb r0, [r4, 0x1E]
cmp r0, 0
beq _080AFC72
movs r0, 0x40
_080AFC72:
strb r0, [r4, 0x1A]
_080AFC74:
ldrb r1, [r4, 0x4]
movs r2, 0
strb r1, [r4, 0xB]
movs r0, 0xFF
ands r0, r1
adds r1, r6, 0x1
mov r10, r1
movs r1, 0x40
adds r1, r4
mov r9, r1
cmp r0, 0
bne _080AFC8E
b _080AFDCA
_080AFC8E:
strb r2, [r4, 0x9]
b _080AFDF8
_080AFC92:
movs r0, 0x4
ands r0, r2
cmp r0, 0
beq _080AFCC4
ldrb r0, [r4, 0xD]
subs r0, 0x1
strb r0, [r4, 0xD]
movs r2, 0xFF
ands r0, r2
lsls r0, 24
adds r1, r6, 0x1
mov r10, r1
movs r2, 0x40
adds r2, r4
mov r9, r2
cmp r0, 0
ble _080AFCB6
b _080AFE0A
_080AFCB6:
lsls r0, r6, 24
lsrs r0, 24
bl CgbOscOff
movs r0, 0
strb r0, [r4]
b _080AFF08
_080AFCC4:
movs r0, 0x40
ands r0, r1
adds r2, r6, 0x1
mov r10, r2
movs r2, 0x40
adds r2, r4
mov r9, r2
cmp r0, 0
beq _080AFD04
movs r0, 0x3
ands r0, r1
cmp r0, 0
beq _080AFD04
movs r0, 0xFC
ands r0, r1
movs r2, 0
strb r0, [r4]
ldrb r1, [r4, 0x7]
strb r1, [r4, 0xB]
movs r0, 0xFF
ands r0, r1
cmp r0, 0
beq _080AFD36
movs r0, 0x1
ldrb r1, [r4, 0x1D]
orrs r0, r1
strb r0, [r4, 0x1D]
cmp r6, 0x3
beq _080AFDF8
ldrb r2, [r4, 0x7]
mov r8, r2
b _080AFDF8
_080AFD04:
ldrb r0, [r4, 0xB]
cmp r0, 0
bne _080AFDF8
cmp r6, 0x3
bne _080AFD16
movs r0, 0x1
ldrb r1, [r4, 0x1D]
orrs r0, r1
strb r0, [r4, 0x1D]
_080AFD16:
adds r0, r4, 0
bl CgbModVol
movs r0, 0x3
ldrb r2, [r4]
ands r0, r2
cmp r0, 0
bne _080AFD6A
ldrb r0, [r4, 0x9]
subs r0, 0x1
strb r0, [r4, 0x9]
movs r1, 0xFF
ands r0, r1
lsls r0, 24
cmp r0, 0
bgt _080AFD66
_080AFD36:
ldrb r2, [r4, 0xC]
ldrb r1, [r4, 0xA]
adds r0, r2, 0
muls r0, r1
adds r0, 0xFF
asrs r0, 8
movs r1, 0
strb r0, [r4, 0x9]
lsls r0, 24
cmp r0, 0
beq _080AFCB6
movs r0, 0x4
ldrb r2, [r4]
orrs r0, r2
strb r0, [r4]
movs r0, 0x1
ldrb r1, [r4, 0x1D]
orrs r0, r1
strb r0, [r4, 0x1D]
cmp r6, 0x3
beq _080AFE0A
movs r2, 0x8
mov r8, r2
b _080AFE0A
_080AFD66:
ldrb r0, [r4, 0x7]
b _080AFDF6
_080AFD6A:
cmp r0, 0x1
bne _080AFD76
_080AFD6E:
ldrb r0, [r4, 0x19]
strb r0, [r4, 0x9]
movs r0, 0x7
b _080AFDF6
_080AFD76:
cmp r0, 0x2
bne _080AFDBA
ldrb r0, [r4, 0x9]
subs r0, 0x1
strb r0, [r4, 0x9]
movs r1, 0xFF
ands r0, r1
lsls r0, 24
ldrb r2, [r4, 0x19]
lsls r1, r2, 24
cmp r0, r1
bgt _080AFDB6
_080AFD8E:
ldrb r0, [r4, 0x6]
cmp r0, 0
bne _080AFD9E
movs r0, 0xFC
ldrb r1, [r4]
ands r0, r1
strb r0, [r4]
b _080AFD36
_080AFD9E:
ldrb r0, [r4]
subs r0, 0x1
strb r0, [r4]
movs r0, 0x1
ldrb r2, [r4, 0x1D]
orrs r0, r2
strb r0, [r4, 0x1D]
cmp r6, 0x3
beq _080AFD6E
movs r0, 0x8
mov r8, r0
b _080AFD6E
_080AFDB6:
ldrb r0, [r4, 0x5]
b _080AFDF6
_080AFDBA:
ldrb r0, [r4, 0x9]
adds r0, 0x1
strb r0, [r4, 0x9]
movs r1, 0xFF
ands r0, r1
ldrb r2, [r4, 0xA]
cmp r0, r2
bcc _080AFDF4
_080AFDCA:
ldrb r0, [r4]
subs r0, 0x1
movs r2, 0
strb r0, [r4]
ldrb r1, [r4, 0x5]
strb r1, [r4, 0xB]
movs r0, 0xFF
ands r0, r1
cmp r0, 0
beq _080AFD8E
movs r0, 0x1
ldrb r1, [r4, 0x1D]
orrs r0, r1
strb r0, [r4, 0x1D]
ldrb r0, [r4, 0xA]
strb r0, [r4, 0x9]
cmp r6, 0x3
beq _080AFDF8
ldrb r2, [r4, 0x5]
mov r8, r2
b _080AFDF8
_080AFDF4:
ldrb r0, [r4, 0x4]
_080AFDF6:
strb r0, [r4, 0xB]
_080AFDF8:
ldrb r0, [r4, 0xB]
subs r0, 0x1
strb r0, [r4, 0xB]
ldr r0, [sp]
cmp r0, 0
bne _080AFE0A
subs r0, 0x1
str r0, [sp]
b _080AFD04
_080AFE0A:
movs r0, 0x2
ldrb r1, [r4, 0x1D]
ands r0, r1
cmp r0, 0
beq _080AFE82
cmp r6, 0x3
bgt _080AFE4A
movs r0, 0x8
ldrb r2, [r4, 0x1]
ands r0, r2
cmp r0, 0
beq _080AFE4A
ldr r0, =REG_SOUNDBIAS + 1
ldrb r0, [r0]
cmp r0, 0x3F
bgt _080AFE3C
ldr r0, [r4, 0x20]
adds r0, 0x2
ldr r1, =0x000007fc
b _080AFE46
.pool
_080AFE3C:
cmp r0, 0x7F
bgt _080AFE4A
ldr r0, [r4, 0x20]
adds r0, 0x1
ldr r1, =0x000007fe
_080AFE46:
ands r0, r1
str r0, [r4, 0x20]
_080AFE4A:
cmp r6, 0x4
beq _080AFE5C
ldr r0, [r4, 0x20]
ldr r1, [sp, 0x10]
strb r0, [r1]
b _080AFE6A
.pool
_080AFE5C:
ldr r2, [sp, 0x10]
ldrb r0, [r2]
movs r1, 0x8
ands r1, r0
ldr r0, [r4, 0x20]
orrs r0, r1
strb r0, [r2]
_080AFE6A:
movs r0, 0xC0
ldrb r1, [r4, 0x1A]
ands r0, r1
adds r1, r4, 0
adds r1, 0x21
ldrb r1, [r1]
adds r0, r1, r0
strb r0, [r4, 0x1A]
movs r2, 0xFF
ands r0, r2
ldr r1, [sp, 0x14]
strb r0, [r1]
_080AFE82:
movs r0, 0x1
ldrb r2, [r4, 0x1D]
ands r0, r2
cmp r0, 0
beq _080AFF08
ldr r1, =REG_NR51
ldrb r0, [r1]
ldrb r2, [r4, 0x1C]
bics r0, r2
ldrb r2, [r4, 0x1B]
orrs r0, r2
strb r0, [r1]
cmp r6, 0x3
bne _080AFED4
ldr r0, =gCgb3Vol
ldrb r1, [r4, 0x9]
adds r0, r1, r0
ldrb r0, [r0]
ldr r2, [sp, 0xC]
strb r0, [r2]
movs r1, 0x80
adds r0, r1, 0
ldrb r2, [r4, 0x1A]
ands r0, r2
cmp r0, 0
beq _080AFF08
ldr r0, [sp, 0x8]
strb r1, [r0]
ldrb r0, [r4, 0x1A]
ldr r1, [sp, 0x14]
strb r0, [r1]
movs r0, 0x7F
ldrb r2, [r4, 0x1A]
ands r0, r2
strb r0, [r4, 0x1A]
b _080AFF08
.pool
_080AFED4:
movs r0, 0xF
mov r1, r8
ands r1, r0
mov r8, r1
ldrb r2, [r4, 0x9]
lsls r0, r2, 4
add r0, r8
ldr r1, [sp, 0xC]
strb r0, [r1]
movs r2, 0x80
ldrb r0, [r4, 0x1A]
orrs r0, r2
ldr r1, [sp, 0x14]
strb r0, [r1]
cmp r6, 0x1
bne _080AFF08
ldr r0, [sp, 0x8]
ldrb r1, [r0]
movs r0, 0x8
ands r0, r1
cmp r0, 0
bne _080AFF08
ldrb r0, [r4, 0x1A]
orrs r0, r2
ldr r1, [sp, 0x14]
strb r0, [r1]
_080AFF08:
movs r0, 0
strb r0, [r4, 0x1D]
_080AFF0C:
mov r6, r10
mov r4, r9
cmp r6, 0x4
bgt _080AFF16
b _080AFB0C
_080AFF16:
add sp, 0x1C
pop {r3-r5}
mov r8, r3
mov r9, r4
mov r10, r5
pop {r4-r7}
pop {r0}
bx r0
thumb_func_end CgbSound
.align 2, 0 @ Don't pad with nop.