rev |
line source |
nuclear@0
|
1 #include <stdint.h>
|
nuclear@0
|
2 #include <math.h>
|
nuclear@0
|
3 #include "dsregs.h"
|
nuclear@0
|
4 #include "ds3.h"
|
nuclear@0
|
5
|
nuclear@2
|
6 static void draw_cube(void);
|
nuclear@0
|
7 static void xorpat(void *addr, int xsz, int ysz);
|
nuclear@0
|
8
|
nuclear@0
|
9 static void *vram = VRAM_LCDC_PTR;
|
nuclear@0
|
10 static uint16_t *bgmem = VRAM_BGB_PTR;
|
nuclear@0
|
11
|
nuclear@0
|
12 #define SIN_TAB_SZ 256
|
nuclear@0
|
13 static int32_t sintab[SIN_TAB_SZ];
|
nuclear@0
|
14 static int32_t costab[SIN_TAB_SZ];
|
nuclear@0
|
15
|
nuclear@0
|
16 int main(void)
|
nuclear@0
|
17 {
|
nuclear@0
|
18 int i;
|
nuclear@0
|
19 uint32_t frame;
|
nuclear@0
|
20 int32_t m[16] = {
|
nuclear@0
|
21 0x10000, 0, 0, 0,
|
nuclear@0
|
22 0, 0x10000, 0, 0,
|
nuclear@0
|
23 0, 0, 0x10000, 0,
|
nuclear@0
|
24 0, 0, 0, 0x10000
|
nuclear@0
|
25 };
|
nuclear@0
|
26
|
nuclear@0
|
27 REG_POWCNT1 = POWCNT1_LCD | POWCNT1_3DREND | POWCNT1_3DGEOM | POWCNT1_2DA | POWCNT1_2DB | POWCNT1_DSWAP;
|
nuclear@0
|
28
|
nuclear@0
|
29 REG_DISPCNT = DISPCNT_MODE(1) | DISPCNT_BG0 | DISPCNT_BG0_3D;
|
nuclear@0
|
30 REG_B_DISPCNT = DISPCNT_MODE(1) | DISPCNT_BG2 | 5;
|
nuclear@0
|
31
|
nuclear@0
|
32 REG_B_BG2CNT = BGXCNT_BM_256X256 | BGXCNT_BM16 | BGXCNT_OVF_WRAP;
|
nuclear@0
|
33 REG_B_BG2PA = 0x100;
|
nuclear@0
|
34 REG_B_BG2PB = 0;
|
nuclear@0
|
35 REG_B_BG2PC = 0;
|
nuclear@0
|
36 REG_B_BG2PD = 0x100;
|
nuclear@0
|
37
|
nuclear@0
|
38 REG_VRAMCNT_A = VRAM_ENABLE;
|
nuclear@0
|
39 REG_VRAMCNT_C = VRAM_ENABLE | 4;
|
nuclear@0
|
40
|
nuclear@0
|
41 xorpat(bgmem, 256, 256);
|
nuclear@0
|
42
|
nuclear@0
|
43 for(i=0; i<SIN_TAB_SZ; i++) {
|
nuclear@0
|
44 float theta = (float)i * M_PI * 2.0 / (float)SIN_TAB_SZ;
|
nuclear@0
|
45 float s = sin(theta);
|
nuclear@0
|
46 float c = cos(theta);
|
nuclear@0
|
47 sintab[i] = (int32_t)(s * 65536.0);
|
nuclear@0
|
48 costab[i] = (int32_t)(c * 65536.0);
|
nuclear@0
|
49 }
|
nuclear@0
|
50
|
nuclear@0
|
51 ds3_clear_color(RGB15(4, 4, 4), 31);
|
nuclear@0
|
52 ds3_clear_depth(0x7fff);
|
nuclear@0
|
53 ds3_viewport(0, 0, 256, 192);
|
nuclear@0
|
54
|
nuclear@1
|
55 ds3_enable(DS3_POLYGON_SMOOTH);
|
nuclear@0
|
56
|
nuclear@2
|
57 REG_POLYGON_ATTR = 0x001f0080; /* alpha = 31, cull back */
|
nuclear@0
|
58
|
nuclear@0
|
59 ds3_matrix_mode(DS3_PROJECTION);
|
nuclear@0
|
60 ds3_load_identity();
|
nuclear@2
|
61 /*ds3_ortho(-87381, 87381, -65536, 65536, -65536, 65536);*/
|
nuclear@2
|
62 /*ds3_orthof(-1.3333, 1.33333, -1, 1, -1, 1);*/
|
nuclear@2
|
63 ds3_perspectivef(45, 1.33333, 1.0, 100.0);
|
nuclear@0
|
64
|
nuclear@0
|
65 for(;;) {
|
nuclear@0
|
66 int idx = frame & 0xff;
|
nuclear@0
|
67 int32_t scale = (sintab[(frame >> 1) & 0xff] >> 9) + 204;
|
nuclear@0
|
68 int32_t sa = ((sintab[idx] >> 8) * scale) >> 8;
|
nuclear@0
|
69 int32_t ca = ((costab[idx] >> 8) * scale) >> 8;
|
nuclear@0
|
70 int32_t x = ca * -128 + sa * -96 + (128 << 8);
|
nuclear@0
|
71 int32_t y = -sa * -128 + ca * -96 + (96 << 8);
|
nuclear@0
|
72
|
nuclear@2
|
73 ds3_matrix_mode(DS3_MODELVIEW);
|
nuclear@2
|
74 ds3_load_identity();
|
nuclear@2
|
75 ds3_translate(0, 0, -0x30000);
|
nuclear@0
|
76
|
nuclear@2
|
77 m[0] = 0x10000;
|
nuclear@2
|
78 m[2] = m[8] = 0;
|
nuclear@2
|
79 m[5] = costab[idx]; m[6] = sintab[idx];
|
nuclear@2
|
80 m[9] = -sintab[idx]; m[10] = costab[idx];
|
nuclear@2
|
81 ds3_mult_matrix(m);
|
nuclear@0
|
82
|
nuclear@2
|
83 m[5] = 0x10000;
|
nuclear@2
|
84 m[6] = m[9] = 0;
|
nuclear@2
|
85 m[0] = costab[idx]; m[2] = -sintab[idx];
|
nuclear@2
|
86 m[8] = sintab[idx];
|
nuclear@2
|
87 ds3_mult_matrix(m);
|
nuclear@2
|
88
|
nuclear@2
|
89 draw_cube();
|
nuclear@0
|
90
|
nuclear@0
|
91 ds3_swap_buffers();
|
nuclear@0
|
92 while(REG_VCOUNT < 192);
|
nuclear@0
|
93
|
nuclear@0
|
94 REG_B_BG2PA = ca;
|
nuclear@0
|
95 REG_B_BG2PB = sa;
|
nuclear@0
|
96 REG_B_BG2PC = -sa;
|
nuclear@0
|
97 REG_B_BG2PD = ca;
|
nuclear@0
|
98 REG_B_BG2X = x;
|
nuclear@0
|
99 REG_B_BG2Y = y;
|
nuclear@0
|
100
|
nuclear@0
|
101 ++frame;
|
nuclear@0
|
102 }
|
nuclear@0
|
103 return 0;
|
nuclear@0
|
104 }
|
nuclear@0
|
105
|
nuclear@2
|
106 #define VOFFS 0x8000
|
nuclear@2
|
107 static void draw_cube(void)
|
nuclear@2
|
108 {
|
nuclear@2
|
109 ds3_begin(DS3_QUADS);
|
nuclear@2
|
110 ds3_color(RGB15(31, 0, 0));
|
nuclear@2
|
111 ds3_vertex3(-VOFFS, -VOFFS, VOFFS);
|
nuclear@2
|
112 ds3_vertex3(VOFFS, -VOFFS, VOFFS);
|
nuclear@2
|
113 ds3_vertex3(VOFFS, VOFFS, VOFFS);
|
nuclear@2
|
114 ds3_vertex3(-VOFFS, VOFFS, VOFFS);
|
nuclear@2
|
115 ds3_color(RGB15(0, 31, 0));
|
nuclear@2
|
116 ds3_vertex3(VOFFS, -VOFFS, VOFFS);
|
nuclear@2
|
117 ds3_vertex3(VOFFS, -VOFFS, -VOFFS);
|
nuclear@2
|
118 ds3_vertex3(VOFFS, VOFFS, -VOFFS);
|
nuclear@2
|
119 ds3_vertex3(VOFFS, VOFFS, VOFFS);
|
nuclear@2
|
120 ds3_color(RGB15(0, 0, 31));
|
nuclear@2
|
121 ds3_vertex3(VOFFS, -VOFFS, -VOFFS);
|
nuclear@2
|
122 ds3_vertex3(-VOFFS, -VOFFS, -VOFFS);
|
nuclear@2
|
123 ds3_vertex3(-VOFFS, VOFFS, -VOFFS);
|
nuclear@2
|
124 ds3_vertex3(VOFFS, VOFFS, -VOFFS);
|
nuclear@2
|
125 ds3_color(RGB15(31, 31, 0));
|
nuclear@2
|
126 ds3_vertex3(-VOFFS, -VOFFS, -VOFFS);
|
nuclear@2
|
127 ds3_vertex3(-VOFFS, -VOFFS, VOFFS);
|
nuclear@2
|
128 ds3_vertex3(-VOFFS, VOFFS, VOFFS);
|
nuclear@2
|
129 ds3_vertex3(-VOFFS, VOFFS, -VOFFS);
|
nuclear@2
|
130 ds3_color(RGB15(31, 0, 31));
|
nuclear@2
|
131 ds3_vertex3(-VOFFS, VOFFS, VOFFS);
|
nuclear@2
|
132 ds3_vertex3(VOFFS, VOFFS, VOFFS);
|
nuclear@2
|
133 ds3_vertex3(VOFFS, VOFFS, -VOFFS);
|
nuclear@2
|
134 ds3_vertex3(-VOFFS, VOFFS, -VOFFS);
|
nuclear@2
|
135 ds3_color(RGB15(0, 31, 31));
|
nuclear@2
|
136 ds3_vertex3(VOFFS, -VOFFS, -VOFFS);
|
nuclear@2
|
137 ds3_vertex3(VOFFS, -VOFFS, VOFFS);
|
nuclear@2
|
138 ds3_vertex3(-VOFFS, -VOFFS, VOFFS);
|
nuclear@2
|
139 ds3_vertex3(-VOFFS, -VOFFS, -VOFFS);
|
nuclear@2
|
140 ds3_end();
|
nuclear@2
|
141 }
|
nuclear@2
|
142
|
nuclear@0
|
143 static void xorpat(void *addr, int xsz, int ysz)
|
nuclear@0
|
144 {
|
nuclear@0
|
145 int i, j;
|
nuclear@0
|
146 uint16_t *p = addr;
|
nuclear@0
|
147
|
nuclear@0
|
148 for(i=0; i<ysz; i++) {
|
nuclear@0
|
149 for(j=0; j<xsz; j++) {
|
nuclear@0
|
150 int xor = i^j;
|
nuclear@0
|
151 uint16_t red = xor >> 2;
|
nuclear@0
|
152 uint16_t green = xor >> 1;
|
nuclear@0
|
153 uint16_t blue = xor;
|
nuclear@0
|
154 *p++ = 0x8000 | red | ((green & 0x1f) << 5) | ((blue & 0x1f) << 10);
|
nuclear@0
|
155 }
|
nuclear@0
|
156 }
|
nuclear@0
|
157 }
|