1 /*
2  * Z80SIM  -  a Z80-CPU simulator
3  *
4  * Common I/O devices used by various simulated machines
5  *
6  * Copyright (C) 2014-2019 by Udo Munk
7  *
8  * Emulation of a Cromemco 4FDC/16FDC S100 board
9  *
10  * History:
11  * 20-DEC-2014 first version
12  * 28-DEC-2014 second version with 16FDC, CP/M 2.2 boots
13  * 01-JAN-2015 fixed 16FDC, machine now also boots CDOS 2.58 from 8" and 5.25"
14  * 01-JAN-2015 fixed frontpanel switch settings, added boot flag to fp switch
15  * 12-JAN-2015 implemented dummy write track, so that programs won't hang
16  * 22-JAN-2015 fixed buggy ID field, fake index pulses for 300/360 RPM
17  * 26-JAN-2015 implemented write track to format SS/SD disks properly
18  * 02-FEB-2015 implemented DS/DD disk formats
19  * 05-FEB-2015 implemented DS/SD disk formats
20  * 06-FEB-2015 implemented write track for all formats
21  * 12-FEB-2015 implemented motor control, so that a 16FDC is recogniced by CDOS
22  * 20-FEB-2015 bug fixes for 1.25 release
23  * 08-MAR-2016 support user path for disk images
24  * 13-MAY-2016 find disk images at -d <path>, ./disks and DISKDIR
25  * 22-JUL-2016 added support for read only disks
26  * 22-JUN-2017 added reset function
27  * 26-JUL-2017 fixed buggy index pulse implementation
28  * 15-AUG-2017 and more fixes for index pulse
29  * 22-AUG-2017 provide write protect and track 0 bits for all commands
30  * 23-APR-2018 cleanup
31  * 20-MAY-2018 improved reset
32  * 15-JUL-2018 use logging
33  * 09-SEP-2019 added disk format without SD track 0 provided by Alan Cox
34  * 24-SEP-2019 restore and seek also affect step direction
35  */
36 
37 /*
38  * disk definitions 5.25"/8" drives, single/double density,
39  * single/double sided, write protected
40  */
41 enum Disk_type { SMALL, LARGE, UNKNOWN };
42 enum Disk_density { SINGLE, DOUBLE };
43 enum Disk_sides { ONE, TWO };
44 enum Disk_mode { READWRITE, READONLY };
45 
46 typedef struct {
47 	char *fn;			/* filename of disk image */
48 	enum Disk_type disk_t;		/* drive type 5.25" or 8" */
49 	enum Disk_density disk_d;	/* disk density, single or double */
50 	enum Disk_sides disk_s;		/* drive sides, 1 or 2 */
51 	int tracks;			/* # of tracks */
52 	int sectors;			/* # sectors on tracks > 0 side 0 */
53 	int sec0;			/* # sectors on track 0, side 0 */
54 	enum Disk_mode disk_m;		/* R/W or R/O mode */
55 	enum Disk_density disk_d0;	/* Density of track 0 */
56 } Diskdef;
57 
58 extern BYTE fdc_flags;
59 extern int index_pulse;
60 extern int motoron, motortimer;
61 extern enum Disk_type dtype;
62 
63 extern BYTE cromemco_fdc_status_in(void);
64 extern void cromemco_fdc_cmd_out(BYTE);
65 
66 extern BYTE cromemco_fdc_track_in(void);
67 extern void cromemco_fdc_track_out(BYTE);
68 
69 extern BYTE cromemco_fdc_sector_in(void);
70 extern void cromemco_fdc_sector_out(BYTE);
71 
72 extern BYTE cromemco_fdc_data_in(void);
73 extern void cromemco_fdc_data_out(BYTE);
74 
75 extern BYTE cromemco_fdc_diskflags_in(void);
76 extern void cromemco_fdc_diskctl_out(BYTE);
77 
78 extern BYTE cromemco_fdc_aux_in(void);
79 extern void cromemco_fdc_aux_out(BYTE);
80 
81 extern void cromemco_fdc_reset(void);
82