]> Shamusworld >> Repos - apple2/blob - src/floppy.h
2a25505ae4c52177d34288b03177dffea7d5a9a4
[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 // Kludge for Win64
15 #ifndef MAX_PATH
16 #define MAX_PATH        _MAX_PATH
17 #endif
18 #endif
19 #include <stdint.h>
20 #include <stdio.h>
21
22 enum { DFT_UNKNOWN, DT_DOS33, DT_DOS33_HDR, DT_PRODOS, DT_NYBBLE };
23 enum { DLS_OFF, DLS_READ, DLS_WRITE };
24
25 class FloppyDrive
26 {
27         public:
28                 FloppyDrive();
29                 ~FloppyDrive();
30
31                 bool LoadImage(const char * filename, uint8_t driveNum = 0);
32                 bool SaveImage(uint8_t driveNum = 0);
33                 bool SaveImageAs(const char * filename, uint8_t driveNum = 0);
34                 void CreateBlankImage(uint8_t driveNum = 0);
35                 void SwapImages(void);
36                 const char * ImageName(uint8_t driveNum = 0);
37                 void EjectImage(uint8_t driveNum = 0);
38                 bool IsEmpty(uint8_t driveNum = 0);
39                 bool IsWriteProtected(uint8_t driveNum = 0);
40                 void SetWriteProtect(bool, uint8_t driveNum = 0);
41                 int DriveLightStatus(uint8_t driveNum = 0);
42                 void SaveState(FILE *);
43                 void LoadState(FILE *);
44
45         private:
46                 uint32_t ReadLong(FILE *);
47                 void WriteLong(FILE *, uint32_t);
48
49                 // I/O functions ($C0Ex accesses)
50
51         public:
52                 void ControlStepper(uint8_t addr);
53                 void ControlMotor(uint8_t addr);
54                 void DriveEnable(uint8_t addr);
55                 uint8_t ReadWrite(void);
56                 uint8_t GetLatchValue(void);
57                 void SetLatchValue(uint8_t value);
58                 void SetReadMode(void);
59                 void SetWriteMode(void);
60
61         protected:
62                 void DetectImageType(const char * filename, uint8_t driveNum);
63                 void NybblizeImage(uint8_t driveNum);
64                 void DenybblizeImage(uint8_t driveNum);
65
66         private:
67                 char imageName[2][MAX_PATH];
68                 uint8_t * disk[2];
69                 uint32_t diskSize[2];
70                 uint8_t diskType[2];
71                 bool imageDirty[2];
72                 bool writeProtected[2];
73                 uint8_t motorOn;
74                 uint8_t activeDrive;
75                 uint8_t ioMode;
76                 uint8_t latchValue;
77                 uint8_t phase;
78                 uint8_t track;
79                 bool ioHappened;
80
81                 uint8_t nybblizedImage[2][232960];
82                 uint32_t currentPos;
83
84                 // And here are some private class variables (to reduce function redundancy):
85                 static uint8_t header[21];
86                 static uint8_t doSector[16];
87                 static uint8_t poSector[16];
88                 static char nameBuf[MAX_PATH];
89 };
90
91 #endif  // __FLOPPY_H__