Policzenie aktywnych bitów magistrali adresowej
From Atariki
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 21 | Bit 20 | Znaczenie |
0 | 0 | Wybór adresów $000000-$0FFFFF (pamięć RAM) |
0 | 1 | Wybór adresów $100000-$1FFFFF (pamięć RAM) |
1 | 0 | Wybór adresów $200000-$2FFFFF (pamięć RAM) |
1 | 1 | Wybór adresów $300000-$3FFFFF (pustka) |