Programowanie: Jak wyłączyć ROM systemu
From Atariki
Wersja z dnia 18:25, 7 wrz 2005 Mikey (Dyskusja | wkład) (testowo artykul do kategorii biblioteczka kodera, ustalenia z irc :)) ← Previous diff |
Aktualna wersja Jhusak (Dyskusja | wkład) |
||
Linia 1: | Linia 1: | ||
+ | Atari z serii [[XL]] i [[XE]] ma tę ciekawą cechę, iż umożliwia wyłączenie pamięci [[ROM]] i podstawienie w jej miejsce bloku pamięci [[RAM]] dzięki czemu uzyskujemy dostęp do większej ilości tejże pamięci (obszary: $c000-$cfff oraz $d800-$ffff), zwykle niedostępnej dla programisty (gdy [[ROM]] jest podłączony). | ||
+ | Pamięć ROM przechowuje istotne elementy oprogramowania komputera - np. obsługę przerwań, dlatego należy zatroszczyć się o to, aby po wyłączeniu ROM-u przerwania nadal miały przypisane odpowiednie procedury obsługi. | ||
+ | |||
<pre> | <pre> | ||
Linia 7: | Linia 10: | ||
system_off equ * | system_off equ * | ||
- | |||
- | lda 20 ; czekamy do nastepnej ramki aby zaczac zmieniac wektory zaraz po ostatnim NMI | ||
- | cmp 20 | ||
- | beq *-2 | ||
lda #0 | lda #0 | ||
Linia 38: | Linia 37: | ||
</pre> | </pre> | ||
+ | |||
+ | Czasami chcemy mieć możliwość odłaczenia ROMu i mieć nieograniczony (prawie, bez ostatnich 6-7 bajtów) dostęp do pamięci pod romem. Najprostsze rozwiązanie to pusty handler przerwania i ustawienie na niego wektorów: | ||
+ | |||
+ | <pre> | ||
+ | org $fff9 | ||
+ | rti | ||
+ | .word $fff9 | ||
+ | .word $fff9 | ||
+ | .word $fff9 | ||
+ | </pre> | ||
+ | |||
+ | Należy jednak mieć na uwadze, że w takim przypadku po odłączeniu romu nie będą się wykonywały żadne procedury przerwań, czyli np. nie będą liczyły timery czy mogą się rozsynchronizować przerwania DLI, a muzyka będzie miała przestoje. W przypadku zajścia przerwania IRQ bez wyzerowania bitu przerwania może nastąpić zapętlenie przerwań, więc przed odłączeniem systemu należy wykonać SEI, a po powrocie CLI - lub stworzyć handler, który będzie kasował bity przerwań w IRQST. | ||
+ | |||
+ | [[Kategoria:Niezbędnik kodera]] |
Aktualna wersja
Atari z serii XL i XE ma tę ciekawą cechę, iż umożliwia wyłączenie pamięci ROM i podstawienie w jej miejsce bloku pamięci RAM dzięki czemu uzyskujemy dostęp do większej ilości tejże pamięci (obszary: $c000-$cfff oraz $d800-$ffff), zwykle niedostępnej dla programisty (gdy ROM jest podłączony). Pamięć ROM przechowuje istotne elementy oprogramowania komputera - np. obsługę przerwań, dlatego należy zatroszczyć się o to, aby po wyłączeniu ROM-u przerwania nadal miały przypisane odpowiednie procedury obsługi.
; ; procedura system_off - wylaczamy OS, podlaczamy RAM pod ROMem i ; zajmujemy sie na wlasna reke obsluga NMI ; system_off equ * lda #0 sta $d40e ; wylaczamy NMI sei ; oraz IRQ lda #$fe ; oraz podlaczamy RAM pod ROMem, wylaczajac OS sta $d301 ; poniewaz nie mamy juz systemu nalezy zadbac o wlasna obsluge przerwan NMI lda <NMI sta $fffa lda >NMI sta $fffb lda #$c0 ;wlaczamy NMI sta $d40e rts NMI bit $d40f ; sprawdzamy czy przerwanie to VBL czy DLI bpl _no jmp (DLI) _no sta $d40f jmp (VBL) DLI dta a(my_dli) ; my_vbl i my_dli to juz nasze procedury obslugi przerwan. VBL dta a(my_vbl)
Czasami chcemy mieć możliwość odłaczenia ROMu i mieć nieograniczony (prawie, bez ostatnich 6-7 bajtów) dostęp do pamięci pod romem. Najprostsze rozwiązanie to pusty handler przerwania i ustawienie na niego wektorów:
org $fff9 rti .word $fff9 .word $fff9 .word $fff9
Należy jednak mieć na uwadze, że w takim przypadku po odłączeniu romu nie będą się wykonywały żadne procedury przerwań, czyli np. nie będą liczyły timery czy mogą się rozsynchronizować przerwania DLI, a muzyka będzie miała przestoje. W przypadku zajścia przerwania IRQ bez wyzerowania bitu przerwania może nastąpić zapętlenie przerwań, więc przed odłączeniem systemu należy wykonać SEI, a po powrocie CLI - lub stworzyć handler, który będzie kasował bity przerwań w IRQST.