Autor ::Roman Bórik Poslaná :: 06.07.2011 23:30:19 Predmet ::Re: Myš Poly - 08 a myš 602 .
Ovládač a testovací ukážkový program možno predbežne stiahnuť tu: http://pmd85.borik.net/_work/poly-08.ptp
Scany z manuálu k myši: http://pmd85.borik.net/_work/poly-08-1.jpg http://pmd85.borik.net/_work/poly-08-2.jpg
Nahrať treba MDRIVER a aj MTEST a spustiť JUMP 5000. Keby to náhodou "zhavarovalo", tak to treba skúsiť znovu.
Problém je v tom, že MTEST používa pri výpisoch na obrazovku podprogramy z Monitora PMD 85, ktoré využívajú SP register ako ukazateľ do VRAM bez toho, aby sa pred tým zakázalo prerušenie. A ako bolo spomenuté vyššie, myš prerušenie využíva. Pokiaľ SP práve ukazuje niekde do VRAM a dôjde k prerušeniu, tak sa po vstupe do prerušenia v najlepšom prípade iba poškodí časť VRAM. Ak je ale SP niekde hore na prvých stĺpcoch obrazovky, PUSHovanie vlastne "pretečie" do systémových premenných Monitora a čo sa stane ďalej je už "vo hviezdach". Najčastejšie sa mi to stávalo hneď pri spúšťaní MTESTu, zrejme pri mazaní obrazovky.
Správa
Autor ::Roman Bórik Poslaná :: 07.07.2011 09:46:45 Predmet ::Re: Myš Poly - 08 a myš 602 .
Musím (po)opraviť svoje tvrdenia o probléme s prerušením a rutinami v Monitore.
Pri tlači znaku v rutine na adrese 854Ah sa nastavuje register SP na hodnotu 0FFC0h, čo je -64 a predstavuje offset pre prechod na predchádzajúci mikroriadok VRAM. Na to je tam použitá inštrukcia DAD SP (HL ukazuje do VRAM). Pokiaľ v tomto čase, kedy má SP hodnotu 0FFC0h, dôjde k prerušeniu, tak sa pochopiteľne na "zásobník" uloží návratová hodnota a hodnoty ostatných registrov odpamätávaných v obsluhe prerušenia. Keďže od adresy 0FFC0h k nižším adresám nič nie je, tak to v prípade MTESTu nevadí a všetko chodí ako má. Možno si to overiť v emulátore tak, že si v debuggeri do MEM dajte adresu 0FFB0h a spustite MTEST. Po zapnutí PMD 85 by tam mali byť samé nuly, ale pri behu MTESTu je od adresy 0FFB4h vidieť hodnoty, ktoré sa tam uložili pri vyvolaní prerušenia.
Väčší problém je v rutine pre zmazanie obrazovky na adrese 85A7h. Tam sa SP register používa na dva účely. V prvom prípade je to ukazateľ do VRAM, kedy sa inštrukciou PUSH B vypĺňa VRAM nulami. Tu platí to, čo som uviedol v predošlom príspevku. Pokiaľ sa SP dostane do ľavej časti obrazovky, vyvolané prerušenie môže poškodiť niektoré systémové premenné. Druhý prípad je kritickejší, pretože sa SP nastavuje na hodnotu 0040h, opäť ako offset pre prechod na nasledujúci mikroriadok VRAM. I keď má SP túto hodnotu iba veľmi krátko (20 taktov pre každý mikroriadok), tak v prípade vyvolania prerušenia, samotná rutina obsluhy prerušenia si prepíše skokovú inštrukciu JP xxxx, ktorá je na adrese 0038h. MDRIVER sa pri prerušení vnára o 12 bytov, 0040h - 000Ch = 0034h. Pri nasledujúcom prerušení sú už na adrese 0038h nezmysly a to je dôvod k nepredvídateľnému chovaniu. MTEST maže obrazovku iba pri spustení (po inicializácii a povolení prerušenia), takže preto mi program padal iba pri jeho spúšťaní.