atarionline.pl Mad Pascal 1.6.6 i problem z kompilacją - 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: CommentAuthorwojtas76
    • CommentTime15 Jan 2023
     
    Witam
    Postanowiłem zmienić na nowszą wersję(wcześniejsza 1.6.3) no i zaczęły się problemy z kompilacją programów np z katalogu samples:

    /a8/graph_pmg/pmtest.pas

    .local +MAIN.SYSTEM.FILLCHAR_0086
    pmtest.a65 (840) ERROR: Extra characters on line
    ---------
    /a8/graph/canvas

    .local +MAIN.SYSTEM.MOVE_0088
    txtout.a65 (1976) ERROR: Extra characters on line
    ---------

    itp. itd. najczęściej ".local +MAIN.SYSTEM."

    No i podczas kompilacji mojego "projektu":

    Mad-Pascal-1.6.6_/lib/s2.pas (345,20) Error: Incompatible types: got "Array[0..0] Of BYTE" expected "POINTER"

    Wcześnie nie miałem powyższych problemów...
    MP kompilowałem: fpc -Mdelphi -v -O3 mp.pas

    Kompilacja pod mp:
    mp $1.pas
    ..mads_208/mads $1.a65 -x -i:..Mad-Pascal-1.6.6_/base -o:$1.xex
    • 2: CommentAuthortebe
    • CommentTime15 Jan 2023 zmieniony
     
    Mad Assembler nowszy jest potrzebny

    ->link<-

    aktualne przykłady z poprawkami są tutaj

    ->link<-
    • 3: CommentAuthorwojtas76
    • CommentTime17 Jan 2023
     
    Ok zgadza się, ale też trochę mojej niekonsekwencji przy typach danych... Przy wcześniejszej wersji mp nie zwracał na to uwagi..

    Bynajmniej np:

    Line (x0+12*szer-2,ypos+1,x0+12*szer-2,ypos+6*8+3)
    wywołuje Error: Can't determine which overloaded function 'LINE' to call
    Ruszy po użyciu dodatkowych zmiennych x1:=x0+12*szer-2,y1:=...x2:=... y2:= .... Line(x1,y1,x2,y2)
    ale Rectangle działa bez dodatkowych zmiennych

    no i s2 przy VBXE
    Error: Incompatible types: got STRING expected "^BYTE"

    SetGraphMode(4);
    ...
    TextOut(0,0,'aaa');

    w moim.. i np. MadPascal/samples/a8/graph_vbxe_s2/hires.pas
    • 4: CommentAuthortebe
    • CommentTime17 Jan 2023
     
    uaktualniłem unit S2

    ->link<-
    • 5: CommentAuthorwojtas76
    • CommentTime18 Jan 2023
     
    ok dzięki pomogło

    Natomiast po do dodaniu tablicy TAB: array [0..117, 0..18] of string = ...) kompilator wysypuje:
    325 lines compiled, 1.83 sec, 25251 tokens, 1915 idents, 572 blocks, 17 types
    2 warning(s) issued
    7 note(s) issued
    ert 'Invalid memory address range ',VADR
    ZPAGE: $0080..$00D3
    RTBUF: $0400..$04FF
    RTLIB: $3BE3..$3DF9
    PRGmin.a65 (131) ERROR: Invalid memory address range $0450C5

    Tablica jest może duża (?) ale po zmniejszeniu na 18x18:

    224 lines compiled, 1.80 sec, 21251 tokens, 1915 idents, 572 blocks, 17 types
    2 warning(s) issued
    7 note(s) issued
    ert 'Invalid memory address range ',VADR
    ZPAGE: $0080..$00D3
    RTBUF: $0400..$04FF
    RTLIB: $25EC..$2802
    PRGmin.a65 (131) ERROR: Invalid memory address range $013D57

    Stopniowo uzupełniam projekt o kolejne elementy aby ruszył z nowym mp.. a na tą chwilę nie przeniosłem m.in. spritów, modyfikacji zestawów znaków itp. itd. Więc programik jeszcze za bardzo się nie rozrósł...
    • 6: CommentAuthortebe
    • CommentTime18 Jan 2023
     
    TAB: array [0..117, 0..18] of string

    trochę przesadziłeś z tą tablicą, string domyślnie to 256 bajtów, więc przekroczyłeś rozmiar dostępnej pamięci 64 KB

    ogranicz STRING, na pewno potrzebujesz stringów po 255 znaków (+1 bajt długości)
    • 7:
       
      CommentAuthorBca
    • CommentTime7 May 2023 zmieniony
     
    I znów chwale się, a właściwie to nie ja - ja chcę chwalić specjalistów.
    Chciałem napisać "Hello world" w MP-pascalu i udało się ...

    Bez pomocy MrCin oraz Mono i Cypriana nie doszedłbym.

    I finalnie wyszło tak, że to oni migają profesjonalnie:

    PROGRAM

    uses atari,crt;

    var
    i:byte register;
    _vcount:byte absolute $d40b;
    begin
    writeln('Chalupy welcome to'*);

    repeat
    for i := 0 to 250 do
    begin
    wsync := i;
    colpf2 := i;
    end;
    until keypressed;

    end.
    • 8: CommentAuthortebe
    • CommentTime7 May 2023
     
    można też tak

    uses atari,crt;

    var
    i:byte register;
    a: word;
    _vcount:byte absolute $d40b;
    begin
    writeln('Chalupy welcome to'*);

    repeat

    wsync := 0;

    for i := 201 downto 0 do
    begin
    colpf2 := _vcount + hi(a);
    end;

    inc(a, trunc(0.25*256));

    until keypressed;

    end.
    • 9:
       
      CommentAuthorMaW
    • CommentTime7 May 2023
     
    Eeee... o_O ... ale to jest wolniejsze niż nasze ;)

    Chodziło nam o to, żeby zobaczyć, ile razy na znak bez użycia DLI MadPascal będzie w stanie zmienić kolor linii.

    //EDIT: no i problemów z kompilacją nie było ;-)
    • 10: CommentAuthormono
    • CommentTime7 May 2023 zmieniony
     
    Tak, chodziło nam o to jak optymalizator zrobi kod.
    Szczególnie ciekawe jest że:
    uses atari
    ...
    var
    i:byte register;
    ...
    wsync := i;
    colpf2 := i;

    kompiluje się do:
    I = $E0
    ..
    lda I
    sta atari.wsync
    sta atari.colpf2

    dlatego że zmienna i nie jest volatile, więc kompilator zoptymalizuje jej odczyty.
    A to jest niewykonalne n.p. w Action.
    Szkoda, że nie ma jak w C
    colpf2 := wsync := i;

    ale to w końcu tylko syntactic-sugar.

    Edit: ...i dla niewprawnego oka nawet dość mylący. Więc może i lepiej, że tego nie ma i nie szkoda wcale.
    • 11:
       
      CommentAuthorMq
    • CommentTime7 May 2023
     
    A co robi dyrektywa "register" przy deklaracji zmiennej byte? Czy dobrze myślę, że umieszcza nam zmienną na stronie zerowej? Jeśli tak, to było by chyba dla mnie bardzo przydatne, bo ja mam szereg zmiennych na stronie zerowej i ręcznie szukałem im adresów i je sobie tam układałem i cały czas pilnuję/szukam co jest jeszcze wolne na stronie zerowej. Czy dobrze myślę, że użycie takich dyrektyw przy zmiennych załatwi mi z automatu tą kwestię i nigdy więcej nie będę musiał się przejmować wyszukiwaniem wolnych adresów na stronie zerowej? Czy jeżeli jest jak myślę, to kompilator dba o to, żeby np. uwzględnić adresy używane przez jakieś tam biblioteki, np. odtwarzacza do rmt itp?
    • 12:
       
      CommentAuthorMaW
    • CommentTime7 May 2023 zmieniony
     
    Tak, register umieszcza zmienną na tronie zerowej, ale ograniczenie jest tylko do kilku parametrów:

    https://mads.atari8.info/doc/madpascal.html:

    REGISTER
    Użycie modyfikatora REGISTER spowoduje że trzy pierwsze parametry formalne procedury/funkcji będą umieszczone na stronie zerowej, w 32-bitowych rejestrach programowych, odpowiednio EDX, ECX, EAX.
    procedure nazwa (a,b,c: cardinal); register;
    // a = edx
    // b = ecx
    // c = eax


    ->link<-
    • 13: CommentAuthormono
    • CommentTime7 May 2023 zmieniony
     
    @MaW: To jest opis modyfikatora przy parametrach przekazywanych do funkcji/procedury.

    Tu jest opis modyfikatora register przy deklarowaniu zmiennych w sekcji var: ->link<-

    Edit: Dokumentacja w jednym pliku linkowana przez MaW-a jest stara.
    • 14:
       
      CommentAuthorMq
    • CommentTime7 May 2023
     
    Dzięki wielkie, jakoś to przeoczyłem i nie używałem, a się przyda:-)
    • 15: CommentAuthortebe
    • CommentTime8 May 2023 zmieniony
     
    REGISTER dla zmiennych

    ->link<-
    • 16:
       
      CommentAuthorjhusak
    • CommentTime8 May 2023 zmieniony
     
    @tebe, czy mógłbyś rozwinąć:

    UWAGA:
    Z tego samego obszaru 16 bajtów strony zerowej korzysta kompilator alokując tam swoje programowe rejestry EDX ECX EAX dlatego użycie modyfikatora REGISTER nie jest możliwe kiedy procedura lub funkcja też używa REGISTER.


    Czym głębiej się wczytuję, bym mniej to widzę (dużo możliwości rozumienia).

    Z poprzednich maili widzę, że to runtime korzysta z tego obszaru przy wywoływaniu funkcji w przypadku użycia w niej modyfikatora REGISTER.
    • 17: CommentAuthortebe
    • CommentTime8 May 2023 zmieniony
     
    bp .ds 2
    bp2 .ds 2

    eax .ds 4 ;8 bytes (aex + edx) -> divREAL
    edx .ds 4
    ecx .ds 4

    TMP
    ztmp
    ztmp8 .ds 1
    ztmp9 .ds 1
    ztmp10 .ds 1
    ztmp11 .ds 1

    STACKORIGIN .ds STACKWIDTH*4

    przydzielana jest pamięć na stronie zerowej wstecz, od STACKORIGIN (ZTMP, ECX, EDX, EAX, czyli 4x4 = 16 bajtów)

    czyli jeśli mamy

    var tmp: byte register;

    to jego adres będzie STACKORIGIN-1

    ZTMP8..11 są najrzadziej używane, chyba że często będziemy liczyć resztę z dzielenia (MOD) wtedy są używane

    ECX, AEX podczas mnożenia, dzielenia są wykorzystywane
    • 18:
       
      CommentAuthorBca
    • CommentTime9 May 2023 zmieniony
     
    ATARI 8bit
    MP ma liczby float/real 32/16bit? specjalne?
    (uczę się)
    • 19: CommentAuthortebe
    • CommentTime9 May 2023 zmieniony
     
    ->link<-

    ShortReal (Q8.8 = 16bit), Real (Q24.8 = 32bit) to są fixed-point
    ->link<-

    Float to nazwa zamienna dla Single (IEEE754-32bit)
    ->link<-

    Float16 (IEEE754-2008, 16bit)
    ->link<-

    pod względem szybkości, ale nie precyzji reprezentacji wyniku
    1. ShortReal
    2. Real
    3. Float16
    4. Float

    pod względem precyzji reprezentacji wyniku
    1. Float
    2. Float16
    3. Real
    4. ShortReal

    obliczenia (mnożenie) dla ShortReal, Byte, Word można przyspieszyć włączając dodatkowe tablice (2KB)
    {$fmul page}
    gdzie page to numer strony pamięci od której tablice zostaną umieszczone
    • 20:
       
      CommentAuthorBca
    • CommentTime10 May 2023
     
    Na tym forum brakuje mi dodawania lajka, "łapkę w górę"
    Ale może jestem stary... ;)
    • 21:
       
      CommentAuthorsun
    • CommentTime10 May 2023
     
    na tym forum... są same braki, można by powiedzieć :)
    • 22:
       
      CommentAuthorjhusak
    • CommentTime10 May 2023
     
    Ale nikomu to nie przeszkadza :)
    • 23:
       
      CommentAuthorpirx
    • CommentTime11 May 2023
     
    well...
    • 24:
       
      CommentAuthorjhusak
    • CommentTime12 May 2023
     
    No przecież piszę. Komuś może to przeszkadza, ale nikomu nie przeszkadza.