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.  
      Jak będę pisał kompilator C to pewnie zrobię go właśnie w składni C ;-)
      • 2:
         
        CommentAuthormgr_inz_rafal
      • CommentTime12 Apr 2017 14:04 zmieniony
       
      Czy PROC musi być na początku linii?

      Poniższy program zgłasza błąd składni w TBXL, natomiast mój kompilator poprawnie to kompiluje i zastanawiam się, czy nie zostawić tego jako "extension" :)

      6 EXEC STANIK
      7 EXEC BERET
      9 GOTO 9
      10 PROC BERET:PRINT 1:ENDPROC:PRINT 2:PROC STANIK:PRINT 2:ENDPROC
      • 3:
         
        CommentAuthorpirx
      • CommentTime13 Apr 2017 10:04 zmieniony
       
      Koniecznie zostaw, świetne do 10 liners. PROC bardzo traci przez to, że musi być od nowego wiersza.
      Trza by to dodać to TB :)

      Pewnie TB tego nie łyka, bo PROC to jakiś syntactic sugar do GOSUB...
      • 4: CommentAuthormono
      • CommentTime13 Apr 2017 10:04
       
      Pewnie musi być od nowego wiersza, żeby wcięcia ładnie działały :)
      • 5:
         
        CommentAuthormav
      • CommentTime13 Apr 2017 10:04
       
      Co to będzie za 10liner, skoro przed kompilacją będzie można wywalić formatowanie?
      To tak jakby powiedzieć, że np. jquery to oneliner :D
    2.  
      OK, dzięki - wszystko jasne. Zostawiam tak jak jest.

      Jak jeszcze numery linii zrobię opcjonalne, to będzie można pisać one-linery, bo nie ma limitu na długość wiersza ;)
      • 7:
         
        CommentAuthorpirx
      • CommentTime14 Apr 2017 23:04
       
      I O TO CHODZI!!! :))))))
      • 8: CommentAuthorpin
      • CommentTime14 Apr 2017 23:04
       
      Zróbcie wersję na Atari, albo choć jeden pacz, by oryginalny kompiler pobierał z linii poleceń parametr z plikiem do kompilacji. Niejednokrotnie oszczędziło by mi to dużo czasu...
      • 9:
         
        CommentAuthormgr_inz_rafal
      • CommentTime7 May 2017 19:05 zmieniony
       
      Dobra, uporządkowałem trochę kod, popisałem CMejki i zrobiłem, żeby kompilowało się też na linuchu. Zara wrzucę na GitHubę.

      Tak to wygląda na Miętosiu:



      Testy też się kompilują, ale nie zadziałają, bo musiałbym całość jeszcze spiąć z atari800 (nie-Win) oraz z Madsem pod Linuxa zapewne poprzez Wine. Nie chce mi się :)



      Link: ->link<-
      • 10:
         
        CommentAuthorbocianu
      • CommentTime7 May 2017 20:05
       
      mads pod linuxa jest natywny - nie trzeba wine ;)
    3.  
      Zacnie...
      Ale i tak mi się nie chce ;-)
      • 12: CommentAuthorgreblus
      • CommentTime7 May 2017 22:05
       
      Hej wrzuć na github-a. Akurat wyjeżdżam do kalifatu niemieckiego, ale jak wrócę w przyszłą sobotę i zostanie mi choć jedna żywa szara komórka, to chętnie potestuję na Linuksie ;).
    4.  
      Kolega grablus sprawił, że linuxowe toole są już w projekcie i nawet działają :)

      Dzięki!

    5.  
      Mam pytanie: jeśli robię
      PRINT 1,2

      To co właściwie jest drukowane w miejscu przecinka? Jak obliczyć tę odległość do następnej kolumny?
      • 15: CommentAuthormono
      • CommentTime17 May 2017 19:05
       
      A to nie jest kompatybilne z AtariBASIC-em?
    6.  
      Masz rację.

      I nawet już mi to tłumaczyłeś: ->link<-

      Ogólnie w tym starym wątku jest masa wiedzy, która znowu mi się przyda.
      • 17: CommentAuthorantrykot
      • CommentTime18 May 2017 13:05
       
      SOUND jest źle zaimplementowane.

      Inicjalizując POKEYa zakładasz że pierwsze SOUND które wystąpi w programie, będzie również wykonane jako pierwsze, a tak przecież nie musi być.

      Rzecz w tym że w ogóle nie powinieneś resetować POKEYa przez zapis 0 do SKCTL, gdyż jest to tutaj zbędne (choć są inne sytuacje w których jest to użyteczne).

      Za to powinieneś za każdym razem gdy wykonywana jest instrukcja SOUND zapisywać 0 do AUDCTL i 3 do SKCTL, jeżeli zależy Ci na kompatybilności.
    7.  
      Masz rację, SOUND nie brzmiało mi za dobrze przy testach, nawet wpisałem ten fakt w readme.

      Dzięki za wskazówki; przyjdzie czas na poprawki i w tym zakresie.
    8.  
      Przecinek chyba już działa dobrze. Mono, dopiero po latach zrozumiałem Twój przykładowy kod w Pytonie :)

      10 PRINT 1,2;3;4;
      20 PRINT ,6,7;7;7;8;6,
      30 PRINT 123;
      40 PRINT 1,22,333,1000,20000,3,22,345,6543




      I teścik:

    9.  
      Do gry wkraczają tablice :)



      • 21: CommentAuthorgreblus
      • CommentTime12 Jun 2017 22:06
       
      Takiego mam problema i nie wiem o co kaman:

      In file included from /home/greblus/build/tubac/tests/src/tests.cpp:35:0:
      /home/greblus/build/tubac/tests/src/tests.cpp: In function ‘void ____C_A_T_C_H____T_E_S_T____279()’:
      /home/greblus/build/tubac/tests/src/tests.cpp:272:3: error: redeclaration of ‘Catch::ScopedMessage scopedMessage291’
      INFO(FILENAME) \
      ^
      /home/greblus/build/tubac/tests/src/tests.cpp:289:5: note: in expansion of macro ‘RUN_AND_CHECK’
      RUN_AND_CHECK(
      ^
      /home/greblus/build/tubac/tests/src/tests.cpp:271:3: note: ‘Catch::ScopedMessage scopedMessage291’ previously declared here
      INFO(listing) \
      ^
      /home/greblus/build/tubac/tests/src/tests.cpp:289:5: note: in expansion of macro ‘RUN_AND_CHECK’
      RUN_AND_CHECK(
      ^
      make[2]: *** [CMakeFiles/tubac_tests.dir/build.make:111: CMakeFiles/tubac_tests.dir/src/tests.cpp.o] Błąd 1
      make[1]: *** [CMakeFiles/Makefile2:68: CMakeFiles/tubac_tests.dir/all] Błąd 2
      • 22: CommentAuthorantrykot
      • CommentTime12 Jun 2017 23:06
       
      Jakiego kompilatora używasz? Wygląda na to że nie implementuje makra __COUNTER__.
      • 23: CommentAuthorgreblus
      • CommentTime12 Jun 2017 23:06 zmieniony
       
      gcc 7.1.
      • 24: CommentAuthorantrykot
      • CommentTime13 Jun 2017 00:06 zmieniony
       
      Z jakiegoś powodu Catch nie wykrywa poprawnie wersji gcc, można dodać
      #define CATCH_CONFIG_COUNTER
      przed
      #include <catch.hpp>
      żeby to naprawić.
      • 25: CommentAuthorgreblus
      • CommentTime13 Jun 2017 07:06
       
      Działa, dzięki! :)
    10.  
      7.1? O kurna, może za świeży :)
      Ja przed chwilą jechałem bodajże 5.4 i nie było problemu.
      • 27: CommentAuthorgreblus
      • CommentTime13 Jun 2017 21:06
       
      W Archu takie dają :) A swoją drogą twórcy gcc bawią się chyba ostatnio w wojnę numerkową.
    11.  
      Pierwsze zastosowanie typowo naukowe - sortowanie bąbelkowe :)

      Na dwa baty, tzn. na dwie kolumny...

      10 COM ARR(1,10)
      20 EXEC INIT
      25 FOR COLUMN=0 TO 1
      30 EXEC SORT
      35 NEXT COLUMN
      40 EXEC SHOW
      50 GOTO 50
      1000 PROC INIT
      1005 FOR I = 0 TO 10
      1010 ARR(0,I)=RND:ARR(1,I)=RND
      1015 NEXT I
      1100 ENDPROC
      2000 PROC SHOW
      2005 FOR I = 0 TO 10
      2010 PRINT ARR(0,I),ARR(1,I)
      2015 NEXT I
      2100 ENDPROC
      3000 PROC SORT
      3005 GOTO 3013
      3010 IF SORTED = 1 THEN GOTO 3100
      3013 SORTED = 1
      3015 FOR I = 0 TO 9
      3020 IF ARR(COLUMN,I) > ARR(COLUMN,I+1)
      3025 TMP = ARR(COLUMN,I)
      3030 ARR(COLUMN,I) = ARR(COLUMN,I+1)
      3035 ARR(COLUMN,I+1) = TMP
      3040 SORTED = 0
      3045 ENDIF
      3050 NEXT I
      3055 GOTO 3010
      3100 ENDPROC


    12.  
      Z okazji, że zła pogoda, dorzucam jeszcze trochę operatorów logicznych i binarnych:

      10 PRINT 1234 ! 45432
      20 PRINT 54332 & 130
      30 PRINT $BABA AND 0
      40 PRINT $BABA OR 0
      50 PRINT $CEED EXOR $77BB


      • 30: CommentAuthorgreblus
      • CommentTime17 Jun 2017 19:06
       
      Brak komentarzy oznacza, że wszystko działa. Ja w kazdym razie będę krzyczał jak coś mi nie zadziała :)
      • 31: CommentAuthorgorgh
      • CommentTime17 Jun 2017 19:06
       
      ciekawy bardzo projekt
      • 32: CommentAuthorQTZ
      • CommentTime17 Jun 2017 20:06
       
      Właśnie pomyślałem, że taka pogoda, to zajrzę na forum... i pewnie zastanę zero nowych postów... :)

      OT: Nazwy zmiennych typowe, kiedyś na uczelnię robiłem projekt i bazowałem na krótkim przykładzie, w którym podobnie były nazwane pliki, po modyfikacjach z przykładu nie zostało prawie nic, poza tymi nazwami, które przed oddaniem wypadało zmienić, niestety zrobiłem to w ostatniej chwili i przy ocenie zapomniałem jakie są te nowe... Ledwo dostałem tróję, a mało brakowało, a byłbym posądzony o kradzież cudzej pracy... Dodatkowym argumentem na moją niekorzyść było zbytnie rozbudowanie funkcjonalności... które w 100% było mojego autorstwa... :)

      Generalnie ciekawy projekt, zaglądam tu od czasu do czasu :)
    13.  
      Idzie wiosna, idą stringi :)

      10 PRINT "Sarna ma ";2018-2002;" lat"
      20 PRINT "Zaraz bedzie rodzic blat"
    14.  
      Przy okazji pytanko: pod jakim adresem ATARI BASIC domyślnie trzyma stringi? Chciałbym podejrzeć sobie kilka rzeczy.
      • 35: CommentAuthormono
      • CommentTime24 Feb 2018 20:02 zmieniony
       
      $8C - STARP - wektor tablicy zmiennych tablicowanych
    15.  
      Stal powoli się hartuje... :)

      Osiągnąłem stan pozwalający na skompilowanie kawałka Biednego Psa Anotniego. Konkretnie to tego kawałka, który ćwiczyłem już przy poprzednim kompilatorze, a który umożliwia poprawną deklinację wyrazu "krok".

      6 Q0=0:Q1=1:FI=Q1:MQ1=-1:MQ2=-2:Q2=Q1 + Q1:Q23=23:Q7=Q2 + Q2 + Q2 + Q1:Q22=Q23-Q1:Q30=Q23 + Q7:Q3310=3310
      75 DIM STPC$(302),ST$(2)
      76 STPC$(3,4)=" ":ST$(Q1)="o":ST$(Q2)="w"
      77 FOR J=Q0 TO 13:FOR I=Q0 TO Q2:STPC$((20*J) + 5 + I*Q2,(20*J) + I*Q2 + 6)="i ":NEXT I
      78 FOR I=Q0 TO 6:STPC$((20*J) + 11 + I*Q2,(20*J) + I*Q2 + 12)=ST$:NEXT I:NEXT J
      79 FOR I=285 TO 290 STEP Q2:STPC$(I,I + Q1)="i ":NEXT I:FOR I=291 TO 302 STEP Q2:STPC$(I,I + Q1)=ST$:NEXT I
      80 FOR J=Q0 TO Q1:FOR I=25 TO Q30 STEP Q2:STPC$(200*J + I,200*J + I + Q1)=ST$:NEXT I:NEXT J
      95 MAXSTEP=151
      99 FOR CURSTEP=117 TO 148 STEP Q2
      100 W=MAXSTEP-CURSTEP-Q1:W1=MAXSTEP-(CURSTEP + 1)-Q1
      120 PRINT W;" krok";STPC$(W*Q2 + Q1,W*Q2 + Q2),
      125 PRINT W1;" krok";STPC$(W1*Q2 + Q1,W1*Q2 + Q2)
      130 NEXT CURSTEP:CURSTEP=149:W=MAXSTEP-CURSTEP-Q1
      200 PRINT W;" krok";STPC$(W*Q2 + Q1,W*Q2 + Q2)


      PS. Testy jeszcze nie przechodzą, bo coś znowu skopałem z moim koszmarem, czyli printowaniem "," oraz ";"...
    16.  
      PS. Jest taka zmiana, że w celu uproszczenia kodu w obcnej wersji kompilatora nie będę już pozwalał na
      DIM A$(X*2+3)

      Rozmiar tablicy musi być zdefiniowany za pomocą stałej.

      Uzasadnienie jest identyczne jak w przypadku braku obsługi
      GOTO 1000+X

      Zysk niewielki, a poziom komplikacji (i spowolnienia programu) duży.
    17.  
      @mono,
      Wygląda na to, że w Twoim pytongowym przykładzie, który jest tutaj (http://atarionline.pl/forum/comments.php?DiscussionID=2162&page=3#Item_17), jest mały babol.

      Spójrz na rysunek poniżej. Widać, że BASIC przesuwa na prawo cztery ostatnie DUPY, a skrypt w pytongu tylko trzy. Dotyczy to przypadku, gdy ciąg przed przecinkiem ma 9 znaków (o jeden mniej niż PTABW).



      Nie miałem wcześniej testu wyłapującego ten niuans, na szczęście potknąłem się o to w przykładzie opisanym w poście wyżej.

      Twój skrypt trochę zmodyfikowałem:
      def basic_print(*items):
      auxbr = ptabw-1
      cox = 0
      for text in items:
      for ch in text:
      print(ch, sep="", end="")
      cox += 1
      if cox >= auxbr:
      auxbr += ptabw
      for i in range(cox, auxbr+1):
      print(" ", sep="", end="")
      cox += 1
      if cox >= auxbr:
      auxbr += ptabw
      print()


      Adekwatnie powprawiłem też kompilator i teraz wszystko teoretycznie gra i buczy. Jakbyś miał chwilę to zerknij, czy moja naiwna poprawka jest dobra, czy też po prostu zaszpachlowałem jakiś mechanizm, którego nie rozumiem :)

    18.  
      Jakiś tam milestone... Jest już obsługa stringów w zakresie przypisań i różnych form indeksowania. Np.:

      10 DIM A$(20),B$(20)
      20 A$="12345678901234567890"
      30 B$="ABCDEFGHIJKLMNOPQRST"
      40 A$(2+2,3+3)=B$(15)
      50 PRINT A$
      60 A$(15)=B$(2)
      70 PRINT A$
      80 A$(11,15)=B$(1,2)
      90 PRINT A$
      100 A$(11,15)=B$(1,19)
      110 PRINT A$
      120 A$(11,15)=B$(10)
      130 PRINT A$


      Nie działają jeszcze porównania.

      PS. Więcej przykładów tutaj:
      ->link<-
      • 40:
         
        CommentAuthorKaz
      • CommentTime23 Mar 2018 13:03
       
      Obsługa stringów jest prosta - ściągasz i gotowe :P
      • 41: CommentAuthormono
      • CommentTime23 Mar 2018 14:03
       
      @mgr_inz_rafal: Jakie ładne obrazki.
      Masz chyba rację i musiałem się walnąć - przepraszam.

      Czyli komplikator coraz bliżej.
    19.  
      Znowu wybiła wiosna, zatem znowu trochę stringów.

      Tym razem baza do porównywania, na razie tylko literałów.

      5 PRINT "DUPA < DUP",
      10 PRINT "DUPA" < "DUP"
      15 PRINT "DUP < DUPA",
      20 PRINT "DUP" < "DUPA"
      25 PRINT "DUPA < DUPA",
      30 PRINT "DUPA" < "DUPA"
      35 PRINT "a < A",,
      40 PRINT "a" < "A"
      45 PRINT "A < B",,
      50 PRINT "A" < "B"
      55 PRINT "A < A",,
      60 PRINT "A" < "A"
      65 PRINT "B < A",,
      70 PRINT "B" < "A"
      75 PRINT "0 < 1",,
      80 PRINT "0" < "1"
      85 PRINT "2 < 2",,
      100 PRINT "2" < "2"
      105 PRINT "4 < 3",,
      110 PRINT "4" < "3"
    20.  
      Również już teraz działa jednakże dla pełnoprawnych stringów także.

      10 DIM A$(20),B$(20)
      20 A$="ADA":B$="BBB"
      30 PRINT A$<B$
      45 PRINT A$(2)<B$
      70 PRINT A$(2,3)<B$
      75 B$="ZZZ"
      80 PRINT A$(2)<B$(2)
      • 44:
         
        CommentAuthorKaz
      • CommentTime26 Apr 2018 01:04
       
      "DUPA" przynajmniej miała coś wspólnego ze stringami, ale "1001". "BBB", "ZZZ"??? Bez sęsu :)
      • 45: CommentAuthorMater
      • CommentTime26 Apr 2018 23:04
       
      O, super sprawa taki kompilator ;). Dopiero zacząłem kodzić w Turbo Basicu XL, ale no dobry kompilator przyda się na przyszłość ;). Trzymam kciuki za projekt i nie mogę się doczekać kolejnych milestonów ;).
    21.  

      Mater:

      Trzymam kciuki za projekt i nie mogę się doczekać kolejnych milestonów ;)


      Spieszę ukoić nerwy związane z oczekiwaniem i informuję, że dodałem obsługę porównań, w których udział biorą puści literałowie, czym zamykam temat porównywania stringów :)

      10 PRINT ""=""
      20 PRINT ""<""
      30 PRINT "">""
      110 PRINT ""="A"
      115 PRINT "A"=""
      120 PRINT ""<"A"
      125 PRINT "A"<""
      130 PRINT "">"A"
      135 PRINT "A">""
      210 PRINT ""<>"A"
      215 PRINT "A"<>""
      220 PRINT ""<="A"
      225 PRINT "A"<=""
      230 PRINT "">="A"
      235 PRINT "A">=""




      Przy okazji, ładna ilość testów już nam urosła :)

      • 47: CommentAuthorgreblus
      • CommentTime11 May 2018 23:05
       
      Potwierdzam :) wszystkie testy wykonują się poprawnie (gcc-8.1 i boost 1.66).
    22.  
      Ma ktoś może gotowca do zmiany stringa na 16-bitową liczbę?

      Z takiego czegoś chciałbym uzyskać bajty 0x39 0x30:
      • 49: CommentAuthormono
      • CommentTime31 May 2018 18:05 zmieniony
       
      Przepraszam, ale z pamięci. Powinno być coś w rodzaju (getchar ma zwracać w .A znak):
      value .ds 2

      lda #0
      sta value
      sta value+1
      ?get:
      jsr getchar
      sec
      sbc #'0'
      bcc ?ret
      cmp #10
      bcs ?ret
      pha

      lda value+1
      pha
      lda value
      asl value
      rol value+1
      asl value
      rol value+1
      clc
      adc value
      sta value
      pla
      adc value+1
      asl value
      rol
      sta value+1

      pla
      clc
      adc value
      sta value
      bcc ?get
      inc value+1
      bcs ?get

      ?ret:
      ldx value
      ldy value+1

      Można też wciągać po połówek bajtów cyfry przesuwając całość o 4 bity w lewo po czym dokonać konwersji BCD do hex.
    23.  
      Ha! Poszło od pierwszego strzału!
      mono, po raz kolejny wielkie dzięki!