forked from dhansel/ArduinoFDC
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathArduinoFDC.h
140 lines (111 loc) · 5.06 KB
/
ArduinoFDC.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
// -----------------------------------------------------------------------------
// 3.5"/5.25" DD/HD Disk controller for Arduino
// Copyright (C) 2021 David Hansel
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software Foundation,
// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
// -----------------------------------------------------------------------------
#ifndef ARDUINOFDC_H
#define ARDUINOFDC_H
#include "Arduino.h"
// return status for readSector/writeSector and formatDisk functions
#define S_OK 0 // no error
#define S_NOTINIT 1 // ArduinoFDC.begin() was not called
#define S_NOTREADY 2 // Drive is not ready (no disk or power)
#define S_NOSYNC 3 // No sync marks found
#define S_NOHEADER 4 // Sector header not found
#define S_INVALIDID 5 // Sector data record has invalid id
#define S_CRC 6 // Sector data checksum error
#define S_NOTRACK0 7 // No track0 signal
#define S_VERIFY 8 // Verify after write failed
#define S_READONLY 9 // Attempt to write to a write-protected disk
class ArduinoFDCClass
{
public:
enum DriveType {
DT_5_DD, // 5.25" double density (360 KB)
DT_5_DDonHD, // 5.25" double density disk in high density drive (360 KB)
DT_5_HD, // 5.25" high density (1.2 MB)
DT_3_DD, // 3.5" double density (720 KB)
DT_3_HD // 3.5" high density (1.44 MB)
};
enum DensityPinMode {
DP_DISCONNECT = 0, // density pin disconnected (set to INPUT mode)
DP_OUTPUT_LOW_FOR_HD, // density pin goes LOW for high density disk
DP_OUTPUT_LOW_FOR_DD // density pin goes LOW for double density disk
};
ArduinoFDCClass();
// Initialize pins used for controlling the disk drive
void begin(enum DriveType driveAType = DT_3_HD, enum DriveType driveBType = DT_3_HD);
// Release pins used for controlling the disk drive
void end();
// Select drive A(0) or B(1).
bool selectDrive(byte drive);
// Returns which drive is currently selected, A (0) or B (1)
byte selectedDrive() const;
// set the drive type for the currently selected drive
void setDriveType(enum DriveType type);
// get the type of the currently selected drive
enum DriveType getDriveType() const;
// returns true if a disk is detected in the drive
bool haveDisk() const;
// returns true if the disk is write protected
bool isWriteProtected() const;
// get number of tracks for the currently selected drive
byte numTracks() const;
// get number of sectors for the currently selected drive
byte numSectors() const;
// set the density pin mode for the currently selected drive
void setDensityPinMode(enum DensityPinMode mode);
// Read a sector from disk,
// buffer MUST have a size of at least 516 bytes.
// IMPORTANT: On successful return, the 512 bytes of sector data
// read will be in buffer[1..512] (NOT: 0..511!)
// See error codes above for possible return values
byte readSector(byte track, byte side, byte sector, byte *buffer);
// Write a sector to disk,
// buffer MUST have a size of at least 516 bytes.
// IMPORTANT: The 512 bytes of sector data to be written
// must be in buffer[1..512] (NOT: 0..511!)
// if "verify" is true then the data will be re-read after writing
// and compared to the data just written.
// See error codes above for possible return values
byte writeSector(byte track, byte side, byte sector, byte *buffer, bool verify);
// Formats a disk
// buffer is needed to store temporary data while formatting and MUST have
// a size of at least 144 bytes.
// All sector data is initialized with 0xF6.
// See error codes above for possible return values
// IMPORTANT: No DOS file system is initialized, i.e. DOS or Windows
// will NOT recognize this as a valid disk
byte formatDisk(byte *buffer, byte fromTrack=0, byte toTrack=255);
// Turn the disk drive motor on. The readSector/writeSector/formatDisk
// functions will turn on the motor automatically if it is not running
// yet. In that case (and ONLY then) they will also turn it off when finished.
void motorOn();
// Turn the disk drive motor off
void motorOff();
// Returns true if the disk drive motor is currently running
bool motorRunning() const;
private:
void driveSelect(bool state) const;
void setDensityPin();
byte getBitLength();
enum DriveType m_driveType[2];
enum DensityPinMode m_densityPinMode[2];
byte m_currentDrive, m_bitLength[2];
bool m_initialized, m_motorState[2];
};
extern ArduinoFDCClass ArduinoFDC;
#endif