From 7237058f71eecf75d668c977c3bd1f0e00b0b7b3 Mon Sep 17 00:00:00 2001
From: Bingzheng Feng <b26feng@uwaterloo.ca>
Date: Mon, 7 May 2018 22:46:31 -0400
Subject: [PATCH] Work with back space, my own io library

---
 include/buffer.h      |  38 +++++++++++
 include/buffer.h~     |  35 +++++++++++
 include/cmd.h         |   4 +-
 include/mycanvas.h    |  13 +++-
 include/myio.h        |   5 ++
 src/Makefile          |   4 +-
 src/first.map         | 143 +++++++++++++++++++++++++++++-------------
 src/getc.c            |  13 ++--
 src/libsrc/Makefile   |  13 +++-
 src/libsrc/buffer.c   |  51 +++++++++++++++
 src/libsrc/cmd.c      |  35 +++++++----
 src/libsrc/mycanvas.c |  27 +++++++-
 src/libsrc/myio.c     |  50 +++++++++++++++
 src/startup.c         |  33 ++++++++--
 14 files changed, 389 insertions(+), 75 deletions(-)
 create mode 100644 include/buffer.h
 create mode 100644 include/buffer.h~
 create mode 100644 src/libsrc/buffer.c

diff --git a/include/buffer.h b/include/buffer.h
new file mode 100644
index 0000000..2099af9
--- /dev/null
+++ b/include/buffer.h
@@ -0,0 +1,38 @@
+#ifndef __BUFFER_H__
+#define __BUFFER_H__
+
+#define BUFF_FULL -1
+#define BUFF_EMPTY -2
+#define BUFF_NOTREADY -3
+
+#define TRN_I_OFFSET 0
+#define TMN_I_OFFSET 1
+#define TRN_O_OFFSET 2
+#define TMN_O_OFFSET 3
+
+#define DEFAULT_BUF_SIZE 256
+typedef struct
+{
+  char * Storage;
+  int Size;
+  int Length;
+  int Start;
+  int Current;
+} Buffer;
+
+int FeedBuffer(Buffer *Buf, char Char);
+// Fill Char with the char in Start
+int BufferFIFO(Buffer *Buf, char *Char);
+
+// Pop from Start
+int BufferPopStart(Buffer* Buf);
+
+// Fill Char with the char in Current
+int BufferFILO(Buffer *Buf, char *Char);
+
+// Pop from Current
+int BufferPopLast(Buffer* Buf);
+
+// Clear Buffer
+void ClearBuffer(Buffer* Buf);
+#endif
diff --git a/include/buffer.h~ b/include/buffer.h~
new file mode 100644
index 0000000..bf21b63
--- /dev/null
+++ b/include/buffer.h~
@@ -0,0 +1,35 @@
+#ifndef __BUFFER_H__
+#define __BUFFER_H__
+
+#define BUFF_FULL -1
+#define BUFF_EMPTY -2
+#define BUFF_NOTREADY -3
+
+#define TRN_I_OFFSET 0
+#define TMN_I_OFFSET 1
+#define TRN_O_OFFSET 2
+#define TMN_O_OFFSET 3
+
+#define DEFAULT_BUF_SIZE 256
+typedef struct
+{
+  char * Storage;
+  int Size;
+  int Length;
+  int Start;
+  int Current;
+} Buffer;
+
+int FeedBuffer(Buffer *Buf, char Char);
+// Fill Char with the char in Start
+int BufferFIFO(Buffer *Buf, char *Char);
+
+// Pop from Start
+int BufferPopStart(Buffer* Buf);
+
+// Fill Char with the char in Current
+int BufferFILO(Buffer *Buf, char *Char);
+
+// Pop from Current
+int BufferPopLast(Buffer* Buf);
+#endif
diff --git a/include/cmd.h b/include/cmd.h
index 8c6b698..7f802d5 100644
--- a/include/cmd.h
+++ b/include/cmd.h
@@ -1,7 +1,9 @@
 #ifndef __CMD_H__
 #define __CMD_H__
 
+#include <buffer.h>
+
 #define CMD_HALT 0
 #define CMD_NOINPUT 1
-int ListenCommand();
+int FeedCommand(Buffer* Buf);
 #endif
diff --git a/include/mycanvas.h b/include/mycanvas.h
index fd609fc..fa791e0 100644
--- a/include/mycanvas.h
+++ b/include/mycanvas.h
@@ -1,5 +1,6 @@
 #ifndef __CANVAS_H__
 #define __CANVAS_H__
+#include <buffer.h>
 #include <bwio.h>
 #include <myclock.h>
 /*
@@ -9,6 +10,7 @@
 
 #define ESC_CANVAS 27
 #define CLEAR_SCREEN bwprintf(COM2, "%c[2J", ESC_CANVAS)
+#define CLEARLINE bwprintf(COM2, "%c[1K",ESC_CANVAS)
 
 #define MOVE_UP(Num) bwprintf(COM2, "%c[%dA", ESC_CANVAS)
 #define MOVE_DOWN(Num) bwprintf(COM2, "%c[%dB", ESC_CANVAS)
@@ -16,9 +18,16 @@
 #define MOVE_RIGHT(Num) bwprintf(COM2, "%c[%dC", ESC_CANVAS,Num)
 #define CURSOR_POS(Row, Col) bwprintf(COM2, "%c[%d;%dH",ESC_CANVAS, Row, Col)
 
+typedef struct
+{
+  int x;
+  int y;
+  int bChanged;
+} CursorPos;
+
 void DrawLine_H(const char Element, const int Length);
 void DrawLine_V(const char Element, const int Length);
 void DrawPanel();
-void DrawClock(Clock* MyClock);
-
+void DrawClock(Clock* MyClock, CursorPos* InCursor);
+int InteractiveInput(Buffer* BufList[],CursorPos* InCursor);
 #endif
diff --git a/include/myio.h b/include/myio.h
index fec4dfc..53a5680 100644
--- a/include/myio.h
+++ b/include/myio.h
@@ -1,8 +1,13 @@
 #ifndef __MYIO_H__
 #define __MYIO_H__
 
+#include <buffer.h>
+
 #define COM1 0
 #define COM2 1
 
 int mygetc(int Channel,char* Char);
+int myputc(int Channel,char Char);
+int PutToBuffer(char Char, Buffer* Buf);
+int OutPutFromBuffer(int Channel, Buffer* Buf);
 #endif
diff --git a/src/Makefile b/src/Makefile
index e58a8ea..f0f02e7 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -19,7 +19,7 @@ ARFLAGS = rcs
 
 LDFLAGS = -init main -Map first.map -N -T orex.ld -L/u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2 -L../lib
 
-all: startup.elf clocktest.elf
+all: startup.elf
 
 startup.s: startup.c
 	$(XCC) -S $(CFLAGS) startup.c
@@ -28,7 +28,7 @@ startup.o: startup.s
 	$(AS) $(ASFLAGS) -o startup.o startup.s
 
 startup.elf: startup.o
-	$(LD) $(LDFLAGS) -o $@ startup.o -lmycanvas -lmyclock -lcmd -lmyio -lbwio -lgcc
+	$(LD) $(LDFLAGS) -o $@ startup.o -lmycanvas -lmyclock -lcmd -lmyio -lbuffer -lbwio -lgcc
 
 clocktest.s: clocktest.c
 	$(XCC) -S $(CFLAGS) clocktest.c
diff --git a/src/first.map b/src/first.map
index 90c606a..632af88 100644
--- a/src/first.map
+++ b/src/first.map
@@ -1,10 +1,19 @@
 Archive member included because of file (symbol)
 
-../lib/libbwio.a(bwio.o)      clocktest.o (bwsetfifo)
+../lib/libmycanvas.a(mycanvas.o)
+                              startup.o (DrawClock)
+../lib/libmyclock.a(myclock.o)
+                              startup.o (InitClockCount)
+../lib/libcmd.a(cmd.o)        ../lib/libmycanvas.a(mycanvas.o) (FeedCommand)
+../lib/libmyio.a(myio.o)      ../lib/libmycanvas.a(mycanvas.o) (mygetc)
+../lib/libbuffer.a(buffer.o)  ../lib/libmyio.a(myio.o) (FeedBuffer)
+../lib/libbwio.a(bwio.o)      startup.o (bwsetfifo)
 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_udivsi3.o)
                               ../lib/libbwio.a(bwio.o) (__udivsi3)
 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_umodsi3.o)
                               ../lib/libbwio.a(bwio.o) (__umodsi3)
+/u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_modsi3.o)
+                              ../lib/libbuffer.a(buffer.o) (__modsi3)
 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_dvmd_tls.o)
                               /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_udivsi3.o) (__div0)
 
@@ -28,73 +37,117 @@ bss             0x0000000000000000        0x0
  *(.bss)
                 0x0000000000000000                _BssEnd = .
 
-text            0x0000000000000000      0xef0
+text            0x0000000000000000     0x1ff0
  *(.text)
- .text          0x0000000000000000       0xa4 clocktest.o
-                0x0000000000000000                main
- .text          0x00000000000000a4      0xc54 ../lib/libbwio.a(bwio.o)
-                0x000000000000041c                bwputr
-                0x0000000000000988                bwi2a
-                0x00000000000000a4                bwsetfifo
-                0x0000000000000278                bwputc
-                0x00000000000006d8                bwa2d
-                0x000000000000016c                bwsetspeed
-                0x000000000000033c                c2x
-                0x0000000000000780                bwa2i
-                0x0000000000000620                bwgetc
-                0x0000000000000844                bwui2a
-                0x00000000000009ec                bwformat
-                0x0000000000000518                bwputw
-                0x0000000000000cc0                bwprintf
-                0x000000000000039c                bwputx
-                0x000000000000049c                bwputstr
- .text          0x0000000000000cf8      0x110 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_udivsi3.o)
-                0x0000000000000cf8                __udivsi3
-                0x0000000000000df0                __aeabi_uidivmod
- .text          0x0000000000000e08       0xcc /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_umodsi3.o)
-                0x0000000000000e08                __umodsi3
- .text          0x0000000000000ed4        0x4 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_dvmd_tls.o)
-                0x0000000000000ed4                __aeabi_ldiv0
-                0x0000000000000ed4                __div0
-                0x0000000000000ed4                __aeabi_idiv0
+ .text          0x0000000000000000      0x2f4 startup.o
+                0x0000000000000104                main
+                0x0000000000000000                initialize
+                0x00000000000000a8                runloop
+ .text          0x00000000000002f4      0x5b8 ../lib/libmycanvas.a(mycanvas.o)
+                0x00000000000002f4                DrawLine_H
+                0x0000000000000580                DrawPanel
+                0x0000000000000350                DrawLine_V
+                0x00000000000003f4                DrawClock
+                0x0000000000000700                InteractiveInput
+ .text          0x00000000000008ac       0xf8 ../lib/libmyclock.a(myclock.o)
+                0x00000000000008ac                InitClockCount
+                0x0000000000000920                UpdateClock
+ .text          0x00000000000009a4       0x70 ../lib/libcmd.a(cmd.o)
+                0x00000000000009a4                FeedCommand
+ .text          0x0000000000000a14      0x2e8 ../lib/libmyio.a(myio.o)
+                0x0000000000000be0                OutPutFromBuffer
+                0x0000000000000ba4                PutToBuffer
+                0x0000000000000a14                mygetc
+                0x0000000000000ad8                myputc
+ .text          0x0000000000000cfc      0x374 ../lib/libbuffer.a(buffer.o)
+                0x0000000000000f00                BufferFILO
+                0x0000000000000e58                BufferPopStart
+                0x0000000000000f88                BufferPopLast
+                0x0000000000000cfc                FeedBuffer
+                0x0000000000000dd0                BufferFIFO
+                0x000000000000103c                ClearBuffer
+ .text          0x0000000000001070      0xc54 ../lib/libbwio.a(bwio.o)
+                0x00000000000013e8                bwputr
+                0x0000000000001954                bwi2a
+                0x0000000000001070                bwsetfifo
+                0x0000000000001244                bwputc
+                0x00000000000016a4                bwa2d
+                0x0000000000001138                bwsetspeed
+                0x0000000000001308                c2x
+                0x000000000000174c                bwa2i
+                0x00000000000015ec                bwgetc
+                0x0000000000001810                bwui2a
+                0x00000000000019b8                bwformat
+                0x00000000000014e4                bwputw
+                0x0000000000001c8c                bwprintf
+                0x0000000000001368                bwputx
+                0x0000000000001468                bwputstr
+ .text          0x0000000000001cc4      0x110 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_udivsi3.o)
+                0x0000000000001cc4                __udivsi3
+                0x0000000000001dbc                __aeabi_uidivmod
+ .text          0x0000000000001dd4       0xcc /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_umodsi3.o)
+                0x0000000000001dd4                __umodsi3
+ .text          0x0000000000001ea0       0xe4 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_modsi3.o)
+                0x0000000000001ea0                __modsi3
+ .text          0x0000000000001f84        0x4 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_dvmd_tls.o)
+                0x0000000000001f84                __aeabi_ldiv0
+                0x0000000000001f84                __div0
+                0x0000000000001f84                __aeabi_idiv0
  *(.got)
+ .got           0x0000000000001f88        0x8 startup.o
  *(.got.plt)
- .got.plt       0x0000000000000ed8        0xc clocktest.o
-                0x0000000000000ed8                _GLOBAL_OFFSET_TABLE_
+ .got.plt       0x0000000000001f90        0xc startup.o
+                0x0000000000001f90                _GLOBAL_OFFSET_TABLE_
  *(.rodata)
- .rodata        0x0000000000000ee4        0xc clocktest.o
+ .rodata        0x0000000000001f9c       0x20 startup.o
+ .rodata        0x0000000000001fbc       0x34 ../lib/libmycanvas.a(mycanvas.o)
  *(.glue_7)
  *(.glue_7t)
 
 .rel.dyn
-LOAD clocktest.o
+LOAD startup.o
+LOAD ../lib/libmycanvas.a
+LOAD ../lib/libmyclock.a
+LOAD ../lib/libcmd.a
+LOAD ../lib/libmyio.a
+LOAD ../lib/libbuffer.a
 LOAD ../lib/libbwio.a
 LOAD /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a
-OUTPUT(clocktest.elf elf32-littlearm)
+OUTPUT(startup.elf elf32-littlearm)
 
-.comment        0x0000000000000000       0x24
- .comment       0x0000000000000000       0x12 clocktest.o
- .comment       0x0000000000000012       0x12 ../lib/libbwio.a(bwio.o)
+.comment        0x0000000000000000       0x7e
+ .comment       0x0000000000000000       0x12 startup.o
+ .comment       0x0000000000000012       0x12 ../lib/libmycanvas.a(mycanvas.o)
+ .comment       0x0000000000000024       0x12 ../lib/libmyclock.a(myclock.o)
+ .comment       0x0000000000000036       0x12 ../lib/libcmd.a(cmd.o)
+ .comment       0x0000000000000048       0x12 ../lib/libmyio.a(myio.o)
+ .comment       0x000000000000005a       0x12 ../lib/libbuffer.a(buffer.o)
+ .comment       0x000000000000006c       0x12 ../lib/libbwio.a(bwio.o)
 
-.debug_line     0x0000000000000000      0x14f
+.debug_line     0x0000000000000000      0x1c4
  .debug_line    0x0000000000000000       0x86 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_udivsi3.o)
  .debug_line    0x0000000000000086       0x6f /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_umodsi3.o)
- .debug_line    0x00000000000000f5       0x5a /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_dvmd_tls.o)
+ .debug_line    0x00000000000000f5       0x75 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_modsi3.o)
+ .debug_line    0x000000000000016a       0x5a /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_dvmd_tls.o)
 
-.debug_info     0x0000000000000000      0x153
+.debug_info     0x0000000000000000      0x1c4
  .debug_info    0x0000000000000000       0x71 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_udivsi3.o)
  .debug_info    0x0000000000000071       0x71 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_umodsi3.o)
- .debug_info    0x00000000000000e2       0x71 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_dvmd_tls.o)
+ .debug_info    0x00000000000000e2       0x71 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_modsi3.o)
+ .debug_info    0x0000000000000153       0x71 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_dvmd_tls.o)
 
-.debug_abbrev   0x0000000000000000       0x3c
+.debug_abbrev   0x0000000000000000       0x50
  .debug_abbrev  0x0000000000000000       0x14 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_udivsi3.o)
  .debug_abbrev  0x0000000000000014       0x14 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_umodsi3.o)
- .debug_abbrev  0x0000000000000028       0x14 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_dvmd_tls.o)
+ .debug_abbrev  0x0000000000000028       0x14 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_modsi3.o)
+ .debug_abbrev  0x000000000000003c       0x14 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_dvmd_tls.o)
 
-.debug_aranges  0x0000000000000000       0x60
+.debug_aranges  0x0000000000000000       0x80
  .debug_aranges
                 0x0000000000000000       0x20 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_udivsi3.o)
  .debug_aranges
                 0x0000000000000020       0x20 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_umodsi3.o)
  .debug_aranges
-                0x0000000000000040       0x20 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_dvmd_tls.o)
+                0x0000000000000040       0x20 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_modsi3.o)
+ .debug_aranges
+                0x0000000000000060       0x20 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_dvmd_tls.o)
diff --git a/src/getc.c b/src/getc.c
index a595620..2429bcf 100644
--- a/src/getc.c
+++ b/src/getc.c
@@ -5,10 +5,11 @@ int main()
   bwsetfifo(COM2, OFF);
   bwsetspeed(COM2, 115200);
   int i = 0;
-  char display;
-  for(;i<10;i++){
-    display=bwgetc(COM2);
-    bwputc(COM2, display);
-    MOVE_RIGHT(1);
-  }
+  char d1;
+  char d2;
+  d1=bwgetc(COM2);
+  d2=bwgetc(COM2);
+  bwputx(COM2,d1);
+  bwputx(COM2,d2);
+  
 }
diff --git a/src/libsrc/Makefile b/src/libsrc/Makefile
index 83c4cc1..a6b4d32 100644
--- a/src/libsrc/Makefile
+++ b/src/libsrc/Makefile
@@ -17,6 +17,10 @@ ARFLAGS = rcs
 
 all: bwio.a
 
+
+buffer.s: buffer.c
+	$(XCC) -S $(CFLAGS) buffer.c
+
 bwio.s: bwio.c
 	$(XCC) -S $(CFLAGS) bwio.c
 
@@ -32,6 +36,9 @@ myclock.s: myclock.c
 myio.s: myio.c
 	$(XCC) -S $(CFLAGS) myio.c
 
+buffer.o: buffer.s
+	$(AS) $(ASFLAGS) -o buffer.o buffer.s
+
 bwio.o: bwio.s
 	$(AS) $(ASFLAGS) -o bwio.o bwio.s
 
@@ -47,6 +54,9 @@ myclock.o: myclock.s
 myio.o: myio.s
 	$(AS) $(ASFLAGS) -o myio.o myio.s
 
+buffer.a: buffer.o
+	$(AR) $(ARFLAGS) $@ buffer.o
+
 bwio.a: bwio.o
 	$(AR) $(ARFLAGS) $@ bwio.o
 
@@ -61,12 +71,13 @@ myclock.a: myclock.o
 myio.a: myio.o
 	$(AR) $(ARFLAGS) $@ myio.o
 
-install: bwio.a mycanvas.a myclock.a cmd.a myio.a
+install: bwio.a mycanvas.a myclock.a cmd.a myio.a buffer.a
 	mv bwio.a ../../lib/libbwio.a
 	mv cmd.a ../../lib/libcmd.a
 	mv mycanvas.a ../../lib/libmycanvas.a
 	mv myclock.a ../../lib/libmyclock.a
 	mv myio.a ../../lib/libmyio.a
+	mv buffer.a ../../lib/libbuffer.a
 
 clean:
 	-rm -f *.s *.o *.a *~ ../../lib/*.a
diff --git a/src/libsrc/buffer.c b/src/libsrc/buffer.c
new file mode 100644
index 0000000..7f1074a
--- /dev/null
+++ b/src/libsrc/buffer.c
@@ -0,0 +1,51 @@
+#include <buffer.h>
+
+int FeedBuffer(Buffer *Buf, char Char)
+{
+  if(Buf->Size == 0) return BUFF_NOTREADY;
+  if(Buf->Length == Buf->Size) return BUFF_FULL;
+  (Buf->Storage)[Buf->Current] = Char;
+  Buf->Current = (Buf->Current + 1) % (Buf->Size);
+  Buf->Length = Buf->Length + 1;
+  return 0;
+}
+
+int BufferFIFO(Buffer *Buf, char *Char)
+{
+  if(Buf->Size == 0) return  BUFF_NOTREADY;
+  if(Buf->Length == 0) return BUFF_EMPTY;
+  *Char = (Buf->Storage)[Buf->Start];
+  return 0;
+}
+
+int BufferPopStart(Buffer *Buf)
+{
+  if(Buf->Size == 0) return  BUFF_NOTREADY;
+  if(Buf->Length == 0) return BUFF_EMPTY;
+  Buf->Start = (Buf->Start +1) % Buf->Size;
+  Buf->Length = (Buf->Length) - 1;
+  return 0;
+}
+
+int BufferFILO(Buffer *Buf, char *Char)
+{
+  if(Buf->Size == 0) return  BUFF_NOTREADY;
+  if(Buf->Length == 0) return BUFF_EMPTY;
+  *Char = (Buf->Storage)[Buf->Current];
+  return 0;
+}
+
+int BufferPopLast(Buffer *Buf)
+{
+  if(Buf->Size == 0) return  BUFF_NOTREADY;
+  if(Buf->Length == 0) return BUFF_EMPTY;
+  Buf->Current = (Buf->Current - 1 + Buf->Size) % Buf->Size;
+  Buf->Length = (Buf->Length) - 1;
+  return 0;
+}
+
+void ClearBuffer(Buffer *Buf)
+{
+  Buf->Length = 0;
+  Buf->Current = Buf->Start;
+}
diff --git a/src/libsrc/cmd.c b/src/libsrc/cmd.c
index 2aa0f8d..69cbd0a 100644
--- a/src/libsrc/cmd.c
+++ b/src/libsrc/cmd.c
@@ -1,18 +1,31 @@
-#include <myio.h>
 #include <cmd.h>
 #include <mycanvas.h>
+#include <myio.h>
 
-int ListenCommand()
+int FeedCommand(Buffer* Buf)
 {
-  CURSOR_POS(20,1);
   char FirstChar;
-  if(mygetc(COM2, &FirstChar)){ 
-    switch(FirstChar){
-    case 'q':
-      return CMD_HALT;
-    default:
-      break;
-    }
-  } 
+  char SecondChar;
+
+  BufferFIFO(Buf,&FirstChar);
+  BufferPopStart(Buf);
+  BufferFIFO(Buf,&SecondChar);
+  BufferPopStart(Buf);
+  
+  switch(FirstChar){
+  case 'q':
+    ClearBuffer(Buf);
+    return CMD_HALT;
+  case: 't':
+    if(SecondChar == 'r');
+  case: 'r':
+    if(SecondChar == 'v');
+  case: 's':
+    if(SecondChar == 'w');
+  default:
+    break;
+  }
+  ClearBuffer(Buf);
   return CMD_NOINPUT;
+
 }
diff --git a/src/libsrc/mycanvas.c b/src/libsrc/mycanvas.c
index dda800d..9a43769 100644
--- a/src/libsrc/mycanvas.c
+++ b/src/libsrc/mycanvas.c
@@ -1,4 +1,5 @@
 #include <mycanvas.h>
+#include <myio.h>
 
 void DrawLine_H(const char Element, const int Length)
 {
@@ -18,15 +19,16 @@ void DrawLine_V(const char Element, const int Length)
   }
 }
 
-void DrawClock(Clock *MyClock){
+void DrawClock(Clock *MyClock,CursorPos* InCursor){
   if(MyClock->bChanged !=0){
     unsigned int Count = MyClock->ClockCount;
     unsigned int Tenth = Count % 10;
     unsigned int Seconds = (Count % 100 )/ 10;
     unsigned int Tens = (Count % 600) /100;
     unsigned int Minute = Count/600;
-    CURSOR_POS(10, 66);
+    CURSOR_POS(10, 60);
     bwprintf(COM2,"%d:%d%d:%d\n\r",Minute,Tens,Seconds,Tenth);
+    InCursor->bChanged = 1;
   }
 }
 
@@ -48,5 +50,26 @@ void DrawPanel()
   DrawLine_V('>', 3);
   CURSOR_POS(26,1);
   //DrawLine_H('#', 79);
+}
 
+int InteractiveInput(Buffer* BuffList[], CursorPos* InCursor){
+  char c;
+  int OutputResult = 0;
+  if(mygetc(COM2,&c) == 1){
+    if(InCursor->bChanged == 1){
+      CURSOR_POS(InCursor->x, InCursor->y);
+      InCursor->bChanged = 0;
+    }
+    PutToBuffer(c, BuffList[TMN_I_OFFSET]);
+    PutToBuffer(c, BuffList[TMN_O_OFFSET]);
+    OutputResult = OutPutFromBuffer(COM2, BuffList[TMN_O_OFFSET]);
+    InCursor->y =(OutputResult>=0)?  InCursor->y + OutputResult : InCursor->y;
+    if(c == 13){
+      InCursor->y = 1;
+      CLEARLINE;
+      return FeedCommand(BuffList[TMN_I_OFFSET]);
+    }
+    return 2;
+  }
 }
+
diff --git a/src/libsrc/myio.c b/src/libsrc/myio.c
index 17c293a..2b3e5e4 100644
--- a/src/libsrc/myio.c
+++ b/src/libsrc/myio.c
@@ -1,3 +1,5 @@
+#include <buffer.h>
+#include <bwio.h>
 #include <myio.h>
 #include <ts7200.h>
 
@@ -22,3 +24,51 @@ int mygetc(int Channel, char *Char){
     return 0;
   }
 }
+
+int myputc(int Channel, char Char) {
+  int *flags, *data;
+  switch( Channel ) {
+  case COM1:
+    flags = (int *)( UART1_BASE + UART_FLAG_OFFSET );
+    data = (int *)( UART1_BASE + UART_DATA_OFFSET );
+    break;
+  case COM2:
+    flags = (int *)( UART2_BASE + UART_FLAG_OFFSET );
+    data = (int *)( UART2_BASE + UART_DATA_OFFSET );
+    break;
+  default:
+    return -1;
+    break;
+  }
+  if(!( *flags & TXFF_MASK )){
+    *data = Char;
+    return 1;
+  }
+  return 0;
+}
+
+int PutToBuffer(char Char, Buffer* Buf)
+{
+  return(FeedBuffer(Buf, Char));
+}
+
+int OutPutFromBuffer(int Channel, Buffer* Buf) {
+  char C;
+  int bPrinted;
+  int StatusCode;
+  int Counter = 0;
+  int i = 0;
+  int len = Buf->Length;
+  for(;i<len;i++){
+    bPrinted = 0;
+
+    StatusCode = BufferFIFO(Buf,&C);
+    if(StatusCode == BUFF_EMPTY) return Counter;
+    if(StatusCode == BUFF_NOTREADY) return StatusCode;
+
+    bPrinted = myputc(Channel, C);
+    if(bPrinted >= 0) Counter += bPrinted;
+    if(bPrinted == 1) BufferPopStart(Buf);
+  }
+  if(bPrinted <= 0) return -1;
+}
diff --git a/src/startup.c b/src/startup.c
index 313ba42..b55408a 100644
--- a/src/startup.c
+++ b/src/startup.c
@@ -1,8 +1,10 @@
+#include <buffer.h>
 #include <bwio.h>
 #include <cmd.h>
 #include <error.h>
 #include <mycanvas.h>
 #include <myclock.h>
+#include <myio.h>
 
 int initialize(Clock* MyClock)
 {
@@ -13,21 +15,42 @@ int initialize(Clock* MyClock)
   return 0;
 }
 
-int runloop(Clock* MyClock)
+int runloop(Clock* MyClock, Buffer** BuffList, CursorPos *InputPos)
 {
   while(1){
     UpdateClock(MyClock);
-    DrawClock(MyClock);
-    if(ListenCommand() == CMD_HALT) break;
+    DrawClock(MyClock, InputPos);
+    if(InteractiveInput(BuffList, InputPos) == CMD_HALT) break;
   }
   return 0;
 }
 
 int main(){
   volatile Clock MyClock = {0,0,0};
-  unsigned int InitCode = initialize(&MyClock);
+  volatile char TrainInputStorage[DEFAULT_BUF_SIZE];
+  volatile char TermInputStorage[DEFAULT_BUF_SIZE];
+  volatile char TrainOutputStorage[DEFAULT_BUF_SIZE];
+  volatile char TermOutputStorage[DEFAULT_BUF_SIZE];
+
+  Buffer TrainInputBuf = {&TrainInputStorage, DEFAULT_BUF_SIZE,0,0,0};
+  Buffer TermInputBuf = {&TermInputStorage, DEFAULT_BUF_SIZE,0,0,0};
+  Buffer TrainOutputBuf = {&TrainOutputStorage, DEFAULT_BUF_SIZE,0,0,0};
+  Buffer TermOutputBuf = {&TermOutputStorage, DEFAULT_BUF_SIZE,0,0,0};
+
+  char TestStorage[4];
+  TestStorage[0] = 68;
+  TestStorage[1] = 69;
+  TestStorage[2] = 70;
+  TestStorage[3] = 71;
+  Buffer Test = {&TestStorage, 4, 4, 0, 3};
+  
+  Buffer *BuffList[4] = {&TrainInputBuf,&TermInputBuf,&TrainOutputBuf,&TermOutputBuf};  
+
+  CursorPos InputPos = {15,1,1};
+  int InitCode = initialize(&MyClock);
   if(InitCode) return InitCode;
   CLEAR_SCREEN;
   // DrawPanel();
-  return runloop(&MyClock);
+  return runloop(&MyClock, BuffList, &InputPos);
+  //return testloop(&Test);
 }
-- 
GitLab