*****************************************************************
*                                                               *
*                          SUPERFIX.PRG                         *
*                                                               *
* Umgeht einen Fehler in der TT Gemdos Routine Super.           *
*                                                               *
* Die Orginalroutine enth„lt 2 (!) Fehler.                      *
*  1) Wenn Super vom Mastermode in den Usermode zurckschalten  *
*     soll wird nur das S nicht aber das M Bit gel”scht.        *
*     Dieser Zustand ist nach der Motorola Dokumentation nicht  *
*     definiert. Wird gepatcht mit (1).                         *
*  2) Beim Zurckschalten aus dem Master- in den Usermodus wird *
*     der šbergebene neue ssp in den msp geladen. Beim n„chsten *
*     Aufruf wird aber mit dem isp weitergearbeitet. Sp„testens *
*     am Ende des Programms kracht's dann. Wird gepatcht mit (2)*
*                                                               *
* (C) 1991 by Stefan Wolf                                       *
*                                                               *
*                                                               *
*****************************************************************

gemdos      EQU 1
CConws      EQU 9
Ptermres    EQU 49
xbios       EQU 14
Supexec     EQU 38
_p_cookies  EQU $05A0                     ; Pointer auf cookie-jar
trapvector  EQU $84                       ; TRAP #1 Vektor

.super:
            TEXT
start:          bra install               ; Sprung zum transienten Teil
****************************************************
* my_gemdos: Neuer Traphandler fr den Gemdos-Trap *
****************************************************
            DC.B "XBRA"
            DC.L "MSPF"
o_gemdos:   DC.L 0                        ; alter GEMDOS-Vektor
my_gemdos:                                ; Die folgende Routine entspricht
; bis auf die 3 Patchstellen der Orginalroutiene von TOS 3.05
; Orginalroutine von TOS 3.05.
                btst #5,(SP)              ; aus Supervisormodus aufgerufen?
                beq cont                  ; nein -> Interessiert uns nicht
                cmpi.w #$20,8(SP)         ; Super ?
                bne cont                  ; nein -> Interessiert uns nicht
                move.l 10(SP),D1          ; Parameter holen
                beq same_stack            ; 0L ? ->
                subq.l #1,D1              ; -1L
                beq cont                  ; ja -> Interessiert uns nicht
                movea.l 10(SP),A1         ; neuer ssp
                move.w (SP)+,D0           ; Format lesen
                move.l (SP)+,D1           ; Rckkehradresse lesen
                move.w (SP)+,-(A1)        ; Flags kopieren
                move.l D1,-(A1)           ; Rckkehradresse schreiben
                move.w D0,-(A1)           ; Format schreiben
                move USP,A0
                cmpa.l A0,SP              ; sp=USP
                beq eq_usp                ; ja ->
                move.l (SP)+,-(A0)
                andi #$EFFF,SR            ; M Bit l”schen   <<<<<<<<< (2)
                movea.l A1,SP             ; neuen ssp laden (isp)
                bra load_usp
eq_usp:         andi #$EFFF,SR            ; M Bit l”schen   <<<<<<<<< (2)
                movea.l A1,SP             ; neuen ssp laden (isp)
                bra switch
same_stack:     lea 8(SP),A0
load_usp:       move A0,USP               ; usp laden
switch:         andi.w #$CFFF,(SP)        ; S und M Bit l”schen <<<<< (1)
                rte
cont:           movea.l o_gemdos(PC),A0   ; Alter Vektorinhalt
                jmp (A0)                  ; und ab !
*******************************************************************
*           Installationsteil (bleibt nicht resident)
*******************************************************************
install:        pea super(PC)
                move.w #Supexec,-(SP)
                trap #xbios
                addq.l #6,SP
                tst.b stflag              ; Atari ST ?
                bne.s quitst              ; ja->Ende
                tst.b instflag            ; Schon installiert ?
                bne.s quitinst            ; ja->Ende
                pea message
                move.w #CConws,-(SP)      ; Startmeldung ausgeben
                trap #gemdos
                addq.l #6,SP
                movea.l #install-start+$0100,A1 ; L„nge des Residenten Teils
                clr.w -(SP)
                pea (A1)
                move.w #Ptermres,-(SP)    ; Resident verlassen
                trap #gemdos
quitst:         pea ttonly                ; Fehler 'ST-Computer'
                bra.s abort
quitinst:       pea inst                  ; Fehler 'schon installiert'
abort:          move.w #CConws,-(SP)
                trap #gemdos              ; Fehlermeldung ausgeben
                addq.l #6,SP
                clr.w -(SP)               ; Normal beenden
                trap #gemdos
super:          move.l _p_cookies,D0      ; Cookie jar vorhanden?
                seq stflag
                beq exit                  ; nein->Ende
                movea.l D0,A0
loop:           movem.l (A0)+,D0-D1       ; Ende der
                tst.l D0                  ; Liste?
                beq.s test_inst           ; ja->Schleife verlassen
                cmp.l #"_MCH",D0          ; Cookie fr Computertyp?
                bne loop                  ; nein->weiter in der Schleife
                cmp.l #$020000,D1         ; TT ?
                sne stflag
                bne.s exit                ; nein->Ende
                bra.s loop
test_inst:      tst.b stflag              ; ST ? -> Abbruch
                bne.s exit
                movea.l trapvector,A0
xloop:          cmpi.l #'XBRA',-12(A0)    ; XBRA kennung ?
                bne do_inst               ; nein ? -> dann installieren
                cmpi.l #'MSPF',-8(A0)     ; Sind wir schon da ?
                seq instflag
                beq exit                  ; JA ! -> Abbruch
                movea.l -4(A0),A0         ; XBRA verfolgen
                bra xloop
do_inst:        move.l trapvector,o_gemdos ; Alten Vektor retten
                move.l #my_gemdos,trapvector ; Neuen Vektor setzen
exit:           rts                       ; das war's
            DATA
; Startmeldung
message:    DC.B $0D,$0A
            DC.B "SUPERFIX V1.0 installiert",$0D,$0A
            DC.B "½ 1991 by Stefan Wolf",$0D,$0A,$00
; Fehlermeldungen
ttonly:     DC.B $0D,$0A
            DC.B "SUPERFIX l„uft nur auf dem Atari TT !",$0D,$0A,$00
inst:       DC.B $0D,$0A
            DC.B "SUPERFIX schon installiert !",$0D,$0A,$00
instflag:   DC.B 0                        ; Schon Installiert Flag
            BSS
stflag:     DS.B 1                        ; Flag fr Atari ST
            END



