Írjunk játékot SEGA MEGA DRIVE konzolra - 8. JoyStick
Blog
2020-02-05 11:37
don_peter
Írások: 44
JoyStick - Kontroller használata
Immáron a 8. fejezetnél tartunk, ebben a mostani bejegyzésben egy kicsit jobban megismerkedünk a SEGA MD kontroller működésével és írunk egy kis programot, amellyel demonstrálhatjuk a működést. Sajnos ez megint egy bonyolultabb részét képezi a blog sorozatomnak, de összességében elengedhetetlen, ha inputot váró programot akarunk írni.
IPNPUT:
A SEGA MD konzolunkon összesen háromféle bemeneti periféria található, ebből az első az a kontroller bemenet vagy bemenetek, amelyet a konzolunk frontján találhatunk és rendszerint a joystick-eket dugjuk ezekbe a portokba. Persze nem csak joy-t, hanem más optikai vezérlőket, pl. fénypisztolyokat is az előlapi kontroller csatlakozóba csatlakoztatjuk. A konzol oldalában egy burkolati elemmel elrejtett élcsatlakozó is található, amely ki és bemeneti perifériaként is funkciónál, erre köthetjük fel a SEGA CD kiegészítőnket és egyéb, akár homebrew rendszereket is.
Homebrew jelentése: (csak akkor olvasd ezt a részt, ha nem tudod a szó jelentését)
A homebrew (ejtsd: hómbrú) szó maga eredetileg az otthon főzött szeszre
utal, de itt most semmilyen alkoholos italról nem lesz szó. Azokat
a szoftvereket nevezik homebrew-nak, amelyek valamilyen
konzolplatformra készültek, de nem rendelkeznek hivatalos licenccel.
Általában rajongók, hobbiprogramozók készítik őket, és rendszerint a
futtatásukhoz valamilyen módosítás, extra hardver, stb. tehát
mindenképpen plusz erőfeszítés szükséges a felhasználó részéről. A
homebrew maga nem feltétlenül illegális (habár a konzol lelkivilágába
történő beavatkozások a garancia elvesztésével járhatnak, de ez sem
mindig van így), de rendszerint a homebrew-t futtatni tudó készülék
képes illegálisan másolt játékprogramok futtatására is, mert megkerüli
azokat a mechanizmusokat, amelyek ellenőrzik a hivatalos licenc
meglétét a program indításakor. Ezért számos konzolgyártó erőteljesen
küzd a homebrew ellen, ilyen például a Sony. Más gyártók ugyanakkor nem
fordítanak különösebben sok energiát erre a harcra (ilyen például a
Nintendo, mint látni fogjuk), szintén mások pedig támogatják az efféle
otthoni fejlesztéseket (ilyen a Gamepark Holdings, aminek külön homebrew-ra tervezett konzolja is van a piacon).
De amit sokan nem sejtettek, vagy nem tudnak az a konzol hátsó fertályán lévő 9 tűs EXT névre hallgató DSUB csatlakozó, amelyen egy soros port (serial port) érhető el, ezt a portot anno az online játékok miatt hozták létre, amely Amerikába és japánban el is indult, de sajnos Európában nem volt lehetőség a használatára és így a későbbi modellek esetében már nem is kerültek kivezetésre.
Erre a portra egy MEGA MODEM névre keresztelt külső kiegészítőt lehetett rácsatolni, amely megteremtette a gép és az internet közötti adatátviteli réteget.
Adatátvitelre visszatekintve abszolút nem volt túl erős a maga 2400 baudrate vagy is 2400 bit / másodperc sebességével. Néhány helyen rebesgetik hogy esetleg képes volt a 19200 baud-ra is, de hivatalosan csak a 2400 baudrate van megerősítve. Legtöbb esetben a homebrew fejlesztők inputra használják, olyan adatok bevitelesre, amelyet egy másig gép programja előre megformázva küld, majd ez az adatot a SEGA-ra megírt program fogadja és feldolgozza. Láttam egy olyan projektet, amely egy elég komoly szintetizátort csinált a SEGA MD-ből. Lehet későbbiekben mint bemeneti interfészt, be fogom mutatni az EXT port működését és használatát.
További perifériák is vannak, de ezek már részben vagy teljes egészben kimeneti perifériák, ilyenek pl. az audio, videó kimenetek illetve a reset és a bekapcsoló gombok. Van még egy bemeneti periféria, de azt rendszerint a játékok csatlakoztatására használjuk, tehát az olyan mint ha állandóan benne lenne, így nincs is sok értelme perifériának nevezni..
Nocsak mostanra vissza olvasva, amiket írtam, elég jól végig vettük a dolgot és jól elcsacsogtam az időt, ideje foglalkozni azzal is, ami miatt valószínűleg te is ide tévedtél. Hogyan is működik a kontroller.
Amikor a SEGA MD konzolhoz csatlakoztatjuk a kontrollerünket, akkor az a csatlakozón keresztül feszültség alá kerül és a benne lévő IC valamilyen analóg módon tudatja azt a konzollal, hogy jelen van és hogy melyik portban van jelen. Ez történhet szimpla szintillesztéssel, de akár egy valamilyen ellenálláson keresztül történő feszültség méréssel is.Maradjunk a szimpla Analóg azonosításnál, mert nem akarok túlságosan a hardver részébe belemenni, felesleges lenne és mivel az már készen van ezzel igazából törődnünk sem kell. Programból viszont a hardveres azonosításokat és a kontroller állapotát vagy pillanat állapotát le tudjuk kérni. Erre van nekünk pontosan 4 regiszterünk. Két regisztert felelős a kontrollerek vezérlésére és a másik kettő regiszter pedig a vezérléstől függően a visszatérési értéket fogja tárolni.
Hogy is néz ki egy állapot lekérés: (csak az 1. kontroller állapotával foglalkozunk, hogy egyszerűbb legyen)
- első lépésben inicializálni kell a használni kíván portokat (ez esetben mind két joy portot, de később csak az 1-est használjuk), az inicializálásban egy úgynevezett latch byte-ot töltünk a cím regiszterekre, amelyek az alap állapotot adják meg nekik
- második lépésben az 1-es vezérlő címére nullákat írunk, ezzel jelezve neki, hogy adatot kérünk, ez a lépés egyben a lutch biteket is törli
- harmadik lépésben két órajel szünetet hagyunk, mert a gyári adatok szerint, ha túl gyorsan olvassuk ki az adatportot és még nem állnak be a megfelelő bitek, hibás adatokat kaphatunk.
- negyedik lépésben beolvassuk az 1-es kontrollerhez tartozó adatportot és az adatot eltoljuk balra 8 bitet mivel 2 byte adatot várunk
- ötödik lépésben vissza írjuk a kontroller vezérlő címére a kezdeti inicializáláskor is megadott latch biteket majd ismét várunk 2 óra jelet pont mint a 3. lépésben
- hatodik lépésnél kiolvassuk a második byte-ot, amelyet az első eltolt byte-hoz kapcsolunk, így kapva egy word (szó) hosszúságú adatot, ami 16 bitet tartalmaz.
- hetedik lépésként negáljuk a kapott biteket, vagy is minden 1-es bit 0 lesz és minden 0 bit 1-re vált
- nyolcadik lépésben hozzáadunk 1-et a kapott adathoz, majd maszkoljuk az összes bitet és az így kapott eredményből kiderül mely gombok lettek lenyomva.
A maszkolás gyakorlatilag egy olyan logikai AND utasítással történő művelet, amelynek eredményeként megtudhatjuk, hogy mely bitekben tér el az adat egy maximális minden gombot lenyomott esettől. A kapott eredményeket feldolgozva pedig láthatjuk a gombok állapotát, amelyeknél ha az adott adat gombhoz rendelt bit állapota 0 akkor le van nyomva, ha 1 akkor nincs lenyomva. Uhh, nem is olyan egyszerű igaz? Ne add fel még.. ;)
A regiszterek és annak értékei és kiértékelésében a következő ábra lesz segítségül:
Bináris formában a következő adatot kapjuk:00SA0000 00CBRLDU
Minden karakter 1 bit-et jelöl, a 0-ás helyeken nincs adat vagy is nem értelmezendő, a többi helyeken lévő karakterek a kontroller gombnyomásainak bitjei. Összesen 16bit de ebből csak az SA CBRLDU 8db bit érdekes.
0 = nincs értelmezve
S = START
A = A akció gomb
C = C akció gomb
B = B akció gomb
R = RIGHT (jobbra)
L = LEFT (balra)
D = DOWN (le)
U = UP (fel)
Tegyük hozzá gyorsan, hogy ezzel csak az egyszerű és normál 3 akciógombos kontrollert tudjuk használni, a MegaDrive II. konzolhoz kapott 6gombos kontrollernél kicsit bonyolultabb a kód mivel még további 3 akciógombot kell figyelni.
A korábban említett maszkolási folyamatot ha valaki nem érti az jelezze nekem fórumon és elmagyarázom, hogy miképpen működik, de aki kicsit jártas a programozásban és a logikai műveletekben, annak nem okozhat problémát.
Az alap programunk nem sokban változik, összességében elég könnyen integrálható a kontroller használata, alig pár dolg változik és már is használható. Sorban ezekkel módosul a program.:
ROM_Start: Kontroller.asm fájlal bővült.
A gombokhoz betűket kell rendelni, az ascii táblázat alapján, így minden gombhoz egy egyedi ID azonosítót rendelünk, igazából ez az azonosító a karakter ascii táblában elfoglalt helyét tükrözi.
Az inicializációs rész csak ezzel az egy sorral bővül.
A megszakítást kezelő rutin függőleges kiszolgálása bővül a PAD_ReadPadA rutin hívással, amely kiolvassa regiszter tartamát és a vissza kapott adatot a DrawPadState rutinnal feldolgozza, és így megjelenik a képernyőn a kimenet.
A kód legalján a Rutinok includolása bűvöl 1 sorral, amely a kontroller rutinokat tartalmazza.
Nincs más hátra mint a kimenet megtekintése, próbáltam úgy fotózni, hogy látható legyen, ha le van nyomva néhány különböző gomb..
Nem feltétlen nehéz ez a mostani rész, de megbonyolíthatja a programunk összetételét, nem kicsit. További módosítás szükséges, ha a 2. kontrollert is használni akarjuk és így nem feltétlen jó ez a mostani, bár könnyedén módosítható. Jelenlegi program direkt teszt programként készült, így érdemes megfontolni a konkrét kontroller olvasás metódusait és lehetőség szerint az olvasáson kívül a feldolgozó rutinokat közvetlen a megszakításon belül kezelni. Mindenképpen gyorsabb lenne és jobb. Azt sem szabad elfelejteni, hogy ez a mostani demó program, nem képes a pergésmentesítésre, tehát ha egy gombot folyamatosan nyomva tartunk, akkor a programunk e szerint folyamatosan lenyomva értelmezi. Ezt most lehet nem fogod hibának érezni és úgy gondolod, hogy ez így jó, de sajnos nem. A programunk egy gombnyomást jobb ha csak 1szer értelmez mert ha egy adott gombnyomásra egy program elindul és abban a programban is használod ugyan azt a gombot, akkor nem várt és nagyon gyors programlépkedéseket és lefutásokat eredményezhet. Tehát minden esetben ha programokat kötünk a gombokhoz érdemes ezt figyelembe venni és a megfelelő módon kezelni a pergésmentesítést is. Azt hiszem talán ki is veséztük a témát, és úgy vélem elég komoly szinten bele is mélyedtünk a működésébe, remélem segítségetekre lesz ez a bejegyzés és sikerrel tudjátok alkalmazni a programjaitok megírásakor.
Mindenkinek sok sikert és kitartást kívánok a projekt megírásához.
A projekt fájlt innen tölthetitek le: DPTP_oktato_4.zip
Az eddigi megjelent BLOG bejegyzéseim a témában:
Írjunk játékot SEGA MEGA DRIVE konzolra - 8. JoyStick (itt vagy most)
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
Sajnos még nincsenek bejegyzések!