asm (".set Reset,      0x7001");
asm (".set SD_init,    0x7003");
asm (".set initFAT,    0x7005");
asm (".set rdfile,     0x7007");
asm (".set scandir,    0x7009");
asm (".set delay_loop, 0x700b");
asm (".set U0putch,    0x700d");
asm (".set U0puts,     0x700f");

asm (".set SDvars, 0x10000000");
asm (".set FATvar, 0x10000008");
asm (".set FATbuf, 0x10000028");

// Variables del bootloader SD
extern u8 FATbuf[512];
extern struct {
	u32 storage_begin;	// primer cluster del área de datos
	u32 fat1_begin;		// primer sector de la FAT1
	u32 root_cluster;	// primer cluster del dierectorio raiz (FAT32)
	u32 root_sector;	// primer sector del directorio root (FAT16)
	u32 last_cluster;	// último cluster buscado en la FAT

	u32 filelen;		// Tamaño de fichero en bytes
	u32 filecluster;	// Cluster actual del fichero

	u8 l2spc;			// log2(sectores por cluster)
	u8 fat_type;		// FAT32 o FAT16
	u8 root_nsector;	// nº de sectores en dir raiz (FAT16)

	u8 filesector;		// sector dentro del cluster
} FATvar;

extern struct {
	u32 res32;			// 32-bit response to commands
	u16 waitresp;		// max waiting for cmd response
	u8 SDHC_flag;		// false: byte addresses, true: sector addresses
} SDvars;

enum {
	FAT16,
	FAT32,
};

// Funciones del bootloader SD
void Reset();
u32 SD_init();
u32 initFAT();
u32 rdfile(u8 *buf);
u32 scandir(u8 *fname, u32 cluster);
void delay_loop(unsigned int d);
void U0putch(int d);
void U0puts(u8 *p);

