Policzenie aktywnych bitów magistrali adresowej

From Atariki

(Różnice między wersjami)
Jump to: navigation, search

Wersja z dnia 15:00, 20 lip 2017

Spis treści

Przeznaczenie i wymagania

Procedura ma za zadanie obliczyć, ile bitów adresowych 65C816 jest aktywnych ponad standardowe 16. Ta informacja daje pojęcie, ilu dodatkowych segmentów 64k pamięci liniowej można się spodziewać powyżej adresu $00FFFF.

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:

bitcnt	.ds 1
adrmsk	.ds 1
adr	.ds 3
bsav	.ds 8

Kod

adrtest stz adr
	stz adr+1
	ldx #$01
	stx adr+2

	dex
?lp0    lda [adr]
	sta bsav,x
	asl adr+2
	inx
	bcc ?lp0

	stz bitcnt
	stz adrmsk

	rol adr+2

?lp1    stz !$0000
	lda adr+2
	inc
	eor #$ff
	sta [adr]
	cmp [adr]
	bne ?nx1
	eor #$ff
	sta [adr]
	cmp [adr]
	bne ?nx1
	lda !$0000
	bne ?nx1
	lda adr+2
	tsb adrmsk
	inc bitcnt
?nx1    asl adr+2
	bcc ?lp1

	rol adr+2

?lp2    lda adr+2
	bit adrmsk
	beq ?nx2
	inc
	cmp [adr]
	beq ?nx2
	dec
	trb adrmsk
	dec bitcnt
?nx2    asl adr+2
	bcc ?lp2

	rol adr+2

	ldx #$00
?lp3    cpx bitcnt
	bcs ?end
	lda adr+2
	bit adrmsk
	beq ?nx3
	lda bsav,x
	sta [adr]
?nx3    asl adr+2
	inx
	bcc ?lp3
?end	rts

Użycie

Procedurę uruchamiamy przez jsr adrtest. Wyniki znajdują się w zmiennych zadeklarowanych jako adrmsk i bitcnt:

  • bitcnt - liczba aktywnych bitów adresowych powyżej szesnastu (czyli np. "1" oznacza, że mamy do dyspozycji 17 bitów adresu)
  • adrmsk - maska AND dla najstarszego bajtu adresów (np. $01 dla 17 bitów adresu, $03 dla 18, $0F dla 20, $FF dla 24 itd.)

Uwagi

Może być tak, że nie wszystkie kombinacje aktywnych bitów są wykorzystane. Np. Antonia 4 MB pozwala na aktywację 3 MB pamięci liniowej, aktywne są wtedy adresy od 0 do $2FFFFF. Ale liczba aktywnych bitów adresu wynosi 22 (maska $3F), jak dla 4 MB, a kombinacje najstarszych bitów adresu układają się następująco:

Bit 21Bit 20Znaczenie
00Wybór pamięci RAM
01Wybór pamięci RAM
10Wybór pamięci RAM
11Niewykorzystane
Personal tools