18.07.2013 Views

Nintendo Entertainment System

Nintendo Entertainment System

Nintendo Entertainment System

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

KAPITTEL 5. PRAKTISK: NOEN ENKLE PROGRAM<br />

I tillegg må vi fjerne segmentet som før het RAM. Nå har vi ikke lenger et segment som dekker<br />

hele RAM, så det må bort. I stedet kan vi lage et segment som vi kan kalle ZEROPAGE, som vi<br />

kan bruke til å lagre eventuelle variabler senere:<br />

ZEROPAGE : load = RAM_MEM , type = zp;<br />

Nå kan vi ta for oss selve koden. Koden starter ved at vi venter to frames til PPU-en har fått<br />

varmet seg opp. Deretter slår vi av renderingen, slik at vi har fri tilgang til adresseområdene til<br />

PPU-en. Paletten lastes inn, og startkoordinatene og tile-nummeret til spriten legges i variablene<br />

som er definert i page 2 (som dekkes av segmentet kalt OAM). Det er dataene i denne pagen<br />

som skal kopieres over i OAM før hver frame. Til slutt legger vi instillinger i $2000 og $2001.<br />

Etter at instillingene er satt, entrer så hovedloopen (labelen «Hovedloop»), som kjøres om og<br />

om igjen. Det første hovedloopen gjør er å vente til vi er i vblank. Deretter kopieres page 2<br />

over til OAM med DMA. Til slutt flyttes spriten ved at x-koordinaten inkrementeres med 1. Den<br />

endringen vil da fraktes over til OAM i neste frame. Når vi kommer til slutten av koden, hopper<br />

vi opp igjen til Hovedloop. Da vil CPU-en vente til neste frame, og så kjører loopen på nytt.<br />

I GFX-segmentet legger vi bare én fil, eks2.spr. Denne vil da fylle pattern table 1. Pattern<br />

table 2 vil bare fylles med 0. I koden har vi satt både sprites og bakgrunner til å hente tiles fra<br />

pattern table 1. Dersom ingenting er skrevet til VRAM, vil hver byte være fylt med 0. Det vil<br />

si at alle nametablene vil inneholde 0. Da plasseres tile 0 over hele bakgrunnen. Det er derfor<br />

smilefjesene vil dekke hele bakgrunnen. Dette er noe å være obs på: Hvis tile 0 ikke er tom, og<br />

ingenting er lagt i nametablene, vil bakgrunnen fylles av den første tilen. Det er en vanlig feil<br />

å glemme dette. Dersom spillet kommer til å fylle nametablene fullstendig, er ikke dette noe<br />

problem, men hvis ikke bør den første tilen i pattern tablet være tom.<br />

5.2.1 Oppgaver<br />

1. Få spriten til å snu retning når den treffer kantene på skjermen<br />

2. Legg inn flere sprites. Hva skjer når det er flere enn 8 én linje?<br />

5.3 Eksempel 3: Input fra kontrollene<br />

En ting vi ikke har sett på enda er hvordan vi kan hente inn tastetrykk fra kontrollene. Det<br />

passer ikke så godt inn med hverken CPU-en eller PPU-en, så det kan vi ta nå. Tanken her er å<br />

modifisere forrige eksempel slik at vi kan styre spriten med piltastene.<br />

Å kommunisere med kontrollene gjør vi med to adresseregistre: $4016 (kontroll 1) og $4017<br />

(kontroll 2). Disse fungerer på en merkelig måte. Før vi kan lese fra en kontroll må vi først skrive<br />

1 til det tilhørende registeret, og deretter 0 1 . Deretter kan vi lese hvert tastetrykk ved å lese<br />

fra registeret. Hver gang vi leser fra registeret får vi statusen til en ny knapp. Rekkefølgen er<br />

som følger: A, B, Start, Select, Opp, Ned, Venstre, Høyre. Den laveste biten av verdien vi leser<br />

1 Dette forteller en seriell 8-bits latch i kontrollen til å lagre statusen til hver knapp.

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

Saved successfully!

Ooh no, something went wrong!