Revision 3504fe17
b/hw/dma.c | ||
---|---|---|
136 | 136 |
return (val >> (ncont + (ff << 3))) & 0xff; |
137 | 137 |
} |
138 | 138 |
|
139 |
static void write_chan (uint32_t nport, int size, uint32_t data)
|
|
139 |
static void write_chan (CPUState *env, uint32_t nport, uint32_t data)
|
|
140 | 140 |
{ |
141 | 141 |
int ncont, ichan, nreg; |
142 | 142 |
struct dma_regs *r; |
... | ... | |
146 | 146 |
nreg = (nport >> ncont) & 1; |
147 | 147 |
r = dma_controllers[ncont].regs + ichan; |
148 | 148 |
|
149 |
if (2 == size) {
|
|
150 |
r->base[nreg] = data;
|
|
149 |
if (getff (ncont)) {
|
|
150 |
r->base[nreg] = (r->base[nreg] & 0xff) | ((data << 8) & 0xff00);
|
|
151 | 151 |
init_chan (ncont, ichan); |
152 |
} else { |
|
153 |
r->base[nreg] = (r->base[nreg] & 0xff00) | (data & 0xff); |
|
152 | 154 |
} |
153 |
else { |
|
154 |
if (getff (ncont)) { |
|
155 |
r->base[nreg] = (r->base[nreg] & 0xff) | ((data << 8) & 0xff00); |
|
156 |
init_chan (ncont, ichan); |
|
157 |
} |
|
158 |
else { |
|
159 |
r->base[nreg] = (r->base[nreg] & 0xff00) | (data & 0xff); |
|
160 |
} |
|
161 |
} |
|
162 |
} |
|
163 |
static void write_chanb (CPUState *env, uint32_t nport, uint32_t data) |
|
164 |
{ |
|
165 |
write_chan (nport, 1, data); |
|
166 |
} |
|
167 |
|
|
168 |
static void write_chanw (CPUState *env, uint32_t nport, uint32_t data) |
|
169 |
{ |
|
170 |
write_chan (nport, 2, data); |
|
171 | 155 |
} |
172 | 156 |
|
173 | 157 |
static void write_cont (CPUState *env, uint32_t nport, uint32_t data) |
... | ... | |
370 | 354 |
int page_port_list[] = { 0x1, 0x2, 0x3, 0x7 }; |
371 | 355 |
|
372 | 356 |
for (i = 0; i < 8; i++) { |
373 |
register_ioport_write (i, 1, write_chanb, 1); |
|
374 |
register_ioport_write (i, 1, write_chanw, 2); |
|
357 |
register_ioport_write (i, 1, write_chan, 1); |
|
375 | 358 |
|
376 |
register_ioport_write (0xc0 + (i << 1), 1, write_chanb, 1); |
|
377 |
register_ioport_write (0xc0 + (i << 1), 1, write_chanw, 2); |
|
359 |
register_ioport_write (0xc0 + (i << 1), 1, write_chan, 1); |
|
378 | 360 |
|
379 | 361 |
register_ioport_read (i, 1, read_chan, 1); |
380 |
register_ioport_read (0xc0 + (i << 1), 1, read_chan, 2);
|
|
362 |
register_ioport_read (0xc0 + (i << 1), 1, read_chan, 1);
|
|
381 | 363 |
} |
382 | 364 |
|
383 | 365 |
for (i = 0; i < LENOFA (page_port_list); i++) { |
... | ... | |
390 | 372 |
register_ioport_write (0xd0 + (i << 1), 1, write_cont, 1); |
391 | 373 |
} |
392 | 374 |
|
393 |
write_cont (NULL, 0xd, 0); |
|
394 |
write_cont (NULL, 0xdd, 0);
|
|
375 |
write_cont (NULL, 0x0d, 0);
|
|
376 |
write_cont (NULL, 0xda, 0);
|
|
395 | 377 |
} |
Also available in: Unified diff