Cube performance much improved!

This commit is contained in:
Scott Duensing 2024-01-07 23:15:26 -06:00
parent aae737d17d
commit 93c28f3430
5 changed files with 58 additions and 58 deletions

View file

@ -32,7 +32,7 @@ START=0x2000
echo "__f256_start = ${START};" > ${SETTINGS} echo "__f256_start = ${START};" > ${SETTINGS}
CLANG="mos-f256k-clang -I${F256}/include -I${F256}/f256lib -Os" CLANG="mos-f256k-clang -I${F256}/include -I${F256}/f256lib -O3"
${CLANG} -c ${F256}/f256lib/f256.c ${CLANG} -c ${F256}/f256lib/f256.c
${CLANG} -c cube.c ${CLANG} -c cube.c

View file

@ -27,23 +27,21 @@
#include "f256.h" #include "f256.h"
#define FIX_PREC 9
#define TO_FIX(x) ((int32_t)((x)*(1<<FIX_PREC)))
#define TO_DBL(x) (((double)x)/(double)(1<<FIX_PREC))
#define TO_LONG(x) ((x)/(1<<FIX_PREC))
int16_t _remainder; int16_t _remainder;
#define fix_mul(a,b) (mathSignedMultiply(a, b) >> FIX_PREC) #define FIX_PREC 9
#define fix_sqr(a) (mathSignedMultiply(a, a) >> FIX_PREC) #define TO_FIX(x) ((int32_t)((x)*(1<<FIX_PREC))) // This is only used for initialization and needs to be constant.
//#define fix_div(a,b) mathSignedDivision((a << FIX_PREC), b, &_remainder) #define TO_LONG(x) (x>>FIX_PREC) // ((x)/(1<<FIX_PREC))
#define fix_div(a,b) ((a << FIX_PREC) / b)
#define fix_mul(am,bm) (mathSignedMultiply(am, bm) >> FIX_PREC)
#define fix_sqr(am) (mathSignedMultiply(am, am) >> FIX_PREC)
#define fix_div(num,den) (mathSignedMultiply(mathUnSignedDivision(0x8000, (den >> 1), (uint16_t *)&_remainder), num) >> 7) // ((a << FIX_PREC) / b)
#define SIN_SIZE 512 #define SIN_SIZE 512
#define COS_OFF 128 #define COS_OFF 128
int32_t SIN[] = { 0, 6, 12, 18, 25, 31, 37, 43, 50, 56, 62, 68, 75, 81, 87, 93, int16_t SIN[] = { 0, 6, 12, 18, 25, 31, 37, 43, 50, 56, 62, 68, 75, 81, 87, 93,
99, 106, 112, 118, 124, 130, 136, 142, 148, 154, 160, 166, 172, 99, 106, 112, 118, 124, 130, 136, 142, 148, 154, 160, 166, 172,
178, 184, 190, 195, 201, 207, 213, 218, 224, 230, 235, 241, 246, 178, 184, 190, 195, 201, 207, 213, 218, 224, 230, 235, 241, 246,
252, 257, 263, 268, 273, 279, 284, 289, 294, 299, 304, 310, 314, 252, 257, 263, 268, 273, 279, 284, 289, 294, 299, 304, 310, 314,
@ -104,34 +102,16 @@ typedef struct lineS {
int16_t y2; int16_t y2;
} lineT; } lineT;
int32_t *COS = SIN + COS_OFF; int16_t *COS = SIN + COS_OFF;
uint16_t width; uint16_t width;
uint16_t height; uint16_t height;
int32_t a = TO_FIX(4); int32_t a = TO_FIX(4);
int32_t scale = TO_FIX(40); int32_t scale = TO_FIX(40);
lineT past[24][2]; lineT past[12][2];
void draw_cube(byte p, int16_t t) { void draw_cube(byte p, int16_t t) {
static const int16_t edges[] = {
0, 1, 1, 3, 3, 2, 2, 0,
1, 5, 0, 4, 2, 6, 3, 7,
4, 5, 5, 7, 7, 6, 6, 4
};
static const int32_t cubeX[] = {
TO_FIX(-1), TO_FIX(-1), TO_FIX( 1), TO_FIX( 1),
TO_FIX(-1), TO_FIX(-1), TO_FIX( 1), TO_FIX( 1)
};
static const int32_t cubeY[] = {
TO_FIX(-1), TO_FIX( 1), TO_FIX(-1), TO_FIX( 1),
TO_FIX(-1), TO_FIX( 1), TO_FIX(-1), TO_FIX( 1)
};
static const int32_t cubeZ[] = {
TO_FIX(-1), TO_FIX(-1), TO_FIX(-1), TO_FIX(-1),
TO_FIX( 1), TO_FIX( 1), TO_FIX( 1), TO_FIX( 1)
};
int32_t cubeRotX[8]; int32_t cubeRotX[8];
int32_t cubeRotY[8]; int32_t cubeRotY[8];
int32_t cubeRotZ[8]; int32_t cubeRotZ[8];
@ -141,12 +121,27 @@ void draw_cube(byte p, int16_t t) {
int32_t cubeProjY[8]; int32_t cubeProjY[8];
int16_t i; int16_t i;
byte l; byte l;
int16_t e1;
int16_t e2; static const int16_t edges[] = {
int16_t x1; 0, 1, 1, 3, 3, 2, 2, 0,
int16_t y1; 1, 5, 0, 4, 2, 6, 3, 7,
int16_t x2; 4, 5, 5, 7, 7, 6, 6, 4
int16_t y2; };
static const int32_t cubeX[] = {
TO_FIX(-1), TO_FIX(-1), TO_FIX( 1), TO_FIX( 1),
TO_FIX(-1), TO_FIX(-1), TO_FIX( 1), TO_FIX( 1)
};
static const int32_t cubeY[] = {
TO_FIX(-1), TO_FIX( 1), TO_FIX(-1), TO_FIX( 1),
TO_FIX(-1), TO_FIX( 1), TO_FIX(-1), TO_FIX( 1)
};
static const int32_t cubeZ[] = {
TO_FIX(-1), TO_FIX(-1), TO_FIX(-1), TO_FIX(-1),
TO_FIX( 1), TO_FIX( 1), TO_FIX( 1), TO_FIX( 1)
};
for (i=0; i<8; ++i) { for (i=0; i<8; ++i) {
// Rotation around Y // Rotation around Y
@ -163,25 +158,22 @@ void draw_cube(byte p, int16_t t) {
// Projection to screen space // Projection to screen space
cubeProjX[i] = fix_div(fix_mul(a, cubeRotX[i]), cubeRotZ[i]); cubeProjX[i] = fix_div(fix_mul(a, cubeRotX[i]), cubeRotZ[i]);
cubeProjY[i] = fix_div(fix_mul(a, cubeRotY[i]), cubeRotZ[i]); cubeProjY[i] = fix_div(fix_mul(a, cubeRotY[i]), cubeRotZ[i]);
cubeProjX[i] = TO_LONG(fix_mul(cubeProjX[i], scale)) + width;
cubeProjY[i] = TO_LONG(fix_mul(cubeProjY[i], scale)) + height;
} }
l = 0; l = 0;
for (i=0; i<24; i += 2) { for (i=0; i<24; i += 2) {
e1 = edges[i]; past[l][p].x1 = cubeProjX[edges[i]];
e2 = edges[i + 1]; past[l][p].y1 = cubeProjY[edges[i]];
x1 = TO_LONG(fix_mul(cubeProjX[e1], scale)) + width; past[l][p].x2 = cubeProjX[edges[i + 1]];
y1 = TO_LONG(fix_mul(cubeProjY[e1], scale)) + height; past[l][p].y2 = cubeProjY[edges[i + 1]];
x2 = TO_LONG(fix_mul(cubeProjX[e2], scale)) + width; bitmapLine(past[l][p].x1, past[l][p].y1, past[l][p].x2, past[l][p].y2);
y2 = TO_LONG(fix_mul(cubeProjY[e2], scale)) + height; l++;
past[l][p].x1 = x1; }
past[l][p].y1 = y1;
past[l][p].x2 = x2;
past[l][p].y2 = y2;
l++;
bitmapLine(x1, y1, x2, y2);
}
} }
int main(void) { int main(void) {
byte i; byte i;
int16_t t = 0; int16_t t = 0;
@ -189,6 +181,8 @@ int main(void) {
f256Init(); f256Init();
textSetCursor(0); // No cursor.
bitmapGetResolution(&width, &height); bitmapGetResolution(&width, &height);
width = width >> 1; width = width >> 1;
height = height >> 1; height = height >> 1;
@ -204,9 +198,7 @@ int main(void) {
bitmapShowPage(1); bitmapShowPage(1);
} }
bitmapSetColor(0); bitmapSetColor(0);
for (i=0; i<12; i++) { for (i=0; i<12; i++) bitmapLine(past[i][p].x1, past[i][p].y1, past[i][p].x2, past[i][p].y2);
bitmapLine(past[i][p].x1, past[i][p].y1, past[i][p].x2, past[i][p].y2);
}
bitmapSetColor(255); bitmapSetColor(255);
draw_cube(p, t); draw_cube(p, t);
t += 2; t += 2;

View file

@ -38,8 +38,8 @@ int16_t mathSignedDivision(int16_t a, int16_t b, int16_t *remainder) {
b = -b; b = -b;
} }
POKEW(DIVU_DEN_L, b);
POKEW(DIVU_NUM_L, a); POKEW(DIVU_NUM_L, a);
POKEW(DIVU_DEN_L, b);
r = PEEKW(QUOU_LL); r = PEEKW(QUOU_LL);
*remainder = PEEKW(REMU_HL); *remainder = PEEKW(REMU_HL);
@ -74,8 +74,8 @@ int32_t mathSignedMultiply(int16_t a, int16_t b) {
uint16_t mathUnSignedDivision(uint16_t a, uint16_t b, uint16_t *remainder) { uint16_t mathUnSignedDivision(uint16_t a, uint16_t b, uint16_t *remainder) {
POKEW(DIVU_DEN_L, b);
POKEW(DIVU_NUM_L, a); POKEW(DIVU_NUM_L, a);
POKEW(DIVU_DEN_L, b);
*remainder = PEEKW(REMU_HL); *remainder = PEEKW(REMU_HL);
return PEEKW(QUOU_LL); return PEEKW(QUOU_LL);
} }

View file

@ -208,3 +208,10 @@ void textSetColor(byte f, byte b) {
_bcolor = b; _bcolor = b;
_ccolor = (f << 4) + b; _ccolor = (f << 4) + b;
} }
void textSetCursor(byte c) {
// Hack
if (c == 0) c = 32;
POKE(VKY_CRSR_CHAR, c); // Set cursor shape. (199 = Checkerboard)
}

View file

@ -66,6 +66,7 @@ void textPrint(char *message);
void textPrintInt(int32_t value); void textPrintInt(int32_t value);
void textReset(void); void textReset(void);
void textSetColor(byte f, byte b); void textSetColor(byte f, byte b);
void textSetCursor(byte c);
#ifdef __cplusplus #ifdef __cplusplus