← ST-Computer 05 / 1993

Quick-Tips

Grundlagen

Das Schweigen des Falcon!

Wen hat nicht schon hĂ€ufig das ewige Surren und Rauschen der Festplatte im Falcon030 gestört? Doch glĂŒcklicherweise hat ATARI die bisher nur fĂŒr Beschleuniger-Boards oder andere Basteleien genutzte Steuerleitung 7 des Port A am Soundchip dazu verwendet, die interne Festplatte an- und ausschaltbar zu gestalten. Ein Selektieren dieser Leitung bewirkt das Ausschalten der Festplatte, die ab diesem Zeitpunkt keinerlei Arbeiten mehr verrichtet, aber auch keine GerĂ€usche mehr von sich gibt. Keine Angst, man kann jederzeit durch deselektieren der Steuerleitung die Harddisk wieder hochfahren, was ĂŒbrigens nur sehr wenige Sekunden dauert, und problemlos mit ihr Weiterarbeiten. Man könnte sich zum Beispiel ein Accessory schreiben, welches die Harddisk per Mausklick an- und ausschaltet oder nach einer gewissen Zeit der Nichtbenutzung, die Platte automatisch ruhigstellt. Man könnte auch den Plattentreiber abĂ€ndern oder ein TSR-Programm schreiben, welches die genannten Funktionen per Tastenkombination ausfĂŒhrt, um auch in nicht-GEM-Programmen seine Ruhe zu haben.

Eine andere nĂŒtzliche Eigenschaft des Port A im Soundchip, besteht in der Möglichkeit den internen Lautsprecher ein- und auszuschalten. Dies geschieht ĂŒber die Leitung 6, die bisher mit dem Pin 3 des Monitorausgangs des ST verbunden war, um z.B. einen externen Monitorumschalter zu bedienen. Auch das mitgelieferte Kontrollfeld, gestattet dieses Umschalten im »Allgemein‘-Modul, doch es bietet sich hĂ€ufig, an diese Option in eigenen Programmen zu verwenden.

Natalie LĂŒbcke

;Mit diesem XBIOS-Aufruf wird die Leitung IOA7 ;am Port A des Soundchip selektiert, was zur ;Folge hat das die interne Harddisk abschaltet! move.w #$80,-(sp) ;Port A-IOA7 move.w #$1e,-(sp) ;Ongibit trap #14 ;(Bit setzen) addq.l #4,sp ;Mit diesem XBIOS-Aufruf wird die Leitung IOA7 ;am Port A des Soundchip wieder deselektiert und ;die interne Harddisk lÀuft wieder an! move.w #$7F,-(sp) ;Port A-IOA7 move.w #$1d,-(sp) ;Offgibit trap #14 ;(Bit löschen) addq.l #4,sp ;Mit diesem XBIOS-Aufruf wird die Leitung IOA6 ;am Port A des Soundchip selektiert, was zur ;Folge hat das der interne Speaker abschaltet! move.w #$40,-(sp) ;Port A-IOA6 move.w #$le,-(sp) ;Ongibit trap #14 ;(Bit setzen) addq.l #4,sp ;Mit diesem XBIOS-Aufruf wird die Leitung IOA6 ;am Port A des Soundchip wieder deselektiert und ;der interne Speaker schaltet wieder ein! move.w #$BF,-(sp) ;Port A-IOA6 move.w #$1d,-(sp) ;Offgibit trap #14 ;(Bit löschen) addq.l #4,sp

Schnellere Gleitkommazahlen in GFA-BASIC

Bei vielen Anwendungen ist es nötig, mit Fließkomma- statt mit Integerzahlen zu arbeiten, z.B. bei aufwendigen mathematisch-grafischen Anwendungen wie ApfelmĂ€nnchen, 3D-Grafik oder Raytracing. Doch leider sind die Fließkommazahlen um einiges langsamer als die Integerzahlen. Warum also nicht Realzahlen mit Integers realisieren? Wir nehmen einfach 32-Bit-Integers und verwenden 16 Bit als Vor- und 16 Bit als Nachkommateil. NatĂŒrlich leidet darunter etwas die Rechengenauigkeit. Auch mĂŒssen viele Rechenoperationen neu geschrieben werden, doch der Geschwindigkeitsvorteil ist ziemlich groß, besonders bei compilierten Programmen. Um nicht alle Funktionen neu schreiben zu mĂŒssen, besteht die Möglichkeit, Zahlenwerte einer Formatwandlung zu unterziehen.

DafĂŒr sind die Funktionen to_int_real und to_real zustĂ€ndig:

x%=@to_int_real(x) wandelt Realwert x in Intreal x% um

x=@to_real(x%) wandelt Intreal x% in Realwert x um

Um weitere Geschwindigkeitsvorteile zu erhalten, können beispielsweise Sinus- oder Cosinustabellen mit Intrealzahlen erstellt werden. Dadurch vereinfacht sich die Berechnung auf einen Tabellenzugriff. Das abgedruckte Listing zeigt einen Geriauigkeits- sowie einen Geschwindigkeits vergleich zwischen den beiden Typen.

C.Roth/M.Brust

'REAL-Format in INTEGER-Variablen '(c)1993 by MAXON-Computer 'Autoren: Christian Roth u. Matthias Brust ' a%=@to_int_real(256.125) !Genauigkeitsvergleich b%=@to_int_real(4096.4096) a=256.125 b=4096.4096 PRINT "INTEGER-REAL: ";@to_real(ADD(a%,b%)),"REAL: ";a+b t=TIMER !Geschwindigkeitsvergleich FOR i&=0 TO 10000 ADD a%,b% NEXT i& t=(TIMER-t)/200 PRINT "INTEGER-REAL: ";t;" S" , t=TIMER FOR i&=0 TO 10000 ADD a,b NEXT i& t=(TIMER-t)/200 PRINT "REAL: ";t;" s" GEMSYS 20 ' ' REAL Format nach ' INTEGER-REAL wandeln FUNCTION to_int_real(real) LOCAL int_real% int_real%=SHL(TRUNC(real),16) ADD int_real%,(FRAC(real)*65536) RETURN int_real% ENDFUNC ' ' INTEGER-REAL Format nach Real ' wandeln FUNCTION to_real(int_real%) LOCAL real real=SHR(int_real%,16)+(int_real% AND &HFFFF)/65536 RETURN real ENDFUNC

Longreals unter PD-Modula und SPC-Modula

Durch einen Fehler im Wirth-Compiler speichern PD und SPC-Modula Longreals bei Zuweisungen nur in Real-LĂ€nge. Dieser unauffĂ€llige Fehler (deshalb um so gefĂ€hrlicher) lĂ€ĂŸt sich umgehen:

Trick Addition:

Pl=3.141592654=3.14159+2.654E4

Allgemein:

IMPLEMENTATION MODULE MPseudokonstante; CONST(*Ten by minus 4:Tm4 *) Zehn = 1.0D+1; Zehntel = 1.0D-1; Tm4 = 1.0D-4; Tm8 = 1.0D-8; Tm12 = 1.0D-12; Tm16 = 1.0D-16;

Beispiel:

PI = SetLong(3,1414,9265,4000,0000,0);

Shift zusÀtzlich: möglicher Exponent hier 10^0 = 1)

Michael Arndt

(* (c)1993 by MAXON-Computer *) PROCEDURE SetLong(Einer:INTEGER;d1to4,d5to8,d9to12, d13to16: vierstellig;Shift:INTEGER):LONGREAL; VAR longdigit: LONGREAL; n : INTEGER; BEGIN (*FloatD Typecast auf Longreal*) longdigit := FLOATD( d1to4 )*Tm4 +FLOATD( d5to8)*Tm8 + FLOATD(d9to12)*Tm12 + FLOATD(d13to16)*Tm16; IF (Einer # 0) THEN longdigit := longdigit + FLOATD(Einer);END; IF (Shift = 0) THEN RETURN longdigit END; n:= Shift; (* Exponent *) IF (Shift > 0) THEN FOR n:= 1 TO Shift DO (* mal 10 hoch n *) longdigit := longdigit * Zehn; END; ELSE (* Shift < 0 *) FOR n := Shift TO -1 DO (*mal 10 hoch minus n *) longdigit := longdigit * Zehntel; END; END; RETURN longdigit; END SetLong; END MPseudokonstante.

Resident angehÀngt!

Die Systemvariable etv_term stellt einen Interrupt-Vektor fĂŒr die Prozeßbeendigung dar. GEMDOS durchspringt diesen Vektor vor Beendigung eines Prozesses (eines Programmes).

Nun ist es möglich, die Adresse einer eigenen Routine dort einzutragen. Dies kann nĂŒtzlich sein, wenn man die RegisterzustĂ€nde nach Beenden eines Programmes einsehen möchte. Aber auch fĂŒr Spielereien öffnet sich der Weg nach vorne.

Um eine andere Routine anzumelden, muß man in den Supervisor-Modus schalten, da es sich um eine Systemvariable handelt. Jedoch gibt es auch die Möglichkeit, durch BIOS 5 (Setexec) die Inhalte der Exception-Vektoren zu lesen oder zu setzen. Noch vor dem Ermitteln und Ändern der Routinenadresse sollte man die alte retten, die ja nach der Adresse der eigenen Routine wieder angesprungen werden muß. Die GEMDOS-Funktion Ptermres hĂ€lt das ganze noch bis zum nĂ€chsten Reset resident im Speicher.

Matthias Brust/Christian Roth