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:
         
        CommentAuthorMaW
      • CommentTime19 Apr 2013 10:04
       
      To teraz takie pytanie: czy była by możliwość, aby ABC działał "w tle" (np. z dodatkowej pamięci, czy też "pod" romem basica) i w momencie wykonania "RUN" przejmował działanie BASICa ?
    1.  
      ABC działa na PC, czyli raczej nie ma takiej możliwości.
      • 3:
         
        CommentAuthormgr_inz_rafal
      • CommentTime25 Apr 2013 15:04 zmieniony
       
      OK, ponieważ nie umiem na razie zaimplementować GRAPHICS poszedłem innym branchem :)

      Na dzisiaj GOSUB/RETURN i POP.
      10 GOSUB 100
      20 PRINT "MAIN"
      30 GOSUB 300
      40 GOSUB 500
      50 GOTO 30000
      100 PRINT "SUB 1"
      110 GOSUB 200
      120 RETURN
      200 PRINT "SUB 1.1"
      210 RETURN
      300 PRINT "SUB 2"
      310 RETURN
      500 GOSUB 600
      510 PRINT "UNREACHABLE"
      600 PRINT "POP"
      610 POP
      620 RETURN
      30000 PRINT "OK!"


      Efekt:
      • 4: CommentAuthormono
      • CommentTime25 Apr 2013 17:04 zmieniony
       
      graphics .A:
      graphics:
      pha
      ldx #$60 ;#6
      lda #12 ;close
      sta iccmd,x
      jsr jciomain ;$e456
      lda #3 ;open
      sta iccmd,x
      pla
      sta icax2,x
      and #$f0
      eor #$1c
      sta icax1,x
      lda #<sname
      sta icbufa,x
      lda #>sname
      sta icbufa+1,x
      jsr jciomain
      bmi err
      rts
      sname .db 'S:',$9b

      Tak to robi AtariBASIC. Parametrem dla graphics może być dowolna zmienna numeryczna.

      Edit: lub też stała.
      • 5: CommentAuthormono
      • CommentTime25 Apr 2013 17:04
       
      A co się stanie, jak za dużo razy dasz RETURN?
    2.  
      @mono
      Dzięki za graphics!

      Jeśli chodzi o RETURN to nie mam żadnego pilnowania, po prostu ściągną się dwa bajty ze stosu, zostaną zmniejszone o 1 i wykona się RTS.

      Sprawdzeń ogólnie nigdzie nie mam :) Jak np. zrobisz GOTO do nieistniejącej linii to algorytm będzie jej szukał, aż się gdzieś zapętli. Jak utworzysz za dużo zmiennych lub za długi string, to pewnie efektem będzie SELF TEST :)

      Na tego typu ochronę przyjdzie czas na końcu - póki co zakładam, że w pierwszej wersji ABC posłuży do kompilowania sprawdzonych wcześniej w BASICu programów.
      • 7:
         
        CommentAuthorwilly
      • CommentTime25 Apr 2013 20:04
       
      Nie wydaje mi się żeby było konieczne sprawdzanie ilość RETURN'ów. To jest kompilator, i służy raczej do kompilowania sprawdzonego kodu. Jego poprawność leży w gestii programisty.
      Jak w Basicu będzie za dużo RETURN to wywala błąd jakiśtam nie pamiętam jaki. Wiec kompilowany kod też ma prawo się wykrzaczyć. A że zrobi to w inny sposób to już inna bajka. Ew można zrobić osobny stos.
      • 8: CommentAuthormono
      • CommentTime25 Apr 2013 22:04 zmieniony
       
      @mgr_inz_rafal: nie ma za co :)
      Stos w AB nie ma ograniczeń innych niż pamięć. Można np. zrobić rekurencję
      10 GOSUB 20:? A:END
      20 A=A+1:IF A<1000 THEN GOSUB 20
      30 RETURN

      Trochę ciężko będzie to osiągnąć ze stosem sprzętowym. Inna sprawa, że przykład jest oczywiście akademicki, bo kto przy zdrowych zmysłach robi TAKĄ rekurencję.
      Kwestia decyzji.

      Edit: Oczywiście do większości programów wystarczy stos sprzętowy. No i będzie zdecydowanie szybszy.
      • 9: CommentAuthorrudla
      • CommentTime26 Apr 2013 08:04
       
      I don't think, it is necessary to check procedure stack underflow in compiler, but if you want to do it, just push address of error reporting routine to stack at the beginning of your program.

      Excess return will then 'return' to this procedure and voila!
    3.  
      Wersja prosto z party. Wsparcie dla GRAPHICS :)

      Obrazek i .xex w załączniku.
      10 GRAPHICS 2
      15 PRINT "Wpisz cyferke: ";
      20 INPUT A
      30 PRINT #2*3;"wpisales ";A
      40 GOTO 15


      • 11:
         
        CommentAuthorMaW
      • CommentTime3 May 2013 11:05
       
      [offtop=jak zobaczyłem post powyżej]
      ForumAtarum trzeba wyposażyć w możliwość "lajkowania" postów - i to bez dwóch zdań!
      [/offtop]
      • 12:
         
        CommentAuthorjhusak
      • CommentTime3 May 2013 23:05
       
      Troszkę jednak inaczej działa. Po wyjściu poza ekran Atari Basic wyrzuca błąd 141 w linii 30, a skompilowany zawija.
    4.  
      A jeszcze przed kompotami wersja z PEEK i POKE :)
      10 POKE 709,1:POKE 712,100
      20 POKE 710,15
      30 PRINT PEEK(709)+PEEK(710)
      40 DL=PEEK(560) + 256*PEEK(561)
      50 PRINT DL
      60 POKE DL + 10,7
      70 PRINT "kiedy"
      80 PRINT "rolnik"
      90 PRINT "pole"
      100 PRINT "OrZe!"
      110 PRINT "TO NIE PATRZY SIE NA MORZE"


    5.  
      @mono,
      Czy można prosić o informacje na temat PLOT i DRAWTO? Oraz odnośnie tego szybkiego pakietu FP, o którym wspominałeś na zlocie?
      • 15: CommentAuthormono
      • CommentTime10 May 2013 14:05 zmieniony
       
      Pakietów jest kilka. FastChip Charlesa Marsletta i jeszcze ten, co jest używany w turbo basicu xl.
      Tu jest FP z atariki: ->link<- i tam masz linka do fp Marsletta.
      Plot i drawto wieczorem :)

      Edit: No to jedziemy:
      ;SETCOLOR Y,A,X
      setcolor:
      stx ?luma
      asl
      asl
      asl
      asl
      ora ?luma
      sta COLPF0S,y ;$2c4+y

      SETCOLOR niestety pozwala ustawić tylko kolory COLPFxS, a więc playfieldy, oraz COLBAKS (tło lub ramka zależnie od używanego trybu graficznego) - sprajty muszą być ustawiane pokami. Podanie indeksu koloru >4 kończy się błędem.

      ;COLOR A
      color:
      sta COLOR ;$c8

      Wybiera kolor do operacji graficznych. $C8 to zmienna BASICA a nie OSa (S:).

      ;POSITION YX,A
      position:
      stx COLCRS ;$55
      sty COLCRS+1
      sta ROWCRS ;$54

      Ustawia kursor graficzny na pozycji X,Y - jest wykorzystywane np. przez PLOT. To są z kolei rejestry sterownika S:.

      ;PLOT YX,A
      plot:
      jsr position
      ldx #$60
      lda ICAX1,x ;$34a+x
      sta ICAX1Z ;$2a
      lda ICAX2,x ;$34b+x
      sta ICAX2Z ;$2b
      lda ICPUTB+1,x ;$347+x
      pha
      lda ICPUTB,x ;$346+x
      pha
      lda COLOR ;$c8
      ldy #$92
      rts ;JMP (ICPUTB)+1

      Procedura nie uzupełnia całego bloku ZIOCB bo pewnie bazuje na wartościach, które wcześniej zostawia tam GRAPHICS (CIO przepisuje odpowiedni IOCB do ZIOCB). Tutaj wywoływany jest zwykły PUTCH, ale ręcznie (nie wiem po co - może żeby było szybko?).
      Po zakończeniu CIO oczywiście sprawdzany jest status operacji (tya; bmi ?err).

      ;DRAWTO YX,A
      drawto:
      jsr position
      lda COLOR ;$c8
      sta ATACHR ;$2fb
      ldx #$60
      lda #17
      sta ICCMD,x ;$342+x
      lda #$c0
      sta ICAX1,x ;$34a+x
      lda #0
      sta ICAX2,x ;$34b+x
      jsr JCIOMAIN ;$e456

      ATACHR to rejestr sterownika S:. Po powrocie oczywiście też sprawdzany jest status (bmi ?err).

      ;LOCATE YX,A,A
      locate:
      jsr position
      ldx #$60
      lda #7 ;GETBT
      sta ICCMD,x
      lda #1
      sta ICBUFL,x ;$348+x
      lda #0
      sta ICBUFL+1,x
      lda INBUFP ;$f3
      sta ICBUFA,x ;$344+x
      lda INBUFP+1
      sta ICBUFA+1,x
      jsr JCIOMAIN
      bmi ?err
      ldy #0
      lda (INBUFP),y

      W A znajduje się wynik. INBUFP jest zmienną BASICa i zawiera adres LBUF580 ($580). Nie rozumiem czemu do operacji wykorzystany jest bufor LBUF580, skoro ustawienie ICBUFL=0 powinno zrealizować operację identycznie, lecz bez jego pośrednictwa - czyli:
      locate:
      jsr position
      ldx #$60
      lda #7 ;GETBT
      sta ICCMD,x
      lda #0
      sta ICBUFL,x ;$348+x
      sta ICBUFL+1,x
      jsr JCIOMAIN


      Do kompletu operacji na grafice brakuje Ci tylko chyba operacji XIO, za pomocą której to realizuje się czasem wypełnianie obszarów (rozkaz 18 S: ->link<- ).
      ;XIO A,#X,aux1,aux2,"S:"
      xio:
      sta ICCMD,x
      lda #<sname
      sta ICBUFA,x
      lda #>sname
      sta ICBUFA+1,x
      lda aux1
      sta ICAUX1,x
      lda aux2
      sta ICAUX2,x
      jsr JCIOMAIN
      sname .db "S:",$9b

      X oczywiście zawiera #*16.

      Edit 2: Poprawione błędy zauważone przez magistra niżej.
    6.  
      Dzięki very "mocz"! :)
      W sam raz do zabawy na weekend.
    7.  
      Niestety, na razie poległem już na PLOT...

      GR. 4 wskakuje dobrze, ustawiam kolor i robię "PLOT 9,11"
      .
      ldy #<9
      ldx #>9
      lda #11
      jsr plot
      .

      Następujący kod
      .
      lda ICPUTB,x ;$344+x
      pha
      lda ICPUTB+1,x
      pha
      wrzuca na stos adres $48c4 i rts skacze w maliny.

      Mam kilka pytań:
      1. Co robię źle? :)
      2. Czy dobrze rozumiem, że procedura, do której skaczę powyższym rts-em ma na końcu swój rts, który przeniesie sterowanie z powrotem do mojego kodu?
      3. Jaki jest sens poniższego kodu? Wydaje mi się, że lda #$60 jest niepotrzebne
      .
      lda #$60
      lda ICAX1,x ;$34a+x
      • 18: CommentAuthormono
      • CommentTime11 May 2013 18:05
       
      POSITION, PLOT, DRAWTO, LOCATE - współrzędna x:Y-MSB,X-LSB.
      Skok przez stos - pomyliłem kolejność :)
      lda #$60 pomyłka - powinno być ldx.
      Skok przez stos działa jak jmp.
    8.  
      Niestety, dalej coś nie trybi :(

      mono:

      współrzędna x:Y-MSB,X-LSB
      OK, zmieniłem na
      .
      ldx #<9
      ldy #>9
      lda #11


      Poprawiłem kod procedury PLOT i rts znowu leci w maliny... To znaczy trafia w dwukropek z tego stringa:
      sname .db 'S:',$9b
      Wygląda, jakby "pha,pha" wrzucało na stos "prawie" bieżącą wartość PC :)



      Skok przez stos działa jak jmp
      Kurde :) No przecież sam to stosuję do obsługi GOTO... Sory :)
      • 20: CommentAuthormono
      • CommentTime11 May 2013 20:05
       
      Aaargh. Przepraszam. ICPUTB ma adres $346 a nie $344.
    9.  
      Ha, bingo!

      • 22:
         
        CommentAuthorCOR/ira4
      • CommentTime11 May 2013 20:05
       
      .............nic nie rozumiem np jakim cudem wyświetliłeś napis w 2 trybie z wyższ<ego ??????????????????????????
      • 23: CommentAuthormono
      • CommentTime11 May 2013 20:05
       
      Modyfikując display list.
    10.  
      Dzięki nieocenionej pomocy mono możemy już skompilować kolejny fragment Biednego Psa Antoniego, a mianowicie obrazek końcowy.

      Przyspieszenie działania na oko dwukrotne, mimo korzystania z systemowych PLOT i DRAWTO. Widać to na obrazku (po prawej stronie BASIC, po lewej w Altirze po kompilacji).

      Załączam źródło oraz .xex i idę na zasłużone piwo :) Mono, na następny zlot jadę z krzynką dla Ciebie ;)

      • 25: CommentAuthormono
      • CommentTime11 May 2013 22:05
       
      Hahaha :) You welcome!
      Drobiazg drobiazg. Prawdziwy kod powstaje w tajemnicy :P
    11.  
      W załączniku najnowsza wersja kompilatora.

      Główne zmiany to wsparcie dla:
      - READ/DATA/RESTORE
      - GOSUB/RETURN/POP
      - GRAPHICS
      - PEEK/POKE
      - PLOT/DRAWTO/COLOR/POSITION
      - SETCOLOR
      - SOUND

      Dodałem też nowe przykłady:

      biedny_pies_antoni_final_gfx - skompilowany obrazek i "melodyjka" z zakończenia gry Biedny Pies Antoni

      program_melodyjka - znany z książki "Atari Basic" program odgrywający melodyjkę

      rainbow - krótki "peek/poke" próbujący zrobić tęczę w BASIC (przykład mono z innego wątku)
      • 27: CommentAuthormono
      • CommentTime26 Jun 2013 14:06
       
      Odnośnie pakietów matematycznych: ->link<-
      • 28: CommentAuthorilmenit
      • CommentTime26 Jun 2013 17:06
       
      Btw, a tu jest ciekawy wątek o szybkości Basiców:
      ->link<-
    12.  
      Po dłuższej przerwie związanej z pracą nad czymś innym przedstawiam kolejną wersję kompilatora. Główna widoczna zmiana to obsługa dżojstików oraz ADR(), ale ważniejsze są te mniej widoczne, czyli wyeliminowana cała masa bugów związanych głównie z obsługą stringów.

      Do paczki dodałem też parę nowych przykładów, w tym nową grę: DZIURA-DEFENCE :)



      ------------
      Edit: I jeszcze zapis wideofoniczny:

      ------------


      Niestety, są pewne problemy z kompilowaniem atarowych krzaków, które czasami wykorzystuje się w USR(ADR(<tu krzaki>)). Na razie nie znalazłem sposobu, aby Bison dobrze to sparsował, ale jeszcze szukam... :)
      • 30: CommentAuthormono
      • CommentTime30 Aug 2013 16:08 zmieniony
       
      Z ciągami tekstowymi w BASICu problemy są 2:
      1. Kod EOL = 155.
      2. Nie ma escapowania znaków cudzysłowu = 34.
      Można w programach pisanych na pc używać konwencji:
      10 A$="dupablada"
      20 A$(10)=CHR$(155)
      30 A$(11)="innadupa"
      40 A$(19)=CHR$(13)
      50 A$(20)=CHR$(10)
      60 A$(21)=CHR$(34)

      To zadziała zarówno na pc, jak i na ATARI. Gorzej z programami pisanymi na ATARI, a przeniesionymi na pc gdzie nikt nie przejmował się kodami 10 i 13.
      Może da się bizonowi powiedzieć jak wygląda EOL i specyfikować go w ABC?

      Drobna uwaga na boku: iconv z moją łatą nie nadaje się do konwersji semigrafiki, bo nie konwertuje wszystkiego, dzięki czemu część informacji może zostać utracona (zakładałem maksymalną czytelność dokumentów tekstowych).

      Edit:
      Lepiej zrobić chyba:
      $ tr "\n\233" "\233\n"

      a resztę zostawić w spokoju.
    13.  
      Z problemem numer jeden walczyłem już podczas pisania Biednego Psa Antoniego na PC, stąd też kod musiał mieć "patche" w postaci CHR$(), np. takie:
      90 V$="<atarowe krzaki>"
      91 V$(2,2)=CHR$(0):V$(51,51)=CHR$(0):V$(120,120)=CHR$(13)
      93 Q=USR(ADR(V$))


      Nie znalazłem metody, aby Bisona przekonać do poprawnego parsowania, choć przyznaję, że nie szukałem zbyt dokładnie, a to dlatego, że po głowie i tak chodzi mi preprocessor (dodatkowy przebieg kompilacji), który mógłby pomóc rozwiązać ten problem (i przy okazji inne, które najłatwiej rozwiązać wstępną obróbką kodu, np. deklaracja zmiennych liczbowych, której BASIC nie wymaga, a która bardzo ułatwia kompilację).
      • 32:
         
        CommentAuthorpirx
      • CommentTime28 Mar 2014 10:03
       
      name already taken

      ->link<-

      + wygrzebanie z przeszłości wątku. Tak! Pamiętamy :)

      pirxxx
    14.  
      Tez sie na to wczoraj natknalem... W takim razie ja biere "ĄBC" :)

      A sam compilator na razie na polce, ale jak ostatnio do niego zajrzalem, to hmm... no napisalbym najchetniej od nowa :)
      • 34: CommentAuthorpgru
      • CommentTime19 Dec 2017 20:12
       
      Hmm mam z nim problem a korzystam z wersji Linuxowej.
      Dla przykładu próbowałem skompilować prosty program:
      10 PRINT "CZESC"
      20 DIM A$(1)
      30 PRINT "WPISZ A"
      40 INPUT A$
      50 IF A$="A" THEN GOTO 80
      60 PRINT "TO NIE A"
      70 GOTO 40
      80 PRINT "DZIEKUJE"
      90 END
      który działa bez problemu pod emulatorem. Natomiast ABC wyświetla info o wersji i:
      Now compiling...
      Spawning number: "0" at location $700... DONE!
      Spawning number: "1" at location $706... DONE!

      Potem niby coś robi, ale kompiluje już 20 minut :-( co chyba trochę za długo na kilkurdzeniowej maszynie. Przerwanie ctrl+c i użycie z mads-em pliku wynikowego ABC synth.asm(w terminalu './mads synth.asm') daje błędy kompilacji i plik synth.lst...
    15.  
      Hej,
      Tego projektu już niestety nie wspieram; utknął on w ślepej uliczce bo zabrałem się do niego zbyt wcześnie, zanim na dobre przypomniałem sobie BASICa :)

      Jestem zaskoczony, że ktoś tego użył :)

      Nie potrafię przeanalizować problemu, bo nie mam już nawet środowiska, w którym tworzyłem tego potworka. Tak na szybko spróbowałbym zamienić kolejność linii 10 i 20... Jak przez mgłę kojarzę, że w przypadku kompilacji DIMy powinny być zadeklarowane na samym początku programu, ale głowy nie dam...

      Ten projekt ma swojego następcę:
      ->link<-

      Ta wersja jest bardziej zacna, otestowana, itepe., ale nie obsługuje jeszcze wielu rzeczy, m. in. potrzebnych Tobie stringów. No i na razie development też jakby przycichł...
      • 36: CommentAuthorpgru
      • CommentTime20 Dec 2017 12:12
       
      Niestety nie pomaga(wciąż to samo) ale dziękuję za odpowiedź. Trzymam kciuki za nowy projekt.
      • 37: CommentAuthorzbyti
      • CommentTime27 Feb 2020 11:02 zmieniony
       
      Na AOL nie ma poprawnie działającego kompilatora to wrzucam :]

      Ale to chyba zbieżność nazw z wątkiem ;) Tutaj wrzuciłem ABC firmy Monarch.

      Chodzi mi, że tego Monarcha nie ma na AOL działającego poprawnie.
      • 38: CommentAuthorzbyti
      • CommentTime27 Feb 2020 15:02
       
      Swoją drogą wątek wart lektury od początku! :D

      @mgr_inz_rafal & @mono - dobra robota! :]
    16.  
      Ależ necrobump :)
      Kurła, kiedyś to człowiek był mądry i robił fajne rzeczy :)
      • 40:
         
        CommentAuthorKaz
      • CommentTime28 Dec 2021 14:12
       
      Pytanie Rafał, czy człowiek jeszcze będzie kontynuował ten projekt? :D
    17.  
      Nope, nie przewiduję niestety kontynuacji.
      Poszedłem w czysty gamedev :)
      • 42:
         
        CommentAuthorPeri Noid
      • CommentTime29 Dec 2021 00:12
       
      Korci mnie, żeby dać to studentom jako projekt. Tylko musiałbym mieć sensowną gramatykę. Zastanowię się.
      • 43:
         
        CommentAuthorKaz
      • CommentTime29 Dec 2021 12:12
       
      O! To jest myśl. Studenci się ucieszą "prostym" zadaniem, a i społeczność będzie zadowolona, bo naprawdę taki kompilator by się przydał. Jeśli projekt byłby otwarty, to zapewne rozwijałby się również poza uczelnią.
      • 44:
         
        CommentAuthorPeri Noid
      • CommentTime29 Dec 2021 14:12
       
      Aż tak dobrych i/lub chętnych studentów to nie mam :-(
      • 45: CommentAuthorbob_er
      • CommentTime29 Dec 2021 23:12
       
      W sumie - jakby to rozciągnąć na kilka lat: pierwszy rok (grupa) definiuje gramatykę, drugi rok (kolejna grupa) buduje AST, kolejne by robiły optymalizacje i finalnie - generowanie binarki to masz temat kompilatorów załatwiony dla kilku roczników :).

      btw: z ciekawości - jak formalnie wygląda proces wypuszczania na licencji otwartej (GPL/BSD/...) projektu, który był robiony przez stundetów na zajęciach i/lub zaliczenie?
    18.  
      Gramatykę TurboBasica zrobiłem tu:
      ->link<-

      Na pewno sporo jej jeszcze brakuje, ale z drugiej strony Basic jest na tyle Basic, że kompleksowe jej ogarnięcie to raczej 2 tygodnie dla jednego studenta niż rok dla grupy :)

      I moim zdaniem warto generować asm, z którego binarkę zrobi nam mads czy inny ulubiony assembler ;-)

      Tak czy inaczej, trzymam kciuki. Tylko trzeba się spieszyć, bo wpadnie TeBe, zrobi MadBasic i po ptakach :D

      Odnośnie praw autorskich dla studentów to niestety się nie wypowiem.
      • 47: CommentAuthortebe
      • CommentTime30 Dec 2021 11:12
       
      DMSC już to zrobił
      • 48: CommentAuthorilmenit
      • CommentTime30 Dec 2021 22:12
       
      FastBasic od DMSC do XEXa wkompilowuje interpreter + bytecode typu:
      .byte	TOK_VAR_LOAD
      .byte 2
      .byte TOK_ADD_VAR
      .byte 7
      .byte TOK_SADDR
      .byte TOK_1
      .byte TOK_POKE

      Na Atari wciąż brakuje kompilatora w stylu ->link<-
      Zamiast robić kolejny optymalizujący kompilator pewnie lepiej byłoby generować kod w C (dla CC65, KickC czy nowego LLVM-MOS) lub w Pascalu (dla MadPascala jak Effectus).
      • 49: CommentAuthorbob_er
      • CommentTime30 Dec 2021 23:12
       
      Może prościej by było dodać Basicowy frontend do LLVM?
      • 50: CommentAuthorilmenit
      • CommentTime31 Dec 2021 00:12
       
      dodać cokolwiek do LLVM to przeciwieństwo "prościej" ;)