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