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
     
    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 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 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
     
    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
     
    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 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
     
    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!
    • 10:
       
      CommentAuthormgr_inz_rafal
    • CommentTime2 May 2013 zmieniony
     
    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
     
    [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
     
    Troszkę jednak inaczej działa. Po wyjściu poza ekran Atari Basic wyrzuca błąd 141 w linii 30, a skompilowany zawija.
    • 13:
       
      CommentAuthormgr_inz_rafal
    • CommentTime4 May 2013 zmieniony
     
    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"


    • 14:
       
      CommentAuthormgr_inz_rafal
    • CommentTime10 May 2013 zmieniony
     
    @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 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.
  3.  
    Dzięki very "mocz"! :)
    W sam raz do zabawy na weekend.
  4.  
    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
     
    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.
    • 19:
       
      CommentAuthormgr_inz_rafal
    • CommentTime11 May 2013 zmieniony
     
    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
     
    Aaargh. Przepraszam. ICPUTB ma adres $346 a nie $344.
    • 21:
       
      CommentAuthormgr_inz_rafal
    • CommentTime11 May 2013 zmieniony
     
    Ha, bingo!

    • 22:
       
      CommentAuthorIRATA4
    • CommentTime11 May 2013
     
    .............nic nie rozumiem np jakim cudem wyświetliłeś napis w 2 trybie z wyższ<ego ??????????????????????????
    • 23: CommentAuthormono
    • CommentTime11 May 2013
     
    Modyfikując display list.
    • 24:
       
      CommentAuthormgr_inz_rafal
    • CommentTime11 May 2013 zmieniony
     
    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
     
    Hahaha :) You welcome!
    Drobiazg drobiazg. Prawdziwy kod powstaje w tajemnicy :P
  5.  
    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
     
    Odnośnie pakietów matematycznych: ->link<-
    • 28: CommentAuthorilmenit
    • CommentTime26 Jun 2013
     
    Btw, a tu jest ciekawy wątek o szybkości Basiców:
    ->link<-
    • 29:
       
      CommentAuthormgr_inz_rafal
    • CommentTime22 Aug 2013 zmieniony
     
    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 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.
    • 31:
       
      CommentAuthormgr_inz_rafal
    • CommentTime30 Aug 2013 zmieniony
     
    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
     
    name already taken

    ->link<-

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

    pirxxx
    • 33:
       
      CommentAuthormgr_inz_rafal
    • CommentTime28 Mar 2014 zmieniony
     
    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
     
    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...
  6.  
    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
     
    Niestety nie pomaga(wciąż to samo) ale dziękuję za odpowiedź. Trzymam kciuki za nowy projekt.
    • 37: CommentAuthorzbyti
    • CommentTime27 Feb 2020 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
     
    Swoją drogą wątek wart lektury od początku! :D

    @mgr_inz_rafal & @mono - dobra robota! :]
  7.  
    Ależ necrobump :)
    Kurła, kiedyś to człowiek był mądry i robił fajne rzeczy :)