📄 coreasm.s
字号:
IMPORT pVisby_CurrTask
IMPORT Visby_KernelServer
IMPORT Visby_KernelScheduler
IMPORT Visby_Tick
IMPORT Visby_Critical
EXPORT SWI_Handler
EXPORT TICK_Handler
MODE_USER EQU 0x10
MODE_FIQ EQU 0x11
MODE_IRQ EQU 0x12
MODE_SUPER EQU 0x13
MODE_ABORT EQU 0x17
MODE_UNDEF EQU 0x1B
MODE_SYSTEM EQU 0x1F
rINTCON EQU 0x01E00000
rI_ISPC EQU 0x01E00024
BIT_TICK EQU 0x00100000
BIT_TIMER2 EQU (0x1 << 11)
AREA Visby_Core, CODE, READONLY
MACRO
IncreaseTick
LDR r4, =Visby_Tick
LDMIA r4, {r5-r6}
ADDS r5, r5 ,#1
ADC r6, r6 ,#0
STMIA r4, {r5-r6}
MEND
MACRO
ClrTickIrq
LDR r4, =rI_ISPC
LDR r5, =BIT_TIMER2
STR r5, [r4]
MEND
; MACRO
; DisIrq
; MRS r4, cpsr
; ORR r4, r4, #0x00000080
; MSR cpsr_c, R8
; MEND
; MACRO
; DisIrq
; LDR r4, =rINTCON
; LDR r5, [r4]
; ORR r5, r5, #0x00000002
; STR r5, [r4]
; MEND
; MACRO
; EnaIrq
; MRS r4, cpsr
; AND r4, r4, #0xFFFFFF7F
; MSR cpsr_c, r4
; MEND
; MACRO
; EnaIrq
; LDR r4, =rINTCON
; LDR r5, [r4]
; AND r5, r5, #0xFFFFFFFD
; STR r5, [r4]
; MEND
MACRO
ToSysMode
MRS lr, cpsr
AND lr, lr, #0xFFFFFFE0
ORR lr, lr, #MODE_SYSTEM
MSR cpsr_cxsf, lr
MEND
MACRO
ToSvcMode
MRS lr, cpsr
AND lr, lr, #0xFFFFFFE0
ORR lr, lr, #MODE_SUPER
MSR cpsr_cxsf, lr
MEND
SWI_Handler
STMFD sp!, {r0-r6, lr}
LDR r4, =Visby_Critical
LDR r4, [r4]
TEQ r4, #0
BNE ExitHandler
LDR r0, [lr, #-4] ; Calculate the params
BIC r0, r0, #0xFF000000
MOV r1, sp ; Set pointer to parameters
BL Visby_KernelServer ; Call main part of handler
TEQ r0, #0 ; Need schedule?
BEQ ExitHandler
LDMFD sp!, {r0-r6, lr}
STR lr, Bkp_TaskPC
MRS lr, spsr
STR lr, Bkp_TaskCPSR
ToSysMode
B NextTask
ExitHandler
LDMFD sp!, {r0-r6, pc}^ ; Restore registers and return with CPSR restoring
TICK_Handler
SUB lr, lr, #4
STMFD sp!, {r4-r6, lr}
ClrTickIrq ; r4,r5 used
IncreaseTick ; r4,r5,r6 used
LDR r4, =Visby_Critical
LDR r4, [r4]
TEQ r4, #0
BNE NoSche
LDMFD sp!, {r4-r6, lr}
STR lr, Bkp_TaskPC
MRS lr, spsr
STR lr, Bkp_TaskCPSR
ToSysMode
B NextTask
NoSche
LDMFD sp!, {r4-r6, pc}^
NextTask
STR lr, Bkp_TaskLR
LDR lr, =pVisby_CurrTask
LDR lr, [lr]
STMIA lr!, {r0-r12, sp}
LDR r4, Bkp_TaskLR
LDR r5, Bkp_TaskPC
LDR r6, Bkp_TaskCPSR
STMIA lr, {r4-r6}
BL Visby_KernelScheduler
LDR lr, =pVisby_CurrTask
LDR lr, [lr]
LDR r4, [lr, #64]
MSR cpsr_cxsf, r4
LDMIA lr, {r0-r12, sp, lr, pc}
Bkp_TaskLR DCD 0x00000000
Bkp_TaskPC DCD 0x00000000
Bkp_TaskCPSR DCD 0x00000000
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -