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 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 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
     
    Pewnie musi być od nowego wiersza, żeby wcięcia ładnie działały :)
    • 5:
       
      CommentAuthormav
    • CommentTime13 Apr 2017
     
    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
     
    I O TO CHODZI!!! :))))))
    • 8: CommentAuthorpin
    • CommentTime14 Apr 2017
     
    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 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
     
    mads pod linuxa jest natywny - nie trzeba wine ;)
  3.  
    Zacnie...
    Ale i tak mi się nie chce ;-)
    • 12: CommentAuthorgreblus
    • CommentTime7 May 2017
     
    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 ;).
    • 13:
       
      CommentAuthormgr_inz_rafal
    • CommentTime14 May 2017 zmieniony
     
    Kolega grablus sprawił, że linuxowe toole są już w projekcie i nawet działają :)

    Dzięki!

  4.  
    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
     
    A to nie jest kompatybilne z AtariBASIC-em?
  5.  
    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
     
    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.
  6.  
    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.
    • 19:
       
      CommentAuthormgr_inz_rafal
    • CommentTime2 Jun 2017 zmieniony
     
    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:

    • 20:
       
      CommentAuthormgr_inz_rafal
    • CommentTime12 Jun 2017 zmieniony
     
    Do gry wkraczają tablice :)



    • 21: CommentAuthorgreblus
    • CommentTime12 Jun 2017
     
    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
     
    Jakiego kompilatora używasz? Wygląda na to że nie implementuje makra __COUNTER__.
    • 23: CommentAuthorgreblus
    • CommentTime12 Jun 2017 zmieniony
     
    gcc 7.1.
    • 24: CommentAuthorantrykot
    • CommentTime13 Jun 2017 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
     
    Działa, dzięki! :)
  7.  
    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
     
    W Archu takie dają :) A swoją drogą twórcy gcc bawią się chyba ostatnio w wojnę numerkową.
    • 28:
       
      CommentAuthormgr_inz_rafal
    • CommentTime16 Jun 2017 zmieniony
     
    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


    • 29:
       
      CommentAuthormgr_inz_rafal
    • CommentTime17 Jun 2017 zmieniony
     
    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
     
    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
     
    ciekawy bardzo projekt
    • 32: CommentAuthorQTZ
    • CommentTime17 Jun 2017
     
    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 :)
    • 33:
       
      CommentAuthormgr_inz_rafal
    • CommentTime24 Feb 2018 zmieniony
     
    Idzie wiosna, idą stringi :)

    10 PRINT "Sarna ma ";2018-2002;" lat"
    20 PRINT "Zaraz bedzie rodzic blat"
  8.  
    Przy okazji pytanko: pod jakim adresem ATARI BASIC domyślnie trzyma stringi? Chciałbym podejrzeć sobie kilka rzeczy.
    • 35: CommentAuthormono
    • CommentTime24 Feb 2018 zmieniony
     
    $8C - STARP - wektor tablicy zmiennych tablicowanych
    • 36:
       
      CommentAuthormgr_inz_rafal
    • CommentTime17 Mar 2018 zmieniony
     
    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 ";"...
    • 37:
       
      CommentAuthormgr_inz_rafal
    • CommentTime17 Mar 2018 zmieniony
     
    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.
    • 38:
       
      CommentAuthormgr_inz_rafal
    • CommentTime18 Mar 2018 zmieniony
     
    @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 :)

  9.  
    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
     
    Obsługa stringów jest prosta - ściągasz i gotowe :P
    • 41: CommentAuthormono
    • CommentTime23 Mar 2018
     
    @mgr_inz_rafal: Jakie ładne obrazki.
    Masz chyba rację i musiałem się walnąć - przepraszam.

    Czyli komplikator coraz bliżej.
  10.  
    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"
    • 43:
       
      CommentAuthormgr_inz_rafal
    • CommentTime24 Apr 2018 zmieniony
     
    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
     
    "DUPA" przynajmniej miała coś wspólnego ze stringami, ale "1001". "BBB", "ZZZ"??? Bez sęsu :)
    • 45: CommentAuthorMater
    • CommentTime26 Apr 2018
     
    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 ;).
    • 46:
       
      CommentAuthormgr_inz_rafal
    • CommentTime11 May 2018 zmieniony
     

    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
     
    Potwierdzam :) wszystkie testy wykonują się poprawnie (gcc-8.1 i boost 1.66).
  11.  
    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 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.
  12.  
    Ha! Poszło od pierwszego strzału!
    mono, po raz kolejny wielkie dzięki!