]> Shamusworld >> Repos - apple2/blob - src/floppydrive.h
Miscellaneous bugfixes.
[apple2] / src / floppydrive.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
20 #include <stdint.h>
21 #include <stdio.h>
22
23 enum { DT_EMPTY = 0, DT_WOZ, DT_DOS33, DT_DOS33_HDR, DT_PRODOS, DT_NYBBLE,
24         DFT_UNKNOWN };
25 enum { DLS_OFF, DLS_READ, DLS_WRITE };
26
27 class WOZ2;
28
29 class FloppyDrive
30 {
31         public:
32                 FloppyDrive();
33                 ~FloppyDrive();
34
35                 bool LoadImage(const char * filename, uint8_t driveNum = 0);
36                 bool SaveImage(uint8_t driveNum = 0);
37                 bool SaveImageAs(const char * filename, uint8_t driveNum = 0);
38                 void CreateBlankImage(uint8_t driveNum = 0);
39                 void SwapImages(void);
40                 const char * ImageName(uint8_t driveNum = 0);
41                 void EjectImage(uint8_t driveNum = 0);
42                 bool IsEmpty(uint8_t driveNum = 0);
43                 bool IsWriteProtected(uint8_t driveNum = 0);
44                 void SetWriteProtect(bool, uint8_t driveNum = 0);
45                 int DriveLightStatus(uint8_t driveNum = 0);
46                 void SaveState(FILE *);
47                 void LoadState(FILE *);
48
49         private:
50                 uint32_t ReadLong(FILE *);
51                 void WriteLong(FILE *, uint32_t);
52
53                 // I/O functions ($C0Ex accesses)
54
55         public:
56                 void ControlStepper(uint8_t addr);
57                 void ControlMotor(uint8_t addr);
58                 void DriveEnable(uint8_t addr);
59                 void SetShiftLoadSwitch(uint8_t state);
60                 void SetReadWriteSwitch(uint8_t state);
61                 uint8_t DataRegister(void);
62                 void DataRegister(uint8_t);
63                 void RunSequencer(uint32_t);
64
65         protected:
66                 void DetectImageType(const char * filename, uint8_t driveNum);
67                 void WriteBits(uint8_t * dest, const uint8_t * src, uint16_t bits, uint16_t * start);
68                 void WOZifyImage(uint8_t driveNum);
69
70         private:
71                 char imageName[2][MAX_PATH];
72                 uint8_t * disk[2];
73                 uint32_t diskSize[2];
74                 uint8_t diskType[2];
75                 bool imageDirty[2];
76                 uint8_t motorOn;
77                 uint8_t activeDrive;
78                 uint8_t ioMode;
79         public: // temp, for testing...  :-P
80                 uint8_t dataRegister;
81         private:
82                 uint8_t phase[2];
83                 uint8_t headPos[2];
84                 bool ioHappened;
85                 bool diskImageReady;
86
87                 uint32_t currentPos[2];
88
89                 uint8_t cpuDataBus;
90                 uint8_t slSwitch;               // Shift/Load soft switch
91                 uint8_t rwSwitch;               // Read/Write soft switch
92                 uint8_t readPulse;              // Disk read head "pulse" signal
93                 uint8_t pulseClock;             // Disk read head bitstream "pulse clock"
94                 uint8_t sequencerState;
95                 uint32_t driveOffTimeout;
96                 uint8_t zeroBitCount;
97                 uint16_t trackLength[2];
98 //              uint8_t pulseTiming;    // WOZ disk "optimal" pulse timing (in 0.25µs)
99                 uint8_t window;
100 };
101
102 // Exported functions/variables
103 void InstallFloppy(uint8_t slot);
104 extern FloppyDrive floppyDrive[];
105 extern char sequence[];
106
107 #endif  // __FLOPPY_H__
108