nds_test2

annotate src/main.c @ 2:dd8c9847bae9

cube
author John Tsiombikas <nuclear@member.fsf.org>
date Mon, 29 Jan 2018 14:40:45 +0200
parents d625ba001a62
children
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 }