18.07.2013 Views

Nintendo Entertainment System

Nintendo Entertainment System

Nintendo Entertainment System

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

KAPITTEL 4. PPU-EN<br />

og adressebuss 3 . CPU-en har tilgang til OAM via registrene $2003 og $2004, som fungerer på<br />

samme måte som $2006 og $2007 som vi bruker til å skrive til det ordinære adresseområdet.<br />

OAM er akkurat 256 bytes stort (64·4 bytes). Det vil si at én byte akkurat er nok til å adressere<br />

hver byte Vi trenger altså bare skrive én gang til $2003 for å velge hvilken adresse i OAM vi<br />

vil skrive til. Når vi har skrevet en verdi til $2004 vil adressen i $2003 øke automatisk med 1.<br />

(Merk: Å lese fra $2004 fungerer ikke i alle tilfeller og bør unngås. Noen PPU-er støtter ikke<br />

dette i det hele tatt, mens andre ikke gir riktig verdi hver gang.)<br />

La oss se på et eksempel der vi plasserer en sprite på skjermen. Det vi må gjøre da er å fylle inn<br />

fire bytes i OAM. Vi kan like greit velge de fire første:<br />

LDA #0 ; Vi starter med den første byten i OAM<br />

STA $2003<br />

LDA #116 ; Y- verdi ca. midt på skjermen<br />

STA $2004<br />

LDA #0 ; Ta den første tilen i pattern tablet<br />

STA $2004<br />

LDA #%11000011 ; Flipp horisontalt og vertikalt , og velg den fjerde sprite - paletten<br />

STA $2004<br />

LDA #124 ; X- verdi ca. midt på skjermen<br />

STA $2004<br />

4.4.2 Sprite DMA<br />

Vanligvis må OAM oppdateres hver frame, siden noen sprites må flyttes på, noen skal kanskje<br />

fjernes, og noen skal legges til. Husk på at den eneste tiden vi har tilgang til OAM er når PPU-en<br />

er i vblank-modus. Da har vi ikke ubegrenset med klokkesykluser, vi må gjøre oppdateringene<br />

raskt og effektivt. Bare for å lagre én eneste sprite ser vi at det trengs en serie med totalt<br />

åtte LDA- og STA-instruksjoner. Med bare 10 sprites har vi da svidd av 80 instruksjoner (og 480<br />

klokkesykluser) allerede. I værste tilfelle bruker vi alle de 64 spritene. Da vil det ta 512 slike<br />

instruksjoner (3072 klokkesykluser) å oppdatere hele OAM. Det er mer enn vi har til rådighet i<br />

NTSC-maskiner (og omtrent halvparten av vblank-tiden i PAL-maskiner.)<br />

NES-ingeniørene løste dette ved å inkludere en DMA-kontroller («Direct Memory Access») i<br />

CPU-kjernen. Det denne gjør er å kopiere en hel page fra RAM til OAM (via $2004). Dette<br />

skjer i løpet av bare 512/513 klokkesykluser, som gir oss mye vblank-tid til overs! Vi setter<br />

DMA-kontrolleren i sving ved å skrive til adresseregisteret $4014. Verdien vi skriver her er pagenummeret<br />

som vi ønsker å kopiere. Skriver vi for eksempel 5 her, vil pagen fra $0500 til $05FF<br />

kopieres til OAM. Før vi setter i gang kopieringen må vi skrive 0 til $2003, slik at kopieringen<br />

starter ved starten av OAM.<br />

LDA #0 ; Vi starter med den første byten i OAM<br />

STA $2003<br />

LDA # $03 ; Kopier page 3 inn i OAM<br />

STA $4014<br />

3 Dette er fordi PPU-en er helt avhengig av å hente bakgrunnsdata fra name, attribute og pattern tablene hele<br />

tiden, samtidig som den må gå gjennom OAM-listen på hver scanline. For å kunne gjøre disse tingene samtidig<br />

er det nødvendig at OAM har et eget separat adresseområde.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!