Indeks | English version |
Autorem poniższych informacji i programów jest Samir Ribic.
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.
Xmin -10 max 10 scl 1 Ymin -10 max 10 scl 1
Xmin -10 max 10 scl 0 Ymin -10 max 10 scl 0
SAVE "A"GPomiędzy SAVE i pierwszym cudzysłowem ma być spacja, pomiędzy drugim cudzysłowem oraz G nie może być spacji.
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!
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ęć:
Trick odkryli wspólnymi siłami w lutym 1989 roku: Zeljko Juric, Samir Ribic i Emir Kapic.
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[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
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[358]
Po restarcie systemu wciśnij G↔T aby obejrzeć bajt wpisany do pamięci graficznej ekranu.
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+2xy32→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.
Uruchom Program 1. Ilość danych jest ograniczona do 88 bajtów kopiowanych pod stały adres.