Pakiet matematyczny
From Atariki
Wersja z dnia 09:36, 3 sty 2006 KMK (Dyskusja | wkład) (→Lista procedur) ← Previous diff |
Wersja z dnia 09:46, 3 sty 2006 KMK (Dyskusja | wkład) (→Lista procedur) Next diff → |
||
Linia 18: | Linia 18: | ||
<p>Konwersja liczby zapisanej znakami ASCII na liczbę zmiennoprzecinkową (ASCII to Floating Point conversion). Ciąg znaków do konwersji musi być wskazany wektorem INBUFP ($F3), przed wywołaniem procedury AFP trzeba też wyzerować rejestr CIX ($F2). Konwersja przeprowadzana jest aż do napotkania niedozwolonego znaku, opuszczenie procedury z ustawionym bitem C sygnalizuje błąd. Gdy C=0, wynik znajduje się w rejestrze FR0 ($D4).</p> | <p>Konwersja liczby zapisanej znakami ASCII na liczbę zmiennoprzecinkową (ASCII to Floating Point conversion). Ciąg znaków do konwersji musi być wskazany wektorem INBUFP ($F3), przed wywołaniem procedury AFP trzeba też wyzerować rejestr CIX ($F2). Konwersja przeprowadzana jest aż do napotkania niedozwolonego znaku, opuszczenie procedury z ustawionym bitem C sygnalizuje błąd. Gdy C=0, wynik znajduje się w rejestrze FR0 ($D4).</p> | ||
</td></tr> | </td></tr> | ||
- | <tr><td>$D8E6</td><td>FASC</td><td> </td></tr> | + | <tr><td>$D8E6</td><td>FASC</td><td> |
- | <tr><td>$D9AA</td><td>IFP</td><td> </td></tr> | + | <p>Konwersja liczby zmiennoprzeciwnkowej na ciąg ASCII (Floating Point to ASCII conversion). Liczbę do konwersji trzeba umieścić w rejestrze FR0 ($D4), wynikowy ciąg znaków po zakończeniu procedury wskazywany jest przez wektor INBUFP ($F3). Ostatni znak jest w inwersie (ma ustawiony bit 7).</p> |
- | <tr><td>$D9D2</td><td>FPI</td><td> </td></tr> | + | </td></tr> |
+ | <tr><td>$D9AA</td><td>IFP</td><td> | ||
+ | <p>Konwersja liczby całkowitej na zmiennoprzecinkową (Integer to Floating Point conversion). Dwubajtowa liczba binarna umieszczona w pierwszych dwóch bajtach rejestry FR0 ($D4/$D5) w kolejności młodszy-starszy bajt jest przekształcana na postać zmiennoprzecinkową. Wynik umieszczany jest w rejestrze FR0 ($D4). Dana wejściowa traktowana jest jako liczba całkowita bez znaku.</p> | ||
+ | </td></tr> | ||
+ | <tr><td>$D9D2</td><td>FPI</td><td> | ||
+ | <p>Konwersja liczby zmiennoprzecinkowej na całkowitą (Floating Point to Integer conversion). Liczba zmiennoprzecinkowa umieszczona w rejestrze FR0 ($D4) przekształcana jest na dwubajtową liczbę całkowita bez znaku. Wynik umieszczany jest w pierwszych dwóch bajtach rejestru FR0 ($D4/$D5). Procedura przekształca liczby z zakresu od 0 do 65535, większe albo mniejsze wartości powodują błąd (ustawiony bit C przy powrocie z procedury).</p> | ||
+ | </td></tr> | ||
<tr><td colspan = 3>Przesłania itp. rejestrów FP</td></tr> | <tr><td colspan = 3>Przesłania itp. rejestrów FP</td></tr> | ||
<tr><td>$DA44</td><td>ZFR0</td><td> </td></tr> | <tr><td>$DA44</td><td>ZFR0</td><td> </td></tr> |
Wersja z dnia 09:46, 3 sty 2006
Pakiet matematyczny, zwany też pakietem procedur zmiennoprzecinkowych, to zawarty w systemie operacyjnym zestaw podprogramów służących do obliczeń na liczbach rzeczywistych. Zajmuje 2k pamięci ROM w obszarze od $D800 do $DFFF i jest intensywnie wykorzystywany przez interpreter Atari BASIC-a oraz wiele innych programów użytkowych (np. MAC/65, UmonXL itp., by już przemilczeć napisane w BASIC-u gry w rodzaju Crusade in Europe).
Pakiet matematyczny jest jedyną częścią systemu nie mającą własnej tablicy wektorów. Bardzo utrudnia to przygotowanie jego ulepszonych wersji.
Format liczb FP
Dopuszczalny zakres liczb rzeczywistych dla obliczeń to od 10-98 do 1096, z dokładnością do 10 cyfr. Liczba kodowana jest na sześciu bajtach: pierwszy bajt zajmuje 1 bit znaku oraz siedem bitów wykładnika, pozostałe pięć bajtów to mantysa zapisana w kodzie BCD, po dwie cyfry na bajt, w kolejności od najstarszej do najmłodszej. Wykładnik jest to właściwy wykładnik liczby 100 zwiększony o 64.
Przykładowo, w ciągu liczb $41,$15,$36,$00,$00,$00 pierwszy bajt o wartości $41 to cecha. Najstarszy bit jest skasowany, jest to więc liczba dodatnia. Na pozostałych siedmiu bitach zapisany jest wykładnik liczby 100 zwiększony o 64 ($40). Wykładnik ten w danym przykładzie wynosi więc 1.
Dalej znajduje się mantysa zapisana w kodzie BCD. Punkt dziesiętny znajduje się po pierwszym jej bajcie, mamy tu więc zapisaną wartość 15,36 (piętnaście i trzydzieści sześć setnych). W połączeniu z obliczonym wyżej wykładnikiem liczby sto daje to 1001*15,36 = 1536.
Lista procedur
Adres | Etykieta | Opis |
Konwersja liczb | ||
$D800 | AFP |
Konwersja liczby zapisanej znakami ASCII na liczbę zmiennoprzecinkową (ASCII to Floating Point conversion). Ciąg znaków do konwersji musi być wskazany wektorem INBUFP ($F3), przed wywołaniem procedury AFP trzeba też wyzerować rejestr CIX ($F2). Konwersja przeprowadzana jest aż do napotkania niedozwolonego znaku, opuszczenie procedury z ustawionym bitem C sygnalizuje błąd. Gdy C=0, wynik znajduje się w rejestrze FR0 ($D4). |
$D8E6 | FASC |
Konwersja liczby zmiennoprzeciwnkowej na ciąg ASCII (Floating Point to ASCII conversion). Liczbę do konwersji trzeba umieścić w rejestrze FR0 ($D4), wynikowy ciąg znaków po zakończeniu procedury wskazywany jest przez wektor INBUFP ($F3). Ostatni znak jest w inwersie (ma ustawiony bit 7). |
$D9AA | IFP |
Konwersja liczby całkowitej na zmiennoprzecinkową (Integer to Floating Point conversion). Dwubajtowa liczba binarna umieszczona w pierwszych dwóch bajtach rejestry FR0 ($D4/$D5) w kolejności młodszy-starszy bajt jest przekształcana na postać zmiennoprzecinkową. Wynik umieszczany jest w rejestrze FR0 ($D4). Dana wejściowa traktowana jest jako liczba całkowita bez znaku. |
$D9D2 | FPI |
Konwersja liczby zmiennoprzecinkowej na całkowitą (Floating Point to Integer conversion). Liczba zmiennoprzecinkowa umieszczona w rejestrze FR0 ($D4) przekształcana jest na dwubajtową liczbę całkowita bez znaku. Wynik umieszczany jest w pierwszych dwóch bajtach rejestru FR0 ($D4/$D5). Procedura przekształca liczby z zakresu od 0 do 65535, większe albo mniejsze wartości powodują błąd (ustawiony bit C przy powrocie z procedury). |
Przesłania itp. rejestrów FP | ||
$DA44 | ZFR0 | |
$DD89 | FLD0R | |
$DD8D | FLD0P | |
$DD98 | FLD1R | |
$DD9C | FLD1P | |
$DDA7 | FST0R | |
$DDAB | FST0P | |
$DDB6 | FMOV01 | |
$DD28 | FMOV12 | |
$DD34 | FMOV0E | |
Działania | ||
$DA60 | FSUB | |
$DA66 | FADD | |
$DADB | FMUL | |
$DB28 | FDIV | |
$DDC0 | EXP | |
$DDCC | EXP10 | |
$DECD | LOG | |
$DED! | LOG10 |
W rzeczywistości ROM pakietu zmiennoprzecinkowego zawiera więcej procedur, poza wymienionymi jednak nie są one specjalnie przydatne.