Obsługa rozszerzenia pamięci RAM
From Atariki
(Różnice między wersjami)
Wersja z dnia 22:06, 9 lis 2011 KMK (Dyskusja | wkład) ← Previous diff |
Wersja z dnia 18:56, 10 lis 2011 KMK (Dyskusja | wkład) (przeróbka na procedurę zliczającą banki 64k) Next diff → |
||
Linia 16: | Linia 16: | ||
pha | pha | ||
- | ldx #$7f ;zapamietanie bajtow ext | + | ldx #$0f ;zapamiętanie bajtów ext (z 16 bloków po 64k) |
_p0 jsr setpb | _p0 jsr setpb | ||
lda ext_b | lda ext_b | ||
Linia 23: | Linia 23: | ||
bpl _p0 | bpl _p0 | ||
- | ldx #$7f ;wyzerowanie ich (w oddzielnej petli, bo nie wiadomo | + | ldx #$0f ;wyzerowanie ich (w oddzielnej pętli, bo nie wiadomo |
- | _p1 jsr setpb ;ktore kombinacje bitow PORTB wybieraja te same banki) | + | _p1 jsr setpb ;które kombinacje bitów PORTB wybierają te same banki) |
lda #$00 | lda #$00 | ||
sta ext_b | sta ext_b | ||
Linia 30: | Linia 30: | ||
bpl _p1 | bpl _p1 | ||
- | stx portb ;eliminacja pamieci podstawowej | + | stx portb ;eliminacja pamięci podstawowej |
stx ext_b | stx ext_b | ||
- | stx $00 ;niezbedne dla niektorych rozszerzen do 256k | + | stx $00 ;niezbędne dla niektórych rozszerzeń do 256k |
- | ldy #$00 ;petla zliczajaca banki | + | ldy #$00 ;pętla zliczająca bloki 64k |
- | ldx #$7f | + | ldx #$0f |
_p2 jsr setpb | _p2 jsr setpb | ||
- | lda ext_b | + | lda ext_b ;jeśli ext_b jest różne od zera, blok 64k już zliczony |
bne _n2 | bne _n2 | ||
- | dec ext_b | + | dec ext_b ;w przeciwnym wypadku zaznacz jako zliczony |
- | lda portb | + | lda portb ;wpisz wartość PORTB do tablicy dla banku 0 |
sta banks,y | sta banks,y | ||
+ | eor #%00000100 ;uzupełnij wartości dla banków 1, 2, 3 | ||
+ | sta banks+1,y | ||
+ | eor #%00001100 | ||
+ | sta banks+2,y | ||
+ | eor #%00000100 | ||
+ | sta banks+3,y | ||
+ | iny | ||
+ | iny | ||
+ | iny | ||
iny | iny | ||
_n2 dex | _n2 dex | ||
bpl _p2 | bpl _p2 | ||
- | ldx #$7f ;przywrocenie zawartosci ext | + | ldx #$0f ;przywrócenie zawartości ext |
_p3 jsr setpb | _p3 jsr setpb | ||
lda bsav,x | lda bsav,x | ||
Linia 59: | Linia 68: | ||
; podprogramy | ; podprogramy | ||
setpb txa | setpb txa | ||
- | sec ;wartosc licznika mnozymy przez 2 i dodajemy 1 | + | lsr ;zmiana kolejności bitów: %0000dcba -> %cba000d0 |
- | rol ;w celu przesuniecia wszystkich bitow w lewo i ustawienia bitu sterujacego OS ROM | + | ror |
+ | ror | ||
+ | ror | ||
+ | bcc _j1 | ||
+ | ora #%00000010 | ||
+ | _j1 ora #%00001101 ;wybór pierwszego banku 16k w bloku 64k i ustawienie bitu sterującego OS ROM | ||
sta portb | sta portb | ||
rts | rts | ||
Linia 66: | Linia 80: | ||
; zmienne | ; zmienne | ||
banks .ds 64 | banks .ds 64 | ||
- | bsav .ds 128 | + | bsav .ds 16 |
</pre> | </pre> | ||
- | Zawartość tablicy ''banks'' jest uszeregowana tak, żeby przy zajmowaniu banków w kolejności od jej początku zmniejszyć prawdopodobieństwo konfliktu ze [[SpartaDOS X]] (który to DOS przydziela sobie pamięć rozszerzenia w generalnie odwrotnej kolejności). Wadą procedury jest to, że prawdopodobieństwo tego konfliktu jest różne dla różnych typów rozszerzeń (większe, gdy bit 1 PORTB steruje pamięcią RAM, jak w przypadku rozszerzeń do 576k i 1 MB). Całkowite uniknięcie konfliktu (w tym z ramdyskami itp.) wymaga użycia procedur zarządzania pamięcią SpartaDOS X, co zostało opisane w "Przewodniku programisty SpartaDOS X", dostępnym [http://sdx.atari8.info/index.php?show=en_docs tutaj]. | + | Zawartość tablicy ''banks'' jest uszeregowana tak, żeby przy zajmowaniu banków w kolejności od jej początku zmniejszyć prawdopodobieństwo konfliktu ze [[SpartaDOS X]] (który to DOS przydziela sobie pamięć rozszerzenia w generalnie odwrotnej kolejności). Całkowite uniknięcie konfliktu (w tym z ramdyskami itp.) wymaga użycia procedur zarządzania pamięcią SpartaDOS X, co zostało opisane w "Przewodniku programisty SpartaDOS X", dostępnym [http://sdx.atari8.info/index.php?show=en_docs tutaj]. |
[[Kategoria:Programowanie Atari 8-bit]] | [[Kategoria:Programowanie Atari 8-bit]] | ||
[[Kategoria:Niezbędnik kodera]] | [[Kategoria:Niezbędnik kodera]] |
Wersja z dnia 18:56, 10 lis 2011
Wykrycie rozszerzenia i obliczenie jego rozmiaru
Poniższa procedura przeprowadza test rozmiaru rozszerzenia pamięci RAM nie niszcząc zawartości tejże pamięci. Procedura musi być ulokowana w całości poza obszarem $4000-$7FFF. Dane wyjściowe:
- liczba dodatkowych banków 16k w rejestrze Y (lub 0, gdy komputer ma tylko 64k RAM)
- wartości PORTB w tablicy banks
; etykiety ext_b = $4000 portb = $d301 ; procedura detect_ext lda portb pha ldx #$0f ;zapamiętanie bajtów ext (z 16 bloków po 64k) _p0 jsr setpb lda ext_b sta bsav,x dex bpl _p0 ldx #$0f ;wyzerowanie ich (w oddzielnej pętli, bo nie wiadomo _p1 jsr setpb ;które kombinacje bitów PORTB wybierają te same banki) lda #$00 sta ext_b dex bpl _p1 stx portb ;eliminacja pamięci podstawowej stx ext_b stx $00 ;niezbędne dla niektórych rozszerzeń do 256k ldy #$00 ;pętla zliczająca bloki 64k ldx #$0f _p2 jsr setpb lda ext_b ;jeśli ext_b jest różne od zera, blok 64k już zliczony bne _n2 dec ext_b ;w przeciwnym wypadku zaznacz jako zliczony lda portb ;wpisz wartość PORTB do tablicy dla banku 0 sta banks,y eor #%00000100 ;uzupełnij wartości dla banków 1, 2, 3 sta banks+1,y eor #%00001100 sta banks+2,y eor #%00000100 sta banks+3,y iny iny iny iny _n2 dex bpl _p2 ldx #$0f ;przywrócenie zawartości ext _p3 jsr setpb lda bsav,x sta ext_b dex bpl _p3 pla sta portb rts ; podprogramy setpb txa lsr ;zmiana kolejności bitów: %0000dcba -> %cba000d0 ror ror ror bcc _j1 ora #%00000010 _j1 ora #%00001101 ;wybór pierwszego banku 16k w bloku 64k i ustawienie bitu sterującego OS ROM sta portb rts ; zmienne banks .ds 64 bsav .ds 16
Zawartość tablicy banks jest uszeregowana tak, żeby przy zajmowaniu banków w kolejności od jej początku zmniejszyć prawdopodobieństwo konfliktu ze SpartaDOS X (który to DOS przydziela sobie pamięć rozszerzenia w generalnie odwrotnej kolejności). Całkowite uniknięcie konfliktu (w tym z ramdyskami itp.) wymaga użycia procedur zarządzania pamięcią SpartaDOS X, co zostało opisane w "Przewodniku programisty SpartaDOS X", dostępnym tutaj.