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.
