Ein paar Beispielprogramme in x86 Assembler für DOS - Teil 4: Benchmark Programm

  • Teil 4 - Ausgabe von farbigen Zeichen, Cursor Position holen und setzen, Messen von vergangener Zeit (5 Sekunden) und Schleifendurchläufe


    Hier hat mich doch glatt die Liste von Ralph Brown (BIOS und DOS Interrupt List) auf's Glatteis geführt.

    Denn dort wird der Video-Interrupt 10h mit der Funktion 0Eh zur Ausgabe von farbigen Zeichen falsch beschrieben !

    Die besagte Funktion 0Eh kann nur im Grafik-Modus Zeichen farbig ausgeben, befindet man sich im Textmodus, bleibt alles monochrom.

    Die Ausgabe der Schleifendurchläufe ist mit der aus den früheren Beispielen bereits bekannten Ausgaberoute (print) gemacht worden.


    Die Zeitmessung geschieht durch den Vergleich des Ticks Wert an Stelle 0040:006C , der Timer läuft nämlich weiter solange keine Interrupts gesperrt sind.

    Die im Programm abgewarteten 91 Ticks sind genau 5 Sekunden (ein Tick ist 1/18.2 Sekunden lang).


    Die Ausgabe alteriert drei Zeichen immer im Wechsel, außerdem alle 16 Farben.

    Ob das Programm auch mit einer Monochrom-Video-Karte läuft, habe ich nicht ausprobiert.

    Da aber nicht in den Videospeicher direkt reingeschrieben wird, könnte es trotzdem klappen.


    Im ZIP ist wieder die Quelldatei, das fertige ausführbare Programm und die kleine Batchdatei zum Erstellen drin.


    Interessant ist folgendes: PCem ist mit einem emulierten Pentium MMX 233 schneller als die DOSBOX. Scheinbar hat die DOSBOX einen Zwischenspeicher nur für eine begrenzte Menge an Zeichenausgaben, beim Überschreiten der Menge wird DOSBOX recht langsam. Ein echter Rechner verhält sich da definitiv anders, PCem macht das (auch) besser.

  • Kleiner Zusatz:

    Ich glaube ich brauche von ein paar real existierenden IBM PC kompatiblen Rechner (bis Pentium II einschließlich) mal ein paar Werte.

    Es scheint, also ob PCem da auch Quatsch in Sachen Emulationsgeschwindigkeit liefert.


    Mein AMD K6-2/400 Rechner mit PCI-Videokarte liefert "nur" einen Wert von 129.


    Der zweite Rechner, den ich habe (ein 386DX33) startet momentan nicht, kann also keinen weiteren Vergleichswert liefern.

    Der hat aber auch keine CMOS-RAM-Pufferbatterie momentan drin, bisher ging das Einschalten auch ohne... mal sehen was da los ist.



    Es kann auch sein, dass die Subtraktion der zwei Timerwerte etwas optimistisch betrachtet war. Es ist ja eigentlich ein 32-Bit Wert, ich nehme aber nur den unteren 16-Bit Wert, daher kann es auch sein, dass ich vor der Messung den Ticks-Wert sichern muss, dann auf Null setzen und am Schluß wieder den gesicherten Wert (+91 Ticks) zurückschreiben muss. Da muss wohl noch ein Update her - kommt heute noch.

    "The biggest communication problem is we do not listen to understand. We listen to reply." - Stephen Covey


    Webseite und Blog ist immer noch - seit fast 20 Jahren - online.

  • Bei Ralph Brown steht doch BL = foreground color (graphics modes only), das deckt sich doch mit dem was du schreibst? Oder verstehe ich das falsch?

    Suche: SGI Indigo (gerne IP12), DEC/DIGITAL CRT Monitor und ein VT240 (inkl. Monitor).

  • Hat sich geklärt, hatte lokal eine alte Version der Brown-Liste. Kann man aber wohl trotzdem überlesen (offensichtlich).


    Hier eine aktualisierte Version vom Sourcecode inkl. ausführbarem Programm.

    Timer Werte werden vor der Messung jetzt immer auf 0 gesetzt, und später wieder restauriert.


    Der AMD K6-2/400 bringt komischerweise trotzdem weiterhin so schlechte Werte. Scheint wohl auch mit der ATI Karte zusammenzuhängen.

    Mein 386DX33 habe ich wieder zu laufen gebracht, der bringt auch den Wert von 27 loops in "echt".

    Scheint wohl brutale Unterschiede in Sachen Zeichenausgabegeschwindigkeit bei den Videokarten zu geben.


    P.S.: Dass die Funktion 0Eh nicht im Textmode funktioniert, ist trotzdem ärgerlich, weil es das Ganze komplizierter macht.

  • Alles klar. Im Text-Modus kannst du doch einfach nach B800 schreiben :)

    Suche: SGI Indigo (gerne IP12), DEC/DIGITAL CRT Monitor und ein VT240 (inkl. Monitor).

  • Dafür habe ich sogar mal meinen einzigen (naja, fast) DOS Rechner hervorgekramt :)


    Der Compaq Portable 386 (DX 20) kommt auf 36 loops:



    Ich habe so eine ganz vage Erinnerung dass sich diese Tick-Zahl irgendwann mal geändert hat. Kann das sein, oder bilde ich mir das nur ein?


    Ich freue mich übrigens endlich mal wieder richtig Assembler Code zu sehen, nicht dieses komische GNU Zeug...

    Suche: SGI Indigo (gerne IP12), DEC/DIGITAL CRT Monitor und ein VT240 (inkl. Monitor).

  • Das ist aber ein recht guter Wert (im Vergleich).

    Was für ein Grafikchip ist das denn in Deinem Compaq ?

    Das der Ticks-Wert nicht immer 1/18.2 Sekunden beträgt würde ich verneinen, zumindest mit allen Rechnern die mehr als 10 Jahre alt sind.


    P.S.: Wollte nicht direkt in den Grafikkartenspeicher schreiben, weil das bei CGA Karten sonst den berühmten Schnee zusätzlich erzeugt. Und ich war mir nicht sicher, ob das immer bei jeder Art von Videokarte gut geht. Manche Dinge gehen bestimmt auch einfacher, wenn man mit 386+ Code arbeiten würde, aber die Software sollte hat selbst mit einem IBM PC/XT arbeiten...

    "The biggest communication problem is we do not listen to understand. We listen to reply." - Stephen Covey


    Webseite und Blog ist immer noch - seit fast 20 Jahren - online.

  • Die DOSBOX schickt wohl jedes einzelne Byte über Funktionen, wo sie dann in langen switch-case Abfragen ausgewertet werde. Das muß einfach langsam sein, und wohl auch massiv selbstlimitierend wenn da wirklich jedesmal die Funktionsdaten neu auf dem Stack angelegt werden (C) müssen.


    Ansonsten: auf einem PC mißt das Programm hier ja vielleicht auch ein wenig die Grafikkarte mit und nicht nur den PC. Sprich, wenn die Karte schneller ist, als der PC Daten schickt, mißt man den reinen 'PC', wenn nicht, limitiert die Karte. Sollte man evtl. auch mal ausprobieren mit einer UrAlt Karte, ob da im gleichen Rechner massiv andere Loop's kommen.

    -- 1982 gab es keinen Raspberry Pi , aber Pi und Raspberries

  • Wie bei allen Benchmarks kann man sich hier wohl auch streiten was genau das misst. Ich würde mal behaupten hier wird auch die BIOS Imlementierung gebenchmarkt :)


    Die Graphik ist eine etwas spezielle CGA Variante, genaueres weiss ich nicht dazu.

    Zitat von Wikipedia

    The graphics card can be configured between CGA and MDA emulation mode whereas the CGA mode is mandatory for using Microsoft Windows' Compaq Plasma Driver and graphic capabilities in general. The internal CGA graphics card is able to display a resolution up to 640x400 pixels with a color depth of 2 bits (monochrome), which has been first seen in the AT&T 6300 built by Olivetti, surpassing the original IBM standard by 200 pixels in height while remaining fully CGA compatible elsewhere.

    Suche: SGI Indigo (gerne IP12), DEC/DIGITAL CRT Monitor und ein VT240 (inkl. Monitor).

  • So oder so, man misst halt wie der Rechner sich in der Praxis verhält. Ich wollte ja nicht nur die CPU-Geschwindigkeit ermitteln, das wäre ja langweilig.

    "The biggest communication problem is we do not listen to understand. We listen to reply." - Stephen Covey


    Webseite und Blog ist immer noch - seit fast 20 Jahren - online.

  • Da ich bisher wenig Feedback bekommen habe, stelle ich diese Beitragsserie mit dem nächsten, letzten Teil 5 ein.

    Das wird das bisher größte Beispielprogramm sein, mit XMS Nutzung, und diesmal auch mit einer großen Menge an Subroutinen.

    Das Programm ist noch in der Mache und hat Fehler, aber so sieht es schon mal nach dem Starten aus:

    "The biggest communication problem is we do not listen to understand. We listen to reply." - Stephen Covey


    Webseite und Blog ist immer noch - seit fast 20 Jahren - online.

  • Wahrscheinlich wäre deutlich mehr Feedback da, wenn Du die Assemblerprogramme hier noch direkt als lesbaren Textcode mit reingestellt hättest. Soll heißen, zusätzlich zu der Variante im ZIP nochmal in einem Textcodefragment im laufenden Text.


    Vermutlich ist das aber auch schon thematisch eine Sache, wo viele gar nicht wirklich was dazu sagen können, weil vmtl. die wenigsten mal x86 Assembler programmiert haben werden.

    ( Ich glaube auch, daß das generell relativ unüblich war, mal von Doom abgesehen. )


    Ist halt schade, gerade auch weil Du Dir anscheinend auch viel Mühe beim Dokumentieren gegeben hast, und das daher auch für absolut Uneingeweihte durchaus "lesbar" ist (in deutsch wäre natürlich noch besser ;) ).

    -- 1982 gab es keinen Raspberry Pi , aber Pi und Raspberries

  • Ich find's schon sehr interessant, hab es aber für mich eher als zukünftiges Projekt vorgemerkt.

    Meine Assembler-Zeit auf 8088 liegt schon ein wenig zurück. Ich kann mich aber noch dran erinnern, dass ich mal mit Turbo Pascal 3.0 was mit Text- und Grafikausgabe gemacht hab und das war mir viel zu langsam. Ich bin dann über Inline-Assembler und INT10h auf direkte Speichernutzung umgestiegen. Da liegen jeweils Größenordnungen an Geschwindigkeit drin - zumindest bei einem 8088 mit CGA-Karte.

    Ich fänd's toll, wenn du mit dem Thema weiter machst.

    Das Genie beherrscht das Chaos

  • Im vogons.org Forum für die DOSBOX hat es zwar keine Erklärung gegeben, warum der Effekt mit der Verlangsamung in DOSBOX auftritt, aber es gibt eine Abhängigkeit, um das überhaupt sehen zu können. Der "Cycle" Wert muss mind. auf 4000 stehen, oder halt am Besten auf "max", dann ist die Verlangsamung schön zu sehen. Wer es nicht selbst ausprobieren will - habe ein Youtube Video davon gemacht: https://www.youtube.com/watch?v=hsuNpOgipDg ...

    "The biggest communication problem is we do not listen to understand. We listen to reply." - Stephen Covey


    Webseite und Blog ist immer noch - seit fast 20 Jahren - online.