Dwa kolejne pytania .
Co powoduje zmienna 23739 - znalazłem to w loaderze dla gry sterowanej myszą.
W mądrej książce jest tylko coś takiego - zmienna SBRT 23737 (10 bajtów) podprogram wywołania procedury z ROM:
LD HL,nn : CALL uu : LD (23738), HL : RET - to jest jasne, lecz
co to daje w praktyce, jeśli z loadera nie ma żadnego wywołania USR, zmieniany jest tylko 3 bajt zmiennej, czyli rejestr H.
23739 to zmienna (a właściwie kawałek kodu) używana przez ZX Interface 1. Nie wiem do czego miałby tej zmiennej używać loader - używa jej Shadow ROM Interface 1 do wywoływania procedur z ROMu systemowego - ustawia w tym obszarze adres procedury, która ma zostać wywołana (z Shadow ROM wykonywane jest to przez RST 16; DW adres_procedury), na stosie ustawia jako adres powrotu #0008 (adres procedury obsługi błędów i równocześnie hook aktywujący Shadow ROM) na koniec na stos trafia adres zmiennej SBRT i wołana jest procedura wyłączająca Shadow ROM, co w efekcie powoduje wykonanie SBRT, skok do ROMu systemowego a po powrocie z niego skok pod adres #0008 z ustawionym znacznikiem "wykonała się procedura z ROMu systemowego".
Tak to w skrócie działa i ładowanie czegokolwiek w to miejsce nie powinno mieć żadnego wpływu na to, co system robi jeśli tylko nie popsuje się samego kodu, który tam siedzi i ładowany jest tylko raz.
edit: No i oczywiście trzeba pamiętać, że jeśli do komputera nie jest podłączony Interface 1 (ani inne urządzenia, które przesuwają początek programu - np. Beta z TR-DOSem) to 23739 jest już w obszarze programu w BASICu.
Drugie - czy jest możliwe w Basic wykonanie INPUT na ekranie? Próbowałem INPUT #2;a
to wyświetla błąd Invalid I/O Device.
Hmmm... Mam wrażenie, że się da, ale... Na szybko udało mi się znaleźć tylko obejście - w jednym INPUT trzeba najpierw dać AT na jakąś dalszą pozycję, co spowoduje rozszerzenie pola wprowadzania tekstu a potem w tym samym poleceniu następne AT pozwala ustawić się już gdzieś w środku ekranu
INPUT AT 22,0;"";AT 0,0;"pytanie: ";a;AT 10,10;"coś jeszcze? ";a$
Niestety takie rozwiązanie nie pozwala zaadresować całego ekranu - w pierwszym AT nie da się zrobić 23 (Integer out of range) co powoduje, że następne AT 0,0 to drugi wiersz ekranu. Dodatkowo pierwszy AT rozszerza obszar wprowadzania wyscrollowując to, co było na ekranie. W efekcie jeśli chcemy uzyskać ładną "formatkę" do wprowadzania danych wszystko co ma się na ekranie wyświetlić musi być wyświetlane samym INPUTem. W pierwszym wierszu można co najwyżej wypisać coś statycznego - nie da się tam wstawić pola wprowadzania. Całość może wyglądać np. tak:
10 PRINT AT 21,0;"To, co się przescrolluje na samą górę ekranu"
20 INPUT AT 22,0;""; AT 0,0;"Pierwszy prompt:"; AT 1,0;"Drugi prompt:"; AT 0,17;a; AT 1,17;b$
Pierwszy wiersz wyświetla tekst na dole ekranu. Drugi przescrollowuje go na samą górę powiększając pole wprowadzania (AT 22,0) a następnie drukuje teksty pytań - wszystkie za jednym razem, żeby formatka wyglądała od razu jak należy a na koniec prosi o wprowadzenie poszczególnych zmiennych. Jedyna rzecz, która w tym rozwiązaniu jest nieładna to ten początkowy "scroll" - tekst z pierwszej linii przewija się na górę ekranu a potem dopiero wyświetla się to, co jest wpisane w INPUT.
Zrobienie tego wszystkiego "ładnie" wymagałoby napisania własnego podprogramu wprowadzania danych z klawiatury i używanie go zamiast INPUT - o ile pamiętam nie jest to jakieś bardzo skomplikowane choć oczywiście byłoby miło jakby się to dało zrobić z poziomu systemu

A próba odczytu z #2 zawsze da I/O error, bo kanał S jest kanałem tylko do zapisu.