two disks
authorNIIBE Yutaka <gniibe@fsij.org>
Wed, 9 Nov 2011 07:30:30 +0000 (16:30 +0900)
committerNIIBE Yutaka <gniibe@fsij.org>
Wed, 9 Nov 2011 07:30:30 +0000 (16:30 +0900)
chibios
src/main.c
src/virtual_block_device.c

diff --git a/chibios b/chibios
index 08ce394..1a62b64 160000 (submodule)
--- a/chibios
+++ b/chibios
@@ -1 +1 @@
-Subproject commit 08ce394d27c1f114da95fb0b55ec1c658723f356
+Subproject commit 1a62b645db33255eee82a079d5ee4c4b5ecddc51
index 597aef1..258f3fa 100644 (file)
@@ -36,7 +36,7 @@ static uint8_t gone_usb_configuration;
  * USB Device Descriptor.
  */
 static const uint8_t gone_device_descriptor_data[18] = {
-  USB_DESC_DEVICE       (0x0200, /* bcdUSB (2.0).                          */
+  USB_DESC_DEVICE       (0x0101, /* bcdUSB (1.1).                          */
                          0x00,   /* bDeviceClass (deferred to interface).  */
                          0x00,   /* bDeviceSubClass.                       */
                          0x00,   /* bDeviceProtocol.                       */
index e2e9b2b..cb6c067 100644 (file)
@@ -5,18 +5,74 @@
 extern Thread *main_thread;
 
 /*
-blk=0: boot
+
+blk=0: master boot record sector
 blk=1: fat0
 blk=2: fat1
 blk=3: root directory
 blk=4: fat cluster #2
-blk=5: fat cluster #3
-blk=6: fat cluster #4
+...
 blk=4+63: fat cluster #2+63
 */
 
-/* blk=0 (0000) */
-static const uint8_t boot_sector[] = {
+#if 0
+static const uint8_t mbr_sector[512] = {
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+  0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
+  0xf3, 0x69, 0xe3, 0x9c,      /* Disk signature */
+  0, 0,
+
+  0, /* non-bootable */
+  0, 0x01, 0x01,               /* CHS (1/0/1) start sector of P1 */
+  0x01,                        /* FAT12 */
+  0x0, 0x04, 0x11,             /* CHS (17/0/4) start sector of P1 */
+  0x04, 0, 0, 0,               /* Start LBA = 4 */
+  0x44, 0, 0, 0,               /* # of sectors */
+
+  0,  /* non-bootable */
+  0, 0x01, 0x12,               /* CHS (18/0/1) start sector of P2 */
+  0x01,                        /* FAT12 */
+  0x0, 0x04, 0x22,             /* CHS (34/0/4) start sector of P2 */
+  0x48, 0, 0, 0,               /* Start LBA = 64+8 */
+  0x44, 0, 0, 0,               /* # of sectors */
+
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+  0x55, 0xaa,                  /* MBR signature */
+};
+#endif
+
+/* blk=4 */ 
+static const uint8_t d0_0_sector[512] = {
   0xeb, 0x3c,                         /* Jump instruction */
   0x90, /* NOP */
 
@@ -31,8 +87,8 @@ static const uint8_t boot_sector[] = {
   0x44, 0x00,                  /* total sectors: 68 */
   0xf8,                                /* media descriptor: fixed disk */
   0x01, 0x00,                  /* sectors per FAT: 1 */
-  0x20, 0x00,                  /* sectors per track: 32 */
-  0x40, 0x00,                  /* number of heads: 64 */
+  0x04, 0x00,                  /* sectors per track: 4 */
+  0x01, 0x00,                  /* number of heads: 1 */
   0x00, 0x00, 0x00, 0x00,      /* hidden sectors: 0 */
   0x00, 0x00, 0x00, 0x00,      /* total sectors (long) */
   0x00,                        /* drive number */
@@ -106,13 +162,13 @@ static const uint8_t boot_sector[] = {
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xaa
-}; 
+};
 
-/* blk=1 (0200) */
-static uint8_t fat0_sector[] = {
+/* blk=5 */
+static uint8_t d0_fat0_sector[512] = {
   0xf8, 0xff, 0xff,    /* Media descriptor: fixed disk */ /* EOC */
-  0x00, 0xf0, 0xff,    /* cluster 2: free */ /* cluster 3 */
-  0xff, 0x0f, 0x00,    /* cluster 4 */ /* cluster 5: free*/
+  0x00, 0x00, 0x00,    /* cluster 2: free */ /* cluster 3: free */
+  0x00, 0x00, 0x00,    /* cluster 4: free */ /* cluster 5: free */
   0x00,
               0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -179,11 +235,11 @@ static uint8_t fat0_sector[] = {
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
 };
 
-/* blk=2 (0400) */
-static uint8_t fat1_sector[] = {
-  0xf8, 0xff, 0xff,
-  0x00, 0xf0, 0xff,
-  0xff, 0x0f, 0x00,
+/* blk=6 */
+static uint8_t d0_fat1_sector[512] = {
+  0xf8, 0xff, 0xff,    /* Media descriptor: fixed disk */ /* EOC */
+  0x00, 0x00, 0x00,    /* cluster 2: free */ /* cluster 3: free */
+  0x00, 0x00, 0x00,    /* cluster 4: free */ /* cluster 5: free */
   0x00,
               0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -250,32 +306,67 @@ static uint8_t fat1_sector[] = {
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
 };
 
-/* blk=3 (0600) */
-static uint8_t rootdir_sector[] = {
-  /* directory "A" */
-  0x41, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, /* filename */
-  0x20, 0x20, 0x20, /* extension */
-  0x10, /* sub directory */
-  0x00, /* reserved */
-  0x64, 0x3b, 0xa7, 0x61, 0x3f, /* create time */
-  0x61, 0x3f, /* last access */
-  0x00, 0x00, /* ea-index */
-  0x3b, 0xa7, 0x61, 0x3f, /* last modified */
-  0x03, 0x00, /* start cluster */
-  0x00, 0x00, 0x00, 0x00, /* file size */
+/* blk=7 */
+static uint8_t d0_rootdir_sector[512] = {
+  0x00,
+};
 
-  /* file "DROPME.TXT" */
-  0x44, 0x52, 0x4f, 0x50, 0x4d, 0x45, 0x20, 0x20,
-  0x54, 0x58, 0x54,
-  0x01,                                /* Read-only */
+/* blk=8, fat cluster #2 */
+static uint8_t d0_cluster_2[512] = {
+  0x00,
+};
+
+/* blk=72 */ 
+static const uint8_t d1_0_sector[512] = {
+  0xeb, 0x3c,                         /* Jump instruction */
+  0x90, /* NOP */
+
+  0x6d, 0x6b, 0x64, 0x6f, 0x73, 0x66, 0x73, 0x20, /* "mkdosfs " */
+
+  0x00, 0x02,                  /* Bytes per sector: 512 */
+
+  0x01,                                /* sectors per cluster: 1 */
+  0x01, 0x00,                  /* reserved sector count: 1 */
+  0x02,                        /* Number of FATs: 2 */
+  0x10, 0x00,                  /* Max. root directory entries: 16 (1 sector) */
+  0x44, 0x00,                  /* total sectors: 68 */
+  0xf8,                                /* media descriptor: fixed disk */
+  0x01, 0x00,                  /* sectors per FAT: 1 */
+  0x04, 0x00,                  /* sectors per track: 4 */
+  0x01, 0x00,                  /* number of heads: 1 */
+  0x00, 0x00, 0x00, 0x00,      /* hidden sectors: 0 */
+  0x00, 0x00, 0x00, 0x00,      /* total sectors (long) */
+  0x01,                        /* drive number */
   0x00,                                /* reserved */
-  0x00, 0x41, 0xa7, 0x61, 0x3f, /* create time */
-  0x61, 0x3f, /* last access */
-  0x00, 0x00, /* ea-index */
-  0x41, 0xa7, 0x61, 0x3f, /* last modified */
-  0x04, 0x00, /* start cluster */
-  0x28, 0x00, 0x00, 0x00, /* file size */
+  0x29,                        /* extended boot signature */
+  0xc0, 0x86, 0x75, 0xea, /* Volume ID (serial number) (Little endian) */
+
+  /* Volume label */
+  'G', 'O', 'N', 'E', '1', 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
 
+  0x46, 0x41, 0x54, 0x31, 0x32, 0x20, 0x20, 0x20, /* FAT12 */
+
+  0x0e, 0x1f,
+  0xbe, 0x5b, 0x7c, 0xac, 0x22, 0xc0, 0x74, 0x0b,
+  0x56, 0xb4, 0x0e, 0xbb, 0x07, 0x00, 0xcd, 0x10,
+  0x5e, 0xeb, 0xf0, 0x32, 0xe4, 0xcd, 0x16, 0xcd,
+  0x19,
+  0xeb, 0xfe,                  /* loop: jmp loop */
+
+  /* "Thisis not a bootable disk... \r\n" */
+  0x54, 0x68, 0x69, 0x73, 0x20,
+  0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61,
+  0x20, 0x62, 0x6f, 0x6f, 0x74, 0x61, 0x62, 0x6c,
+  0x65, 0x20, 0x64, 0x69, 0x73, 0x6b, 0x2e, 0x20,
+  0x20, 0x50, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20,
+  0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x61,
+  0x20, 0x62, 0x6f, 0x6f, 0x74, 0x61, 0x62, 0x6c,
+  0x65, 0x20, 0x66, 0x6c, 0x6f, 0x70, 0x70, 0x79,
+  0x20, 0x61, 0x6e, 0x64, 0x0d, 0x0a, 0x70, 0x72,
+  0x65, 0x73, 0x73, 0x20, 0x61, 0x6e, 0x79, 0x20,
+  0x6b, 0x65, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x74,
+  0x72, 0x79, 0x20, 0x61, 0x67, 0x61, 0x69, 0x6e,
+  0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x0d, 0x0a, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -315,6 +406,16 @@ static uint8_t rootdir_sector[] = {
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xaa
+};
+
+/* blk=73 */
+static uint8_t d1_fat0_sector[512] = {
+  0xf8, 0xff, 0xff,    /* Media descriptor: fixed disk */ /* EOC */
+  0xff, 0x0f, 0x00,    /* cluster 2: EOC */ /* cluster 3: free */
+  0x00, 0x00, 0x00,    /* cluster 4: free */ /* cluster 5: free */
+  0x00,
+              0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -331,33 +432,6 @@ static uint8_t rootdir_sector[] = {
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-};
-
-/* blk=5, fat cluster #3 */
-static uint8_t directory_a_sector[] = {
-  0x2e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20,
-  0x10,
-  0x00,
-  0x64, 0x3b, 0xa7, 0x61, 0x3f,
-  0x61, 0x3f,
-  0x00, 0x00,
-  0x3b, 0xa7, 0x61, 0x3f,
-  0x03, 0x00,
-  0x00, 0x00, 0x00, 0x00,
-
-  0x2e, 0x2e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20,
-  0x10,
-  0x00,
-  0x64, 0x3b, 0xa7, 0x61, 0x3f,
-  0x61, 0x3f,
-  0x00, 0x00,
-  0x3b, 0xa7, 0x61, 0x3f,
-  0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00,
-
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -403,6 +477,16 @@ static uint8_t directory_a_sector[] = {
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+/* blk=74 */
+static uint8_t d1_fat1_sector[512] = {
+  0xf8, 0xff, 0xff,    /* Media descriptor: fixed disk */ /* EOC */
+  0xff, 0x0f, 0x00,    /* cluster 2: EOC */ /* cluster 3: free */
+  0x00, 0x00, 0x00,    /* cluster 4: free */ /* cluster 5: free */
+  0x00,
+              0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -413,21 +497,8 @@ static uint8_t directory_a_sector[] = {
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-};
-
-/* blk=6, fat cluster #4 */
-static uint8_t file_sector[512] = {
-  'P', 'l', 'e', 'a', 's', 'e', ' ', 'd',
-  'r', 'o', 'p', ' ', 't', 'h', 'i', 's',
-  ' ', 'f', 'i', 'l', 'e', ' ', 't', 'o',
-  ' ', 't', 'h', 'e', ' ', 'f', 'o', 'l',
-
-  'd', 'e', 'r', ' ', 'A', '.', 0x0d, 0x0a,
-  0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -477,16 +548,29 @@ static uint8_t file_sector[512] = {
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+/* blk=75 */
+static uint8_t d1_rootdir_sector[512] = {
+  /* file "DROPME.TXT" */
+  0x44, 0x52, 0x4f, 0x50, 0x4d, 0x45, 0x20, 0x20,
+  0x54, 0x58, 0x54,
+  0x01,                                /* Read-only */
+  0x00,                                /* reserved */
+  0x00, 0x41, 0xa7, 0x61, 0x3f, /* create time */
+  0x61, 0x3f, /* last access */
+  0x00, 0x00, /* ea-index */
+  0x41, 0xa7, 0x61, 0x3f, /* last modified */
+  0x02, 0x00, /* start cluster: 2 */
+  0x28, 0x00, 0x00, 0x00, /* file size */
+
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-};
-
-static const uint8_t zero_sector[] = {
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -540,6 +624,41 @@ static const uint8_t zero_sector[] = {
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+#if 0
+/* fat cluster #X */
+static uint8_t directory_a_sector[] = {
+  0x2e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20,
+  0x10,
+  0x00,
+  0x64, 0x3b, 0xa7, 0x61, 0x3f,
+  0x61, 0x3f,
+  0x00, 0x00,
+  0x3b, 0xa7, 0x61, 0x3f,
+  0x03, 0x00,
+  0x00, 0x00, 0x00, 0x00,
+
+  0x2e, 0x2e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20,
+  0x10,
+  0x00,
+  0x64, 0x3b, 0xa7, 0x61, 0x3f,
+  0x61, 0x3f,
+  0x00, 0x00,
+  0x3b, 0xa7, 0x61, 0x3f,
+  0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00,
+
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -550,10 +669,6 @@ static const uint8_t zero_sector[] = {
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-}; 
-
-static uint8_t new_sector[] = {
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -592,6 +707,51 @@ static uint8_t new_sector[] = {
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+#endif
+
+/* blk=76, fat cluster #2 */
+static const uint8_t d1_file_sector[512] = {
+  'P', 'l', 'e', 'a', 's', 'e', ' ', 'd',
+  'r', 'o', 'p', ' ', 't', 'h', 'i', 's',
+  ' ', 'f', 'i', 'l', 'e', ' ', 't', 'o',
+  ' ', 't', 'h', 'e', ' ', 'f', 'o', 'l',
+  'd', 'e', 'r', ' ', 'A', '.', 0x0d, 0x0a,
+  0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -618,36 +778,58 @@ static uint8_t new_sector[] = {
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+static const uint8_t zero_sector[] = {
+  0x00,
+}; 
+
+static uint8_t new_sector[] = {
+  0x00, 
 }; 
 
-static uint8_t *get_sector (uint32_t lba)
+static uint8_t *get_sector (uint8_t lun, uint32_t lba)
 {
+  if (lun == 0)
   switch (lba)
     {
     case 0:
-      return boot_sector;
+      return d0_0_sector;
     case 1:
-      return fat0_sector;
+      return d0_fat0_sector;
     case 2:
-      return fat1_sector;
+      return d0_fat1_sector;
     case 3:
-      return rootdir_sector;
+      return d0_rootdir_sector;
     case 4:
-      return new_sector;
-    case 5:
-      return directory_a_sector;
-    case 6:
-      return file_sector;
+      return d0_cluster_2;
     default:
       set_led (1);
       return new_sector;
     }
+  else
+    switch (lba)
+      {
+      case 0:
+       return d1_0_sector;
+      case 1:
+       return d1_fat0_sector;
+      case 2:
+       return d1_fat1_sector;
+      case 3:
+       return d1_rootdir_sector;
+      case 4:
+       return d1_file_sector;
+      default:
+       set_led (1);
+       return new_sector;
+      }
 }
 
 const uint8_t *
-msc_scsi_read (uint32_t lba)
+msc_scsi_read (uint8_t lun, uint32_t lba)
 {
-  return get_sector (lba);
+  return get_sector (lun, lba);
 }
 
 #include "ch.h"
@@ -661,11 +843,11 @@ extern SerialUSBDriver SDU1;
 uint8_t datetime_string[29];
 
 int
-msc_scsi_write (uint32_t lba, const uint8_t *buf, size_t size)
+msc_scsi_write (uint8_t lun, uint32_t lba, const uint8_t *buf, size_t size)
 {
   uint8_t s[50];
   int i;
-  uint8_t *sector = get_sector (lba); 
+  uint8_t *sector = get_sector (lun, lba); 
 
   (void)lba;
   (void)buf;
@@ -685,17 +867,7 @@ msc_scsi_write (uint32_t lba, const uint8_t *buf, size_t size)
   if (sector != zero_sector)
     memcpy (sector, buf, size);
 
-  if (
-#if 0
-      lba == 3 /* Root dir */
-#else
-#if 0
-      lba == 5 /* folder A */ || lba == 4
-#else
-      lba == 6 /* folder B */
-#endif
-#endif
-      ) 
+  if (lun == 0 && lba == 3) /* D0 Root dir */
     {
       uint16_t ymd, hms;
       uint8_t year, month, day;