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; }
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; }