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