Beispiel #1
0
struct MC6809 *mc6809_new(void) {
	struct MC6809 *cpu = xzalloc(sizeof(*cpu));
	cpu->free = mc6809_free;
	cpu->reset = mc6809_reset;
	cpu->run = mc6809_run;
	cpu->jump = mc6809_jump;
	// External handlers
	cpu->read_cycle = dummy_read_cycle;
	cpu->write_cycle = dummy_write_cycle;
	mc6809_reset(cpu);
	return cpu;
}
Beispiel #2
0
int main(int argc,char *argv[])
{
  struct userdata ud;
  int             rc;
  
  if (argc == 1)
  {
    fprintf(stderr,"usage: %s imagefile loadaddr ... \n",argv[0]);
    fprintf(stderr,"\tloadaddr = HHHH[r] where H = hexdigit,\n");
    fprintf(stderr,"\t           and r = r (for read only)\n");
    return EXIT_FAILURE;
  }
  
  ud.memory = malloc(65536uL * sizeof(mc6809byte__t));
  if (ud.memory == NULL)
  {
    perror("malloc()");
    return EXIT_FAILURE;
  }
  
  ud.readonly = calloc(65536uL,sizeof(bool));
  if (ud.readonly == NULL)
  {
    perror("malloc()");
    free(ud.memory);
    return EXIT_FAILURE;
  }
  
  ud.cpu.user  = &ud;
  ud.cpu.read  = cpu_read;
  ud.cpu.write = cpu_write;
  ud.cpu.fault = cpu_fault;
  
  ud.dis.user  = &ud;
  ud.dis.read  = dis_read;
  ud.dis.fault = dis_fault;
  
  for ( int i = 1 ; i < argc ; i += 2 )
  {
    if (!loadimage(&ud,argv[i],argv[i + 1]))
    {
      perror(argv[i]);
      free(ud.readonly);
      free(ud.memory);
      return EXIT_FAILURE;
    }
  }
  
  mc6809_reset(&ud.cpu);
  rc = mc6809_run(&ud.cpu);
  if (rc != 0)
  {
    switch(rc)
    {
      default:
      case MC6809_FAULT_INTERNAL_ERROR:
           fprintf(stderr,"An internal error occured that should not happen.\n");
           break;
           
      case MC6809_FAULT_INSTRUCTION:
           fprintf(stderr,"Illegal instruction @ %04X\n",ud.cpu.pc.w - 1);
           break;
           
      case MC6809_FAULT_ADDRESS_MODE:
           fprintf(stderr,"Illegal addressing mode in instruction @ %04X\n",ud.cpu.instpc);
           break;
           
      case MC6809_FAULT_EXG:
           fprintf(stderr,"Undefined EXG behavior in instruction @ %04X\n",ud.cpu.instpc);
           break;
           
      case MC6809_FAULT_TFR:
           fprintf(stderr,"Undefined TFR behavior in instruction @ %04X\n",ud.cpu.instpc);
           break;
           
      case MC6809_FAULT_user:
           fprintf(stderr,
                        "This can be used to signal other errors, but you should\n"
                        "only see this if you check the source code.\n"
                );
           break;
    }
    
    dumpcore(&ud);
  }
  
  free(ud.readonly);
  free(ud.memory);
  
  return rc;
}