#include #include "swis.h" #include // 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); }