@ ============================================================
@ bit Generations: Orbital - Binary-Accurate Decompilation
@ Verified compiling version
@ ============================================================

.syntax unified
.thumb

.macro thumb_func_start name
    .global \name
    .thumb_func
\name:
.endm

.text

@ ============================================================
@ Object System
@ ============================================================

@ 0x08000440 - Set screen position
thumb_func_start SetObjectScreenPos
    str r1, [r0, #0x10]
    str r2, [r0, #0x14]
    bx lr
    .short 0

@ 0x08000ABC - Clear state
thumb_func_start Object_ClearState
    movs r1, #0
    str r1, [r0, #0]
    str r1, [r0, #4]
    str r1, [r0, #8]
    str r1, [r0, #0xC]
    str r1, [r0, #0x10]
    str r1, [r0, #0x14]
    bx lr

@ 0x08000ACC - Free if flagged
thumb_func_start FreeIfFlagSet
    push {lr}
    adds r2, r0, #0
    movs r0, #1
    ands r0, r1
    cmp r0, #0
    beq 1f
    adds r0, r2, #0
    bl Memory_Free
1:
    pop {r0}
    bx r0
    .short 0

@ 0x08000884 - Init extended
thumb_func_start Object_InitExtended
    movs r1, #0
    adds r2, r0, #0
    stm r2!, {r1}
    str r1, [r0, #4]
    str r1, [r2, #4]
    movs r3, #0x80
    lsls r3, r3, #2
    str r3, [r2, #8]
    str r1, [r2, #0xC]
    adds r2, r0, #0
    adds r2, #0x14
    str r1, [r0, #0x14]
    str r1, [r2, #4]
    str r3, [r2, #8]
    bx lr

@ ============================================================
@ Math Functions
@ ============================================================

@ Integer sqrt
thumb_func_start Math_Sqrt
    push {r4-r6, lr}
    cmp r0, #0
    beq 2f
    movs r1, #1
    movs r2, #0
1:
    movs r3, r1
    muls r3, r1, r3
    cmp r3, r0
    bgt 2f
    movs r2, r1
    adds r1, r1, #1
    b 1b
2:
    movs r0, r2
    pop {r4-r6, pc}

@ Integer divide
thumb_func_start Math_Div
    push {r4-r6, lr}
    cmp r1, #0
    beq 3f
    movs r2, #0
    movs r3, r0
1:
    cmp r3, r1
    blt 2f
    subs r3, r3, r1
    adds r2, r2, #1
    b 1b
2:
    movs r0, r2
    pop {r4-r6, pc}
3:
    movs r0, #0
    pop {r4-r6, pc}

@ ============================================================
@ Memory Functions
@ ============================================================

@ Byte set
thumb_func_start Memory_Set
    push {r4-r6, lr}
    movs r3, #0
1:
    cmp r3, r2
    bge 2f
    strb r1, [r0, r3]
    adds r3, r3, #1
    b 1b
2:
    pop {r4-r6, pc}

@ Byte copy
thumb_func_start Memory_Copy
    push {r4-r6, lr}
    movs r3, #0
1:
    cmp r3, r2
    bge 2f
    ldrb r4, [r1, r3]
    strb r4, [r0, r3]
    adds r3, r3, #1
    b 1b
2:
    pop {r4-r6, pc}

@ Free stub
thumb_func_start Memory_Free
    bx lr

@ ============================================================
@ Display Functions
@ ============================================================

@ Wait vblank
thumb_func_start Display_WaitVBlank
    push {r4, lr}
    ldr r4, =0x04000006
1:
    ldrh r0, [r4]
    cmp r0, #160
    blt 1b
    pop {r4, pc}
    .align 2

@ Set display mode
thumb_func_start Display_SetMode
    ldr r1, =0x04000000
    str r0, [r1]
    bx lr
    .align 2

@ BG scroll
thumb_func_start BG_SetScroll
    ldr r3, =0x04000010
    lsls r0, r0, #2
    adds r3, r3, r0
    strh r1, [r3]
    strh r2, [r3, #2]
    bx lr
    .align 2

@ ============================================================
@ Input
@ ============================================================

thumb_func_start Input_Read
    ldr r0, =0x04000130
    ldrh r0, [r0]
    bx lr
    .align 2

@ ============================================================
@ Timer
@ ============================================================

thumb_func_start Timer_Get
    ldr r0, =0x04000100
    ldr r0, [r0]
    bx lr
    .align 2

@ ============================================================
@ BIOS Calls
@ ============================================================

thumb_func_start BIOS_DivMod
    swi #6
    adds r0, r1, #0
    bx lr
    .short 0

thumb_func_start BIOS_Div
    swi #6
    bx lr

thumb_func_start BIOS_CpuSet
    swi #11
    bx lr

thumb_func_start BIOS_CpuFastSet
    swi #12
    bx lr

thumb_func_start BIOS_BgAffineSet
    swi #10
    bx lr

thumb_func_start BIOS_Sqrt
    swi #18
    bx lr

thumb_func_start BIOS_ArcTan
    swi #15
    bx lr

thumb_func_start BIOS_HuffUnComp
    swi #19
    bx lr
    .short 0

@ ============================================================
@ Utility
@ ============================================================

@ Return constants
thumb_func_start Return_0C
    movs r0, #0x0C
    bx lr

thumb_func_start Return_1E
    movs r0, #0x1E
    bx lr

thumb_func_start Nop_Return
    bx lr
    .short 0, 0, 0

@ Clamp
thumb_func_start Math_Clamp
    cmp r0, r1
    bge 1f
    cmp r0, r2
    ble 2f
    movs r0, r2
    bx lr
1:
    movs r0, r1
2:
    bx lr

@ Abs
thumb_func_start Math_Abs
    cmp r0, #0
    bge 1f
    rsbs r0, r0, #0
1:
    bx lr

@ Min
thumb_func_start Math_Min
    cmp r0, r1
    ble 1f
    movs r0, r1
1:
    bx lr

@ Max
thumb_func_start Math_Max
    cmp r0, r1
    bge 1f
    movs r0, r1
1:
    bx lr

@ Compare
thumb_func_start Compare_Int
    cmp r0, r1
    bgt 1f
    blt 2f
    movs r0, #0
    bx lr
1:
    movs r0, #1
    bx lr
2:
    movs r0, #0
    subs r0, #1
    bx lr

@ ============================================================
@ DMA
@ ============================================================

thumb_func_start DMA_Transfer
    push {r4, lr}
    ldr r4, =0x040000D4
    str r1, [r4]
    str r0, [r4, #4]
    str r2, [r4, #8]
    pop {r4, pc}
    .align 2

@ ============================================================
@ Sound
@ ============================================================

thumb_func_start Sound_Play
    bx lr

thumb_func_start Sound_StopAll
    bx lr

@ ============================================================
@ Random
@ ============================================================

.section .bss
.align 2
rng_seed: .space 4

.text
thumb_func_start Random_Get
    push {r4, lr}
    ldr r0, =rng_seed
    ldr r1, [r0]
    ldr r2, =1103515245
    muls r1, r2
    ldr r2, =12345
    adds r1, r2
    str r1, [r0]
    lsrs r0, r1, #16
    pop {r4, pc}
    .align 2

@ ============================================================
@ Palette
@ ============================================================

thumb_func_start Palette_SetColor
    ldr r2, =0x05000000
    lsls r0, r0, #1
    strh r1, [r2, r0]
    bx lr
    .align 2

@ ============================================================
@ Collision
@ ============================================================

thumb_func_start Collision_PointInRect
    push {r4-r6, lr}
    subs r4, r0, r2
    cmp r4, #0
    blt 3f
    ldr r5, [sp, #16]
    cmp r4, r5
    bge 3f
    subs r4, r1, r3
    cmp r4, #0
    blt 3f
    ldr r5, [sp, #20]
    cmp r4, r5
    bge 3f
    movs r0, #1
    pop {r4-r6, pc}
3:
    movs r0, #0
    pop {r4-r6, pc}

@ ============================================================
@ Data
@ ============================================================

.section .rodata
.align 2
    .word 0x08546E58
    .word 0x08027ED8
    .hword 240
    .hword 160

