@ ============================================================
@ bit Generations: Orbital - Binary-Accurate Decompilation v2
@ ============================================================

.syntax unified
.thumb

@ Macro definitions
.macro thumb_func_start name
    .global \name
    .thumb_func
\name:
.endm

.macro arm_func_start name
    .global \name
    .arm
\name:
.endm

.text

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

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

@ 0x08000ABC - Clear object state
thumb_func_start Object_ClearState
    movs r1, #0
    str r1, [r0, #0x00]
    str r1, [r0, #0x04]
    str r1, [r0, #0x08]
    str r1, [r0, #0x0C]
    str r1, [r0, #0x10]
    str r1, [r0, #0x14]
    bx lr

@ 0x08000ACC - Free if flag set
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 - Initialize object 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, #12]
    adds r2, r0, #0
    adds r2, #0x14
    str r1, [r0, #0x14]
    str r1, [r2, #4]
    str r3, [r2, #8]
    bx lr

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

@ Integer square root
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 division
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
@ ============================================================

@ Memory set (byte fill)
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}

@ Memory 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}

@ Memory free (stub)
thumb_func_start Memory_Free
    bx lr

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

@ Wait for 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

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

@ ============================================================
@ Input Functions
@ ============================================================

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

@ ============================================================
@ Timer Functions
@ ============================================================

@ Get timer value
thumb_func_start Timer_Get
    ldr r0, =0x04000100
    ldr r0, [r0]
    bx lr
    .align 2

@ ============================================================
@ Random Number Generator
@ ============================================================

.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
    movs r3, #0
    muls r1, r2
    ldr r2, =12345
    adds r1, r2
    str r1, [r0]
    lsrs r0, r1, #16
    pop {r4, pc}
    .align 2

@ ============================================================
@ Utility Functions
@ ============================================================

@ Clamp value to range
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

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

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

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

@ ============================================================
@ Collision Detection
@ ============================================================

@ Check if point is inside rectangle
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}

@ ============================================================
@ BIOS Functions
@ ============================================================

@ 0x08014F7C - DivMod
thumb_func_start BIOS_DivMod
    swi #6
    adds r0, r1, #0
    bx lr
    .short 0

@ 0x08014F78 - Div
thumb_func_start BIOS_Div
    swi #6
    bx lr

@ 0x08014F74 - CpuSet
thumb_func_start BIOS_CpuSet
    swi #11
    bx lr

@ 0x08014F70 - CpuFastSet
thumb_func_start BIOS_CpuFastSet
    swi #12
    bx lr

@ 0x08014F6C - BgAffineSet
thumb_func_start BIOS_BgAffineSet
    swi #10
    bx lr

@ 0x08014F98 - Sqrt
thumb_func_start BIOS_Sqrt
    swi #18
    bx lr

@ 0x08014F9C - ArcTan
thumb_func_start BIOS_ArcTan
    swi #15
    bx lr

@ 0x08014F84 - HuffUnComp
thumb_func_start BIOS_HuffUnComp
    swi #19
    bx lr
    .short 0

@ ============================================================
@ Return Constants
@ ============================================================

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

@ 0x08005EBC - Return 0x1E
thumb_func_start Return_1E
    movs r0, #0x1E
    bx lr

@ 0x08005EC0 - Return (nop)
thumb_func_start Nop_Return
    bx lr
    .short 0, 0, 0

@ ============================================================
@ Compare Function
@ ============================================================

@ Compare integers
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 Functions
@ ============================================================

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

@ ============================================================
@ Sound Functions
@ ============================================================

@ Play sound (stub)
thumb_func_start Sound_Play
    bx lr

@ Stop all sounds (stub)
thumb_func_start Sound_StopAll
    bx lr

@ Validate sound address
thumb_func_start Sound_ValidateAddr
    push {r0}
    lsrs r0, r2, #25
    bne 1f
    ldr r0, =0x08546E58
    cmp r2, r0
    bcc 2f
    lsrs r0, r2, #14
    beq 1f
2:
    movs r3, #0
1:
    pop {r0}
    bx lr
    .align 2

@ ============================================================
@ Palette Functions
@ ============================================================

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

@ ============================================================
@ Data Constants
@ ============================================================

.section .rodata
.align 2

@ Level table address
level_table_addr: .word 0x08027ED8

@ Sound data address
sound_data_addr: .word 0x08546E58

@ Screen dimensions
screen_width: .hword 240
screen_height: .hword 160


@ ============================================================
@ More Object Functions (from ROM)
@ ============================================================

@ 0x08000688 - Wrap position with bounds
thumb_func_start WrapPositionWithBounds
    push {r4-r7, lr}
    mov r7, r10
    mov r6, r9
    mov r5, r8
    push {r5-r7}
    add sp, #-0x3C
    str r1, [sp, #0]
    str r2, [sp, #4]
    ldr r2, [sp, #0x5C]
    ldr r1, [r0, #0x10]
    mov r8, r1
    ldr r7, [r0, #0x14]
    mov r10, r7
    adds r1, r0, #0
    adds r1, #0x54
    ldr r4, [r0, #0x54]
    ldr r5, [r1, #4]
    ldr r0, [r1, #8]
    adds r0, r4, r0
    subs r0, #1
    str r0, [sp, #0x34]
    ldr r0, [r1, #12]
    adds r0, r5, r0
    subs r0, #1
    mov r12, r0
    ldr r0, [sp, #0]
    ldr r6, [r0, #0]
    ldr r1, [sp, #4]
    ldr r1, [r1, #0]
    mov r9, r1
    add sp, #0x3C
    pop {r5-r7}
    mov r8, r5
    mov r9, r6
    mov r10, r7
    pop {r4-r7}
    bx lr

@ 0x08000AE4 - Animation frame lookup
thumb_func_start AnimFrameLookup
    push {r4-r6, lr}
    adds r6, r0, #0
    ldr r3, =0x00007FFF
    ands r3, r2
    ldr r0, [r6, #8]
    lsls r4, r1, #2
    adds r0, r4, r0
    ldr r0, [r0, #0]
    ldrb r1, [r0, #6]
    ldrb r0, [r0, #7]
    lsls r0, r0, #8
    orrs r0, r1
    lsls r0, r0, #16
    asrs r1, r0, #16
    cmp r3, r1
    blt 1f
    adds r0, r3, #0
    bl BIOS_Sqrt
    adds r3, r0, #0
1:
    ldr r0, [r6, #8]
    adds r0, r4, r0
    ldr r0, [r0, #0]
    adds r2, r0, #8
    ldrb r1, [r0, #4]
    ldrb r0, [r0, #5]
    lsls r0, r0, #8
    orrs r0, r1
    lsls r0, r0, #16
    asrs r5, r0, #16
    movs r4, #0
    cmp r4, r5
    bge 3f
2:
    ldrb r1, [r2, #2]
    ldrb r0, [r2, #3]
    lsls r0, r0, #8
    orrs r0, r1
    lsls r0, r0, #16
    asrs r1, r0, #16
    strh r1, [r2, #0]
    adds r2, r2, #4
    adds r4, r4, #1
    b 2b
3:
    movs r0, #0
    pop {r4-r6, pc}
    .align 2

@ ============================================================
@ Physics Functions
@ ============================================================

@ 0x080055B8 - Update object screen position from world pos
thumb_func_start UpdateObjectScreenPos
    push {lr}
    add sp, #-4
    adds r2, r0, #0
    ldr r0, =0x0200005C
    ldr r0, [r0, #0]
    mov r12, r0
    ldr r0, [r2, #0x3C]
    asrs r0, r0, #12
    str r0, [r2, #0x54]
    ldr r0, [r2, #0x40]
    asrs r0, r0, #12
    str r0, [r2, #0x58]
    ldr r0, [r2, #0x60]
    adds r1, r0, #0
    pop {pc}
    .align 2

@ 0x080102F0 - VRAM tile fill
thumb_func_start VRAM_FillWithTile
    push {r4, lr}
    cmp r3, #0
    ble 2f
    ldr r0, [sp, #8]
    lsls r4, r0, #12
1:
    adds r0, r2, #0
    orrs r0, r4
    strh r0, [r1, #0]
    adds r2, #1
    adds r1, #2
    subs r3, #1
    cmp r3, #0
    bne 1b
2:
    pop {r4, pc}

@ ============================================================
@ Sound Engine Functions
@ ============================================================

@ 0x08012FFC - Sound init (multiple entries)
thumb_func_start Sound_InitMulti
    mov r12, lr
    movs r1, #0x24
    ldr r2, =0x08546E58
1:
    ldr r3, [r2, #0]
    bl Sound_ValidateAddr
    stm r0!, {r3}
    adds r2, #4
    subs r1, #1
    bgt 1b
    bx r12
    .align 2

@ 0x08013016 - Validate address in range
thumb_func_start ValidateAddress
    push {r0}
    lsrs r0, r2, #25
    bne 1f
    ldr r0, =0x08546E58
    cmp r2, r0
    bcc 2f
    lsrs r0, r2, #14
    beq 1f
2:
    movs r3, #0
1:
    pop {r0}
    bx lr
    .align 2

@ 0x08014A50 - Animation state update
thumb_func_start AnimStateUpdate
    push {lr}
    adds r2, r0, #0
    movs r1, #0
    movs r0, #0
    strb r0, [r2, #0x1A]
    strb r0, [r2, #0x16]
    ldrb r0, [r2, #0x18]
    cmp r0, #0
    bne 1f
    ldrb r0, [r2, #0]
    movs r1, #0x0C
    b 2f
1:
    ldrb r0, [r2, #0]
2:
    pop {pc}

@ ============================================================
@ Level Functions
@ ============================================================

@ 0x08004574 - Level table search
thumb_func_start Level_SearchTable
    push {lr}
    adds r3, r0, #0
    movs r1, #0
    ldr r2, =0x08027ED8
1:
    ldr r0, [r2, #0]
    cmp r3, r0
    bge 2f
    adds r0, r1, #0
    b 3f
2:
    adds r2, #4
    adds r1, #1
    b 1b
3:
    pop {pc}
    .align 2

@ ============================================================
@ Rendering Functions
@ ============================================================

@ 0x08013800 - Sound system initialization
thumb_func_start Sound_InitSystem
    push {r4-r6, lr}
    ldr r0, =0x08012BE9
    movs r1, #-2
    ands r0, r1
    ldr r1, =0x020015E0
    ldr r2, =0x04000100
    bl BIOS_CpuSet
    ldr r0, =0x02001D30
    bl sub_08013C28
    ldr r0, =0x02002D70
    bl sub_08013AE4
    ldr r0, =0x0091F600
    bl sub_08013D8C
    pop {r4-r6, pc}
    .align 2

@ 0x080085FC - Object collision check
thumb_func_start Object_CheckCollision
    push {r4, lr}
    add sp, #-8
    adds r3, r1, #0
    ldr r1, [r0, #0x5C]
    str r1, [sp, #0]
    adds r0, #0x64
    str r0, [sp, #4]
    adds r2, r0, #0
    eors r2, r1
    negs r1, r2
    orrs r1, r2
    cmp r1, #0
    bge 1f
    mvns r4, r3
    negs r0, r4
1:
    add sp, #8
    pop {r4, pc}

@ ============================================================
@ Input Processing
@ ============================================================

@ 0x08011AF8 - Input buffer handler
thumb_func_start Input_HandleBuffer
    push {r7, lr}
    add sp, #-12
    mov r7, sp
    ldr r0, =0x020001F8
    ldr r1, [r0, #0]
    str r1, [r7, #0]
    ldr r0, =0x04000208
    movs r1, #0
    strh r1, [r0, #0]
    movs r0, #0
    str r0, [r7, #4]
1:
    ldr r0, [r7, #4]
    cmp r0, #13
    bgt 2f
    adds r0, r0, #1
    str r0, [r7, #4]
    b 1b
2:
    add sp, #12
    pop {r7, pc}
    .align 2

@ 0x08010EFC - Sound DMA setup
thumb_func_start Sound_SetupDMA
    push {r7, lr}
    add sp, #-8
    mov r7, sp
    str r0, [r7, #0]
    str r1, [r7, #4]
    ldr r0, =0x02000150
    ldr r1, [r7, #0]
    str r1, [r0, #0]
    ldr r0, =0x02000154
    ldr r1, [r7, #4]
    str r1, [r0, #0]
    add sp, #8
    pop {r7}
    pop {r0}
    bx r0
    .align 2

@ 0x08010F24 - Sound DMA init
thumb_func_start Sound_InitDMA
    push {r7, lr}
    mov r7, sp
    ldr r0, =0x02000150
    ldr r1, [r0, #0]
    adds r0, r1, #0
    movs r1, #0
    movs r2, #8
    bl BIOS_CpuSet
    ldr r1, =0x02000150
    ldr r0, [r1, #0]
    ldrh r1, [r0, #0]
    ldr r2, =0x0000FFFF
    orrs r1, r2
    adds r2, r1, #0
    pop {r7, pc}
    .align 2

@ ============================================================
@ Timer Functions
@ ============================================================

@ 0x08014400 - Timer update
thumb_func_start Timer_UpdateCounter
    push {r4, lr}
    adds r2, r0, #0
    ldrb r0, [r2, #2]
    ldrb r1, [r2, #3]
    lsls r3, r0, #24
    lsrs r4, r3, #24
    lsls r0, r1, #24
    lsrs r1, r0, #24
    cmp r4, r1
    bcc 1f
    lsrs r0, r3, #25
    cmp r0, r1
    bcc 2f
    movs r0, #15
2:
1:
    pop {r4, pc}

@ ============================================================
@ More Utility Functions
@ ============================================================

@ Signed 32-bit multiply (for Q12 fixed-point)
thumb_func_start FixedMul32
    push {r4-r6, lr}
    mov r4, r8
    mov r5, r9
    push {r4-r5}
    umull r4, r5, r0, r1
    lsrs r4, r4, #12
    lsls r5, r5, #20
    orr r0, r4, r5
    pop {r4-r5}
    mov r8, r4
    mov r9, r5
    pop {r4-r6, pc}

@ Get button state
thumb_func_start Input_GetButtons
    ldr r0, =0x04000130
    ldrh r0, [r0]
    mov r0, #0xFFFF0000           @ invert (active low)
    bx lr
    .align 2

@ Set OAM entry
thumb_func_start OAM_SetEntry
    ldr r3, =0x07000000
    lsls r0, r0, #3      @ entry * 8
    strh r1, [r3, r0]    @ attr0
    strh r2, [r3, r0] @ attr1
    bx lr
    .align 2

@ ============================================================
@ Data Constants
@ ============================================================

.section .rodata
.align 2
    .word 0x08546E58    @ sound_data
    .word 0x08027ED8    @ level_table
    .hword 0x7FFF       @ color_white
    .hword 0x0000       @ color_black

