Chciałem trochę popchnąć do przodu prace nad swoim projektem komputera z polskim procesorem MCY7880 (klon intela 8080). Właśnie jestem w trakcie uruchamiania procedur do obsługi sterownika ekranu (TMS9918). Wszystko działa prawidłowo - jestem w stanie komunikować się układem poprzez jego dwa rejestry, wysyłać i odczytywać dane z VRAM-u oraz wypisywać znaki w odpowiednich miejscach na ekranie. Teraz postanowiłem napisać krótką funkcję do przewijania ekranu o jedną linię w momencie, gdy kursor dotrze do jego końca. Kod działa prawidłowo, ale tylko przez pewien czas - zwykle po kilku (czasem kilkunastu) minutach pojawia się błąd skutkujący zniknięciem wszystkich linii za wyjątkiem ostatniej. Raczej mogę wykluczyć problem sprzętowy. Wymieniłem zarówno pamięć jak i TMS9918, poza tym problem znika za każdym razem po ponownym uruchomieniu urządzenia i nie manifestuje się jeśli nie używam tej procedury do przewijania.
Ponieważ błąd manifestuje się nieregularnie, wygląda mi to na problem z przerwaniem nadpisującym któryś z rejestrów. Sama funkcja do przewijania ekranu wywołuje kilka innych procedur do odczytu, zapisu i zerowania VRAM-u, które przyjmują parametry w parach rejestrów BC, DE oraz HL.
VDPSCROLLUP: ;Mowe 12 lines ;Read them first LXI B, BLKDAT LXI D, 0828H LXI H, 01E0H CALL VDPRVRAM ;Move lines from buffer to the beginning of the screen LXI B, BLKDAT LXI D, 0800H LXI H, 01E0H CALL VDPWVRAM ;Move remaining 11 lines ;Read them first LXI B, BLKDAT LXI D, 0A08H LXI H, 01B8H CALL VDPRVRAM ;Write those lines to the middle of the screen LXI B, BLKDAT LXI D, 09E0H LXI H, 01B8H CALL VDPWVRAM ;Clear last line LXI D, 0B98H LXI H, 0028H CALL VDPZEROVRAM RET
W aktywnych przerwaniach faktycznie mam instrukcje modyfikujące HL, DE oraz oczywiście akumulator/rejestr flag, jednak przed wykonaniem procedury obsługi przerwania zrzucam ich stany na stos za pomocą PUSH, a potem przywracam instrukcją POP.
Aby oszczędzić jak najszybciej wyjść z procedury obsługi przerwania, zrzucam na stos tylko te rejestry, które są wykorzystywane w jego wnętrzu. Nie widzę więc gdzie przerwanie mogłoby mi mieszać w przewijaniu ekranu.
No chyba, że któraś z instrukcji może w sposób niejawny modyfikować rejestry inne niż A/flagi? Czy wskazane jest na wszelki wypadek w przerwaniu zapisywać na stos wszystkie rejestry, nawet jeśli się ich nie używa?
Ktoś ma pomysł co do innej możliwej przyczyny?