1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25#ifndef HW_BLOCK_FDC_INTERNAL_H
26#define HW_BLOCK_FDC_INTERNAL_H
27
28#include "exec/memory.h"
29#include "exec/ioport.h"
30#include "hw/block/block.h"
31#include "hw/block/fdc.h"
32#include "qapi/qapi-types-block.h"
33
34typedef struct FDCtrl FDCtrl;
35
36
37
38typedef struct FloppyBus {
39 BusState bus;
40 FDCtrl *fdc;
41} FloppyBus;
42
43
44
45typedef enum FDriveRate {
46 FDRIVE_RATE_500K = 0x00,
47 FDRIVE_RATE_300K = 0x01,
48 FDRIVE_RATE_250K = 0x02,
49 FDRIVE_RATE_1M = 0x03,
50} FDriveRate;
51
52typedef enum FDriveSize {
53 FDRIVE_SIZE_UNKNOWN,
54 FDRIVE_SIZE_350,
55 FDRIVE_SIZE_525,
56} FDriveSize;
57
58typedef struct FDFormat {
59 FloppyDriveType drive;
60 uint8_t last_sect;
61 uint8_t max_track;
62 uint8_t max_head;
63 FDriveRate rate;
64} FDFormat;
65
66typedef enum FDiskFlags {
67 FDISK_DBL_SIDES = 0x01,
68} FDiskFlags;
69
70typedef struct FDrive {
71 FDCtrl *fdctrl;
72 BlockBackend *blk;
73 BlockConf *conf;
74
75 FloppyDriveType drive;
76 uint8_t perpendicular;
77
78 uint8_t head;
79 uint8_t track;
80 uint8_t sect;
81
82 FloppyDriveType disk;
83 FDiskFlags flags;
84 uint8_t last_sect;
85 uint8_t max_track;
86 uint16_t bps;
87 uint8_t ro;
88 uint8_t media_changed;
89 uint8_t media_rate;
90
91 bool media_validated;
92} FDrive;
93
94struct FDCtrl {
95 MemoryRegion iomem;
96 qemu_irq irq;
97
98 QEMUTimer *result_timer;
99 int dma_chann;
100 uint8_t phase;
101 IsaDma *dma;
102
103 uint8_t version;
104
105 uint8_t sra;
106 uint8_t srb;
107 uint8_t dor;
108 uint8_t dor_vmstate;
109 uint8_t tdr;
110 uint8_t dsr;
111 uint8_t msr;
112 uint8_t cur_drv;
113 uint8_t status0;
114 uint8_t status1;
115 uint8_t status2;
116
117 uint8_t *fifo;
118 int32_t fifo_size;
119 uint32_t data_pos;
120 uint32_t data_len;
121 uint8_t data_state;
122 uint8_t data_dir;
123 uint8_t eot;
124
125
126 uint8_t precomp_trk;
127 uint8_t config;
128 uint8_t lock;
129
130 uint8_t pwrd;
131
132 FloppyBus bus;
133 uint8_t num_floppies;
134 FDrive drives[MAX_FD];
135 struct {
136 FloppyDriveType type;
137 } qdev_for_drives[MAX_FD];
138 int reset_sensei;
139 FloppyDriveType fallback;
140
141 uint8_t timer0;
142 uint8_t timer1;
143 PortioList portio_list;
144};
145
146extern const FDFormat fd_formats[];
147extern const VMStateDescription vmstate_fdc;
148
149uint32_t fdctrl_read(void *opaque, uint32_t reg);
150void fdctrl_write(void *opaque, uint32_t reg, uint32_t value);
151void fdctrl_reset(FDCtrl *fdctrl, int do_irq);
152void fdctrl_realize_common(DeviceState *dev, FDCtrl *fdctrl, Error **errp);
153
154int fdctrl_transfer_handler(void *opaque, int nchan, int dma_pos, int dma_len);
155
156void fdctrl_init_drives(FloppyBus *bus, DriveInfo **fds);
157
158#endif
159