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
KMK (Dyskusja | wkład)

← Previous diff
Wersja z dnia 15:57, 20 lip 2017
KMK (Dyskusja | wkład)
(Uwagi)
Next diff →
Linia 96: Linia 96:
<table border="1" cellpadding="5"> <table border="1" cellpadding="5">
<tr><td><b>Bit 21</b></td><td><b>Bit 20</b></td><td><b>Znaczenie</b></td></tr> <tr><td><b>Bit 21</b></td><td><b>Bit 20</b></td><td><b>Znaczenie</b></td></tr>
-<tr><td>0</td><td>0</td><td>Wybór pamięci RAM</td></tr>+<tr><td>0</td><td>0</td><td>Wybór adresów $000000-$0FFFFF (pamięć RAM)</td></tr>
-<tr><td>0</td><td>1</td><td>Wybór pamięci RAM</td></tr>+<tr><td>0</td><td>1</td><td>Wybór adresów $100000-$1FFFFF (pamięć RAM)</td></tr>
-<tr><td>1</td><td>0</td><td>Wybór pamięci RAM</td></tr>+<tr><td>1</td><td>0</td><td>Wybór adresów $200000-$2FFFFF (pamięć RAM)</td></tr>
-<tr><td>1</td><td>1</td><td>Niewykorzystane</td></tr>+<tr><td>1</td><td>1</td><td>Wybór adresów $300000-$3FFFFF (pustka)</td></tr>
</table> </table>
[[Kategoria:Programowanie Atari 8-bit]] [[Kategoria:Programowanie Atari 8-bit]]
[[Kategoria:Akceleratory]] [[Kategoria:Akceleratory]]

Wersja z dnia 15:57, 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 adresów $000000-$0FFFFF (pamięć RAM)
01Wybór adresów $100000-$1FFFFF (pamięć RAM)
10Wybór adresów $200000-$2FFFFF (pamięć RAM)
11Wybór adresów $300000-$3FFFFF (pustka)
Personal tools