Imported Upstream version 2.9.0
[debian/cc1111] / sim / ucsim / s51.src / test_ser.c
1 #include <reg51.h>
2
3 #define BUFSIZE 16
4 #define T0H 0xfc
5 #define T0L 0x67
6
7 unsigned char buf[BUFSIZE];
8 unsigned char first_free= 0, last_occupied= 0;
9 bit transmitting, overflow;
10 volatile int t0cnt;
11
12 void ser_it(void) interrupt 4
13 {
14   unsigned char temp;
15   if (RI) {
16     buf[first_free]= SBUF;
17     first_free= ((temp= first_free)+1) % BUFSIZE;
18     if (first_free == last_occupied) {
19       first_free= temp;
20       overflow= 1;
21     }
22     RI= 0;
23   }
24   if (TI) {
25     transmitting= 0;
26     TI= 0;
27   }
28 }
29
30 void t0_it(void) interrupt 1
31 {
32   TL0= T0L;
33   TH0= T0H;
34   if (t0cnt)
35     t0cnt--;
36 }
37
38 char empty(void)
39 {
40   return(first_free == last_occupied);
41 }
42
43 unsigned char get_ch(void)
44 {
45   unsigned char c;
46   c= buf[last_occupied];
47   last_occupied= (last_occupied+1) % BUFSIZE;
48   overflow= 0;
49   return(c);
50 }
51
52 void send_ch(unsigned char c)
53 {
54   while (transmitting) ;
55   transmitting= 1;
56   SBUF= c;
57 }
58
59 void send_str(char *str)
60 {
61   while (*str) {
62     send_ch(*str);
63     str++;
64   }
65 }
66
67 void process(void)
68 {
69   unsigned char c;
70   c= get_ch();
71   if ((c >= 'a' && c <= 'z') ||
72       (c >= 'A' && c <= 'Z'))
73     c^= 0x20;
74   send_ch(c);
75 }
76
77 void wait(int delay)
78 {
79   t0cnt= delay;
80   while (t0cnt)
81     PCON|= 1;
82 }
83
84 char test(char c)
85 {
86   return(c+1);
87 }
88
89 void main(void)
90 {
91   t0cnt= 0;
92   transmitting= overflow= 0;
93   SCON= 0x7c;
94   TL1= TH1= 250; /* 9600 baud */
95   TH0= T0H;
96   TL0= T0L;
97   TMOD= 0x21;
98   TR0= TR1= 1;
99   ES= ET0= 1;
100   EA= 1;
101   send_str("\nOK\n");
102   test(0);
103   wait(1000);
104   test(1);
105   send_str("delay off\n");
106   for (;;) {
107     if (!empty()) {
108       if (overflow) {
109         send_str("Overflow!\n");
110       }
111       process();
112     }
113   }
114 }