summaryrefslogtreecommitdiff
path: root/src/arch/blinkenrocket/driver/stdout.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch/blinkenrocket/driver/stdout.cc')
-rw-r--r--src/arch/blinkenrocket/driver/stdout.cc35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/arch/blinkenrocket/driver/stdout.cc b/src/arch/blinkenrocket/driver/stdout.cc
new file mode 100644
index 0000000..961cf46
--- /dev/null
+++ b/src/arch/blinkenrocket/driver/stdout.cc
@@ -0,0 +1,35 @@
+#include "driver/stdout.h"
+#include <avr/io.h>
+#include <avr/interrupt.h>
+
+void StandardOutput::setup()
+{
+ PORTC |= _BV(PC1);
+ DDRC |= _BV(DDC1);
+}
+
+void StandardOutput::put(char c)
+{
+ unsigned char i = 1;
+ PORTC &= ~_BV(PC1);
+ __builtin_avr_delay_cycles(59);
+ while (i < 0x80) {
+ if (c & i) {
+ PORTC |= _BV(PC1);
+ } else {
+ PORTC &= ~_BV(PC1);
+ }
+ i <<= 1;
+ __builtin_avr_delay_cycles(54);
+ }
+ __builtin_avr_delay_cycles(6);
+ PORTC &= ~_BV(PC1);
+ __builtin_avr_delay_cycles(67);
+ PORTC |= _BV(PC1);
+ __builtin_avr_delay_cycles(150);
+ if (c == '\n') {
+ put('\r');
+ }
+}
+
+StandardOutput kout;