Obsługa rozszerzenia pamięci RAM
From Atariki
(Różnice między wersjami)
												
			
			| Wersja z dnia 22:14, 18 lip 2013 KMK (Dyskusja | wkład) (→Wykrycie rozszerzenia i obliczenie jego rozmiaru - zm. kolejnosci z FB73 na 37BF, plus drobiazgi) ← Previous diff | Aktualna wersja KMK (Dyskusja | wkład) | ||
| Linia 1: | Linia 1: | ||
| - | == Wykrycie rozszerzenia i obliczenie jego rozmiaru == | + | * [[Obsługa standardowego rozszerzenia pamięci RAM]] | 
| + | * [[Obsługa rozszerzenia pamięci RAM typu Axlon]] | ||
| + | * [[Obsługa pamięci liniowej 65C816]] | ||
| - | 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'' | ||
| - | |||
| - | <pre> | ||
| - | ; 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 ext_b ;sprawdz, czy sie zaznaczyl; jesli nie -> cos nie tak ze sprzetem | ||
| - | bpl _n2 | ||
| - | |||
| - | 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 ;zmiana kolejności bitów: %0000dcba -> %cba000d0 | ||
| - | lsr | ||
| - | ror | ||
| - | ror | ||
| - | ror | ||
| - | adc #$01 ;ustawienie bitu nr 1 w zaleznosci od stanu C | ||
| - | ora #$01 ;ustawienie bitu sterującego OS ROM na wartosc domyslna | ||
| - | sta portb | ||
| - | rts | ||
| - | |||
| - | ; zmienne | ||
| - | banks .ds 64 | ||
| - | bsav .ds 16 | ||
| - | </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). 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:Niezbędnik kodera]] | [[Kategoria:Niezbędnik kodera]] | ||
| + | [[Kategoria:Rozszerzenia RAM Atari 8-bit]] | ||
