| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 | #include <stdbool.h>#include <stddef.h>#include <string.h>#include <stdio.h>#include "fw.h"#include "ff.h"#include "io.h"#include "console.h"#define MAX_FAST_FRAGMENTS 16/* Extend these with a lot more stuff */#define CLTBL_SIZE ((MAX_FAST_FRAGMENTS+1)*2)struct drive {    FIL fp;    DWORD cltbl[CLTBL_SIZE];    bool mounted;};#define MAX_DRIVES 8		/* Drives per controller */struct disk_type {    char name[4];    struct drive drive[MAX_DRIVES];};#define DISK_TYPES 4static struct disk_type __attribute__((section(".dram.bss"))) disks[DISK_TYPES];static const char disk_names[][4] = { "hd", "sf", "mf", "mo" };/* * Look for ABC/UFD-DOS disks and open them */void mount_abcdrives(void){    char filename_buf[64];    unsigned int type;    unsigned int drive;    int whichabc = (ABC_STATUS & ABC_STATUS_800) ? 800 : 80;    FRESULT rv;    for (type = 0; type < DISK_TYPES; type++) {	memcpy(disks[type].name, disk_names[type], 4);	for (drive = 0; drive < MAX_DRIVES; drive++) {	    struct drive *drv = &disks[type].drive[drive];	    drv->mounted = false;	    snprintf(filename_buf, sizeof filename_buf,		     "/abcdisk.%d/%s%u",		     whichabc, disks[type].name, drive);	    rv = f_open(&drv->fp, filename_buf,			FA_READ|FA_WRITE|FA_OPEN_EXISTING);	    if (rv != FR_OK) {		snprintf(filename_buf, sizeof filename_buf,			 "/abcdisk/%s%u",			 disks[type].name, drive);		rv = f_open(&drv->fp, filename_buf,			    FA_READ|FA_WRITE|FA_OPEN_EXISTING);	    }	    if (rv != FR_OK)		continue;	    drv->mounted = true;	    con_printf("%s%u: mounted %s\n", disks[type].name, drive,		       filename_buf);	    /* Try to create memoized extent lists */	    drv->cltbl[0] = CLTBL_SIZE;	    drv->fp.cltbl = drv->cltbl;	    rv = f_lseek(&drv->fp, CREATE_LINKMAP);	    if (rv != FR_OK) {		con_printf("%s%u: warning: file too fragmented, will be slow\n",			   disks[type].name, drive);	    }	}    }}
 |