Commit 3504fe171b62bb0362191e1fd66538ff7c4f4210
1 parent
ab1f142b
16 bit DMA fix (malc)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@572 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
10 additions
and
28 deletions
hw/dma.c
| ... | ... | @@ -136,7 +136,7 @@ static uint32_t read_chan (CPUState *env, uint32_t nport) |
| 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,28 +146,12 @@ static void write_chan (uint32_t nport, int size, uint32_t data) |
| 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,14 +354,12 @@ void DMA_init (void) |
| 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,6 +372,6 @@ void DMA_init (void) |
| 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 | } | ... | ... |