aboutsummaryrefslogtreecommitdiff
path: root/libpsn00b/psxgpu/putdrawenv.s
blob: c0d56760bc547c346b93dfba6140913eaf8d4d13 (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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
.set noreorder
.set noat

.include "hwregs_a.h"

.set DRAW_x,		0		# Drawing area
.set DRAW_y,		2
.set DRAW_w,		4
.set DRAW_h,		6
.set DRAW_ofx,		8		# Draw offset
.set DRAW_ofy,		10
.set DRAW_tx,		12		# Texture window
.set DRAW_ty,		14
.set DRAW_tw,		16
.set DRAW_th,		18
.set DRAW_tpage,	20		# TPage values
.set DRAW_dtd,		22
.set DRAW_dfe,		23
.set DRAW_isbg,		24		# Clear draw area
.set DRAW_r0,		25
.set DRAW_g0,		26
.set DRAW_b0,		27
.set DRAW_env,		28


.section .text

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

	addiu	$a1, $a0, DRAW_env

	li		$v0, 0x04ffffff				# Packet header (length+terminator)
	sw		$v0, 0($a1)

	lhu		$v0, DRAW_x($a0)			# Set draw area top-left
	lhu		$v1, DRAW_y($a0)
	andi	$v0, 0x3ff
	andi	$v1, 0x1ff
	sll		$v1, 10
	or		$v0, $v1
	lui		$v1, 0xe300
	or		$v0, $v1
	sw		$v0, 4($a1)					# 1

	.set noat

	lhu		$v0, DRAW_w($a0)			# Set draw area bottom-right
	lhu		$at, DRAW_x($a0)
	addiu	$v0, -1
	addu	$at, $v0
	andi	$at, 0x3ff
	lhu		$v1, DRAW_h($a0)
	lhu		$v0, DRAW_y($a0)
	addiu	$v1, -1
	addu	$v0, $v1
	andi	$v0, 0x1ff
	sll		$v0, 10
	or		$at, $v0
	lui		$v0, 0xe400
	or		$at, $v0
	sw		$at, 8($a1)					# 2

	lhu		$v0, DRAW_x($a0)			# Set drawing offset
	lhu		$v1, DRAW_ofx($a0)
	nop
	add		$v0, $v1
	andi	$at, $v0, 0x7ff
	lhu		$v0, DRAW_y($a0)
	lhu		$v1, DRAW_ofy($a0)
	nop
	add		$v0, $v1
	andi	$v0, 0x7ff
	sll		$v0, 11
	or		$at, $v0
	lui		$v0, 0xe500
	or		$at, $v0
	sw		$at, 12($a1)				# 3

	lhu		$at, DRAW_tpage($a0)		# Set tpage
	lbu		$v0, DRAW_dtd($a0)
	lbu		$v1, DRAW_dfe($a0)
	andi	$v0, 1
	and		$v1, 1
	sll		$v0, 9
	sll		$v1, 10
	or		$at, $v0
	or		$at, $v1
	lui		$v0, 0xe100
	or		$at, $v0
	sw		$at, 16($a1)				# 4

	.set at

	lbu		$v0, DRAW_isbg($a0)
	nop
	beqz	$v0, .Lno_fillVRAM
	nop

	lw		$v0, DRAW_isbg($a0)			# FillVRAM
	lui		$v1, 0x0200
	srl		$v0, 8
	or		$v0, $v1
	sw		$v0, 20($a1)				# 5
	lw		$v0, DRAW_x($a0)
	lw		$v1, DRAW_w($a0)
	sw		$v0, 24($a1)				# 6

	srl		$v0, $v1, 16				# Workaround as rectangle primitives
	blt		$v0, 511, .Lno_overflow		# don't accept a height of 512
	nop

	li		$v0, 511
	sll		$v0, 16
	andi	$v1, 0xffff
	or		$v1, $v0

.Lno_overflow:
	sw		$v1, 28($a1)				# 7
	li		$v0, 0x07ffffff				# Packet header (length+terminator)
	sw		$v0, 0($a1)

.Lno_fillVRAM:

.Lgpu_wait:								# Wait for GPU to become ready for commands and DMA
	jal		ReadGPUstat
	nop
	srl		$v0, 26
	andi	$v0, 1
	beqz	$v0, .Lgpu_wait
	nop

	jal		DrawOTag
	move	$a0, $a1

	lw		$ra, 0($sp)
	addiu	$sp, 4
	jr		$ra
	nop