atarionline.pl ABC czyli Atari 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: CommentAuthormono
      • CommentTime3 Feb 2013 21:02
       
      @mgr_inz_rafal: Tak - domyślny kanał to 0.
      put:
      ldx #ch*16
      lda #11 ;putbt
      sta iccmd,x
      lda #<str
      sta icbufa,x
      lda #>str
      sta icbufa+1,x
      lda #<strlen
      sta icbufl,x
      lda #>strlen
      sta icbufl+1,x
      jsr jciomain
      bmi err

      Jeśli w słowie icbufl umieścisz 0, to wtedy na wyjście wyprowadzony zostanie 1 znak, którego ATASCII znajduje się w rejestrze A tuż przed wywołaniem jciomain.

      @brx: Fajny trik! Nie wiedziałem o nim :) A teraz czemu to działa: Basic sprawdza czy nr kanału jest 0, ale przecież później X = A * 16 i ponieważ 16*16=$100, to do X trafia 0 :P Czyli CIO wyprowadza na #0, a Basic nie maluje pytajnika.
      Dlaczego w ogóle Basic rozróżnia #0 od nie 0. Bo przy pobieraniu danych np z dysku nie ma co wypisywać pytajników na ekran.
      Drac030 jest specjalistą od Basic'a - pooglądaj np. ->link<- chwilowo jest tylko na 65c816 i Autor mówi, że ma w planach jeszcze parę poprawek, ale może kiedyś będzie to i na 6502.
    1.  
      @mono
      To jeszcze dla pewności: znak zapytania wypisywać tylko dla kanału #0?
      • 3: CommentAuthormono
      • CommentTime4 Feb 2013 12:02
       
      Tak.
      • 4:
         
        CommentAuthormgr_inz_rafal
      • CommentTime14 Feb 2013 14:02 zmieniony
       
      Na walentynki przedstawiam INPUT do zmiennych numerycznych oraz jedno pytanie (pod obrazkami):
      3 ? "Ile razy chcesz liczyc?"
      4 INPUT ILE
      5 FOR I = 1 TO ILE
      7 ?:? " Seria #";I;"/";ILE;" (";100*I/ILE;"%)":?"Podaj trzy liczby"
      10 INPUT A
      20 INPUT B
      30 INPUT C
      40 PRINT C;"+";B;"*";A;"=";C + B * A
      50 NEXT I
      60 PRINT:?:? "Dziekuje za wspolne obliczenia!"




      A teraz pytanie:
      Inputując liczbę muszę najpierw przygotować w pamięci jakiś bufor na tę liczbę w postaci ATASCII. Jak duży winien być to bufor? Na razie dałem całe pół strony, a szkoda :)

      ______
      PS. Ogarnę jeszcze ostatni temat, czyli input do kilku zmiennych w jednej linijce (INPUT A,B,C,D), przygotuję parę programów DEMO i zrobię publikację.

      EDIT: Dobra, to było easy :)
      10 DIM A$(20)
      20 INPUT A,B,A$
      30 PRINT A$,A,B

      • 5: CommentAuthormono
      • CommentTime14 Feb 2013 16:02
       
      Basic wykorzystuje bufor liczb FP pod adresem $580 (LBUFF). 128b mu wystarcza. Do pobierania danych wykorzystywane jest GETREC (5) CIO.
    2.  

      mono:

      Basic wykorzystuje bufor liczb FP pod adresem $580 (LBUFF).
      Dzięki. Takoż i ja go wykorzystam.
      • 7: CommentAuthormono
      • CommentTime15 Feb 2013 23:02 zmieniony
       
      Konkretyzując kwestię bufora. Basic przy GETREC ustawia rozmiar bufora na 255 a więc niby obszar $580..$67e powinien być przeznaczony na odczyt. Ale...
      1. Literatura podaje, że cała 6 strona jest dostępna dla programów maszynowych.
      2. Manual do Basic XE mówi, że dopiero od $680..$6ff można bezpiecznie lokować programy w asm.
      Skąd rozbieżność?
      E:/S: nie pozwalają wprowadzić więcej niż 128 znaków z ekranu, więc INPUT z #0 nie powinien zamazać strony 6. Dopiero INPUT z innych kanałów (zakładano pewnie, że będą otwierane raczej dla wprowadzania danych z urządzeń zewnętrznych) może zamazać połowę strony 6.
      Dla zgodności pozostawiłbym rozmiar bufora 255 i jego adres na LBUFF ($580). Jeśli będą konsekwencje to przynajmniej zgodne z Basicem.

      Edit: Przepraszam za nieścisłość w poprzednim poście.
    3.  
      Dzięki mono. Na razie ustawiłem bufor na LBUFF, ale przycinam już po 128 znaku. Zmienię to na 255, aby być maksymalnie zgodnym.
      • 9:
         
        CommentAuthorxeen
      • CommentTime17 Feb 2013 19:02 zmieniony
       
      wersja 0.2. Dziękujemy!
      • 10: CommentAuthorw1k
      • CommentTime17 Feb 2013 21:02
       
      how i can compile .bas file?
    4.  
      Have a look at the "release.txt" attached to the compiler.

      If still in doubt, please ask a specific question here. I'll be glad to help.
    5.  
      Dodam jeszcze tylko, że na razie mała przerwa w developmencie kompilatora, bo chcę zdążyć z gierką na Fortification.

      A temat niełatwy, bo planuję wykorzystać scroll'a ;-)
      • 13:
         
        CommentAuthorjhusak
      • CommentTime18 Feb 2013 09:02
       
      A czy hostujesz gdzieś kompilator? na jakimś githubie sourceforge lub gdzieś indziej?
    6.  
      Nie. Typowo po amatorsku hostuję go na swoim własnym dysku :)
    7.  
      @jhusak
      Niestety, na naszych firmowych makach jest gcc 4.2.1, który nie obsługuje "-std=gnu++0x". Nie mogę zmienić na nich środowiska, a nie chce mi się też teraz oczyszczać kodu z kawałków wykorzystujących C++0x :(
      • 16: CommentAuthorBluki
      • CommentTime18 Feb 2013 15:02 zmieniony
       
      Panie magistrze inżynierze Rafale, o Twoim projekcie kompilatora już głośno na całym świecie :)
      Atari BASIC Cross Compiler for Windows/Linux
    8.  
      "Someone" is creating... ;-)
      • 18: CommentAuthorAdam
      • CommentTime18 Feb 2013 22:02
       
      Tak, teraz już wszyscy w świecie Atari wiedzą, że jesteś Kimś :)
      • 19: CommentAuthortebe
      • CommentTime19 Feb 2013 08:02
       
      w paczce z przykładami do mads-a jest dołączony alternatywny ROM z operacjami zmiennoprzecinkowymi ...\examples\math\fastchip mógłbyś dodać możliwość łączenia w pliku wynikowym jako alternatywa jeśli komuś zależy na większej szybkości operacji tego typu
    9.  
      Super! Nie wiedziałem o tym :) Na pewno się przyda.
      • 21: CommentAuthorw1k
      • CommentTime19 Feb 2013 09:02
       
      hmm.. what is

      type source.bas | abc.exe?

      i run abc.exe and then?:)
      • 22:
         
        CommentAuthorpirx
      • CommentTime19 Feb 2013 09:02
       
      run cmd.exe first

      or

      drag the source file and drop it on abc_v0_2.exe
      • 23: CommentAuthorw1k
      • CommentTime19 Feb 2013 10:02 zmieniony
       
      thank you :)
    10.  
      @w1k
      You can also type your program directly into ABC window and press Ctrl+D (on Windows) when typing is finished.

      Like here:
      • 25:
         
        CommentAuthorjhusak
      • CommentTime19 Feb 2013 21:02 zmieniony
       
      @mgr_inz_rafal, jakbyś chciał gdzieś zahostować, to mógłbym pomóc z tym osx.

      A może fajna byłaby opcja wprowadzenia 4-bajtowych floatów - może szybciej by się na tym liczyło... Tylko trzeba by to pewnie zakodować.
    11.  
      Dzięki - na razie myślę, że obejdzie się bez hostowania. Jak projekt jeszcze trochę dojrzeje, to wtedy się odezwę.

      Odnośnie 4-bajtowych floatów - no cóż, na razie pomysł ten może jedynie wylądować na długiej liście tematów TODO :)
      • 27:
         
        CommentAuthorpirx
      • CommentTime20 Feb 2013 13:02
       
      Jestem przekonany, że wystarczy wziąć szybkie floaty i przełącznik int/float (np. tak, jak tebe wcześniej pisał - z % czy jakoś inaczej). Do gier wystarczy a obliczeń specjalnie się atarką wykonywać nie opłaca :)))))
      • 28:
         
        CommentAuthorjhusak
      • CommentTime20 Feb 2013 15:02
       
      Ale na razie shostuj prywatnie - zawsze to bezpieczniej.
    12.  
      Po przerwie przeznaczonej na przygotowanie do party wracam do tematu :)

      Zasiadłem do zagadnienia READ/DATA/RESTORE i mam pewną obserwację, którą chciałbym skonsultować.

      Każdy oprócz pierwszego elementu na liście DATA może zaczynać się od spacji. Pytanie, dlaczego pierwszy jest zawsze "trimowany" z lewej strony.

      Obrazowo (kropki zamiast spacji):
      10.DATA...A.,.B.,..C

      Spowoduje, że BASIC odczyta takie stringi:
      A.
      .B.
      ..C


      A spodziewałbym się albo trimowania wszędzie albo nigdzie, a nie tylko w pierwszym elemencie.

      Sprawa wydaje się dość jasna, ale jeśli ktoś może tutaj coś dodać, jakieś uzasadnienie takiego zachowania, to będę wdzięczny. Lepiej podrążyć temat teraz, niż później przepisywać kawał kodu od nowa - co już się zdarzało jak zasiadłem do stringów bez głębszej analizy :)
      • 30: CommentAuthorBluki
      • CommentTime9 Apr 2013 16:04
       
      Aby uzyskać "schludny" wygląd, kod programu jest justowany poprzez usunięcie zdublowanych spacji, o ile nie są w cudzysłowie.
      Ponieważ po numerze linii pierwsze polecenie jest drukowane zawsze z odstępem jednej spacji, to ich nadmiar jest automatycznie usuwany. Tak samo jest po słowie kluczowym, w tym przypadku NR_LINII - spacja - DATA - spacja - początek danych. Po przecinku są już tylko dane.
      • 31: CommentAuthormono
      • CommentTime9 Apr 2013 19:04 zmieniony
       
      Drobna uwaga na boku. Zawartość linii DATA jest dokładnie przepisywana do pamięci programu niezależnie od tego co się w nich znajdzie. Dzieje się tak dlatego, że podczas wprowadzania linii DATA nigdy nie wiadomo co będzie z nich czytane - czy liczba czy tekst. Można więc mieszać typy danych w DATA - osobne elementy zawsze separowane są przecinkiem. Pod względem składni DATA nie różni się od REM.

      Edit: Jeśli nie chcesz trimowania zastosuj mały trik:
      10 DATA , A,  B,   C ,
      20 READ N$,A$,B$,C$,N$
    13.  
      A czy można jakimś trikiem z DATA odczytać przecinek?
      • 33: CommentAuthorBluki
      • CommentTime9 Apr 2013 21:04 zmieniony
       
      1) Tak, w Advan BASIC-u i Microsoft BASIC-u :)

      2) A poważnie, wewnątrz ciągu tekstowego wykorzystać któryś z nieużywanych znaków, jeśli takie są. Po odczycie READ zrobić podmianę lub zdefiniować kształt przecinka w generatorze znaków dla tego znaku. Jeśli nie ma wolnych znaków...

      3) Użyj do przechowywania danych polecenia REM, ale odczyt danych już bezpośrednio z pamięci, po zlokalizowaniu położenia takiej linii.

      4) Aha, przypomniało mi się. Można użyć pustego zbioru do identyfikacji:
      1 DIM A$(10)
      10 DATA A,B,,C,D
      20 FOR T=1 TO 5
      30 READ A$:? A$,LEN(A$)
      40 NEXT T
      • 34: CommentAuthormono
      • CommentTime9 Apr 2013 23:04
       
      Trickiem się chyba nie da. Procedura READ w AB czyta dane za pomocą procedury INPUT :) a tam przecinek separuje kolejne dane.
      10 INPUT A
      20 INPUT B
      30 INPUT C

      Jeśli podasz:
      ?10,20,30

      to wszystkie inputy zostaną zaspokojone.
    14.  
      Ale ten sam trik już nie przejdzie, jeśli zastosujemy zmienną tekstową:
      10 DIM A$(15)
      20 INPUT A
      30 INPUT A$
      40 INPUT C

      RUN
      ?3,ZENEK,5
      ?


      Natomiast przy DATA zadziała dobrze:
      10 DIM A$(15)
      20 READ A
      30 READ A$
      40 READ C
      50 PRINT A,A$,C
      100 DATA 3,ZENEK,5


      Kurde, niby BASIC, a na tyle różnych pierdół trzeba uważać :)
      • 36: CommentAuthormono
      • CommentTime11 Apr 2013 14:04
       
      Bzdurę Ci napisałem - przepraszam. Zadziała taki trik:
      10 INPUT A,B,C
      20 ? A,B,C

      natomiast osobne inputy każą podać dane w osobnych liniach :/
      Człowiek całe życie się uczy.
    15.  
      Dobra, działa już READ - na razie tylko dla liczb.
      10 READ A:DATA 6,7,8,7,6,5
      20 IF A = 666 THEN GOTO 32767
      30 PRINT A:DATA 12345
      40 GOTO 10
      1000 DATA 1,8,123,432,21
      1010 DATA 6,7,3,2,4,5,6
      1020 DATA -34,666
      32767 PRINT "Ok!"


      Wynik:
      • 38: CommentAuthorBluki
      • CommentTime15 Apr 2013 16:04 zmieniony
       
      A takie liczby też trawi?
      10 DATA -1.2E05,1.54785763E+11,76468849843,-76468849843
    16.  
      Siur.
      .xex w załączniku.

      10 READ A:DATA -1.2E05,1.54785763E+11,76468849843,-76468849843
      20 IF A = 666 THEN GOTO 32767
      30 PRINT A:DATA 12345
      40 GOTO 10
      1000 DATA 1,8,123,432,21
      1010 DATA 6,7,3,2,4,5,6
      1020 DATA -34,666
      32767 PRINT "Ok!"


    17.  
      OK, i jeszcze stringi:
      5 DIM A$(10)
      10 READ A$:DATA -1.2E05,1.54785763E+11,76468849843,-76468849843
      20 IF A$ = "666" THEN GOTO 32767
      30 PRINT "A$ = ";CHR$(34);A$;CHR$(34):DATA 12345
      40 GOTO 10
      1000 DATA 1,8,123, spacja,432,21
      1010 DATA 6,7,3,2,4,5,6
      1020 DATA -34,666
      32767 PRINT "Ok!"





      Oraz tryb mieszany:
      5 DIM A$(11)
      10 READ A,A$,B
      20 PRINT A$;": ";A;", ";B
      30 DATA -3,Dwie liczby,67


      • 41: CommentAuthorw1k
      • CommentTime16 Apr 2013 11:04
       
      why old atari800win?
      we have altirra

      ->link<-
    18.  
      Personal preference, nothing special :)
    19.  
      No to jeszcze RESTORE i już więcej dziś nie spamuję :)
      10 FOR I=5 TO 1 STEP -1:DATA 5,55,555
      20 RESTORE I*10:DATA 4,44,444
      30 FOR J=1 TO 3:READ A:DATA 3,33,333
      40 PRINT A,:DATA 2,22,222
      50 NEXT J:? :DATA 1,11,111
      60 NEXT I
      70 PRINT 666


      Wynik:
      • 44: CommentAuthorw1k
      • CommentTime16 Apr 2013 21:04
       
      ah, ok :))
    20.  
      Jak najprościej zrobić w ASM polecenie "GRAPHICS"?
      • 46: CommentAuthorilmenit
      • CommentTime18 Apr 2013 11:04 zmieniony
       
    21.  
      To jakaś czarna magia, zwłaszcza procedura "newfd". Nie chciałbym tego używać nie wiedząc co się dzieje w środku, o ile w ogóle uda mi się wykorzystać ten fragment kodu.

      Spróbuję może "pożyczyć" kod bezpośrednio z BASICa.
      • 48: CommentAuthorxxl
      • CommentTime19 Apr 2013 10:04
       
      > Jak najprościej zrobić w ASM polecenie "GRAPHICS"?

      najprosciej? tak:

      lda #tryb_graficzny
      jsr $ef9c

      :D
    22.  

      xxl:

      pod warunkiem, ze masz OS wlaczony. ale jedno i drugie to zlo i szatan.
      Ponieważ nie jestem "szatanistą" poszukam innej drogi :)
      • 50: CommentAuthorxxl
      • CommentTime19 Apr 2013 10:04
       
      slusznie :-)