]> Shamusworld >> Repos - apple2/blob - src/floppy.h
12b5e98453d9d925d2f3556b0540252a523a3696
[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
19 class FloppyDrive
20 {
21         public:
22                 FloppyDrive();
23                 ~FloppyDrive();
24
25                 bool LoadImage(const char * filename, uint8_t driveNum = 0);
26                 bool SaveImage(uint8_t driveNum = 0);
27                 bool SaveImageAs(const char * filename, uint8_t driveNum = 0);
28                 void CreateBlankImage(uint8_t driveNum = 0);
29                 void SwapImages(void);
30                 const char * GetImageName(uint8_t driveNum = 0);
31                 void EjectImage(uint8_t driveNum = 0);
32                 bool DriveIsEmpty(uint8_t driveNum = 0);
33                 bool DiskIsWriteProtected(uint8_t driveNum = 0);
34                 void SetWriteProtect(bool, uint8_t driveNum = 0);
35
36                 // I/O functions ($C0Ex accesses)
37
38                 void ControlStepper(uint8_t addr);
39                 void ControlMotor(uint8_t addr);
40                 void DriveEnable(uint8_t addr);
41                 uint8_t ReadWrite(void);
42                 uint8_t GetLatchValue(void);
43                 void SetLatchValue(uint8_t value);
44                 void SetReadMode(void);
45                 void SetWriteMode(void);
46
47         protected:
48                 void DetectImageType(const char * filename, uint8_t driveNum);
49                 void NybblizeImage(uint8_t driveNum);
50                 void DenybblizeImage(uint8_t driveNum);
51
52         private:
53                 char imageName[2][MAX_PATH];
54                 uint8_t * disk[2];
55                 uint32_t diskSize[2];
56                 uint8_t diskType[2];
57                 bool imageDirty[2];
58                 bool writeProtected[2];
59                 uint8_t motorOn;
60                 uint8_t activeDrive;
61                 uint8_t ioMode;
62                 uint8_t latchValue;
63                 uint8_t phase;
64                 uint8_t track;
65
66                 uint8_t nybblizedImage[2][232960];
67                 uint32_t currentPos;
68
69                 // And here are some private class variables (to reduce function redundancy):
70                 static uint8_t header[21];
71                 static uint8_t doSector[16];
72                 static uint8_t poSector[16];
73                 static char nameBuf[MAX_PATH];
74 };
75
76 #endif  // __FLOPPY_H__