1 Ostatnio edytowany przez Larhard (2008-06-26 14:55:14)

Mam pytanie, czy ktoś zna jakiś sposób, żeby unieszkodliwić klawisz break, wiem, że to możliwe w języku maszynowym, ale niezbyt go rozumiem, a listing do tego gdzieś posiałem.

2

http://atariki.krap.pl/index.php/Rejestry_POKEY-a#IRQEN

3

Poke 566,158

https://www.youtube.com/watch?v=jofNR_WkoCE

4

Fox: to użycie nielegalnego adresu wewnątrz ROM-u. :P

KMK
? HEX$(6670358)

5 Ostatnio edytowany przez larek (2008-06-26 17:01:26)

Pisząc w Turbo-Basic XL można też przechwycić naciśnięcie klawisza Break. Służy do tego *B+. Wciśnięcie Break spowoduje błąd, który możemy obsłużyć. Np. (tak na szybko):

10 *B+                                                                        'włączenie obsługi klawisza Break
20 TRAP #ERR                                                                  'ustawienie "pułapki" 
30 #START                                                                     'program główny
40 ? RND
.
.
.
500 GO#START
510 #ERR                                                                      'powstał błąd
520 IF ERR<>128 THEN ?"ERROR ";ERR;" IN ";ERL : END                           'to jakiś inny błąd
530 TRAP #ERR                                                                 'ponowne włączenie pułapki
540 ?"NACISNIETO BREAK, ALE I TAK NIE PRZERWE PROGRAMU :-)"                   'obsługa Break
550 PAUSE 100
560 GO#START

*B- przywraca normalne działanie klawisza Break

6

wow, nawet nie wiedziałem że w TB jest coś na kształt dyrektyw *B+-

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

7

Trzeba było pisać dema w turbobeju tobyś wiedział o nim dużo. :)

Hitler, Stalin, totalniak, SSman, NKWDzista, kaczor dyktator, za długo byłem w ChRL, wypowiadam się afektywnie.

8

O, widzę Larek, że chyba się szeroko do Ciebie uśmiechnę :D

___
Press play on tape...

9

larek, Twój przykład jest błędny. Po wciśnięciu klawisza Break wykonywanie programu powróci do jego początku, a dobrze byłoby, gdyby wracał do miejsca przerwania. W linii 560. powinno być nie GO# START, a GOTO ERL. Nie pamiętam, czy poprawne operacje we/wy (w tym także PRINT) ustawiają zmienne ERR i ERL, więc na wszelki wypadek warto przepisać te zmienne do innych i korzystać z "kopii" zmiennych.

Zawsze mam rację, tylko nikt mnie nie słucha.

10

Nie nazwałbym tego błędem. To jest tylko wymyślony na szybko przykład "przeprogramowania" klawisza Break w TBXL - chciałem pokazać, że się da i jaki jest tego mechanizm. W poważniejszym programie obawiałbym się stosować coś takiego. Przerwanie (po wciśnięciu Break) może przecież nastąpić w dowolnym miejscu wykonywanego programu. Jeśli jedna linia programu zawiera kilka instrukcji, to nigdy nie będzie się dało wrócić do tej przerwanej komendy. Nawet przy konstrukcji 1linia=1intrukcja przerwanie może nastąpić w trakcie realizacji tej instrukcji i ani wykonanie jej jeszcze raz, ani jej pominięcie nie będzie nas satysfakcjonowało. Stosować to można tylko w pewnych sytuacjach, gdzie wszystko mamy pod kontrolą. A w swoich programach najczęściej stosuję to, co napisał Fox :P Legalne - nielegalne, ale działa znakomicie :D

11

Wielkie dzięki

12

larek napisał/a:

Legalne - nielegalne, ale działa znakomicie :D

Do czasu, kiedy zmienisz OS na taki, który pod tym adresem ma co innego. Albo, nie daj panie Boże, zechcesz do XL OS-u z jakigoś powodu zaaplikować zmodyfikowane procedury przerwań IRQ. Wtedy "znakomite działanie" tej metody się skończy. Nie bój żaby, "legalność" adresów wewnątrz OS-u ma swoje uzasadnienie.

KMK
? HEX$(6670358)

13

nie dajmy sie zwariowac...

pakiet matematyczny ma jakas tablice adresow procedur? chyba nie.
wiec jakiekolwiek odwolanie atari basica do pakietu matematycznego jest nielegalne (nie jest to czesc interpretera).

a teraz pytam powaznie: co to znaczy nielegalne odwolanie do romu?

http://atari.pl/hsc/ad.php?i=1.

14 Ostatnio edytowany przez drac030 (2008-06-27 10:49:38)

Pakiet matematyczny nie ma tablicy odwołań i to jest jedna z jego głównych wad (acz jak wiadomo, nawet nie najwazniejsza). A usprawiedliwić to można tylko tym, że tablica skoków się pewnie panom programistom w tych 2k nie zmieściła.

Nielegalne odwołanie do ROM-u to każde, które posługuje się bezpośrednio (jako stałą) adresem wewnątrz ROM-u, oprócz tych, które zostały zdefiniowane jako legalne :) Legalne są:

* sygnatury w XL OS-ie ($C002 i nastepne bajty, szczegóły w Atariki)
* tablica skoków
* adresy wewnątrz pakietu matematycznego (ale w granicach rozsądku)

I to chyba tyle. Te adresy po prostu gwarantowanie się nie zmienią w żadnej wersji OS-u.

Część procedur nie jest legalnie dostępna bezpośrednio, ale jest dostępna przez wektory w pamięci RAM. To są głównie procedury przerwań, ale nie tylko, np. w każdym bloku IOCB jest wektor PUTBYTE, przez który można wywołać ze sterownika urządzenia podprogram wysyłający na to urządzenie bajt.

Teraz, po co to komu. Po to, żeby można było bez problemu ulepszyć system operacyjny, gdy kogo najdzie taka chęć. Dajmy na to, chcesz napisać lepszy pakiet matematyczny dla BASIC-a. Gdyby była tablica skoków, miałbyś na swoje pomysły całe 2k. Jednak konieczność zachowywania adresów wewnątrz utrudnia ci zakodowanie tego, bo jeśli twoja procedura FMUL jest dłuższa niż standardowa, to musisz skokiem JMP ominąć następną. Tracisz przy tym 3 bajty na skok, chociaż miejsca na kod wiele nie masz.

Tak samo z pozostałym OS-em, 16k (a w zasadzie to 10) to nie jest dużo, a konieczność utrzymywania nielegalnych adresów (dla kompatybilności) powoduje dodatkowe zmniejszenie tego obszaru i kosmicznie utrudnia wprowadzanie poprawek - bo np. wyobraź sobie, że jak dodasz jeden bajt do procedury SIO, to o ten jeden bajt się przesuwają wszystkie dalsze i musisz teraz kombinowac, jak je przesunąć z powrotem.

Proponuję poćwiczyć na jakimś własnym programie, tzn. zadać sobie konieczność utrzymania adresów wszystkich podprogramów, a potem, bez przedłużania kodu, wprowadzić jakieś major poprawki.

EDIT: pomysłowo ominięto ten problem w SpartaDOS X - procedury biblioteki mogą być pod dowolnymi adresami i niczgo nie trzeba utrzymywac w nastepnej wersji, bo jest lista symboli, takich wskaźników, które zawsze wskazują aktualny adres, pod jakim znajduje się procedura (ale trochę w inny sposób, niż to robią wektory).

KMK
? HEX$(6670358)