Terminal dyżurnego i własna maszyna — zadania
Wasze zadanie
Tworzycie program pomocniczy dla dyżurnego fikcyjnej bazy szkoleniowej. Zacznie się od prostych obliczeń, a zakończy wykonywaniem programu z pliku. Następnie wykorzystacie poznane mechanizmy C do osobnego projektu CHIP-8.
Nie potrzebujecie innych kursów, bazy danych ani elektroniki. Prowadzący udostępnia środowisko i kod startowy danego etapu. Pracujcie w parach, zamieniając role przy drugim zadaniu. Przed uruchomieniem zapiszcie przewidywany wynik, a następnie porównajcie go z wynikiem programu.
Ćwiczenia dotyczą symulacji i syntetycznych danych. Nie sterujemy prawdziwym sprzętem. Zakres finału CHIP-8 i obsługiwany wariant ustala prowadzący.
Jak pracujemy
Każda para oddaje rozwiązanie, opis próby i krótkie uzasadnienie. Każda osoba powinna umieć wyjaśnić wynik. Dane i zadania są niezależne od pozostałych przedmiotów.
Sesja 1 — Terminal po raz pierwszy odpowiada
- Skompiluj program wypisujący nazwę stanowiska i komunikat gotowości.
- Zmień tekst, porównaj uruchomienie starego programu z ponowną kompilacją. Następnie sprawdź komunikat przy brakującym średniku.
Sesja 2 — Ile kompletów można przygotować?
- Oblicz liczbę pełnych kompletów i resztę dla 23 baterii oraz 4 baterii na komplet.
- Porównaj dzielenie całkowite i rzeczywiste. Powtórz obliczenia dla 24 baterii.
Sesja 3 — Nierozpoznane polecenie
- Rozpoznaj dodawanie i odejmowanie za pomocą switch.
- Dodaj dzielenie, obsługę zerowego dzielnika i nierozpoznanego polecenia.
Sesja 4 — Cała zmiana dyżurna
- Wykonuj kolejne polecenia do wpisania q.
- Policz poprawne działania dla sekwencji: dodawanie, ?, odejmowanie, q. Wyjaśnij, co powinno zwiększać licznik.
Sesja 5 — Lista poleceń zamiast ręcznego klikania
- Zapisz w tablicy program odpowiadający LOAD 12, SUB 3, PRINT.
- Zmień dane, aby obliczyć 20−6. Jak wykryć brak argumentu ostatniej instrukcji?
Sesja 6 — Jedno miejsce wykonywania instrukcji
- Wydziel wykonanie instrukcji do funkcji zwracającej nowy stan akumulatora.
- Porównaj wyniki przed i po zmianie. Przewidź zachowanie po pominięciu przypisania wyniku funkcji.
Sesja 7 — Polecenie ma własną strukturę
- Zastąp pary liczb strukturami instrukcji.
- Wypisz instrukcje przed wykonaniem i oblicz długość tablicy struktur. Sprawdź zachowanie dotychczasowego programu.
Sesja 8 — Co oznacza liczba 4?
- Nadaj kodom operacji nazwy przez enum.
- Dodaj jedną operację i sprawdź reakcję na kod, którego interpreter nie obsługuje.
Sesja 9 — Dwie wartości trzeba zachować
- W dwóch rejestrach oblicz osobno 12−3 i 20−6.
- Dodaj drugi rejestr do pierwszego, zachowując drugi. Sprawdź odrzucanie indeksów spoza zakresu.
Sesja 10 — Funkcja naprawdę zmienia stan
- Porównaj modyfikowanie argumentu przekazanego przez wartość i przez wskaźnik.
- Zamień dwie wartości przez wskaźniki. Sprawdź przypadek, gdy oba argumenty wskazują tę samą zmienną.
Sesja 11 — Dwie niezależne maszyny
- Umieść rejestry w strukturze stanu i zmieniaj ją przez wskaźnik.
- Utwórz dwa niezależne stany. Wykonaj polecenie na jednym, a drugi wyzeruj. Porównaj wyniki.
Sesja 12 — Program większy niż przygotowana tablica
- Przydziel pamięć na dodatnią liczbę instrukcji, sprawdź wynik i zwolnij pamięć po pracy.
- Powiększ bufor przez realloc. Wyjaśnij, co pozostaje dostępne, jeśli powiększenie się nie powiedzie.
Sesja 13 — Nie zawsze następna instrukcja
- Dodaj licznik instrukcji oraz skok do istniejącego indeksu.
- Zapisz ślad wykonania pięciu instrukcji ze skokiem. Sprawdź limit kroków i niedozwolony adres skoku.
Sesja 14 — Reakcja na wynik porównania
- Dodaj porównanie rejestru z zerem i skok zależny od wyniku.
- Zbuduj odliczanie od 3, a następnie sprawdź start od 0. Wyjaśnij kolejność sprawdzenia i odejmowania.
Sesja 15 — Ostatnio odłożone, najpierw odzyskane
- Odłóż na stos 9 i 14, a następnie pobierz dwie wartości. Najpierw przewidź ich kolejność.
- Obsłuż próby dodania na pełny stos i pobrania z pustego stosu.
Sesja 16 — Wspólny fragment programu
- Dodaj CALL i RET z zapamiętaniem adresu powrotu.
- Prześledź wywołanie A, z niego B i oba powroty. Sprawdź RET bez wcześniejszego CALL.
Sesja 17 — Ta sama maszyna, inny plik
- Wczytaj program w formacie trzech liczb opisanym w materiale sesji.
- Uruchom dwa różne pliki tym samym interpreterem. Sprawdź brak pliku, błędny format i niepełną instrukcję.
Sesja 18 — Czytelne polecenia
- Zamień tekstowe polecenia na instrukcje zgodne z modelem z sesji 17.
- Obsłuż brak argumentu, nieznaną operację i błędny rejestr. Porównaj wykonanie programu tekstowego z liczbowym.
Ćwiczenie 1 — Odczytaj dwubajtową instrukcję
- Odtwórz instrukcję z bajtów 0x60 i 0x0A i sprawdź jej wykonanie.
- Wypisz ślad pc oraz sprawdź ochronę przed zbyt dużym ROM-em i odczytem poza pamięcią.
Ćwiczenie 2 — Arytmetyka ma granice
- Sprawdź wynik i flagę dodawania 250+10 instrukcją ustawiającą przeniesienie.
- Prześledź CALL/RET i warunkowe pominięcie. Sprawdź flagę przy odejmowaniu równych liczb.
Ćwiczenie 3 — Pierwszy własny obraz
- Narysuj dostarczony sprite na pustym tle.
- Narysuj go drugi raz i sprawdź ekran oraz flagę kolizji. Powtórz próbę z częściowym przecięciem obrazów.
Ćwiczenie 4 — Program czeka, czas nadal płynie
- Sprawdź timer przy różnych prędkościach wykonywania instrukcji.
- Dodaj wejście klawiatury na przygotowanym szkielecie. Opisz ograniczenia użytego modelu wejścia.
Ćwiczenie 5 — Odbiór emulatora
- Uruchom ROM testowy wybrany przez prowadzącego dla obsługiwanego zestawu instrukcji.
- Sprawdź demonstrację lub grę oraz komunikat dla nieobsługiwanej instrukcji. Zapisz ograniczenia swojego emulatora.