LWPM Comfort Module/Tworzenie akcji: Różnice pomiędzy wersjami

Z LWPM
Przejdź do nawigacji Przejdź do wyszukiwania
Linia 69: Linia 69:
 
W kalkulatorze dostępnych jest szereg instrukcji które są wykorzystywane do wykonywania obliczeń.
 
W kalkulatorze dostępnych jest szereg instrukcji które są wykorzystywane do wykonywania obliczeń.
 
W poniższej tabeli jest zestawienie tych instrukcji.
 
W poniższej tabeli jest zestawienie tych instrukcji.
 +
{| class="wikitable"
 +
|-
 +
! Instrukcja
 +
! Operacja
 +
! Opis
 +
|-
 +
|style="white-space: nowrap;"|<code>00</code>
 +
|
 +
<pre>a = b
 +
b = 0</pre>
 +
|
 +
; Load 0: przepisz zawartość rejestru <code>b</code> do rejestru <code>a</code> oraz
 +
:wpisz do rejestru <code>b</code> wartość <code>0</code>
 +
|-
 +
|style="white-space: nowrap;"|<code>01</code>
 +
|
 +
<pre>a = b
 +
b = 1</pre>
 +
|
 +
;Load 1: przepisz zawartość rejestru <code>b</code> do rejestru <code>a</code> oraz
 +
:wpisz do rejestru <code>b</code> wartość <code>1</code>
 +
|-
 +
|style="white-space: nowrap;"|<code>02</code>
 +
|
 +
<pre>a = b
 +
b = -1</pre>
 +
|
 +
;Load -1: przepisz zawartość rejestru <code>b</code> do rejestru <code>a</code> oraz
 +
:wpisz do rejestru <code>b</code> wartość <code>-1</code> (<code>0xFFFFFFFF</code>)
 +
|-
 +
|style="white-space: nowrap;"|<code>03 <xx></code>
 +
|
 +
<pre>a = b
 +
b = <xx> </pre>
 +
|
 +
;LoadSignedByte: przepisz zawartość rejestru <code>b</code> do rejestru <code>a</code> oraz
 +
:wpisz do rejestru <code>b</code> wartość <code><xx></code>, która interpretowana jest jako 8-bitowa liczba ze znakiem
 +
|-
 +
|style="white-space: nowrap;"|<code>04 <xx></code>
 +
|
 +
<pre>a = b
 +
b = <xx> </pre>
 +
|
 +
;LoadUnsignedByte: przepisz zawartość rejestru <code>b</code> do rejestru <code>a</code> oraz
 +
:wpisz do rejestru <code>b</code> wartość <code><xx></code>, która interpretowana jest jako 8-bitowa liczna bez znaku
 +
|-
 +
|style="white-space: nowrap;"|<code>05 <xxxx></code>
 +
|
 +
<pre>a = b
 +
b = <xxxx> </pre>
 +
|
 +
;LoadSignedWord: przepisz zawartość rejestru <code>b</code> do rejestru <code>a</code> oraz
 +
:wpisz do rejestru <code>b</code> wartość <code><xxxx></code>, która interpretowana jest jako 16-bitowa liczba ze znakiem
 +
|-
 +
|style="white-space: nowrap;"|<code>06 <xxxx></code>
 +
|
 +
<pre>a = b
 +
b = <xxxx> </pre>
 +
|
 +
;LoadUnsignedWord: przepisz zawartość rejestru <code>b</code> do rejestru <code>a</code> oraz
 +
:wpisz do rejestru <code>b</code> wartość <code><xxxx></code>, która interpretowana jest jako 16-bitowa liczba bez znaku
 +
|-
 +
|style="white-space: nowrap;"|<code>07 <xxxxxxxx></code>
 +
|
 +
<pre>a = b
 +
b = <xxxxxxxx> </pre>
 +
|
 +
;LoadDoubleWord: przepisz zawartość rejestru <code>b</code> do rejestru <code>a</code> oraz
 +
:wpisz do rejestru <code>b</code> wartość <code><xxxxxxxx></code>, która interpretowana jest jako 32-bitowa liczba ze znakiem
 +
|-
 +
|style="white-space: nowrap;"|<code>10 <nn></code>
 +
|
 +
<pre>save[<nn>] = a</pre>
 +
|
 +
;SaveB: przepisz zawartość rejestru <code>b</code> do rejestru <code>save[n]</code> (rejestr <code>save</code> na pozycji <code>n</code>)
 +
|-
 +
|style="white-space: nowrap;"|<code>11 <nn></code>
 +
|
 +
<pre>save[<nn>] = b</pre>
 +
|
 +
;SaveB: przepisz zawartość rejestru <code>b</code> do rejestru <code>save[n]</code> (rejestr <code>save</code> na pozycji <code>n</code>)
 +
|-
 +
|style="white-space: nowrap;"|<code>14 <nn></code>
 +
|
 +
<pre>a = save[<nn>]</pre>
 +
|
 +
;RestoreA: przepisz zawartość rejestru <code>save[n]</code> (rejestr <code>save</code> na pozycji <code>n</code>) do rejestru <code>a</code>
 +
|-
 +
|style="white-space: nowrap;"|<code>15 <nn></code>
 +
|
 +
<pre>b = save[<nn>]</pre>
 +
|
 +
;RestoreB: przepisz zawartość rejestru <code>save[n]</code> (rejestr <code>save</code> na pozycji <code>n</code>) do rejestru <code>b</code>
 +
|-}
  
 
=== Ilość powtórzeń ===
 
=== Ilość powtórzeń ===

Wersja z 11:36, 28 wrz 2020

Moduł daje możliwość wykonania dowolnej akcji.

W tym miejscu opisany jest format akcji oraz możliwości i polecenia jakie mogą być zawarte w akcji.

Wszystkie liczby i wartości są podane w formacie szesnastkowym (HEX).

Format akcji

Ogólny format akcji przedstawia się następująco:

<informacje o akcji> <ilość powtórzeń> <początek akcji> <koniec akcji> <pętla>

Informacje o akcji

Informacje o akcji zawierają bardziej szczegółowe informacje na temat akcji opisujące przede wszystkim sposób wykonania akcji. Przykładowo można tutaj określić szczegółowo warunki uruchomienia akcji, a także w tym miejscu możesz zdefiniować jak mają wykonywać się poszczególne etapy pętli.

Format danych

<informacje o akcji> = <długość informacji> <informacje>*
<długość informacji>
określa długość wszystkich informacji w bajtach
<informacje>
to szczegółowy opis zachowania akcji. Takich informacji może być kilka dla każdej akcji, przy czym każda musi być innego typu.

Każda informacja jest zapisana w ten sam sposób:

<informacje> = <typ informacji> <długość danych> <dane>

Pierwszym polem jest <typ danych> (1 bajt) następnie podana jest <długość danych> w bajtach (1 bajt) oraz <dane>, których format zależy od typu danych.

Informacje o etapach wykonania pętli

<typ informacji> == 1

TODO:

Informacje o warunkach wykonania akcji

<typ informacji> == 2

Ten typ informacji określa szczegółowo, jakie muszą zajść warunki by akcja została uruchomiona.

Format informacji
<dane> = <rozmiar> <index> <flagi> <start> <stop> <instrukcja>*
<rozmiar>
rozmiar danych (1 bajt) w bajtach, tj od pola <index> do końca ostatniej instrukcji
<index>
miejsce zapisu o aktualnym stanie akcji.
Dostępne są 4 takie miejsca (00 - 03).
Każda akcja warunkowa powinna być wykonywana we własnym miejscu (każda powinna mieć inną wartość <index>) aby akcje ze sobą nie interferowały. Oczywiście akcje będą działały na tym samym indeksie, jednak może być trudno zapanować nad poprawności warunków.
<flagi>
flagi zmieniające zachowanie kalkulatora wyliczającego warunek.
Domyślna wartość to 00.
Dostępne są następujące flagi:
01
w przypadku jakiegokolwiek błędu odczytu któregokolwiek parametru pracy modułu, obliczenia zostaną uznane za poprawne - wynik obliczeń będzie prawidłowo, a wiec może dojść do uruchomienia akcji. Domyślnie jakikolwiek błąd w obliczeniach powoduje, że akcja zostanie przerwana lub się nie uruchomi.
<start>
określa ilość prawidłowych obliczeń jaka jest wymagana by akcja się uruchomiła. W przypadku gdy wartość jest równa 00 - akcja wykona się zawsze (wartość ta w zasadzie nie ma większego sensu)
<stop>
określa ilość prawidłowych obliczeń jaka jest wymagana by akcja się zakończyła. W przypadku gdy wartość jest równa 00 - akcja zakończy się zawsze (wartość ta w zasadzie nie ma większego sensu)
<instrukcja>*
ciąg instrukcji dla kalkulatora
Zasada działania kalkulatora

Obliczenia warunku są wykonywane na zasadzie zbliżonej do kalkulatora działającego na zasadzie RPN (odwrócona polska notacja). Tj: najpierw podajemy argumenty instrukcji, następnie operacje jaką chcemy na tych argumentach wykonać. Wynikiem kalkulatora jest wartość 0 jeśli warunek jest niespełniony, lub wartość różna od 0 jeśli warunek jest prawdziwy i kalkulator możesz przejść do uruchomienia akcji (po określonej ilości poprawnych obliczeń).

Kalkulator posiada następujące rejestry:

  • a - rejestr 32-bitowy (liczba ze znakiem)
  • b - rejestr 32-bitowy (liczba ze znakiem)
  • save[x] - 4 elementowa tablica 32-bitowych liczb ze znakiem. Do tymczasowego przechowywania danych. Na tych liczbach nie można wykonywać bezpośrednio operacji - należy je najpierw przenieść do rejestrów a lub b.
Dostępne instrukcje

W kalkulatorze dostępnych jest szereg instrukcji które są wykorzystywane do wykonywania obliczeń. W poniższej tabeli jest zestawienie tych instrukcji.

Ilość powtórzeń

Początek akcji

Koniec akcji

Pętla

Instrukcja Operacja Opis
00
a = b
b = 0
Load 0
przepisz zawartość rejestru b do rejestru a oraz
wpisz do rejestru b wartość 0
01
a = b
b = 1
Load 1
przepisz zawartość rejestru b do rejestru a oraz
wpisz do rejestru b wartość 1
02
a = b
b = -1
Load -1
przepisz zawartość rejestru b do rejestru a oraz
wpisz do rejestru b wartość -1 (0xFFFFFFFF)
03 <xx>
a = b
b = <xx> 
LoadSignedByte
przepisz zawartość rejestru b do rejestru a oraz
wpisz do rejestru b wartość <xx>, która interpretowana jest jako 8-bitowa liczba ze znakiem
04 <xx>
a = b
b = <xx> 
LoadUnsignedByte
przepisz zawartość rejestru b do rejestru a oraz
wpisz do rejestru b wartość <xx>, która interpretowana jest jako 8-bitowa liczna bez znaku
05 <xxxx>
a = b
b = <xxxx> 
LoadSignedWord
przepisz zawartość rejestru b do rejestru a oraz
wpisz do rejestru b wartość <xxxx>, która interpretowana jest jako 16-bitowa liczba ze znakiem
06 <xxxx>
a = b
b = <xxxx> 
LoadUnsignedWord
przepisz zawartość rejestru b do rejestru a oraz
wpisz do rejestru b wartość <xxxx>, która interpretowana jest jako 16-bitowa liczba bez znaku
07 <xxxxxxxx>
a = b
b = <xxxxxxxx> 
LoadDoubleWord
przepisz zawartość rejestru b do rejestru a oraz
wpisz do rejestru b wartość <xxxxxxxx>, która interpretowana jest jako 32-bitowa liczba ze znakiem
10 <nn>
save[<nn>] = a
SaveB
przepisz zawartość rejestru b do rejestru save[n] (rejestr save na pozycji n)
11 <nn>
save[<nn>] = b
SaveB
przepisz zawartość rejestru b do rejestru save[n] (rejestr save na pozycji n)
14 <nn>
a = save[<nn>]
RestoreA
przepisz zawartość rejestru save[n] (rejestr save na pozycji n) do rejestru a
15 <nn>
b = save[<nn>]
RestoreB
przepisz zawartość rejestru save[n] (rejestr save na pozycji n) do rejestru b