⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 except.a66

📁 TQ公司的STK16x开发系统的源码
💻 A66
字号:
; EXCEPT.A66

;****************************************************************************
;                                                                        
; LIB16X.EXEPT.100                                                      
; ================                                                      
;
; Exception-Handler:
; Beim Auftreten von einen Exception wird im Polling-Mode der Exception und 
; die Position, in welchem der Exception aufgetreten ist auf ASC0 ausgegeben
; Die Meldung wird periodisch wiederholt, bis ein Hardware-Reset erfolgt
; Der Handler braucht nur dazugelinkt zu werden, um zu funktionieren.
; Funktioniert zur Zeit nur im SEGMENTED Mode.
;
; TQ-Systems GmbH
; ---------------
; Kunde    : TQS
; Projekt  : LIB16X
; Modul    : EXCEPT
; Autoren  : A. Lichte
; Datum    : 29.01.98
;
; Rev: Date:     Name:            History:
; ----+---------+----------------+-------------------------------------------
; 100  29.01.98  A. Lichte        Beginn, erste Realisierung
;      03.02.98  A. Lichte        Test mittels EXCTEST am MON16x.201
;      05.02.98  A. Lichte        Default Initialisierung von ASC0
;      16.03.98  A. Lichte        Nicht behandelten NMI abfangen
;****************************************************************************/

$SEGMENTED

$MOD167                                  ;Aktivierung vom 80C167 Modus
$INCLUDE (REG167.INC)	                 ;Include register definition file

ASSUME          DPP3 :SYSTEM

BGDEFAULT           EQU 10    ; Default-Bautrateninitialisierung, wenn die 
                              ; Schnittstelle noch nicht initialisiert ist

;----------------------------------------------------------------------------*
; Setzen der Interruptvektoren
;----------------------------------------------------------------------------*

?C_STKOF_EXC_AREA   SECTION	CODE  at 10h
?C_STKOF_EXC 	PROC NEAR
                    JMP FAR ?C_EXCHANDLER
?C_STKOF_EXC 	ENDP
?C_STKOF_EXC_AREA   ENDS
                    

?C_STKUF_EXC_AREA   SECTION	CODE  at 18h
?C_STKUF_EXC 	PROC NEAR ; at 18h
                    JMP FAR ?C_EXCHANDLER
?C_STKUF_EXC 	ENDP
?C_STKUF_EXC_AREA   ENDS
                    

?C_CLASB_EXC_AREA   SECTION	CODE  at 28h
?C_CLASB_EXC 	PROC NEAR ; at 28h
                    JMP FAR ?C_EXCHANDLER
?C_CLASB_EXC 	ENDP
?C_CLASB_EXC_AREA   ENDS

;----------------------------------------------------------------------------*
; Deffinition der Fehlermeldungen
;----------------------------------------------------------------------------*

?C_EXCMSG 	SECTION	CODE ;at 200h
MSG_ILLBUS          DB        13, 10, "EXCEPION: ILLEGAL BUS ACCESS at ", 0
MSG_ILLINA          DB        13, 10, "EXCEPION: ILLEGAL INSTRUCTION ACCESS at ", 0
MSG_ILLOPA          DB        13, 10, "EXCEPION: ILLEGAL WORD OPERAND ACCESS at ", 0
MSG_PRTFLT          DB        13, 10, "EXCEPION: PROTECTION FAULT at ", 0 
MSG_UNDOPC          DB        13, 10, "EXCEPION: UNDEFINED OPCODE at ", 0 
MSG_STKUF           DB        13, 10, "EXCEPION: STACK UNDERFLOW at ", 0
MSG_STKOF           DB        13, 10, "EXCEPION: STACK OVERFLOW at ", 0
MSG_NMI             DB        13, 10, "EXCEPION: UNEXPECTED NMI at ", 0
MSG_UNKNOWN         DB        13, 10, "UNKNOWN EXCEPTION at ", 0
?C_EXCMSG 	ENDS

;----------------------------------------------------------------------------*
; Ausgabe der Fehlermeldungen
;----------------------------------------------------------------------------*
; R0:  Zeiger auf Fehlermeldung
; RL1: 躡ergabereg. f黵 SIOPUT
; R3: 躡ergaberegister f黵 PUTADDR
; R2, R4, R7: Rempor鋜e Werte f黵 PUTADDR
; R8:  Trap Flag Register
; R9:  Instruction Pointer
; R10: Code Segment Pointer
; R11: Program Status Word (z. Zt. nicht ausgewertet)
; R12, R13: Warteschleife
;----------------------------------------------------------------------------*

?C_EXCEPT 	SECTION	CODE ;at 100h
?C_EXCHANDLER       PROC NEAR
                    MOV DPP0, #PAG ?C_EXCMSG
                    MOV DPP3, #3
                    MOV R8, TFR
                    POP R9 ; IP
                    POP R10 ; CSP
                    POP R11 ; PSW
                    MOV SP, STKUN ; Stack zur點ksetzen
                    JB  S0R, ASC0OK ; ASC0 ist bereits initialisiert
                    MOV S0CON,  #08011h
                    MOV S0BG, #BGDEFAULT
                    BSET P3.10
                    BSET DP3.10   ; TxD0: Ausgang 
ASC0OK:
REPEATLOOP:         MOV R0, #DPP0:POF(MSG_ILLBUS)
                    JB R8.0 SETMSG
                    MOV R0, #DPP0:POF(MSG_ILLINA)
                    JB R8.1 SETMSG
                    MOV R0, #DPP0:POF(MSG_ILLOPA)
                    JB R8.2 SETMSG
                    MOV R0, #DPP0:POF(MSG_PRTFLT)
                    JB R8.3 SETMSG
                    MOV R0, #DPP0:POF(MSG_UNDOPC)
                    JB R8.7 SETMSG
                    MOV R0, #DPP0:POF(MSG_STKUF) 
                    JB R8.13 SETMSG
                    MOV R0, #DPP0:POF(MSG_STKOF)
                    JB R8.14 SETMSG
                    MOV R0, #DPP0:POF(MSG_NMI)   ;NMI wird abgefangen, weil die CPU nach Auftreten
                    JB R8.15 SETMSG              ;vom NMI von der Einsprungaddr. 0x08 nach 0x10 wandert
                    MOV R0, #DPP0:POF(MSG_UNKNOWN)

SETMSG:             MOVB RL1, [R0+]
                    JMPR cc_Z SETADDR
                    CALLR SIOPUT
                    JMPR cc_UC SETMSG
SETADDR:            MOV R3, R10
                    CALLR PUTADDR
                    MOV RL1, #':'
                    CALLR SIOPUT
                    MOV R3, R9
                    CALLR PUTADDR
                    MOV R12, #0h       ; Etwas warten
                    MOV R13, #0
WAIT1:              CMPI1 R13, #0
                    JMPR cc_NZ WAIT1
                    CMPI1 R12, #080h
                    JMPR cc_NZ WAIT1
                    JMP cc_UC REPEATLOOP
                    

;---------------------------------------------------------------------------
; Ausgabe Datenword
;---------------------------------------------------------------------------
; Wert steht in R3
; R7L: Schleifenz鋒ler

PUTADDR:       MOVB  RL7, #4
PALOOP:        MOVB  RH2, RH3
               ANDB  RH2, #0F0h
               SHR   R2, #4
               MOVB  RH1, RH2
               CALLR PUTASEG
               SHL   R3, #4
               SUBB RL7, #1
               JMPR cc_NZ PALOOP
               RET

;---------------------------------------------------------------------------
; Ausgabe DatenSegment
;---------------------------------------------------------------------------

PUTASEG:       MOVB RL1, RH1
               ADDB RL1, #48
               CMP  RL1, #'9' 
               JMPR cc_ULE ISTNUM2
               ADDB RL1, #7
ISTNUM2:       CALLR SIOPUT
               RET


;---------------------------------------------------------------------------
;Funktion zum Senden eines Bytes 黚er die serielle Schnittstelle:
;---------------------------------------------------------------------------
;Eingabe: RL1 = Datenbyte

SIOPUT:         MOV   S0TBUF, RL1
WAIT:           JNB   S0TIR, WAIT
                BCLR  S0TIR
                RET



?C_EXCHANDLER       ENDP                   
?C_EXCEPT 	ENDS


		END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -