📄 os_xa-al.as
字号:
;********************************************************************************************************
; uC/OS
; The Real-Time Kernel
;
; XA SPECIFIC ASSEMBLY LANGUAGE CODE
;
; Philips Semiconductors, Inc.
; XA (Large Model)
;
; File : OS_XA-AL.AS
;********************************************************************************************************
global _OSStartHighRdy
signat _OSStartHighRdy,24
global _OSCtxSw
signat _OSCtxSw,24
global _OSIntCtxSw
signat _OSIntCtxSw,24
global _OSTCBHighRdy
global _OSTCBCur
BIT_SSEL0 equ 218h ; Segment selection register bit definition
BIT_SSEL1 equ 219h
BIT_SSEL2 equ 21ah
BIT_SSEL3 equ 21bh
BIT_SSEL4 equ 21ch
BIT_SSEL5 equ 21dh
BIT_SSEL6 equ 21eh
BIT_SSEL7 equ 21fh
REG_CS equ 440h ; XA registers
REG_DS equ 441h
REG_ES equ 442h
REG_SSEL equ 403h
REG_PSWH equ 401h
;/*$PAGE*/
;*********************************************************************************************************
; START MULTITASKING
; void OSStartHighRdy(void)
;
; Total execution time : 97 bus cycles
;*********************************************************************************************************
psect ltext,class=CODE,space=0,align=2
_OSStartHighRdy:
mov r0,#(_OSTCBHighRdy) and 0ffffh; 4~, R3:R2 = OSTCBHighRdy
mov.b REG_ES,#seg(_OSTCBHighRdy) ; 4~
setb BIT_SSEL0 ; 4~, SSEL.0 = 1 (R0 uses ES register)
mov.w r2,[r0] ; 3~
mov.w r3,[r0+2] ; 3~
mov.w r0,r2 ; 3~, ES:R0 = OSTCBHighRdy
mov.b REG_ES,r3l ; 4~, ES
mov.w r2,[r0+] ; 4~, DS:USP = OSTCBHighRdy->OSTCBStkPtr
mov.w usp,r2 ; 3~
mov.b REG_DS,[r0] ; 3~, DS
clr BIT_SSEL0 ; 4~, SSEL.0 = 0 (R0 uses DS register)
popu r2 ; 5~, Move PCL from US to SS
push r2 ; 5~
popu r2 ; 5~, Move PCH from US to SS
push r2 ; 5~
popu r2 ; 5~, Move PSW from US to SS
push r2 ; 5~
popu.b REG_SSEL ; 5~, Get SSEL
popu.b REG_ES ; 5~, Get ES
popu r0,r1,r2,r3,r4,r5,r6 ;18~, Load task's context
reti ;10~, Run task
;/*$PAGE*/
;*********************************************************************************************************
; PERFORM A CONTEXT SWITCH (From task level)
; void OSCtxSw(void)
;
; Total execution time : 244 bus cycles
;*********************************************************************************************************
psect ltext,class=CODE,space=0,align=2
_OSCtxSw:
pushu r0,r1,r2,r3,r4,r5,r6 ;24~, Save current task's context
pushu.b REG_ES ; 5~, Save ES
pushu.b REG_SSEL ; 5~, Save SSEL
pop r2 ; 5~, Move PSW from SS to US
pushu r2 ; 5~
pop r2 ; 5~, Move PCH from SS to US
pushu r2 ; 5~
pop r2 ; 5~, Move PCL from SS to US
pushu r2 ; 5~
mov r0,#(_OSTCBCur) and 0ffffh ; 4~, R3:R2 = OSTCBCur
mov.b REG_ES,#seg(_OSTCBCur) ; 4~
setb BIT_SSEL0 ; 4~, SSEL.0 = 1 (R0 uses ES register)
mov.w r2,[r0] ; 3~
mov.w r3,[r0+2] ; 3~
mov.w r0,r2 ; 3~, ES:R0 = OSTCBCur
mov.b REG_ES,r3l ; 4~
mov.b r2h,#0 ; 3~
mov.b r2l,REG_DS ; 4~
mov.w r3,usp ; 3~, OSTCBCur->OSTCBStkPtr = USP
mov.w [r0],r3 ; 3~
mov.w [r0+2],r2 ; 3~
mov r0,#(_OSTCBHighRdy) and 0ffffh; 4~, R3:R2 = OSTCBHighRdy
mov.b REG_ES,#seg(_OSTCBHighRdy) ; 4~
mov.w r2,[r0] ; 3~
mov.w r3,[r0+2] ; 3~
mov r0,#(_OSTCBCur) and 0ffffh ; 4~
mov.b REG_ES,#seg(_OSTCBCur) ; 4~
mov.w [r0],r2 ; 3~,
mov.w [r0+2],r3 ; 3~
mov.w r0,r2 ; 3~, ES:R0 = OSTCBHighRdy
mov.b REG_ES,r3l ; 4~
mov.w r2,[r0] ; 3~, R3:R2 = OSTCBHighRdy->OSTCBStkPtr
mov.w r3,[r0+2] ; 3~
mov.w usp,r2 ; 3~, DS:USP = OSTCBHighRdy->OSTCBStkPtr
mov.b REG_DS,r3l ; 4~
clr BIT_SSEL0 ; 4~
popu r2 ; 5~, Move PCL from US to SS
push r2 ; 5~
popu r2 ; 5~, Move PCH from US to SS
push r2 ; 5~
popu r2 ; 5~, Move PSW from US to SS
push r2 ; 5~
popu.b REG_SSEL ; 5~, Get SSEL
popu.b REG_ES ; 5~, Get ES
popu r0,r1,r2,r3,r4,r5,r6 ;18~, Load new task's context
reti ;10~, Return to new task
;/*$PAGE*/
;*********************************************************************************************************
; PERFORM A CONTEXT SWITCH (From an ISR)
; void OSIntCtxSw(void)
;
; Total execution time : 172 bus cycles
;
; Notes : The offset added to the first instruction may need to be adjusted based on the compiler
; options used.
;*********************************************************************************************************
psect ltext,class=CODE,space=0,align=2
_OSIntCtxSw:
add.w r7,#10 ; 3~, Ignore calls to OSIntExit, OSIntCtxSw and locals
mov r0,#(_OSTCBCur) and 0ffffh ; 4~
mov.b REG_ES,#seg(_OSTCBCur) ; 4~
setb BIT_SSEL0 ; 4~ SSEL.0 = 1 (R0 uses ES register)
mov.w r2,[r0] ; 3~, R3:R2 = OSTCBCur
mov.w r3,[r0+2] ; 3~
mov.w r0,r2 ; 3~, ES:R0 = OSTCBCur
mov.b REG_ES,r3l ; 4~
mov.b r2h,#0 ; 3~
mov.b r2l,REG_DS ; 4~
mov.w r3,usp ; 3~, OSTCBCur->OSTCBStkPtr = USP
mov.w [r0],r3 ; 3~
mov.w [r0+2],r2 ; 3~
mov r0,#(_OSTCBHighRdy) and 0ffffh; 4~
mov.b REG_ES,#seg(_OSTCBHighRdy) ; 4~
mov.w r2,[r0] ; 3~, R3:R2 = OSTCBHighRdy
mov.w r3,[r0+2] ; 3~
mov r0,#(_OSTCBCur) and 0ffffh ; 4~
mov.b REG_ES,#seg(_OSTCBCur) ; 4~
mov.w [r0],r2 ; 3~,
mov.w [r0+2],r3 ; 3~
mov.w r0,r2 ; 3~, ES:R0 = OSTCBHighRdy
mov.b REG_ES,r3l ; 4~
mov.w r2,[r0] ; 3~, R3:R2 = OSTCBHighRdy->OSTCBStkPtr
mov.w r3,[r0+2] ; 3~
mov.w usp,r2 ; 3~, DS:USP = OSTCBHighRdy->OSTCBStkPtr
mov.b REG_DS,r3l ; 4~
clr BIT_SSEL0 ; 4~ SSEL.0 = 0 (R0 uses DS register)
popu r2 ; 5~, Move PCL from US to SS
push r2 ; 5~
popu r2 ; 5~, Move PCH from US to SS
push r2 ; 5~
popu r2 ; 5~, Move PSW from US to SS
push r2 ; 5~
popu.b REG_SSEL ; 5~, Get SSEL
popu.b REG_ES ; 5~, Get ES
popu r0,r1,r2,r3,r4,r5,r6 ;18~, Load new task's context
reti ;10~, Return to new task
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -