mirror of
https://github.com/sehugg/8bitworkshop.git
synced 2024-06-14 00:29:35 +00:00
nes: updated presets
This commit is contained in:
parent
8d635bcf5d
commit
1e44d05536
|
@ -97,7 +97,8 @@ TODO:
|
||||||
- NES: disassembly not aligned on PC
|
- NES: disassembly not aligned on PC
|
||||||
- NES: vrambuf.c for Solarian
|
- NES: vrambuf.c for Solarian
|
||||||
- game starts even if switched away before first load
|
- 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
|
WEB WORKER FORMAT
|
||||||
|
|
||||||
|
|
|
@ -3,19 +3,15 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
// link the pattern table into PRG ROM
|
// link the pattern table into CHR ROM
|
||||||
// we'll write it into CHR RAM on startup
|
//#link "chr_generic.s"
|
||||||
|
|
||||||
//#link "jroatch.c"
|
const char PALETTE[16] = {
|
||||||
extern unsigned char jroatch_chr[0x1000];
|
0x03,
|
||||||
#define PATTERN_TABLE jroatch_chr
|
0x11,0x30,0x27, 0,
|
||||||
|
0x1c,0x20,0x2c, 0,
|
||||||
// palette for balls, there are four sets for different ball colors
|
0x00,0x10,0x20, 0,
|
||||||
const unsigned char bg_palette[16]={/*{pal:"nes",n:4,sets:4}*/
|
0x06,0x16,0x26
|
||||||
0x0f,0x17,0x27,0x37,
|
|
||||||
0x0f,0x11,0x21,0x31,
|
|
||||||
0x0f,0x15,0x25,0x35,
|
|
||||||
0x0f,0x19,0x29,0x39
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// convert nametable address to attribute address
|
// convert nametable address to attribute address
|
||||||
|
@ -63,7 +59,8 @@ void color_demo(void) {
|
||||||
while (1) {
|
while (1) {
|
||||||
char x = rand() & 0x3f;
|
char x = rand() & 0x3f;
|
||||||
char y = rand() & 0x3f;
|
char y = rand() & 0x3f;
|
||||||
put_pixel(x, y, 2);
|
char color = rand() & 3;
|
||||||
|
put_pixel(x, y, color);
|
||||||
// reset scroll position
|
// reset scroll position
|
||||||
vram_adr(0);
|
vram_adr(0);
|
||||||
}
|
}
|
||||||
|
@ -94,16 +91,8 @@ void color_demo1(void) {
|
||||||
|
|
||||||
// main function, run after console reset
|
// main function, run after console reset
|
||||||
void main(void) {
|
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
|
// set palette colors
|
||||||
pal_bg(bg_palette);
|
pal_bg(PALETTE);
|
||||||
|
|
||||||
// enable PPU rendering (turn on screen)
|
// enable PPU rendering (turn on screen)
|
||||||
ppu_on_all();
|
ppu_on_all();
|
||||||
|
|
79
presets/nes/climbr_title.s
Normal file
79
presets/nes/climbr_title.s
Normal file
|
@ -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
|
|
@ -69,34 +69,33 @@ SetPalette: subroutine
|
||||||
;;;;; INTERRUPT HANDLERS
|
;;;;; INTERRUPT HANDLERS
|
||||||
|
|
||||||
NMIHandler:
|
NMIHandler:
|
||||||
SAVE_REGS
|
SAVE_REGS ; save registers
|
||||||
; update scroll position (must be done after VRAM updates)
|
; update scroll position (must be done after VRAM updates)
|
||||||
jsr ReadJoypad
|
jsr ReadJoypad0 ; read first controller
|
||||||
pha
|
pha ; push joypad bitmask
|
||||||
and #$03
|
and #$03 ; only keep first 2 bits
|
||||||
tay
|
tay ; A -> Y
|
||||||
lda ScrollDirTab,y
|
lda ScrollDirTab,y ; lookup table
|
||||||
clc
|
clc
|
||||||
adc ScrollX
|
adc ScrollX ; A = A + ScrollX
|
||||||
sta ScrollX
|
sta ScrollX ; -> ScrollX
|
||||||
sta PPU_SCROLL
|
sta PPU_SCROLL ; -> first scroll byte
|
||||||
pla
|
pla ; pop joypad bitmask
|
||||||
lsr
|
lsr
|
||||||
lsr
|
lsr
|
||||||
and #$03
|
and #$03 ; take next two bits
|
||||||
tay
|
tay
|
||||||
lda ScrollDirTab,y
|
lda ScrollDirTab,y ; do another lookup
|
||||||
clc
|
clc
|
||||||
adc ScrollY
|
adc ScrollY ; A = A + ScrollY
|
||||||
sta ScrollY
|
sta ScrollY ; -> ScrollY
|
||||||
sta PPU_SCROLL
|
sta PPU_SCROLL ; -> second scroll byte
|
||||||
; reload registers
|
RESTORE_REGS ; restore registers
|
||||||
RESTORE_REGS
|
|
||||||
rti
|
rti
|
||||||
|
|
||||||
; Scroll direction lookup table
|
; Scroll direction lookup table
|
||||||
ScrollDirTab:
|
ScrollDirTab:
|
||||||
hex 00 01 ff 00
|
hex 00 01 ff 00 ; 0,1,-1,0
|
||||||
|
|
||||||
;;;;; CONSTANT DATA
|
;;;;; CONSTANT DATA
|
||||||
|
|
||||||
|
|
|
@ -1,48 +1,34 @@
|
||||||
|
|
||||||
#include <nes.h>
|
#include "neslib.h"
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
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) {
|
// main function, run after console reset
|
||||||
unsigned char index; // used in 'for' loops
|
void main(void) {
|
||||||
|
// set palette colors
|
||||||
|
pal_col(1,0x04);
|
||||||
|
pal_col(2,0x20);
|
||||||
|
pal_col(3,0x30);
|
||||||
|
|
||||||
// if we've just powered on,
|
// write text to name table
|
||||||
// wait for PPU to warm-up
|
put_str(NTADR_A(2,2),"HELLO, WORLD!");
|
||||||
waitvsync();
|
put_str(NTADR_A(2,4),"THIS CODE PRINTS SOME TEXT");
|
||||||
waitvsync();
|
put_str(NTADR_A(2,5),"USING ASCII-ENCODED CHARACTER");
|
||||||
|
put_str(NTADR_A(2,6),"SET WITH CAPITAL LETTERS ONLY");
|
||||||
|
|
||||||
// turn off screen
|
// enable PPU rendering (turn on screen)
|
||||||
PPU.control = 0x0; // NMI off
|
ppu_on_all();
|
||||||
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
|
// infinite loop
|
||||||
while (1);
|
while (1) ;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,34 +0,0 @@
|
||||||
|
|
||||||
#include "neslib.h"
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
// 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) ;
|
|
||||||
}
|
|
|
@ -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
|
|
||||||
}
|
|
|
@ -44,18 +44,21 @@ PrevRandom subroutine
|
||||||
|
|
||||||
;;;;; CONTROLLER READING
|
;;;;; CONTROLLER READING
|
||||||
|
|
||||||
ReadJoypad subroutine
|
ReadJoypad0 subroutine
|
||||||
|
ldy #0
|
||||||
|
ReadJoypadY
|
||||||
lda #$01
|
lda #$01
|
||||||
sta JOYPAD1 ; set strobe bit
|
sta JOYPAD1,y ; set strobe bit
|
||||||
tax ; X = 1
|
|
||||||
lsr ; now A is 0
|
lsr ; now A is 0
|
||||||
sta JOYPAD1 ; clear strobe bit
|
sta JOYPAD1,y ; clear strobe bit
|
||||||
|
ldx #8 ; read 8 bits
|
||||||
.loop:
|
.loop:
|
||||||
lda JOYPAD1 ; load controller state
|
pha ; save A (result)
|
||||||
|
lda JOYPAD1,y ; load controller state
|
||||||
lsr ; bit 0 -> carry
|
lsr ; bit 0 -> carry
|
||||||
txa ; X -> A
|
pla ; restore A (result)
|
||||||
rol ; carry -> bit 0 of result, bit 7 -> carry
|
rol ; carry -> bit 0 of result
|
||||||
tax ; A -> X
|
dex ; X = X - 1
|
||||||
bcc .loop ; repeat until 1 shifted out
|
bne .loop ; repeat if X is 0
|
||||||
rts ; controller bits returned in A
|
rts ; controller bits returned in A
|
||||||
|
|
||||||
|
|
48
presets/nes/ppuhello.c
Normal file
48
presets/nes/ppuhello.c
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
|
||||||
|
#include <nes.h>
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
49
presets/nes/rletitle.c
Normal file
49
presets/nes/rletitle.c
Normal file
|
@ -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
|
||||||
|
}
|
|
@ -26,14 +26,16 @@ byte getchar(byte x, byte y) {
|
||||||
word addr = NTADR_A(x,y);
|
word addr = NTADR_A(x,y);
|
||||||
byte rd;
|
byte rd;
|
||||||
// wait for VBLANK to start
|
// wait for VBLANK to start
|
||||||
ppu_wait_nmi();
|
ppu_wait_frame();
|
||||||
|
// set vram address and read byte
|
||||||
vram_adr(addr);
|
vram_adr(addr);
|
||||||
vram_read(&rd, 1);
|
vram_read(&rd, 1);
|
||||||
|
// scroll registers are corrupt
|
||||||
|
// fix by setting vram address
|
||||||
vram_adr(0x0);
|
vram_adr(0x0);
|
||||||
return rd + 0x20;
|
return rd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void cputcxy(byte x, byte y, char ch) {
|
void cputcxy(byte x, byte y, char ch) {
|
||||||
putbytes(NTADR_A(x,y), &ch, 1);
|
putbytes(NTADR_A(x,y), &ch, 1);
|
||||||
}
|
}
|
||||||
|
@ -137,7 +139,7 @@ void move_player(Player* p) {
|
||||||
cputcxy(p->x, p->y, p->tail_attr);
|
cputcxy(p->x, p->y, p->tail_attr);
|
||||||
p->x += DIR_X[p->dir];
|
p->x += DIR_X[p->dir];
|
||||||
p->y += DIR_Y[p->dir];
|
p->y += DIR_Y[p->dir];
|
||||||
if (getchar(p->x, p->y) != ' ')
|
if (getchar(p->x, p->y) != 0)
|
||||||
p->collided = 1;
|
p->collided = 1;
|
||||||
draw_player(p);
|
draw_player(p);
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,7 @@ byte updptr = 0;
|
||||||
|
|
||||||
// add EOF marker to buffer (but don't increment pointer)
|
// add EOF marker to buffer (but don't increment pointer)
|
||||||
void cendbuf(void) {
|
void cendbuf(void) {
|
||||||
updbuf[updptr] = NT_UPD_EOF;
|
VRAMBUF_SET(NT_UPD_EOF);
|
||||||
}
|
}
|
||||||
|
|
||||||
// clear vram buffer and place EOF marker
|
// clear vram buffer and place EOF marker
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
#define VBUFSIZE 128
|
#define VBUFSIZE 128
|
||||||
|
|
||||||
// update buffer starts at $100 (stack page)
|
// update buffer starts at $100 (stack page)
|
||||||
#define updbuf ((byte*)0x100)
|
#define updbuf ((byte* const)0x100)
|
||||||
|
|
||||||
// index to end of buffer
|
// index to end of buffer
|
||||||
extern byte updptr;
|
extern byte updptr;
|
||||||
|
@ -19,11 +19,15 @@ extern byte updptr;
|
||||||
VRAMBUF_ADD(addr);\
|
VRAMBUF_ADD(addr);\
|
||||||
VRAMBUF_ADD(len);
|
VRAMBUF_ADD(len);
|
||||||
|
|
||||||
// macro to add a single byte to buffer
|
// macro to set a single byte in buffer
|
||||||
#define VRAMBUF_ADD(b)\
|
#define VRAMBUF_SET(b)\
|
||||||
__A__ = (b);\
|
__A__ = (b);\
|
||||||
asm("ldy %v", updptr);\
|
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);
|
asm("inc %v", updptr);
|
||||||
|
|
||||||
// add EOF marker to buffer (but don't increment pointer)
|
// add EOF marker to buffer (but don't increment pointer)
|
||||||
|
|
|
@ -28,7 +28,7 @@ void scroll_demo() {
|
||||||
// wait for next frame
|
// wait for next frame
|
||||||
// and flush VRAM buffer
|
// and flush VRAM buffer
|
||||||
cflushnow();
|
cflushnow();
|
||||||
// set scroll register
|
// set scroll (shadow) registers
|
||||||
scroll(x, y);
|
scroll(x, y);
|
||||||
// update y variable
|
// update y variable
|
||||||
y += dy;
|
y += dy;
|
||||||
|
|
|
@ -14,7 +14,7 @@ const JSNES_PRESETS = [
|
||||||
{id:'ex2.asm', name:'Scrolling Demo (ASM)'},
|
{id:'ex2.asm', name:'Scrolling Demo (ASM)'},
|
||||||
{id:'ex3.asm', name:'Sprite Demo (ASM)'},
|
{id:'ex3.asm', name:'Sprite Demo (ASM)'},
|
||||||
{id:'ex4.asm', name:'Controller 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:'scroll.c', name:'Scrolling'},
|
||||||
{id:'vrambuffer.c', name:'VRAM Buffer'},
|
{id:'vrambuffer.c', name:'VRAM Buffer'},
|
||||||
{id:'sprites.c', name:'Sprites'},
|
{id:'sprites.c', name:'Sprites'},
|
||||||
|
@ -22,9 +22,10 @@ const JSNES_PRESETS = [
|
||||||
{id:'flicker.c', name:'Flickering Sprites'},
|
{id:'flicker.c', name:'Flickering Sprites'},
|
||||||
{id:'metacursor.c', name:'Controllers'},
|
{id:'metacursor.c', name:'Controllers'},
|
||||||
{id:'metatrigger.c', name:'Trigger Mode + Vbright'},
|
{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:'statusbar.c', name:'Split Status Bar'},
|
||||||
{id:'horizmask.c', name:'Offscreen Scrolling'},
|
{id:'horizmask.c', name:'Offscreen Scrolling'},
|
||||||
|
{id:'attributes.c', name:'Attribute Table + Pixels'},
|
||||||
{id:'music.c', name:'Music Player'},
|
{id:'music.c', name:'Music Player'},
|
||||||
{id:'siegegame.c', name:'Siege Game'},
|
{id:'siegegame.c', name:'Siege Game'},
|
||||||
{id:'shoot2.c', name:'Solarian Game'},
|
{id:'shoot2.c', name:'Solarian Game'},
|
||||||
|
|
|
@ -843,6 +843,7 @@ function resetAndDebug() {
|
||||||
|
|
||||||
var lastBreakExpr = "c.PC == 0x6000";
|
var lastBreakExpr = "c.PC == 0x6000";
|
||||||
function _breakExpression() {
|
function _breakExpression() {
|
||||||
|
console.log(platform.saveState());
|
||||||
var exprs = window.prompt("Enter break expression", lastBreakExpr);
|
var exprs = window.prompt("Enter break expression", lastBreakExpr);
|
||||||
if (exprs) {
|
if (exprs) {
|
||||||
var fn = new Function('c', 'return (' + exprs + ');').bind(platform);
|
var fn = new Function('c', 'return (' + exprs + ');').bind(platform);
|
||||||
|
|
2
tss
2
tss
|
@ -1 +1 @@
|
||||||
Subproject commit 5b5ee67fc06956bc7dce51726e98812d2d897eaa
|
Subproject commit d630ddcb29d74a178cde043d74188fac35d6a21f
|
Loading…
Reference in New Issue
Block a user