home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
GEMini Atari
/
GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso
/
zip
/
tt
/
superfix.lzh
/
SUPERFIX.S
< prev
next >
Wrap
Text File
|
1991-06-06
|
7KB
|
143 lines
*****************************************************************
* *
* 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