* Commit dual-boot support for Creative ZVx family
 * Add mkzenboot: makes it possible to integrate Rockbox bootloader with
   Creative firmwares without the need of distributing binaries
 * Add Tadeusz Pyś to credits, who figured out the minifs file system
 * Fix bootloader


git-svn-id: svn://svn.rockbox.org/rockbox/trunk@18352 a1c6a512-1295-4272-9138-f99709370657
diff --git a/bootloader/creativezvm.c b/bootloader/creativezvm.c
new file mode 100644
index 0000000..f7a6d34
--- /dev/null
+++ b/bootloader/creativezvm.c
@@ -0,0 +1,113 @@
+/***************************************************************************
+*             __________               __   ___.
+*   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+*   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+*   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+*   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+*                     \/            \/     \/    \/            \/
+* $Id$
+*
+* Copyright (C) 2008 by Maurus Cuelenaere
+*
+* All files in this archive are subject to the GNU General Public License.
+* See the file COPYING in the source tree root for full license agreement.
+*
+* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+* KIND, either express or implied.
+*
+****************************************************************************/
+
+#include "system.h"
+#include "lcd.h"
+#include "kernel.h"
+#include "thread.h"
+#include "ata.h"
+#include "ata-target.h"
+#include "disk.h"
+#include "font.h"
+#include "backlight.h"
+#include "button.h"
+#include "common.h"
+
+
+static void load_fw(unsigned char* ptr, unsigned int len)
+{
+    (void)ptr;
+    (void)len;
+    asm volatile("ldr pc, =0x1EE0000");
+}
+
+void main(void)
+{
+    unsigned char* loadbuffer;
+    int buffer_size;
+    int(*kernel_entry)(void);
+    int ret;
+    
+	/* Make sure interrupts are disabled */
+	set_irq_level(IRQ_DISABLED);
+    set_fiq_status(FIQ_DISABLED);
+    system_init();
+    kernel_init();
+	
+	/* Now enable interrupts */
+	set_irq_level(IRQ_ENABLED);
+    set_fiq_status(FIQ_ENABLED);
+    backlight_init();
+    lcd_init();
+    font_init();
+    button_init();
+
+    lcd_enable(true);
+    lcd_setfont(FONT_SYSFIXED);
+    reset_screen();
+    printf("Rockbox boot loader");
+    printf("Version %s", APPSVERSION);
+    
+	ret = ata_init();
+	if(ret)
+		printf("ATA error: %d", ret);
+    
+    if(1)
+    {
+        printf("Loading Creative firmware...");
+        
+        loadbuffer = (unsigned char*)0x00A00000;
+        ret = load_minifs_file("creativeos.jrm", loadbuffer);
+        if(ret != -1)
+        {
+        	set_irq_level(IRQ_DISABLED);
+            set_fiq_status(FIQ_DISABLED);
+            /* Doesn't return! */
+            load_fw(loadbuffer, ret);
+        }
+        else
+            printf("FAILED!");
+    }
+    else
+    {
+        disk_init();
+
+        ret = disk_mount_all();
+        if (ret <= 0)
+            error(EDISK, ret);
+        
+        printf("Loading Rockbox firmware...");
+
+        loadbuffer = (unsigned char*)0x00900000;
+        buffer_size = (unsigned char*)0x01900000 - loadbuffer;
+
+        ret = load_firmware(loadbuffer, BOOTFILE, buffer_size);
+        if(ret < 0)
+            error(EBOOTFILE, ret);
+        
+        else if(ret == EOK)
+        {
+            kernel_entry = (void*) loadbuffer;
+            ret = kernel_entry();
+            printf("FAILED!");
+        }
+    }
+    
+    while(1);
+}