OSDN Git Service

[General] Convert sourcecode's CRLF format: DOS(WINDOWS) to Unix, to apply patches...
[csp-qt/common_source_project-fm7.git] / source / src / vm / mb8877.h
1 /*
2         Skelton for retropc emulator
3
4         Origin : XM7
5         Author : Takeda.Toshiya
6         Date   : 2006.12.06 -
7
8         [ MB8877 / MB8876 ]
9 */
10
11 #ifndef _MB8877_H_ 
12 #define _MB8877_H_
13
14 #include "vm.h"
15 #include "../emu.h"
16 #include "device.h"
17
18 #define SIG_MB8877_DRIVEREG     0
19 #define SIG_MB8877_SIDEREG      1
20 #define SIG_MB8877_MOTOR        2
21
22 class DISK;
23
24 class MB8877 : public DEVICE
25 {
26 private:
27         // config
28         bool ignore_crc;
29         
30         // output signals
31         outputs_t outputs_irq;
32         outputs_t outputs_drq;
33         
34         // drive info
35         struct {
36                 int track;
37                 int index;
38                 bool access;
39                 // timing
40                 int cur_position;
41                 int next_trans_position;
42                 int next_sync_position;
43                 uint32 prev_clock;
44         } fdc[MAX_DRIVE];
45         DISK* disk[MAX_DRIVE];
46         
47         // registor
48         uint8 status, status_tmp;
49         uint8 cmdreg, cmdreg_tmp;
50         uint8 trkreg;
51         uint8 secreg;
52         uint8 datareg;
53         uint8 drvreg;
54         uint8 sidereg;
55         uint8 cmdtype;
56         
57         // event
58         int register_id[8];
59         
60         // status
61         bool now_search;
62         bool now_seek, after_seek;
63         int no_command;
64         int seektrk;
65         bool seekvct;
66         bool motor_on;
67         bool drive_sel;
68         
69         // timing
70         uint32 prev_drq_clock;
71         
72         int get_cur_position();
73         double get_usec_to_start_trans();
74         
75         // image handler
76         uint8 search_track();
77         uint8 search_sector(int trk, int side, int sct, bool compare);
78         uint8 search_addr();
79         
80         // command
81         void process_cmd();
82         void cmd_restore();
83         void cmd_seek();
84         void cmd_step();
85         void cmd_stepin();
86         void cmd_stepout();
87         void cmd_readdata();
88         void cmd_writedata();
89         void cmd_readaddr();
90         void cmd_readtrack();
91         void cmd_writetrack();
92         void cmd_forceint();
93         
94         // irq/dma
95         void set_irq(bool val);
96         void set_drq(bool val);
97         
98 public:
99         MB8877(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
100         {
101                 init_output_signals(&outputs_irq);
102                 init_output_signals(&outputs_drq);
103                 motor_on = false;
104         }
105         ~MB8877() {}
106         
107         // common functions
108         void initialize();
109         void release();
110         void reset();
111         void write_io8(uint32 addr, uint32 data);
112         uint32 read_io8(uint32 addr);
113         void write_dma_io8(uint32 addr, uint32 data);
114         uint32 read_dma_io8(uint32 addr);
115         void write_signal(int id, uint32 data, uint32 mask);
116         uint32 read_signal(int ch);
117         void event_callback(int event_id, int err);
118         void update_config();
119         void save_state(FILEIO* state_fio);
120         bool load_state(FILEIO* state_fio);
121         
122         // unique function
123         void set_context_irq(DEVICE* device, int id, uint32 mask)
124         {
125                 register_output_signal(&outputs_irq, device, id, mask);
126         }
127         void set_context_drq(DEVICE* device, int id, uint32 mask)
128         {
129                 register_output_signal(&outputs_drq, device, id, mask);
130         }
131         DISK* get_disk_handler(int drv)
132         {
133                 return disk[drv];
134         }
135         void open_disk(int drv, _TCHAR path[], int offset);
136         void close_disk(int drv);
137         bool disk_inserted(int drv);
138         void set_drive_type(int drv, uint8 type);
139         uint8 get_drive_type(int drv);
140         void set_drive_rpm(int drv, int rpm);
141         void set_drive_mfm(int drv, bool mfm);
142         uint8 fdc_status();
143         void write_protect_fd(int drive, bool flag) {
144           if((drive >= MAX_DRIVE) || (drive < 0)) return;
145           disk[drive]->write_protected = flag;
146         }
147         bool is_write_protect_fd(int drive) {
148           if((drive >= MAX_DRIVE) || (drive < 0)) return true; // Protected
149           return disk[drive]->write_protected;
150         }
151 };
152
153 #endif