From a087e6b7cf6d849f0961b2bb673f2f7677a49db7 Mon Sep 17 00:00:00 2001 From: Steven Hugg Date: Sun, 21 May 2017 17:34:57 -0400 Subject: [PATCH] neslib support; nes palette --- cc65/.gitignore | 4 + cc65/Makefile | 25 + cc65/default_conio.c | 43 + cc65/default_neslib.c | 53 + cc65/longbranch.mac | 88 + cc65/neslib.cfg | 85 + cc65/neslib.h | 226 ++ cc65/neslib.lib | Bin 0 -> 26633 bytes cc65/threed.c | 248 ++ presets/{nes => nes-conio}/conio.c | 0 presets/nes-conio/ex1.asm | 152 ++ presets/{nes => nes-conio}/hello.c | 0 presets/{nes => nes-conio}/siegegame.c | 0 presets/nes-lib/crypto.c | 3071 ++++++++++++++++++++++++ presets/nes-lib/neslib1.c | 58 + presets/nes-lib/neslib2.c | 105 + presets/nes-lib/neslib3.c | 99 + presets/nes-lib/neslib4.c | 122 + src/pixed/pixeleditor.js | 46 +- src/platform/nes.js | 579 ++--- src/worker/fs65.data | 1546 +++++------- src/worker/fs65.js | 1 - src/worker/fs65.js.metadata | 2 +- src/worker/workermain.js | 28 +- 24 files changed, 5347 insertions(+), 1234 deletions(-) create mode 100644 cc65/.gitignore create mode 100644 cc65/Makefile create mode 100644 cc65/default_conio.c create mode 100644 cc65/default_neslib.c create mode 100644 cc65/longbranch.mac create mode 100644 cc65/neslib.cfg create mode 100644 cc65/neslib.h create mode 100644 cc65/neslib.lib create mode 100644 cc65/threed.c rename presets/{nes => nes-conio}/conio.c (100%) create mode 100644 presets/nes-conio/ex1.asm rename presets/{nes => nes-conio}/hello.c (100%) rename presets/{nes => nes-conio}/siegegame.c (100%) create mode 100644 presets/nes-lib/crypto.c create mode 100644 presets/nes-lib/neslib1.c create mode 100644 presets/nes-lib/neslib2.c create mode 100644 presets/nes-lib/neslib3.c create mode 100644 presets/nes-lib/neslib4.c diff --git a/cc65/.gitignore b/cc65/.gitignore new file mode 100644 index 00000000..6754d4ff --- /dev/null +++ b/cc65/.gitignore @@ -0,0 +1,4 @@ +*.nes +*.o +*.s +*.lzg diff --git a/cc65/Makefile b/cc65/Makefile new file mode 100644 index 00000000..ffbba7f5 --- /dev/null +++ b/cc65/Makefile @@ -0,0 +1,25 @@ + +CC65FLAGS=-I/home/huggvey/compilers/cc65/include -I/home/huggvey/compilers/cc65/include/nes -L/home/huggvey/compilers/cc65/lib --cfg-path /home/huggvey/compilers/cc65/cfg/ + +all: \ + default_neslib.neslib.nes default_conio.conio.nes \ + default_neslib.neslib.lzg default_conio.conio.lzg + +clean: + rm -f *.s *.o *.nes *.lzg + +#%.s: %.c +# cc65 $*.c +# ca65 $*.s + +%.neslib.nes: %.c + cl65 $(CC65FLAGS) -o $@ -t nes -C neslib.cfg $*.c neslib.lib nes.lib + +%.conio.nes: %.c + cl65 $(CC65FLAGS) -o $@ -t nes $*.c nes.lib + +%.rom: %.s + ld65 -o $@ -C atarivec.cfg $*.o atari2600.lib + +%.lzg: %.nes + lzg $< | hexdump -v -e '"\n" 32/1 "%u,"' > $@ diff --git a/cc65/default_conio.c b/cc65/default_conio.c new file mode 100644 index 00000000..7b2721ff --- /dev/null +++ b/cc65/default_conio.c @@ -0,0 +1,43 @@ + +#include "nes.h" + +unsigned char index; + +const unsigned char TEXT[]={"No cart loaded"}; + +const unsigned char PALETTE[]={0x1, 0x00, 0x10, 0x20}; //blue, gray, lt gray, white + +void main (void) { + + // turn off the screen + PPU.control = 0; + PPU.mask = 0; + + // load the palette + PPU.vram.address = 0x3f; + PPU.vram.address = 0x0; + for(index = 0; index < sizeof(PALETTE); ++index){ + PPU.vram.data = PALETTE[index]; + } + + // load the text + PPU.vram.address = 0x21; // set an address in the PPU of 0x21ca + PPU.vram.address = 0xc9; // about the middle of the screen + for( index = 0; index < sizeof(TEXT); ++index ){ + PPU.vram.data = TEXT[index]; + } + + // reset the scroll position + PPU.vram.address = 0x20; + PPU.vram.address = 0x0; + PPU.scroll = 0; + PPU.scroll = 0; + + // turn on screen + PPU.control = 0x80; // NMI on + PPU.mask = 0x1e; // screen on + + // infinite loop + while (1) { + } +} diff --git a/cc65/default_neslib.c b/cc65/default_neslib.c new file mode 100644 index 00000000..d86f7ce0 --- /dev/null +++ b/cc65/default_neslib.c @@ -0,0 +1,53 @@ + +//this example code shows how to put some text in nametable + +#include "neslib.h" + +// tileset data + +const unsigned char TILESET[8*128] = {/*{w:8,h:8,bpp:1,count:128,brev:1}*/ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x7c,0x7c,0x7c,0x38,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x6c,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0xfe,0x6c,0xfe,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0xfe,0xd0,0xfe,0x16,0xfe,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0xdc,0x38,0x76,0xe6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x6c,0x7c,0xec,0xee,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x38,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x70,0x70,0x70,0x70,0x70,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x38,0x38,0x38,0x38,0x38,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x38,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x38,0xfe,0x38,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x1e,0x3c,0x78,0xf0,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x7c,0xee,0xee,0xee,0xee,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x78,0x38,0x38,0x38,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x0e,0x7c,0xe0,0xee,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x0e,0x3c,0x0e,0x0e,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x7e,0xee,0xee,0xfe,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xe0,0xfc,0x0e,0xee,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xe0,0xfc,0xee,0xee,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xee,0x1c,0x1c,0x38,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xee,0x7c,0xee,0xee,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xee,0xee,0x7e,0x0e,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x38,0x70,0x70,0x38,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x38,0x1c,0x1c,0x38,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xee,0x1c,0x38,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x7c,0xee,0xee,0xee,0xe0,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xee,0xee,0xee,0xfe,0xee,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xee,0xfc,0xee,0xee,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xee,0xe0,0xe0,0xee,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xec,0xee,0xee,0xee,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xe0,0xf0,0xe0,0xe0,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xe0,0xf8,0xe0,0xe0,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xe0,0xee,0xee,0xee,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0xee,0xfe,0xee,0xee,0xee,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x38,0x38,0x38,0x38,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x0e,0x0e,0x0e,0xee,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0xfc,0xf8,0xec,0xee,0xee,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xe0,0xe0,0xe0,0xee,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0xee,0xfe,0xfe,0xee,0xee,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0xee,0xfe,0xfe,0xee,0xe6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xee,0xee,0xee,0xee,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0xfc,0xee,0xee,0xee,0xfc,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xee,0xee,0xee,0xec,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xee,0xee,0xee,0xfc,0xee,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xe0,0x7c,0x0e,0xee,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x38,0x38,0x38,0x38,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0xee,0xee,0xee,0xee,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0xee,0xee,0x6c,0x38,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0xee,0xfe,0xfe,0xee,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0x7c,0x38,0x7c,0xee,0xee,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0xee,0xee,0x7c,0x38,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x1c,0x38,0x70,0xe0,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +}; + +//this macro is used remove need of calculation of the nametable address in runtime + +#define NTADR(x,y) ((0x2000|((y)<<5)|x)) + +//put a string into the nametable + +void put_str(unsigned int adr,const char *str) +{ + vram_adr(adr); + + while(1) + { + if(!*str) break; + vram_put((*str++)-0x20);//-0x20 because ASCII code 0x20 is placed in tile 0 of the CHR + } +} + +void main(void) +{ + //copy tileset to RAM + vram_write((unsigned char*)TILESET, 0x0, sizeof(TILESET)); + + //rendering is disabled at the startup, and palette is all black + pal_col(0,0x1); + pal_col(1,0x30);//set while color + + //you can't put data into vram through vram_put while rendering is enabled + //so you have to disable rendering to put things like text or a level map + //into the nametable + + //there is a way to update small number of nametable tiles while rendering + //is enabled, using set_vram_update and an update list + + put_str(NTADR(9,15),"NO CART LOADED"); + + ppu_on_all();//enable rendering + + while(1);//do nothing, infinite loop +} diff --git a/cc65/longbranch.mac b/cc65/longbranch.mac new file mode 100644 index 00000000..d6f6cde8 --- /dev/null +++ b/cc65/longbranch.mac @@ -0,0 +1,88 @@ +.macro jeq Target + .if .match(Target, 0) + bne *+5 + jmp Target + .elseif .def(Target) .and .const((*-2)-(Target)) .and ((*+2)-(Target) <= 127) + beq Target + .else + bne *+5 + jmp Target + .endif +.endmacro +.macro jne Target + .if .match(Target, 0) + beq *+5 + jmp Target + .elseif .def(Target) .and .const((*-2)-(Target)) .and ((*+2)-(Target) <= 127) + bne Target + .else + beq *+5 + jmp Target + .endif +.endmacro +.macro jmi Target + .if .match(Target, 0) + bpl *+5 + jmp Target + .elseif .def(Target) .and .const((*-2)-(Target)) .and ((*+2)-(Target) <= 127) + bmi Target + .else + bpl *+5 + jmp Target + .endif +.endmacro +.macro jpl Target + .if .match(Target, 0) + bmi *+5 + jmp Target + .elseif .def(Target) .and .const((*-2)-(Target)) .and ((*+2)-(Target) <= 127) + bpl Target + .else + bmi *+5 + jmp Target + .endif +.endmacro +.macro jcs Target + .if .match(Target, 0) + bcc *+5 + jmp Target + .elseif .def(Target) .and .const((*-2)-(Target)) .and ((*+2)-(Target) <= 127) + bcs Target + .else + bcc *+5 + jmp Target + .endif +.endmacro +.macro jcc Target + .if .match(Target, 0) + bcs *+5 + jmp Target + .elseif .def(Target) .and .const((*-2)-(Target)) .and ((*+2)-(Target) <= 127) + bcc Target + .else + bcs *+5 + jmp Target + .endif +.endmacro +.macro jvs Target + .if .match(Target, 0) + bvc *+5 + jmp Target + .elseif .def(Target) .and .const((*-2)-(Target)) .and ((*+2)-(Target) <= 127) + bvs Target + .else + bvc *+5 + jmp Target + .endif +.endmacro +.macro jvc Target + .if .match(Target, 0) + bvs *+5 + jmp Target + .elseif .def(Target) .and .const((*-2)-(Target)) .and ((*+2)-(Target) <= 127) + bvc Target + .else + bvs *+5 + jmp Target + .endif +.endmacro diff --git a/cc65/neslib.cfg b/cc65/neslib.cfg new file mode 100644 index 00000000..b508f9f9 --- /dev/null +++ b/cc65/neslib.cfg @@ -0,0 +1,85 @@ +SYMBOLS { + __STACKSIZE__: type = weak, value = $0500; # 5 pages stack +} + +MEMORY { + # First 28 bytes of the zero page are used by NES library + + ZP: start = $28, size = $d8, type = rw, define = yes; + + # INES Cartridge Header + + HEADER: start = $0, size = $10, file = %O ,fill = yes; + + # 2 16K ROM Banks + # - startup + # - code + # - rodata + # - data (load) + + # PRG: start = $8000, size = $3f00, file = %O ,fill = yes, define = yes; + + # NROM256 + PRG: start = $8000, size = $7f00, file = %O ,fill = yes, define = yes; + + # DPCM Samples at end of the ROM + + DMC: start = $7f00, size = $fa, file = %O, fill = yes; + + # NROM256 + # DMC: start = $ff00, size = $fa, file = %O, fill = yes; + + # Hardware Vectors at end of the ROM + + VECTORS: start = $7ffa, size = $6, file = %O, fill = yes; + + # NROM256 + # VECTORS: start = $fffa, size = $6, file = %O, fill = yes; + + # 1 8K CHR Bank + + CHR: start = $0000, size = $2000, file = %O, fill = yes; + + # standard 2K SRAM (-zeropage) + # $0100 famitone, palette, cpu stack + # $0200 oam buffer + # $0300..$800 ca65 stack + + RAM: start = $0300, size = $0500, define = yes; + + # Use this definition instead if you going to use extra 8K RAM + # RAM: start = $6000, size = $2000, define = yes; +} + +SEGMENTS { + HEADER: load = HEADER, type = ro; + STARTUP: load = PRG, type = ro, define = yes; + LOWCODE: load = PRG, type = ro, optional = yes; + ONCE: load = PRG, type = ro, optional = yes; + INIT: load = PRG, type = ro, define = yes, optional = yes; + CODE: load = PRG, type = ro, define = yes; + RODATA: load = PRG, type = ro, define = yes; + DATA: load = PRG, run = RAM, type = rw, define = yes; + VECTORS: load = VECTORS, type = rw; + SAMPLES: load = DMC, type = rw; + CHARS: load = CHR, type = rw; + BSS: load = RAM, type = bss, define = yes; + HEAP: load = RAM, type = bss, optional = yes; + ZEROPAGE: load = ZP, type = zp; +} + +FEATURES { + CONDES: segment = INIT, + type = constructor, + label = __CONSTRUCTOR_TABLE__, + count = __CONSTRUCTOR_COUNT__; + CONDES: segment = RODATA, + type = destructor, + label = __DESTRUCTOR_TABLE__, + count = __DESTRUCTOR_COUNT__; + CONDES: type = interruptor, + segment = RODATA, + label = __INTERRUPTOR_TABLE__, + count = __INTERRUPTOR_COUNT__; +} + diff --git a/cc65/neslib.h b/cc65/neslib.h new file mode 100644 index 00000000..5ba0493a --- /dev/null +++ b/cc65/neslib.h @@ -0,0 +1,226 @@ +//NES hardware-dependent functions by Shiru (shiru@mail.ru) +//Feel free to do anything you want with this code, consider it Public Domain + + +//set bg and spr palettes, data is 32 bytes array + +void __fastcall__ pal_all(const char *data); + +//set bg palette only, data is 16 bytes array + +void __fastcall__ pal_bg(const char *data); + +//set spr palette only, data is 16 bytes array + +void __fastcall__ pal_spr(const char *data); + +//set a palette entry, index is 0..31 + +void __fastcall__ pal_col(unsigned char index,unsigned char color); + +//reset palette to $0f + +void __fastcall__ pal_clear(void); + +//set virtual bright, 0 is black, 4 is normal, 8 is white + +void __fastcall__ pal_bright(unsigned char bright); + + +//turn off rendering and nmi + +void __fastcall__ ppu_off(void); + +//turn on bg, spr, and nmi + +void __fastcall__ ppu_on_all(void); + +//turn on bg only and nmi + +void __fastcall__ ppu_on_bg(void); + +//turn on spr only and nmi + +void __fastcall__ ppu_on_spr(void); + +//set PPU_MASK directly + +;void __fastcall__ ppu_mask(unsigned char mask); + + + +//clear OAM buffer, all the sprites are hidden + +void __fastcall__ oam_clear(void); + +//set sprites size, 0 for 8x8, 1 for 8x16 + +void __fastcall__ oam_size(unsigned char size); + +//set sprite in OAM buffer, chrnum is tile, attr is attribute, sprid is offset in OAM in bytes +//returns sprid+4, which is offset for a next sprite + +unsigned char __fastcall__ oam_spr(unsigned char x,unsigned char y,unsigned char chrnum,unsigned char attr,unsigned char sprid); + +//set metasprite in OAM buffer +//meta sprite is a const unsigned char array, it contains four bytes per sprite +//in order x offset, y offset, tile, attribute +//x=128 is end of a meta sprite +//returns sprid+4, which is offset for a next sprite + +unsigned char __fastcall__ oam_meta_spr(unsigned char x,unsigned char y,unsigned char sprid,const unsigned char *data); + +//hide all the sprites starting from given offset + +void __fastcall__ oam_hide_rest(unsigned char sprid); + + + +//wait NMI and sync to 50hz (with frameskip for NTSC) + +void __fastcall__ ppu_waitnmi(void); + + + +//play a music in FamiTone format + +void __fastcall__ music_play(const unsigned char *data); + +//stop music + +void __fastcall__ music_stop(void); + +//pause and unpause music + +void __fastcall__ music_pause(unsigned char pause); + +//play FamiTone sound effect on channel 0..3 + +void __fastcall__ sfx_play(unsigned char sound,unsigned char channel); + + + +//poll controller and return flags like PAD_LEFT etc, input is pad number (0 or 1) + +unsigned char __fastcall__ pad_poll(unsigned char pad); + +//poll controller in trigger mode, a flag is set only on button down, not hold +//if you need to poll the pad in both normal and trigger mode, poll it in the +//trigger mode for first, then use pad_state + +unsigned char __fastcall__ pad_trigger(unsigned char pad); + +//get previous pad state without polling ports + +unsigned char __fastcall__ pad_state(unsigned char pad); + + +//set scroll, including top bits + +void __fastcall__ scroll(unsigned int x,unsigned int y); + + + +//select current chr bank for sprites, 0..1 + +void __fastcall__ bank_spr(unsigned char n); + +//select current chr bank for background, 0..1 + +void __fastcall__ bank_bg(unsigned char n); + + + +//returns random number 0..255 or 0..65535 + +unsigned char __fastcall__ rand8(void); +unsigned int __fastcall__ rand16(void); + +//set random seed + +void __fastcall__ set_rand(unsigned int seed); + + + +//set a pointer to update buffer, contents of the buffer is transferred to vram every frame +//buffer structure is MSB, LSB, byte to write, len is number of entries (not bytes) +//could be set during rendering, but only takes effect on a new frame +//number of transferred bytes is limited by vblank time + +void __fastcall__ set_vram_update(unsigned char len,unsigned char *buf); + +//set vram pointer to write operations if you need to write some data to vram +//works only when rendering is turned off + +void __fastcall__ vram_adr(unsigned int adr); + +//put a byte at current vram address, works only when rendering is turned off + +void __fastcall__ vram_put(unsigned char n); + +//fill a block with a byte at current vram address, works only when rendering is turned off + +void __fastcall__ vram_fill(unsigned char n,unsigned int len); + +//set vram autoincrement, 0 for +1 and not 0 for +32 + +void __fastcall__ vram_inc(unsigned char n); + +//read a block from vram, works only when rendering is turned off + +void __fastcall__ vram_read(unsigned char *dst,unsigned int adr,unsigned int size); + +//write a block to vram, works only when rendering is turned off + +void __fastcall__ vram_write(unsigned char *src,unsigned int adr,unsigned int size); + + +//unpack a nametable into vram + +void __fastcall__ unrle_vram(const unsigned char *data,unsigned int vram); + + + +//like a normal memcpy, but does not return anything + +void __fastcall__ memcpy(void *dst,void *src,unsigned int len); + +//like memset, but does not return anything + +void __fastcall__ memfill(void *dst,unsigned char value,unsigned int len); + +//delay for N frames + +void __fastcall__ delay(unsigned char frames); + +//initialize sound effects + +void __fastcall__ FamiToneSfxInit(void* src); + +void __fastcall__ FamiToneSfxInit(void* src); + + +#define PAD_A 0x01 +#define PAD_B 0x02 +#define PAD_SELECT 0x04 +#define PAD_START 0x08 +#define PAD_UP 0x10 +#define PAD_DOWN 0x20 +#define PAD_LEFT 0x40 +#define PAD_RIGHT 0x80 + +#define OAM_FLIP_V 0x80 +#define OAM_FLIP_H 0x40 +#define OAM_BEHIND 0x20 + +#define MAX(x1,x2) (x1)xTvT)*q^`(xy~xc9Tyv-(r_v-g{BMI9eF zAqawR?+${F4|FR!k#Zsb)A(P){|os)l>hlHf?y~A|A+EluMC3g5`tjVH9-(^KbGrt z=LEr)+k@c5xywgf;m7CR{#9n9CELHb?X{$?#dhxP zhwggXu0M3n?QhJqRblH9XWbs8ry#o;0~Q8eeCcTM<)g(lM~iE{XyRQLQ864;g+Vjl=%UQY@vTUa1GLm1k~6#TRqF{Ew3%BvHd@?+}%e=KSq1na}#t$hBUUy_di>$g}~;LBgeBrahk+T^~*hte$Pf_)m`E zq#Lb&T97a(InzFlA;L8)2xn#3gak}v+G;8Xr)1hzoZetx5k|GWj@bjk0rodkAc_@N z@s7dG^?IoFYzYco_K6htaJpn`l3muZza2zpwe=1I+b0}gqtb)$32qUbK*9zR#DpL; zlFv24UP|?Aq76v*Ym)sedb0hbYl=Na8|<-VD6h7U2z0k&I4jYn5O1c9NsQUUDZSfz z`;EbNrd6eia)VQ<#IxK)S>lxC#F=R$(qerQK`&2BiSDlhSgmPuK^h+1RbH zkCM~+1fW+wl-8!U?jf&wB$j4h)D0=ppy*95i#;Tl_yF9#jN$t~;+`pKjQHXhmr z`!d1vk{;O44*l&jsMWR^sRND)bLl3dQP{Ybx%SYe5K5+1#FUY)o{@?e_Ci}u0y6D1 z(cfeE*l9TRvuzC#JH!3~o@pcTU{+v#y#FL++B4oWxK752Tzk`EeUiYya%>bh!201# zjx8rQqwRma$cPN5CD@yCdKmNsbIi3N>9UJ(K$$RUOpFXk$h4oy)vVB-q}vQWImp> zW_ctjnUwayG-uWSRk`~As(k7HsGN&|7t>yM>uW6G#kA!iQw{c2+~H29WU5?2!_8TH ze3o^`WjV&=`r|Us*>HT8SB}eajLD71WuCL?_$-@`%W{m#*N)3P=k?>Wym4HXV@$qz zT;@4%9iQdx3S8Tc6VUk_{D6r zPe^9(Fe|T5wxKCL{|*Eb9euXk?z52DMyA9}Tb!m@YHcdB)MA#O&bASMX4-vToCKlL z<|5qLzG0ruvRx>zXlRde>36oh&N{)&xD$6~W!fI5^@>Jzh&wV=O4tqUM_*)Dn!SwD zJ$A3>U?Z|?8`(;9SKA~#qz1me7@u6v4$vS2>{+ndKEdYuj?Olgn@n4q5bKiyvi>x(IV7OceoM9*+FW1s z-OtFAEhs3oF^IBB*#~WMU~l;P56fE$We;X|WZDOEXa%|1Z(!K(ESo3UZ&B`OKxBX5V`Pl8&Ar(J5@KkF*mJ&4I@7dY$Xax?E7SP0cO z^W4C;d7n7lrjv%o304VviSNERobwa=(9?Lbt@Iv9BJL8i?@BGU#XAGJ0Ju~{@*?N}P;JwG|q2K#29zWp;2n=M11 zJMCl}O#;$VZL*r+Rbtp~pw}Fvqo>ugO(d_{s;GI_(cO8w)}2pil0sXB$CCs5)O|Z- z7x;cJwC~Bu9(xSH_AH`g52;F91H&Z7A8{_UEeXEY+k*8f8^F9U zAq?#ktSz*)iC(joa+SU5H5S@>)of1kn$5H|^ODyP(IVAUr+G~^)6#^5(C!Lsn$4nL z^$FNY(tjJ+GQ28Dv}(93?2FW>>I#cI;g-#({tE6%e=Xs3lX zP!a=?sI-rfU}AZS+^z3rd&ydjy+XL>39IZEB!~sB;&ZLPk6EJqnTAH_kDiq=*lJ+2 zY4hUqY#sg4Q?!HL2g6SYSJ^x|iD&dLqP20-F6SftACV3=|C$0W_Tmb>-DCS9kVxgu>l6(2h;*Ke132X$O z*4Rwi@t~t`y-#$?T=XV8`fBn9me(iQlW^785NZxM`heYpGIUPFexc3dnaOvw>r$f8 zI~r=Hy~_hlGU)3{Z#o(MVWB(3o*K1`jyYV&{(f)sMwaaf?~P=&y`kiQ;qJ5Tt*GVq z;%}9$A|cgwzUS_I)&7i*HI3{k^f4`P z{%I^A-_u3jrbEZ<9pa7ILi~)`Gaf=i+wO7Iw-v7CYkPz{wA>*j^wi9klytZ;q}WjW-p&;KSa;8IT=4i$&Ne{~I~LmO zF!yU{8<4ED+km=%JOs>xuUV zbKGOw$j^=h8>@kWpE;j~8f1R3@7 z8ltMSwcOl}_8II(u7&tIevU!GIX;HoBZM(jeu_AG0&{E)3COgK(E`vT5hWW#-!;z% zEA2-dc_!7S!c@p!-$@g3HeN!OR*5Mo!~J01p}dD*k-f6>3KQBMnWsJ z5e(C5XWCmt#aKjsn7u1zFl_U-J?o?7OnaAxFSIGtXWEiPEle-CUrRJ>evY>N>zwj4 z0>x+8v)C=PMTlkE#OOFi0uu?ak^>W`zjKV(J2J47Zi#E-X{3H<+9=TuIPDZ$O4R*M zwRyB+ru9wqop)b+uQ<&rWa^{Zu7AMyWOV(03hz-L2q_#A;W-Zj=wQ$ea#b{&oLD7Q zt57vP(|)1BYitV@bsW8?Js2st(kJM0@79}9%;}SNpiEmy{MEJyfgc>h>5c3Qb&%>5 z?;xPe_b2KN)|Z-UyVb>kLd$exgJBFE{m^eo)MX#@MyYSJNM+-nEKgI{Zf}VC_PuKi z2v51`7X`Ee{(hPE2&yuzn~(NxFrRM=oPL1~Q7eq&04v$Xxx|Gw$}@bCy@owv{F=LI znf4XI)L38ASx1;@e^pE0#)E?WRq^&m!*Ua_tXdYVAyaPzF9kLyhgi zYRu6mnlHF4Jl{rQ=&=iJE*py~+YG}7uAY={(6nDzXa^X+w9-paP;Z4E)HBRsDIhfs z?Md`!+Ct643uy=9>8NnlaYHy$ktCdh=&!Nq*op}=ZB}%M_K3SW3oC0g?R`XuWI3Vd z+GkNm?dkQOF_3A^hn17vWHx4?$Fk4IS3_HbGsH4YvAj$a8*DXQquO49`GBy{zJOk7 zkCg7 zo+3O|c$%<*@O0rB!ZU?u2^$H|7G~7q_sY+&g@J9OeN7k&6NHJvBw?~JMaY8-{At3N zFkM(jm?5ltOu3$YtNb{gq;h@X$-+~FrwUIKHV~dJJVSV<@GM~?;n~6rVW!PyzC1^G zuJAnJ`N9i?7YZ*D{zlkXc(L#j;ibaMgqI65gn_-tYGA@pm>^6PCJB>;DZ*4?nlL6z z7uFGG2^VvDV zbA{&#&lg@GyijGhuUK3*nW*tAtkzuMu7= zyiWLA;q}7b32zW)2Bw$-+~FrwUIKHV~dJJVSV<@GK!Gzi2yKc$tvR z8I*H`=L*jgo-e#Wc%kqj;ctYEg%=Ai5nd|1OnCV* zu!$AB`~L~37in3|cxqz*d8}8f^AuPApMZLimf<|JG_hX~XY)|f#C|&7c1fUhbY$8v&DE)ZJ$!}jj*%5 zM#Fg0xB1B?;rBvMp-o^qhN zOA*?ODVi4Iw3t=Fkz>34SR>uO#YB$HCt7dOIcm`jv`@?&_t1) zvCB>xVF)s#aM~T~D~~3lFK&)aY&`6LbxfE`Fk{hOWBo9mD5PGlI#%0MS}n`bza8U) zg0P~l?TQlow4Y&R*#0Q_TcYGI#IH%bE#Yo@UE6}MnRb!#eXr;HB7ZHi3Huq2&N7(% zy+AAP^VjFPT2SjS2pJ+PRD*atP?Y^9*npW3lpqTf4-fn63Ff6#$ikb|Ys+xUK zi|!(`xHyG=PQ%VuLyRFG?-;1)`;ou~_AuJJlB+57XK&ys9&ft!Mvh_fl_$2jeL(UC z*c7$W0v#m{jZV$aN++_R1l8Hvy0*8;K}nMBQUCY}Pw3W_f0_{l#de7ekDc5q;5Ci#&)^gm@SC|#MUc(qCvY7oMe-B`E?(fXLP@J>q91q%O z(FyUb9_MH7T$p8_QPbHTrVpe&WLwp*HjvBEK)1M-fFHE^d<@{GDl4b3n(A&Xae_`n3Y9{)~AGrJ8kd6~)W+0E^Qv%=h=FhR{v zO3h~kgUvM_=V!Eb1N#nzU2id?I%XqiyGpwZUAblx>EAgvmx>3iv&0l-XDlXX+1mus z+4|6g1UZE8n%HI(hK_FUX-E&+;-r5MaxqEV$mIDl+G}h!T*;1Fg5K~1rexXsK0cZK zH+hgJnbr6tL#w|*66T(6c8EL@<>QL-BdjLz5=2(tSCpfoLBgkmfsMjK1KUm-yWYwh zJyH_0FKLrXt6&kC`xi6+*fht+qU=Fdpre6q^_eJ^WnWU?*``Fzd5Ex^*pnciL`F0J zLPa{7v(tZV&e8Pc!RcAHlV+XE8updvs+U~?H8snA^cc@Ido1dhhnN@uz~gS>@$%~@`;cGfhfMGG1QfLYdp888^F{sE5X*0 z)E$NPgWC23Ff`EL^-gkAb?i;3F3d1j`0F>(lk^N_$u|;1yMUs_I6%? ziWg{#N-|kvW5FcHgl*6c;nFp>9hpK~NCsaZimxKQPq|)())G%tx{bqa@=%49-7#B+ zT(!NA+o5B)JKY9Tvp&m))4vzk3>;4$FGn-TuK8GeqK@bqP3F9~cTiJU;D zzl&1wI63rP>snM**{cz8C_dAzCewITHXK{ztdSD9ht4&vj=d6f@tsk>dzNhFTJI#y z6Y{S&xmy2=t;F$a8%oe8I=Y(vQIDM=)#J$_w812xzkM1t{fjVQVMR1}cagSSn~``_ z^^7Qa@6imtCmJk<>L_`#T}{?rpyrp*d&&ZHg{@ z4&-$YMVG%smusWT>CxpU6AL+Z&X=M~B`GGF$D_+Xqsv{GvtLU;bx@=)PM#`(A3p0Y>Es8EPqszqTGBUahjxH6^g-`xn;GXDG8eJF_pVRi8 zqRZc+%Wcu6AiA`VF29d1H%FJ7qRS1@<+|u{b#$Sro=4~Z$0a2Qf(>2~1{YA|Q@Lad zqp`h&d;2boJ)B~XMsuGuOipx}S0kA;%d{`TjE|BZiET+(o47ftI&D_+7peP`XQZ!A z8JIpRWxoxyu)d8-31=rg6rOaraH72$@{5wNo?l0#g&BT*)55x3)80*47Y>U3kUT!+ z+thC3cuO0e06B4OLf^zyiO-~l>CU_=^^&FLt;ufbao)BD);F|Q6QMmOS|`z#r$w}3 zqBRk1UM+2?XlIMoKgD{dB0EI1gM5X+Z;Wbb3~X%hj0|nJMSMKlLgTY2Xe*K;+Cb4h z5v_GZ8XywiF~Qc|MkZk4QIYs63)0-gh}K^;p48j|Kb~^FM?~YZL1_FEr^dbOCmOHh zp>0fyXceOQ7an{75{5OY8$&qzirQ7wo9xlVVHQ3t5)X)htxK?hPU<7l2~K+3NeK29 zsaS$5QzKe0(XJHj3ad$h?I9086s1W-`Clc3FAW3hm1yH)Fg@rbUPnV35Q|9vo@ZH<4aVv4&6{aEia<4(!^*kJFkCN?zuS_d7X9(H?xaeQ_HlgTq%tQ>6{!~=%Q&fr zllb)sf}eyD=^swIT%sgo`cX+ugx>h7d7Me3g%k-9mFafhxSY6bu9q^=@0 zV=<7)yPf90%wob%3YSL#+~q|70aswlEUZeE*Ht=UT`?jPus>~4){Qf;> z5G)cBH02MN@q=KmLcG-pi)B08xml-!;0Gz>WeRm4%JggrGNSSKM+vh0Q(mCj|MB9P zF6m#Z1_7Oj@-R8asDv_Kx(-Qlx}5t(l9Lt2r?Ss8C{lw|J45urtl>ehQMEsaf0z7N zqm2E@E1AYozd|fEihY$798h_z@MnpR6n&RCnO^XCzGMe@G5C!us}wt*te~=^Q`d`Q zqvVJ1JQW1h(&9fb34*@rPA|)uTU_QnseMl-{KLv1V3GluUs3jjGI5bhJ|mXNGB-)x zfvF9~zdMYQ33lp~4~X2rWfn>1ET_&g?>B5!f`ENEgc^w~5LPMqr@F{%68TK-zb`kd zlvloJM~F;=Y;?diQuCdxtrh;o$%7T)P6^GFf_c)uJQ_mm@q*xVXY3^{U#fDBJl`tH zE7Fzco{o~tXc_%fP0axV@&kn5$@gmUup5RxUsfM-QT&2%r7<=4P4(hO>_2HPDd*G} z2N-rxa0A>VjV~*trE+7794mLB&(s!ADwsEgkBQ|OwR(HkMW@7Q-Bj=`spVJ?$(d5f zFDGCbrJVl36`tfUN-@7GS6&qUD30%>d!F!P$-g08kIK!*Qp$-G9TI@vrmbv5+kz|wc{lEttjm0;h8Sq7AQ~oF2o}<_@aW?AeNyr&G|tP z3{+NGvBNDjqrcnCgZF%Gy(!wQsO6HP|jkT;0wq2rB2ybwEJV?O8qc8uat2|hZ=0BegSi8{3;sSEE4&%xwm%K4YzAbu=lkaye{MZQj{Tf5}c#)-oI(}>r1i$tBxe~t7M^l*#JSqj-6!HpX z`CW1R)x~(a0UJ6zC-=To-AK(qy;XU=w?I$V%;_b3?mJi?V!)lNqHD zuJ<}N=iq%#sX0u=t5LJ+*6Xr{~BADnu+%Y7x+m}Mz17XIGJ{M`d4MoAQU zv9SZAgsO3BqmNX6&`n+Fb(?j+SK8Y+;d3>_J5s+wV?5WrSgp~7x3H|1{sE%gBGE@x+r>4ucSo0qgLwsA!&Ns+W&c?zyBgK5kOPZ^bW23p6H?1&0^BLev+{$j zHk9w=$8|o=zLv_D#NNp3z7Ss@X}`)HI4I{zeIjCiitg>w@vX>yWXax8p|4c}X9zEH zRi}6zizvl^Bmx^HxKK*6T{X{HaImkXvecQMQ=ej)r}Al~gNHmSzmF(VRip9soXji{ z`gi6*Fhh>hI+XwF%AQr_KB?Rx58qbh1rgF^ncOoIy?DnN&ZopAlZ=L6HbwhS0wX^%Fj#aQ~5hWG4;1qa5CfC z6!Bj1FBT8SG4L$ZaO&pl&xmon@HJr{4S3d5YWpdKLo&slAC)|bK!03np4Zs)KVd*< z;(SeJb!!`Vi#m~_Sj;;~?3K^7JP2K&s>V9g z#nCuJe$g|ioTtj)y8}PU(0t)oAwPaX=tCu#Wg7PBa_k3*{=@D3bl5(O-Mp{*0i93I z)bR^#sQkK^GCyIaJV^eZ?<}7y2;NY#tSIKoo%*z_?3Oq`7ow8Q2J{t*WUoSAB>ZoW z=Z_BSbOBBw6km=y=weVGdeg+3ya|m}j z@Us&a5!*)+DRJE=c!o#I>N1&mN_AgJoL>qe$#WcxV`OrT+Ma0;`iJ8AL>+XT3{6w* z5NWILVY9G+{vub~QE<3e`bPOyCu9E${RC%Wn}A*(PrwDz`@Jf8X+kZ}r{L?NjFe|j z%GX7r^JWAoz5@aM%$<$3_U!-gG)@%@4Gx*DFlyMdQvOD+`nx4Mj?A|4q}=Pyba%MJ zfqf+P&q_59nJ|FRd7TJ-zqIm`Tgv=s4O}REPMmaGI4^WHv@pn$iGo#9@VH#*t(M_g zh+3u)6l_*gZ)x+I-m?PM?pCtg)ryvfLq7D9h!;r=oKl0OechW}cW2mwckXP3gdz|CFl@UWVT z-VMhZ$ux8?7t2JJ7vEI|{ijxZS)o0`F12|lH}I6gs}jq6nZLuy{GgG4m9n^69%2Xj z^U}h$jM})vX$}Xa?kNDv}WqwZ&<6sFjb@}BA<7O9pR?W`28RfU6kccS1BkswHd>E|juJVghkWVsTWaCG9xsB`#M^py+q)z z0KvFV-tZ7WnS~t%95{l_oc$+h94L)#+yM^g;NvA6h*4NBcJe5ttxDq0$@1$mv{H=h z24Ebd35BzGL?@}OIBY?7uJ8l#^P~cW?FszbN}=!Sl;uiXq@irEfpRrj%EK9>#p40PU|fFDYp?+y5OhKI%q4Eaapg9RtM=H0oG?p=^-W{o-b~N9{K8;0v{#Ty4Hv{DVVlDRNLV zjg~AQmO?n$$JnPz&pjR%X9LI&mELN_!k4*F9&n9(C(DLUI?nSV?+sAlf64&o#LQCz zsSLIsIl7ugqTMELZsx1dsI;7mItk zY&3DByypjhP(XinW}ZC2q3RaTiOd`f%SidcgBWGjSi)N+(MpBHr()2b6!HRqGIJ7o zmMCn-EEKl8Q1ZN(>9AGQK3cMPkwRU6akulzi#&l9qOy~x?tRrgE&J&bmpWc=QhB0# z&RHLV10}=fHc(D;GS4-To-JQEB|^a>sTm`C6XXC#l<=>RnwYcv(^J72 z71SbE#iy9y5UF}e;)50FL50rQ3bnkAL9(~9Sm5joa|kuE`MrYXbqe&A^6qM{yw^h< zp>Fu5tnvN}${)R%_)?4_ZwNtbB3LQ=ET>S&ACwAF_?-xp>s^Q!^N=}Q2R~FoZgy9g z2*KOEI9k>|msfn)jo>z^I>)tcQt>m*);teEc}0{#Qp-C46rAi@e(!aUOVxB`;u-Pr zwv)=qqOjmo{#=%aD9!8=pzy8&S$4J{Z*f4JfzAOA<&lzoRLBD-6m~rz4?JEg4eXUD z|IPjQMtNN#m1-AWvO(q>SpG34DR*|hm!yzC<4Xmn2;e2ov5`-tI`t@Ta(P*UPDNK; znR#oo%bQ-6d0FNyCFPk-ueqa1QPEwocG(5-wk`AWvhz>yVqX3&@taz<`$K{5TIJ*) zbJw;_et!G>HtlXnzqv!abzZBs@%A_0T$gge&9}u1I^<`!Y+H~NFTSs&JUz~R%lr-< z^WyQ8l5QpCT}tjqD(zX;xk+Ma_tK&yhx?M^U5iS(r94pFqx&6YWvQLIm)?J8QF+k` z@pyjAwvl{1UZ?i1&7ZU5@w(i!Z`opb6|mGzF=%x&MYbv&MNl#t)CT|9maLxCia zZ`Hnac06LolJ3NNxGG{qQ-1r_EjzTVWtAVg7xU5Th`q@b9m|S)lwDC)+_~r7cVE$| zd)LyEE>7sw>8dNQC@Sk((yh}K9(HNb-Nl!46PA@Gmh~vUJB9ycMfVgZmX`Nu>d?%g zxkHP@@~)*#9hx~bcWB}KcNBH|dwT7)tmJ{>lm|-7N{c!br*lP>%BgvI9pkM!_k5t`E7K2)wQk!|Qa96T*{#}j zNNwG=Rs81s>_5ibVmz;Xeut(({iya!rqvnx(euP|&I^O%uBn zr5*FImz|bJo4Uu@u_L9tqs0y>^urF>ZSztKl(AwQkfGNQR+GXF?p&&0m5%ae>+@4U7 z-zuSXL5Gz5T<>CkO7&|_n_F^3=+N>O5pKG@L$(j6n_3oRyB9}>7J8G)%8PoGCtdE% zns#qdNqNEj-8wZ5vzpfF)TOwnM_y5v;_~w1G~IZjQdOdm9xpBG62GHI$=#jHV=AjA z7VlovHLl_jb?zvBmmzMU7cfaedIyV<}E$Ps`TX7o(acZ~XG6wSH zWmKcTs7sfW$k5#pp{%q=ROr;b3of{ZZq9`ZQTdL$kC5R_6S-?q+27OTn1`7fl}dY@ zphDN;@}fAbb#>RddzO`SikEgNy8m#wth{?^ox}8^o@K>p@v^(_ z6AL~U-5D>%1U^tIC&zae_wXd&8K=3*i<9F$in`r-O^Pl}uR^rAT;+NyxtH;trA%~a z)lJczWJ0CVp0t)qca?YyDl$E!#Jd)E?NoYys$ab-Ieup`{w5H8Viw9$v&#NnQrfZf z&Xg<~211fko2ELpE9zRDruuf}Wu59CZcmtTA)%zlKT^Fdeew;nn$)Fyle$fZqC2`2 zr$y~XKM1p$g;~uLvYOKUS|nsOYkJaQMQuHO1>R9l{5Mkf(tl;j^HkQ!B9(bPO1hK$ z`(w3hN2{DBM~h957MmR{Hm^fycjl4!yzV{9kKE*T?_QdebtfG($KbF54!?~8f86&!` zYw3{RCZ5}-U3SZS)#x^2@?uUK8E)6U4Wk@4>bOXBm)riBo18YfIXr{P6TiuC`6nsx zvKH1OHB3D!7cfn=%4t`JjA}xSGZUZS>22TcmUuxP6Icd!ZQ8L+cWj&8u0uTc-|lmK zAGIW60@%g!x`%H*?Uer=gt9Vs_IrrhF~@|7yPgW2tF z&CYF~mwiMLgd>WMmYX|cExm=x?y~kB9a`Sxlj^_SD+JYN-+Xg+s}63{*1Rm@2!5r z)a@#1j$>827AHkoq8zrP6LiQvv9{)D>m06a-Lb>%?uyHyHHzZ!O^$~jY3$H3zg?7$ zWA2rX=>F!o_Y<)AS_~KC*lCKC*rEKCA5=`=FxKV_|b9;mA%#4 zcVq?bsJ(34{KKO_L*VFbu8)YLx61C}TT*dsEfd7Q-sZR?F#B9^>oMirW6J83@YGHc zp5r5T%A0rP!`lS!U$wjL!(G+|oOHC8`rVOUbNEKR)Njb{;pvso6Mf}iaxN}!)w!r! zx8g2kb+Wp3FDNc=dFOxkEGs|3YqGoDQ{1I{X>r*J+_dRdR^Fp$*WzyFNm;&lCOStN zGLb-vOS34Ya@7)%nAM~Ey~*6=cfXhEyGQp<#bsr!I(I8e?-Us2pa7=_x3tGBz|&t5d1%52qudF literal 0 HcmV?d00001 diff --git a/cc65/threed.c b/cc65/threed.c new file mode 100644 index 00000000..69d22e4c --- /dev/null +++ b/cc65/threed.c @@ -0,0 +1,248 @@ +#include + +typedef unsigned char byte; +typedef signed char sbyte; +typedef unsigned short word; + +#define inline + +#define dvgram ((word*)0x1000) +#define _dvgstart (*((byte*)0x8840)) + +#define mathbox_sum (*((int*)0x8100)) +#define mathbox_arg1 (*((sbyte*)0x8102)) +#define mathbox_arg2 (*((sbyte*)0x8103)) +#define mathbox_go_mul (*((byte*)0x810f)) + +void start() { +/* +__asm + LD SP,#0x0 + DI +__endasm; +*/ +} + +int dvgwrofs; // write offset for DVG buffer + +inline word ___swapw(word j) { + return ((j << 8) | (j >> 8)); +} + +inline void dvgreset() { + dvgwrofs = 0; +} + +inline void dvgstart() { + _dvgstart = 0; +} + +void dvgwrite(word w) { + dvgram[dvgwrofs++] = w; +} + +inline void VCTR(int dx, int dy, byte bright) { + dvgwrite((dy & 0x1fff)); + dvgwrite(((bright & 7) << 13) | (dx & 0x1fff)); +} + +inline void SVEC(sbyte dx, sbyte dy, byte bright) { + dvgwrite(0x4000 | (dx & 0x1f) | ((bright&7)<<5) | ((dy & 0x1f)<<8)); +} + +inline void JSRL(word offset) { + dvgwrite(0xa000 | offset); +} + +inline void JMPL(word offset) { + dvgwrite(0xe000 | offset); +} + +inline void RTSL() { + dvgwrite(0xc000); +} + +inline void CNTR() { + dvgwrite(0x8000); +} + +inline void HALT() { + dvgwrite(0x2000); +} + +inline void STAT(byte rgb, byte intens) { + dvgwrite(0x6000 | ((intens & 0xf)<<4) | (rgb & 7)); +} + +inline void STAT_sparkle(byte intens) { + dvgwrite(0x6800 | ((intens & 0xf)<<4)); +} + +inline void SCAL(word scale) { + dvgwrite(0x7000 | scale); +} + +enum { + BLACK, BLUE, GREEN, CYAN, RED, MAGENTA, YELLOW, WHITE +} Color; + +/// + +typedef struct { + sbyte m[3][3]; +} Matrix; + +typedef struct { + sbyte x,y,z; +} Vector8; + +typedef struct { + int x,y,z; +} Vector16; + +typedef struct { + byte numverts; + const Vector8* verts; // array of vertices + const sbyte* edges; // array of vertex indices (edges) +} Wireframe; + +void mat_identity(Matrix* m) { + memset(m, 0, sizeof(*m)); + m->m[0][0] = 127; + m->m[1][1] = 127; + m->m[2][2] = 127; +} + +inline void mul16(sbyte a, sbyte b) { + mathbox_arg1 = a; + mathbox_arg2 = b; + mathbox_go_mul=0; +} + +void vec_mat_transform(Vector16* dest, const Vector8* v, const Matrix* m) { + byte i; + int* result = &dest->x; + const sbyte* mval = &m->m[0][0]; + for (i=0; i<3; i++) { + mathbox_sum = 0; + mul16(*mval++, v->x); + mul16(*mval++, v->y); + mul16(*mval++, v->z); + *result++ = mathbox_sum; + } +} + +/* +void vec_mat_transform2(Vector16* dest, const Vector8* v, const Matrix* m) { + dest->x = v->x*m->m[0][0] + v->y*m->m[0][1] + v->z*m->m[0][2]; + dest->y = v->x*m->m[1][0] + v->y*m->m[1][1] + v->z*m->m[1][2]; + dest->z = v->x*m->m[2][0] + v->y*m->m[2][1] + v->z*m->m[2][2]; +} +*/ + +const sbyte sintbl[64] = { +0, 3, 6, 9, 12, 16, 19, 22, 25, 28, 31, 34, 37, 40, 43, 46, +49, 51, 54, 57, 60, 63, 65, 68, 71, 73, 76, 78, 81, 83, 85, 88, +90, 92, 94, 96, 98, 100, 102, 104, 106, 107, 109, 111, 112, 113, 115, 116, +117, 118, 120, 121, 122, 122, 123, 124, 125, 125, 126, 126, 126, 127, 127, 127, +}; + +sbyte isin(byte x0) { + byte x = x0; + if (x0 & 0x40) x = 127-x; + if (x0 & 0x80) { + return -sintbl[x+128]; + } else { + return sintbl[x]; + } +} + +sbyte icos(byte x) { + return isin(x+64); +} + +void mat_rotate(Matrix* m, byte axis, byte angle) { + sbyte sin = isin(angle); + sbyte cos = icos(angle); + mat_identity(m); + switch (axis) { + case 0: + m->m[1][1] = cos; + m->m[2][1] = sin; + m->m[1][2] = -sin; + m->m[2][2] = cos; + break; + case 1: + m->m[2][2] = cos; + m->m[0][2] = sin; + m->m[2][0] = -sin; + m->m[0][0] = cos; + break; + case 2: + m->m[0][0] = cos; + m->m[1][0] = sin; + m->m[0][1] = -sin; + m->m[1][1] = cos; + break; + } +} + +const Vector8 tetra_v[] = { {0,-86,86},{86,86,86},{-86,86,86},{0,0,-86} }; +const signed char tetra_e[] = { 0, 1, 2, 0, 3, 1, -1, 3, 2, -2 }; +const Wireframe tetra = { 4, tetra_v, tetra_e }; + +void xform_vertices(Vector16* dest, const Vector8* src, const Matrix* m, byte nv) { + byte i; + for (i=0; iedges; + byte bright = 0; + int x1 = 0; + int y1 = 0; + Vector16 scrnverts[16]; + xform_vertices(scrnverts, wf->verts, m, wf->numverts); + do { + sbyte i = *e++; + if (i == -1) + bright = 0; + else if (i == -2) + break; + else { + int x2 = scrnverts[i].x>>8; + int y2 = scrnverts[i].y>>8; + VCTR(x2-x1, y2-y1, bright); + x1 = x2; + y1 = y2; + } + bright = 2; + } while (1); +} + +/// + +word frame; + +void main() { + int x,y; + Matrix m; + mat_identity(&m); + while (1) { + dvgreset(); + CNTR(); + SCAL(0x1f); + STAT(RED, 5); + x = isin(frame/8); + y = icos(frame/8); + VCTR(x, y, 2); + STAT(GREEN, 15); + mat_rotate(&m, (frame>>8)&3, frame); + draw_wireframe_ortho(&tetra, &m); + HALT(); + dvgstart(); + frame++; + } +} diff --git a/presets/nes/conio.c b/presets/nes-conio/conio.c similarity index 100% rename from presets/nes/conio.c rename to presets/nes-conio/conio.c diff --git a/presets/nes-conio/ex1.asm b/presets/nes-conio/ex1.asm new file mode 100644 index 00000000..317b72ba --- /dev/null +++ b/presets/nes-conio/ex1.asm @@ -0,0 +1,152 @@ + +;;;;; CONSTANTS + +PPU_CTRL equ $2000 +PPU_MASK equ $2001 +PPU_STATUS equ $2002 +PPU_OAM_ADDR equ $2003 +PPU_OAM_DATA equ $2004 +PPU_SCROLL equ $2005 +PPU_ADDR equ $2006 +PPU_DATA equ $2007 +PPU_OAM_DMA equ $4014 +PPU_FRAMECNT equ $4017 +DMC_FREQ equ $4010 +CTRL_PORT1 equ $4016 +CTRL_PORT2 equ $4017 + +;;;;; ZERO-PAGE VARIABLES + + seg.u ZPVars + org $0 + +ScrollPos byte ; used during NMI + +;;;;; CARTRIDGE FILE HEADER + + processor 6502 + seg Header + org $7FF0 + +NES_MAPPER equ 0 ;mapper number +NES_PRG_BANKS equ 2 ;number of 16K PRG banks, change to 2 for NROM256 +NES_CHR_BANKS equ 1 ;number of 8K CHR banks (0 = RAM) +NES_MIRRORING equ 1 ;0 horizontal, 1 vertical, 8 four screen + + .byte $4e,$45,$53,$1a ; header + .byte NES_PRG_BANKS + .byte NES_CHR_BANKS + .byte NES_MIRRORING|(NES_MAPPER<<4) + .byte NES_MAPPER&$f0 + +;;;;; CODE + + seg Code + org $8000 +start: +_exit: + sei + ldx #$ff + txs + inx ;X=0 + stx PPU_MASK ;disable rendering + stx DMC_FREQ ;disable DMC (samples) + stx PPU_CTRL ;disable NMI (interrupts) + jsr WaitSync ;wait for VSYNC + jsr SetPalette ;set colors + jsr ClearVRAM ;clear VRAM + lda #0 + sta PPU_ADDR + sta PPU_ADDR ;PPU addr = 0 + sta PPU_SCROLL + sta PPU_SCROLL ;scroll = 0 + lda #$90 + sta PPU_CTRL ;enable NMI + lda #$1e + sta PPU_MASK ;enable rendering +.endless + jmp .endless ;endless loop + +;;;;; SUBROUTINES + +; set palette colors +SetPalette: subroutine + ldy #$0 + lda #$3f + sta PPU_ADDR + sty PPU_ADDR + ldx #4 +.loop: + lda Palette,y + sta PPU_DATA + iny + dex + bne .loop + rts + +; clear video RAM +ClearVRAM: subroutine + txa + ldy #$20 + sty PPU_ADDR + sta PPU_ADDR + ldy #$10 +.loop: + sta PPU_DATA + adc #1 + inx + bne .loop + dey + bne .loop + rts + +; wait for VSYNC to start +WaitSync: subroutine + bit PPU_STATUS +.1: + bit PPU_STATUS + bpl .1 + rts + +;;;;; INTERRUPT HANDLERS + +nmi: +irq: +; save registers + pha ; save A +; update scroll position + inc ScrollPos + lda ScrollPos + sta PPU_SCROLL + sta PPU_SCROLL +; reload registers + pla ; reload A + rti + +;;;;; CONSTANT DATA + +Palette: + hex 1f001020 ; black, gray, lt gray, white +TextString: + byte "HELLO WORLD!" + byte 0 + +;;;;; CPU VECTORS + + org $fffa + .word nmi ;$fffa vblank nmi + .word start ;$fffc reset + .word irq ;$fffe irq / brk + +;;;;; TILE SETS + + REPEAT 64 + hex 003c6666766e663c007e181818381818 + hex 007e60300c06663c003c66061c06663c + hex 0006067f661e0e06003c6606067c607e + hex 003c66667c60663c00181818180c667e + hex 003c66663c66663c003c66063e66663c + hex 01010101010101010000000000000000 + hex ff000000000000000000000000000000 + hex 01020408102040800000000000000000 + REPEND diff --git a/presets/nes/hello.c b/presets/nes-conio/hello.c similarity index 100% rename from presets/nes/hello.c rename to presets/nes-conio/hello.c diff --git a/presets/nes/siegegame.c b/presets/nes-conio/siegegame.c similarity index 100% rename from presets/nes/siegegame.c rename to presets/nes-conio/siegegame.c diff --git a/presets/nes-lib/crypto.c b/presets/nes-lib/crypto.c new file mode 100644 index 00000000..d0fd8030 --- /dev/null +++ b/presets/nes-lib/crypto.c @@ -0,0 +1,3071 @@ +#include "neslib.h" + +//#define DEBUG +#define HAS_DEBUGGER + +#define PLAYER_1 0 +#define PLAYER_2 1 + +static const unsigned char palette[]={ +0xD, 0x00, 0x3D, 0x3c, +0xD, 0x09, 0x1B, 0x3c, +0x07, 0x28, 0xF, 0x379, +0x07, 0x21, 0x1C, 0x0F, + +0x00, 0x11, 0x16, 0x0D, +0x00, 0x27, 0x16, 0x0D, +0x00, 0x17, 0x15, 0x29, +0x00, 0x27, 0x16, 0x0D, +}; + +static const unsigned char paused_palette[]={ +0x0F, 0x0F, 0x0F, 0x0F, +0x0F, 0x0F, 0x0F, 0x0F, +0x0F, 0x0F, 0x0F, 0x0F, +0x0F, 0x0F, 0x0F, 0x0F, + +0x00, 0x11, 0x16, 0x0D, +0x00, 0x27, 0x16, 0x0D, +0x0F, 0x0F, 0x0F, 0x0F, +0x0F, 0x0F, 0x0F, 0x0F, +}; + +#pragma bss-name(push,"ZEROPAGE") +#pragma data-name(push,"ZEROPAGE") + +static unsigned char i, j; + +static unsigned char player_dir[2]; + +static unsigned char player_attack_tick[2]; + +static unsigned char player_x[2]; +static unsigned char player_y[2]; + +static unsigned char enemies_x[8]; +static unsigned char enemies_y[8]; + + +static unsigned char enemies_enemy[8]; + + +#pragma bss-name(push,"BSS") +#pragma data-name(push,"BSS") + +static unsigned char spr; +static unsigned char frame; +static unsigned char dx; +static unsigned char dy; + +static unsigned char enemy_spawn_points_x[8]; +static unsigned char enemy_spawn_points_y[8]; + +static unsigned char scr_x; +static unsigned char scr_y; + +static char to_scroll_x; +static char to_scroll_y; + +static unsigned char player_hp[2]; + +static unsigned char to_scroll_x_neg; +static unsigned char to_scroll_y_neg; + +static unsigned char enemies_health[8]; + +static unsigned char enemies_dir[8]; +static unsigned char enemy_leg[8]; +static unsigned char enemy_push_timer[8]; +static unsigned char enemy_push_dir[8]; + +static unsigned char enemies_type[8]; + +static unsigned char player_carry[2]; +static unsigned char player_carry_dir[2]; + +static unsigned char player_god_mode[2]; + +static unsigned char item_type[4]; +static unsigned char item_x[4]; +static unsigned char item_y[4]; +static unsigned char item_placed[4]; + + +static unsigned char difficulty; + +static unsigned char enemy_speed; + +static unsigned char next_level; + +static unsigned char enemy_damage_modifier; + +static unsigned char spawn_hp; + + +#ifdef HAS_DEBUGGER + + +#define debug_info_val (*(unsigned char*)0xFA) +#define break_points_enable_val (*(unsigned char*)0xFB) +#define break_point_val (*(unsigned char*)0xFF) + + +#define TIMER_ENABLE(x) break_points_enable_val |=(1<122 && x<134 && y > 114 && y < 125)) + { + return 1; + } + if(x<128){ + if(y<120){ + return collision_top_left[(x>>3)+((y>>3)<<4)]; + }else{ + y-=120; + return collision_bottom_left[(x>>3)+((y>>3)<<4)]; + } + }else{ + x -= 128; + if(y<120){ + return collision_top_right[(x>>3)+((y>>3)<<4)]; + }else{ + y-=120; + return collision_bottom_right[(x>>3)+((y>>3)<<4)]; + } + } +} + +void __fastcall__ took_damage(void) +{ + #define DAMAGE_POSITION_X temp0 + #define DAMAGE_POSITION_Y temp1 + + #define DAMAGE_W temp6 + #define DAMAGE_H temp7 + + #define ENEMY_POSITION_X temp2 + #define ENEMY_POSITION_Y temp3 + #define DAMAGE_DIFF_X temp4 + #define DAMAGE_DIFF_Y temp5 + + #define k temp5 + + for(j=0; j<8; ++j) + { + if(enemies_health[j] == 0) + { + continue; + } + + ENEMY_POSITION_X = enemies_x[j]; + ENEMY_POSITION_Y = enemies_y[j]; + + if(DAMAGE_POSITION_X > ENEMY_POSITION_X) + { + DAMAGE_DIFF_X = DAMAGE_POSITION_X - ENEMY_POSITION_X; + } + else + { + DAMAGE_DIFF_X = ENEMY_POSITION_X - DAMAGE_POSITION_X; + } + + if(DAMAGE_POSITION_Y > ENEMY_POSITION_Y) + { + DAMAGE_DIFF_Y = DAMAGE_POSITION_Y - ENEMY_POSITION_Y; + } + else + { + DAMAGE_DIFF_Y = ENEMY_POSITION_Y - DAMAGE_POSITION_Y; + } + + if((DAMAGE_DIFF_X < DAMAGE_W) && (DAMAGE_DIFF_Y < DAMAGE_H)) + { + enemies_health[j]--; + if(enemies_health[j]) + { + enemy_push_timer[j] = 4; + enemy_push_dir[j] = player_dir[i]; + } + else + { + // Killed enemy SFX + sfx_play(1, 0); + } + break; + } + } +} + +void __fastcall__ tick_enemies(void) +{ + #define SELECTED_AXIS temp0 + #define SELECTED_PLAYER temp1 + #define SELECTED_ENEMY temp2 + #define SELECTED_DIRECTION temp3 + #define SELECTED_SPAWN_POINT temp4 + #define COLLISION_RESULT temp5 + #define DIRECTION_RANDOMNESS temp6 + #define DIFF_X stemp0 + #define DIFF_Y stemp1 + + SELECTED_SPAWN_POINT = rand8() & 7; + + for(i=0; i<8; ++i) + { + if(enemies_health[i] == 0 && (frame&7) == i) + { + enemies_x[i] = enemy_spawn_points_x[SELECTED_SPAWN_POINT]; + enemies_y[i] = enemy_spawn_points_y[SELECTED_SPAWN_POINT]; + enemy_push_timer[i] = 0; + enemies_health[i] = spawn_hp; + enemies_type[i] = (i&1); + return; + } + } + + SELECTED_ENEMY = frame & 7; + enemy_leg[SELECTED_ENEMY] = 1-enemy_leg[SELECTED_ENEMY]; + SELECTED_PLAYER = enemies_enemy[SELECTED_ENEMY]; + + // Decide on the direction + DIRECTION_RANDOMNESS = rand8() & 3; + if(DIRECTION_RANDOMNESS == 0) + { + DIRECTION_RANDOMNESS = rand8() & 3; + switch(DIRECTION_RANDOMNESS) + { + case 0: + SELECTED_DIRECTION = PAD_LEFT; + break; + case 1: + SELECTED_DIRECTION = PAD_RIGHT; + break; + case 2: + SELECTED_DIRECTION = PAD_UP; + break; + case 3: + SELECTED_DIRECTION = PAD_DOWN; + break; + default: + SELECTED_DIRECTION = PAD_LEFT; + } + + } + else if(DIRECTION_RANDOMNESS == 1) + { + SELECTED_DIRECTION = enemies_dir[SELECTED_ENEMY]; + } + else + { + SELECTED_AXIS = rand8() & 1; + if(SELECTED_AXIS) + { + if(enemies_x[SELECTED_ENEMY] > player_x[SELECTED_PLAYER]) + { + SELECTED_DIRECTION = PAD_LEFT; + } + else + { + SELECTED_DIRECTION = PAD_RIGHT; + } + } + else + { + if(enemies_y[SELECTED_ENEMY] > player_y[SELECTED_PLAYER]) + { + SELECTED_DIRECTION = PAD_UP; + } + else + { + SELECTED_DIRECTION = PAD_DOWN; + } + } + } + + enemies_dir[SELECTED_ENEMY] = SELECTED_DIRECTION; + temp6 = enemies_x[SELECTED_ENEMY]; + temp7 = enemies_y[SELECTED_ENEMY]; + + if(enemy_push_timer[SELECTED_ENEMY]) + { + } + else if(SELECTED_DIRECTION == PAD_RIGHT) + { + enemies_x[SELECTED_ENEMY] += enemy_speed; + } + else if(SELECTED_DIRECTION == PAD_LEFT) + { + enemies_x[SELECTED_ENEMY] -= enemy_speed; + } + else if(SELECTED_DIRECTION == PAD_UP) + { + enemies_y[SELECTED_ENEMY] -= enemy_speed; + } + else if(SELECTED_DIRECTION == PAD_DOWN) + { + enemies_y[SELECTED_ENEMY] += enemy_speed; + } + + // Check collisions with level + COLLISION_RESULT = isBlocked(enemies_x[SELECTED_ENEMY], enemies_y[SELECTED_ENEMY]); + + if(COLLISION_RESULT) + { + enemies_x[SELECTED_ENEMY] = temp6; + enemies_y[SELECTED_ENEMY] = temp7; + } + else + { + // Check collisions with other enemies + for(i=0; i<8; ++i) + { + if(SELECTED_ENEMY == i) + continue; + + if(enemies_x[i] - 6 < enemies_x[SELECTED_ENEMY] && enemies_x[i] + 6 > enemies_x[SELECTED_ENEMY]) + { + if(enemies_y[i] - 6 < enemies_y[SELECTED_ENEMY] && enemies_y[i] + 6 > enemies_y[SELECTED_ENEMY]) + { + enemies_x[SELECTED_ENEMY] = temp6; + enemies_y[SELECTED_ENEMY] = temp7; + } + } + } + } + + + // Draw + for(i=0; i<8; ++i) + { + if(enemy_push_timer[i] && (frame&3)) + { + if(frame&1) + { + enemy_push_timer[i]--; + temp6 = enemies_x[i]; + temp7 = enemies_y[i]; + switch(enemy_push_dir[i]) + { + case PAD_LEFT: + enemies_x[i]-=2; + break; + case PAD_RIGHT: + enemies_x[i]+=2; + break; + case PAD_UP: + enemies_y[i]-=2; + break; + case PAD_DOWN: + enemies_y[i]+=2; + break; + } + if(isBlocked(enemies_x[i], enemies_y[i])) + { + enemies_x[i] = temp6; + enemies_y[i] = temp7; + } + } + + } + + + COLLISION_RESULT = 0; + for(j=0; j<2; j++){ + if((frame&enemy_damage_modifier) == 0) + { + if(enemies_x[i] - 5 < player_x[j] && enemies_x[i] + 5 > player_x[j]) + { + if(enemies_y[i] - 5 < player_y[j] && enemies_y[i] + 5 > player_y[j]) + { + if(player_hp[j] && player_god_mode[j] == 0) + { + COLLISION_RESULT = 1; + player_hp[j]--; + player_god_mode[j] = 4; + + // Took Damage SFX + sfx_play(0, 1); + } + if(player_hp[j] == 0 && enemies_enemy[i] == j){ + enemies_enemy[i] = 1-enemies_enemy[i]; + } + } + } + } + } + + int_temp0 = enemies_x[i]; + int_temp0 <<= 1; + int_temp0 -= scr_x; + + if(int_temp0 > 255) + continue; + + temp0 = int_temp0; + + int_temp0 = enemies_y[i]; + int_temp0 <<= 1; + int_temp0 -= scr_y; + + if(int_temp0 > 255) + continue; + + temp1 = int_temp0; + if(enemy_push_timer[i]&1) + { + if(COLLISION_RESULT) + { + if(enemies_type[i] == 0) + { + switch(enemies_dir[i]) + { + default: + case PAD_UP: + spr = oam_meta_spr(temp0, temp1-2, spr, spider_damaged_attack_up); + break; + case PAD_DOWN: + spr = oam_meta_spr(temp0, temp1+2, spr, spider_damaged_attack_down); + break; + case PAD_LEFT: + spr = oam_meta_spr(temp0-2, temp1, spr, spider_damaged_attack_left); + break; + case PAD_RIGHT: + spr = oam_meta_spr(temp0+2, temp1, spr, spider_damaged_attack_right); + break; + } + } + else + { + switch(enemies_dir[i]) + { + default: + case PAD_UP: + spr = oam_meta_spr(temp0, temp1-2, spr, bat_damaged_attack_up); + break; + case PAD_DOWN: + spr = oam_meta_spr(temp0, temp1+2, spr, bat_damaged_attack_down); + break; + case PAD_LEFT: + spr = oam_meta_spr(temp0-2, temp1, spr, bat_damaged_attack_left); + break; + case PAD_RIGHT: + spr = oam_meta_spr(temp0+2, temp1, spr, bat_damaged_attack_right); + break; + } + } + } + else + { + if(enemy_leg[i]) + { + if(enemies_type[i] == 0) + { + switch(enemies_dir[i]) + { + default: + case PAD_UP: + spr = oam_meta_spr(temp0, temp1, spr, spider_damaged_leg_0_up); + break; + case PAD_DOWN: + spr = oam_meta_spr(temp0, temp1, spr, spider_damaged_leg_0_down); + break; + case PAD_LEFT: + spr = oam_meta_spr(temp0, temp1, spr, spider_damaged_leg_0_left); + break; + case PAD_RIGHT: + spr = oam_meta_spr(temp0, temp1, spr, spider_damaged_leg_0_right); + break; + } + } + else + { + switch(enemies_dir[i]) + { + default: + case PAD_UP: + spr = oam_meta_spr(temp0, temp1, spr, bat_damaged_leg_0_up); + break; + case PAD_DOWN: + spr = oam_meta_spr(temp0, temp1, spr, bat_damaged_leg_0_down); + break; + case PAD_LEFT: + spr = oam_meta_spr(temp0, temp1, spr, bat_damaged_leg_0_left); + break; + case PAD_RIGHT: + spr = oam_meta_spr(temp0, temp1, spr, bat_damaged_leg_0_right); + break; + } + } + } + else + { + if(enemies_type[i] == 0) + { + switch(enemies_dir[i]) + { + default: + case PAD_UP: + spr = oam_meta_spr(temp0, temp1, spr, spider_damaged_leg_1_up); + break; + case PAD_DOWN: + spr = oam_meta_spr(temp0, temp1, spr, spider_damaged_leg_1_down); + break; + case PAD_LEFT: + spr = oam_meta_spr(temp0, temp1, spr, spider_damaged_leg_1_left); + break; + case PAD_RIGHT: + spr = oam_meta_spr(temp0, temp1, spr, spider_damaged_leg_1_right); + break; + } + } + else + { + switch(enemies_dir[i]) + { + default: + case PAD_UP: + spr = oam_meta_spr(temp0, temp1, spr, bat_damaged_leg_1_up); + break; + case PAD_DOWN: + spr = oam_meta_spr(temp0, temp1, spr, bat_damaged_leg_1_down); + break; + case PAD_LEFT: + spr = oam_meta_spr(temp0, temp1, spr, bat_damaged_leg_1_left); + break; + case PAD_RIGHT: + spr = oam_meta_spr(temp0, temp1, spr, bat_damaged_leg_1_right); + break; + } + } + } + } + } + else + { + if(COLLISION_RESULT) + { + if(enemies_type[i] == 0) + { + switch(enemies_dir[i]) + { + default: + case PAD_UP: + spr = oam_meta_spr(temp0, temp1-2, spr, spider_attack_up); + break; + case PAD_DOWN: + spr = oam_meta_spr(temp0, temp1+2, spr, spider_attack_down); + break; + case PAD_LEFT: + spr = oam_meta_spr(temp0-2, temp1, spr, spider_attack_left); + break; + case PAD_RIGHT: + spr = oam_meta_spr(temp0+2, temp1, spr, spider_attack_right); + break; + } + } + else + { + switch(enemies_dir[i]) + { + default: + case PAD_UP: + spr = oam_meta_spr(temp0, temp1-2, spr, bat_attack_up); + break; + case PAD_DOWN: + spr = oam_meta_spr(temp0, temp1+2, spr, bat_attack_down); + break; + case PAD_LEFT: + spr = oam_meta_spr(temp0-2, temp1, spr, bat_attack_left); + break; + case PAD_RIGHT: + spr = oam_meta_spr(temp0+2, temp1, spr, bat_attack_right); + break; + } + } + } + else + { + if(enemy_leg[i]) + { + if(enemies_type[i] == 0) + { + switch(enemies_dir[i]) + { + default: + case PAD_UP: + spr = oam_meta_spr(temp0, temp1, spr, spider_leg_0_up); + break; + case PAD_DOWN: + spr = oam_meta_spr(temp0, temp1, spr, spider_leg_0_down); + break; + case PAD_LEFT: + spr = oam_meta_spr(temp0, temp1, spr, spider_leg_0_left); + break; + case PAD_RIGHT: + spr = oam_meta_spr(temp0, temp1, spr, spider_leg_0_right); + break; + } + } + else + { + switch(enemies_dir[i]) + { + default: + case PAD_UP: + spr = oam_meta_spr(temp0, temp1, spr, bat_leg_0_up); + break; + case PAD_DOWN: + spr = oam_meta_spr(temp0, temp1, spr, bat_leg_0_down); + break; + case PAD_LEFT: + spr = oam_meta_spr(temp0, temp1, spr, bat_leg_0_left); + break; + case PAD_RIGHT: + spr = oam_meta_spr(temp0, temp1, spr, bat_leg_0_right); + break; + } + } + } + else + { + if(enemies_type[i] == 0) + { + switch(enemies_dir[i]) + { + default: + case PAD_UP: + spr = oam_meta_spr(temp0, temp1, spr, spider_leg_1_up); + break; + case PAD_DOWN: + spr = oam_meta_spr(temp0, temp1, spr, spider_leg_1_down); + break; + case PAD_LEFT: + spr = oam_meta_spr(temp0, temp1, spr, spider_leg_1_left); + break; + case PAD_RIGHT: + spr = oam_meta_spr(temp0, temp1, spr, spider_leg_1_right); + break; + } + } + else + { + switch(enemies_dir[i]) + { + default: + case PAD_UP: + spr = oam_meta_spr(temp0, temp1, spr, bat_leg_1_up); + break; + case PAD_DOWN: + spr = oam_meta_spr(temp0, temp1, spr, bat_leg_1_down); + break; + case PAD_LEFT: + spr = oam_meta_spr(temp0, temp1, spr, bat_leg_1_left); + break; + case PAD_RIGHT: + spr = oam_meta_spr(temp0, temp1, spr, bat_leg_1_right); + break; + } + } + } + } + } + } +} + +//#include "player_sprites.h" + +static const char player_carry_0_meta_spr_stand_up[] = { + -8, -8, 0x3C, 0, + 0, -8, 0x3E, 0, + 128 +}; +static const char player_carry_0_meta_spr_stand_down[] = { + -8, -8, 0x3C, 0|OAM_FLIP_V, + 0, -8, 0x3E, 0|OAM_FLIP_V, + 128 +}; + +static const char player_carry_0_meta_spr_stand_left[] = { + -8, -8, 0x5C, 0|OAM_FLIP_H, + 0, -8, 0x5A, 0|OAM_FLIP_H, + 128 +}; + +static const char player_carry_0_meta_spr_stand_right[] = { + -8, -8, 0x5A, 0, + 0, -8, 0x5C, 0, + 128 +}; + + +static const char player_carry_0_meta_spr_left_foot_up[] = { + -8, -8, 0x38, 0, + 0, -8, 0x3A, 0, + 128 +}; + +static const char player_carry_0_meta_spr_right_foot_up[] = { + -8, -8, 0x3A, 0|OAM_FLIP_H, + 0, -8, 0x38, 0|OAM_FLIP_H, + 128 +}; + +static const char player_carry_0_meta_spr_left_foot_down[] = { + -8, -8, 0x38, 0|OAM_FLIP_V, + 0, -8, 0x3A, 0|OAM_FLIP_V, + 128 +}; + +static const char player_carry_0_meta_spr_right_foot_down[] = { + -8, -8, 0x3A, 0|OAM_FLIP_H|OAM_FLIP_V, + 0, -8, 0x38, 0|OAM_FLIP_H|OAM_FLIP_V, + 128 +}; + + +static const char player_carry_0_meta_spr_left_foot_right[] = { + -8, -8, 0x40, 0, + 0, -8, 0x58, 0, + 128 +}; + +static const char player_carry_0_meta_spr_right_foot_right[] = { + -8, -8, 0x40, 0|OAM_FLIP_V, + 0, -8, 0x58, 0|OAM_FLIP_V, + 128 +}; + + +static const char player_carry_0_meta_spr_left_foot_left[] = { + -8, -8, 0x58, 0|OAM_FLIP_H, + 0, -8, 0x40, 0|OAM_FLIP_H, + 128 +}; + +static const char player_carry_0_meta_spr_right_foot_left[] = { + -8, -8, 0x58, 0|OAM_FLIP_H|OAM_FLIP_V, + 0, -8, 0x40, 0|OAM_FLIP_H|OAM_FLIP_V, + 128 +}; + + +static const char player_carry_1_meta_spr_stand_up[] = { + -8, -8, 0x3C, 1, + 0, -8, 0x3E, 1, + 128 +}; +static const char player_carry_1_meta_spr_stand_down[] = { + -8, -8, 0x3C, 1|OAM_FLIP_V, + 0, -8, 0x3E, 1|OAM_FLIP_V, + 128 +}; + +static const char player_carry_1_meta_spr_stand_left[] = { + -8, -8, 0x5C, 1|OAM_FLIP_H, + 0, -8, 0x5A, 1|OAM_FLIP_H, + 128 +}; + +static const char player_carry_1_meta_spr_stand_right[] = { + -8, -8, 0x5A, 1, + 0, -8, 0x5C, 1, + 128 +}; + + +static const char player_carry_1_meta_spr_left_foot_up[] = { + -8, -8, 0x38, 1, + 0, -8, 0x3A, 1, + 128 +}; + +static const char player_carry_1_meta_spr_right_foot_up[] = { + -8, -8, 0x3A, 1|OAM_FLIP_H, + 0, -8, 0x38, 1|OAM_FLIP_H, + 128 +}; + +static const char player_carry_1_meta_spr_left_foot_down[] = { + -8, -8, 0x38, 1|OAM_FLIP_V, + 0, -8, 0x3A, 1|OAM_FLIP_V, + 128 +}; + +static const char player_carry_1_meta_spr_right_foot_down[] = { + -8, -8, 0x3A, 1|OAM_FLIP_H|OAM_FLIP_V, + 0, -8, 0x38, 1|OAM_FLIP_H|OAM_FLIP_V, + 128 +}; + + +static const char player_carry_1_meta_spr_left_foot_right[] = { + -8, -8, 0x56, 1, + 0, -8, 0x58, 1, + 128 +}; + +static const char player_carry_1_meta_spr_right_foot_right[] = { + -8, -8, 0x56, 1|OAM_FLIP_V, + 0, -8, 0x58, 1|OAM_FLIP_V, + 128 +}; + + +static const char player_carry_1_meta_spr_left_foot_left[] = { + -8, -8, 0x58, 1|OAM_FLIP_H, + 0, -8, 0x56, 1|OAM_FLIP_H, + 128 +}; + +static const char player_carry_1_meta_spr_right_foot_left[] = { + -8, -8, 0x58, 1|OAM_FLIP_H|OAM_FLIP_V, + 0, -8, 0x56, 1|OAM_FLIP_H|OAM_FLIP_V, + 128 +}; + +static const char player_0_meta_spr_stand_up[] = { + -8, -8, 0x24, 0, + 0, -8, 0x26, 0, + 128 +}; +static const char player_0_meta_spr_stand_down[] = { + -8, -8, 0x24, 0|OAM_FLIP_V, + 0, -8, 0x26, 0|OAM_FLIP_V, + 128 +}; + +static const char player_0_meta_spr_stand_left[] = { + -8, -8, 0x46, 0|OAM_FLIP_H, + 0, -8, 0x44, 0|OAM_FLIP_H, + 128 +}; + +static const char player_0_meta_spr_stand_right[] = { + -8, -8, 0x44, 0, + 0, -8, 0x46, 0, + 128 +}; + + +static const char player_0_meta_spr_left_foot_up[] = { + -8, -8, 0x20, 0, + 0, -8, 0x22, 0, + 128 +}; + +static const char player_0_meta_spr_right_foot_up[] = { + -8, -8, 0x22, 0|OAM_FLIP_H, + 0, -8, 0x20, 0|OAM_FLIP_H, + 128 +}; + +static const char player_0_meta_spr_left_foot_down[] = { + -8, -8, 0x20, 0|OAM_FLIP_V, + 0, -8, 0x22, 0|OAM_FLIP_V, + 128 +}; + +static const char player_0_meta_spr_right_foot_down[] = { + -8, -8, 0x22, 0|OAM_FLIP_H|OAM_FLIP_V, + 0, -8, 0x20, 0|OAM_FLIP_H|OAM_FLIP_V, + 128 +}; + + +static const char player_0_meta_spr_left_foot_right[] = { + -8, -8, 0x40, 0, + 0, -8, 0x42, 0, + 128 +}; + +static const char player_0_meta_spr_right_foot_right[] = { + -8, -8, 0x40, 0|OAM_FLIP_V, + 0, -8, 0x42, 0|OAM_FLIP_V, + 128 +}; + + +static const char player_0_meta_spr_left_foot_left[] = { + -8, -8, 0x42, 0|OAM_FLIP_H, + 0, -8, 0x40, 0|OAM_FLIP_H, + 128 +}; + +static const char player_0_meta_spr_right_foot_left[] = { + -8, -8, 0x42, 0|OAM_FLIP_H|OAM_FLIP_V, + 0, -8, 0x40, 0|OAM_FLIP_H|OAM_FLIP_V, + 128 +}; + + +static const char player_0_meta_spr_attack_0_up[] = { + -8, 0, 0x48, 0, + 0, 0, 0x4A, 0, + -8, -16, 0x28, 0, + 0, -16, 0x2A, 0, + 128 +}; + +static const char player_0_meta_spr_attack_1_up[] = { + -8, 0, 0x4C, 0, + 0, 0, 0x4E, 0, + -8, -16, 0x2C, 0, + 0, -16, 0x2E, 0, + 128 +}; + + +static const char player_0_meta_spr_attack_0_down[] = { + -8, 0, 0x28, 0|OAM_FLIP_V, + 0, 0, 0x2A, 0|OAM_FLIP_V, + -8, -16, 0x48, 0|OAM_FLIP_V, + 0, -16, 0x4A, 0|OAM_FLIP_V, + 128 +}; + +static const char player_0_meta_spr_attack_1_down[] = { + -8, 0, 0x2C, 0|OAM_FLIP_V, + 0, 0, 0x2E, 0|OAM_FLIP_V, + -8, -16, 0x4C, 0|OAM_FLIP_V, + 0, -16, 0x4E, 0|OAM_FLIP_V, + 128 +}; + +static const char player_0_meta_spr_attack_0_right[] = { + -8,-8, 0x30, 0, + 0, -8, 0x32, 0, + 8, -8, 0x34, 0, + 128 +}; + +static const char player_0_meta_spr_attack_1_right[] = { + -8,-8, 0x50, 0, + 0, -8, 0x52, 0, + 8, -8, 0x54, 0, + 128 +}; + +static const char player_0_meta_spr_attack_0_left[] = { + -16, -8, 0x34, 0|OAM_FLIP_H, + -8, -8, 0x32, 0|OAM_FLIP_H, + 0, -8, 0x30, 0|OAM_FLIP_H, + 128 +}; + +static const char player_0_meta_spr_attack_1_left[] = { + -16, -8, 0x54, 0|OAM_FLIP_H, + -8, -8, 0x52, 0|OAM_FLIP_H, + 0, -8, 0x50, 0|OAM_FLIP_H, + 128 +}; + + +static const char player_1_meta_spr_stand_up[] = { + -8, -8, 0x24, 1, + 0, -8, 0x26, 1, + 128 +}; +static const char player_1_meta_spr_stand_down[] = { + -8, -8, 0x24, 1|OAM_FLIP_V, + 0, -8, 0x26, 1|OAM_FLIP_V, + 128 +}; + +static const char player_1_meta_spr_stand_left[] = { + -8, -8, 0x46, 1|OAM_FLIP_H, + 0, -8, 0x44, 1|OAM_FLIP_H, + 128 +}; + +static const char player_1_meta_spr_stand_right[] = { + -8, -8, 0x44, 1, + 0, -8, 0x46, 1, + 128 +}; + + +static const char player_1_meta_spr_left_foot_up[] = { + -8, -8, 0x20, 1, + 0, -8, 0x22, 1, + 128 +}; + +static const char player_1_meta_spr_right_foot_up[] = { + -8, -8, 0x22, 1|OAM_FLIP_H, + 0, -8, 0x20, 1|OAM_FLIP_H, + 128 +}; + +static const char player_1_meta_spr_left_foot_down[] = { + -8, -8, 0x20, 1|OAM_FLIP_V, + 0, -8, 0x22, 1|OAM_FLIP_V, + 128 +}; + +static const char player_1_meta_spr_right_foot_down[] = { + -8, -8, 0x22, 1|OAM_FLIP_H|OAM_FLIP_V, + 0, -8, 0x20, 1|OAM_FLIP_H|OAM_FLIP_V, + 128 +}; + + +static const char player_1_meta_spr_left_foot_right[] = { + -8, -8, 0x40, 1, + 0, -8, 0x42, 1, + 128 +}; + +static const char player_1_meta_spr_right_foot_right[] = { + -8, -8, 0x40, 1|OAM_FLIP_V, + 0, -8, 0x42, 1|OAM_FLIP_V, + 128 +}; + + +static const char player_1_meta_spr_left_foot_left[] = { + -8, -8, 0x42, 1|OAM_FLIP_H, + 0, -8, 0x40, 1|OAM_FLIP_H, + 128 +}; + +static const char player_1_meta_spr_right_foot_left[] = { + -8, -8, 0x42, 1|OAM_FLIP_H|OAM_FLIP_V, + 0, -8, 0x40, 1|OAM_FLIP_H|OAM_FLIP_V, + 128 +}; + + +static const char player_1_meta_spr_attack_0_up[] = { + -8, 0, 0x48, 1, + 0, 0, 0x4A, 1, + -8, -16, 0x28, 1, + 0, -16, 0x2A, 1, + 128 +}; + +static const char player_1_meta_spr_attack_1_up[] = { + -8, 0, 0x4C, 1, + 0, 0, 0x4E, 1, + -8, -16, 0x2C, 1, + 0, -16, 0x2E, 1, + 128 +}; + + +static const char player_1_meta_spr_attack_0_down[] = { + -8, 0, 0x28, 1|OAM_FLIP_V, + 0, 0, 0x2A, 1|OAM_FLIP_V, + -8, -16, 0x48, 1|OAM_FLIP_V, + 0, -16, 0x4A, 1|OAM_FLIP_V, + 128 +}; + +static const char player_1_meta_spr_attack_1_down[] = { + -8, 0, 0x2C, 1|OAM_FLIP_V, + 0, 0, 0x2E, 1|OAM_FLIP_V, + -8, -16, 0x4C, 1|OAM_FLIP_V, + 0, -16, 0x4E, 1|OAM_FLIP_V, + 128 +}; + +static const char player_1_meta_spr_attack_0_right[] = { + -8,-8, 0x30, 1, + 0, -8, 0x32, 1, + 8, -8, 0x34, 1, + 128 +}; + +static const char player_1_meta_spr_attack_1_right[] = { + -8,-8, 0x50, 1, + 0, -8, 0x52, 1, + 8, -8, 0x54, 1, + 128 +}; + +static const char player_1_meta_spr_attack_0_left[] = { + -16, -8, 0x34, 1|OAM_FLIP_H, + -8, -8, 0x32, 1|OAM_FLIP_H, + 0, -8, 0x30, 1|OAM_FLIP_H, + 128 +}; + +static const char player_1_meta_spr_attack_1_left[] = { + -16, -8, 0x54, 1|OAM_FLIP_H, + -8, -8, 0x52, 1|OAM_FLIP_H, + 0, -8, 0x50, 1|OAM_FLIP_H, + 128 +}; + + +void __fastcall__ draw_player(void){ + if(i==0){ + if(player_carry[0] != 0xFF){ + if(temp2 & (PAD_LEFT|PAD_RIGHT|PAD_UP|PAD_DOWN)){ + switch(player_carry_dir[0]) + { + case PAD_UP: + if(frame&16) + { + spr = oam_meta_spr(temp0, temp1, spr, player_carry_0_meta_spr_left_foot_up); + } + else + { + spr = oam_meta_spr(temp0, temp1, spr, player_carry_0_meta_spr_right_foot_up); + } + break; + case PAD_DOWN: + if(frame&16) + { + spr = oam_meta_spr(temp0, temp1, spr, player_carry_0_meta_spr_left_foot_down); + } + else + { + spr = oam_meta_spr(temp0, temp1, spr, player_carry_0_meta_spr_right_foot_down); + } + break; + case PAD_LEFT: + if(frame&16) + { + spr = oam_meta_spr(temp0, temp1, spr, player_carry_0_meta_spr_left_foot_left); + } + else + { + spr = oam_meta_spr(temp0, temp1, spr, player_carry_0_meta_spr_right_foot_left); + } + break; + case PAD_RIGHT: + if(frame&16) + { + spr = oam_meta_spr(temp0, temp1, spr, player_carry_0_meta_spr_left_foot_right); + } + else + { + spr = oam_meta_spr(temp0, temp1, spr, player_carry_0_meta_spr_right_foot_right); + } + break; + } + } + else + { + switch(player_carry_dir[i]) + { + case PAD_UP: + spr = oam_meta_spr(temp0, temp1, spr, player_carry_0_meta_spr_stand_up); + break; + case PAD_DOWN: + spr = oam_meta_spr(temp0, temp1, spr, player_carry_0_meta_spr_stand_down); + break; + case PAD_LEFT: + spr = oam_meta_spr(temp0, temp1, spr, player_carry_0_meta_spr_stand_left); + break; + case PAD_RIGHT: + spr = oam_meta_spr(temp0, temp1, spr, player_carry_0_meta_spr_stand_right); + break; + } + } + }else if(player_attack_tick[i]){ + switch(player_dir[i]) + { + case PAD_UP: + if(player_attack_tick[i] > 8){ + spr = oam_meta_spr(temp0, temp1, spr, player_0_meta_spr_attack_0_up); + } + else + { + spr = oam_meta_spr(temp0, temp1, spr, player_0_meta_spr_attack_1_up); + } + break; + case PAD_DOWN: + if(player_attack_tick[i] > 8){ + spr = oam_meta_spr(temp0, temp1, spr, player_0_meta_spr_attack_0_down); + } + else + { + spr = oam_meta_spr(temp0, temp1, spr, player_0_meta_spr_attack_1_down); + } + break; + case PAD_RIGHT: + if(player_attack_tick[i] > 8){ + spr = oam_meta_spr(temp0, temp1, spr, player_0_meta_spr_attack_0_right); + } + else + { + spr = oam_meta_spr(temp0, temp1, spr, player_0_meta_spr_attack_1_right); + } + break; + case PAD_LEFT: + if(player_attack_tick[i] > 8){ + spr = oam_meta_spr(temp0, temp1, spr, player_0_meta_spr_attack_0_left); + } + else + { + spr = oam_meta_spr(temp0, temp1, spr, player_0_meta_spr_attack_1_left); + } + break; + } + player_attack_tick[i]--; + } + else if(temp2 & (PAD_LEFT|PAD_RIGHT|PAD_UP|PAD_DOWN)){ + + switch(player_dir[i]) + { + case PAD_UP: + if(frame&16) + { + spr = oam_meta_spr(temp0, temp1, spr, player_0_meta_spr_left_foot_up); + } + else + { + spr = oam_meta_spr(temp0, temp1, spr, player_0_meta_spr_right_foot_up); + } + break; + case PAD_DOWN: + if(frame&16) + { + spr = oam_meta_spr(temp0, temp1, spr, player_0_meta_spr_left_foot_down); + } + else + { + spr = oam_meta_spr(temp0, temp1, spr, player_0_meta_spr_right_foot_down); + } + break; + case PAD_LEFT: + if(frame&16) + { + spr = oam_meta_spr(temp0, temp1, spr, player_0_meta_spr_left_foot_left); + } + else + { + spr = oam_meta_spr(temp0, temp1, spr, player_0_meta_spr_right_foot_left); + } + break; + case PAD_RIGHT: + if(frame&16) + { + spr = oam_meta_spr(temp0, temp1, spr, player_0_meta_spr_left_foot_right); + } + else + { + spr = oam_meta_spr(temp0, temp1, spr, player_0_meta_spr_right_foot_right); + } + break; + } + } + else + { + switch(player_dir[i]) + { + case PAD_UP: + spr = oam_meta_spr(temp0, temp1, spr, player_0_meta_spr_stand_up); + break; + case PAD_DOWN: + spr = oam_meta_spr(temp0, temp1, spr, player_0_meta_spr_stand_down); + break; + case PAD_LEFT: + spr = oam_meta_spr(temp0, temp1, spr, player_0_meta_spr_stand_left); + break; + case PAD_RIGHT: + spr = oam_meta_spr(temp0, temp1, spr, player_0_meta_spr_stand_right); + break; + } + } + }else if(i == 1){ + if(player_carry[1] != 0xFF){ + if(temp2 & (PAD_LEFT|PAD_RIGHT|PAD_UP|PAD_DOWN)){ + switch(player_carry_dir[1]) + { + case PAD_UP: + if(frame&16) + { + spr = oam_meta_spr(temp0, temp1, spr, player_carry_1_meta_spr_left_foot_up); + } + else + { + spr = oam_meta_spr(temp0, temp1, spr, player_carry_1_meta_spr_right_foot_up); + } + break; + case PAD_DOWN: + if(frame&16) + { + spr = oam_meta_spr(temp0, temp1, spr, player_carry_1_meta_spr_left_foot_down); + } + else + { + spr = oam_meta_spr(temp0, temp1, spr, player_carry_1_meta_spr_right_foot_down); + } + break; + case PAD_LEFT: + if(frame&16) + { + spr = oam_meta_spr(temp0, temp1, spr, player_carry_1_meta_spr_left_foot_left); + } + else + { + spr = oam_meta_spr(temp0, temp1, spr, player_carry_1_meta_spr_right_foot_left); + } + break; + case PAD_RIGHT: + if(frame&16) + { + spr = oam_meta_spr(temp0, temp1, spr, player_carry_1_meta_spr_left_foot_right); + } + else + { + spr = oam_meta_spr(temp0, temp1, spr, player_carry_1_meta_spr_right_foot_right); + } + break; + } + } + else + { + switch(player_carry_dir[1]) + { + case PAD_UP: + spr = oam_meta_spr(temp0, temp1, spr, player_carry_1_meta_spr_stand_up); + break; + case PAD_DOWN: + spr = oam_meta_spr(temp0, temp1, spr, player_carry_1_meta_spr_stand_down); + break; + case PAD_LEFT: + spr = oam_meta_spr(temp0, temp1, spr, player_carry_1_meta_spr_stand_left); + break; + case PAD_RIGHT: + spr = oam_meta_spr(temp0, temp1, spr, player_carry_1_meta_spr_stand_right); + break; + } + } + }else if(player_attack_tick[i]){ + + switch(player_dir[i]) + { + case PAD_UP: + if(player_attack_tick[i] > 8){ + spr = oam_meta_spr(temp0, temp1, spr, player_1_meta_spr_attack_0_up); + } + else + { + spr = oam_meta_spr(temp0, temp1, spr, player_1_meta_spr_attack_1_up); + } + break; + case PAD_DOWN: + if(player_attack_tick[i] > 8){ + spr = oam_meta_spr(temp0, temp1, spr, player_1_meta_spr_attack_0_down); + } + else + { + spr = oam_meta_spr(temp0, temp1, spr, player_1_meta_spr_attack_1_down); + } + break; + case PAD_RIGHT: + if(player_attack_tick[i] > 8){ + spr = oam_meta_spr(temp0, temp1, spr, player_1_meta_spr_attack_0_right); + } + else + { + spr = oam_meta_spr(temp0, temp1, spr, player_1_meta_spr_attack_1_right); + } + break; + case PAD_LEFT: + if(player_attack_tick[i] > 8){ + spr = oam_meta_spr(temp0, temp1, spr, player_1_meta_spr_attack_0_left); + } + else + { + spr = oam_meta_spr(temp0, temp1, spr, player_1_meta_spr_attack_1_left); + } + break; + } + player_attack_tick[i]--; + } + else if(temp2 & (PAD_LEFT|PAD_RIGHT|PAD_UP|PAD_DOWN)){ + + switch(player_dir[i]) + { + case PAD_UP: + if(frame&16) + { + spr = oam_meta_spr(temp0, temp1, spr, player_1_meta_spr_left_foot_up); + } + else + { + spr = oam_meta_spr(temp0, temp1, spr, player_1_meta_spr_right_foot_up); + } + break; + case PAD_DOWN: + if(frame&16) + { + spr = oam_meta_spr(temp0, temp1, spr, player_1_meta_spr_left_foot_down); + } + else + { + spr = oam_meta_spr(temp0, temp1, spr, player_1_meta_spr_right_foot_down); + } + break; + case PAD_LEFT: + if(frame&16) + { + spr = oam_meta_spr(temp0, temp1, spr, player_1_meta_spr_left_foot_left); + } + else + { + spr = oam_meta_spr(temp0, temp1, spr, player_1_meta_spr_right_foot_left); + } + break; + case PAD_RIGHT: + if(frame&16) + { + spr = oam_meta_spr(temp0, temp1, spr, player_1_meta_spr_left_foot_right); + } + else + { + spr = oam_meta_spr(temp0, temp1, spr, player_1_meta_spr_right_foot_right); + } + break; + } + } + else + { + switch(player_dir[i]) + { + case PAD_UP: + spr = oam_meta_spr(temp0, temp1, spr, player_1_meta_spr_stand_up); + break; + case PAD_DOWN: + spr = oam_meta_spr(temp0, temp1, spr, player_1_meta_spr_stand_down); + break; + case PAD_LEFT: + spr = oam_meta_spr(temp0, temp1, spr, player_1_meta_spr_stand_left); + break; + case PAD_RIGHT: + spr = oam_meta_spr(temp0, temp1, spr, player_1_meta_spr_stand_right); + break; + } + } + } +} + +#define min_x 60 +#define max_x (255-60) +#define min_y 60 +#define max_y (240-60) + +const static char item_target_x[4] = {108, 148, 108, 148}; +const static char item_target_y[4] = {99, 140, 139, 99}; + +void __fastcall__ tick_players(void) +{ + /* + int_temp0 = 120; + int_temp0 <<= 1; + int_temp0 -= scr_x; + + temp0 = int_temp0; + + int_temp0 = 120; + int_temp0 <<= 1; + int_temp0 -= scr_y; + temp1 = int_temp0; + spr = oam_spr(temp0, temp1, 0x2, 0x2, spr); +*/ + + switch(player_hp[0]){ + default: + spr = oam_spr(0x10, 0x10, 0x60, 0x0, spr); + spr = oam_spr(0x10, 0x20, 0x60, 0x0, spr); + break; + case 3: + spr = oam_spr(0x10, 0x10, 0x62, 0x0, spr); + spr = oam_spr(0x10, 0x20, 0x60, 0x0, spr); + break; + case 2: + spr = oam_spr(0x10, 0x10, 0x64, 0x0, spr); + spr = oam_spr(0x10, 0x20, 0x60, 0x0, spr); + break; + case 1: + spr = oam_spr(0x10, 0x10, 0x64, 0x0, spr); + spr = oam_spr(0x10, 0x20, 0x62, 0x0, spr); + break; + case 0: + spr = oam_spr(0x10, 0x10, 0x64, 0x0, spr); + spr = oam_spr(0x10, 0x20, 0x64, 0x0, spr); + break; + } + switch(player_hp[1]){ + default: + spr = oam_spr(0xE8, 0x10, 0x60, 0x1, spr); + spr = oam_spr(0xE8, 0x20, 0x60, 0x1, spr); + break; + case 3: + spr = oam_spr(0xE8, 0x10, 0x62, 0x1, spr); + spr = oam_spr(0xE8, 0x20, 0x60, 0x1, spr); + break; + case 2: + spr = oam_spr(0xE8, 0x10, 0x64, 0x1, spr); + spr = oam_spr(0xE8, 0x20, 0x60, 0x1, spr); + break; + case 1: + spr = oam_spr(0xE8, 0x10, 0x64, 0x1, spr); + spr = oam_spr(0xE8, 0x20, 0x62, 0x1, spr); + break; + case 0: + spr = oam_spr(0xE8, 0x10, 0x64, 0x1, spr); + spr = oam_spr(0xE8, 0x20, 0x64, 0x1, spr); + break; + } + + to_scroll_x = 0; + to_scroll_y = 0; + + for(i=0; i<2; ++i) + { + if(player_god_mode[i]) + { + if((frame&2) == 0) + { + player_god_mode[i]--; + pal_col(16+(i<<2)+3, palette[16+(i<<2)+3]); + pal_col(16+(i<<2)+1, palette[16+(i<<2)+1]); + } + else + { + pal_col(16+(i<<2)+3, 0x20); + pal_col(16+(i<<2)+1, 0xD); + + } + } + if(player_hp[i] == 0){ + continue; + } + int_temp0 = player_x[i]; + int_temp0 <<= 1; + int_temp0 -= scr_x; + + temp0 = int_temp0; + + int_temp0 = player_y[i]; + int_temp0 <<= 1; + int_temp0 -= scr_y; + + temp1 = int_temp0; + + temp2 = pad_poll(i); + + draw_player(); + + if(temp0 0) + { + to_scroll_x = (min_x-temp0)>>1; + if(to_scroll_x > scr_x) + { + to_scroll_x = scr_x; + } + to_scroll_x_neg = 1; + } else if(temp0 > max_x && scr_x < 255) + { + to_scroll_x = (temp0-max_x)>>1; + + if(to_scroll_x > 254-scr_x) + { + to_scroll_x = 254-scr_x; + } + to_scroll_x_neg = 0; + } + + # + if(temp1 0) + { + to_scroll_y = (min_y-temp1)>>1; + if(to_scroll_y > scr_y) + { + to_scroll_y = scr_y; + } + to_scroll_y_neg = 1; + } else if(temp1 > max_y && scr_y < 255) + { + to_scroll_y = (temp1-max_y)>>1; + + if(to_scroll_y > 238-scr_y) + { + to_scroll_y = 238-scr_y; + } + to_scroll_y_neg = 0; + } + + + if(temp2 & PAD_B) + { + if(player_carry[i] == 0xFF) + { + temp4 = player_x[i]; + temp5 = player_y[i]; + + if(player_dir[i] == PAD_LEFT) temp4 -= 4; + else if(player_dir[i] == PAD_RIGHT) temp4 += 4; + + if(player_dir[i] == PAD_UP) temp5 -= 4; + else if(player_dir[i] == PAD_DOWN) temp5 += 2; + + for(j=0; j<4; j++) + { + if(item_placed[j]) + { + continue; + } + if(item_x[j]-4 temp4) + { + if(item_y[j]-5 temp5) + { + if(player_carry[1-i] != j || player_carry_dir[1-i] != player_dir[i]) + { + player_carry[i] = j; + player_carry_dir[i] = player_dir[i]; + + // Item pickup SFX + sfx_play(5, 3); + } + } + } + } + } + } + else + { + player_carry[i] = 0xFF; + + } + + if(player_attack_tick[i] < 3 && (temp2 & (PAD_A))){ + player_attack_tick[i] = 16; + } + + temp1 = 1-i; + + temp6 = 0; + if(player_carry[i] != 0xFF) + { + temp6++; + if(player_carry[temp1] == player_carry[i]) + { + temp6++; + } + } + + + if(temp6 == 2) + { + if(i==0 && (frame&3) == 0) + { + temp2 = pad_poll(0)&pad_poll(1); + + + if(temp2 & PAD_LEFT) + { + if(isBlocked(player_x[0]-1, player_y[0]) == 0 && isBlocked(player_x[1]-1, player_y[1]) == 0){ + --player_x[0]; + --player_x[1]; + --item_x[player_carry[i]]; + } + } + else if(temp2 & PAD_RIGHT) + { + if(isBlocked(player_x[0]+1, player_y[0]) == 0 && isBlocked(player_x[1]+1, player_y[1]) == 0){ + ++player_x[0]; + ++player_x[1]; + ++item_x[player_carry[i]]; + } + } + + if(temp2 & PAD_UP) + { + if(isBlocked(player_x[0], player_y[0]-1) == 0 && isBlocked(player_x[1], player_y[1]-1) == 0){ + --player_y[0]; + --player_y[1]; + --item_y[player_carry[i]]; + } + } + else if(temp2 & PAD_DOWN) + { + if(isBlocked(player_x[0], player_y[0]+1) == 0 && isBlocked(player_x[1], player_y[1]+1) == 0){ + ++player_y[0]; + ++player_y[1]; + ++item_y[player_carry[i]]; + } + } + + } + } + else if((temp6 == 0 ||(frame&7) == i) && (frame&1)== i) + { + if(!(player_dir[i] & temp2)) + { + if(temp2 & PAD_LEFT) + { + player_dir[i] = PAD_LEFT; + } + else if(temp2 & PAD_RIGHT) + { + player_dir[i] = PAD_RIGHT; + } + else if(temp2 & PAD_DOWN) + { + player_dir[i] = PAD_DOWN; + } + else if(temp2 & PAD_UP) + { + player_dir[i] = PAD_UP; + } + } + temp4 = player_x[i]; + temp5 = player_y[i]; + + if(temp2 & PAD_LEFT) + { + if((player_hp[temp1] == 0 || player_x[temp1] < player_x[i] || player_x[temp1]-player_x[i] < 60)) + { + --player_x[i]; + } + } + else if(temp2 & PAD_RIGHT) + { + if(player_hp[temp1] == 0 ||player_x[i] < 250 && (player_x[temp1] > player_x[i] || player_x[i]-player_x[temp1] < 60)) + { + ++player_x[i]; + } + } + + if(isBlocked(player_x[i], player_y[i])){ + player_x[i] = temp4; + } + else if(player_carry[i] != 0xFF) + { + item_x[player_carry[i]] += player_x[i]-temp4; + } + if(temp2 & PAD_UP) + { + if((player_hp[temp1] == 0 ||player_y[temp1] < player_y[i] || player_y[temp1]-player_y[i] < 60)) + { + --player_y[i]; + } + } + else if( temp2 & PAD_DOWN) + { + if((player_hp[temp1] == 0 || player_y[temp1] > player_y[i] || player_y[i]-player_y[temp1] < 60)) + { + ++player_y[i]; + } + } + if(isBlocked(player_x[i], player_y[i])){ + player_y[i] = temp5; + } + else if(player_carry[i] != 0xFF) + { + item_y[player_carry[i]] += player_y[i]-temp5; + } + } + + if(player_attack_tick[i] == 10) + { + temp0 = player_x[i]; + temp1 = player_y[i]; + temp6 = 5; + temp7 = 5; + + if(player_dir[i] == PAD_LEFT) temp0 -= 4, temp6 = 8; + else if(player_dir[i] == PAD_RIGHT) temp0 += 4, temp6 = 8; + + if(player_dir[i] == PAD_UP) temp1 -= 4, temp7 = 8; + else if(player_dir[i] == PAD_DOWN) temp1 += 3, temp7 = 8; + dx = temp0; + dy = temp1; + if(isBlocked(temp0, temp1) == 0){ + took_damage(); + } + } + } + + temp2 = 0; + for(i=0; i<4; i++) + { + if(item_placed[i] == 0) + { + if(item_x[i] - item_target_x[i] < 2 || -item_x[i] + item_target_x[i]<2) + { + if(item_y[i] - item_target_y[i] < 2 || -item_y[i] + item_target_y[i]<2) + { + item_placed[i] = 1; + item_x[i] = item_target_x[i]; + item_y[i] = item_target_y[i]; + if(player_carry[0] == i) + { + player_carry[0] = 0xFF; + } + if(player_carry[1] == i) + { + player_carry[1] = 0xFF; + } + + // Item placed SFX + sfx_play(2, 3); + } + } + } + + if(item_placed[i] == 0) + { + temp2 = 1; + } + int_temp0 = item_x[i]; + int_temp0 <<= 1; + int_temp0 -= scr_x; + + if(int_temp0>255) continue; + + temp0 = int_temp0; + + int_temp0 = item_y[i]; + int_temp0 <<= 1; + int_temp0 -= scr_y; + if(int_temp0>255) continue; + + + temp1 = int_temp0; + + spr = oam_spr(temp0-4, temp1-8, 0xC0+(item_type[i]<<1), 0x3, spr); + } + + if(temp2 == 0) + { + next_level = 1; + } +} + +#define NAMETABLE_A 0x2000 +#define NAMETABLE_B 0x2400 +#define NAMETABLE_C 0x2800 +#define NAMETABLE_D 0x2c00 + +void __fastcall__ init(void){ + oam_size(1); + bank_spr(0); + bank_bg(1); + + unrle_vram(bg_top_left, NAMETABLE_A); + unrle_vram(bg_top_right, NAMETABLE_B); + unrle_vram(bg_bottom_left, NAMETABLE_C); + unrle_vram(bg_bottom_right, NAMETABLE_D); + + // copy tilesets + vram_write((unsigned char*)0x0000, 0x0, 0x2000); + vram_write((unsigned char*)0x2000, 0x0, 0x2000); + + ppu_on_all(); + + difficulty = 0; + next_level = 0; +} + +void __fastcall__ reset(void){ + next_level = 0; + frame=0; + + player_dir[0] = PAD_UP; + player_dir[1] = PAD_UP; + + player_hp[0] = 4; + player_hp[1] = 4; + + scr_x = 128; + scr_y = 128; + + player_x[0] = 120; + player_y[0] = 120; + player_x[1] = 136; + player_y[1] = 120; + + player_attack_tick[0] = 0; + player_attack_tick[1] = 0; + + + enemies_enemy[0] = PLAYER_1; + enemies_enemy[1] = PLAYER_2; + enemies_enemy[2] = PLAYER_1; + enemies_enemy[3] = PLAYER_2; + enemies_enemy[4] = PLAYER_1; + enemies_enemy[5] = PLAYER_2; + enemies_enemy[6] = PLAYER_1; + enemies_enemy[7] = PLAYER_2; + + for(i=0; i<8; ++i) + { + enemies_health[i] = 1; + enemies_dir[i] = PAD_UP; + enemy_leg[i] = (i&1); + enemies_type[i] = (i&1); + } + + enemy_spawn_points_x[0] = 184; + enemy_spawn_points_y[0] = 24; + enemy_spawn_points_x[1] = 232; + enemy_spawn_points_y[1] = 72; + enemy_spawn_points_x[2] = 232; + enemy_spawn_points_y[2] = 168; + enemy_spawn_points_x[3] = 184; + enemy_spawn_points_y[3] = 216; + enemy_spawn_points_x[4] = 72; + enemy_spawn_points_y[4] = 217; + enemy_spawn_points_x[5] = 24; + enemy_spawn_points_y[5] = 167; + enemy_spawn_points_x[6] = 24; + enemy_spawn_points_y[6] = 73; + enemy_spawn_points_x[7] = 72; + enemy_spawn_points_y[7] = 24; + + for(i=0; i<8; ++i) + { + enemies_x[i] = enemy_spawn_points_x[i]; + enemies_y[i] = enemy_spawn_points_y[i]; + enemy_push_timer[i] = 0; + } + + item_type[0] = 1; + item_x[0] = 128; + item_y[0] = 88; + + item_type[1] = 2; + item_x[1] = 128; + item_y[1] = 108; + + item_type[2] = 3; + item_x[2] = 128; + item_y[2] = 128; + + item_type[3] = 4; + item_x[3] = 128; + item_y[3] = 148; + + for(i=0; i<4; i++) + { + temp0 = rand8()&0xFE; + + item_x[i] = spawn[temp0]<<3; + item_y[i] = spawn[temp0+1]<<3; + for(j=0; j= 10) + { + enemy_speed = 5; + enemy_damage_modifier = 7; + spawn_hp = 6 + (difficulty-10); + } + scroll(scr_x, scr_y); +} + +void main(void){ + init(); + + music_play(0); + oam_clear(); + + while(1){ + pal_all(paused_palette); + scroll(0, 0); + ppu_waitnmi(); + + + ppu_off(); + unrle_vram(bg_menu, NAMETABLE_A); + ppu_on_all(); + + pal_all(palette); + ppu_waitnmi(); + + + ppu_waitnmi(); + while(1){ + ppu_waitnmi(); + spr=0; + oam_clear(); + frame++; + if(frame&8) + { + spr = oam_spr(120, 135, 0x66, 0x3, spr); + spr = oam_spr(120 + 8, 135, 0x68, 0x3, spr); + } + else + { + spr = oam_spr(120, 135, 0x6A, 0x3, spr); + spr = oam_spr(120 + 8, 135, 0x6C, 0x3, spr); + } + + spr = oam_spr(0x60, 0xA4, 0xEA, 0x1, spr); + spr = oam_spr(0x70, 0xA4, 0xF0, 0x1, spr); + spr = oam_spr(0x78, 0xA4, 0xEA, 0x1, spr); + spr = oam_spr(0x80, 0xA4, 0xF2, 0x1, spr); + spr = oam_spr(0x88, 0xA4, 0xF8, 0x1, spr); + spr = oam_spr(0x90, 0xA4, 0xE4, 0x1, spr); + spr = oam_spr(0x98, 0xA4, 0xFA, 0x1, spr); + + + spr = oam_spr(0x60, 0xB4, 0xEA, 0x1, spr); + spr = oam_spr(0x70, 0xB4, 0xFC, 0x1, spr); + spr = oam_spr(0x78, 0xB4, 0xEA, 0x1, spr); + spr = oam_spr(0x80, 0xB4, 0xFA, 0x1, spr); + spr = oam_spr(0x88, 0xB4, 0xFE, 0x1, spr); + + + spr = oam_spr(0x60, 0xC4, 0xF0, 0x1, spr); + spr = oam_spr(0x70, 0xC4, 0xE0, 0x1, spr); + spr = oam_spr(0x78, 0xC4, 0x04, 0x1, spr); + spr = oam_spr(0x80, 0xC4, 0xF2, 0x1, spr); + spr = oam_spr(0x88, 0xC4, 0xE0, 0x1, spr); + spr = oam_spr(0x90, 0xC4, 0xF0, 0x1, spr); + spr = oam_spr(0x98, 0xC4, 0xE4, 0x1, spr); + spr = oam_spr(0xA0, 0xC4, 0x18, 0x1, spr); + + spr = oam_spr(0x60, 0xD4, 0xE6, 0x1, spr); + spr = oam_spr(0x70, 0xD4, 0x04, 0x1, spr); + spr = oam_spr(0x78, 0xD4, 0xF2, 0x1, spr); + spr = oam_spr(0x80, 0xD4, 0xF8, 0x1, spr); + spr = oam_spr(0x88, 0xD4, 0xE6, 0x1, spr); + spr = oam_spr(0x90, 0xD4, 0xFA, 0x1, spr); + + + + if((pad_trigger(0)|pad_trigger(1))&(PAD_A|PAD_B|PAD_START)) + { + break; + } + } + spr=0; + oam_clear(); + + pal_all(paused_palette); + ppu_waitnmi(); + + + ppu_off(); + unrle_vram(bg_top_left, NAMETABLE_A); + ppu_on_all(); + + ppu_waitnmi(); + + difficulty = 0; + next_level = 1; + + while(1){ + ppu_waitnmi(); + spr=0; + oam_clear(); + + + if(next_level) + { + // Next level SFX + sfx_play(3, 2); + + reset(); + + spr = 0; + oam_clear(); + pal_all(paused_palette); + spr = oam_spr(100, 114, 0xF4, 0x1, spr); + spr = oam_spr(108, 114, 0xEA, 0x1, spr); + spr = oam_spr(116, 114, 0xF6, 0x1, spr); + spr = oam_spr(124, 114, 0xEA, 0x1, spr); + spr = oam_spr(132, 114, 0xF4, 0x1, spr); + if(difficulty<10) + { + spr = oam_spr(148, 114, 0x04+(difficulty<<1), 0x1, spr); + } + else + { + spr = oam_spr(148, 114, 0x05+(difficulty/10), 0x1, spr); + spr = oam_spr(156, 114, 0x04+(difficulty%10), 0x1, spr); + } + + spr = 0; + frame = 0; + while(1) + { + ppu_waitnmi(); + frame++; + if((frame > 100) && (frame == 255 || ((pad_trigger(0)|pad_trigger(1))&(PAD_A|PAD_B|PAD_START)))) + { + spr++; + break; + } + } + + pal_all(palette); + spr = 0; + oam_clear(); + } + + if(player_hp[0] == 0 || player_hp[1] == 0) + { + // Game Over SFX + sfx_play(4, 2); + + difficulty = 0; + next_level = 0; + reset(); + + spr = 0; + oam_clear(); + pal_all(paused_palette); + spr = oam_spr(92, 114, 0xEE, 0x1, spr); + spr = oam_spr(100, 114, 0xE4, 0x1, spr); + spr = oam_spr(108, 114, 0xF0, 0x1, spr); + spr = oam_spr(116, 114, 0xEA, 0x1, spr); + + spr = oam_spr(132, 114, 0x04, 0x1, spr); + spr = oam_spr(140, 114, 0xF6, 0x1, spr); + spr = oam_spr(148, 114, 0xEA, 0x1, spr); + spr = oam_spr(156, 114, 0xF2, 0x1, spr); + + spr = 0; + frame = 0; + while(1) + { + ppu_waitnmi(); + frame++; + if(frame == 255) + { + spr++; + } + if((spr == 4) || (spr >= 1 && ((pad_trigger(0)|pad_trigger(1))&(PAD_A|PAD_B|PAD_START)))) + { + break; + } + } + + pal_all(palette); + spr = 0; + oam_clear(); + break; + } + + temp1 = pad_trigger(0) | pad_trigger(1); + if(temp1 & PAD_START) + { + spr = 0; + oam_clear(); + pal_all(paused_palette); + spr = oam_spr(104, 114, 0xE2, 0x1, spr); + spr = oam_spr(112, 114, 0xE4, 0x1, spr); + spr = oam_spr(120, 114, 0xE6, 0x1, spr); + spr = oam_spr(128, 114, 0xE8, 0x1, spr); + spr = oam_spr(136, 114, 0xEA, 0x1, spr); + spr = oam_spr(144, 114, 0xEC, 0x1, spr); + + while(!(pad_trigger(0) & PAD_START)) + { + ppu_waitnmi(); + } + + pal_all(palette); + spr = 0; + oam_clear(); + } + + int_temp0 = 124; + int_temp0 <<= 1; + int_temp0 -= scr_x; + + if(int_temp0 <= 255) + { + temp0 = int_temp0; + + int_temp0 = 116; + int_temp0 <<= 1; + int_temp0 -= scr_y; + + if(int_temp0 <= 255) + { + temp1 = int_temp0; + if(frame&8) + { + spr = oam_spr(temp0, temp1 - 1, 0x66, 0x3, spr); + spr = oam_spr(temp0 + 8, temp1 - 1, 0x68, 0x3, spr); + } + else + { + spr = oam_spr(temp0, temp1 - 1, 0x6A, 0x3, spr); + spr = oam_spr(temp0 + 8, temp1 -1, 0x6C, 0x3, spr); + } + } + } + + tick_players(); + tick_enemies(); + + temp0 = 0; + + if(to_scroll_x){ + if(to_scroll_x_neg){ + scr_x -= to_scroll_x; + }else{ + scr_x += to_scroll_x; + } + } + if(to_scroll_y){ + if(to_scroll_y_neg){ + scr_y -= to_scroll_y; + }else{ + scr_y += to_scroll_y; + } + } + scroll(scr_x, scr_y); + ++frame; + + + } + } +} diff --git a/presets/nes-lib/neslib1.c b/presets/nes-lib/neslib1.c new file mode 100644 index 00000000..6201b3f3 --- /dev/null +++ b/presets/nes-lib/neslib1.c @@ -0,0 +1,58 @@ + +//this example code shows how to put some text in nametable + +#include "neslib.h" + +// tileset data + +const unsigned char TILESET[8*128] = {/*{w:8,h:8,bpp:1,count:128,brev:1}*/ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x7c,0x7c,0x7c,0x38,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x6c,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0xfe,0x6c,0xfe,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0xfe,0xd0,0xfe,0x16,0xfe,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0xdc,0x38,0x76,0xe6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x6c,0x7c,0xec,0xee,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x38,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x70,0x70,0x70,0x70,0x70,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x38,0x38,0x38,0x38,0x38,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x38,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x38,0xfe,0x38,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x1e,0x3c,0x78,0xf0,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x7c,0xee,0xee,0xee,0xee,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x78,0x38,0x38,0x38,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x0e,0x7c,0xe0,0xee,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x0e,0x3c,0x0e,0x0e,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x7e,0xee,0xee,0xfe,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xe0,0xfc,0x0e,0xee,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xe0,0xfc,0xee,0xee,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xee,0x1c,0x1c,0x38,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xee,0x7c,0xee,0xee,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xee,0xee,0x7e,0x0e,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x38,0x70,0x70,0x38,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x38,0x1c,0x1c,0x38,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xee,0x1c,0x38,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x7c,0xee,0xee,0xee,0xe0,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xee,0xee,0xee,0xfe,0xee,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xee,0xfc,0xee,0xee,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xee,0xe0,0xe0,0xee,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xec,0xee,0xee,0xee,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xe0,0xf0,0xe0,0xe0,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xe0,0xf8,0xe0,0xe0,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xe0,0xee,0xee,0xee,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0xee,0xfe,0xee,0xee,0xee,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x38,0x38,0x38,0x38,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x0e,0x0e,0x0e,0xee,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0xfc,0xf8,0xec,0xee,0xee,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xe0,0xe0,0xe0,0xee,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0xee,0xfe,0xfe,0xee,0xee,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0xee,0xfe,0xfe,0xee,0xe6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xee,0xee,0xee,0xee,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0xfc,0xee,0xee,0xee,0xfc,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xee,0xee,0xee,0xec,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xee,0xee,0xee,0xfc,0xee,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xe0,0x7c,0x0e,0xee,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x38,0x38,0x38,0x38,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0xee,0xee,0xee,0xee,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0xee,0xee,0x6c,0x38,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0xee,0xfe,0xfe,0xee,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0x7c,0x38,0x7c,0xee,0xee,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0xee,0xee,0x7c,0x38,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x1c,0x38,0x70,0xe0,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +}; + +//this macro is used remove need of calculation of the nametable address in runtime + +#define NTADR(x,y) ((0x2000|((y)<<5)|x)) + +//put a string into the nametable + +void put_str(unsigned int adr,const char *str) +{ + vram_adr(adr); + + while(1) + { + if(!*str) break; + vram_put((*str++)-0x20);//-0x20 because ASCII code 0x20 is placed in tile 0 of the CHR + } +} + +void main(void) +{ + //copy tileset to RAM + vram_write((unsigned char*)TILESET, 0x0, sizeof(TILESET)); + + //rendering is disabled at the startup, and palette is all black + pal_col(1,0x30);//set while color + + //you can't put data into vram through vram_put while rendering is enabled + //so you have to disable rendering to put things like text or a level map + //into the nametable + + //there is a way to update small number of nametable tiles while rendering + //is enabled, using set_vram_update and an update list + + put_str(NTADR(2,2),"HELLO, WORLD!"); + put_str(NTADR(2,4),"THIS CODE PRINTS SOME TEXT"); + put_str(NTADR(2,5),"USING ASCII-ENCODED CHARACTER"); + put_str(NTADR(2,6),"SET WITH CAPITAL LETTERS ONLY"); + put_str(NTADR(2,8),"TO USE CHR MORE EFFICIENTLY"); + put_str(NTADR(2,9),"YOU'D NEED A CUSTOM ENCODING"); + put_str(NTADR(2,10),"AND A CONVERSION TABLE"); + + ppu_on_all();//enable rendering + + while(1);//do nothing, infinite loop +} diff --git a/presets/nes-lib/neslib2.c b/presets/nes-lib/neslib2.c new file mode 100644 index 00000000..004810e0 --- /dev/null +++ b/presets/nes-lib/neslib2.c @@ -0,0 +1,105 @@ +//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" + +// palette for balls, there are four sets for different ball colors +const unsigned char palSprites[16]={/*{pal:"nes",n:4,sets:4}*/ + 0x0f,0x17,0x27,0x37, + 0x0f,0x11,0x21,0x31, + 0x0f,0x15,0x25,0x35, + 0x0f,0x19,0x29,0x39 +}; + +// tile set, two planes for 4 colors +const unsigned char TILESET[8*256] = {/*{w:8,h:8,bpp:1,count:256,brev:1,np:2,pofs:8,remap:[0,1,2,4,5,6,7,8,9,10,11,12]}*/ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x7C,0x7C,0x7C,0x38,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6C,0x6C,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6C,0xFE,0x6C,0xFE,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0xFE,0xD0,0xFE,0x16,0xFE,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCE,0xDC,0x38,0x76,0xE6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x6C,0x7C,0xEC,0xEE,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x38,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x70,0x70,0x70,0x70,0x70,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x38,0x38,0x38,0x38,0x38,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6C,0x38,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x38,0xFE,0x38,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x1E,0x3C,0x78,0xF0,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x7C,0xEE,0xEE,0xEE,0xEE,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x78,0x38,0x38,0x38,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x0E,0x7C,0xE0,0xEE,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x0E,0x3C,0x0E,0x0E,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x7E,0xEE,0xEE,0xFE,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0xE0,0xFC,0x0E,0xEE,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0xE0,0xFC,0xEE,0xEE,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xEE,0x1C,0x1C,0x38,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0xEE,0x7C,0xEE,0xEE,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0xEE,0xEE,0x7E,0x0E,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x38,0x70,0x70,0x38,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x38,0x1C,0x1C,0x38,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0xEE,0x1C,0x38,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x7C,0xEE,0xEE,0xEE,0xE0,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0xEE,0xEE,0xEE,0xFE,0xEE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0xEE,0xFC,0xEE,0xEE,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0xEE,0xE0,0xE0,0xEE,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xEC,0xEE,0xEE,0xEE,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xE0,0xF0,0xE0,0xE0,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xE0,0xF8,0xE0,0xE0,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0xE0,0xEE,0xEE,0xEE,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x38,0x38,0x38,0x38,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x0E,0x0E,0x0E,0xEE,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xEE,0xFC,0xF8,0xEC,0xEE,0xEE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xE0,0xE0,0xE0,0xEE,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC6,0xEE,0xFE,0xFE,0xEE,0xEE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCE,0xEE,0xFE,0xFE,0xEE,0xE6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0xEE,0xEE,0xEE,0xEE,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0xFC,0xEE,0xEE,0xEE,0xFC,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0xEE,0xEE,0xEE,0xEC,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0xEE,0xEE,0xEE,0xFC,0xEE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0xE0,0x7C,0x0E,0xEE,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x38,0x38,0x38,0x38,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xEE,0xEE,0xEE,0xEE,0xEE,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xEE,0xEE,0xEE,0x6C,0x38,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xEE,0xEE,0xFE,0xFE,0xEE,0xC6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xEE,0x7C,0x38,0x7C,0xEE,0xEE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xEE,0xEE,0xEE,0x7C,0x38,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x1C,0x38,0x70,0xE0,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x04,0x32,0x73,0x63,0x03,0x87,0x7E,0x3C,0x38,0x7C,0xFC,0xFC,0xFC,0x78,0x00,0x00,0xFE,0x84,0x88,0x84,0xA2,0xD1,0x8A,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x60,0x70,0x78,0x7C,0x3E,0x3F,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x0E,0x1E,0x3E,0x7C,0xFC,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x3F,0x1F,0x1C,0x18,0x39,0x39,0x39,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x7E,0x3C,0x3C,0x3C,0x3C,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xF8,0x38,0x18,0x9C,0x9C,0x9C,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x3F,0x3F,0x1F,0x1F,0x0F,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC3,0xE7,0xFF,0xDB,0x3C,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0xFC,0xF8,0xF8,0xF0,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +}; + +//general purpose vars + +static unsigned char i,j; +static unsigned char spr; + +//total number of balls on the screen +//since there are 64 HW sprites, it is absolute max + +#define BALLS_MAX 64 + +//balls parameters + +static unsigned char ball_x[BALLS_MAX]; +static unsigned char ball_y[BALLS_MAX]; +static unsigned char ball_dx[BALLS_MAX]; +static unsigned char ball_dy[BALLS_MAX]; + + + + + +void main(void) +{ + //copy tileset to RAM + vram_write((unsigned char*)TILESET, 0x0, sizeof(TILESET)); + + pal_spr(palSprites);//set palette for sprites + oam_size(1); + ppu_on_all();//enable rendering + + //initialize balls parameters + + for(i=0;i=(256-8)) ball_dx[i]=-ball_dx[i]; + if(ball_y[i]>=(240-8)) ball_dy[i]=-ball_dy[i]; + } + } +} diff --git a/presets/nes-lib/neslib3.c b/presets/nes-lib/neslib3.c new file mode 100644 index 00000000..ee4e1949 --- /dev/null +++ b/presets/nes-lib/neslib3.c @@ -0,0 +1,99 @@ +//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" + +const unsigned char TILESET[8*256] = {/*{w:8,h:8,bpp:1,count:256,brev:1,np:2,pofs:8,remap:[0,1,2,4,5,6,7,8,9,10,11,12]}*/ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x7c,0x7c,0x7c,0x38,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x6c,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0xfe,0x6c,0xfe,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0xfe,0xd0,0xfe,0x16,0xfe,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0xdc,0x38,0x76,0xe6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x6c,0x7c,0xec,0xee,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x38,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x70,0x70,0x70,0x70,0x70,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x38,0x38,0x38,0x38,0x38,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x38,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x38,0xfe,0x38,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x1e,0x3c,0x78,0xf0,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x7c,0xee,0xee,0xee,0xee,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x78,0x38,0x38,0x38,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x0e,0x7c,0xe0,0xee,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x0e,0x3c,0x0e,0x0e,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x7e,0xee,0xee,0xfe,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xe0,0xfc,0x0e,0xee,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xe0,0xfc,0xee,0xee,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xee,0x1c,0x1c,0x38,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xee,0x7c,0xee,0xee,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xee,0xee,0x7e,0x0e,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x38,0x70,0x70,0x38,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x38,0x1c,0x1c,0x38,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xee,0x1c,0x38,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x7c,0xee,0xee,0xee,0xe0,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xee,0xee,0xee,0xfe,0xee,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xee,0xfc,0xee,0xee,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xee,0xe0,0xe0,0xee,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xec,0xee,0xee,0xee,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xe0,0xf0,0xe0,0xe0,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xe0,0xf8,0xe0,0xe0,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xe0,0xee,0xee,0xee,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0xee,0xfe,0xee,0xee,0xee,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x38,0x38,0x38,0x38,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x0e,0x0e,0x0e,0xee,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0xfc,0xf8,0xec,0xee,0xee,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xe0,0xe0,0xe0,0xee,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0xee,0xfe,0xfe,0xee,0xee,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0xee,0xfe,0xfe,0xee,0xe6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xee,0xee,0xee,0xee,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0xfc,0xee,0xee,0xee,0xfc,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xee,0xee,0xee,0xec,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xee,0xee,0xee,0xfc,0xee,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xe0,0x7c,0x0e,0xee,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x38,0x38,0x38,0x38,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0xee,0xee,0xee,0xee,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0xee,0xee,0x6c,0x38,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0xee,0xfe,0xfe,0xee,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0x7c,0x38,0x7c,0xee,0xee,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0xee,0xee,0x7c,0x38,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x1c,0x38,0x70,0xe0,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x04,0x32,0x73,0x63,0x03,0x87,0x7e,0x3c,0x38,0x7c,0xfc,0xfc,0xfc,0x78,0x00,0x00,0xfe,0x84,0x88,0x84,0xa2,0xd1,0x8a,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x60,0x70,0x78,0x7c,0x3e,0x3f,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x0e,0x1e,0x3e,0x7c,0xfc,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x3f,0x1f,0x1c,0x18,0x39,0x39,0x39,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7e,0x3c,0x3c,0x3c,0x3c,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xf8,0x38,0x18,0x9c,0x9c,0x9c,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x3f,0x3f,0x1f,0x1f,0x0f,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc3,0xe7,0xff,0xdb,0x3c,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xfc,0xf8,0xf8,0xf0,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +}; + +//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; + } +} diff --git a/presets/nes-lib/neslib4.c b/presets/nes-lib/neslib4.c new file mode 100644 index 00000000..9f63cf16 --- /dev/null +++ b/presets/nes-lib/neslib4.c @@ -0,0 +1,122 @@ + +#include "neslib.h" + +const unsigned char TILESET[8*256] = {/*{w:8,h:8,bpp:1,count:256,brev:1,np:2,pofs:8,remap:[0,1,2,4,5,6,7,8,9,10,11,12]}*/ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x7c,0x7c,0x7c,0x38,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x6c,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0xfe,0x6c,0xfe,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0xfe,0xd0,0xfe,0x16,0xfe,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0xdc,0x38,0x76,0xe6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x6c,0x7c,0xec,0xee,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x38,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x70,0x70,0x70,0x70,0x70,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x38,0x38,0x38,0x38,0x38,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x38,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x38,0xfe,0x38,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x1e,0x3c,0x78,0xf0,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x7c,0xee,0xee,0xee,0xee,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x78,0x38,0x38,0x38,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x0e,0x7c,0xe0,0xee,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x0e,0x3c,0x0e,0x0e,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x7e,0xee,0xee,0xfe,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xe0,0xfc,0x0e,0xee,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xe0,0xfc,0xee,0xee,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xee,0x1c,0x1c,0x38,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xee,0x7c,0xee,0xee,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xee,0xee,0x7e,0x0e,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x38,0x70,0x70,0x38,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x38,0x1c,0x1c,0x38,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xee,0x1c,0x38,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x7c,0xee,0xee,0xee,0xe0,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xee,0xee,0xee,0xfe,0xee,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xee,0xfc,0xee,0xee,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xee,0xe0,0xe0,0xee,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xec,0xee,0xee,0xee,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xe0,0xf0,0xe0,0xe0,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xe0,0xf8,0xe0,0xe0,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xe0,0xee,0xee,0xee,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0xee,0xfe,0xee,0xee,0xee,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x38,0x38,0x38,0x38,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x0e,0x0e,0x0e,0xee,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0xfc,0xf8,0xec,0xee,0xee,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xe0,0xe0,0xe0,0xee,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0xee,0xfe,0xfe,0xee,0xee,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0xee,0xfe,0xfe,0xee,0xe6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xee,0xee,0xee,0xee,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0xfc,0xee,0xee,0xee,0xfc,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xee,0xee,0xee,0xec,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xee,0xee,0xee,0xfc,0xee,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xe0,0x7c,0x0e,0xee,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x38,0x38,0x38,0x38,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0xee,0xee,0xee,0xee,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0xee,0xee,0x6c,0x38,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0xee,0xfe,0xfe,0xee,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0x7c,0x38,0x7c,0xee,0xee,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0xee,0xee,0x7c,0x38,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x1c,0x38,0x70,0xe0,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x04,0x32,0x73,0x63,0x03,0x87,0x7e,0x3c,0x38,0x7c,0xfc,0xfc,0xfc,0x78,0x00,0x00,0xfe,0x84,0x88,0x84,0xa2,0xd1,0x8a,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x60,0x70,0x78,0x7c,0x3e,0x3f,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x0e,0x1e,0x3e,0x7c,0xfc,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x3f,0x1f,0x1c,0x18,0x39,0x39,0x39,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7e,0x3c,0x3c,0x3c,0x3c,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xf8,0x38,0x18,0x9c,0x9c,0x9c,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x3f,0x3f,0x1f,0x1f,0x0f,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc3,0xe7,0xff,0xdb,0x3c,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xfc,0xf8,0xf8,0xf0,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +}; + +//variables + +static unsigned char i; +static unsigned char pad,spr; +static unsigned char touch; +static unsigned char frame; + +//two players coords + +static unsigned char cat_x[2]; +static unsigned char cat_y[2]; + + +//first player metasprite, data structure explained in neslib.h + +const unsigned char metaCat1[]={ + 0, 0, 0x50, 0, + 8, 0, 0x51, 1, + 16, 0, 0x52, 0, + 0, 8, 0x60, 0, + 8, 8, 0x61, 0, + 16, 8, 0x62, 0, + 0, 16, 0x70, 0, + 8, 16, 0x71, 0, + 16, 16, 0x72, 0, + 128 +}; + +//second player metasprite, the only difference is palette number + +const unsigned char metaCat2[]={ + 0, 0, 0x50, 0, + 8, 0, 0x51, 1, + 16, 0, 0x52, 0, + 0, 8, 0x60, 1, + 8, 8, 0x61, 1, + 16, 8, 0x62, 1, + 0, 16, 0x70, 1, + 8, 16, 0x71, 1, + 16, 16, 0x72, 1, + 128 +}; + + + +void main(void) +{ + //copy tileset to RAM + vram_write((unsigned char*)TILESET, 0x0, sizeof(TILESET)); + + ppu_on_all();//enable rendering + + //set initial coords + + cat_x[0]=52; + cat_y[0]=100; + cat_x[1]=180; + cat_y[1]=100; + + //init other vars + + touch=0;//collision flag + frame=0;//frame counter + + //now the main loop + + while(1) + { + ppu_waitnmi();//wait for next TV frame + + //flashing color for touch + + i=frame&1?0x30:0x2a; + + pal_col(17,touch?i:0x21);//set first sprite color + pal_col(21,touch?i:0x26);//set second sprite color + + //process players + + spr=0; + + for(i=0;i<2;++i) + { + //display metasprite + + spr=oam_meta_spr(cat_x[i],cat_y[i],spr,!i?metaCat1:metaCat2); + + //poll pad and change coordinates + + pad=pad_poll(i); + + if(pad&PAD_LEFT &&cat_x[i]> 0) cat_x[i]-=2; + if(pad&PAD_RIGHT&&cat_x[i]<232) cat_x[i]+=2; + if(pad&PAD_UP &&cat_y[i]> 0) cat_y[i]-=2; + if(pad&PAD_DOWN &&cat_y[i]<212) cat_y[i]+=2; + } + + //check for collision for a smaller bounding box + //metasprite is 24x24, collision box is 20x20 + + if(!(cat_x[0]+22< cat_x[1]+2 || + cat_x[0]+ 2>=cat_x[1]+22|| + cat_y[0]+22< cat_y[1]+2 || + cat_y[0]+ 2>=cat_y[1]+22)) touch=1; else touch=0; + + frame++; + } +} diff --git a/src/pixed/pixeleditor.js b/src/pixed/pixeleditor.js index 7af8ddf9..c5908fc0 100644 --- a/src/pixed/pixeleditor.js +++ b/src/pixed/pixeleditor.js @@ -346,14 +346,24 @@ function pixelEditorDecodeMessage(e) { palette = [0xff000000, 0xffffffff]; // TODO if (currentPaletteStr) { var palbytes = parseHexBytes(e.data.palstr); - var rr = Math.floor(Math.abs(currentPaletteFmt.pal/100) % 10); - var gg = Math.floor(Math.abs(currentPaletteFmt.pal/10) % 10); - var bb = Math.floor(Math.abs(currentPaletteFmt.pal) % 10); - // TODO: n - if (currentPaletteFmt.pal >= 0) - palette = convertPaletteBytes(palbytes, 0, rr, rr, gg, rr+gg, bb); - else - palette = convertPaletteBytes(palbytes, rr+gg, bb, rr, gg, 0, rr); + var pal = currentPaletteFmt.pal; + if (pal > 0) { + var rr = Math.floor(Math.abs(pal/100) % 10); + var gg = Math.floor(Math.abs(pal/10) % 10); + var bb = Math.floor(Math.abs(pal) % 10); + // TODO: n + if (currentPaletteFmt.pal >= 0) + palette = convertPaletteBytes(palbytes, 0, rr, rr, gg, rr+gg, bb); + else + palette = convertPaletteBytes(palbytes, rr+gg, bb, rr, gg, 0, rr); + } else { + var paltable = PREDEF_PALETTES[pal]; + if (paltable) { + palette = palbytes.map(function(i) { return paltable[i]; }); + } else { + alert("No palette named " + pal); + } + } if (currentPaletteFmt.n) { paletteSets = []; for (var i=0; iÈ » +ƒ¶» ” +‚”  ¥ +‚¥©« H‚‚«…ã ‚ã© I‚‚…‡ + ‚‡ + Á +‚Á, , áŽûŽ©€°…ª Ì ©Ð…Ÿ¥>Å¿ðÉüÉ¢4Ó œÊíÐ ý ˆêÐÏúÏ­ ˜)€…£ … + +ƒm… +¥»  +ƒÚ©ýÝ…q…–©‚  µ ¢LÕ +‚ÕH—Š†H» +˜~HÃ¥ÕÐ + +LŽ +ƒÕŽ ¢™ Ž ý©ž@⥙Ш¨L… +ƒº…©?Ñ…þ û Ž ·¬Àõ +ܱõ +© õ +÷ ¬Áõ +ܱõ +© õ +÷ ¬Âõ +ܱõ +© õ +÷ ¬Ãõ +ܱõ +© õ +÷ ­ ¾ Ҭž »È±¾ »à ¾ »…¬Æ¾ »È±¾ »à ¾ »…¬Ç¾ »È±¾ »à ¾ »…­ ¾ Ҭɾ »È±¾ »à ¾ »…¬Ê¾ »È±¾ »à ¾ »…¬Ë¾ »È±¾ »à ¾ »…­ ¾ Ҭ; »È±¾ »à ¾ »…¬Î¾ »È±¾ »à ¾ »…¬Ï¾ »È±¾ »à ¾ »…­ ¾ ҬѾ »È±¾ »à ¾ »…¬Ò¾ »È±¾ »à ¾ »…¬Ó¾ »È±¾ »à ¾ »…­ ¾ Ò¬Õ¾ »È±¾ »à ¾ »…¬Ö¾ »È±¾ »à ¾ »…¬×¾ »È±¾ »à ¾ »…­ ¾ Ò¬Ù¾ »È±¾ »à ¾ »…¬Ú¾ »È±¾ »à ¾ »…¬Û¾ »È±¾ »à ¾ »…­ ¾ Ҭݾ »È±¾ »à ¾ »…¬Þ¾ »È±¾ »à ¾ »…¬ß¾ »È±¾ »à ¾ »…¦Þðßߠѱ²È¡ – ±È–  ˆ±• +Ⱥ  +ÊÎÐëŽ ©Ž 4¥ñ ‰¥· + ¥ë Áæò春ØÉЋ‹©ß…Í ´ +ƒÆ´ hͨxh  ª­hò@å…‰†Ò ¢á© è…ÿ p±ù +ÀÄèwÈÍÆÀ ÐŒõŒæ`ï…ʆµ +¢•©ÙÐôäô…©†„¢úŠ·ÐçÛç…š Æ +‚Æ)¬ª;¥­ÀÄæÔ`™©÷¢ÓÀÖèèà Üпø¿†®`ó +ƒ + +ê +¶ …Ë ú&œ&æ¥ Àiõ Hƒšõ…Þ¥¦)ª i„ Iƒš„ …ô æÙ`ü¥‘ +)ÙðÜÜ 1 +ƒU1¥£ +)çâ…À + R©ò ¤ `Ñ¥Ó ï…Ï ¹ ©€Ž ©  Œ +ƒUŒ©Ð ›  +¥{ « `ë +¥˜ ¢ÐÌßÌ¥ü ÎÐÈÙÈ…× ç`Á¢é ©ÿ%õè×è¶è½è÷Ðú ÷ú `ç  +³ +Ž +? +Ý  -§ -’) œ…Ž HƒŽ ¥® Hƒ®)ß £ Hƒ£ …· Hƒ·`¼ ªÐ ö ±¢ ‚¢ Ⱥ¿ ±ö ‚öÈ·¢ -±M ‚MÈƒÚ ±ì ‚ì‹¥´ H‚´¤i„…« - H‚« -WWæz H‚zŠ®† iŽ¢Œ`ë…¸ Hƒ¸ †’ Hƒ’ î ±£ ‚£ˆæ…Ñ HƒÑ±¾ ‚¾ ˆ¡…€ Hƒ€±¼ ‚¼ª‘±‘ ƒ‘É€ã ðˆ #ˆ Ⱦí -eé Hƒé ² ± ƒÈœeâ Hƒâ U±õ ƒõÈŠí ±þ ƒþÈ— € èˆè™è›èL“ -ƒ­“¥d H‚diý…² H‚²ÐÐæÓ H‚ÓŠŒ ¢`‹ ª ©ðèÝèÿèÄ è×è¨ Ð÷`Í -©®…£ Hƒ£¥ý HƒýÅÐ HƒÐðùüù¥4 Hƒ4ðóó¥µ HƒµÉõð’ -ú’ -`º©¯ -…‚ Hƒ‚¥ì Hƒì Åó HƒóðØüØ`É -¨š †Š - HƒŠ -©¯ … Hƒ±« ƒ«…ü Hƒü ÈÊЊ Š æŠ HƒŠ±ƒ ƒƒ ÈîÐÛÛæ” Hƒ”Å\ Hƒ\ðÊÊ ‚…Ì HƒÌÐÜ îÜ ±¡ ƒ¡ðê ê È -Т¢æ• Hƒ•ªœ¥¾ Hƒ¾ È -Ê™ÐÏúÏðîÚî`è…– Hƒ–ŠÐ† -† -¥ð Hƒð Éðø °ˆˆ…ö Hƒ ö©«…Ÿ HƒŸ ð† †8¦ ¥â Hƒâéðï…Ö Hƒ Ö©Ÿ…‰ Hƒ‰ ò -‚ ò …Ë Hƒ Ë Š» -):À HƒÀ…¨ Hƒ¨¥‡ Hƒ‡)ü²ª Hƒª …‡ Hƒ‡`§   -‚ …… Hƒ…ŠÜ )Á -…Ì HƒÌ ¥™ Hƒ™ )üÉà HƒÃ…º - Hƒº -, – p¿ û¿ , ³ Pèû襺 Hƒº  È ©³ ž¥µ Hƒµ  Ê `î )œ -Þ +Ì) û…û¥ª)ßÑ …·`Ñ +ªÅ ¨ ±Ô ‚ÔÈŠç±Æ ‚ÆÈÕÉ±Ï ‚ÏÈ¡²±Ð ‚Ð f¥© H‚©¹iÐ…ì H‚쯯æø H‚øŠ¢ ÖiË`¸…ó†: ë±§ ‚§ ˆæ…"Œ±Â ‚ˆë…#‡±‹ ‚‹ ªä±¡ É€ñ +ðË#ËÈþ¹e"ˆý±QÈ™« e#Çà±ûÈ®[±IÈåãè¹è*è¿èøLå +ƒå¥© H‚©ià…ø H‚ø‚ +‚ +æ‹ H‚‹Šõ`œ ª¤©ðŸ¼èðè è  èóЀ÷€`Œ©½ …Ø¥¨Å”ð¨ü¨¥ð­­¥ÓÉžðŽúŽ©Î…Ÿ`® Ž Ç ˜ Ù +‚Ù¨†±©™…¬±ø…EÈÐÓ +Ó +æÖ±ñÈÁ Ð$$æýÅ¡ðèè … ýЉâð¢¢ÈäÐð +ð +æçªÔ ¥ ¾ Ê° +ÐÎ úÎ ðÚÚÚ`Š…rŠ¡Ðÿÿ¥´Éðó °ÞÞ…ñ©ü +…´ð8 88‘¥•é𸅘©¶…à  Ç +‚Ç… Š“)´ +¡…¼ ¥â)ü” +À…ä`½)° +Å +• +ð…Ž¥)÷º…Z`³ )u +× +Ø +±  +µ…ߥ¿)ï‡b…›`˜ …ñ†› Œ + +‚Œ +Ž — ­ … ö +‚ö…û +†  â +­ »‘’æ#б±æ ¥¬ÐööÆÖ +Æ ¥êÐ÷ç÷`…,†£ œ +‚œŽ ™ +  ó +‚ó…í +† ¹ “ ±Ê  æÒІ†æ Å¥â Ð××ÆúÆ’¥ÓWÐç`҆ʪY¤ÿ +L¯ +ƒG¯`ž›››-›¨­¢¸©á@©¥@ö©Ø…‡ ¹@ïJºv­Æ„ +ÐÉöÉèÞ +àš +Ðüãü¥ÎÅÏð¿¿Å É +ð + +¥•™ªÆY§9Ò™!ŠÚ™é +`Ò +HÅ Í +ƒrÍh¯ªùµ¤`몟µÀ`í¥¸ +áþþIÏÕ…–`”¥Ö +ÅÙÙI×· …Ù `£ ¶ +ƒ½¶ ý +ƒÇý e·`²  Ÿ + +ƒ½Ÿ +ª˜ Ø +ƒÇØ `á…œ†— `ú…¸†® „ +‚„……`㎠ú †`‰ + ˜`ï…Œ† É Á +‚Á¦ þðÔ Ô¢} 5ÊtÐÏúÏÆ Àвö²¦ìðÐÐ ˆ +Ê„ÐVúV` 𩶅‘¥© )ûPæ …õ † `†…¿† ‡ n +‚n…$°†%Ž  › +‚›…&—†'Ñ¢ï¥ îð„ „ ] +ƒX]Æ ˆæ%ïæ'È +LK +ƒDK¦âðå  +å  ì ±$–‘&­ ÈÏ ÊÈÐò +øò +`ú…Æ Ö µ +‚µ…ž ± +‚±…&U†'Ç¢¤¥ ü ð¦  +¦  © +ƒ‡©Æ Ûæ'»Lê + +ƒuê +¦ƒðæ +æ ÷¥²‘&¥ ÈÄÊÂÐËúË`쪛  ¹ + +ƒU¹ +ÊñИ ú˜ `áššššššššššššššššŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒ²²²²²²²²²²²²²²²²________________ÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓ¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸””””””””””””””””âââââââââ â +â â ââââ…………………………………………á á á á á á á á á á á á á á á á ôôôôôôôôô ô +ô ô ôôôôùùùùùùùùùùùùùùùùõ õ õ õ õ õ õ õ õ õ õ õ õ õ õ õ ÞÞÞÞÞÞÞÞÞ Þ +Þ Þ ÞÞÞÞóóóóóóóóóóóóóóóó «!«"«#«$«%«&«'«(«)«*«+«,«-«.««¾ +¾ +¾ +¾ +¾ +¾ +¾ +¾ +¾ + ¾  -¥ -½…˜ - Hƒ˜ -¥‹ Hƒ‹)÷â ¢ Hƒ¢…Ô HƒÔ`û -) -¹ +¾ + ¾ + ¾ +¾ +¾ +¾ +zzzzzzzzzzzzzzzz ½!½"½#½$½%½&½'½(½)½*½+½,½-½.½½0‹1‹2‹3‹4‹5‹6‹7‹8‹9‹:‹;‹<‹=‹>‹‹¬ +¬ +¬ +¬ +¬ +¬ +¬ +¬ +¬ +¬ +¬ +¬ +¬ +¬ +¬ +-¬ + † +!† +"† +#† +$† +%† +&† +'† +(† +)† +*† ++† +,† +-† +.† +-† +0¦1¦2¦3¦4¦5¦6¦7¦8¦9¦:¦;¦<¦=¦>¦-¦0´ 0´ 0´ 0´ 0´ 0´ 0´ 0´ 0´ 0´ 0´ 0´ 0´ 0´ 0´ -´  ô!ô"ô#ô$ô%ô&ô'ô(ô)ô*ô+ô,ô-ô.ôô0ì1ì2ì3ì4ì5ì6ì7ì8ì9ì:ì;ì<ì=ì>ìì0à0à0à0à0à0à0à0à0à0à0à0à0à0à0àà0Š 0Š 0Š 0Š 0Š 0Š 0Š 0Š 0Š 0Š 0Š 0Š 0Š 0Š 0Š Š 0š1š2š3š4š5š6š7š8š9š:š;š<š=š>šš0e0e0e0e0e0e0e0e0e0e0e0e0e0e0ee0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 + +0000000000000000“0“0“0“0“0“0“0“0“0“0“0“0“0“0“0“0«0«0«0«0«0«0«0«0«0«0«0«0«0«0«0«0Á0Á0Á0Á0Á0Á0Á0Á0Á0Á0Á0Á0Á0Á0Á0Á0Ë0Ë0Ë0Ë0Ë0Ë0Ë0Ë0Ë0Ë0Ë0Ë0Ë0Ë0Ë0Ëɂ𦦩ÿ(oJ©¨ @‹©Ô +@©N@é0Þ @°@‹ + @ƒ©ü@¦@ð©ÿ…îù ¢µ “©È ÚÕ¤ü©?Ÿ ©0ñ øŠ‰Ÿi Œª™ˆ®ÐÝ ÝÝ Œ3÷ŒBÌŒQ¬Œ`&Œlˆ Œ¿`½©åô† +¶ „ ’¨î®oÛ0’ ’ oÝ¢’©º…  ± +Ð +èȺ +± +ì + È¬©¨ï¶Š©?Ç +é©0—Š° i ¥ª¸ +Æ ³ÐÏÖϱ +ãÈÄ +± +ÊÈñ½± +âH« +©Æ…€ +©3äH¨ª´©ý Á +ƒ7 +Áh§i…Æ´ÐéòéhÑÞ€` +ª­­™àòð‘‘ €Ü +Ðÿÿ)”ñ`½¥ +ÈHæ¥ óH¯®o¬0Ê +Êè«àßТá +Žo—­„ð¢_¢0œ]œ­šð††0œœÐ¤ @¤ ©Æ…å +©3³…ø +©Ô…± Ú¦Ô ' +ƒw +'°ÎΦ½÷¦ û +ƒ7 +û¦ª»¥§«i ƒ…C¥¤÷iå…£ Ư +Йؙ­†ƒm££ ©  … î¢3ÜŠ£H°   +ƒ hM×iè +ªûÆ ‡Ð² +ò² +­“\\©0y@š @ë @¼ +©€Õ@® +Là +ƒ0 +à­ÛÉ?Е•©ÎLH +ƒ‹ HËm8  +þ +ªú­=ìH©}ê +ƒV ê @êhƒ Ý0ÊÊ©Æ}¯ +ƒV ¯ÍÖð››Å@î­3É X@¨­ÝÉ?ýÐà੨ +Lê +ƒÅ êômG  -Ù -õ -ð …ò Hƒò¥ª Hƒª)ïÄ Ð HƒÐ…ü Hƒü`ù …ì - Hƒì -†Ù HƒÙ  Œ -‚ Œ…” Hƒ” †ú - Hƒú -­ ¦  .­ ½‘† ƒ†æë HƒëÐê ê æ’ Hƒ’¥ô Hƒô ЃƒÆÉ HƒÉÆþ Hƒþ¥¨ Hƒ¨Ù HƒÙ Ð ç `ý…  Hƒ †· Hƒ· ä -‚ ä…– Hƒ–†È HƒÈ ©±ñ ƒñ æ› Hƒ› Э­æþ Hƒþ¥„ Hƒ„ ÐggÆé Hƒé ÆÑ HƒÑ¥· - Hƒ· -ø Hƒø ÐÖçÖ`b)Æªí ½å -ƒ&åªä ± -‚ ±L¦ +” ª-­LŸ H­ +}h +ƒV h@×h‚ Ž0ÏÏ©³}´ +ƒV ´ÍÄ ð««Ó @Û­BÎ ð@Ó­ÿÉ?’Ðãã©Û +L— +ƒ÷ —ßmV° +íª… ­[‚Hš}Ý +ƒV Ý +@íh£ ÿ0žž©±}˜ -ƒŒ ¦ -’ ’ ’ -’ `ܨ½¢Ÿ©ò@ÿ©¾@Ñ©í …Š HƒŠ ¹@µJƒ vÙ HƒÙ ÆÔ HƒÔ Еö•èÈàøÐá ãá ¥õ HƒõÅÙ HƒÙðÛÛÅœ Hƒœðâ â ¥Ÿ HƒŸ™Í -HƒÍª‘ Y¡ -Hƒ¡ 9£ -Hƒ£ ™Ä -HƒÄŠ·™ç -Hƒç ¢ç -`ì H{ û -ƒ+ûhöªÊ µŽ - HƒŽ -¢” `…ª†µ» Hƒ»¢Õ`ÿ¥¥ Hƒ¥  -½Þ Þ IÏÏ… Hƒ`Ü¥Í HƒÍ  -˜ I×× …í Hƒí`È  ÿ -ƒ|ÿ ž -ƒ†ž eØ HƒØ ¢n`´ ý -ƒ|ýª‚ ¶ -ƒ†¶ `Ç…± Hƒ± †Ö HƒÖ `Û…Î HƒÎ†¯ Hƒ¯… Hƒ……³ Hƒ³`Ì …„ - Hƒ„ -† Hƒ Ï±Ú ƒÚÈÄÉ@Ú°íí ñ±± ƒ±Èû ª±§ ƒ§ÈÒ  É L³ -ƒ·³ ª±¥ç Hƒçà€·   àÿ¥ðž*ž ºÐÍ Í )ûæ  ú Š¶)?Œ ï ±ä - ƒä -È¥ - “±à ƒàȪŽ±ì ƒìÈa µÊ¦Ðƒ -÷ƒ -¥§ - Hƒ§ - TL» -ƒ·»`ž Ž ¶ ¸ `å À`½…Û HƒÛ †Ø - HƒØ - ¶ +ƒV ˜ + @á­Qî €+@ù­"‘É?ÿÐéé©Lþ +ƒ +þ me‘ )² IÅ … +¢­$œ  +“ )€¡ +ò@… ­`” ðÜ @¼ÎЭošÐ®®Îåhà +… Lh°… +Ÿ`ò +„  +· +ª†m … +¾©³mœ… Š©Çà`öÐÜÜ© … Õ ›µ ± +¦3ȱ +ݶÈù©× éõŠ=iî ª¼Æ ÙÐíäí G± +¾ º`¢ ½Ç ð¸¸ÞÇÐø  ø ½… +Ì +½¥… Á +L° +ƒ¢ +°½ª ðš š Þÿ8ß +`±½î… +¡ +½¶… ›± +Èæ +¹ÐÛÛæ É@“°§ § ¥ +ÍŽ +¥ °Ü `çÉÀ”°™ ™ É€¥ŽŽ)?Þ€ LÄ +ƒ± +Ä)?¨¬Lˆ +ƒ¢ +ˆÉÿÿ Ðý +'ý +k¥ +SiÒº¥ ÄiÍô± +’ Æ È̱ + … ¢È“± +… è ¥ Ë… +á ·L +ƒ¢ +ÉþÀб +ˆ… §Èœ +± + ˆé… ¾¥ ¿ … +åL§ +ƒ¢ +§)?ÚLÐ +ƒ¢ +нþðööÞù`ѽª +… +Ÿ ½É… ¯¼â± +Ê ÈÔ ²¯ ¯¦i@àÔ˜j— +`ŸÉÆðÌ̤˜  +À`‘± +“¨ßL“ -‚ ¶ -¦… Hƒ…ðÆ Æ¢å  Ç -ÊpÐCúCÆ¡ Hƒ¡Ðšöš¦Ú HƒÚ 𨠨  Õ -Êù ÐØúØ`Ò ¸ð©¥ … Hƒ¥ Hƒ )û¢± Hƒ± …ã - Hƒã - ³`Ô…¿ Hƒ¿†ÿ Hƒÿ  ³ -‚ ³ …Á HƒÁ 7 -‚ 7… Hƒ †è Hƒ è¢F¥š Hƒš ð¶ -¶ ‚ -ƒk‚ ÆÉ HƒÉæÁ Hƒ ÁLë -ƒY릩 Hƒ©ðœ  -œ  Â¥ô Hƒô‘— ƒ — ÈÖÊšÐú`ï¥ô Hƒô¢à `[ª®  « -ƒ«ÊŠÐÎúÎ`> Hƒ•É Hƒ¥É HƒµÉ HƒÅ€ HƒÕ€ Hƒå€ Hƒõˆ Hƒˆ Hƒˆ Iƒ•® Iƒ¥® Iƒµ® IƒÅÐ IƒÕÐ IƒåÐ Iƒõú Iƒú Iƒú////////////////…………………………………………û û û û û û û û û û û û û û û û ááááááááá á -á á áááá• • • • • • • • • • • • • • • • Š !Š "Š #Š $Š %Š &Š 'Š (Š )Š *Š +Š ,Š Š Š Š 0¡1¡2¡3¡4¡5¡6¡7¡8¡9¡:¡;¡<¡ ¡ ¡ ¡0õ0õ0õ0õ0õ0õ0õ0õ0õ0õ0õ0õ0õ0õ0õ0õ0þ0þ0þ0þ0þ0þ0þ0þ0þ0þ0þ0þ0þ0þ0þ0þ0š0š0š0š0š0š0š0š0š0š0š0š0š0š0š0š0œ0œ0œ0œ0œ0œ0œ0œ0œ0œ0œ0œ0œ0œ0œ0œŽeÒ Œf׆¼ Hƒ¼ „µ Hƒµª…ð† † ©@=dö  › -ƒ­› ù±§ ƒ§gÈÈé ±¿ ƒ¿h¼ È… ±… ƒ… mªÈ¾ ±Ï ƒÏnï ©ÿË aùc©©“ @‡©€á @÷©m@ô©0Ó@Ó@ý  @æ©ï@­@¯©øJRo„¢7¿ ©Úïè -È #Æ -©0Å(³è› à<ù -л è» ¢þ ©½ Hƒ\ ½ ¬©é Iƒ\ é!Å -©ì ±ÚèËà ±ÐNéNL‰ -ƒE ‰®e«†õ Hƒõ ®fú†· Hƒ· &Ñ° ƒ°°Ž\Ž -° … Hƒ  -ý -ªÌ -Ç e¤ Hƒ¤†§ Hƒ§e† Hƒ†iº ¨û­e¯…Ç HƒÇ Š -ƒ­Š ¢7Å ±æ ƒæ¨Èá ±Ê ƒÊ À -È¢©Þ ¢ × -à#÷ ©0å(èuà<Ôи ܸ ­d“ð‡ ‡ Ȫ ÈÖ±¿ ƒ¿ií鱮 ƒÆ j¿©ÊkÞ©Ñ lˆJå -`™ª³ -ð¡¡ ô -ƒE ô©² à Š Á ­Jù €­ÐÅ Å ­J°)ÞJÿ`ü¥® ƒ® Hô ¥² ƒ²HÌ­J¹ 0‰‰Ð” -” -L» -ƒ/ » ­kì miøk„­lymj¡ÍJã°ø ø lŽLö -ƒóö8¦íJ­ lÖ¢7ë 6 -ƒ— -6š  š ¢ù­Fè K -ƒD -K_ ¢8“  ¸ - -ƒ— -¸ -«  « ¢¬­G! ¯ -ƒD -¯ `° ¢9¶ Ž -ƒ— -Ž’’¢3­Hä À -ƒD -À ¢:ó  -ƒ— -º º¢ ­­Iw ” -ƒD -”b›¢½ ÷𶠶 Þ Ç ÐØ+Ø½Ì …Ä HƒÄ½!°…ž Hƒž¼,œ±¿ ƒ¿å å¯i@² ïÈ» ÐÉ ÉÐÑ Ñ È -±Ö ƒÖ ¨ÂLÁ -ƒ ÁÈá ±˜Ø ,âèÏà óÐÈÆÈ­Aê ðÂ"Âámù  d¦ªÆ ­÷ ¨ß}ñ -ƒ_ ñqÀ ˜Ý  »0„„©é }® -ƒß ® r‘­ó  _³p  ­B¯ð‡ "‡ m× düªÓ­­ -¨·}“ -ƒ_ “t¹˜ã Ò0““©® }Á -ƒß Áu×­Ã `Ÿ -s¨ ­CÖ ðÿ"ÿžmâ dûª ­¢ ¨¬}° -ƒ_ °wó ˜ ¬0– – ©Æ}¥ -ƒß ¥xØ ­ø - €Ívÿ­Dð  ¥m -)—I­ …¼ - Hƒ¼ -­bÞ -„)€Á ¯ Hƒ¯ zˆ­ š ð¬yà ¢¡ Ä -ƒ§ Ä¢™ - Ä -ƒ§ Ä ¢Ì - Ì -ƒ§ Ì¢-« Õ -ƒ§ Õ­p÷ @ç­qÓ @è ­rÎÍa ðææañ@­s›@±­t„@ -­uÛÍcƒð  cÏ @έvì @¥­wñ  -@•­x‹ @é­y› @ü ­zå@Èh‘ …Õ ƒÕhŸ…» ƒ»`£  - ¨Þ ­h¼i…ª Hƒª­g»…¨ Hƒ¨±¾ ƒ¾…ƒ HƒƒÈÙ±Ô - ƒÔ -ž -Èè ±¾ ƒ¾È… !–蟱… ƒ…‰È±” ƒ”!­©¬ -³+¡ Ê -,íà ¤°——è˜Èž æ,¡ ±Ð ƒÐ›Èº±ó ƒó!V¥£ Hƒ£`û½¸ ð®®Þ£Ç`ݽ‘ …÷ Hƒ÷½¾…Q HƒQ ž±‹ ƒ‹æö HƒöÐÅ Å æâ Hƒâ ª -0Ô ÔJ÷Œ -Œ -þý  -–8õ°ð ^ð )¾ -Jµ -°øø -Ö - - 0Ü ÜÜ É=ü Ð -KÐ -ð¢+¢É>“ðç 4ç ‡¥ò Hƒò i· Hƒ· i¬ ò ±Ç ƒÇ#üÈÁ±Ÿ ƒŸ…Ž HƒŽÈñ±• ƒ•…Å HƒÅ¥¶ Hƒ¶…ä Hƒä æL9 -ƒ­ -9±½ ƒ½ J-æÕ HƒÕЭ¢­æë HƒëÐÐ žÐ ±Ù ƒÙ…› Hƒ› ȹ±ž ƒž…Ï - HƒÏ -¥ï Hƒï …ð Hƒðˆ`L~ -ƒ­ -~ô ½#žðð -ð -Þ#Ï Ðç ç½â½‚ì`« ¥ë Hƒëç¥ý Hƒý  `‡©º@‚`φñ Hƒñ „€ Hƒ€ Î ­dä І†È‘ -ÈŽ±ð ƒð{êÈ - ƒÄ -| ¢æ à -ƒr à Š‰ -íiΪµà<” І ô† `Î -©›º}#€ã‡Ô ©0¹Ò„—Šð`ú -ó¨˜  “ -ƒr “ ­{Ï… Hƒ­|ä …Æ HƒÆ± ƒ ~ª Èÿ ±ê ƒê§`°½}ó ðªªÞ}¬Ð— -6— -½’ д´`î …Î HƒÎ ½~v…¯ Hƒ¯¼€ŒÙ±« ƒ«0ß ßð<<Èœ }ó˜± €»LÁ -ƒç ÁÈI†ß Hƒße¾ Hƒ¾ ª—±E ƒEÈê¦" Hƒ"LÏ -ƒÂ Ï ë ­pž)œ -…‹ Hƒ‹½© -)òÅc Hƒcê ê ½ÿpµ ½‚q‹½ƒö rè ­s–)Ê…î - Hƒî -½„õ )Æ Åð Hƒð½„–sŠ½…5t˜ ½†‘uY½‡Ê ðÜÜv¹ ½ˆ„w齉¶x§­yª) …t Hƒt½Š -)ŽÅÀ HƒÀ• •½Š× -yŽ½‹ z²`ŠÀ£££3Ú†6ë¥b#ç¯zH욣u£R£0££ó£×£¼£££Œ£u£`£L£:£(££ÙùÙëÙÝÙÑÙÅٺٯ٥ًٜٓكÙ|ÙuÙnÙh½b½\½W½R½M½I½E½A½=½:½6½3½0½-½+½©­©M©ò©©L©©¸©t©4©÷©¾©ˆ©V©&©ø©Î‚¥‚‚[‚9‚‚û‚ނª‚’‚{‚f‚R‚?‚-‚¦ ¦ý¦î¦á¦Ô¦È¦½¦²¦¨¦Ÿ¦–¦¦…¦~¦v¦pic^XSOJFB>:741.ß ß ß ß ß ß ß ß ß ß ß ß ß ß ß ß ÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝݼ¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼ÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊʪªªªªªªªªªªªªªªªô -ô -ô -ô -ô -ô -ô -ô -ô -ô -ô -ô -ô -ô -ô -ô -þþþþþþþþþþþþþþþþ‘’“”+ Ì ¨ æ  ÷ ³ Ê   ¢  … ¬ ¡ ´ Í € ê Ç ¾ ­ ì ´ – ‡•x–Nª Eª Sª ª H‚â H‚¸ H‚ H‚ö H‚ðÐ%%%%%%%%Œ—Æzx·¢ÿ• -šå褎 ú Ž@º Ž ’ , Ó , ㈠ûˆ , ×Ü ûÜ ©@@X©?•  ZŽ ” ©û ¢ Ó ¦Êû Ðœ úœ ŠÉ  õŒ ë - ÿ  ¶ •è‹Ðº úº ˆ°Ð´ -÷´ -Š— •§ ø¼Ä}Û ÷è -è“ -Ф -æ¤ -©È ï -ƒï ˆ - -ƒîˆ - ’ -ƒN’ ¤ -‚ ¤  ú -‚ú©  H‚‚  …ÿ - ‚ÿ -©Ü I‚‚Ü…Ú ‚Ú @ -‚ @©€é…ã Hƒã Ÿ ©Ó -…Å HƒÅ¥¹ Hƒ¹ÅŒ HƒŒðüüü¢4 - äÊÚ Ð•ý•ˆ Ðú­ ˜ )€ô…Ò HƒÒ Õ -ƒ Õ¢i Hƒi © Iƒ©¥$ Hƒ$ ÷ -ƒU÷¢ Hƒ  Ö IƒÖ ’ -ƒK ’©ýˆ…l Hƒl…˜ Hƒ˜©¹  ¹ é ÃLƒ -‚ -ƒ˜%™ -ƒk¸ -ƒ© -ƒ°ü uŒ ÆÛ· ˆ!¢ÿ -Úšú Ä–Î ç ¢ öMì´« -z£¾ ¼d²ÓŸöŸ¸ŸâŸöÐã  Üã  Üøú ø¤  øƒ ø‚ò Œä7 -ø› ű¶ -³ ø@7¸«ƒvÍ ¸ªƒKÕ °¸©ƒF  -°¸¨ƒ{'•¸§ƒGÅ•¸¦ƒ±”¸¥ƒ¨û”¸¤ƒˆÉ¸£ƒ3úɸ¢ƒñɸ¡ƒ ßɸ ƒ -ɸŸƒ£Ëö ¸žƒ›òö ¸ƒ©ö ¸œƒv‚ æ ¸›ƒk­æ ¸šƒ+ã æ û¸™ƒ*r° ¸˜ƒ_° —ƒX?½ -–ƒ­¡½ -•ƒë½ -¸”ƒò¼¤¸“ƒÈĤ¸’ƒ·­¸‘ƒ§‡ ¸ƒ{• ;¸ƒHs;¸Žƒ“ù ‡«¸ƒñù ¸Œƒäû¸‹ƒš¿û¸Šƒn¨û¸‰ƒ\™û¸ˆƒAÐ ‰¸‡ƒ>Û‰¸†ƒ8¥ ‰¸…ƒ2À‰¸„ƒ)Û -‰¸ƒƒ Ñ«¸‚ƒýÔ«¸ƒÞŠ︀ƒÕe︃Ëíï¸~ƒ±‹ -ï¸{ƒÍ§¸wƒÃ’¨ ¸vƒ+³ ¸oƒ —Õ‰¸lƒNü -’û¸kƒî(ˆ -ï¸jƒêï«€¸¸¸ƒ´¸À£•„Ú¢‰ ¦”àÌà³ÒÁËÈ݉džÙß…Ó\Ò• ™ ö¡ÞçøªÜhЩ Õ€ ýÑÄ Ü ïý˜ Ûû\ùñ éå³  ½||Éçõÿ¢úñüßÍŒ¿®‘¿žW›Áª–…› Š¥ ³(U¦‹•Ž… кª„eÚ›€æˆ°äȽ ¿Õ© ÷áøkÌ—ú©Œç°ÛÈ-“Û[á° ¨êØíœà óʱנ+íPꞘ顚íÔ“ÍÚ°«„ãæø¶ßÌê± í±Ö~Îtê©õÕŽ‚´‡ €íŒÅàõ.MCæÓʪ‰öԜǩÞÖá°¦z]«6©Ì Èõ‡» ”•¬WHšè­Ž7„ 暸•Î¦ÍìzgÕ èGõ‘ˆÚÆ “÷ÈˤŠ ‰è« ó½°âü¯­  ¯a©ËÊã ‡å?»~3Ÿ½¤ ›Ûûß_ÿ椞Ù)åoà©ù锄ÛÓ ¶¹Š¦ðɇ›É(¸í† >å“&¬¯½­ÖŒµØ×ã;]HyðvA;έsø²§¿ž”ü¦” Ôº©Õ–f“ÝßÍÉè´­º ÀË Ÿã4ÅåÁGWãìëÈ ¶³ã–¿Åš¬ÃÁ‘i¯ Öñ[C_9€§ ÆC÷ÉâÑ0õŸš–™ñ¥ †¨„Ç ¾†‡æX<»ªªx°•‰‡8Ãà˜Ó¦K»øþÿê–‰¥ÇŸ HªèŽã|}O&õÏ냟LÌŸ¦@¼t½£ ÂB‘ü¶ëï÷ÿ‹£>1¡ á…l”Ãç@ã‚¿²¨…†æôôŽÉ¨½Ùùñ»Êâ·ë¥BòóˆÖz׳⑵¼«E‚· ‘òÆý³‹¹÷öúüà%õ˜½6¨”F½éÍÆgÐÚ‹÷l‰ì–·»âªç¼òžÊÅð¬ÓÎÞ-÷Úèαn¼ÍëቇÙÝÁ ÝI¹ã‹ÎÍ ­ÝÖÁˆ’ŒQ— Äž òõ£š ŸËùÚ– ¨d-úÄ€ û º¹Å tä‚µäŒ ì¤™—¿ 骺ßÒ˜I£ ò’ôöË Ø–‡¥¬ °›…ÆÃÖyõ†´¼¶aѾ¦ÎƒðïŠè€û—D®9¨sU³ºŠ p£¬ìã¤J–¹” ËçÏÒ·þŸÔ Ñ«¦ó² ŽTÅÎ/•iÖ ”1Ö¢» ´ M‚Ò=AªÊR›à Æç´¯ñ¾;Œ¨ Ò ªö:¥Ì ôÊ »“ÝK ®äþÅÍ ˆîe­¬‰§ÈJ¢<ùr„æù™îÜq ÂnšýÀ “®çóŒ$›„çÜÀà ƒ.[´æÀ÷¬¤£ýè¦×j™é fóg•.Óü½9€²®¯Ñ½‡ SÄ µî«€d ¡Áî±È¹Ð™ÕáóŽôÒßɘ §ôg’ÉQ›¾« ø—í’‡ƒË¶õ”úÒš²‘öq⤼î¦Ä÷òú‘ ì“õÂIÁ¹ ¦wß± ƒoßË«Ëáñ­äå·º¹Š²Ø&d«Íì蟒¢ Ê€ƒr™°é8ô’ àÞåÊŒàû¾xA -ü™uËÑþôݼ¨œâL¯ –€ÀÙ÷¨Ðb§Ð`Ö †£‡£ôðÍê­Ù}ý?é‚ǯ ±þ›ûœôR=Ü›ì¿ ~‡Õ±cè¨“j+Ô ß× ð×FÏáûõJÌ’— ‚nÆ »º¢Ò FÑòš—¾óôŽ$² ·­ ˆ ®{Šû%À‰ƒÆÝÓîmÚ ­±’… ¬cùÛ¡ŽÅâhÅ û?Ȫ¼³ã‹Î › – ¢…ƒ f‘¤¡àT[@øÉ•Ï¥‡Ÿþq"É « *ÔëáðN#xmµÀ”Ö*µüs¬Ñ²¿ä§••ë€Ô¡à߃ï$ùÙ(ÅœœÉÏc·Ô—1¤ Fä·ÖÑ ïл† ;’Ä‘ŠÛÞ蕻Nj ÍÏ -†ë#É=Û–˜Ü}ÚÉ ²˜ Ï­þª ½ˆ„­Ârا¾!æ >Œ†Ë±‹€®Œ¯š,ƒ Ë•Ï ñ¹Vû¨šŸØÀŠä¶ˆð©×샧ᑸ©ÇÈ—œŠÂ퟈áTÆ‹ÔÚ® ¿,Š˜Ú ¤ê2ñf싯ñ¬/*—Ⱥ‘ ¡“p2Ù <·|®Í­ÜÖ\¹Ó O†×ƒú䡸ÎÒ•Üæõ‘÷„w„œþ˜Æ™ PŸ… Ð ®ùæ놵°…øëÞcRœ KÙ¡ì¼:˜ëªévÄøüó¡ñƒÕ8#¨…ØŠ¤ž  Lù‹î$Ž%Š¤ˆÎ/¥‚Ï€U/†©£ÄÃ:äöØßÉÏ ›ýÔîàÌïÐ1ÕuÊ ¥ Éu@ᆫNý~kÐ ÚÇéÿòÛÀÌÁŒ¾ÔÄÍýêÛíÁ¸¥’øyäå4Ðçö›ìÖº­é›¥ùÍ#”ö§i§ß ®ˆ×€£¼ÆÏö¨ïý6šþ´˜50ÏAZ®¯ØϪÝïP ê*Ɔw‚N'…¼üãÑ݉ùå ÕÝŸó‹ËyŒàбøÇ÷{…šBœêͧ Ø3SÒòê´“ÿ‰Z£¾ÌÜ­ïýê³Dð솦øÏÈ唨øè7Ä¢‘íˆ »šù  ܯûZÚ.Ó¥âéÇ“ L©™=„‚”ìÝ{¬Ó^a¹åŽ¾’%Ñ —ÞÀ7wÕ‚Œ ×ȃò«ªþ¹ÿíãâ’ …<ÜÀ"ˆÇ Y˜€ŽºÞ³!‡ç®ê ‚ Ëk‰„æZîÌHJÑ¢ÆnØ× µ—° ›X¼ ë›ÕË…÷Ø ç—§öÐͽ:–’^„ Š†Vˆí²Ï+š__NES__crt0.s -ca65 V2.15 FT_DPCM_OFFFT_SFX_STREAMS_exit __STARTUP__initlibpush0popapopax_mainzerobsscopydata __RAM_START__ __RAM_SIZE____ROM0_START__ __ROM0_SIZE____STARTUP_LOAD____STARTUP_RUN____STARTUP_SIZE__ __CODE_LOAD__ __CODE_RUN__ __CODE_SIZE____RODATA_LOAD____RODATA_RUN____RODATA_SIZE__ -NES_MAPPER NES_PRG_BANKS NES_CHR_BANKS NES_MIRRORING zeropage.incspsregregsaveptr1ptr2ptr3ptr4tmp1tmp2tmp3tmp4regbank regbanksizezpspace zpsavespace FT_BASE_ADRPPU_CTRLPPU_MASK +ƒ2 “ +­’ +M’ +ò’ +’ +L’ +’ +¸’ +t’ +4’ +÷’ +¾’ +ˆ’ +V­&­ø­Î­¥­­[­9­­û­Þ­Ã­ªª’ª{ªfªRª?ª-ªª ªýªîªáªÔØÈؽزب؟ؖØØ…Ø~ØvØpØiëcë^ëXëSëOëJëFëBë>ë:ë7ë¼¼¼¼Ê%Ë +ƒ¶ô +ƒ‰ +ƒ¢Ì  ì㇠+ÔÆÏÐ ©ìø§ ‹ ©ø‹—«—«Ì¥Ì” ÌÕÌ ÙÇŒ +öœón›± ÌÆ„Áµ ÌÁ+¸’ƒ’„̸‘ƒc» ̸ƒ0® ̸ƒˆ¸Žƒüš¸ƒø渌ƒñ¿¸‹ƒçD¸Šƒâo–¸‰ƒÚ­–¸ˆƒÑæ–¸‡ƒ¹‚𸆃°Í 𸅃réð͸„ƒmB‰ƒƒ´Ç‹‚ƒ ׋¸ƒeÀ‹¸€ƒ5/ð¸ƒ0ð¸~ƒñ€› +¸}ƒáŠ +› +¸|ƒ®Âã +¸{ƒn̸zƒU9ä 1Œ¹ +¸yƒHƒþ¸xƒþ¸wƒÖ¤þ¸vƒÄÕ þ¸uƒ°œ¤ +¸tƒª÷¤ +¸sƒ¤€¤ +¸rƒ…ç¤ +¸qƒ.Å +¯ ¸pƒ%ʯ ¸oƒˆ¯ ¸nƒö +¯ ¸kƒm2… +¤ +¸gƒ¶²»þ¸fƒ>¹È¯ ¸eƒMc™¯ € +¸ ƒã¸ ½—?Ê”¥àÌ£ËdžÙ߅Э\ÜËÌÒþÃhà ÑÁÁmÃΟÒÛ ³‚ý×ֲͬàÜñV´E ö¦â«ˆù½°|Žçǯÿ¦þ¢éÍŒ§ÍöåÅWƒ¿ðÁúšý–å…¯Š(ªÄUÉ͎к„ÄGÚÚ‡€æì'µ¢ „k—½ú²© ½ð°ÈÑêÛÈÆŒ­ÅôÆ[ᨮ»à€í¬ÝËP—˜éŠôГ¯ô5„㪠̀ÎĸÔtêžÕ‘µO¢Öà¨Ð—K—̾ùô®äÓ‰e¶ÔMè‚°±í>£‡lH†7ò¸•‰z³èGÿ¤–‘÷Èћ󽦰R©¾Ê ‹ŠÏìû?õò~½ö­¡>ß_ôÕä"çÝ–)­oéÌ«”ñÞ¥÷̹ˆñ¦Éå…>ò“¦&½­ÊÀ¾§½Î’×HyÙøv ;­?s‰Þ¿Ù]¸ºí–<uËÙÍ´Éè´À·®Àÿ¨Þ™äâåœì³×`…ôä [œá•Ì_9€¡CÎ2õŸšÂ™ñïŸÁ‡æ¾+ÿ<¿x°•‡8Ó¦KîдJê`)–›ã}&ÏñIëØ¿L¿ŠBÛ‘ƒüQ¶÷ÿÕ“»£1¡ÐÁš¤áÔ‰lO¶­“©ˆŽ¿²¨……á·÷ô:ïÃì‚6üp¥ßó³ÁƧ'ŠqͱE‚ÇpºÆ³‹õ³ðº¶¸§¶]·÷à×%›æ¡Èד—ÍÆæ÷  ‰·Ú£Ëç¼é”ž ñ´Î±nµœÑ‚‰†ÿÒã’¼žÍÑþüÓÛÂË®G-õ„Úó5Œt±Ø·¯bþkÄÆŽ¸È’Ïÿ¥òÑ›ÆÃõëÊ•aÀãßè€D3=Ô‡„ìêæÅsUp\¬ìãðãóæá–ËçÏÇþœ´ŽÅ/¬1ÖT–¹M=ÄAÊÓ²áR›4²úç¾;¯¨«Äªö†™ÊØèÝ ä©U·§ò®Jù¯šâצöqûn“šç›Œ$ëXƒ.³æ¯À¿ñ²jQÉ•.^!ÚǹѤÖÂT4æòd‚¤ãi ˜¹¡îäÈ™ÅÚâ盥ŽßÉò“„« ´Ô°õúÒ–ž²©‘«q¤ö¦øòîùIwobè·Ë˼ø”౺©&ÉÍÁ’–¬ÏÞå¾®xµ«‚ürõ0ôݱœÇâL¾€¼ÙΘ¨ê舄£°‡ðЪî¶}·æïþ›=…î¿‹‡±c§úúú¨†“ß+{ßð5 +îûõXnºÄлéÔóÊ®”å%7ƒžÅ´@ÙÇåc¡È¯bŪƒ¼‹_üìíÚ™f‘à@Ϲ—¥ŸÜ*ˆµ#Äm’»”Ö®ð*ý¸à˜Ñ‡M•ƒÏ•èï$ÀŽ½(øœ™¼É1»F·°ÖÖØ¢Àس’Ĺš‚‹•ÛÞÛҙ͆ŽÁ¬ ˆÒžÐÏÈ¥a²Š³ŒÏ„‚§€ä”ç!£Yd¿­ç´‹Ì€,•¤Vûƒ¨ÈŸÊÂØ‚î„ŸŠ¶ð„á»Ç¬—üí”,˜€É÷ã¤ê2û‹I¸ø¬*—ȺÒÀ¡Œù Í­Ü‚¹ßóäƒæ¸ë¨•æ¢»wÑEÆäë€Ù⾺ùéÒý†"°ÜÞÊøëÞÆcRKD˜…évÔЩzÇ#Š’ÜË·åâ¤ïL‰¬$˜%¶ˆÎl/‚‚ÏH/©£ÌÓø:Ø×›ý¥ø›hîàïÅóuý†§@á†Í~þډ̌¾ÔýɸËâóÌçyÜÝ­4öñ °Íª#§µêìΧҞ®‹ïéúˆ¼Æ‹ñÕ¸66´¦0ˆöZº‹–¯ÏÁª½ž‘¬¶ù®P Ý‚‘ˆN'…ùÛ³ ÝŸÿ‹âŒ`ÇÄöŒÀÏœìá‘3„“‰Z€¤ïš,¼‡ä“Ê̆§)øè¹”m‘Víãí¹ÅÉ¥¢É«.âñ髱²™Ã¿ +{ÓaåŽÃüðßSÚðõÞÀ7w”Õ‚Q¼ôêû¹…Õ<ÜïâFÓY˜ëëÞ!Îê·ËŒÌJ’¦µ—¢‹ëŽ÷ï×ëç–‰åÂõ–û^ò¶Š†ˆhÕÈ+Ícrt0.sca65 V2.16 - Git 18b0aaf +NES_MAPPER NES_PRG_BANKS NES_CHR_BANKS NES_MIRRORING FT_DPCM_OFFFT_SFX_STREAMS_exit __STARTUP__initlibpush0popapopax_mainzerobsscopydata __RAM_START__ __RAM_SIZE____ROM0_START__ __ROM0_SIZE____STARTUP_LOAD____STARTUP_RUN____STARTUP_SIZE__ __CODE_LOAD__ __CODE_RUN__ __CODE_SIZE____RODATA_LOAD____RODATA_RUN____RODATA_SIZE__0/Users/sehugg/compilers/cc65/asminc/zeropage.incspsregregsaveptr1ptr2ptr3ptr4tmp1tmp2tmp3tmp4regbank regbanksizezpspace zpsavespacePPU_CTRLPPU_MASK PPU_STATUS PPU_OAM_ADDR PPU_OAM_DATA PPU_SCROLLPPU_ADDRPPU_DATA PPU_OAM_DMA PPU_FRAMECNTDMC_FREQ CTRL_PORT1 -CTRL_PORT2OAM_BUFPAL_BUF NTSC_MODE.size -FRAME_CNT1 -FRAME_CNT2 VRAM_UPDATE NAME_UPD_ADRNAME_UPD_ENABLE -PAL_UPDATE -PAL_BG_PTR PAL_SPR_PTRSCROLL_XSCROLL_Y SCROLL_X1 SCROLL_Y1 PAD_STATE +CTRL_PORT2OAM_BUFPAL_BUF FRAMECNT1 FRAMECNT2NTSCMODE +VRAMUPDATE PAD_STATE PAD_STATEP -PAD_STATET PPU_CTRL_VAR PPU_CTRL_VAR1 PPU_MASK_VAR RAND_SEEDFT_TEMPTEMPPAD_BUFPTRLENNEXTSPRSCRXSCRYSRCDSTRLE_LOWRLE_HIGHRLE_TAGRLE_BYTEstartinitPPU@1@2 clearPalette clearVRAMclearRAM _pal_bright +PAD_STATETFT_TEMPSCROLL_XSCROLL_Y PPU_CTRL_VAR PPU_MASK_VAR NAME_UPD_ADR NAME_UPD_LENPAL_PTR RAND_SEED PALUPDATETEMPPAD_BUFPTRLENNEXTSPRSCRXSCRYSRCDSTRLE_LOWRLE_HIGHRLE_TAGRLE_BYTE FT_BASE_ADR FT_DPCM_PTRstart.size waitSync1@1 clearPalette clearVRAMclearRAM _pal_bright _pal_clear -_oam_clear waitSync3 -detectNTSC_ppu_off -music_data FamiToneInit sounds_dataFamiToneSfxInit display.sinc_oam_off_oam_clear_fast_oam_meta_spr_pal@3SPR_XOFFSPR_YOFF_oam_meta_spr_clip@skip neslib.sinc_pal_all_pal_bg_pal_spr_pal_col_pal_spr_bright_pal_bg_bright _ppu_on_all -_ppu_on_bg _ppu_on_spr _ppu_mask _ppu_system _oam_size_oam_spr _oam_meta_spr_oam_hide_rest_ppu_wait_frame _ppu_wait_nmi_scroll_split _bank_spr_bank_bg -_vram_read _vram_write _music_play _music_stop _music_pause _sfx_play _sample_play _pad_poll _pad_trigger -_pad_state_rand8_rand16 _set_rand _vram_adr _vram_put -_vram_fill _vram_inc _vram_unrle_set_vram_update_flush_vram_update_memfill_delay_get_ppu_ctrl_var_set_ppu_ctrl_var _nesclocknmi @doUpdate@skipAll@updPal@updVRAM@skipUpd_flush_vram_update_nmi @skipNtscFamiToneUpdateirqpal_copy@0palBrightTableLpalBrightTableH ppu_onoff@11@4@21FamiToneMusicPlayFamiToneMusicStopFamiToneMusicPause @sfxPriorityFamiToneSfxPlay +_oam_clear waitSync2 waitSync3 +detectNTSC_ppu_off FamiToneInitneslib.s_pal_all_pal_bg_pal_spr_pal_col _ppu_on_all +_ppu_on_bg _ppu_on_spr _ppu_mask _oam_size_oam_spr _oam_meta_spr_oam_hide_rest _ppu_waitnmi _unrle_vram_scroll _bank_spr_bank_bg +_vram_read _vram_write _music_play _music_stop _music_pause _sfx_play _pad_poll _pad_trigger +_pad_state_rand8_rand16 _set_rand_set_vram_update _vram_adr _vram_put +_vram_fill _vram_inc_memcpy_memfill_delaynmi@upd@skipUpd@palupd@upd1@updName @skipNtscFamiToneUpdateirqpal_copy@0palBrightTable ppu_onoff@2@3@11@4@21FamiToneMusicStartFamiToneMusicStopFamiToneMusicPause @sfxPriority FT_SFX_CH0 FT_SFX_CH1 FT_SFX_CH2 -FT_SFX_CH3 @padPollPort @padPollLoop@donerand1rand2@updName -@updNotSeq @updHorzSeq@updDone @updVertSeq @updNameSeq @updNameLoop@5palBrightTable0palBrightTable1palBrightTable2palBrightTable3palBrightTable4palBrightTable5palBrightTable6palBrightTable7palBrightTable8famitone2.sinc FT_PITCH_FIX FT_DPCM_PTR FT_TEMP_PTR FT_TEMP_PTR_L FT_TEMP_PTR_H FT_TEMP_VAR1FT_ENVELOPES_ALLFT_ENV_STRUCT_SIZE FT_ENV_VALUE FT_ENV_REPEAT FT_ENV_ADR_L FT_ENV_ADR_H -FT_ENV_PTRFT_CHANNELS_ALLFT_CHN_STRUCT_SIZE FT_CHN_PTR_L FT_CHN_PTR_H FT_CHN_NOTEFT_CHN_INSTRUMENT FT_CHN_REPEATFT_CHN_RETURN_LFT_CHN_RETURN_HFT_CHN_REF_LEN FT_CHN_DUTY FT_ENVELOPES FT_CH1_ENVS FT_CH2_ENVS FT_CH3_ENVS FT_CH4_ENVS FT_CHANNELS FT_CH1_VARS FT_CH2_VARS FT_CH3_VARS FT_CH4_VARS FT_CH5_VARS FT_CH1_NOTE FT_CH2_NOTE FT_CH3_NOTE FT_CH4_NOTE FT_CH5_NOTEFT_CH1_INSTRUMENTFT_CH2_INSTRUMENTFT_CH3_INSTRUMENTFT_CH4_INSTRUMENTFT_CH5_INSTRUMENT FT_CH1_DUTY FT_CH2_DUTY FT_CH3_DUTY FT_CH4_DUTY FT_CH5_DUTY FT_CH1_VOLUME FT_CH2_VOLUME FT_CH3_VOLUME FT_CH4_VOLUMEFT_CH1_NOTE_OFFFT_CH2_NOTE_OFFFT_CH3_NOTE_OFFFT_CH4_NOTE_OFFFT_CH1_PITCH_OFFFT_CH2_PITCH_OFFFT_CH3_PITCH_OFFFT_VARS FT_PAL_ADJUSTFT_SONG_LIST_LFT_SONG_LIST_HFT_INSTRUMENT_LFT_INSTRUMENT_HFT_TEMPO_STEP_LFT_TEMPO_STEP_HFT_TEMPO_ACC_LFT_TEMPO_ACC_H FT_SONG_SPEEDFT_PULSE1_PREVFT_PULSE2_PREVFT_DPCM_LIST_LFT_DPCM_LIST_HFT_DPCM_EFFECT -FT_OUT_BUF FT_SFX_ADR_L FT_SFX_ADR_HFT_SFX_BASE_ADRFT_SFX_STRUCT_SIZE FT_SFX_REPEAT FT_SFX_PTR_L FT_SFX_PTR_H -FT_SFX_OFF -FT_SFX_BUF APU_PL1_VOL APU_PL1_SWEEP +FT_SFX_CH3 @padPollPort @padPollLoop@donerand1rand2@5 +famitone.s APU_PL1_VOL APU_PL1_SWEEP APU_PL1_LO APU_PL1_HI APU_PL2_VOL APU_PL2_SWEEP APU_PL2_LO APU_PL2_HIAPU_TRI_LINEAR APU_TRI_LO -APU_TRI_HI APU_NOISE_VOL APU_NOISE_LO APU_NOISE_HI APU_DMC_FREQ APU_DMC_RAW APU_DMC_START APU_DMC_LEN APU_SND_CHNFT_MR_PULSE1_VFT_MR_PULSE1_LFT_MR_PULSE1_HFT_MR_PULSE2_VFT_MR_PULSE2_LFT_MR_PULSE2_H FT_MR_TRI_V FT_MR_TRI_L FT_MR_TRI_H FT_MR_NOISE_V FT_MR_NOISE_F@pal @set_channels@set_envelopes_FT2DummyEnvelopeFamiToneSampleStop@unpause@pause@update @update_sound @update_row@update_envelopes_FT2ChannelUpdate @no_new_note1_FT2SetInstrument @no_new_note2 @no_new_note3 @no_new_note4 @env_process @env_read @env_next@env_read_value @env_special@env_next_store_ptr@env_set_repeat@ch1cut_FT2NoteTableLSB@ch1sign_FT2NoteTableMSB@ch1prev@ch2cut@ch2sign@ch2prev@ch3cut@ch3sign@ch4cut _FT2SfxUpdate@no_pulse1_upd@no_pulse2_upd @no_pitch -@no_repeat @no_repeat_r -@read_byte @no_inc_ptr1 @special_code @no_empty_row@set_empty_rows @set_repeat -@set_speed @set_loop@set_reference@no_ref@ntsc_FT2SfxClearChannel @update_buf @sfx_active @get_data@eof -@no_pulse1 -@no_pulse2 @no_triangle @no_noiseCODERODATABSSDATAZEROPAGENULLHEADERSTARTUPSAMPLESVECTORS; Startup code for cc65 and Shiru's NES library -; based on code by Groepaz/Hitmen , Ullrich von Bassewitz - - -FT_DPCM_OFF = $c000 ;$c000..$ffc0, 64-byte steps -FT_SFX_STREAMS = 4 ;number of sound effects played at once, 1..4 - -.define FT_DPCM_ENABLE 0 ;undefine to exclude all DMC code -.define FT_SFX_ENABLE 1 ;undefine to exclude all sound effects code - - - - .export _exit,__STARTUP__:absolute=1 - .import initlib,push0,popa,popax,_main,zerobss,copydata - - ; Linker generated symbols - .import __RAM_START__ ,__RAM_SIZE__ - .import __ROM0_START__ ,__ROM0_SIZE__ - .import __STARTUP_LOAD__,__STARTUP_RUN__,__STARTUP_SIZE__ - .import __CODE_LOAD__ ,__CODE_RUN__ ,__CODE_SIZE__ - .import __RODATA_LOAD__ ,__RODATA_RUN__ ,__RODATA_SIZE__ - .import NES_MAPPER,NES_PRG_BANKS,NES_CHR_BANKS,NES_MIRRORING - - .include "zeropage.inc" - - - -FT_BASE_ADR =$0100 ;page in RAM, should be $xx00 - -.define FT_THREAD 1 ;undefine if you call sound effects in the same thread as sound update -.define FT_PAL_SUPPORT 1 ;undefine to exclude PAL support -.define FT_NTSC_SUPPORT 1 ;undefine to exclude NTSC support - - -PPU_CTRL =$2000 -PPU_MASK =$2001 -PPU_STATUS =$2002 -PPU_OAM_ADDR =$2003 -PPU_OAM_DATA =$2004 -PPU_SCROLL =$2005 -PPU_ADDR =$2006 -PPU_DATA =$2007 -PPU_OAM_DMA =$4014 -PPU_FRAMECNT =$4017 -DMC_FREQ =$4010 -CTRL_PORT1 =$4016 -CTRL_PORT2 =$4017 - -OAM_BUF =$0200 -PAL_BUF =$01c0 - - - -.segment "ZEROPAGE" - -NTSC_MODE: .res 1 -FRAME_CNT1: .res 1 -FRAME_CNT2: .res 1 -VRAM_UPDATE: .res 1 -NAME_UPD_ADR: .res 2 -NAME_UPD_ENABLE: .res 1 -PAL_UPDATE: .res 1 -PAL_BG_PTR: .res 2 -PAL_SPR_PTR: .res 2 -SCROLL_X: .res 1 -SCROLL_Y: .res 1 -SCROLL_X1: .res 1 -SCROLL_Y1: .res 1 -PAD_STATE: .res 2 ;one byte per controller -PAD_STATEP: .res 2 -PAD_STATET: .res 2 -PPU_CTRL_VAR: .res 1 -PPU_CTRL_VAR1: .res 1 -PPU_MASK_VAR: .res 1 -RAND_SEED: .res 2 -FT_TEMP: .res 3 - -TEMP: .res 11 - -PAD_BUF =TEMP+1 - -PTR =TEMP ;word -LEN =TEMP+2 ;word -NEXTSPR =TEMP+4 -SCRX =TEMP+5 -SCRY =TEMP+6 -SRC =TEMP+7 ;word -DST =TEMP+9 ;word - -RLE_LOW =TEMP -RLE_HIGH =TEMP+1 -RLE_TAG =TEMP+2 -RLE_BYTE =TEMP+3 - - - -.segment "HEADER" - - .byte $4e,$45,$53,$1a - .byte (__RAM_START__+__RAM_SIZE__) - sta sp+1 ; Set argument stack ptr - - jsr initlib - - lda #%10000000 - sta music_data - lda sounds_data - jsr FamiToneSfxInit -.endif - - lda #$fd - sta