Odbiór danych w przerwaniach IM2.

  Testy nowej płytki powoli posuwają się do przodu. Podstawowe funkcje Z80 CTC działają. Układ generuje sygnał NMI i steruje pracą krokową. Teraz zająłem się dodatkiem Z80 SIO.

Z80 SIO ISR routine
Indeksowa obsługa bufora kołowego.

Read-char with ring buffer.
Jeszcze dużo zmian przede mną.


Napisałem procedury odbierające znaki w przerwaniach IM2. Ustawiłem przerwania po każdym znaku, ale z dokumentacji nie wynikało jednoznacznie, który to będzie wektor przerwań. Dla pewności, żeby nie tracić czasu, wpisałem wszystkie cztery dla kanału B. W "firmowej" tablicy jest za mało miejsca na wektory kanału A, ale po prostu nie będę go używał. Potrzebny jest drugi bufor kołowy. Procedura obsługi przerwania sprawdza, czy jest miejsce w buforze i wpisuje tam odebrany znak. Program iLoad, który wcześniej używałem będzie działał tak samo, trzeba tylko zmodyfikować podprogramy getc i putc.

Save testing iHEX file
Zapisywanie plików Intel HEX działa poprawnie.

Transfer errors
Plik testowy OK, ale dłuższy nie.


Tak jak wcześniej zastosowałem rejestr IX do obsługi obydwu buforów. Nie jest on używany przez NMI, ani przez iLoad, więc nie trzeba go chronić na stosie, a procedury sprawdzające zapełnienie buforów są dzięki temu proste i krótkie. Niestety mimo tych zalet program działa zbyt wolno. Krótkie pliki mieszczące się w buforze (256 bajtów) wczytują się bezbłędnie, jednak dłuższe nie... Trzeba znowu rezygnować z niektórych funkcji programu.

System halted.
Niektóre "poprawki" pogarszały sytuację.

Tym razem się udało.


Musi być jakieś rozwiązanie! Najpierw zrezygnowałem z podprogramów sprawdzających zapełnienie bufora - przeniosłem ich treść w miejsce rozkazu CALL. Dało to małą poprawę, ale potrzeba było większych oszczędności. Zmieniłem więc sposób obsługi buforów kołowych. Zamiast rejestru indeksowego zatrudniłem poczciwy HL, który i tak był tam używany. Możliwe było dzięki temu nie tylko zmniejszenie liczby rozkazów, ale również skrócenie ich czasu wykonywania. Po wielu dniach prób i błędów osiągnąłem wreszcie optymalną wersję, działającą z szybkością 38400 bodów. 😎

RX-ISR with HL register
Zoptymalizowana procedura obsługi przerwania.

Ręczna optymalizacja. 




Komentarze

Popularne posty z tego bloga

Uruchamiamy CA80 na RCbus.

Magnetofon CA80.