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 19:01
       
      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 19:01 zmieniony
       
      Mad Assembler nowszy jest potrzebny

      ->link<-

      aktualne przykłady z poprawkami są tutaj

      ->link<-
      • 3: CommentAuthorwojtas76
      • CommentTime17 Jan 2023 21:01
       
      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 22:01
       
      uaktualniłem unit S2

      ->link<-
      • 5: CommentAuthorwojtas76
      • CommentTime18 Jan 2023 01:01
       
      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 10:01
       
      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 01:05 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 09:05
       
      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 11:05
       
      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 11:05 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 12:05
       
      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 12:05 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 13:05 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 19:05
       
      Dzięki wielkie, jakoś to przeoczyłem i nie używałem, a się przyda:-)
      • 15: CommentAuthortebe
      • CommentTime8 May 2023 00:05 zmieniony
       
      REGISTER dla zmiennych

      ->link<-
      • 16:
         
        CommentAuthorjhusak
      • CommentTime8 May 2023 11:05 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 19:05 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 05:05 zmieniony
       
      ATARI 8bit
      MP ma liczby float/real 32/16bit? specjalne?
      (uczę się)
      • 19: CommentAuthortebe
      • CommentTime9 May 2023 08:05 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 02:05
       
      Na tym forum brakuje mi dodawania lajka, "łapkę w górę"
      Ale może jestem stary... ;)
      • 21:
         
        CommentAuthorsun
      • CommentTime10 May 2023 21:05
       
      na tym forum... są same braki, można by powiedzieć :)
      • 22:
         
        CommentAuthorjhusak
      • CommentTime10 May 2023 23:05
       
      Ale nikomu to nie przeszkadza :)
      • 23:
         
        CommentAuthorpirx
      • CommentTime11 May 2023 01:05
       
      well...
      • 24:
         
        CommentAuthorjhusak
      • CommentTime12 May 2023 00:05
       
      No przecież piszę. Komuś może to przeszkadza, ale nikomu nie przeszkadza.