#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();
Vorgefundene Kodierung: UTF-8 | 0
|