software:diy:assembler:dosbugs
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende Überarbeitung | Letzte ÜberarbeitungBeide Seiten der Revision | ||
software:diy:assembler:dosbugs [10/07/2010 20:07] – Schreibfehler korrigiert ebert | software:diy:assembler:dosbugs [19/09/2010 16:09] – interne Links eingefügt uxt | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ====== Bekannte DIP DOS Bugs, Besonderheiten und Undokumentiertes ====== | ||
- | |||
- | Was sind eigentlich Bugs? Streng genommen handelt es sich dabei um Programmfehler - zumeist solche, die nur unter bestimmten Randbedingungen auftreten und deshalb schwer auffindbar sind. Gewöhnlich gibt es solche Käferchen in jedem größeren Programm und mit Sicherheit auch in jedem Betriebssystem. Was DIP-DOS anbelangt, so waren sie die Motivation für das Erscheinen mehrerer (jeweils fehlerbereinigter) Versionen und einiger installierbarer Patches. | ||
- | Neben solchen " | ||
- | |||
- | Die dritte Kategorie, um die es hier gehen soll, beinhaltet schlicht Undokumentiertes, | ||
- | |||
- | |||
- | ==== Das Versions-Dilemma ==== | ||
- | |||
- | // | ||
- | |||
- | So ist es im [[hardware: | ||
- | |||
- | === DOS-Version und Hochsprachen === | ||
- | |||
- | Oder: Wie bekommt ein Programm heraus, unter welchen Namen (bzw. Pfad) es aufgerufen wurde? | ||
- | |||
- | In Hochsprachen wie C/C++ oder (Turbo-)Pascal ist dies eigentlich eine triviale Angelegenheit. Man erhält den Namen als " | ||
- | also '' | ||
- | In den erwähnten Hochsprachen wird nun das " | ||
- | |||
- | Wäre DIP-DOS wirklich ein DOS 2.x, gäbe es tatsächlich keinen auch nur halbwegs offiziellen Weg, an den Aufrufnamen heranzukommen - lediglich einen ziemlich üblen Hack unter Ausnutzung der System File Table (SFT), dazu aber später ...\\ | ||
- | Glücklicherweise benimmt sich die EXEC-Funktion im POFO aber genau wie die von DOS 3+, so dass der Programmpfad auch hier im Environment-Segment landet. Was zu tun bleibt ist also, eine Funktion zu schreiben, die den Wert besorgt und in Turbo-C ungefähr so aussehen kann: | ||
- | |||
- | <code cpp> | ||
- | # | ||
- | # | ||
- | |||
- | char _arg0[MAXPATH]; | ||
- | const char* getProgName() | ||
- | { | ||
- | int intvar; | ||
- | char far* penv; | ||
- | intvar = *(int far*) MK_FP(_psp, | ||
- | penv = (char far*) MK_FP(intvar, | ||
- | while ((penv != NULL) && ((*penv) != ' | ||
- | { | ||
- | while ((*penv) != ' | ||
- | ++penv; | ||
- | } | ||
- | penv += 3; /* adjust pointer to start of program name */ | ||
- | for (intvar = 0; intvar < MAXPATH; ++intvar, ++penv) /* copy path */ | ||
- | { | ||
- | | ||
- | if ((*penv) == ' | ||
- | } | ||
- | return _arg0; | ||
- | } | ||
- | </ | ||
- | |||
- | Die hier verwendete globale Variable '' | ||
- | in das Environment-Segment immer ein FAR-Zeiger ist. String-Funktionen wie '' | ||
- | |||
- | Ein anderer möglicher Weg wäre es, dem aufgerufenen Programm eine andere DOS-Version (3.x) vorzugaukeln. Da die Betriebssystem-Version nirgends als Variable gespeichert ist, bleibt dafür nur, einen eigenen Handler für die DOS-Funktion 30H (Get Version Number) zu installieren, |
software/diy/assembler/dosbugs.txt · Zuletzt geändert: 19/09/2010 00:09 (Externe Bearbeitung)