int cpuintrf_init_cpu(int cpunum, int cputype) { char familyname[256]; int j, size; /* fill in the type and interface */ cpu[cpunum].intf = cpuintrf[cputype]; cpu[cpunum].cputype = cputype; /* determine the family index */ strcpy(familyname, cputype_core_file(cputype)); for (j = 0; j < CPU_COUNT; j++) if (!strcmp(familyname, cputype_core_file(j))) { cpu[cpunum].family = j; break; } /* determine the context size */ size = (*cpu[cpunum].intf.get_context)(NULL); if (size == 0) { /* that can't really be true */ /*logerror("CPU #%d claims to need no context buffer!\n", cpunum);*/ return 1; } /* allocate a context buffer for the CPU */ cpu[cpunum].context = malloc(size); if (cpu[cpunum].context == NULL) { /* that's really bad :( */ /*logerror("CPU #%d failed to allocate context buffer (%d bytes)!\n", cpunum, size);*/ return 1; } /* zap the context buffer */ memset(cpu[cpunum].context, 0, size); /* initialize the CPU and stash the context */ activecpu = cpunum; (*cpu[cpunum].intf.init)(); (*cpu[cpunum].intf.get_context)(cpu[cpunum].context); activecpu = -1; /* clear out the registered CPU for this family */ cpu_active_context[cpu[cpunum].family] = -1; /* make sure the total includes us */ totalcpu = cpunum + 1; return 0; }
void cpuintrf_init(running_machine *machine) { int mapindex; /* reset the cpuintrf array */ memset(cpuintrf, 0, sizeof(cpuintrf)); /* build the cpuintrf array */ for (mapindex = 0; mapindex < sizeof(cpuintrf_map) / sizeof(cpuintrf_map[0]); mapindex++) { int cputype = cpuintrf_map[mapindex].cputype; cpu_interface *intf = &cpuintrf[cputype]; cpuinfo info; /* start with the get_info routine */ intf->get_info = cpuintrf_map[mapindex].get_info; /* bootstrap the rest of the function pointers */ info.setinfo = NULL; (*intf->get_info)(CPUINFO_PTR_SET_INFO, &info); intf->set_info = info.setinfo; info.getcontext = NULL; (*intf->get_info)(CPUINFO_PTR_GET_CONTEXT, &info); intf->get_context = info.getcontext; info.setcontext = NULL; (*intf->get_info)(CPUINFO_PTR_SET_CONTEXT, &info); intf->set_context = info.setcontext; info.init = NULL; (*intf->get_info)(CPUINFO_PTR_INIT, &info); intf->init = info.init; info.reset = NULL; (*intf->get_info)(CPUINFO_PTR_RESET, &info); intf->reset = info.reset; info.exit = NULL; (*intf->get_info)(CPUINFO_PTR_EXIT, &info); intf->exit = info.exit; info.execute = NULL; (*intf->get_info)(CPUINFO_PTR_EXECUTE, &info); intf->execute = info.execute; info.burn = NULL; (*intf->get_info)(CPUINFO_PTR_BURN, &info); intf->burn = info.burn; info.disassemble = NULL; (*intf->get_info)(CPUINFO_PTR_DISASSEMBLE, &info); intf->disassemble = info.disassemble; info.translate = NULL; (*intf->get_info)(CPUINFO_PTR_TRANSLATE, &info); intf->translate = info.translate; /* get the instruction count pointer */ (*intf->get_info)(CPUINFO_PTR_INSTRUCTION_COUNTER, &info); intf->icount = info.icount; /* get other miscellaneous stuff */ intf->context_size = cputype_context_size(cputype); intf->address_shift = cputype_addrbus_shift(cputype, ADDRESS_SPACE_PROGRAM); /* also reset the active CPU context info */ cpu_active_context[cputype] = -1; } /* fill in any empty entries with the dummy CPU */ for (mapindex = 0; mapindex < CPU_COUNT; mapindex++) if (cpuintrf[mapindex].get_info == NULL) cpuintrf[mapindex] = cpuintrf[CPU_DUMMY]; /* zap the CPU data structure */ memset(cpu, 0, sizeof(cpu)); totalcpu = 0; memset(cpu_dasm_override, 0, sizeof(cpu_dasm_override)); /* reset the context stack */ memset(cpu_context_stack, -1, sizeof(cpu_context_stack)); cpu_context_stack_ptr = 0; /* nothing active, nothing executing */ activecpu = -1; executingcpu = -1; totalcpu = 0; /* compute information about the CPUs now if we have a machine */ if (Machine != NULL) { /* loop over all defined CPUs */ for (totalcpu = 0; totalcpu < CPU_COUNT; totalcpu++) { int cputype = Machine->drv->cpu[totalcpu].cpu_type; char familyname[256]; int j; /* stop when we hit a dummy */ if (cputype == CPU_DUMMY) break; /* fill in the type and interface */ cpu[totalcpu].intf = cpuintrf[cputype]; cpu[totalcpu].cputype = cputype; /* determine the family index */ strcpy(familyname, cputype_core_file(cputype)); for (j = 0; j < CPU_COUNT; j++) if (!strcmp(familyname, cputype_core_file(j))) { cpu[totalcpu].family = j; break; } } } }