Intro od środka
część 1 część 2 część 3

Tomek "Scrap" Michniewicz
tomko1@wp.pl

W poprzednich odcinkach mówiliśmy o tym, jakich zmian można dokonać w przykładowym intrze. Dziś o tym,  jak zapisać intro w formacie *.d64 (inaczej mówiąc - na dyskietce Commodore) - a w związku z tym o programach w Basicu i asemblerze, relokatorze i kilku innych rzeczach...

1. Niezbędne podstawy, czyli dla nie wtajemniczonych...
Wyobraź sobie, że nie masz przed sobą peceta. Jest tylko Commodore i podłączona do niego stacja dysków z czystą dyskietką. W pamięci znajduje się nasze zmienione intro. I to jest zadanie na dziś - zapisać intro na dyskietce w ten sposób, aby po załadowaniu samo się uruchamiało. Dygresja: oczywiście nadal korzystać będziemy z emulatora. Najpierw zrobimy sobie czystą dyskietkę. Wybieramy z menu File\Attach disk image\Drive 8. Wpisujemy nową nazwę pliku i wciskamy przycisk Create image, a następnie Attach. Na dysku twardym PC powstaje nowy plik z rozszerzeniem *.d64, ale emulator widzi to tak, jakby do stacji została włożona czysta dyskietka. BTW, z tego pliku (obrazu) można zrobić dyskietkę, która będzie czytana przez prawdziwe (nie emulowane) Commodore.

2. Od czego zacząć?
Jak sprawić, żeby intro uruchamiało się po załadowaniu? Zobaczmy, jak robią to inni. :) Po załadowaniu dowolnej gry w Vice przez File\Autostart disk\tape image jest ona uruchamiana. Jak to się dzieje? Już wyjaśniam. Gry to w większości programy pisane w asemblerze. Uruchamiane są jednak przez rozkaz języka Basic. Zakładam, że masz jakieś pojęcie o Basicu. Każda gra zawiera więc linię języka Basic, powodującą uruchomienie programu w asemblerze, np.:

1 SYS 2064

Rozkaz Basica SYS to nic innego jak polecenie g [adres] monitora. Różnica jest taka, że adres startu w komendzie SYS musi być podany jako liczba dziesiętna, a nie jak przy g - szesnastkowa. Czyli powyższa przykładowa linia to rozkaz startu programu w asemblerze od adresu $810 = 2064 dziesiętnie. Aby nasze intro automatycznie się uruchamiało, musimy dodać na jego początku taką linię z odpowiednim adresem startowym w formie liczby dziesiętnej. Skoro intro odpalało się przez g 2c78, to linia ta powinna wyglądać tak:

1 SYS 11384

Wskazówka: użyj kalkulatora do zamiany liczb szesnastkowych na dziesiętne. Pomysł jest więc następujący - odpalić intro, zresetować (soft reset - Alt-R), wpisać powyższą linię, sprawdzić komendą LIST i uruchomić intro przez RUN. Proste? Właśnie, to byłoby zbyt proste. Wprawdzie intro się odpala (tak, jak zakładaliśmy), ale tekst scrolla wygląda trochę dziwnie... :-( Co się stało? Wprowadzony program Basica (w tym przypadku tylko jedna linia) też musi znaleźć się gdzieś w pamięci. W C64 jest tak, że kolejnym liniom przydzielana jest pamięć począwszy od $800 a tam, jak pamiętasz z pierwszego odcinka znajdują się informacje dotyczące czcionki w naszym intrze. I dlatego mamy krzaki.

3. Doktorze, czy mamy na to lekarstwo? :)
Oczywiście. Pomysł jest dość prosty. Cały kod intra przesuwamy w pamięci z $800 na $850 Uwaga! teraz nie będzie on działał prawidłowo, chociażby dlatego, że rozkazy JMP będą odnosić się do innych fragmentów programu; intro, aby działać MUSI ZNAJDOWAĆ SIĘ NA $800 ! Ale kod intra przesuwamy tylko tymczasowo. Pamięć od $800 do $850 mamy teraz wolną, więc ze spokojem może tam się znaleźć linia w języku Basic. Tylko teraz nie będzie ona uruchamiała samego intra, bo to musi zostać najpierw przeniesione do odpowiedniego obszaru pamięci. Tu potrzebny jest relokator - program asemblerowy, który przeniesie intro z $850 z  powrotem na $800 i je uruchomi. Powtórzmy - po załadowaniu jest uruchamiany program Basica (jedna linia z komendą SYS), który następnie uruchamia relokator, ten przenosi kod intra z $850 na $800 i uruchamia intro (rozkazem JMP $2c78 - bo taki jest adres startowy).

4. Relokator.
Oto kod relokatora (zmieniony na nasze potrzeby) zaczerpnięty z artykułu "Zostań crackerem" Tomasza 'TSD' Dzierkowskiego - jest dostępny na C64 Power. Najpierw przesuniemy kod intra z przestrzeni pamięci od $800 do $3600 na od $850 do #3650. Nic prostszego - korzystamy z rozkazu monitora move 800 3600 3650 - który właśnie do tego służy! Kod relokatora wpisujemy przy wykorzystaniu monitora wbudowanego w Vice. Gdzie umieścimy relokator? Proponuję od razu za intrem czyli od $3650. Tam na pewno nie ma już użytecznego kodu. Korzystamy ze znanego już polecenia monitora a 3650, przepisujemy kod relokatora, na końcu wciskając dwa razy enter. Teraz linia Basica, uruchamiająca nasze intro będzie miała postać:

1. SYS 13904

(bo $3650 = 13904 dziesiętnie - sprawdź!)

Tutaj pełen kod relokatora (po średnikach znajdują się komentarze - ich nie przepisuj! ). Pamięć jest przepisywana w blokach po 256 bajtów.

SEI 
LDA #$34 ;włącz tylko pamięć ram 
STA $01 

LDX #$2E ; ilość bloków do przepisania (1 blok = 256 bajtów - czyli $FF) 
         ; $3600 - $800 = $2E00 - wielkość intra 
        ; $2E00 / $FF = $2E - ilość bloków do przepisania 

LDA #$01 ; adres do którego należy przepisać - $801 
STA $FB 
LDA #$08 
STA $FC 

LDA #$51 ; adres skąd należy przepisać - $851 
STA $FD 
LDA #$08 
STA $FE 

LDY #$00 ; pętla realizująca przenoszenie (relokację) intra 
LDA ($FD),Y 
STA ($FB),Y 
INY 
BNE $3669 
INC $FC 
INC $FE 
DEX 
BNE $3669 ; koniec pętli 

LDA #$37 
STA $01 
JSR $E518 
JSR $FDA3 
JSR $FD15 
JSR $E3BF 
CLI 
LDA #$FF 
STA $0800 ; aby wszystko działało jak należy :) 

JMP $2C78 ; uruchomienie intra

5. To jak, zapiszemy w końcu to intro? :)
Już, już.. Można to zrobić na kilka sposobów, mój jest taki: wykorzystamy cartridge Action Replay 7. Mając wszystko przygotowane (intro + relokator + Basic) wybieramy z menu File\Attach cartridge image\CRT image i zaznaczamy plik z Action Replay 7. Alt-Z powoduje przejście do menu cartridge'a. Tam wciskamy M (monitor), który udostępnia takie polecenie jak: s"nazwa",8,0800,3700 - powoduje to zapisanie na dyskietce (numer urządzenia 8) w pliku o podanej nazwie zawartości pamięci od $800 do $3700. To wystarczy, żeby zgrać nasze intro. Aha, warto ustawić wcześniej z menu Options\ True drive emulation.

Teraz wystarczy sprawdzić naszą wirtualną dyskietkę, przez Autostart disk\tape image. Jeśli wszystko poszło dobrze, to intro powinno po załadowaniu samo wystartować. Jeśli nie - spróbuj jeszcze raz, pokombinuj. Musi się udać - na dowód załączam zmienione przeze mnie intro. I to właściwie wszystko na temat zmian w intrze do gry 1st Division Manager.

6. Download
Intro - tutaj.
Action Replay 7 - tutaj.

 © 1999-2020 Wszystkie prawa zastrzeżone
 Webmaster: Mariusz "Flooder" Młynek