2001-10-03 17:10:38 +04:00
|
|
|
/////////////////////////////////////////////////////////////////////////
|
2011-02-25 01:05:47 +03:00
|
|
|
// $Id$
|
2001-10-03 17:10:38 +04:00
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
2012-03-23 21:22:30 +04:00
|
|
|
// Copyright (C) 2002-2012 The Bochs Project
|
2001-04-10 05:04:59 +04:00
|
|
|
//
|
|
|
|
// This library is free software; you can redistribute it and/or
|
|
|
|
// modify it under the terms of the GNU Lesser General Public
|
|
|
|
// License as published by the Free Software Foundation; either
|
|
|
|
// version 2 of the License, or (at your option) any later version.
|
|
|
|
//
|
|
|
|
// This library is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
// Lesser General Public License for more details.
|
|
|
|
//
|
|
|
|
// You should have received a copy of the GNU Lesser General Public
|
|
|
|
// License along with this library; if not, write to the Free Software
|
2009-02-08 12:05:52 +03:00
|
|
|
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
2009-02-08 00:05:31 +03:00
|
|
|
//
|
2001-04-10 05:04:59 +04:00
|
|
|
|
2006-03-07 21:16:41 +03:00
|
|
|
#ifndef BX_IODEV_FLOPPY_H
|
|
|
|
#define BX_IODEV_FLOPPY_H
|
2001-04-10 05:04:59 +04:00
|
|
|
|
|
|
|
#define FROM_FLOPPY 10
|
|
|
|
#define TO_FLOPPY 11
|
|
|
|
|
|
|
|
#if BX_USE_FD_SMF
|
|
|
|
# define BX_FD_SMF static
|
2002-10-25 01:07:56 +04:00
|
|
|
# define BX_FD_THIS theFloppyController->
|
2001-04-10 05:04:59 +04:00
|
|
|
#else
|
|
|
|
# define BX_FD_SMF
|
|
|
|
# define BX_FD_THIS this->
|
|
|
|
#endif
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
int fd; /* file descriptor of floppy image file */
|
|
|
|
unsigned sectors_per_track; /* number of sectors/track */
|
|
|
|
unsigned sectors; /* number of formatted sectors on diskette */
|
|
|
|
unsigned tracks; /* number of tracks */
|
|
|
|
unsigned heads; /* number of heads */
|
|
|
|
unsigned type;
|
2001-06-13 11:06:10 +04:00
|
|
|
unsigned write_protected;
|
2011-08-20 00:20:25 +04:00
|
|
|
unsigned status_changed;
|
2011-01-11 23:14:21 +03:00
|
|
|
bx_bool vvfat_floppy;
|
|
|
|
device_image_t *vvfat;
|
2011-08-20 00:20:25 +04:00
|
|
|
} floppy_t;
|
2001-04-10 05:04:59 +04:00
|
|
|
|
2002-10-25 01:07:56 +04:00
|
|
|
class bx_floppy_ctrl_c : public bx_floppy_stub_c {
|
2001-04-10 05:04:59 +04:00
|
|
|
public:
|
2006-03-08 00:11:20 +03:00
|
|
|
bx_floppy_ctrl_c();
|
|
|
|
virtual ~bx_floppy_ctrl_c();
|
|
|
|
virtual void init(void);
|
|
|
|
virtual void reset(unsigned type);
|
2011-01-18 00:36:00 +03:00
|
|
|
virtual unsigned set_media_status(unsigned drive, bx_bool status);
|
2006-05-27 19:54:49 +04:00
|
|
|
virtual void register_state(void);
|
2012-03-23 21:22:30 +04:00
|
|
|
#if BX_DEBUGGER
|
2012-04-23 21:06:19 +04:00
|
|
|
virtual void debug_dump(int argc, char **argv);
|
2012-03-23 21:22:30 +04:00
|
|
|
#endif
|
2001-04-10 05:04:59 +04:00
|
|
|
|
|
|
|
private:
|
|
|
|
|
|
|
|
struct {
|
|
|
|
Bit8u data_rate;
|
|
|
|
|
|
|
|
Bit8u command[10]; /* largest command size ??? */
|
|
|
|
Bit8u command_index;
|
|
|
|
Bit8u command_size;
|
2002-10-25 15:44:41 +04:00
|
|
|
bx_bool command_complete;
|
2001-04-10 05:04:59 +04:00
|
|
|
Bit8u pending_command;
|
|
|
|
|
2002-10-25 15:44:41 +04:00
|
|
|
bx_bool multi_track;
|
|
|
|
bx_bool pending_irq;
|
2002-02-06 21:51:48 +03:00
|
|
|
Bit8u reset_sensei;
|
2001-12-28 19:36:45 +03:00
|
|
|
Bit8u format_count;
|
|
|
|
Bit8u format_fillbyte;
|
2001-12-27 12:28:53 +03:00
|
|
|
|
2001-04-10 05:04:59 +04:00
|
|
|
Bit8u result[10];
|
|
|
|
Bit8u result_index;
|
|
|
|
Bit8u result_size;
|
|
|
|
|
|
|
|
Bit8u DOR; // Digital Ouput Register
|
|
|
|
Bit8u TDR; // Tape Drive Register
|
|
|
|
Bit8u cylinder[4]; // really only using 2 drives
|
|
|
|
Bit8u head[4]; // really only using 2 drives
|
|
|
|
Bit8u sector[4]; // really only using 2 drives
|
2005-10-27 11:38:20 +04:00
|
|
|
Bit8u eot[4]; // really only using 2 drives
|
2005-11-10 21:56:45 +03:00
|
|
|
bx_bool TC; // Terminal Count status from DMA controller
|
2001-04-10 05:04:59 +04:00
|
|
|
|
|
|
|
/* MAIN STATUS REGISTER
|
|
|
|
* b7: MRQ: main request 1=data register ready 0=data register not ready
|
|
|
|
* b6: DIO: data input/output:
|
|
|
|
* 1=controller->CPU (ready for data read)
|
|
|
|
* 0=CPU->controller (ready for data write)
|
|
|
|
* b5: NDMA: non-DMA mode: 1=controller not in DMA modes
|
|
|
|
* 0=controller in DMA mode
|
|
|
|
* b4: BUSY: instruction(device busy) 1=active 0=not active
|
|
|
|
* b3-0: ACTD, ACTC, ACTB, ACTA:
|
|
|
|
* drive D,C,B,A in positioning mode 1=active 0=not active
|
|
|
|
*/
|
|
|
|
Bit8u main_status_reg;
|
|
|
|
|
|
|
|
Bit8u status_reg0;
|
|
|
|
Bit8u status_reg1;
|
|
|
|
Bit8u status_reg2;
|
|
|
|
Bit8u status_reg3;
|
|
|
|
|
2001-06-13 11:06:10 +04:00
|
|
|
// drive field allows up to 4 drives, even though probably only 2 will
|
|
|
|
// ever be used.
|
|
|
|
floppy_t media[4];
|
2001-04-10 05:04:59 +04:00
|
|
|
unsigned num_supported_floppies;
|
|
|
|
Bit8u floppy_buffer[512+2]; // 2 extra for good measure
|
|
|
|
unsigned floppy_buffer_index;
|
|
|
|
int floppy_timer_index;
|
2005-08-25 00:45:57 +04:00
|
|
|
bx_bool media_present[4];
|
2002-08-04 12:42:34 +04:00
|
|
|
Bit8u device_type[4];
|
2002-08-13 16:02:37 +04:00
|
|
|
Bit8u DIR[4]; // Digital Input Register:
|
2001-04-10 05:04:59 +04:00
|
|
|
// b7: 0=diskette is present and has not been changed
|
|
|
|
// 1=diskette missing or changed
|
2005-11-17 00:21:35 +03:00
|
|
|
bx_bool lock; // FDC lock status
|
|
|
|
Bit8u SRT; // step rate time
|
|
|
|
Bit8u HUT; // head unload time
|
|
|
|
Bit8u HLT; // head load time
|
|
|
|
Bit8u config; // configure byte #1
|
|
|
|
Bit8u pretrk; // precompensation track
|
|
|
|
Bit8u perp_mode; // perpendicular mode
|
|
|
|
|
2004-02-07 17:34:35 +03:00
|
|
|
int statusbar_id[2]; // IDs of the status LEDs
|
2005-11-12 13:38:51 +03:00
|
|
|
} s; // state information
|
2001-04-10 05:04:59 +04:00
|
|
|
|
|
|
|
static Bit32u read_handler(void *this_ptr, Bit32u address, unsigned io_len);
|
|
|
|
static void write_handler(void *this_ptr, Bit32u address, Bit32u value, unsigned io_len);
|
|
|
|
#if !BX_USE_FD_SMF
|
|
|
|
Bit32u read(Bit32u address, unsigned io_len);
|
|
|
|
void write(Bit32u address, Bit32u value, unsigned io_len);
|
|
|
|
#endif
|
2012-07-13 01:20:46 +04:00
|
|
|
BX_FD_SMF Bit16u dma_write(Bit8u *buffer, Bit16u maxlen);
|
|
|
|
BX_FD_SMF Bit16u dma_read(Bit8u *buffer, Bit16u maxlen);
|
2001-04-10 05:04:59 +04:00
|
|
|
BX_FD_SMF void floppy_command(void);
|
|
|
|
BX_FD_SMF void floppy_xfer(Bit8u drive, Bit32u offset, Bit8u *buffer, Bit32u bytes, Bit8u direction);
|
2002-02-06 21:51:48 +03:00
|
|
|
BX_FD_SMF void raise_interrupt(void);
|
2005-03-12 00:12:54 +03:00
|
|
|
BX_FD_SMF void lower_interrupt(void);
|
2002-11-30 12:39:29 +03:00
|
|
|
BX_FD_SMF void enter_idle_phase(void);
|
|
|
|
BX_FD_SMF void enter_result_phase(void);
|
2005-11-12 13:38:51 +03:00
|
|
|
BX_FD_SMF Bit32u calculate_step_delay(Bit8u drive, Bit8u new_cylinder);
|
2005-11-20 17:15:28 +03:00
|
|
|
BX_FD_SMF void reset_changeline(void);
|
2007-02-09 17:23:50 +03:00
|
|
|
BX_FD_SMF bx_bool get_tc(void);
|
2005-03-12 00:12:54 +03:00
|
|
|
static void timer_handler(void *);
|
2011-01-18 00:36:00 +03:00
|
|
|
BX_FD_SMF void timer(void);
|
2011-01-12 01:00:41 +03:00
|
|
|
BX_FD_SMF void increment_sector(void);
|
|
|
|
BX_FD_SMF bx_bool evaluate_media(Bit8u devtype, Bit8u type, char *path, floppy_t *media);
|
|
|
|
BX_FD_SMF void close_media(floppy_t *media);
|
2011-01-18 00:36:00 +03:00
|
|
|
// runtime options
|
|
|
|
static Bit64s floppy_param_handler(bx_param_c *param, int set, Bit64s val);
|
2011-01-19 00:04:44 +03:00
|
|
|
static const char* floppy_param_string_handler(bx_param_string_c *param, int set, const char *oldval, const char *val, int maxlen);
|
2011-08-20 00:20:25 +04:00
|
|
|
static void runtime_config_handler(void *);
|
|
|
|
void runtime_config(void);
|
2005-11-22 21:34:51 +03:00
|
|
|
};
|
2004-05-31 18:47:12 +04:00
|
|
|
#endif
|