CHR-ROM what?!

Discuss emulation of the Nintendo Entertainment System and Famicom.

Moderator: Moderators

Post Reply
JohnPublic
Posts: 10
Joined: Tue Jan 20, 2009 1:04 am

CHR-ROM what?!

Post by JohnPublic »

I'm writing an emulator and ive been using this test code as a way to get it going:

Code: Select all

;;--- CODE START ---;;

	; INES header stuff
	.inesprg 1   ; 1 bank of code
	.ineschr 1   ; 1 bank of spr/bkg data
	.inesmir 1   ; something always 1
	.inesmap 0   ; we use mapper 0

	.bank 1   ; following goes in bank 1
	.org $FFFA  ; start at $FFFA
	.dw 0    ; dw stands for Define Word and we give 0 as address 
for NMI routine
	.dw Start ; give address of start of our code for execution on 
reset of NES.
	.dw 0   ; give 0 for address of VBlank interrupt handler, we 
tell PPU not to
	; make an interrupt for VBlank.

	.bank 0   ; bank 0 - our place for code.
	.org $8000  ; code starts at $8000
	
Start:  
	lda #%00001000  ; do the setup of PPU
	sta $2000       ; that we
	lda #%00011110  ; talked about
	sta $2001       ; on a previous day

	ldx #$00    ; clear X

	lda #$3F    ; have $2006 tell
	sta $2006   ; $2007 to start
	lda #$00    ; at $3F00 (pallete).
	sta $2006

loadpal:                ; this is a freaky loop
	lda tilepal, x  ; that gives 32 numbers
	sta $2007       ; to $2007, ending when
	inx             ; X is 32, meaning we
	cpx #32         ; are done.
	bne loadpal     ; if X isn't =32, goto "loadpal:" line.

waitblank:         ; this is the wait for VBlank code from above
	lda $2002  ; load A with value at location $2002
	bpl waitblank  ; if bit 7 is not set (not VBlank) keep checking

	lda #$00   ; these lines tell $2003
	sta $2003  ; to tell
	lda #$00   ; $2004 to start
	sta $2003  ; at $0000.

	lda #50  ; load Y value
	sta $2004 ; store Y value
	lda #$00  ; tile number 0
	sta $2004 ; store tile number
	lda #$00 ; no special junk
	sta $2004 ; store special junk
	lda #20  ; load X value
	sta $2004 ; store X value
	; and yes, it MUST go in that order.

infin:
	jmp infin   ; JuMP to infin. note that this loop never ends. :)

tilepal: .incbin "our.pal" ; include and label our pallete

	.bank 2   ; switch to bank 2
	.org $0000  ; start at $0000
	.incbin "our.bkg"  ; empty background first
	.incbin "our.spr"  ; our sprite pic data
	; note these MUST be in that order.

	;;--- WERE DONE / CODE END ---;;

I've copied PRG-ROM to $8000-$FFFF in my emulator (by this I mean I sequentially copied 16kb of data after the iNES header into PRG-ROM at $8000-$FFFF) what I dont understand is where to put the CHR-ROM. iNES header indicates that there is 8kb of CHR ROM (hence the 1 at .ineschr 1).

Ok, so now that I copied PRG data from the rom to $8000-$FFFF, what do I do with the CHR data? I didn't see a spot for it in CPU or PPU addressing space.
User avatar
Bregalad
Posts: 8140
Joined: Fri Nov 12, 2004 2:49 pm
Location: Divonne-les-bains, France

Post by Bregalad »

There is a spot for it a PPU's $0000-$1fff
Useless, lumbering half-wits don't scare us.
JohnPublic
Posts: 10
Joined: Tue Jan 20, 2009 1:04 am

Post by JohnPublic »

Bregalad wrote:There is a spot for it a PPU's $0000-$1fff

So always copy the CHR data in a ROM to 0000-07FF?
User avatar
blargg
Posts: 3715
Joined: Mon Sep 27, 2004 8:33 am
Location: Central Texas, USA
Contact:

Post by blargg »

First off, where is this 07FF coming from?
JohnPublic
Posts: 10
Joined: Tue Jan 20, 2009 1:04 am

Post by JohnPublic »

blargg wrote:First off, where is this 07FF coming from?
Bregalad said to store it 0000-1FFF..... Since 0800-1FFF is really just mirrors of 0000-07FFF, thats what I why I said 0000-7FFF
JohnPublic
Posts: 10
Joined: Tue Jan 20, 2009 1:04 am

Post by JohnPublic »

JohnPublic wrote:
blargg wrote:First off, where is this 07FF coming from?
Bregalad said to store it 0000-1FFF..... Since 0800-1FFF is really just mirrors of 0000-07FFF, thats what I why I said 0000-7FFF
I just didnt know that I always have to put CHR data there
User avatar
Disch
Posts: 1848
Joined: Wed Nov 10, 2004 6:47 pm

Post by Disch »

no no

you're mixing up CPU and PPU space.

CPU space:
--------------
$0000-07FF = RAM
$0800-1FFF = mirrored RAM
$2000-2007 = ppu regs
$2008-3FFF = mirrored PPU regs
$4000-4017 = apu/misc regs
$4018-5FFF = nothing
$6000-7FFF = SRAM (if exists)
$8000-FFFF = PRG-ROM


PPU space:
---------------
$0000-1FFF = CHR (pattern tables) -- CHR-ROM goes here
$2000-2FFF = Nametables (subject to mirroring mode)
$3000-3EFF = mirrored nametables
$3F00-3F1F = palettes
$3F20-3FFF = mirrored palettes


PPU space is not accessed directly by the game's code. Instead it has to read/write data by setting the PPU address with reg $2006, then read/writing $2007.
Post Reply