home *** CD-ROM | disk | FTP | other *** search
/ ftp.uni-stuttgart.de/pub/systems/acorn/ / Acorn.tar / Acorn / acornet / fun / mags / hl-05-93.arc / !HL-05_93_Text_-Coding < prev    next >
Text File  |  1993-12-01  |  29KB  |  696 lines

  1.  
  2.  
  3.  
  4. ÿÿÿÿÿÿÿÿÿÿ Programmierung ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
  5. ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
  6.  
  7.  
  8. An alle:
  9.  
  10. Wer hat eine superschnelle (z.B. binΣre) Suchroutine in BASIC oder Inline-
  11. Assembler programmiert, so da▀ sie auch ohne Weiteres in einem BASIC-Proggie
  12. funktioniert?
  13. Brauche sie DRINGENDST fⁿr mein PD-Archivprog "!WombatPD".
  14. Danke im Voraus. Addi in der 300.
  15.                                                                Wombat.
  16. ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
  17. Wenn tatsΣchlich irgendwann mal einer den BASIC-Assembler aufmotzen sollte, so
  18. habe ich dafⁿr auch noch (neben den FPA-Befehlen) eine Wunschliste:
  19. -kein 1000faches EQUB xx:EQUB yy:... mehr, sondern etwas wie: DCB xx,yy,zz,...
  20.  wie es in allen modernen Assemblern auf der ganzen Welt ist
  21. -da der ARD-Befehl eh` nur ein Pseudo-Befehl ist, k÷nnte man ihn auch gleich
  22.  auf beliebige Adre▀rΣume umschreiben, es werden dann halt 1-4 Mnemonics
  23.  erzeugt
  24. -bei einem MOV-Befehl mit negativem Operanden wird automatisch MVN benutzt
  25. -ein DCS (bzw. EQUS) kann mit "...",0 terminiert werden
  26.  
  27. Das ist mir im Moment dazu eingefallen.
  28.                                                                        Sorcerer
  29.  
  30.  (Denkbar wΣren z.B. auch noch mehrere Standardmakros fⁿr ADD und SUB.
  31.   Au▀erdem k÷nnte man bei der Gelegenheit gleich noch ein DIV-Makro einbauen.)
  32.  
  33. ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
  34. Acero! Hier ist meine L÷sung zum Bytes vertauschen innerhalb eines Words.
  35. Leider komme ich nicht auf 3-4 Taktzyklen wie Roger "Gott" Wilson, ich brauche
  36. leider mindestens 5! Je nach Anwendung kannst Du aber gegebenenfalls den
  37. letzten Befehl weglassen, bzw. in den nachfolgenden integrieren.
  38.  
  39.  On Entry:              { R0 - Wert }
  40.  On Exit :              { R0 - gedrehter Wert
  41.                           R1 - corrupted }
  42.  
  43.    BIC     R1,R0,#&FF000000
  44.    BIC     R1,R1,#&0000FF00
  45.    EOR     R0,R0,R1,ROR #16
  46.    EOR     R0,R0,R1
  47.    MOV     R0,R0,ROR #24
  48.  
  49. Ich hoffe aber, da▀ hier von anderen noch bessere L÷sungen kommen!
  50.                                                                        Sorcerer
  51.  
  52.  (Thank U !)
  53.  
  54. ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
  55. QArc! Hoffentlich programmiert Du Deine Programme nicht immer so nachlΣssig,
  56. denn sonst kann es passieren, da▀ ein Programm/Demo mal lΣuft, mal aber auch
  57. nicht: Du hast vergessen (?), den Bereich anzugeben, dessen Gr÷▀e mit
  58. OS_ReadDynamicArea geladen werden soll. Fⁿr den Bildschirmspeicher mu▀t Du
  59. zuvor R0 mit einer #2 laden, ansonsten nimmt er, was er gerade in R0
  60. vorfindet, und das k÷nnen halt Werte von 0 bis 2^32-1 sein, wobei in 2^32-7
  61. FΣllen die Meldung 'Unknown Dynamic Area', weil nur R0-Werte von 0-5 definiert
  62. sind.
  63.  Ein Vorschlag zur Verbesserung Deiner Stern-Routine wΣre, da▀ Du 'speed' und
  64. 'colour' zusammen in ein Word steckst, den speed z.B. 8 Stellen hochshiftest
  65. (LSL #8), und dann zur aktuellen Spalte addierst mit:
  66.     ADD   R1,R1,R2,LSR #8
  67. Da▀ 'ⁿber' der Farbe noch weitere Bits gesetzt sind, ist hier irrelevant, da
  68. mit
  69.     STRB   R3,[R6,R0,LSL #6]
  70. wirklich nur die unteren 8 Bits benutzt werden. So sparst Du immerhin einen
  71. ganzen (!) Taktzyklus dadurch, da▀ Du ein Register weniger in der LDM/STM-Liste
  72. hast!!! Wenn Du dann noch die Sterne von rechts nach links laufen lΣ▀t, sparst
  73. Du Dir noch das 'CMP  R1,#320' (wieder ein ganzer (!) Taktzyklus!!!), und wenn
  74. Du getrennte Tabellen anlegst fⁿr x-Position und speed/color, brauchst Du nicht
  75. immer mit STM 3 Register abzulegen, es reicht hier ein einzelnes STR fⁿr die
  76. neue x-Koordinate!
  77.  Jetzt aber ein Vorschlag fⁿr die ─sthetik: Viel sch÷ner sieht es aus, wenn die
  78. Sterne langsam scrollen, d.h. mit maximal 1 Pixel/VSync. Schau Dir Demo▓ an,
  79. wenn Du wissen willst, was ich meine. Der Gro▀teil mu▀ hier bei den langsamen
  80. Sternen (1 Pixel alle 5-8 VSyncs) liegen, nur ganz, ganz wenige dⁿrfen
  81. schneller scrollen.
  82.  Probier's aus!
  83.                                                                        Sorcerer
  84.  
  85.  (Diese Anzi hat mich auf eine coole (?) Idee gebracht: Bis zum nΣchsten
  86.   Hardliner k÷nnen alle interessierten Coder mal eine m÷glichst hochoptimierte
  87.   Starscroller-Routine einreichen. Sieger - allerdings ohne Preisgeld oder
  88.   sonstige materiellen Vergⁿtungen - ist derjenige, der die Routine mit den
  89.   meisten Stars vorweisen kann.
  90.   Voraussetzungen: Mode 13, alle denkbaren Geschwindigkeiten zwischen 1/16 und
  91.   8 Pixeln/Sekunde mⁿssen m÷glich sein, das Minidemo (sollte man es vielleicht
  92.   "Recordmo" nennen ?) darf nicht lΣnger als 2048 Bytes sein, langsame Pixel
  93.   sind dunkler als helle (allerdings mu▀ nicht fⁿr jede Geschwindigkeit eine
  94.   Extrafarbe angegeben werden - es reicht ja eine Farbe fⁿr zwei oder gar
  95.   drei Geschwindigkeiten), mit SPACE kann man das Demo verlassen...
  96.   Und mit dem nΣchsten Hardliner werden dann alle eingesandten Demos ver-
  97.   schickt. Der Sieger erhΣlt den Titel "Star of Stars" und darf kⁿnftig stolz
  98.   sein.
  99.   Vielleicht k÷nnten wir solche Wettbewerbe ÷fter durchfⁿhren...)
  100.  
  101. ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
  102. Bei komplexeren Berechnungen in Assembler erreicht man selbst mit 32-Bit-
  103. Werten schnell die Grenzen der Integerberechnung. Deswegen brauchte ich,
  104. ursprⁿnglich um Vektormodelle um beliebige Achsen zu drehen, eine Floating-
  105. Point-Arithmetik. Ich mu▀ zugeben, ich habe mich nicht nΣher mit dem FPE
  106. befa▀t, weil die Befehle ja im BASIC-Assembler nicht zur Verfⁿgung stehen.
  107. Und was den FPA betrifft: Der wird sich in meinem Archi nie heimisch fⁿhlen
  108. (lΣuft nicht mit 35Mhz ARM3!). Die folgenden FP-Makros gehen von dem Format
  109. aus:
  110.  
  111. reg1 = 16-Bit-Mantisse mit Vorzeichen, also mu▀ bit15 immer das h÷chste
  112.        signifikante Bit sein
  113. reg2 = Exponent mit Vorzeichen
  114.  
  115. mit Wert = reg1 / 2^reg2
  116.  
  117. So lassen sich alle Werte, die betragsmΣ▀ig kleiner sind als 2^16 mit
  118. positivem Exponenten darstellen. Negativ wird der Exponent dabei nur fⁿr
  119. sehr gro▀e Zahlen. Natⁿrlich k÷nnen die Werte praktisch beliebig klein
  120. oder gro▀ werden, da der Exponent ein ganzes Register belegt.
  121. Und jetzt ein Multiplikations-Makro dafⁿr:
  122.  
  123.  
  124. DEF  FNmul(C,Ce, A,Ae, B,Be)    :*| berechnet (C,Ce) = (A,Ae)*(B,Be)
  125. LOCAL pos, neg, eot
  126. LOCAL t,s
  127. s= P%
  128. FOR t=0 TO 1: P%= s         :*| mini two-pass-assembly
  129. [ OPT PASS*t
  130.               ADD Ce, Ae,Be   ; add exponents
  131.               SUB Ce,Ce,#15   ;  -15, as result shifted right by 15 places
  132.               MOV C, A,ASR#1  ; avoid overflow
  133.               MUL C, B,C      ; multiply!
  134.               MOVS C,C,ASR#14 ; and shift back
  135.                BMI neg
  136. .pos          TST C,#2^16     ; if result positive and bit16 set then
  137.                MOVNE C,C,ASR#1;   shift right by 1 
  138.                SUBNE Ce,Ce,#1 ;   and decrease exponent by 1
  139.                B eot
  140. .neg          TST C,#2^16     ; if result negative and bit16 clear then
  141.                MOVEQ C,C,ASR#1;   shift right by 1
  142.                SUBEQ Ce,Ce,#1 ;   and decrease exp by 1
  143. .eot
  144. ]
  145. NEXT t   :=0
  146.  
  147. Alles klar?
  148. Das sollte doch relativ (zum FPE) schnell gehen.
  149. Wenn man wei▀, da▀ beide Werte positiv sind, ist die Sache sogar noch viel
  150. einfacher:
  151.  
  152. DEF  FNmulp(C,Ce, A,Ae, B,Be)
  153. [ OPT PASS                       ; multiplies two positives
  154.               ADD Ce, Ae,Be
  155.               SUB Ce,Ce,#15
  156.               MUL C,B,A
  157.               MOV C,C,LSR#15
  158.               TST C,#2^16
  159.                MOVNE C,C,ASR#1
  160.                SUBNE Ce,Ce,#1
  161. ]     :=0
  162.  
  163. Man k÷nnte damit also zum Beispiel schreiben:
  164.               
  165.               MOV R2,#&C000
  166.               MOV R3,#15       ; Konstante &C000/2^15 = 1.5
  167.               FNmul(R0,R1, R0,R1, R2,R3)
  168.  
  169. Das multipliziert eine Flie▀kommazahl in (R0,R1) mit der Konstanten 1.5 .
  170. Natⁿrlich ist die Genauigkeit dieser Routinen beschrΣnkt (ca 4 Dezimal-
  171. stellen), aber fⁿr meine Zwecke reicht das aus (siehe MagnetoidsDemo!)
  172. Schwieriger wird die Sache allerdings bei *Additionen*, mit ungleichem
  173. Vorzeichen, sprich Subtraktionen. Hier wird das Angleichen des Ergebnisses
  174. leider etwas langsamer (loop).
  175. Interessiert euch die ganze Fachsimpelei eigentlich ???
  176. Quatsche ich Chinesisch oder Unsinn ???
  177. Oder wollt ihr meehr ?!?
  178. Wenn ja, k÷nnte ich mich rumkriegen lassen, auch die restlichen Makros
  179. vorzustellen. Wie wΣre es ⁿbrigens mit einem Vektorgrafikkurs im HL?
  180. (das ist nΣmlich mein Steckenpferd, sozusagen).
  181.  
  182.     Jared
  183.  
  184.  (Jared, was hei▀t hier Fachsimpelei ? Diese Rubrik ist doch dazu da, um
  185.   alles das zu ver÷ffentlichen, was man fⁿr sinnvoll hΣlt ! Und so ein
  186.   cooles MUL-Makro geh÷rt ganz bestimmt zu den Sachen, die der eine oder
  187.   andere Leser irgendwann mal brauchen wird.)
  188.  
  189. ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
  190.     Acero!
  191.  
  192. Also, zu der Bytevertauschungsroutine:
  193. vorher: R0= (b1b2b3b4)
  194.  
  195.           MOV R1,R0,LSL#24
  196.           ADD R1,R1,R0,LSR#24
  197.           AND R2,R0,#&FF00
  198.           ADD R1,R1,R2,LSL#8
  199.           AND R2,R0,#&FF0000
  200.           ADD R1,R1,R2,LSR#8
  201.  
  202. nachher: R0= (b1b2b3b4)
  203.          R1= (b4b3b2b1)
  204. Aber so schlau warst Du auch schon, nehme ich an. Es geht schneller, wenn
  205. man irgendwo die Bitmaske &FFFF deponiert, aber DREI Taktzyklen??
  206.  
  207.     Jared
  208.  
  209.  (Hm, mittlerweile glaube ich auch, da▀ sich so eine Routine nicht in drei
  210.   Zyklen bewerkstelligen lΣ▀t... :-) Aber glaubt mir: Ich bin mir fast 100%ig
  211.   sicher, da▀ Roger die Routine in vier Zyklen gepackt hat ! Keine Spinnerei !
  212.   Wenn ich blo▀ das entsprechende Listing wiederfinden k÷nnte...)
  213.  
  214. ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
  215. Kann mir jemand sagen, was das definitive Line-Clipping Verfahren ist?
  216. Bei der "normalen" Schnittpunktberechnung kriege ich in Assembler Overflow-
  217. Probleme, wenn die Linien zu lang werden. Das andere Verfahren, das ich
  218. kenne, funktioniert so:
  219.    halbiere Cliplinie
  220.    wenn HΣlfte auch Cliplinie dann halbiere wieder
  221.    usw....  bis Schnittpunkt mit Grafikfenster gefunden
  222. Angeblich braucht das bei einer Aufl÷sung von 256*256 Pixel maximal
  223. 8 Halbierungen, und die Linie ist geclipt.
  224. Was ist besser, was ist schneller ?
  225.  
  226.     Jared
  227.  
  228.  (Es kann natⁿrlich sein, da▀ irgend ein verrⁿckter Informatik-Professor
  229.   mittlerweile ein besseres Verfahren entwickelt hat. Aber vermutlich ist
  230.   der Cohen-Sutherland-Algorithmus schon ziemlich perfekt. Ach ⁿbrigens,
  231.   kannst Du mir mal erklΣren, wie man mit 32 (!) Bit Overflow-Probleme
  232.   bekommen kann !??!)
  233.  
  234. ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
  235. TatsΣchlich hat sich da ein illegaler Befehl in die VIDC-Tips von Ace (HL
  236. 03/93) eingeschlichen. Natⁿrlich darf man niemals die Never-Kondition in
  237. einem Opcode verwenden, wie das auch ausdrⁿcklich in den RO3 PRM steht.
  238. Anstatt also ömovNv r0,r0ò nach dem Prozessorwechsel zu verwenden, mu▀ man
  239. ömov r0,r0ò oder einen anderen NOP verwenden. Dies deshalb, da ab dem ARM6
  240. die Never-Kontiotion nicht mehr vorgesehen ist und somit sicherlich nicht
  241. mehr die gewⁿnschten Resultate herauskommen wⁿrden. Gut aufgepasst, QArc!
  242.  
  243. Aber Acero, da▀ Demos nur auf dem ARM2 und ARM3 laufen sollen, war doch
  244. hoffentlich ironisch gemeint? Wenn der nΣchste Archimedes (mit dem ARM710)
  245. herauskommen wird, dann ist das doch genauso ein Archie wie die jetzigen,
  246. wenn auch noch schneller und besser. Aber wieso sollten die alten Demos
  247. dann mⁿde belΣchelt werden? Coole Demos und Spiele legt man doch immer
  248. wieder gerne ein, egal auf welchem Modell. Und ein paar Evergreens gibt es
  249. ja allemal. Als ich mir 1992 den A5000 gekauft habe, mu▀te ich in
  250. irgendeinem englischen Magazin lesen, da▀ der A5000 zum Spielen zu schade
  251. sei. Dabei ist der A5000 doch die optimale Spielemachine (neben anderen
  252. Aufgaben :-)
  253. Au▀erdem ist es ja so, da▀ ein Befehl wie ömovNvò sowieso gar nichts macht,
  254. also ist es kaum tragisch, diesen durch z.B. ömov r0,r0ò zu ersetzen (oder
  255. auch ömov r1,r1ò :-) .. Aber das hast Du ja selber geschrieben.
  256.  
  257. Programme auf bestimmte Konfigurationen zuzuschneiden, das ist sicherlich
  258. gar nicht ratsam, vor allem, weil man das Optimum auf dem Archimedes durch
  259. ARM-Programmierung herausholt und kaum durch Chip-Orgien. Ich wei▀
  260. natⁿrlich, da▀ Dir VIDC-Tricks viel Spa▀ machen, aber leider lief das Intro
  261. vom HL 03/93 und Dein Programm im HL 04/94 auf dem A5000 ganz und gar
  262. nicht, schnⁿfff! Dabei habe ich sogar einen alles synchronisierenden NEC
  263. 3D. Au▀erdem wird der kommende High-End-Archie ca. 4 MB Video RAM fⁿr
  264. seinen VIDC20 haben. Da▀ dann die jetzige Memory-Map komplett umgestellt
  265. wird, dⁿrfte klar sein. Also, niemals davon ausgehen, da▀ der Bildspeicher
  266. bei einer bestimmten Adresse anfΣngt, und niemals Chips direkt beschreiben.
  267. Immer sch÷n SWIs benutzen, um an entsprechende Adressen zu kommen... :-)
  268.  
  269.  - Epics -
  270.  
  271.  (Epics, in einem Punkt stimme ich Dir voll zu: Das Optimum kann man auf dem
  272.   Archie keinesfalls durch Chip-Orgien erreichen. Es h÷rt sich bl÷d an, aber
  273.   dazu sind die Chips einfach zu gut ! Beim Designen haben die Ingenieure
  274.   bei Acorn/ARM Ltd. ⁿberhaupt keine Fehler gemacht, weshalb Effekte wie
  275.   beispielsweise Sideborder-Sprites (C64) oder Sync-Scrolling (ST) gar nicht
  276.   notwendig sind.
  277.   Aber trotzdem denke ich, da▀ es an der Zeit ist, mal ein Demo zu coden, da▀
  278.   einen ARM2 vollkommen ausreizt. Ich denke da nicht an Demos wie die Vektor-
  279.   demos von Olivier Higelin oder 2DWaves von Jan Vlietinck, sondern eher an
  280.   Design-Demos, wie man sie vom Amiga kennt. Stimmst Du mir nicht auch zu,
  281.   da▀ die beiden erstgenannten Demos eigentlich gar keine Demos, sondern
  282.   vielmehr nur aufbereitete Routinen sind ? Logisch, da▀ solche Routinen
  283.   einen schnellen Prozessor wie den ARM3 voraussetzen. Aber fⁿr mich stellen
  284.   die (guten) Amiga-Demos eine wesentlich h÷her zu bewertende Programmier-
  285.   leistung dar. Routinen wie Texture-Mapping oder Zellular-Automaten sind
  286.   zwar nicht ganz einfach zu programmieren, aber es ist doch wesentlich
  287.   schwieriger, diese Routinen so zu modifizieren bzw. einzuschrΣnken, da▀
  288.   sie auch auf wesentlich schwΣcheren Prozessoren laufen ! Im Klartext:
  289.   Die Arbeitsweise grundlegender Routinen kann man sich aus Lehrbⁿchern und
  290.   Magazinen nahebringen. Nirgendwo dokumentiert sind aber all die Tricks, die
  291.   m÷glich sind, um all diese Routinen sozusagen zu "emulieren"; wenn auf dem
  292.   Amiga beispielsweise Texture-Mapping gezeigt wird, haben die verwendeten
  293.   Routinen kaum etwas mit echtem TM zu tun, sondern nutzen bestimmte
  294.   Besonderheiten aus. Natⁿrlich ist echtes TM wesentlich flexibler, aber
  295.   dafⁿr kostet es auch das Zehnfache der Rechenzeit !
  296.   Ich hoffe, es ist ein bi▀chen klargeworden, was ich eigentlich sagen m÷chte:
  297.   Auch auf einem ARM2 kann man geniale Effekte (mit 50 Hertz) hervorzaubern;
  298.   nur leider ist dies noch fast gar nicht gemacht worden. Ich kenne z.B.
  299.   keinen einzigen Starwars-Scroller auf dem Archie, der einen kompletten
  300.   Bildschirm ausfⁿllt und dabei vollkommen flⁿssig ist. Aber selbst auf dem
  301.   C64 gab es eine solche Routine... Man kann jetzt natⁿrlich einfach einen
  302.   schnelleren Prozessor fordern. Aber mit ein bi▀chen Anstrengung kriegt man
  303.   das auch auf einem ARM2 hin ! Und genauso ist es mit vielen anderen Routinen
  304.   auch...)
  305.  
  306. ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
  307. Hallo Ikarus und alle FPA-Interessierten,
  308.  
  309. In der neuen BASIC-Version (die in RISC OS 3.2 oder so Σhnlich) drin sein
  310. wird, hat Roger Wilson auch ARM3- und FPA-Befehle in den Inline-Assembler
  311. des ARM-BASICs integriert. Wann das allerdings herauskommt, wei▀ ich leider
  312. nicht.
  313.  
  314. Wer nicht so lange warten will, sollte sich mal das toole !ArcTools (von
  315. Moshen Alshayef) genauer anschauen, da wird ein SWI zur Verfⁿgung gestellt,
  316. mit dem man v÷llig einfach und elegant alle ARM3- und FPA-Befehle von BASIC
  317. aus dekodieren lassen kann. Diesen SWI kann man leicht als FN-Makro in
  318. seinen BASIC-Assembler einbinden. ▄brigens ist ArcTools Public Domain,
  319. zumindest die sehr weit verbreitete 0.72 Version.
  320.  
  321. Der Beschleunigungsfaktor bei praxisnahen Anwendungen auf einem A5000 mit
  322. FPA verglichen mit einem ohne FPA liegt zwischen *7 und *14. Gemessen beim
  323. Raytracen (POVray), was zweifelsohne eine Anwendung ist, die den FPA stark
  324. nutzt. Obwohl sich FP-Operationen beim Raytracen letztlich auch nur mit 50%
  325. zu Buche schlagen, der Rest wird bei anderen Befehlen verbraten. Au▀erdem
  326. soll der Norcroft C-Compiler nicht gerade effiziente FPE-Befehle erzeugen.
  327. Was der Faktor bedeutet, sollte man sich mal klar machen: Wenn ein gutes
  328. Bild (640x480 mit AntiAliasing) mit FPA 12 Stunden ben÷tigt, so wird das
  329. ohne FPA um die 120 Stunden brauchen, also ganze 5 (!) Tage, und das auf
  330. einem A5000.
  331. Der Spitzen-Beschleunigungsfaktor, wenn man nur FP-Funktionen mit und dann
  332. ohne FPA vergleicht, liegt ⁿbrigens bei ⁿber 40. Das habe ich mit einem
  333. Mandelbrot-Programm eines Freundes gemessen, das auch Bildschirm-Ausgaben
  334. machen mu▀. Fazit: Auch wenn der FPA den meisten Spielern und Anwendern von
  335. Textverarbeitungen, Malprogrammen und dergleichen nichts bringt, genial ist
  336. das Teil allemal, eben wieder ein RISC-Chip!
  337.  
  338.  - Epics -
  339. ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
  340. Hoi Sorcerer! (oder wie grⁿ▀en sich Hexer ???)
  341.  
  342. Ich hab' mich mal des CLAIMens angenommen. Zuerst sah es ja so aus, als ob
  343. es beim Versuch bleiben wⁿrde. Unter BASIC hatte ich nΣmlich auch stΣndig
  344. exceptions usw. Selbst claimen und sofortiges releasen fⁿhrte zu einem
  345. 'bad vector release' !!!???
  346. Letztlich ist dann versuchsweise ein Module entstanden (testweise), welches
  347. beim Init den Vector claimt und beim (RM)Killen wieder released. Keine Pro-
  348. bleme damit. In einer frⁿheren Version hatte ich versuchsweise kein Release
  349. eingebaut, das Module gekillt und die ModuleArea anderweitig vergeben ...
  350. - Fehlermeldungen haben ein sch÷nes Outfit! - will sagen, es mu▀ten ja dann
  351. Exceptions auftreten wegen des CodeVectors, der dann vielleicht schon ein
  352. Sprite war ...
  353.  
  354. Hier die Quelle:
  355.  
  356. DIM code% 500
  357. FOR pass%=0 TO 2 STEP 2
  358. P%=code%
  359. [OPT pass%
  360.  
  361. EQUD 0
  362. EQUD init-code%
  363. EQUD finit-code%
  364. EQUD 0
  365. EQUD title-code%
  366. EQUD help-code%
  367. EQUD 0
  368. EQUD 0
  369. EQUD 0
  370. EQUD 0
  371. EQUD 0
  372.  
  373. .title
  374. EQUS"ClaimV1D" : EQUB 0 : ALIGN
  375. .help
  376. EQUS"ClaimV1D 0.02 (10 Oct 1993) Claim Test" : EQUB 0 : ALIGN
  377.  
  378. .init
  379. STMFD R13!,{R14}              ;claims vector
  380. MOV R0,#&1D
  381. ADR R1,routine
  382. MOV R2,#0
  383. SWI"OS_Claim"
  384. LDMFD R13!,{PC}
  385.  
  386. .finit
  387. STMFD R13!,{R14}              ;releases vector
  388. MOV R0,#&1D
  389. ADR R1,routine
  390. MOV R2,#0
  391. SWI"OS_Release"
  392. LDMFD R13!,{PC}
  393.  
  394. .routine
  395. STMFD R13!,{R0}               ;safety first
  396.  
  397. LDR R0,count_of_call          ;counts OS_UpCalls
  398. ADD R0,R0,#1
  399. STR R0,count_of_call
  400.  
  401. LDMFD R13!,{R0}               ;dito
  402.  
  403. MOVS PC,R14
  404.  
  405. .count_of_call
  406. EQUD 0                        ;to be examined by memoryi ...
  407. ]
  408. NEXT
  409. OSCLI"SAVE $.ClaimV1D "+STR$~code%+"+"+STR$~(P%-code%)
  410. OSCLI"SETTYPE $.ClaimV1D Module"
  411.  
  412.  
  413. Ich hab' das dann mal auch praktisch getestet und ein paar Apps gestartet
  414. bzw. noch einige UpCall situations erzeugt - und ... er|sie|es zΣhlt die
  415. jeweiligen Aufrufe.
  416.  
  417. Hoffentlich hilft Dir das weiter!
  418.  
  419. greetings blackICe
  420. ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
  421. Hoi Acero!
  422.  
  423. Tauschen: B1 B2 B3 B4 >> B4 B3 B2 B1
  424.  
  425. Ich hΣtte zwei Varianten zu bieten. Hat bzw. haben beide den Nachteil, da▀
  426. sie 3 Register verbraten (Quelle=Ziel, dummy, Mask). ZeitmΣ▀ig liegen beide
  427. bei vier Takten.
  428.  
  429. Die Maske (R2) mu▀ vorher mit &00FF00FF initialisiert sein! (Ein Register
  430. wirst Du ja wohl ⁿbrig haben!?)
  431.        
  432. ;R0 Quelle=Ziel
  433. ;R1 dummy
  434. :R2 Maske  &00FF00FF                        R0            R1
  435.  
  436. Var.1:   AND R1,R0,R2                  ;11 22 33 44   00 22 00 44
  437.          EOR R0,R0,R1,ROR#16           ;11 24 33 42   00 22 00 44
  438.          EOR R0,R0,R1                  ;11 44 33 22   00 22 00 44
  439.          MOV R0,R0,ROR#24              ;44 33 22 11   00 22 00 44
  440.  
  441. Var.2:   AND R1,R0,R2                  ;11 22 33 44   00 22 00 44
  442.          AND R0,R0,R2,LSL#8            ;11 00 33 00   00 22 00 44
  443.          ORR R0,R0,R1,ROR#16           ;11 44 33 22   00 22 00 44
  444.          MOV R0,R0,ROR#24              ;44 33 22 11   00 22 00 44
  445.  
  446. Vielleicht nicht sehr elegant aber funktionell! 'was besseres fiel mir auf
  447. die Schnelle nicht ein.
  448.  
  449. greetings blackICe
  450. ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
  451. An alle die mir mal helfen wollen.
  452. Ich suche ein Programm, welches mir erlaubt, die Nachkommastellen der Zahl e
  453. auf, sagen wir 1000-10000 Stellen, genau auszurechnen. Das Programm sollte in
  454. Basic geschrieben werden, damit ich es auch verstehe. (Wenns sein mu▀ auch in
  455. Assembler)
  456. Die Zahl e kann man mit folgender Formel berechnen.
  457.  
  458.                        e=(1+(1/n))^n
  459.  
  460.             Wobei n unendlich gro▀ ist.  (Simus-Zahl oder so Σhnlich)
  461.  
  462.  
  463. AldibΣrman
  464.  
  465.  (AldibΣrman, auf ein Wort: Wozu brauchst Du ein auf 1000-10000 Stellen genaues
  466.   e ? Naja, ich bin mal gespannt, ob ein Leser eine L÷sung in Assembler
  467.   einreicht...)
  468.  
  469. ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
  470. Yo Coder !
  471.  
  472. Gerade isses uns gelungen, in weniger als 25 (!!!) Assemblerzeilen einen
  473. waschechten Starwars-Scroller zu programmieren ! Leider hat das Ding
  474. momentan noch den Nachteil, mit blo▀en 12 Hertz zu laufen, aber Probleme
  475. sind ja dazu da, um gel÷st zu werden.
  476. Wie auch immer, die 25 Zeilen dⁿrften wohl Weltrekord sein, oder ?
  477.  
  478. CU on CeBIT '94,
  479.  
  480.                   Sorcero/XYMOX Produxions
  481.                   Acerer/Bytepool Project
  482. ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
  483. Hi Sorcerer!
  484. Das Problem mit deinem "Claim-Problem" dⁿrfte darin bestehen, da▀ das zu
  485. "claimende" Programm, bzw. deine neue Upcall-Routine, im  normalen Application-
  486. Memory liegt. Dieser Speicher wird aber vom OS immer umgebankt, so da▀ nach
  487. dem dem beenden deines Programmes die Upcallroutine aus dem "sichtbaren"
  488. Speicher verschwand. Du mu▀t deine Routine wohl oder ⁿbel in die RMA packen,
  489. also absoluten Speicher belegen, der auch beim Multitasking nicht gemapt wird.
  490.  
  491. Xcalibur
  492. ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
  493. Ikarus! Ich schΣtze mal, da▀ du um FN-Makro's nicht herumkommen wirst. Ich
  494. habe mir dazu eine FN geschrieben. Allerdings muss man fⁿr diese Funktion
  495. das ArcTools-Modul geladen haben, da dieses einen speziellen SWI zur Ver-
  496. fⁿgung stellt: SWI "ARCTOOLS_Assemble"! Damit kannst du ARM-, FPU- und
  497. (ARM3-) Co-Prozessorinstruktionen assemblieren. Fuer die Cachecontrolle des
  498. ARM3 gibt es einfache 'Namen', z.B. kannst du Schreiben 'FNAss("CSHR  Rd,Cx")'
  499. (Cache Status Read) um das Cache-Register Cx ins ARM-Register Rd zu laden.
  500. Fⁿr Cx kannst du z.B. auch 'Control' nehmen (also 'FNAss("CSHR R0,Control"
  501. liest Cache-Control Register). 'Normalerweise' mⁿsstest du das so schreiben:
  502. 'MCR Cp#15,Op#0,R0,C0,C0,0' um das Cache-ID Register nach R0 zu laden...
  503.  
  504. Im Manual-File von Arctools steht's ausfⁿhrlich beschrieben.
  505. Mein Makro (in meiner Bibliothek) sieht ⁿbrigens so aus:
  506.  
  507. ----------------------------- absprengen -----------------------
  508.  
  509. DEF FNAss(_special$)
  510.   LOCAL ERROR
  511.   PRINT "Instruction: ";_special$;"... ";
  512.   ON ERROR LOCAL:PRINT "ERROR!!!":REPORT:RESTORE ERROR:ERROR 255,"(ArcTools
  513.   error -> see ArcTools manual)"
  514.   PROCGetPC
  515.   SYS "ARCTOOLS_Assemble",_special$,P% TO !pc%
  516.   pc%+=4:P%+=4:O%+=4:PRINT "Ok"
  517.   RESTORE ERROR
  518. =FALSE
  519.  
  520. DEF PROCGetPC
  521.   IF Z% AND %100 THEN
  522.     pc%=O%
  523.   ELSE
  524.     pc%=P%
  525.   ENDIF
  526. ENDPROC
  527.  
  528. ----------------------------- wegflexen ------------------------
  529.  
  530. In Z% befinden sich die OPT-Settings. PROCGetPC ben÷tige ich fⁿr einige
  531. Makros, um die Offsets richtig zu berechnen (wichtig wenn mit der Option
  532. 'Offsetassemblierung' gearbeitet wird).
  533.  
  534. Xcalibur
  535. ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
  536. Whow! Endlich habe ich es geschafft, einen Quicksort von C nach BASIC, und
  537. von da dann nach ARM-Code zu 'portieren' (so nennt man das wohl...). Da
  538. dem einen oder anderen vielleicht grade SO eine Sortierroutine fehlt, hier
  539. mal der Source. Fⁿr 100.0000 Langworte braucht der A5000 ca. 1,6 Sekunden...
  540.  
  541. --------------------------- schnipp ------------------------------
  542.  
  543. REM>QuickSort implementierung in ARM Assembler
  544. REM  ---[ Rekursiv ]---> geht Quicksort auch schneller?
  545. count%=100000
  546. DIM p% 4000 , t% count%*4
  547. MODE MODE
  548. PROCassemble
  549. FOR i%=0 TO count%
  550.   t%!(i%*4)=RND(&7ffffff)
  551. NEXT i%
  552. PRINT "sorting... ";:T%=TIME
  553. REM ARM Register in Beschlag nehmen...
  554. A%=t%:B%=0:C%=count%-1:CALL sort
  555. PRINT (TIME-T%)/100;" Sekunden!"
  556. FOR i%=0 TO 19
  557.   PRINT i%;"  ";~t%!(i%*4)
  558.   WAIT
  559. NEXT i%
  560. END
  561.  
  562. DEF PROCassemble
  563.   FOR pass%=0 TO 2 STEP 2
  564.     P%=p%
  565.     [OPT pass%
  566.  
  567. ; R0 = tabelle%
  568. ; R1 = left
  569. ; R2 = right
  570. ; R3 = l
  571. ; R4 = r
  572.  
  573. ; sort ist der Einsprung von BASIC, sortx ist der
  574. ; 'rekursive' Einsprung...
  575.  
  576. .sort     STMFD   R13!,{R1-R4}       ; REGs merken
  577. .sortx    STMFD   R13!,{R14}         ; LINK REG save
  578.           MOV     R3,R1              ; l=left
  579.           MOV     R4,R2              ; r=right
  580.           ADD     R5,R3,R4           ; mid=(l+r) DIV 2
  581.           MOV     R5,R5,LSR #1       ; -"-
  582.           LDR     R5,[R0,R5,LSL #2]  ; temp
  583.  
  584. .sloop                               ; REPEAT
  585.  
  586. ; WHILE f(l)<temp l=l+1 WEND
  587. .slpleft  LDR     R6,[R0,R3,LSL #2]
  588.           CMPs    R6,R5
  589.           ADDLT   R3,R3,#1
  590.           BLT     slpleft
  591.  
  592. ; WHILE temp<f(r) r=r-1 WEND
  593. .slpright LDR     R6,[R0,R4,LSL #2]
  594.           CMPs    R5,R6
  595.           SUBLT   R4,R4,#1
  596.           BLT     slpright
  597.  
  598. ; IF l <= r THEN SWAP f(l),f(r)
  599.           CMPs    R3,R4
  600.           LDRLE   R6,[R0,R3,LSL #2]
  601.           LDRLE   R7,[R0,R4,LSL #2]
  602.           STRLE   R7,[R0,R3,LSL #2]
  603.           STRLE   R6,[R0,R4,LSL #2]
  604.           ADDLE   R3,R3,#1
  605.           SUBLE   R4,R4,#1
  606.  
  607. ; UNTIL r < l
  608.           CMPs    R4,R3
  609.           BGE     sloop
  610.  
  611. ; IF left < r THEN sort(left,r)
  612.           CMPs    R1,R4
  613.           STMLTFD R13!,{R1-R4}      ; alte REGs merken
  614.           MOVLT   R2,R4             ; right = r
  615.           BLLT    sortx
  616.  
  617. ; IF l < right THEN sort(l,right)
  618.           CMPs    R3,R2
  619.           STMLTFD R13!,{R1-R4}
  620.           MOVLT   R1,R3             ; left = l
  621.           BLLT    sortx
  622.  
  623.           LDMFD   R13!,{R14}        ; alter PC nach R14
  624.           LDMFD   R13!,{R1-R4}      ; alte REGs
  625.           MOVS    PC,R14            ; RETURN/END
  626.  
  627.      ]
  628.      NEXT
  629. ENDPROC
  630.  
  631. --------------------------- schnapp ------------------------------
  632.  
  633. Und wech...
  634.  
  635.  \/
  636.  /\CALIBUR
  637. ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
  638. Ist ja schon eindrucksvoll, die 3D-Grafik aus Zarch, Lander, Aldebaran und
  639. demnΣchst Arcturus. Nur, wieso wird keine 'richtige' 3D-Grafik erzeugt,
  640. also das man den Hintergrund dreht und immer in die Flug- bzw. Fahrrichtung
  641. schaut? So schwer kann das ja wohl nicht sein (man arbeitet daran... Hehe :-)
  642.  
  643. Xcalibur
  644.  
  645.  (Hey Xcalibur, die Sache, an der Du gerade arbeitest, sieht aber wirklich
  646.   schon vielversprechend aus ! Zuerst dachte ich, da▀ Du da eine waschechte
  647.   Gouraud-Routine eingebaut hΣttest. Dann ist mir aber aufgefallen, da▀ es
  648.   sich "nur" um normale Vektorgrafik mit *extrem* vielen Polygonen handelte..)
  649.  
  650. ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
  651. Sorcerer: Reintheoretisch sollte Deine UpCallV-Routine korrekt arbeiten, tut
  652. sie aber nicht. Vielleicht liegts daran, da▀ das OS darauf besteht, da▀ es die
  653. richtigen Rⁿckmeldungen kriegt (und nicht KEINE). Also spring einfach am Ende
  654. Deiner Routine in die Originalroutine!
  655.  
  656. QArc
  657. ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
  658. Acero: Rom ist gro▀, das dⁿrftest Du ja wohl wissen! In meinem Archie ist Rom
  659. jedenfalls 2 MB gro▀. Aber irgendwo hab ich mal was davon gelesen, da▀ man aus
  660. einem Modul in ein Basicprogramm springen kann (und wieder zurⁿck!). Sollte ich
  661. es irgendwann zufΣlligerweise wieder finden, dann melde ich mich bei Dir.
  662.  
  663. QArc
  664.  
  665.  (Das hilft mir jetzt weiter, wirklich ! QARC, ICH KANN DIR NUR RATEN: FINDE
  666.   DIESE TEXTSTELLE ! ANSONSTEN...)
  667.  
  668. ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
  669. Acero: Wⁿrdest Du Dich etwa freuen, wenn gute Demos nur fⁿr den Arm3
  670. rauskommen? Glaub ich nicht, Du k÷nntest sie Dir ja garnicht anschauen. Und um
  671. richtig fies zu sein, wⁿrd ich auch abfragen ob die Maschine auch nen Arm3 hat,
  672. wenn nicht wird erst garnichts gemacht! Aber zum Glⁿck schalten die meisten
  673. Demos nur in einen speziellen Arm3-Modus um ! Glⁿck fⁿr Dich!
  674.  
  675. QArc
  676.  
  677.  (Ich wⁿrde mich schon freuen, wenn ⁿberhaupt mal gute Demos herauskΣmen :-)..
  678.   Aber soweit ich wei▀, gibt es bei fast keinem Demo einen speziellen
  679.   ARM3-Modus. Die Grafikausgabe wird eventuell schneller, das ist aber auch
  680.   schon alles.)
  681.  
  682. ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
  683. Ikarus wozu brauchst Du eigentlich die FPA Befehle? Irgendwie find ich die FPA
  684. nicht so toll wie erwartet, sie kann doch eh nur Addieren, Subtrahieren,
  685. Mutliplizieren und Dividieren. Wichtiger wΣre doch Sin und Wurzeln!!!
  686.  
  687. QArc
  688.  
  689.  (Nee, die neue FPA ist wirklich nur gro▀er Schwachsinn. POVray, der neue
  690.   Mega-Raytracer, braucht mit FPA nur 10% der Zeit, die der ohne FPA brΣuchte.
  691.   Und dieser minimale Zeitgewinn ist doch nun wirklich das Geld fⁿr die
  692.   bl÷de FPA wert !)
  693.  
  694. ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
  695.  
  696.