]> Shamusworld >> Repos - apple2/blob - src/floppy.h
969ca0c8dfc2eb00e0ff447b599b9365c84ccd81
[apple2] / src / floppy.h
1 //
2 // Apple 2 floppy disk support
3 //
4
5 #ifndef __FLOPPY_H__
6 #define __FLOPPY_H__
7
8 // MAX_PATH isn't defined in stdlib.h on *nix, so we do it here...
9 #ifdef __GCCUNIX__
10 #include <limits.h>
11 #define MAX_PATH                _POSIX_PATH_MAX
12 #else
13 #include <stdlib.h>                                                             // for MAX_PATH on MinGW/Darwin
14 #endif
15 #include <stdint.h>
16
17 enum { DT_UNKNOWN, DT_DOS33, DT_DOS33_HDR, DT_PRODOS, DT_NYBBLE };
18 enum { DLS_OFF, DLS_READ, DLS_WRITE };
19
20 class FloppyDrive
21 {
22         public:
23                 FloppyDrive();
24                 ~FloppyDrive();
25
26                 bool LoadImage(const char * filename, uint8_t driveNum = 0);
27                 bool SaveImage(uint8_t driveNum = 0);
28                 bool SaveImageAs(const char * filename, uint8_t driveNum = 0);
29                 void CreateBlankImage(uint8_t driveNum = 0);
30                 void SwapImages(void);
31                 const char * ImageName(uint8_t driveNum = 0);
32                 void EjectImage(uint8_t driveNum = 0);
33                 bool IsEmpty(uint8_t driveNum = 0);
34                 bool IsWriteProtected(uint8_t driveNum = 0);
35                 void SetWriteProtect(bool, uint8_t driveNum = 0);
36                 int DriveLightStatus(uint8_t driveNum = 0);
37
38                 // I/O functions ($C0Ex accesses)
39
40                 void ControlStepper(uint8_t addr);
41                 void ControlMotor(uint8_t addr);
42                 void DriveEnable(uint8_t addr);
43                 uint8_t ReadWrite(void);
44                 uint8_t GetLatchValue(void);
45                 void SetLatchValue(uint8_t value);
46                 void SetReadMode(void);
47                 void SetWriteMode(void);
48
49         protected:
50                 void DetectImageType(const char * filename, uint8_t driveNum);
51                 void NybblizeImage(uint8_t driveNum);
52                 void DenybblizeImage(uint8_t driveNum);
53
54         private:
55                 char imageName[2][MAX_PATH];
56                 uint8_t * disk[2];
57                 uint32_t diskSize[2];
58                 uint8_t diskType[2];
59                 bool imageDirty[2];
60                 bool writeProtected[2];
61                 uint8_t motorOn;
62                 uint8_t activeDrive;
63                 uint8_t ioMode;
64                 uint8_t latchValue;
65                 uint8_t phase;
66                 uint8_t track;
67                 bool ioHappened;
68
69                 uint8_t nybblizedImage[2][232960];
70                 uint32_t currentPos;
71
72                 // And here are some private class variables (to reduce function redundancy):
73                 static uint8_t header[21];
74                 static uint8_t doSector[16];
75                 static uint8_t poSector[16];
76                 static char nameBuf[MAX_PATH];
77 };
78
79 #endif  // __FLOPPY_H__