mirror of
https://github.com/stevenhowes/CTheEscape.git
synced 2026-05-26 15:53:29 +01:00
proof of concept for tile based stuff (performance test).
Fixed 10x10 grid, so panning of 10x10 view around a real map yet.
This commit is contained in:
+39
-59
@@ -8,10 +8,12 @@ extern _kernel_swi_regs outreg;
|
||||
|
||||
extern unsigned char *buffer;
|
||||
extern unsigned char *fontbuffer;
|
||||
extern unsigned char *tilebuffer;
|
||||
|
||||
int screen = 1;
|
||||
|
||||
// Loads sprite file into buffer
|
||||
void load_sprites(char* filename)
|
||||
void load_sprites(char* filename, unsigned char **buffername)
|
||||
{
|
||||
int length;
|
||||
|
||||
@@ -38,74 +40,24 @@ void load_sprites(char* filename)
|
||||
}
|
||||
|
||||
// Attempt malloc, die if we cant
|
||||
buffer = (unsigned char *) malloc(length + 4);
|
||||
*buffername = (unsigned char *) malloc(length + 4);
|
||||
|
||||
if(buffer==NULL)
|
||||
if(buffername==NULL)
|
||||
{
|
||||
printf("Couldn't malloc %i bytes for sprite buffer",length);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
// Store size and other info as required for SpriteOp 9 to init sprite area
|
||||
*(unsigned int *)buffer = length + 4;
|
||||
*(unsigned int *)(buffer + 4) = 16;
|
||||
*(unsigned int *)*buffername = length + 4;
|
||||
*(unsigned int *)(*buffername + 4) = 16;
|
||||
inreg.r[0] = 256+9;
|
||||
inreg.r[1] = (unsigned int) buffer;
|
||||
inreg.r[1] = (unsigned int) *buffername;
|
||||
_kernel_swi(OS_SpriteOp,&inreg,&outreg);
|
||||
|
||||
// Load sprite file into buffer
|
||||
inreg.r[0] = 256+10;
|
||||
inreg.r[1] = (int) buffer;
|
||||
inreg.r[2] = (int) filename;
|
||||
_kernel_swi(OS_SpriteOp,&inreg,&outreg);
|
||||
}
|
||||
|
||||
// Loads sprite file into buffer
|
||||
void load_font(char* filename)
|
||||
{
|
||||
int length;
|
||||
|
||||
// Attempt to get file info
|
||||
inreg.r[0] = 13;
|
||||
inreg.r[1] = (int) filename;
|
||||
_kernel_swi(OS_File,&inreg,&outreg);
|
||||
|
||||
// Length will be in R4 if it exists
|
||||
length = outreg.r[4];
|
||||
|
||||
// If it's <1 it's fil not found
|
||||
if(outreg.r[0] < 1)
|
||||
{
|
||||
printf("Sprite file %s not found",filename);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
// Stops us trying to mallocsomething mad if file is too big.
|
||||
if(length > 200000)
|
||||
{
|
||||
printf("Sprite file %s seems unreasonably large at %i bytes",filename, length);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
// Attempt malloc, die if we cant
|
||||
fontbuffer = (unsigned char *) malloc(length + 4);
|
||||
|
||||
if(fontbuffer==NULL)
|
||||
{
|
||||
printf("Couldn't malloc %i bytes for sprite buffer",length);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
// Store size and other info as required for SpriteOp 9 to init sprite area
|
||||
*(unsigned int *)fontbuffer = length + 4;
|
||||
*(unsigned int *)(fontbuffer + 4) = 16;
|
||||
inreg.r[0] = 256+9;
|
||||
inreg.r[1] = (unsigned int) fontbuffer;
|
||||
_kernel_swi(OS_SpriteOp,&inreg,&outreg);
|
||||
|
||||
// Load sprite file into buffer
|
||||
inreg.r[0] = 256+10;
|
||||
inreg.r[1] = (int) fontbuffer;
|
||||
inreg.r[1] = (int) *buffername;
|
||||
inreg.r[2] = (int) filename;
|
||||
_kernel_swi(OS_SpriteOp,&inreg,&outreg);
|
||||
}
|
||||
@@ -190,10 +142,21 @@ void draw_letter(char* spritename,int x, int y)
|
||||
inreg.r[2] = (int) spritename;
|
||||
inreg.r[3] = x;
|
||||
inreg.r[4] = y;
|
||||
inreg.r[5] = 8; // GCOL dest=source and sprite mask
|
||||
inreg.r[5] = 8;
|
||||
_kernel_swi(OS_SpriteOp,&inreg,&outreg);
|
||||
}
|
||||
|
||||
void draw_tile(char* spritename,int x, int y)
|
||||
{
|
||||
// SpriteOp 34 to put sprite at a location
|
||||
inreg.r[0] = 256+34;
|
||||
inreg.r[1] = (int) tilebuffer;
|
||||
inreg.r[2] = (int) spritename;
|
||||
inreg.r[3] = x;
|
||||
inreg.r[4] = y;
|
||||
inreg.r[5] = 0;
|
||||
_kernel_swi(OS_SpriteOp,&inreg,&outreg);
|
||||
}
|
||||
|
||||
void draw_spritetext(char* text, int x, int y)
|
||||
{
|
||||
@@ -214,9 +177,9 @@ void draw_spritetext(char* text, int x, int y)
|
||||
{
|
||||
case 't':
|
||||
case 'i':
|
||||
case 'y':
|
||||
case '.':
|
||||
case ',':
|
||||
case 'y':
|
||||
currentx += 12 + 4;
|
||||
break;
|
||||
case '\'':
|
||||
@@ -318,6 +281,23 @@ void screen_flipbuffer()
|
||||
|
||||
}
|
||||
|
||||
void screen_nobuffer()
|
||||
{
|
||||
// Hardware
|
||||
inreg.r[0] = 113;
|
||||
inreg.r[1] = 1;
|
||||
_kernel_swi(OS_Byte,&inreg,&outreg);
|
||||
|
||||
// Drivers
|
||||
inreg.r[0] = 112;
|
||||
inreg.r[1] = 1;
|
||||
_kernel_swi(OS_Byte,&inreg,&outreg);
|
||||
|
||||
inreg.r[0] = 19;
|
||||
_kernel_swi(OS_Byte,&inreg,&outreg);
|
||||
|
||||
}
|
||||
|
||||
void screen_clear()
|
||||
{
|
||||
inreg.r[0] = 12;
|
||||
|
||||
Reference in New Issue
Block a user