DPTP motor: ...
DPTP motor: ...
Írjunk játékot SEGA MEGA DRIVE konzolra - 4. M68K Assembler
Blog
2019-08-07 22:08
don_peter
Írások: 13


M68K Assembler

Beszédes főcím! A most következő bejegyzésemben a SEGA-ban is helyett kapott Motorola 68000-as MCU néhány talán legfontosabb utasításait fogjuk átvenni. Összesen 56 utasítást ismer az M68K, de mi ebből talán jó ha felét vagy negyedét fogjuk használni. Persze később mikor már profibbak leszünk az utasítások terén és persze a hardver ismeretünk is kellőképpen kiszélesedik, eljuthatunk akár oda is, hogy mind az 56 utasítást ismerni és használni is tudni fogjuk.

Sokat gondolkodtam, hogy leírva vagy videón lenne ezt jó bemutatni, átadni végül arra voksóltam, hogy írok és ha szükséges főként talán az elején, amikor az EASy68K programmal ismerkedünk készítek videó betéteket. Azért nem az összesről mert akkor nem lenne értelme a blognak, hiszen ennyi erővel youtubeon is megoszthatnék mindent és nem lenne szükség erre a gyűjtő oldalra. Szóval marad a blog mivoltja blog és a youtubera csak egy két ehhez erősen csatlakozó tartamot töltök fel. Nos ha telepítettük az EASy68K programot, akkor indítsuk el az EDIT68K.exe fájllal.



Ha mindent jól csináltál akkor kezdésnek a fentebb beágyazott indulási képet kell látnod. El is kezdhetjük az első kis utasításunkat beírni és értelmezni mi is történik mikor az végrehajtódik. Az első ilyen utasítás amit kielemzünk az a move talán az egyik legtöbbször használt utasítás, amely a programuzásunk alatt előfordul.

move:
A move utasítás annyit tesz, hogy egy bizonyos adatott mozgat valahová. A példánkban 3 formáját mutatom be, amelyeknél bájt, szó és dupla-szó méreteket lehet mozgatni. Gyorsan jegyezzük meg, hogy az M68K regiszterei 32bit-esek, vagy is dupla-szó mérettel tudnak dolgozni. Nézzük is, hogyan néz ki élesben az utasítás.

move.b #$0F, d0 ; 1 bájt adatot mozgatunk d0 regiszterbe
move.w #$0F0F, d1 ; 2 bájt adatot mozgatunk d1 regiszterbe
move.l #$0F0F0F0F, d2 ; 4 bájt adatot mozgatunk d2 regiszterbe

Részletezzük: a move szó maga az utasítás, a .b, .w és .l pedig, hogy mekkora adatot akarunk mozgatni. b = bájt (byte), w = szó (word), l = dupla-szó (long). Ezen felül van még move utasításnak más változata is, ami a gyors másolásért felelős, de ez most nekünk nem kell és felesleges vele foglalkozni az elején. Amúgy elmondható, hogy a legtöbb mozgató vagy aritmetikai műveleteket végző utasításnak van kiegészítő (gyorsító) utasítása, amely gyakran az utasítás előtagjához csapott i betű jelöl. 

Tehát vegyük a pirossal jelölt utasítássort és beszéljük végig. Itt 1 bájtot másolunk d0-ás regiszterbe. Ehhez azonban jó, ha képben vagyunk azzal, hogy az M68K procinak 8 adat regisztere és 8 címregisztere van. Most csak az adatregiszterekkel játszunk. Az adat regisztereket egyszerűen az angol data szó első betűjével és a regiszter számával jelölik. Mi itt most a d0-ás regisztert használtuk,  és 1 bájt adatot másoltunk bele. A d0-ás regiszter alap állapotban, tehát majd SEGA hardver indításánál bármilyen értéket felvehet ezért célszerű kezdésként nullázni. Erre majd a cls utasítás lesz hasznunkra, de ez majd később. Tehát vegyük azt, hogy alap értelmezetten a d0-ás regiszterünk üres vagy is a 32bit mindegyike nulla állapotban van. D0 = 0x00000000, ha egy bájtot mozgatunk át és az a bájt 0x0F (#$0F) akkor a d0-ás regiszter a következő értékre változik: D0 = 0x0000000F vagy is az alsó 4bit nullűról 1-es értékre vált. Ha bitekben akarjuk ugyan ezt ábrázolni, akkor a következőt kapjuk és itt csak az alsó 8bit-et fogom mutatni: D0 = 0b00000000 (#%00000000)és adat mozgatás után, D0 = 0b00001111 (#%00001111)
Két karakter van még az utasítás sorban amely esetleg magyarázatot igényel, az egyik a kettős kereszt (#) ez azt jelöli, hogy a megadott adat abszolút értékét adja át és a dollár jel ($), amely a hexadecimális formátumot jelöli. Tehát a #$0F-et matathatnánk decimálisan a következő képen: #15. Utasításban a következő képen nézne a ki:

move.b #15, d0 ; 1 bájt adatot mozgatunk d0 regiszterbe

Az utasításunk végén pedig látható a komment szekció, amelyet egy pontosvessző ( ; ) után adhatunk meg.
Lássuk mind ezt a programunkról készített képen is.



A fentebb rögzített képen nagyszerűen látszanak az utasítások, hogy még is miképpen hajtódnak végre. A kép alsó-középtáján látható színekkel a kiemelés, melyek kiértékelésüket követően a kép bal-felső kiemelt regiszterekbe másolódnak. Van még egy érdekesség ami nem árt ha megjegyzünk, az pedig a bekarikázott kis jobbra mutató nyilacska, amellyel a programunkba tudunk soronként (utasításokként) végig lépkedni és figyelni a változásokat.

Majd el felejtettem, ha megírtuk az utasításokat és elindítjuk a szimulátort egy táblát fog feldobni a program mely arról tájékoztat bennünket, hogy követtünk e el hibát. Ha nem akkor kattintsunk az Execute gombra.



clr:
A clr utasítás meglehetősen egyszerű, hatására pedig törlődik az utasítás utáni adatregiszter tartalma egy szó hosszan. (word) Ha az egész regiszter adatát akarjuk törölni, akkor kiegészítésnek a .l kiterjesztést használjuk, ekkor mind a 32bit nullára áll.

clr   d0                  ; töröljük d0 tartamát (csak szó hosszan)
clr   d1                  ; töröljük d1 tartamát (csak szó hosszan)
clr.l d2                  ; töröljük d2 tartamát (teljes dupla-szó)

Én úgy gondolom ennél több okfejtés ez az utasítás nem igényel, használjátok bátran.

A következőkben megismerkedünk az aritmetikai utasításokkal, melyekre nagyban fogunk támaszkodni mikor egy-egy bonyolultabb vagy önmagában nagyon hasznos programot írunk. 4 ilyen utasítással kell megismerkedni, de magyarázni szerintem nem nagyon kell majd. Összeadás, kivonás, szorzás és osztás.



Ezen utasítások pontosan azt csinálják amit elvárunk tőlük, az eredmény mindig abban a regiszterben jelenik meg (felülírva az előző adatot), amelyen elvégezzük a műveletet. Ezen aritmetikai utasításokat érdemes megjegyezni, sokszor kell majd használni..

Következő pár utasítás a logikai műveleteket könnyíti meg, ezek már sokkal bonyolultabbak mint az aritmetikai utasítások. Ezen utasításokat a SEGA VDP memóriájának összetettsége miatt nagyon fontos megismernünk és tudnunk, hogyan is érhetjük el őket.



További logikai utasítások lehetnek még: ROR, ROL, ROXL, ROXR...stb

A következőben már egy kis programot írunk a fentebb tanultakkal, talán a legfontosabb lesz ez a kis szösszenet, hiszen a program lényege a ciklusosság, ezért ez az első amit meg kell értenünk, hogy is működik. A programban csak egy ismeretlen van, a dbra utasítás, ami csupán annyit tesz, hogy minden lefutásnál megvizsgálja d0 regiszter tartalmát és ha nem egyelő nullával, akkor levon egyet d0 regiszter értékéből és vissza ugrik Ciklus: címkéhez, ezzel létrehozva egy ciklusosságot.



Tehát mint a képen is látható d0 regisztert törjük, hogy ha esetleg újabb programunk használja, akkor üres legyen, de legalább is ne befolyásolja a programunk további működését. d1 értékét csak azért növeljük minden ciklusban 1-el, hogy valamit csináljon is a program és így látjuk is a ciklusok számát a programban.



Ez utóbbi képünk pedig csak azért, hogy tudjuk és ne feledjük, hogy a programban jól használható segítséget is találunk minden utasítással és azok leírásával. Érdemes tanulmányozni egy-egy utasítást külön-külön is.

Úgy gondolom ezek azok az alap utasítások, amelyeket jobb ha már az elején tudunk és megismerünk, de a későbbiek folyamán egyéb más utasításokkal is fogunk találkozni, de hogy ne legyen sok és tömör egyszerre, ezeket az utasításokat használatuk közben fogom majd bemutatni, így képesek leszünk majd valamihez vagy valamilyen programkörnyezethez, programrészhez kötni. Gyakorlódjatok sokat, hogy simán fejből menjenek ezek az utasítások, mert később nagyon megkönnyíti majd a programozást.

Interneten is elérhető az utasítás készlet, melyet ide kattintva el is érhettek: Kattints ide
Fentebb látható kódrész Easy68K programhoz.: Kattints ide
Természetesen ezen cikk végéről sem maradhat le azon link mutatója, ahol feltehetitek kérdéseiteket a témában: Írjunk játékot SEGA MEGA DRIVE konzolra

Az erő legyen veletek.. ;)
DPTP motor: GDPR infomráció!
2018 Május 25.-től hatályba lépett adatvédelmi szabályzatról itt olvashatsz bővebben: Adatvédelmi tájékoztató
Az oldal további használatához el kell olvasnod és fogadnod az adatvédelmi és cookie-k használatával kapcsolatos tájékoztatonkat.

Elfoadom!
Nem fogadom el!