1 /*
2   Hatari - fdc.h
3 
4   This file is distributed under the GNU General Public License, version 2
5   or at your option any later version. Read the file gpl.txt for details.
6 */
7 
8 #ifndef HATARI_FDC_H
9 #define HATARI_FDC_H
10 
11 
12 /* Values for the Size byte in the Address Field of a sector */
13 #define	FDC_SECTOR_SIZE_MASK			0x03		/* Only bits 0-1 of the Sector size in the ID field are used by the WD1772 */
14 
15 #define	FDC_SECTOR_SIZE_128			0		/* Sector size used in the ID fields */
16 #define	FDC_SECTOR_SIZE_256			1
17 #define	FDC_SECTOR_SIZE_512			2
18 #define	FDC_SECTOR_SIZE_1024			3
19 
20 
21 /* These are some standard GAP values to format a track with 9 or 10 sectors */
22 /* When handling ST/MSA disk images, those values are required to get accurate */
23 /* timings when emulating disk's spin and index's position. */
24 /* Those values are also use to build standard sector in STX disk images when */
25 /* track contains only the sector data and no sector info. */
26 #define	FDC_TRACK_LAYOUT_STANDARD_GAP1		60		/* Track Pre GAP : 0x4e */
27 #define	FDC_TRACK_LAYOUT_STANDARD_GAP2		12		/* Sector ID Pre GAP : 0x00 */
28 #define	FDC_TRACK_LAYOUT_STANDARD_GAP3a		22		/* Sector ID Post GAP : 0x4e */
29 #define	FDC_TRACK_LAYOUT_STANDARD_GAP3b		12		/* Sector DATA Pre GAP : 0x00 */
30 #define	FDC_TRACK_LAYOUT_STANDARD_GAP4		40		/* Sector DATA Pre GAP : 0x4e */
31 #define	FDC_TRACK_LAYOUT_STANDARD_GAP5		0		/* Track Post GAP : 0x4e (to fill the rest of the track, value is variable) */
32 								/* GAP5 is 664 bytes for 9 sectors or 50 bytes for 10 sectors */
33 
34 /* Size of a raw standard 512 byte sector in a track, including ID field and all GAPs : 614 bytes */
35 /* (this must be the same as the data returned in FDC_UpdateReadTrackCmd() ) */
36 #define	FDC_TRACK_LAYOUT_STANDARD_RAW_SECTOR_512	( FDC_TRACK_LAYOUT_STANDARD_GAP2 \
37 				+ 3 + 1 + 6 + FDC_TRACK_LAYOUT_STANDARD_GAP3a + FDC_TRACK_LAYOUT_STANDARD_GAP3b \
38 				+ 3 + 1 + 512 + 2 + FDC_TRACK_LAYOUT_STANDARD_GAP4 )
39 
40 
41 #define	FDC_IRQ_SOURCE_COMPLETE			(1<<0)		/* IRQ set after completing a command */
42 #define	FDC_IRQ_SOURCE_INDEX			(1<<1)		/* IRQ set when COND_IP is set and index is reached */
43 #define	FDC_IRQ_SOURCE_FORCED			(1<<2)		/* IRQ was forced by a previous Dx command with COND_IMMEDIATE */
44 #define	FDC_IRQ_SOURCE_HDC			(1<<3)		/* IRQ set by HDC */
45 #define	FDC_IRQ_SOURCE_OTHER			(1<<4)		/* IRQ set by other parts (IPF) */
46 
47 
48 extern void	FDC_MemorySnapShot_Capture ( bool bSave );
49 extern void	FDC_Init ( void );
50 extern void	FDC_Reset ( bool bCold );
51 extern void	FDC_SetDMAStatus ( bool bError );
52 
53 extern void	FDC_SetIRQ ( Uint8 IRQ_Source );
54 extern void	FDC_ClearIRQ ( void );
55 extern void	FDC_InterruptHandler_Update ( void );
56 
57 extern void	FDC_Drive_Set_BusyLed ( Uint8 SR );
58 extern int	FDC_Get_Statusbar_Text ( char *text, size_t maxlen );
59 extern void	FDC_Drive_Set_Enable ( int Drive , bool value );
60 extern void	FDC_Drive_Set_NumberOfHeads ( int Drive , int NbrHeads );
61 extern void	FDC_InsertFloppy ( int Drive );
62 extern void	FDC_EjectFloppy ( int Drive );
63 extern void	FDC_SetDriveSide ( Uint8 io_porta_old , Uint8 io_porta_new );
64 extern int	FDC_GetBytesPerTrack ( int Drive );
65 
66 extern int	FDC_IndexPulse_GetCurrentPos_FdcCycles ( Uint32 *pFdcCyclesPerRev );
67 extern int	FDC_IndexPulse_GetCurrentPos_NbBytes ( void );
68 extern int	FDC_IndexPulse_GetState ( void );
69 extern int	FDC_NextIndexPulse_FdcCycles ( void );
70 
71 extern Uint8	FDC_GetCmdType ( Uint8 CR );
72 
73 extern void	FDC_DiskController_WriteWord ( void );
74 extern void	FDC_DiskControllerStatus_ReadWord ( void );
75 extern void	FDC_DmaModeControl_WriteWord ( void );
76 extern void	FDC_DmaStatus_ReadWord ( void );
77 extern int	FDC_DMA_GetModeControl_R_WR ( void );
78 extern void	FDC_DMA_FIFO_Push ( Uint8 Byte );
79 extern Uint8	FDC_DMA_FIFO_Pull ( void );
80 
81 extern void	FDC_Buffer_Reset ( void );
82 extern void	FDC_Buffer_Add_Timing ( Uint8 Byte , Uint16 Timing );
83 extern void	FDC_Buffer_Add ( Uint8 Byte );
84 extern Uint16	FDC_Buffer_Read_Timing ( void );
85 extern Uint8	FDC_Buffer_Read_Byte ( void );
86 extern Uint8	FDC_Buffer_Read_Byte_pos ( int pos );
87 extern int	FDC_Buffer_Get_Size ( void );
88 
89 extern void	FDC_DmaAddress_ReadByte ( void );
90 extern void	FDC_DmaAddress_WriteByte ( void );
91 extern Uint32	FDC_GetDMAAddress ( void );
92 extern void	FDC_WriteDMAAddress ( Uint32 Address );
93 
94 extern void	FDC_FloppyMode_ReadByte ( void );
95 extern void	FDC_FloppyMode_WriteByte ( void );
96 
97 #endif /* ifndef HATARI_FDC_H */
98