Mając dokładne adresy w których są "przełączniki" banków kartridża, pomyślałem, że dzięki ich modyfikacji możliwe staje się umieszczenie dwóch (SIC!/SIC!+) lub czterech (SIC!+) wersji Laury 256kB na jednym kartridżu. Każdy z wybranych obrazów kartridża wystarczyło odpowiednio zmodyfikować wstawiając odpowiednio 2X, 3X, AX, BX. Problemem był brak możliwości wyboru aktywnego "kartridża" i ryzyko, uruchomienia gry z niewłaściwego flasha - gdy przełącznik zamieni układy miejscami.
Dodanie wyboru kartridża było dość proste, jednak wymagało wiedzy o działaniu kartridża i przemyślenia jak takie sterowanie rozwiązać przy możliwie krótkim programie. SI na początku pomógł mi zebrać potrzebną wiedzę, choć nie obyło się bez pomyłek, udało się ustalić gdzie trzeba dokonać modyfikacji, SI wymyślił że można skopiować kod do pamięci i stamtąd bezpiecznie przełączać bank. Początkowo było to rozwiązanie konieczne, jednak po kolejnych modyfikacjach wydaje mi się, że można by z niego zrezygnować. Przełączanie aktywnych kartridży najprościej było zrobić na klawiszach konsoli (wersja 4in1):
- standardowo uruchamia się "ROM1"
- START przełącza na "ROM1" (powrót)
- SELECT przełącza na "ROM2"
- START+OPTION przełącza na "ROM3"
- SELECT+OPTION przełącza na "ROM4"
- START+SELECT przełącza cyklicznie na kolejne "ROMy"
- OPTION przełącza cyklicznie na poprzednie "ROMy"
Wybór działa podczas uruchamiania kartridża, można więc włączyć Atari trzymając np. SELECT+OPTION aby wybrać "ROM4", ale też działa po naciśnięciu klawisza RESET, więc można przytrzymać pożądaną "kombinację" i nacisnąć RESET już po uruchomieniu gry.

Trudniejsze do zrealizowania było wykrywanie niewłaściwej pozycji przełącznika układów flash kartridża SIC!+. Czy wybrany jest bank zgodny z oczekiwaniem sprawdzane jest po każdym restarcie, gdy bank się nie zgadza, wyświetlany jest komunikat, a program wpada w pętlę nieskończoną.
Wyświetlanie okazało się najtrudniejsze. SI próbowało wyświetlić tekst na trzy sposoby, z czego pomysł z użyciem DL okazał się skuteczny.
Przykładowy plik Laura 4in1 dla SIC!+ udostępniam w załączniku. Zawiera on prawie wszystkie wersje Laury Revolve (brakuje mapki świątecznej), w różnych wersjach językowych dla łatwego rozróżnienia, że wybraliśmy inną wersję gry. Ponieważ emulator nie ma jeszcze możliwości przełączania układów flash SIC!+a, załączam też wersję z bankami odwróconymi, która wyświetli błąd i się zatrzyma.
Edit: Była tu pewna niekonsekwencja, bo program przełączający banki uruchamia się z pamięci RAM, a pętla nieskończona po wyświetleniu napisu znajdowała się w pamięci kartridża, wydawało się, że ponieważ program jest skopiowany 4x nie powinien się przełączyć w miejsce gdzie takiej pętli nie ma. Jednak nie wziąłem pod uwagę, że użytkownik przełączy nie ten przełącznik i wyłączy kartridż, przez co program trafi w pamięć RAM. Dlatego teraz również ta pętla jest kopiowana do RAMu.
Testowałem na Altirrze, gdzie nie ma wyłącznika i możliwości przełączania flashy.

Edit2:SI spodobał się pomysł z autodetekcją zmiany położenia przełącznika, nie było łatwo, ale i taka wersja powstała. Przetestowana póki co tylko na emulatorze z ręcznym przełączaniem z debugera, może nie działać na realnym sprzęcie.

Edit3:Do testów powstał też program SIC!+Test, który ma pokazać jak zachowuje się kartridż przy przełączaniu przełączników SIC!+a.
Edit4:Doszła zapomniana wcześniej wersja 2in1 dla SIC! (512 KB), tu przełączanie działa podobnie:
- standardowo uruchamia się "ROM1"
- START przełącza na "ROM1" (powrót)
- SELECT przełącza na "ROM2"
- START+SELECT przełączy na "ROM" przeciwny do wybranego.
Wybór działa jak wyżej - przy włączaniu i resecie.
Edit5/6:Na realnym sprzęcie wyszedł zupełnie inny problem - klawisz START uruchamiał sekwencję odczytu z magnetofonu.
Oryginalnie Laura zabezpiecza klawisz START, ale nie przy włączeniu komputera, a dopiero gdy już się uruchomi - przy naciśnięciu START i RESET / START+OPTION i RESET. Podobnie zauważyłem na innym kartridżu, a na kilku innych takiego zabezpieczenia nie ma wcale.
Żeby zablokować boot magnetofonu wystarczy w sekcji init kartridża dopisać:
...a jak to zrobić nie powiększając kodu init w miejscu gdzie jest - zastąpić RTS skokiem JMP - adres zostanie odczytany z wektora, dokładniej postaram się to opisać wkrótce...
Poprawione wersje 2in1 i 4in1 (z i bez autodetekcji) w załączniku. W wersji z autodetekcją też udało się zmieścić poprawkę, dodatkowo doszła funkcjonalność kombinacji klawiszy - patrz uzupełniony opis powyżej.
Edit7:Do wersji 4in1 z autodetekcją doszła zmiana koloru tła przy wyłączeniu kartridża i zerowanie attract mode, program zajmuje dokładnie tyle ile poprzednia wersja.
Edit8:Nurtowało mnie dlaczego wersje SIC! przy pierwszym uruchomieniu nie wyświetlają okienka tekstowego, a po każdym kolejnym resecie to okienko się pojawia.
Początkowo chciałem to okienko usunąć, co udało się poprzez przekierowanie wektora w HATABS w sekcji init programu na program który przywraca ten wektor, a także ustawienie kilku "poke" m.in. aby działał inverse.
Jednak nadal nie wiedziałem dlaczego to okienko się nie pojawia przy pierwszym uruchomienu. Okazuje się, że wynika to z domyślnego ustawienia banków w SIC!, gdzie początkowo jest udostępnione wyższe 8kB, więc system ustawia RAMTOP na $A0, a nie na $80, co powoduje że system okienko próbuje utworzyć w obszarze kartridża, który w init ma odblokowane już 16kB okno. Okienko się nie pojawia, bo system nie może go tam zapisać. Po resecie gdy już 16kB jest odblokowane RAMTOP jest ustawiany na $80, więc okienko jest tworzone prawidłowo. Także okazuje się, że czany ekran jest efektem ubocznym nie ustawienia RAMTOP!
Przy okazji sprawdziłem w oficjalnej wersji Laury na SIC!, którą jest wersja RNG (i prawdopodobnie 3 edycja kartridżowa, której nie posiadam) czy RAMTOP jest ustawiony prawidłowo i niestety nie, i to jest przyczyną czarnego ekranu, a nie celowe jego wygaszenie.
Sprawdziłem też, że oficjalne menu z SIC! generatora, to okienko wyświetla, ale robi to przy RAMTOP = $A0, a potem przełącza $D500, RAMTOP zostaje bez zmian, później jest ustawiane nawet na $C0. Reset w zależności od $D500 ustawia RAMTOP na różne wartości ($C0,$A0,$80), ekran miga.
Uwaga:Teoretycznie można w init ustawiać RAMTOP źle na $A0, co w prosty sposób zapobiegnie pojawianiu się okna tekstowego [nie usunie "śmieci", które zostaną na ułamek sekundy podświetlone], spowoduje to jednak, że system będzie próbował zapisywać dane w obszarze "ROM" kartridża, co jak czytałem jest niepożądane gdy używamy obrazu kartridża z A8PicoCart (tej wielkości kartridża A8PicoCart nie udźwignie, ale tak samo można zrobić [celowo lub niechcący] przy mniejszym, który A8PicoCart obsłuży).
Stąd nowe wersje 4in1, mają RAMTOP ustawiony na $80 i wyświetlają okienko przy każdym starcie (i restarcie)!
(Wyłączenie okienka tekstowego sposobem opisanym nieco wyżej [przekierowanie wektora] z uwagi na brak miejsca wymagałoby przeniesienia bootselectora, więc z tego zrezygnowałem).
Edit9:W załączniku poprawiona wersja 2in1, ale także wersja 2in1 z czarnym ekranem. Zablokowanie okienka tekstowego zmieściłem w 40 bajtach, czyli w wersji 4in1 bez autodetekcji też dałoby się to zmieścić bez kombinowania.
Czy tak jest poprawnie i czy nie trzeba ustawić czegoś więcej nie mam pewności, jednak w tym przypadku to działa. SI oryginalnie rozwiązał to nieco inaczej - zmodyfikowany wpis w HATABS wskazywał trwale na "ROM" kartridża, gdzie SI umieścił tablicę adresów, "ROM" jednak mógł być w każdej chwili przełączony, więc w mojej wersji jest tak jak opisałem wyżej - po skoku pod zmodyfikowany adres wstawiam w HATABS adres odpowiadający oryginalnemu (taki jaki zastajemy tam oryginalnie - sprawdzone na kilku wersjach os).
SI wypisał jeszcze kilka adresów, które uznał za konieczne do ustawienia, jednak większość z nich ma domyślnie wartość 0 (za wyjątkiem jednego, mało istotnego), więc ustawianie ich pominąłem.
Zapis do RAM w SIC!+ Teście, nadal nie został poprawiony, nie wiem czy ten błąd jest w wersji opublikowanej, ale poprawkę postaram się przygotować.
Obrazy kartridża można wgrać na SIC!+ analogicznie jak opisałem w powyższym poście, najnowszym flasherem dla SIC!+.
PS. Oczywiście da się zmieścić więcej, gdyby wspólne elementy każdej z wersji umieścić tylko raz, ale to wymaga dużo więcej pracy, przykładem jest wersja RNG 512 kB, gdzie jest kilka wersji gry i jeszcze sporo miejsca zostało.