Im Magazin „CT" wurde im Heft 10 1986 der folgende Artikel abgedruckt.
Eine weitere Fülle von Tipps zum Patchen von TURBO PASCAL.

Neues aus Turbanien

Weitere Tips und Patches zu Turbo-Pascal unter CP/M-80

Gemäß der Verbreitung und der Beliebtheit von Turbo-Pascal will der Strom der Hinweise zu diesem Compiler einfach nicht versiegen - soll er ja auch nicht, im Gegenteil. Schier endlos sind die Möglichkeiten, sich sein Turbo-Pascal nach individuellen Wünschen zurechtzupatchen. Wie immer stellen wir nach einer Zeit des Sammelns die interessantesten Tips zusammen.

Alle hier vorgestellten Patches lassen sich mit jedem Debugger, wie DDT, DDTZ oder SID, vornehmen. Nachdem man sich den Compiler in den Speicher geladen und an den angegebenen Stellen geändert hat, sollte man ihn unter einem anderen Namen auf die Diskette zurückschreiben. Dies kann auch mit dem SAVE-Kommando geschehen. Nach Verlassen des Debuggers mit Ctrl-C befehle man SAVE 119 TURBAN.COM beziehungsweise SAVE 121 TURBAN.COM für die um rund 300 Byte längere 3.0-Version.

Alle Patches liegen für die Compiler-Versionen 2.0 und 3.0 vor.

Keine Backup-Files

Bei kleinen Disketten-Kapazitäten wird eine an sich sinnvolle Einrichtung Turbo-Pascals bald zum Alptraum. Immer wenn der Source-Text eines Programms abgespeichert wird, beläßt der Compiler die letzte Version des Programms als Backup-File auf der Diskette. Reicht der Platz nicht zum Speichern der aktuellen Version, steigt der Rechner mit der lakonischen Meldung 'Disk or Directory full' aus. Nach dem Patch wird die alte Programmversion nicht umbenannt, sondern von der neuen überschrieben.
Peter Hellinger
Kein Backup-File:
Turbo-Pascal 2.0Turbo-Pascal 3.0
Adresse
2593h
alt
17h
neu
13h
Adresse
268Bh
alt
17h
neu
13h

Fehlerdatei nicht einlesen
Begrüßungsmeldung überspringen

Diese Modifikationen sind leicht möglich, da die Aufrufe der Ausgaberoutine und die Texte im Compiler direkt hintereinander stehen. Dadurch ist für die Ausgaberoutine die Rücksprungadresse auf dem Stack ein Pointer auf den Text-String. Nach dessen Ausgabe verzweigt sie zur Adresse hinter dem Text-String. Der Verzicht auf die Fehlerdatei bringt zusätzlichen Speicherplatz von etwa 1 K Byte, das Überspringen der Eröffnungsnachricht spart Zeit beim Starten des Compilers, und der Textbereich kann für kleine Assembler-Programme genutzt werden. Natürlich lassen sich die Texte im Compiler auch leicht durch andere ersetzen. Text-Strings müssen mit einem 00h-Byte abgeschlossen werden.
Joerg Schmidtke
Fehlerdatei nicht einlesen:
Turbo-Pascal 2.0Turbo-Pascal 3.0
Adresse
2129h
212Ah
212Bh
alt
CDh
42h
2Ch
neu
3Eh
00h
B7h
Adresse
222Ch
222Dh
222Eh
alt
CDh
21h
2Dh
neu
3Eh
00h
B7h
Eröffnungsnachricht überspringen:
Turbo-Pascal 2.0Turbo-Pascal 3.0
Adresse
2060h
2061h
2062h
alt
CDh
19h
20h
neu
C3h
0Ah
21h
Adresse
2177h
2178h
2179h
alt
CDh
28h
21h
neu
C3h
0Dh
22h

Andere Extensions

Benutzt man den Turbo-Editor zum Schreiben von Texten oder FORTRAN-Programmen, ist man gezwungen, die passende Extension explizit anzugeben, da sonst der Compiler den File-Namen automatisch mit '.PAS' ergänzt. Durch Ändern dreier Speicherplätze ist es möglich, die automatisch angefügte Extension an spezielle Anwendungen anzupassen.
Michael Gries
Andere Extensions:
Adresse 2.0Adresse 3.0altz.B.o. z.B.
2C4Ch
2C4Eh
2C4Fh
2D2Bh
2D2Dh
2D2Eh
50h =P
41h =A
53h =S
54h =T
58h =X
54h =T
46h =F
4Fh =O
52h =R

UpCase auch für Umlaute

Die Funktion UpCase(ch) wandelt alle Kleinbuchstaben im Bereich von a...z in die entsprechenden Großbuchstaben um. Nach Ändern eines Bytes ersetzt UpCase auch ä, ö und ü durch Ä, Ö und Ü. In der Zeitschrift 'Computer Persönlich' wurde bereits der Patch für Turbo 2.0 gezeigt. Jetzt liegt er auch für die aktuelle Compiler-Version vor.
Manfred Schnell
UpCase inklusive Umlaute:
Turbo-Pascal 2.0Turbo-Pascal 3.0
Adresse
0488h
alt
7Bh
neu
7Eh
Adresse
04AAh
alt
7Bh
neu
7Eh

Vorzeichen der MOD-Funktion

Ist im Ausdruck A mod B das erste Argument negativ, ist sich Turbo nicht so recht über das Vorzeichen des Ergebnisses im klaren. So ist -3 mod 5 = 3, aber -7 mod 5 = -2. Der Patch schafft insofern Klarheit, als er dem Ergebnis generell das Vorzeichen von A verleiht und somit immer
A = B * (A div B) + (A mod B)
gilt. Nachdem in der mc 8/85 der Patch für Turbo 2.0 bekanntgegeben wurde, gibt es ihn jetzt auch für Turbo 3.0.
Peter Hellinger
eindeutiges Vorzeichen der MOD-Funktion:
Turbo-Pascal 2.0Turbo-Pascal 3.0
Adresse
070Fh
0710h
0711h
0712h
0713h
0714h
0715h
alt
CDh
DEh
06h
EBh
CBh
7Ah
C8h
neu
D5h
CDh
DEh
06h
F1h
EBh
F0h
Adresse
0745h
0746h
0747h
0748h
0749h
074Ah
074Bh
alt
CDh
0Fh
07h
EBh
CBh
7Ah
C8h
neu
D5h
CDh
0Fh
07h
F1h
EBh
F0h

Hex-Ausgabe nur mit {$U-}
Heap-Speicherzuweisung

Die inoffizielle Hex-Ausgabe mit Inline($cd/$48d); (V 2.0) beziehungsweise Inline($cd/$492); (V 3.0) ist mit Vorsicht zu genießen. Ist die Benutzerunterbrechung mit dem Compiler-Befehl {U+} aktiviert, fügt Turbo nach jedem compilierten Statement einen RST38 ein, über den eine Routine zur Abfrage des Keyboard-Status angesprungen wird. Und die überschreibt leider das HL-Register, in dem die Ausgabe-Routine den Hex-Wert erwartet.

Alle Speicherzuweisungen auf dem Heap werden in Vielfachen von vier Bytes vorgenommen! Falls man auf Speicherplatz angewiesen ist, lohnt es sich schon, dieses Verhalten zu berücksichtigen. Einen Record von acht auf fünf Bytes zu verkleinern, spart kein einziges Byte auf dem Heap - es werden in beiden Fällen acht Bytes reserviert. Die Funktion SizeOf arbeitet natürlich richtig und gibt die wahre Größe eines Elements an.
Alfons Seul

Schnelle Integer-Arithmetik

Auch in einer Hochsprache läßt es sich 'assemblerisch' programmieren. Besonders bestimmte Integer-Rechenoperationen können mit den richtigen Anweisungen erheblich beschleunigt werden. Statt
i:=i+1;       i:=i-1;
empfehlen sich
i:=succ(i);   i:=pred(i);
Dann benutzt der Compiler die besonders schnellen Increment-und Decrement-Befehle der CPU. Ebenfalls sollte man
i:=2*i;       i:= i div 2;
besser durch
i:= i shl 1;  i:= i shr 1;
ersetzen, was ebenfalls zu kürzerem und schnellerem Objectcode führt. Auch Multiplikationen und Divisionen mit anderen Zweier-Potenzen lassen sich durch Schiebeoperationen ersetzen. Einer Multiplikation mit 32 entspricht fünfmaliges Linksschieben (shl 5).
Erich Brandl

Eingescanned von Werner Cirsovius
November 2002
© Heise Verlag