Obsługa rozszerzenia pamięci RAM

From Atariki

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

Personal tools