Initial revision
diff --git a/contiki-cpc/contiki-cpc/arch/contiki_labels.s b/contiki-cpc/contiki-cpc/arch/contiki_labels.s
new file mode 100644
index 0000000..8192104
--- /dev/null
+++ b/contiki-cpc/contiki-cpc/arch/contiki_labels.s
@@ -0,0 +1,346 @@
+__jpbc == 0x0107
+_kbhit == 0x0109
+_cgetc == 0x0115
+_calc_free_ram == 0x011B
+_get_ram_start == 0x0183
+_get_ram_end == 0x0187
+ram_start == 0x018B
+ram_end == 0x018D
+__sdcc_heap_init == 0x018F
+__sdcc_heap_init_start == 0x018F
+__sdcc_heap_init_end == 0x021B
+_malloc == 0x021B
+_malloc_start == 0x021B
+_free == 0x0366
+_free_start == 0x0366
+_malloc_end == 0x0366
+_free_end == 0x03CE
+__clock_init == 0x03CE
+event_routine == 0x03DC
+__clock_val == 0x03E6
+event_block == 0x03E8
+_loader_arch_load == 0x03F1
+_loader_arch_load_start == 0x03F1
+_loader_arch_load_end == 0x0455
+_loader_arch_load_dsc == 0x0455
+_loader_arch_load_dsc_start == 0x0455
+_loader_arch_load_dsc_end == 0x04A7
+_loader_arch_free == 0x04A7
+_loader_arch_free_start == 0x04A7
+_loader_arch_free_end == 0x04BF
+_loader_arch_free_dsc == 0x04BF
+_loader_arch_free_dsc_start == 0x04BF
+_loader_arch_free_dsc_end == 0x04D7
+_get_file_length == 0x04D7
+_load_file == 0x04FB
+_relocate == 0x0519
+_cfs_cpc_init == 0x05B8
+_cfs_cpc_init_start == 0x05B8
+_cfs_cpc_init_end == 0x05DB
+_cfs_find_service == 0x08B2
+_cfs_find_service_start == 0x08B2
+_cfs_find_service_end == 0x08CE
+__readdir == 0x08E8
+fetch_directory == 0x0901
+_program_handler_add == 0x091D
+_program_handler_add_start == 0x091D
+_program_handler_add_end == 0x0977
+_program_handler_init == 0x0A59
+_program_handler_init_start == 0x0A59
+_program_handler_init_end == 0x0AB0
+_pnarg_init == 0x0AB8
+_pnarg_init_start == 0x0AB8
+_pnarg_init_end == 0x0ACB
+_program_handler_load == 0x0B62
+_program_handler_load_start == 0x0B62
+_program_handler_load_end == 0x0BA9
+_program_handler_screensaver == 0x0BB7
+_program_handler_screensaver_sta == 0x0BB7
+_program_handler_screensaver_end == 0x0BE6
+_ctk_restore == 0x109A
+_ctk_restore_start == 0x109A
+_ctk_init_start == 0x10BF
+_ctk_restore_end == 0x10BF
+_ctk_init == 0x10BF
+_ctk_init_end == 0x11F2
+_ctk_mode_set == 0x11FA
+_ctk_mode_set_start == 0x11FA
+_ctk_mode_get == 0x120F
+_ctk_mode_get_start == 0x120F
+_ctk_mode_set_end == 0x120F
+_ctk_mode_get_end == 0x1217
+_ctk_icon_add == 0x1217
+_ctk_icon_add_start == 0x1217
+_ctk_dialog_open == 0x1243
+_ctk_icon_add_end == 0x1243
+_ctk_dialog_open_start == 0x1243
+_ctk_dialog_open_end == 0x126A
+_ctk_dialog_close == 0x126A
+_ctk_dialog_close_start == 0x126A
+_ctk_window_open == 0x1283
+_ctk_window_open_start == 0x1283
+_ctk_dialog_close_end == 0x1283
+_ctk_window_close == 0x139C
+_ctk_window_close_start == 0x139C
+_ctk_window_open_end == 0x139C
+_ctk_window_close_end == 0x14CB
+_ctk_window_clear_start == 0x163B
+_ctk_window_clear == 0x163B
+_ctk_menu_add_start == 0x1695
+_ctk_window_clear_end == 0x1695
+_ctk_menu_add == 0x1695
+_ctk_menu_add_end == 0x1707
+_ctk_menu_remove == 0x1707
+_ctk_menu_remove_start == 0x1707
+_ctk_menu_remove_end == 0x178B
+_ctk_desktop_redraw == 0x18E0
+_ctk_desktop_redraw_start == 0x18E0
+_ctk_window_redraw_start == 0x192F
+_ctk_desktop_redraw_end == 0x192F
+_ctk_window_redraw == 0x192F
+_ctk_window_redraw_end == 0x19AC
+_ctk_window_new == 0x1B5F
+_ctk_window_new_start == 0x1B5F
+_ctk_window_new_end == 0x1B93
+_ctk_dialog_new == 0x1B93
+_ctk_dialog_new_start == 0x1B93
+_ctk_menu_new == 0x1BB9
+_ctk_menu_new_start == 0x1BB9
+_ctk_dialog_new_end == 0x1BB9
+_ctk_menuitem_add == 0x1C1B
+_ctk_menu_new_end == 0x1C1B
+_ctk_menuitem_add_start == 0x1C1B
+_ctk_menuitem_add_end == 0x1C9E
+_ctk_widget_redraw == 0x1DCD
+_ctk_widget_redraw_start == 0x1DCD
+_ctk_widget_add == 0x1DF7
+_ctk_widget_add_start == 0x1DF7
+_ctk_widget_redraw_end == 0x1DF7
+_ctk_desktop_width_start == 0x1EA6
+_ctk_widget_add_end == 0x1EA6
+_ctk_desktop_width == 0x1EA6
+_ctk_desktop_width_end == 0x1EB4
+_ctk_desktop_height == 0x1EB4
+_ctk_desktop_height_start == 0x1EB4
+_ctk_desktop_height_end == 0x1EC2
+_ctk_draw_init == 0x2EFD
+_ctk_draw_init_start == 0x2EFD
+_ctk_draw_clear == 0x2F46
+_ctk_draw_init_end == 0x2F46
+_ctk_draw_clear_start == 0x2F46
+_ctk_draw_clear_window == 0x2F79
+_ctk_draw_clear_window_start == 0x2F79
+_ctk_draw_clear_end == 0x2F79
+_ctk_draw_clear_window_end == 0x2FBA
+_ctk_draw_window == 0x2FBA
+_ctk_draw_window_start == 0x2FBA
+_ctk_draw_dialog_start == 0x2FFB
+_ctk_draw_window_end == 0x2FFB
+_ctk_draw_dialog == 0x2FFB
+_ctk_draw_widget == 0x302B
+_ctk_draw_dialog_end == 0x302B
+_ctk_draw_widget_start == 0x302B
+_ctk_draw_menus_start == 0x306C
+_ctk_draw_widget_end == 0x306C
+_ctk_draw_menus == 0x306C
+_ctk_draw_menus_end == 0x309C
+_ctk_draw_width == 0x309C
+_ctk_draw_width_start == 0x309C
+_ctk_draw_width_end == 0x30BE
+_ctk_draw_height == 0x30BE
+_ctk_draw_height_start == 0x30BE
+_ctk_mouse_xtoc == 0x30E0
+_ctk_mouse_xtoc_start == 0x30E0
+_ctk_draw_height_end == 0x30E0
+_ctk_mouse_ytoc == 0x3115
+_ctk_mouse_ytoc_start == 0x3115
+_ctk_mouse_xtoc_end == 0x3115
+_ctk_draw_quit == 0x314A
+_ctk_mouse_ytoc_end == 0x314A
+_ctk_draw_quit_start == 0x314A
+_ctk_draw_quit_end == 0x3168
+_ek_service_start == 0x3173
+_ek_service_start_start == 0x3173
+_ek_service_find_start == 0x31B2
+_ek_service_start_end == 0x31B2
+_ek_service_find == 0x31B2
+_ek_service_state_start == 0x31DF
+_ek_service_find_end == 0x31DF
+_ek_service_state == 0x31DF
+_ek_service_reset == 0x3229
+_ek_service_reset_start == 0x3229
+_ek_service_state_end == 0x3229
+_ek_service_reset_end == 0x323F
+_ek_alloc_event == 0x323F
+_ek_alloc_event_start == 0x323F
+_ek_alloc_event_end == 0x324A
+_ek_start_start == 0x3369
+_ek_start == 0x3369
+_ek_exit == 0x33F8
+_ek_start_end == 0x33F8
+_ek_exit_start == 0x33F8
+_ek_process == 0x352B
+_ek_process_start == 0x352B
+_ek_exit_end == 0x352B
+_ek_init == 0x3558
+_ek_init_start == 0x3558
+_ek_process_end == 0x3558
+_ek_process_event == 0x35AC
+_ek_init_end == 0x35AC
+_ek_process_event_start == 0x35AC
+_ek_process_poll == 0x3743
+_ek_process_event_end == 0x3743
+_ek_process_poll_start == 0x3743
+_ek_run == 0x378B
+_ek_run_start == 0x378B
+_ek_process_poll_end == 0x378B
+_ek_post == 0x37AD
+_ek_post_start == 0x37AD
+_ek_run_end == 0x37AD
+_ek_post_synch == 0x3828
+_ek_post_synch_start == 0x3828
+_ek_post_end == 0x3828
+_ek_post_synch_end == 0x3887
+_ek_find == 0x3887
+_ek_find_start == 0x3887
+_ek_find_end == 0x38F2
+_ek_replace == 0x38F2
+_ek_replace_start == 0x38F2
+_ek_replace_end == 0x394A
+_ek_procstate == 0x394A
+_ek_procstate_start == 0x394A
+_ek_procstate_end == 0x397F
+_arg_init == 0x397F
+_arg_init_start == 0x397F
+_arg_init_end == 0x3986
+_arg_alloc == 0x3986
+_arg_alloc_start == 0x3986
+_arg_alloc_end == 0x39A4
+_arg_free == 0x39A4
+_arg_free_start == 0x39A4
+_arg_free_end == 0x39C5
+_list_init == 0x39C5
+_list_init_start == 0x39C5
+_list_init_end == 0x39E1
+_list_head == 0x39E1
+_list_head_start == 0x39E1
+_list_copy_start == 0x39FD
+_list_head_end == 0x39FD
+_list_copy == 0x39FD
+_list_copy_end == 0x3A22
+_list_tail == 0x3A22
+_list_tail_start == 0x3A22
+_list_add == 0x3A54
+_list_add_start == 0x3A54
+_list_tail_end == 0x3A54
+_list_push_start == 0x3A95
+_list_add_end == 0x3A95
+_list_push == 0x3A95
+_list_push_end == 0x3AC0
+_list_chop == 0x3AC0
+_list_chop_start == 0x3AC0
+_list_pop == 0x3B46
+_list_pop_start == 0x3B46
+_list_chop_end == 0x3B46
+_list_pop_end == 0x3B71
+_timer_set == 0x3B71
+_timer_set_start == 0x3B71
+_timer_set_end == 0x3B9D
+_timer_reset == 0x3B9D
+_timer_reset_start == 0x3B9D
+_timer_expired == 0x3BBA
+_timer_reset_end == 0x3BBA
+_timer_expired_start == 0x3BBA
+_timer_expired_end == 0x3C04
+_directory_dsc == 0x3C04
+_directory_icon == 0x3C5D
+_configedit_dsc == 0x3C90
+_configedit_icon == 0x3CE9
+_processes_dsc == 0x3D2F
+_processes_icon == 0x3D88
+_uip_fw_forward_start == 0x3DC2
+_uip_fw_forward == 0x3DC2
+_uip_fw_forward_end == 0x3DC5
+_uip_fw_periodic == 0x3DC5
+_uip_fw_periodic_start == 0x3DC5
+_uip_fw_periodic_end == 0x3DC6
+_main_start == 0x3DEF
+_main_end == 0x3E48
+_reset == 0x3E68
+_reset_start == 0x3E68
+_reset_end == 0x3E69
+_clock_time_start == 0x3E6E
+_clock_time == 0x3E6E
+_ctk_arch_isprint == 0x3E72
+_clock_time_end == 0x3E72
+_ctk_arch_isprint_start == 0x3E72
+_ctk_arch_isprint_end == 0x3E8D
+_strcpy == 0x3E8D
+_strcpy_start == 0x3E8D
+_strcpy_end == 0x3EB2
+__divschar_rrx_s == 0x3EB2
+__divschar_rrx_hds == 0x3EB9
+__modschar_rrx_s == 0x3EC0
+__modschar_rrx_hds == 0x3EC7
+__divsint_rrx_s == 0x3ECE
+__divsint_rrx_hds == 0x3EDA
+__modsint_rrx_s == 0x3EE2
+__modsint_rrx_hds == 0x3EEE
+__divuchar_rrx_s == 0x3EF6
+__divuchar_rrx_hds == 0x3EFD
+__moduchar_rrx_s == 0x3F04
+__moduchar_rrx_hds == 0x3F0B
+__divuint_rrx_s == 0x3F12
+__divuint_rrx_hds == 0x3F1E
+__moduint_rrx_s == 0x3F26
+__moduint_rrx_hds == 0x3F32
+.mod8 == 0x3F3A
+.div8 == 0x3F3A
+.mod16 == 0x3F42
+.div16 == 0x3F42
+.modu8 == 0x3F7F
+.divu8 == 0x3F7F
+.modu16 == 0x3F82
+.divu16 == 0x3F82
+_strncmp == 0x3FB3
+_strncmp_start == 0x3FB3
+_strncmp_end == 0x4040
+_isprint == 0x4040
+_isprint_start == 0x4040
+_isprint_end == 0x4062
+_memset == 0x4062
+_memset_start == 0x4062
+_memset_end == 0x40AA
+__mulschar_rrx_s == 0x40AA
+__mulschar_rrx_hds == 0x40B1
+__muluchar_rrx_s == 0x40BD
+__mulint_rrx_s == 0x40CA
+__mulint_rrx_hds == 0x40D6
+__muluchar_rrx_hds == 0x40D6
+_strncpy == 0x40EF
+_strncpy_start == 0x40EF
+_strncpy_end == 0x415E
+_strlen_start == 0x415E
+_strlen == 0x415E
+_strlen_end == 0x417E
+_ctk_signal_keypress == 0x439D
+_ctk_signal_widget_activate == 0x439E
+_ctk_signal_button_activate == 0x439F
+_ctk_signal_widget_select == 0x43A0
+_ctk_signal_button_hover == 0x43A1
+_ctk_signal_hyperlink_activate == 0x43A2
+_ctk_signal_hyperlink_hover == 0x43A3
+_ctk_signal_menu_activate == 0x43A4
+_ctk_signal_window_close == 0x43A5
+_ctk_signal_pointer_move == 0x43A6
+_ctk_signal_pointer_button == 0x43A7
+_ctk_screensaver_timeout == 0x43AA
+_ctk_draw_windowborder_width == 0x43BC
+_ctk_draw_windowborder_height == 0x43BD
+_ctk_draw_windowtitle_height == 0x43BE
+_ek_procs == 0x43C2
+_ek_proclist == 0x43C4
+_ek_current == 0x4404
+_ek_event_quit == 0x4406
+_ek_event_msg == 0x4407
+_ek_poll_request == 0x448B
diff --git a/contiki-cpc/contiki-cpc/arch/crt0-backup.s b/contiki-cpc/contiki-cpc/arch/crt0-backup.s
new file mode 100644
index 0000000..b014aa8
--- /dev/null
+++ b/contiki-cpc/contiki-cpc/arch/crt0-backup.s
@@ -0,0 +1,33 @@
+;; File: crt0.s
+;; Generic crt0.s for a Z80
+;; From SDCC..
+;; Modified to suit execution on the Amstrad CPC!
+;; by H. Hansen 2003
+
+    .module crt0
+	.globl	_main
+	.globl _progend
+	.area _HEADER (ABS)
+	.org 	0x100 ;; Start from address &100
+init:
+
+;; Initialise global variables
+    call    gsinit
+	call	_main
+
+_exit::
+	ret
+
+	;; Ordering of segments for the linker.
+	.area	_HOME
+	.area	_CODE
+	.area	_DATA
+	 .area   _BSS
+	
+	.area   _GSINIT
+gsinit::	
+
+    .area   _GSFINAL
+    ret
+    	.area   _HEAP
+_progend::
diff --git a/contiki-cpc/contiki-cpc/arch/crt0-dsc.s b/contiki-cpc/contiki-cpc/arch/crt0-dsc.s
new file mode 100644
index 0000000..381bc27
--- /dev/null
+++ b/contiki-cpc/contiki-cpc/arch/crt0-dsc.s
@@ -0,0 +1,26 @@
+;; File: crt0-dsc.s
+
+    .module crt0
+	.globl	_main
+
+	.area _HEADER (REL)
+;;	.org 	0x100 ;; Start from address &100
+
+init:
+_main:
+	;; Ordering of segments for the linker.
+	.area	_HOME (REL)
+	.area	_CODE (REL)
+    .area   _GSINIT (REL)
+    .area   _GSFINAL (REL)
+        
+	.area	_DATA (REL)
+    .area   _BSS (REL)
+    .area   _HEAP (REL)
+
+   .area   _CODE (REL)
+	
+_exit::
+	.area   _GSINIT (REL)
+gsinit::	
+    .area   _GSFINAL (REL)
diff --git a/contiki-cpc/contiki-cpc/arch/crt0-prg.s b/contiki-cpc/contiki-cpc/arch/crt0-prg.s
new file mode 100644
index 0000000..8984742
--- /dev/null
+++ b/contiki-cpc/contiki-cpc/arch/crt0-prg.s
@@ -0,0 +1,16 @@
+;; File: crt0-dsc.s
+
+    .module crt0
+	.area _HEADER (ABS)
+	.area _HOME (REL)	
+	.area _CODE (REL)
+	;; relocation data
+	.dw 0
+     .area _DATA (REL)
+    .area   _BSS (REL)
+    .area   _HEAP (REL)
+
+	.area   _GSINIT (REL)
+gsinit::	
+    .area   _GSFINAL (REL)
+	ret
diff --git a/contiki-cpc/contiki-cpc/arch/crt0.s b/contiki-cpc/contiki-cpc/arch/crt0.s
new file mode 100644
index 0000000..a8aafdb
--- /dev/null
+++ b/contiki-cpc/contiki-cpc/arch/crt0.s
@@ -0,0 +1,35 @@
+;; File: crt0.s
+;; Generic crt0.s for a Z80
+;; From SDCC..
+;; Modified to suit execution on the Amstrad CPC!
+;; by H. Hansen 2003
+
+    .module crt0
+	.globl	_main
+	.globl _progend
+	.globl __jpbc
+	.area	_HEADER (ABS)
+	;; Ordering of segments for the linker.
+	.area	_CODE
+init:
+
+;; Initialise global variables
+    call    gsinit
+	call	_main
+
+_exit::
+	ret
+__jpbc:
+	push bc
+	ret
+
+	.area	_DATA (REL)
+	 .area   _BSS (REL)
+	
+	.area   _GSINIT (REL)
+gsinit::	
+
+    .area   _GSFINAL (REL)
+    ret
+    	.area   _HEAP (REL)
+_progend::
diff --git a/contiki-cpc/contiki-cpc/arch/hires.s b/contiki-cpc/contiki-cpc/arch/hires.s
new file mode 100644
index 0000000..c482768
--- /dev/null
+++ b/contiki-cpc/contiki-cpc/arch/hires.s
@@ -0,0 +1,101 @@
+;; Hires: 
+;;
+;; Mode 0, 40 columns. Each character is 4 pixels wide and 8 pixels tall.
+;; Each character is two bytes wide and 8 lines tall.
+;;
+;; The graphics for each character is a bitmap defined using
+;; pen 0 and pen 15.
+;;
+;; The bitmap is processed at runtime to convert the font to the 
+;; appropiate pixel colours.
+		.area _CODE
+;; This table converts between pen index (0-15) and pixel bitmap.
+.pen_table
+defb #00	;; pen 0  (%00000000)
+defb #c0	;; pen 1  (%11000000)
+defb #0c	;; pen 2  (%00001100)
+defb #cc	;; pen 3  (%11001100)
+defb #30	;; pen 4  (%00110000)
+defb #f0	;; pen 5  (%11110000)
+defb #3c	;; pen 6  (%00111100)
+defb #fc	;; pen 7  (%11111100)
+defb #03	;; pen 8  (%00000011)
+defb #c3	;; pen 9  (%11000011)
+defb #0f	;; pen 10 (%00001111)
+defb #cf	;; pen 11 (%11001111)
+defb #33	;; pen 12 (%00110011)
+defb #f3	;; pen 13 (%11110011)
+defb #3f	;; pen 14 (%00111111)
+defb #ff	;; pen 15 (%11111111)
+
+;; A = pen
+.get_pen_mask
+ld hl,pen_table
+add a,l
+ld l,a
+ld a,h
+adc a,0
+ld h,a
+ld a,(hl)
+ret
+
+.set_pen
+call get_pen_mask
+ld (pen_mask+1),a
+ld (pen_mask2+1),a
+ret
+
+.set_paper
+call get_pen_mask
+ld (paper_mask+1),a
+ld (paper_mask2+1),a
+ret
+
+;; enter:
+;; HL = current memory address
+;; exit:
+;; HL = memory address of byte immediatly below
+;; AF corrupt.
+.scr_next_line
+ld a,h
+add a,8
+ld h,a
+ret nc
+ld a,l
+add a,&50
+ld l,a
+ld a,h
+adc a,&c0
+ld h,a
+ret
+
+;; enter:
+;; HL = screen address
+;; DE = character pixel graphics
+;; exit:
+;; AF, BC, HL, DE corrupt
+.plot_char
+ld b,8
+.pc1
+ld a,(de)		;; convert 'on' pixels
+.pen_mask and 1
+ld c,a
+ld a,(de)
+cpl 
+.paper_mask and 1
+or c
+ld (hl),a
+inc l
+ld a,(de)
+.pen_mask2 and 1
+ld c,a
+ld a,(de)
+cpl
+.paper_mask2 and 1
+or c
+ld (hl),a
+dec l
+call scr_next_line
+djnz pc1
+ret
+
diff --git a/contiki-cpc/contiki-cpc/arch/key.s b/contiki-cpc/contiki-cpc/arch/key.s
new file mode 100644
index 0000000..8ca55ad
--- /dev/null
+++ b/contiki-cpc/contiki-cpc/arch/key.s
@@ -0,0 +1,33 @@
+; unsigned char kbhit (void);
+; Return true if there's a key waiting, return false if not 
+; TESTED
+
+.globl _kbhit
+		.area _CODE
+_kbhit::
+		call	0xBB09	; KM READ KEY
+		ld (key),a
+		ld		l,#1
+		ret		c
+		ld		l,#0
+		ret
+
+; char cgetc (void);
+; Return a character from the keyboard. If there is no character available,
+; the functions waits until the user does press a key. If cursor is set to
+; 1 (see below), a blinking cursor is displayed while waiting.
+; TESTED
+
+.globl _cgetc
+
+_cgetc::	
+		ld a,(key)
+		ld l,a
+		ret
+
+;;		call	0xBB09
+;;		jr nc,_cgetc
+;;		ld		l,a
+;;		ret
+
+key:		.db 0
diff --git a/contiki-cpc/contiki-cpc/arch/main.c b/contiki-cpc/contiki-cpc/arch/main.c
new file mode 100644
index 0000000..a7f8d2c
--- /dev/null
+++ b/contiki-cpc/contiki-cpc/arch/main.c
@@ -0,0 +1,141 @@
+/*
+ * Copyright (c) 2002-2004, Adam Dunkels.
+ * All rights reserved. 
+ *
+ * Redistribution and use in source and binary forms, with or without 
+ * modification, are permitted provided that the following conditions 
+ * are met: 
+ * 1. Redistributions of source code must retain the above copyright 
+ *    notice, this list of conditions and the following disclaimer. 
+ * 2. Redistributions in binary form must reproduce the above
+ *    copyright notice, this list of conditions and the following
+ *    disclaimer in the documentation and/or other materials provided
+ *    with the distribution. 
+ * 3. The name of the author may not be used to endorse or promote
+ *    products derived from this software without specific prior
+ *    written permission.  
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  
+ *
+ * This file is part of the Contiki operating system
+ *
+ * $Id: main.c,v 1.1 2006/04/17 15:11:44 kthacker Exp $
+ *
+ */
+
+#include "contiki.h"
+
+#include "ctk.h"
+#include "ctk-draw.h"
+#include "ek.h"
+#include "log.h"
+#include "program-handler.h"
+
+#include "uip.h"
+#include "uip_arp.h"
+
+#include "resolv.h"
+
+#include "configedit-dsc.h"
+#include "directory-dsc.h"
+#include "processes-dsc.h"
+
+//#include "cfs-cbm.h"
+#include "cfs-cpc.h"
+
+#include "clock.h"
+
+#include "arch.h"
+
+unsigned char
+uip_fw_forward(void)
+{
+  return 0;
+}
+void
+uip_fw_periodic(void)
+{
+  return;
+}
+/*-----------------------------------------------------------------------------------*/
+EK_EVENTHANDLER(init_eventhandler, ev, data)
+{
+  switch(ev) {
+  case EK_EVENT_INIT:
+    program_handler_load("conio.prg",NULL);
+//    program_handler_load("config.prg", NULL);
+    break;
+  }
+}
+/*-----------------------------------------------------------------------------------*/
+EK_PROCESS(init, "Init", EK_PRIO_LOWEST,
+	   init_eventhandler, NULL, NULL);
+/*-----------------------------------------------------------------------------------*/
+#if LOG_CONF_ENABLED
+void
+log_message(char *part1, char *part2)
+{
+}
+#endif
+void
+main(void)
+{
+  
+ log_message("Starting ", CONTIKI_VERSION_STRING);
+  
+  ek_init();
+
+  ek_start(&init);
+    
+ // log_message(": TCP/IP", "");
+    
+ // tcpip_init(NULL);
+
+ // resolv_init(NULL); 
+
+  log_message(": CTK GUI", "");
+  ctk_init();
+
+  log_message(": Initial filesystem", "");
+  cfs_cpc_init(NULL);
+
+  program_handler_init();
+   
+  program_handler_add(&directory_dsc, "Directory", 1);
+//  program_handler_add(&configedit_dsc, "Configuration", 1);
+  program_handler_add(&processes_dsc, "Processes", 1);  
+  
+  
+  log_message("Starting process scheduling", "");  
+
+  while(1) {
+    if(ek_run() == 0) {
+      program_handler_load("welcome.prg", NULL);
+      break;
+    }
+  }
+    
+  while(1) {
+    ek_run();
+  }
+}
+/*-----------------------------------------------------------------------------------*/
+void
+reset(void)
+{
+/*  asm("lda #$36");
+  asm("sta $01");
+  asm("jmp $fce2");
+*/
+}
+
diff --git a/contiki-cpc/contiki-cpc/arch/malloc.c b/contiki-cpc/contiki-cpc/arch/malloc.c
new file mode 100644
index 0000000..d4e91b5
--- /dev/null
+++ b/contiki-cpc/contiki-cpc/arch/malloc.c
@@ -0,0 +1,268 @@
+#include <sdcc-lib.h>
+#include <malloc.h>
+
+#if _SDCC_MALLOC_TYPE_MLH
+
+typedef struct _MEMHEADER MEMHEADER;
+
+struct _MEMHEADER
+{
+  MEMHEADER *  next;
+  MEMHEADER *  prev;
+  unsigned int       len;
+  unsigned char      mem;
+};
+
+#define HEADER_SIZE (sizeof(MEMHEADER)-sizeof(char))
+
+/* These veriables are defined through the crt0 functions. */
+/* Base of this variable is the first byte of the heap. */
+//extern MEMHEADER _sdcc_heap_start;
+/* Address of this variable is the last byte of the heap. */
+//extern char _sdcc_heap_end;
+
+extern char *get_ram_start();
+extern char *get_ram_end();
+extern void calc_free_ram();
+extern char progend;
+
+static MEMHEADER *firstheader;
+/* setup two headers. One at start of free ram, second at end of free ram.
+ We find free ram range by asking Amstrad's firmware. */
+
+void
+_sdcc_heap_init(void)
+{
+  MEMHEADER *lastheader;
+  unsigned int size;
+  char * ramstart;
+
+  /* ask firmware for free ram */
+  calc_free_ram();
+
+  /* start of ram is either start of range given by firmware,
+  or end of program; whichever is largest */
+  ramstart = get_ram_start();
+  if (ramstart<&progend)
+	ramstart = &progend;
+
+  /* this is our first mem header */
+  firstheader = (MEMHEADER *)ramstart;
+  
+  /* this is the size of ram available */
+  size = get_ram_end() - ramstart;
+
+  /* calc address of last header */
+  lastheader = (MEMHEADER *)((char *)firstheader + size - HEADER_SIZE); 
+  
+  /* setup last header */
+  lastheader->next = NULL;
+  lastheader->prev = firstheader;
+  lastheader->len = 0;
+
+  /* setup first header */
+  firstheader->next = lastheader;
+  firstheader->prev       = NULL; //and mark first as first
+  firstheader->len        = 0;    //Empty and ready.
+}
+
+void *
+malloc (unsigned int size)
+{
+  MEMHEADER * current_header;
+  MEMHEADER * new_header;
+
+  if (size>(0xFFFF-HEADER_SIZE))
+    {
+      return NULL; //To prevent overflow in next line
+    }
+
+  size += HEADER_SIZE; //We need a memory for header too
+  current_header = firstheader;
+
+  while (1)
+    {
+      //    current
+      //    |   len       next
+      //    v   v         v
+      //....*****.........******....
+      //         ^^^^^^^^^
+      //           spare
+
+      if ((((unsigned int)current_header->next) -
+           ((unsigned int)current_header) -
+           current_header->len) >= size) 
+        {
+          break; //if spare is more than need
+        }
+      current_header = current_header->next;    //else try next             
+      if (!current_header->next)  
+        {
+          return NULL;  //if end_of_list reached    
+        }
+    }
+
+  if (!current_header->len)
+    { //This code works only for first_header in the list and only
+      current_header->len = size; //for first allocation
+      return &current_header->mem;
+    } 
+  else
+    {
+      //else create new header at the begin of spare
+      new_header = (MEMHEADER * )((char *)current_header + current_header->len);
+      new_header->next = current_header->next; //and plug it into the chain
+      new_header->prev = current_header;
+      current_header->next  = new_header;
+      if (new_header->next)
+        {
+          new_header->next->prev = new_header;
+        }
+      new_header->len  = size; //mark as used
+      return &new_header->mem;
+    }
+}
+
+void
+free (void *p)
+{
+  MEMHEADER *prev_header, *pthis;
+
+  if ( p ) //For allocated pointers only!
+    {
+      pthis = (MEMHEADER * )((char *)  p - HEADER_SIZE); //to start of header
+      if ( pthis->prev ) // For the regular header
+        {
+          prev_header = pthis->prev;
+          prev_header->next = pthis->next;
+          if (pthis->next)
+            {
+              pthis->next->prev = prev_header;
+            }
+        }
+      else
+        {
+          pthis->len = 0; //For the first header
+        }
+    }
+}
+
+#else
+
+            //--------------------------------------------------------------------
+            //Written by Dmitry S. Obukhov, 1997
+            //dso@usa.net
+            //--------------------------------------------------------------------
+            //Modified for SDCC by Sandeep Dutta, 1999
+            //sandeep.dutta@usa.net
+            //--------------------------------------------------------------------
+            //malloc and free functions implementation for embedded system
+            //Non-ANSI keywords are C51 specific.
+            // xdata - variable in external memory (just RAM)
+            //--------------------------------------------------------------------
+
+            #define MEMHEADER   struct MAH// Memory Allocation Header
+
+            MEMHEADER
+            {
+              MEMHEADER xdata *  next;
+              MEMHEADER xdata *  prev;
+              unsigned int       len;
+	      unsigned char      mem;
+            };
+
+            #define HEADER_SIZE (sizeof(MEMHEADER)-1)
+
+            //Static here means: can be accessed from this module only
+            static MEMHEADER xdata * FIRST_MEMORY_HEADER_PTR;
+            void init_dynamic_memory(MEMHEADER xdata * array, unsigned int size) 
+            {
+
+            //This function MUST be called after the RESET.
+            //Parameters: array - pointer to memory allocated by the linker
+            //            size  - size of this memory pool
+            //Example:
+            //     #define DYNAMIC_MEMORY_SIZE 0x2000
+            //     .....
+            //     unsigned char xdata dynamic_memory_pool[DYNAMIC_MEMORY_SIZE];
+            //     unsigned char xdata * current_buffer;
+            //     .....
+            //     void main(void)
+            //     {
+            //         ...
+            //         init_dynamic_memory(dynamic_memory_pool,DYNAMIC_MEMORY_SIZE);
+            //         Now it is possible to use malloc.
+            //         ...
+            //         current_buffer = malloc(0x100);
+            //
+            //
+
+              if ( !array ) /*Reserved memory starts on 0x0000 but it's NULL...*/
+              {             //So, we lost one byte!
+                 array = (MEMHEADER xdata * )((char xdata * ) array + 1) ;
+                 size --;
+              }
+              FIRST_MEMORY_HEADER_PTR = array;
+              //Reserve a mem for last header
+              array->next = (MEMHEADER xdata * )(((char xdata * ) array) + size - HEADER_SIZE);
+              array->next->next = (void xdata * ) NULL; //And mark it as last
+              array->prev       = (void xdata * ) NULL; //and mark first as first
+              array->len        = 0;    //Empty and ready.
+            }
+
+            void  xdata * malloc (unsigned int size)
+            {
+              register MEMHEADER xdata * current_header;
+              register MEMHEADER xdata * new_header;
+
+              if (size>(0xFFFF-HEADER_SIZE)) return (void xdata *) NULL; //To prevent overflow in next line
+              size += HEADER_SIZE; //We need a memory for header too
+              current_header = FIRST_MEMORY_HEADER_PTR;
+              while (1)
+              {
+
+                //    current
+                //    |   len       next
+                //    v   v         v
+                //....*****.........******....
+                //         ^^^^^^^^^
+                //           spare
+
+                if ((((unsigned int)current_header->next) -
+                     ((unsigned int)current_header) -
+                     current_header->len) >= size) break; //if spare is more than need
+                current_header = current_header->next;    //else try next             
+                if (!current_header->next)  return (void xdata *) NULL;  //if end_of_list reached
+              }
+              if (!current_header->len)
+              { //This code works only for first_header in the list and only
+                 current_header->len = size; //for first allocation
+                 return ((xdata *)&(current_header->mem));
+              } //else create new header at the begin of spare
+              new_header = (MEMHEADER xdata * )((char xdata *)current_header + current_header->len);
+              new_header->next = current_header->next; //and plug it into the chain
+              new_header->prev = current_header;
+              current_header->next  = new_header;
+              if (new_header->next)  new_header->next->prev = new_header;
+              new_header->len  = size; //mark as used
+              return ((xdata *)&(new_header->mem));
+            }
+
+            void free (void xdata * p)
+            {
+              register MEMHEADER xdata * prev_header;
+              if ( p ) //For allocated pointers only!
+              {
+                  p = (MEMHEADER xdata * )((char xdata *)  p - HEADER_SIZE); //to start of header
+                  if ( ((MEMHEADER xdata * ) p)->prev ) // For the regular header
+                  {
+                    prev_header = ((MEMHEADER xdata * ) p)->prev;
+                    prev_header->next = ((MEMHEADER xdata * ) p)->next;
+                    if (((MEMHEADER xdata * ) p)->next)
+		       ((MEMHEADER xdata * ) p)->next->prev = prev_header;
+                  }
+                  else ((MEMHEADER xdata * ) p)->len = 0; //For the first header
+              }
+            }
+            //END OF MODULE
+#endif
diff --git a/contiki-cpc/contiki-cpc/arch/mem.s b/contiki-cpc/contiki-cpc/arch/mem.s
new file mode 100644
index 0000000..e994238
--- /dev/null
+++ b/contiki-cpc/contiki-cpc/arch/mem.s
@@ -0,0 +1,105 @@
+	.globl _calc_free_ram
+	.globl _get_ram_start
+	.globl _get_ram_end
+	.globl __sdcc_heap_init
+
+	.area _GSINIT
+	call __sdcc_heap_init
+
+	.area _CODE
+
+_calc_free_ram::
+	push bc
+        ;; get information about BASIC ROM
+        ld c,#0x0
+        call  #0xb915
+        cp #0x80
+        jr nz,gfr
+        ;; must be built in ROM
+
+        ;; v1.0 (BASIC 1.0 in CPC464)
+        ;; v1.1 (BASIC 1.1 in CPC664)
+        ;; v1.2 (BASIC 1.1 in CPC6128 and KC Compact)
+        ;; v1.4 (BASIC 1.1 in CPC+)
+
+        ld a,h
+        cp #0x1
+        ret z
+        ld a,l
+        or a
+        jr z,basic10       
+
+        ;; basic 1.1       
+  
+        ld hl,(#0xb073)
+        inc hl
+        ld bc,(#0xb736)
+        or a
+        sbc hl,bc
+        jr nz,after_himem11
+
+        ld hl,(#0xae6c)
+        ld (ram_start),hl
+
+        ld hl,(#0xb071)
+        ld (ram_end),hl
+gfr:
+	pop bc
+        ret
+
+after_himem11:
+
+        ;; after himem
+        ld hl,(#0xb073)
+        inc hl
+        ld (ram_start),hl
+        
+        ;; start of UDG
+        ld hl,(#0xb736)
+        dec hl
+        ld (ram_end),hl
+	pop bc
+        ret
+
+
+basic10:
+        ld hl,(#0xb08f)
+        inc hl
+        ld bc,(#0xb296)
+        or a
+        sbc hl,bc
+        jr nz,after_himem10
+
+        ld hl,(#0xae89)
+        ld (ram_start),hl
+
+        ld hl,(#0xb08d)
+        ld (ram_end),hl
+	pop bc
+        ret
+
+after_himem10:
+
+        ;; after himem
+        ld hl,(#0xb08f)
+        inc hl
+        ld (ram_start),hl
+
+        ;; start of UDG
+        ld hl,(#0xb296)
+        dec hl
+        ld (ram_end),hl
+	pop bc
+        ret
+
+_get_ram_start:: 
+	ld hl,(ram_start)
+	ret
+_get_ram_end::
+	ld hl,(ram_end)
+	ret
+	
+ram_start:: 
+	.dw 0
+ram_end:: 
+	.dw 0
diff --git a/contiki-cpc/contiki-cpc/arch/putchar.s b/contiki-cpc/contiki-cpc/arch/putchar.s
new file mode 100644
index 0000000..cc98c8d
--- /dev/null
+++ b/contiki-cpc/contiki-cpc/arch/putchar.s
@@ -0,0 +1,27 @@
+;; File: putchar.s
+;; Modified to suit execution on the Amstrad CPC
+;; by H. Hansen 2003
+;; Original lines has been marked out!
+
+		.area _CODE
+_putchar::       
+_putchar_rr_s:: 
+        ld      hl,#2
+        add     hl,sp
+        
+        ld      a,(hl)
+;;      ld      a,#1
+;;      rst     0x08
+        call	0xBB5A
+        ret
+           
+_putchar_rr_dbs::
+
+;;      ld      l,e
+;;		ld		a,#1
+;;      rst     0x08
+
+        ld		a,e
+        call	0xBB5A
+        ret
+			
\ No newline at end of file
diff --git a/contiki-cpc/contiki-cpc/arch/uip.c b/contiki-cpc/contiki-cpc/arch/uip.c
new file mode 100644
index 0000000..76f0d0a
--- /dev/null
+++ b/contiki-cpc/contiki-cpc/arch/uip.c
@@ -0,0 +1,9 @@
+void chksumi()
+{
+}
+
+void add32i()
+{
+}
+
+