From 810d0af58bfbc8aa39b1108638f196c5c9a7d3f9 Mon Sep 17 00:00:00 2001 From: Steven Hugg Date: Fri, 5 Apr 2019 08:58:26 -0400 Subject: [PATCH] nes updates; new build script; fixed kbd shortcuts --- Makefile | 6 +++- doc/notes.txt | 5 +-- package.json | 2 +- presets/nes/bankswitch.c | 2 +- presets/nes/rletitle.c | 1 - presets/nes/shoot2.c | 54 +++++++++++++++++++------------- presets/nes/vrambuf.c | 15 ++++----- presets/nes/vrambuf.h | 15 ++------- src/emu.ts | 4 +-- src/platform/nes.ts | 2 +- src/ui.ts | 51 +++++++++++++++--------------- src/views.ts | 1 + src/waveform.ts | 2 +- src/worker/lib/nes/nesbanked.cfg | 10 +++--- 14 files changed, 89 insertions(+), 81 deletions(-) diff --git a/Makefile b/Makefile index 800eb7a3..b10995d1 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,11 @@ TSC=./node_modules/typescript/bin/tsc -all: src/cpu/z80fast.js +all: + $(TSC) + cd jsnes && npm i + +z80: src/cpu/z80fast.js src/cpu/z80.js: src/cpu/z80.coffee coffee -c $< diff --git a/doc/notes.txt b/doc/notes.txt index 159ac1d7..cdde55a3 100644 --- a/doc/notes.txt +++ b/doc/notes.txt @@ -111,10 +111,11 @@ TODO: - capture so we get mouseUp() out of frame - per-View keyboard shortcuts - parse labels - - editing too fast refreshes kills the editor + - editing too fast refreshes kills the editor, also doesn't update palette - crt0.s compiled each time? - debug highlight doesn't go away when debugging -> running -- replay doesn't work for nes +- replay doesn't work for nes (force background tile redraw) +- running profiler while replaying? grand unified replay? WEB WORKER FORMAT diff --git a/package.json b/package.json index cac5fcfe..9af4bd6e 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "test": "tests" }, "scripts": { - "build": "./node_modules/typescript/bin/tsc", + "build": "make", "test": "npm run test-node", "test-one": "NODE_PATH=$(pwd) mocha --recursive --timeout 60000", "test-node": "NODE_PATH=$(pwd) mocha --recursive --timeout 60000 test/cli", diff --git a/presets/nes/bankswitch.c b/presets/nes/bankswitch.c index f54e14ff..69f88821 100644 --- a/presets/nes/bankswitch.c +++ b/presets/nes/bankswitch.c @@ -37,7 +37,7 @@ const unsigned char TEXT5[]={"Bank 5 @ A000"}; #pragma rodata-name("CODE6") const unsigned char TEXT6[]={"Bank 6 @ C000"}; -// put functions in bank 0 +// put functions in bank 1 #pragma code-name("CODE1") void draw_text(word addr, const char* text) { diff --git a/presets/nes/rletitle.c b/presets/nes/rletitle.c index 42646b88..e248f485 100644 --- a/presets/nes/rletitle.c +++ b/presets/nes/rletitle.c @@ -47,4 +47,3 @@ void main(void) show_title_screen(climbr_title_pal, climbr_title_rle); while(1);//do nothing, infinite loop } - \ No newline at end of file diff --git a/presets/nes/shoot2.c b/presets/nes/shoot2.c index e71659df..3e0be054 100644 --- a/presets/nes/shoot2.c +++ b/presets/nes/shoot2.c @@ -27,17 +27,17 @@ /*{pal:"nes",layout:"nes"}*/ const char PALETTE[32] = { - 0x0f, + 0x0F, - 0x11,0x24,0x3c, 0x0, - 0x01,0x15,0x25, 0x0, - 0x01,0x10,0x20, 0x0, - 0x06,0x16,0x26, 0x0, + 0x11,0x24,0x3C, 0x00, + 0x01,0x15,0x25, 0x00, + 0x01,0x10,0x20, 0x00, + 0x06,0x16,0x26, 0x00, - 0x11,0x24,0x3c, 0x0, - 0x01,0x15,0x25, 0x0, - 0x31,0x35,0x3c, 0x0, - 0x01,0x17,0x30 + 0x11,0x24,0x3C, 0x00, + 0x01,0x15,0x25, 0x00, + 0x31,0x35,0x3C, 0x00, + 0x25,0x1C,0x3D }; #define COLOR_PLAYER 3 @@ -55,15 +55,14 @@ const char TILESET[128*8*2] = { 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, - +/*{w:16,h:16,bpp:1,count:16,brev:1,np:2,pofs:8,remap:[5,0,1,2,4,6,7,8,9,10,11,12]}*/ // formation enemy (64,66) 0x0F,0x13,0x03,0x03,0x01,0x01,0x00,0x00,0x0C,0x11,0x04,0x08,0x12,0x04,0x08,0x08, -0xF8,0xE4,0xE0,0xE0,0xC0,0xC0,0x80,0x00,0x18,0x44,0x10,0x08,0x24,0x10,0x08,0x08, - 0x0C,0x13,0x03,0x03,0x03,0x01,0x01,0x00,0x0C,0x10,0x01,0x0C,0x30,0x02,0x04,0x18, +0xF8,0xE4,0xE0,0xE0,0xC0,0xC0,0x80,0x00,0x18,0x44,0x10,0x08,0x24,0x10,0x08,0x08, 0x18,0x64,0xE0,0xE0,0xE0,0xC0,0xC0,0x80,0x18,0x04,0x40,0x18,0x06,0x20,0x10,0x0C, // attackers (68) -0x00,0x00,0x04,0x08,0x04,0x00,0x01,0x0C,0x00,0x00,0x04,0x08,0x04,0x03,0x03,0x03, +0x00,0x00,0x04,0x08,0x04,0x03,0x03,0x0F,0x00,0x00,0x04,0x08,0x04,0x00,0x01,0x00, 0x03,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x30,0x02,0x04,0x18,0x00,0x00,0x00,0x00, 0x00,0x00,0x10,0x08,0x10,0x60,0xE0,0xE0,0x00,0x00,0x10,0x08,0x10,0x00,0x40,0x18, 0xE0,0xC0,0xC0,0x80,0x00,0x00,0x00,0x00,0x06,0x20,0x10,0x0C,0x00,0x00,0x00,0x00, @@ -133,10 +132,10 @@ const char TILESET[128*8*2] = { 0x86,0xC4,0x00,0x10,0x01,0x10,0x08,0x04,0x00,0x00,0x10,0x30,0x48,0x20,0x04,0x14, 0x04,0x00,0x20,0x89,0x00,0x84,0xC6,0x43,0x16,0x04,0x44,0xA0,0x00,0x00,0x00,0x00, -0x00,0x00,0x02,0x08,0x00,0x06,0x02,0x00,0x00,0x00,0x08,0x01,0x11,0x15,0x00,0x38, -0x30,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x10,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x20,0x08,0x00,0x30,0x20,0x00,0x00,0x00,0x08,0x40,0x44,0x54,0x00,0x0E, -0x06,0x20,0x80,0x80,0x00,0x00,0x00,0x00,0x0C,0x80,0x04,0x80,0x00,0x00,0x00,0x00, +0x00,0x00,0x02,0x08,0x00,0x06,0x02,0x00,0x00,0x40,0x08,0x01,0x11,0x15,0x00,0x38, +0x30,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x10,0x00,0x04,0x40,0x00,0x00, +0x00,0x00,0x20,0x08,0x00,0x30,0x20,0x00,0x02,0x00,0x08,0x40,0x44,0x54,0x00,0x0E, +0x06,0x20,0x80,0x80,0x00,0x00,0x00,0x00,0x0C,0x80,0x04,0x80,0x00,0x11,0x00,0x00, }; #define CHAR(x) ((x)-' ') @@ -657,13 +656,26 @@ void init_stars() { oamid = oam_spr(rand(), i*8, 103+(i&3), 0|OAM_BEHIND, oamid); } } - -void draw_stars() { +/* +void draw_stars_c() { byte i; for (i=0; i<32; i++) { ++OAMBUF[i].y; } } +*/ +void draw_stars() { + asm("ldy #0"); // start with Y = 0 + asm("clc"); // clear carry for addition + asm("@1: lda $200,y");// read from OAM buffer + asm("adc #1"); // increment + asm("sta $200,y"); // write to OAM buffer + asm("iny"); // increment Y by 4 + asm("iny"); + asm("iny"); + asm("iny"); + asm("bpl @1"); // branch while < 128 +} void play_round() { register byte framecount; @@ -733,7 +745,7 @@ void set_shifted_pattern(const byte* src, word dest, byte shift) { byte y; for (y=0; y<16; y++) { byte a = src[y]; - byte b = src[y+16]; + byte b = src[y+32]; buf[y] = a>>shift; buf[y+16] = b>>shift | a<<(8-shift); buf[y+32] = b<<(8-shift); @@ -756,7 +768,7 @@ void setup_graphics() { src = SSRC_FORM1*16; dest = SDST_FORM1*16; for (i=0; i<8; i++) { - if (i==4) src += 32; + if (i==4) src += 16; set_shifted_pattern(&TILESET[src], dest, i); dest += 3*16; } diff --git a/presets/nes/vrambuf.c b/presets/nes/vrambuf.c index e486e76a..20d0aa15 100644 --- a/presets/nes/vrambuf.c +++ b/presets/nes/vrambuf.c @@ -1,6 +1,7 @@ #include "neslib.h" #include "vrambuf.h" +#include // index to end of buffer byte updptr = 0; @@ -30,19 +31,19 @@ void cflushnow(void) { // add multiple characters to update buffer // using horizontal increment -void putbytes(word addr, const char* str, byte len) { - byte i; +void putbytes(word addr, register const char* str, byte len) { // if bytes won't fit, wait for vsync and flush buffer - if (updptr >= VBUFSIZE-4-len) cflushnow(); + if (VBUFSIZE-4-len < updptr) { + cflushnow(); + } // add vram address VRAMBUF_ADD((addr >> 8) ^ NT_UPD_HORZ); VRAMBUF_ADD(addr); // only lower 8 bits // add length VRAMBUF_ADD(len); - // add data - for (i=0; i { diff --git a/src/worker/lib/nes/nesbanked.cfg b/src/worker/lib/nes/nesbanked.cfg index 54299eb1..04e2745f 100644 --- a/src/worker/lib/nes/nesbanked.cfg +++ b/src/worker/lib/nes/nesbanked.cfg @@ -7,15 +7,17 @@ MEMORY { # INES Cartridge Header HEADER: file = %O, start = $0000, size = $0010, fill = yes; - # 5 16K ROM Banks @ $8000 + # 3 16K ROM Banks @ $8000 PRG0: start = $8000, size = $2000, file = %O ,fill = yes, define = yes; PRG1: start = $8000, size = $2000, file = %O ,fill = yes, define = yes; PRG2: start = $8000, size = $2000, file = %O ,fill = yes, define = yes; - PRG3: start = $8000, size = $2000, file = %O ,fill = yes, define = yes; - PRG4: start = $8000, size = $2000, file = %O ,fill = yes, define = yes; - # fixed 16K ROM banks @ $a000 and $c000 + # 3 16K ROM Banks @ $a000 + PRG3: start = $a000, size = $2000, file = %O ,fill = yes, define = yes; + PRG4: start = $a000, size = $2000, file = %O ,fill = yes, define = yes; PRG5: start = $a000, size = $2000, file = %O ,fill = yes, define = yes; + + # fixed 16K ROM banks @ $c000 PRG6: start = $c000, size = $2000, file = %O ,fill = yes, define = yes; # final bank has