Revision 477e3edf
b/vl.c | ||
---|---|---|
260 | 260 |
target_phys_addr_t isa_mem_base = 0; |
261 | 261 |
PicState2 *isa_pic; |
262 | 262 |
|
263 |
static IOPortReadFunc default_ioport_readb, default_ioport_readw, default_ioport_readl; |
|
264 |
static IOPortWriteFunc default_ioport_writeb, default_ioport_writew, default_ioport_writel; |
|
265 |
|
|
266 |
static uint32_t ioport_read(int index, uint32_t address) |
|
267 |
{ |
|
268 |
static IOPortReadFunc *default_func[3] = { |
|
269 |
default_ioport_readb, |
|
270 |
default_ioport_readw, |
|
271 |
default_ioport_readl |
|
272 |
}; |
|
273 |
IOPortReadFunc *func = ioport_read_table[index][address]; |
|
274 |
if (!func) |
|
275 |
func = default_func[index]; |
|
276 |
return func(ioport_opaque[address], address); |
|
277 |
} |
|
278 |
|
|
279 |
static void ioport_write(int index, uint32_t address, uint32_t data) |
|
280 |
{ |
|
281 |
static IOPortWriteFunc *default_func[3] = { |
|
282 |
default_ioport_writeb, |
|
283 |
default_ioport_writew, |
|
284 |
default_ioport_writel |
|
285 |
}; |
|
286 |
IOPortWriteFunc *func = ioport_write_table[index][address]; |
|
287 |
if (!func) |
|
288 |
func = default_func[index]; |
|
289 |
func(ioport_opaque[address], address, data); |
|
290 |
} |
|
291 |
|
|
263 | 292 |
static uint32_t default_ioport_readb(void *opaque, uint32_t address) |
264 | 293 |
{ |
265 | 294 |
#ifdef DEBUG_UNUSED_IOPORT |
... | ... | |
279 | 308 |
static uint32_t default_ioport_readw(void *opaque, uint32_t address) |
280 | 309 |
{ |
281 | 310 |
uint32_t data; |
282 |
data = ioport_read_table[0][address](ioport_opaque[address], address);
|
|
311 |
data = ioport_read(0, address);
|
|
283 | 312 |
address = (address + 1) & (MAX_IOPORTS - 1); |
284 |
data |= ioport_read_table[0][address](ioport_opaque[address], address) << 8;
|
|
313 |
data |= ioport_read(0, address) << 8;
|
|
285 | 314 |
return data; |
286 | 315 |
} |
287 | 316 |
|
288 | 317 |
static void default_ioport_writew(void *opaque, uint32_t address, uint32_t data) |
289 | 318 |
{ |
290 |
ioport_write_table[0][address](ioport_opaque[address], address, data & 0xff);
|
|
319 |
ioport_write(0, address, data & 0xff);
|
|
291 | 320 |
address = (address + 1) & (MAX_IOPORTS - 1); |
292 |
ioport_write_table[0][address](ioport_opaque[address], address, (data >> 8) & 0xff);
|
|
321 |
ioport_write(0, address, (data >> 8) & 0xff);
|
|
293 | 322 |
} |
294 | 323 |
|
295 | 324 |
static uint32_t default_ioport_readl(void *opaque, uint32_t address) |
... | ... | |
307 | 336 |
#endif |
308 | 337 |
} |
309 | 338 |
|
310 |
static void init_ioports(void) |
|
311 |
{ |
|
312 |
int i; |
|
313 |
|
|
314 |
for(i = 0; i < MAX_IOPORTS; i++) { |
|
315 |
ioport_read_table[0][i] = default_ioport_readb; |
|
316 |
ioport_write_table[0][i] = default_ioport_writeb; |
|
317 |
ioport_read_table[1][i] = default_ioport_readw; |
|
318 |
ioport_write_table[1][i] = default_ioport_writew; |
|
319 |
ioport_read_table[2][i] = default_ioport_readl; |
|
320 |
ioport_write_table[2][i] = default_ioport_writel; |
|
321 |
} |
|
322 |
} |
|
323 |
|
|
324 | 339 |
/* size is the word size in byte */ |
325 | 340 |
int register_ioport_read(int start, int length, int size, |
326 | 341 |
IOPortReadFunc *func, void *opaque) |
... | ... | |
394 | 409 |
if (loglevel & CPU_LOG_IOPORT) |
395 | 410 |
fprintf(logfile, "outb: %04x %02x\n", addr, val); |
396 | 411 |
#endif |
397 |
ioport_write_table[0][addr](ioport_opaque[addr], addr, val);
|
|
412 |
ioport_write(0, addr, val);
|
|
398 | 413 |
#ifdef USE_KQEMU |
399 | 414 |
if (env) |
400 | 415 |
env->last_io_time = cpu_get_time_fast(); |
... | ... | |
407 | 422 |
if (loglevel & CPU_LOG_IOPORT) |
408 | 423 |
fprintf(logfile, "outw: %04x %04x\n", addr, val); |
409 | 424 |
#endif |
410 |
ioport_write_table[1][addr](ioport_opaque[addr], addr, val);
|
|
425 |
ioport_write(1, addr, val);
|
|
411 | 426 |
#ifdef USE_KQEMU |
412 | 427 |
if (env) |
413 | 428 |
env->last_io_time = cpu_get_time_fast(); |
... | ... | |
420 | 435 |
if (loglevel & CPU_LOG_IOPORT) |
421 | 436 |
fprintf(logfile, "outl: %04x %08x\n", addr, val); |
422 | 437 |
#endif |
423 |
ioport_write_table[2][addr](ioport_opaque[addr], addr, val);
|
|
438 |
ioport_write(2, addr, val);
|
|
424 | 439 |
#ifdef USE_KQEMU |
425 | 440 |
if (env) |
426 | 441 |
env->last_io_time = cpu_get_time_fast(); |
... | ... | |
430 | 445 |
int cpu_inb(CPUState *env, int addr) |
431 | 446 |
{ |
432 | 447 |
int val; |
433 |
val = ioport_read_table[0][addr](ioport_opaque[addr], addr);
|
|
448 |
val = ioport_read(0, addr);
|
|
434 | 449 |
#ifdef DEBUG_IOPORT |
435 | 450 |
if (loglevel & CPU_LOG_IOPORT) |
436 | 451 |
fprintf(logfile, "inb : %04x %02x\n", addr, val); |
... | ... | |
445 | 460 |
int cpu_inw(CPUState *env, int addr) |
446 | 461 |
{ |
447 | 462 |
int val; |
448 |
val = ioport_read_table[1][addr](ioport_opaque[addr], addr);
|
|
463 |
val = ioport_read(1, addr);
|
|
449 | 464 |
#ifdef DEBUG_IOPORT |
450 | 465 |
if (loglevel & CPU_LOG_IOPORT) |
451 | 466 |
fprintf(logfile, "inw : %04x %04x\n", addr, val); |
... | ... | |
460 | 475 |
int cpu_inl(CPUState *env, int addr) |
461 | 476 |
{ |
462 | 477 |
int val; |
463 |
val = ioport_read_table[2][addr](ioport_opaque[addr], addr);
|
|
478 |
val = ioport_read(2, addr);
|
|
464 | 479 |
#ifdef DEBUG_IOPORT |
465 | 480 |
if (loglevel & CPU_LOG_IOPORT) |
466 | 481 |
fprintf(logfile, "inl : %04x %08x\n", addr, val); |
... | ... | |
8832 | 8847 |
register_savevm("timer", 0, 2, timer_save, timer_load, NULL); |
8833 | 8848 |
register_savevm("ram", 0, 2, ram_save, ram_load, NULL); |
8834 | 8849 |
|
8835 |
init_ioports(); |
|
8836 |
|
|
8837 | 8850 |
/* terminal init */ |
8838 | 8851 |
memset(&display_state, 0, sizeof(display_state)); |
8839 | 8852 |
if (nographic) { |
Also available in: Unified diff