Im Magazin „CT" wurde im Heft 1 1986 der folgende Artikel abgedruckt.
Eine Fülle von Tipps zum Patchen von TURBO PASCAL.
|
|
Neue Turbo-Patches
Eingriffe und Einblicke in Turbo-Pascal 2.0 und 3.0 unter CP/M-80
Peter Sawatzki
Manfred Schnell
Bernhard Lücke
Es gibt nach wie vor noch etliches zu flicken und auszubessern an Turbo-Pascal 2.0, die wohl die am weitesten verbreitete Version dieses Compilers ist.
Aber auch die Version 3.0 weist noch behebbare Mängel auf.
Diese Zusammenstellung enthält alle Hinweise und Tips zum Thema Turbo-Pascal, die die Redaktion erreichten, nebst einem nützlichen Utility zum Abspeichern des Workfiles nach einem Programmabsturz.
Die Patches nehmen in der Regel Veränderungen im Laufzeitsystem (Run-time-library) von Turbo-Pascal vor.
Für die neue Version 3.0 wurde dieses System stark überarbeitet, so daß die Adreßlage von Routinen und Parametern innerhalb des Laufzeitsystems nicht mehr mit der alten Version 2.0 übereinstimmt.
Aus diesem Grund sind Patches für die alte Version nicht auf die Version 3.0 übertragbar.
Alle folgenden Patches werden deshalb zweimal angeboten - für jede Turbo-Version eine eigene Patch-Version.
Der erste Patch betrifft das Low/Highlighting, das bereits in 'Pascal Patching' (c't 6/85, S.104) behandelt wurde und zu unschönen Effekten führt, wenn bei der Terminal-Installation die Frage nach 'LowVideo' mit dem Code für die Invers-Darstellung beantwortet wird.
Diesmal zielt der Patch direkt auf die verantwortlichen Speicherplätze und beseitigt nicht nur das 'ästhetische Manko' im Compiler-Menü, sondern vertauscht auch die Ausführung der Prozeduren 'LowVideo' und 'NormVideo'.
Auch im Editor werden dann Blöcke invers dargestellt, und die Dialogzeile des Editors sieht etwas schöner aus.
Tabelle 1 zeigt, welche Änderungen bei den Versionen 2.0 und 3.0 vorzunehmen sind.
Turbo-Pascal 2.0: | Turbo-Pascal 3.0: |
Adresse
$0209
$020C
$5CB6
$5CBB
|
alt
$90
$A9
SA9
$90
|
neu
$A9
$90
$90
$A9
|
Adresse
$01F1
$01F4
$5E4E
$5E53
|
alt
$6B
$84
$84
$6B
|
neu
$84
$6B
$6B
$84
|
Tabelle 1. So gepatched arbeitet Turbo-Pascal auch mit Terminals zusammen, die über inverse Darstellung verfügen.
|
Patch Numero 2 bewirkt das automatische Einlesen der Fehlermeldungsdatei, die zwar rund 1 KByte Speicher belegt, aber in der Entwicklungsphase von Programmen gute Dienste tut.
Dieser Patch ist zwar schon dagewesen, aber diesmal gibt es ihn auch für die Version 3.0 (Tabelle 2).
Turbo-Pascal 2.0: | Turbo-Pascal 3.0: |
Adresse
$2129
$212A
$212B
|
alt
$CD
$42
$2C
|
neu
$3E
$0B
$B7
|
Adresse
$222C
$222D
$222E
|
alt
$CD
$21
$2D
|
neu
$3E
$0B
$B7
|
Tabelle 2. Dieser Patch bewirkt das automatische Einlesen der Fehlermeldungsdatei.
|
Soll der Original-Compiler nicht überschrieben werden, muß das COM-File nach dem Patchen zum Beispiel mit SAVExxxPTURBO.COM auf die Diskette zurückgeschrieben werden.
Für xxx ist bei Turbo-Pascal 2.0 '119' und bei der Version 3.0 '121' einzusetzen.
Die nicht sehr benutzerfreundliche Handhabung von Diskettenfehlern unter CP/M 2.2 war Anlaß für den nächsten Patch.
Dieses Betriebssystem ahndet Diskettenwechsel mit einem Warmstart, sofern man ihn nicht anzeigt, das heißt die Diskette 'einloggt'.
Auch bei einem Schreibversuch auf eine schreibgeschützte Diskette findet man sich im Betriebssystem wieder und muß neu warmstarten.
Beim Editieren unter Turbo-Pascal befindet sich das gesamte Textfile im Speicher.
Versucht man es abzuspeichern, hat aber die Diskette gewechselt und sie mit dem 'L'-Kommando nicht 'eingeloggt', oder ist die Diskette gar schreibgeschützt, so führt das zum Rücksturz ins Betriebssystem und Verlust des Textfiles.
Der Patch in Tabelle 3 erzeugt ein Warmstartprogramm, das den Programmtext nicht löscht.
Turbo-Pascal 2.0: | Turbo-Pascal 3.0: |
Adresse
$0101
$0102
|
alt
$C9
$1F
|
neu
$35
$21
|
Adresse
$0101
$0102
|
alt
$E2
$20
|
neu
$38
$22
|
Tabelle 3. Das Warmstartprogramm muß nach diesen Patches mit 'SAVE 1 WSTART.COM' gespeichert werden.
|
Er verändert den Einsprung in den Compiler und umgeht die Initialisierung der Zeiger auf das Textfile.
Nach dem Patchen speichert man die ersten 256 Byte des Compilers mit 'SAVE 1 WSTART.COM' und lädt den Turbo-Compiler neu.
Ruft man WSTART unmittelbar nach einem Programmabsturz auf, befindet man sich wieder im Turbo-Hauptmenü und kann den Programmtext zum Beispiel neu bearbeiten.
WSTART funktioniert nicht nur nach einem BDOS-Error, sondern auch nach dem regulären Ausstieg aus Turbo mit Quit und nach einem Reset.
Nach letzterem allerdings nicht bei allen Rechnern.
Ebenfalls nach BDOS-Fehlern, Quit und Reset ist das Programm WorkSave recht nützlich (Programm 1).
program WorkSave;
var
f : file;
fname : string[20];
workstart : integer absolute $4427;
workend : integer absolute $4429;
procedure WriteHex(ad:integer);
begin
inline($CD/$48D);
end;
begin {WorkSave}
write('Text: ',workend-workstart-1,' Bytes ($');
WriteHex(workstart);
write('-$');
WriteHex(workend-1);
writeln(')');
write('Name: ');
repeat readln(fname);
until fname< >'';
begin
assign(f,fname);
Rewrite(f);
blockwrite(f,mem[workstart],
(workend-workstart-1) shr 7 + 1);
close(f);
end;
end.
|
Programm 1. Worksave für Turbo-Pascal 2.0.
Bei der Version 3.0 muß die Adresse für workstart $4544, und für workend $4546 lauten.
Die Routine zur Ausgabe von Hex-Zahlen ist bei $4AF zu finden, dies muß in der Inline-Anweisung berücksichtigt werden.
|
Es speichert das Workfile nachträglich auf Diskette.
Zuerst gibt WorkSave die Länge des Textfiles nach Turho-Manier in dezimaler und hexadezimaler Darstellung an, letztere mit Hilfe einer Routine der Run-time-library, die von der Inline-Anweisung aufgerufen wird.
Abgespeichert wird der Programmtext, nachdem mit man einen File-Namen angegeben hat.
Das Programm selbst ist als COM-File zu übersetzen unter der Angabe der End-Adresse $8029, um Überschneidungen zwischen WorkSave und dem Turbo-Workfile zu vermeiden.
Die angegebenen Adressen für workstart, workend und für die 'inoffizielle' Prozedur WriteHex beziehen sich auf die Turbo-Version 2.0.
Für die Version 3.0 sind die absoluten Adressen wie angegeben zu ändern.
Phantom-Platz
Der letzte Patch behebt eine Eigentümlichkeit von Turbo-Pascal 2.0 unter CP/M Plus.
Während sich andere kommerzielle Programme wie WordStar oder dBase tunlichst nur der BDOS-Funktionen bedienen und deshalb sowohl unter CP/M 2.2 als auch unter CP/M Plus ihre Schuldigkeit tun, macht Turbo-Pascal da eine kleine Ausnahme.
Beide Turbo-Versionen arbeiten mit BIOS-Aufrufen, die von CP/M Plus in der althergebrachten Weise nicht unterstützt werden.
Das BIOS ist nämlich in verschiedenen Speicherbänken untergebracht, und Turbo kann die notwendige Bankumschaltung nicht vornehmen.
So kommt es schon mal vor, daß Turbo-Pascal auf einer 180-K Byte-Diskette 202 K Byte freien Speicherplatz meldet.
Übrigens sind die Funktionen Bios und BiosHL unter CP M Plus auch nicht mehr lauffähig.
Borland wird aber keine Turbo-Version für CP/M Plus herausbringen, sondern schlägt folgende Lösung zur korrekten Berechnung der freien Diskettenkapazität vor:
2B62: LD C,1A ;Setzt DMA
LD DE,2B95 ;mit Adresse 2B95
;jetzt frei, da mit CP/M 2.2
;Berechnung beschrieben
CALL 5 ;BDOS Aufruf
LD C,19 ;Ermittelt aktuelles Laufwerk
CALL 5 ;BDO5, Ergebnis in Accu
LD C,2E ;Ermittelt freie Disk Kapazität
LD E,A ;Aktuelles Laufwerk übergeben
CALL 5 ;BDOS. schreibt 3 Byte Record-
;Anzahl auf durch DMA definierte
;Adresse 2B95
LD HL,(2B95) ;HL mit dem HighByte der Record-
;Anzahl laden
LD A,(2B97) ;LowByte in Accu
LD C,A ;vom Accu nach C geben
LD B, 3 ;
2B7E: XOR A,A ;Accu und Carry-Flag auf 0 setzen
RR C ; Drei Byte Zahl drei mal
RR H ; halbieren => durch B teilen
RR L ; ergibt Platz in kBytes
DJNZ 2B7E ;
JP 2B98 ;Zurück zur alten Turbo-Routine
;Integer Darstellung des freien
;Speicherplatzes auf Diskette
2BB2: NOP ;Code löschen, gehört noch zur
NOP ;Berechnungsweise unter CP/M 2.2
NOP ;
NOP ;
NOP ;
|
Programm 2. Mit dieser Reparatur berechnet Turbo-Pascal 2.0 auch unter CP/M Plus die freie Diskettenkapazität richtig.
|
In CP/M Plus steht eine eigene BDOS-Funktion zur Verfügung, die die freie Diskettenkapazität berechnet.
BDOS 2Eh (dezimal 46) gibt auf drei aufeinanderfolgenden Adressen einen Drei-Byte-Wert aus, der die Anzahl der freien Records angibt.
Ein Record umfaßt bekanntlich 128 Byte.
Die Adressen liegen am Anfang des DMA-Bereichs, der mit der Funktion 1A (dezimal 26) beliebig festgelegt werden kann.
Programm 2 ersetzt die alte Berechnung in Turbo-Pascal 2.0.
Sie lädt den vom BDOS ermittelten Wert in das HL- und in das A-Register, teilt ihn per Schiebebefehl durch acht, um die freie Kapazität in Kilobyte zu erhalten, und übergibt diesen Wert zur Ausgabe an die entsprechende Routine des Compilers.
Alle hier vorgestellten Patches lassen sich mit jedem Debugger (DDT, DDTZ, SID, ...) vornehmen oder mit Hilfe eines Pascal-Programms, wie in c't 6/85.
Eine verbesserte Lösung des Mark/Release-Problems beziehungsweise der falschen Verwaltung der dynamischen Variablen mit Dispose, kann in c't 12/85. S. 7 nachgelesen werden.
Eingescanned von
Werner Cirsovius
November 2002
© Heise Verlag