The following article was printed in issue 8 1986 of the magazine „CT".
A TURBO PASCAL patch to correct the display of disk free space running CP/M Plus.

Phantom gefangen

Korrekte Angabe des freien Disketten-Platzes bei Turbo Pascal 3.0 unter CP/M 3.0

Franz Renz

Leider gibt es von Borland keine speziell an CP/M 3.0 angepaßte Version des Turbo-Compilers. So funktioniert zum Beispiel die Kapazitäts-Anzeige des Dir-Kommandos nicht unter diesem Betriebssystem. Nachdem wir in c't 1/86 eine Lösung dieses Problems für Turbo-Pascal 2.0 vorstellten, liegt jetzt auch der Patch für die aktuelle Compiler-Version 3.0 vor.

Die Ursache des ganzen Kummers ist, daß der Turbo-Compiler BIOS-Aufrufe zur Berechnung des Diskettenplatzes benutzt. Diese Aufrufe werden von CP/M 3.0 nicht in genau derselben Weise wie von CP/M 2.0 unterstützt, mit der bekannten Folge, daß der Compiler auf einer 180-KByte-Diskette schon mal '320 KByte free' meldet.

Der Patch ersetzt die alte Diskettenplatz-Berechnung in Turbo-Pascal 3.0. Er ist identisch mit dem für die Turbo-Version 2.0, nur die Adreßlage wurde angepaßt. Er bedient sich der BDOS-Funktion 2Eh (dezimal 46), die die Anzahl der freien 128-Byte-Records berechnet und sie in drei aufeinanderfolgenden Bytes am Anfang des DMA-Bereichs ablegt. Dieser vom BDOS ermittelte Wert gelangt in das HL- und A-Register, wird per Schiebebefehl durch 8 geteilt, um die freie Kapazität in Kilobyte zu erhalten, und zur Ausgabe an die entsprechende Routine des Compilers übergeben.

Mit diesem Patch stimmt die Kapazitätsangabe.
2C41  0E 1A	2C41:	LD	C,1Ah	  ;DMA-Adresse auf
2C43  11 74 2C		LD	DE,2C74h  ;2C74h setzen
2C46  CD 05 00		CALL	5h	  ;
2C49  0E 19		LD	C,19h	  ;aktuelles Laufwerk
2C4B  CD 05 00		CALL	5h	  ;ermitteln
2C4E  0E 2E		LD	C,2Eh	  ;freie Kapazität
2C50  5F		LD	E,A	  ;(Laufwerk in E)
2C51  CD 05 00		CALL	5h	  ;ermitteln
2C54  2A 74 2C		LD	HL,(2C74) ;Wert in HL-
2C57  3A 76 2C		LD	A,(2C76)  ;und A-Reg. laden
2C5A  4F		LD	C,A	  ;Low Byte in C-Reg
2C5B  06 03		LD	B,3h	  ;Loop-Counter
2C5D  AF	2C5D:	XOR	A	  ;Carry clearen
2C5E  CB 19		RR	C	  ;3-Byte-Zahl
2C60  CB 1C		RR	H	  ;3mal halbieren
2C62  CB 1D		RR	L	  ;-> Kapazität in
2C64  10 F7		DJNZ	F7	  ;Kilobyte
2C66  C3 77 2C		JP	2C77	  ;zurück zur alten
					  ;Turbo-Routine
2C91  00	2C91:	NOP		  ;alten Code
2C92  00		NOP		  ;löschen
2C93  00		NOP
2C94  00		NOP

Scanned by Werner Cirsovius
November 2002
© Heise Verlag