* 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;
+__data int8_t ao_cur_stdio;
+__data int8_t ao_num_stdios;
void
putchar(char c)
__xdata uint8_t ao_stdin_ready;
char
-getchar(void) __reentrant
+getchar(void) __reentrant __critical
{
char c;
int8_t stdio = ao_cur_stdio;
- EA = 0;
for (;;) {
c = stdios[stdio].pollchar();
if (c != AO_READ_AGAIN)
if (stdio == ao_cur_stdio)
ao_sleep(&ao_stdin_ready);
}
- EA = 1;
ao_cur_stdio = stdio;
return c;
}
void
ao_add_stdio(char (*pollchar)(void),
void (*putchar)(char),
- void (*flush)(void))
+ void (*flush)(void)) __reentrant
{
if (ao_num_stdios == AO_NUM_STDIOS)
ao_panic(AO_PANIC_STDIO);