aboutsummaryrefslogtreecommitdiff
path: root/libpsn00b/psxgpu/storeimage.s
blob: 5d4c793edd6f925a1c3f2896cf5070aef6f2bffa (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
.set noreorder

.include "hwregs_a.h"

.set RECT_x,	0
.set RECT_y,	2
.set RECT_w,	4
.set RECT_h,	6

.section .text


.global StoreImage
.type StoreImage, @function
StoreImage:
	addiu	$sp, -8
	sw		$ra, 0($sp)
	sw		$s0, 4($sp)

	lui		$s0, 0x1f80			# Set I/O segment base address

.Lgpu_wait:						# Wait for GPU to be ready for commands and DMA
	jal		ReadGPUstat
	nop
	srl		$v0, 0x1a
	andi	$v0, 0x5
	li		$v1, 5
	bne		$v0, $v1, .Lgpu_wait
	nop

	lui		$v0, 0x400			# Set DMA direction to off
	sw		$v0, GP1($s0)

	lui		$v0, 0x0100			# Clear GPU cache
	sw		$v0, GP0($s0)

	lui		$v1, 0xc000			# Store image from VRAM
	sw		$v1, GP0($s0)
	lw		$v0, RECT_x($a0)	# Set XY and dimensions of image
	lw		$v1, RECT_w($a0)
	sw		$v0, GP0($s0)
	sw		$v1, GP0($s0)

	lui		$v0, 0x400			# Set DMA direction to VRAMtoCPU
	ori		$v0, 0x3
	sw		$v0, GP1($s0)

	lhu		$v0, RECT_w($a0)	# Get rectangle size
	lhu		$v1, RECT_h($a0)
	nop
	mult	$v0, $v1			# Calculate BCR value
	mflo	$v1
	srl		$v1, 0x4
	sll		$v1, 0x10
	ori		$v1, 0x8

	sw		$a1, D2_MADR($s0)	# Set DMA base address and transfer length
	sw		$v1, D2_BCR($s0)

.Lgpu_wait_2:					# Wait for GPU to be ready for commands and DMA
	jal		ReadGPUstat
	nop
	srl		$v0, 27
	andi	$v0, 0x1
	beqz	$v0, .Lgpu_wait_2
	nop
	
	lui		$v0, 0x100			# Start DMA transfer
	ori		$v0, 0x200
	sw		$v0, D2_CHCR($s0)

	lw		$ra, 0($sp)
	lw		$s0, 4($sp)
	jr		$ra
	addiu	$sp, 8