From 1a6dfc60b01d74673edc7fb653a0c4c3489692f2 Mon Sep 17 00:00:00 2001 From: Zev Averbach Date: Mon, 20 Feb 2023 18:42:26 +0100 Subject: [PATCH] first --- background/background.asm | 76 +++++++++++++++++++++++++++++++ background/background.bat | 2 + background/background.fns | 7 +++ background/background.nes | Bin 0 -> 24592 bytes mario.chr | Bin 0 -> 8192 bytes palette/palette.asm | 92 ++++++++++++++++++++++++++++++++++++++ palette/palette.fns | 9 ++++ palette/palette.nes | Bin 0 -> 24592 bytes 8 files changed, 186 insertions(+) create mode 100644 background/background.asm create mode 100644 background/background.bat create mode 100644 background/background.fns create mode 100644 background/background.nes create mode 100644 mario.chr create mode 100644 palette/palette.asm create mode 100644 palette/palette.fns create mode 100644 palette/palette.nes diff --git a/background/background.asm b/background/background.asm new file mode 100644 index 0000000..b5e9bf3 --- /dev/null +++ b/background/background.asm @@ -0,0 +1,76 @@ + .inesprg 1 ; 1x 16KB PRG code + .ineschr 1 ; 1x 8KB CHR data + .inesmap 0 ; mapper 0 = NROM, no bank swapping + .inesmir 1 ; background mirroring + + +;;;;;;;;;;;;;;; + + + .bank 0 + .org $C000 +RESET: + SEI ; disable IRQs + CLD ; disable decimal mode + LDX #$40 + STX $4017 ; disable APU frame IRQ + LDX #$FF + TXS ; Set up stack + INX ; now X = 0 + STX $2000 ; disable NMI + STX $2001 ; disable rendering + STX $4010 ; disable DMC IRQs + +vblankwait1: ; First wait for vblank to make sure PPU is ready + BIT $2002 + BPL vblankwait1 + +clrmem: + LDA #$00 + STA $0000, x + STA $0100, x + STA $0200, x + STA $0400, x + STA $0500, x + STA $0600, x + STA $0700, x + LDA #$FE + STA $0300, x + INX + BNE clrmem + +vblankwait2: ; Second wait for vblank, PPU is ready after this + BIT $2002 + BPL vblankwait2 + + + LDA #%11111111 ;intensify blues + STA $2001 + +Forever: + JMP Forever ;jump back to Forever, infinite loop + + + +NMI: + RTI + +;;;;;;;;;;;;;; + + + + .bank 1 + .org $FFFA ;first of the three vectors starts here + .dw NMI ;when an NMI happens (once per frame if enabled) the + ;processor will jump to the label NMI: + .dw RESET ;when the processor first turns on or is reset, it will jump + ;to the label RESET: + .dw 0 ;external interrupt IRQ is not used in this tutorial + + +;;;;;;;;;;;;;; + + + .bank 2 + .org $0000 + .incbin "mario.chr" ;includes 8KB graphics file from SMB1 diff --git a/background/background.bat b/background/background.bat new file mode 100644 index 0000000..8bb24ac --- /dev/null +++ b/background/background.bat @@ -0,0 +1,2 @@ +NESASM3 background.asm +pause \ No newline at end of file diff --git a/background/background.fns b/background/background.fns new file mode 100644 index 0000000..39a9463 --- /dev/null +++ b/background/background.fns @@ -0,0 +1,7 @@ +; background.asm +Forever = $C042 +vblankwait1 = $C014 +vblankwait2 = $C038 +clrmem = $C019 +RESET = $C000 +NMI = $C045 diff --git a/background/background.nes b/background/background.nes new file mode 100644 index 0000000000000000000000000000000000000000..bbcfe3ab5357c1c43fdc2afff42a5bd572faddac GIT binary patch literal 24592 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 literal 0 HcmV?d00001 diff --git a/palette/palette.asm b/palette/palette.asm new file mode 100644 index 0000000..5c1bb9e --- /dev/null +++ b/palette/palette.asm @@ -0,0 +1,92 @@ + .inesprg 1 ; 1x 16KB PRG code + .ineschr 1 ; 1x 8KB CHR data + .inesmap 0 ; mapper 0 = NROM, no bank swapping + .inesmir 1 ; background mirroring + + +;;;;;;;;;;;;;;; + + + .bank 0 + .org $C000 +RESET: + SEI ; disable IRQs + CLD ; disable decimal mode + LDX #$40 + STX $4017 ; disable APU frame IRQ + LDX #$FF + TXS ; Set up stack + INX ; now X = 0 + STX $2000 ; disable NMI + STX $2001 ; disable rendering + STX $4010 ; disable DMC IRQs + +vblankwait1: ; First wait for vblank to make sure PPU is ready + BIT $2002 + BPL vblankwait1 + +clrmem: + LDA #$00 + STA $0000, x + STA $0100, x + STA $0200, x + STA $0400, x + STA $0500, x + STA $0600, x + STA $0700, x + LDA #$FE + STA $0300, x + INX + BNE clrmem + +vblankwait2: ; Second wait for vblank, PPU is ready after this + BIT $2002 + BPL vblankwait2 + + ; get ready to write to the palettes in the PPU + LDA $2002 ; read PPU status to reset the high/low byte + LDA #$3F ; load the high byte of the addres #3F10 + STA $2006 ; store that high byte + LDA #$10 ; load the low byte of the addres #3F10 + STA $2006 ; store that low byte + + ; a succinct way of defining colors for pushing into the palettes +PaletteData: + .db $0F,$31,$32,$33,$0F,$35,$36,$37,$0F,$39,$3A,$3B,$0F,$3D,$3E,$0F + .db $0F,$1C,$15,$14,$0F,$02,$38,$3C,$0F,$1C,$15,$14,$0F,$02,$38,$3C + ; using a loop, load the values stored in PaletteData into the background and sprite palettes + LDX #$00 +LoadPalettesLoop: + LDA PaletteData, x + STA $2007 ; store the value of the Accumulator in the next memory slot in the PPU (referred to by this 'port' located at $2007) + INX ; incrementing + CPX #$20 ; is X == 32? + BNE LoadPalettesLoop + +Forever: + JMP Forever ;jump back to Forever, infinite loop + + + +NMI: + RTI + +;;;;;;;;;;;;;; + + + + .bank 1 + .org $FFFA ;first of the three vectors starts here + .dw NMI ;when an NMI happens (once per frame if enabled) the + ;processor will jump to the label NMI: + .dw RESET ;when the processor first turns on or is reset, it will jump + ;to the label RESET: + .dw 0 ;external interrupt IRQ is not used in this tutorial + + +;;;;;;;;;;;;;; + + + .bank 2 + .org $0000 + .incbin "mario.chr" ;includes 8KB graphics file from SMB1 diff --git a/palette/palette.fns b/palette/palette.fns new file mode 100644 index 0000000..2c110ac --- /dev/null +++ b/palette/palette.fns @@ -0,0 +1,9 @@ +; palette.asm +Forever = $C077 +LoadPalettesLoop = $C06C +PaletteData = $C04A +vblankwait1 = $C014 +vblankwait2 = $C038 +clrmem = $C019 +RESET = $C000 +NMI = $C07A diff --git a/palette/palette.nes b/palette/palette.nes new file mode 100644 index 0000000000000000000000000000000000000000..35b65afd694627f5a5097ac8d7dd08058246b403 GIT binary patch literal 24592 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