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 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 zmieniony
     
    Może tutaj coś znajdziesz ;)

    ->link<-

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

    Niestety w pakiecie FP nie ma funkcji: sin, cos, atan i sqrt, ale dodawanie i mnożenie jest.
    • 4: CommentAuthormono
    • CommentTime28 Dec 2016
     
    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
     
    ->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
     
    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
     
    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
     
    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
     
    ale tu nie ma nic nadzwyczajnego np.16 bitowe dodwanie itp.
    a ze taka arytmetyka jest wystarczajaca niech posluzy przyklad:

    ->link<-
    • 13: CommentAuthormono
    • CommentTime29 Dec 2016 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
     
    w tym wypadku nie uzywaj BCD bedzie szybciej i krocej ogolnie lepiej.
    • 16: CommentAuthorbob_er
    • CommentTime29 Dec 2016
     
    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
     
    Aaaaaaa, myślałem, że ktoś inny tamto prowadził :).
    • 19:
       
      CommentAuthorpirx
    • CommentTime1 Jan 2017
     
    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.
    • 20:
       
      CommentAuthormgr_inz_rafal
    • CommentTime2 Jan 2017 zmieniony
     
    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
     
    a to będzie działało na Atari 64 BIT ?
  6.  
    Nawet na 63 i pół bita.
    • 23: CommentAuthortebe
    • CommentTime2 Jan 2017
     
    "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
  7.  
    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
     
    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
     
    Możesz też zostać bohaterem atari i przeportować to: ->link<-

    Asembler Cortex m0 jest bardo podobny pod wzgledem mozliwosci do 6502 ;)
  8.  
    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
  9.  
    Willy, przeportuję jak znajdę pierścień +30 do ogarniania :)
    • 29:
       
      CommentAuthormgr_inz_rafal
    • CommentTime17 Jan 2017 zmieniony
     
    Slowly, slowly, kompilator potrafi już wyrażać swoje expressions :)
    10 PRINT (4*(13-3)+((5+2)*7)+1)/(666/333)


    • 30:
       
      CommentAuthormgr_inz_rafal
    • CommentTime23 Jan 2017 zmieniony
     
    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
     
    25 VAL=VAL+1
  10.  
    -> 65535
    • 33:
       
      CommentAuthorpirx
    • CommentTime23 Jan 2017
     
    SUP!
    • 34:
       
      CommentAuthormgr_inz_rafal
    • CommentTime26 Jan 2017 zmieniony
     
    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
     
    like
  11.  
    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
    • 37:
       
      CommentAuthormgr_inz_rafal
    • CommentTime17 Mar 2017 zmieniony
     
    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
  12.  
    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
  13.  
    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...
    • 40:
       
      CommentAuthormgr_inz_rafal
    • CommentTime25 Mar 2017 zmieniony
     
    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
     
    Szkoda, że tu lajków nie ma :)
    • 42:
       
      CommentAuthorlarek
    • CommentTime25 Mar 2017 zmieniony
     
  14.  
    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
     
    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?
  15.  
    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
     
    @mgr_inz_rafal: Ładnie. Nastręcza kompilacja TBXL znacznie więcej kłopotu niż AB?
  16.  
    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 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
    • 49:
       
      CommentAuthormgr_inz_rafal
    • CommentTime7 Apr 2017 zmieniony
     
    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
     
    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? ;-)