Obsługa rozszerzenia pamięci RAM
From Atariki
| Wersja z dnia 18:10, 9 lis 2011 KMK (Dyskusja | wkład) ← Previous diff |
Wersja z dnia 18:14, 9 lis 2011 KMK (Dyskusja | wkład) Next diff → |
||
| Linia 5: | Linia 5: | ||
| * liczba dodatkowych banków 16k w rejestrze Y (lub 0, gdy komputer ma tylko 64k RAM) | * liczba dodatkowych banków 16k w rejestrze Y (lub 0, gdy komputer ma tylko 64k RAM) | ||
| * wartości PORTB w tablicy ''banks'' | * wartości PORTB w tablicy ''banks'' | ||
| - | |||
| - | 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). | ||
| <pre> | <pre> | ||
| Linia 70: | Linia 68: | ||
| bsav .ds 128 | bsav .ds 128 | ||
| </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]. | ||
| [[Kategoria:Programowanie Atari 8-bit]] | [[Kategoria:Programowanie Atari 8-bit]] | ||
| [[Kategoria:Niezbędnik kodera]] | [[Kategoria:Niezbędnik kodera]] | ||
Wersja z dnia 18:14, 9 lis 2011
Wykrycie rozszerzenia i obliczenie jego rozmiaru
Poniższa procedura przeprowadza 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 #$7f ;zapamietanie bajtow ext
_p0 jsr setpb
lda ext_b
sta bsav,x
dex
bpl _p0
ldx #$7f ;wyzerowanie ich (w oddzielnej petli, bo nie wiadomo
_p1 jsr setpb ;ktore kombinacje bitow PORTB wybieraja te same banki)
lda #$00
sta ext_b
dex
bpl _p1
stx portb ;eliminacja pamieci podstawowej
stx ext_b
stx $00 ;niezbedne dla niektorych rozszerzen do 256k
ldy #$00 ;petla zliczajaca banki
ldx #$7f
_p2 jsr setpb
lda ext_b
bne _n2
dec ext_b
lda portb
sta banks,y
iny
_n2 dex
bpl _p2
ldx #$7f ;przywrocenie zawartosci ext
_p3 jsr setpb
lda bsav,x
sta ext_b
dex
bpl _p3
pla
sta portb
rts
; podprogramy
setpb txa
sec
rol
sta portb
rts
; zmienne
banks .ds 64
bsav .ds 128
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 tutaj.
