W rozdziale umieściliśmy zbiór prostych projektów do zrealizowania w asemblerze PMC. W pierwszej kolejności należy narysować schemat blokowy tworzonego programu - nie starajcie się rozwiązywać problemu bezpośrednio w edytorze. Mając schemat blokowy przekształcamy każdą z operacji na ciąg instrukcji dla procesora PMC. Oto przykład rozwiązania:
Projekt przykładowy
Napisać program dla PMC, który odczyta liczbę dodatnią n, a następnie policzy sumę kolejnych wartości:
1 + (-2) + 3 + (-4) + 5 + (-6) +... + (+/-n).
Analiza
Program ma odczytać pewną wartość. Będziemy więc potrzebowali zmiennej na przechowanie tej wartości. Do odczytu liczby zastosujemy gotowy algorytm z poprzedniego rozdziału. Po odczytaniu tej liczby mamy sumować kolejne wartości od 1 do n, które przyjmują znak dodatni dla liczb nieparzystych, a znak ujemny dla parzystych. Będzie więc nam potrzebna następna zmienna przechowująca te wartości. Liczba jest parzysta, jeśli dzieli się przez 2. Skoro tak, to w zapisie dwójkowym ostatni bit musi mieć wartość 0. W przeciwnym razie po podzieleniu przez 2 otrzymywalibyśmy resztę 1:
2 - 10(2), 4 - 100(2), 6 - 110(2), 8 - 1000(2), 10 - 1010(2) - liczby parzyste
1 - 1(2), 3 - 11(2), 5 - 101(2), 7 - 111(2), 9 - 1001(2), 11 - 1011(2) - liczby nieparzysteWynika z tego, iż do stwierdzenia, czy dana liczba jest parzysta lub nie wystarczy zbadać ostatni, najmłodszy bit tej liczby. Kolejne liczby należy sumować. Suma musi być umieszczona w osobnej zmiennej. Oznaczmy więc zmienne następująco:
n - liczba sumowań
i - kolejne liczby naturalne, które będą sumowane
s - wartość sumy.Teraz możemy przystąpić do narysowania odpowiedniego schematu blokowego, a następnie na jego podstawie utworzymy program dla PMC.
RUN START N: DAT 0 ;tutaj trafi odczytana liczba X: DAT 0 ;zmienna pomocnicza I: DAT 1 ;kolejne liczby naturalne S: DAT 0 ;wartość sumy przemiennej START: LDA INP ;odczytujemy znak z bufora JZR #START ;bufor zajęty? JMI #START ;bufor pusty? LP1: SUB #"0" ;obliczamy wartość cyfry STA X ;i zapamiętujemy ją tymczasowo LDA N ;N przemnażamy przez 10 MUL #10 ADD X ;dodajemy cyfrę STA N ;zapisujemy wynik LP2: LDA INP ;pobieramy kolejny znak JZR #LP2 ;czekamy na dostępność bufora JMI #LP3 ;ale kończymy, gdy pusty. Wynik w N JMP #LP1 ;inaczej przetwarzamy znak LP3: LDA N ;sprawdzamy, czy n-i < 0 SUB I JMI #0 ;jeśli tak, to stop LDA I ;sprawdzamy, czy i jest parzyste AND #1 ;badając najmłodszy bit JZR #SPAR LDA S ;i nieparzyste - dodajemy ADD I JMP #ON1 SPAR: LDA S ;i parzyste - odejmujemy SUB I ON1: STA S ;uaktualniamy sumę INC I ;zwiększamy i o 1 JMP #LP3 ;i kontynuujemy pętlę
Projekt 1
Napisz program dla PMC, który wypisze na środku wyświetlacza znakowego słowo KONIEC, a następnie będzie je przesuwał w prawo i w lewo odbijając od krawędzi.
Projekt 2
Napisz program dla PMC, który będzie w kółko wypisywał na wyświetlaczu znakowym słówko KONIEC w ten sposób, iż będzie się ono wysuwało ze strony lewej i nikło po prawej stronie. Po całkowitym zniknięciu tego słówka ma się ono od nowa wysuwać literka po literce ze strony lewej i przemieszczać na prawo, aż do zniknięcia.
Projekt 3
Napisz program dla PMC, który będzie odczytywał teksty wprowadzane przez użytkownika i wyświetlał je na wyświetlaczu znakowym zmieniając wszystkie literki "a" na "o", a wszystkie literki "o" na "a". Duże znaki mają pozostać bez zmian.
Projekt 4
Napisz program dla PMC, który będzie wczytywał teksty wprowadzane przez użytkownika obliczając na bieżąco liczbę wpisanych przez niego samogłosek.
Projekt 5
Napisz program dla PMC, który będzie odczytywał teksty wprowadzane przez użytkownika i wyświetlał je na wyświetlaczu znakowym pomijając jednak wszystkie samogłoski i spacje.
Projekt 6
Napisz program dla PMC, który będzie odczytywał liczby dziesiętne wprowadzone przez użytkownika i na bieżąco obliczał ich sumę. Działanie programu ma być kończone w przypadku wpisania liczby 0.
Projekt 7
Napisz program dla PMC, który będzie odczytywał liczby dziesiętne wprowadzane przez użytkownika i na bieżąco liczył ilość liczb o wartości większej niż 10. Działanie programu ma być przerywane w przypadku podania przez użytkownika liczby o wartości 0.
Projekt 8
Napisz program dla PMC, który będzie odczytywał liczby dziesiętne wprowadzane przez użytkownika i na bieżąco wyszukiwał największą liczbę z dotychczas wprowadzonych. Działanie programu ma być przerywane w przypadku podania przez użytkownika liczby o wartości 0.
Projekt 9
Napisz program dla PMC, który wczyta liczbę podaną przez użytkownika, a następnie wyświetli na wyświetlaczu znakowym tyle literek "A", ile wynosi wartość wprowadzonej liczby.
Projekt 10
Napisz program dla PMC, który odczyta liczbę podaną przez użytkownika, a następnie policzy sumę kolejnych liczb naturalnych od 1 do podanej przez użytkownika liczby włącznie.
Projekt 11
Napisz program licznika, który na wyświetlaczu 7-mio segmentowym LED będzie wyświetlał kolejne liczby od 0 do 59. Po osiągnięciu wartości 59 licznik ten ma się zerować i zliczać od początku. Działanie programu ma być przerywane kliknięciem przycisku 0 na panelu IOP.
Projekt 12
Napisz program, który wyświetli na wyświetlaczu 7-mio segmentowym LED liczbę 12345, a następnie będzie po kolei zwiększał jej cyfry o 1. Gdy dana cyfra osiągnie wartość 9, to powinna zmieniać się na 0. Działanie programu ma być przerywane kliknięciem przycisku nr 0 na panelu IOP.
Projekt 13
Zaprojektuj na panelu wyświetlaczy 7-mio segmentowych 4-ro cyfrowy licznik w kodzie szesnastkowym zliczający wstecz od wartości FFFF. Program ma się kończyć po osiągnięciu przez ten licznik stanu 0000.
Projekt 14
Zaprojektuj program, który odczyta z portu INP liczbę dziesiętną, przeliczy ją na liczbę szesnastkową i wynik wyświetli na wyświetlaczu 7-mio segmentowym LED.
Projekt 15
Zaprojektuj program, który będzie monitorował stan przycisków IOP wyświetlając go jako liczbę w kodzie szesnastkowym na wyświetlaczu 7-mio segmentowym LED.