summaryrefslogtreecommitdiff
path: root/sim/ucsim/s51.src/test/test_ser.c
diff options
context:
space:
mode:
authorXavier ASUS <xavi92psx@gmail.com>2019-10-18 00:31:54 +0200
committerXavier ASUS <xavi92psx@gmail.com>2019-10-18 00:31:54 +0200
commit268a53de823a6750d6256ee1fb1e7707b4b45740 (patch)
tree42c1799a9a82b2f7d9790ee9fe181d72a7274751 /sim/ucsim/s51.src/test/test_ser.c
downloadsdcc-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.c114
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();
+ }
+ }
+}