mxUnterbrechungAsm.S


| mxUnterbrechungAsm.S

#define ASSEMBLER
#include "mxSystem.h"
#include "mxVektor.h"

| --------------------------------------------------------------------------------------------------------------------
|****************
|** Funktionen **
|****************
|
| Behandlung der Uhren-Unterbrechung
|

        .EVEN
        .GLOBAL _UhrUnterbrechung
_UhrUnterbrechung:
        MOVE.W   #cPrioritaet7UndSystemModus,SR                         | alle Unterbrechungen sperren
        MOVEM.L  D0-D7/A0-A6,-(SP)                                      | Adress- und Datenregister retten
        MOVE.L   USP,A0                                                 | User-Stack-Pointer retten
        MOVE.L   A0,-(SP)

        MOVE.L   SP,-(SP)                                               | Prozessumgebungszeiger (PUZ) auf Stack legen
        JSR      _ZeitUeberwachung                                      | UhrBehandlungsRoutine aufrufen
        ADDQ.L   #4,SP                                                  | Parameter vom Stack holen
        MOVE.L   D0,SP                                                  | neuen PUZ lesen

        MOVE.L   (SP)+,A0                                               | User-Stack-Pointer vom Stack holen
        MOVE.L   A0,USP
        MOVEM.L  (SP)+,D0-D7/A0-A6                                      | Adress- und Datenregister vom Stack holen

        RTE                                                             | Beenden der Uhren-Unterbrechung

| --------------------------------------------------------------------------------------------------------------------
|
| Behandlung des Prozesswechsel-Traps
|

        .EVEN
        .GLOBAL _ProzesswechselTrap
_ProzesswechselTrap:
        MOVE.W   #cPrioritaet7UndSystemModus,SR                         | alle Unterbrechungen sperren
        MOVEM.L  D0-D7/A0-A6,-(SP)                                      | Adress- und Datenregister retten
        MOVE.L   USP,A0                                                 | UserStack-Pointer retten
        MOVE.L   A0,-(SP)
        MOVE.L   SP,-(SP)                                               | Prozessumgebungszeiger (alter Stack) auf Stack
        JSR      _ProzessWechsel                                        | ProzesswechselRoutine aufrufen
        ADDQ.L   #4,SP                                                  | Parameter vom (alten) Stack holen
        MOVE.L   D0,SP                                                  | neuen Stack setzen

        MOVE.L   (SP)+,A0                                               | User-Stack-Pointer vom Stack holen
        MOVE.L   A0,USP
        MOVEM.L  (SP)+,D0-D7/A0-A6                                      | Adress- und Datenregister vom Stack holen

        RTE                                                             | Beenden des ProzesswechselTraps

| --------------------------------------------------------------------------------------------------------------------
|
| Einspruenge fuer Ausnahmen, die nach dem benutzten Vektor unterschieden werden muessen
|

        .EVEN
        .GLOBAL _DivZero
        .GLOBAL _IllInst
        .GLOBAL _PrivViol
        .GLOBAL _Emu1010
        .GLOBAL _Emu1111
_DivZero:
        MOVE.L  #cDivZeroVektorNr,D0
        BRA     _InitAusnahmen

_IllInst:
        MOVE.L  #cIllegalInstructionVektorNr,D0
        BRA     _InitAusnahmen

_PrivViol:
        MOVE.L  #cPrivilegeVektorNr,D0
        BRA     _InitAusnahmen

_Emu1010:
        MOVE.L  #cEmu1010VektorNr,D0
        BRA     _InitAusnahmen

_Emu1111:
        MOVE.L  #cEmu1111VektorNr,D0
        BRA     _InitAusnahmen

| --------------------------------------------------------------------------------------------------------------------
|
| Behandlung des SystemFehler-Traps *und* aller anderen Ausnahmen ausser Bus- und Adressfehler
|

        .EVEN
        .GLOBAL _Ausnahmen
        .GLOBAL _InitAusnahmen
        .GLOBAL _SystemFehlerTrap
| * Der Kernstack hat folgenden Inhalt:
| *      +--------------+
| *  +4  | Rueckspr-Adr |
| *      +--------------+
| *  +2  | Rueckspr-Adr |
| *      +--------------+
| * KSP->|    SR        |
| *      +--------------+
_Ausnahmen:                                                             | Default-Einsprung fuer Ausnahme
        MOVE.L  #0,d0
_InitAusnahmen:
_SystemFehlerTrap:                                                      | hier enthaelt D0 die Fehlernummer
        MOVE.W  #cPrioritaet7UndSystemModus,SR                          | alle Unterbrechungen sperren
        MOVEM.L D0-D7/A0-A6,-(SP)                                       | restliche Adress- und Datenregister retten
        MOVE.L  USP,A0                                                  | User-Stack-Pointer auf Kernelstack retten
        MOVE.L  A0,-(SP)

        MOVE.L  66(SP),D1                                               | Fehleradresse nach D1

        MOVE.W  64(SP),D2                                               | SR nach D2, um richtigen Stack festzustellen
        BTST    #13,D2                                                  | System-Bit abfragen
        BEQ     User1                                                   | Benutzermodus => A0 enthaelt schon den USP
        MOVE.L  SP,A0                                                   | System-SP nach A0...
        ADD.L   #70,A0                                                  | ...+70 ergibt den Original-SP
User1:
        MOVE.L  (A0)+,-(SP)                                             | richtigen Stack mit uebergeben
        MOVE.L  (A0)+,-(SP)
        MOVE.L  (A0)+,-(SP)
        MOVE.L  (A0)+,-(SP)
        MOVE.L  D0,-(SP)                                                | Fehlernummer als Argument
        MOVE.L  D1,-(SP)                                                | FehlerAdresse als Argument
        JSR     _Abbruch
        ADD.L   #24,SP                                                  | Argumente wieder vom Stack

        MOVE.L  (SP)+,A0                                                | User-Stack-Pointer vom Stack holen
        MOVE.L  A0,USP
        MOVEM.L (SP)+,D0-D7/A0-A6                                       | Adress- und Datenregister vom Stack holen
        RTE                                                             | Beenden der Exception

| --------------------------------------------------------------------------------------------------------------------
        .EVEN
        .GLOBAL _BusAdrAusnahme
_BusAdrAusnahme:
| * Behandlung der CPU-Exceptions Busfehler und Adressfehler
| * Der Kernstack hat folgenden Inhalt:
| *      +--------------+
| * +12  | Rueckspr-Adr |
| *      +--------------+
| * +10  | Rueckspr-Adr |
| *      +--------------+
| *  +8  |    SR        |
| *      +--------------+
| *  +6  |  Befehlsreg. |
| *      +--------------+
| *  +4  | Zugriffs-Adr |
| *      +--------------+
| *  +2  | Zugriffs-Adr |
| *      +--------------+
| * KSP->| Super-Status |
| *      +--------------+
        MOVE.W  #cPrioritaet7UndSystemModus,SR                          | alle Unterbrechungen sperren
        MOVEM.L D0-D7/A0-A6,-(SP)                                       | restliche Adress- und Datenregister retten
        MOVE.L  USP,A0                                                  | User-Stack-Pointer auf Kernelstack retten
        MOVE.L  A0,-(SP)

        MOVE.L  66(SP),D0                                               | Zugriffsadresse nach D0
        MOVE.L  74(SP),D1                                               | Fehleradresse nach D1

        MOVE.W  72(SP),D2                                               | SR nach D2, um richtigen Stack festzustellen
        BTST    #13,D2                                                  | System-Bit abfragen
        BEQ     User2                                                   | Benutzermodus => A0 enthaelt schon den USP
        MOVE.L  SP,A0                                                   | System-SP nach A0...
        ADD.L   #78,A0                                                  | ...+78 ergibt den Original-SP
User2:
        MOVE.L  (A0)+,-(SP)                                             | richtigen Stack mit uebergeben
        MOVE.L  (A0)+,-(SP)
        MOVE.L  (A0)+,-(SP)
        MOVE.L  (A0)+,-(SP)
        MOVE.L  D0,-(SP)                                                | Zugriffsadresse als Argument
        MOVE.L  D1,-(SP)                                                | Fehleradresse als Argument
        JSR     _BusAdrAbbruch
        ADD.L   #24,SP                                                  | Argumente wieder vom Stack

        MOVE.L  (SP)+,A0                                                | User-Stack-Pointer vom Stack holen
        MOVE.L  A0,USP
        MOVEM.L (SP)+,D0-D7/A0-A6                                       | Adress- und Datenregister vom Stack holen
        RTE                                                             | Beenden der Exception

| --------------------------------------------------------------------------------------------------------------------

        .EVEN
        .GLOBAL _SystemAufrufTrap
_SystemAufrufTrap:
| * Behandlung von System-Aufruf-Traps:
| * Die beiden Stacks haben durch den Aufruf von SystemAufruf() folgenden Inhalt:
| *
| *         UserStack
| *      +--------------+
| *  +10 | PaketGroesse |
| *      +--------------+
| *  +8  | PaketGroesse |
| *      +--------------+
| *  +6  | Adr(Paket)   |
| *      +--------------+
| *  +4  | Adr(Paket)   |
| *      +--------------+
| *  +2  | Rueckspr-Adr |
| *      +--------------+
| * USP->| Rueckspr-Adr |
| *      +--------------+
        MOVEM.L  D0-D7/A0-A6,-(SP)                                      | Register sichern

        MOVE.L   USP,A1                                                 | UserStack-Zeiger holen
        MOVEA.L  4(A1),A0                                               | Adresse des Pakets von UserStack lesen
        MOVE.L   8(A1),D0                                               | PaketGroesse (in Bytes) vom UserStack lesen

        ADDQ.L   #3,D0                                                  | Paketgroesse auf Langworte runden
        AND.L    #0xfffffffc,D0

        ADDA.L  D0,A0                                                   | A0 auf letzes Langwort des Paketes setzen
        LSR.L   #2,D0                                                   | Anzahl der move-Befehle berechnen
        SUBQ.L  #1,D0                                                   | Da Abbruchbedingung in dbf D0=-1 ist
        MOVE.L  D0,D1                                                   | Zaehler zwischenspeichern

        BMI     Copy1End                                                | Anzahl von move-Befehlen = (0 - 1) -> fertig
Copy1:
        MOVE.L  -(A0),-(SP)                                             | Holen des Pakets vom Userbereich
        DBF     D0,Copy1
Copy1End:

        MOVEA.L SP,A1                                                   | Zeiger auf Paket zwischenspeichern
        MOVE.L  D1,-(SP)                                                | spaeter benoetigte Werte auf Stack retten
        MOVE.L  A0,-(SP)

        MOVE.L   A1,-(SP)                                               | Adresse des Pakets auf den Stack legen
        JSR      _SystemDienst                                          | SystemDienstRoutine aufrufen
        ADDQ.L   #4,SP

        MOVE.L  (SP)+,A0                                                | gesicherte Werte vom Stack nehmen
        MOVE.L  (SP)+,D0

        BMI     Copy2End                                                | Anzahl von move-Befehlen = (0 - 1) -> fertig
Copy2:
        MOVE.L  (SP)+,(A0)+                                             | Paket zurueckkopieren
        DBF     D0,Copy2
Copy2End:

        MOVEM.L  (SP)+,D0-D7/A0-A6                                      | Register wiederherstellen
        RTE                                                             | Beenden des SystemAufruf-Traps



Bei Problemen mit der Seite bitte eine Mail an Marek
Converted with C2HTML V0.669 by Iluvatar
Proze▀datenverarbeitung