-/*\r
- Skelton for retropc emulator\r
-\r
- Origin : XM7\r
- Author : Takeda.Toshiya\r
- Date : 2006.12.06 -\r
-\r
- [ MB8877 / MB8876 ]\r
-*/\r
-\r
-#ifndef _MB8877_H_ \r
-#define _MB8877_H_\r
-\r
-#include "vm.h"\r
-#include "../emu.h"\r
-#include "device.h"\r
-\r
-#define SIG_MB8877_DRIVEREG 0\r
-#define SIG_MB8877_SIDEREG 1\r
-#define SIG_MB8877_MOTOR 2\r
-\r
-class DISK;\r
-\r
-class MB8877 : public DEVICE\r
-{\r
-private:\r
- // config\r
- bool ignore_crc;\r
- \r
- // output signals\r
- outputs_t outputs_irq;\r
- outputs_t outputs_drq;\r
- \r
- // drive info\r
- struct {\r
- int track;\r
- int index;\r
- bool access;\r
- // timing\r
- int cur_position;\r
- int next_trans_position;\r
- int next_sync_position;\r
- uint32 prev_clock;\r
- } fdc[MAX_DRIVE];\r
- DISK* disk[MAX_DRIVE];\r
- \r
- // registor\r
- uint8 status, status_tmp;\r
- uint8 cmdreg, cmdreg_tmp;\r
- uint8 trkreg;\r
- uint8 secreg;\r
- uint8 datareg;\r
- uint8 drvreg;\r
- uint8 sidereg;\r
- uint8 cmdtype;\r
- \r
- // event\r
- int register_id[8];\r
- \r
- // status\r
- bool now_search;\r
- bool now_seek, after_seek;\r
- int no_command;\r
- int seektrk;\r
- bool seekvct;\r
- bool motor_on;\r
- bool drive_sel;\r
- \r
- // timing\r
- uint32 prev_drq_clock;\r
- \r
- int get_cur_position();\r
- double get_usec_to_start_trans();\r
- \r
- // image handler\r
- uint8 search_track();\r
- uint8 search_sector(int trk, int side, int sct, bool compare);\r
- uint8 search_addr();\r
- \r
- // command\r
- void process_cmd();\r
- void cmd_restore();\r
- void cmd_seek();\r
- void cmd_step();\r
- void cmd_stepin();\r
- void cmd_stepout();\r
- void cmd_readdata();\r
- void cmd_writedata();\r
- void cmd_readaddr();\r
- void cmd_readtrack();\r
- void cmd_writetrack();\r
- void cmd_forceint();\r
- \r
- // irq/dma\r
- void set_irq(bool val);\r
- void set_drq(bool val);\r
- \r
-public:\r
- MB8877(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)\r
- {\r
- init_output_signals(&outputs_irq);\r
- init_output_signals(&outputs_drq);\r
- motor_on = false;\r
- }\r
- ~MB8877() {}\r
- \r
- // common functions\r
- void initialize();\r
- void release();\r
- void reset();\r
- void write_io8(uint32 addr, uint32 data);\r
- uint32 read_io8(uint32 addr);\r
- void write_dma_io8(uint32 addr, uint32 data);\r
- uint32 read_dma_io8(uint32 addr);\r
- void write_signal(int id, uint32 data, uint32 mask);\r
- uint32 read_signal(int ch);\r
- void event_callback(int event_id, int err);\r
- void update_config();\r
- void save_state(FILEIO* state_fio);\r
- bool load_state(FILEIO* state_fio);\r
- \r
- // unique function\r
- void set_context_irq(DEVICE* device, int id, uint32 mask)\r
- {\r
- register_output_signal(&outputs_irq, device, id, mask);\r
- }\r
- void set_context_drq(DEVICE* device, int id, uint32 mask)\r
- {\r
- register_output_signal(&outputs_drq, device, id, mask);\r
- }\r
- DISK* get_disk_handler(int drv)\r
- {\r
- return disk[drv];\r
- }\r
- void open_disk(int drv, _TCHAR path[], int offset);\r
- void close_disk(int drv);\r
- bool disk_inserted(int drv);\r
- void set_drive_type(int drv, uint8 type);\r
- uint8 get_drive_type(int drv);\r
- void set_drive_rpm(int drv, int rpm);\r
- void set_drive_mfm(int drv, bool mfm);\r
- uint8 fdc_status();\r
- void write_protect_fd(int drive, bool flag) {\r
- if((drive >= MAX_DRIVE) || (drive < 0)) return;\r
- disk[drive]->write_protected = flag;\r
- }\r
- bool is_write_protect_fd(int drive) {\r
- if((drive >= MAX_DRIVE) || (drive < 0)) return true; // Protected\r
- return disk[drive]->write_protected;\r
- }\r
-};\r
-\r
-#endif\r
+/*
+ Skelton for retropc emulator
+
+ Origin : XM7
+ Author : Takeda.Toshiya
+ Date : 2006.12.06 -
+
+ [ MB8877 / MB8876 ]
+*/
+
+#ifndef _MB8877_H_
+#define _MB8877_H_
+
+#include "vm.h"
+#include "../emu.h"
+#include "device.h"
+
+#define SIG_MB8877_DRIVEREG 0
+#define SIG_MB8877_SIDEREG 1
+#define SIG_MB8877_MOTOR 2
+
+class DISK;
+
+class MB8877 : public DEVICE
+{
+private:
+ // config
+ bool ignore_crc;
+
+ // output signals
+ outputs_t outputs_irq;
+ outputs_t outputs_drq;
+
+ // drive info
+ struct {
+ int track;
+ int index;
+ bool access;
+ // timing
+ int cur_position;
+ int next_trans_position;
+ int next_sync_position;
+ uint32 prev_clock;
+ } fdc[MAX_DRIVE];
+ DISK* disk[MAX_DRIVE];
+
+ // registor
+ uint8 status, status_tmp;
+ uint8 cmdreg, cmdreg_tmp;
+ uint8 trkreg;
+ uint8 secreg;
+ uint8 datareg;
+ uint8 drvreg;
+ uint8 sidereg;
+ uint8 cmdtype;
+
+ // event
+ int register_id[8];
+
+ // status
+ bool now_search;
+ bool now_seek, after_seek;
+ int no_command;
+ int seektrk;
+ bool seekvct;
+ bool motor_on;
+ bool drive_sel;
+
+ // timing
+ uint32 prev_drq_clock;
+
+ int get_cur_position();
+ double get_usec_to_start_trans();
+
+ // image handler
+ uint8 search_track();
+ uint8 search_sector(int trk, int side, int sct, bool compare);
+ uint8 search_addr();
+
+ // command
+ void process_cmd();
+ void cmd_restore();
+ void cmd_seek();
+ void cmd_step();
+ void cmd_stepin();
+ void cmd_stepout();
+ void cmd_readdata();
+ void cmd_writedata();
+ void cmd_readaddr();
+ void cmd_readtrack();
+ void cmd_writetrack();
+ void cmd_forceint();
+
+ // irq/dma
+ void set_irq(bool val);
+ void set_drq(bool val);
+
+public:
+ MB8877(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
+ {
+ init_output_signals(&outputs_irq);
+ init_output_signals(&outputs_drq);
+ motor_on = false;
+ }
+ ~MB8877() {}
+
+ // common functions
+ void initialize();
+ void release();
+ void reset();
+ void write_io8(uint32 addr, uint32 data);
+ uint32 read_io8(uint32 addr);
+ void write_dma_io8(uint32 addr, uint32 data);
+ uint32 read_dma_io8(uint32 addr);
+ void write_signal(int id, uint32 data, uint32 mask);
+ uint32 read_signal(int ch);
+ void event_callback(int event_id, int err);
+ void update_config();
+ void save_state(FILEIO* state_fio);
+ bool load_state(FILEIO* state_fio);
+
+ // unique function
+ void set_context_irq(DEVICE* device, int id, uint32 mask)
+ {
+ register_output_signal(&outputs_irq, device, id, mask);
+ }
+ void set_context_drq(DEVICE* device, int id, uint32 mask)
+ {
+ register_output_signal(&outputs_drq, device, id, mask);
+ }
+ DISK* get_disk_handler(int drv)
+ {
+ return disk[drv];
+ }
+ void open_disk(int drv, _TCHAR path[], int offset);
+ void close_disk(int drv);
+ bool disk_inserted(int drv);
+ void set_drive_type(int drv, uint8 type);
+ uint8 get_drive_type(int drv);
+ void set_drive_rpm(int drv, int rpm);
+ void set_drive_mfm(int drv, bool mfm);
+ uint8 fdc_status();
+ void write_protect_fd(int drive, bool flag) {
+ if((drive >= MAX_DRIVE) || (drive < 0)) return;
+ disk[drive]->write_protected = flag;
+ }
+ bool is_write_protect_fd(int drive) {
+ if((drive >= MAX_DRIVE) || (drive < 0)) return true; // Protected
+ return disk[drive]->write_protected;
+ }
+};
+
+#endif