diff options
Diffstat (limited to 'src/ao_stdio.c')
| -rw-r--r-- | src/ao_stdio.c | 35 | 
1 files changed, 21 insertions, 14 deletions
diff --git a/src/ao_stdio.c b/src/ao_stdio.c index 6e1f5eff..6b890832 100644 --- a/src/ao_stdio.c +++ b/src/ao_stdio.c @@ -21,25 +21,25 @@   * Basic I/O functions to support SDCC stdio package   */ -#define AO_NUM_STDIOS	2 +#define AO_NUM_STDIOS	(HAS_USB + PACKET_HAS_SLAVE + USE_SERIAL_STDIN) -static __xdata struct ao_stdio stdios[AO_NUM_STDIOS]; -static __data int8_t ao_cur_stdio; -static __data int8_t ao_num_stdios; +__xdata struct ao_stdio ao_stdios[AO_NUM_STDIOS]; +__data int8_t ao_cur_stdio; +__data int8_t ao_num_stdios;  void  putchar(char c)  {  	if (c == '\n') -		(*stdios[ao_cur_stdio].putchar)('\r'); -	(*stdios[ao_cur_stdio].putchar)(c); +		(*ao_stdios[ao_cur_stdio].putchar)('\r'); +	(*ao_stdios[ao_cur_stdio].putchar)(c);  }  void  flush(void)  { -	if (stdios[ao_cur_stdio].flush) -		stdios[ao_cur_stdio].flush(); +	if (ao_stdios[ao_cur_stdio].flush) +		ao_stdios[ao_cur_stdio].flush();  }  __xdata uint8_t ao_stdin_ready; @@ -51,7 +51,7 @@ getchar(void) __reentrant __critical  	int8_t stdio = ao_cur_stdio;  	for (;;) { -		c = stdios[stdio].pollchar(); +		c = ao_stdios[stdio].pollchar();  		if (c != AO_READ_AGAIN)  			break;  		if (++stdio == ao_num_stdios) @@ -63,15 +63,22 @@ getchar(void) __reentrant __critical  	return c;  } -void +uint8_t +ao_echo(void) +{ +	return ao_stdios[ao_cur_stdio].echo; +} + +int8_t  ao_add_stdio(char (*pollchar)(void),  	     void (*putchar)(char),  	     void (*flush)(void)) __reentrant  {  	if (ao_num_stdios == AO_NUM_STDIOS)  		ao_panic(AO_PANIC_STDIO); -	stdios[ao_num_stdios].pollchar = pollchar; -	stdios[ao_num_stdios].putchar = putchar; -	stdios[ao_num_stdios].flush = flush; -	ao_num_stdios++; +	ao_stdios[ao_num_stdios].pollchar = pollchar; +	ao_stdios[ao_num_stdios].putchar = putchar; +	ao_stdios[ao_num_stdios].flush = flush; +	ao_stdios[ao_num_stdios].echo = 1; +	return ao_num_stdios++;  }  | 
