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.

. byte " NES ", $1A ,1<br />

2.1. ASSEMBLEREN, CA65<br />

Direktivet .segment "INES" forteller at de linjene som følger skal legges i INES-segmentet.<br />

Som forklart ovenfor, inneholder dette segmentet informasjon til NES-emulatorene om hvordan<br />

de skal emulere filen (hvilken type kasett det er, og så videre.) iNES-formatet er en standard som<br />

man har blitt enige om i NESdev-miljøet. Det består av 16 bytes, der de tre første er bokstavene<br />

NES, etterfulgt av tallet $1A. Deretter kommer selve informasjonen. 2 Vi skal ikke gå i detalj<br />

på dette, men heller ta ting som vi trenger etter hvert. Vi benytter direktivet .byte for å lagre<br />

bytene vi vil ha i iNES-headeren. Vi kan som vi ser enten skrive ord med hermetegn, slik som<br />

ovenfor, der hver bokstav i ordet lagres i en egen byte, eller vi kan skrive inn tallverdien til byten<br />

og skille de forskjellige bytene fra hverandre med komma.<br />

Hva sier så iNES-headeren vi definerer i eksempelfilen? Som vi ser kommer de påkrevde fire<br />

bytene NES og $1A. Den neste byten antyder hvor stor PRG-ROM-chip kassetten vår har, der 1<br />

er 16KiB, 2 er 32KiB, 3 er 48KiB og så videre. Vi trenger ikke mer enn 16KiB, så derfor legger<br />

vi inn verdien 1 her. De resterende 11 bytene er ikke oppgitt, så disse blir satt til 0. Dersom vi<br />

hadde hatt noe grafikk måtte vi oppgitt hvor stor CHR-ROM-chipen er ved å legge en tilsvarende<br />

verdi i den neste byten. Men her har vi ikke behov for noen CHR-ROM-chip, så det er greit at<br />

denne byten er 0.<br />

De neste linjene i koden ser vi inneholder et nytt .segment-direktiv. Dette bytter segment til<br />

VECTORS-segmentet.<br />

. segment " VECTORS "<br />

. word 0, Start , 0<br />

Her settes de tre adressevektorene som ble nevnt i listen ovenfor. Koden i dette eksempelet<br />

er såpass enkel at den hverken trenger en NMI-adresse eller en IRQ-adresse. Derfor er disse<br />

satt til 0. Kun den midterste adressen trengs, for det er jo tross alt adressen til det stedet der<br />

prosessoren skal begynne å kjøre kode når den starter. I motsetning til i INES-segmentet så er<br />

verdiene her angitt med .word-direktivet i stedet for .byte. Det er fordi verdiene her må oppta<br />

16 bits (altså to bytes) siden de er adresser. Akkurat som en 8-biters verdi kalles en byte så<br />

kalles en 16-bits verdi for et word. 3<br />

Når INES-headeren og adressevektorene er definert er det kun selve koden som gjenstår som helt<br />

nødvendig for å lage en komplett .nes-fil. Denne må ligge i CODE-segmentet. Selve kode-delen<br />

begynner derfor som vi ser med et .segment "CODE"-direktiv. Hva koden gjør skal vi forstå<br />

oss mer på i de neste kapitlene. Merk at vi ikke har lagt noen informasjon i DATA, GFX eller<br />

RAM-segmentene. Dette er rett og slett fordi koden vår verken har grafikk, data eller behov for<br />

å definere variabler i RAM. Dette er dog ganske uvanlig (vi får raskt bruk for alle tre), og det er<br />

altså derfor ld65 klager på dette når vi kompilerer eksempelet.<br />

2 http://nesdev.parodius.com/neshdr20.txt<br />

3 Strengt tatt varierer størrelsen til et word med hvilken prosessor vi har å gjøre med. Det har likevel stort sett<br />

blitt enighet om at et word vanligvis er 16 biter stort.

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

Saved successfully!

Ooh no, something went wrong!