start using GTE, rotate triangle with MVMVA cmd
[psx_test1] / src / gte.h
1 #ifndef GTE_H_
2 #define GTE_H_
3
4 #include <stdint.h>
5
6 struct gte_svector {
7         int16_t x, y, z, pad;
8 };
9
10 void gte_init(void);
11
12 #define gte_loadrot(mptr)       \
13         asm volatile ( \
14                 "lw $8, (%0)\n\t" \
15                 "lw $9, 4(%0)\n\t" \
16                 "ctc2 $8, $0\n\t" \
17                 "ctc2 $9, $1\n\t" \
18                 "lw $8, 8(%0)\n\t" \
19                 "lw $9, 12(%0)\n\t" \
20                 "ctc2 $8, $2\n\t" \
21                 "lw $8, 16(%0)\n\t" \
22                 "ctc2 $9, $3\n\t" \
23                 "ctc2 $8, $4\n\t" \
24                 : : "r"(mptr) \
25                 : "$8", "$9")
26
27 #define gte_loadtrans(vptr) \
28         asm volatile ( \
29                 "lw $8, (%0)\n\t" \
30                 "lw $9, 4(%0)\n\t" \
31                 "lw $10, 8(%0)\n\t" \
32                 "ctc2 $8, $5\n\t" \
33                 "ctc2 $9, $6\n\t" \
34                 "ctc2 $10, $7\n\t" \
35                 : : "r"(vptr) \
36                 : "$8", "$9", "$10")
37
38 #define gte_loadsvec0(svptr) \
39         asm volatile ( \
40                 "lwc2 $0, (%0)\n\t" \
41                 "lwc2 $1, 4(%0)\n\t" \
42                 : : "r"(svptr))
43
44 #define gte_loadsvec1(svptr) \
45         asm volatile ( \
46                 "lwc2 $2, (%0)\n\t" \
47                 "lwc2 $3, 4(%0)\n\t" \
48                 : : "r"(svptr))
49
50 #define gte_loadsvec2(svptr) \
51         asm volatile ( \
52                 "lwc2 $4, (%0)\n\t" \
53                 "lwc2 $5, 4(%0)\n\t" \
54                 : : "r"(svptr))
55
56 #define gte_getvec(vptr) \
57         asm volatile ( \
58                 "swc2 $25, (%0)\n\t" \
59                 "swc2 $26, 4(%0)\n\t" \
60                 "swc2 $27, 8(%0)\n\t" \
61                 : : "r"(vptr) \
62                 : "memory")
63
64 #define gte_cmd_rot() \
65         asm volatile ( \
66                 "nop\n\t" \
67                 "cop2 0x86012\n\t")
68
69 #define gte_cmd_rottrans() \
70         asm volatile ( \
71                 "nop\n\t" \
72                 "cop2 0x80012\n\t")
73
74 #endif  /* GTE_H_ */