📄 queueappendremove.s
字号:
;/*
;* File : CommonQueue.s
;*
;* Description : Contains a routine use queues
;*
;* Copyright 2004 ZiLOG Inc. ALL RIGHTS RESERVED.
;*
;* This file contains unpublished confidential and proprietary information
;* of ZiLOG, Inc.
;* NO PART OF THIS WORK MAY BE DUPLICATED, STORED, PUBLISHED OR DISCLOSED
;* IN ANY FORM WITHOUT THE PRIOR WRITTEN CONSENT OF ZiLOG, INC.
;* This is not a license and no use of any kind of this work is authorized
;* in the absence of a written license granted by ZiLOG, Inc. in ZiLOG's
;* sole discretion
;*/
.extern _hCurrentThread
.extern _DispatchQueue
.extern _DQPriorityBitMap
.extern _pMap
.extern _QueueAppend
.extern _QueueNodeRemove
.extern _RZKScheduler
OFFSET_DP : equ 12H
.def _DispatchQueueNodeAppend
.assume adl=1
;/* Function : DispatchQueueAppend
;*
;* Description : Appends to Dispatch queue
;*
;* Inputs : None.
;*
;* Outputs : None
;*
;* Dependencies : None.
;*/
_DispatchQueueNodeAppend:
PUSH IX
LD IX, 0
ADD IX, SP
LD IY, (IX+6) ;IY now contains thread handle
LD L,(IY + OFFSET_DP) ;pThread->cDispPriority
LD H,6 ;size of DispatchQueue=6 typedef struct DISPATCHQ_t
; { RZK_TCB_t * pNext;
; RZK_TCB_t * pPrevious;
; } RZK_DISPATCHQ_t
MLT HL ;multiply with index
LD BC,_DispatchQueue + 3 ;Add 3 to access .pPrevious member of dispatch queue
ADD HL,BC ;DispatchQueue[uIndex]
LD HL, (HL) ;DispatchQueue[pThread->cDispPriority].pPrevious
; Equivalent to above code. Equivalent to QueueAppend code
LD BC, (HL)
LD(IY),BC
LD(IY + %3),HL
LD BC, IY
LD (HL), BC
LD IY, (IY)
LD (IY + %3), BC
LD IY, (IX+6) ;Restore IY: IY now contains thread handle
; Equivalent to above code. Equivalent to QueueAppend code
;Below code is equivalent to &pMap[pThread->cDispPriority]
LD L,(IY + OFFSET_DP) ;pThread->cDispPriority
LD H,4 ;size of each member of pMap array = 4
MLT HL ;Multiply to get index into pmap array bytewise
LD BC, _pMap ;_pMap
ADD HL, BC ;&pMap[pThread->cDispPriority]
;Below code is equivalent to DQPriorityBitMap |= pMap [pThread->cDispPriority];
; As eZ80 is 8 bit 4 OR statements are required to OR a 32 bit value
LD IY, _DQPriorityBitMap
LD A, (IY)
OR A, (HL)
LD (IY), A
INC HL
LD A, (IY + 1)
OR A, (HL)
LD (IY + 1), A
INC HL
LD A, (IY + 2)
OR A, (HL)
LD (IY + 2), A
INC HL
LD A, (IY + 3)
OR A, (HL)
LD (IY + 3), A
LD SP, IX
POP IX
RET
.def _DispatchQueueNodeRemove
.assume adl=1
_DispatchQueueNodeRemove:
PUSH IX
LD IX, 0
ADD IX, SP
LD IY, (IX+6) ;IY now contains thread handle
LD HL, (IY + %3)
LD BC, (IY)
LD (HL),BC
LD DE, (IY)
LD BC, (IY + %3)
PUSH DE
POP IY
LD (IY + %3),BC
LD IY, (IX+6) ;Restore IY:IY now contains thread handle
; Below code is equivalent to the above mentioned code
LD L,(IY + OFFSET_DP) ;pThread->cDispPriority
LD H,6 ;size of DispatchQueue=6 typedef struct DISPATCHQ_t
; { RZK_TCB_t * pNext;
; RZK_TCB_t * pPrevious;
; } RZK_DISPATCHQ_t
MLT HL ;multiply with pThread->cDispPriority*Dispatchqueue size
LD BC,_DispatchQueue ;
ADD HL,BC ;DispatchQueue[pThread->cDispPriority]
PUSH HL ;
POP DE ;
LD BC,3
ADD HL,BC ;DispatchQueue[pThread->cDispPriority]
LD HL, (HL) ;DispatchQueue[pThread->cDispPriority].pPrevious
SBC HL, DE ;if( ( void * ) DispatchQueue[pThread->cDispPriority].pPrevious ==
;( void * ) &DispatchQueue[pThread->cDispPriority])
jp nz, _return
;Below code is equivalent to &pMap[pThread->cDispPriority]
LD L,(IY + OFFSET_DP) ;pThread->cDispPriority
LD H,4 ;size of each member of pMap array = 4
MLT HL ;Multiply to get index into pmap array bytewise
LD BC, _pMap ;_pMap
ADD HL, BC ;&pMap[pThread->cDispPriority]
LD A, (HL)
CPL A ;~pMap[pThread->cDispPriority]
LD IY, _DQPriorityBitMap
AND A, (IY) ;DQPriorityBitMap &= (~pMap[pThread->cDispPriority]);
LD (IY), A ;DQPriorityBitMap &= (~pMap[pThread->cDispPriority]);
INC HL
LD A, (HL)
CPL A ;~pMap[pThread->cDispPriority]
AND A, (IY+1) ;DQPriorityBitMap &= (~pMap[pThread->cDispPriority]);
LD (IY+1), A ;DQPriorityBitMap &= (~pMap[pThread->cDispPriority]);
INC HL
LD A, (HL)
CPL A ;~pMap[pThread->cDispPriority]
AND A, (IY+2) ;DQPriorityBitMap &= (~pMap[pThread->cDispPriority]);
LD (IY+2), A ;DQPriorityBitMap &= (~pMap[pThread->cDispPriority]);
INC HL
LD A, (HL)
CPL A ;~pMap[pThread->cDispPriority]
AND A, (IY+3) ;DQPriorityBitMap &= (~pMap[pThread->cDispPriority]);
LD (IY+3), A ;DQPriorityBitMap &= (~pMap[pThread->cDispPriority]);
_return
LD SP, IX
POP IX
RET
.def _DispatchQueueAppend
.assume adl=1
_DispatchQueueAppend:
PUSH IX
LD IX, 0
ADD IX, SP
LD IY, (IX+6) ;IY now contains thread handle
LD L,(IY + OFFSET_DP) ;pThread->cDispPriority
LD H,6 ;size of DispatchQueue=6 typedef struct DISPATCHQ_t
; { RZK_TCB_t * pNext;
; RZK_TCB_t * pPrevious;
; } RZK_DISPATCHQ_t
MLT HL ;multiply with index
LD BC,_DispatchQueue + 3 ;Add 3 to access .pPrevious member of dispatch queue
ADD HL,BC ;DispatchQueue[uIndex]
LD HL, (HL) ;DispatchQueue[pThread->cDispPriority].pPrevious
; Equivalent to above code. Equivalent to QueueAppend code
LD BC, (HL)
LD(IY),BC
LD(IY + %3),HL
LD BC, IY
LD (HL), BC
LD IY, (IY)
LD (IY + %3), BC
LD SP, IX
POP IX
RET
.def _DispatchQueueRemove
.assume adl=1
_DispatchQueueRemove:
PUSH IX
LD IX, 0
ADD IX, SP
LD IY, (IX+6) ;IY now contains thread handle
LD HL, (IY + %3)
LD BC, (IY)
LD (HL),BC
LD DE, (IY)
LD BC, (IY + %3)
PUSH DE
POP IY
LD (IY + %3),BC
LD SP, IX
POP IX
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -