Nintendo Entertainment System
Nintendo Entertainment System
Nintendo Entertainment System
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.