Obliczenie rozmiaru pamięci liniowej
From Atariki
(Różnice między wersjami)
Wersja z dnia 13:41, 21 lip 2017 KMK (Dyskusja | wkład) ← Previous diff |
Wersja z dnia 15:15, 21 lip 2017 KMK (Dyskusja | wkład) (→Kod) Next diff → |
||
Linia 62: | Linia 62: | ||
inc adr+2 | inc adr+2 | ||
bne ?lp1 | bne ?lp1 | ||
+ | |||
+ | dec bcnt | ||
?abt rts | ?abt rts |
Wersja z dnia 15:15, 21 lip 2017
Spis treści |
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).
Zmienne na stronie zerowej
Wstępnie deklarujemy na stronie zerowej następujące zmienne:
adr .ds 3 bfirst .ds 1 bcnt .ds 1
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
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.