mirror of
https://github.com/stevenhowes/CTheEscape.git
synced 2026-05-26 15:53:29 +01:00
118 lines
2.5 KiB
C
118 lines
2.5 KiB
C
#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;
|
|
unsigned char screen = 1;
|
|
|
|
// 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)
|
|
{
|
|
inreg.r[0] = 0;
|
|
inreg.r[1] = mode;
|
|
_kernel_swi(OS_ScreenMode,&inreg,&outreg);
|
|
}
|
|
|
|
void draw_line(int x1,int y1,int x2,int y2)
|
|
{
|
|
inreg.r[0] = 4;
|
|
inreg.r[1] = x1;
|
|
inreg.r[2] = y1;
|
|
_kernel_swi(OS_Plot,&inreg,&outreg);
|
|
inreg.r[0] = 5;
|
|
inreg.r[1] = x2;
|
|
inreg.r[2] = y2;
|
|
_kernel_swi(OS_Plot,&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);
|
|
}
|
|
|
|
void screen_flipbuffer()
|
|
{
|
|
inreg.r[0] = 19;
|
|
_kernel_swi(OS_Byte,&inreg,&outreg);
|
|
|
|
/* inreg.r[0] = 114;
|
|
inreg.r[1] = 1;
|
|
_kernel_swi(OS_Byte,&inreg,&outreg);
|
|
|
|
inreg.r[0] = 113;
|
|
inreg.r[1] = screen;
|
|
_kernel_swi(OS_Byte,&inreg,&outreg);
|
|
|
|
screen++;
|
|
if(screen > 3)
|
|
screen = 1;
|
|
inreg.r[0] = 112;
|
|
inreg.r[1] = screen;
|
|
_kernel_swi(OS_Byte,&inreg,&outreg);*/
|
|
}
|
|
|
|
void screen_clear()
|
|
{
|
|
inreg.r[0] = 12;
|
|
_kernel_swi(OS_WriteC,&inreg,&outreg);
|
|
}
|