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 ¤t_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()
+{
+}
+
+