diff --git a/include/error.h b/include/error.h
new file mode 100644
index 0000000000000000000000000000000000000000..d8719f0ff70a4fde4435dc357b8d26daf1f85179
--- /dev/null
+++ b/include/error.h
@@ -0,0 +1 @@
+#define ERR_INIT_IO 0xDEAD0000
diff --git a/include/mycanvas.h b/include/mycanvas.h
new file mode 100644
index 0000000000000000000000000000000000000000..3fd60cfdc7915c00859f91b3a9dad0d1bc384c49
--- /dev/null
+++ b/include/mycanvas.h
@@ -0,0 +1,6 @@
+#ifndef __CANVAS_H__
+#define __CANVAS_H__
+
+void DrawClock(int* ClockCount);
+
+#endif
diff --git a/include/mycanvas.h~ b/include/mycanvas.h~
new file mode 100644
index 0000000000000000000000000000000000000000..956253e0fdf362447af970826105bb637980a5f3
--- /dev/null
+++ b/include/mycanvas.h~
@@ -0,0 +1,6 @@
+#ifndef __CANVAS_H__
+#define __CANVAS_H__
+
+void DrawClock();
+
+#endif
diff --git a/include/myclock.h b/include/myclock.h
new file mode 100644
index 0000000000000000000000000000000000000000..ce312c32e62daacc65279ef1f361f7f38219ee93
--- /dev/null
+++ b/include/myclock.h
@@ -0,0 +1,10 @@
+#ifndef __MY_CLOCK_H__
+#define __MY_CLOCK_H__
+
+#define CLOCK_LOAD_VALUE 50800
+
+// initialize the global time to 0
+void InitClockCount(int *ClockCount, int* LastTimerValue);
+// update the time count from start of the program
+void UpdateClock(int* ClockCount, int* LastTimerValue);
+#endif
diff --git a/include/myclock.h~ b/include/myclock.h~
new file mode 100644
index 0000000000000000000000000000000000000000..81ba61ed1efa71f391b4e7bef3ee31b4098061fa
--- /dev/null
+++ b/include/myclock.h~
@@ -0,0 +1,11 @@
+#ifndef __MY_CLOCK_H__
+#define __MY_CLOCK_H__
+
+#define CLOCK_LOAD_VALUE 50800
+
+volatile static unsigned int ClockCount;
+// initialize the global time to 0
+void InitClockCount(int *ClockCount, int* LastTimerValue);
+// update the time count from start of the program
+void UpdateClock(int* ClockCount, int* LastTimerValue);
+#endif
diff --git a/lib/libbwio.a b/lib/libbwio.a
new file mode 100644
index 0000000000000000000000000000000000000000..f0b7e8795a5224c162a70a76c357db8aaa79d034
Binary files /dev/null and b/lib/libbwio.a differ
diff --git a/lib/libmycanvas.a b/lib/libmycanvas.a
new file mode 100644
index 0000000000000000000000000000000000000000..ec1d78d3816baec0a50398511b01153e4f879a1f
Binary files /dev/null and b/lib/libmycanvas.a differ
diff --git a/lib/libmyclock.a b/lib/libmyclock.a
new file mode 100644
index 0000000000000000000000000000000000000000..2edf7b1e64c442c5825dae9e8b2187218b0e836a
Binary files /dev/null and b/lib/libmyclock.a differ
diff --git a/src/Makefile b/src/Makefile
index bc6e65b8257e4c8fa73770a151bb4071c03059d1..f20846a487da456fcbedbf93508f32b5fa835b41 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -19,17 +19,17 @@ 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:  first.elf
+all: startup.elf #first.elf
 
-first.s: first.c
-	$(XCC) -S $(CFLAGS) first.c
+startup.s: startup.c
+	$(XCC) -S $(CFLAGS) startup.c
  
-first.o: first.s
-	$(AS) $(ASFLAGS) -o first.o first.s
+startup.o: startup.s
+	$(AS) $(ASFLAGS) -o startup.o startup.s
 
-first.elf: first.o
-	$(LD) $(LDFLAGS) -o $@ first.o -lbwio -lgcc
+startup.elf: startup.o
+	$(LD) $(LDFLAGS) -o $@ startup.o -lmycanvas -lmyclock -lbwio -lgcc
 
 clean:
-	-rm -f first.elf *.s *.o first.map *.a ../lib/*.a
- 
+	-rm -f first.elf *.s *.o startup.map *.a *~
+
diff --git a/src/first.map b/src/first.map
new file mode 100644
index 0000000000000000000000000000000000000000..3ea6cb0ac14eec8c3247e9c9e0bca4d5f0a2c6d5
--- /dev/null
+++ b/src/first.map
@@ -0,0 +1,117 @@
+Archive member included because of file (symbol)
+
+../lib/libmycanvas.a(mycanvas.o)
+                              startup.o (DrawClock)
+../lib/libmyclock.a(myclock.o)
+                              startup.o (InitClockCount)
+../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(_dvmd_tls.o)
+                              /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_udivsi3.o) (__div0)
+
+Memory Configuration
+
+Name             Origin             Length             Attributes
+ram              0x0000000000000000 0x0000000002000000
+rom              0x0000000060000000 0x0000000000800000
+*default*        0x0000000000000000 0xffffffffffffffff
+
+Linker script and memory map
+
+
+data            0x0000000000000000        0x0
+                0x0000000000000000                _DataStart = .
+ *(.data)
+                0x0000000000000000                _DataEnd = .
+
+bss             0x0000000000000000        0x0
+                0x0000000000000000                _BssStart = .
+ *(.bss)
+                0x0000000000000000                _BssEnd = .
+
+text            0x0000000000000000     0x133c
+ *(.text)
+ .text          0x0000000000000000      0x17c startup.o
+                0x000000000000010c                main
+                0x0000000000000000                initialize
+                0x00000000000000b0                runloop
+ .text          0x000000000000017c      0x174 ../lib/libmycanvas.a(mycanvas.o)
+                0x000000000000017c                DrawClock
+ .text          0x00000000000002f0      0x140 ../lib/libmyclock.a(myclock.o)
+                0x00000000000002f0                InitClockCount
+                0x0000000000000394                UpdateClock
+ .text          0x0000000000000430      0xc54 ../lib/libbwio.a(bwio.o)
+                0x00000000000007a8                bwputr
+                0x0000000000000d14                bwi2a
+                0x0000000000000430                bwsetfifo
+                0x0000000000000604                bwputc
+                0x0000000000000a64                bwa2d
+                0x00000000000004f8                bwsetspeed
+                0x00000000000006c8                c2x
+                0x0000000000000b0c                bwa2i
+                0x00000000000009ac                bwgetc
+                0x0000000000000bd0                bwui2a
+                0x0000000000000d78                bwformat
+                0x00000000000008a4                bwputw
+                0x000000000000104c                bwprintf
+                0x0000000000000728                bwputx
+                0x0000000000000828                bwputstr
+ .text          0x0000000000001084      0x110 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_udivsi3.o)
+                0x0000000000001084                __udivsi3
+                0x000000000000117c                __aeabi_uidivmod
+ .text          0x0000000000001194       0xcc /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_umodsi3.o)
+                0x0000000000001194                __umodsi3
+ .text          0x0000000000001260        0x4 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_dvmd_tls.o)
+                0x0000000000001260                __aeabi_ldiv0
+                0x0000000000001260                __div0
+                0x0000000000001260                __aeabi_idiv0
+ *(.got)
+ *(.got.plt)
+ .got.plt       0x0000000000001264        0xc startup.o
+                0x0000000000001264                _GLOBAL_OFFSET_TABLE_
+ *(.rodata)
+ .rodata        0x0000000000001270       0x10 startup.o
+ .rodata        0x0000000000001280       0x58 ../lib/libmycanvas.a(mycanvas.o)
+ .rodata        0x00000000000012d8       0x64 ../lib/libmyclock.a(myclock.o)
+ *(.glue_7)
+ *(.glue_7t)
+
+.rel.dyn
+LOAD startup.o
+LOAD ../lib/libmycanvas.a
+LOAD ../lib/libmyclock.a
+LOAD ../lib/libbwio.a
+LOAD /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a
+OUTPUT(startup.elf elf32-littlearm)
+
+.comment        0x0000000000000000       0x48
+ .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/libbwio.a(bwio.o)
+
+.debug_line     0x0000000000000000      0x14f
+ .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_info     0x0000000000000000      0x153
+ .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_abbrev   0x0000000000000000       0x3c
+ .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_aranges  0x0000000000000000       0x60
+ .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)
diff --git a/src/libsrc/Makefile b/src/libsrc/Makefile
index d3710380fcfea7b1cddbab0f6c3ce0698edd4396..a932d94b058242f772d7453b11383fa563e9c274 100644
--- a/src/libsrc/Makefile
+++ b/src/libsrc/Makefile
@@ -16,20 +16,40 @@ ASFLAGS	= -mcpu=arm920t -mapcs-32
 
 ARFLAGS = rcs
 
-all:  bwio.a
- 
+all:  bwio.a 
+
 bwio.s: bwio.c
 	$(XCC) -S $(CFLAGS) bwio.c
 
+mycanvas.s: mycanvas.c
+	$(XCC) -S $(CFLAGS) mycanvas.c
+
+myclock.s: myclock.c
+	$(XCC) -S $(CFLAGS) myclock.c
+
+
 bwio.o: bwio.s
 	$(AS) $(ASFLAGS) -o bwio.o bwio.s
 
+mycanvas.o: mycanvas.s
+	$(AS) $(ASFLAGS) -o mycanvas.o mycanvas.s
+
+myclock.o: myclock.s
+	$(AS) $(ASFLAGS) -o myclock.o myclock.s
+
 bwio.a: bwio.o
 	$(AR) $(ARFLAGS) $@ bwio.o
 
-install: bwio.a
-	 mv bwio.a ../../lib/libbwio.a
+mycanvas.a: mycanvas.o
+	$(AR) $(ARFLAGS) $@ mycanvas.o
+
+myclock.a: myclock.o
+	$(AR) $(ARFLAGS) $@ myclock.o
+
+install: bwio.a mycanvas.a myclock.a
+	mv bwio.a ../../lib/libbwio.a
+	mv mycanvas.a ../../lib/libmycanvas.a
+	mv myclock.a ../../lib/libmyclock.a
 
 clean:
-	-rm -f *.s *.o *.a
- 
+	-rm -f *.s *.o *.a *~ ../../lib/*.a
diff --git a/src/libsrc/mycanvas.c b/src/libsrc/mycanvas.c
new file mode 100644
index 0000000000000000000000000000000000000000..1f92bd4abd4dcb18b61518cfd0b506bb362e206f
--- /dev/null
+++ b/src/libsrc/mycanvas.c
@@ -0,0 +1,14 @@
+#include <bwio.h>
+#include <mycanvas.h>
+#include <myclock.h>
+
+void DrawClock(int* ClockCount)
+{
+  bwprintf(COM2,"DrawClock, ClockCount %d\n\r", *ClockCount);
+  unsigned int TenthSecond = (*ClockCount) % 10;
+  bwprintf(COM2,"DrawClock, Tenth %d\n\r", TenthSecond);
+  unsigned int Second = ((*ClockCount - TenthSecond) % 600)/10;
+  bwprintf(COM2,"DrawClock, Second %d\n\r", Second);
+  unsigned int Minute = (*ClockCount)/600;
+  bwprintf(COM2,"%d:%d:%d\n\r",Minute,Second,TenthSecond);
+}
diff --git a/src/libsrc/myclock.c b/src/libsrc/myclock.c
new file mode 100644
index 0000000000000000000000000000000000000000..b76cdeb842fcf7f1d656c222d5d83c3a85eebcd6
--- /dev/null
+++ b/src/libsrc/myclock.c
@@ -0,0 +1,29 @@
+#include <bwio.h>
+#include <myclock.h>
+#include <ts7200.h>
+
+
+void InitClockCount(int* ClockCount, int* LastTimerValue)
+{
+  *ClockCount = 0;
+  *LastTimerValue = CLOCK_LOAD_VALUE;
+  int* Clock3LoadRegister = (int *) TIMER3_BASE;
+  int* Clock3ControlRegister = (int *) TIMER3_BASE + CRTL_OFFSET;
+  // int ClearMode = MODE_MASK | CLKSEL_MASK;
+  // clear clock
+  // *Clock3ControlRegister = ClearMode;
+  // set interval
+  *Clock3LoadRegister = CLOCK_LOAD_VALUE;
+  // enable clock
+  *Clock3ControlRegister = ENABLE_MASK;
+  bwprintf(COM2,"InitClock, ClockCount %d, LastTimerValue: %d\n\r",*ClockCount, *LastTimerValue);
+}
+
+void UpdateClock(int* ClockCount, int* LastTimerValue)
+{
+  int* TimerValueRegister = (int *) TIMER3_BASE + VAL_OFFSET;
+  int CurrentTimerValue = *TimerValueRegister;
+  bwprintf(COM2, "UpdateClock, LastTimerVlaue: %d, ClockCount:%d\n\r",*LastTimerValue,*ClockCount);
+  if(CurrentTimerValue >= *LastTimerValue) ClockCount++;
+  *LastTimerValue = CurrentTimerValue;
+}
diff --git a/src/startup.c b/src/startup.c
new file mode 100644
index 0000000000000000000000000000000000000000..aa4220682bc908c1a2cbbcbc73abe0d37448fa28
--- /dev/null
+++ b/src/startup.c
@@ -0,0 +1,30 @@
+#include <bwio.h>
+#include <error.h>
+#include <mycanvas.h>
+#include <myclock.h>
+
+int initialize(int* ClockCount, int* LastTimerValue)
+{
+  if(bwsetfifo(COM2, OFF)) return ERR_INIT_IO;
+  if(bwsetspeed(COM1, 2400)) return ERR_INIT_IO;
+  if(bwsetspeed(COM2, 115200)) return ERR_INIT_IO;
+  InitClockCount(ClockCount, LastTimerValue);
+  return 0;
+}
+
+int runloop(int* ClockCount, int* LastTimerValue)
+{
+  while(1){
+    UpdateClock(ClockCount, LastTimerValue);
+    bwprintf(COM2, "ClockCount %d\n\r", *ClockCount);
+    DrawClock(ClockCount);
+  }
+  return 0;
+}
+
+int main(){
+  unsigned int ClockCount, LastTimerValue;
+  unsigned int InitCode = initialize(&ClockCount, &LastTimerValue);
+  if(InitCode) return InitCode;
+  return runloop(&ClockCount, &LastTimerValue);
+}
diff --git a/src/upload b/src/upload
new file mode 100755
index 0000000000000000000000000000000000000000..5ff7c25dc8a83eaafad3d6e0a2bafe7544ffde19
--- /dev/null
+++ b/src/upload
@@ -0,0 +1,3 @@
+#! /bin/bash
+
+mv $1 /u/cs452/tftp/ARM/b26feng/