BxEvent * config_interface_notify_callback(void *unused, BxEvent *event) { event->retcode = -1; switch (event->type) { case BX_SYNC_EVT_TICK: event->retcode = 0; return event; case BX_SYNC_EVT_ASK_PARAM: event->retcode = event->u.param.param->text_ask(stdin, stderr); return event; case BX_SYNC_EVT_LOG_ASK: { int level = event->u.logmsg.level; fprintf(stderr, "========================================================================\n"); fprintf(stderr, "Event type: %s\n", SIM->get_log_level_name (level)); fprintf(stderr, "Device: %s\n", event->u.logmsg.prefix); fprintf(stderr, "Message: %s\n\n", event->u.logmsg.msg); fprintf(stderr, "A %s has occurred. Do you want to:\n", SIM->get_log_level_name (level)); fprintf(stderr, " cont - continue execution\n"); fprintf(stderr, " alwayscont - continue execution, and don't ask again.\n"); fprintf(stderr, " This affects only %s events from device %s\n", SIM->get_log_level_name (level), event->u.logmsg.prefix); fprintf(stderr, " die - stop execution now\n"); fprintf(stderr, " abort - dump core %s\n", BX_HAVE_ABORT ? "" : "(Disabled)"); #if BX_DEBUGGER fprintf(stderr, " debug - continue and return to bochs debugger\n"); #endif #if BX_GDBSTUB fprintf(stderr, " debug - hand control to gdb\n"); #endif int choice; ask: if (ask_menu("Choose one of the actions above: [%s] ", "", log_action_n_choices, log_action_ask_choices, 2, &choice) < 0) event->retcode = -1; // return 0 for continue, 1 for alwayscontinue, 2 for die, 3 for debug. if (!BX_HAVE_ABORT && choice==BX_LOG_ASK_CHOICE_DUMP_CORE) goto ask; fflush(stdout); fflush(stderr); event->retcode = choice; } return event; case BX_ASYNC_EVT_REFRESH: case BX_ASYNC_EVT_DBG_MSG: // The text mode interface does not use these events, so just ignore // them. return event; default: fprintf(stderr, "Control panel: notify callback called with event type %04x\n", event->type); return event; } assert(0); // switch statement should return }
void bx_log_options(int individual) { if (individual) { int done = 0; while (!done) { bx_print_log_action_table(); Bit32s id, level, action; Bit32s maxid = SIM->get_n_log_modules(); if (ask_int(log_options_prompt1, "", -1, maxid-1, -1, &id) < 0) return; if (id < 0) return; fprintf(stderr, "Editing log options for the device %s\n", SIM->get_prefix(id)); for (level=0; level<SIM->get_max_log_level(); level++) { char prompt[1024]; int default_action = SIM->get_log_action(id, level); sprintf(prompt, "Enter action for %s event: [%s] ", SIM->get_log_level_name(level), SIM->get_action_name(default_action)); // don't show the no change choice (choices=3) if (ask_menu(prompt, "", log_level_n_choices_normal, log_level_choices, default_action, &action)<0) return; SIM->set_log_action(id, level, action); } } } else { // provide an easy way to set log options for all devices at once bx_print_log_action_table(); for (int level=0; level<SIM->get_max_log_level(); level++) { char prompt[1024]; int action, default_action = 3; // default to no change sprintf(prompt, "Enter action for %s event on all devices: [no change] ", SIM->get_log_level_name(level)); // do show the no change choice (choices=4) if (ask_menu(prompt, "", log_level_n_choices_normal+1, log_level_choices, default_action, &action)<0) return; if (action < 3) { SIM->set_default_log_action(level, action); SIM->set_log_action(-1, level, action); } } } }
int bx_param_enum_c::text_ask(FILE *fpin, FILE *fpout) { fprintf(fpout, "\n"); const char *prompt = get_ask_format(); const char *help = get_description(); if (prompt == NULL) { // default prompt, if they didn't set an ask format string fprintf(fpout, "%s = ", get_name()); text_print(fpout); fprintf(fpout, "\n"); prompt = "Enter new value or '?' for help: [%s] "; } Bit32s n = (Bit32s)(get() - min); int status = ask_menu(prompt, help, (Bit32u)(max-min+1), choices, n, &n); if (status < 0) return status; n += (Bit32s)min; set(n); return 0; }
int main (int argc, char *argv[]) { Bit64s sectors = 0; char filename[256]; char bochsrc_line[256]; WRITE_IMAGE write_function=NULL; #ifdef WIN32 WRITE_IMAGE_WIN32 writefn_win32=NULL; #endif if (!parse_cmdline (argc, argv)) myexit(1); print_banner (); if (bx_interactive) { if (ask_menu (fdhd_menu, fdhd_n_choices, fdhd_choices, bx_hdimage, &bx_hdimage) < 0) fatal (EOF_ERR); } if (bx_hdimage) { unsigned int cyl; int hdsize, heads=16, spt=63; int mode; if (bx_interactive) { if (ask_menu (hdmode_menu, hdmode_n_choices, hdmode_choices, bx_hdimagemode, &mode) < 0) fatal (EOF_ERR); if (ask_int ("\nEnter the hard disk size in megabytes, between 1 and 129023\n", 1, 129023, bx_hdsize, &hdsize) < 0) fatal (EOF_ERR); } else { mode = bx_hdimagemode; hdsize = bx_hdsize; } cyl = (unsigned int) (hdsize*1024.0*1024.0/16.0/63.0/512.0); assert (cyl < 262144); sectors = cyl*heads*spt; printf ("\nI will create a '%s' hard disk image with\n", hdmode_choices[mode]); printf (" cyl=%d\n", cyl); printf (" heads=%d\n", heads); printf (" sectors per track=%d\n", spt); printf (" total sectors=" FMT_LL "d\n", sectors); printf (" total size=%.2f megabytes\n", (float)(Bit64s)(sectors/2)/1024.0); if (bx_interactive) { if (!strlen(bx_filename)) strcpy(bx_filename, "c.img"); if (ask_string ("\nWhat should I name the image?\n", bx_filename, filename) < 0) fatal (EOF_ERR); } else { strcpy(filename, bx_filename); } sprintf (bochsrc_line, "ata0-master: type=disk, path=\"%s\", mode=%s, cylinders=%d, heads=%d, spt=%d", filename, hdmode_choices[mode], cyl, heads, spt); switch (mode) { case 1: write_function=make_sparse_image; break; case 2: write_function=make_growing_image; break; default: #ifdef WIN32 writefn_win32=make_flat_image_win32; #else write_function=make_flat_image; #endif } } else { int fdsize, cyl=0, heads=0, spt=0; if (bx_interactive) { if (ask_menu (fdsize_menu, fdsize_n_choices, fdsize_choices, bx_fdsize_idx, &fdsize) < 0) fatal (EOF_ERR); } else { fdsize = bx_fdsize_idx; } switch (fdsize) { case 0: cyl=40; heads=1; spt=8; break; /* 0.16 meg */ case 1: cyl=40; heads=1; spt=9; break; /* 0.18 meg */ case 2: cyl=40; heads=2; spt=8; break; /* 0.32 meg */ case 3: cyl=40; heads=2; spt=9; break; /* 0.36 meg */ case 4: cyl=80; heads=2; spt=9; break; /* 0.72 meg */ case 5: cyl=80; heads=2; spt=15; break; /* 1.2 meg */ case 6: cyl=80; heads=2; spt=18; break; /* 1.44 meg */ case 7: cyl=80; heads=2; spt=21; break; /* 1.68 meg */ case 8: cyl=82; heads=2; spt=21; break; /* 1.72 meg */ case 9: cyl=80; heads=2; spt=36; break; /* 2.88 meg */ default: fatal ("ERROR: fdsize out of range"); } sectors = cyl*heads*spt; printf ("I will create a floppy image with\n"); printf (" cyl=%d\n", cyl); printf (" heads=%d\n", heads); printf (" sectors per track=%d\n", spt); printf (" total sectors=" FMT_LL "d\n", sectors); printf (" total bytes=" FMT_LL "d\n", sectors*512); if (bx_interactive) { if (!strlen(bx_filename)) strcpy(bx_filename, "a.img"); if (ask_string ("\nWhat should I name the image?\n", bx_filename, filename) < 0) fatal (EOF_ERR); } else { strcpy(filename, bx_filename); } sprintf (bochsrc_line, "floppya: image=\"%s\", status=inserted", filename); write_function=make_flat_image; } if (sectors < 1) fatal ("ERROR: Illegal disk size!"); if (strlen (filename) < 1) fatal ("ERROR: Illegal filename"); #ifdef WIN32 if (writefn_win32 != NULL) { make_image_win32 (sectors, filename, writefn_win32); } else #endif { make_image (sectors, filename, write_function); } printf ("\nI wrote " FMT_LL "u bytes to ", sectors*512); printf ("%s.\n", filename); printf ("\nThe following line should appear in your bochsrc:\n"); printf (" %s\n", bochsrc_line); #ifdef WIN32 if (OpenClipboard(NULL)) { HGLOBAL hgClip; EmptyClipboard(); hgClip = GlobalAlloc(GMEM_DDESHARE, (strlen(bochsrc_line) + 1)); strcpy((char *)GlobalLock(hgClip), bochsrc_line); GlobalUnlock(hgClip); SetClipboardData(CF_TEXT, hgClip); CloseClipboard(); printf("(The line is stored in your windows clipboard, use CTRL-V to paste)\n"); } #endif myexit(0); // make picky compilers (c++, gcc) happy, // even though we leave via 'myexit' just above return 0; }
void do_get_new_skill() { char *items[4]; s32b skl[4]; s32b val[4], mod[4]; bool *used; s32b *available_skills; s32b max = 0, max_a = 0, res, i; C_MAKE(used, max_s_idx, bool); C_MAKE(available_skills, max_s_idx, s32b); /* Check if some skills didn't influence other stuff */ recalc_skills(TRUE); /* Grab the ones we can gain */ max = 0; for (i = 0; i < max_s_idx; i++) { if (has_flag(&s_info[i], FLAG_RANDOM_GAIN)) available_skills[max++] = i; } available_skills[max++] = -1; /* Init */ for (max = 0; max < max_s_idx; max++) { used[max] = FALSE; } /* Count the number of available skills */ while (available_skills[max_a] != -1) max_a++; /* Get 4 skills */ for (max = 0; max < 4; max++) { s32b i; skill_type *s_ptr; /* Get an non used skill */ do { i = rand_int(max_a); /* Does it pass the check? */ if (!magik(get_flag(&s_info[i], FLAG_RANDOM_GAIN))) continue; } while (used[available_skills[i]]); s_ptr = &s_info[available_skills[i]]; used[available_skills[i]] = TRUE; if (s_ptr->mod) { if (s_ptr->mod < 500) { val[max] = s_ptr->mod * 1; mod[max] = 100; if (mod[max] + s_ptr->mod > 500) mod[max] = 500 - s_ptr->mod; } else { val[max] = s_ptr->mod * 3; mod[max] = 0; } } else { mod[max] = 300; val[max] = 1000; } if (s_ptr->value + val[max] > SKILL_MAX) val[max] = SKILL_MAX - s_ptr->value; skl[max] = available_skills[i]; items[max] = (char *)string_make(format("%-40s: +%02ld.%03ld value, +%01d.%03d modifier", s_ptr->name, val[max] / SKILL_STEP, val[max] % SKILL_STEP, mod[max] / SKILL_STEP, mod[max] % SKILL_STEP)); } while (TRUE) { res = ask_menu("Choose a skill to learn(a-d to choose, ESC to cancel)?", (char **)items, 4); /* Ok ? lets learn ! */ if (res > -1) { skill_type *s_ptr; bool oppose = FALSE; s32b oppose_skill = -1; /* Check we don't oppose an existing skill */ for (i = 0; i < max_s_idx; i++) { if ((flag_get(&s_info[i].action, skl[res]) == SKILL_EXCLUSIVE) && (s_info[i].value != 0)) { oppose = TRUE; oppose_skill = i; break; } } /* Ok we oppose, so be sure */ if (oppose) { cptr msg; /* * Because this is SO critical a question, we must flush * input to prevent killing character off -- pelpel */ flush(); /* Prepare prompt */ msg = format("This skill is mutually exclusive with " "at least %s, continue?", s_info[oppose_skill].name); /* The player rejected the choice */ if (!get_check(msg)) continue; } s_ptr = &s_info[skl[res]]; s_ptr->value += val[res]; s_ptr->mod += mod[res]; if (mod[res]) { msg_format("You can now learn the %s skill.", s_ptr->name); } else { msg_format("Your knowledge of the %s skill increases.", s_ptr->name); } break; } } /* Free them ! */ for (max = 0; max < 4; max++) { string_free(items[max]); } /* Check if some skills didn't influence other stuff */ recalc_skills(FALSE); C_FREE(used, max_s_idx, bool); C_FREE(available_skills, max_s_idx, s32b); }