.. _z4: ========================== Zadanie 4: Karta graficzna ========================== Data ogłoszenia: 05.12.2018 Termin oddania: 23.01.2019 Napisać kartę graficzną z akceleracją sprzętową. Karta powinna wyświetlać obraz na monitorze VGA w rozdzielczości 320×200 i 2 dwóch kolorach (należy wziąć parametry obrazu dla rozdzielczości 640×400 i wyświetlać każdy piksel dwa razy w poziomie i pionie). Obraz powinien być przechowywany w pamięci karty. Karta powinna być sterowana z komputera przez protokół EPP. Powinna udostępniać następujące rejestry: - ``00``: pierwsza współrzędna X, dolny bajt - ``01``: pierwsza współrzędna X, górny bajt - ``02``: pierwsza współrzędna Y, dolny bajt - ``03``: pierwsza współrzędna Y, górny bajt - ``04``: druga współrzędna X, dolny bajt - ``05``: druga współrzędna X, górny bajt - ``06``: druga współrzędna Y, dolny bajt - ``07``: druga współrzędna Y, górny bajt - ``08``: szerokość operacji, dolny bajt - ``09``: szerokość operacji, górny bajt - ``0a``: wysokość operacji, dolny bajt - ``0b``: wysokość operacji, górny bajt - ``0c``: rejestr uruchomienia operacji blit - ``0d``: rejestr uruchomienia operacji fill - ``0e``: rejestr dostępu do bufora ramki - ``0f``: rejestr statusu Rejestry ``00..0b`` przechowują parametry do właściwych operacji i powinny być dostępne do odczytu i zapisu. Rejestr ``0e`` służy do bezpośredniego dostępu do bufora ramki. Odczyt bądź zapis tego rejestru powinien odczytać bądź zapisać 8 kolejnych pikseli w poziomie -- najniższy bit przesłanego bajtu to lewy piksel. Miejsce w buforze ramki wybiera się przez rejestry pierwszej współrzędnej (można obsługiwać tylko współrzędne X podzielne przez 8). Zakładamy, że 1 oznacza kolor biały, a 0 kolor czarny. Odczyt bądź zapis bajtu musi zwiększyć rejestr współrzędnej X o 8 po wykonaniu operacji. Rejestr ``0c`` służy do uruchomienia operacji blit: dowolny zapis do tego rejestru powinien rozpocząć procedurę kopiowania prostokąta pikseli z danego miejsca ekranu w inne miejsce. Pierwsza współrzędna określa lewy górny róg prostokąta docelowego, a druga współrzędna -- prostokąta źródłowego. Karta powinna poprawnie obsługiwać częściowo pokrywające się prostokąty docelowy i źródłowy. Rejestr ``0d`` służy do uruchomienia operacji fill: dowolny zapis powinien wypełnić prostokąt kolorem danym przez bit 0 zapisanej wartości. Pierwsza współrzędna określa lewy górny róg prostokąta. Rejestr ``0f`` jest rejestrem statusu, dostępnym tylko do odczytu: odczytana wartość powinna wynosić ``00``, jeśli karta graficzna aktualnie nie wykonuje żadnej operacji, lub dowolną niezerową wartość, jeśli karta jest w trakcie wykonywania operacji fill bądź blit. Karta może ignorować zapisy do rejestrów uruchamiania operacji, jeśli jest obecnie zajęta wykonywaniem innej operacji. Może też założyć, że rejestry parametrów nie będą modyfikowane w trakcie operacji.