mirror of
https://github.com/sehugg/8bitworkshop.git
synced 2024-12-01 13:50:30 +00:00
VCS has memory map; nes presets
This commit is contained in:
parent
3c911b8869
commit
4e3ac25318
128
presets/nes/flicker.c
Normal file
128
presets/nes/flicker.c
Normal file
@ -0,0 +1,128 @@
|
|||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
// include NESLIB header
|
||||||
|
#include "neslib.h"
|
||||||
|
|
||||||
|
// include CC65 NES Header (PPU)
|
||||||
|
#include <nes.h>
|
||||||
|
|
||||||
|
// link the pattern table into CHR ROM
|
||||||
|
//#link "chr_generic.s"
|
||||||
|
|
||||||
|
///// METASPRITES
|
||||||
|
|
||||||
|
// define a 2x2 metasprite
|
||||||
|
#define DEF_METASPRITE_2x2(name,code,pal)\
|
||||||
|
const unsigned char name[]={\
|
||||||
|
0, 0, (code)+0, pal, \
|
||||||
|
8, 0, (code)+1, pal, \
|
||||||
|
0, 8, (code)+2, pal, \
|
||||||
|
8, 8, (code)+3, pal, \
|
||||||
|
128};
|
||||||
|
|
||||||
|
// define a 2x2 metasprite, flipped horizontally
|
||||||
|
#define DEF_METASPRITE_2x2_FLIP(name,code,pal)\
|
||||||
|
const unsigned char name[]={\
|
||||||
|
8, 0, (code)+0, (pal)|OAM_FLIP_H, \
|
||||||
|
0, 0, (code)+1, (pal)|OAM_FLIP_H, \
|
||||||
|
8, 8, (code)+2, (pal)|OAM_FLIP_H, \
|
||||||
|
0, 8, (code)+3, (pal)|OAM_FLIP_H, \
|
||||||
|
128};
|
||||||
|
|
||||||
|
DEF_METASPRITE_2x2(playerRStand, 0xd8, 0);
|
||||||
|
DEF_METASPRITE_2x2(playerRRun1, 0xdc, 0);
|
||||||
|
DEF_METASPRITE_2x2(playerRRun2, 0xe0, 0);
|
||||||
|
DEF_METASPRITE_2x2(playerRRun3, 0xe4, 0);
|
||||||
|
DEF_METASPRITE_2x2(playerRJump, 0xe8, 0);
|
||||||
|
DEF_METASPRITE_2x2(playerRClimb, 0xec, 0);
|
||||||
|
DEF_METASPRITE_2x2(playerRSad, 0xf0, 0);
|
||||||
|
|
||||||
|
DEF_METASPRITE_2x2_FLIP(playerLStand, 0xd8, 0);
|
||||||
|
DEF_METASPRITE_2x2_FLIP(playerLRun1, 0xdc, 0);
|
||||||
|
DEF_METASPRITE_2x2_FLIP(playerLRun2, 0xe0, 0);
|
||||||
|
DEF_METASPRITE_2x2_FLIP(playerLRun3, 0xe4, 0);
|
||||||
|
DEF_METASPRITE_2x2_FLIP(playerLJump, 0xe8, 0);
|
||||||
|
DEF_METASPRITE_2x2_FLIP(playerLClimb, 0xec, 0);
|
||||||
|
DEF_METASPRITE_2x2_FLIP(playerLSad, 0xf0, 0);
|
||||||
|
|
||||||
|
DEF_METASPRITE_2x2(personToSave, 0xba, 1);
|
||||||
|
|
||||||
|
const unsigned char* const playerRunSeq[16] = {
|
||||||
|
playerLRun1, playerLRun2, playerLRun3,
|
||||||
|
playerLRun1, playerLRun2, playerLRun3,
|
||||||
|
playerLRun1, playerLRun2,
|
||||||
|
playerRRun1, playerRRun2, playerRRun3,
|
||||||
|
playerRRun1, playerRRun2, playerRRun3,
|
||||||
|
playerRRun1, playerRRun2,
|
||||||
|
};
|
||||||
|
|
||||||
|
const char PALETTE[32] = {
|
||||||
|
0x03, // background color
|
||||||
|
|
||||||
|
0x11,0x30,0x27, 0, // ladders and pickups
|
||||||
|
0x1c,0x20,0x2c, 0, // floor blocks
|
||||||
|
0x00,0x10,0x20, 0,
|
||||||
|
0x06,0x16,0x26, 0,
|
||||||
|
|
||||||
|
0x16,0x35,0x24, 0, // enemy sprites
|
||||||
|
0x00,0x37,0x25, 0, // rescue person
|
||||||
|
0x0d,0x2d,0x3a, 0,
|
||||||
|
0x0d,0x27,0x2a // player sprites
|
||||||
|
};
|
||||||
|
|
||||||
|
// setup PPU and tables
|
||||||
|
void setup_graphics() {
|
||||||
|
// clear sprites
|
||||||
|
oam_clear();
|
||||||
|
// set palette colors
|
||||||
|
pal_all(PALETTE);
|
||||||
|
// turn on PPU
|
||||||
|
ppu_on_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
// number of actors (4 h/w sprites each)
|
||||||
|
#define NUM_ACTORS 48
|
||||||
|
|
||||||
|
// actor x/y positions
|
||||||
|
char actor_x[NUM_ACTORS];
|
||||||
|
char actor_y[NUM_ACTORS];
|
||||||
|
// actor x/y deltas per frame
|
||||||
|
char actor_dx[NUM_ACTORS];
|
||||||
|
char actor_dy[NUM_ACTORS];
|
||||||
|
|
||||||
|
// main program
|
||||||
|
void main() {
|
||||||
|
char i;
|
||||||
|
char oam_id;
|
||||||
|
|
||||||
|
setup_graphics();
|
||||||
|
// initialize actors with random values
|
||||||
|
for (i=0; i<NUM_ACTORS; i++) {
|
||||||
|
actor_x[i] = rand();
|
||||||
|
actor_y[i] = rand();
|
||||||
|
actor_dx[i] = (rand() & 7) - 3;
|
||||||
|
actor_dy[i] = (rand() & 7) - 3;
|
||||||
|
}
|
||||||
|
// loop forever
|
||||||
|
while (1) {
|
||||||
|
// start with OAMid/sprite 0
|
||||||
|
oam_id = 0;
|
||||||
|
// draw and move all actors
|
||||||
|
// (note we don't reset i each loop iteration)
|
||||||
|
while (oam_id < 252) {
|
||||||
|
// wrap around actor array
|
||||||
|
if (i >= NUM_ACTORS)
|
||||||
|
i -= NUM_ACTORS;
|
||||||
|
oam_id = oam_meta_spr(actor_x[i], actor_y[i], oam_id, playerRunSeq[i&15]);
|
||||||
|
actor_x[i] += actor_dx[i];
|
||||||
|
actor_y[i] += actor_dy[i];
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
// hide rest of sprites
|
||||||
|
oam_hide_rest(oam_id);
|
||||||
|
// wait for next frame
|
||||||
|
ppu_wait_frame();
|
||||||
|
}
|
||||||
|
}
|
@ -19,6 +19,7 @@ const JSNES_PRESETS = [
|
|||||||
{id:'statusbar.c', name:'Status Bar'},
|
{id:'statusbar.c', name:'Status Bar'},
|
||||||
{id:'sprites.c', name:'Sprites'},
|
{id:'sprites.c', name:'Sprites'},
|
||||||
{id:'metasprites.c', name:'Metasprites'},
|
{id:'metasprites.c', name:'Metasprites'},
|
||||||
|
{id:'flicker.c', name:'Flickering Sprites'},
|
||||||
{id:'metacursor.c', name:'Controllers'},
|
{id:'metacursor.c', name:'Controllers'},
|
||||||
{id:'neslib5.c', name:'RLE Unpack'},
|
{id:'neslib5.c', name:'RLE Unpack'},
|
||||||
{id:'music.c', name:'Music Player'},
|
{id:'music.c', name:'Music Player'},
|
||||||
@ -92,7 +93,6 @@ const _JSNESPlatform = function(mainElement) {
|
|||||||
ntvideo.create();
|
ntvideo.create();
|
||||||
$(ntvideo.canvas).hide();
|
$(ntvideo.canvas).hide();
|
||||||
ntlastbuf = new Uint32Array(0x1000);
|
ntlastbuf = new Uint32Array(0x1000);
|
||||||
ntlastbuf.fill(-1);
|
|
||||||
// toggle buttons
|
// toggle buttons
|
||||||
$('<button>').text("Video").appendTo(debugbar).click(() => { $(video.canvas).toggle() });
|
$('<button>').text("Video").appendTo(debugbar).click(() => { $(video.canvas).toggle() });
|
||||||
$('<button>').text("Nametable").appendTo(debugbar).click(() => { $(ntvideo.canvas).toggle() });
|
$('<button>').text("Nametable").appendTo(debugbar).click(() => { $(ntvideo.canvas).toggle() });
|
||||||
@ -157,7 +157,6 @@ const _JSNESPlatform = function(mainElement) {
|
|||||||
// don't update if view is hidden
|
// don't update if view is hidden
|
||||||
if (! $(ntvideo.canvas).is(":visible"))
|
if (! $(ntvideo.canvas).is(":visible"))
|
||||||
return;
|
return;
|
||||||
// TODO: doesn't work on scrolling example
|
|
||||||
var a = 0;
|
var a = 0;
|
||||||
var attraddr = 0;
|
var attraddr = 0;
|
||||||
var idata = ntvideo.getFrameData();
|
var idata = ntvideo.getFrameData();
|
||||||
@ -171,7 +170,7 @@ const _JSNESPlatform = function(mainElement) {
|
|||||||
var t = nes.ppu.ptTile[name];
|
var t = nes.ppu.ptTile[name];
|
||||||
attraddr = (a & 0x2c00) | 0x3c0 | (a & 0x0C00) | ((a >> 4) & 0x38) | ((a >> 2) & 0x07);
|
attraddr = (a & 0x2c00) | 0x3c0 | (a & 0x0C00) | ((a >> 4) & 0x38) | ((a >> 2) & 0x07);
|
||||||
var attr = nes.ppu.mirroredLoad(attraddr);
|
var attr = nes.ppu.mirroredLoad(attraddr);
|
||||||
var tag = name ^ (attr<<9);
|
var tag = name ^ (attr<<9) ^ 0x80000000;
|
||||||
if (tag != ntlastbuf[a & 0xfff]) {
|
if (tag != ntlastbuf[a & 0xfff]) {
|
||||||
ntlastbuf[a & 0xfff] = tag;
|
ntlastbuf[a & 0xfff] = tag;
|
||||||
var i = row*64*8*8 + col*8;
|
var i = row*64*8*8 + col*8;
|
||||||
|
@ -43,6 +43,12 @@ var PLATFORM_PARAMS = {
|
|||||||
code_size: 0xf000,
|
code_size: 0xf000,
|
||||||
data_start: 0x80,
|
data_start: 0x80,
|
||||||
data_size: 0x80,
|
data_size: 0x80,
|
||||||
|
extra_segments:[
|
||||||
|
{name:'TIA Registers',start:0x00,size:0x80,type:'io'},
|
||||||
|
{name:'PIA RAM',start:0x80,size:0x80,type:'ram'},
|
||||||
|
{name:'PIA Ports and Timer',start:0x280,size:0x18,type:'io'},
|
||||||
|
{name:'Cartridge ROM',start:0xf000,size:0x1000,type:'rom'},
|
||||||
|
],
|
||||||
},
|
},
|
||||||
'mw8080bw': {
|
'mw8080bw': {
|
||||||
code_start: 0x0,
|
code_start: 0x0,
|
||||||
@ -762,11 +768,13 @@ function assembleDASM(step:BuildStep) {
|
|||||||
lst.text = alst;
|
lst.text = alst;
|
||||||
lst.lines = [];
|
lst.lines = [];
|
||||||
}
|
}
|
||||||
|
var segments = step.params.extra_segments;
|
||||||
return {
|
return {
|
||||||
output:aout,
|
output:aout,
|
||||||
listings:listings,
|
listings:listings,
|
||||||
errors:errors,
|
errors:errors,
|
||||||
symbolmap:symbolmap,
|
symbolmap:symbolmap,
|
||||||
|
segments:segments
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user