📄 8880.lst
字号:
4D6 94AA DEC R10
4D7 E080 LDI R24,0
4D8 158A CP R24,R10
4D9 F3B0 BCS 0x04D0
(0146) }
(0147) M8880_WriteChar(*M8880_State.CurSend);
4DA 91E0 0208 LDS R30,M8880_State+1
4DC 91F0 0209 LDS R31,M8880_State+2
4DE 8100 LDD R16,Z+0
4DF DEB0 RCALL _M8880_WriteChar
4E0 C2BC RJMP pop_xgset303C
_M8880_Dial:
c --> R20
x --> R10
4E1 D292 RCALL push_xgset300C
4E2 0158 MOVW R10,R16
(0148) }
(0149) char number[]={10,1,2,3,4,5,6,7,8,9};
(0150) void M8880_Dial(char *x)
(0151) {
(0152) char *c;
(0153) if (*x==0) return;
4E3 01F5 MOVW R30,R10
4E4 8020 LDD R2,Z+0
4E5 2022 TST R2
4E6 F409 BNE 0x04E8
4E7 C029 RJMP 0x0511
(0154) while(M8880_State.Sending);
4E8 9020 0211 LDS R2,0x0211
4EA 2022 TST R2
4EB F7E1 BNE 0x04E8
(0155) M8880_State.SendCount=0;
4EC 2422 CLR R2
4ED 9220 0207 STS M8880_State,R2
(0156) M8880_State.Sending=-1;
4EF EF8F LDI R24,0xFF
4F0 9380 0211 STS 0x0211,R24
(0157) c=sendbuf;
4F2 E444 LDI R20,0x44
4F3 E052 LDI R21,2
4F4 C012 RJMP 0x0507
(0158) while(*x){
(0159) *c++=number[(*x++)-'0'];
4F5 E68A LDI R24,0x6A
4F6 E091 LDI R25,1
4F7 01F5 MOVW R30,R10
4F8 9021 LD R2,Z+
4F9 015F MOVW R10,R30
4FA 2DE2 MOV R30,R2
4FB 27FF CLR R31
4FC 0FE8 ADD R30,R24
4FD 1FF9 ADC R31,R25
4FE 8020 LDD R2,Z+0
4FF 01FA MOVW R30,R20
500 9221 ST R2,Z+
501 01AF MOVW R20,R30
(0160) M8880_State.SendCount++;
502 9180 0207 LDS R24,M8880_State
504 5F8F SUBI R24,0xFF
505 9380 0207 STS M8880_State,R24
507 01F5 MOVW R30,R10
508 8020 LDD R2,Z+0
509 2022 TST R2
50A F751 BNE 0x04F5
(0161) }
(0162) M8880_WriteChar(*M8880_State.CurSend);
50B 91E0 0208 LDS R30,M8880_State+1
50D 91F0 0209 LDS R31,M8880_State+2
50F 8100 LDD R16,Z+0
510 DE7F RCALL _M8880_WriteChar
511 C267 RJMP pop_xgset300C
(0163) }
(0164) void M8880_Recv(char* buf,char count)
(0165) {
(0166) if (count==0) return;
_M8880_Recv:
count --> R18
buf --> R16
512 2322 TST R18
513 F409 BNE 0x0515
514 C037 RJMP 0x054C
(0167) M8880_State.RecvIntCount=count;
515 9320 020A STS M8880_State+3,R18
(0168) while(M8880_State.RecvStartPtr==M8880_State.RecvEndPtr);
517 9020 020D LDS R2,0x020D
519 9030 020E LDS R3,0x020E
51B 9040 020B LDS R4,0x020B
51D 9050 020C LDS R5,0x020C
51F 1442 CP R4,R2
520 0453 CPC R5,R3
521 F3A9 BEQ 0x0517
522 C01B RJMP 0x053E
(0169) while(M8880_State.RecvStartPtr!=M8880_State.RecvEndPtr){
(0170) *buf++=*M8880_State.RecvStartPtr++;
523 91E0 020B LDS R30,0x020B
525 91F0 020C LDS R31,0x020C
527 01D8 MOVW R26,R16
528 9001 LD R0,Z+
529 93F0 020C STS 0x020C,R31
52B 93E0 020B STS 0x020B,R30
52D 920D ST R0,X+
52E 018D MOVW R16,R26
(0171) if (M8880_State.RecvStartPtr==recvbuf+M8880_RECV_BUFSIZE)
52F E484 LDI R24,0x44
530 E092 LDI R25,2
531 9020 020B LDS R2,0x020B
533 9030 020C LDS R3,0x020C
535 1628 CP R2,R24
536 0639 CPC R3,R25
537 F431 BNE 0x053E
(0172) M8880_State.RecvStartPtr=recvbuf;
538 E182 LDI R24,0x12
539 E092 LDI R25,2
53A 9390 020C STS 0x020C,R25
53C 9380 020B STS 0x020B,R24
53E 9020 020D LDS R2,0x020D
540 9030 020E LDS R3,0x020E
542 9040 020B LDS R4,0x020B
544 9050 020C LDS R5,0x020C
546 1442 CP R4,R2
547 0453 CPC R5,R3
548 F6D1 BNE 0x0523
(0173) }
(0174) *buf=0;
549 2422 CLR R2
54A 01F8 MOVW R30,R16
54B 8220 STD Z+0,R2
54C 9508 RET
_M8880_CPDial:
c --> R20
x --> R12
buf --> R10
54D D248 RCALL push_xgset303C
54E 0158 MOVW R10,R16
(0175) }
(0176) void M8880_CPDial(char *buf)
(0177) {
(0178) int x;
(0179) #if M8880_INT==1
(0180) GICR&=~(1<<INT1);
(0181) #else
(0182) GICR&=~(1<<INT0);
54F B78B IN R24,0x3B
550 7B8F ANDI R24,0xBF
551 BF8B OUT 0x3B,R24
(0183) #endif
(0184) M8880_WriteCtrl(M8880_BIT0|M8880_BIT1|M8880_BIT2|M8880_BIT3,-1);
552 EF2F LDI R18,0xFF
553 E00F LDI R16,0xF
554 DE5F RCALL _M8880_WriteCtrl
555 C012 RJMP 0x0568
(0185) while(*buf!=0){
(0186) char c;
(0187) c=*buf++;
556 01F5 MOVW R30,R10
557 9141 LD R20,Z+
558 015F MOVW R10,R30
(0188) c-=('0');
559 5340 SUBI R20,0x30
(0189) M8880_WriteChar(number[c]);
55A E98A LDI R24,0x9A
55B E091 LDI R25,1
55C 2FE4 MOV R30,R20
55D 27FF CLR R31
55E 0FE8 ADD R30,R24
55F 1FF9 ADC R31,R25
560 8100 LDD R16,Z+0
561 DE2E RCALL _M8880_WriteChar
(0190) while(((x=M8880_ReadState())&M8880_BIT0)==0x0);
562 DE80 RCALL _M8880_ReadState
563 2E20 MOV R2,R16
564 2433 CLR R3
565 0161 MOVW R12,R2
566 FF00 SBRS R16,0
567 CFFA RJMP 0x0562
568 01F5 MOVW R30,R10
569 8020 LDD R2,Z+0
56A 2022 TST R2
56B F751 BNE 0x0556
(0191) };
(0192) M8880_WriteCtrl(M8880_BIT0|M8880_BIT2,-1);
56C EF2F LDI R18,0xFF
56D E005 LDI R16,5
56E DE45 RCALL _M8880_WriteCtrl
(0193) M8880_ReadState();
56F DE73 RCALL _M8880_ReadState
(0194) #if M8880_INT==1
(0195) GIFR|=(1<<INT1);
(0196) GICR|=(1<<INT1);
(0197) #else
(0198) GIFR|=(1<<INT0);
570 B78A IN R24,0x3A
571 6480 ORI R24,0x40
572 BF8A OUT 0x3A,R24
(0199) GICR|=(1<<INT0);
573 B78B IN R24,0x3B
574 6480 ORI R24,0x40
575 BF8B OUT 0x3B,R24
576 C226 RJMP pop_xgset303C
_int1_isr:
577 920A ST R0,-Y
578 921A ST R1,-Y
579 922A ST R2,-Y
57A 923A ST R3,-Y
57B 924A ST R4,-Y
57C 925A ST R5,-Y
57D 926A ST R6,-Y
57E 927A ST R7,-Y
57F 928A ST R8,-Y
580 929A ST R9,-Y
581 930A ST R16,-Y
582 931A ST R17,-Y
583 932A ST R18,-Y
584 933A ST R19,-Y
585 938A ST R24,-Y
586 939A ST R25,-Y
587 93AA ST R26,-Y
588 93BA ST R27,-Y
589 93EA ST R30,-Y
58A 93FA ST R31,-Y
58B B60F IN R0,0x3F
58C 920A ST R0,-Y
(0200) #endif
(0201) }
(0202) #pragma interrupt_handler int1_isr:iv_INT1
(0203) void int1_isr(void)
(0204) {
(0205) if ((sysoption.calling==0) && sysoption.autoanswer){
58D 9020 0203 LDS R2,sysoption+1
58F 2022 TST R2
590 F491 BNE 0x05A3
591 9020 0206 LDS R2,0x0206
593 2022 TST R2
594 F071 BEQ 0x05A3
(0206) M8880_Handup;
595 9AAD SBI 0x15,5
(0207) sysoption.calling=2;
596 E082 LDI R24,2
597 9380 0203 STS sysoption+1,R24
(0208) serial_send(answering);
599 9100 0196 LDS R16,answering
59B 9110 0197 LDS R17,answering+1
59D D0B7 RCALL _serial_send
(0209) MCUCR|=0xc;
59E B785 IN R24,0x35
59F 608C ORI R24,0xC
5A0 BF85 OUT 0x35,R24
(0210) TCCR1B=0x05;
5A1 E085 LDI R24,5
5A2 BD8E OUT 0x2E,R24
(0211) }
(0212) if (sysoption.calling==3){
5A3 9180 0203 LDS R24,sysoption+1
5A5 3083 CPI R24,3
5A6 F491 BNE 0x05B9
(0213) M8880_Handdown;
5A7 98AD CBI 0x15,5
(0214) sysoption.calling=0;
5A8 2422 CLR R2
5A9 9220 0203 STS sysoption+1,R2
(0215) MCUCR&=~0xc;
5AB B785 IN R24,0x35
5AC 7F83 ANDI R24,0xF3
5AD BF85 OUT 0x35,R24
(0216) MCUCR|=0x8;
5AE B785 IN R24,0x35
5AF 6088 ORI R24,0x8
5B0 BF85 OUT 0x35,R24
(0217) serial_send("aa");
5B1 EA04 LDI R16,0xA4
5B2 E011 LDI R17,1
5B3 D0A1 RCALL _serial_send
(0218) serial_send(handdown);
5B4 9100 018C LDS R16,handdown
5B6 9110 018D LDS R17,handdown+1
5B8 D09C RCALL _serial_send
(0219) }
5B9 9009 LD R0,Y+
5BA BE0F OUT 0x3F,R0
5BB 91F9 LD R31,Y+
5BC 91E9 LD R30,Y+
5BD 91B9 LD R27,Y+
5BE 91A9 LD R26,Y+
5BF 9199 LD R25,Y+
5C0 9189 LD R24,Y+
5C1 9139 LD R19,Y+
5C2 9129 LD R18,Y+
5C3 9119 LD R17,Y+
5C4 9109 LD R16,Y+
5C5 9099 LD R9,Y+
5C6 9089 LD R8,Y+
5C7 9079 LD R7,Y+
5C8 9069 LD R6,Y+
5C9 9059 LD R5,Y+
5CA 9049 LD R4,Y+
5CB 9039 LD R3,Y+
5CC 9029 LD R2,Y+
5CD 9019 LD R1,Y+
5CE 9009 LD R0,Y+
5CF 9518 RETI
FILE: E:\Shuaihu\AVR\8880\serial.c
(0001) //ICC-AVR application builder : 2007-10-18 21:13:05
(0002) // Target : M8
(0003) // Crystal: 8.0000Mhz
(0004)
(0005) #include <iom8v.h>
(0006) #include <macros.h>
(0007) #include <string.h>
(0008) #include "serial.h"
(0009) #include "main.h"
(0010) //UART0 initialize
(0011) // desired baud rate: 110
(0012) // actual: invalid baud rate
(0013) SERIAL_PORT_STATUS com_status;
(0014) char recv_buf[RECV_BUFLEN];
(0015) char send_buf[SEND_BUFLEN];
(0016) void uart0_init(void)
(0017) {
(0018) UCSRB = 0x00; //disable while setting baud rate
_uart0_init:
5D0 2422 CLR R2
5D1 B82A OUT 0x0A,R2
(0019) UCSRA = 0x00;
5D2 B82B OUT 0x0B,R2
(0020) UCSRC = BIT(URSEL) | 0x06;
5D3 E886 LDI R24,0x86
5D4 BD80 OUT 0x20,R24
(0021) UBRRL = 0x03; //set baud rate lo
5D5 E083 LDI R24,3
5D6 B989 OUT 0x09,R24
(0022) UBRRH = 0x00; //set baud rate hi
5D7 BC20 OUT 0x20,R2
(0023) UCSRB = 0x98;
5D8 E988 LDI R24,0x98
5D9 B98A OUT 0x0A,R24
(0024) com_status.read_start_ptr=recv_buf;
5DA EA88 LDI R24,0xA8
5DB E092 LDI R25,2
5DC 9390 02DB STS com_status+1,R25
5DE 9380 02DA STS com_status,R24
(0025) com_status.read_end_ptr=recv_buf;
5E0 9390 02DD STS com_status+3,R25
5E2 9380 02DC STS com_status+2,R24
(0026) com_status.recv_cur_ptr=recv_buf;
5E4 9390 02DF STS 0x02DF,R25
5E6 9380 02DE STS 0x02DE,R24
(0027) com_status.send_cur_ptr=send_buf;
5E8 E786 LDI R24,0x76
5E9 E092 LDI R25,2
5EA 9390 02E1 STS 0x02E1,R25
5EC 9380 02E0 STS 0x02E0,R24
(0028) com_status.sending=0;
5EE 9220 02E2 STS 0x02E2,R2
5F0 9508 RET
_uart0_rx_isr:
c --> R16
5F1 922A ST R2,-Y
5F2 923A ST R3,-Y
5F3 930A ST R16,-Y
5F4 938A ST R24,-Y
5F5 939A ST R25,-Y
5F6 93EA ST R30,-Y
5F7 93FA ST R31,-Y
5F8 B62F IN R2,0x3F
5F9 922A ST R2,-Y
(0029) }
(0030)
(0031) #pragma interrupt_handler uart0_rx_isr:iv_USART0_RXC
(0032) void uart0_rx_isr(void)
(0033) {
(0034) char c;
(0035) c=UDR;
5FA B10C IN R16,0x0C
(0036) if (sysoption.echo){
5FB 9020 0202 LDS R2,sysoption
5FD 2022 TST R2
5FE F031 BEQ 0x0605
(0037) if (c=='\r')
5FF 300D CPI R16,0xD
600 F419 BNE 0x0604
(0038) UDR='\n';
601 E08A LDI R24,0xA
602 B98C OUT 0x0C,R24
603 C001 RJMP 0x0605
(0039) else
(0040) UDR=c;
604 B90C OUT 0x0C,R16
(0041) }
(0042) if (c==0) return;
605 2300 TST R16
606 F409 BNE 0x0608
607 C01E RJMP 0x0626
(0043) *com_status.recv_cur_ptr++=c;
608 91E0 02DE LDS R30,0x02DE
60A 91F0 02DF LDS R31,0x02DF
60C 9301 ST R16,Z+
60D 93F0 02DF STS 0x02DF,R31
60F 93E0 02DE STS 0x02DE,R30
(0044) if (com_status.recv_cur_ptr==recv_buf+RECV_BUFLEN)
611 ED8A LDI R24,0xDA
612 E092 LDI R25,2
613 17E8 CP R30,R24
614 07F9 CPC R31,R25
615 F431 BNE 0x061C
(0045) com_status.recv_cur_ptr=recv_buf;
616 EA88 LDI R24,0xA8
617 E092 LDI R25,2
618 9390 02DF STS 0x02DF,R25
61A 9380 02DE STS 0x02DE,R24
(0046) if (c==LINE_END_CHAR) {
61C 300D CPI R16,0xD
61D F441 BNE 0x0626
(0047) com_status.read_end_ptr=com_status.recv_cur_ptr;
61E 9020 02DE LDS R2,0x02DE
620 9030 02DF LDS R3,0x02DF
622 9230 02DD STS com_status+3,R3
624 9220 02DC STS com_status+2,R2
(0048) }
626 9029 LD R2,Y+
627 BE2F OUT 0x3F,R2
628 91F9 LD R31,Y+
629 91E9 LD R30,Y+
62A 9199 LD R25,Y+
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -