1
0
mirror of https://github.com/cc65/cc65.git synced 2024-06-26 05:29:30 +00:00

Moved more files with cleanup

git-svn-id: svn://svn.cc65.org/cc65/trunk@2118 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
cuz 2003-05-02 13:40:01 +00:00
parent 6af35e774d
commit d53211198b
8 changed files with 397 additions and 6 deletions

View File

@ -20,7 +20,12 @@
C_OBJS =
S_OBJS = _scrsize.o \
crt0.o
clock.o \
color.o \
crt0.o \
ppu.o \
ppubuf.o \
waitvblank.o
#--------------------------------------------------------------------------
# Targets

24
libsrc/nes/clock.s Normal file
View File

@ -0,0 +1,24 @@
;
; Written by Groepaz/Hitmen <groepaz@gmx.net>
; Cleanup by Ullrich von Bassewitz <uz@cc65.org>
;
; clock_t clock (void);
;
.include "nes.inc"
.export _clock
.importzp sreg
.proc _clock
ldy #0 ; High word is always zero
sty sreg+1
sty sreg
ldx tickcount+1 ; ## Problem: Cannot disable ints here
lda tickcount
rts
.endproc

69
libsrc/nes/color.s Normal file
View File

@ -0,0 +1,69 @@
;
; 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

View File

@ -20,7 +20,7 @@
.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"
@ -165,7 +165,7 @@ _exit: jsr donelib ; Run module destructors
; ------------------------------------------------------------------------
; System V-Blank Interupt
; updates PPU Memory (buffered)
; updates VBLANK_FLAG and _tickcount
; updates VBLANK_FLAG and tickcount
; ------------------------------------------------------------------------
nmi: pha
@ -177,9 +177,9 @@ nmi: pha
lda #1
sta VBLANK_FLAG
inc _tickcount
inc tickcount
bne @s
inc _tickcount+1
inc tickcount+1
@s: jsr ppubuf_flush

View File

@ -13,7 +13,7 @@ RVS = $68
CURS_X = $69
CURS_Y = $6a
_tickcount = $6b ;2
tickcount = $6b ;2
VBLANK_FLAG = $70

158
libsrc/nes/ppu.s Normal file
View File

@ -0,0 +1,158 @@
;
; 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

115
libsrc/nes/ppubuf.s Normal file
View File

@ -0,0 +1,115 @@
;
; 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

20
libsrc/nes/waitvblank.s Normal file
View File

@ -0,0 +1,20 @@
;
; Written by Groepaz/Hitmen <groepaz@gmx.net>
; Cleanup by Ullrich von Bassewitz <uz@cc65.org>
;
; void __fastcall__ waitvblank(void);
;
.export _waitvblank
.include "nes.inc"
.proc _waitvblank
wait: lda PPU_STATUS
bpl wait
rts
.endproc