diff --git a/presets/nes-conio/ex0.asm b/presets/nes-conio/ex0.asm new file mode 100644 index 00000000..afd276b6 --- /dev/null +++ b/presets/nes-conio/ex0.asm @@ -0,0 +1,102 @@ + +;;;;; CONSTANTS + +PPU_CTRL equ $2000 +PPU_MASK equ $2001 +PPU_STATUS equ $2002 +PPU_SCROLL equ $2005 +PPU_ADDR equ $2006 +PPU_DATA equ $2007 +DMC_FREQ equ $4010 + +;;;;; CARTRIDGE FILE HEADER + + processor 6502 + seg Header + org $7FF0 + +NES_MAPPER equ 0 ;mapper number +NES_PRG_BANKS equ 2 ;number of 16K PRG banks, change to 2 for NROM256 +NES_CHR_BANKS equ 1 ;number of 8K CHR banks (0 = RAM) +NES_MIRRORING equ 1 ;0 horizontal, 1 vertical, 8 four screen + + .byte $4e,$45,$53,$1a ; header + .byte NES_PRG_BANKS + .byte NES_CHR_BANKS + .byte NES_MIRRORING|(NES_MAPPER<<4) + .byte NES_MAPPER&$f0 + +;;;;; CODE + + seg Code + org $8000 +start: +_exit: + sei ;disable IRQs + cld ;decimal mode not supported + ldx #$ff + txs ;set up stack pointer + inx ;increment X to 0 + stx PPU_MASK ;disable rendering + stx DMC_FREQ ;disable DMC interrupts + stx PPU_CTRL ;disable NMI interrupts + jsr WaitSyncSafe ;wait for VSYNC +; clear RAM -- not a subroutine because we clear the stack too + lda #0 + tax +.loop + sta $0,x + sta $100,x + ; skip $200-$2FF, used for OAM display list + sta $300,x + sta $400,x + sta $500,x + sta $600,x + sta $700,x + inx + bne .loop +; wait for PPU warmup + jsr WaitSync +; set palette background + ldy #$0 + lda #$3f + sta PPU_ADDR + sty PPU_ADDR + lda #$1c + sta PPU_DATA +; enable PPU rendering + lda #0 + sta PPU_ADDR + sta PPU_ADDR ;PPU addr = 0 + sta PPU_SCROLL + sta PPU_SCROLL ;scroll = 0 + lda #$90 + sta PPU_CTRL ;enable NMI + lda #$1e + sta PPU_MASK ;enable rendering +.endless + jmp .endless ;endless loop + +;;;;; SUBROUTINES + +; wait for VSYNC to start +WaitSyncSafe: subroutine + bit PPU_STATUS +WaitSync: + bit PPU_STATUS + bpl WaitSync + rts + +;;;;; INTERRUPT HANDLERS + +nmi: +irq: + rti + +;;;;; CPU VECTORS + + org $fffa + .word nmi ;$fffa vblank nmi + .word start ;$fffc reset + .word irq ;$fffe irq / brk + diff --git a/presets/nes-conio/ex1.asm b/presets/nes-conio/ex1.asm index 317b72ba..90eabdff 100644 --- a/presets/nes-conio/ex1.asm +++ b/presets/nes-conio/ex1.asm @@ -4,16 +4,13 @@ PPU_CTRL equ $2000 PPU_MASK equ $2001 PPU_STATUS equ $2002 -PPU_OAM_ADDR equ $2003 -PPU_OAM_DATA equ $2004 +OAM_ADDR equ $2003 +OAM_DATA equ $2004 PPU_SCROLL equ $2005 PPU_ADDR equ $2006 PPU_DATA equ $2007 PPU_OAM_DMA equ $4014 -PPU_FRAMECNT equ $4017 DMC_FREQ equ $4010 -CTRL_PORT1 equ $4016 -CTRL_PORT2 equ $4017 ;;;;; ZERO-PAGE VARIABLES @@ -45,16 +42,33 @@ NES_MIRRORING equ 1 ;0 horizontal, 1 vertical, 8 four screen org $8000 start: _exit: - sei + sei ;disable IRQs + cld ;decimal mode not supported ldx #$ff - txs - inx ;X=0 + txs ;set up stack pointer + inx ;increment X to 0 stx PPU_MASK ;disable rendering - stx DMC_FREQ ;disable DMC (samples) - stx PPU_CTRL ;disable NMI (interrupts) - jsr WaitSync ;wait for VSYNC + stx DMC_FREQ ;disable DMC interrupts + stx PPU_CTRL ;disable NMI interrupts + jsr WaitSyncSafe ;wait for VSYNC +; clear RAM -- not a subroutine because we clear the stack too + lda #0 + tax +.loop + sta $0,x + sta $100,x + ; skip $200-$2FF, used for OAM display list + sta $300,x + sta $400,x + sta $500,x + sta $600,x + sta $700,x + inx + bne .loop +; end of clear RAM routine jsr SetPalette ;set colors - jsr ClearVRAM ;clear VRAM + jsr FillVRAM ;set PPU RAM + jsr WaitSync ;wait for VSYNC (and PPU warmup) lda #0 sta PPU_ADDR sta PPU_ADDR ;PPU addr = 0 @@ -84,8 +98,8 @@ SetPalette: subroutine bne .loop rts -; clear video RAM -ClearVRAM: subroutine +; fill video RAM +FillVRAM: subroutine txa ldy #$20 sty PPU_ADDR @@ -101,11 +115,11 @@ ClearVRAM: subroutine rts ; wait for VSYNC to start -WaitSync: subroutine +WaitSyncSafe: subroutine bit PPU_STATUS -.1: +WaitSync: bit PPU_STATUS - bpl .1 + bpl WaitSync rts ;;;;; INTERRUPT HANDLERS diff --git a/src/platform/nes.js b/src/platform/nes.js index 5b4bdad6..8a78aab0 100644 --- a/src/platform/nes.js +++ b/src/platform/nes.js @@ -8,10 +8,11 @@ var NES_NESLIB_PRESETS = [ ]; var NES_CONIO_PRESETS = [ - {id:'hello.c', name:'Hello PPU'}, - {id:'conio.c', name:'Hello Console I/O'}, - {id:'siegegame.c', name:'Siege Game'}, - {id:'ex1.asm', name:'Assembly Example'}, + {id:'ex0.asm', name:'ASM: Initialization'}, + {id:'ex1.asm', name:'ASM: Scrolling Demo'}, + {id:'hello.c', name:'C: Hello PPU'}, + {id:'conio.c', name:'C: Hello Console I/O'}, + {id:'siegegame.c', name:'C: Siege Game'}, ]; /// JSNES diff --git a/src/ui.js b/src/ui.js index eeac8840..53bee53c 100644 --- a/src/ui.js +++ b/src/ui.js @@ -35,13 +35,39 @@ Javatari.AUTO_START = false; var PRESETS; // presets array var platform_id; var platform; // platform object +var originalFileID; +var originalText; var toolbar = $("#controls_top"); +function getBiggestItems(storage) { + var items = []; + for (var i = 0; i < storage.length; i++) { + var key = storage.key(i); + items.push([lpad(storage.getItem(key).length+"", 12), key]); + } + items.sort(); + var s = ""; + for (var i=items.length-5; i