#7158 - Lupin - Tue Jun 10, 2003 8:17 pm
How could I access the hardware sin and cos tables? I read that they are stored in bios
Code: |
#define cos(x) (trigTable[(x) & 255]) #define sin(x) (trigTable[((x) + 64) & 255]) typedef struct tBGAffineSource { s32 x; //Original data's center X coordinate (8bit fractional portion) s32 y; //Original data's center Y coordinate (8bit fractional portion) s16 tX; //Display's center X coordinate s16 tY; //Display's center Y coordinate s16 sX; //Scaling ratio in X direction (8bit fractional portion) s16 sY; //Scaling ratio in Y direction (8bit fractional portion) u16 theta; //Angle of rotation (8bit fractional portion) Effective Range 0-FFFF } BGAffineSource; typdef struct tBGAffineDest { s16 pa; //Difference in X coordinate along same line s16 pb; //Difference in X coordinate along next line s16 pc; //Difference in Y coordinate along same line s16 pd; //Difference in Y coordinate along next line s32 x; //Start X coordinate s32 y; //Start Y coordinate } BGAffineDest; extern void BgAffineSet(void*, void*, u32); //src, dest, count (more on this later) BGAffineSource bgSrc[256]; BGAffineDest bgDest[256]; u32 i; s16 trigTable[256]; for(i = 0; i < 256; i++) { bgSrc.x = 0; bgSrc.y = 0; bgSrc.tX = 0; bgSrc.tY = 0; bgSrc.sX = 256; bgSrc.sY = 256; bgSrc.theta = i << 8; } BgAffineSet(bgSrc, bgDest, 256); for(i = 0; i < 256; i++) { trigTable[i] = bgDest[i].pa; } |
Code: |
.global BgAffineSet .thumb .align 2 .thumb_func BgAffineSet: swi 0xe bx lr |
Code: |
/* MATHLUTS.H */ #ifndef MATHLUTS_H #define MATHLUTS_H typedef struct tBGAffineSource { s32 x; //Original data's center X coordinate (8bit fractional portion) s32 y; //Original data's center Y coordinate (8bit fractional portion) s16 tX; //Display's center X coordinate s16 tY; //Display's center Y coordinate s16 sX; //Scaling ratio in X direction (8bit fractional portion) s16 sY; //Scaling ratio in Y direction (8bit fractional portion) u16 theta; //Angle of rotation (8bit fractional portion) Effective Range 0-FFFF } BGAffineSource; typedef struct tBGAffineDest { s16 pa; //Difference in X coordinate along same line s16 pb; //Difference in X coordinate along next line s16 pc; //Difference in Y coordinate along same line s16 pd; //Difference in Y coordinate along next line s32 x; //Start X coordinate s32 y; //Start Y coordinate } BGAffineDest; extern void BgAffineSet(void*, void*, u32); #define cos(x) (trigTable[(x) & 255]) #define sin(x) (trigTable[((x) + 64) & 255]) s16 trigTable[256]; void InitTrigTable(void) { BGAffineSource bgSrc[256]; BGAffineDest bgDest[256]; u32 i; for(i = 0; i < 256; i++) { bgSrc[i].x = 0; bgSrc[i].y = 0; bgSrc[i].tX = 0; bgSrc[i].tY = 0; bgSrc[i].sX = 256; bgSrc[i].sY = 256; bgSrc[i].theta = i << 8; } BgAffineSet(bgSrc, bgDest, 256); for(i = 0; i < 256; i++) { trigTable[i] = bgDest[i].pa; } } #endif //EOF |
Code: |
BGAffineSource *bgSrc = (BGAffineSource *)0x2000000; BGAffineDest *bgDest = (BGAffineDest *)(0x2000000 + (sizeof(BgAffineSource) << 8)); |
Code: |
.global BgAffineSet .arm .align 4 BgAffineSet: swi 0xe0000 bx lr |
Code: |
void InitTrigTable(void) { BGAffineSource bgSrc; BGAffineDest bgDest; u32 i; for(i = 0; i < 256; i++) { bgSrc.x = 0; bgSrc.y = 0; bgSrc.tX = 0; bgSrc.tY = 0; bgSrc.sX = 256; bgSrc.sY = 256; bgSrc.theta = i << 8; BgAffineSet(&bgSrc, &bgDest, 1); //use & because they're no longer arrays, so you need to get the address trigTable[i] = bgDest.pa; } } |