Tietokoneesi  sisältä  löytyy   Motorolan   68000-perheeseen    kuuluva
                     
prosessori,   jotka   ovat   kaikki   osittain    yhteensopivia.   Tämä
                     
tarkoittaa,  että jos teet  ohjelman  pelkästään  68000:n  komennoilla,
                     
se  toimii  kaikissa  uudemmissa  koneissa.  Mutta jos  laitat koodiisi
                     
yhdenkin   68030:n  komennon  romahtaa  yhteensopivuus,  ja   ohjelmasi
                     
toimii  ainoastaan  koneilla   joissa  on  68030  tai  uudempi.   Miksi
                     
sitten   tehdään   uusia  prosessoreja,   jos  ne   kuitenkin  joutuvat
                     
käyttämään  vanhojen   käskyjä?   Syy   on   yksinkertainen:   Jokainen
                     
käyttäjä   haluaa  tietokoneensa    olevan  nopea   (ja  parempi   kuin
                     
naapurin  8-).   Uusien   prosessorien   uudet   käskyt   ovat  todella
                     
hyödyllisiä  silloin,   kun  halutaan   tehdä  ohjelma,   joka   toimii
                     
mahdollisimman  hyvin  tietyllä  koneella,  mutta  muilla  ei lainkaan.
                     
Uudet  käskyt ovat  nimittäin  mahdollista  tehdä muutamalla  vanhalla,
                     
mutta uudet ovat  huomattavasti nopeampia.  Myös  prosessorin  sisäisen
                     
arkkitehtuurin kehitys luo nopeutta ja leveämpiä väyliä.
                     
                     
                     
Tietokone,  jossa  on  pelkästään  pääprosessori,  on yhtä  hyödyllinen
                     
kuin  sähkökoje  ilman  sähköä.   Pääprosessorilla  on  apunaan  joukko
                     
apuprosessoreita,   jotka  ovat  yhteydessä  toisiinsa  väylän  avulla.
                     
Ja mitä  nopeampi väylä  on,  sitä suurempi on  koneen datansiirtokyky.
                     
Dataksi   luetaan   kaikki   se   tieto,   jota  tietokone   käsittelee
                     
numeerisina  arvoina,   siis  musiikkia,  kuvaa,  tekstiä  ja  tietysti
                     
prosessoreille  annettavat  käskyt.  Tietokone  EI  siis  osaa  erottaa
                     
tietoja  toisistaan,  sille  on  aivan  sama,  onko  luku  231  nuotti,
                     
kirjain  tai käskyn osa.   Meidän  tehtäväksemme  jää  kertoa  koneelle
                     
mitä se tarkoittaa juuri nyt.
                     
                     
                     
Tämän kirjoituksen (ja tulevien osien)  ohjelmaesimerkit on tehty perus
                     
STe:llä, ja ne toimivat KAIKISSA Atari-koneissa. Tällä diskettilehdellä
                     
on mukana  HiSoftin upea  assemblerkääntäjä,  joka on  nykyään vapaasti
                     
levitettävissä.  Mainittakoon,  että kääntäjän uusin versio on vieläkin
                     
parempi. Siis harkitse sen ostamista!
                     
                     
                     
Eli varsinaiseen asiaan:
                     
68000-prosessorissa  on 17 sisäistä  rekisteriä.  Nämä ovat nopein tapa
                     
käsitellä  tietoa,  koska  prosessori  ei  joudu käyttämään  väyläaikaa
                     
tiedon  hakua  varten.   Nämä  rekisterit   on  jaettu  3  eri  ryhmään
                     
seuraavasti:
                     
                     
                     
    1) 8 kpl 32-bittistä datarekisteriä, joita käytetään tiedon
                     
       varastointiin. Jos ohjelmasi sisältää vain muutamia muut-
                     
       tujia, on ne hyvä sijoittaa näihin rekistereihin.
                     
                     
                     
    2) 8 kpl 32-bittistä osoiterekisteriä, jotka nimensä mukaisesti
                     
       ovat erikoistuneet osoitteiden säilyttämiseen.
                     
                     
                     
    3) yksi 16-bittinen tilarekisteri, jonka avulla pääprosessori
                     
       tietää jos ohjelmaa ajetaan käsky kerrallaan (ja hiukan
                     
       muitakin tietoja). Toinen tärkeä käyttötarkoitus ovat vertailut,
                     
       joiden tulokset luetaan täältä.
                     
                     
                     
Kahdeksannella  osoiterekisterillä  on  myös  toinen  nimi,  SP ("stack
                     
pointer"),  ja se  sisältää  pinon  osoitteen.  Jos haluamme  suorittaa
                     
aliohjelman,   niin  prosessori  tallettaa  paluuosoitteen  (osoitteen,
                     
josta  hyppäsimme  aliohjelmaan)  pinoon.  Näin  voimme  suorittaa ali-
                     
ohjelmasta toisia aliohjelmia  ja kuitenkin prosessori tietää  jokaisen
                     
paluuosoitteen.  Pinoa voisi  kuvitella  halkokasaksi,  jonka  halot on
                     
otettava samassa järjestyksessä  pois kuin ne on kasaan ladottu,  sillä
                     
jos  otat  alimman  halon  pois,  romahtaa halkokasa täysin.  Samoin on
                     
pinossa  olevien osoitteiden laita,  eli kun olemme aliohjelmassa tulee
                     
prosessorin  lukea oikea paluuosoite  tai muuten kone "kaatuu".  Atari-
                     
koneissa pinoa käytetään myös parametrien  (lähtöarvojen) välittämiseen
                     
käyttöjärjestelmälle.
                     
                     
                     
Rekistereiden  nimet  alkavat  indeksistä 0.   Siis  ensimmäinen  data-
                     
rekisteri on D0 ja muut nimet ovat:  D1,D2,D3,D4,D5,D6 ja D7. Samoin on
                     
osoiterekistereissä,    eli   ensimmäinen   osoiterekisteri   ("Address
                     
register") on A0 ja muut ovat: A1,A2,A3,A4,A5,A6 ja A7 (josta käytetään
                     
myös nimeä "SP").  Tilarekisterin nimi on SR  ("Status Register").
                     
                     
                     
Mikseivät indeksit ala 1:sestä vaan nollasta?  Vastaus on helppo: Luvut
                     
0-7 voidaan  esittää 3:lla  bitillä,  jolloin käskyjen pituus pienenee.
                     
Yleensäkin  assemblerissa   käytetään  16 - kantaisia  lukuja  (heksat)
                     
normaalien 10-kantaisten  lukujen sijasta. Luvut voidaan myös ilmoittaa
                     
2-kantaisessa järjestelmässä  (binäärit),  mutta silloin luvuista tulee
                     
todella  pitkiä.  Kun  luku  ilmoitetaan  16- järjestelmässä  laitetaan
                     
assembler-ohjelmissa sen eteen dollari-merkki "$", ja 2-kantaista lukua
                     
ilmoittaa   prosenttimerkki "%".   Seuraavassa  muutama  luku  kaikilla
                     
kolmella järjestelmällä ilmoitettuna:
                     
                     
                     
    10-kanta        16-kanta        2-kanta
                     
     1               $1              %1
                     
     2               $2              %10
                     
     3               $3              %11
                     
     4               $4              %100
                     
     7               $7              %111
                     
     8               $8              %1000
                     
     10              $A              %1010
                     
     11              $B              %1011
                     
     12              $C              %1100
                     
     13              $D              %1101
                     
     14              $E              %1110
                     
     15              $F              %1111
                     
     16              $10             %10000
                     
     17              $11             %10001
                     
     32              $20             %100000
                     
     48              $30             %110000
                     
     100             $64             %10101000
                     
     255             $FF             %11111111
                     
     256             $100            %100000000
                     
     65535           $FFFF           %1111111111111111 (16 KPL!)
                     
                     
                     
Siis  kuten  huomaamme,   on  binääreitä   tuskallista   kirjoittaa  8-)
                     
Toinen  asia  on,  että kun heksaluvut  kasvavat yli 9,  niin  kirjaimia
                     
otetaan käyttöön.
                     
                     
                     
                     
                     
Assembler käskyt noudattavat tiukasti seuraavaa yleistä kaavaa:
                     
                     
                     
    käsky.koko      lähtöparametri(t),kohdeparametri(t)     * kommentit
                     
                     
                     
Näistä "käsky"  on  aina pakollinen ja muodostuu muutamasta kirjaimesta,
                     
jotka  ovat lyhenne  jostain  englannin  kielen  sanasta.  Muita  kohtia
                     
tarvitaan riippuen käytetystä komennosta.
                     
                     
                     
"koko" tarkoittaa parametrien kokoa ja voi olla jokin seuraavista:
                     
                     
                     
    B       ("byte")        1 tavu = 8 bittiä = 1 merkki tekstiä
                     
    W       ("word")        1 sana = 2 tavua  = 16 bittiä
                     
    L       ("longword")    1 pitkä sana = 4 tavua = 32 bittiä
                     
                     
                     
Koon voi jättää pois, jolloin kääntäjä käyttää oletusarvona sanaa ("W").
                     
Käskyn ja koon erottimena on piste.
                     
                     
                     
"lähtöparametri(t)"  on  käskykohtainen,  joten niitä   opit esimerkkien
                     
avulla.  "kohdeparametri(t)"  ovat  myös  käskykohtaisia,  joten  niistä
                     
tuonnempana.
                     
                     
                     
Kommentit  erotetaan  käskystä ja  parametreista  "*"-merkillä,  jota ei
                     
joissain  kääntäjissä  tarvita,   vaan   välilyönti  riittää  pelkästään
                     
erottimeksi.  Ohjelmiin  on  hyvä   lisätä  kommentteja,   koska  muuten
                     
ohjelman  toiminnasta  ei  saa  selvää  enää  puolen  vuoden   kuluttua.
                     
(Itse kuitenkaan en osaa/muista  kommentoida ohjelmiani, joten  eihän se
                     
 välttämätöntä ole!)
                     
                     
                     
Assembler- ohjelmien perustana on Atari-koneissa  käyttöjärjestelmä TOS,
                     
johon myöskin tutustumme aikaa myöten. Jokainen HYVINKÄYTTÄYTYVÄ ohjelma
                     
käyttää TOSin rutiineja, jolloin ohjelma toimii kaikissa Atari-koneissa,
                     
joissa TOS on.  Tämä on erittäin tärkeää nykyisin,  kun uusissa koneissa
                     
on  käytössä  moniajo,   jolloin  muutama  ohjelma  jakavat  prosessorin
                     
suorituskyvyn. Ohjelmat jotka "varastavat" kaiken tehon itselleen voivat
                     
kaataa  moniajosysteemin.  Tämä on  tärkeää  muistaa,  koska  assembler-
                     
ohjelmoijan on ITSE kannettava vastuu  ohjelman  "hyvästä  käytöksestä".
                     
Jos  ohjelma  varaa kaiken  vapaan muistin,  kaatuu kone aivan varmasti,
                     
koska muutkin ohjelmat tarvitsevat osansa kakusta...
                     
                     
                     
TOS  käyttöjärjestelmä  muistuttaa  suuresti PC-koneista  tuttua DOS(tm)
                     
käyttöjärjestelmää.  Tällaiset "kerrokselliset"  käyttöjärjestelmät ovat
                     
yleisiä,  koska vain  alimmat tasot  joudutaan  suunnittelemaan  uusiksi
                     
kun tuotetaan uusi tietokone.
                     
                     
                     
     " Käyttäjä & kone "
                     
                     
                     
           /---\
                     
           |o o|           Sinä?
                     
           | ^ |
                     
           | * |
                     
           \___/
                     
                     
                     
             |
                     
                     
                     
            AES             \
                     
             |                Graafinen käyttöjärjestelmä
                     
            VDI             /
                     
             |
                     
          GEMDOS            \
                     
           /  \               Tekstipohjainen käyttöjärjestelmä
                     
       BIOS -- XBIOS        /
                     
           \  /
                     
       Koneen "kovo"        - Atari ST(m/fm/f/e)/Falcon/TT/Mega ST(e)...
                     
                     
                     
Käyttöjärjestelmän  osasia  kutsutaan erilailla.  Yksinkertaisin käyttö-
                     
järjestelmän  osanen  on  nimeltään  BIOS  (Basic  Input/Output  System,
                     
"alkeellinen  syöttö- ja  tulostusjärjestelmä"),  joka  vastaa  ruudulle
                     
tulostuksesta  ja  printteristä,  levyasemista ja  muista alemman  tason
                     
tehtävistä.  Suurinpiirtein  samalla  tasolla  on XBIOS  (eXtended BIOS,
                     
"laajennettu BIOS "),  jolla on  harteillaan  printterin konfiguroinnit,
                     
RS-porttien  tilat,  keskeytykset (opit  näistä  joskus...),  musapiiri,
                     
ruudun värit... Nämä kaksi osaa hoitavat yhdessä kaiken "likaisen" työn.
                     
GEMDOS  on jo huomattavasti  korkeammalla,  koska se hoitaa massamuistin
                     
kirjanpidot  ja  muistin  varaukset.  GEMDOS  sisältää  myös  syöttö- ja
                     
tulostusfunktiot,    jotka   ohjataan    (X)BIOS:lle     käsiteltäviksi.
                     
Nämä osat  pitävät koneen  käynnissä ja  mahdollistavat  ohjelmien ajon.
                     
Hyvänä esimerkkinä ovat  ".TOS"- tai ".TTP"- päätteiset ohjelmat,  jotka
                     
eivät hyödynnä  grafiikkaa.  VDI hoitaa  grafiikan likaiset työt,  kuten
                     
viivojen piirtelyn ja hiiren kursorin piirtämisen. Se vastaa myös siitä,
                     
että  Atari-koneella voi  tehdä WYSIWYG  (What You See Is  What You Get,
                     
"saat mitä näet")  ohjelmia.  AES  vastaa mm.  ikkunoista,  menuista  ja
                     
".RSC"- tiedostoista.  Nämä graafiset  "taideteokset"  piirretään  VDI:n
                     
kutsuilla.  Jos ohjelmaan halutaan nopeutta, kuljetaan "Käyttäjä & Kone"
                     
kuvaa  ylhäältä  alas,   jolloin   laitteistoyhteensopivuus   laskee  ja
                     
ohjelmointityöstä tulee hankalampaa.
                     
                     
                     
Käyttöjärjestelmä  on  tärkeä  osa  konetta,  koska  jos sitä  ei olisi,
                     
joutuisi  jokainen   ohjelmoija   tekemään   omat   rutiinit  diskettien
                     
lukemiseksi ja hiiren seurantaan. Toisaalta  käyttöjärjestelmällä ei tee
                     
mitään,  ellei ole  ohjelmaa.  (Työpöytäkin on tarkkaan ottaen ohjelma!)
                     
Vasta kun nämä kaksi yhdistetään,  saavutetaan  se uskomattoman  kirjava
                     
ohjelmistotarjonta.
                     
                     
                     
                     
                     
Olemme nyt tarkastelleet hieman käyttöjärjestelmää, ja nyt voimme hiukan
                     
perehtyä assemblerkäskyihin.  Yleensä käytettyjä on vain muutama,  mutta
                     
niitä    yhdistelemällä    on   tämäkin     lehdenlukuohjelma     tehty.
                     
Ehkä  kaikkein   suosituin  "assemblerkäskyperhe"  on  MOVE  ("siirrä").
                     
Nimensä  mukaisesti näillä käskyillä siirretään tietoa paikasta toiseen.
                     
Yksinkertaisin  (ja yleisin)  käsky on puhdas MOVE. Käskyn koko voi olla
                     
tavu (.b),  sana (.w) tai  pitkä sana (.l).  Otetaan  muutama  valaiseva
                     
esimerkki:
                     
                     
                     
        (tavu=byte, sana=word, pitkä sana=longword, toim. huom.)
                     
                     
                     
Jos  haluaisimme  tallettaa  luvun  $1234  datarekisteriin  kaksi  (D2),
                     
kirjoittaisimme:
                     
                     
                     
    move.w  #$1234,d2
                     
                     
                     
Koska $1234  (4660) on  pienempi kuin  luku $ffff  (65535) voidaan  luku
                     
tallettaa  sanan  kokoisena.  Risuaita "#"  taas  tarkoittaa,  että  sen
                     
jälkeinen  luku on  talletettava  luku  itse,  eikä  osoite  josta  luku
                     
"noudetaan".  ",D2"  taas  tarkoittaa,  että  kohteena  on toinen  data-
                     
rekisteri (D2), pilkkuhan toimi erottimena!  Toisaalta,  jos haluaisimme
                     
tallettaa  luvun  $12345678  samaan  datarekisteriin,  niin  joutuisimme
                     
käyttämään  kokona pitkää sanaa (.l), koska luku $12345678 (305 419 896)
                     
on suurempi kuin $ffff (65 535):
                     
                     
                     
    move.l  #$12345678,d2
                     
                     
                     
Entäs jos  haluammekin  siirtää luvun,  joka on  suurempi kuin $ffffffff
                     
(n.  4 000 000 000)?   Se  ei  ole   mahdollista   yhdellä  käskyllä  ja
                     
rekisterien kokohan  on 32 bittiä,  jolloin ne  eivät  voisi edes moista
                     
lukua varastoida!!!
                     
                     
                     
Miten sitten  kirjainmerkin siirron kanssa tulisi  menetellä?  Kirjaimia
                     
esitetään  luvuilla  0 ... 255  siten,   että  ensimmäiset   32  merkkiä
                     
(0... 31) ovat ohjauskoodeja,  ja sen jälkeen tulevat graafiset  merkit.
                     
"A"-kirjainta esitetään luvulla $41 ja "B":tä luvulla $42. Olisi kuiten-
                     
kin  hankalaa  muistaa   nämä  luvut,  joten  jotta  saamme  A-kirjainta
                     
esittävän  luvun  kirjoitamme "A" tai 'A'. Nyt jos haluamme tallettaa A-
                     
merkin datarekisteriin 2 käy se seuraavasti:
                     
                     
                     
    move.b  #'A',d2
                     
	
                     
Koska  datarekistereitä  on vain  kahdeksan  kappaletta  loppuisi meiltä
                     
nopeasti varastointitila, ellei muistia olisi keksitty. Voimme tallettaa
                     
lukuja muistiin kirjoittamalla "d2":n tilalle osoitteen,  johon haluamme
                     
luvun siirtyvän.
                     
                     
                     
    move.b  #'A',$12345678
                     
	
                     
Siirtää  merkin  "A"  osoitteeseen $12345678.  ÄLÄ KUITENKAAN  tee näin,
                     
koska  jos koneessa  ei ole 305 MEGATAVUA muistia  niin käsky  aiheuttaa
                     
ohjelman kaatumisen (eli "pommituksen"). Miten siis voimme turvallisesti
                     
siirtää tietoa muistiin.  Vastaus on yksinkertainen: voimme antaa osoit-
                     
teelle nimen.  Ohjelmahan ladataan muistiin  ja käyttöjärjestelmä laskee
                     
meille osoitteen tarkan arvon.
                     
                     
                     
    move.b  #'A',kirjain
                     
kirjain:
                     
                     
                     
Nyt meillä on osoitteessa "kirjain" merkki A. Ainoa ongelma on, että jos
                     
lukumme  on suurempi  kuin  tavu ( >255 ),  niin  osoitteen  pitää  olla
                     
parillinen. EMME SIIS VOI KIRJOITTAA:
                     
                     
                     
    move.w  #$1234,$54321
                     
                     
                     
KOSKA $54321  on  pariton  osoite,  ja  kone  pommittaa.  Jos  kuitenkin
                     
kirjoitamme:
                     
                     
                     
    move.w  #$1234,luku
                     
luku:
                     
                     
                     
niin ongelmia EI synny, koska "luku" saa parillisen osoitteen!
                     
                     
                     
Voimme myös siirtää tietoa osoitteesta toiseen tai datarekisteriin:
                     
                     
                     
    move.b  $4321,$12345
                     
    move.w  $1234,d2
                     
    move.l  tieto1,tieto2
                     
	
                     
ovat  kaikki  toimivia,   kunhan  "tieto1"  ja   "tieto2"  ovat  jossain
                     
määriteltyjä. Pitää muistaa, että suoraan tiettyyn osoitteeseen kirjoit-
                     
taminen (esim. move.b #1,$1234) on vaarallista.  Kyseessäoleva osoitehan
                     
voi sisältää  ihan mitä tahansa,  kuten minun  kengännumeroni tai tiedon
                     
siitä, saako koneen resetoida... Osa osoitteista on suojattu tällaisilta
                     
"väärinkäytöksiltä".  Näihin osoitteisiin käsiksi pääseminen on hankalaa
                     
ja  se  vaatii  supervisor  (valvoja)  tilaan  siirtymisen  (jonka  opit
                     
joskus 8-).
                     
                     
                     
Seuraava pätkä on teoreettisesti toimiva:
                     
                     
                     
luku:
                     
    move.w  luku,luku2
                     
luku2:
                     
                     
                     
MUTTA,  mitä se tekee?  Lähteenä on "luku",  johon talletettuna on MOVE-
                     
käsky itse ja  kohteena on "luku2" eli seuraava muistipaikka.  Eli MOVE-
                     
käsky monistetaan. Jos ko. ohjelma ajettaisiin, ei virhettä synny, mutta
                     
onko ohjelma tehnyt mitään järkevää?  Ohjelman ajon jälkeenhän muistissa
                     
olisi "luvusta" lähtien:
                     
                     
                     
    move.w  luku,luku2
                     
    move.w  ???,???
                     
                     
                     
(???= on satunnainen osoite...)
                     
                     
                     
MOVE  käskyllä  on myös monia  muita  käyttötapoja,  joista  tärkein  on
                     
"epäsuora   autodekrementoiva  osoitus",   jolloin  prosessori  vähentää
                     
osoiterekisterin   arvoa  tietyllä  arvolla  ja   sitten  siirtää  luvun
                     
saatuun  osoitteeseen.   TOS  ja  680X0  käyttävät  osoiterekisteriä  A7
                     
pino - osoittimena.  Tällöin  A7  sisältää  osoitteen  uusimpaan  pinoon
                     
tallennettuun lukuun.  Jos haluamme siirtää luvun 12 pinoon kirjoitamme:
                     
                     
                     
    move.w  #12,-(a7)
                     
                     
                     
Aluksi prosessori noutaa osoiterekisteristä A7 sen sisältämän osoitteen.
                     
Sitten  siitä  vähennetään  2  (koska .w = 2 tavua).   Ja  saatu  osoite
                     
sijoitetaan  takaisin   A7:aan  ja   lopuksi  luku  12  siirretään  A7:n
                     
sisältämään osoitteeseen!  Jos kokona on .b vähennetään osoiterekisteriä
                     
yhdellä,  jos koko on .l on  vähennettävä neljällä.
                     
                     
                     
Huomaa,  että pinoa  käsiteltäessä on  osoitteen oltava aina parillinen,
                     
joten voimme käyttää vain kokoja .w ja .l !!!	  
                     
                     
                     
Jos siis haluamme siirtää merkin "A" pinoon, kirjoitamme:
                     
                     
                     
    move.w  #'A',-(a7)
                     
                     
                     
emmekä:
                     
                     
                     
    move.b  #'A',-(a7)
                     
                     
                     
Mitä sitten tapahtuu,  kun olemme siirtäneet  pinoon luvun  ja emme enää
                     
tarvitse sitä?  Voimme joko lukea  luvun pinosta,  tai vain lisätä pino-
                     
osoittimen arvoa.
                     
                     
                     
    move.w  (a7)+,d2
                     
                     
                     
lukee pinosta  sinne siirretyn  luvun ja lisää  pino-osoittimeen  kaksi.
                     
Jos emme tarvitse lukua, voimme kirjoittaa:
                     
                     
                     
    addq.l  #2,a7
                     
                     
                     
Tällöin pino-osoittimeen VAIN lisätään kaksi.
                     
                     
                     
ADDQ on  nopea versio  käskystä ADD (lisää),  haittana on se,  että ADDQ
                     
voi lisätä ainoastaan lukuja 1...8
                     
                     
                     
Käyttöjärjestelmää  kutsutaan  laittamalla  funktion  numero  pinoon  ja
                     
suorittamalla TRAP käsky. Tämän jälkeen korjataan pino.
                     
                     
                     
    move    #1,-(a7)
                     
    trap    #1
                     
    addq.l  #2,a7
                     
                     
                     
Laittaa pinoon funktio C_conin  (console input,  merkinluku näppikseltä)
                     
numeron  (1)   ja  kutsuu   GEMDOS:ia  (TRAP #1).   XBIOS:sia  kutsutaan
                     
"trap #14",  BIOS:sia  "trap #13" ja  AES/VDI:tä "trap #2",  mutta koska
                     
et tiedä vielä funktioiden numeroita,  niin ÄLÄ yritä kokeilemalla niitä
                     
selvittää. Voimme tulostaa merkin:
                     
                     
                     
    move    #'A',-(a7)
                     
    move    #2,-(a7)
                     
    trap    #1
                     
    addq.l  #2*2,a7
                     
                     
                     
Seuraavassa  on   pieni  assembler - ohjelma,   jonka   löydät  myöskin
                     
disketiltä   nimellä:   HELLO.S.   Jotta   saat  sen  käännettyä  tulee
                     
sinun  ajaa  GENST-ohjelma,  jonka  löydät  paketista  DEVPAC.ARC tältä
                     
disketiltä.  Sitten  lataat  sen ("load")  ja  käännät  ("assemble") ja
                     
kokeilet  ("execute").  Ohjelmassa   on  kommentit  merkitty   alkamaan
                     
"*":llä, joten huomaat ne helposti!
                     
                     
                     
                     
                     
     *********************************************************
                     
     *                       HELLO.S                         *
                     
     *       Tehnyt: Lasse Sundström 1994                    *
                     
     *       Copyright 1994 Lasse Sundström                  *
                     
     *       Käyttö sallittu vain ST-KLUBI RY:n jäsenille    *
                     
     *                                                       *
                     
     * Ohjelma EI ole taidonnäyte, vaan yksinkertainen       *
                     
     * esimerkki assembler-ohjelmasta!                       *
                     
     * En ota vastuuta ohjelman aiheuttamista henkisistä tai *
                     
     * fyysisistä vaurioista.                                *
                     
     *********************************************************
                     
                     
                     
alku:
                     
* Tässä määritellään ohjelmaan paikka 'alku', johon voidaan vaikkapa hypätä
                     
                     
                     
    lea     omapino,a7
                     
* Otetaan oma pino käyttöön, jolloin voidaan vapauttaa muistia
                     
                     
                     
    move.l  #4096,-(a7)
                     
* Laitetaan luku 4096 pinoon pitkänä sanana
                     
                     
                     
    move.l  #alku-256,-(a7)
                     
* Laitetaan alku-kohdan osoite -256 pinoon (elikkä ohjelman todellinen
                     
* alkuosoite). 
                     
                     
                     
    clr     -(a7)
                     
* Tyhjennetään seuraava sana pinoa (muista, että oletusarvo koolle on w)
                     
                     
                     
    move    #$4a,-(a7)
                     
* Laitetaan luku $4a pinoon sanana
                     
                     
                     
    trap    #1
                     
* Kutsutaan käyttöjärjestelmää(GEMDOS). Kutsun numero on viimeisin pinoon
                     
* talletettu luku ($4a). Kutsu $4A on nimeltään "shrink memory" eli
                     
* vapauta muistia. parametreinä on nolla,ohjelman tod. alku,ja paljonko
                     
* jätetään. Kaikki parametrit laitetaan pinoon.Nyt moniajokin toimii!
                     
                     
                     
    add.l   #12,a7
                     
* Palautetaan pino normaaliksi. Eli lisätään parametrejä vastaava
                     
* määrä pinoon pitkäsana-toimintona. (2*sana ja 2*pitkäsana = 2*2+2*4=12)
                     
                     
                     
    move.l  #heippa,-(a7)
                     
* Laitetaan heippa-kohdan osoite pinoon
                     
                     
                     
    move    #9,-(a7)
                     
* Laitetaan luku 9 pinoon
                     
                     
                     
    trap    #1
                     
* Kutsutaan GEMDOS:sia. kutsun numero on 9 eli näytölle tulostus.
                     
                     
                     
    addq.l  #6,a7
                     
* palautetaan pino. nyt käytetään ADD QUICK-käskyä, koska lisättävä
                     
* luku on pienempi kuin 8. Se on huomattavasti lyhyempi ja nopeampi
                     
* kuin add.l-käsky.
                     
                     
                     
    clr     -(a7)
                     
* laitetaan luku 0 pinoon
                     
                     
                     
    trap    #1
                     
* ja kutsutaan GEMDOSsia. kutsu 0 lopettaa ohjelman ajon.	
                     
                     
                     
    heippa: dc.b    "Heippa! Ohjelma toimii sittenkin",13,10
                     
* määritellään heippa-kohta ja laitetaan suluissa oleva teksti
                     
* dataksi. Datahan tulostetaan näytölle. ",13,10" tarkoittaa, että
                     
* kursori siirretään seuraavan rivin alkuun!
                     
                     
                     
    dc.b    "Tämäkin rivi tulostui!",0
                     
* tämä data-alue liitetään tuohon edelliseen, koska GEMDOS kutsu 9
                     
* tulostaa merkkejä ruudulle kunnes kohtaa tavun, jonka arvo on nolla.
                     
* ",0" tarkoittaa, että tavulle annetaan arvo nolla.
                     
                     
                     
*      Ohjelma siis tulostaa näytölle:
                     
* Heippa! Ohjelma toimii sittenkin
                     
* Tämäkin rivi tulostui!
                     
*      (siis tietysti ilman *-merkkiä, joka tekee rivistä kommentin!)
                     
                     
                     
------------- loppu -------------
                     
                     
                     
  Tämä oli siis ensimmäinen osa Lasse Sundströmin tekemästä assembler-
                     
  kurssista. Tällä levykkeellä on DevPac 1- assemberkääntäjä, jonka
                     
  avulla voit kokeilla edelläolevaa esimerkkiä ja tehdä omia ohjelmiasi.
                     
                     
                     
  Tarkoitus on jatkaa tätä kurssia ja aloittaa mahdollisesti uusia
                     
  ohjelmointikielistä kertovia artikkeleita. Ainakin C-kieli ja GFA
                     
  Basic ovat mahdollisia, myös Pascalia voidaan ajatella jos Klubista
                     
  löytyy joku Atarilla Pascalia käyttänyt.
                     
                     
                     
  Toivomme palautetta kursseista ja tietoja siitä, mitä te, lukijat,
                     
  toivotte. Otamme tietenkin mielellämme vastaan materiaalia teiltä.
                     
                     
                     
        Ville Norrman, päätoimittaja

Takaisin

(C) Marko, Suomen Atari-sivut / ArkiSTo 2003