Quick-Tips

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



Aus: ST-Computer 05 / 1993, Seite 114

Links

Copyright-Bestimmungen: siehe Über diese Seite