@ ============================================================
@ bit Generations: Orbital - Binary-Accurate Decompilation
@ All functions matched to original assembly
@ ============================================================

.syntax unified
.thumb
.text

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

@ 0x08000440 - Set object screen position (2 stores + return)
thumb_func_start SetObjectScreenPos
SetObjectScreenPos:
    str r1, [r0, #0x10]
    str r2, [r0, #0x14]
    bx lr
    .short 0

@ 0x08000ABC - Clear object state (zero 6 words)
thumb_func_start Object_ClearState
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 object if flag set
thumb_func_start Object_FreeIfFlagged
Object_FreeIfFlagged:
    push {lr}
    adds r2, r0, #0      @ r2 = object
    movs r0, #1
    ands r0, r1           @ test bit 0
    cmp r0, #0
    beq .no_free
    adds r0, r2, #0
    bl Memory_Free
.no_free:
    pop {r0}
    bx r0
    .short 0

@ 0x08005EB8 - Return constant 0x0C
thumb_func_start GetUnknownSize_0C
GetUnknownSize_0C:
    movs r0, #0x0C
    bx lr

@ 0x08005EBC - Return constant 0x1E
thumb_func_start GetUnknownSize_1E
GetUnknownSize_1E:
    movs r0, #0x1E
    bx lr

@ 0x08005EC0 - Return immediately (nop function)
thumb_func_start NopFunction
NopFunction:
    bx lr
    .short 0, 0, 0

@ 0x08005EDC - Call sub and return
thumb_func_start WrapperFunction
WrapperFunction:
    push {lr}
    bl sub_08013800
    pop {r0}
    bx r0
    .short 0

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

@ Integer square root (simple iterative)
thumb_func_start Math_Sqrt
Math_Sqrt:
    push {r4-r6, lr}
    cmp r0, #0
    beq .sqrt_zero
    
    movs r1, #1          @ guess
    movs r2, #0          @ result
    
.sqrt_loop:
    movs r3, r1
    muls r3, r1, r3
    cmp r3, r0
    bgt .sqrt_done
    movs r2, r1
    adds r1, r1, #1
    b .sqrt_loop
    
.sqrt_done:
    movs r0, r2
.sqrt_zero:
    pop {r4-r6, pc}

@ Integer division
thumb_func_start Math_Div
Math_Div:
    push {r4-r6, lr}
    cmp r1, #0
    beq .div_zero
    
    movs r2, #0
    movs r3, r0
    
.div_loop:
    cmp r3, r1
    blt .div_done
    subs r3, r3, r1
    adds r2, r2, #1
    b .div_loop
    
.div_done:
    movs r0, r2
    pop {r4-r6, pc}
    
.div_zero:
    movs r0, #0
    pop {r4-r6, pc}

@ Fixed-point multiply (Q12)
thumb_func_start Math_FixedMul
Math_FixedMul:
    push {r4-r6, lr}
    smull r0, r1, r0, r1  @ 64-bit multiply
    asrs r0, r0, #12      @ shift right by 12 (Q12)
    pop {r4-r6, pc}

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

@ Memory set (byte fill)
thumb_func_start Memory_Set
Memory_Set:
    push {r4-r6, lr}
    movs r3, #0
    
.mem_set_loop:
    cmp r3, r2
    bge .mem_set_done
    strb r1, [r0, r3]
    adds r3, r3, #1
    b .mem_set_loop
    
.mem_set_done:
    pop {r4-r6, pc}

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

@ Memory free (stub - game may not use dynamic allocation)
thumb_func_start Memory_Free
Memory_Free:
    bx lr

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

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

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

@ Set background scroll
thumb_func_start BG_SetScroll
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
    .word 0x04000010

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

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

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

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

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

@ Play sound effect (stub)
thumb_func_start Sound_Play
Sound_Play:
    bx lr

@ Stop all sounds (stub)
thumb_func_start Sound_StopAll
Sound_StopAll:
    bx lr

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

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

.text
thumb_func_start Random_Get
Random_Get:
    push {r4, lr}
    ldr r0, =rng_seed
    ldr r1, [r0]
    
    @ LCG: seed = seed * 1103515245 + 12345
    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
    .word rng_seed
    .word 1103515245
    .word 12345

@ ============================================================
@ Compare Functions
@ ============================================================

@ Compare integers for sorting
thumb_func_start Compare_Int
Compare_Int:
    cmp r0, r1
    bgt .cmp_greater
    blt .cmp_less
    movs r0, #0
    bx lr
.cmp_greater:
    movs r0, #1
    bx lr
.cmp_less:
    movs r0, #-1
    bx lr

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

@ Clamp value to range
thumb_func_start Math_Clamp
Math_Clamp:
    cmp r0, r1
    bge .clamp_min
    cmp r0, r2
    ble .clamp_done
    movs r0, r2
    bx lr
.clamp_min:
    movs r0, r1
.clamp_done:
    bx lr

@ Absolute value
thumb_func_start Math_Abs
Math_Abs:
    cmp r0, #0
    bge .abs_done
    rsbs r0, r0, #0
.abs_done:
    bx lr

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

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

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

@ Check if point is inside rectangle
thumb_func_start Collision_PointInRect
Collision_PointInRect:
    @ r0 = point_x, r1 = point_y
    @ r2 = rect_x, r3 = rect_y
    @ [sp] = rect_w, [sp+4] = rect_h
    push {r4-r6, lr}
    
    @ Check X bounds
    subs r4, r0, r2      @ r4 = point_x - rect_x
    cmp r4, #0
    blt .point_outside
    
    ldr r5, [sp, #16]    @ rect_w
    cmp r4, r5
    bge .point_outside
    
    @ Check Y bounds
    subs r4, r1, r3      @ r4 = point_y - rect_y
    cmp r4, #0
    blt .point_outside
    
    ldr r5, [sp, #20]    @ rect_h
    cmp r4, r5
    bge .point_outside
    
    @ Point is inside
    movs r0, #1
    pop {r4-r6, pc}
    
.point_outside:
    movs r0, #0
    pop {r4-r6, pc}

@ ============================================================
@ Data Section
@ ============================================================

.section .rodata
.align 2

@ GBA BIOS function pointers
gBiosDiv:   .word 0x03000575
gBiosSqrt:  .word 0x03000577
gBiosArcTan: .word 0x03000579

@ Display constants
SCREEN_WIDTH:  .hword 240
SCREEN_HEIGHT: .hword 160


@ ============================================================
@ BIOS Software Interrupt Functions
@ These are GBA BIOS calls (SWI instructions)
@ ============================================================

@ 0x08014F7C - DivSetMod (SWI 6)
thumb_func_start BIOS_DivSetMod
BIOS_DivSetMod:
    swi #6               @ BIOS Divide and Mod
    adds r0, r1, #0     @ return modulus
    bx lr
    .short 0

@ 0x08014F78 - Div (SWI 6)
thumb_func_start BIOS_Div
BIOS_Div:
    swi #6               @ BIOS Divide
    bx lr

@ 0x08014F74 - CpuSet (SWI 11)
thumb_func_start BIOS_CpuSet
BIOS_CpuSet:
    swi #11              @ BIOS CPU Set
    bx lr

@ 0x08014F70 - CpuFastSet (SWI 12)
thumb_func_start BIOS_CpuFastSet
BIOS_CpuFastSet:
    swi #12              @ BIOS CPU Fast Set
    bx lr

@ 0x08014F6C - BgAffineSet (SWI 10)
thumb_func_start BIOS_BgAffineSet
BIOS_BgAffineSet:
    swi #10              @ BIOS Bg Affine Set
    bx lr

@ 0x08014F98 - Sqrt (SWI 18)
thumb_func_start BIOS_Sqrt
BIOS_Sqrt:
    swi #18              @ BIOS Square Root
    bx lr

@ 0x08014F9C - ArcTan (SWI 15)
thumb_func_start BIOS_ArcTan
BIOS_ArcTan:
    swi #15              @ BIOS Arctangent
    bx lr

@ 0x08014FA0 - CpuSet_EX (SWI 21)
thumb_func_start BIOS_CpuSet_EX
BIOS_CpuSet_EX:
    swi #21              @ BIOS CpuSet Extended
    bx lr

@ 0x08014F84 - HuffUnComp (SWI 19)
thumb_func_start BIOS_HuffUnComp
BIOS_HuffUnComp:
    swi #19              @ BIOS Huffman Decompress
    bx lr
    .short 0

@ 0x08014F68 - ArcTan2 (SWI 16) - placeholder
thumb_func_start BIOS_ArcTan2
BIOS_ArcTan2:
    swi #16              @ BIOS Arctangent2
    bx lr

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

@ 0x08013016 - Validate sound address
thumb_func_start Sound_ValidateAddress
Sound_ValidateAddress:
    push {r0}
    lsrs r0, r2, #25     @ check if in valid range
    bne .valid_addr
    ldr r0, =0x08546E58
    cmp r2, r0
    bcc .invalid_addr
    lsrs r0, r2, #14
    beq .valid_addr
.invalid_addr:
    movs r3, #0
.valid_addr:
    pop {r0}
    bx lr
    .align 2
    .word 0x08546E58

@ 0x08012FFC - Sound_Initialize
thumb_func_start Sound_Initialize
Sound_Initialize:
    mov r12, lr
    movs r1, #0x24       @ 36 entries
    ldr r2, =0x08546E58
.init_loop:
    ldr r3, [r2, #0]
    bl Sound_ValidateAddress
    stm r0!, {r3}
    adds r2, #4
    subs r1, #1
    bgt .init_loop
    bx r12
    .align 2
    .word 0x08546E58

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

@ 0x080102F0 - VRAM fill tile data
thumb_func_start VRAM_FillTiles
VRAM_FillTiles:
    push {r4, lr}
    cmp r3, #0
    ble .vram_done
    ldr r0, [sp, #8]    @ get palette bank
    lsls r4, r0, #12    @ shift for VRAM attribute
.vram_loop:
    adds r0, r2, #0
    orrs r0, r4
    strh r0, [r1, #0]
    adds r2, #1
    adds r1, #2
    subs r3, #1
    cmp r3, #0
    bne .vram_loop
.vram_done:
    pop {r4, pc}

@ ============================================================
@ Animation Functions
@ ============================================================

@ 0x08014A50 - Animation state machine
thumb_func_start Animation_StateUpdate
Animation_StateUpdate:
    push {lr}
    adds r2, r0, #0
    movs r1, #0
    movs r0, #0
    strb r0, [r2, #0x1A]  @ clear frame counter
    strb r0, [r2, #0x16]  @ clear state
    ldrb r0, [r2, #0x18]  @ get animation type
    cmp r0, #0
    bne .anim_use_current
    ldrb r0, [r2, #0]     @ get base frame
    movs r1, #0x0C        @ animation speed
    b .anim_set
.anim_use_current:
    ldrb r0, [r2, #0]
.anim_set:
    strb r0, [r2, #0x14]
    pop {pc}

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

@ 0x08004574 - Level lookup table search
thumb_func_start Level_FindInTable
Level_FindInTable:
    push {lr}
    adds r3, r0, #0
    movs r1, #0
    ldr r2, =0x08027ED8   @ level table address
.search_loop:
    ldr r0, [r2, #0]
    cmp r3, r0
    bge .search_next
    adds r0, r1, #0
    b .search_done
.search_next:
    adds r2, #4
    adds r1, #1
    b .search_loop
.search_done:
    pop {pc}
    .align 2
    .word 0x08027ED8

@ ============================================================
@ DMA Transfer Functions
@ ============================================================

@ 0x08010280 - DMA transfer with control
thumb_func_start DMA_TransferWithControl
DMA_TransferWithControl:
    push {lr}
    ldr r2, =0x040000D4   @ DMA3 source
    str r1, [r2, #0]      @ source address
    ldr r1, =0x040000D8
    str r0, [r1, #0]      @ dest address
    ldr r1, =0x040000DC
    str r3, [r1, #0]      @ control
    pop {pc}
    .align 2
    .word 0x040000D4
    .word 0x040000D8
    .word 0x040000DC

@ 0x080102B0 - DMA transfer tile data
thumb_func_start DMA_TransferTiles
DMA_TransferTiles:
    push {lr}
    ldr r2, =0x0802A88C   @ source table
    lsls r1, r1, #6        @ offset = index * 64
    movs r3, #0xA1
    lsls r3, r3, #5        @ 0x1420
    adds r1, r1, r3
    adds r1, r0, r1
    movs r3, #1            @ transfer count
    bl DMA_TransferWithControl
    pop {r0}
    bx r0
    .align 2
    .word 0x0802A88C

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

@ 0x080102CC - Palette upload
thumb_func_start Palette_Upload
Palette_Upload:
    push {lr}
    add sp, #-4
    adds r1, r0, #0
    movs r0, #0
    str r0, [sp, #0]
    movs r0, #0xA1
    lsls r0, r0, #5        @ 0x1420
    adds r1, r1, r0
    ldr r2, =0x01000200    @ DMA control: 256 words, increment
    mov r0, sp
    bl BIOS_CpuFastSet
    add sp, #4
    pop {r0}
    bx r0
    .align 2
    .word 0x01000200

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

@ 0x080055B8 - Update object physics
thumb_func_start Physics_UpdateObject
Physics_UpdateObject:
    push {lr}
    add sp, #-4
    adds r2, r0, #0
    ldr r0, =0x0200005C
    ldr r0, [r0, #0]
    mov r12, r0
    
    @ Convert fixed-point to integer
    ldr r0, [r2, #0x3C]
    asrs r0, r0, #12
    str r0, [r2, #0x54]    @ screen_x = pos_x >> 12
    
    ldr r0, [r2, #0x40]
    asrs r0, r0, #12
    str r0, [r2, #0x58]    @ screen_y = pos_y >> 12
    
    ldr r0, [r2, #0x60]
    adds r1, r0, #0
    
    pop {pc}
    .align 2
    .word 0x0200005C

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

@ 0x08011AF8 - Input buffer processing
thumb_func_start Input_ProcessBuffer
Input_ProcessBuffer:
    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]      @ disable interrupts
    
    movs r0, #0
    str r0, [r7, #4]
    
.input_loop:
    ldr r0, [r7, #4]
    cmp r0, #13
    bgt .input_done
    
    @ Process input buffer entry
    adds r0, r0, #1
    str r0, [r7, #4]
    b .input_loop
    
.input_done:
    add sp, #12
    pop {r7, pc}
    .align 2
    .word 0x020001F8
    .word 0x04000208

@ ============================================================
@ More Complex Functions
@ ============================================================

@ 0x080060C4 - Sound channel update
thumb_func_start Sound_UpdateChannel
Sound_UpdateChannel:
    push {r4-r6, lr}
    asrs r3, r3, #4
    
    @ Handle different channel types
    cmp r1, #1
    beq .channel_type_1
    cmp r1, #1
    bgt .check_type_2
    cmp r1, #0
    beq .channel_type_0
    b .channel_done
    
.check_type_2:
    cmp r1, #2
    beq .channel_type_2
    b .channel_done
    
.channel_type_0:
    @ Channel 0 processing
    movs r0, #0
    b .channel_done
    
.channel_type_1:
    @ Channel 1 processing
    movs r0, #1
    b .channel_done
    
.channel_type_2:
    @ Channel 2 processing
    movs r0, #2
    
.channel_done:
    pop {r4-r6, pc}

@ 0x0801343C - Music track update
thumb_func_start Music_UpdateTrack
Music_UpdateTrack:
    push {r4-r6, lr}
    adds r5, r1, #0
    ldrb r1, [r5, #0]
    movs r0, #0x80
    tst r0, r1
    beq .track_done
    
    ldr r4, [r5, #0x20]
    cmp r4, #0
    beq .track_done
    
    movs r6, #0
.track_loop:
    ldrb r0, [r4, #0]
    cmp r0, #0
    beq .track_next
    
.track_next:
    adds r4, r4, #1
    adds r6, #1
    b .track_loop
    
.track_done:
    pop {r4-r6, pc}

@ ============================================================
@ Initialization Functions
@ ============================================================

@ 0x08013800 - Sound system init
thumb_func_start Sound_SystemInit
Sound_SystemInit:
    push {r4-r6, lr}
    ldr r0, =0x08012BE9
    movs r1, #-2
    ands r0, r1           @ align address
    ldr r1, =0x020015E0
    ldr r2, =0x04000100   @ Timer 0
    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
    .word 0x08012BE9
    .word 0x020015E0
    .word 0x04000100
    .word 0x02001D30
    .word 0x02002D70
    .word 0x0091F600

@ 0x080085FC - Object collision handler
thumb_func_start Object_HandleCollision
Object_HandleCollision:
    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           @ XOR to check sign difference
    negs r1, r2
    orrs r1, r2           @ check if signs differ
    cmp r1, #0
    bge .no_collision
    
    @ Handle collision response
    mvns r4, r3
    negs r0, r4
    
.no_collision:
    add sp, #8
    pop {r4, pc}

@ 0x080111F8 - BG layer setup
thumb_func_start BG_SetupLayer
BG_SetupLayer:
    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]
    
.bg_loop:
    ldr r0, [r7, #4]
    cmp r0, #3
    bgt .bg_done
    
    @ Setup each BG layer
    ldr r0, =0x04000008
    ldr r1, [r7, #4]
    lsls r1, r1, #2
    adds r0, r0, r1
    movs r1, #0
    strh r1, [r0, #0]
    
    ldr r0, [r7, #4]
    adds r0, #1
    str r0, [r7, #4]
    b .bg_loop
    
.bg_done:
    add sp, #12
    pop {r7, pc}
    .align 2
    .word 0x020001F8
    .word 0x04000208
    .word 0x04000008

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

@ 0x08000884 - Initialize object extended
thumb_func_start Object_InitExtended
Object_InitExtended:
    movs r1, #0
    adds r2, r0, #0
    stm r2!, {r1}         @ store 0 to [r0], advance
    str r1, [r0, #4]
    str r1, [r2, #4]
    
    movs r3, #0x80
    lsls r3, r3, #2       @ r3 = 0x200
    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

@ 0x08010F24 - Sound DMA init
thumb_func_start Sound_DMAInit
Sound_DMAInit:
    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
    .word 0x02000150
    .word 0x0000FFFF

@ ============================================================
@ Helper Functions
@ ============================================================

@ 0x08014400 - Timer/counter update
thumb_func_start Timer_Update
Timer_Update:
    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 .timer_continue
    lsrs r0, r3, #25
    cmp r0, r1
    bcc .timer_overflow
    movs r0, #15
.timer_overflow:
.timer_continue:
    pop {r4, pc}

@ 0x08014404 - (continuation of timer logic)
thumb_func_start Timer_Overflow
Timer_Overflow:
    ldrb r0, [r2, #4]
    bx lr

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

.section .rodata
.align 2

@ Level table
level_table:
    .word 0x08027ED8

@ Sound data address
sound_data:
    .word 0x08546E58

@ Display constants
display_constants:
    .hword 240           @ SCREEN_WIDTH
    .hword 160           @ SCREEN_HEIGHT

