Tips und Tricks für Programmierer

Wer schon einmal versucht hat, den Cache der MC68030 CPU im Falcon zu deaktivieren, um etwa ältere, Cache-feindliche Software zur Mitarbeit zu überreden, hat vermutlich lange und vergebens gesucht. Weder im Desktop noch in Allgemein CPX-Modul findet sich ein geeigneter Schalter. Was nun? 1. Möglichkeit: Selber ein entsprechendes Programm basteln. 2. Möglichkeit: Kontrollfeld patchen.

Um unnötiger Speicherverschwendung vorzubeugen, fällt unsere Wahl auf das Patchen! Aber was? Der Desktop scheidet aus, denn der liegt im ROM. Bleibt noch das »GENERAL.CPX« (Allgemein). Im TT, der die gleiche CPU wie der Falcon besitzt, funktioniert es ja auch! Also munter das betreffende CPX disassembliert und nachgeschaut. Der »hopping Point« in GENERAL.CPX Version 1.1 und 1.2 sieht so aus:

	move.l	'_MCH', -(SP)	; Das _MCH-Cookie wird abgefragt
	movea.l	xcpb, A0
	movea.l	$getcookie(A0), A0
	jsr	(A0)
	addq.w	SP
	tst.w	D0
	beq.s	nix_wars	; Cookie gefunden?
	move.l	(SP), D0	; Wert des Cookies nach d0
	moveq	#16, D1
	asr.l	D1, D0	; 16 Bit nach links
	move.l	D0, (SP)
	moveq	D2	; Auf FALCON! testen
	cmp.1	D0, D2
	bne.s	nix_wars	; <-- Das ist der Hund!
	moveq	D0
	bra.s	fertig
nix_wars:
	clr.w	D0
fertig:
	addq.w	SP
	rts

Also GENERAL.CPX scheint den Falcon zu kennen, ignoriert ihn allerdings in Sachen Cache gar heftig. Nun liegt der Gedanke nahe, das »bne.s nix_wars« zu ändern. Also, aus »bne.s nix_wars« machen wir »beq.s nix_wars« und siehe da, schon funktioniert es! Der ehemals freie Platz über »Lautsprecher« wird nun von »Chip Select« belegt. Wer auf den schattierten Button darunter klickt, erhält eine nette Auswahl: Blit/Cache aus, Blitter an, Cache an, Blit/Cache an. Leider läßt sich der Blitter auf dem Falcon, aus Gründen, die nur Atari kennt, nicht wirklich ausschalten. Der CPU Cache wird allerdings richtig bedient. Auch »Sichern« funktioniert ab sofort entsprechend!

Natürlich wäre es ein wenig viel verlangt, für diese kleine Änderung GENERAL.CPX komplett zu disassemblieren und neu zu übersetzen, daher greifen wir zu einem irgendeinem Disk/File-Monitor und ändern folgendes:

XCONTROL V1.1 GENERAL.CPX:

Version Offset Alter Wert Neuer Wert
V 1.1 $1D28 (7464) $66(102) $67(103)
V 1.2 $1D72 (7538) $66(102) $67(103)

Bei unbekannten oder neuen Versionen von XCONTROL/GENERAL.CPX sucht man das Vorkommen des Strings »_MCH« in der Datei GENERAL.CPX. Folgt ein paar Bytes ($30) weiter $7403, $B480, $6604, dann sind wir richtig. Wie vorher, machen wir aus $66(BNE.S) $67(BEQ.S).

Laut Atari gibt es keine Möglichkeit mit »evnt_multi()« beide Maustasten gleichzeitig und trotzdem unabhängig abzufragen. Wer also gleichzeitig auf das Drücken der linken Maustaste ODER der rechten Maustaste via evnt_multi() warten will, steht nach offizieller Atari-Verlautbarung im Regen. Keine Panik, es ist kein wildes »Drumherum«-Programmieren nötig, es gibt ein undokumentiertes Feature. Der zweite Parameter von evnt_multi (UWORD bclk) ist der Trick! Wird hier im oberen Byte das erste Bit gesetzt und steht im 4. Parameter (UWORD bst) eine Null, behandelt das AES beide Maustasten unabhängig. Das Warten auf einen (Doppel)Klick mit der linken oder rechten Maustaste sieht unter C dann so aus:

	evnt_multi (MU_BUTTON, 0x102,3,0 ...)

Atari hatte offensichtlich ein Einsehen mit den Nöten der Programmierer, denn dieser Trick funktioniert unter allen TOS-Versionen, einschließlich Multi- und Falcon-TOS. Warum er allerdings nie offiziell dokumentiert wurde, bleibt ein Rätsel. Nachforschungen haben ergeben, daß er in vielen Programmen seit langem verwendet wird. Selbst die »Geißschen-GEM-Päpste« verwenden ihn in ihrer Phönix-Datenbank. Ein Kavaliersdelikt?

(Richard Kurz/ah)



Aus: TOS 06 / 1993, Seite 53

Links

Copyright-Bestimmungen: siehe Über diese Seite