📄 sio.s
字号:
.dbline 240
; RTbuf->T_disabled=1;
ldi R24,1
movw R30,R16
subi R30,49 ; addi 207
sbci R31,255
std z+0,R24
.dbline -2
L40:
.dbline 0 ; func end
ret
.dbsym r RTbuf 16 pS[.1]
.dbend
.dbfunc e Rbuf_empty _Rbuf_empty fc
; RTbuf -> R16,R17
.even
_Rbuf_empty::
xcall push_gset1
.dbline -1
.dbline 252
; }
; /*********************************************************************************************************
; ** 函数名称: Rbuf_empty
; ** 功能描述: 接收缓冲区判空
; ** 输 入:
; ** 输出 : TRUE 空 FALSE 非空
; ** 全局变量: 无
; ** 调用模块:
; ** 说明:
; ** 注意:
; ********************************************************************************************************/
; unsigned char Rbuf_empty(siocirqueue *RTbuf){
.dbline 253
; return RTbuf->R_count==0;
movw R30,R16
ldd R2,z+2
tst R2
brne L42
ldi R20,1
ldi R21,0
xjmp L43
L42:
clr R20
clr R21
L43:
mov R16,R20
.dbline -2
L41:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r RTbuf 16 pS[.1]
.dbend
.dbfunc e Tbuf_full _Tbuf_full fc
; RTbuf -> R16,R17
.even
_Tbuf_full::
xcall push_gset1
.dbline -1
.dbline 291
; }
; /*********************************************************************************************************
; ** 函数名称: Tbuf_empty
; ** 功能描述: 发送缓冲区判空
; ** 输 入:
; ** 输出 : TRUE 空 FALSE 非空
; ** 全局变量: 无
; ** 调用模块:
; ** 说明:
; ** 注意:
; ********************************************************************************************************
; unsigned char Tbuf_empty(void){
; return RTbuf->T_count==0;
; }
; /*********************************************************************************************************
; ** 函数名称: Rbuf_full
; ** 功能描述: 接收缓冲区判满
; ** 输 入:
; ** 输出 : TRUE 满 FALSE 非满
; ** 全局变量: 无
; ** 调用模块:
; ** 说明:
; ** 注意:
; ********************************************************************************************************
; unsigned char Rbuf_full (void){
; return RTbuf->R_count==RBUF_SIZE;
; }
; /*********************************************************************************************************
; ** 函数名称: Tbuf_full
; ** 功能描述: 发送缓冲区判满
; ** 输 入:
; ** 输出 : TRUE 满 FALSE 非满
; ** 全局变量: 无
; ** 调用模块:
; ** 说明:
; ** 注意:
; ********************************************************************************************************/
; unsigned char Tbuf_full(siocirqueue *RTbuf){
.dbline 292
; return RTbuf->T_count==TBUF_SIZE;
movw R30,R16
subi R30,150 ; addi 106
sbci R31,255
ldd R24,z+0
cpi R24,100
brne L45
ldi R20,1
ldi R21,0
xjmp L46
L45:
clr R20
clr R21
L46:
mov R16,R20
.dbline -2
L44:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r RTbuf 16 pS[.1]
.dbend
.dbfunc e Tbuf_putchar _Tbuf_putchar fV
; RTbuf -> R20,R21
; x -> R22
.even
_Tbuf_putchar::
xcall push_gset2
movw R20,R18
mov R22,R16
.dbline -1
.dbline 323
; }
; /*********************************************************************************************************
; ** 函数名称: Rbuf_putchar
; ** 功能描述: 把一个字符放入接收缓冲区
; ** 输 入:
; ** 输出 :
; ** 全局变量: 无
; ** 调用模块:
; ** 说明:
; ** 注意:
; ********************************************************************************************************
; void Rbuf_putchar (unsigned char x){
; if(!Rbuf_full()){
; REV_DIS();
; RTbuf->R_count++;
; RTbuf->R_buf[RTbuf->R_rear]=x;
; RTbuf->R_rear=(RTbuf->R_rear+1) % RBUF_SIZE;
; REV_EN();
; }
; }
; /*********************************************************************************************************
; ** 函数名称: Tbuf_putchar
; ** 功能描述: 把一个字符放入发送缓冲区
; ** 输 入:
; ** 输出 :
; ** 全局变量: 无
; ** 调用模块:
; ** 说明:
; ** 注意:
; ********************************************************************************************************/
; void Tbuf_putchar(unsigned char x,siocirqueue *RTbuf){
.dbline 324
; if(!Tbuf_full(RTbuf)){
movw R16,R20
xcall _Tbuf_full
tst R16
breq X1
xjmp L48
X1:
.dbline 324
.dbline 325
; TXC_DIS();
.dbline 325
cbi 0xa,6
.dbline 325
.dbline 325
.dbline 326
; if (RTbuf->T_disabled)
movw R30,R20
subi R30,49 ; addi 207
sbci R31,255
ldd R2,z+0
tst R2
breq L50
.dbline 327
; {
.dbline 328
; UDR0=x;
out 0xc,R22
.dbline 329
; RTbuf->T_disabled=0;
clr R2
movw R30,R20
subi R30,49 ; addi 207
sbci R31,255
std z+0,R2
.dbline 330
; }
xjmp L51
L50:
.dbline 332
; else
; {
.dbline 333
; RTbuf->T_count++;
movw R24,R20
subi R24,150 ; offset = 106
sbci R25,255
movw R30,R24
ldd R24,z+0
subi R24,255 ; addi 1
std z+0,R24
.dbline 334
; RTbuf->T_buf[RTbuf->T_rear]=x;
movw R24,R20
subi R24,149 ; offset = 107
sbci R25,255
movw R30,R20
subi R30,151 ; addi 105
sbci R31,255
ldd R30,z+0
clr R31
add R30,R24
adc R31,R25
std z+0,R22
.dbline 335
; RTbuf->T_rear=(RTbuf->T_rear+1) % TBUF_SIZE;
movw R24,R20
subi R24,151 ; offset = 105
sbci R25,255
movw R2,R24
ldi R17,100
movw R30,R24
ldd R16,z+0
subi R16,255 ; addi 1
xcall mod8u
movw R30,R2
std z+0,R16
.dbline 336
; }
L51:
.dbline 337
.dbline 337
sbi 0xa,6
.dbline 337
.dbline 337
.dbline 338
L48:
.dbline -2
L47:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r RTbuf 20 pS[.1]
.dbsym r x 22 c
.dbend
.dbfunc e Rbuf_getchar _Rbuf_getchar fc
; Btemp -> R20
; RTbuf -> R22,R23
.even
_Rbuf_getchar::
xcall push_gset2
movw R22,R16
.dbline -1
.dbline 376
; TXC_EN();
; }
; }
; /*********************************************************************************************************
; ** 函数名称: Rbuf_getstring
; ** 功能描述: 从接收缓冲区返回当前子串指针
; ** 输 入:
; ** 输出 : 当前子串指针
; ** 全局变量: 无
; ** 调用模块:
; ** 说明:
; ** 注意:
; ********************************************************************************************************
; unsigned char * Rbuf_getstring(void){
; return (RTbuf->R_buf[RTbuf->R_front]);
; }
; /*********************************************************************************************************
; ** 函数名称: Tbuf_getstring
; ** 功能描述: 从发送缓冲区返回当前子串指针
; ** 输 入:
; ** 输出 : 当前子串指针
; ** 全局变量: 无
; ** 调用模块:
; ** 说明:
; ** 注意:
; ********************************************************************************************************
; unsigned char * Tbuf_getstring(void){
; return (RTbuf->T_buf[RTbuf->T_front]);
; }
; /*********************************************************************************************************
; ** 函数名称: Rbuf_putchar
; ** 功能描述: 从接收缓冲区读一个字符
; ** 输 入:
; ** 输出 : 读字符
; ** 全局变量: 无
; ** 调用模块:
; ** 说明:
; ** 注意:
; ********************************************************************************************************/
; unsigned char Rbuf_getchar(siocirqueue *RTbuf){
.dbline 377
; unsigned char Btemp=0;
clr R20
.dbline 378
; if (!Rbuf_empty(RTbuf)){
movw R16,R22
xcall _Rbuf_empty
tst R16
brne L53
.dbline 378
.dbline 379
; Btemp=RTbuf->R_buf[RTbuf->R_front];
movw R24,R22
adiw R24,4
movw R30,R22
ldd R30,z+0
clr R31
add R30,R24
adc R31,R25
ldd R20,z+0
.dbline 380
; REV_DIS();
.dbline 380
cbi 0xa,7
.dbline 380
.dbline 380
.dbline 381
; RTbuf->R_count--;
movw R24,R22
adiw R24,2
movw R30,R24
ldd R24,z+0
subi R24,1
std z+0,R24
.dbline 382
; RTbuf->R_front=(RTbuf->R_front+1) % RBUF_SIZE;
ldi R17,100
movw R30,R22
ldd R16,z+0
subi R16,255 ; addi 1
xcall mod8u
movw R30,R22
std z+0,R16
.dbline 383
; REV_EN();
sbi 0xa,7
.dbline 384
; }
L53:
.dbline 385
; return (Btemp);
mov R16,R20
.dbline -2
L52:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r Btemp 20 c
.dbsym r RTbuf 22 pS[.1]
.dbend
.area vector(rom, abs)
.org 72
jmp _uart0_rx_isr
.area text(rom, con, rel)
.dbfile D:\avrvi\AVRVi_m128_Starter_Kit\PCF8563_USART\source\lib\sio.c
.dbfunc e uart0_rx_isr _uart0_rx_isr fV
; data -> R22
; status -> R10
; RTbuf -> R20,R21
.even
_uart0_rx_isr::
st -y,R2
st -y,R3
st -y,R16
st -y,R17
st -y,R24
st -y,R25
st -y,R30
st -y,R31
in R2,0x3f
st -y,R2
xcall push_gset3
.dbline -1
.dbline 417
;
; }
; /*********************************************************************************************************
; ** 函数名称: Tbuf_getchar
; ** 功能描述: 从发送缓冲区读一个字符
; ** 输 入:
; ** 输出 : 读字符
; ** 全局变量: 无
; ** 调用模块:
; ** 说明:
; ** 注意:
; ********************************************************************************************************
; unsigned char Tbuf_getchar(void){
; unsigned char Btemp;
; if (!Tbuf_empty()){
; Btemp=RTbuf->T_buf[RTbuf->T_front];
; TXC_DIS();
; RTbuf->T_count--;
; RTbuf->T_front=(RTbuf->T_front+1) % TBUF_SIZE;
; TXC_EN();
; return (Btemp);
; }
; }
; */
;
; /******************************* 中断处理函数 ***************************
; * 功能:完成数据得的接收和发送
; ***********************************************************************/
; #if USEUART0
; #pragma interrupt_handler uart0_rx_isr:iv_USART0_RXC
; void uart0_rx_isr(void)
; {
.dbline 420
; unsigned char status,data;
; siocirqueue *RTbuf;
; RTbuf=&RTbuf_UART0;
ldi R20,<_RTbuf_UART0
ldi R21,>_RTbuf_UART0
.dbline 422
; // CLI();
; status=UCSR0A;
in R10,0xb
.dbline 423
; data=UDR0;
in R22,0xc
.dbline 425
; //WDR(); //喂狗
; if((status & (FRAMING_ERROR | DATA_OVERRUN))==0)
mov R24,R10
andi R24,24
breq X2
xjmp L56
X2:
.dbline 426
; {
.dbline 427
; if(RTbuf->R_count<RBUF_SIZE){
movw R30,R20
ldd R24,z+2
cpi R24,100
brlo X3
xjmp L58
X3:
.dbline 427
.dbline 428
; RTbuf->R_count++;
movw R24,R20
adiw R24,2
movw R30,R24
ldd R24,z+0
subi R24,255 ; addi 1
std z+0,R24
.dbline 429
; RTbuf->R_buf[RTbuf->R_rear]=data;
movw R24,R20
adiw R24,4
movw R30,R20
ldd R30,z+1
clr R31
add R30,R24
adc R31,R25
std z+0,R22
.dbline 430
; RTbuf->R_rear=(RTbuf->R_rear+1) % RBUF_SIZE;
movw R24,R20
adiw R24,1
movw R2,R24
ldi R17,100
movw R30,R24
ldd R16,z+0
subi R16,255 ; addi 1
xcall mod8u
movw R30,R2
std z+0,R16
.dbline 431
; }
xjmp L59
L58:
.dbline 433
; else
; {
.dbline 434
; RTbuf->R_overflow=1;
ldi R24,1
movw R30,R20
std z+3,R24
.dbline 435
; }
L59:
.dbline 436
L56:
.dbline -2
L55:
xcall pop_gset3
ld R2,y+
out 0x3f,R2
ld R31,y+
ld R30,y+
ld R25,y+
ld R24,y+
ld R17,y+
ld R16,y+
ld R3,y+
ld R2,y+
.dbline 0 ; func end
reti
.dbsym r data 22 c
.dbsym r status 10 c
.dbsym r RTbuf 20 pS[.1]
.dbend
.area vector(rom, abs)
.org 80
jmp _uart0_tx_isr
.area text(rom, con, rel)
.dbfile D:\avrvi\AVRVi_m128_Starter_Kit\PCF8563_USART\source\lib\sio.c
.dbfunc e uart0_tx_isr _uart0_tx_isr fV
; RTbuf -> R20,R21
.even
_uart0_tx_isr::
st -y,R2
st -y,R3
st -y,R16
st -y,R17
st -y,R24
st -y,R25
st -y,R30
st -y,R31
in R2,0x3f
st -y,R2
xcall push_gset1
.dbline -1
.dbline 442
; }
; //SEI();
; }
;
; #pragma interrupt_handler uart0_tx_isr: iv_USART0_TXC
; void uart0_tx_isr(void)
; {
.dbline 446
; //CLI();
; siocirqueue *RTbuf;
; //WDR(); //喂狗
; RTbuf=&RTbuf_UART0;
ldi R20,<_RTbuf_UART0
ldi R21,>_RTbuf_UART0
.dbline 447
; if (RTbuf->T_count>0){
clr R2
movw R30,R20
subi R30,150 ; addi 106
sbci R31,255
ldd R3,z+0
cp R2,R3
brlo X4
xjmp L61
X4:
.dbline 447
.dbline 448
; UDR0=RTbuf->T_buf[RTbuf->T_front];
movw R24,R20
subi R24,149 ; offset = 107
sbci R25,255
movw R30,R20
subi R30,152 ; addi 104
sbci R31,255
ldd R30,z+0
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
out 0xc,R2
.dbline 449
; RTbuf->T_count--;
movw R24,R20
subi R24,150 ; offset = 106
sbci R25,255
movw R30,R24
ldd R24,z+0
subi R24,1
std z+0,R24
.dbline 450
; RTbuf->T_front=(RTbuf->T_front+1) % TBUF_SIZE;
movw R24,R20
subi R24,152 ; offset = 104
sbci R25,255
movw R2,R24
ldi R17,100
movw R30,R24
ldd R16,z+0
subi R16,255 ; addi 1
xcall mod8u
movw R30,R2
std z+0,R16
.dbline 451
; }
xjmp L62
L61:
.dbline 452
ldi R24,1
movw R30,R20
subi R30,49 ; addi 207
sbci R31,255
std z+0,R24
L62:
.dbline -2
L60:
xcall pop_gset1
ld R2,y+
out 0x3f,R2
ld R31,y+
ld R30,y+
ld R25,y+
ld R24,y+
ld R17,y+
ld R16,y+
ld R3,y+
ld R2,y+
.dbline 0 ; func end
reti
.dbsym r RTbuf 20 pS[.1]
.dbend
.area bss(ram, con, rel)
.dbfile D:\avrvi\AVRVi_m128_Starter_Kit\PCF8563_USART\source\lib\sio.c
_RTbuf_UART0::
.blkb 208
.dbsym e RTbuf_UART0 _RTbuf_UART0 S[.1]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -