home *** CD-ROM | disk | FTP | other *** search
- Turbo Pascal & CP/M Plus
- Der verflixte X-Befehl
-
- Zu einem immer wieder auftauchenden
- Problem soll hiermit eine entgültige
- Lösung angeboten werden. Der X-Be-
- fehl, mit dem man vom Turbo Pascal-
- Menue aus andere Programme starten
- kann, funktioniert unter CP/M Plus
- scheinbar nur mit Glück! Ab und zu
- gibt es einen Absturz beim Versuch,
- zu Turbo Pascal zurückzukehren, z.B.
- nach dem Aufruf von PIP.
-
- Es wurden schon viele Leserbriefe
- veröffentlicht, die über diesen
- Sachverhalt klagen oder rätseln - und
- die Sache ist auch mit einem Debugger
- durchaus nicht auf den ersten Anhieb
- zu finden. Es ist aber alles ganz
- logisch, wenn man CP/M einmal näher
- betrachtet: CP/M Plus hat einfach
- mehr Funktionen als CP/M 2.2, und
- Programme wie PIP benutzen diese
- halt!
-
- Zum eigentlichen Absturz von Turbo
- Pascal führt eine Erhöhung des "multi
- sector counts" (BDOS-Funktion 44):
- Nachdem durch TURBO.OVR abgefangenen
- und simulierten Warmstart wird
- TURBO.COM geladen und gestartet, und
- zwar nach folgendem Schema:
-
- DMA-Adresse = 100h
- BDOS 26: set DMA
- BDOS 20: read sequential
- DMA-Adr. = DMA-Adr. + 80h
- Wenn nicht Datei-Ende:
- -> zurück zu BDOS 26
- ...
-
- Hier wird also jeweils ein logischer
- Sektor mit 128 Bytes gelesen, bis das
- Dateiende erreicht wird. Danach wer-
- den noch einige Daten in TURBO.COM
- geschrieben und Turbo schließlich
- gestartet.
-
- Das kann natürlich nicht gutgehen,
- wenn durch einen geänderten "multi
- sector count" durch die BDOS-Funktion
- 20 mehrere Sektoren gelesen werden!
- Aber so einfach die Diagnose klingt,
- so schwierig ist die Kur: TURBO.OVR
- läßt sich nicht einfach erweitern,
- zumal es ja noch verschiebbar sein
- soll. Die hier vorgestellte Lösung
- ist deshalb etwas komplizierter:
-
- 1. TURBO.OVR wie folgt "patchen":
-
- sid turbo.ovr
- #a22c
- 022C call 100
- 022F <RETURN>
- #s289
- 0289 43 'O'
- 028A 4F 'V'
- 028B 4D '2'
- 028C 00 .
- #s2a9
- 02A9 43 'O'
- 02AA 4F 'V'
- 02AB 4D '2'
- 02AC 20 .
- #wturbo.ovr
- 0009h record(s) written.
- #g0
-
- 2. Das Programm TURBO-
- OV2.ASM assemblieren, umbenennen und
- auf die Turbo-Pascal-Diskette kopie-
- ren (nicht vorher umbenennen, sonst
- hat man auf einmal TURBO.COM über-
- schrieben!):
-
- mac turboov2
- hexcom turboov2
- ren turbo.ov2=turboov2.com
-
- Der Patch bewirkt, daß TURBO.OVR nun
- nicht direkt TURBO.COM lädt und star-
- tet, sondern zuerst das Programm
- TURBO.OV2. Da dies weniger als zwei
- Sektoren lang ist, ist wegen dem
- falschen "multi sector count" nichts
- zu befürchten. Das Kopieren des
- Datenbereichs und der Sprung (LDIR !
- JMP nnnn) werden überschrieben mit
- CALL 100: Nun kann TURBO.OV2 die
- Einsprungadresse nnnn in TURBO.COM
- vom Stack holen, die LDIR-Parameter
- zwischenspeichern, alle CP/M Plus-
- mässigen Default-Werte setzen (auch
- gleich noch "BDOS error mode", "con-
- sole mode" und "output delimiter"),
- TURBO.COM laden, die Daten kopieren
- und an die richtige Einsprungadresse
- springen - das X-Problem wäre gelöst!
- (Cornelius Bockemühl/MC)