?? except.a66
字號(hào):
; 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點(diǎn)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
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -