📄 queue.s
字号:
.module queue.c
.area text(rom, con, rel)
.dbfile D:\桌面\mp3\queue\queue.c
.dbfunc e InitQueue _InitQueue fV
.dbstruct 0 9 .1
.dbfield 0 front c
.dbfield 1 rear c
.dbfield 2 count c
.dbfield 3 data pc
.dbfield 5 queuesize c
.dbfield 6 errorcode c
.dbfield 7 status c
.dbfield 8 memo c
.dbend
; Q -> R16,R17
.even
_InitQueue::
.dbline -1
.dbline 53
; /*********************************************************************************************************
; ** QUEUE队列头文件
; ** (c) Copyright 2006-2008, limaokui
; ** All Rights Reserved
; **
; ** V1.0.0
; **
; **
; **--------------文件信息--------------------------------------------------------------------------------
; **文 件 名:queue.h
; **创 建 人: 李茂奎
; **最后修改日期: 2006年8月29日
; **描 述:
; **
; **--------------历史版本信息----------------------------------------------------------------------------
; ** 创建人: 李茂奎
; ** 版 本: V1.00
; ** 日 期: 2006年8月29日
; ** 描 述: 原始版本
; **
; **------------------------------------------------------------------------------------------------------
; ** 修改人: 李茂奎
; ** 版 本:
; ** 日 期:
; ** 描 述:
; **
; **--------------当前版本修订------------------------------------------------------------------------------
; ** 修改人: 李茂奎
; ** 日 期: 2006年8月29日
; ** 描 述:
; **
; **------------------------------------------------------------------------------------------------------
; *********************************************************************************************************
; **使用说明:在定义队列时请定义一个静态数组,并将此数组传递给队列的data,并将数据长度传递给queuesize
; #define TWI_SEND_DATA_BUFFER_SIZE 100
; static uint8 Twi_SendData[TWI_SEND_DATA_BUFFER_SIZE];
; CirQueue Twi_SendBuffer={0,0,0,Twi_SendData,TWI_SEND_DATA_BUFFER_SIZE,QUEUE_OK};
;
; *********************************************************************************************************/
; #include "config.h"
; /*********************************************************************************************************
; ** 函数名称:InitQueue
; ** 功能描述:初始化队列
; ** 输 入:
; ** 输 出:
; ** 全局变量:
; ** 调用模块:
; ** 说明:
; ** 注意:
; ** 日 期: 2006年8月29日
; ********************************************************************************************************/
; void InitQueue(CirQueue * Q)
; {
.dbline 55
; //CLI();
; Q->front=Q->rear=0;
clr R2
movw R30,R16
std z+1,R2
movw R30,R16
std z+0,R2
.dbline 56
; Q->count=0;
std z+2,R2
.dbline 57
; Q->errorcode= QUEUE_OK;
movw R30,R16
std z+6,R2
.dbline 58
; Q->memo=0;
movw R30,R16
std z+8,R2
.dbline 59
; Q->status=TWI_DATA_FREE;
movw R30,R16
std z+7,R2
.dbline -2
L7:
.dbline 0 ; func end
ret
.dbsym r Q 16 pS[.1]
.dbend
.dbfunc e EnQueue _EnQueue fV
; x -> R22
; Q -> R20,R21
.even
_EnQueue::
xcall push_gset2
mov R22,R18
movw R20,R16
.dbline -1
.dbline 105
; //SEI();
; }
; /*********************************************************************************************************
; ** 函数名称:EmptyQueue(CirQueue *Q)
; ** 功能描述:判断队列是否为空
; ** 输 入:
; ** 输 出:
; ** 全局变量:
; ** 调用模块:
; ** 说明:
; ** 注意:
; ** 日 期: 2006年8月29日
; ********************************************************************************************************
; uint8 EmptyQueue(CirQueue * Q)
; {
; return Q->count==0;
; }
; /*********************************************************************************************************
; ** 函数名称:FullQueue(CirQueue *Q)
; ** 功能描述:判断队列是否为满
; ** 输 入:
; ** 输 出:
; ** 全局变量:
; ** 调用模块:
; ** 说明:
; ** 注意:
; ** 日 期: 2006年8月29日
; ********************************************************************************************************
;
; uint8 FullQueue(CirQueue * Q)
; {
; return (Q->count == Q->queuesize);
; }
; /*********************************************************************************************************
; ** 函数名称:EnQueue
; ** 功能描述:入队
; ** 输 入:
; ** 输 出:
; ** 全局变量:
; ** 调用模块:
; ** 说明:
; ** 注意:
; ** 日 期: 2006年8月29日
; ********************************************************************************************************/
; void EnQueue(CirQueue * Q,uint8 x)
; {
.dbline 106
; if(FullQueue(Q))
movw R30,R20
ldd R2,z+5
movw R30,R20
ldd R3,z+2
cp R3,R2
brne L9
.dbline 107
; {
.dbline 108
; Q->errorcode=QUEUE_OVERFLOW;
ldi R24,1
movw R30,R20
std z+6,R24
.dbline 109
; Q->count=Q->queuesize;
movw R30,R20
ldd R2,z+5
movw R30,R20
std z+2,R2
.dbline 110
; return;
xjmp L8
L9:
.dbline 113
; }
; //CLI();
; Q->count++;
movw R24,R20
adiw R24,2
movw R30,R24
ldd R24,z+0
subi R24,255 ; addi 1
std z+0,R24
.dbline 114
; Q->data[Q->rear]=x;
movw R30,R20
ldd R2,z+3
ldd R3,z+4
movw R30,R20
ldd R30,z+1
clr R31
add R30,R2
adc R31,R3
std z+0,R22
.dbline 115
; Q->rear=(Q->rear+1)%Q->queuesize;
movw R24,R20
adiw R24,1
movw R2,R24
movw R30,R20
ldd R17,z+5
movw R30,R24
ldd R16,z+0
subi R16,255 ; addi 1
xcall mod8u
movw R30,R2
std z+0,R16
.dbline 116
; Q->errorcode=QUEUE_OK;
clr R2
movw R30,R20
std z+6,R2
.dbline -2
L8:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r x 22 c
.dbsym r Q 20 pS[.1]
.dbend
.dbfunc e DeQueue _DeQueue fc
; temp -> R20
; Q -> R22,R23
.even
_DeQueue::
xcall push_gset2
movw R22,R16
.dbline -1
.dbline 131
; //SEI();
; }
; /*********************************************************************************************************
; ** 函数名称:DeQueue
; ** 功能描述:出队
; ** 输 入:
; ** 输 出:
; ** 全局变量:
; ** 调用模块:
; ** 说明:
; ** 注意:
; ** 日 期: 2006年8月29日
; ********************************************************************************************************/
; uint8 DeQueue(CirQueue * Q)
; {
.dbline 133
; uint8 temp;
; if(EmptyQueue(Q))
movw R30,R22
ldd R2,z+2
tst R2
brne L12
.dbline 134
; {
.dbline 135
; Q->errorcode=QUEUE_UNDERFLOW;
ldi R24,2
movw R30,R22
std z+6,R24
.dbline 136
; return FALSE;
clr R16
xjmp L11
L12:
.dbline 139
; }
; //CLI();
; Q->count--;
movw R24,R22
adiw R24,2
movw R30,R24
ldd R24,z+0
subi R24,1
std z+0,R24
.dbline 140
; temp=Q->data[Q->front];
movw R30,R22
ldd R2,z+3
ldd R3,z+4
movw R30,R22
ldd R30,z+0
clr R31
add R30,R2
adc R31,R3
ldd R20,z+0
.dbline 141
; Q->front=(Q->front+1)%Q->queuesize;
movw R30,R22
ldd R17,z+5
movw R30,R22
ldd R16,z+0
subi R16,255 ; addi 1
xcall mod8u
movw R30,R22
std z+0,R16
.dbline 142
; Q->errorcode=QUEUE_OK;
clr R2
std z+6,R2
.dbline 144
; //SEI();
; return temp;
mov R16,R20
.dbline -2
L11:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r temp 20 c
.dbsym r Q 22 pS[.1]
.dbend
.dbfunc e FrontQueueData _FrontQueueData fc
; Q -> R16,R17
.even
_FrontQueueData::
.dbline -1
.dbline 158
; }
; /*********************************************************************************************************
; ** 函数名称:FrontQueueData
; ** 功能描述:出队
; ** 输 入:
; ** 输 出:
; ** 全局变量:
; ** 调用模块:
; ** 说明:
; ** 注意:
; ** 日 期: 2006年8月29日
; ********************************************************************************************************/
; uint8 FrontQueueData(CirQueue * Q)
; {
.dbline 159
; if(EmptyQueue(Q))
movw R30,R16
ldd R2,z+2
tst R2
brne L15
.dbline 160
; {
.dbline 161
; Q->errorcode=QUEUE_UNDERFLOW;
ldi R24,2
movw R30,R16
std z+6,R24
.dbline 162
; return FALSE;
clr R16
xjmp L14
L15:
.dbline 164
; }
; return Q->data[Q->front];
movw R30,R16
ldd R2,z+3
ldd R3,z+4
movw R30,R16
ldd R30,z+0
clr R31
add R30,R2
adc R31,R3
ldd R16,z+0
.dbline -2
L14:
.dbline 0 ; func end
ret
.dbsym r Q 16 pS[.1]
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -