ZX Spectrum > PROGRAMOWANIE

Dla początkujących i powracających

(1/7) > >>

Abrimaal:
Myślę, że taki temat jest potrzebny.
Są ludzie, którzy dopiero zaczynają przygodę ze Spectrum
i tacy, którzy mieli kilkanaście lat przerwy i pozapominali.
Żadne pytanie tutaj nie jest głupie.

Moje pierwsze: od jakiego adresu zaczyna się Basic w ZX 128?
Konkretniej: jest loader w Basic, który robi CLEAR 24999 i ładuje dane od 25000 do ?
Gdzie można bezpiecznie wstawić około 30 bajtów kodu, żeby nie wszedł na to stos ani kod nie wszedł na Basic?
Intuicja podpowiada mi - w pierwszą linię Basic, dlatego pytam o adres (dla 128)

matofesi:
Intuicja podpowiada mi, że peek 23635  + 256 * peek 23636 + 2 ;)

O ile pamiętam w 128 ta zmienna jest w tym samym miejscu i ma to samo znaczenie co w 48.

Abrimaal:
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.

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.

matofesi:

--- Cytuj ---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.

--- Koniec cytatu ---

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.


--- Cytuj ---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.

--- Koniec cytatu ---

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


--- Kod: ---INPUT AT 22,0;"";AT 0,0;"pytanie: ";a;AT 10,10;"coś jeszcze? ";a$

--- Koniec kodu ---

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:


--- Kod: ---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$

--- Koniec kodu ---

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.

YERZMYEY/HOOY-PROGRAM:

--- Cytat: Abrimaal w 2011.12.03, 00:54:50 ---jest loader w Basic, który robi CLEAR 24999 i ładuje dane od 25000 do ?

--- Koniec cytatu ---
Nie znam się na szatańskich machinach typu ZX128, ale -
ładuje od 25000 aż do końca bloku z danymi, już sam z siebie.
Tu: prawdopodobnie należy również pamiętać, że 128K ma bankowanie jakies tam, czy coś? I tak liniowo to nie można sobie nawalić masy danych? Mat? Tygrys?

Nawigacja

[0] Indeks wiadomości

[#] Następna strona

Idź do wersji pełnej