--- /dev/null
+;
+; Written by Groepaz/Hitmen <groepaz@gmx.net>
+; Cleanup by Ullrich von Bassewitz <uz@cc65.org>
+;
+; unsigned char __fastcall__ textcolor (unsigned char color);
+; unsigned char __fastcall__ bgcolor (unsigned char color);
+; unsigned char __fastcall__ bordercolor (unsigned char color);
+;
+
+
+ .export _textcolor, _bgcolor, _bordercolor
+ .import return0, ppubuf_put
+
+ .include "nes.inc"
+
+_textcolor = return0
+_bordercolor = return0
+
+.proc _bgcolor
+
+ tax
+ lda BGCOLOR ; get old value
+ stx BGCOLOR ; set new value
+ pha
+
+ lda colors,x
+ pha
+ ldy #$3F
+ ldx #0
+ jsr ppubuf_put
+ pla
+ pha
+ ldy #$3F
+ ldx #4
+ jsr ppubuf_put
+ pla
+ pha
+ ldy #$3F
+ ldx #8
+ jsr ppubuf_put
+ pla
+ ldy #$3F
+ ldx #12
+ jsr ppubuf_put
+
+ pla
+ rts
+
+.endproc
+
+.rodata
+
+colors: .byte $0f ; 0 black
+ .byte $3d ; 1 white
+ .byte $04 ; 2 red
+ .byte $3b ; 3 cyan
+ .byte $14 ; 4 violett
+ .byte $1a ; 5 green
+ .byte $01 ; 6 blue
+ .byte $38 ; 7 yellow
+ .byte $18 ; 8 orange
+ .byte $08 ; 9 brown
+ .byte $35 ; a light red
+ .byte $2d ; b dark grey
+ .byte $10 ; c middle grey
+ .byte $2b ; d light green
+ .byte $22 ; e light blue
+ .byte $3d ; f light gray
+
.import __CODE_LOAD__,__CODE_RUN__, __CODE_SIZE__
.import __RODATA_LOAD__,__RODATA_RUN__, __RODATA_SIZE__
.import __DATA_LOAD__,__DATA_RUN__, __DATA_SIZE__
-
+
.include "zeropage.inc"
.include "nes.inc"
; ------------------------------------------------------------------------
; System V-Blank Interupt
; updates PPU Memory (buffered)
-; updates VBLANK_FLAG and _tickcount
+; updates VBLANK_FLAG and tickcount
; ------------------------------------------------------------------------
nmi: pha
lda #1
sta VBLANK_FLAG
- inc _tickcount
+ inc tickcount
bne @s
- inc _tickcount+1
+ inc tickcount+1
@s: jsr ppubuf_flush
--- /dev/null
+;
+; Written by Groepaz/Hitmen <groepaz@gmx.net>
+; Cleanup by Ullrich von Bassewitz <uz@cc65.org>
+;
+
+ .export ppuinit
+ .export paletteinit
+
+ .include "nes.inc"
+
+;+---------+----------------------------------------------------------+
+;| $2000 | PPU Control Register #1 (W) |
+;| | |
+;| | D7: Execute NMI on VBlank |
+;| | 0 = Disabled |
+;| | 1 = Enabled |
+;| | D6: PPU Master/Slave Selection --+ |
+;| | 0 = Master +-- UNUSED |
+;| | 1 = Slave --+ |
+;| | D5: Sprite Size |
+;| | 0 = 8x8 |
+;| | 1 = 8x16 |
+;| | D4: Background Pattern Table Address |
+;| | 0 = $0000 (VRAM) |
+;| | 1 = $1000 (VRAM) |
+;| | D3: Sprite Pattern Table Address |
+;| | 0 = $0000 (VRAM) |
+;| | 1 = $1000 (VRAM) |
+;| | D2: PPU Address Increment |
+;| | 0 = Increment by 1 |
+;| | 1 = Increment by 32 |
+;| | D1-D0: Name Table Address |
+;| | 00 = $2000 (VRAM) |
+;| | 01 = $2400 (VRAM) |
+;| | 10 = $2800 (VRAM) |
+;| | 11 = $2C00 (VRAM) |
+;+---------+----------------------------------------------------------+
+;+---------+----------------------------------------------------------+
+;| $2001 | PPU Control Register #2 (W) |
+;| | |
+;| | D7-D5: Full Background Colour (when D0 == 1) |
+;| | 000 = None +------------+ |
+;| | 001 = Green | NOTE: Do not use more |
+;| | 010 = Blue | than one type |
+;| | 100 = Red +------------+ |
+;| | D7-D5: Colour Intensity (when D0 == 0) |
+;| | 000 = None +--+ |
+;| | 001 = Intensify green | NOTE: Do not use more |
+;| | 010 = Intensify blue | than one type |
+;| | 100 = Intensify red +--+ |
+;| | D4: Sprite Visibility |
+;| | 0 = Sprites not displayed |
+;| | 1 = Sprites visible |
+;| | D3: Background Visibility |
+;| | 0 = Background not displayed |
+;| | 1 = Background visible |
+;| | D2: Sprite Clipping |
+;| | 0 = Sprites invisible in left 8-pixel column |
+;| | 1 = No clipping |
+;| | D1: Background Clipping |
+;| | 0 = BG invisible in left 8-pixel column |
+;| | 1 = No clipping |
+;| | D0: Display Type |
+;| | 0 = Colour display |
+;| | 1 = Monochrome display |
+;+---------+----------------------------------------------------------+
+
+
+;-----------------------------------------------------------------------------
+
+.proc ppuinit
+
+ lda #%10101000
+ sta PPU_CTRL1
+
+ lda #%00011110
+ sta PPU_CTRL2
+
+; Wait for vblank
+
+@wait: lda PPU_STATUS
+ bpl @wait
+
+; reset scrolling
+
+ lda #0
+ sta PPU_VRAM_ADDR1
+ sta PPU_VRAM_ADDR1
+
+; Make all sprites invisible
+
+ lda #$00
+ ldy #$f0
+ sta PPU_SPR_ADDR
+ ldx #$40
+@loop: sty PPU_SPR_IO
+ sta PPU_SPR_IO
+ sta PPU_SPR_IO
+ sty PPU_SPR_IO
+ dex
+ bne @loop
+
+ rts
+
+.endproc
+
+
+;-----------------------------------------------------------------------------
+
+.proc paletteinit
+
+; Wait for v-blank
+@wait: lda PPU_STATUS
+ bpl @wait
+
+ lda #$3F
+ sta PPU_VRAM_ADDR2
+ lda #$00
+ sta PPU_VRAM_ADDR2
+
+ ldx #0
+@loop: lda paldata,x
+ sta PPU_VRAM_IO
+ inx
+ cpx #(16*2)
+ bne @loop
+
+ rts
+
+.endproc
+
+;-----------------------------------------------------------------------------
+
+.rodata
+
+paldata:
+ .repeat 2
+ .byte $0f ; 0 black
+ .byte $14 ; 4 violett
+ .byte $3b ; 3 cyan
+ .byte $3d ; 1 white
+
+ .byte $38 ; 7 yellow
+ .byte $2d ; b dark grey
+ .byte $22 ; e light blue
+ .byte $04 ; 2 red
+
+ .byte $18 ; 8 orange
+ .byte $08 ; 9 brown
+ .byte $35 ; a light red
+ .byte $01 ; 6 blue
+
+ .byte $10 ; c middle grey
+ .byte $2b ; d light green
+ .byte $3d ; f light gray
+ .byte $1a ; 5 green
+ .endrepeat
+
--- /dev/null
+;
+; Written by Groepaz/Hitmen <groepaz@gmx.net>
+; Cleanup by Ullrich von Bassewitz <uz@cc65.org>
+;
+
+
+ .export ppubuf_waitempty
+ .export ppubuf_wait
+ .export ppubuf_put
+ .export ppubuf_flush
+ .include "nes.inc"
+
+.code
+
+; ------------------------------------------------------------------------
+; ppubuf_waitempty
+; Wait until buffer is empty
+
+.proc ppubuf_waitempty
+
+
+@wait: lda ringcount
+ bne @wait
+ rts
+
+.endproc
+
+
+; ------------------------------------------------------------------------
+; ppubuf_wait
+; Wait until buffer is full
+
+.proc ppubuf_wait
+
+ lda #$ff ; (($0100/3)*1)
+@wait: cmp ringcount
+ beq @wait
+ rts
+
+.endproc
+
+; ------------------------------------------------------------------------
+; Put a PPU-Memory write to buffer
+; called from main program (not necessary when in vblank irq)
+
+.proc ppubuf_put
+
+ sta ppuval
+ sty ppuhi
+ stx ppulo
+
+ jsr ppubuf_wait ; wait if buffer is full
+
+ ldy ringwrite
+ lda ppuhi
+ sta ringbuff,y
+ lda ppulo
+ sta ringbuff+$0100,y
+ lda ppuval
+ sta ringbuff+$0200,y
+
+ iny
+ sty ringwrite
+ inc ringcount
+ rts
+
+.endproc
+
+; ------------------------------------------------------------------------
+; Flush PPU-Memory write buffer
+; called from vblank interupt
+
+.proc ppubuf_flush
+
+ ldy ringcount
+ bne @doloop
+ rts
+
+@doloop:
+ ldx ringread
+ lda #$0e
+ sta temp
+
+@loop:
+.repeat 5
+ lda ringbuff,x
+ sta $2006
+ lda ringbuff+$0100,x
+ sta $2006
+ lda ringbuff+$0200,x
+ sta $2007
+ inx
+
+ dey
+ beq @end
+.endrepeat
+
+ dec temp
+ bne @loop
+
+@end: stx ringread
+ sty ringcount
+
+ rts
+
+.endproc
+
+; ------------------------------------------------------------------------
+; Data
+
+.bss
+
+temp: .res 1
+
+