summaryrefslogtreecommitdiff
path: root/sim/ucsim/stm8.src/test/serial.c
blob: 8d8fddd7f2a8577404c5a2c9d1b5396779692d83 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include <stdio.h>

#include "stm8.h"

#include "serial.h"

extern volatile unsigned char *sif;

int
putchar(int c)
{
  while(!(USART->sr & USART_SR_TXE));
  
  USART->dr = c;
  return c;
}

volatile uint8_t rx_buf[UART_BUF_SIZE];
volatile uint8_t first_free= 0;
volatile uint8_t last_used= 0;

unsigned char
serial_nuof_received()
{
  if (first_free == last_used)
    return 0;
  else if (first_free > last_used)
    return first_free - last_used;
  else
    return UART_BUF_SIZE - (last_used - first_free);
}

void isr_rx(void) __interrupt(USART_RX_IRQ)
{
  volatile uint8_t d;
  if (USART->sr & USART_SR_RXNE)
    {
      uint8_t n;
      d= USART->dr;
      n= (first_free+1)%UART_BUF_SIZE;
      *sif= 'p';*sif= '|';
      *sif= 'p';*sif= d;
      *sif= 'p';*sif= '|';
      if (n != last_used)
	{
	  rx_buf[first_free]= d;
	  first_free= n;
	}
      else
	{
	  *sif= 'p';*sif= '*';
	  *sif= 'p';*sif= d;
	  *sif= 'p';*sif= '*';
	}
      d= serial_nuof_received();
      *sif= 'p';*sif= '/';
      *sif= 'p';*sif= d+'0';
      *sif= 'p';*sif= '/';
    }
}

char
serial_received()
{
  //return UART2_SR & UART_SR_RXNE;
  return first_free != last_used;
}

char getchar()
{
  uint8_t o, nr;
  while (!serial_received())
    ;
  o= last_used;
  last_used= (last_used+1)%UART_BUF_SIZE;
  o= rx_buf[o];
  nr= serial_nuof_received();
  *sif= 'p';*sif= '@';
  *sif= 'p';*sif= nr+'0';
  *sif= 'p';*sif= '@';
  return o;
}

void
print_cx1(char c)
{
  if (c > 9)
    printf("%c", c-10+'A');
  else
    printf("%c", c+'0');
}

void
print_cx2(char c)
{
  int d;
  d= (c>>4) & 0xf;
  print_cx1(d);
  d= c & 0xf;
  print_cx1(d);
}

void
print_ix4(int i)
{
  int d= i>>12;
  print_cx1(d);
  d= (i>>8) & 0xf;
  print_cx1(d);
  d= (i>>4) & 0xf;
  print_cx1(d);
  d= i & 0xf;
  print_cx1(d);
}