📄 rd_adt_queue.s
字号:
.module RD_ADT_QUEUE.c
.area text(rom, con, rel)
.dbfile O:\2007全国电子设计大赛\键盘显示模块\RD_ADT_QUEUE.c
.dbfunc e ADT_Queue_Add_To_Buffer _ADT_Queue_Add_To_Buffer fc
.dbstruct 0 18 AbstructDataTypeQueue
.dbfield 0 pBuffer pc
.dbfield 2 nSize i
.dbfield 4 nHead i
.dbfield 6 nTail i
.dbfield 8 nCount i
.dbfield 10 fnAddToBuffer pfc
.dbfield 12 fnGetFromBuffer pfc
.dbfield 14 fnCheckEmpty pfc
.dbfield 16 fnPeekFromBuffer pfc
.dbend
; pBuffer -> R12,R13
; nCount0 -> R20,R21
; nHead0 -> R14,R15
; nTail0 -> R22,R23
; nSize0 -> R10,R11
; cData -> R18
; pQueue -> R16,R17
.even
_ADT_Queue_Add_To_Buffer::
xcall push_xgsetF0FC
.dbline -1
.dbline 78
; /***********************************************************
; * 函数库说明:抽象数据类型(ADT)队列函数库 *
; * 版本: v1.01 *
; * 作者: 王卓然 *
; * 创建日期: 2007年3月23日 *
; * -------------------------------------------------------- *
; * [支 持 库] *
; * 支持库名称:RD_MacroAndConst.h *
; * 需要版本: v0.01 &abv *
; * 支持库说明:系统常用宏定义库 *
; * *
; * 支持库名称:RD_ADT_QUEUE.h *
; * 需要版本: ----- *
; * 支持库说明:抽象数据类型(ADT)队列声明库 *
; * -------------------------------------------------------- *
; * [版本更新] *
; * 修改: 王卓然 *
; * 修改日期: 2007年4月17日 *
; * 版本: v1.01 *
; * -------------------------------------------------------- *
; * [版本历史] *
; * v1.00 该版本提供了基本的抽象数据类型队列的结构定 *
; * 义,以及默认的环形队列处理函数。 *
; * v1.01 增加了队列空判断函数,和队列首数据预览函数 *
; * -------------------------------------------------------- *
; * [使用说明] *
; ***********************************************************/
;
; /********************
; * 头 文 件 配 置 区 *
; ********************/
; # include "RD_MacroAndConst.h"
; # include "RD_ADT_QUEUE.h"
;
; /********************
; * 系 统 宏 定 义 *
; ********************/
;
; /*------------------*
; * 常 数 宏 定 义 *
; *------------------*/
;
; /*------------------*
; * 动 作 宏 定 义 *
; *------------------*/
;
; /********************
; * 结构体定义区 *
; ********************/
;
; /********************
; * 模块函数声明区 *
; ********************/
;
; /********************
; * 全局函数声明区 *
; ********************/
; BOOL ADT_Queue_Add_To_Buffer(ADT_QUEUE *pQueue,uint8 cData);
; BOOL ADT_Queue_Get_From_Buffer(ADT_QUEUE *pQueue,uint8 *pData);
; BOOL ADT_Queue_Check_Empty(ADT_QUEUE *pQueue);
; BOOL ADT_Queue_Peek_From_Buffer(ADT_QUEUE *pQueue,uint8 *pData);
;
; /********************
; * 模块变量声明区 *
; ********************/
;
; /********************
; * 全局变量声明区 *
; ********************/
;
; /***********************************************************
; * 函数说明:抽象数据类型队列,系统默认队列缓冲添加函数 *
; * 输入: 要添加到缓冲区的数据 *
; * 输出: 添加是否成功 *
; * 调用函数:无 *
; ***********************************************************/
; BOOL ADT_Queue_Add_To_Buffer(ADT_QUEUE *pQueue,uint8 cData)
; {
.dbline 85
; uint8 *pBuffer;
; uint nSize;
; uint nTail;
; uint nHead;
; uint nCount;
;
; SAFE_CODE_PERFORMANCE //原子操作
cli
.dbline 85
movw R30,R16
ldd R12,z+0
ldd R13,z+1
.dbline 85
ldd R10,z+2
ldd R11,z+3
.dbline 85
tst R12
brne X0
tst R13
breq L4
X0:
tst R10
brne L2
tst R11
brne L2
X1:
L4:
.dbline 85
.dbline 85
sei
.dbline 85
clr R16
xjmp L1
L2:
.dbline 85
movw R30,R16
ldd R22,z+6
ldd R23,z+7
.dbline 85
ldd R14,z+4
ldd R15,z+5
.dbline 85
ldd R20,z+8
ldd R21,z+9
.dbline 85
cp R22,R14
cpc R23,R15
brne L5
X2:
cp R20,R10
cpc R21,R11
brne L5
X3:
.dbline 85
.dbline 85
sei
.dbline 85
clr R16
xjmp L1
L5:
.dbline 85
movw R30,R22
add R30,R12
adc R31,R13
std z+0,R18
.dbline 85
subi R22,255 ; offset = 1
sbci R23,255
.dbline 85
subi R20,255 ; offset = 1
sbci R21,255
.dbline 85
cp R22,R10
cpc R23,R11
brne L7
X4:
.dbline 85
.dbline 85
clr R22
clr R23
.dbline 85
L7:
.dbline 85
movw R30,R16
std z+7,R23
std z+6,R22
.dbline 85
std z+9,R21
std z+8,R20
.dbline 85
.dbline 85
sei
.dbline 118
; (
; pBuffer = pQueue->pBuffer;
; nSize = pQueue->nSize;
;
; if ((pBuffer == NULL) || (!nSize))
; {
; SEI();
; return FALSE; //缓冲区未分配空间
; }
; nTail = pQueue->nTail;
; nHead = pQueue->nHead;
; nCount = pQueue->nCount;
;
;
; if ((nTail == nHead) && (nCount == nSize)) //缓冲区已满
; {
; SEI();
; return FALSE;
; }
;
; pBuffer[nTail] = cData;
; nTail++;
; nCount++;
; if (nTail == nSize)
; {
; nTail = 0;
; }
;
; pQueue->nTail = nTail;
; pQueue->nCount = nCount;
; )
;
; return TRUE;
ldi R16,1
.dbline -2
L1:
.dbline 0 ; func end
xjmp pop_xgsetF0FC
.dbsym r pBuffer 12 pc
.dbsym r nCount0 20 i
.dbsym r nHead0 14 i
.dbsym r nTail0 22 i
.dbsym r nSize0 10 i
.dbsym r cData 18 c
.dbsym r pQueue 16 pS[AbstructDataTypeQueue]
.dbend
.dbfunc e ADT_Queue_Get_From_Buffer _ADT_Queue_Get_From_Buffer fc
; pBuffer -> R12,R13
; nHead1 -> R22,R23
; nCount0 -> R20,R21
; nHead0 -> R14,R15
; nTail0 -> R22,R23
; nSize0 -> R10,R11
; pData -> R18,R19
; pQueue -> R16,R17
.even
_ADT_Queue_Get_From_Buffer::
xcall push_xgsetF0FC
.dbline -1
.dbline 128
; }
;
; /***********************************************************
; * 函数说明:抽象数据类型队列,系统默认队列缓冲区读取函数 *
; * 输入: 存放读取变量的空间指针 *
; * 输出: 队列是否为空 *
; * 调用函数:无 *
; ***********************************************************/
; BOOL ADT_Queue_Get_From_Buffer(ADT_QUEUE *pQueue,uint8 *pData)
; {
.dbline 135
; uint8 *pBuffer;
; uint nSize;
; uint nTail;
; uint nHead;
; uint nCount;
;
; SAFE_CODE_PERFORMANCE //原子操作
cli
.dbline 135
movw R30,R16
ldd R12,z+0
ldd R13,z+1
.dbline 135
ldd R10,z+2
ldd R11,z+3
.dbline 135
tst R12
brne X5
tst R13
breq L12
X5:
tst R10
brne L10
tst R11
brne L10
X6:
L12:
.dbline 135
.dbline 135
sei
.dbline 135
clr R16
xjmp L9
L10:
.dbline 135
movw R30,R16
ldd R22,z+6
ldd R23,z+7
.dbline 135
ldd R14,z+4
ldd R15,z+5
.dbline 135
ldd R20,z+8
ldd R21,z+9
.dbline 135
cp R22,R14
cpc R23,R15
brne L13
X7:
cpi R20,0
cpc R20,R21
brne L13
X8:
.dbline 135
.dbline 135
sei
.dbline 135
clr R16
xjmp L9
L13:
.dbline 135
movw R22,R14
subi R22,255 ; offset = 1
sbci R23,255
movw R30,R14
add R30,R12
adc R31,R13
ldd R2,z+0
movw R30,R18
std z+0,R2
.dbline 135
subi R20,1
sbci R21,0
.dbline 135
cp R22,R10
cpc R23,R11
brne L15
X9:
.dbline 135
.dbline 135
clr R22
clr R23
.dbline 135
L15:
.dbline 135
movw R30,R16
std z+5,R23
std z+4,R22
.dbline 135
std z+9,R21
std z+8,R20
.dbline 135
.dbline 135
sei
.dbline 168
; (
; pBuffer = pQueue->pBuffer;
; nSize = pQueue->nSize;
;
; if ((pBuffer == NULL) || (!nSize))
; {
; SEI();
; return FALSE; //缓冲区未分配空间
; }
; nTail = pQueue->nTail;
; nHead = pQueue->nHead;
; nCount = pQueue->nCount;
;
;
; if ((nTail == nHead) && (nCount == 0)) //缓冲区为空
; {
; SEI();
; return FALSE;
; }
;
; (*pData) = pBuffer[nHead++];
;
; nCount--;
; if (nHead == nSize)
; {
; nHead = 0;
; }
;
; pQueue->nHead = nHead;
; pQueue->nCount = nCount;
; )
;
; return TRUE;
ldi R16,1
.dbline -2
L9:
.dbline 0 ; func end
xjmp pop_xgsetF0FC
.dbsym r pBuffer 12 pc
.dbsym r nHead1 22 i
.dbsym r nCount0 20 i
.dbsym r nHead0 14 i
.dbsym r nTail0 22 i
.dbsym r nSize0 10 i
.dbsym r pData 18 pc
.dbsym r pQueue 16 pS[AbstructDataTypeQueue]
.dbend
.dbfunc e ADT_Queue_Check_Empty _ADT_Queue_Check_Empty fc
; pBuffer -> R10,R11
; pQueue -> R16,R17
.even
_ADT_Queue_Check_Empty::
st -y,R10
st -y,R11
.dbline -1
.dbline 178
; }
;
; /***********************************************************
; * 函数说明:队列判空函数 *
; * 输入: 队列指针 *
; * 输出: 队列是否为空 *
; * 调用函数:无 *
; ***********************************************************/
; BOOL ADT_Queue_Check_Empty(ADT_QUEUE *pQueue)
; {
.dbline 181
; uint8 *pBuffer;
;
; SAFE_CODE_PERFORMANCE
cli
.dbline 181
movw R30,R16
ldd R10,z+0
ldd R11,z+1
.dbline 181
tst R10
brne X10
tst R11
breq L20
X10:
ldd R2,z+2
ldd R3,z+3
tst R2
brne L18
tst R3
brne L18
X11:
L20:
.dbline 181
.dbline 181
sei
.dbline 181
ldi R16,1
xjmp L17
L18:
.dbline 181
movw R30,R16
ldd R2,z+4
ldd R3,z+5
ldd R4,z+6
ldd R5,z+7
cp R4,R2
cpc R5,R3
brne L21
X12:
ldd R2,z+8
ldd R3,z+9
tst R2
brne L21
tst R3
brne L21
X13:
.dbline 181
.dbline 181
sei
.dbline 181
ldi R16,1
xjmp L17
L21:
.dbline 181
.dbline 181
sei
.dbline 200
; (
; pBuffer = pQueue->pBuffer;
;
; if ((pBuffer == NULL) || (!(pQueue->nSize)))
; {
; SEI();
; return TRUE; //缓冲区未分配空间
; }
;
;
; if (((pQueue->nTail) == (pQueue->nHead))
; && ((pQueue->nCount) == 0)) //缓冲区为空
; {
; SEI();
; return TRUE;
; }
; )
;
; return FALSE;
clr R16
.dbline -2
L17:
.dbline 0 ; func end
ld R11,y+
ld R10,y+
ret
.dbsym r pBuffer 10 pc
.dbsym r pQueue 16 pS[AbstructDataTypeQueue]
.dbend
.dbfunc e ADT_Queue_Peek_From_Buffer _ADT_Queue_Peek_From_Buffer fc
; pBuffer -> R10,R11
; nCount0 -> R14,R15
; nHead0 -> R12,R13
; nTail0 -> R20,R21
; nSize0 -> R12,R13
; pData -> R18,R19
; pQueue -> R16,R17
.even
_ADT_Queue_Peek_From_Buffer::
xcall push_xgset30FC
.dbline -1
.dbline 210
; }
;
; /***********************************************************
; * 函数说明:队列首个数据预览函数 *
; * 输入: 存放读取变量的空间指针 *
; * 输出: 队列是否为空 *
; * 调用函数:无 *
; ***********************************************************/
; BOOL ADT_Queue_Peek_From_Buffer(ADT_QUEUE *pQueue,uint8 *pData)
; {
.dbline 217
; uint8 *pBuffer;
; uint nSize;
; uint nTail;
; uint nHead;
; uint nCount;
;
; SAFE_CODE_PERFORMANCE //原子操作
cli
.dbline 217
movw R30,R16
ldd R10,z+0
ldd R11,z+1
.dbline 217
ldd R12,z+2
ldd R13,z+3
.dbline 217
tst R10
brne X14
tst R11
breq L26
X14:
tst R12
brne L24
tst R13
brne L24
X15:
L26:
.dbline 217
.dbline 217
sei
.dbline 217
clr R16
xjmp L23
L24:
.dbline 217
movw R30,R16
ldd R20,z+6
ldd R21,z+7
.dbline 217
ldd R12,z+4
ldd R13,z+5
.dbline 217
ldd R14,z+8
ldd R15,z+9
.dbline 217
cp R20,R12
cpc R21,R13
brne L27
X16:
tst R14
brne L27
tst R15
brne L27
X17:
.dbline 217
.dbline 217
sei
.dbline 217
clr R16
xjmp L23
L27:
.dbline 217
movw R30,R12
add R30,R10
adc R31,R11
ldd R2,z+0
movw R30,R18
std z+0,R2
.dbline 217
.dbline 217
sei
.dbline 241
; (
; pBuffer = pQueue->pBuffer;
; nSize = pQueue->nSize;
;
; if ((pBuffer == NULL) || (!nSize))
; {
; SEI();
; return FALSE; //缓冲区未分配空间
; }
; nTail = pQueue->nTail;
; nHead = pQueue->nHead;
; nCount = pQueue->nCount;
;
;
; if ((nTail == nHead) && (nCount == 0)) //缓冲区为空
; {
; SEI();
; return FALSE;
; }
;
; (*pData) = pBuffer[nHead];
; )
;
; return TRUE;
ldi R16,1
.dbline -2
L23:
.dbline 0 ; func end
xjmp pop_xgset30FC
.dbsym r pBuffer 10 pc
.dbsym r nCount0 14 i
.dbsym r nHead0 12 i
.dbsym r nTail0 20 i
.dbsym r nSize0 12 i
.dbsym r pData 18 pc
.dbsym r pQueue 16 pS[AbstructDataTypeQueue]
.dbend
; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -