diff options
Diffstat (limited to 'asm/gpu_reg_manager.s')
-rw-r--r-- | asm/gpu_reg_manager.s | 414 |
1 files changed, 414 insertions, 0 deletions
diff --git a/asm/gpu_reg_manager.s b/asm/gpu_reg_manager.s new file mode 100644 index 000000000..13f4bc528 --- /dev/null +++ b/asm/gpu_reg_manager.s @@ -0,0 +1,414 @@ + thumb_func_start lcd_io_copy_queue_clean +lcd_io_copy_queue_clean: @ 8000FE4 + push {r4-r7,lr} + mov r7, r8 + push {r7} + movs r2, 0 + ldr r7, =0x030008d8 + ldr r0, =0x030008d9 + mov r12, r0 + ldr r1, =0x030008da + mov r8, r1 + ldr r6, =0x03000818 + movs r5, 0 + ldr r4, =0x03000878 + movs r3, 0xFF +_08000FFE: + adds r0, r2, r6 + strb r5, [r0] + adds r1, r2, r4 + ldrb r0, [r1] + orrs r0, r3 + strb r0, [r1] + adds r2, 0x1 + cmp r2, 0x5F + ble _08000FFE + movs r0, 0 + strb r0, [r7] + mov r1, r12 + strb r0, [r1] + movs r0, 0 + mov r1, r8 + strh r0, [r1] + pop {r3} + mov r8, r3 + pop {r4-r7} + pop {r0} + bx r0 + .align 2, 0 + .pool + thumb_func_end lcd_io_copy_queue_clean + + thumb_func_start lcd_io_buffer_to_hardware +lcd_io_buffer_to_hardware: @ 800103C + push {lr} + lsls r0, 24 + lsrs r2, r0, 24 + cmp r2, 0x4 + bne _08001068 + ldr r2, =0x04000004 + ldrh r1, [r2] + ldr r0, =0x0000ffe7 + ands r0, r1 + strh r0, [r2] + ldr r1, =0x0300081c + ldrh r0, [r2] + ldrh r1, [r1] + orrs r0, r1 + strh r0, [r2] + b _08001076 + .align 2, 0 + .pool +_08001068: + movs r0, 0x80 + lsls r0, 19 + adds r0, r2, r0 + ldr r1, =0x03000818 + adds r1, r2, r1 + ldrh r1, [r1] + strh r1, [r0] +_08001076: + pop {r0} + bx r0 + .align 2, 0 + .pool + thumb_func_end lcd_io_buffer_to_hardware + + thumb_func_start lcd_io_copy_queue_process +lcd_io_copy_queue_process: @ 8001080 + push {r4,r5,lr} + ldr r0, =0x030008d8 + ldrb r0, [r0] + cmp r0, 0 + bne _080010A4 + movs r5, 0 +_0800108C: + ldr r0, =0x03000878 + adds r4, r5, r0 + ldrb r0, [r4] + cmp r0, 0xFF + beq _080010A4 + bl lcd_io_buffer_to_hardware + movs r0, 0xFF + strb r0, [r4] + adds r5, 0x1 + cmp r5, 0x5F + ble _0800108C +_080010A4: + pop {r4,r5} + pop {r0} + bx r0 + .align 2, 0 + .pool + thumb_func_end lcd_io_copy_queue_process + + thumb_func_start lcd_io_set +lcd_io_set: @ 80010B4 + push {r4,r5,lr} + lsls r0, 24 + lsrs r4, r0, 24 + lsls r1, 16 + lsrs r1, 16 + cmp r4, 0x5F + bhi _08001130 + ldr r0, =0x03000818 + adds r0, r4, r0 + strh r1, [r0] + ldr r0, =0x04000006 + ldrh r1, [r0] + movs r0, 0xFF + ands r0, r1 + subs r0, 0xA1 + lsls r0, 16 + lsrs r0, 16 + cmp r0, 0x40 + bls _080010E8 + movs r0, 0x80 + lsls r0, 19 + ldrh r1, [r0] + movs r0, 0x80 + ands r0, r1 + cmp r0, 0 + beq _080010FE +_080010E8: + adds r0, r4, 0 + bl lcd_io_buffer_to_hardware + b _08001130 + .align 2, 0 + .pool +_080010F8: + movs r0, 0 + strb r0, [r5] + b _08001130 +_080010FE: + ldr r2, =0x030008d8 + movs r0, 0x1 + strb r0, [r2] + movs r3, 0 + ldr r0, =0x03000878 + ldrb r1, [r0] + adds r5, r2, 0 + adds r2, r0, 0 + cmp r1, 0xFF + beq _08001128 + adds r1, r2, 0 +_08001114: + ldrb r0, [r1] + cmp r0, r4 + beq _080010F8 + adds r1, 0x1 + adds r3, 0x1 + cmp r3, 0x5F + bgt _08001128 + ldrb r0, [r1] + cmp r0, 0xFF + bne _08001114 +_08001128: + adds r0, r3, r2 + movs r1, 0 + strb r4, [r0] + strb r1, [r5] +_08001130: + pop {r4,r5} + pop {r0} + bx r0 + .align 2, 0 + .pool + thumb_func_end lcd_io_set + + thumb_func_start lcd_io_set_forced_blank +lcd_io_set_forced_blank: @ 8001140 + push {r4,r5,lr} + lsls r0, 24 + lsrs r4, r0, 24 + lsls r1, 16 + lsrs r1, 16 + cmp r4, 0x5F + bhi _080011A8 + ldr r0, =0x03000818 + adds r0, r4, r0 + strh r1, [r0] + movs r0, 0x80 + lsls r0, 19 + ldrh r1, [r0] + movs r0, 0x80 + ands r0, r1 + cmp r0, 0 + beq _08001176 + adds r0, r4, 0 + bl lcd_io_buffer_to_hardware + b _080011A8 + .align 2, 0 + .pool +_08001170: + movs r0, 0 + strb r0, [r5] + b _080011A8 +_08001176: + ldr r2, =0x030008d8 + movs r0, 0x1 + strb r0, [r2] + movs r3, 0 + ldr r0, =0x03000878 + ldrb r1, [r0] + adds r5, r2, 0 + adds r2, r0, 0 + cmp r1, 0xFF + beq _080011A0 + adds r1, r2, 0 +_0800118C: + ldrb r0, [r1] + cmp r0, r4 + beq _08001170 + adds r1, 0x1 + adds r3, 0x1 + cmp r3, 0x5F + bgt _080011A0 + ldrb r0, [r1] + cmp r0, 0xFF + bne _0800118C +_080011A0: + adds r0, r3, r2 + movs r1, 0 + strb r4, [r0] + strb r1, [r5] +_080011A8: + pop {r4,r5} + pop {r0} + bx r0 + .align 2, 0 + .pool + thumb_func_end lcd_io_set_forced_blank + + thumb_func_start lcd_io_get +lcd_io_get: @ 80011B8 + push {lr} + lsls r0, 24 + lsrs r0, 24 + adds r1, r0, 0 + cmp r1, 0x4 + bne _080011CC + ldr r0, =0x04000004 + b _080011DE + .align 2, 0 + .pool +_080011CC: + cmp r1, 0x6 + beq _080011DC + ldr r0, =0x03000818 + adds r0, r1, r0 + ldrh r0, [r0] + b _080011E0 + .align 2, 0 + .pool +_080011DC: + ldr r0, =0x04000006 +_080011DE: + ldrh r0, [r0] +_080011E0: + pop {r1} + bx r1 + .align 2, 0 + .pool + thumb_func_end lcd_io_get + + thumb_func_start lcd_io_set_bits +lcd_io_set_bits: @ 80011E8 + push {lr} + adds r2, r1, 0 + lsls r0, 24 + lsrs r0, 24 + ldr r1, =0x03000818 + adds r1, r0, r1 + ldrh r1, [r1] + orrs r1, r2 + lsls r1, 16 + lsrs r1, 16 + bl lcd_io_set + pop {r0} + bx r0 + .align 2, 0 + .pool + thumb_func_end lcd_io_set_bits + + thumb_func_start lcd_io_clear_bits +lcd_io_clear_bits: @ 8001208 + push {lr} + adds r2, r1, 0 + lsls r0, 24 + lsrs r0, 24 + lsls r2, 16 + ldr r1, =0x03000818 + adds r1, r0, r1 + ldrh r1, [r1] + lsrs r2, 16 + bics r1, r2 + bl lcd_io_set + pop {r0} + bx r0 + .align 2, 0 + .pool + thumb_func_end lcd_io_clear_bits + + thumb_func_start update_hardware_IE +update_hardware_IE: @ 8001228 + push {r4,r5,lr} + ldr r5, =0x030008d9 + ldrb r0, [r5] + cmp r0, 0 + beq _08001246 + ldr r2, =0x04000208 + ldrh r1, [r2] + movs r4, 0 + strh r4, [r2] + ldr r3, =0x04000200 + ldr r0, =0x030008da + ldrh r0, [r0] + strh r0, [r3] + strh r1, [r2] + strb r4, [r5] +_08001246: + pop {r4,r5} + pop {r0} + bx r0 + .align 2, 0 + .pool + thumb_func_end update_hardware_IE + + thumb_func_start enable_irqs +enable_irqs: @ 800125C + push {r4,lr} + lsls r0, 16 + lsrs r0, 16 + ldr r4, =0x030008da + ldrh r1, [r4] + orrs r0, r1 + strh r0, [r4] + ldr r1, =0x030008d9 + movs r0, 0x1 + strb r0, [r1] + bl update_hardware_IE + ldrh r0, [r4] + bl dispstat_set_vblank_hblank_irqs + pop {r4} + pop {r0} + bx r0 + .align 2, 0 + .pool + thumb_func_end enable_irqs + + thumb_func_start disable_irqs +disable_irqs: @ 8001288 + push {r4,lr} + lsls r0, 16 + lsrs r0, 16 + ldr r4, =0x030008da + ldrh r1, [r4] + bics r1, r0 + strh r1, [r4] + ldr r1, =0x030008d9 + movs r0, 0x1 + strb r0, [r1] + bl update_hardware_IE + ldrh r0, [r4] + bl dispstat_set_vblank_hblank_irqs + pop {r4} + pop {r0} + bx r0 + .align 2, 0 + .pool + thumb_func_end disable_irqs + + thumb_func_start dispstat_set_vblank_hblank_irqs +dispstat_set_vblank_hblank_irqs: @ 80012B4 + push {r4,lr} + adds r4, r0, 0 + lsls r4, 16 + lsrs r4, 16 + movs r0, 0x4 + bl lcd_io_get + movs r2, 0x18 + ands r2, r0 + movs r1, 0x1 + ands r1, r4 + negs r0, r1 + orrs r0, r1 + asrs r1, r0, 31 + movs r0, 0x8 + ands r1, r0 + movs r0, 0x2 + ands r0, r4 + cmp r0, 0 + beq _080012E0 + movs r0, 0x10 + orrs r1, r0 +_080012E0: + cmp r2, r1 + beq _080012EA + movs r0, 0x4 + bl lcd_io_set +_080012EA: + pop {r4} + pop {r0} + bx r0 + thumb_func_end dispstat_set_vblank_hblank_irqs |