OSDN Git Service

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