Autor Wątek: Dla początkujących i powracających  (Przeczytany 28140 razy)

Abrimaal

  • *****
  • Wiadomości: 965
  • Miejsce pobytu:
    Lemmingrad
  • Zamulator
    • Games for ULA plus
Dla początkujących i powracających
« dnia: 2011.12.03, 00:54:50 »
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)
« Ostatnia zmiana: 2011.12.03, 01:03:51 wysłana przez Abrimaal »
AY Music, ULA plus.

matofesi

  • *****
  • Wiadomości: 2049
  • Miejsce pobytu:
    Toruń/Poland
Odp: Dla początkujących i powracających
« Odpowiedź #1 dnia: 2011.12.03, 14:30:45 »
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

  • *****
  • Wiadomości: 965
  • Miejsce pobytu:
    Lemmingrad
  • Zamulator
    • Games for ULA plus
Odp: Dla początkujących i powracających
« Odpowiedź #2 dnia: 2012.02.24, 02:40:15 »
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.
AY Music, ULA plus.

matofesi

  • *****
  • Wiadomości: 2049
  • Miejsce pobytu:
    Toruń/Poland
Odp: Dla początkujących i powracających
« Odpowiedź #3 dnia: 2012.02.24, 09:21:04 »
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.

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.

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.
« Ostatnia zmiana: 2012.02.24, 11:02:26 wysłana przez matofesi »

YERZMYEY/HOOY-PROGRAM

  • *****
  • Wiadomości: 1187
  • Miejsce pobytu:
    Rubber Planet
  • AY RIDERS
    • ZX Spectrum demos/games
Odp: Dla początkujących i powracających
« Odpowiedź #4 dnia: 2012.02.24, 09:51:03 »
jest loader w Basic, który robi CLEAR 24999 i ładuje dane od 25000 do ?
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?

matofesi

  • *****
  • Wiadomości: 2049
  • Miejsce pobytu:
    Toruń/Poland
Odp: Dla początkujących i powracających
« Odpowiedź #5 dnia: 2012.02.24, 11:00:38 »
Cytuj
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?

Oczywiście, że nie można liniowo. Jak się nic extra nie zrobi, to LOAD działa jak w 48 - ładuje do końca podstawowej pamięci. Żeby załadować resztę banków trzeba przed każdym kolejnym LOAD w trybie 128 przełączyć bank odpowiednim POKE. Trzeba przy tym pamiętać, że w trybie 128 część extra pamięci jest używana przez system (ramdysk, bufory edytora) i należy uważać co i gdzie się ładuje, żeby nie pokaszanić.

Abrimaal

  • *****
  • Wiadomości: 965
  • Miejsce pobytu:
    Lemmingrad
  • Zamulator
    • Games for ULA plus
Odp: Dla początkujących i powracających
« Odpowiedź #6 dnia: 2012.02.24, 20:48:38 »
Cytuj
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?

Oczywiście, że nie można liniowo. Jak się nic extra nie zrobi, to LOAD działa jak w 48 - ładuje do końca podstawowej pamięci. Żeby załadować resztę banków trzeba przed każdym kolejnym LOAD w trybie 128 przełączyć bank odpowiednim POKE. Trzeba przy tym pamiętać, że w trybie 128 część extra pamięci jest używana przez system (ramdysk, bufory edytora) i należy uważać co i gdzie się ładuje, żeby nie pokaszanić.
Banki pamięci od 49152 do 65535 przełącza się OUT 32765,n np. przełączanie ekranów dla gigascreen to OUT 32765,16 i 31 na zmianę na przerwaniach.
AY Music, ULA plus.

matofesi

  • *****
  • Wiadomości: 2049
  • Miejsce pobytu:
    Toruń/Poland
Odp: Dla początkujących i powracających
« Odpowiedź #7 dnia: 2012.02.24, 21:11:36 »
Aha. I spróbuj to zrobić w programie w BASICu w trybie 128 ;) Musiałbym chwilę poszukać, ale w BASICu jest do tego zmienna systemiowa, którą system monitoruje i przełącza stosownie banki.

A przełączanie ekranów "na przerwaniach" nie da ci gigascreena tylko dwa mrugające obrazki - na ile rozumiem koncepcję gigascreena musisz przełączać ekrany co linię i w kolejnych ramkach zamieniać kolejność ekranów.

Abrimaal

  • *****
  • Wiadomości: 965
  • Miejsce pobytu:
    Lemmingrad
  • Zamulator
    • Games for ULA plus
Odp: Dla początkujących i powracających
« Odpowiedź #8 dnia: 2012.02.24, 23:20:19 »
Ten "gigascreen" to napisałem tak na wyrost. Wiadomo o co chodzi.
A dodatkowych zmiennych systemowych dla 128 nie znam, nawet nie wiem pod jakimi adresami się znajdują.
AY Music, ULA plus.

Pyza^Illusion

  • *****
  • Wiadomości: 586
  • Miejsce pobytu:
    Lubań, dolnośląskie
Odp: Dla początkujących i powracających
« Odpowiedź #9 dnia: 2012.02.25, 01:12:26 »
Aha. I spróbuj to zrobić w programie w BASICu w trybie 128 ;) Musiałbym chwilę poszukać, ale w BASICu jest do tego zmienna systemiowa, którą system monitoruje i przełącza stosownie banki.

A przełączanie ekranów "na przerwaniach" nie da ci gigascreena tylko dwa mrugające obrazki - na ile rozumiem koncepcję gigascreena musisz przełączać ekrany co linię i w kolejnych ramkach zamieniać kolejność ekranów.

Otóż nie... Jest to zresztą opisane w którymś temacie tu na forum (w dziale z grafiką). Giga-screen to właśnie tylko 2 mrugające obrazki zmieniające się co ramkę :p

Zmienna systemowa w BASIC 128 to POKE 23388,x (x-nr banku). Nie pamiętam czy ten nr banku miał podobne wartości jak dla OUT'a. Generalnie i tak "nikt" z tego nie korzystał. Programy zawsze pisało się pod USR0 i BASIC48.
ZX Spectrum+ (128kB by STAVI), FDD3000, TI-OF-TTL/ZXVGS, Masterface2b, MacFace II, DivIDE plus, Just Speccy 128...

Abrimaal

  • *****
  • Wiadomości: 965
  • Miejsce pobytu:
    Lemmingrad
  • Zamulator
    • Games for ULA plus
Odp: Dla początkujących i powracających
« Odpowiedź #10 dnia: 2012.02.25, 03:04:33 »

Otóż nie... Jest to zresztą opisane w którymś temacie tu na forum (w dziale z grafiką). Giga-screen to właśnie tylko 2 mrugające obrazki zmieniające się co ramkę :p
Czyli jednak dobrze, w tym temacie jest dokładnie wyjaśniona różnica.

Zmienna systemowa w BASIC 128 to POKE 23388,x (x-nr banku). Nie pamiętam czy ten nr banku miał podobne wartości jak dla OUT'a. Generalnie i tak "nikt" z tego nie korzystał. Programy zawsze pisało się pod USR0 i BASIC48.
[/quote]
To znaczy, że dodatkowe zmienne w 128 "siedzą" pod adresami 23296-23551, czyli obszar pierwotnie zarezerwowany dla drukarki. Muszę to sprawdzić czy są one tam także trybie BASIC 48. Tutaj muszę się zgodzić - edytor BASIC 128 jest wyjątkowo niewygodny, zwłaszcza gdy w programie (np. w linii 0) jest jakiś kod.
AY Music, ULA plus.

matofesi

  • *****
  • Wiadomości: 2049
  • Miejsce pobytu:
    Toruń/Poland
Odp: Dla początkujących i powracających
« Odpowiedź #11 dnia: 2012.02.25, 13:37:59 »

Otóż nie... Jest to zresztą opisane w którymś temacie tu na forum (w dziale z grafiką). Giga-screen to właśnie tylko 2 mrugające obrazki zmieniające się co ramkę :p
Czyli jednak dobrze, w tym temacie jest dokładnie wyjaśniona różnica.

Ja tam się nie będę sprzeczał - moim zdaniem obie wersje (czyli mruganie co ramkę i to, co sam zrobiłem czyli mruganie co linię) wyglądają okropnie ;)


Cytuj
Cytuj
Zmienna systemowa w BASIC 128 to POKE 23388,x (x-nr banku). Nie pamiętam czy ten nr banku miał podobne wartości jak dla OUT'a. Generalnie i tak "nikt" z tego nie korzystał. Programy zawsze pisało się pod USR0 i BASIC48.
To znaczy, że dodatkowe zmienne w 128 "siedzą" pod adresami 23296-23551, czyli obszar pierwotnie zarezerwowany dla drukarki.

Tak. Nowe zmienne siedzą od 23296.

Zmienna BANK_M ($5B5C) jest zasadniczo kopią ostatnio wysłanego przez system na port $7FFD bajtu. W części sytuacji - głównie przy przełączaniu między ROMami - system pobiera zapisaną tam wartość, zmienia jeden bit i wysyła na port $7FFD dlatego jest to poprawna metoda przełączania banków w trybie BASIC 128. W trybie tym należy też uważać na bank 7 pamięci - system używa go jako bufora dla edytora BASIC 128. W Pozostałych bankach przechowywane są dane jeśli używamy ramdysku systemowego - na to też należy zwrócić uwagę.

Cytuj
Muszę to sprawdzić czy są one tam także trybie BASIC 48.

Nie masz czego sprawdzać - po przejściu w tryb 48 niezależnie od tego czy bankowanie pamięci zostało przy tym wyłączone czy nie startuje po prostu ROM 1, który zasadniczo niczym się nie różni od normalnego ROMu 48. Ma jakieś drobne zmiany i jedną extra procedurę generującą "obraz testowy" (można ją wywołać nawet w trybie 48 przez RANDOMIZE USR 15388).

A skoro nie ma różnicy w działaniu to i nie ma potrzeby (ani nawet zasadności) używania dodatkowych zmiennych systemowych. W trybie 48 od $5C00 zaczyna się po prostu bufor drukarki.


Abrimaal

  • *****
  • Wiadomości: 965
  • Miejsce pobytu:
    Lemmingrad
  • Zamulator
    • Games for ULA plus
Odp: Dla początkujących i powracających
« Odpowiedź #12 dnia: 2012.02.25, 17:35:03 »
Dzięki za przybliżenie konstrukcji 128, jedna prośba - mógłbyś pisać adresy w systemie 10, my nie debuggery  :-X
AY Music, ULA plus.

matofesi

  • *****
  • Wiadomości: 2049
  • Miejsce pobytu:
    Toruń/Poland
Odp: Dla początkujących i powracających
« Odpowiedź #13 dnia: 2012.02.25, 18:15:30 »
Mógłbym. Ale wtedy czytając moją dokumentację musiałbym odpalać kalkulator i przeliczać adresy na dec ;)

Ale na przyszłość postaram się o tym pamiętać.

Abrimaal

  • *****
  • Wiadomości: 965
  • Miejsce pobytu:
    Lemmingrad
  • Zamulator
    • Games for ULA plus
Odp: Dla początkujących i powracających
« Odpowiedź #14 dnia: 2012.02.26, 16:44:25 »
Czy ktoś ma wykaz zmiennych systemowych dla 128 (np. skan z instrukcji) i mógłby go udostępnić?
AY Music, ULA plus.