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
     
    @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
     
    Tak.
    • 4:
       
      CommentAuthormgr_inz_rafal
    • CommentTime14 Feb 2013 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
     
    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 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 zmieniony
     
    wersja 0.2. Dziękujemy!
    • 10: CommentAuthorw1k
    • CommentTime17 Feb 2013
     
    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
     
    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 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
     
    Tak, teraz już wszyscy w świecie Atari wiedzą, że jesteś Kimś :)
    • 19: CommentAuthortebe
    • CommentTime19 Feb 2013
     
    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
     
    hmm.. what is

    type source.bas | abc.exe?

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

    or

    drag the source file and drop it on abc_v0_2.exe
    • 23: CommentAuthorw1k
    • CommentTime19 Feb 2013 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 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
     
    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
     
    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
     
    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 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 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
     
    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
     
    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.
    • 37:
       
      CommentAuthormgr_inz_rafal
    • CommentTime15 Apr 2013 zmieniony
     
    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 zmieniony
     
    A takie liczby też trawi?
    10 DATA -1.2E05,1.54785763E+11,76468849843,-76468849843
    • 39:
       
      CommentAuthormgr_inz_rafal
    • CommentTime16 Apr 2013 zmieniony
     
    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!"


    • 40:
       
      CommentAuthormgr_inz_rafal
    • CommentTime16 Apr 2013 zmieniony
     
    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
     
    why old atari800win?
    we have altirra

    ->link<-
  15.  
    Personal preference, nothing special :)
    • 43:
       
      CommentAuthormgr_inz_rafal
    • CommentTime16 Apr 2013 zmieniony
     
    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
     
    ah, ok :))
  16.  
    Jak najprościej zrobić w ASM polecenie "GRAPHICS"?
    • 46: CommentAuthorilmenit
    • CommentTime18 Apr 2013 zmieniony
     
    • 47:
       
      CommentAuthormgr_inz_rafal
    • CommentTime19 Apr 2013 zmieniony
     
    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
     
    > Jak najprościej zrobić w ASM polecenie "GRAPHICS"?

    najprosciej? tak:

    lda #tryb_graficzny
    jsr $ef9c

    :D
  17.  

    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
     
    slusznie :-)