|
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