diff options
| author | John "Lameguy" Wilbert Villamor <lameguy64@gmail.com> | 2022-09-26 16:49:56 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-09-26 16:49:56 +0800 |
| commit | c4a2533d21dfd05cde841ea48c67b05e0e6a853f (patch) | |
| tree | c7ef61653b157b69fb0956709366996ddbc4ecfa /libpsn00b/psxgpu/resetgraph.s | |
| parent | a8b404b3400c3ebd8e0b923dcaefcc49ea563e36 (diff) | |
| parent | 86f0064afb8200e60dd80827535cac30d0eab028 (diff) | |
| download | psn00bsdk-c4a2533d21dfd05cde841ea48c67b05e0e6a853f.tar.gz | |
Merge pull request #55 from spicyjpeg/psxmdec
Full MDEC support, C library refactors, cleanups and bugfixes (v0.20)
Diffstat (limited to 'libpsn00b/psxgpu/resetgraph.s')
| -rw-r--r-- | libpsn00b/psxgpu/resetgraph.s | 363 |
1 files changed, 0 insertions, 363 deletions
diff --git a/libpsn00b/psxgpu/resetgraph.s b/libpsn00b/psxgpu/resetgraph.s deleted file mode 100644 index 6327f02..0000000 --- a/libpsn00b/psxgpu/resetgraph.s +++ /dev/null @@ -1,363 +0,0 @@ -.set noreorder - -.include "hwregs_a.h" - -.section .text - -.set ISR_STACK_SIZE, 4096 - -.global ResetGraph # Resets the GPU and installs a -.type ResetGraph, @function # VSync event handler -ResetGraph: - addiu $sp, -8 # C style stack allocation (required if - sw $ra, 0($sp) # you call BIOS functions from asm) - sw $a0, 4($sp) - - la $a0, resetgraph_msg - move $a1, $0 - move $a2, $0 - la $a1, _irq_func_table - la $a2, _custom_exit - jal printf - addiu $sp, -16 - addiu $sp, 16 - - la $a0, sr_msg - mfc0 $a1, $12 - jal printf - addiu $sp, -16 - addiu $sp, 16 - - la $v0, _hooks_installed # Skip installing hooks if this function - lbu $v0, 0($v0) # has already been called before once - nop - bnez $v0, .Lskip_hook_init - nop - - jal EnterCriticalSection # Disable interrupts as LoadExec() keeps - nop # interrupts enabled when transferring - # execution to the loaded program - - lui $a3, IOBASE # Base address for I/O - - lui $v0, 0x3b33 # Enables DMA channel 6 (for ClearOTag) - ori $v0, 0x3b33 # Enables DMA channel 2 - sw $v0, DMA_DPCR($a3) - sw $0 , DMA_DICR($a3) # Clear DICR (not needed) - - sw $0 , IRQ_MASK($a3) # Clear IRQ settings - - la $v0, _hooks_installed # Set installed flag - li $v1, 0x1 - sb $v1, 0($v0) - - la $v0, _vsync_cb_func # Clear VSync callback function - sw $0 , 0($v0) - - la $a1, _vsync_irq_callback # Install VSync interrupt callback - jal InterruptCallback - li $a0, 0 - - jal RestartCallback - nop - - la $a0, cbhooks_msg - jal printf - addiu $sp, -16 - addiu $sp, 16 - - jal _96_remove # Remove CD handling left by the BIOS - nop - - la $a0, abouttoen_msg - jal printf - addiu $sp, -16 - addiu $sp, 16 - - jal ExitCriticalSection # Re-enable interrupts - nop - - la $a0, enableint_msg - jal printf - addiu $sp, -16 - addiu $sp, 16 - -.Lskip_hook_init: - - lui $a3, IOBASE - - lw $v0, GPU_GP1($a3) # Get video standard - lui $v1, 0x0010 - and $v0, $v1 - la $v1, _gpu_standard - beqz $v0, .Lnot_pal - sw $0 , 0($v1) - li $v0, 1 - sw $v0, 0($v1) -.Lnot_pal: - - lw $a0, 4($sp) # Get argument value - - lui $a3, IOBASE # Set base I/O again (likely destroyed - # by previous calls) - - li $v0, 0x1d00 # Configure timer 1 as Hblank counter - sw $v0, TIMER1_CTRL($a3) # Set timer 1 value - - beq $a0, 1, .Lgpu_init_1 - nop - beq $a0, 3, .Lgpu_init_3 - nop - - sw $0 , GPU_GP1($a3) # Reset the GPU - - b .Linit_done - nop - -.Lgpu_init_1: - - sw $0 , DMA2_CHCR($a3) # Stop any DMA - -.Lgpu_init_3: - - li $v0, 0x1 # Reset the command buffer - sw $v0, GPU_GP1($a3) - -.Linit_done: - - lw $ra, 0($sp) - lw $a0, 4($sp) # Return - jr $ra - addiu $sp, 8 - - -.global VSync # VSync function -.type VSync, @function -VSync: - - addiu $sp, -12 - sw $ra, 0($sp) - sw $s0, 4($sp) - - lui $a3, IOBASE # Get GPU status (for interlace sync) - lw $s0, GPU_GP1($a3) - -.Lhwait_loop: # Get Hblank time - lw $v0, TIMER1_VALUE($a3) - nop - lw $v1, TIMER1_VALUE($a3) - nop - bne $v0, $v1, .Lhwait_loop - nop - - la $a3, _vsync_lasthblank # Calculate Hblank time since last - lw $v1, 0($a3) - nop - subu $v0, $v1 - andi $v0, 0xffff - - beq $a0, 1, .Lhblank_exit # Return Hblank time only, no VSync - sw $v0, 8($sp) # Stored as return value - - bgez $a0, .Lvsync # Vsync if argument is 0 and up - nop - - la $v0, _vsync_rcnt # Return VSync count only - lw $v0, 0($v0) - nop - b .Lvsync_exit - sw $v0, 8($sp) - -.Lvsync: - - bnez $a0, .Lnot_zero - nop - li $a0, 1 - -.Lnot_zero: - - la $v0, _vsync_rcnt # Call vsync sub function (with timeout) - lw $v0, 0($v0) - addiu $a1, $a0, 1 - jal _vsync_sub - addu $a0, $v0, $a0 - - lui $v0, 0x40 - and $v0, $s0, $v0 - beqz $v0, .Lhblank_exit - nop - - lui $a3, IOBASE # Interlace wait logic - - lw $v0, GPU_GP1($a3) - nop - xor $v0, $s0, $v0 - bltz $v0, .Lhblank_exit - lui $a0, 0x8000 - -.Linterlace_wait: - lw $v0, GPU_GP1($a3) - nop - xor $v0, $s0, $v0 - and $v0, $a0 - beqz $v0, .Linterlace_wait - nop - -.Lhblank_exit: # Set current Hblank as last value - - la $a2, _vsync_lasthblank - -.Lhwait2_loop: - lw $v0, TIMER1_VALUE($a3) - nop - lw $v1, TIMER1_VALUE($a3) - sw $v0, 0($a2) - bne $v0, $v1, .Lhwait2_loop - nop - -.Lvsync_exit: - - lw $ra, 0($sp) - lw $s0, 4($sp) - lw $v0, 8($sp) - jr $ra - addiu $sp, 12 - - -.type _vsync_sub, @function -_vsync_sub: - - # a0 - VSync destination count - # a1 - Timeout ratio (number of vsyncs to wait relative to vsync count) - - addiu $sp, -4 - sw $ra, 0($sp) - - sll $a1, 15 # Timeout counter - - la $v0, _vsync_rcnt - lw $v0, 0($v0) - nop - bge $v0, $a0, .Lvsync_sub_exit - nop - -.Lvsync_wait: - - addiu $a1, -1 - - la $v1, 0xffffffff - bne $a1, $v1, .Lnot_timeout - nop - - la $a0, vsynctimeout_msg - jal puts - addiu $sp, -8 - - jal ChangeClearPAD - move $a0, $0 - - li $a0, 3 - jal ChangeClearRCnt - move $a1, $0 - - addiu $sp, 8 - b .Lvsync_sub_exit - li $v0, -1 - -.Lnot_timeout: - - la $v0, _vsync_rcnt - lw $v0, 0($v0) - nop - blt $v0, $a0, .Lvsync_wait - nop - -.Lvsync_sub_exit: - - lw $ra, 0($sp) - addiu $sp, 4 - jr $ra - move $v0, $0 - - - -.type _vsync_irq_callback, @function -_vsync_irq_callback: - - lui $a0, IOBASE - - la $v1, _vsync_rcnt # Increment VSync root counter - lw $v0, 0($v1) - nop - addiu $v0, 1 - sw $v0, 0($v1) - - la $v0, _vsync_cb_func # Check if a callback function is set - lw $v0, 0($v0) - nop - beqz $v0, .Lno_callback - nop - - addiu $sp, -4 # Save return address - sw $ra, 0($sp) - jalr $v0 # Execute user callback function - nop - lw $ra, 0($sp) # Restore previous return address - addiu $sp, 4 - - lui $a0, IOBASE - -.Lno_callback: - - jr $ra - nop - - -.section .data - -# VSync root counter -.type _vsync_rcnt, @object -_vsync_rcnt: - .word 0 - -.type _vsync_lasthblank, @object -_vsync_lasthblank: - .word 0 - -.comm _vsync_cb_func, 4, 4 - -.comm _gpu_standard, 4, 4 -.comm _gpu_current_field, 4, 4 -.comm _hooks_installed, 4, 4 - - -.type vsynctimeout_msg, @object -vsynctimeout_msg: - .asciiz "VSync: timeout\n" - -.type resetgraph_msg, @object -resetgraph_msg: - .asciiz "ResetGraph:itb=%08x,ehk=%08x\n" - -.type enableint_msg, @object -enableint_msg: - .asciiz "ResetGraph:Interrupts enabled!\n" - -.type cbhooks_msg, @object -cbhooks_msg: - .asciiz "ResetGraph:Interrupt hooks enabled.\n" - -.type abouttoen_msg, @object -abouttoen_msg: - .asciiz "ResetGraph:About to init interrupts.\n" - -.type sr_msg, @object -sr_msg: - .asciiz "ResetGraph:SR=%x\n" - -.global psxgpu_credits -.type psxgpu_credits, @object -psxgpu_credits: - .ascii "psxgpu programs by Lameguy64\n" - .asciiz "2020 PSn00bSDK Project / Meido-Tek Productions\n" -
\ No newline at end of file |
