GPascal

  • Hi,
    hat sich jemand mehr mit GPascal auseinander gesetzt und Erfahrungen?

    Die Sourcen und die Dokumentation sind jetzt frei. :)

    supercoders.com.au/blog/nickgammongpascal.shtml Der Entwickler

    gammon.com.au/GPascal/ Die Dokumentation

    gammon.com.au/GPascal/source/ Die Sourcen

    Gruß Höp
    8 Bit sind genug, sonst komme ich morgens nicht aus dem Bett. %)

    „Nous sommes dans un pot de chambre et nous y serons emmerdés.“
    („Wir sitzen in einem Nachttopf und wir werden darin zugeschissen werden“)
    2.9.1870, Auguste-Alexandre Ducrot

    www.emu64-projekt.de/acme The home of ACME win32 compile.
  • So, heute mal ein lange fälliges Thema angegangen... seit über 2 Jahrzehnten vermisse ich Winkelfunktionen unter GPascal (die fehlen da genauso wie Fließkommazahlen). Für das Thema Affine Darstellung von Texturen brauche ich sie aber. Also Internet befragt und bei den Leuten aus dem Embedded Bereich fündig geworden:
    atwillys.de/content/cc/sine-lookup-for-embedded-in-c/

    Ist zwar dort in C, aber was wichtiger ist - durchgängig mit Integerzahlen. Einziges "Manko" - dort wird mit 16Bit-Zahlen gearbeitet, GPascal hat 24Bit. Ich hab versucht, das so dicht wie möglich an der C-Version zu halten... bei der steht auch dabei, was genau passiert ;)

    Quellcode

    1. var sin90:array[32] of integer;
    2. i,j,k:integer;
    3. (* Wertetabelle vorbereiten *)
    4. procedure initsim;
    5. begin
    6. sin90[0]:=$000000;sin90[1]:=$000647;sin90[2]:=$000c8b;
    7. sin90[3]:=$0012c7;sin90[4]:=$0018f8;sin90[5]:=$001f19;
    8. sin90[6]:=$002527;sin90[7]:=$002b1e;sin90[8]:=$0030fb;
    9. sin90[9]:=$0036b9;sin90[10]:=$003c56;sin90[11]:=$0041cd;
    10. sin90[12]:=$00471c;sin90[13]:=$004c3f;sin90[14]:=$005133;
    11. sin90[15]:=$0055f4;sin90[16]:=$005a81;sin90[17]:=$005ed6;
    12. sin90[18]:=$0062f1;sin90[19]:=$0066ce;sin90[20]:=$006a6c;
    13. sin90[21]:=$006dc9;sin90[22]:=$0070e1;sin90[23]:=$0073b5;
    14. sin90[24]:=$007640;sin90[25]:=$007883;sin90[26]:=$007a7c;
    15. sin90[27]:=$007c29;sin90[28]:=$007d89;sin90[29]:=$007e9c;
    16. sin90[30]:=$007f61;sin90[31]:=$007fd7;sin90[32]:=$007fff;
    17. end;
    18. (* Sinusberechnung *)
    19. function sin1(angle);
    20. var v0,v1,va:integer;
    21. begin
    22. if angle < 0 then begin
    23. repeat
    24. angle := 32768+angle;
    25. until angle>=0;
    26. angle:=1+angle;
    27. end;
    28. v0 := (angle shr 8);
    29. if(v0 and 32) then begin
    30. v0 := $ffffff xor v0;
    31. v1 := $ffffff xor angle;
    32. end;
    33. if((v0 and 32)=0) then begin
    34. v1 := angle;
    35. end;
    36. v0:=v0 and 31;
    37. va:=1+v0;
    38. v1:= sin90[v0] + (((sin90[va]-sin90[v0]) * (v1 and 255)) shr 8);
    39. if((angle shr 8) and 64) then v1 := -v1;
    40. sin1:= v1;
    41. end ;
    42. (* Hauptprogramm *)
    43. begin
    44. initsim;
    45. for i:=0 to 64 do begin
    46. j:=20+sin1(512*i)/2048;
    47. for k:=0 to j do begin
    48. write (" ");
    49. end ;
    50. writeln ("*");
    51. end ;
    52. end .
    Alles anzeigen
    Wissen ist das einzige Gut, das sich beim Teilen vermehrt. Also seid vorsichtig damit!
  • Muss ich nochmal beim gcc-Thread reinschauen, dachte da wären Fließkommazahlen gewesen.

    Kleiner peinlicher Fehler, der die Sinusfunktion unförmig machte... ist hier behoben.

    Quellcode

    1. var sin90:array[32] of integer;
    2. i,j,k:integer;
    3. (* Wertetabelle vorbereiten *)
    4. procedure initsin;
    5. begin
    6. sin90[0]:=$000000;sin90[1]:=$000647;sin90[2]:=$000c8b;
    7. sin90[3]:=$0012c7;sin90[4]:=$0018f8;sin90[5]:=$001f19;
    8. sin90[6]:=$002527;sin90[7]:=$002b1e;sin90[8]:=$0030fb;
    9. sin90[9]:=$0036b9;sin90[10]:=$003c56;sin90[11]:=$0041cd;
    10. sin90[12]:=$00471c;sin90[13]:=$004c3f;sin90[14]:=$005133;
    11. sin90[15]:=$0055f4;sin90[16]:=$005a81;sin90[17]:=$005ed6;
    12. sin90[18]:=$0062f1;sin90[19]:=$0066ce;sin90[20]:=$006a6c;
    13. sin90[21]:=$006dc9;sin90[22]:=$0070e1;sin90[23]:=$0073b5;
    14. sin90[24]:=$007640;sin90[25]:=$007883;sin90[26]:=$007a7c;
    15. sin90[27]:=$007c29;sin90[28]:=$007d89;sin90[29]:=$007e9c;
    16. sin90[30]:=$007f61;sin90[31]:=$007fd7;sin90[32]:=$007fff;
    17. end;
    18. (* Sinusberechnung *)
    19. function sin1(angle);
    20. var v0,v1,va:integer;
    21. begin
    22. if angle < 0 then begin
    23. repeat
    24. angle := 32768+angle;
    25. until angle>=0;
    26. angle:=1+angle;
    27. end;
    28. v0 := (angle shr 8);
    29. if(v0 and 32) then begin
    30. v0 := $ffffff xor v0;
    31. v1 := $ffffff xor angle;
    32. end else begin (* muss else sein *)
    33. v1 := angle;
    34. end;
    35. v0:=v0 and 31;
    36. va:=1+v0;
    37. v1:= sin90[v0] + (((sin90[va]-sin90[v0]) * (v1 and 255)) shr 8);
    38. if((angle shr 8) and 64) then v1 := -v1;
    39. sin1:= v1;
    40. end ;
    41. (* Hauptprogramm *)
    42. begin
    43. initsin;
    44. for i:=0 to 64 do begin
    45. j:=20+sin1(512*i)/2048;
    46. for k:=0 to j do begin
    47. write (" ");
    48. end ;
    49. writeln ("*");
    50. end ;
    51. end .
    Alles anzeigen
    Wissen ist das einzige Gut, das sich beim Teilen vermehrt. Also seid vorsichtig damit!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Tale-X ()