Commit of begging of port of TheEscape to C
This commit is contained in:
stevenhowes
2021-03-18 22:11:51 +00:00
parent fbb6451fe3
commit af20cab109
10 changed files with 390 additions and 0 deletions
+80
View File
@@ -0,0 +1,80 @@
#include <stdio.h>
#include "swis.h"
#include <kernel.h>
// SWI Registers
extern _kernel_swi_regs inreg;
extern _kernel_swi_regs outreg;
extern unsigned char *buffer;
// Loads sprite file into buffer
void load_sprites(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
buffer = (unsigned char *) malloc(length + 4);
if(buffer==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;
inreg.r[0] = 256+9;
inreg.r[1] = (unsigned int) buffer;
_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);
}
void display_mode(int mode)
{
// mode 28 80x60 640x480 16 colours
inreg.r[0] = 0;
inreg.r[1] = mode;
_kernel_swi(OS_ScreenMode,&inreg,&outreg);
}
void draw_sprite(char* spritename,int x, int y)
{
// SpriteOp 34 to put sprite at a location
inreg.r[0] = 256+34;
inreg.r[1] = (int) buffer;
inreg.r[2] = (int) spritename;
inreg.r[3] = x;
inreg.r[4] = y;
inreg.r[5] = 8; // GCOL dest=source and sprite mask
_kernel_swi(OS_SpriteOp,&inreg,&outreg);
}