Obliczenie rozmiaru pamięci liniowej
From Atariki
(Różnice między wersjami)
| Wersja z dnia 15:15, 21 lip 2017 KMK (Dyskusja | wkład) (→Kod) ← Previous diff |
Aktualna wersja KMK (Dyskusja | wkład) (→Szybkie obliczenie rozmiaru pamięci - linkowanie) |
||
| Linia 2: | Linia 2: | ||
| Procedura sprawdza liczbę segmentów 64k RAM dostępnych powyżej adresu $00FFFF. Sprawdzany jest tylko pierwszy bajt każdego z nich, zakłada się, że pojedynczy segment składa się poza tym wyłącznie z komórek pamięci RAM. | Procedura sprawdza liczbę segmentów 64k RAM dostępnych powyżej adresu $00FFFF. Sprawdzany jest tylko pierwszy bajt każdego z nich, zakłada się, że pojedynczy segment składa się poza tym wyłącznie z komórek pamięci RAM. | ||
| - | Procedura działa tak samo w obu trybach pracy 65C816 (natywnym i emulacji 6502). Jedyny wymóg to uruchomienie w segmencie 0 (czyli w pierwszych 64k przestrzeni adresowej). | + | Procedura działa tak samo w obu trybach pracy [[65C816]] (natywnym i emulacji [[6502]]). Jedyny wymóg to uruchomienie w segmencie 0 (czyli w pierwszych 64k przestrzeni adresowej). |
| === Zmienne na stronie zerowej === | === Zmienne na stronie zerowej === | ||
Aktualna wersja
Spis treści |
[Edytuj]
Szybkie obliczenie rozmiaru pamięci
Procedura sprawdza liczbę segmentów 64k RAM dostępnych powyżej adresu $00FFFF. Sprawdzany jest tylko pierwszy bajt każdego z nich, zakłada się, że pojedynczy segment składa się poza tym wyłącznie z komórek pamięci RAM.
Procedura działa tak samo w obu trybach pracy 65C816 (natywnym i emulacji 6502). Jedyny wymóg to uruchomienie w segmencie 0 (czyli w pierwszych 64k przestrzeni adresowej).
[Edytuj]
Zmienne na stronie zerowej
Wstępnie deklarujemy na stronie zerowej następujące zmienne:
adr .ds 3 bfirst .ds 1 bcnt .ds 1
[Edytuj]
Kod
ramsize stz adr
stz adr+1
lda #$01
sta adr+2
stz bfirst
stz bcnt
?lp0 stz !$0000
lda [adr]
eor #$ff
sta [adr]
cmp [adr]
bne ?nx
ldx !$0000
bne ?nx
eor #$ff
sta [adr]
bra ?fnd
?nx inc adr+2
bne ?lp0
bra ?abt
?fnd lda adr+2
sta bfirst
inc adr+2
inc bcnt
?lp1 stz !$0000
lda [adr]
eor #$ff
sta [adr]
cmp [adr]
bne ?abt
ldx !$0000
bne ?abt
eor #$ff
sta [adr]
inc bcnt
inc adr+2
bne ?lp1
dec bcnt
?abt rts
[Edytuj]
Użycie
Procedurę uruchamiamy przez jsr ramsize. Wyniki:
- bfirst - najstarszy bajt adresu pierwszego segmentu 64k powyżej segmentu 0 (np. $01 = pamięć liniowa zaczyna się od adresu $010000)
- bcnt - liczba dodatkowych segmentów 64k ponad segment 0 (np. 47 = 4 MB)
Zmienna bcnt zawiera liczbę dodatkowych segmentów ponad segment 0, czyli liczbę wszystkich segmentów zmniejszoną o 1.
