Rozdział IX
Proste projekty


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 nieparzyste

Wynika 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.