Ich brauche die Units CRT oder DOS oft nur wegen ein paar Routinen, und diese lassen sich jeweils durch ein paar Zeilen Assembler ersetzen.
Beispielsweise habe ich delay ersetzt durch:
Code: Alles auswählen
function delay(msec: word): bytebool; assembler;
asm
mov ax, msec; mov dx, 1000; mul dx { in Mikrosekunden umrechnen }
mov cx, dx; mov dx, ax;
mov ax, 08600h; int 15h { BIOS Funktion: Millisekunden Warten, Auflösung ca. 977 µsec }
mov al, 1; sbb al, 0
{ Bei Fehler ist CF gesetzt, daher AL = 1 wenn erfolgreich (-> TRUE), sonst 0 bzw. FALSE }
end;
**************************
EDIT:
Im Zusammenhang mit anderen Pascal-Funktionen wie Sound oder WriteLn bemerkt DosBox einen Illegal-Write bzw. Read Error, an astronomisch hohen Adressen. Falls jemand oben im Code sieht, wo das Problem liegt, lasst es mich bitte wissen! Ich habe selber schoneinmal so viel herausgefunden, dass das Problem nicht auftritt, wenn ich Interrupt 15h NICHT auslöse. Ich sehe mir diese BIOS-Funktion noch einmal genauer an.
**************************
Für Tastaturinput, auch ohne Warten auf Tastendruck, habe ich ebenfalls eigene Routinen.
Das ganze ist sicherlich idealistisch, aber wenn ich schon für so ein altes System programmiere, dann eben auch sorgfältig, sonst macht das keinen Spaß.
Immerhin schrumpft durch das Einsparen der CRT das kompilierte Programm schonmal um ein paar KB, auch wenn man sagt, dass Pascal immer nur diejenigen Routinen mitkompiliert, die tatsächlich auch verwendet werden. Die CRT fährt wohl einiges an Code für ihre Initialisierung ab, daher auch der alte Fehler mit dem Runtime Error 200, der (vor dem Patch) immer ein Problem war, ob man nun Delay nutzte oder nicht.
Okay, dann habe ich noch eine Frage:
Ich suche derzeit noch Wege, auch die Unit DOS zu umgehen.
setintvec und getintvec dürften jeweils durch eine handvoll Assembler-Zeilen zu ersetzen sein, wie man aber getenv (DOS-Umgebungsvariablen) ersetzt, habe ich bisher nicht herausgefunden. Möglicherweise auch eine BIOS-Funktion?
Hier würde ich mich über Hinweise freuen!
Danke soweit,
Zatzen