atarionline.pl Turbo Basic Compiler - 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:
         
        CommentAuthormgr_inz_rafal
      • CommentTime28 Dec 2016 16:12 zmieniony
       
      Hej,
      Od czasu do czasu nachodzi mnie ochota na napisanie kompilatora. Tym razem padło na Turbo Basic.

      Mam już jakiś tam pierwszy szkielet, coś się nawet kompiluje i wyświetla. Najwyższy więc czas aby założyć wątek, w którym będę Was podpytywał o różne tematy związane z bebechami Atarynki, bo przy pisaniu poprzedniego kompilatora wiele razy miałem wrażenie, że wyważam otwarte drzwi...

      Jak osiągnę w miarę stabilny stan z dziajałącą chociażby arytmetyką, PRINTem i POKE'ami to wrzucę całość na GitHubę - dla potomności.

      Zatem... Pytanie #1: Dodawanie liczb FP.

      Na razie w tym celu beztrosko skaczę sobie pod $AD26, ale jak wyłączę BASIC to oczywiście nic pod tym adresem nie ma :) Skąd można pożyczyć funkcję dodającą FR0 i FR1, którą mógłbym dodać do mojego runtime?

      Odejmowanie, mnożenie i dzielenie również mile widziane ;)
      • 2:
         
        CommentAuthorbocianu
      • CommentTime28 Dec 2016 16:12 zmieniony
       
      Może tutaj coś znajdziesz ;)

      ->link<-

      ->link<-
      • 3: CommentAuthorantrykot
      • CommentTime28 Dec 2016 16:12
       
      ->link<-

      Niestety w pakiecie FP nie ma funkcji: sin, cos, atan i sqrt, ale dodawanie i mnożenie jest.
      • 4: CommentAuthormono
      • CommentTime28 Dec 2016 19:12
       
      Bo fncje trygonometryczne są w BASIC-u. TBXL tym się różni od Atari BASIC, że ma zaimplementowany FP własny i dlatego jest szybszy od AB. Trzeba by chyba zdobyć jakieś źródło i spróbować się nim posiłkować, bo inaczej wyjdzie Ci skompilowany TBXL, który jest wolniejszy niż interpretowany :/
    1.  
      Dzięki za linki, Panowie. Są tam co prawda źródła do "floating point routines", ale z August 1976, napisane przez jakiegoś Woźniaka :/

      Tutaj znalazłem jeszcze kilka propozycji:
      ->link<-

      Spróbuję zaprząc coś do pracy...

      Mono, słuszna uwaga na temat prędkości :) W sumie to nawet nie myślałem na razie o wydajności tego mojego badziewia - bardziej interesuje mnie niejako proof-of-concept.
      • 6: CommentAuthormono
      • CommentTime28 Dec 2016 20:12
       
      ->link<-
      Niestety nie ma źródła TBXL, ale jest BASIC XL i BASIC XE.
      No i masz oczywiście źródła Altirra BASIC ->link<-
      • 7:
         
        CommentAuthorpirx
      • CommentTime28 Dec 2016 23:12
       
      już Ci pisałem o tymż nie raz, ale jednakowoż napiszę raz jeszcze - strasznie potrzebaż kompilatora nowoczesnego turbo basica fixed point. nowoczesny turbo basic nie ma numerów wierszy, tylko labele (jak już nie możemy się z goto pożegnać).
      bonusowo mógłby mieć funkcje, bo brak tegoż.

      floating point jest do zaorania. do żadnego programu się nie przyda, tylko się narobisz.

      oczywiście wiem, to exxxperyment, tak jak dynamiczne goto w skompilowanym stuphie, ale może skoro exxxperymentujesz, to warto zmajstrować coś, co się naprawdę przyda?
      • 8:
         
        CommentAuthorKaz
      • CommentTime29 Dec 2016 02:12
       
      Nowoczesny Turbo Basic powstał na Atari ST i nazywał się GFA Basic:

      ->link<-

      Frank Ostrowski poszedł w bardzo dobrą stronę, to był ultra wygodny i przyjazny język. Gdyby takie coś powstało na małym Atari...
    2.  
      pirx, może rzeczywiście warto eksperymentując zrobić przy okazji coś, co się potencjalnie komuś przyda.

      Z numerów linii jestem skłonny zrezygnować, dynamicznego GOTO też tym razem nie będzie...

      Jeśli chodzi o fixed point to taki skrót myślowy, żeby oprzeć się tylko na integerach (tak jak w CC65)?

      Czy też proponujesz fixed point arithmetic (np. 4567 = 45.67), jak np. w oryginalnym Doom, który "symulował" w ten sposób arytmetykę zmiennoprzecinkową?
      • 10: CommentAuthorxxl
      • CommentTime29 Dec 2016 08:12
       
      wszystkie gry ktorych kod analizowalem korzystaja z arytmetyki fixed point - najczesciej 8.8
    3.  
      xxl, a znasz jakieś gotowe procki do takiej arytmetyki na małym Atari?
      • 12: CommentAuthorxxl
      • CommentTime29 Dec 2016 09:12
       
      ale tu nie ma nic nadzwyczajnego np.16 bitowe dodwanie itp.
      a ze taka arytmetyka jest wystarczajaca niech posluzy przyklad:

      • 13: CommentAuthormono
      • CommentTime29 Dec 2016 13:12 zmieniony
       
      Zasady są trywialne. Umieszczasz logicznie kropkę pomiędzy którymiś bitami (zazwyczaj na granicy bajtu). Przy mnożeniu i dzieleniu takich liczb należy pamiętać o logicznym przesunięciu kropki.
      Zresztą FP używa arytmetyki fixedpoint, ale prócz ograniczonej części gdzie zachowana jest liczba jest też druga część, która mówi o wykładniku dziesiętnym i na niej również wykonuje się operacje fixedpoint. Pewnym może mankamentem jest to, że w Atari używa się BCD (i wykładnika 10^2) zamiast binarnego i wykładnika liczby 2.

      Edit: Może łatwiej jest formatować BCD bo od razu mamy liczby dziesiętne.
    4.  
      Noo dobra, dzięki. Rozumiem, ale chyba nie chcę się na razie aż tak rozgałęziać. Idę małymi krokami :)

      Na początek ogarnę jednak to dodawanie.
      • 15: CommentAuthorxxl
      • CommentTime29 Dec 2016 14:12
       
      w tym wypadku nie uzywaj BCD bedzie szybciej i krocej ogolnie lepiej.
      • 16: CommentAuthorbob_er
      • CommentTime29 Dec 2016 18:12
       
      A gdyby tak połączyć siły w projektem ABC (atari basic compiler)?
      Temat baaardzo podobny, a jak będzie dwóch ludzi w projekcie to może szybciej pójdzie.
    5.  
      Masz na myśli ten ABC, który sam kiedyś tworzyłem, czy jakiś inny?

      ->link<-
      • 18: CommentAuthorbob_er
      • CommentTime29 Dec 2016 20:12
       
      Aaaaaaa, myślałem, że ktoś inny tamto prowadził :).
      • 19:
         
        CommentAuthorpirx
      • CommentTime1 Jan 2017 13:01
       
      hello w nowym roku!

      tak, XXL ma 100% racji - wystarczy arytmetyka 16 bit i szybki dostęp do starszego bajtu + support napisów w rodzaju
      pi=3.14

      co by się sprowadzało do
      lda #$24
      sta pi
      lda #$03
      sta pi+1

      w miejscach, gdzie oczekiwanana jest liczba 1 bajtowa kompilator przekazuje starszy bajt:

      narrowplot 200,pi

      ldx #200
      ldy pi+1
      jsr narrowplot


      w rzeczywistości to pewnie nie będzie takie proste, ale warto spróbować!!!

      p.
    6.  
      OK, żeby się teraz za mocno nie zagrzebać odseparowałem sobie warstwę obsługi numerków. Na początek zaimplemetuję "integer" (bo szybko i łatwo), a później fixed i floating.

      Podsumowując, kompilator będzie miał parametr mówiący jak ma interpretować liczby.
      • 21:
         
        CommentAuthorCOR/ira4
      • CommentTime2 Jan 2017 11:01
       
      a to będzie działało na Atari 64 BIT ?
    7.  
      Nawet na 63 i pół bita.
      • 23: CommentAuthortebe
      • CommentTime2 Jan 2017 12:01
       
      "Czy też proponujesz fixed point arithmetic (np. 4567 = 45.67), jak np. w oryginalnym Doom, który "symulował" w ten sposób arytmetykę zmiennoprzecinkową?"

      Doom korzysta z fixed point 16.16, do MadPascala dołączony jest kod realizujący fixed point 24.8, ogólnie im więcej liczb po przecinku tym lepsza precyzja, z tym że dla 16.16 mnożenie, dzielenie wymaga w skrajnych przypadkach liczb większych niż 64bit dlatego zostałem przy 24.8, tutaj wystarczą operacje max na 64bit
    8.  
      Super, tego właśnie było mi trzeba. Który to dokładnie jest przykład?

      Dodatkowo widzę, że jest też dołączony "fastchip" :)
      • 25: CommentAuthortebe
      • CommentTime2 Jan 2017 13:01
       
      MadPascal (MP) rzeczywiście korzysta z fastchip, ale tej wersji jeszcze nie udostępniałem, w załączniku najnowsza uporządkowana wersja głównej biblioteki MP

      katalog BASE, plik res6502.asm to główny zbiór procedur, cpu6502_integer.asm, cpu6502_real.asm itd. odwołują się do res6502
      • 26:
         
        CommentAuthorwilly
      • CommentTime6 Jan 2017 20:01
       
      Możesz też zostać bohaterem atari i przeportować to: ->link<-

      Asembler Cortex m0 jest bardo podobny pod wzgledem mozliwosci do 6502 ;)
    9.  
      Pierwsze koty za płoty :)
      Jest arytmetyka na słowach i trywialny print, który nie wycina zer.

      10 PRINT 1+2+3+4+5+6+7+8+9
    10.  
      Willy, przeportuję jak znajdę pierścień +30 do ogarniania :)
    11.  
      Slowly, slowly, kompilator potrafi już wyrażać swoje expressions :)
      10 PRINT (4*(13-3)+((5+2)*7)+1)/(666/333)


    12.  
      Mamy już zmienne oraz możemy gotować...
      5 VAL=7
      6 JELITO=100
      10 PRINT VAL*VAL
      20 PRINT JELITO-VAL*3
      30 GOTO 10


      • 31:
         
        CommentAuthorpirx
      • CommentTime23 Jan 2017 11:01
       
      25 VAL=VAL+1
    13.  
      -> 65535
      • 33:
         
        CommentAuthorpirx
      • CommentTime23 Jan 2017 15:01
       
      SUP!
    14.  
      Jest komparyza:
      10 PRINT 3=3
      11 PRINT 100>=200/2
      12 PRINT (100>=200)/2
      14 PRINT 1000<>1000
      15 PRINT 60000<60001
      16 PRINT 60000>60001




      Najwyższy czas na dodanie testów wykorzystujac ten myk:
      ->link<-

      Do usłyszenia za czas dłuższy :)
      • 35:
         
        CommentAuthorpirx
      • CommentTime26 Jan 2017 18:01
       
      like
    15.  
      Piki, poki i muzyka!

      4 DUPA=3
      5 POKE 1536,DUPA
      10 PRINT PEEK(1533+DUPA)
      20 SOUND PEEK(1533+DUPA), 180, 8, 10
      30 SOUND DUPA-1, 140, 14, 10
    16.  
      Dlaczego poniższy program wyświetla tylko 20, a nie 2 i 20?
      10 IF 50>100 THEN PRINT 1:ELSE :PRINT 2:ENDIF
      100 IF 50>100
      110 PRINT 10
      120 ELSE
      130 PRINT 20
      140 ENDIF


      OK, już wiem. Zła składnia IF... Tak działa poprawnie:
      10 IF 50>100:PRINT 1:ELSE :PRINT 2:ENDIF
      100 IF 50>100
      110 PRINT 10
      120 ELSE
      130 PRINT 20
      140 ENDIF
    17.  
      Dobra, działa prosty IF i przy okazji dodałem obsługę hexów:
      10 POKE $600,77
      20 IF PEEK(1536)=77 THEN PRINT 1
      30 PRINT 0
    18.  
      Hej,
      Zaskakująca (dla mnie) obserwacja. Poniższa pętla:
      10 N=10
      20 FOR I=1 TO N
      29 N=N-1
      30 PRINT N,I
      40 NEXT I
      zawsze wykonuje się 10 razy.

      Wydawało mi się, że BASIC będzie sobie przy każdej iteracji obliczał N na nowo, ale wygląda na to, że oblicza raz i odkłada sobie *wartość* na stos...
    19.  
      Są już elsy i pętla for bez step:
      5 START=100:SSTOP=300:MID=(SSTOP-START)/2+START
      10 FOR A = START TO SSTOP
      20 A = A + 27
      25 IF A <= MID:PRINT A: ELSE
      26 PRINT A + 30000: ENDIF
      30 NEXT A
      40 PRINT 666


      • 41: CommentAuthorgreblus
      • CommentTime25 Mar 2017 22:03
       
      Szkoda, że tu lajków nie ma :)
      • 42:
         
        CommentAuthorlarek
      • CommentTime25 Mar 2017 23:03 zmieniony
       
    20.  
      A tymczasem jest już KROK w pętli DLA oraz pętla DOPOKI. Działa EXIT.
      10 FOR I = 1 TO 7 STEP 2
      20 FOR J = 1 TO 8 STEP 2
      25 K = 1
      30 WHILE K < 10
      40 PRINT I:PRINT J:PRINT K
      43 K=K+1
      45 IF K >= 4 THEN EXIT
      50 WEND
      60 IF J > 3 THEN EXIT
      70 NEXT J
      80 IF I > 2 THEN EXIT
      90 NEXT I
      100 PRINT 666
      • 44:
         
        CommentAuthormav
      • CommentTime5 Apr 2017 22:04
       
      Czy mógłbyś laikowi takiemu jak ja powiedzieć, co Ty tak konkretnie właściwie robisz? Póki co wygląda jakbyś trochę wynajdował koło na nowo? Tzn. to nic złego, broń Boże, pytam bo jestem zaintrygowany tym - bo wcześniej był już chyba taki język, który mógł robić
      10 PRINT eee?
      Ty go rozbudowujesz czy o co chodzi?
    21.  
      Język taki już jest - ja tylko robię teraz taką maszynkę, która zamieni ten właśnie język na assembler.

      Wartość raczej czysto akademicka i robię to dla przyjemności :)
      • 46: CommentAuthormono
      • CommentTime6 Apr 2017 19:04
       
      @mgr_inz_rafal: Ładnie. Nastręcza kompilacja TBXL znacznie więcej kłopotu niż AB?
    22.  
      Nie nastręcza znacznie więcej kłopotu, gdyż nie ma tam karkołomnych cech.

      Powiedziałbym, że jest nawet prościej, gdyż:
      1. Mam doświadczenia z poprzedniego podejścia do Atari Basic
      2. Lepiej znam Atarkę i samego BASICa
      3. Przyjąłem, że nie będę się starał obsługiwać "dziwnych" konstrukcji, np. w których pozamieniane są FORy i NEXTy lub tych, których wsparcie nie uzasadnia nakładu pracy oraz spowalnia wykonanie (np. GOTO X+3)
      • 48:
         
        CommentAuthormav
      • CommentTime7 Apr 2017 19:04 zmieniony
       
      Ok. Jasno i dość klarownie :-) aczkolwiek myślałem że generalnie każdy język ostatecznie sprowadza kod do kodu maszynowego tudzież assemblera, czy zatem Twój kompilator ma być bardziej wydajny?

      Chociaż po chwili zastanowienia chyba skumałem konkretnie :-) i wydaje mi się ze ma to sens :D
    23.  
      Właśnie nie każdy - np. Turbo Basic jest językiem interpretowanym. Choć oczywiście istnieje już do niego kompilator i to nawet działający na Atari.

      Głównym celem kompilacji Turbo Basica jest przyspieszenie działania programu. Tu możesz zobaczyć efekty takiej kompilacji uzyskane za pomocą mojego starego kompilatora:

      [oglądać mniej więcej od 2:50].

      A tymczasem dodałem obsługę dwóch ostatnich pętli (REPEAT-UNTIL i DO-LOOP):
      10 J=4*657:I=5:DO
      22 I=I+3
      24 PRINT I
      26 IF I > 30 THEN EXIT
      27 REPEAT
      29 J=J-657:PRINT J:UNTIL J=0
      30 J=4*657:LOOP
      40 PRINT 666
      • 50:
         
        CommentAuthormav
      • CommentTime7 Apr 2017 22:04
       
      No właśnie, siedzę teraz na telefonie, gdzie szukanie jakichkolwiek informacji to katorga, ale założyłem taką tezę, że jest interpretowany i wtedy kompilacja ma sens.
      Dzięki za odpowiedź, teraz wszystko jasne.

      A nie dało się już robić tego w składni C? ;-)