static void InitDasm32025(void) { const char *p, **ops; word mask, bits; int bit; int i; ops = TMS32025Formats; i = 0; while (*ops) { p = *ops; mask = 0; bits = 0; bit = 15; while (*p && bit >= 0) { switch (*p++) { case '1': mask |= 1<<bit; bits |= 1<<bit; bit--; break; case '0': mask |= 1<<bit; bit--; break; case ' ': break; case 'a': case 'b': case 'c': case 'd': case 'k': case 'm': case 'n': case 'p': case 'r': case 's': case 't': case 'w': case 'x': bit --; break; default: osd_die("Invalid instruction encoding '%s %s'\n", ops[0],ops[1]); } } if (bit != -1 ) { osd_die("not enough bits in encoding '%s %s' %d\n", ops[0],ops[1],bit); } while (isspace(*p)) p++; if (*p) Op[i].extcode = *p; Op[i].bits = bits; Op[i].mask = mask; Op[i].fmt = ops[1]; Op[i].parse = ops[0]; ops += PTRS_PER_FORMAT; i++; } OpInizialized = 1; }
INLINE void timer_list_insert(mame_timer *timer) { mame_time expire = timer->enabled ? timer->expire : time_never; mame_timer *t, *lt = NULL; /* sanity checks for the debug build */ #ifdef MAME_DEBUG { int tnum = 0; /* loop over the timer list */ for (t = timer_head; t; t = t->next, tnum++) { if (t == timer) osd_die("This timer is already inserted in the list!\n"); if (tnum == MAX_TIMERS-1) osd_die("Timer list is full!\n"); } } #endif /* loop over the timer list */ for (t = timer_head; t; lt = t, t = t->next) { /* if the current list entry expires after us, we should be inserted before it */ if (compare_mame_times(t->expire, expire) > 0) { /* link the new guy in before the current list entry */ timer->prev = t->prev; timer->next = t; if (t->prev) t->prev->next = timer; else timer_head = timer; t->prev = timer; return; } } /* need to insert after the last one */ if (lt) lt->next = timer; else timer_head = timer; timer->prev = lt; timer->next = NULL; }
static void I386OP(fpu_group_d9)(void) /* Opcode 0xd9 */ { UINT8 modrm = FETCH(); if (modrm < 0xc0) { UINT32 ea = GetEA(modrm); switch ((modrm >> 3) & 0x7) { case 5: /* FLDCW */ { I.fpu_control_word = READ16(ea); CYCLES(1); /* TODO */ break; } case 7: /* FSTCW */ { WRITE16(ea, I.fpu_control_word); CYCLES(1); /* TODO */ break; } default: osd_die("I386: FPU Op D9 %02X at %08X\n", modrm, I.pc-2); } }
UINT32 bam2Autoincrement(void) { amFlag = 0; amOut = v60.reg[modVal&0x1F]; bamOffset = 0; switch (modDim) { case 10: v60.reg[modVal&0x1F]+=1; break; case 11: v60.reg[modVal&0x1F]+=4; break; default: osd_die("CPU - AM2 - 7 (t0 PC=%x)\n", PC); break; } return 1; }
UINT32 bam2Autodecrement(void) { amFlag = 0; bamOffset = 0; switch (modDim) { case 10: v60.reg[modVal&0x1F]-=1; break; case 11: v60.reg[modVal&0x1F]-=4; break; default: osd_die("CPU - BAM2 - 7 (PC=%06x)\n", PC); break; } amOut = v60.reg[modVal&0x1F]; return 1; }
INLINE void timer_list_remove(mame_timer *timer) { /* sanity checks for the debug build */ #ifdef MAME_DEBUG { mame_timer *t; int tnum = 0; /* loop over the timer list */ for (t = timer_head; t && t != timer; t = t->next, tnum++) ; if (t == NULL) osd_die ("timer not found in list"); } #endif /* remove it from the list */ if (timer->prev) timer->prev->next = timer->next; else timer_head = timer->next; if (timer->next) timer->next->prev = timer->prev; }
int cli_frontend_init (int argc, char **argv) { machine_config drv; char buffer[128]; char *cmd_name; int game_index; int i; gamename = NULL; game_index = -1; /* clear all core options */ memset(&options,0,sizeof(options)); /* create the rc object */ rc = cli_rc_create(); if (!rc) { osd_die ("error on rc creation\n"); } /* parse the commandline */ got_gamename = 0; if (rc_parse_commandline(rc, argc, argv, 2, config_handle_arg)) { osd_die ("error while parsing cmdline\n"); } /* determine global configfile name */ cmd_name = win_strip_extension(win_basename(argv[0])); if (!cmd_name) { osd_die ("who am I? cannot determine the name I was called with\n"); } sprintf (buffer, "%s.ini", cmd_name); /* parse mame.ini/mess.ini even if called with another name */ if (mame_stricmp(cmd_name, APPNAME) != 0) { if (parse_config (APPNAME".ini", NULL)) exit(1); } /* parse cmd_name.ini */ if (parse_config (buffer, NULL)) exit(1); #ifdef MAME_DEBUG if (parse_config( "debug.ini", NULL)) exit(1); #endif /* if requested, write out cmd_name.ini (normally "mame.ini") */ if (createconfig) { rc_save(rc, buffer, 0); exit(0); } if (showconfig) { sprintf (buffer, " %s running parameters", cmd_name); rc_write(rc, stdout, buffer); exit(0); } if (showusage) { fprintf(stdout, "Usage: %s [" GAMENOUN "] [options]\n" "Options:\n", cmd_name); /* actual help message */ rc_print_help(rc, stdout); exit(0); } /* no longer needed */ free(cmd_name); /* handle playback */ if (playbackname != NULL) { options.playback = mame_fopen(playbackname,0,FILETYPE_INPUTLOG,0); if (!options.playback) { osd_die("failed to open %s for playback\n", playbackname); } } /* check for game name embedded in .inp header */ if (options.playback) { inp_header inp_header; /* read playback header */ mame_fread(options.playback, &inp_header, sizeof(inp_header)); if (!isalnum(inp_header.name[0])) /* If first byte is not alpha-numeric */ mame_fseek(options.playback, 0, SEEK_SET); /* old .inp file - no header */ else { for (i = 0; (drivers[i] != 0); i++) /* find game and play it */ { if (strcmp(drivers[i]->name, inp_header.name) == 0) { game_index = i; gamename = (char *)drivers[i]->name; printf("Playing back previously recorded " GAMENOUN " %s (%s) [press return]\n", drivers[game_index]->name,drivers[game_index]->description); getchar(); break; } } } } /* check for frontend options, horrible 1234 hack */ if (frontend_help(gamename) != 1234) exit(0); gamename = win_basename(gamename); gamename = win_strip_extension(gamename); /* if not given by .inp file yet */ if (game_index == -1) { /* do we have a driver for this? */ for (i = 0; drivers[i]; i++) if (mame_stricmp(gamename,drivers[i]->name) == 0) { game_index = i; break; } } #ifdef MAME_DEBUG if (game_index == -1) { /* pick a random game */ if (strcmp(gamename,"random") == 0) { i = 0; while (drivers[i]) i++; /* count available drivers */ srand(time(0)); /* call rand() once to get away from the seed */ rand(); game_index = rand() % i; fprintf(stderr, "running %s (%s) [press return]",drivers[game_index]->name,drivers[game_index]->description); getchar(); } } #endif /* we give up. print a few approximate matches */ if (game_index == -1) { fprintf(stderr, "\n\"%s\" approximately matches the following\n" "supported " GAMESNOUN " (best match first):\n\n", gamename); show_approx_matches(); exit(1); } /* ok, got a gamename */ /* if this is a vector game, parse vector.ini first */ expand_machine_driver(drivers[game_index]->drv, &drv); if (drv.video_attributes & VIDEO_TYPE_VECTOR) if (parse_config ("vector.ini", NULL)) exit(1); /* nice hack: load source_file.ini (omit if referenced later any) */ { const game_driver *tmp_gd; const char *start; /* remove the path and the .c suffix from the source file name */ start = strrchr(drivers[game_index]->source_file, '/'); if (!start) start = strrchr(drivers[game_index]->source_file, '\\'); if (!start) start = drivers[game_index]->source_file - 1; sprintf(buffer, "%s", start + 1); buffer[strlen(buffer) - 2] = 0; tmp_gd = drivers[game_index]; while (tmp_gd != NULL) { if (strcmp(tmp_gd->name, buffer) == 0) break; tmp_gd = tmp_gd->clone_of; } if (tmp_gd == NULL) /* not referenced later, so load it here */ { strcat(buffer, ".ini"); if (parse_config (buffer, NULL)) exit(1); } } /* now load gamename.ini */ /* this possibly checks for clonename.ini recursively! */ if (parse_config (NULL, drivers[game_index])) exit(1); /* handle record option */ if (recordname) { options.record = mame_fopen(recordname,0,FILETYPE_INPUTLOG,1); if (!options.record) { osd_die("failed to open %s for recording\n", recordname); } } if (options.record) { inp_header inp_header; memset(&inp_header, '\0', sizeof(inp_header)); strcpy(inp_header.name, drivers[game_index]->name); /* MAME32 stores the MAME version numbers at bytes 9 - 11 * MAME DOS keeps this information in a string, the * Windows code defines them in the Makefile. */ /* inp_header.version[0] = 0; inp_header.version[1] = VERSION; inp_header.version[2] = BETA_VERSION; */ mame_fwrite(options.record, &inp_header, sizeof(inp_header)); } if (statename) options.savegame = statename; #if defined(MAME_DEBUG) && defined(NEW_DEBUGGER) if (debugscript) debug_source_script(debugscript); #endif /* need a decent default for debug width/height */ if (options.debug_width == 0) options.debug_width = 640; if (options.debug_height == 0) options.debug_height = 480; options.debug_depth = 8; /* no sound is indicated by a 0 samplerate */ if (!enable_sound) options.samplerate = 0; /* set the artwork options */ options.use_artwork = ARTWORK_USE_ALL; if (use_backdrops == 0) options.use_artwork &= ~ARTWORK_USE_BACKDROPS; if (use_overlays == 0) options.use_artwork &= ~ARTWORK_USE_OVERLAYS; if (use_bezels == 0) options.use_artwork &= ~ARTWORK_USE_BEZELS; if (!use_artwork) options.use_artwork = ARTWORK_USE_NONE; { /* first start with the game's built in orientation */ int orientation = drivers[game_index]->flags & ORIENTATION_MASK; options.ui_orientation = orientation; if (options.ui_orientation & ORIENTATION_SWAP_XY) { /* if only one of the components is inverted, switch them */ if ((options.ui_orientation & ROT180) == ORIENTATION_FLIP_X || (options.ui_orientation & ROT180) == ORIENTATION_FLIP_Y) options.ui_orientation ^= ROT180; } /* override if no rotation requested */ if (video_norotate) orientation = options.ui_orientation = ROT0; /* rotate right */ if (video_ror) { /* if only one of the components is inverted, switch them */ if ((orientation & ROT180) == ORIENTATION_FLIP_X || (orientation & ROT180) == ORIENTATION_FLIP_Y) orientation ^= ROT180; orientation ^= ROT90; } /* rotate left */ if (video_rol) { /* if only one of the components is inverted, switch them */ if ((orientation & ROT180) == ORIENTATION_FLIP_X || (orientation & ROT180) == ORIENTATION_FLIP_Y) orientation ^= ROT180; orientation ^= ROT270; } /* auto-rotate right (e.g. for rotating lcds), based on original orientation */ if (video_autoror && (drivers[game_index]->flags & ORIENTATION_SWAP_XY) ) { /* if only one of the components is inverted, switch them */ if ((orientation & ROT180) == ORIENTATION_FLIP_X || (orientation & ROT180) == ORIENTATION_FLIP_Y) orientation ^= ROT180; orientation ^= ROT90; } /* auto-rotate left (e.g. for rotating lcds), based on original orientation */ if (video_autorol && (drivers[game_index]->flags & ORIENTATION_SWAP_XY) ) { /* if only one of the components is inverted, switch them */ if ((orientation & ROT180) == ORIENTATION_FLIP_X || (orientation & ROT180) == ORIENTATION_FLIP_Y) orientation ^= ROT180; orientation ^= ROT270; } /* flip X/Y */ if (video_flipx) orientation ^= ORIENTATION_FLIP_X; if (video_flipy) orientation ^= ORIENTATION_FLIP_Y; blit_flipx = ((orientation & ORIENTATION_FLIP_X) != 0); blit_flipy = ((orientation & ORIENTATION_FLIP_Y) != 0); blit_swapxy = ((orientation & ORIENTATION_SWAP_XY) != 0); if( options.vector_width == 0 && options.vector_height == 0 ) { options.vector_width = 640; options.vector_height = 480; } if( blit_swapxy ) { int temp; temp = options.vector_width; options.vector_width = options.vector_height; options.vector_height = temp; } } return game_index; }
static void I386OP(fpu_group_d8)(void) /* Opcode 0xd8 */ { UINT8 modrm = FETCH(); osd_die("I386: FPU Op D8 %02X at %08X\n", modrm, I.pc-2); }
unsigned Dasm32025(char *str, unsigned pc) { int a, b, c, d, k, m, n, p, r, s, t, w, x; /* these can all be filled in by parsing an instruction */ int i; int op; int cnt = 1; int code; int bit; char *strtmp; const char *cp; /* character pointer in OpFormats */ if (!OpInizialized) InitDasm32025(); op = -1; /* no matching opcode */ code = READOP16(pc); for ( i = 0; i < MAX_OPS; i++) { if ((code & Op[i].mask) == Op[i].bits) { if (op != -1) { printf("Error: opcode %04Xh matches %d (%s) and %d (%s)\n", code,i,Op[i].fmt,op,Op[op].fmt); } op = i; } } if (op == -1) { sprintf(str,"???? dw %04Xh",code); return cnt; } strtmp = str; if (Op[op].extcode) { bit = 31; code <<= 16; code |= READARG16(pc+cnt); cnt++; } else { bit = 15; } /* shift out operands */ cp = Op[op].parse; a = b = c = d = k = m = n = p = r = s = t = w = x = 0; while (bit >= 0) { /* printf("{%c/%d}",*cp,bit); */ switch(*cp) { case 'a': a <<=1; a |= ((code & (1<<bit)) ? 1 : 0); bit--; break; case 'b': b <<=1; b |= ((code & (1<<bit)) ? 1 : 0); bit--; break; case 'c': c <<=1; c |= ((code & (1<<bit)) ? 1 : 0); bit--; break; case 'd': d <<=1; d |= ((code & (1<<bit)) ? 1 : 0); bit--; break; case 'k': k <<=1; k |= ((code & (1<<bit)) ? 1 : 0); bit--; break; case 'm': m <<=1; m |= ((code & (1<<bit)) ? 1 : 0); bit--; break; case 'n': n <<=1; n |= ((code & (1<<bit)) ? 1 : 0); bit--; break; case 'p': p <<=1; p |= ((code & (1<<bit)) ? 1 : 0); bit--; break; case 'r': r <<=1; r |= ((code & (1<<bit)) ? 1 : 0); bit--; break; case 's': s <<=1; s |= ((code & (1<<bit)) ? 1 : 0); bit--; break; case 't': t <<=1; t |= ((code & (1<<bit)) ? 1 : 0); bit--; break; case 'w': w <<=1; w |= ((code & (1<<bit)) ? 1 : 0); bit--; break; case 'x': bit--; break; case ' ': break; case '1': case '0': bit--; break; case '\0': osd_die("premature end of parse string, opcode %x, bit = %d\n",code,bit); } cp++; } /* now traverse format string */ cp = Op[op].fmt; while (*cp) { if (*cp == '%') { char num[30], *q; cp++; switch (*cp++) { case 'A': sprintf(num,"$%02X",a); break; case 'B': sprintf(num,"$%04X",b); break; case 'C': sprintf(num,"%s",cmpmode[c]); break; case 'D': sprintf(num,"%02Xh",d); break; case 'K': sprintf(num,"%d",k); break; case 'M': sprintf(num,"%s",arith[m]); break; case 'N': sprintf(num,"%s",nextar[n]); break; case 'P': sprintf(num,"PA$%01X",p); break; case 'R': sprintf(num,"AR%d",r); break; case 'S': sprintf(num,",%d",s); break; case 'T': sprintf(num,"%01Xh",t); break; case 'W': sprintf(num,"%04Xh",w); break; case 'X': break; default: osd_die("illegal escape character in format '%s'\n",Op[op].fmt); } q = num; while (*q) *str++ = *q++; *str = '\0'; } else { *str++ = *cp++; *str = '\0'; } } return cnt; }
UINT32 bam2Error3(void) { osd_die("CPU - BAM2 - 3 (PC=%06x)\n", PC); return 0; /* never reached, osd_die won't return */ }
UINT32 am2Error5(void) { osd_die("CPU - AM2 - 5 (PC=%06x)\n", PC); return 0; /* never reached, osd_die won't return */ }
static void cirrus_update_24bpp(mame_bitmap *bitmap, struct crtc6845 *crtc) { osd_die("NYI"); }