Obsługa rozszerzenia pamięci RAM

From Atariki

(Różnice między wersjami)
Jump to: navigation, search
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.

Personal tools