Obliczenie rozmiaru pamięci liniowej

From Atariki

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

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.

Personal tools