atarionline.pl Bliźniak - pierwszy w 2024 program dla Atari - Forum Atarum

Jeśli chcesz wziąć udział w dyskusjach na forum - zaloguj się. Jeżeli nie masz loginu - poproś o członkostwo.

  • :
  • :

Vanilla 1.1.4 jest produktem Lussumo. Więcej informacji: Dokumentacja, Forum.

    • 1:
       
      CommentAuthorKaz
    • CommentTime1 Jan 2024 zmieniony
     
    Kolega Mono zrobił to, co zapowiedział - podczas Sylwestra 2023/2024 przygotował atarowską wersję programu "W poszukiwaniu bliźniaka Ziemi" z Bajtka 2/1986. To była jakaś jego zajawka z młodości, którą postanowił sobie zrealizować dla przyjemności. Gra w Bajtku jest spektrumową wersją programu zamieszczonego w Creative Computing 11/1985.

    Mono wiernie odtworzył program, jest tylko jedna i to wyraźna różnica - w wersji Atari mamy ekran tytułowy (przygotowałem mu proste ATASCII art).
    • 2:
       
      CommentAuthorKaz
    • CommentTime1 Jan 2024 zmieniony
     
    Teraz pliczki: ATR, LST, BAS.
    • 3:
       
      CommentAuthorKaz
    • CommentTime1 Jan 2024 zmieniony
     
    • 4:
       
      CommentAuthorKaz
    • CommentTime1 Jan 2024
     
    Listing oryginału jest napisany w języku BASICA, znany jako Advanced BASIC (jedna z czterech wersji Microsoft Basic dla IBM PC i PC junior): ->link<-

    Program w Bajtku to Sinclair Basic: ->link<-

    A na Atari mamy program działający na stockowym Atari czyli w Atari Basic: ->link<-
    • 5:
       
      CommentAuthorKaz
    • CommentTime1 Jan 2024 zmieniony
     
    Mono zrobił jeszcze drugą wersję, ma tytuł "Bliźniak CC", a literki CC oznaczają, że to wersja zgodna z oryginalnym listingiem z Creative Computing, a nie ze zmienioną wersją z Bajtka. Obie wersje programu lądują w naszych archiwum gier.
    • 6:
       
      CommentAuthorpancio
    • CommentTime1 Jan 2024
     
    Byłem, grałem, kosmitów nie znalazłem :-)
    • 7: CommentAuthormono
    • CommentTime1 Jan 2024 zmieniony
     
    Tych różnic nie jest zbyt dużo i polegają generalnie na innych współczynnikach przy obliczaniu różnych wielkości opisujących planetę, a i to tylko niektórych - większość jest identyczna. W jednym przypadku w wersji bajtkowej dołożony został dodatkowy warunek przy decyzji czy planeta jest kamienista.
    Nie znam się na astronomii, żeby wywnioskować jakie są powody tych zmian, ale zwróciliśmy też wczoraj uwagę że w krótkim wprowadzeniu do gry wersja CC mówi, że podróżujemy przez galaktykę, a wersja bajtkowa że przez kosmos. Może mamy lokalną fizykę :)
    A tak bardziej na poważnie (o ile można mówić o powadze wklepując stary program ze "starej śmierdzącej gazety" w Sylwestra), to może autorowi wersji bajtkowej chodziło o to żeby gra była dynamiczniejsza i wielkości opisujące planety bardziej zróżnicowane (albo odwrotnie - patrz uwaga o mojej ignorancji).

    W wersji dla Atari BASIC:
    - zdefiniowałem zmienną CLS$ zastępującą mi wraz z instrukcją PRINT instrukcję CLS,
    - trzymam rodzaje planet w jednej zmiennej tekstowej S$ (czytanej READ-em z linii DATA) którą potem adresuję za pomocą S$(2*J,2*J+1), bo nie mamy tablicy ciągów,
    - zamieniłem tablicę komunikatów T$ wypisywaniem frazy wprost w konkretnym miejscu,
    - zamieniłem tablicę ciągów C$ opisującą rodzaj planety (kamienista, gazowa, wyparowana, itd.) na tablicę numerów ciągów C i procedurę wypisującą ciąg bazując na C(I),
    - INKEY$ zastąpiłem sekwencją GET #1,A:Y$=CHR$(A) otworzywszy uprzednio kanał dla "K:",
    - funkcję LN zastąpiłem funkcją LOG,
    - no i RND to nasze RND(0).

    Okazało się też że w listingu z archiwum zx-blizniak.7z (nie mam pojęcia skąd ja to mam) jest też kilka błędów związanych prawdopodobnie ze słabą jakością skanu z którego był zrobiony OCR - program syntaktycznie jest poprawny i się tokenizuje, ale działał poprawnie nie będzie:
    - linia 342: GOTO 360 zamiast GOTO 350,
    - linia 423: (.9+RND*.4) zamiast (.8+RND*.4),
    - linia 524: LET I(I)=L*RND*3 zamiast LET I(I)=.1*RND*3,
    - numery linii 2132 i 2133 powinny być w istocie liniami 2182 i 2183,
    - linia 2164: jest "01","02","03",itd. zamiast "O1","O2","O3",...

    Różnice wersji ZX w stosunku do oryginalnej wersji z CC:
    - linia 322: L=EXP(1.5*LOG(M)) zamiast L=EXP(3.5*LOG(M)),
    - linia 323: TA=EXP(-1.1*LOG(M))*10000 zamiast TA=EXP(-2.5*LOG(M))*10000,
    - linia 464: RND(0)*2.2*LOG(MP) zamiast RND(0)*5*LOG(MP),
    - linia 530: jest warunek IF O(I)>173 AND A<=AC AND MP<=3 THEN zamiast IF O(I)>173 AND C(I)=2 THEN,
    - linia 742: dodano warunek IF O(I)>2000 THEN którego nie ma w oryginale,
    - linia 1030: "PRZEMIERZAMY KOSMOS" zamiast "PRZEMIERZAMY GALAKTYKE".

    @Kaz: Chciałem nadmienić iż gra się nazywa "Bliźniak Ziemii", a nie "Bliźniak Mono" :P
    • 8:
       
      CommentAuthorKaz
    • CommentTime1 Jan 2024
     
    Bliźniak Mono to drugi Mono czyli bliźniacy Mono to po prostu Stereo :)

    A odnośnie wczorajszego programowania Bliźniaka na żywo, dzięki Jurku za wykład o różnicach między Sinclair Basic i Atari Basic i praktyczne porady, jak im zaradzić, przenosząc program z ZX Spectrum na Atari. Może to powinien być osobny wątek, gdzie zamieszczone by były przykłady różnic i sposób ich rozwiązania?
    • 9: CommentAuthormono
    • CommentTime1 Jan 2024
     
    Fil fri.
    • 10: CommentAuthorpiter
    • CommentTime1 Jan 2024
     
    szkoda, że nie mogłem być. Fajnie.
    • 11: CommentAuthormono
    • CommentTime1 Jan 2024 zmieniony
     
    Tam jest jeszcze jedna kłopotliwa sprawa w kodzie o której dyskutowaliśmy m.in. z PeriNoidem wczoraj na zómie. Autor wersji ZX chyba z rozpędu popełnił drobną optymalizację wprowadzając błąd i zmieniając też nieco sposób działania programu.
    Mianowicie w wersji CC jest:
    328 FOR J=1 TO 63:IF M>S(J) THEN 330
    329 NEXT J
    330 PRINT "spectral type of star: ";S$(J):PRINT

    a w ZX:
    328 FOR J=1 TO 63: IF M>S(J) THEN GO TO 330: NEXT J
    330 CLS : PRINT "TYP WIDMOWY GWIAZDY: ",S$(J): PRINT

    Ideą pętli jest, zdaje się, wyszukanie w tablicy S elementu mniejszego niż M i opuszczenie jej (pomijam już wyciek pamięci), a następnie wypisanie typu gwiazdy.
    Optymalizacja polegająca na przeniesieniu NEXT z osobnej linii na koniec poprzedniej spowoduje że pętla wykona się tylko raz, bo instrukcja IF pomija wszystko aż do końca bieżącej linii w przypadku gdy warunek nie jest spełniony.
    Więc niezależnie od warunku nastąpi przejście do linii 330 z J=1.

    W atarowskiej wersji zrobiłem więc analogicznie do oryginału:
    328 FOR J=1 TO 63:IF M>S(J) THEN POP:GOTO 330
    329 NEXT J
    330 ? CLS$;:? "TYP WIDMOWY GWIAZDY: ";S$(2*J,2*J+1):?

    Autor wersji ZX zmienił też nazwy zmiennych i tablic na jednoliterowe.