W takiej sytuacji, czy program dzialajacy wg. ponizszego scenariusza ma szanse dzialac pod Sparta w trybie banked?:
1. Zapamietanie aktualnie aktywnego pod Sparta banku.
SpartaDOS zawsze przed oddaniem programowi sterowania włącza bank podstawowy (PortB = $FF), więc nie zdążysz zanotować dodatkowego banku. 8)
2. Wybor banku wolnego i widzianego przez Sparte.
3. Wczytanie z urzadzenia zewn. danych bezposrednio do wybranego jak wyzej banku.
To da się zrobić, choć mogą być łatwe do obejścia problemy z różnymi wersjami SDX. Obecnie są dwie w użyciu: 4.20 (cartridge sprzedawany legalnie lub piracko w Polsce) i 4.22 (przywędrowała do nas w postaci pliku obrazu).
W Twoim przypadku różnica polega na różych adresach tablicy T_. W 4.20 jest to $0902, w 4.22 - $0904. Jej budowa jest następująca: ˇ 4 bajty - informacja o bankach w Atari 400/800, dla serii XL/XE są tam zera
ˇ 1 bajt - bank podstawowy (przeważnie $FF)
ˇ 1 bajt - 0 (nie znam znaczenia)
ˇ 1 bajt - bank, w którym Sparta trzyma swoje bebechy
ˇ 1 bajt - 0 (nie znam znaczenia)
ˇ 16 bajtów - maski przełączające banki
ˇ 1 bajt - maska bitów przełączających banki
Wyjaśnienia wymaga przedostania pozycja. Twórcy SpartaDOS-u wyszli z założenia, że ilość banków jest zawsze podzielna przez 4 (4, 8, 12, 16, 32 i 64), przy czym bity 2 i 3 PortB zawsze odpowiedziale są tylko i wyłącznie za przełączanie pamięci. Dlatego też, nie ma potrzeby sprawdzania dla jakiej ich kombiacji bank istnieje, bo istnieje dla każdej. Jeżeli istnieje %xxxx00xx, to na pewno obecne są również: %xxxx01xx, %xxxx10xx i %xxxx11xx.
Nie wszystkie bajty z tablicy masek są wykorzystywane w każdym systemie. Jeśli komputer ma 128 kB pamięci, to informacja o dodatkowych bankach zapisana jest w pierwszym bajcie, 192 kB - w dwóch, 256 kB - w trzech, 320 kB - w czterech, 576 kB - w ośmiu, 1088 kB - w szesnastu. Informację o ilości baków odczytasz spod adresu DPEEK(dosvec)+29. Jeśli SDX jest w trybie None lub Osram, to będzie tam liczba podzielna przez 4, jeśli Banked, to mniejsza o jeden, ponieważ Sparta po zajęciu dodatkowej pamięci zmniejsza jej dostępną ilość (to samo robi np. RAMDISK.SYS, sprawdź np.: RAMDISK.SYS I: 4 i zobacz ile zostanie wolnych banków). W moim przypadku (320 kB) w None i Osram jest tam 16, w Banked - 15.
Jak z tego korzystać? Najprościej ponumerować sobie banki od 0 do ilości dostępnych banków-1. Chcesz włączyć konkretny bank:
t_ = $0902 ; (lub $0904, gdy SDX 4.22)
portb = $D301
lda portb ; zapamiętujemy bieżący bank
pha
ldy newbank ; nr banku (0 - liczba dostępych banków-1)
tya ; obliczamy nr "grupy" banków
lsr
lsr
tax
tya ; obliczamy nr banku w "grupie"
and #%00000011
tay
lda t_+8,x ; "składamy" maskę bitową dla PortB
ora bnkingrp,y
eor portb
and t_+24
eor portb
sta portb
jsr doit ; robimy co swoje na dodatkowej pamięci
pla ; przywracamy pierwotny bank
sta portb
...
bnkingrp .by %00001100 %00001000 %00000100 %00000000
Kawałek "składający" maskę jest modyfikacją fragmentu procedury Sparty przełączającej banki. Nie sprawdzałem jej, ale powinna działać. :)
Kod nie jest specjalnie skomplikowany. Kombinacje eor; and; eor i wcześniejsze mają służyć obliczeniu takiej wartości dla PortB, by zmieniły się tylko bity odpowiedzialne za dodatkową pamięć. Dzięki temu, przełączanie banków nie włącza/wyłącza Basica, czy systemu. Powinno się to przydać, gdy zamierzasz odłączać rom.
Przy powrocie do Sparty przywrocenie, wraz z innymi ustawieniami, poprzedniej zawartosci $d301.
Spróbuj zapomnieć o przywróceniu PortB, to bardzo szybko sobie przypomnisz. 8)
Dodatkowo chcialbym dopytac, czy bank podstawowy jest zawsze pozostawiany wolnym do wykorzystania, czy nalezy zalozyc, ze Sparta moze tam cos waznego przechowywac?
Sparta niczego nie przechowuje w tym obszarze. Wszystko co jest jej niezbędne znajduje się poniżej MemLo.
Jeszcze pytanie odnosnie otwarcia E:. Zawartosc ICAX1 i 2 pewnie okresla tryb otwarcia ekranu, czy moglym zapytac jakie konkretnie znaczenie przypisane jest tym zmiennym?
Dokładnie. W ICAX1 określasz kierunek przepływu danych: 4 - odczyt, 8 - zapis, 12 - odczyt i zapis. Urządzenie "E:" jest połączeniem ekranu (wyjście) i klawiatury (wejście), więc zawsze ustawia się go w tryb dwukierunkowy (12 w ICAX1). ICAX2 określa tryb graficzny dla ekranu (urządzenie "S:") . Ponieważ otwarcie "E:" implikuje tryb 0, to ten rejestr można spokojnie pominąć.