📄 debug-macros.h.s
字号:
MEND
; -----------------------------
; Testing ^ addressing
; Four registers ONLY
; ASSUMES r1 - r4 differ from r11-r14
; -----------------------------
; 08/07/97 P Pearse - Added
; 13/07/97 J Rijk - Storage space corrected
; 03/10/97 J Rijk - Remove UNPREDICTABLE writeback
; -----------------------------
MACRO
Corrupt_User_Regs
LOCAL
B start$l
tmpr0$l DCD 0
tmpregs$l % 4*4
start$l
STR r0 , tmpr0$l
ADRL r0 , tmpregs$l
STMIA r0, {r1 -r4 } ; Store values to:
LDMIA r0, {r11-r14}^ ; - corrupt user regs
LDR r0 , tmpr0$l
LOCAL_END
MEND
; -----------------------------
; Testing ^ addressing
; Four registers ONLY
; ASSUMES r0 correct on entry
; r0 NOT changed on exit
; -----------------------------
; 08/07/97 P Pearse - Added
; 03/10/97 J Rijk - Remove UNPREDICTABLE writeback
; -----------------------------
MACRO
Transfer_Regs_User_To_Current_Mode
STMIA r0, {r11-r14}^
Load_Cleared_Current_Regs
MEND
; -----------------------------
; Testing ^ addressing
; Four registers ONLY
; ASSUMES r0 correct on entry
; Decrements r0 by 4 words
; -----------------------------
; 08/07/97 P Pearse - Added
; 03/10/97 J Rijk - Remove UNPREDICTABLE writeback
; -----------------------------
MACRO
Load_Cleared_Current_Regs
MOV r11,#0
MOV r12,#0
MOV r13,#0
MOV r14,#0
LDMIA r0,{r11-r14} ; - move them to current registers
MEND
; -----------------------------
; Start of tests
; - ASSUMED entered in mode other than USER mode
; - can NOT change mode in USER mode
; - Thus lists must have USER mode last
; - Modes NOT recorded or output
; ASSUMED MODE CHANGE indication in vsim log is sufficient
; -----------------------------
MACRO
$label Mode_Loop $LoopedCode, $ModeList ; Loop testing in ALL modes
LCLS ModeName
LCLS List
LCLS char
ModeName SETS ""
List SETS "$ModeList"
$label
WHILE List /= ""
char SETS List:LEFT:1
[ (char = ",") :LOR: (:LEN:List=1)
[ :LEN:List=1
ModeName SETS ModeName:CC:char
]
MSR_M CPSR, $ModeName, r0 ; Change to next mode
BL $LoopedCode ; Call looped code
ModeName SETS ""
|
ModeName SETS ModeName:CC:char
]
List SETS List:RIGHT:(:LEN:List-1)
WEND
MEND
; -----------------------------
; Start of tests
; SHOULD REPLACE Mode_Loop above eventually
; Initially produced for multiple test3
; to overcome fact that we end in USR mode and can't
; switch out for next test
; Must be used with Add_Mode_Switching_Instructions
;
; - Modes NOT recorded or output
; ASSUMED MODE CHANGE indication in vsim log is sufficient
;
; 32 bit ONLY
;
MACRO
$label Mode_Loop_2 $LoopedCode, $ModeList ; Loop testing in ALL modes
; -----------------------------
LCLS ModeName
LCLS Suffix
LCLS ModeTLA
LCLS List
LCLS char
LCLA ctr
ModeName SETS ""
List SETS "$ModeList"
$label
WHILE List /= ""
char SETS List:LEFT:1
[ (char = ",") :LOR: (:LEN:List=1)
[ :LEN:List=1
ModeName SETS ModeName:CC:char
]
Suffix SETS ModeName:RIGHT:6
ModeTLA SETS Suffix:LEFT:3
; -----------------------------------------
; The 'mode switch' instruction
; - causes an Undefined exception
; - i.e. will switch to UNDEF mode
; - the handler can then switch to the requested mode and return
; - see M_SWITCH_TO_<> below
; && Add_Mode_Switching_Instructions
; -----------------------------------------
M_SWITCH_TO_$ModeTLA._32
BL $LoopedCode ; Call looped code
ModeName SETS ""
|
ModeName SETS ModeName:CC:char
]
List SETS List:RIGHT:(:LEN:List-1)
WEND
MEND
;-----------------------
MACRO
$L SaveReturnAddress $location
; 13/05/97 P Pearse - Use ADRL, NOT =$location
; 07/07/97 P Pearse - Use LOCAL
;-----------------------
LOCAL
B %F1
tmp$l DCD 0
1
STR r0, tmp$l
ADRL r0 , $location
STR r14, [r0]
LDR r0, tmp$l
LOCAL_END
MEND
;-----------------------
MACRO
UseReturnAddress $location
; 13/05/97 P Pearse - Use ADRL, NOT =$location
; J Rijk - Blip message
; 24/08/97 P Pearse - Back to LDR
;-----------------------
LOCAL
PRINTF "Blip\n" ; Message to show something is happening
LDR r14, =$location
LDR r14, [r14]
MOV pc, r14
; ==============================>>>
LTORG
LOCAL_END
MEND
;-----------------------
; Provide variable for BST access
; - check variable within 0xFFF of the AREA base
;-----------------------
MACRO
$label Set_BST_Access
LOCAL
GBLA offset_$label
here$l
offset_$label Get_Address here$l
offset_$label SETA offset_$label - Start_of_Code
;offset_$label SETA {PC} - Start_of_Code
[ offset_$label > 0xFFF
! 1, "\n\t$label un-addressable by BST"
MEXIT
]
$label DCD 0
LOCAL_END
MEND
;-----------------------
; Display addressing type (26/32 bit)
; - error if CONFIG undefined
;-----------------------
MACRO
Msg_Re_Addressing
;-----------------------
; 17/06/97 P Pearse Add INIT_DEVICE
; 24/11/97 P Pearse Remove INIT_DEVICE - use configuration files
;-----------------------
; highly dodgy place for macro but will do for now (jrijk)
INIT_ICEBREAKER
[ $VERBOSE > $VERBOSE_DEFAULT
[ {CONFIG} = 32
MESSAGE "32 bit addressing"
|
[ {CONFIG} = 26
MESSAGE "26 bit addressing"
|
! 0, "Debug-Macros: Msg_Re_Addressing"
! 0, "CONFIG should be 26 OR 32"
]
]
]
MEND
; --------------------------
MACRO
Enable_FIQ
; --------------------------
; 13/05/97 P Pearse - Added
; --------------------------
MRS r0, CPSR
BIC r0, r0, #DISABLE_FIQ
MSR CPSR_cf, r0
MEND
; --------------------------
MACRO
Disable_FIQ
; --------------------------
; 13/05/97 P Pearse - Added
; --------------------------
MRS r0, CPSR
ORR r0, r0, #DISABLE_FIQ
MSR CPSR_cf, r0
MEND
; --------------------------
MACRO
Enable_IRQ
; --------------------------
; 13/05/97 P Pearse - Added
; --------------------------
MRS r0, CPSR
BIC r0, r0, #DISABLE_IRQ
MSR CPSR_cf, r0
MEND
; --------------------------
MACRO
Disable_IRQ
; --------------------------
; 13/05/97 P Pearse - Added
; --------------------------
MRS r0, CPSR
ORR r0, r0, #DISABLE_IRQ
MSR CPSR_cf, r0
MEND
; --------------------------
; $reg Register to test (decimal register tag: r0 - r15)
; $address Address which should be therein (label string )
; $error Routine to call on error (label string )
;
MACRO
RegAddressCheck $reg, $address, $error
; --------------------------
; 07/07/97 P Pearse - Added
; 31/07/97 P Pearse - Correct storage/retrieval of registers
; --------------------------
LOCAL
B %F1
tmpr0$l DCD 0
tmpr1$l DCD 0
tmpreg$l DCD 0
1
STR $reg, tmpreg$l
STR r0, tmpr0$l
STR r1, tmpr1$l
LDR r0, =$address
LDR r1, tmpreg$l
CMP r0, r1
BNE $error
LDR r0 , tmpr0$l
LDR r1 , tmpr1$l
LDR $reg, tmpreg$l
LOCAL_END
MEND
; ------------------------------------------------
; Initialise listed registers in the currentprocessor mode
MACRO
$L RegisterInit $DIYRegList
; ------------------------------------------------
LCLS RegName
LCLS List
LCLS char
RegName SETS ""
List SETS "$DIYRegList"
$L
WHILE List /= ""
char SETS List:LEFT:1
[ (char = ",") :LOR: (:LEN:List=1)
[ :LEN:List=1
RegName SETS RegName:CC:char
]
MOV r$RegName,#VU$RegName
RegName SETS ""
|
RegName SETS RegName:CC:char
]
List SETS List:RIGHT:(:LEN:List-1)
WEND
MEND
; ------------------------------------------------
; Clear the listed registers in the current processor mode
MACRO
$L RegisterClear $DIYRegList
; ------------------------------------------------
LCLS RegName
LCLS List
LCLS char
RegName SETS ""
List SETS "$DIYRegList"
$L
WHILE List /= ""
char SETS List:LEFT:1
[ (char = ",") :LOR: (:LEN:List=1)
[ :LEN:List=1
RegName SETS RegName:CC:char
]
MOV r$RegName,#0
RegName SETS ""
|
RegName SETS RegName:CC:char
]
List SETS List:RIGHT:(:LEN:List-1)
WEND
MEND
; ------------------------------------------------
; Check register contents as set in RegisterInit above
; (in current processor mode)
; Supports 26-bit
; 19/22/97: P Pearse: Add display of registers which fail
MACRO
$L RegisterCheck $FailedTarget,$DIYRegList
; ------------------------------------------------
LOCAL
LCLS RegName
LCLS List
LCLS char
RegName SETS ""
List SETS "$DIYRegList"
$L B $l.past
$l.past
WHILE List /= ""
char SETS List:LEFT:1
[ (char = ",") :LOR: (:LEN:List=1)
[ :LEN:List=1
RegName SETS RegName:CC:char
]
CMP r$RegName,#VU$RegName
BEQ $l.$RegName.OK
MOV r2,r$RegName
MOV r0,#$RegName
MOV r1,#VU$RegName
BL fail_regs_corrupt
B $FailedTarget
$l.$RegName.OK
RegName SETS ""
|
RegName SETS RegName:CC:char
]
List SETS List:RIGHT:(:LEN:List-1)
WEND
LOCAL_END
MEND
; ------------------------------------------------
; Check register 14 if NOT overwritten by handler call:
; - set r14_ModeA to VU14
; - exception occurs which switches to ModeA
; - r14_ModeA overwritten with return address
;
; ModeTab is mode of exception which is known to be called
; UND, SVC, ABT, IRQ, FIQ
;
; - checks 26/32
;
MACRO
$L Register14Check $Error, $ModeTab
; ------------------------------------------------
; 07/07/97 P Pearse - Use LOCAL
;-----------------------
CheckMode $ModeTab
LOCAL
B %F1
tmpr0$l DCD 0
1
STR r0, tmpr0$l
MRS r0, CPSR
IF {CONFIG} = 32
AND r0, r0, #Mode_$ModeTab._32
CMP r0, #Mode_$ModeTab._32
ELSE
IF $ModeTab = "IRQ" :LOR: $ModeTab = "FIQ"
AND r0, r0, #Mode_$ModeTab._26
CMP r0, #Mode_$ModeTab._26
ELSE
AND r0, r0, #Mode_SVC_26
CMP r0, #Mode_SVC_26
ENDIF
ENDIF
BEQ NO_r14_test
CMP r14, #VU14
BEQ $l.END
LDR r0,=VU14
Report_Regs "r14 incorrect - expected:__", r0, "__actual:__", r14
B $Error
NO_r14_test
;~~~~~~~~~~
$l.END
LDR r0, tmpr0$l
LOCAL_END
MEND
; ------------------------------------------------
; Check register 14 if NOT overwritten by handler call:
; - set r14_ModeA to VU14
; - exception occurs which switches to ModeA
; - r14_ModeA overwritten with return address
;
; ModeTab is list of exception modes which are known to be called
; in the form "UND,SVC,ABT,IRQ,FIQ" - comma seperated, NO spaces
;
; - checks 26/32
;
MACRO
$L Register14CheckList $Error, $ModeList
; ------------------------------------------------
; 13/05/97 P Pearse - Added
; 07/07/97 P Pearse - Use LOCAL
; ------------------------------------------------
LCLS ModeTag
LCLS List
LCLS char
ModeTag SETS ""
LOCAL
B %F1
tmpr0$l DCD 0
1
STR r0, tmpr0$l
List SETS "$ModeList"
WHILE List /= ""
; -----------------------------
; Get next tag
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -