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 >
Text File  |  1991-06-06  |  7KB  |  143 lines

  1. *****************************************************************
  2. *                                                               *
  3. *                          SUPERFIX.PRG                         *
  4. *                                                               *
  5. * Umgeht einen Fehler in der TT Gemdos Routine Super.           *
  6. *                                                               *
  7. * Die Orginalroutine enthält 2 (!) Fehler.                      *
  8. *  1) Wenn Super vom Mastermode in den Usermode zurückschalten  *
  9. *     soll wird nur das S nicht aber das M Bit gelöscht.        *
  10. *     Dieser Zustand ist nach der Motorola Dokumentation nicht  *
  11. *     definiert. Wird gepatcht mit (1).                         *
  12. *  2) Beim Zurückschalten aus dem Master- in den Usermodus wird *
  13. *     der Übergebene neue ssp in den msp geladen. Beim nächsten *
  14. *     Aufruf wird aber mit dem isp weitergearbeitet. Spätestens *
  15. *     am Ende des Programms kracht's dann. Wird gepatcht mit (2)*
  16. *                                                               *
  17. * (C) 1991 by Stefan Wolf                                       *
  18. *                                                               *
  19. *                                                               *
  20. *****************************************************************
  21.  
  22. gemdos      EQU 1
  23. CConws      EQU 9
  24. Ptermres    EQU 49
  25. xbios       EQU 14
  26. Supexec     EQU 38
  27. _p_cookies  EQU $05A0                     ; Pointer auf cookie-jar
  28. trapvector  EQU $84                       ; TRAP #1 Vektor
  29.  
  30. .super:
  31.             TEXT
  32. start:          bra install               ; Sprung zum transienten Teil
  33. ****************************************************
  34. * my_gemdos: Neuer Traphandler für den Gemdos-Trap *
  35. ****************************************************
  36.             DC.B "XBRA"
  37.             DC.L "MSPF"
  38. o_gemdos:   DC.L 0                        ; alter GEMDOS-Vektor
  39. my_gemdos:                                ; Die folgende Routine entspricht
  40. ; bis auf die 3 Patchstellen der Orginalroutiene von TOS 3.05
  41. ; Orginalroutine von TOS 3.05.
  42.                 btst #5,(SP)              ; aus Supervisormodus aufgerufen?
  43.                 beq cont                  ; nein -> Interessiert uns nicht
  44.                 cmpi.w #$20,8(SP)         ; Super ?
  45.                 bne cont                  ; nein -> Interessiert uns nicht
  46.                 move.l 10(SP),D1          ; Parameter holen
  47.                 beq same_stack            ; 0L ? ->
  48.                 subq.l #1,D1              ; -1L
  49.                 beq cont                  ; ja -> Interessiert uns nicht
  50.                 movea.l 10(SP),A1         ; neuer ssp
  51.                 move.w (SP)+,D0           ; Format lesen
  52.                 move.l (SP)+,D1           ; Rückkehradresse lesen
  53.                 move.w (SP)+,-(A1)        ; Flags kopieren
  54.                 move.l D1,-(A1)           ; Rückkehradresse schreiben
  55.                 move.w D0,-(A1)           ; Format schreiben
  56.                 move USP,A0
  57.                 cmpa.l A0,SP              ; sp=USP
  58.                 beq eq_usp                ; ja ->
  59.                 move.l (SP)+,-(A0)
  60.                 andi #$EFFF,SR            ; M Bit löschen   <<<<<<<<< (2)
  61.                 movea.l A1,SP             ; neuen ssp laden (isp)
  62.                 bra load_usp
  63. eq_usp:         andi #$EFFF,SR            ; M Bit löschen   <<<<<<<<< (2)
  64.                 movea.l A1,SP             ; neuen ssp laden (isp)
  65.                 bra switch
  66. same_stack:     lea 8(SP),A0
  67. load_usp:       move A0,USP               ; usp laden
  68. switch:         andi.w #$CFFF,(SP)        ; S und M Bit löschen <<<<< (1)
  69.                 rte
  70. cont:           movea.l o_gemdos(PC),A0   ; Alter Vektorinhalt
  71.                 jmp (A0)                  ; und ab !
  72. *******************************************************************
  73. *           Installationsteil (bleibt nicht resident)
  74. *******************************************************************
  75. install:        pea super(PC)
  76.                 move.w #Supexec,-(SP)
  77.                 trap #xbios
  78.                 addq.l #6,SP
  79.                 tst.b stflag              ; Atari ST ?
  80.                 bne.s quitst              ; ja->Ende
  81.                 tst.b instflag            ; Schon installiert ?
  82.                 bne.s quitinst            ; ja->Ende
  83.                 pea message
  84.                 move.w #CConws,-(SP)      ; Startmeldung ausgeben
  85.                 trap #gemdos
  86.                 addq.l #6,SP
  87.                 movea.l #install-start+$0100,A1 ; Länge des Residenten Teils
  88.                 clr.w -(SP)
  89.                 pea (A1)
  90.                 move.w #Ptermres,-(SP)    ; Resident verlassen
  91.                 trap #gemdos
  92. quitst:         pea ttonly                ; Fehler 'ST-Computer'
  93.                 bra.s abort
  94. quitinst:       pea inst                  ; Fehler 'schon installiert'
  95. abort:          move.w #CConws,-(SP)
  96.                 trap #gemdos              ; Fehlermeldung ausgeben
  97.                 addq.l #6,SP
  98.                 clr.w -(SP)               ; Normal beenden
  99.                 trap #gemdos
  100. super:          move.l _p_cookies,D0      ; Cookie jar vorhanden?
  101.                 seq stflag
  102.                 beq exit                  ; nein->Ende
  103.                 movea.l D0,A0
  104. loop:           movem.l (A0)+,D0-D1       ; Ende der
  105.                 tst.l D0                  ; Liste?
  106.                 beq.s test_inst           ; ja->Schleife verlassen
  107.                 cmp.l #"_MCH",D0          ; Cookie für Computertyp?
  108.                 bne loop                  ; nein->weiter in der Schleife
  109.                 cmp.l #$020000,D1         ; TT ?
  110.                 sne stflag
  111.                 bne.s exit                ; nein->Ende
  112.                 bra.s loop
  113. test_inst:      tst.b stflag              ; ST ? -> Abbruch
  114.                 bne.s exit
  115.                 movea.l trapvector,A0
  116. xloop:          cmpi.l #'XBRA',-12(A0)    ; XBRA kennung ?
  117.                 bne do_inst               ; nein ? -> dann installieren
  118.                 cmpi.l #'MSPF',-8(A0)     ; Sind wir schon da ?
  119.                 seq instflag
  120.                 beq exit                  ; JA ! -> Abbruch
  121.                 movea.l -4(A0),A0         ; XBRA verfolgen
  122.                 bra xloop
  123. do_inst:        move.l trapvector,o_gemdos ; Alten Vektor retten
  124.                 move.l #my_gemdos,trapvector ; Neuen Vektor setzen
  125. exit:           rts                       ; das war's
  126.             DATA
  127. ; Startmeldung
  128. message:    DC.B $0D,$0A
  129.             DC.B "SUPERFIX V1.0 installiert",$0D,$0A
  130.             DC.B "© 1991 by Stefan Wolf",$0D,$0A,$00
  131. ; Fehlermeldungen
  132. ttonly:     DC.B $0D,$0A
  133.             DC.B "SUPERFIX läuft nur auf dem Atari TT !",$0D,$0A,$00
  134. inst:       DC.B $0D,$0A
  135.             DC.B "SUPERFIX schon installiert !",$0D,$0A,$00
  136. instflag:   DC.B 0                        ; Schon Installiert Flag
  137.             BSS
  138. stflag:     DS.B 1                        ; Flag für Atari ST
  139.             END
  140.  
  141.  
  142.  
  143.