nds_test1

annotate src/main.c @ 0:ab2afb70001a

initial commit test1 without libnds
author John Tsiombikas <nuclear@member.fsf.org>
date Sat, 27 Jan 2018 23:38:00 +0200
parents
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
nuclear@0 5 static void xorpat(void *addr, int xsz, int ysz);
nuclear@0 6
nuclear@0 7 static void *vram = VRAM_LCDC_PTR;
nuclear@0 8 static uint16_t *bgmem = VRAM_BGB_PTR;
nuclear@0 9
nuclear@0 10 int main(void)
nuclear@0 11 {
nuclear@0 12 uint32_t frame;
nuclear@0 13
nuclear@0 14 REG_POWCNT1 = POWCNT1_LCD | POWCNT1_2DA | POWCNT1_2DB | POWCNT1_DSWAP;
nuclear@0 15
nuclear@0 16 REG_DISPCNT = DISPCNT_MODE(2);
nuclear@0 17 REG_B_DISPCNT = DISPCNT_MODE(1) | DISPCNT_BG2 | 5;
nuclear@0 18
nuclear@0 19 REG_B_BG2CNT = BGXCNT_BM_256X256 | BGXCNT_BM16 | BGXCNT_OVF_WRAP;
nuclear@0 20 REG_B_BG2PA = 0x100;
nuclear@0 21 REG_B_BG2PB = 0;
nuclear@0 22 REG_B_BG2PC = 0;
nuclear@0 23 REG_B_BG2PD = 0x100;
nuclear@0 24
nuclear@0 25 REG_VRAMCNT_A = VRAM_ENABLE;
nuclear@0 26 REG_VRAMCNT_C = VRAM_ENABLE | 4;
nuclear@0 27
nuclear@0 28 xorpat(vram, 256, 192);
nuclear@0 29 xorpat(bgmem, 256, 256);
nuclear@0 30
nuclear@0 31 for(;;) {
nuclear@0 32 float t = (float)frame * 0.00035;
nuclear@0 33 float scale = 0.5 * sin(t * 0.8) + 0.8;
nuclear@0 34 int32_t sa = (int16_t)(sin(t) * 256 * scale);
nuclear@0 35 int32_t ca = (int16_t)(cos(t) * 256 * scale);
nuclear@0 36
nuclear@0 37 int32_t x = ca * -128 + sa * -96 + (128 << 8);
nuclear@0 38 int32_t y = -sa * -128 + ca * -96 + (96 << 8);
nuclear@0 39
nuclear@0 40 while(REG_VCOUNT < 192);
nuclear@0 41
nuclear@0 42 REG_B_BG2PA = ca;
nuclear@0 43 REG_B_BG2PB = sa;
nuclear@0 44 REG_B_BG2PC = -sa;
nuclear@0 45 REG_B_BG2PD = ca;
nuclear@0 46 REG_B_BG2X = x;
nuclear@0 47 REG_B_BG2Y = y;
nuclear@0 48
nuclear@0 49 ++frame;
nuclear@0 50 }
nuclear@0 51 return 0;
nuclear@0 52 }
nuclear@0 53
nuclear@0 54 static void xorpat(void *addr, int xsz, int ysz)
nuclear@0 55 {
nuclear@0 56 int i, j;
nuclear@0 57 uint16_t *p = addr;
nuclear@0 58
nuclear@0 59 for(i=0; i<ysz; i++) {
nuclear@0 60 for(j=0; j<xsz; j++) {
nuclear@0 61 int xor = i^j;
nuclear@0 62 uint16_t red = xor >> 2;
nuclear@0 63 uint16_t green = xor >> 1;
nuclear@0 64 uint16_t blue = xor;
nuclear@0 65 *p++ = 0x8000 | red | ((green & 0x1f) << 5) | ((blue & 0x1f) << 10);
nuclear@0 66 }
nuclear@0 67 }
nuclear@0 68 }