initial commit
This commit is contained in:
369
DisplayListTestCube/source/ds_arm9_crt0.s
Normal file
369
DisplayListTestCube/source/ds_arm9_crt0.s
Normal file
@@ -0,0 +1,369 @@
|
||||
#include "options.h"
|
||||
#if !STDLIB
|
||||
@--------------------------------------------------------------------------------
|
||||
@ DS processor selection
|
||||
@--------------------------------------------------------------------------------
|
||||
.arch armv5te
|
||||
.cpu arm946e-s
|
||||
@--------------------------------------------------------------------------------
|
||||
#define PAGE_4K (0b01011 << 1)
|
||||
#define PAGE_8K (0b01100 << 1)
|
||||
#define PAGE_16K (0b01101 << 1)
|
||||
#define PAGE_32K (0b01110 << 1)
|
||||
#define PAGE_64K (0b00111 << 1)
|
||||
#define PAGE_128K (0b10000 << 1)
|
||||
#define PAGE_256K (0b10001 << 1)
|
||||
#define PAGE_512K (0b10010 << 1)
|
||||
#define PAGE_1M (0b10011 << 1)
|
||||
#define PAGE_2M (0b10100 << 1)
|
||||
#define PAGE_4M (0b10101 << 1)
|
||||
#define PAGE_8M (0b10110 << 1)
|
||||
#define PAGE_16M (0b10111 << 1)
|
||||
#define PAGE_32M (0b11000 << 1)
|
||||
#define PAGE_64M (0b11001 << 1)
|
||||
#define PAGE_128M (0b11010 << 1)
|
||||
#define PAGE_256M (0b11011 << 1)
|
||||
#define PAGE_512M (0b11100 << 1)
|
||||
#define PAGE_1G (0b11101 << 1)
|
||||
#define PAGE_2G (0b11110 << 1)
|
||||
#define PAGE_4G (0b11111 << 1)
|
||||
|
||||
#define ITCM_LOAD (1<<19)
|
||||
#define ITCM_ENABLE (1<<18)
|
||||
#define DTCM_LOAD (1<<17)
|
||||
#define DTCM_ENABLE (1<<16)
|
||||
#define DISABLE_TBIT (1<<15)
|
||||
#define ROUND_ROBIN (1<<14)
|
||||
#define ALT_VECTORS (1<<13)
|
||||
#define ICACHE_ENABLE (1<<12)
|
||||
#define BIG_ENDIAN (1<<7)
|
||||
#define DCACHE_ENABLE (1<<2)
|
||||
#define PROTECT_ENABLE (1<<0)
|
||||
|
||||
.equ _libnds_argv,0x027FFF70
|
||||
|
||||
@--------------------------------------------------------------------------------
|
||||
.section ".init"
|
||||
.global _start
|
||||
@--------------------------------------------------------------------------------
|
||||
.align 4
|
||||
.arm
|
||||
@--------------------------------------------------------------------------------
|
||||
_start:
|
||||
@--------------------------------------------------------------------------------
|
||||
mov r0, #0x04000000 @ IME = 0;
|
||||
str r0, [r0, #0x208]
|
||||
|
||||
@--------------------------------------------------------------------------------
|
||||
@ turn the power on for M3
|
||||
@--------------------------------------------------------------------------------
|
||||
#if SAFE
|
||||
ldr r1, =0x8203
|
||||
add r0,r0,#0x304
|
||||
strh r1, [r0]
|
||||
|
||||
ldr r1, =0x00002078 @ disable TCM and protection unit
|
||||
mcr p15, 0, r1, c1, c0
|
||||
#endif
|
||||
|
||||
@--------------------------------------------------------------------------------
|
||||
@ Protection Unit Setup added by Sasq
|
||||
@--------------------------------------------------------------------------------
|
||||
@ Disable cache
|
||||
mov r0, #0
|
||||
mcr p15, 0, r0, c7, c5, 0 @ Instruction cache
|
||||
mcr p15, 0, r0, c7, c6, 0 @ Data cache
|
||||
|
||||
@ Wait for write buffer to empty
|
||||
mcr p15, 0, r0, c7, c10, 4
|
||||
|
||||
ldr r0, =__dtcm_start
|
||||
orr r0,r0,#0x0a
|
||||
mcr p15, 0, r0, c9, c1,0 @ DTCM base = __dtcm_start, size = 16 KB
|
||||
|
||||
mov r0,#0x20
|
||||
mcr p15, 0, r0, c9, c1,1 @ ITCM base = 0 , size = 32 MB
|
||||
|
||||
@--------------------------------------------------------------------------------
|
||||
@ Setup memory regions similar to Release Version
|
||||
@--------------------------------------------------------------------------------
|
||||
|
||||
@------------------------------------------------------------------------
|
||||
@ Region 0 - IO registers
|
||||
@------------------------------------------------------------------------
|
||||
ldr r0,=( PAGE_64M | 0x04000000 | 1)
|
||||
mcr p15, 0, r0, c6, c0, 0
|
||||
|
||||
@------------------------------------------------------------------------
|
||||
@ Region 1 - Main Memory
|
||||
@------------------------------------------------------------------------
|
||||
ldr r0,=( PAGE_4M | 0x02000000 | 1)
|
||||
mcr p15, 0, r0, c6, c1, 0
|
||||
|
||||
@------------------------------------------------------------------------
|
||||
@ Region 2 - alternate vector base
|
||||
@------------------------------------------------------------------------
|
||||
#if SAFE
|
||||
ldr r0,=( PAGE_4K | 0x00000000 | 1)
|
||||
mcr p15, 0, r0, c6, c2, 0
|
||||
|
||||
@------------------------------------------------------------------------
|
||||
@ Region 3 - DS Accessory (GBA Cart)
|
||||
@------------------------------------------------------------------------
|
||||
ldr r0,=( PAGE_128M | 0x08000000 | 1)
|
||||
mcr p15, 0, r0, c6, c3, 0
|
||||
|
||||
@------------------------------------------------------------------------
|
||||
@ Region 4 - DTCM
|
||||
@------------------------------------------------------------------------
|
||||
ldr r0,=__dtcm_start
|
||||
orr r0,r0,#(PAGE_16K | 1)
|
||||
mcr p15, 0, r0, c6, c4, 0
|
||||
|
||||
@------------------------------------------------------------------------
|
||||
@ Region 5 - ITCM
|
||||
@------------------------------------------------------------------------
|
||||
ldr r0,=__itcm_start
|
||||
|
||||
@ align to 32k boundary
|
||||
mov r0,r0,lsr #15
|
||||
mov r0,r0,lsl #15
|
||||
|
||||
orr r0,r0,#(PAGE_32K | 1)
|
||||
mcr p15, 0, r0, c6, c5, 0
|
||||
|
||||
@------------------------------------------------------------------------
|
||||
@ Region 6 - System ROM
|
||||
@------------------------------------------------------------------------
|
||||
ldr r0,=( PAGE_32K | 0xFFFF0000 | 1)
|
||||
mcr p15, 0, r0, c6, c6, 0
|
||||
|
||||
@------------------------------------------------------------------------
|
||||
@ Region 7 - non cacheable main ram
|
||||
@------------------------------------------------------------------------
|
||||
ldr r0,=( PAGE_4M | 0x02400000 | 1)
|
||||
mcr p15, 0, r0, c6, c7, 0
|
||||
|
||||
@------------------------------------------------------------------------
|
||||
@ Write buffer enable
|
||||
@------------------------------------------------------------------------
|
||||
ldr r0,=0b00000010
|
||||
mcr p15, 0, r0, c3, c0, 0
|
||||
#endif
|
||||
|
||||
@------------------------------------------------------------------------
|
||||
@ DCache & ICache enable
|
||||
@------------------------------------------------------------------------
|
||||
ldr r0,=0b01000010
|
||||
mcr p15, 0, r0, c2, c0, 0
|
||||
mcr p15, 0, r0, c2, c0, 1
|
||||
|
||||
@------------------------------------------------------------------------
|
||||
@ IAccess
|
||||
@------------------------------------------------------------------------
|
||||
#if SAFE
|
||||
ldr r0,=0x36636633
|
||||
mcr p15, 0, r0, c5, c0, 3
|
||||
|
||||
@------------------------------------------------------------------------
|
||||
@ DAccess
|
||||
@------------------------------------------------------------------------
|
||||
ldr r0,=0x36333633
|
||||
mcr p15, 0, r0, c5, c0, 2
|
||||
#endif
|
||||
|
||||
@------------------------------------------------------------------------
|
||||
@ Enable ICache, DCache, ITCM & DTCM
|
||||
@------------------------------------------------------------------------
|
||||
mrc p15, 0, r0, c1, c0, 0
|
||||
#if SAFE
|
||||
ldr r1,= ITCM_ENABLE | DTCM_ENABLE | ICACHE_ENABLE | DCACHE_ENABLE | PROTECT_ENABLE
|
||||
#else
|
||||
ldr r1, =ICACHE_ENABLE|DCACHE_ENABLE|PROTECT_ENABLE
|
||||
#endif
|
||||
orr r0,r0,r1
|
||||
mcr p15, 0, r0, c1, c0, 0
|
||||
|
||||
mov r0, #0x12 @ Switch to IRQ Mode
|
||||
msr cpsr, r0
|
||||
ldr sp, =__sp_irq @ Set IRQ stack
|
||||
|
||||
mov r0, #0x13 @ Switch to SVC Mode
|
||||
msr cpsr, r0
|
||||
ldr sp, =__sp_svc @ Set SVC stack
|
||||
|
||||
mov r0, #0x1F @ Switch to System Mode
|
||||
msr cpsr, r0
|
||||
ldr sp, =__sp_usr @ Set user stack
|
||||
|
||||
#if SAFE
|
||||
ldr r1, =__itcm_lma @ Copy instruction tightly coupled memory (itcm section) from LMA to VMA
|
||||
ldr r2, =__itcm_start
|
||||
ldr r4, =__itcm_end
|
||||
bl CopyMemCheck
|
||||
|
||||
ldr r1, =__vectors_lma @ Copy reserved vectors area (itcm section) from LMA to VMA
|
||||
ldr r2, =__vectors_start
|
||||
ldr r4, =__vectors_end
|
||||
bl CopyMemCheck
|
||||
|
||||
ldr r1, =__dtcm_lma @ Copy data tightly coupled memory (dtcm section) from LMA to VMA
|
||||
ldr r2, =__dtcm_start
|
||||
ldr r4, =__dtcm_end
|
||||
bl CopyMemCheck
|
||||
|
||||
bl checkARGV @ check and process argv trickery
|
||||
|
||||
ldr r0, =__bss_start @ Clear BSS section
|
||||
ldr r1, =__bss_end
|
||||
sub r1, r1, r0
|
||||
bl ClearMem
|
||||
|
||||
ldr r0, =__sbss_start @ Clear SBSS section
|
||||
ldr r1, =__sbss_end
|
||||
sub r1, r1, r0
|
||||
bl ClearMem
|
||||
|
||||
ldr r1, =fake_heap_end @ set heap end
|
||||
ldr r0, =__eheap_end
|
||||
str r0, [r1]
|
||||
|
||||
ldr r0, =_libnds_argv
|
||||
|
||||
@ reset heap base
|
||||
ldr r2, [r0,#20] @ newheap base
|
||||
ldr r1,=fake_heap_start
|
||||
str r2,[r1]
|
||||
|
||||
push {r0}
|
||||
ldr r3, =initSystem
|
||||
blx r3 @ system initialisation
|
||||
|
||||
ldr r3, =__libc_init_array @ global constructors
|
||||
blx r3
|
||||
|
||||
pop {r0}
|
||||
|
||||
ldr r1, [r0,#16] @ argv
|
||||
ldr r0, [r0,#12] @ argc
|
||||
#endif
|
||||
|
||||
ldr r3, =Main
|
||||
blx r3 @ jump to user code
|
||||
|
||||
#if SAFE
|
||||
@ If the user ever returns, go back to passme loop
|
||||
ldr r0, =ILoop
|
||||
ldr r0, [r0]
|
||||
ldr r1, =0x027FFE78
|
||||
str r0, [r1]
|
||||
bx r1
|
||||
ILoop:
|
||||
b ILoop
|
||||
|
||||
@-------------------------------------------------------------------------------
|
||||
@ check for a commandline
|
||||
@-------------------------------------------------------------------------------
|
||||
checkARGV:
|
||||
@-------------------------------------------------------------------------------
|
||||
ldr r0, =_libnds_argv @ argv structure
|
||||
mov r1, #0
|
||||
str r1, [r0,#12] @ clear argc
|
||||
str r1, [r0,#16] @ clear argv
|
||||
|
||||
ldr r1, [r0] @ argv magic number
|
||||
ldr r2, =0x5f617267 @ '_arg'
|
||||
cmp r1, r2
|
||||
bxne lr @ bail out if no magic
|
||||
|
||||
ldr r1, [r0, #4] @ command line address
|
||||
ldr r2, [r0, #8] @ length of command line
|
||||
|
||||
@ copy to heap
|
||||
ldr r3, =__end__ @ initial heap base
|
||||
str r3, [r0, #4] @ set command line address
|
||||
|
||||
cmp r2, #0
|
||||
subnes r4, r3, r1 @ dst-src
|
||||
bxeq lr @ dst == src || len==0 : nothing to do.
|
||||
|
||||
cmphi r2, r4 @ len > (dst-src)
|
||||
bhi .copybackward
|
||||
|
||||
.copyforward:
|
||||
ldrb r4, [r1], #1
|
||||
strb r4, [r3], #1
|
||||
subs r2, r2, #1
|
||||
bne .copyforward
|
||||
b .copydone
|
||||
|
||||
.copybackward:
|
||||
subs r2, r2, #1
|
||||
ldrb r4, [r1, r2]
|
||||
strb r4, [r3, r2]
|
||||
bne .copybackward
|
||||
|
||||
.copydone:
|
||||
push {lr}
|
||||
ldr r3, =build_argv
|
||||
blx r3
|
||||
pop {lr}
|
||||
bx lr
|
||||
|
||||
|
||||
@-------------------------------------------------------------------------------
|
||||
@ Clear memory to 0x00 if length != 0
|
||||
@ r0 = Start Address
|
||||
@ r1 = Length
|
||||
@-------------------------------------------------------------------------------
|
||||
ClearMem:
|
||||
@-------------------------------------------------------------------------------
|
||||
mov r2, #3 @ Round down to nearest word boundary
|
||||
add r1, r1, r2 @ Shouldn't be needed
|
||||
bics r1, r1, r2 @ Clear 2 LSB (and set Z)
|
||||
bxeq lr @ Quit if copy size is 0
|
||||
|
||||
mov r2, #0
|
||||
ClrLoop:
|
||||
stmia r0!, {r2}
|
||||
subs r1, r1, #4
|
||||
bne ClrLoop
|
||||
|
||||
bx lr
|
||||
|
||||
@-------------------------------------------------------------------------------
|
||||
@ Copy memory if length != 0
|
||||
@ r1 = Source Address
|
||||
@ r2 = Dest Address
|
||||
@ r4 = Dest Address + Length
|
||||
@-------------------------------------------------------------------------------
|
||||
CopyMemCheck:
|
||||
@-------------------------------------------------------------------------------
|
||||
sub r3, r4, r2 @ Is there any data to copy?
|
||||
@-------------------------------------------------------------------------------
|
||||
@ Copy memory
|
||||
@ r1 = Source Address
|
||||
@ r2 = Dest Address
|
||||
@ r3 = Length
|
||||
@-------------------------------------------------------------------------------
|
||||
CopyMem:
|
||||
@-------------------------------------------------------------------------------
|
||||
mov r0, #3 @ These commands are used in cases where
|
||||
add r3, r3, r0 @ the length is not a multiple of 4,
|
||||
bics r3, r3, r0 @ even though it should be.
|
||||
bxeq lr @ Length is zero, so exit
|
||||
CIDLoop:
|
||||
ldmia r1!, {r0}
|
||||
stmia r2!, {r0}
|
||||
subs r3, r3, #4
|
||||
bne CIDLoop
|
||||
|
||||
bx lr
|
||||
#endif
|
||||
|
||||
@--------------------------------------------------------------------------------
|
||||
.align
|
||||
.pool
|
||||
.end
|
||||
@--------------------------------------------------------------------------------
|
||||
#endif
|
||||
558
DisplayListTestCube/source/main.c
Normal file
558
DisplayListTestCube/source/main.c
Normal file
@@ -0,0 +1,558 @@
|
||||
#include <nds.h>
|
||||
|
||||
#include "options.h"
|
||||
|
||||
// Commands
|
||||
#define CMTXMODE 0x10
|
||||
#define CMTXPUSH 0x11
|
||||
#define CMTXPOP 0x12
|
||||
#define CMTXIDENTITY 0x15
|
||||
#define CMTXLOAD4x4 0x16
|
||||
#define CMTXLOAD4x3 0x17
|
||||
#define CMTXMULT3x3 0x1A
|
||||
#define CMTXSCALE 0x1B
|
||||
#define CMTXTRANSLATE 0x1C
|
||||
#define CCOLOR 0x20
|
||||
#define CNORMAL 0x21
|
||||
#define CVERTEX 0x24
|
||||
#define CPOLYATTR 0x29
|
||||
#define CDIFAMB 0x30
|
||||
#define CLIGHTVECTOR 0x32
|
||||
#define CLIGHTCOLOR 0x33
|
||||
#define CBEGIN 0x40
|
||||
#define CVIEWPORT 0x60
|
||||
|
||||
// Parameters
|
||||
#define PROJECTION 0
|
||||
#define MODELVIEW 2
|
||||
|
||||
#define QUAD 1
|
||||
|
||||
#define NORMAL(x,y,z) (((x)&0x3FF)|(((y)&0x3FF)<<10)|(((z)&0x3FF)<<20))
|
||||
#define VERTEX(x,y,z) \
|
||||
(((x)&0x3FF)|(((y)&0x3FF)<<10)|(((z)&0x3FF)<<20))
|
||||
|
||||
#define DIFAMB(dif,amb) ((dif)|((amb)<<16))
|
||||
|
||||
#define VIEWPORT(x1,y1,x2,y2) ((x1)|((y1)<<8)|((x2)<<16)|((y2)<<24))
|
||||
|
||||
// Polygon attributes
|
||||
#define LIGHT0 BIT(0)
|
||||
#define POLYFRONT BIT(7)
|
||||
#define POLYBACK BIT(6)
|
||||
#define SOLID (31<<16)
|
||||
#define WIREFRAME (0<<16)
|
||||
|
||||
// FIFO command packer
|
||||
#define COMMAND(a,b,c,d) \
|
||||
(((a)&0xFF)|(((b)&0xFF)<<8)|(((c)&0xFF)<<16)|(((d)&0xFF)<<24))
|
||||
|
||||
|
||||
int uber_sin(int x)
|
||||
{
|
||||
x = 4096 - (x & 0x1FFF);
|
||||
int ax = x;
|
||||
if ( ax < 0 )
|
||||
ax = -ax;
|
||||
return 4 * x - ((4 * x * ax) >> 12);
|
||||
}
|
||||
|
||||
#define uber_cos(x) uber_sin(x + 0x800)
|
||||
|
||||
|
||||
#undef B
|
||||
#undef C
|
||||
|
||||
void callList(u32 * list, int size)
|
||||
{
|
||||
DMA_SRC(0) = (unsigned int) list;
|
||||
DMA_DEST(0) = 0x4000400; //GXFIFO
|
||||
DMA_CR(0) = DMA_FIFO | size;
|
||||
while ( DMA_CR(0) & DMA_BUSY )
|
||||
;
|
||||
}
|
||||
|
||||
u32 bglist[] =
|
||||
{
|
||||
COMMAND(CCOLOR, CVERTEX, CVERTEX, CCOLOR),
|
||||
RGB15(31, 31, 31),
|
||||
VERTEX(-4*64, -4*64, 0),
|
||||
VERTEX( 4*64, -4*64, 0),
|
||||
RGB15(12, 12, 31),
|
||||
COMMAND(CVERTEX, CVERTEX, 0, 0),
|
||||
VERTEX( 4*64, 4*64, 0),
|
||||
VERTEX(-4*64, 4*64, 0),
|
||||
};
|
||||
#define bg() callList(bglist, sizeof(bglist)/sizeof(u32))
|
||||
|
||||
u32 cubelist[] =
|
||||
{
|
||||
COMMAND(CDIFAMB, CBEGIN, CNORMAL, CVERTEX),
|
||||
DIFAMB(RGB15(16, 16, 16), RGB15(8, 8, 8)),
|
||||
QUAD,
|
||||
NORMAL(0, 512, 0),
|
||||
VERTEX(-64,-64,-64),
|
||||
|
||||
COMMAND(CVERTEX, CVERTEX, CVERTEX, CNORMAL),
|
||||
VERTEX( 64,-64,-64),
|
||||
VERTEX( 64,-64, 64),
|
||||
VERTEX(-64,-64, 64),
|
||||
NORMAL(0, 511, 0),
|
||||
|
||||
COMMAND(CVERTEX, CVERTEX, CVERTEX, CVERTEX),
|
||||
VERTEX(-64, 64,-64),
|
||||
VERTEX(-64, 64, 64),
|
||||
VERTEX( 64, 64, 64),
|
||||
VERTEX( 64, 64,-64),
|
||||
|
||||
COMMAND(CNORMAL, CVERTEX, CVERTEX, CVERTEX),
|
||||
NORMAL(512, 0, 0),
|
||||
VERTEX(-64,-64,-64),
|
||||
VERTEX(-64,-64, 64),
|
||||
VERTEX(-64, 64, 64),
|
||||
|
||||
COMMAND(CVERTEX, CNORMAL, CVERTEX, CVERTEX),
|
||||
VERTEX(-64, 64,-64),
|
||||
NORMAL(511, 0, 0),
|
||||
VERTEX( 64,-64,-64),
|
||||
VERTEX( 64, 64,-64),
|
||||
|
||||
COMMAND(CVERTEX, CVERTEX, CNORMAL, CVERTEX),
|
||||
VERTEX( 64, 64, 64),
|
||||
VERTEX( 64,-64, 64),
|
||||
NORMAL( 0, 0, 512),
|
||||
VERTEX(-64,-64,-64),
|
||||
|
||||
COMMAND(CVERTEX, CVERTEX, CVERTEX, CNORMAL),
|
||||
VERTEX(-64, 64,-64),
|
||||
VERTEX( 64, 64,-64),
|
||||
VERTEX( 64,-64,-64),
|
||||
NORMAL( 0, 0, 511),
|
||||
|
||||
COMMAND(CVERTEX, CVERTEX, CVERTEX, CVERTEX),
|
||||
VERTEX(-64,-64, 64),
|
||||
VERTEX( 64,-64, 64),
|
||||
VERTEX( 64, 64, 64),
|
||||
VERTEX(-64, 64, 64),
|
||||
};
|
||||
#define cube() callList(cubelist, sizeof(cubelist)/sizeof(u32))
|
||||
|
||||
u32 initlist[] =
|
||||
{
|
||||
COMMAND(CVIEWPORT, CMTXMODE, CMTXLOAD4x4, CMTXMODE),
|
||||
VIEWPORT(0, 0, 255, 191),
|
||||
PROJECTION,
|
||||
// Projection matrix Perspective(fov=50<35>, near=0.1, far=40, ratio=1.33)
|
||||
6587, 0, 0, 0,
|
||||
0, 8783, 0, 0,
|
||||
0, 0, -4116, -4096,
|
||||
0, 0, -821, 0,
|
||||
MODELVIEW,
|
||||
|
||||
COMMAND(CPOLYATTR, CMTXIDENTITY, CLIGHTVECTOR, CLIGHTCOLOR),
|
||||
LIGHT0|POLYFRONT|SOLID,
|
||||
NORMAL(-96, -144, -482),
|
||||
RGB15(31, 31, 31),
|
||||
};
|
||||
#define init() callList(initlist, sizeof(initlist)/sizeof(u32))
|
||||
|
||||
int abs(int x)
|
||||
{
|
||||
return ( x < 0 ) ? -x : x;
|
||||
}
|
||||
|
||||
int min(int a, int b)
|
||||
{
|
||||
return ( a < b ) ? a : b;
|
||||
}
|
||||
|
||||
// input : fixed .12
|
||||
// output : fixed .12
|
||||
int sin(int x)
|
||||
{
|
||||
// translate x into [-pi, pi].f12
|
||||
while ( x > 12868 )
|
||||
x -= 25736;
|
||||
while ( x < -12868 )
|
||||
x += 25736;
|
||||
// compute sin(x)
|
||||
// see http://www.devmaster.net/forums/showthread.php?t=5784
|
||||
const int B = 5215;
|
||||
const int C = -1660;
|
||||
return (B*x + ((C*x)>>12)*abs(x))>>12;
|
||||
}
|
||||
|
||||
int cos(int x)
|
||||
{
|
||||
x += 6434;
|
||||
return sin(x);
|
||||
}
|
||||
|
||||
inline void push()
|
||||
{
|
||||
MATRIX_PUSH = 0;
|
||||
}
|
||||
|
||||
inline void pop()
|
||||
{
|
||||
MATRIX_POP = 1;
|
||||
}
|
||||
|
||||
inline void identity()
|
||||
{
|
||||
MATRIX_IDENTITY = 0;
|
||||
}
|
||||
|
||||
inline void translate(int x, int y, int z)
|
||||
{
|
||||
MATRIX_TRANSLATE = x;
|
||||
MATRIX_TRANSLATE = y;
|
||||
MATRIX_TRANSLATE = z;
|
||||
}
|
||||
|
||||
inline void scale(int x, int y, int z)
|
||||
{
|
||||
MATRIX_SCALE = x;
|
||||
MATRIX_SCALE = y;
|
||||
MATRIX_SCALE = z;
|
||||
}
|
||||
|
||||
void rotate(int angle, int x, int y, int z)
|
||||
{
|
||||
int s = sin(angle);
|
||||
int c = cos(angle);
|
||||
|
||||
MATRIX_MULT3x3 = (x == 0) ? c : 1<<12;
|
||||
MATRIX_MULT3x3 = z * s;
|
||||
MATRIX_MULT3x3 = y * -s;
|
||||
|
||||
MATRIX_MULT3x3 = z * -s;
|
||||
MATRIX_MULT3x3 = (y == 0) ? c : 1<<12;
|
||||
MATRIX_MULT3x3 = x * s;
|
||||
|
||||
MATRIX_MULT3x3 = y * s;
|
||||
MATRIX_MULT3x3 = x * -s;
|
||||
MATRIX_MULT3x3 = (z == 0) ? c : 1<<12;
|
||||
}
|
||||
|
||||
void uber_rotate(int angle, int x, int y, int z)
|
||||
{
|
||||
int s = uber_sin(angle);
|
||||
int c = uber_cos(angle);
|
||||
|
||||
MATRIX_MULT3x3 = (x == 0) ? c : 1<<12;
|
||||
MATRIX_MULT3x3 = z * s;
|
||||
MATRIX_MULT3x3 = y * -s;
|
||||
|
||||
MATRIX_MULT3x3 = z * -s;
|
||||
MATRIX_MULT3x3 = (y == 0) ? c : 1<<12;
|
||||
MATRIX_MULT3x3 = x * s;
|
||||
|
||||
MATRIX_MULT3x3 = y * s;
|
||||
MATRIX_MULT3x3 = x * -s;
|
||||
MATRIX_MULT3x3 = (z == 0) ? c : 1<<12;
|
||||
}
|
||||
|
||||
#define rotateX(angle) rotate(angle, 1, 0, 0)
|
||||
#define rotateY(angle) rotate(angle, 0, 1, 0)
|
||||
#define rotateZ(angle) rotate(angle, 0, 0, 1)
|
||||
#define uber_rotateX(angle) uber_rotate(angle, 1, 0, 0)
|
||||
#define uber_rotateY(angle) uber_rotate(angle, 0, 1, 0)
|
||||
#define uber_rotateZ(angle) uber_rotate(angle, 0, 0, 1)
|
||||
|
||||
void arms(int t, int m)
|
||||
{
|
||||
push();
|
||||
// translate(0.24f*m, 0.4f, 0);
|
||||
translate(983*m, 1638, 0);
|
||||
// rotateZ(30<33>*m);
|
||||
rotateZ(2145*m);
|
||||
// rotateX(cos(t)*20<32>+180<38>);
|
||||
rotateX(((cos(t)*1430)>>12)+12868);
|
||||
// translate(0, 0.3, 0);
|
||||
translate(0, 1229, 0);
|
||||
push();
|
||||
// scale(0.1, 0.3, 0.1);
|
||||
scale(410, 1229, 410);
|
||||
cube();
|
||||
pop();
|
||||
|
||||
// translate(0, 0.22, 0);
|
||||
translate(0, 901, 0);
|
||||
// rotateY(abs(cos(t))*16*m);
|
||||
rotateY((abs(cos(t)*1144)>>12)*m);
|
||||
// rotateX(100<30>);
|
||||
rotateX(7149);
|
||||
// rotateZ(165<36>*m);
|
||||
rotateZ(11796*m);
|
||||
// translate(0, 0.21, 0);
|
||||
translate(0, 860, 0);
|
||||
push();
|
||||
// scale(0.09, 0.27, 0.09);
|
||||
scale(369, 1106, 369);
|
||||
cube();
|
||||
pop();
|
||||
pop();
|
||||
}
|
||||
|
||||
void legs(int t, int m)
|
||||
{
|
||||
push();
|
||||
// translate(0.19*m, 0, -0.015);
|
||||
translate(778*m, 0, -61);
|
||||
// rotateX(cos(t)*13<31>-2.5);
|
||||
rotateX(((cos(t)*929)>>12)-228);
|
||||
|
||||
// translate(0, -0.7, 0);
|
||||
translate(0, -2867, 0);
|
||||
push();
|
||||
// scale(0.1, 0.25, 0.1);
|
||||
scale(410, 1024, 410);
|
||||
cube();
|
||||
pop();
|
||||
|
||||
// float d = -min(0, cos(t+3.14157/2));
|
||||
int d = -min(0, cos(t+6434));
|
||||
// translate(0, d*0.15-0.52, d*0.015-0.06);
|
||||
translate(0, ((d*614)>>12)-2130, ((d*61)>>12)-246);
|
||||
// rotateX(10<31>);
|
||||
rotateX(715);
|
||||
push();
|
||||
// scale(0.1, 0.3, 0.1);
|
||||
scale(410, 1229, 410);
|
||||
cube();
|
||||
pop();
|
||||
|
||||
// translate(0, -0.3, 0.1);
|
||||
translate(0, -1229, 410);
|
||||
push();
|
||||
// scale(0.1, 0.03, 0.2);
|
||||
scale(410, 123, 819);
|
||||
cube();
|
||||
pop();
|
||||
pop();
|
||||
}
|
||||
|
||||
void robot(int t)
|
||||
{
|
||||
// head
|
||||
push();
|
||||
// translate(0, 0.71+0.05*abs(sin(t)), 0.04);
|
||||
translate(0, 2908+((abs(sin(t))*204)>>12), 164);
|
||||
// rotateX(-5<>+10<31>*abs(cos(t)));
|
||||
rotateX((-357+715*abs(cos(t)))>>12);
|
||||
// scale(0.2, 0.2, 0.2);
|
||||
scale(819, 819, 819);
|
||||
cube();
|
||||
pop();
|
||||
|
||||
// body
|
||||
push();
|
||||
// translate(0, 0.05*abs(sin(t)), 0);
|
||||
translate(0, (abs(sin(t))*204)>>12, 0);
|
||||
// rotateY(2.5<EFBFBD>-5<>*cos(t));
|
||||
rotateY(179-((357*cos(t))>>12));
|
||||
// scale(0.3, 0.5, 0.17);
|
||||
scale(1229, 2048, 696);
|
||||
cube();
|
||||
pop();
|
||||
|
||||
// left side
|
||||
arms(t, -1);
|
||||
legs(t, -1);
|
||||
|
||||
// right side
|
||||
t += 12868;
|
||||
arms(t, 1);
|
||||
legs(t, 1);
|
||||
}
|
||||
|
||||
// r * cos((x*pi/2)/r) * cos((y*pi/2)/r) - r
|
||||
int f(int x, int y)
|
||||
{
|
||||
const int r = 25;
|
||||
return (r * (uber_cos(x) * uber_cos(y))>>18) - (r<<6);
|
||||
}
|
||||
|
||||
void sonic(int t)
|
||||
{
|
||||
int i = 0;
|
||||
int y, x;
|
||||
|
||||
const u16 colors[2] = { RGB15(29, 15, 4), RGB15(4, 11, 28) };
|
||||
|
||||
for ( y = -7*64+t ; y < 6*64+t ; y += 64 ) {
|
||||
for ( x = -7*64 ; x < 6*64 ; x += 64 ) {
|
||||
GFX_VERTEX10 = VERTEX(x, f(x, y), y);
|
||||
GFX_VERTEX10 = VERTEX(x, f(x, y+64), y+64);
|
||||
GFX_VERTEX10 = VERTEX(x+64, f(x+64, y+64), y+64);
|
||||
GFX_VERTEX10 = VERTEX(x+64, f(x+64, y), y);
|
||||
// -4B by putting next two lines at the end of this loop
|
||||
GFX_COLOR = colors[i&1];
|
||||
i++;
|
||||
}
|
||||
//i++;
|
||||
}
|
||||
}
|
||||
|
||||
#if STDLIB
|
||||
int main()
|
||||
#else
|
||||
void Main()
|
||||
#endif
|
||||
{
|
||||
int t = 0;
|
||||
|
||||
#if CAMERA
|
||||
int rX = 0, rrX = 0;
|
||||
int rY = 0, rrY = 0;
|
||||
int tX = 0;
|
||||
int tY = 0;
|
||||
int tZ = 0;
|
||||
|
||||
touchPosition start;
|
||||
touchPosition now;
|
||||
#endif
|
||||
|
||||
// initialize 3D
|
||||
REG_POWERCNT = POWER_ALL;
|
||||
#if SAFE
|
||||
while ( GFX_STATUS & BIT(27) )
|
||||
;
|
||||
GFX_STATUS |= BIT(29); // clear fifo
|
||||
GFX_FLUSH = 0;
|
||||
GFX_CONTROL = 0;
|
||||
#endif
|
||||
GFX_CLEAR_DEPTH = 0x7FFF;
|
||||
|
||||
GFX_CONTROL = GL_ANTIALIAS;
|
||||
GFX_CLEAR_COLOR = 0x3F1F0000; // black, alpha=31, id=63
|
||||
|
||||
init();
|
||||
|
||||
// Initialize 2D Engines
|
||||
REG_DISPCNT = MODE_0_2D
|
||||
| DISPLAY_BG0_ACTIVE
|
||||
| ENABLE_3D;
|
||||
REG_DISPCNT_SUB = MODE_5_2D
|
||||
| DISPLAY_BG3_ACTIVE
|
||||
| DISPLAY_SPR_ACTIVE
|
||||
| DISPLAY_SPR_2D
|
||||
| DISPLAY_SPR_2D_BMP_256;
|
||||
|
||||
// Init SUB BG0
|
||||
//VRAM_C_CR = VRAM_C_SUB_BG | VRAM_ENABLE;
|
||||
REG_BG3CNT_SUB = BG_BMP16_256x256;
|
||||
REG_BG3PA_SUB = 1<<8;
|
||||
#if SAFE
|
||||
REG_BG3PB_SUB = 0;
|
||||
REG_BG3PC_SUB = 0;
|
||||
#endif
|
||||
REG_BG3PD_SUB = 1<<8;
|
||||
|
||||
// Init sprites to display like a big bitmap background
|
||||
//VRAM_D_CR = VRAM_D_SUB_SPRITE | VRAM_ENABLE;
|
||||
int y, x;
|
||||
u16 * ptr = OAM_SUB;
|
||||
for ( y = 0 ; y < 3 ; y++ ) {
|
||||
for ( x = 0 ; x < 4 ; x++ ) {
|
||||
// attribute 0
|
||||
*ptr++ = ATTR0_BMP | (y*64); // attr0
|
||||
// attribute 1
|
||||
*ptr++ = ATTR1_SIZE_64 | (x*64); // attr1
|
||||
// attribute 2
|
||||
*ptr++ = ATTR2_ALPHA(15) | (x*8+y*256);
|
||||
// pad/matrix
|
||||
*ptr++;
|
||||
}
|
||||
}
|
||||
|
||||
while ( 1 ) {
|
||||
identity();
|
||||
if ( t&1 ) {
|
||||
REG_POWERCNT &= ~POWER_SWAP_LCDS; // main on bottom
|
||||
VRAM_C_CR = VRAM_ENABLE;
|
||||
VRAM_D_CR = VRAM_D_SUB_SPRITE | VRAM_ENABLE;
|
||||
REG_DISPCAPCNT = DCAP_BANK(2) | DCAP_ENABLE | DCAP_SIZE(3);
|
||||
//rotateX(-t+512);
|
||||
} else {
|
||||
REG_POWERCNT |= POWER_SWAP_LCDS; // main on top
|
||||
VRAM_C_CR = VRAM_C_SUB_BG | VRAM_ENABLE;
|
||||
VRAM_D_CR = VRAM_ENABLE;
|
||||
REG_DISPCAPCNT = DCAP_BANK(3) | DCAP_ENABLE | DCAP_SIZE(3);
|
||||
rotateZ(8192);
|
||||
rotateX(6144);
|
||||
translate(0, -4*4096, 9216);
|
||||
}
|
||||
|
||||
#if 0
|
||||
#if CAMERA
|
||||
rotateX((rX+rrX) * DEGREES_IN_CIRCLE / 360.0);
|
||||
rotateY((rY+rrY) * DEGREES_IN_CIRCLE / 360.0);
|
||||
translate(tX, tZ, tY);
|
||||
#endif
|
||||
#endif
|
||||
translate(0, 1024, -4096);
|
||||
|
||||
push();
|
||||
translate(0, 128, -11059);
|
||||
rotateX(-512);
|
||||
scale(0, 0, 0);
|
||||
robot(t*402);
|
||||
pop();
|
||||
|
||||
push();
|
||||
translate(0, 0, -40960);
|
||||
scale(20480, 8192, 4096);
|
||||
bg();
|
||||
pop();
|
||||
|
||||
push();
|
||||
translate(0, -9216, -20480);
|
||||
uber_rotateX((rX+rrX)*16);
|
||||
sonic(-(t*2)&127);
|
||||
pop();
|
||||
|
||||
GFX_FLUSH = 0;
|
||||
t++;
|
||||
|
||||
#if CAMERA
|
||||
scanKeys();
|
||||
|
||||
// look around
|
||||
u16 keys = keysDown();
|
||||
if ( keys & KEY_TOUCH )
|
||||
touchRead(& start);
|
||||
|
||||
keys = keysUp();
|
||||
if ( keys & KEY_TOUCH ) {
|
||||
rX = rX + rrX;
|
||||
rY = rY + rrY;
|
||||
rrX = 0;
|
||||
rrY = 0;
|
||||
}
|
||||
|
||||
keys = keysHeld();
|
||||
if ( keys & KEY_TOUCH ) {
|
||||
touchRead(& now);
|
||||
rrX = now.py - start.py;
|
||||
rrY = now.px - start.px;
|
||||
}
|
||||
|
||||
// world move
|
||||
if ( keys & KEY_UP ) tY += 128;
|
||||
if ( keys & KEY_DOWN ) tY -= 128;
|
||||
if ( keys & KEY_LEFT ) tX += 128;
|
||||
if ( keys & KEY_RIGHT ) tX -= 128;
|
||||
if ( keys & KEY_L ) tZ += 128;
|
||||
if ( keys & KEY_R ) tZ -= 128;
|
||||
|
||||
// reset
|
||||
if ( keys & KEY_SELECT ) { rX = rY = tX = tY = tZ = 0; }
|
||||
#endif
|
||||
}
|
||||
|
||||
#if STDLIB
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
8
DisplayListTestCube/source/options.h
Normal file
8
DisplayListTestCube/source/options.h
Normal file
@@ -0,0 +1,8 @@
|
||||
#ifndef _OPTIONS_H_
|
||||
#define _OPTIONS_H_
|
||||
|
||||
#define STDLIB 1
|
||||
#define CAMERA 1
|
||||
#define SAFE 0
|
||||
|
||||
#endif // _OPTIONS_H_
|
||||
Reference in New Issue
Block a user