{"id":17832,"date":"2024-12-21T10:19:03","date_gmt":"2024-12-21T09:19:03","guid":{"rendered":"https:\/\/www.bernd-leitenberger.de\/blog\/?p=17832"},"modified":"2024-12-21T10:19:03","modified_gmt":"2024-12-21T09:19:03","slug":"die-loesung-fuer-ein-ueberfluessiges-problem-welcher-computer-kann-einen-schuss-in-echtzeit-verfolgen","status":"publish","type":"post","link":"https:\/\/www.bernd-leitenberger.de\/blog\/2024\/12\/21\/die-loesung-fuer-ein-ueberfluessiges-problem-welcher-computer-kann-einen-schuss-in-echtzeit-verfolgen\/","title":{"rendered":"Die L&ouml;sung f&uuml;r ein &Uuml;berfl&uuml;ssiges Problem: Welcher Computer kann einen Schuss in Echtzeit verfolgen?"},"content":{"rendered":"<div class=\"pvc_clear\"><\/div>\n<p id=\"pvc_stats_17832\" class=\"pvc_stats all  \" data-element-id=\"17832\" style=\"\"><i class=\"pvc-stats-icon medium\" aria-hidden=\"true\"><svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"far\" data-icon=\"chart-bar\" role=\"img\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 512 512\" class=\"svg-inline--fa fa-chart-bar fa-w-16 fa-2x\"><path fill=\"currentColor\" d=\"M396.8 352h22.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-192 0h22.4c6.4 0 12.8-6.4 12.8-12.8V140.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h22.4c6.4 0 12.8-6.4 12.8-12.8V204.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zM496 400H48V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16zm-387.2-48h22.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8z\" class=\"\"><\/path><\/svg><\/i> <img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"16\" alt=\"Loading\" src=\"https:\/\/www.bernd-leitenberger.de\/blog\/wp-content\/plugins\/page-views-count\/ajax-loader-2x.gif\" border=0 \/><\/p>\n<div class=\"pvc_clear\"><\/div>\n<p>Heute mal wieder ein Blog dessen Thema wohl wenige interessieren w&uuml;rde, es ist etwas auf das ich aus Neugier gesto&szlig;en bin. Ausgangsbasis war <a href=\"https:\/\/www.youtube.com\/watch?v=VsE0BwQ3l8U\">dieses Video der Computer-Chronicles<\/a> das &uuml;ber den <a href=\"https:\/\/www.bernd-leitenberger.de\/80386.shtml\">386-Prozessor<\/a> geht. Der Moderator steht in der Eingangszene an einem Schie&szlig;stand und doziert dar&uuml;ber, dass in 1\/20 Sekunde die Kugel das Ziel trifft und in dieser Zeit der Prozessor 200.000 Operationen durchf&uuml;hrt.<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vg05.met.vgwort.de\/na\/dc9f84e43f494e6cad560fd82950a09a\" width=\"1\" height=\"1\" alt=\"\"\/><\/p>\n<p>Ich dachte mir: \u201eDer 386 kann wahrscheinlich schneller berechnen, wo <i>genau<\/i> die Kugel auftrifft, als diese f&uuml;r den Flug braucht\u201c und das inspirierte mich zu meinem heutigen Blog. Ich dachte nach: Der 386 ist schon recht schnell, ich habe mit einem Computer mit <a href=\"https:\/\/www.bernd-leitenberger.de\/TI994a-intern.shtml\">TMS 9900<\/a> angefangen, dann mit einem <a href=\"https:\/\/www.bernd-leitenberger.de\/z80.shtml\">Z80A<\/a> und dann hatte ich einen 286-er. Ich bin mir relativ sicher, dass ein <a href=\"https:\/\/www.bernd-leitenberger.de\/80286.shtml\">286-er<\/a> diese Aufgabe l&ouml;sen kann, bestimmt nicht der TMS 9900, denn der Rechner war ziemlich lahm. Aber ein Z80? Vielleicht ein <a href=\"https:\/\/www.bernd-leitenberger.de\/8086.shtml\">8086<\/a>, aber ein Z80 ist mit nur 8 Bit pro Operation, ohne Multiplikations- und Divisionsbefehle doch sehr lahm. Ich wollte es ausprobieren.<!--more--><\/p>\n<h4 class=\"western\">Randbedingungen<\/h4>\n<p>Zuerst muss man mal definieren, was man berechnen und vor allem wie genau man es berechnen will. Ich habe es mal in Alltagssprache so formuliert: Der Computer soll in der Zeit die angegeben ist (1\/20 Sekunde) die Koordinaten und Geschwindigkeit berechnen, wo eine Kugel auftrifft. Diese Koordinaten sollen von den realen Koordinaten (berechnet mit einer h&ouml;heren Zeitaufl&ouml;sung) maximal so weit abweichen, wie ein guter Sch&uuml;tze seine Sch&uuml;sse platziert.<\/p>\n<p>Das letzte Kriterium ist dehnbar. Denn nat&uuml;rlich trifft auch der Sch&uuml;tze nicht immer in den Mittelkreis. Ich habe mich mal informiert und Wettkampfschie&szlig;schieben haben einen Durchmesser von 26 cm und 5 Kreise und die Mitte. Daraus kann man als erforderliche Genauigkeit etwa 2-3 cm ableiten. Als Entfernung habe ich 25 m angenommen, das passt am besten zu der Zeitangabe von 1\/20 Sekunde.<\/p>\n<h4 class=\"western\">Die Physik<\/h4>\n<p>Die Physik hinter dem Problem ist relativ einfach. Ich gehe von einem Schie&szlig;stand aus, das hei&szlig;t es gibt keinen Seitenwind. Dann wirken nur zwei Kr&auml;fte auf die Kugel ein, nachdem sie den Lauf verlassen hat. Die einfachere Kraft ist die Erdbeschleunigung. Sie zieht die Kugel Richtung Erdmittelpunkt. Bei einer so kurzen Strecke und einer geringen &Auml;nderung der Entfernung vom Erdmittelpunkt ist dies relativ einfach zu berechnen:<\/p>\n<p>Die Geschwindigkeit Richtung Erdmittelpunkt, die ich im Folgenden als Y-Achse definiere, ist berechenbar nach:<\/p>\n<p>v<sub>y<\/sub> =v<sub>y<\/sub> &#8211; g * t<\/p>\n<p>g ist die Erdbeschleunigung von im Mittel 9,80665 m\/s\u00b2. Allerdings ist sie &ouml;rtlich leicht schwankend, weil die Erde nicht rund ist und zudem noch lokale Vertiefungen und Buckel ist. Am n&auml;chsten dem Erdmiteilpunkt ist man am Pol und am weitesten auf einem Berg in &Auml;quatorn&auml;he (z.b. dem Kilimandscharo) entfernt. Ich gehe aber von der mittleren Erdbeschleunigung aus. Es w&auml;re kein Problem das Programm so abzu&auml;ndern das man den geografisch genauen Wert eingibt, wenn man ihn den kennt.<\/p>\n<p>Die Kugel wird durch die Luft abgebremst. Dies ist komplexer. Die Abbremsung h&auml;ngt von der Geschwindigkeit, der Luftdichte, der Fl&auml;che, Masse und einem Luftwiderstandsbeiwert cw ab. F&uuml;r die Kraft gilt folgende Formel:<\/p>\n<p align=\"left\">F<sub>L<\/sub> = \u00bd v\u00b2 * A * <span style=\"font-family: Georgia, serif;\">\u03c1 * cw<\/span><\/p>\n<p>F<sub>L<\/sub> ist die Kraft die der Luftwiderstand aus&uuml;bt.<\/p>\n<p>v die momentane Geschwindigkeit<\/p>\n<p>A die Fl&auml;che der Kugel auf die die Kraft einwirkt<\/p>\n<p><span style=\"font-family: Georgia, serif;\">\u03c1 : <\/span><span style=\"font-family: Georgia, serif;\">Die Luftdichte. Auf Meeresh&ouml;he <\/span><span style=\"font-family: Georgia, serif;\">sind dies<\/span><span style=\"font-family: Georgia, serif;\"> 1,203 kg\/m\u00b3<\/span><\/p>\n<p><span style=\"font-family: Georgia, serif;\">cw: Der Luftwiderstandsbeiwert. <\/span><span style=\"font-family: Georgia, serif;\">Ich habe mal geschaut was typische Werte f&uuml;r Kugeln sind und kam auf Werte von 0,25 bis 0,3, ich habe mit 0,275 gerechnet.<\/span><\/p>\n<p>Die Abbremsung ist aber auf die Masse bezogen:<\/p>\n<p>v = v- F<sub>l<\/sub>\/m<\/p>\n<p>Logisch, ein massiver K&ouml;rper wird weniger stark abgebremst als ein hohler K&ouml;rper aus demselben Material und eine Kugel aus Metall st&auml;rker als eine Paintballkugel<\/p>\n<p>Die Abbremsung durch den Luftwiderstand ist richtungsunabh&auml;ngig, zumindest solange es keinen Wind gibt. Die Abbremsung durch die Gravitation wirkt sich aber nur auf die Geschwindigkeit Richtung Erdmittelpunkt aus, das hei&szlig;t die Geschwindigkeit in Y-Richtung sinkt, bzw. wenn eine Kugel anfangs keine Geschwindigkeit in Y-Richtung hatte (horizontaler Schuss) so bekommt sie nun eine negative Geschwindigkeit, was sich darin &auml;u&szlig;ert, das sie f&auml;llt und unterhalb des Zielpunktes aufschl&auml;gt.<\/p>\n<p>Das hei&szlig;t wir m&uuml;ssen die Geschwindigkeit in zwei Komponenten aufteilen, eine horizontale (Index x) und eine vertikale (Index y). Nach den Gesetzen der Mathematik gilt:<\/p>\n<p>v<sub>x<\/sub> = v * cos(winkel)<\/p>\n<p>v<sub>y<\/sub> = v * cos(winkel)<\/p>\n<p>Der Winkel ist der Schusswinkel relativ zum Horizont also einer Linie parallel zur Erdoberfl&auml;che. Bei einem Horizontalen Schuss ist er 0 Grad. F&uuml;r eine l&auml;ngere Strecke wird der Sch&uuml;tze die Erdanziehung kompensieren und mit einem Winkel gr&ouml;&szlig;er Null leicht \u201enach oben\u201c schie&szlig;en.<\/p>\n<p>Aus der Physik wissen wir auch:<\/p>\n<p>v = Wurzel(v<sub>x<\/sub>\u00b2 + v<sub>y<\/sub>\u00b2)<\/p>\n<p>Was letztlich auf dem Satz des Pythagoras beruht.<\/p>\n<p>Die Routine selbst berechnet nun einfach in einer Schleife ausgehend vom Weg 0 und den Geschwindigkeiten in x und y-Richtung (Vx und Vy) die &Auml;nderungen (Abbremsung durch den Luftwiderstand und Beschleunigung durch die Gravitation in einem kleinen Zeitintervall. Je kleiner es ist, desto genauer ist das Ergebnis. Das Herausfinden der Schrittgr&ouml;&szlig;e dt f&uuml;r die geforderte Genauigkeit von &lt; 3 cm auf 50 m ist auch eine Aufgabe, die man durch Probieren herausfindet. Durch Addition der Ver&auml;nderungen bekommt man eine neue Geschwindigkeit f&uuml;r den n&auml;chsten Durchlauf und analog addiert man die Geschwindigkeiten um den zur&uuml;ckgelegten Weg zu erhalten.<\/p>\n<h4 class=\"western\">Integrieren<\/h4>\n<p>Nun wird die Kugel durch den Luftwiderstand immer langsamer, gleichzeitig nimmt die Y-Geschwindigkeit durch die Anziehung der Erde zu. W&auml;re die Abbremsung nicht, so k&ouml;nnte man den Weg relativ einfach nach der bekannten Formel S = \u00bd v-a*t\u00b2 berechnen. So ist der Weg aber ein Integral einer komplexen Formel. Numerisch gibt es einige Verfahren dies zu l&ouml;sen. Ich habe das einfachste genommen, das der eine oder andere vielleicht noch vom Mathematikunterricht kennt. Wenn man da die Fl&auml;che unter einer Kurve \u2013 die Kurve ist in unserem falle die Flugbahn und die Fl&auml;che ist der Weg \u2013 bestimmen will, so wendet man einfach die obigen Formeln an und teilt die Berechnung in sehr kleine Intervalle auf, deren Summe dann das Integral ist. In der Physik ist das Integral der Geschwindigkeit der Weg.<\/p>\n<p>Mathematisch gilt:<\/p>\n<p>Integral von F(x) = F(x)+F(x+dx) \/ 2 *dx<\/p>\n<p>In unserem Fall:<\/p>\n<p>Weg = V<sub>x<\/sub>(t) + V<sub>x<\/sub>(t+dt) \/ 2 * dt<\/p>\n<p>Real l&auml;uft dies so ab: Wir rechnen in einer Schleife die aktuelle Geschwindigkeit aus \u2013 wobei wir bei jedem Durchgang den Luftwiderstand und die Anziehung der Erde neu berechnen, basierend auf den alten Werten. Die Summe der Geschwindigkeiten in x Richtung ist dann der zur&uuml;ckgelegte weg. Wir stoppen, wenn wir die Zieldistanz erreicht haben.<\/p>\n<h4 class=\"western\">Optimieren<\/h4>\n<p>Da wir nun von einem viel langsameren Computer als heute reden, will ich einige Worte &uuml;ber das Optimieren verlieren. Das naheliegendste ist es Operationen zusammenzufassen. In der Berechnung des Luftwiderstandes gibt es nur eine variable Gr&ouml;&szlig;e: Die Geschwindigkeit. Alle anderen Gr&ouml;&szlig;en k&ouml;nnen einmal berechnet werden und als eine Konstante betrachtet werden inklusive des Zeitschlitzes dt.<\/p>\n<p><span style=\"font-family: Georgia, serif;\">Bei der Gravitationskonstante war ich verleitet sie gar nicht erst in der Schleife zu berechnen. Im Video war von einer Flugzeit von <\/span><sup><span style=\"font-family: Georgia, serif;\">1<\/span><\/sup><span style=\"font-family: Georgia, serif;\">\/<\/span><sub><span style=\"font-family: Georgia, serif;\">20<\/span><\/sub><span style=\"font-family: Georgia, serif;\"> Sekunde die <\/span><span style=\"font-family: Georgia, serif;\">R<\/span><span style=\"font-family: Georgia, serif;\">ede. Praktisch d&uuml;rfte <\/span><span style=\"font-family: Georgia, serif;\">nach den Gesetzen der Physik die Kugel so maximal 1,22 cm tief fallen, was unterhalb der 3 cm Grenze ist. Das h&auml;tte einen sehr gro&szlig;en Vorteil, n&auml;mlich das man die Geschwindigkeit nicht in x und <\/span><span style=\"font-family: Georgia, serif;\">y<\/span><span style=\"font-family: Georgia, serif;\"> Komponente aufsplitten m&uuml;sste, was den Rechenaufwand auf ein Drittel reduziert.<\/span><\/p>\n<p>Aber es soll ja physikalisch korrekt sein und auch noch korrekte Ergebnisse geben, wenn man einen Pr&auml;zisionsschuss &uuml;ber eine sehr viel l&auml;ngere Strecke berechnet.<\/p>\n<p>Eine andere Optimierung liegt im Weg und der neuen Geschwindigkeit. Wir errechnen ja die Geschwindigkeits&auml;nderung in x und y Richtung. Es bietet sich an diese zuerst mit 0,5 zu multiplizieren, denn dann reduziert sich die Formel f&uuml;r den Weg auf:<\/p>\n<p>S<sub>x<\/sub> = S<sub>x<\/sub> +(v<sub>x<\/sub> + 0.5 dx)<\/p>\n<p>V<sub>x<\/sub> neu = V<sub>x<\/sub> + dx<\/p>\n<p>Wir m&uuml;ssen, wenn wir den Faktor 2 in die Berechnung einbeziehen dann nur die &Auml;nderung dx einmal beim Weg und zweimal bei der Berechnung von Vx neu einbeziehen. Der Faktor 2 steht oben unterm Bruchstrich. Aber Divisionen brauchen bei Rechnern ohne Flie&szlig;kommaprozessor, also alles vor dem 486 deutlich l&auml;nger als Multiplikation und die doppelte Addition geht noch schneller als die Multiplikation.<\/p>\n<p>Mein Programm hat beide Schleifentypen integriert. Also die ausformulierte und die optimierte Form. Daneben l&auml;uft als Vergleich noch eine Berechnung mit hoher Zeitaufl&ouml;sung von 1 Mikrosekunde (Lazarus) bzw. 100 Mikrosekunden (DOS\/CP\/M). Das ist n&ouml;tig, weil die Plattformen langsamer sind und auch keinen Coprozessor haben. Man muss zudem bedenken das je kleiner ich den Zeitschritt mache um so mehr spielt die Genauigkeit eine Rolle, weil die &Auml;nderungen dx,dy immer kleiner werden nach wie vor aber in den Termen die normalen Geschwindigkeiten und der Weg auftauchen. Der alte Datentyp Real hat 12 Stellen Genauigkeit, dagegen kann man bei Lazarus mit Extended als Datentyp mit bis zu 20 Stellen Genauigkeit rechnen.<\/p>\n<p>Ich nehme normalerweise sprechende Variablen. Das wir hier K&uuml;rzel wie \u201esy\u201c finden, hat mit der Physik zu tun. Die Gr&ouml;&szlig;en f&uuml;r den Weg sind \u201eS\u201c und f&uuml;r die Geschwindigkeit\u201cv\u201c. Der zweite Index gibt dann die Komponente (x,y) an.<\/p>\n<h4 class=\"western\">Tests<\/h4>\n<p>Die Frage ist nat&uuml;rlich, wie man das Programm nun testet. Ich habe zwei Z80 Computer \u2013 genauer gesagt, einen Rechner mit einem <a href=\"https:\/\/www.bernd-leitenberger.de\/blog\/2022\/01\/01\/das-miniz-c-system\/\">Z180<\/a> und einem mit einem eZ80. Zumindest beim Z180 kann man relativ einfach die Geschwindigkeit auf einen Z80 extrapolieren, beim <a href=\"https:\/\/www.bernd-leitenberger.de\/blog\/2024\/03\/14\/der-schnellste-z80-rechner\/\">eZ80 <\/a>ist das deutlich schwerer, weil er intern stark optimiert ist. Aber beide haben nur Echtzeituhren mit nur 1 Sekunde Zeitaufl&ouml;sung. Das ist also nicht zielf&uuml;hrend.<\/p>\n<p>DOX Box ist als Ziel f&uuml;r einen 8086 oder 80286 sinnvoll. Aber die <a href=\"https:\/\/www.dosbox.com\/wiki\/Performance\">Dokumentation<\/a> von DOXBox weist, aus das man einstellt, wie viele Instruktionen pro Sekunde abgearbeitet werden. Nun brauchen die Instruktionen aber unterschiedlich lange zur Ausf&uuml;hrung und gerade die hier ben&ouml;tigten Multiplikationen und Divisionen brauchen etwa beim 8086 10-mal mehr Zeit als eine Addition\/Subtraktion. Es ist aber die einzige Emulatorplattform die ich habe.<\/p>\n<p>Ich habe das Programm daher auf einem Emulator f&uuml;r den Amstrad CPC unter CP\/M laufen lassen. Der Emulator muss akkurat sein, denn sonst w&auml;ren Spiele nicht spielbar. Das liefert einem einen Anhaltspunkt f&uuml;r die minimale Performance und man kann aus Benchmarkvergleichen wie dem <a href=\"https:\/\/www.bernd-leitenberger.de\/blog\/2019\/12\/24\/benchmark-my-computer\/\">ct\u2019 Highlevel Benchmark<\/a> dann auf andere Prozessoren schlie&szlig;en. Der Vorteil ist nat&uuml;rlich auch das ich es in Pascal entwickeln kann und nur zum Compilieren auf die Zielplattform gehen muss. Der Z80A im <a href=\"https:\/\/www.bernd-leitenberger.de\/Amstrad-CPC-Serie.shtml\">Armstrad CPC<\/a> l&auml;uft nominell mit 4 MHz. Allerdings muss er den Speicherzugriff mit einem ASIC Teilen, das die 16.000 Bytes des Bildschirmspeichers 50 bzw. 60-mal pro Sekunde an den Monitor &uuml;bertr&auml;gt. Man nutzte aus, das der Speicherzugriff bei einem normalen Z80 immer in den ersten zwei von vier Takten einen Maschinenzyklus erfolgte. Allerdings mussten dann alle Befehle immer Vielfache von 4 Zyklen haben, auch wenn dies in der Realit&auml;t nicht so war. So lief er effektiv nur mit 3,2 MHz. Daf&uuml;r wurde ein Waitimpuls an die Z80 angelegt, wenn das Gate Array auf den Speicher zugriff.<\/p>\n<h4 class=\"western\">Die Ergebnisse<\/h4>\n<p>Aus Bequemlichkeitsgr&uuml;nden habe ich die Masse einer Patrone und ihren Durchmesser schon im Programm verankert. Wer will, kann diese leicht eingeben lassen. Sie entsprechen den Wikipediaangaben f&uuml;r die Standardpatrone 9 x 19 mm Parabellum.<\/p>\n<p>Also moderne PC\u2019s sind beim test au&szlig;en vor. Ich habe bei einem CPC Emulator es mal getestet und dann unter DOS-BOX mit der Einstellung eines 8088 mit 4,77 MHz also des Prozessors, der im IBM PC verbaut war. Tests unter Lazarus ergaben das bei einem Zeitschlitz von 5 ms (0.005 als Eingabe) die Abweichung in der Y-Richtung kleiner als 3 cm ist.<\/p>\n<table width=\"100%\" cellspacing=\"0\" cellpadding=\"0\">\n<thead>\n<tr valign=\"top\">\n<th width=\"20%\">Prozessor<\/th>\n<th width=\"30%\">MHz<\/th>\n<th width=\"30%\">Laufzeit 0.005 s<\/th>\n<th width=\"20%\">Laufzeit 0.0001 s<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr valign=\"top\">\n<td width=\"20%\">Z80<\/td>\n<td width=\"30%\">3,2<\/td>\n<td width=\"30%\">0,26 s \/ 0.67<\/td>\n<td width=\"20%\">11,3 s \/ 30,65<\/td>\n<\/tr>\n<tr valign=\"top\">\n<td width=\"20%\" height=\"21\">8086<\/td>\n<td width=\"30%\">4,77 MHz<\/td>\n<td width=\"30%\">0,17 s \/ 0,39 s<\/td>\n<td width=\"20%\">6,26 s \/17,25 s<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p>Ein Tipp: Damit ihr nicht dauernd alles neu eingeben m&uuml;sst, k&ouml;nnt ihr die Parameter auf der Kommandozeile eingeben:<\/p>\n<p>Schuss 365 0.005 25 0<\/p>\n<p>W&auml;re die Kombination, die ich f&uuml;r Tests nutze (365 m\/s, 0.005 s Zeitaufl&ouml;sung 25 m Distanz Winkel 0 Grad). W&uuml;rde man nun ein Gewehr simulieren, das eine h&ouml;here M&uuml;ndungsgeschwindigkeit hat, so w&auml;re die Abweichung kleiner aber auch die Flugzeit geringer. Da die 25 m in 0,071 s zur&uuml;ckgelegt werden \u2013 in etwa passend zur 1\/20 Sekunde in dem Video \u2013 sind beide Berechnungen langsamer als die Realit&auml;t. Die Optimierung bringt aber etwas, sie halbiert in etwa die Laufzeit. Ich denke ein Z80 mit 12 MHz \u2013 den gab es in den Achtzigern nicht oder ein 8086 mit 8 MHz w&uuml;rden Realzeit errechnen. Alle Prozessoren ab dem 80286 w&auml;ren dann schnell genug um den Einschlagspunkt schneller zu berechnen als die Kugel fliegt.<\/p>\n<p>Im <a href=\"http:\/\/www.bernd-leitenberger.de\/download\/Schuss.zip\/\">Zip Archiv<\/a> findet ihr die Files:<\/p>\n<p>\u201eSchuss.pas\u201c f&uuml;r die Dos-BOX (Compiler: Turbo Pascal 3)<\/p>\n<p>\u201eSchuss2.pas\u201c f&uuml;r einen CPC-Emulator (Compiler: Turbo Pascal 3)<\/p>\n<p>\u201etimecpc.inl\u201c enth&auml;lt den Maschinencode f&uuml;r die Zeitabfrage f&uuml;r den CPC als InlineCode. Wichtig: es gibt zwei Routinen f&uuml;r den CPC 464 und 6128, in Schuss2.pas wird derzeit die f&uuml;r den 6128 (CP\/M 3) verwendet.<\/p>\n<p>\u201eSchuss.lpi, .lpr, .lps: Projektdateien f&uuml;r Lazarus und als .exe<\/p>\n<p>Wie viel Overhead dazukommt, merkt man auch daran, dass die compilierte .exe unter Lazarus 415 KByte gro&szlig; ist, unter TP 3 noch 11 KByte.<\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"pvc_clear\"><\/div>\n<p id=\"pvc_stats_17832\" class=\"pvc_stats all  \" data-element-id=\"17832\" style=\"\"><i class=\"pvc-stats-icon medium\" aria-hidden=\"true\"><svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"far\" data-icon=\"chart-bar\" role=\"img\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 512 512\" class=\"svg-inline--fa fa-chart-bar fa-w-16 fa-2x\"><path fill=\"currentColor\" d=\"M396.8 352h22.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-192 0h22.4c6.4 0 12.8-6.4 12.8-12.8V140.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h22.4c6.4 0 12.8-6.4 12.8-12.8V204.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zM496 400H48V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16zm-387.2-48h22.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8z\" class=\"\"><\/path><\/svg><\/i> <img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"16\" alt=\"Loading\" src=\"https:\/\/www.bernd-leitenberger.de\/blog\/wp-content\/plugins\/page-views-count\/ajax-loader-2x.gif\" border=0 \/><\/p>\n<div class=\"pvc_clear\"><\/div>\n<p>Heute mal wieder ein Blog dessen Thema wohl wenige interessieren w&uuml;rde, es ist etwas auf das ich aus Neugier gesto&szlig;en bin. Ausgangsbasis war dieses Video der Computer-Chronicles das &uuml;ber den 386-Prozessor geht. Der Moderator steht in der Eingangszene an einem Schie&szlig;stand und doziert dar&uuml;ber, dass in 1\/20 Sekunde die Kugel das Ziel trifft und in [&hellip;]<\/p>\n","protected":false},"author":169,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[4],"tags":[3695,5262,1713],"class_list":["post-17832","post","type-post","status-publish","format-standard","hentry","category-computer","tag-3695","tag-schuss","tag-z80","entry"],"a3_pvc":{"activated":true,"total_views":412,"today_views":0},"jetpack_featured_media_url":"","jetpack-related-posts":[{"id":18610,"url":"https:\/\/www.bernd-leitenberger.de\/blog\/2026\/03\/27\/galileos-cds-teil-1\/","url_meta":{"origin":17832,"position":0},"title":"Galileos CDS &#8211; Teil 1","author":"Bernd Leitenberger","date":"27. M\u00e4rz 2026","format":false,"excerpt":"Hall\u00f6chen, es wird Zeit das ich mich mal wieder melde. Es gab zwei Gr\u00fcnde, warum ich mich so rar gemacht habe. Das eine ist das es gerade nicht so viel aktuelles gibt, au\u00dfer einem Update zu Artemis, zu dem ich vielleicht noch etwas schreibe. W\u00e4hrend Trump das ganze Programm nach\u2026","rel":"","context":"In &quot;Raumfahrt&quot;","block_context":{"text":"Raumfahrt","link":"https:\/\/www.bernd-leitenberger.de\/blog\/category\/raumfahrt\/"},"img":{"alt_text":"","src":"https:\/\/vg07.met.vgwort.de\/na\/4fb81c7bafbd4d9d88b5695abdb33d29","width":350,"height":200},"classes":[]},{"id":18612,"url":"https:\/\/www.bernd-leitenberger.de\/blog\/2026\/03\/28\/galileos-cds-teil-2\/","url_meta":{"origin":17832,"position":1},"title":"Galileos CDS \u2013 Teil 2","author":"Bernd Leitenberger","date":"28. M\u00e4rz 2026","format":false,"excerpt":"So, heute geht es weiter mit Teil 2 \u00fcber Galileos CDS, dieser Beitrag schlie\u00dft nahtlos an den ersten Beitrag von gestern an, wie man schon an der ersten Textzeile sieht. Nach der Einleitung im ersten Teil geht es heute weiter damit warum der RCA 1802 genutzt wurde und was seine\u2026","rel":"","context":"In &quot;Raumfahrt&quot;","block_context":{"text":"Raumfahrt","link":"https:\/\/www.bernd-leitenberger.de\/blog\/category\/raumfahrt\/"},"img":{"alt_text":"","src":"https:\/\/vg07.met.vgwort.de\/na\/191e4b0728de42829cf656027b84dc82","width":350,"height":200},"classes":[]},{"id":18614,"url":"https:\/\/www.bernd-leitenberger.de\/blog\/2026\/03\/29\/galileos-cds-teil-3\/","url_meta":{"origin":17832,"position":2},"title":"Galileos CDS &#8211; Teil 3","author":"Bernd Leitenberger","date":"29. M\u00e4rz 2026","format":false,"excerpt":"So nun zum dritten Teil \u00fcber das prim\u00e4re Computersystem von Galileo, das CDS. Nachdem sich die ersten beiden Teile nur mit dem RCA 1802, warum er gew\u00e4hlt wurde und seiner Architektur befassten geht es heute um das Computersystem selbst. Der Artikel schlie\u00dft so an seine beiden Vorg\u00e4nger gestern und vorgestern\u2026","rel":"","context":"In &quot;Raumfahrt&quot;","block_context":{"text":"Raumfahrt","link":"https:\/\/www.bernd-leitenberger.de\/blog\/category\/raumfahrt\/"},"img":{"alt_text":"","src":"https:\/\/vg07.met.vgwort.de\/na\/6e7f572a246b4ac395de9c260733b707","width":350,"height":200},"classes":[]},{"id":18676,"url":"https:\/\/www.bernd-leitenberger.de\/blog\/2026\/05\/31\/die-glorreichen-10-programmiersprachen\/","url_meta":{"origin":17832,"position":3},"title":"Die glorreichen 10 \u2013 Programmiersprachen","author":"Bernd Leitenberger","date":"31. Mai 2026","format":false,"excerpt":"Ich wollte mal eine Reihe in dieser Rubrik \u00fcber Programmiersprachen machen. Zuerst dachte ich daran eine Liste nach meinen pers\u00f6nlichen Favoriten zu erstellen. Anfangs bef\u00fcrchtete ich, dass ich gar nicht auf 10 komme, aber es sind tats\u00e4chlich mehr, wenngleich ich in vielen Sprachen nur kleine Programme verfasst habe oder mich\u2026","rel":"","context":"In &quot;Die Glorreichen 10&quot;","block_context":{"text":"Die Glorreichen 10","link":"https:\/\/www.bernd-leitenberger.de\/blog\/category\/allgemein\/die-glorreichen-10\/"},"img":{"alt_text":"","src":"https:\/\/vg09.met.vgwort.de\/na\/4073c4f9dc6943a08702cdde13605d43","width":350,"height":200},"classes":[]},{"id":18683,"url":"https:\/\/www.bernd-leitenberger.de\/blog\/2026\/06\/01\/die-glorreichen-10-programmiersprachen-2\/","url_meta":{"origin":17832,"position":4},"title":"Die glorreichen 10 \u2013 Programmiersprachen (2)","author":"Bernd Leitenberger","date":"1. Juni 2026","format":false,"excerpt":"Der heutige Teil schlie\u00dft nahtlos an den ersten Teil an, der gestern erschien. Es geht um 10 Kriterien anhand derer man Programmiersprachen kategorisieren kann. Maschinennah oder universell, aber komplex Als eine maschinennahe Sprache bezeichnet man eine Sprache, die nahe den M\u00f6glichkeiten von Prozessoren ist. Das Paradebeispiel ist C. Alle Prozessoren\u2026","rel":"","context":"In &quot;Die Glorreichen 10&quot;","block_context":{"text":"Die Glorreichen 10","link":"https:\/\/www.bernd-leitenberger.de\/blog\/category\/allgemein\/die-glorreichen-10\/"},"img":{"alt_text":"","src":"https:\/\/vg09.met.vgwort.de\/na\/7f5d9cf5265047179df05b778bf455b5","width":350,"height":200},"classes":[]},{"id":18380,"url":"https:\/\/www.bernd-leitenberger.de\/blog\/2025\/09\/03\/die-glorreichen-10-das-war-mal-weg-pc-hardware\/","url_meta":{"origin":17832,"position":5},"title":"Die glorreichen 10 &#8211; Das war mal weg: PC Hardware","author":"Bernd Leitenberger","date":"3. September 2025","format":false,"excerpt":"Ich will heute mal zwei ZDF Info \/ Neo Sendungen verbinden. Die glorreichen 10, die bei mir als Vorlage f\u00fcr einige Blogs dienten und die von mir noch mehr gesch\u00e4tzte Sendung \"Das war mal weg\", wo es um Dinge geht, die fr\u00fcher fast jeder hatte und die heute aus unserem\u2026","rel":"","context":"In &quot;Die Glorreichen 10&quot;","block_context":{"text":"Die Glorreichen 10","link":"https:\/\/www.bernd-leitenberger.de\/blog\/category\/allgemein\/die-glorreichen-10\/"},"img":{"alt_text":"","src":"https:\/\/vg02.met.vgwort.de\/na\/876c61d389304d98aa0332fadd769381","width":350,"height":200},"classes":[]}],"jetpack_sharing_enabled":true,"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/posts\/17832","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/users\/169"}],"replies":[{"embeddable":true,"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/comments?post=17832"}],"version-history":[{"count":0,"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/posts\/17832\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/media?parent=17832"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/categories?post=17832"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/tags?post=17832"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}