Jest poprawka!
Szukając w tysiąc-dziewięćset-zapomnianym roku LDIR /RET w ROMie, znalazałem tylko jedno, więc teraz byłem pełen obaw czy uda się znaleźć prostą poprawkę. Na wszelki wypadek jednak przeszukałem ROM ponownie, a potem poszukałem samego LDIR. Znalazłem sekwencję LDIR / POP HL / RET, co generalnie dałoby się wykorzystać, ale nie w tym konkretnie przypadku. Na szczęście przewinąłem w górę i odkryłem przed nią PUSH DE - stos zbilansowany, a zawartość HL jest nieistotna za LDIR.
Czyli sukces! Adres to 6646.
Skompresowane gry występują w dwóch wersjach: początek 24500 - to wynik działania wersji taśmowej lub dyskowej na FDD3000, oraz początek 25000 - to wersja dyskowa na stację OPUS Discovery - wymagała więcej miejsca na BASIC, bo przed nim tworzyła bufor na odczyt danych z dysku.
Mogą się też trochę różnić algorytmem - starsze są prostsze, ale w kontekście poprawki to nieistotne.
Np. Dobranocki są skompresowane jeszcze najstarszą, prostą, OPUSową wersją (od 25000).
Przy okazji myślenia o kompresorze, przyszło mi do głowy, że nie zadbałem o UDG pisząc go i kiedy pliki ładowane nie zajmują całej pamięci - UDG są niepotrzebnie kompresowane wydłużając plik wynikowy. Więc zajrzałem, a tu niespodzianka: kompresor jednak zeruje pamięć przed załadowaniem plików. W sumie to logiczne bo przecież można kompresować kilka gier po kolei, więc poprzednią zawartość trzeba usunąć, ale oczywiście nie pamiętałem szczegółów... Już drugi raz sam siebie zaskakuję oglądając stare programy
POPRAWKA 1 dla gier z File Compressorem.Poprawka polega na zmianie skoku JP 13251 na JP 6646.
Adres ten znajduje się w bajtach 22 i 23 skompresowanego pliku.
Jak zawsze warto zrobić backup przed zmianami, żeby móc wrócić w przypadku błędu.
Sposób 1: ZX Blockeditor na pececie
1. Wczytać grę do ZX Blockeditor
2. Odnaleźć skompresowany blok - czyli z adresem startowym 25000 lub 24500
3. Zaznaczyć STANDARD DATABLOCK (za nagłówkiem)
4. W menu EDIT kliknąć MODIFY DATABLOCK (lub kliknąć zaznaczony dwukrotnie)
5. Jeśli jest ASCII lub HEX - zmienić sposób wyświetlania na DEC
6. Upewnić się że od adresu 21 (wiersz "16" kolumna "+5") jest sekwencja 195, 195, 51
7. W adresie 22 zmienić 195 na 246, a w 23 zmienić 51 na 25
8. Zatwierdzić OK
9. W menu File zapisać SAVE, lub po prostu zamknąć ZX Blockeditor, wtedy sam zapyta o zapisanie.
Sposób 2: edycja loadera (na realu lub w emulatorze)
Wgrać przez MERGE (lub LOAD i przerwać dalsze ładowanie).
Dopisać tuż przed wywołaniem dekompresji, (np. dla Dobranocek w linii 25):
POKE adr+22,246: POKE adr+23,25
gdzie adr to adres dekompresji wpisany RANDOMIZE USR adr lub DRAW USR adr, itp. (dla Dobranocek wpisać 25022 i 25023).
Zgrać loader.
Sposób 3: COPY COPY (na realu lub w emulatorze)
Skopiować bloki poprzedzające blok skompresowany.
Wpisać LOAD AT 24983 i wgrać blok (razem z nagłówkiem, dlatego 17 bajtów niżej).
Upewnić się wpisując LIST 25021 że od adresu 25021 jest sekwencja 195, 195, 51
Wpisać POKE 25022,246 i POKE 25023,25
Zgrać blok SAVE [enter] i ewentualnie następne.
UWAGA 1:Sam File Compressor też nie będzie działał na The Spectrum, bo ma w sobie ten sam skok do ROMu

Ale zakładam, że nikt nie będzie go chciał używać
UWAGA 2:Nie wszystkie gry zaczynające się od 24500 są skompresowane moim File Compressorem, więc nie wszystkie wymagają poprawki. Nawet jak są, to znalazłem teraz dema ze zmodyfikowanym dekompresorem (nie algorytm - tylko inaczej obsługiwane), które też nie wymagają poprawki, bo nie mają feralnego skoku. Widziałem też pliki, nie wiedzieć czemu, zaczynające się od 26000, wymagające poprawki. W jednym ten skok był dwukrotnie!
UWAGA 3:Niektóre moje wersje dyskowe mimo poprawki dalej nie będą działać.
Z tego samego powodu. Które? Te które są przerabiane z wersji multifejsowych i ładują ostatni blok w ekran, np. Decathlon. Wspominałem, że Bill Gilbert też polubił JP 13251? Więc gry Billa też...
Ale o tym w następnym odcinku
