diff --git a/include/buffer.h b/include/buffer.h
index 2099af948f7bfe258be5ad798819f61ad0c2dcc7..ec93d8181c32618f46bf871c1efdaba793127ba0 100644
--- a/include/buffer.h
+++ b/include/buffer.h
@@ -1,9 +1,10 @@
 #ifndef __BUFFER_H__
 #define __BUFFER_H__
 
-#define BUFF_FULL -1
-#define BUFF_EMPTY -2
-#define BUFF_NOTREADY -3
+#define BUFF_FULL -10
+#define BUFF_EMPTY -20
+#define BUFF_NOTREADY -30
+#define BUFF_CANTFIT -40
 
 #define TRN_I_OFFSET 0
 #define TMN_I_OFFSET 1
@@ -20,8 +21,15 @@ typedef struct
   int Current;
 } Buffer;
 
+char D2ASCII(int Num);
+
+int BufferReady(Buffer *Buf);
+
 int FeedBuffer(Buffer *Buf, char Char);
 // Fill Char with the char in Start
+
+int FeedBufferStr(Buffer *Buf, char* Str, int Len);
+
 int BufferFIFO(Buffer *Buf, char *Char);
 
 // Pop from Start
@@ -34,5 +42,19 @@ int BufferFILO(Buffer *Buf, char *Char);
 int BufferPopLast(Buffer* Buf);
 
 // Clear Buffer
-void ClearBuffer(Buffer* Buf);
+int ClearBuffer(Buffer* Buf);
+
+int BufferShrinkFIFO(Buffer* Buf, int Num);
+int BufferGet(Buffer *Buf, char *CharList, int ListSize, int GetSize);
+
+// get the number of char's till first 0, out put Buf->Length when no 0
+int BufferGetStrSize(Buffer *Buf);
+
+// must be used with BufferGetStrSize
+// get all char into CharList untill the first 0
+int BufferGetStr(Buffer *Buf, char* CharList);
+int BufferPopIfTerminate(Buffer *Buf);
+int BufferPopIfSpace(Buffer *Buf);
+int BufferGetNumber(Buffer *Buf);
+
 #endif
diff --git a/include/cmd.h b/include/cmd.h
index 7f802d5966c9adfda7dd8aad30192ce68a9a7565..817658d0afecaa9b383aa0a618656c827fbbe803 100644
--- a/include/cmd.h
+++ b/include/cmd.h
@@ -2,8 +2,10 @@
 #define __CMD_H__
 
 #include <buffer.h>
+#include <myclock.h>
 
 #define CMD_HALT 0
 #define CMD_NOINPUT 1
-int FeedCommand(Buffer* Buf);
+int FeedCommand(Buffer** BufferList);
+int SetTrainSpeed(Buffer *Out, int ID, int Speed);
 #endif
diff --git a/include/mycanvas.h b/include/mycanvas.h
index fa791e0b979b81c21e28cd587159e52bc62b020a..613c2eea62de88cd648892019993df088be3f1a1 100644
--- a/include/mycanvas.h
+++ b/include/mycanvas.h
@@ -9,6 +9,11 @@
  */
 
 #define ESC_CANVAS 27
+#define UP 65
+#define DOWN 66
+#define RIGHT 67
+#define LEFT 68
+
 #define CLEAR_SCREEN bwprintf(COM2, "%c[2J", ESC_CANVAS)
 #define CLEARLINE bwprintf(COM2, "%c[1K",ESC_CANVAS)
 
@@ -25,9 +30,15 @@ typedef struct
   int bChanged;
 } CursorPos;
 
+
+int ClearScreen(Buffer *Buf);
+int ClearLine(Buffer *Buf);
+int MoveCursor(Buffer *Buf,char Direction, int Num);
+int CursorPOS(Buffer *Buf, int x, int y);
+
 void DrawLine_H(const char Element, const int Length);
 void DrawLine_V(const char Element, const int Length);
 void DrawPanel();
-void DrawClock(Clock* MyClock, CursorPos* InCursor);
+void DrawClock(Buffer** BufferList, Clock* MyClock, CursorPos* InCursor);
 int InteractiveInput(Buffer* BufList[],CursorPos* InCursor);
 #endif
diff --git a/include/myclock.h b/include/myclock.h
index 35d3a9a14374833e6465aa7d6aea9550eefbf1fc..af937205fb8340bb01a9fcbc578ebb876b321a8f 100644
--- a/include/myclock.h
+++ b/include/myclock.h
@@ -2,11 +2,15 @@
 #define __MY_CLOCK_H__
 
 #define CLOCK_LOAD_VALUE 50800
+#define SLOW_LOAD_VALUE 200
+#define TIMER_LOAD_VALUE 508000;
 
 typedef struct
 {
   unsigned int ClockCount;
   unsigned int LastTimerValue;
+  //unsigned int LastClockValue;
+  //unsigned int* TimerValueRegister;
   char bChanged;
 } Clock;
 
@@ -15,4 +19,10 @@ typedef struct
 void InitClockCount(Clock* MyClock);
 // update the time count from start of the program
 void UpdateClock(Clock* MyClock);
+/*
+void InitQuickTimer();
+void InitSlowTimer(Clock* TimerClock);
+unsigned int GetQuick();
+unsigned int GetSlow(Clock *TimerClock);
+*/
 #endif
diff --git a/include/myio.h b/include/myio.h
index 53a56808ead27849c6039e005049c1fbdae8cd22..4fd3f242677dba7bcd9593becde6e0841dd7076e 100644
--- a/include/myio.h
+++ b/include/myio.h
@@ -6,8 +6,14 @@
 #define COM1 0
 #define COM2 1
 
+#define O_FAILED -11
+#define I_FAILED -21
+
+
 int mygetc(int Channel,char* Char);
 int myputc(int Channel,char Char);
 int PutToBuffer(char Char, Buffer* Buf);
+int PutStrToBuffer(char *CharList, Buffer* Buf, int Len);
 int OutPutFromBuffer(int Channel, Buffer* Buf);
+int OutPutStrFromBuffer(int Channel, Buffer* Buf);
 #endif
diff --git a/src/Makefile b/src/Makefile
index f0f02e7c88459fbca9622fc52734a6371f667a18..5af1fd858e8b3cc6b58ead65612ade835b0d7bd8 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -49,6 +49,26 @@ getc.o: getc.s
 getc.elf: getc.o
 	$(LD) $(LDFLAGS) -o $@ getc.o -lbwio -lgcc
 
+
+stop.s: stop.c
+	$(XCC) -S $(CFLAGS) stop.c
+
+stop.o: stop.s
+	$(AS) $(ASFLAGS) -o stop.o stop.s
+
+stop.elf: stop.o
+	$(LD) $(LDFLAGS) -o $@ stop.o -lbwio -lgcc
+
+tr.s: tr.c
+	$(XCC) -S $(CFLAGS) tr.c
+
+tr.o: tr.s
+	$(AS) $(ASFLAGS) -o tr.o tr.s
+
+tr.elf: tr.o
+	$(LD) $(LDFLAGS) -o $@ tr.o -lmyio -lbuffer -lbwio -lgcc
+
+
 clean:
 	-rm -f *.elf *.s *.o startup.map *.a *~
 
diff --git a/src/first.map b/src/first.map
index 632af885905f5c0ee356706191013cdd81cdf02f..a0b84a2323b2f19fd271b780859491cc19ac7946 100644
--- a/src/first.map
+++ b/src/first.map
@@ -1,15 +1,17 @@
 Archive member included because of file (symbol)
 
 ../lib/libmycanvas.a(mycanvas.o)
-                              startup.o (DrawClock)
+                              startup.o (ClearScreen)
 ../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/libbuffer.a(buffer.o)  ../lib/libmycanvas.a(mycanvas.o) (BufferReady)
 ../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)
+                              ../lib/libmycanvas.a(mycanvas.o) (__udivsi3)
+/u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_divsi3.o)
+                              ../lib/libmycanvas.a(mycanvas.o) (__divsi3)
 /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)
@@ -37,70 +39,92 @@ bss             0x0000000000000000        0x0
  *(.bss)
                 0x0000000000000000                _BssEnd = .
 
-text            0x0000000000000000     0x1ff0
+text            0x0000000000000000     0x3634
  *(.text)
- .text          0x0000000000000000      0x2f4 startup.o
-                0x0000000000000104                main
+ .text          0x0000000000000000      0x41c startup.o
+                0x000000000000012c                InitializeTrainAndTrack
+                0x000000000000022c                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
+                0x00000000000000cc                runloop
+ .text          0x000000000000041c      0xc38 ../lib/libmycanvas.a(mycanvas.o)
+                0x00000000000009ac                DrawLine_H
+                0x00000000000005a8                ClearLine
+                0x0000000000000d44                DrawPanel
+                0x0000000000000a08                DrawLine_V
+                0x00000000000004f4                ClearScreen
+                0x0000000000000484                GetPowerD
+                0x0000000000000aac                DrawClock
+                0x000000000000041c                Exponent
+                0x000000000000065c                MoveCursor
+                0x0000000000000790                CursorPOS
+                0x0000000000000ec4                InteractiveInput
+ .text          0x0000000000001054       0xfc ../lib/libmyclock.a(myclock.o)
+                0x0000000000001054                InitClockCount
+                0x00000000000010c8                UpdateClock
+ .text          0x0000000000001150      0x458 ../lib/libcmd.a(cmd.o)
+                0x0000000000001150                FeedCommand
+                0x00000000000014b4                SetTrainSpeed
+ .text          0x00000000000015a8      0x4f4 ../lib/libmyio.a(myio.o)
+                0x000000000000185c                OutPutFromBuffer
+                0x0000000000001738                PutToBuffer
+                0x00000000000015a8                mygetc
+                0x0000000000001774                PutStrToBuffer
+                0x0000000000001964                OutPutStrFromBuffer
+                0x000000000000166c                myputc
+ .text          0x0000000000001a9c      0xaf8 ../lib/libbuffer.a(buffer.o)
+                0x0000000000001b44                BufferReady
+                0x0000000000001a9c                ASCII2NUM
+                0x000000000000200c                BufferGet
+                0x00000000000020fc                BufferGetStrSize
+                0x0000000000001db0                BufferFILO
+                0x0000000000001d04                BufferPopStart
+                0x0000000000001f58                BufferShrinkFIFO
+                0x0000000000001e38                BufferPopLast
+                0x0000000000001ba0                FeedBuffer
+                0x0000000000001c78                BufferFIFO
+                0x0000000000002380                BufferPopIfSpace
+                0x00000000000021e8                BufferGetStr
+                0x0000000000001ef0                ClearBuffer
+                0x000000000000243c                BufferGetNumber
+                0x00000000000022e4                BufferPopIfTerminate
+ .text          0x0000000000002594      0xc54 ../lib/libbwio.a(bwio.o)
+                0x000000000000290c                bwputr
+                0x0000000000002e78                bwi2a
+                0x0000000000002594                bwsetfifo
+                0x0000000000002768                bwputc
+                0x0000000000002bc8                bwa2d
+                0x000000000000265c                bwsetspeed
+                0x000000000000282c                c2x
+                0x0000000000002c70                bwa2i
+                0x0000000000002b10                bwgetc
+                0x0000000000002d34                bwui2a
+                0x0000000000002edc                bwformat
+                0x0000000000002a08                bwputw
+                0x00000000000031b0                bwprintf
+                0x000000000000288c                bwputx
+                0x000000000000298c                bwputstr
+ .text          0x00000000000031e8      0x110 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_udivsi3.o)
+                0x00000000000031e8                __udivsi3
+                0x00000000000032e0                __aeabi_uidivmod
+ .text          0x00000000000032f8      0x140 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_divsi3.o)
+                0x00000000000032f8                __divsi3
+                0x0000000000003420                __aeabi_idivmod
+ .text          0x0000000000003438       0xcc /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_umodsi3.o)
+                0x0000000000003438                __umodsi3
+ .text          0x0000000000003504       0xe4 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_modsi3.o)
+                0x0000000000003504                __modsi3
+ .text          0x00000000000035e8        0x4 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_dvmd_tls.o)
+                0x00000000000035e8                __aeabi_ldiv0
+                0x00000000000035e8                __div0
+                0x00000000000035e8                __aeabi_idiv0
  *(.got)
- .got           0x0000000000001f88        0x8 startup.o
+ .got           0x00000000000035ec        0x8 startup.o
  *(.got.plt)
- .got.plt       0x0000000000001f90        0xc startup.o
-                0x0000000000001f90                _GLOBAL_OFFSET_TABLE_
+ .got.plt       0x00000000000035f4        0xc startup.o
+                0x00000000000035f4                _GLOBAL_OFFSET_TABLE_
  *(.rodata)
- .rodata        0x0000000000001f9c       0x20 startup.o
- .rodata        0x0000000000001fbc       0x34 ../lib/libmycanvas.a(mycanvas.o)
+ .rodata        0x0000000000003600       0x18 startup.o
+ .rodata        0x0000000000003618       0x1c ../lib/libmycanvas.a(mycanvas.o)
  *(.glue_7)
  *(.glue_7t)
 
@@ -124,30 +148,35 @@ OUTPUT(startup.elf elf32-littlearm)
  .comment       0x000000000000005a       0x12 ../lib/libbuffer.a(buffer.o)
  .comment       0x000000000000006c       0x12 ../lib/libbwio.a(bwio.o)
 
-.debug_line     0x0000000000000000      0x1c4
+.debug_line     0x0000000000000000      0x256
  .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       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_line    0x0000000000000086       0x92 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_divsi3.o)
+ .debug_line    0x0000000000000118       0x6f /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_umodsi3.o)
+ .debug_line    0x0000000000000187       0x75 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_modsi3.o)
+ .debug_line    0x00000000000001fc       0x5a /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_dvmd_tls.o)
 
-.debug_info     0x0000000000000000      0x1c4
+.debug_info     0x0000000000000000      0x235
  .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(_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_info    0x0000000000000071       0x71 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_divsi3.o)
+ .debug_info    0x00000000000000e2       0x71 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_umodsi3.o)
+ .debug_info    0x0000000000000153       0x71 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_modsi3.o)
+ .debug_info    0x00000000000001c4       0x71 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_dvmd_tls.o)
 
-.debug_abbrev   0x0000000000000000       0x50
+.debug_abbrev   0x0000000000000000       0x64
  .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(_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_abbrev  0x0000000000000014       0x14 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_divsi3.o)
+ .debug_abbrev  0x0000000000000028       0x14 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_umodsi3.o)
+ .debug_abbrev  0x000000000000003c       0x14 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_modsi3.o)
+ .debug_abbrev  0x0000000000000050       0x14 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_dvmd_tls.o)
 
-.debug_aranges  0x0000000000000000       0x80
+.debug_aranges  0x0000000000000000       0xa0
  .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)
+                0x0000000000000020       0x20 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_divsi3.o)
  .debug_aranges
-                0x0000000000000040       0x20 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_modsi3.o)
+                0x0000000000000040       0x20 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_umodsi3.o)
  .debug_aranges
-                0x0000000000000060       0x20 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_dvmd_tls.o)
+                0x0000000000000060       0x20 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_modsi3.o)
+ .debug_aranges
+                0x0000000000000080       0x20 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_dvmd_tls.o)
diff --git a/src/libsrc/buffer.c b/src/libsrc/buffer.c
index 7f1074a7c2a3338b3d512611522ce3e9dec7277a..39994c2637faef3d7dfbd24c4fb63326ead1057c 100644
--- a/src/libsrc/buffer.c
+++ b/src/libsrc/buffer.c
@@ -1,30 +1,47 @@
+#include <bwio.h>
 #include <buffer.h>
 
+int ASCII2NUM(char ch){
+  if(ch >= '0' && ch<= '9') return ch-'0';
+  if(ch >= 'a' && ch<= 'f') return ch-'a'+10;
+  if(ch>= 'A' && ch<= 'F') return ch-'A'+10;
+  return -1;
+}
+
+int BufferReady(Buffer *Buf)
+{
+  int ready =((Buf != 0) && (Buf->Size > 0))? 1:0;
+  return ready;
+}
+
 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;
+  if(BufferReady(Buf)){
+    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;
+  }else return BUFF_NOTREADY;
 }
 
 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;
+  if(BufferReady(Buf)){
+    if(Buf->Length == 0) return BUFF_EMPTY;
+    *Char = (Buf->Storage)[Buf->Start];
+    return 0;
+  }else return BUFF_NOTREADY;
 }
 
 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;
+  if(BufferReady(Buf)){
+    if(Buf->Length == 0) return BUFF_EMPTY;
+    Buf->Start = (Buf->Start +1) % Buf->Size;
+    Buf->Length = (Buf->Length) - 1;
+    return 0;
+  }else return BUFF_NOTREADY;
 }
 
 int BufferFILO(Buffer *Buf, char *Char)
@@ -37,15 +54,123 @@ int BufferFILO(Buffer *Buf, char *Char)
 
 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;
+  if(BufferReady(Buf)){
+    if(Buf->Length == 0) return BUFF_EMPTY;
+    Buf->Current = (Buf->Current - 1 + Buf->Size) % Buf->Size;
+    Buf->Length = (Buf->Length) - 1;
+    return 0;
+  }else return BUFF_NOTREADY;
+}
+
+int ClearBuffer(Buffer *Buf)
+{
+  if(BufferReady(Buf)){
+    Buf->Length = 0;
+    Buf->Current = Buf->Start;
+    return 0;
+  }else return BUFF_NOTREADY;
+}
+
+int BufferShrinkFIFO(Buffer *Buf, int Num)
+{
+  if(BufferReady(Buf)){
+    int ActualShrink = (Num > Buf->Length)? (Buf->Length): Num;
+    Buf->Length = Buf->Length - ActualShrink;
+    Buf->Start = (Buf->Start + ActualShrink) % Buf->Size;
+    return 0;
+  }else return BUFF_NOTREADY;
+}
+
+int BufferGet(Buffer *Buf, char *CharList, int ListSize, int GetSize)
+{
+  if(BufferReady(Buf)){
+    if(ListSize < GetSize) return -1;
+    int ActualGet = (GetSize > Buf->Length)? (Buf->Length): GetSize;
+    int i = 0;
+    int Start = Buf->Start;
+    for(;i<ActualGet; i++){
+      CharList[i] = (Buf->Storage)[Start + i];
+    }
+    return 0;
+  }else return BUFF_NOTREADY;
+}
+
+int BufferGetStrSize(Buffer *Buf){
+  if(BufferReady(Buf)){
+    int StrSize = 0;
+    int i = 0;
+    int Len = Buf->Length;
+    int Size = Buf->Size;
+    int Start = Buf->Start;
+    //bwprintf(1,"Entered GetStrSize,Len: %d\n\r",Buf->Length);
+    for(;i<Len;i++){
+      if(((Buf->Storage)[(Start+i)% Size]) == 0){
+	//bwprintf(1, "i: %d, char %d \n\r",i,(Buf->Storage)[(Start+i)%Size]);
+	return StrSize;
+      }
+      StrSize += 1;
+      //bwprintf(1, "i: %d, char: %d\n\r",i,(Buf->Storage)[(Start+i)%Size]);
+    }
+    return Len;
+  }else return BUFF_NOTREADY;
+}
+
+int BufferGetStr(Buffer *Buf, char* CharList){
+  if(BufferReady(Buf)){
+    int Len = Buf->Length;
+    int Size = Buf->Size;
+    int i = 0;
+    char c;
+    int Start = Buf->Start;
+    for(;i<Len; i++){
+      c = (Buf->Storage)[(Start+i)%Size];
+      if(c == 0) return 0;
+      CharList[i] = c;
+    }
+    return 0;
+  }else return BUFF_NOTREADY;
+}
+
+int BufferPopIfTerminate(Buffer *Buf)
+{
+  if(BufferReady(Buf)){
+    if(Buf->Length == 0) return BUFF_EMPTY;
+    if((Buf->Storage)[Buf->Start] == 0) return BufferPopStart(Buf);
+    return 0;
+  }else return BUFF_NOTREADY;
+}
+
+int BufferPopIfSpace(Buffer *Buf)
+{
+  if(BufferReady(Buf)){
+    if(Buf->Length == 0) return BUFF_EMPTY;
+    if((Buf->Storage)[Buf->Start] == ' ' || (Buf->Storage)[Buf->Start] == 13){
+      return BufferPopStart(Buf);
+    }
+    return 0;
+  }else return BUFF_NOTREADY;
 }
 
-void ClearBuffer(Buffer *Buf)
+int BufferGetNumber(Buffer *Buf)
 {
-  Buf->Length = 0;
-  Buf->Current = Buf->Start;
+  if(BufferReady(Buf)){
+    if(Buf->Length == 0) return BUFF_EMPTY;
+    char c;
+    int code = BufferFIFO(Buf,&c);
+    if(code != 0) return code;
+    BufferPopStart(Buf);
+    int num = 0;
+    int bNumExists = 0;
+    while(c >= '0' && c<= '9'){
+      bNumExists = 1;
+      num *= 10;
+      num += ASCII2NUM(c);
+      // get next number
+      code = BufferFIFO(Buf, &c);
+      if(code != 0) return code;
+      BufferPopStart(Buf);
+    }
+    if(bNumExists == 0) return -1;
+    return num;
+  }else return BUFF_NOTREADY;
 }
diff --git a/src/libsrc/bwio.c b/src/libsrc/bwio.c
index 5bccaf100bdcf03a19e966727a75964c5d4b1e1f..dcb131845013e29fe7cea02ef4c33d21b9e1c5f0 100644
--- a/src/libsrc/bwio.c
+++ b/src/libsrc/bwio.c
@@ -56,7 +56,7 @@ int bwsetspeed( int channel, int speed ) {
 		return 0;
 	case 2400:
 		*high = 0x0;
-		*low = 0x90;
+		*low = 0xbf;
 		return 0;
 	default:
 		return -1;
diff --git a/src/libsrc/cmd.c b/src/libsrc/cmd.c
index 69cbd0a152995aaefdc74b0059cc952f381c04c6..60417fbe846a530ce71d1e526c7eef9e9d9afaab 100644
--- a/src/libsrc/cmd.c
+++ b/src/libsrc/cmd.c
@@ -1,31 +1,90 @@
+#include <bwio.h>
 #include <cmd.h>
 #include <mycanvas.h>
+#include <myclock.h>
 #include <myio.h>
 
-int FeedCommand(Buffer* Buf)
+int FeedCommand(Buffer** BufferList)
 {
   char FirstChar;
   char SecondChar;
+  
+  Buffer* Buf = BufferList[TMN_I_OFFSET];
+  Buffer* TrainOBuf = BufferList[TRN_O_OFFSET];
 
   BufferFIFO(Buf,&FirstChar);
   BufferPopStart(Buf);
   BufferFIFO(Buf,&SecondChar);
   BufferPopStart(Buf);
+  //bwprintf(COM2, 'FeedCommand First %c\n\r', FirstChar);
   
   switch(FirstChar){
   case 'q':
     ClearBuffer(Buf);
     return CMD_HALT;
-  case: 't':
-    if(SecondChar == 'r');
-  case: 'r':
-    if(SecondChar == 'v');
-  case: 's':
-    if(SecondChar == 'w');
+    break;
+  case 't':
+    if(SecondChar == 'r'){
+      BufferPopIfSpace(Buf);
+      int TrainID = BufferGetNumber(Buf);
+      if(TrainID < 0) return TrainID;
+      BufferPopIfSpace(Buf);
+      int TrainSpeed = BufferGetNumber(Buf);
+      if(TrainSpeed < 0) return TrainSpeed;
+      BufferPopIfSpace(Buf);
+      //TrainSpeedList[TrainID-1] = TrainSpeed;
+      return SetTrainSpeed(TrainOBuf, TrainID, TrainSpeed);
+    }
+  case 'r':
+    if(SecondChar == 'v'){
+      BufferPopIfSpace(Buf);
+      int TrainID = BufferGetNumber(Buf);
+      if(TrainID < 0) return TrainID;
+      //Slow->LastClockValue = GetSlow(Slow);
+      //*RVFlag = TrainID;
+      return SetTrainSpeed(TrainOBuf, TrainID, 15);
+    }
+  case 's':
+    if(SecondChar == 'w'){
+      BufferPopIfSpace(Buf);
+      int SwitchID = BufferGetNumber(Buf);
+      if(SwitchID < 0) return SwitchID;
+      BufferPopIfSpace(Buf);
+      BufferFIFO(Buf,&FirstChar);
+      if(FirstChar == 'S' || FirstChar == 's'){
+	SetTrainSpeed(TrainOBuf, SwitchID, 33);
+      }else if(FirstChar == 'C' || FirstChar == 'c'){
+	SetTrainSpeed(TrainOBuf, SwitchID, 34);
+      }else return CMD_NOINPUT;
+    }else break;
+  case'K':
+  case 'k':
+    // emergency
+    FeedBuffer(TrainOBuf, 97);
+    FeedBuffer(TrainOBuf, 0);
+    return OutPutStrFromBuffer(COM1, TrainOBuf);
+  case 'G':
+  case 'g':
+    // go
+    FeedBuffer(TrainOBuf, 96);
+    FeedBuffer(TrainOBuf, 0);
+    return OutPutStrFromBuffer(COM1, TrainOBuf);
   default:
     break;
   }
   ClearBuffer(Buf);
   return CMD_NOINPUT;
+}
 
+int SetTrainSpeed(Buffer *Out, int ID, int Speed)
+{
+  if(BufferReady(Out)){
+    int code = FeedBuffer(Out, (char)Speed);
+    if(code != 0) return code;
+    code = FeedBuffer(Out,(char) ID);
+    if(code != 0) return code;
+    code = FeedBuffer(Out,0);
+    if(code != 0) return code;
+    return OutPutStrFromBuffer(COM1, Out);
+  }else return BUFF_NOTREADY;
 }
diff --git a/src/libsrc/mycanvas.c b/src/libsrc/mycanvas.c
index 9a43769b852b9705e4f61254f7bf80d77e288e92..b720628174c378fdbbccad5f9233ec5e7af944f3 100644
--- a/src/libsrc/mycanvas.c
+++ b/src/libsrc/mycanvas.c
@@ -1,6 +1,106 @@
+#include <buffer.h>
+#include <cmd.h>
 #include <mycanvas.h>
 #include <myio.h>
 
+int Exponent(int Num, int Power){
+  int i = 0;
+  int Return = 1;
+  for(;i<Power;i++){
+    Return = Return * Num;
+  }
+  return Return;
+}
+
+int GetPowerD(int Num){
+  int Base = 1;
+  int Power = 0;
+  for(;Base <= Num;Base*=10){
+    Power += 1;
+  }
+  return Power-1;
+}
+
+int ClearScreen(Buffer *Buf){
+  if(BufferReady(Buf)){
+    char Sequence[5];
+    Sequence[0] = ESC_CANVAS;
+    Sequence[1] = '[';
+    Sequence[2] = '2';
+    Sequence[3] = 'J';
+    Sequence[4] = 0;
+    int ReturnStatus = PutStrToBuffer(Sequence, Buf, 5);
+    if(ReturnStatus == 0){
+      return OutPutStrFromBuffer(COM2, Buf);
+      //return OutPutFromBuffer(COM2, Buf);
+    }else return ReturnStatus;
+  }else return BUFF_NOTREADY;
+}
+
+int ClearLine(Buffer *Buf){
+  if(BufferReady(Buf)){
+    char Sequence[5];
+    Sequence[0] = ESC_CANVAS;
+    Sequence[1] = '[';
+    Sequence[2] = '1';
+    Sequence[3] = 'K';
+    Sequence[4] = 0;
+    int ReturnStatus = PutStrToBuffer(Sequence, Buf, 5);
+    if(ReturnStatus == 0){
+      return OutPutStrFromBuffer(COM2, Buf);
+    }else return ReturnStatus;
+  }else return BUFF_NOTREADY;
+}
+
+int MoveCursor(Buffer* Buf, char Direction, int Num){
+  if(BufferReady(Buf)){
+    int Power = GetPowerD(Num);
+    int i = 0;
+    char c;
+    if((4+Power) > (Buf->Size - Buf->Length)) return BUFF_CANTFIT;
+    PutToBuffer(ESC_CANVAS,Buf);
+    PutToBuffer('[',Buf);
+    for(;i<Power;i++){
+      c = '0'+ (Num / Exponent(10, Power - i));
+      PutToBuffer(c, Buf);
+    }
+    return PutToBuffer(Direction,Buf);
+    //PutToBuffer(0,Buf);
+    //OutPutStrFromBuffer(COM2, Buf);
+  }else return BUFF_NOTREADY;
+}
+
+int CursorPOS(Buffer *Buf, int x, int y){
+  if(BufferReady(Buf)){
+    int xcpy = x;
+    int ycpy = y;
+    int xPower = GetPowerD(x);
+    int yPower = GetPowerD(y);
+    if((5+xPower+yPower+2) > (Buf->Size - Buf->Length)) return BUFF_CANTFIT;
+    PutToBuffer(ESC_CANVAS, Buf);
+    PutToBuffer('[',Buf);
+    int i = 0;
+    int tens= 0;
+    char c;
+    for(;i<=xPower;i++){
+      tens = Exponent(10,xPower-i);
+      c = '0'+(xcpy / tens);
+      xcpy -= tens;
+      PutToBuffer(c, Buf);
+    }
+    PutToBuffer(';',Buf);
+    for(i = 0; i<=yPower; i++){
+      tens = Exponent(10,yPower-i);
+      c = '0' +(ycpy/tens);
+      ycpy -= tens;
+      PutToBuffer(c,Buf);
+    }
+    PutToBuffer('H',Buf);
+    PutToBuffer(0,Buf);
+    return OutPutStrFromBuffer(COM2, Buf);
+  }else return BUFF_NOTREADY;
+}
+
 void DrawLine_H(const char Element, const int Length)
 {
   int i = 0;
@@ -19,15 +119,43 @@ void DrawLine_V(const char Element, const int Length)
   }
 }
 
-void DrawClock(Clock *MyClock,CursorPos* InCursor){
+void DrawClock(Buffer** BufferList, Clock *MyClock,CursorPos* InCursor){
   if(MyClock->bChanged !=0){
+    Buffer* OBuf = BufferList[TMN_O_OFFSET];
+    CursorPOS(OBuf,1, 10);
+    
     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, 60);
-    bwprintf(COM2,"%d:%d%d:%d\n\r",Minute,Tens,Seconds,Tenth);
+
+    int i = 0;
+    int Power = GetPowerD(Minute);
+    char c;
+    if((8+Power) > (OBuf->Size - OBuf->Length)) return;
+
+    
+    unsigned int Mcpy = Minute;
+    int tens;
+    for(; i<=Power; i++){
+      tens = Exponent(10,Power-i);
+      c = '0' +(Mcpy/tens);
+      Mcpy -= tens;
+      PutToBuffer(c,OBuf);
+    }
+    
+    char List[8];
+    List[7] = 0;
+    List[0] = List[3] = ':';
+    List[6] = '\r';
+    List[5] = '\n';
+    List[1] = Tens + '0';
+    List[2] = Seconds +'0';
+    List[4] = Tenth + '0';
+    PutStrToBuffer(List,OBuf,8);
+    OutPutStrFromBuffer(COM2, OBuf);
+    // bwprintf(COM2,"%d:%d%d:%d\n\r",Minute,Tens,Seconds,Tenth);
     InCursor->bChanged = 1;
   }
 }
@@ -53,23 +181,32 @@ void DrawPanel()
 }
 
 int InteractiveInput(Buffer* BuffList[], CursorPos* InCursor){
+  // int * Slow = ClockList[1];
   char c;
   int OutputResult = 0;
+  int commandresult ;
+  Buffer* Buf = BuffList[TMN_O_OFFSET];
   if(mygetc(COM2,&c) == 1){
+    PutToBuffer(c, BuffList[TMN_I_OFFSET]);
     if(InCursor->bChanged == 1){
-      CURSOR_POS(InCursor->x, InCursor->y);
+      CursorPOS(Buf,15, InCursor->y);
+      //OutPutFromBuffer(COM2,Buf);
       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]);
+    if(c==13){
+      ClearLine(BuffList[TMN_O_OFFSET]);
+      PutToBuffer(c, Buf);
+      OutputResult = OutPutFromBuffer(COM2, Buf);
+      InCursor->y = 2;
+      // OutPutFromBuffer(COM2, BuffList[TMN_O_OFFSET]);
+      commandresult = FeedCommand(BuffList);
+      //bwprintf(COM2,"feed command result:%d\n\r",commandresult);
+      return commandresult;
     }
+    PutToBuffer(c, Buf);
+    OutputResult = OutPutFromBuffer(COM2, Buf);
+    InCursor->y =(OutputResult>=0)?  InCursor->y + OutputResult : InCursor->y;
     return 2;
-  }
+  }else return I_FAILED;
 }
 
diff --git a/src/libsrc/myclock.c b/src/libsrc/myclock.c
index 47bdf582ddaa45c133f61b4262ed0dc8c22297b7..300ed32835d174772bd0127f5d2270610f04fe9b 100644
--- a/src/libsrc/myclock.c
+++ b/src/libsrc/myclock.c
@@ -12,12 +12,13 @@ void InitClockCount(Clock *MyClock)
   *Clock3LoadRegister = CLOCK_LOAD_VALUE;
   // enable clock
   *Clock3ControlRegister = ENABLE_MASK | ClockConfig;
+  //MyClock->TimerValueRegister = (unsigned int *)(TIMER3_BASE + VAL_OFFSET);
 }
 
 void UpdateClock(Clock *MyClock)
 {
-  unsigned int* TimerValueRegister = (unsigned int *) (TIMER3_BASE + VAL_OFFSET);
-  unsigned int CurrentTimerValue = *TimerValueRegister;
+  unsigned int *ValRegister = *((unsigned int *)(TIMER3_BASE+VAL_OFFSET)) ;
+  unsigned int CurrentTimerValue = *ValRegister;
 
   if(CurrentTimerValue > MyClock->LastTimerValue){
     MyClock->ClockCount = MyClock->ClockCount + 1;
@@ -25,6 +26,39 @@ void UpdateClock(Clock *MyClock)
   } else {
     MyClock->bChanged = 0;
   }
-  
   MyClock->LastTimerValue = CurrentTimerValue;
 }
+/*
+
+void InitQuickTimer()
+{
+  //TimerClock->ClockCount = 0;
+  //TimerClock->LastTimerValue = QUICK_LOAD_VALUE;
+  unsigned int* Clock1LoadRegister = (unsigned int *)(TIMER1_BASE + LDR_OFFSET);
+  unsigned int* Clock1ControlRegister = (unsigned int *)(TIMER1_BASE + CRTL_OFFSET);
+  unsigned int TimerConfig = MODE_MASK | CLKSEL_MASK;
+  *Clock1LoadRegister = TIMER_LOAD_VALUE;
+  *Clock1ControlRegister = ENABLE_MASK | TimerConfig;
+}
+
+void InitSlowTimer(Clock *TimerClock){
+  TimerClock->ClockCount = 0;
+  TimerClock->LastTimerValue = SLOW_LOAD_VALUE;
+  unsigned int* Clock1LoadRegister = (unsigned int *)(TIMER2_BASE + LDR_OFFSET);
+  unsigned int* Clock1ControlRegister = (unsigned int *)(TIMER2_BASE + CRTL_OFFSET);
+  unsigned int TimerConfig = MODE_MASK;
+  *Clock1LoadRegister = SLOW_LOAD_VALUE;
+  *Clock1ControlRegister = ENABLE_MASK | TimerConfig;
+  TimerClock->TimerValueRegister = (unsigned int *)(TIMER2_BASE + VAL_OFFSET);
+}
+
+unsigned int GetQuick(){
+  unsigned int* ClockValueRegister = (unsigned int *)(TIMER1_BASE + VAL_OFFSET);
+  unsigned int t = *ClockValueRegister;
+  return t;
+}
+
+unsigned int GetSlow(Clock *TimerClock){
+  return TimerClock->ClockCount;
+}
+*/
diff --git a/src/libsrc/myio.c b/src/libsrc/myio.c
index 2b3e5e447662f1c699cbcb99fd0af80df6e81986..ad75e1e91be5a4d5d5415e6b71898df510c7326a 100644
--- a/src/libsrc/myio.c
+++ b/src/libsrc/myio.c
@@ -52,14 +52,26 @@ int PutToBuffer(char Char, Buffer* Buf)
   return(FeedBuffer(Buf, Char));
 }
 
+int PutStrToBuffer(char *CharList,Buffer* Buf, int Len)
+{
+  if(CharList == 0) return -1;
+  if(Buf == 0 || Buf->Size == 0) return BUFF_NOTREADY;
+  if(Len > (Buf->Size - Buf->Length)) return BUFF_CANTFIT;
+  int i;
+  for(i = 0; i<Len; i++){
+    PutToBuffer(CharList[i], Buf);
+  }
+  return 0;
+}
+
 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++){
+  //int i = 0;
+  for(;Counter<len;){
     bPrinted = 0;
 
     StatusCode = BufferFIFO(Buf,&C);
@@ -70,5 +82,30 @@ int OutPutFromBuffer(int Channel, Buffer* Buf) {
     if(bPrinted >= 0) Counter += bPrinted;
     if(bPrinted == 1) BufferPopStart(Buf);
   }
-  if(bPrinted <= 0) return -1;
+  if(bPrinted <= 0) return O_FAILED;
+  return Counter;
+}
+
+int OutPutStrFromBuffer(int Channel, Buffer* Buf){
+  int StrSize = BufferGetStrSize(Buf);
+  if(StrSize < 0) return StrSize;
+  char List[256];
+  BufferGetStr(Buf, List);
+  char C;
+  int Counter = 0;
+  int i = 0;
+  int code;
+  int loopcount = 0;
+  for(;Counter<StrSize;code = 0){
+    loopcount ++;
+    C = List[i];
+    code =  myputc(Channel,C);
+    Counter += code;
+    if(code == 1) i++;
+  }
+  //bwprintf(COM2,"loopcount:%d,strsize:%d\n\r",loopcount,StrSize);
+  BufferShrinkFIFO(Buf, StrSize);
+  BufferPopIfTerminate(Buf);
+  if(Counter == StrSize) return Counter;
+  return O_FAILED;
 }
diff --git a/src/startup.c b/src/startup.c
index b55408a237c8c265790f82d2d64f1d19cde48e31..dce36d297b1079ad311743e3e3b78409dbaa0593 100644
--- a/src/startup.c
+++ b/src/startup.c
@@ -8,49 +8,121 @@
 
 int initialize(Clock* MyClock)
 {
+  if(bwsetfifo(COM2, OFF)) return ERR_INIT_IO;
   if(bwsetfifo(COM2, OFF)) return ERR_INIT_IO;
   if(bwsetspeed(COM1, 2400)) return ERR_INIT_IO;
   if(bwsetspeed(COM2, 115200)) return ERR_INIT_IO;
+  //bwprintf(COM2,"BWIO init done\n\r");
   InitClockCount(MyClock);
+  //bwprintf(COM2,"timer 3 done\n\r");
+  //InitSlowTimer(ClockList[1]);
+  //bwprintf(COM2,"timer 2 done\n\r");
+  //InitQuickTimer();
+  //bwprintf(COM2,"timer1 done\n\r");
   return 0;
 }
 
-int runloop(Clock* MyClock, Buffer** BuffList, CursorPos *InputPos)
+int runloop(Buffer** BuffList, CursorPos *InputPos,Clock* MyClock)
 {
+  int IOCode;
+  //Clock *MyClock = ClockList[0];
   while(1){
-    UpdateClock(MyClock);
-    DrawClock(MyClock, InputPos);
-    if(InteractiveInput(BuffList, InputPos) == CMD_HALT) break;
+    //UpdateClock(MyClock);
+    //DrawClock(BuffList, MyClock, InputPos);    
+    //bwprintf(COM2, 'ClockDraw');
+    IOCode = InteractiveInput(BuffList, InputPos);
+    //bwprintf(COM2, "IOCode:%d\n\r",IOCode);
+    if(IOCode == CMD_HALT){
+      ClearScreen(BuffList[TMN_O_OFFSET]);
+      return 0;
+    }
+    //UpdateClock(ClockList[1]);
+    //if(IOCode == CMD_HALT){
+    //ClearScreen(BuffList[3]);
+      //return 0;
+    //}else if(IOCode != 2)return IOCode;
+    /*
+    if((*RVFlag > 0 && (GetSlow(ClockList[1]) - ClockList[1]->LastClockValue)>=5)){
+      ClockList[1]->LastClockValue = 0;
+      SetTrainSpeed(BuffList[TRN_O_OFFSET], *RVFlag, TrainSpeedList[*RVFlag]);
+    }
+    */
   }
   return 0;
 }
 
+void InitializeTrainAndTrack(Buffer* OBuf)
+{
+  int i = 1;
+  FeedBuffer(OBuf, 96);
+  FeedBuffer(OBuf, 0);
+  OutPutFromBuffer(COM1, OBuf);
+  
+  for(;i<=18;i++){
+    SetTrainSpeed(OBuf, i, 33);
+  }
+  for(i=153;i<=156;i++){
+    SetTrainSpeed(OBuf, i, 33);
+  }
+  
+  for(i=1;i<=80;i++){
+    SetTrainSpeed(OBuf, i, 0);
+  }
+
+  
+  FeedBuffer(OBuf, 97);
+  FeedBuffer(OBuf, 0);
+  OutPutFromBuffer(COM1, OBuf);
+}
+
 int main(){
+  //volatile int RVFlag = 0;
+  
   volatile Clock MyClock = {0,0,0};
+  //volatile Clock Slow = {0,0,0,0,0};
+  // Clock* ClockList[2];
+  //ClockList[0] = &MyClock;
+  //ClockList[1] = &Slow;
+  
+  
+  int InitCode = initialize(&MyClock);
+  if(InitCode) return InitCode;
+  
   volatile char TrainInputStorage[DEFAULT_BUF_SIZE];
   volatile char TermInputStorage[DEFAULT_BUF_SIZE];
   volatile char TrainOutputStorage[DEFAULT_BUF_SIZE];
   volatile char TermOutputStorage[DEFAULT_BUF_SIZE];
+  //int TrainSpeedList[80];
+  
 
   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};
 
+  
+
+  InitializeTrainAndTrack(&TrainOutputBuf);
+  
   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;
+  
+  
+  CursorPos InputPos = {15,2,1};
+  // CLEAR_SCREEN;
+  ClearScreen(BuffList[3]);
+  //CursorPOS(BuffList[3],15,13);
   // DrawPanel();
-  return runloop(&MyClock, BuffList, &InputPos);
+  return runloop(BuffList, &InputPos, &MyClock);
+  
   //return testloop(&Test);
 }
diff --git a/src/stop.c b/src/stop.c
new file mode 100644
index 0000000000000000000000000000000000000000..29a8aac508bf017161405f6a07ffb9f8985dbb74
--- /dev/null
+++ b/src/stop.c
@@ -0,0 +1,17 @@
+#include <bwio.h>
+
+int main(){
+  bwsetfifo(COM1, ON);
+  //bwsetfifo(COM2, OFF);
+  bwsetspeed(COM1, 2400);
+  //bwsetspeed(COM2, 115200);
+  char B1 = 97;
+  int i = 0;
+  while(i<3){
+    bwputc(COM1,B1);
+    bwputc(COM1,B1);
+    i++;
+  }
+  //bwputx(COM2,B1);
+  return 0;
+}
diff --git a/src/tr.c b/src/tr.c
new file mode 100644
index 0000000000000000000000000000000000000000..21e7aaf3f99e18d5284427d4f4e6864fb1460665
--- /dev/null
+++ b/src/tr.c
@@ -0,0 +1,19 @@
+#include <bwio.h>
+#include <buffer.h>
+#include <myio.h>
+
+int main(){
+  bwsetfifo(COM1, OFF);
+  bwsetfifo(COM2, OFF);
+  bwsetspeed(COM1, 2400);
+  bwsetspeed(COM2, 115200);
+  char list[3];
+  list[0] = 4;
+  list[1] = 24;
+  list[2] = 0;
+  Buffer B = {&list,3,3,0,2};
+  int i = 0;
+  OutPutStrFromBuffer(COM1, &B);
+  //bwputx(COM2,B1);
+  return 0;
+}
diff --git a/src/tricks.c b/src/tricks.c
new file mode 100644
index 0000000000000000000000000000000000000000..8baea0a3a4f99803ccba8874c2e230a8c8f4277f
--- /dev/null
+++ b/src/tricks.c
@@ -0,0 +1,3 @@
+#define m1(p) #p
+#define m2(p) m1(p)
+//m2(__LINE__)