home *** CD-ROM | disk | FTP | other *** search
- *****************************************************************
- * *
- * 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 zurückschalten *
- * 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 Zurückschalten 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 für 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 ; Rückkehradresse lesen
- move.w (SP)+,-(A1) ; Flags kopieren
- move.l D1,-(A1) ; Rückkehradresse 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 für 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 für Atari ST
- END
-
-
-
-