9 1 * {2Amigan ohjelmoinnista · Tomi Jaskari 26.4.1994 {6lähdeteos: "Programmer's Guide to the Amiga" · Robert A. Peck {6oikolukija: Kimmo Mustonen {5Mitä Amiga-ohjelmoija tarvitsee Taidot ja ohjelmistot, joita Amiga-ohjelmoinnissasi tulet tarvitsemaan, ovat paljolti riipuvaisia siitä, millaista sovellusohjelmaa olet kehittämässä. Saatat esimerkiksi olla laatimassa upeasti soivaa ja värikästä ohjelmaa, joka hyödyntää Amigassa valmiiksi olevia ääni- ja grafiikkaominaisuuksia, jolloin sinun tulee tietää, miten laadit tietorakenteet kuville ja ääninäytteille, sekä miten avaat tarvittavat kirjastot ja mitä kutsuja tarvitset mihinkin tarkoitukseen. Tai haluat mahdollisesti käyttää moniajoa todella hyväksesi, ehkäpä tulostaen tiedoston kirjoittimelle samalla korjaillessasi toista tiedostoa ja siinä ohella vielä tausta-ajona ladata sähköpostia koneeseesi jostain maailmalta. Tähän tarvitset tietoa moniajosta tai vähimmäisvaatimuksena sinun tulee tietää, miten pyydät AmigaDossia aloittamaan uuden erillisen prosessin sinua varten. Yleistäen sinun pitäisi tuntea komentotulkin eli CLIn toiminta ja moniajoytimen EXECin toiminta niiden systeemiohjelmistojen lisäksi, joita sovelluksesi ohjelmoiminen vaatii, koskapa jokainen sovellus vaatii pienen määrän kirjanpitotyötä ennen kuin voit käyttää grafiikkaa tai mitä tahansa muuta systeemifunktiota Amigan kirjastoista. {5Funktiokirjastot Kirjasto (library) on kokoelma funktioita, jotka liittyvät toisiinsa jollakin tavoin. Amigan suunnittelijat keräsivät toisiinsa liittyvät funktiot kirjastoihin varmistaakseen, että yhtä Kickstart-versiota varten kirjoitetut ohjelmat olisivat mahdollisimman yhteensopivia myös uudemmissa Amigoissa. Mahdollistaakseen tämän yhteensopivuuden suunnittelijoiden oli varmistettava, että ohjelman koodista pystyisi aina löytämään systeemin funktiot vaikka käyttöjärjestelmä olisi sitten muuttunut versiosta X versioon Y. [ Tältä pohjalta on hyvä lähteä siirtämään Amigan käyttöjärjestelmää Kickstartteineen aivan uuteen tietokonearkkitehtuuriin. ] Saavuttaakseen tämän yhteensopivuustavoitteen suunnittelijat määrittelivät tietorakenteen, joka muiden asioiden lisäksi sisältää taulukon hyppykäskyistä ja funktioiden osoitteista seuraavasti: {5 HYPPY funktioon N {5 ... ... {5 HYPPY funktioon 3 {5 HYPPY funktioon 2 {5 HYPPY funktioon 1 {5 LibBase {5 Kun kytket Amigaasi virran, eri systeemikirjastot etsitään Kickstart-muistista ja tehdään niiden osoitteista kutsutaulukko RAM-muistiin, jossa taulukkoa voidaan tarpeen vaatiessa myöhemmin muuttaa. Systeemin käynnistyessä kirjastot voidaan sijoittaa vapaasti muistissa mihin tahansa osoitteeseen. Siksipä koodisi tulee määritellä tietty muuttujanimi - kirjaston perusosoitin (the library base address), jonka avulla voit sitten kutsua tietyn systeemikirjaston funktioita. {5Avauskoodiesimerkki Pieni esimerkki siitä miten osoitetaan intuition-kirjastoa, missä IntuitionBase on perusosoitin Intuition-kirjastoon: {5 #include "exec/types.h" {5 #include "intuition/intuition.h" {5 #include "intuition/intuitionbase.h" {5 struct Intuitionbase *Intuitionbase; /* must be global */ {5 extern struct Library *OpenLibrary(); {5 main() {5 { {5 Intuitionbase = (struct IntuitionBase *) {5 OpenLibrary("intuition.library",0); {5 if (IntuitionBase = = 0) {5 { {5 printf("Intuition won't open!\n"); {5 } {5 /* more program material */ {5Linkkeri liittää ohjelmaasi koodia.. Kääntäessäsi ohjelman linkkeri yhdistää sen tiedostoon Amiga.lib, jossa on tarvittavat liitynnät funktiokirjastoihin ohjelmaasi varten. Kun kutsut kirjaston funktiota tapahtuu Amiga.libin toimesta seuraavaa: · rekisterit talletaan, jotta funktion palatessa niiden arvot voidaan palauttaa · ladataan rekisteriin sen kirjaston perusosoitin, jossa funktio sijaitsee · asettaa rekistereihin tarvittavat kutsuparametrit · hypätään perusosoittimen ja tietyn funktion paikan kertovan siirtymäarvon eli offsetin avulla varsinaisen funktion koodiin · palauttaa rekistereihin niiden arvot ennen funktiokutsua · antaa tarvittaessa paluuarvon Jos jostain syystä epäonnistut funktion kirjaston nimen julkistamisessa, linkkeri kertoo sinulle suunnilleen seuraavasti: {5 _ undefined Jos saat kirjaston perusosoittimen muuttujan julkistettua, mutta epäonnistut avaamiskutsussa ja silti yrität käyttää kyseisen kirjaston funktioita, ohjelmasi kaatuu. Jos onnistut sekä määrittelemään kirjaston perusosoitteen, että avaamaan sen pitäisi kirjastofunktioiden osoittamisen sujua sen jälkeen hienosti. Amiga ROM Kernel Manuaalin A-liitteessä luetellaan perusosoittimien ja kirjastojen nimet, joihin ne yhdistetään. Jos unohdat niin Amiga-linkkeri kyllä kertoo mitkä kirjastot pitää julkaista ja avata. Käynnistyskoodi, jonka olet liittänyt linkkerillä ohjelmaasi, avaa automaattisesti exec.libraryn ja dos.libraryn. Näin voit kutsua AmigaDOSin ja EXECin funktioita avaamatta niitä erikseen omassa ohjelmassasi. {5C-ohjelmointi Amigalle on useita C-kääntäjiä, joista paras kaupallinen on ehdottomasti SAS 6.50 C(++) ja paras shareware kääntäjä lienee Matt Dillonin DICE. Lisäksi on ainakin GNU-projektin C-kääntäjä, joka on yhteensopiva mutta hidas saamieni tietojen mukaan. Näistä ainakin kaksi ensin mainittua sisältävät täyden tuen Amigan määrittelytiedostoille eli niin sanotuille include-fileille. Lisäksi systeemin käyttämät tietorakenteet on helppo määritellä C-kielellä, ja suurin osuus Amigan käyttöjärjestelmästä on sitä paitsi käännetty C-lähdekoodista. Kun käytät C:tä, Pascalia tai mitä tahansa muuta korkean tason ohjelmointikieltä, tulet yhdistämään korkean tason koodisi funktioihin, jotka mukauttavat käyttämäsi kielen parametrinvälitystavat Amigan systeemikoodiin käyttämään parametrinvälitystapaan. {5Assembler-ohjelmointi Jos käytät assemblykoodia kutsuaksesi systeemin funktioita, sinun tulisi ensin tuntea Amigan käyttötavat 68000 rekistereille; ensinnäkin rekisterit D0, D1, A0 ja A1 ovat aina vapaasti käytössä eli toisin sanoen mikä tahansa systeemifunktio saattaa muuttaa niiden arvoa palauttamatta alkuperäistä. Kaikkien muiden rekistereiden sisällöt systeemi tallettaa ja palauttaa pinon avulla. Eli paljon aliohjelmakutsuja käyttävä ohjelma tarvitsee ison pinon! Funktiot, jotka palauttavat jonkin arvon, palauttavat sen rekisterissä D0. Jos funktiosi pitää palauttaa useampi arvo, tulee sinun suunnitella koodisi palauttamaan osoite tietorakenteeseen, joka sisältää taulukon tuloksista. {5SysBase ja Stack Pointer Motoralan mikroprosessorisarjan MC680x0 osoiterekistereistä kaksi on Amigassa varattu erikoiskäyttöön: A6-rekisteriä ei koskaan käytetä parametrien välittämiseen. A6 on nimetty SysBaseksi. Se sisältää osoitteen systeemifunktioden vektoritaulukkoon, joka puolestaan sisältää voimassa olevat osoitteet muihin funtioihin. Funktiota kutsuttaessa, keskusyksikkö siirtyy suorittamaan funktiota tästä vektoritaulukosta saamansa osoitteen kautta, joten ohjelmoija voi halutessaan muuttaa vektoritaulukon sisältämiä systeemifunktioiden osoitteita eri tarkoituksia varten. Esimerkiksi funktioiden toimintaa voidaan tehostaa tai lisätä analysointi- ja/tai profilointikoodia ohjelman suorituksen tarkempaa tutkimista varten. Tämä on vain Amigaa koskeva piirre. Toinen erikoisesti kohdeltava rekisteri on A7; se on samalla SP eli Stack Pointer, jonka avulla osoitetaan pinoon talletettua dataa. Tämä koskee kaikkia MC680x0 sarjaan pohjautuvia tietokoneita. {6 - TMJJ -- tänään mietin jumalattomia juonia -