📄 queue.asm
字号:
.public _Queue_Init
.public _Queue_Write
.public _Queue_Read
.public _Queue_Test
.define QUEUE_SIZE 200
.RAM
.var Queue_WriteIdx
.var Queue_ReadIdx
.var Queue_Status // 0xffff-Empty, 0-Full, others-space remained
Queue_Buf: .dw QUEUE_SIZE dup(?)
.code
// void Queue_Init(void);
_Queue_Init:
push r1, r2 to [sp]
r1 = Queue_Buf
[Queue_WriteIdx] = r1 // Initial variables
[Queue_ReadIdx] = r1
r2 = 0xffff
[Queue_Status] = r2 // Empty
r2 = 0x0000
?L:
[r1++] = r2 // Clear Queue
cmp r1, Queue_Buf+QUEUE_SIZE
jne ?L
pop r1, r2 from [sp]
retf
// void Queue_Write(unsigned int Data);
_Queue_Write:
int off
r1 = sp + 3
r1 = [r1]
push r2 to [sp]
r2 = [Queue_WriteIdx]
[r2++] = r1
cmp r2, Queue_Buf+QUEUE_SIZE
jb ?UpdateIdx
r2 = Queue_Buf
?UpdateIdx:
[Queue_WriteIdx] = r2
r2 = [Queue_Status]
cmp r2, 0xffff
jne ?UpdateStatus
r2 = QUEUE_SIZE
?UpdateStatus:
r2 -= 1
[Queue_Status] = r2
?Exit:
pop r2 from [sp]
int fiq, irq
retf
// unsigned int Queue_Read(void);
_Queue_Read:
int off
push r2 to [sp]
r2 = [Queue_ReadIdx]
r1 = [r2++]
cmp r2, Queue_Buf+QUEUE_SIZE
jb ?UpdateIdx
r2 = Queue_Buf
?UpdateIdx:
[Queue_ReadIdx] = r2
r2 = [Queue_Status]
r2 += 1
cmp r2, QUEUE_SIZE
jne ?UpdateStatus
r2 = 0xffff
?UpdateStatus:
[Queue_Status] = r2
pop r2 from [sp]
int fiq, irq
retf
// unsigned int Queue_Test(void);
_Queue_Test:
r1 = [Queue_Status]
retf
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -