Obsługa rozszerzenia pamięci RAM
From Atariki
(Różnice między wersjami)
Wersja z dnia 17:15, 6 wrz 2015 KMK (Dyskusja | wkład) ← 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 ;cokolwiek z zakresu $4000-$7FFF | ||
- | portb = $d301 | ||
- | |||
- | ; procedura | ||
- | detect_ext | ||
- | lda portb | ||
- | pha | ||
- | |||
- | lda #$ff | ||
- | sta portb | ||
- | |||
- | lda ext_b | ||
- | 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 | ||
- | |||
- | stx portb ;X=$FF | ||
- | |||
- | pla | ||
- | sta ext_b | ||
- | |||
- | 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]] |