Start ISO9660 support
diff --git a/src/filo-fs-iso9660.ads b/src/filo-fs-iso9660.ads
new file mode 100644
index 0000000..dd82d74
--- /dev/null
+++ b/src/filo-fs-iso9660.ads
@@ -0,0 +1,90 @@
+package FILO.FS.ISO9660 is
+
+   type T is private;
+
+   function Is_Mounted (State : T) return Boolean;
+   function Is_Open (State : T) return Boolean
+   with
+      Post => (if Is_Open'Result then Is_Mounted (State));
+
+   procedure Mount
+     (State    : in out T;
+      Part_Len : in     Partition_Length;
+      Success  :    out Boolean)
+   with
+      Pre => not Is_Mounted (State),
+      Post => Success = Is_Mounted (State);
+
+   procedure Open
+     (State       : in out T;
+      File_Len    :    out File_Length;
+      File_Type   :    out FS.File_Type;
+      File_Name   : in     String;
+      In_Root     : in     Boolean;
+      Success     : out    Boolean)
+   with
+      Pre => Is_Mounted (State),
+      Post => (if Success then Is_Open (State) else Is_Mounted (State));
+
+   procedure Close (State : in out T)
+   with
+      Pre => Is_Open (State),
+      Post => Is_Mounted (State);
+
+   procedure Read
+     (State    : in out T;
+      File_Pos : in out File_Offset;
+      Buf      :    out Buffer_Type;
+      Len      :    out Natural)
+   with
+      Pre => Is_Open (State) and Buf'Length > 0,
+      Post => Is_Open (State);
+
+private
+   type State is (Unmounted, Mounted, File_Opened);
+
+   FSBlock_Size : constant := 2048;
+   subtype FSBlock_Index is Index_Type range 0 .. FSBlock_Size - 1;
+
+   type FSBlock_Count is range 0 .. 2 ** 32 - 1;
+   subtype FSBlock is FSBlock_Count range 0 .. FSBlock_Count'Last - 1;
+   type FSBlock_Logical is new FSBlock;
+
+   subtype Directory_Record_Range is Index_Type range 0 .. 32;
+   subtype Directory_Record is Buffer_Type (Directory_Record_Range);
+
+   -- We'll use the absolute position of the dir record
+   type Inode_Index is record
+      Block : FSBlock := 0;
+      Offset : FSBlock_Index := 0;
+   end record;
+   type Inode_Length is range 0 .. FSBlock_Count'Last * FSBlock_Size;
+
+   type Mount_State is record
+      Part_Len    : Partition_Length := 0;
+      Root_Inode  : Inode_Index := (others => <>);
+   end record;
+
+   type Extent is record
+      Start : FSBlock := 0;
+      Count : FSBlock_Count := 0;
+   end record;
+
+   type Extent_Range is range 0 .. 0; -- Linux allows 100 "file sections"
+   type Extents is array (Extent_Range) of Extent;
+
+   type Inode_Info is record
+      I        : Inode_Index := (others => <>);
+      Mode     : File_Type := File_Type'First;
+      Size     : Inode_Length := 0;
+      Extents  : ISO9660.Extents := (Extent_Range => (others => <>));
+   end record;
+
+   type T is record
+      Static   : Mount_State  := (others => <>);
+      S        : State;
+      Inode    : Inode_Info := (others => <>);
+      Cur_Dir  : Inode_Index := (others => <>);
+   end record;
+
+end FILO.FS.ISO9660;