|
|
| (Nie pokazano 4 pośrednich wersji utworzonych przez tego samego użytkownika) |
| Linia 1: |
Linia 1: |
| == Wykrycie rozszerzenia i obliczenie jego rozmiaru ==
| | * [[Obsługa standardowego rozszerzenia pamięci RAM]] |
| | * [[Obsługa rozszerzenia pamięci RAM typu Axlon]] |
| | * [[Obsługa pamięci liniowej 65C816]] |
|
| |
|
| 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''
| |
|
| |
| <pre>
| |
| ; etykiety
| |
| ext_b = $4000 ;cokolwiek z zakresu $4000-$7FFF
| |
| portb = $d301
| |
|
| |
| ; procedura
| |
| detect_ext
| |
| lda portb
| |
| pha
| |
|
| |
| lda #$ff
| |
| sta portb
| |
|
| |
| lda ext_b
| |
| 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 ext_b ;sprawdz, czy sie zaznaczyl; jesli nie -> cos nie tak ze sprzetem
| |
| bpl _n2
| |
|
| |
| 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
| |
|
| |
| stx portb ;X=$FF
| |
|
| |
| pla
| |
| sta ext_b
| |
|
| |
| pla
| |
| sta portb
| |
| rts
| |
|
| |
| ; podprogramy
| |
| setpb txa ;zmiana kolejności bitów: %0000dcba -> %cba000d0
| |
| lsr
| |
| ror
| |
| ror
| |
| ror
| |
| adc #$01 ;ustawienie bitu nr 1 w zaleznosci od stanu C
| |
| ora #$01 ;ustawienie bitu sterującego OS ROM na wartosc domyslna
| |
| sta portb
| |
| rts
| |
|
| |
| ; zmienne
| |
| banks .ds 64
| |
| bsav .ds 16
| |
| </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). 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:Niezbędnik kodera]] | | [[Kategoria:Niezbędnik kodera]] |
| | [[Kategoria:Rozszerzenia RAM Atari 8-bit]] |