Was ist FPU_FIX.PRG ? --------------------- FPU_FIX ist ein Patchprogramm fr die TOS-Versionen 3.0x (TT-Tos). In diesen TT TOS Versionen befindet sich in der Resetroutine ein Fehler, der sich bei einem Reset ber Tastatur bemerkbar macht (Warmstart). TOS versucht in der Resetroutine festzustellen ob ein Mathecoprozessor im Rechner eingebaut ist. Dazu testet es, ob die Ausfhrung eines Coprozessorbefehls gelingt. Leider ist der dazu gew„hlte Befehl die Wandlung einer im FP0 Register gespeicherten Fliežkommazahl in eine Integerzahl. Wenn in dem FPU-Register eine Zahl steht, die nicht mehr in eine 32-Bit Integerzahl konvertiert werden kann (TOS beschreibt das Register nie; es enth„lt also einen zuf„lligen Wert), l”st der Coprozessor eine Operand Error Exeption aus, die TOS nicht abf„ngt. Dies hat zur Folge, daž sich die Resetroutine aufh„ngt, und nur noch der Griff zum Resettaster den Rechner 'aufweckt'. Es handelt sich bei dem Befehl um ein 'FMOVE.L FP0,D0', der den Inhalt des Registers FP0 zuerst in eine Integerzahl konvertiert, und dann in das Register D0 bertr„gt. Es folgt ein Disassemblerlisting, erstellt mit TempleMon und TOS 3.05. Bei TOS 3.01 ist die Routine 2 Bytes vorher im ROM, also ab $E0040E. !,00E00410 MOVE.L #$5F465055,(A0)+ 20FC 5F46 5055 ;(#'_FPU') !,00E00416 MOVE.L $002C,A1 2278 002C ;Line-F Emulator ;Vektor sichern !,00E0041A MOVE.L $0034,A2 2478 0034 ;Coprocessor ;Protocol ;Exeption-Vektor ;sichern !,00E0041E MOVE.L A7,A3 264F ;Stapelpointer ;sichern !,00E00420 MOVE.L #$00E0043C,$002C 21FC 00E0 043C 002C ;neue Line-F ;Emulator Routine ;wird ;angesprungen, ;wenn keine FPU ;vorhanden !,00E00428 MOVE.L #$00E0043C,$0034 21FC 00E0 043C 0034 ;neue Coprocessor ;Protocol ;Exeption Routine ;wird ;angesprungen ;wenn Interface ;FPU-CPU defekt !,00E00430 FMOVE.L FP0,D0 F200 6000 ;Der Testbefehl, ^^^^^^ ;ob FPU vorhanden ;ist (fehlerhaft!) !,00E00434 MOVE.L #$00020000,(A0)+ 20FC 0002 0000 ;Kennung fr ;68882 FPU in ;CookieJar ;eintragen !,00E0043A BRA $E0043E 6002 ;weiter gehts !,00E0043C CLR.L (A0)+ 4298 ;keine FPU, ;hierher springen ;die neuen ;Exeptionroutinen !,00E0043E MOVE.L A1,$002C 21C9 002C ;Exeptions !,00E00442 MOVE.L A2,$0034 21CA 0034 ;restaurieren !,00E00446 MOVE.L A3,A7 2E4B ;SP restaurieren Wie kann dieser Fehler behoben werden? -------------------------------------- FPU_FIX sorgt dafr, daž bevor die Resetroutine des TOS an die kritische Stelle kommt in alle Coprozessorregister 0 geschrieben wird, und die FPU in einen definierten Zustand gebracht wird. FPU_FIX wird einfach in des AUTO-Ordner kopiert und meldet sich beim Start mit der Meldung: FPU_FIX V1.2 installiert ½ 1991 by Stefan Wolf. Wenn FPU_FIX auf einem ST oder auf einem TT ohne FPU (da gibt's nix zu fixen) gestartet wird, wird eine Fehlermeldung ausgegeben und FPU_FIX nicht installiert. FPU_FIX h„ngt sich in den Resetvektor mit der XBRA-Kennung FFix ein. Eine zweite M”glichkeit den Fehler zu beheben --------------------------------------------- Wer ber ein EPROM-Programmierger„t verfgt, kann das TOS im Rom so zu patchen, das es einen anderen Coprozessorbefehl zum Testen nimmt. Es bietet sich an ein FMOVE.L D0,FP0 (also gerade Ziel und Quelle zu tauschen) zu verwenden. Hier kann niemals die Operand Error Exeption auftreten, weil eine Integerzahl immer in eine Fliesskommazahl konvertierbar ist. !,00E00430 FMOVE.L D0,FP0 F200 4000 ; korrigierter Befehl ^^^^^^ ^^ Die beiden Befehle unterscheiden sich zudem in nur einem Bit, das sich durch Nachprogrammieren eines TOS-Eproms „ndern l„žt. Die Žnderung ist durch šberbrennen m”glich, da bei TOS 3.05 im Eprom EO (EvenOdd) das Byte an der Adresse $10C von $60 auf $40 ge„ndert werden kann. Beim TOS 3.01 ist es das Eprom EE (EvenEven), bei dem das Byte an Adresse $10C von $60 auf $40 ge„ndert werden muž. Autoren Johannes Hill (Fehlerursache und Disassemblerlisting) Stefan Wolf (Patchprogramm und Readme)