Policzenie aktywnych bitów magistrali adresowej
From Atariki
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 pamięci RAM |
0 | 1 | Wybór pamięci RAM |
1 | 0 | Wybór pamięci RAM |
1 | 1 | Niewykorzystane |