Furcsa egérbug a VICE-ban

 2013.01.19. 04:15

Régen egzotikus ritkaságnak számított a Commodore egér, és csak nagyon kevés alkalmazás használta (pl. az Art Studio vagy a GEOS). Ma már más a helyzet: létezik egy adapter, amivel tetszőleges PC-s egér illeszthető a C64-hez úgy, mintha az egy 1351-es lenne (ez a Micromys); illetőleg létezik már hardver-emuláció (pl. a Turbo Chameleon-ban), és szoftver-emuláció (pl. a VICE-ban). Továbbá még akár van is mihez használni (pl. a MSSIAH). Ezek után, ha valaki új programot ír, már érdemes is lehet támaszkodni rá. (Többek között ugye én is ezt tettem.)

1351.jpgA VICE-ban pedig az a jó, hogy szinte mindent kiválóan emulál; nemcsak az egeret, hanem még a fényceruzát is. Utóbbit is egérkattintáson keresztül: amikor egy Windows-ablakban fut a VICE (és aktiválva van a fényceruza-emuláció), olyankor ha belekattintunk az egérrel, az egy, a fényceruzának a képernyő adott pixeléhez való érintését emuláló (vagyis annak megfelelő) megszakítást vált ki az emulátorban. (Amennyiben a 1351-es egéremulálást szeretnénk inkább helyette, úgy azt is engedélyeztetni kell – például az ALT + Q billentyűzetkombinációval, vagy pedig a menüből –, így az ablakban az emulált egér átveszi a Windows-egér szerepét.) Mindez pedig (többek között) arra jó, hogy tudunk olyan C64 alkalmazást írni a segítségével, mely harmonikusan beleilleszkedik a Windows futtatási környezetébe; hasonlóan az olyan, kissé „oldskool” stílusú (azaz eredetileg még DOS-os karakteres felületből kiinduló) programokhoz, mint pl. a különféle „Commander”-ek (pl. a Star Commander). Ha igazán jók akarunk ebben lenni, akkor viszont mind az egér-, és mind pedig a fényceruza-emulációkat le kell programoznunk benne korrektül.

Persze, egyik sem egy egyszerű eset, bár én most már félig-meddig megküzdöttem velük (mind a kettővel). Eltartott egy ideig, mire megfejtettem, hogyan működik az egész; pl. a fényceruzához egy (a raszter IRQ-hoz hasonlító) külön megszakításrutint kellett írni, ami az érintéskor vagy a nyomvatartáskor folytonosan végrehajtódik, majd ezen belül átlagolni az eredményeket (a vízszintes koordináta pontatlansága miatt); az egérhez pedig a SID chip megfelelő A/D regisztereit a megfelelő ütemezésben olvasni (sem túl sűrűn, sem túl ritkán, miután az analóg/digitális átalakítóhoz alkalmazott kondenzátor feltöltődési és kisülési idejének van egy optimális ritmusa), majd a relatív elmozdulási értékeket addig-addig gyúrni, számolgatni, mígnem kialakul belőle egy használható érzékenységű és viselkedésű valami. Beletellett néhány hétbe; utána még szintén néhány hétig szívatott egy furcsa bug, mely eleinte kimondottan parajelenségnek látszott. Azóta már megfejtettem, mi történik (azt még mindig nem, hogy miért), és leírom, mert hátha később másnak hasznos lesz.

lightpen.jpg

Az volt a furcsaság, hogy amikor az egér jobb gombjával kattintottam, szétesett az egér-sprite. Négy sprite-ból van összeszerkesztve az egérmutató (hogy nagyfelbontású és többszínű legyen), és mindegyik kattintáskor egy csomó „szemét” került rá a képernyőn. A négy sprite-rajzolat a $0200-$0300 (azaz 512-768) közti területen helyezkedik el a memóriában, és eleinte tökéletes rejtély volt, hogy milyen összefüggés lehet aközött, hogy kattintok, illetve hogy spontán megváltozik ebben néhány bájt. A válasz: a VICE emulátor valamiért (?) azt csinálja, hogyha jobbgomb-rákattintás történik a képen, akkor elkezdi szépen belelapátolni a Windows-vágólapon lévő aktuális összes adatot (!) a C64 oprendszere által eredetileg még billentyűzetpuffer céljaira használt memóriaterületére. Tehát spontán felülíródik a $0277-$0280 (azaz 631-640) közti tíz bájt, plusz a $c6 (azaz 198) memóriacím. (Hogy nekem itt saját változóim vannak, az az emulátort nem érdekli már… Az csak puszta véletlen, hogy éppen erre a területre tettem őket, viszont máskülönben sosem derült volna ki.) Utólag már könnyű persze okosnak lenni: pillanatok alatt reprodukálható a jelenség. Például a jelenlegi cikk szövegét a vágólapra másoljuk, majd elindítjuk a VICE-t, s az egér jobb gombjával kattintunk… Az eredmény (egy részlete) a következő képen látható.

ros3.jpg

Tehát ez egy „veszélyes” memóriaterület a VICE-ban. (Végül is a hibát csak egy bonyolult eljárással tudtam elhárítani: a tíz bájtról egy biztonsági másolatot kellett tárolni, majd állandóan figyelni, hogy a $c6-os cím értéke változik-e spontán nulláról, s ha igen, akkor visszaállítani azonnal.) Csak azt nem értem, mi a fenének van benne ez a (számomra teljességgel értelmetlennek tűnő) furcsa funkció a VICE-ban. Vagy hogy egyáltalán mi akar ez lenni? Mire (lenne) jó amúgy…? (Valaki, légyszí, válaszolja meg.)

(a téma folytatása: Hátrább az egerekkel!)

Címkék: windows bug programozás egér sid c64 sc sprite vice irq chameleon micromys c128 fényceruza 1351 art studio geos

A bejegyzés trackback címe:

https://rosetta.blog.hu/api/trackback/id/tr95026541

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.