diff options
| author | Xavier ASUS <xavi92psx@gmail.com> | 2019-10-18 00:31:54 +0200 |
|---|---|---|
| committer | Xavier ASUS <xavi92psx@gmail.com> | 2019-10-18 00:31:54 +0200 |
| commit | 268a53de823a6750d6256ee1fb1e7707b4b45740 (patch) | |
| tree | 42c1799a9a82b2f7d9790ee9fe181d72a7274751 /sim/ucsim/s51.src/test/test_ser.c | |
| download | sdcc-gas-268a53de823a6750d6256ee1fb1e7707b4b45740.tar.gz | |
sdcc-3.9.0 fork implementing GNU assembler syntax
This fork aims to provide better support for stm8-binutils
Diffstat (limited to 'sim/ucsim/s51.src/test/test_ser.c')
| -rw-r--r-- | sim/ucsim/s51.src/test/test_ser.c | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/sim/ucsim/s51.src/test/test_ser.c b/sim/ucsim/s51.src/test/test_ser.c new file mode 100644 index 0000000..43f1f7a --- /dev/null +++ b/sim/ucsim/s51.src/test/test_ser.c @@ -0,0 +1,114 @@ +#include "hw.h" + +#define BUFSIZE 16 +#define T0H 0xfc +#define T0L 0x67 + +unsigned char buf[BUFSIZE]; +unsigned char first_free= 0, last_occupied= 0; +bit transmitting, overflow; +volatile int t0cnt; + +void ser_it(void) __interrupt (4) +{ + unsigned char temp; + if (RI) { + buf[first_free]= SBUF; + first_free= ((temp= first_free)+1) % BUFSIZE; + if (first_free == last_occupied) { + first_free= temp; + overflow= 1; + } + RI= 0; + } + if (TI) { + transmitting= 0; + TI= 0; + } +} + +void t0_it(void) __interrupt (1) +{ + TL0= T0L; + TH0= T0H; + if (t0cnt) + t0cnt--; +} + +char empty(void) +{ + return(first_free == last_occupied); +} + +unsigned char get_ch(void) +{ + unsigned char c; + c= buf[last_occupied]; + last_occupied= (last_occupied+1) % BUFSIZE; + overflow= 0; + return(c); +} + +void send_ch(unsigned char c) +{ + while (transmitting) ; + transmitting= 1; + SBUF= c; +} + +void send_str(char *str) +{ + while (*str) { + send_ch(*str); + str++; + } +} + +void process(void) +{ + unsigned char c; + c= get_ch(); + if ((c >= 'a' && c <= 'z') || + (c >= 'A' && c <= 'Z')) + c^= 0x20; + send_ch(c); +} + +void wait(int delay) +{ + t0cnt= delay; + while (t0cnt) + PCON|= 1; +} + +char test(char c) +{ + return(c+1); +} + +void main(void) +{ + t0cnt= 0; + transmitting= overflow= 0; + SCON= 0x7c; + TL1= TH1= 250; /* 9600 baud */ + TH0= T0H; + TL0= T0L; + TMOD= 0x21; + TR0= TR1= 1; + ES= ET0= 1; + EA= 1; + send_str("\nOK\n"); + test(0); + wait(1000); + test(1); + send_str("delay off\n"); + for (;;) { + if (!empty()) { + if (overflow) { + send_str("Overflow!\n"); + } + process(); + } + } +} |
