Obsługa rozszerzenia pamięci RAM
From Atariki
(Różnice między wersjami)
Wersja z dnia 16:15, 20 lut 2016 KMK (Dyskusja | wkład) ← Previous diff |
Wersja z dnia 16:20, 20 lut 2016 KMK (Dyskusja | wkład) Next diff → |
||
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]] | ||
- | Poniższa procedura przeprowadza test rozmiaru standardowego rozszerzenia pamięci RAM (czyli takiego, którym steruje się przez rejestr [[Rejestry PIA#PORTB|PORTB]]) 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> | ||
- | |||
- | === Uwagi === | ||
- | * 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]. | ||
- | |||
- | * Procedura bierze pod uwagę osobliwość [[Newell Industries (rozszerzenie RAM)|rozszerzenia Newell Industries]], w którym pewne kombinacje bitów rejestru PORTB wybierają ćwiartki pamięci podstawowej. Te wartości zostaną przez procedurę pominięte. | ||
- | |||
- | [[Kategoria:Programowanie Atari 8-bit]] | ||
[[Kategoria:Niezbędnik kodera]] | [[Kategoria:Niezbędnik kodera]] |