Dyskusja:Programowanie: Jak wyłączyć ROM systemu
From Atariki
Wersja z dnia 11:26, 13 wrz 2008 Bob er (Dyskusja | wkład) ← Previous diff |
Aktualna wersja Jhusak (Dyskusja | wkład) |
||
Linia 2: | Linia 2: | ||
fakt, jednakze zastosowanie tych 6-ciu bajtow jest bardzo waskie. [[Użytkownik:Bob_er|Bob_er]] 13:25, 13 wrz 2008 (CEST) | fakt, jednakze zastosowanie tych 6-ciu bajtow jest bardzo waskie. [[Użytkownik:Bob_er|Bob_er]] 13:25, 13 wrz 2008 (CEST) | ||
+ | |||
+ | |||
+ | sądzę, że z formalnego punktu widzenia lepiej posługiwać się ostatnim adresem $ffff, a nie $fff9 - po pierwsze dlatego, że rozmawiamy o specyficznej architekturze Atari, a więc skupiamy się na sterowaniu dostępem do pamięci w Atari a nie znaczeniem tych komórek dla 6502, po drugie - tu również mamy do czynienia ze specyfiką Atari: ignorując przerwania IRQ możemy dowolnie korzystać z komórki od jego wektora - przerwań NMI nie zignorujemy, ale w Atari możemy zablokować ich źródło, zatem komórki są do naszego wykorzystania, pozostaje wektor RESET, którego wartość w RAM-ie i tam może być dowolna i ze względu na specyfikę konstrukcji Atari 6502 nigdy nie korzysta z komórek RAM-u "pod ROM" dla wektora RESET - bowiem podczas sprzętowego RESET-a przywracane są domyślne ustawienia układu PIA, który ustawia bity PORTB ($d301) tak, że ZAWSZE po resecie w tym obszarze będzie ROM i obsługa "reseta" nastąpi poprzez skok poprzez wartości umieszczone w ROM-ie. --[[Użytkownik:Macgyver|Macgyver]] 16:55, 13 wrz 2008 (CEST) | ||
+ | |||
+ | poza tym specyfika systemu atari wymaga wyłączenia przerwań na czas włączenia w obszarze c000-cfff i d800-ffff RAM-u, i komórki fff9-ffff i tak są widoczne jako zwykła pamięc, zatem argumentacja, że "zastosowanie jest bardzo wąskie" i dlatego należy podawać adres końca fff9, a nie ffff według mnie wprowadza dużo zbędnego zamieszania. Pamięć jest w pełni mapowalna i dostępna dla CPU (Antica zresztą też), zatem nie używajmy oznaczenia fff9 tylko ffff --[[Użytkownik:Macgyver|Macgyver]] 22:37, 13 wrz 2008 (CEST) | ||
+ | |||
+ | |||
+ | zapis do NMIRES (_no sta $d40f) w procedurze rozpoznawania przerwania jest zbędny.[[Użytkownik:Xxl|Xxl]] 14:39, 9 mar 2013 (CET) | ||
+ | |||
+ | |||
+ | @jhusak: Do pustego handlera pod ROM mam dwie uwagi: | ||
+ | |||
+ | 1. Wektor RES $FFFC jest dostępny do wolnego użycia bo w przypadku wciśnięcia klawisza RESET automatycznie podłączany jest ROM. Można by się spierać co najwyżej o programowy skok JMP (RES), ale wtedy RTI nic tu nie da, ani nawet JMP *, ani RTS. | ||
+ | |||
+ | 2. Jak się Twoim zdaniem zachowa IRQ mając tylko RTI? Bo zgłoszenie IRQ nie zniknie sobie samo z siebie - trzeba je obsłużyć. Jedynym sensownym rozwiązaniem problemu byłoby odroczenie obsługi przerwań przez SEI, ale to się robi w kodzie użytkownika. Więc IRQ też jest w zasadzie dostępny do dowolnego użycia - no można się próbować bronić obsługą BRK za pomocą wektora IRQ (choć to nie jest przerwanie maskowalne :D), ale ono też jest wołane z kodu użytkownika a nie niezależnie :) Tylko co najwyżej RTI na NMI ma sens. | ||
+ | |||
+ | [[Użytkownik:Mono|Mono]] 13:07, 25 sty 2024 (CET) | ||
+ | |||
+ | Racja z IRQ, należy stosować SEI/CLI wokół wyłączenia systemu, albo dodać stosowny dłuższy handler z zerowaniem znacznika irq. [[Użytkownik:jhusak|jhusak]] 13:56, 8 lut 2024 (CET) |
Aktualna wersja
(obszary: $c000-$cfff oraz $d800-$fff9) - do $fff9-$ffff też mamy dostęp. Xxl 08:44, 11 wrz 2008 (CEST)
fakt, jednakze zastosowanie tych 6-ciu bajtow jest bardzo waskie. Bob_er 13:25, 13 wrz 2008 (CEST)
sądzę, że z formalnego punktu widzenia lepiej posługiwać się ostatnim adresem $ffff, a nie $fff9 - po pierwsze dlatego, że rozmawiamy o specyficznej architekturze Atari, a więc skupiamy się na sterowaniu dostępem do pamięci w Atari a nie znaczeniem tych komórek dla 6502, po drugie - tu również mamy do czynienia ze specyfiką Atari: ignorując przerwania IRQ możemy dowolnie korzystać z komórki od jego wektora - przerwań NMI nie zignorujemy, ale w Atari możemy zablokować ich źródło, zatem komórki są do naszego wykorzystania, pozostaje wektor RESET, którego wartość w RAM-ie i tam może być dowolna i ze względu na specyfikę konstrukcji Atari 6502 nigdy nie korzysta z komórek RAM-u "pod ROM" dla wektora RESET - bowiem podczas sprzętowego RESET-a przywracane są domyślne ustawienia układu PIA, który ustawia bity PORTB ($d301) tak, że ZAWSZE po resecie w tym obszarze będzie ROM i obsługa "reseta" nastąpi poprzez skok poprzez wartości umieszczone w ROM-ie. --Macgyver 16:55, 13 wrz 2008 (CEST)
poza tym specyfika systemu atari wymaga wyłączenia przerwań na czas włączenia w obszarze c000-cfff i d800-ffff RAM-u, i komórki fff9-ffff i tak są widoczne jako zwykła pamięc, zatem argumentacja, że "zastosowanie jest bardzo wąskie" i dlatego należy podawać adres końca fff9, a nie ffff według mnie wprowadza dużo zbędnego zamieszania. Pamięć jest w pełni mapowalna i dostępna dla CPU (Antica zresztą też), zatem nie używajmy oznaczenia fff9 tylko ffff --Macgyver 22:37, 13 wrz 2008 (CEST)
zapis do NMIRES (_no sta $d40f) w procedurze rozpoznawania przerwania jest zbędny.Xxl 14:39, 9 mar 2013 (CET)
@jhusak: Do pustego handlera pod ROM mam dwie uwagi:
1. Wektor RES $FFFC jest dostępny do wolnego użycia bo w przypadku wciśnięcia klawisza RESET automatycznie podłączany jest ROM. Można by się spierać co najwyżej o programowy skok JMP (RES), ale wtedy RTI nic tu nie da, ani nawet JMP *, ani RTS.
2. Jak się Twoim zdaniem zachowa IRQ mając tylko RTI? Bo zgłoszenie IRQ nie zniknie sobie samo z siebie - trzeba je obsłużyć. Jedynym sensownym rozwiązaniem problemu byłoby odroczenie obsługi przerwań przez SEI, ale to się robi w kodzie użytkownika. Więc IRQ też jest w zasadzie dostępny do dowolnego użycia - no można się próbować bronić obsługą BRK za pomocą wektora IRQ (choć to nie jest przerwanie maskowalne :D), ale ono też jest wołane z kodu użytkownika a nie niezależnie :) Tylko co najwyżej RTI na NMI ma sens.
Mono 13:07, 25 sty 2024 (CET)
Racja z IRQ, należy stosować SEI/CLI wokół wyłączenia systemu, albo dodać stosowny dłuższy handler z zerowaniem znacznika irq. jhusak 13:56, 8 lut 2024 (CET)