Obsługa rozszerzenia pamięci RAM: Różnice pomiędzy wersjami

Z Atariki
Przejdź do nawigacji Przejdź do wyszukiwania
mNie podano opisu zmian
przeróbka na procedurę zliczającą banki 64k
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 10 lis 2011, 20:56

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.