From 1e44d055361394cf2b3c8184ec6314463ca41e54 Mon Sep 17 00:00:00 2001 From: Steven Hugg Date: Sun, 10 Mar 2019 12:17:12 -0400 Subject: [PATCH] nes: updated presets --- doc/notes.txt | 3 +- presets/nes/attributes.c | 33 ++++++---------- presets/nes/climbr_title.s | 79 ++++++++++++++++++++++++++++++++++++++ presets/nes/ex4.asm | 37 +++++++++--------- presets/nes/hello.c | 64 ++++++++++++------------------ presets/nes/neslib1.c | 34 ---------------- presets/nes/neslib5.c | 55 -------------------------- presets/nes/nesppu.asm | 21 +++++----- presets/nes/ppuhello.c | 48 +++++++++++++++++++++++ presets/nes/rletitle.c | 49 +++++++++++++++++++++++ presets/nes/siegegame.c | 10 +++-- presets/nes/vrambuf.c | 2 +- presets/nes/vrambuf.h | 12 ++++-- presets/nes/vrambuffer.c | 2 +- src/platform/nes.ts | 5 ++- src/ui.ts | 1 + tss | 2 +- 17 files changed, 265 insertions(+), 192 deletions(-) create mode 100644 presets/nes/climbr_title.s delete mode 100644 presets/nes/neslib1.c delete mode 100644 presets/nes/neslib5.c create mode 100644 presets/nes/ppuhello.c create mode 100644 presets/nes/rletitle.c diff --git a/doc/notes.txt b/doc/notes.txt index e47d9a06..c1c79489 100644 --- a/doc/notes.txt +++ b/doc/notes.txt @@ -97,7 +97,8 @@ TODO: - NES: disassembly not aligned on PC - NES: vrambuf.c for Solarian - game starts even if switched away before first load - +- vcs: break on # of lines changed (maybe using getRasterPosition?) +- profiler restarts when paused WEB WORKER FORMAT diff --git a/presets/nes/attributes.c b/presets/nes/attributes.c index 639c7bf8..d9251d08 100644 --- a/presets/nes/attributes.c +++ b/presets/nes/attributes.c @@ -3,19 +3,15 @@ #include #include -// link the pattern table into PRG ROM -// we'll write it into CHR RAM on startup +// link the pattern table into CHR ROM +//#link "chr_generic.s" -//#link "jroatch.c" -extern unsigned char jroatch_chr[0x1000]; -#define PATTERN_TABLE jroatch_chr - -// palette for balls, there are four sets for different ball colors -const unsigned char bg_palette[16]={/*{pal:"nes",n:4,sets:4}*/ - 0x0f,0x17,0x27,0x37, - 0x0f,0x11,0x21,0x31, - 0x0f,0x15,0x25,0x35, - 0x0f,0x19,0x29,0x39 +const char PALETTE[16] = { + 0x03, + 0x11,0x30,0x27, 0, + 0x1c,0x20,0x2c, 0, + 0x00,0x10,0x20, 0, + 0x06,0x16,0x26 }; // convert nametable address to attribute address @@ -63,7 +59,8 @@ void color_demo(void) { while (1) { char x = rand() & 0x3f; char y = rand() & 0x3f; - put_pixel(x, y, 2); + char color = rand() & 3; + put_pixel(x, y, color); // reset scroll position vram_adr(0); } @@ -94,16 +91,8 @@ void color_demo1(void) { // main function, run after console reset void main(void) { - // copy pattern table to PRG RAM - vram_adr(0x0); - vram_write((unsigned char*)PATTERN_TABLE, sizeof(PATTERN_TABLE)); - - // clear name tables - vram_adr(0x2000); - vram_fill(0, 0x800); - // set palette colors - pal_bg(bg_palette); + pal_bg(PALETTE); // enable PPU rendering (turn on screen) ppu_on_all(); diff --git a/presets/nes/climbr_title.s b/presets/nes/climbr_title.s new file mode 100644 index 00000000..94941dcb --- /dev/null +++ b/presets/nes/climbr_title.s @@ -0,0 +1,79 @@ +.export _climbr_title_pal +.export _climbr_title_rle + +_climbr_title_pal: + .byte $0f,$11,$25,$35,$0f,$01,$21,$30 + .byte $0f,$06,$1c,$3c,$0f,$11,$28,$38 +_climbr_title_rle: + .byte $01,$00,$01,$10,$80,$01,$02,$00 + .byte $80,$00,$80,$00,$01,$1f,$80,$80 + .byte $00,$01,$07,$41,$4e,$00,$38,$42 + .byte $49,$54,$57,$4f,$52,$4b,$53,$48 + .byte $4f,$50,$00,$47,$41,$4d,$45,$00 + .byte $01,$02,$80,$00,$01,$1d,$7f,$7f + .byte $80,$00,$01,$1c,$8f,$7f,$80,$00 + .byte $01,$06,$80,$01,$0b,$00,$01,$09 + .byte $80,$8f,$80,$00,$01,$09,$7f,$01 + .byte $02,$80,$01,$02,$7f,$7f,$80,$01 + .byte $02,$00,$ba,$bb,$00,$01,$02,$80 + .byte $00,$8f,$80,$01,$03,$00,$80,$80 + .byte $00,$01,$03,$7f,$7f,$8f,$8f,$7f + .byte $7f,$80,$7f,$7f,$80,$01,$03,$be + .byte $bf,$80,$00,$00,$80,$01,$04,$00 + .byte $80,$01,$03,$00,$01,$02,$7f,$7f + .byte $8f,$80,$80,$8f,$8f,$00,$7f,$7f + .byte $80,$7f,$7f,$80,$7f,$7f,$80,$7f + .byte $00,$7f,$00,$80,$80,$7f,$7f,$80 + .byte $7f,$00,$80,$00,$00,$7f,$01,$02 + .byte $80,$01,$02,$00,$01,$02,$7f,$7f + .byte $80,$8f,$8f,$80,$7f,$01,$06,$80 + .byte $80,$7f,$01,$02,$8f,$80,$80,$00 + .byte $00,$7f,$01,$02,$80,$01,$02,$00 + .byte $01,$02,$7f,$7f,$80,$80,$00,$80 + .byte $7f,$7f,$8f,$7f,$8f,$7f,$7f,$80 + .byte $80,$7f,$7f,$8f,$80,$80,$00,$01 + .byte $02,$7f,$01,$02,$80,$01,$02,$00 + .byte $01,$02,$7f,$7f,$80,$7f,$7f,$80 + .byte $7f,$7f,$80,$7f,$80,$7f,$7f,$80 + .byte $80,$7f,$7f,$80,$01,$02,$00,$01 + .byte $02,$7f,$01,$02,$80,$01,$02,$00 + .byte $01,$02,$7f,$7f,$80,$7f,$7f,$80 + .byte $7f,$7f,$80,$7f,$80,$7f,$7f,$80 + .byte $80,$7f,$7f,$80,$80,$00,$01,$03 + .byte $7f,$01,$02,$00,$80,$01,$04,$7f + .byte $7f,$80,$7f,$7f,$80,$7f,$7f,$80 + .byte $7f,$80,$7f,$7f,$80,$80,$7f,$7f + .byte $80,$80,$00,$01,$03,$8f,$7f,$7f + .byte $00,$80,$01,$04,$7f,$7f,$80,$7f + .byte $7f,$80,$7f,$7f,$80,$7f,$80,$7f + .byte $7f,$80,$80,$7f,$7f,$80,$80,$00 + .byte $01,$04,$8f,$7f,$7f,$00,$00,$7f + .byte $7f,$80,$8f,$8f,$80,$8f,$8f,$80 + .byte $8f,$8f,$80,$8f,$00,$8f,$8f,$80 + .byte $00,$8f,$8f,$80,$80,$00,$01,$05 + .byte $8f,$7f,$01,$03,$8f,$00,$01,$05 + .byte $90,$80,$80,$00,$80,$00,$80,$00 + .byte $00,$80,$01,$02,$00,$80,$00,$01 + .byte $06,$8f,$01,$03,$00,$01,$02,$a1 + .byte $01,$13,$00,$01,$0a,$ac,$a1,$01 + .byte $13,$00,$01,$09,$ac,$ac,$20,$01 + .byte $03,$00,$01,$18,$ac,$ac,$00,$06 + .byte $01,$12,$00,$01,$08,$ac,$ac,$00 + .byte $00,$06,$00,$01,$10,$06,$00,$01 + .byte $07,$ac,$ac,$00,$01,$02,$06,$00 + .byte $1f,$00,$50,$52,$45,$53,$53,$00 + .byte $53,$54,$41,$52,$54,$00,$1e,$00 + .byte $06,$00,$01,$06,$ac,$ac,$00,$01 + .byte $03,$06,$00,$01,$10,$06,$00,$01 + .byte $05,$ac,$ac,$00,$01,$04,$06,$01 + .byte $12,$00,$01,$04,$ac,$ac,$00,$01 + .byte $1c,$ac,$ac,$00,$01,$1c,$ac,$ac + .byte $00,$01,$1c,$ac,$ac,$00,$01,$1c + .byte $ac,$ac,$00,$01,$1d,$80,$a0,$01 + .byte $03,$20,$00,$01,$02,$a0,$20,$00 + .byte $f0,$00,$01,$02,$88,$22,$02,$00 + .byte $01,$04,$88,$22,$20,$00,$01,$05 + .byte $0a,$02,$00,$01,$07,$d5,$55,$01 + .byte $02,$75,$00,$01,$02,$55,$01,$04 + .byte $00,$01,$02,$05,$01,$03,$05,$01 + .byte $00 diff --git a/presets/nes/ex4.asm b/presets/nes/ex4.asm index 14f1b748..cd1efc13 100644 --- a/presets/nes/ex4.asm +++ b/presets/nes/ex4.asm @@ -69,34 +69,33 @@ SetPalette: subroutine ;;;;; INTERRUPT HANDLERS NMIHandler: - SAVE_REGS + SAVE_REGS ; save registers ; update scroll position (must be done after VRAM updates) - jsr ReadJoypad - pha - and #$03 - tay - lda ScrollDirTab,y + jsr ReadJoypad0 ; read first controller + pha ; push joypad bitmask + and #$03 ; only keep first 2 bits + tay ; A -> Y + lda ScrollDirTab,y ; lookup table clc - adc ScrollX - sta ScrollX - sta PPU_SCROLL - pla + adc ScrollX ; A = A + ScrollX + sta ScrollX ; -> ScrollX + sta PPU_SCROLL ; -> first scroll byte + pla ; pop joypad bitmask lsr lsr - and #$03 - tay - lda ScrollDirTab,y + and #$03 ; take next two bits + tay + lda ScrollDirTab,y ; do another lookup clc - adc ScrollY - sta ScrollY - sta PPU_SCROLL -; reload registers - RESTORE_REGS + adc ScrollY ; A = A + ScrollY + sta ScrollY ; -> ScrollY + sta PPU_SCROLL ; -> second scroll byte + RESTORE_REGS ; restore registers rti ; Scroll direction lookup table ScrollDirTab: - hex 00 01 ff 00 + hex 00 01 ff 00 ; 0,1,-1,0 ;;;;; CONSTANT DATA diff --git a/presets/nes/hello.c b/presets/nes/hello.c index eb42215f..8f6e14b8 100644 --- a/presets/nes/hello.c +++ b/presets/nes/hello.c @@ -1,48 +1,34 @@ -#include +#include "neslib.h" +#include -const unsigned char TEXT[]="Hello PPU!!!!"; +// link the pattern table into CHR ROM +//#link "chr_generic.s" -const unsigned char PALETTE[]={0x1, 0x00, 0x10, 0x20}; // blue, gray, lt gray, white +// function to write a string into the name table +// adr = start address in name table +// str = pointer to string +void put_str(unsigned int adr, const char *str) { + vram_adr(adr); // set PPU read/write address + vram_write(str, strlen(str)); // write bytes to PPU +} -void main (void) { - unsigned char index; // used in 'for' loops +// main function, run after console reset +void main(void) { + // set palette colors + pal_col(1,0x04); + pal_col(2,0x20); + pal_col(3,0x30); - // if we've just powered on, - // wait for PPU to warm-up - waitvsync(); - waitvsync(); + // write text to name table + put_str(NTADR_A(2,2),"HELLO, WORLD!"); + put_str(NTADR_A(2,4),"THIS CODE PRINTS SOME TEXT"); + put_str(NTADR_A(2,5),"USING ASCII-ENCODED CHARACTER"); + put_str(NTADR_A(2,6),"SET WITH CAPITAL LETTERS ONLY"); - // turn off screen - PPU.control = 0x0; // NMI off - PPU.mask = 0x0; // screen off - - // load the palette - // set PPU address to 0x3f00 - PPU.vram.address = 0x3f; - PPU.vram.address = 0x00; - for (index = 0; index < sizeof(PALETTE); index++) { - PPU.vram.data = PALETTE[index]; - } - - // load the text into VRAM - // set PPU address to 0x21c9 - PPU.vram.address = 0x21; - PPU.vram.address = 0xc9; - for (index = 0; index < sizeof(TEXT); index++) { - PPU.vram.data = TEXT[index]; - } - - // reset the scroll position to 0 - PPU.scroll = 0; - PPU.scroll = 0; - // reset the PPU address to 0x2000 (frame start) - PPU.vram.address = 0x20; - PPU.vram.address = 0x00; - - // turn on the screen - PPU.mask = 0x1e; + // enable PPU rendering (turn on screen) + ppu_on_all(); // infinite loop - while (1); + while (1) ; } diff --git a/presets/nes/neslib1.c b/presets/nes/neslib1.c deleted file mode 100644 index 8f6e14b8..00000000 --- a/presets/nes/neslib1.c +++ /dev/null @@ -1,34 +0,0 @@ - -#include "neslib.h" -#include - -// link the pattern table into CHR ROM -//#link "chr_generic.s" - -// function to write a string into the name table -// adr = start address in name table -// str = pointer to string -void put_str(unsigned int adr, const char *str) { - vram_adr(adr); // set PPU read/write address - vram_write(str, strlen(str)); // write bytes to PPU -} - -// main function, run after console reset -void main(void) { - // set palette colors - pal_col(1,0x04); - pal_col(2,0x20); - pal_col(3,0x30); - - // write text to name table - put_str(NTADR_A(2,2),"HELLO, WORLD!"); - put_str(NTADR_A(2,4),"THIS CODE PRINTS SOME TEXT"); - put_str(NTADR_A(2,5),"USING ASCII-ENCODED CHARACTER"); - put_str(NTADR_A(2,6),"SET WITH CAPITAL LETTERS ONLY"); - - // enable PPU rendering (turn on screen) - ppu_on_all(); - - // infinite loop - while (1) ; -} diff --git a/presets/nes/neslib5.c b/presets/nes/neslib5.c deleted file mode 100644 index f6d428f6..00000000 --- a/presets/nes/neslib5.c +++ /dev/null @@ -1,55 +0,0 @@ - -//this example code unpacks a RLE'd nametable into the VRAM -//you can create the source data using NES Screen Tool - -#include "neslib.h" - -const unsigned char test[308]={ -0x01,0x00,0x01,0xa3,0x10,0x01,0x04,0x00,0x10,0x01,0x04,0x00,0x10,0x01,0x04,0x00, -0x10,0x01,0x04,0x00,0x01,0x0a,0x10,0x00,0x01,0x02,0x10,0x00,0x01,0x04,0x10,0x00, -0x01,0x06,0x10,0x00,0x01,0x0c,0x10,0x00,0x01,0x02,0x10,0x01,0x02,0x00,0x01,0x02, -0x10,0x01,0x04,0x00,0x01,0x02,0x10,0x00,0x01,0x0c,0x10,0x00,0x01,0x02,0x10,0x00, -0x01,0x08,0x10,0x00,0x01,0x02,0x10,0x00,0x01,0x0c,0x10,0x00,0x01,0x02,0x10,0x01, -0x04,0x00,0x10,0x01,0x04,0x00,0x01,0x02,0x10,0x00,0x01,0x42,0x10,0x00,0x01,0x06, -0x10,0x01,0x04,0x00,0x10,0x00,0x01,0x04,0x10,0x01,0x04,0x00,0x10,0x00,0x01,0x04, -0x10,0x00,0x01,0x06,0x10,0x00,0x01,0x02,0x10,0x00,0x10,0x00,0x01,0x04,0x10,0x00, -0x01,0x06,0x10,0x01,0x04,0x00,0x01,0x06,0x10,0x00,0x01,0x02,0x10,0x00,0x10,0x00, -0x01,0x04,0x10,0x01,0x02,0x00,0x01,0x04,0x10,0x00,0x01,0x02,0x10,0x00,0x01,0x06, -0x10,0x01,0x03,0x00,0x00,0x10,0x00,0x01,0x04,0x10,0x00,0x01,0x06,0x10,0x00,0x01, -0x02,0x10,0x00,0x01,0x06,0x10,0x00,0x01,0x02,0x10,0x00,0x10,0x01,0x04,0x00,0x10, -0x01,0x04,0x00,0x01,0x02,0x10,0x01,0x04,0x00,0x01,0x46,0x10,0x00,0x01,0x02,0x10, -0x00,0x10,0x01,0x04,0x00,0x10,0x01,0x04,0x00,0x01,0x0e,0x10,0x10,0x00,0x10,0x10, -0x00,0x10,0x00,0x01,0x02,0x10,0x00,0x10,0x00,0x01,0x02,0x10,0x00,0x01,0x0e,0x10, -0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x01,0x02,0x10,0x00,0x10,0x00,0x01,0x02,0x10, -0x00,0x01,0x0e,0x10,0x00,0x01,0x02,0x10,0x00,0x10,0x01,0x04,0x00,0x10,0x01,0x04, -0x00,0x01,0x0e,0x10,0x00,0x01,0x02,0x10,0x00,0x10,0x00,0x01,0x02,0x10,0x00,0x10, -0x00,0x01,0xde,0x50,0x01,0x07,0x55,0x01,0x07,0xa5,0x01,0x07,0xaa,0x01,0x0f,0x0a, -0x01,0x07,0x01,0x00 -}; - -const unsigned char palette[16]={ 0x0f,0x21,0x10,0x30,0x0f,0x14,0x21,0x31,0x0f,0x29,0x16,0x26,0x0f,0x09,0x19,0x29 }; //palette data - -//#link "tileset1.c" - -// tile set, two planes for 4 colors -extern unsigned char TILESET[8*256]; - - -void main(void) -{ - //rendering is disabled at the startup, and palette is all black - pal_bg(palette);//set background palette from an array - - //copy tileset to RAM - vram_adr(0x0); - vram_write((unsigned char*)TILESET, sizeof(TILESET)); - - //unpack nametable into the VRAM - vram_adr(0x2000); - vram_unrle(test); - - //enable rendering - ppu_on_all(); - - while(1);//do nothing, infinite loop -} diff --git a/presets/nes/nesppu.asm b/presets/nes/nesppu.asm index 20462c5d..4ca893d6 100644 --- a/presets/nes/nesppu.asm +++ b/presets/nes/nesppu.asm @@ -44,18 +44,21 @@ PrevRandom subroutine ;;;;; CONTROLLER READING -ReadJoypad subroutine +ReadJoypad0 subroutine + ldy #0 +ReadJoypadY lda #$01 - sta JOYPAD1 ; set strobe bit - tax ; X = 1 + sta JOYPAD1,y ; set strobe bit lsr ; now A is 0 - sta JOYPAD1 ; clear strobe bit + sta JOYPAD1,y ; clear strobe bit + ldx #8 ; read 8 bits .loop: - lda JOYPAD1 ; load controller state + pha ; save A (result) + lda JOYPAD1,y ; load controller state lsr ; bit 0 -> carry - txa ; X -> A - rol ; carry -> bit 0 of result, bit 7 -> carry - tax ; A -> X - bcc .loop ; repeat until 1 shifted out + pla ; restore A (result) + rol ; carry -> bit 0 of result + dex ; X = X - 1 + bne .loop ; repeat if X is 0 rts ; controller bits returned in A diff --git a/presets/nes/ppuhello.c b/presets/nes/ppuhello.c new file mode 100644 index 00000000..eb42215f --- /dev/null +++ b/presets/nes/ppuhello.c @@ -0,0 +1,48 @@ + +#include + +const unsigned char TEXT[]="Hello PPU!!!!"; + +const unsigned char PALETTE[]={0x1, 0x00, 0x10, 0x20}; // blue, gray, lt gray, white + +void main (void) { + unsigned char index; // used in 'for' loops + + // if we've just powered on, + // wait for PPU to warm-up + waitvsync(); + waitvsync(); + + // turn off screen + PPU.control = 0x0; // NMI off + PPU.mask = 0x0; // screen off + + // load the palette + // set PPU address to 0x3f00 + PPU.vram.address = 0x3f; + PPU.vram.address = 0x00; + for (index = 0; index < sizeof(PALETTE); index++) { + PPU.vram.data = PALETTE[index]; + } + + // load the text into VRAM + // set PPU address to 0x21c9 + PPU.vram.address = 0x21; + PPU.vram.address = 0xc9; + for (index = 0; index < sizeof(TEXT); index++) { + PPU.vram.data = TEXT[index]; + } + + // reset the scroll position to 0 + PPU.scroll = 0; + PPU.scroll = 0; + // reset the PPU address to 0x2000 (frame start) + PPU.vram.address = 0x20; + PPU.vram.address = 0x00; + + // turn on the screen + PPU.mask = 0x1e; + + // infinite loop + while (1); +} diff --git a/presets/nes/rletitle.c b/presets/nes/rletitle.c new file mode 100644 index 00000000..e248f485 --- /dev/null +++ b/presets/nes/rletitle.c @@ -0,0 +1,49 @@ + +// this example code unpacks a RLE'd nametable into the VRAM +// you can create the source data using NES Screen Tool + +#include "neslib.h" + +extern const byte climbr_title_pal[16]; +extern const byte climbr_title_rle[]; + +// link the pattern table into CHR ROM +//#link "chr_generic.s" + +// link title screen palette and RLE nametable +//#link "climbr_title.s" + + +void fade_in() { + byte vb; + for (vb=0; vb<=4; vb++) { + // set virtual bright vaule + pal_bright(vb); + // wait for 4/60 sec + ppu_wait_frame(); + ppu_wait_frame(); + ppu_wait_frame(); + ppu_wait_frame(); + } +} + +void show_title_screen(const byte* pal, const byte* rle) { + // disable rendering + ppu_off(); + // set palette, virtual bright to 0 (total black) + pal_bg(pal); + pal_bright(0); + // unpack nametable into the VRAM + vram_adr(0x2000); + vram_unrle(rle); + // enable rendering + ppu_on_all(); + // fade in from black + fade_in(); +} + +void main(void) +{ + show_title_screen(climbr_title_pal, climbr_title_rle); + while(1);//do nothing, infinite loop +} diff --git a/presets/nes/siegegame.c b/presets/nes/siegegame.c index 6fd3e14a..41f05efd 100644 --- a/presets/nes/siegegame.c +++ b/presets/nes/siegegame.c @@ -26,14 +26,16 @@ byte getchar(byte x, byte y) { word addr = NTADR_A(x,y); byte rd; // wait for VBLANK to start - ppu_wait_nmi(); + ppu_wait_frame(); + // set vram address and read byte vram_adr(addr); vram_read(&rd, 1); + // scroll registers are corrupt + // fix by setting vram address vram_adr(0x0); - return rd + 0x20; + return rd; } - void cputcxy(byte x, byte y, char ch) { putbytes(NTADR_A(x,y), &ch, 1); } @@ -137,7 +139,7 @@ void move_player(Player* p) { cputcxy(p->x, p->y, p->tail_attr); p->x += DIR_X[p->dir]; p->y += DIR_Y[p->dir]; - if (getchar(p->x, p->y) != ' ') + if (getchar(p->x, p->y) != 0) p->collided = 1; draw_player(p); } diff --git a/presets/nes/vrambuf.c b/presets/nes/vrambuf.c index d76ed134..e486e76a 100644 --- a/presets/nes/vrambuf.c +++ b/presets/nes/vrambuf.c @@ -7,7 +7,7 @@ byte updptr = 0; // add EOF marker to buffer (but don't increment pointer) void cendbuf(void) { - updbuf[updptr] = NT_UPD_EOF; + VRAMBUF_SET(NT_UPD_EOF); } // clear vram buffer and place EOF marker diff --git a/presets/nes/vrambuf.h b/presets/nes/vrambuf.h index 38f2339b..c8ea28aa 100644 --- a/presets/nes/vrambuf.h +++ b/presets/nes/vrambuf.h @@ -8,7 +8,7 @@ #define VBUFSIZE 128 // update buffer starts at $100 (stack page) -#define updbuf ((byte*)0x100) +#define updbuf ((byte* const)0x100) // index to end of buffer extern byte updptr; @@ -19,11 +19,15 @@ extern byte updptr; VRAMBUF_ADD(addr);\ VRAMBUF_ADD(len); -// macro to add a single byte to buffer -#define VRAMBUF_ADD(b)\ +// macro to set a single byte in buffer +#define VRAMBUF_SET(b)\ __A__ = (b);\ asm("ldy %v", updptr);\ - asm("sta $100,y");\ + asm("sta $100,y"); + +// macro to set a single byte to buffer, then increment +#define VRAMBUF_ADD(b)\ + VRAMBUF_SET(b)\ asm("inc %v", updptr); // add EOF marker to buffer (but don't increment pointer) diff --git a/presets/nes/vrambuffer.c b/presets/nes/vrambuffer.c index 71119c15..5396ffde 100644 --- a/presets/nes/vrambuffer.c +++ b/presets/nes/vrambuffer.c @@ -28,7 +28,7 @@ void scroll_demo() { // wait for next frame // and flush VRAM buffer cflushnow(); - // set scroll register + // set scroll (shadow) registers scroll(x, y); // update y variable y += dy; diff --git a/src/platform/nes.ts b/src/platform/nes.ts index a8f16f37..2421f921 100644 --- a/src/platform/nes.ts +++ b/src/platform/nes.ts @@ -14,7 +14,7 @@ const JSNES_PRESETS = [ {id:'ex2.asm', name:'Scrolling Demo (ASM)'}, {id:'ex3.asm', name:'Sprite Demo (ASM)'}, {id:'ex4.asm', name:'Controller Demo (ASM)'}, - {id:'neslib1.c', name:'Text'}, + {id:'hello.c', name:'Text'}, {id:'scroll.c', name:'Scrolling'}, {id:'vrambuffer.c', name:'VRAM Buffer'}, {id:'sprites.c', name:'Sprites'}, @@ -22,9 +22,10 @@ const JSNES_PRESETS = [ {id:'flicker.c', name:'Flickering Sprites'}, {id:'metacursor.c', name:'Controllers'}, {id:'metatrigger.c', name:'Trigger Mode + Vbright'}, - {id:'neslib5.c', name:'RLE Unpack'}, + {id:'rletitle.c', name:'Title Screen RLE'}, {id:'statusbar.c', name:'Split Status Bar'}, {id:'horizmask.c', name:'Offscreen Scrolling'}, + {id:'attributes.c', name:'Attribute Table + Pixels'}, {id:'music.c', name:'Music Player'}, {id:'siegegame.c', name:'Siege Game'}, {id:'shoot2.c', name:'Solarian Game'}, diff --git a/src/ui.ts b/src/ui.ts index 1e2c4348..dc87f852 100644 --- a/src/ui.ts +++ b/src/ui.ts @@ -843,6 +843,7 @@ function resetAndDebug() { var lastBreakExpr = "c.PC == 0x6000"; function _breakExpression() { + console.log(platform.saveState()); var exprs = window.prompt("Enter break expression", lastBreakExpr); if (exprs) { var fn = new Function('c', 'return (' + exprs + ');').bind(platform); diff --git a/tss b/tss index 5b5ee67f..d630ddcb 160000 --- a/tss +++ b/tss @@ -1 +1 @@ -Subproject commit 5b5ee67fc06956bc7dce51726e98812d2d897eaa +Subproject commit d630ddcb29d74a178cde043d74188fac35d6a21f