diff --git a/doc/notes.txt b/doc/notes.txt index 0360145a..1233f811 100644 --- a/doc/notes.txt +++ b/doc/notes.txt @@ -96,6 +96,7 @@ TODO: - show .map file in listings? - open ROM from URL? - #include can't have comment immediately on line before +- NES: breakpoint on illegal instruction WEB WORKER FORMAT diff --git a/presets/nes/ex4.asm b/presets/nes/ex4.asm new file mode 100644 index 00000000..eeebaad8 --- /dev/null +++ b/presets/nes/ex4.asm @@ -0,0 +1,128 @@ + + include "nesdefs.asm" + +;;;;; VARIABLES + + seg.u RAM + org $0 + +ScrollX byte ; used during NMI +ScrollY byte ; used during NMI + +;;;;; NES CARTRIDGE HEADER + + NES_HEADER 0,2,1,0 ; mapper 0, 2 PRGs, 1 CHR, horiz. mirror + +;;;;; START OF CODE + +Start: + NES_INIT ; set up stack pointer, turn off PPU + jsr WaitSync + jsr WaitSync + jsr ClearRAM + jsr WaitSync ;wait for VSYNC + jsr SetPalette ;set colors + jsr FillVRAM ;set PPU RAM + jsr WaitSync ;wait for VSYNC (and PPU warmup) + lda #0 + sta PPU_ADDR + sta PPU_ADDR ;PPU addr = 0 + sta PPU_SCROLL + sta PPU_SCROLL ;scroll = 0 + lda #CTRL_NMI + sta PPU_CTRL ; enable NMI + lda #MASK_BG|MASK_SPR + sta PPU_MASK ; enable rendering +.endless + jmp .endless ;endless loop + +; fill video RAM +FillVRAM: subroutine + txa + ldy #$20 + sty PPU_ADDR + sta PPU_ADDR + ldy #$10 +.loop: + stx PPU_DATA + inx + bne .loop + dey + bne .loop + rts + +; set palette colors + +SetPalette: subroutine + ldy #$00 + lda #$3f + sta PPU_ADDR + sty PPU_ADDR + ldx #32 +.loop: + lda Palette,y + sta PPU_DATA + iny + dex + bne .loop + rts + + +;;;;; COMMON SUBROUTINES + + include "nesppu.asm" + +;;;;; INTERRUPT HANDLERS + +NMIHandler: + SAVE_REGS +; update scroll position (must be done after VRAM updates) + jsr ReadJoypad + pha + and #$03 + tay + lda ScrollDirTab,y + clc + adc ScrollX + sta ScrollX + sta PPU_SCROLL + pla + lsr + lsr + and #$03 + tay + lda ScrollDirTab,y + clc + adc ScrollY + sta ScrollY + sta PPU_SCROLL +; reload registers + RESTORE_REGS + rti + +; Scroll direction lookup table +ScrollDirTab: + hex 00 01 ff 00 + +;;;;; CONSTANT DATA + + align $100 +Palette: + hex 1f ;background + hex 09090000 ;bg0 + hex 09090c00 ;bg1 + hex 09091c00 ;bg2 + hex 09092c00 ;bg3 + hex 14243400 ;sp0 + hex 15253500 ;sp1 + hex 16263600 ;sp2 + hex 17273700 ;sp3 + +;;;;; CPU VECTORS + + NES_VECTORS + +;;;;; TILE SETS + + org $10000 + incbin "jroatch.chr" diff --git a/src/platform/nes.ts b/src/platform/nes.ts index 92a948d5..6c6c1d56 100644 --- a/src/platform/nes.ts +++ b/src/platform/nes.ts @@ -13,6 +13,7 @@ const JSNES_PRESETS = [ {id:'ex1.asm', name:'Hello World (ASM)'}, {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:'neslib2.c', name:'Sprites'}, {id:'neslib3.c', name:'Cursor'},