CHR-ROM what?!

This is an archive of a topic from NESdev BBS, taken in mid-October 2019 before a server upgrade.
View original topic
CHR-ROM what?!
by on (#42161)
I'm writing an emulator and ive been using this test code as a way to get it going:
Code:
;;--- 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.

by on (#42166)
There is a spot for it a PPU's $0000-$1fff

by on (#42179)
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?

by on (#42183)
First off, where is this 07FF coming from?

by on (#42185)
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

by on (#42186)
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

by on (#42188)
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.