Source file: /~heha/basteln/PC/usbfloppy/usbfloppy.zip/ufi.h

#pragma once
#include "usb.h"	// byte

#define LUNS 1

struct Drive{
 byte type;	// L: Bit 0: 0=300, 1=360: 8=8", 4,5=5¼", 3=3½", 80=QIC80, 0 = kein Laufwerk angeschlossen
 byte speed;	// D: 0=ED, 1=HD, 2=DD, 3=SD
 byte heads;	// L: Köpfe (2)
 byte tracks;	// L: Spuren (80)
 bool mediumpresent;	// 0 = kein Medium
 char track;	// l: aktuelle Spur
 char motto;	// l: Motor-Timeout (via Zeitgeber-Interrupt)
 inline unsigned rotationrate() const {return type&1?360:300;}
// inline byte index() const;		// Ermittelt Index (0-basiert) in der drives-Tabelle (Division??)
};

// Aktuelles (prozedurübergreifendes) Laufwerk
//register Drive*dp asm("r6");

// Disketten-Parameter (mit oder ohne Unterstützung einseitiger Disketten?)
extern struct Disk{
 Drive d;
 byte index;
 unsigned sectorlength;	// D: Sektorlänge
 unsigned transferrate;	// D: HD: 500, DD: 250 oder 300, SD: 125 oder 150?
 byte sectors;	// D: Sektoren pro Umlauf (17?)
 byte heads;	// normalerweise == drive.heads
 byte tracks;	// normalerweise == drive.tracks
 byte density;	// D: 0=ED, 1=HD, 2=DD, 3=SD
// byte drive;	// Laufwerk, 1-basiert
 byte sense[3];	// s: Sense Key (0..15), Additional Sense Code (0..FF), ASC Qualifier (0..FF)
 inline unsigned numberblocks() const {return sectors*heads*tracks;}
// inline byte index() const;		// Ermittelt Index (0-basiert) in der disks-Tabelle (Division??)
 void error(unsigned e) {sense[0]=e>>8; sense[1]=e&0xFF;}	// Fehler (ohne ASCQ) setzen
 static void poweron();
}disks[5];

// Aktueller (prozedurübergreifender) Diskettenparameterblock
register Disk*dp asm("r4");

extern "C" int readwrite(byte);
void usbPollEP2();
Detected encoding: UTF-80