OSDN Git Service

[VM][Z80] Fix min(),max().
[csp-qt/common_source_project-fm7.git] / source / src / vm / upd765a.h
1 /*\r
2         Skelton for retropc emulator\r
3 \r
4         Origin : M88\r
5         Author : Takeda.Toshiya\r
6         Date   : 2006.09.17-\r
7 \r
8         [ uPD765A ]\r
9 */\r
10 \r
11 #ifndef _UPD765A_H_\r
12 #define _UPD765A_H_\r
13 \r
14 #include "vm.h"\r
15 #include "../emu.h"\r
16 #include "device.h"\r
17 \r
18 #define SIG_UPD765A_RESET       0\r
19 #define SIG_UPD765A_TC          1\r
20 #define SIG_UPD765A_MOTOR       2\r
21 #define SIG_UPD765A_MOTOR_NEG   3\r
22 #define SIG_UPD765A_DRVSEL      4\r
23 #define SIG_UPD765A_IRQ_MASK    5\r
24 #define SIG_UPD765A_DRQ_MASK    6\r
25 #define SIG_UPD765A_FREADY      7\r
26 \r
27 class DISK;\r
28 \r
29 class UPD765A : public DEVICE\r
30 {\r
31 private:\r
32         // output signals\r
33         outputs_t outputs_irq;\r
34         outputs_t outputs_drq;\r
35         outputs_t outputs_hdu;\r
36         outputs_t outputs_index;\r
37         \r
38         // fdc\r
39         struct {\r
40                 uint8 track;\r
41                 uint8 result;\r
42                 bool access;\r
43                 // timing\r
44                 int cur_position;\r
45                 int next_trans_position;\r
46                 uint32 prev_clock;\r
47         } fdc[4];\r
48         DISK* disk[4];\r
49         \r
50         uint8 hdu, hdue, id[4], eot, gpl, dtl;\r
51         \r
52         int phase, prevphase;\r
53         uint8 status, seekstat, command;\r
54         uint32 result;\r
55         int step_rate_time;\r
56         bool no_dma_mode, motor_on;\r
57 #ifdef UPD765A_DMA_MODE\r
58         bool dma_data_lost;\r
59 #endif\r
60         bool irq_masked, drq_masked;\r
61         \r
62         uint8* bufptr;\r
63         uint8 buffer[0x8000];\r
64         int count;\r
65         int event_phase;\r
66         int phase_id, drq_id, lost_id, result7_id, seek_id[4];\r
67         bool force_ready;\r
68         bool reset_signal;\r
69         bool prev_index;\r
70         \r
71         // timing\r
72         uint32 prev_drq_clock;\r
73         \r
74         int get_cur_position(int drv);\r
75         double get_usec_to_exec_phase();\r
76         \r
77         // update status\r
78         void set_irq(bool val);\r
79         void set_drq(bool val);\r
80         void set_hdu(uint8 val);\r
81         \r
82         // phase shift\r
83         void shift_to_idle();\r
84         void shift_to_cmd(int length);\r
85         void shift_to_exec();\r
86         void shift_to_read(int length);\r
87         void shift_to_write(int length);\r
88         void shift_to_scan(int length);\r
89         void shift_to_result(int length);\r
90         void shift_to_result7();\r
91         void shift_to_result7_event();\r
92         \r
93         // command\r
94         void process_cmd(int cmd);\r
95         void cmd_sence_devstat();\r
96         void cmd_sence_intstat();\r
97         uint8 get_devstat(int drv);\r
98         void cmd_seek();\r
99         void cmd_recalib();\r
100         void seek(int drv, int trk);\r
101         void seek_event(int drv);\r
102         void cmd_read_data();\r
103         void cmd_write_data();\r
104         void cmd_scan();\r
105         void cmd_read_diagnostic();\r
106         void read_data(bool deleted, bool scan);\r
107         void write_data(bool deleted);\r
108         void read_diagnostic();\r
109         uint32 read_sector();\r
110         uint32 write_sector(bool deleted);\r
111         uint32 find_id();\r
112         uint32 check_cond(bool write);\r
113         void get_sector_params();\r
114         bool id_incr();\r
115         void cmd_read_id();\r
116         void cmd_write_id();\r
117         uint32 read_id();\r
118         uint32 write_id();\r
119         void cmd_specify();\r
120         void cmd_invalid();\r
121 #if defined(_USE_AGAR) || defined(_USE_SDL)\r
122         uint8 __min(uint8 x, uint8 y) {\r
123            if(x > y) return y;\r
124            return x;\r
125         }\r
126         uint8 __max(uint8 x, uint8 y) {\r
127            if(x < y) return y;\r
128            return x;\r
129         }\r
130 #endif\r
131    \r
132 public:\r
133         UPD765A(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)\r
134         {\r
135                 init_output_signals(&outputs_irq);\r
136                 init_output_signals(&outputs_drq);\r
137                 init_output_signals(&outputs_hdu);\r
138                 init_output_signals(&outputs_index);\r
139                 raise_irq_when_media_changed = false;\r
140         }\r
141         ~UPD765A() {}\r
142         \r
143         // common functions\r
144         void initialize();\r
145         void release();\r
146         void reset();\r
147         void write_io8(uint32 addr, uint32 data);\r
148         uint32 read_io8(uint32 addr);\r
149         void write_dma_io8(uint32 addr, uint32 data);\r
150         uint32 read_dma_io8(uint32 addr);\r
151         void write_signal(int id, uint32 data, uint32 mask);\r
152         uint32 read_signal(int ch);\r
153         void event_callback(int event_id, int err);\r
154         void save_state(FILEIO* state_fio);\r
155         bool load_state(FILEIO* state_fio);\r
156         \r
157         // unique function\r
158         void set_context_irq(DEVICE* device, int id, uint32 mask)\r
159         {\r
160                 register_output_signal(&outputs_irq, device, id, mask);\r
161         }\r
162         void set_context_drq(DEVICE* device, int id, uint32 mask)\r
163         {\r
164                 register_output_signal(&outputs_drq, device, id, mask);\r
165         }\r
166         void set_context_hdu(DEVICE* device, int id, uint32 mask)\r
167         {\r
168                 register_output_signal(&outputs_hdu, device, id, mask);\r
169         }\r
170         void set_context_index(DEVICE* device, int id, uint32 mask)\r
171         {\r
172                 register_output_signal(&outputs_index, device, id, mask);\r
173         }\r
174         DISK* get_disk_handler(int drv)\r
175         {\r
176                 return disk[drv];\r
177         }\r
178         void open_disk(int drv, _TCHAR path[], int offset);\r
179         void close_disk(int drv);\r
180         bool disk_inserted(int drv);\r
181         bool disk_inserted();   // current hdu\r
182         bool disk_ejected(int drv);\r
183         bool disk_ejected();    // current hdu\r
184         uint8 media_type(int drv);\r
185         void set_drive_type(int drv, uint8 type);\r
186         uint8 get_drive_type(int drv);\r
187         void set_drive_rpm(int drv, int rpm);\r
188         void set_drive_mfm(int drv, bool mfm);\r
189         bool raise_irq_when_media_changed;\r
190 };\r
191 \r
192 #endif\r
193 \r