CompactFlash Adapter fr das ATMega32 Testboard
===============================================
29.02.2004

Der CompactFlash (CF) wird im 8 Bit Microcontroller Modus betrieben.
Die Ansteuerung hat nichts mit Festplatten zu tun. Die Routinen zum
lesen/schreiben von Dateien knnte man vieleicht bernehmen.

IBM's Microdrives sollten auch mit dieser Schaltung bearbeitet werden
knnen. Sie entsprechen der CF Spezifikation. Das Netzteil der Schaltung
sollte dann aber wenigstens 250mA liefern knnen. Wie der CF angeschlossen
wird siehe einmal GIF-Bild oder Eagle Schaltplan, sowie in die Datei
compact.h .

Wozu das ganze ?
----------------
Ziel ist ein kleines DOS fr Microcontroller zu schreiben. Es gibt
einfachere Wege CF als Massenspeicher zu benutzen. Man kann ein
eigenes Format zum beschreiben von Sektoren erfinden. Aber der CF soll
spter einfach am PC oder Laptop ohne zustzliche Hard/Software mit
einem CF-Reader zu lesen sein. Das geht nur mit FAT basierenden
Dateisystemen.

Es soll kein externes RAM benutzt werden. 2kB internes RAM soll die
einzige Vorraussetzung sein. Wieviel RAM/Programmspeicher der Controller
bentigt wird erst am Ende dieses Projektes herauskommen. Wer nur lesen
will kann nach ersten Erfahrungen auch mit 1kB RAM auskommen. Vieleicht
mit noch weniger wenn die Daten schon beim lesen in z.B. einen MP3 Chip
geschrieben werden und nicht im RAM zwischengelagert werden mssen. Ich
wei allerdings nicht ob man beim lesen aus dem CF beliebig lange Pausen
zwischen den Bytes machen darf.

Hohe Geschwindigkeit ist erst einmal Nebensache. Weitere Einschrnkung:
Nur eine offene Datei zur Zeit. Es sollen aber mehrere Dateien
nacheinander auf dem CF bearbeitet werden knnen.
Lange Dateinamen sind noch nebenschlich. Vieleicht spter mal.

Es wre relativ einfach wenn der Controller einen kompletten Cluster,
das gesamte aktuelle Verzeichnis und die FAT an einem Stck in
irgendeinem Speicher ablegen knnte. Das wrde aber jede Menge RAM
bedeuten. Beispiel:
                                                   
    Sectors per FAT: 61
 
Also bei 512 Bytes pro Sektor immerhin schon >30kB RAM nur fr die FAT.

Bei wenig RAM wird man nicht darum herum kommen Sektoren immer wieder
zu lesen und zu schreiben. Das drckt auf die Geschwindigkeit. Wie
schnell das ganze am Ende ist mu noch ermittelt werden. Schreiben
von Sektoren mu minimiert werden. Ein CF ist keine Festplatte.

Was fehlt ?
-----------
Das ganze geht bisher nur mit der ersten Partition.
FAT32 ist drin, wurde aber noch nicht getestet.

Erzeugen von Verzeichnissen. Lschen von Dateien/Verzeichnissen.
Dateiattribute werden nicht bercksichtigt.
Nicht erlaubte Zeichen im Dateinamen werden nicht bercksichtigt.
Keine langen Dateinamen.
Datum und Uhrzeit werden bisher nicht bercksichtigt.
Wer eine Uhr in seiner Schaltung hat kann das ja noch ndern.
Es wird keine Kopie der FAT angelegt. Also Vorsicht ;)

Was kann das Testprogramm ?
---------------------------
Man kann per serieller Schnittstelle (115200,8,N,1) Befehle senden
und Daten aus dem CF lesen oder reinschreiben. Takt des ATMega 11.0592MHz.
Das kann per Hand mit einem Terminalprogramm oder mit was selbstgeschriebenem
geschehen. Die Baudrate kann in serial.h gendert werden.

Jeder einzelne Sektor kann ausgelesen werden. Die Ausgabe
kann auf binr oder ASCII HEX-Mode eingestellt werden. Man kann sich
interne Laufwerksparameter ansehen. Und das beste, es sind schon
erste einfache DOS-Befehle fr FAT12/16/32 Dateisysteme dabei.
Z.B. einen Verzeichnisinhalt anzeigen und in ein Unterverzeichnis
wechseln. Dateien lesen, neue Dateien erzeugen und beschreiben.
Auch in Unterverzeichnissen ! Die FAT darf dabei auch fragmentiert sein.
Die Cluster mssen nicht direkt hintereinander liegen (was aber optimal wre). 
Wenn die FAT fragmentiert ist kann es einige Sekunden dauern bis das Programm
den nchsten Cluster in der FAT findet !

Verzeichnisse werden automatisch vergrert wenn kein Platz fr neue
Dateieintrge mehr ist. Das geht bei FAT12/16 NICHT wenn man im RootDirectory ist.
Die maximale Anzahl Eintrge ist meist 512. Lange Dateinamen fressen
da auch ganz gut. Im RootDirectory sollte man sie nicht benutzen.
Wer mehr als 512 Dateien anlegen mchte sollte dies in einem Unterverzeichnis
tun. Bei FAT32 gibt es damit keine Probleme. Das RootDir basiert bei FAT32
auch auf Clustern und kann vergrert werden.

**************************************************************
* Den CF nicht einfach rausziehen wenn die Schaltung luft   *
* und die Schaltung nicht einfach abschalten !               *
**************************************************************
Auf jeden Fall sicherstellen das eine zu schreibende Datei mit
fclose() geschlossen wird bevor der CF aus dem Sockel gezogen oder
die Schaltung abgeschaltet wird ! Am besten per Tasterabfrage.

Der letzte Sektor wird im RAM gehalten bis er vollgeschrieben ist. 
Caching also. Das mu man machen weil die Sektoren im CF nur eine begrenzte
Anzahl Schreibzyklen haben. Wenn man jedes Byte einzeln reinschreibt
nutzt man die maximale Anzahl Schreibzyklen sehr schlecht aus.
Wenn man den CF einfach rauszieht fehlen diese Daten. Und wenn gerade
die FAT geschrieben wird kann das ganz bse enden.

Das ist bei Win oder Linux auch nicht anders ;)

Man knnte einen Timer benutzen um automatisch nach einer 
bestimmten Zeit fflush() aufzurufen. Autosave quasi. 100% sicher
ist das z.B. bei Stromausfall aber auch nicht. Da hilft nur ein
Notstromakku.

Beim lesen einer Datei hngt sich im schlechtesten Fall das Programm auf.

Lesegeschwindigkeit (ein paar erste Messungen):
Takt des ATMega: 8MHz
Sektorleseschleife mit 20000 Sektoren -> 10MByte

16MB CF von SanDisk: 40s -> 250kB/s -> 2.00ms/sector
32MB CF von Hitachi: 32s -> 312kB/s -> 1.60ms/sector
32MB CF von Soligor: 30s -> 333kB/s -> 1.50ms/sector

Takt des ATMega: 11.0592MHz
die gleiche Anzahl NOP()'s wie bei 8MHz in den IO-Routinen

16MB CF von SanDisk: 35s -> 285kB/s -> 1.75ms/sector
32MB CF von Hitachi: 26s -> 384kB/s -> 1.30ms/sector
32MB CF von Soligor: 25s -> 400kB/s -> 1.25ms/sector

Takt des ATMega: 16MHz
Anzahl NOP()'s paranoid. Knnte man wohl noch optimieren.

16MB CF von SanDisk: 31s -> 322kB/s -> 1.55ms/sector
32MB CF von Hitachi: 22s -> 454kB/s -> 1.10ms/sector
32MB CF von Soligor: 21s -> 476kB/s -> 1.05ms/sector

Ganz schne Unterschiede bei den CF Dingern. Gelesen wird dabei immer
derselbe Sektor. Es waren keine Timerinterrupts an !

Dann noch ein Versuch mit dem externen Memory-Interface.
Prozessor ATMega128 Takt 11.059MHz

16MB CF von SanDisk: 30s -> 341kB/s -> 1.50ms/sector (keine Waitstates)
16MB CF von SanDisk: 33s -> 310kB/s -> 1.65ms/sector (volle Waitstates)
32MB CF von Hitachi: Fehler bei CF-Identify (keine Waitstates)
32MB CF von Hitachi: Fehler bei CF-Identify (volle Waitstates)
32MB CF von Soligor: 20s -> 500kB/s -> 1.00ms/sector (keine Waitstates)
32MB CF von Soligor: 23s -> 445kB/s -> 1.15ms/sector (volle Waitstates)

Mit dem externen Memory Interface ist man bei gleichem Takt etwas
schneller. Das scheint aber nicht jeder CF zu mgen. Ich habe den
Hitachi am externen Memory Interface nicht vernnftig zum laufen bekommen.
Irgendwie wurden einzelne Bytes verschluckt. Auch eine langsamere
Taktrate hat nicht geholfen.

Die Werte oben sind Maximalwerte. Das wird so nicht zu halten
sein. Beim lesen/schreiben von Dateien mu zwischendurch auch immer mal
in der FAT gelesen werden um die nchste Clusternummer zu holen. Bei FAT12
mssen im ungnstigsten Fall sogar zwei Sektoren gelesen werden. Ganz
schlimm wird es wenn die FAT fragmentiert ist, d.h. die FAT Eintrge
liegen nicht direkt hintereinander. Dagegen hilft nur Defrag oder den
CF mal ganz lschen und neu beschreiben. Sonst kann es vorkommen das der
Prozessor einige Sekunden braucht um den nchsten Sektor zu bestimmen.

Schreibgeschwindigkeit:
Mu noch mit Dateien ermittelt werden. Man kann ja schlecht 20000 mal
denselben Sektor beschreiben. Dann ist der mglicherweise im Eimer.
Flash halt. Die Schreibgeschwindigkeit wird vermutlich langsamer sein
als die Lesegeschwindigkeit.

Erluterung der Befehle in ungeordneter Reihenfolge
===================================================
Der erste Befehl ist h wie Help. Er zeigt an welche Befehle
bis jetzt eingegeben werden knnen.

>h

Command List:
b0,b1    send sectors binary b1=on b0=off
e0,e1    echo e1=on e0=off
h        show this help
i        read drive parameters and show drive informations
ds       dump current sector
ds+,ds-  dump next/previous sector
ds[nr]   dump sector[nr]
nc       next cluster in chain
cc[nr]   send cluster chain for cluster [nr]
cs[nr]   set cluster and current sector to beginning of cluster[nr]
ts[nr]   test read sector0 for [nr] times to RAM
ws[nr]   write sector[nr]
r        change to root directory and show it
ls       list current directory
cd[name] change dir [name]
df[name] download file [name] with ReadFileRaw()
rf[name] download file [name] with fread()
fo[name] open file [name] and write/append 120000 Bytes
l0,l1    show long filename entrys l1=on l0=off
  (Dieses Zeichen ist 0x04 fr EOT)

Am Ende eines Befehls mu mindestens ein CR (0x0D) oder LF (0x0A) gesendet
werden damit er ausgefhrt wird. Einige Befehle erwarten eine Clusternummer.
Die wird ohne Leerzeichen zwischen Befehl und Nummer eingegeben.
Zum Beispiel cd234. Warnung: Wenn der Cluster 234 kein Verzeichnis
enthlt wird der Befehl trotzdem ausgefhrt ! Das kann ziemlich bel
aussehen und sehr lange dauern ;) Solche Fehleingaben mu man mit dem
Resettaster abbrechen. Eine andere Mglichkeit ist noch nicht vorgesehen.

Wer die Befehle in ein Terminalprogramm eintippt kann Fehleingaben
mit BACKSPACE korrigieren wenn der Befehl noch nicht abgeschickt wurde.

#########################################################
i       read drive parameters and show drive informations
#########################################################
Der wichtigste Befehl ist i :

Er mu eingegeben werden wenn man den CF gewechselt hat.
Beim einschalten wird der Befehl automatisch ausgefhrt.
Die meisten Befehle funzen sonst nicht.

>i
Drive Name: Hitachi CVM1.3.3                        
Revision: Rev 3.03
SerialNumber: 0X03 802103050515313
C/H/S 489/4/62592
Capacity 31296kB
Statusbyte first Partition: 0x80=Bootpartition
Partition Type: DOS 16-bit <32M
Bootsector: 32
Sectors per Cluster: 4
Reserved Sectors: 1
Number of FAT's: 2
Sectors per FAT: 61
RootDir Entry's: 512
Total Sectors (16Bit): 62432  (32Bit): 0
First RootDirSector: 155
First DataSector: 187
Data Sectors of Partition: 62245
Data Clusters of Partition: 15561
First FAT Sector: 33
Type of FAT: FAT16
Bootsector OEM-NAME: *d+V(IHC
Volume Label: NO NAME    
File System String: FAT16   
  (Dieses Zeichen ist 0x04 fr EOT)

#########################################################
ds      dump current sector
ds+     dump next sector
ds-     dump previous sector
ds[nr]  dump sector[nr]
#########################################################

ds zeigt den Inhalt eines Sektors an. Entweder binr oder ASCII-HEX.
Siehe b Befehl. Ausgabe hier z.B. fr den Bootsektor 32 (ASCII-HEX)

ds32
EB3C902A642B56284948430002040100  <*d+V(IHC.....
020002E0F3F83D002000040020000000  ...=. ... ...
00000000800029AC012A2C4E4F204E41  .....).*,NO NA
4D45202020204641543136202020FA33  ME    FAT16   3
C08ED0BC007C1607BB780036C5371E56  м.|..x.67.V
1653BF3E7CB90B00FCF3A4061FC645FE  .S>|....E
0F8B0E187C884DF9894702C7073E7CFB  ...|MG..>|
CD13727933C03906137C74088B0E137C  .ry39..|t...|
890E207CA0107CF726167C03061C7C13  . |.|&.|...|.
161E7C03060E7C83D200A3507C891652  ..|...|.P|.R
7CA3497C89164B7CB82000F726117C8B  |I|.K| .&.|
1E0B7C03C348F7F30106497C83164B7C  ..|.H..I|.K|
00BB00058B16527CA1507CE89200721D  ....R|P|.r.
B001E8AC0072168BFBB90B00BEDF7DF3  ..r...}
A6750A8D7F20B90B00F3A67418BE9E7D  u. ..t.}
E85F0033C0CD165E1F8F048F4402CD19  _.3.^..D..
585858EBE88B471A48488A1E0D7C32FF  XXXG.HH..|2
F7E30306497C13164B7CBB0007B90300  ..I|..K|....
505251E83A0072D8B001E85400595A58  PRQ:.rذ.T.YZX
72BB05010083D200031E0B7CE2E28A2E  r.......|.
157C8A16247C8B1E497CA14B7CEA0000  .|.$|.I|K|..
7000AC0AC07429B40EBB0700CD10EBF2  p..t)....
3B16187C7319F736187CFEC288164F7C  ;..|s.6.|.O|
33D2F7361A7C8816257CA34D7CF8C3F9  36.|.%|M|
C3B4028B164D7CB106D2E60A364F7C8B  ô..M|..6O|
CA86E98A16247C8A36257CCD13C30D0A  ʆ.$|6%|...
4B65696E2053797374656D206F646572  Kein System oder
204C6175667765726B736665686C6572   Laufwerksfehler
0D0A5765636873656C6E20756E642054  ..Wechseln und T
6173746520647281636B656E0D0A0049  aste drcken...I
4F2020202020205359534D53444F5320  O      SYSMSDOS 
202053595300000000000000000055AA    SYS.........U

Current Sector 32

ds+ zeigt dann den Sektor 33 an. ds- den Sektor 31.
ds ohne Parameter zeigt den Sektor einfach nochmal.
Die Meldung "Current Sector ..." erscheint nicht wenn
Echo ausgeschaltet ist. Siehe e Befehl.

#########################################################
b0,b1   send sectors binary b1=on b0=off
#########################################################
Grundeinstellung: Binary off = ASCII-HEX Listing

Der Binrmode ist dafr da wenn man die Daten schnell mit einem
geeigneten Programm auslesen will. Er ist dreimal schneller als ASCII-HEX.
bx gibt keine Meldung aus wenn Echo ausgeschaltet ist. Siehe ex Befehl.

#########################################################
e0,e1   echo e1=on e0=off
#########################################################
Grundeinstellung: Echo on

Echo off schaltet die meisten Meldungen und den Prompt aus.
Das ist ntzlich wenn man z.B. automatisch mit Befehlen
eine ganze Reihe von Sektoren im Binrmode auslesen will. 

#########################################################
ws[nr]   write sector[nr]
#########################################################
Beschreibt einen Sektor im CF. Nach dem Befehl werden 512
Bytes Daten auf der seriellen Schnittstelle erwartet. Die
Daten mssen im Binrmodus gesendet werden. Also kein
HEX-Listing.

#########################################################
ts[nr]  test read sector0 for [nr]times to RAM
#########################################################
Liest in einer Schleife [nr] mal den Sektor 0 ins RAM.
Zum messen der maximalen Lesegeschwindigkeit.

---------------------------------------------------------
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Hier fangen die Dateisystem Befehle an
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
---------------------------------------------------------

#########################################################
r       change to root directory and show it
#########################################################
Zeigt das ROOT Verzeichnis an. Siehe auch ls.

#########################################################
ls      list current directory
#########################################################
Gibt ein Listing vom aktuellen Verzeichnis aus. Ausgabe:

>ls
F IO      .SYS RSH-  31.05.94  06:22     41055  Clu:         3
F MSDOS   .SYS RSH-  31.05.94  06:22     38186  Clu:        24
F COMMAND .COM R---  31.05.94  06:22     57377  Clu:        41
D DCIM    .    ----  14.04.03  13:00 <DIR>      Clu:      7892
V HITACHI .    ---A <VOL>
F GPSREA~1.EXE ---A  19.11.02  13:19    125440  Clu:       446
F KERNEL  .    ---A  16.01.02  22:52    458824  Clu:        68
F LINUX   .BAT ---A  06.09.01  11:10        78  Clu:       348
F LOADLIN .EXE ---A  24.01.97  00:32     32177  Clu:       349
F OPT     .TGZ ---A  28.01.02  01:41    278041  Clu:       293
F ROOTFS  .GZ  ---A  07.06.01  13:52    331581  Clu:       593
F AUTOEXEC.BAT ---A  10.01.02  00:35         7  Clu:         2
F CDROM   .SYS ---A  22.03.00  13:35     24710  Clu:       508
D TRACKS  .    ----  06.01.03  16:24 <DIR>      Clu:       521


Sieht doch schon fast aus wie ein DIR Befehl, oder ?

Der erste Buchstabe in der Zeile gibt an um was es sich handelt:
F = Datei (File)
D = Verzeichnis (Directory)
V = Laufwerksname (Volume)
L = Long name ( ??? siehe lo Befehl)

Ganz hinten steht die Clusternummer die fr einige Befehle
gebraucht wird.

#########################################################
cd[name]  change dir [name]
#########################################################
Mit cd[name] kann man in ein Unterverzeichnis oder in ein hheres
Verzeichnis wechseln. Z.B. in TRACKS. Gro/Kleinschreibung ist
dabei egal, obwohl es mglich wre danach zu unterscheiden ;)
cd.. wechselt in das hhere Verzeichnis wenn eins existiert.

>cdtracks
Found
521

>ls
D .       .    ----  06.01.03  16:24 <DIR>      Clu:       521
D ..      .    ----  06.01.03  16:24 <DIR>      Clu:         0
D DUISBURG.    ----  06.01.03  16:25 <DIR>      Clu:       522
D HENDLM~1.    ----  06.01.03  16:25 <DIR>      Clu:      3417
D JENS    .    ----  06.01.03  16:25 <DIR>      Clu:      3738
D JOERN   .    ----  06.01.03  16:26 <DIR>      Clu:      5573
D JOHANN~1.    ----  06.01.03  16:26 <DIR>      Clu:      7259
D SEVENH~1.    ----  06.01.03  16:26 <DIR>      Clu:      7388
D TODO    .    ----  06.01.03  16:26 <DIR>      Clu:      7594


Wenn das Verzeichnis gefunden wurde kommt diese Meldung wenn Echo
eingeschaltet ist:

Found
521


Die Nummer ist die Clusternummer vom ersten Cluster des Verzeichnisses.

Wechseln wir gleich noch in das Verzeichnis TODO:

>cdtodo
Found
7594

>ls
D .       .    ----  06.01.03  16:26 <DIR>      Clu:      7594
D ..      .    ----  06.01.03  16:26 <DIR>      Clu:       521
F 0032_0~1.GPS ---A  13.11.02  13:45     94768  Clu:      7595
F 0033_0~1.GPS ---A  03.12.02  12:16    152872  Clu:      7642
F 0044_0~1.GPS ---A  03.12.02  12:16     91552  Clu:      7717
F 0047_0~1.GPS ---A  03.12.02  12:16    112136  Clu:      7762
F 0054_0~1.GPS ---A  03.12.02  12:16    152928  Clu:      7817


Da liegen dann auch ein paar Dateien rum an denen man den
lo Befehl erklren kann.

#########################################################
l0,l1      show long filename entrys on/off
#########################################################
Grundeinstellung: Off

Geben wir mal l1 und danach ls ein:

>l1
>ls
D .       .    ----  06.01.03  16:26 <DIR>      Clu:      7594
D ..      .    ----  06.01.03  16:26 <DIR>      Clu:       521
L .gps
L 0032_02_11_13
F 0032_0~1.GPS ---A  13.11.02  13:45     94768  Clu:      7595
L .gps
L 0033_02_12_03
F 0033_0~1.GPS ---A  03.12.02  12:16    152872  Clu:      7642
L .gps
L 0044_02_12_03
F 0044_0~1.GPS ---A  03.12.02  12:16     91552  Clu:      7717
L .gps
L 0047_02_12_03
F 0047_0~1.GPS ---A  03.12.02  12:16    112136  Clu:      7762
L .gps
L 0054_02_12_03
F 0054_0~1.GPS ---A  03.12.02  12:16    152928  Clu:      7817


Wie sieht das denn aus ? Mit l1 werden die Eintrge fr
lange Dateinamen (L) angezeigt. Der DOS Name 0032_0~1.GPS
heit unter Win 0032_02_11_13.gps.  

Tippt man l0 und ls sind die L-Eintrge wieder weg.

#########################################################
cs[nr]  set cluster and current sector to beginning of cluster[nr]
#########################################################
Mit diesem Befehl kann man sich gezielt Sektoren einer Datei
oder eines Verzeichnisses ansehen. Tippt man cs7595 und danach
ds hat man den ersten Sektor der Datei 0032_0~1.GPS auf dem
Bildschirm. Siehe oben.

Oder den ersten Sektor des aktuellen Verzeichnisses:

cs7594

Current Cluster 7594 Sector 30555

>ds
2E202020202020202020201000534E83  .          ..SN
262E262E00004F83262EAA1D00000000  &.&...O&......
2E2E2020202020202020201000534E83  ..         ..SN
262E262E00004F83262E090200000000  &.&...O&.......
422E0067007000730000000F0071FFFF  B..g.p.s.....q
FFFFFFFFFFFFFFFFFFFF0000FFFFFFFF  ..
0130003000330032005F000F00713000  .0.0.3.2._...q0.
32005F00310031005F00000031003300  2._.1.1._...1.3.
303033325F307E314750532000584E83  0032_0~1GPS .XN
262E262E0000A26D6D2DAB1D30720100  &.&...mm-.0r..
422E0067007000730000000F00C7FFFF  B..g.p.s.....
FFFFFFFFFFFFFFFFFFFF0000FFFFFFFF  ..
0130003000330033005F000F00C73000  .0.0.3.3._...0.
32005F00310032005F00000030003300  2._.1.2._...0.3.
303033335F307E314750532000934E83  0033_0~1GPS .N
262E262E00000D62832DDA1D28550200  &.&....b-.(U..
422E0067007000730000000F00CAFFFF  B..g.p.s.....
FFFFFFFFFFFFFFFFFFFF0000FFFFFFFF  ..
0130003000340034005F000F00CA3000  .0.0.4.4._...0.
32005F00310032005F00000030003300  2._.1.2._...0.3.
303034345F307E314750532000274F83  0044_0~1GPS .'O
262E262E00000E62832D251EA0650100  &.&....b-%.e..
422E0067007000730000000F001CFFFF  B..g.p.s......
FFFFFFFFFFFFFFFFFFFF0000FFFFFFFF  ..
0130003000340037005F000F001C3000  .0.0.4.7._....0.
32005F00310032005F00000030003300  2._.1.2._...0.3.
303034375F307E3147505320005F4F83  0047_0~1GPS ._O
262E262E00000F62832D521E08B60100  &.&....b-R....
422E0067007000730000000F00C3FFFF  B..g.p.s.....
FFFFFFFFFFFFFFFFFFFF0000FFFFFFFF  ..
0130003000350034005F000F00C33000  .0.0.5.4._...0.
32005F00310032005F00000030003300  2._.1.2._...0.3.

Current Sector 30555

#########################################################
nc      next cluster
#########################################################
Wenn man mit cs den aktuellen Cluster auf den Beginn einer
Datei gesetzt hat zeigt nc an welcher Cluster als nchster
zur Datei gehrt. Nochmal nc zeigt den dritten usw. Damit
kann man sich alle Cluster anzeigen lassen die zu einer
Datei oder einem Verzeichnis gehren:

cs7595

Current Cluster 7595 Sector 30559

>nc
Current Cluster 7596 0x1DAC

>nc
Current Cluster 7597 0x1DAD

>nc
Current Cluster 7598 0x1DAE

Die Reihenfolge der Clusternummern mu nicht aufsteigend sein !
Das knnte auch so aussehen 330, 498, 231, .....

Der letzte Cluster liefert bei:
FAT12 0xFF8      - 0xFFF
FAT16 0xFFF8     - 0xFFFF
FAT32 0x0FFFFFF8 - 0x0FFFFFFF

#########################################################
cc[nr]   send cluster chain for cluster [nr]
#########################################################
Sendet alle Clusternummern die zu einer ClusterChain gehren.
[nr] ist der Startcluster der Clusterchain. Am Ende wird
ausgegeben wieviel Cluster belegt sind und wieviele Bytes
das sind.

#########################################################
df[nr]  download file [name] with ReadFileRaw()
#########################################################
Mit df kann man eine komplette Datei runterladen. Genauer gesagt
alle Cluster einer Datei. Der letzte Cluster enthlt oft nur
noch einen kleinen Rest der Datei. Er wird aber komplett gesendet !
ber die Dateigre mu man dann selbst checken wieviel vom Inhalt des
letzten Clusters noch zur Datei gehrt.

df benutzt ReadFileRaw(). Das ist bis zu 7 mal schneller als fread()
und kommt fast an die Lesegeschwindigkeiten oben ran.

Das ganze geht im ASCII-HEX Mode oder binr. Siehe bx Befehl.

#########################################################
rf[name] read file[name] with fread()
#########################################################
Liest die Datei [name] mit fread(). Leider nicht besonders
schnell. Nur ungefhr ein siebtel von den Lesegeschwindigkeiten
oben. Dafr ist fread() flexibler zu benutzen als ReadFileRaw().

#########################################################
fo[name] open file [name] and write/append 120000 Bytes
#########################################################
ffnet eine Datei [name] und schreibt 120000 Bytes rein wenn
gengend Platz auf dem CF ist. Wenn die Datei nicht existiert
wird eine neue erzeugt. Wenn sie existiert werden 120000 Bytes
hinten drangehngt ("Hello World\n").

Beispiel:

fotest.txt erzeugt eine neue Datei TEST.TXT mit 120000 Bytes.
Nochmal fotest.txt hngt 120000 Bytes dran. Das kann man beliebig
oft wiederholen bis der CF voll ist.

Die korrekte Funktion der Schreibroutinen wurde mit fo getestet.
Vorgehensweise: Mit einer Digitalkamera ein paar Fotos auf den
leeren CF bringen. Dann mit fo mehrere Dateien in verschiedenen
Verzeichnissen erzeugen. Wieder ein paar Fotos schieen. Neue
Dateien mit fo erzeugen und bereits erzeugte vergrern. Das ganze
immer abwechselnd bis der CF voll ist. Zur Kontrolle dann alle Bilder
ansehen. Wenn irgendwo ein falscher Cluster belegt worden wre htte
es Fehler in den Bildern geben knnen. Gab es aber nicht. Zum Einsatz
kam ein 16MB CF mit FAT12 und ein 32MB CF mit FAT16. Scheint also
gut zu funktionieren. Genauer prfen knnte man das mit einem
CF zu IDE Adapter. Damit dann einfach Scandisk ausfhren. 

Das wars erstmal. Es gibt sicher noch das eine oder andere zu verbessern.
Viele kleine Funktionen knnten noch optimiert werden um Programmspeicher
zu sparen oder das Tempo zu erhhen. Bis jetzt belegt das Programm ca.
15kB Speicher. Man kann aber ne ganze Menge rausschmeien. Z.B. die
ganzen Rckmeldungen per serieller Schnittstelle. Das Hilfemen usw..

Nachbau und Benutzung wie immer auf eigene Gefahr.

Viel Spa damit
holger.klabunde@t-online.de
http://home.t-online.de/home/holger.klabunde/homepage.htm
 