Autorem poniższych informacji i programów jest Samir Ribic.
Instalacja
W celu usunięcia ograniczeń dostępu do pamięci należy przeprowadzić poniższą procedurę dokładnie według opisu. Pominięcie choćby jednego kroku uniemożliwi osiągnięcie spodziewanego efektu.
- Wciśnij Reset.
- Mode 2
Powinno pokazać się 1446 wolnych bajtów
- Mode 1
- Range
Xmin -10
max 10
scl 1
Ymin -10
max 10
scl 1
- Wciśnij G-T
- Graph Y=0
- Range
Xmin -10
max 10
scl 0
Ymin -10
max 10
scl 0
- Wciśnij G-T
- Następnie wciśnij AC a następnie Shift oraz Alpha i wpisz
SAVE "A"G
Pomiędzy SAVE i pierwszym cudzysłowem ma być spacja, pomiędzy drugim cudzysłowem oraz G nie może być spacji.
- Wciśnij EXE
Pojawi się komunikat SYS error
- Wciśnij strzałkę w lewo a potem EXE aby powtórzyć ostatnie polecenie
Pojawi się teraz komunikat Save execution I/O error
- Ponownie strzałka w lewo i EXE aby powtórzyć ostatnie polecenie
Spowoduje to znowu komunikat SYS error
- Wciśnij AC i przejdź do mode 3 (PCL). Będzie widać dwa zajęte programy (4 i 5). Skasuj program 4 klawiszem AC. Teraz wszystkie programy będą zajęte. Wciśnij SHIFT DEL żeby skasować wszystkie programy.
Obecnie jest 1654 bajtów wolnej pamięci. W tym stanie nie ma już kontroli zakresu indeksów tablic.
W celu przetestowania nowych możliwości można wpisać:
1.11111111 -> A[208]
Następnie EXE oraz G-T.
Właśnie zapisałeś 8 bajtów do pamięci graficznej wyświetlacza!
Zastosowanie
Najbardziej użyteczną zaletą nieograniczonego dostępu do pamięci jest możliwość użycia graficznego bufora drukarki jako pamięci dla tablic w zakresie Z[615] do Z[960].
Pod adresem zajmowanym przez zmienną Z[358] jest stos maszynowy. Zapis do tej zmiennej specjalnie skonstruowanej wartości zawierającej adres procedury umożliwia uruchamianie programów maszynowych na kalkulatorze fx-8000G. Niestety, zakres wartości które można w ten sposób zapisywać do pamięci jest ograniczony przez przyjęty w fx-8000G dziesiętny (BCD) system kodowania liczb.
W tym trybie możliwe było dokonanie następujących osiągnięć:
- Tablica o rozmiarze 345 elementów bez ograniczenia ilości pamięci dla programów i edytora plików
- Wyświetlanie wszystkich możliwych 255 znaków (łącznie z literami greckimi, japońskimi, małymi cyframi itp.)
- Proste animacje
Trick odkryli wspólnymi siłami w lutym 1989 roku: Zeljko Juric, Samir Ribic i Emir Kapic.
Uruchamianie programów maszynowych
Liczba (-5/9)*(1e-44) składa się z ośmiu bajtów o wartości &H55. Adres &H5555 jest zajęty przez zmienną A[42] obejmującą zakres adresów &H5550~&H5557. Zatem wpisanie wartości (-5/9)*(1e-44) do zmiennej Z[358] uruchomi kod maszynowy zawarty wewnątrz zmiennej A[42].
Wygodniejszym miejscem dla programów maszynowych byłby obszar pamięci graficznej ekranu w zakresie adresów &H5A80 do &H5D80. Przy użyciu komendy Plot można w ten obszar wpisać dowolną wartość. Komenda Cls zapełnia go wartością &HFF, natomiast komenda Plot kasuje wybrany bit na zero.
Następujący program pośredniczący wykonuje skok pod adres programu maszynowego umieszczonego w pamięci ekranu:
ORG &H5555
LDW IX,&H5930
LDW IY,0
ADW IX,&H90
LDW IY,&H11
LDW IY,0
ADW IX,&H90
LDW IY,&H11
LDW IY,0
ADW IX,&H98
LDW IY,&11
LDW IY,0
IJMP IX
Dosyć dziwny wygląd tego programu jest spowodowany ograniczonym zakresem wartości, które można wpisać do zmiennej. Wszystkie operacje na rejestrze IY są tylko wypełniaczami miejsca bez żadnej funkcji.
Wpisanie programu pośredniczącego:
0.3594 -> A[42]
1.00419048E41 -> A[43]~A[44]
1.00419848E41 -> A[45]
1.0007705E41 -> A[46]
Tak wygląda jego kod w pamięci:
5550: 99 00 00 00 00 40 59 30
5558: 41 00 00 48 90 41 00 11
5560: 41 00 00 48 90 41 00 11
5568: 41 00 00 48 98 41 00 11
5570: 41 00 00 50 07 70 00 11
Uruchomienie programu:
(-5/9)*(1e-44) -> Z[356]~Z[358]
W następujących przykładach zostanie użyty taki oto krótki program maszynowy zapisujący bajt do pamięci graficznej ekranu:
ORG &H5AE8
LDW IX,&H5B50 ;40 5B 50
ST (IX),&HAB ;D0 AB
JMP 0 ;70 00 00
Program ładujący (1)
Ten prosty program kopiuje liczby szesnastkowe wpisywane z klawiatury do pamięci graficznej ekranu zaczynając od adresu &H5AE8.
Program 0, Mode Comp
0.3594 -> A[42]
1.00419048E41 -> A[43]~A[44]
1.00419848E41 -> A[45]
1.0007705E41 -> A[46]
Range 1,95,0,1,63,0
Cls
8 -> A
Lbl 0
53 -> C
8 -> D
Plot 0,0
Prog 1
Lbl 1
Frac (B/2)=0 => Plot A,C
Int (B/2) -> B
Isz C
C=57 => 49 -> C
Dsz D
Goto 1
Isz A
Goto 0
Program 1, Mode BASE-n
Hex
?->B
Dec
Uruchom Program 0 wpisując polecenie:
Prog 0
Następnie wpisz dane szesnastkowo, każdy bajt osobno:
40 5B 50 D0 AB 70 00 00
Zakończ wpisywanie danych za pomocą Mode 1 a następnie Mode +
Uruchom program maszynowy wpisując:
(-5/9)*(1E-44) -> Z[356]~Z[358]
Po restarcie systemu wciśnij G-T aby obejrzeć bajt wpisany do pamięci graficznej ekranu.
Program ładujący (2)
Inna wersja kopiująca dane pobrane z obszaru Programu 1 do pamięci graficznej ekranu zaczynając od adresu &H5AE8.
Program 0, Mode Comp
Ans -> B
S<2 => Goto 0
0.3594 -> A[42]
1.00419048E41 -> A[43]~A[44]
1.00419848E41 -> A[45]
1.0007705E41 -> A[46]
Lbl 0
S=0 => Goto 1
Range 1,95,0,1,63,0
Cls
8 -> C
Lbl 3
" "
Dsz C
Goto 3
11 -> A
Lbl 1
53 -> C
32 -> D
B<0 => B+2 Xy 32 -> B
Lbl 2
Frac (B/2)=0 => Plot A,C
Int (B/2) -> B
Isz C
C=57 => 49 -> C
Frac ((D-1)/8)=0 => Dsz A
Dsz D
Goto 2
A+8 -> A
0 -> S
Plot 0,0
Program 1, Mode Base-n
2 -> S
Hex
405B50D0:Prog 0
AB700000:Prog 0
Program 1 zawiera dane w postaci szesnastkowej, w grupach po osiem cyfr (cztery bajty), po każdej grupie danych następuje wywołanie Prog 0.
- Gdy zmienna S jest równa 0, wpisywanie jest kontynuowane od ostatniej pozycji.
- Gdy zmienna S jest równa 1, wpisywanie rozpoczyna się od początku (od adresu &H5AE8).
- Gdy zmienna S jest równa 2, wpisywanie rozpoczyna się od początku oraz dodatkowo w zmiennych A[42]~A[46] jest umieszczany program pośredniczący.
Uruchom Program 1. Ilość danych jest ograniczona do 88 bajtów kopiowanych pod stały adres.