Część trzecia, czyli dwa słowa o grafice i pliku DOSowym.
Miło mi, że na forum pojawiaja się komentarze i poprawki mojego kodu. Zgodnie z ustaleniami dziś postaram się pokazać jak stworzyć plik uruchamiany spod DOSu (lub dowolnego loadera). Ale ponieważ ma to być gra, w dodatku z grafiką - zacznijmy od niej.
Całą gra ma być w trybie graficznym (bo mi tak wygodnie z pewnych względów, ma zawierać grafikę, itp., itd.). Niestety, nie doczekałem się pomocy grafika, więc muszę sam coś zaimprowizować. Całość robimy w trybie jednokolorowym (dla niektórych: dwukolorowy, barwa i odcień). Tak działa nasze Atari (o ile nie korzystamy z artefaktów, ale te to na CRT i głównie w NTSC). Lubię, jak gra ma jakiś tytuł. Postanowiłęm, że do dzisiejszej części dorobię taką namiastkę. Ponieważ w tym trybie standardowo mamy rozdzielczość 320x192 punkty, proporcje piksela 1:1 (co jest bardzo ważne), bardzo wygodnym narzędziem są wszelkiego rodzaju edytory graficzne na PC (oczywiście można grafikę zrobić na Atari, Macu czy nawet Atari ST czy Amidze), w moim przypadku z możliwością zapisu/eksportu w formacie GIF (bo z takich narzędzi korzystam na Atari i w tym tutorialu). Obsługi programów nie będę tutj uczył - napiszę tylko, że w naszym przypadku korzystam z darmowego GIMPa.
Dobrze, stworzyłem sobie grafikę w odpowiednim formacie i rozdzielczości - ponieważ mam zamiar tytuł wyświetlać także podczas gry, założyłem, aby grafika nie była zbyt duża, powiedzmy 320x40 pikseli, oczywiście w jednym kolorze. Grę nazwałem oryginalnie "Tutorialowa gra paragrafowa" i zmodziłem z tego grafikę o zadanych rozmiarach, po czym przekonwertowałem ją na grafikę jednobitową i zapisałem w formacie GIF. Całość umieściłem na dyskietce roboczej (stworzyłem na potrzeby tutorialu kolejną dyskietkę - grafika.atr - osobiście preferuję większe obrazy, ale poradzimy sobie). Zakładając, że ktoś korzysta z pojedynczej stacji dyskietek postaram się przeprowadzić teraz drogich czytelników przez proces konwersji, przy czym zaczniemy od liczenia: 320px w szerokości daje nam w tym trybie graficznym 40 bajtów, mamy 40 linii, czyli 40x40=1600 bajtów - tyle docelowo zajmie nasza grafika.
Zabieramy się za konwersję. Ponieważ tu grafika zajmuje całą szerokość ekranu do testów napiszemy sobie prosty programik w TBXL do wycięcia bloku, ale najpierw trzeba wszystko przekonwertować. Wczytujemy dyskietkę roboczy_tools.atr i program do konwersji (jv.com). Po pojawieniu menu programu za pomocą klawisza "M" wybieramy tryb Gr.8 BW - jest to nasz docelowy tryb graficzny (nawiasem mówiąc - proponuję się w wolnej chwili pobawić tym programem). Podmieniamy w stacji naszą dyskietkę na obraz grafika.atr. Teraz możemy ją wylistować (D), można podać maskę lub wcisnąć RETURN (bo całość mamy w stacji D:). Upewniamy się, że jest tam nasz GIF - wybieramy "L", następnie *.gif (mamy ten jeden póki co, więc po co się męczyć z nazwą?), możemy zmienić sposób dzielenia szerokości i wysokości (tu bez zmian) i wczytujemy (Return). Po wczytaniu widzimy nasz obraz, naciskamy klawisz START i całość zapisujemy - dla grafik w 8-mym trybie graficznym ja zwyczajowo daję rozszerzenie .8, ale może być dowolne, więc naciskam "S" i wpisuję "TYTUL.8" (wpisujcie bez apostrofów). Zapisał nam się plik w 8-mym trybie graficznym. Teraz podmieniamy dyskietkę na taką z dosem, "Z" i jesteśmy w DOSie.
Proponuję wczytać TBXL. Podmieniamy dyskietkę na ą z grafiką i teraz proponuję Wam chwilę przerwy od gry. Napiszemy sobie krótki programik do naszej grafiki. Przepiszmy uważnie ten kod:
10 OPEN #1,4,0,"D:TYTUL.8":BGET #1,$60
00,7680:CLOSE
11 GRAPHICS 24:POKE 710,0
12 MOVE $6000,DPEEK(88),1600
13 GET KEY
14 OPEN #1,8,0,"D:TYTUL.DAT":BPUT #1,$
6000,1600:CLOSE
Proponuję zapisać to sobie, na przykład jako "TESTGR.TB". Uruchamiamu (RUN) - na ekranie po chwili ukaże się nasz tytuł. Robimy DIR i co widzimy - plik TYTUL.DAT, który jest sporo krótszy od TYTUL.8 - ma dokłądnie 1600 bajtów.
Co dokłądnie robi nasz mini program? Otwieramy kanał pierwszy do odczytu, wczytujemy pod adres $6000 7680 bajtów, uruchamiamy ósmy tryb graficzny bez okna tekstowego (8+16=24), przepisujemy pierwsze 1600 bajtów na ekran (linia 12), po naciśnięciu klawisza otwieramy pierwszy kanał do zapisu i zapisujemy dane na dyskietkę. Pamiętamy o każdorazowym zamykaniuu otwartych kanałów - dobra praktyka!
Teraz tak - zaraz kilka osób się przyczepi, że przecież mogłem otworzyć dwa kamnały od razu (jeden odczyt, drugi zapis) i polecieć całość za jednym zamachem (pierwsze 1600 bajtów pliku), mogłem wczytać od razu na ekran (zamiast $6000 od razu dpeek(88)) - itp. Nie zrobiłęm tego, aby pokazać mechanizm działania i pewien sposób trzymania danych w pamięci komputera.
Czas określić miejsce w pamięci, gdzie będziemy trzymać nasz tytuł. Proponuję tuż pod fontami, pamiętamy, że one siedzą od adresu $9C00, wpiszmy w TBXL:
Wyskoczy nam wynik: 95C0, czyli naszym docelowym adresem będzie $95C0. Kto chce, może skorzystać z metody Open... itd, ale jak widzicie - pliki nam się mnożą. Proponuję wczytać teraz Super Packera, i po kolei:
1. L (czyli load) i podajemy DANE.DAT (nasze fonty, przypominam)
2. F (wczytanie danych niebinarnych) i podajemy TYTUL.DAT, podajemy adres 95C0, sprawdzamy, czy jest przed fontami (jest - 9BFF)
3. S (zapisujemy) i podajemy DANE.DAT - nadpisujemy nasz plik z danymi
4. Q - wychodzimy do DOSu
Uwaga! Pamiętamy, aby w stacji były odpowiednie dyskietki! Wynik zapisujemy na naszej roboczej dyskietce z programem w TBXL!
Teraz wczytujemy TBXL. dajemy komendę BLOAD"D:DANE.DAT" i możemy sprawdzić, czy dane siedzą w pamięci:
GR.8:MOVE$95C0,DPEEK(88),1600:POKE756,$9c
Powinniśmy mieć tytuł na górze ekranu oraz polskie literki z control. Zakłądam, że wszystko jest ok. Pamiętamy, aby uzupełnić nasz plik z adresami o odpowiedni wpis - $95c0-$9fff grafika tytułowa - aby potem ich nie zadeptać. Wczytujemy nasz plik z grą (LOAD"D:GRA0.TB"). Zmodyfikujemy sobie póki co tylko procedurę INTRO, proszę o własnoręczne przepisanie zmian:
99 ------------------------------
100 PROC INTRO
101 GRAPHICS 24:POKE 710,0:POKE 709,
15:POKE 756,$9C
102 MOVE $95C0,DPEEK(88),1600
142 COLOR %1:TEXT 10,100,"Tu będzie i
ntro"
150 IF PEEK(53279)<>6 THEN 150
190 ENDPROC
199 ------------------------------
Pomijając fakt, że będzie to procedura mocno zmieniana w kolejnym odcinku - wykonajmy nasze zadanie, czyli pokażę jak wykonać plik wczytywany z DOSu lub loadera. Zapiszmy całość jako GRA1.TB (ja zawsze zmieniam numer jak coś robię - w razie wpadki mogę wrócić do poprzedniego pliku. Można też tworzyć sobie tylko dwa pliki i je nadpisywać naprzemiennie, nie polecam natomiast zapisywać zmian zawsze na tym samym pliku, bo mogą pojawić się problemy i czasem ciężko będzie do nich wrócić).
Jeszcze sprawdzam, zy wszystko jest ok - RUN.
Jeśli wszysko w porządku - wczytujemy nasz kompilator (DOS i TBC.COM). Wciskamy 1 (numer stacji dyskietek z naszym źródłem), następnie klawiszamy kursora wybieramy nasz plik źródłowy (GRA1.TB) i naciskamy return. Jeśli wszystko będzie w porządku (no errors) - program poprosi o podanie nazwy dla skompilowanego programu (podajemy bez rozszerzenia) - GRA1.CTB, potem naciskamy N (nie chcemy kolejnej kopii), control-D (wyjście do DOS), Y (potwierdzenie) i sprawdzamy nasz katalog (DIR). Niestety, jak tam spojrzymy - mamy tylko 63 wolne sektory (ach, ta pojedyncza gęstość), a sam runtime ma... 88 (jak ktoś stworzył sobie większego ATR-a to nie będzie miał problemu). Na potrzeby tutoriala tworzę nowy ATR, tam przegrywam wyłącznie plik linker, runtime2.exe oraz nasz skompilowany program - ja go nazwałem kompilat.atr (do ściągnięcia).
Po wgraniu DOSa wkładamy do stacji nasz dysk i wczytujemy linker (LINKER.COM) - i tu uwaga, oryginalny linker wymaga, aby plik RUNTIME2.EXE był w stacji nr 1. O.k., podajemy nazwę naszego programu (pełna śzieżka) - D:GRA1.CTB, następnie nazwę pliku wynikowego - D:GRA1.CO (Uwaga! Z premedytacją dalem rozszerzenie CO - potrzebujemy dograć nasze dane! Gdy nic nie dogrywamy - mamy już gotowy plik!). Wciskamy Return i KONIECZNIE klawisz Esc po zapisaniu! (dopiero on zamyka plik). Wkłądamy dyskietkę z DOSem i mossadem, wciskamy D (wyjście do DOS), wczytujemy mossada i po kolei:
1. R D:GRA1.CO <return> - wczytanie "naszej gry"
2. R D:DANE.DAT <return> - wzytanie brakujących danych
3. W D:GRA1.COM <return> - zapis całej gry
4. Q T - wyjśie do DOSu (musi być w stacji)
Teraz już możemy wczytać naszą grę spod DOSu! Sprawdźcie sami...
Oczywiście, zamiast Mossada można użyć nawet DOSa, ale dla mnie jest to wygodne narzędzie, co więcej - ma spory bufor pamięci. W następnym odcinku spróbujemy nieco doszlifować nasz program binarny i zająć się ekranem inta. Jak zwykle liczę na odzew ze strony forumowiczów i czekam na uwagi.
Post's attachmentsdane.txt 75 b, liczba pobrań: 14 (od 2019-03-16)
grafika.atr 90.02 kb, liczba pobrań: 15 (od 2019-03-16)
kompilat.atr 90.02 kb, liczba pobrań: 14 (od 2019-03-16)
roboczy_tbxl — kopia.atr 90.02 kb, liczba pobrań: 14 (od 2019-03-16)
Tylko zalogowani mogą pobierać załączniki.
Sikor umarł...