mirror of
https://github.com/sehugg/8bitworkshop.git
synced 2024-12-01 13:50:30 +00:00
94 lines
2.3 KiB
C
94 lines
2.3 KiB
C
|
//this example shows how to set up a palette and use 8x8 HW sprites
|
||
|
//also shows how fast (or slow) C code is
|
||
|
|
||
|
#include "neslib.h"
|
||
|
|
||
|
//#link "tileset1.c"
|
||
|
|
||
|
// tile set, two planes for 4 colors
|
||
|
extern unsigned char TILESET[8*256];
|
||
|
|
||
|
//this example shows how to poll the gamepad
|
||
|
//and how to use nametable update system that allows to modify nametable
|
||
|
//while rendering is enabled
|
||
|
|
||
|
#include "neslib.h"
|
||
|
|
||
|
|
||
|
//these macro are needed to simplify defining update list constants
|
||
|
|
||
|
#define NTADR(x,y) ((0x2000|((y)<<5)|x))
|
||
|
|
||
|
#define MSB(x) (((x)>>8))
|
||
|
#define LSB(x) (((x)&0xff))
|
||
|
|
||
|
//variables
|
||
|
|
||
|
static unsigned char i;
|
||
|
static unsigned char x,y;
|
||
|
|
||
|
//the update list, it is for 6 tiles, 3 bytes per tile
|
||
|
|
||
|
static unsigned char list[6*3];
|
||
|
|
||
|
//init data for the update list, it contains MSB and LSB of a tile address
|
||
|
//in the nametable, then the tile number
|
||
|
|
||
|
const unsigned char list_init[6*3]={
|
||
|
MSB(NTADR(2,2)),LSB(NTADR(2,2)),0,
|
||
|
MSB(NTADR(3,2)),LSB(NTADR(3,2)),0,
|
||
|
MSB(NTADR(4,2)),LSB(NTADR(4,2)),0,
|
||
|
MSB(NTADR(6,2)),LSB(NTADR(6,2)),0,
|
||
|
MSB(NTADR(7,2)),LSB(NTADR(7,2)),0,
|
||
|
MSB(NTADR(8,2)),LSB(NTADR(8,2)),0
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
void main(void)
|
||
|
{
|
||
|
//copy tileset to RAM
|
||
|
vram_write((unsigned char*)TILESET, 0x0, sizeof(TILESET));
|
||
|
|
||
|
pal_col(1,0x21);//blue color for text
|
||
|
pal_col(17,0x30);//white color for sprite
|
||
|
|
||
|
memcpy(list,list_init,sizeof(list_init));
|
||
|
set_vram_update(6,list);
|
||
|
|
||
|
ppu_on_all();//enable rendering
|
||
|
|
||
|
x=124;
|
||
|
y=116;
|
||
|
|
||
|
//now the main loop
|
||
|
|
||
|
while(1)
|
||
|
{
|
||
|
ppu_waitnmi();//wait for next TV frame
|
||
|
|
||
|
oam_spr(x,y,0x41,0,0);//put sprite
|
||
|
|
||
|
//poll the pad and change coordinates according to pressed buttons
|
||
|
|
||
|
i=pad_poll(0);
|
||
|
|
||
|
if(i&PAD_LEFT &&x> 0) x-=2;
|
||
|
if(i&PAD_RIGHT&&x<248) x+=2;
|
||
|
if(i&PAD_UP &&y> 0) y-=2;
|
||
|
if(i&PAD_DOWN &&y<232) y+=2;
|
||
|
|
||
|
//put x 3-digit number into the update list
|
||
|
|
||
|
list[2]=0x10+x/100;
|
||
|
list[5]=0x10+x/10%10;
|
||
|
list[8]=0x10+x%10;
|
||
|
|
||
|
//put y 3-digit number into the update list
|
||
|
|
||
|
list[11]=0x10+y/100;
|
||
|
list[14]=0x10+y/10%10;
|
||
|
list[17]=0x10+y%10;
|
||
|
}
|
||
|
}
|