|
|
1.1 ! root 1: /* ! 2: * UAE - The Un*x Amiga Emulator ! 3: * ! 4: * Text-based user interface ! 5: * Sie haben es sich verdient! ! 6: * ! 7: * Copyright 1996 Tim Gunn, Bernd Schmidt ! 8: */ ! 9: ! 10: #include "sysconfig.h" ! 11: #include "sysdeps.h" ! 12: ! 13: #include <stdio.h> ! 14: #include <ctype.h> ! 15: ! 16: #include "config.h" ! 17: #include "options.h" ! 18: #include "os.h" ! 19: #include "autoconf.h" ! 20: #include "tui.h" ! 21: #include "gui.h" ! 22: #include "memory.h" ! 23: ! 24: char *screenmodes[] = { "320x200", "320x240", "320x400", "640x480", "800x600" }; ! 25: char *colormodes[] = { "256 colors", "32768 colors", "65536 colors", ! 26: "256 colors dithered", "16 colors dithered", "16 million colors" }; ! 27: ! 28: int quit_program; ! 29: ! 30: char mountvol[256] = "\0"; ! 31: char mountdir[256] = "\0"; ! 32: int mountok=0; ! 33: ! 34: void gui_led(int led, int on) ! 35: { ! 36: } ! 37: void gui_filename(int num, char *name) ! 38: { ! 39: } ! 40: static void getline(char *p) ! 41: { ! 42: } ! 43: void gui_handle_events(void) ! 44: { ! 45: } ! 46: ! 47: static void save_options(FILE *f) ! 48: { ! 49: /* We only get here if allow_save is true, so... */ ! 50: fprintf(f, "-o\n"); ! 51: if (use_debugger) ! 52: fprintf(f, "-D\n"); ! 53: fprintf(f, "-r %s\n", romfile); ! 54: fprintf(f, "-0 %s\n", df0); ! 55: fprintf(f, "-1 %s\n", df1); ! 56: fprintf(f, "-2 %s\n", df2); ! 57: fprintf(f, "-3 %s\n", df3); ! 58: fprintf(f, "-p %s\n", prtname); ! 59: fprintf(f, "-S %d\n", produce_sound); ! 60: if (fake_joystick) ! 61: fprintf(f, "-J\n"); ! 62: fprintf(f, "-l %s\n", (keyboard_lang == KBD_LANG_DE ? "de" ! 63: : keyboard_lang == KBD_LANG_US ? "us" ! 64: : keyboard_lang == KBD_LANG_SE ? "se" ! 65: : keyboard_lang == KBD_LANG_FR ? "fr" ! 66: : keyboard_lang == KBD_LANG_IT ? "it" ! 67: : "FOO")); ! 68: fprintf(f, "-f %d\n", framerate); ! 69: fprintf(f, "-d %d\n", screen_res); ! 70: if (correct_aspect) ! 71: fprintf(f, "-C\n"); ! 72: fprintf(f, "-H %d\n", color_mode); ! 73: if (fastmem_size > 0) ! 74: fprintf(f, "-F %d\n", fastmem_size / 0x100000); ! 75: if (bogomem_size > 0) ! 76: fprintf(f, "-s %d\n", bogomem_size / 0x40000); ! 77: fprintf(f, "-c %d\n", chipmem_size / 0x80000); ! 78: if (!automount_uaedev) ! 79: fprintf(f, "-a\n"); ! 80: fprintf(f, "-B %d\n", sound_desired_bsiz); ! 81: fprintf(f, "-b %d\n", sound_desired_bits); ! 82: fprintf(f, "-R %d\n", sound_desired_freq); ! 83: ! 84: write_filesys_config(f); ! 85: } ! 86: ! 87: void gui_exit() ! 88: { ! 89: if (allow_save) { ! 90: if (tui_backup_optionsfile() == 0) { ! 91: FILE *f = fopen(optionsfile, "w"); ! 92: if (f == NULL) { ! 93: fprintf(stderr, "Error saving options file!\n"); ! 94: return; ! 95: } ! 96: save_options(f); ! 97: fclose(f); ! 98: } ! 99: } ! 100: } ! 101: ! 102: static const char *mainmenu[] = { ! 103: "D - Disk settings", ! 104: "V - Video settings", ! 105: "M - Memory settings", ! 106: "H - Hard disk settings", ! 107: "S - Sound settings", ! 108: "O - Other settings", ! 109: NULL ! 110: }; ! 111: ! 112: static const char *diskmenu[] = { ! 113: "0 - change DF0:", ! 114: "1 - change DF1:", ! 115: "2 - change DF2:", ! 116: "3 - change DF3:", ! 117: NULL ! 118: }; ! 119: ! 120: static const char *videomenu[] = { ! 121: "1 - Change resolution", ! 122: "2 - Change color mode", ! 123: "3 - Toggle aspect correction", ! 124: "4 - Change framerate", ! 125: NULL ! 126: }; ! 127: ! 128: static const char *memmenu[] = { ! 129: "1 - Change fastmem size", ! 130: "2 - Change chipmem size", ! 131: "3 - Change slowmem size", ! 132: NULL ! 133: }; ! 134: ! 135: static const char *soundmenu[] = { ! 136: "1 - Change sound emulation", ! 137: NULL ! 138: }; ! 139: ! 140: static const char *miscmenu[] = { ! 141: "1 - Toggle keypad joystick emulation", ! 142: "2 - Select ROM image", ! 143: NULL ! 144: }; ! 145: ! 146: static const char *hdmenu[] = { ! 147: "1 - Enable/Disable HardDrive file", ! 148: "2 - Change Mounted volume name", ! 149: "3 - Change Mounted volume path", ! 150: "4 - Enable/Disable Mounted volume", ! 151: NULL ! 152: }; ! 153: ! 154: static int makemenu(const char **menu, int x, int y) ! 155: { ! 156: const char **m = menu; ! 157: int maxlen = 0, count = 0; ! 158: int w; ! 159: ! 160: while (*m != NULL) { ! 161: int l = strlen(*m); ! 162: if (l > maxlen) ! 163: maxlen = l; ! 164: m++; count++; ! 165: } ! 166: w = tui_dlog(x, y, x + maxlen + 2, y + count + 1); ! 167: tui_drawbox(w); ! 168: tui_selwin(w); ! 169: y = 2; ! 170: while (*menu != NULL) { ! 171: tui_gotoxy(2, y++); ! 172: tui_puts(*menu++); ! 173: } ! 174: tui_selwin(0); ! 175: return w; ! 176: } ! 177: ! 178: static char tmpbuf[256]; ! 179: ! 180: static char *trimfilename(char *s, size_t n) ! 181: { ! 182: size_t i; ! 183: if (n > 250) ! 184: n = 250; ! 185: if (strlen(s) == 0) ! 186: strcpy(tmpbuf, "none"); ! 187: else if (strlen(s) < n) ! 188: strcpy(tmpbuf, s); ! 189: else { ! 190: tmpbuf[0] = '^'; ! 191: strcpy(tmpbuf + 1, s + strlen(s) - n + 2); ! 192: } ! 193: for (i = strlen(tmpbuf); i < n; i++) ! 194: tmpbuf[i] = ' '; ! 195: tmpbuf[i] = 0; ! 196: return tmpbuf; ! 197: } ! 198: ! 199: static void print_configuration(void) ! 200: { ! 201: char tmp[256]; ! 202: int y = 5; ! 203: ! 204: /* tui_clrarea(35,4,79,20);*/ ! 205: ! 206: tui_gotoxy(35, y++); sprintf(tmp, "Disk file DF0: %s", trimfilename(df0, tui_cols() - 50)); tui_puts(tmp); ! 207: tui_gotoxy(35, y++); sprintf(tmp, "Disk file DF1: %s", trimfilename(df1, tui_cols() - 50)); tui_puts(tmp); ! 208: tui_gotoxy(35, y++); sprintf(tmp, "Disk file DF2: %s", trimfilename(df2, tui_cols() - 50)); tui_puts(tmp); ! 209: tui_gotoxy(35, y++); sprintf(tmp, "Disk file DF3: %s", trimfilename(df3, tui_cols() - 50)); tui_puts(tmp); ! 210: y++; ! 211: tui_gotoxy(35, y++); ! 212: sprintf(tmp, "VIDEO: %-7s %-19s ",screenmodes[screen_res], colormodes[color_mode]); ! 213: tui_puts(tmp); ! 214: ! 215: tui_gotoxy(42, y++); ! 216: if (correct_aspect) ! 217: tui_puts("Aspect corrected "); ! 218: else ! 219: tui_puts("Not aspect corrected"); ! 220: tui_gotoxy(42, y++); ! 221: tui_puts("drawing every "); ! 222: switch(framerate) { ! 223: case 1: break; ! 224: case 2: tui_puts("2nd "); break; ! 225: case 3: tui_puts("3rd "); break; ! 226: default: sprintf(tmp, "%dth ",framerate); tui_puts(tmp); break; ! 227: } ! 228: tui_puts("frame. "); ! 229: y++; ! 230: tui_gotoxy(35, y++); ! 231: sprintf(tmp, "MEMORY: %4dK chip; %4dK fast; %4dK slow",chipmem_size/1024,fastmem_size/1024,bogomem_size/1024); ! 232: tui_puts(tmp); ! 233: ! 234: tui_gotoxy(35, y++); ! 235: sprintf(tmp, "ROM IMAGE: %s", trimfilename(romfile, tui_cols() - 50)); ! 236: tui_puts(tmp); ! 237: tui_gotoxy(35, y++); ! 238: if (!sound_available) ! 239: tui_puts("SOUNDS: Not available"); ! 240: else { ! 241: switch (produce_sound) { ! 242: case 0: tui_puts("SOUND: 0 (Off) "); break; ! 243: case 1: tui_puts("SOUND: 1 (Off, but emulated) "); break; ! 244: case 2: tui_puts("SOUND: 2 (On) "); break; ! 245: case 3: tui_puts("SOUND: 3 (On, emulated perfectly)"); break; ! 246: } ! 247: } ! 248: ! 249: tui_gotoxy(35,y++); ! 250: if(fake_joystick==1) { ! 251: tui_puts("JOYSTICK: using keypad emulation"); ! 252: } else { ! 253: if (joystickpresent) ! 254: tui_puts("JOYSTICK: using joystick #0 "); ! 255: else ! 256: tui_puts("JOYSTICK: no joystick emulation "); ! 257: } ! 258: ! 259: tui_gotoxy(35,y++); ! 260: tui_puts("HARDDISK: "); ! 261: if(hardfile_size>16) { ! 262: sprintf(tmp, "Current Harddisk file = %d K is", hardfile_size/1024); ! 263: tui_puts(tmp); ! 264: if (automount_uaedev==1) { ! 265: tui_puts(" active"); ! 266: } else { ! 267: tui_puts(" not active"); ! 268: } ! 269: } else { ! 270: tui_puts("No Harddisk file available "); ! 271: } ! 272: ! 273: tui_gotoxy(35,y++); ! 274: if(mountok==1) { ! 275: sprintf(tmp, "Mounting volume %s at %s",mountvol,mountdir); tui_puts(tmp); ! 276: } ! 277: tui_refresh(); ! 278: } ! 279: ! 280: static void HDOptions(void) ! 281: { ! 282: char *buff; ! 283: char tmp[256]; ! 284: ! 285: int w = makemenu(hdmenu, 3, 5); ! 286: ! 287: for (;;){ ! 288: int c; ! 289: ! 290: tui_selwin(0); ! 291: print_configuration(); ! 292: tui_refresh(); ! 293: tui_selwin(w); ! 294: tui_refresh(); ! 295: c = tui_getc(); ! 296: if (c == 27 || c == 13) ! 297: break; ! 298: switch(c) { ! 299: case '1': ! 300: automount_uaedev=!automount_uaedev; break; ! 301: case '2': ! 302: tui_wgets(mountvol, "Enter mounted volume name", 78); ! 303: if(mountvol[strlen(mountvol)-1]==':') { ! 304: mountvol[strlen(mountvol)-1]=0; } ! 305: break; ! 306: case '3': ! 307: tui_wgets(mountdir, "Enter mounted volume path", 78); ! 308: break; ! 309: case '4': mountok=!mountok; break; ! 310: } ! 311: } ! 312: tui_dlogdie(w); ! 313: } ! 314: ! 315: static void DiskOptions(void) ! 316: { ! 317: char buf[256], tmp[256]; ! 318: int w = makemenu(diskmenu, 3, 5); ! 319: ! 320: for (;;) { ! 321: char *sel; ! 322: int c; ! 323: ! 324: tui_selwin(0); ! 325: print_configuration(); ! 326: tui_refresh(); ! 327: tui_selwin(w); ! 328: tui_refresh(); ! 329: ! 330: c = tui_getc(); ! 331: if (c == 27 || c == 13) ! 332: break; ! 333: switch(c) { ! 334: case '0': ! 335: sel = tui_filereq("*.adf", df0); ! 336: if (sel == NULL) ! 337: break; ! 338: strcpy(df0, sel); ! 339: break; ! 340: case '1': ! 341: sel = tui_filereq("*.adf", df1); ! 342: if (sel == NULL) ! 343: break; ! 344: strcpy(df1, sel); ! 345: break; ! 346: case '2': ! 347: sel = tui_filereq("*.adf", df2); ! 348: if (sel == NULL) ! 349: break; ! 350: strcpy(df2, sel); ! 351: break; ! 352: case '3': ! 353: sel = tui_filereq("*.adf", df3); ! 354: if (sel == NULL) ! 355: break; ! 356: strcpy(df3, sel); ! 357: break; ! 358: } ! 359: } ! 360: tui_dlogdie(w); ! 361: } ! 362: ! 363: static void VideoOptions(void) ! 364: { ! 365: char tmp[256]; ! 366: int w = makemenu(videomenu, 3, 5); ! 367: ! 368: for (;;) { ! 369: int c; ! 370: ! 371: tui_selwin(0); ! 372: print_configuration(); ! 373: tui_refresh(); ! 374: tui_selwin(w); ! 375: tui_refresh(); ! 376: ! 377: c = tui_getc(); ! 378: if (c == 27 || c == 13) ! 379: break; ! 380: switch(c) { ! 381: case 49: ! 382: screen_res++; ! 383: if (screen_res > MAX_SCREEN_MODES) ! 384: screen_res=0; ! 385: break; ! 386: case 50: ! 387: color_mode++; ! 388: if (color_mode > MAX_COLOR_MODES) ! 389: color_mode=0; ! 390: break; ! 391: case 51: ! 392: correct_aspect = !correct_aspect; ! 393: break; ! 394: case 52: ! 395: framerate++; ! 396: if (framerate > 9) ! 397: framerate=1; ! 398: break; ! 399: } ! 400: } ! 401: tui_dlogdie(w); ! 402: } ! 403: ! 404: static void MemoryOptions(void) ! 405: { ! 406: int w = makemenu(memmenu, 3, 5); ! 407: for (;;) { ! 408: int c; ! 409: ! 410: tui_selwin(0); ! 411: print_configuration(); ! 412: tui_refresh(); ! 413: tui_selwin(w); ! 414: tui_refresh(); ! 415: ! 416: c = tui_getc(); ! 417: if (c == 27 || c == 13) ! 418: break; ! 419: switch(c) { ! 420: case '1': ! 421: if (fastmem_size == 0) ! 422: fastmem_size = 0x200000; ! 423: else if (fastmem_size == 0x800000) ! 424: fastmem_size = 0; ! 425: else ! 426: fastmem_size <<= 1; ! 427: break; ! 428: case '2': ! 429: if (chipmem_size == 0x200000) ! 430: chipmem_size = 0x80000; ! 431: else ! 432: chipmem_size <<= 1; ! 433: break; ! 434: case '3': ! 435: if (bogomem_size == 0) ! 436: bogomem_size = 0x40000; ! 437: else if (bogomem_size == 0x100000) ! 438: bogomem_size = 0; ! 439: else ! 440: bogomem_size <<= 1; ! 441: break; ! 442: } ! 443: ! 444: } ! 445: tui_dlogdie(w); ! 446: } ! 447: ! 448: static void SoundOptions(void) ! 449: { ! 450: int w = makemenu(soundmenu, 3, 5); ! 451: ! 452: for (;;) { ! 453: int c; ! 454: ! 455: tui_selwin(0); ! 456: print_configuration(); ! 457: tui_refresh(); ! 458: tui_selwin(w); ! 459: tui_refresh(); ! 460: ! 461: c = tui_getc(); ! 462: if (c == 27 || c == 13) ! 463: break; ! 464: switch(c) { ! 465: case '1': ! 466: produce_sound++; ! 467: if(produce_sound > 3) ! 468: produce_sound = 0; ! 469: break; ! 470: ! 471: } ! 472: } ! 473: tui_dlogdie(w); ! 474: } ! 475: ! 476: static void OtherOptions(void) ! 477: { ! 478: char *tmp; ! 479: int w = makemenu(miscmenu, 3, 5); ! 480: ! 481: for (;;) { ! 482: int c; ! 483: ! 484: tui_selwin(0); ! 485: print_configuration(); ! 486: tui_refresh(); ! 487: tui_selwin(w); ! 488: tui_refresh(); ! 489: ! 490: c = tui_getc(); ! 491: if (c == 27 || c == 13) ! 492: break; ! 493: switch(c) { ! 494: case '1': ! 495: fake_joystick = !fake_joystick; ! 496: break; ! 497: case '2': ! 498: tmp = tui_filereq("*.rom", romfile); ! 499: if (tmp != NULL) ! 500: strcpy(romfile, tmp); ! 501: break; ! 502: } ! 503: } ! 504: tui_dlogdie(w); ! 505: } ! 506: ! 507: int gui_init() ! 508: { ! 509: char cwd[1024]; ! 510: char tmp[256]; ! 511: int mm_win; ! 512: ! 513: if (getcwd(cwd, 1024) == NULL) ! 514: return 0; ! 515: ! 516: quit_program = 0; ! 517: ! 518: tui_setup(); ! 519: ! 520: tui_drawbox(0); ! 521: tui_hline(2, 3, tui_cols() - 1); ! 522: sprintf(tmp, "UAE %d.%d.%d: The Un*x Amiga Emulator", UAEMAJOR, UAEMINOR, UAEURSAMINOR); ! 523: tui_gotoxy((tui_cols() - strlen(tmp))/2, 2); tui_puts(tmp); ! 524: strcpy(tmp, "Press RETURN/ENTER to run UAE, ESC to exit"); ! 525: tui_gotoxy((tui_cols() - strlen(tmp))/2, tui_lines()); tui_puts(tmp); ! 526: ! 527: mm_win = makemenu(mainmenu, 2, 4); ! 528: ! 529: for (;;) { ! 530: int c; ! 531: tui_selwin(0); ! 532: print_configuration(); ! 533: tui_refresh(); ! 534: tui_selwin(mm_win); ! 535: tui_refresh(); ! 536: c = tui_getc(); ! 537: ! 538: if (c == 27) { ! 539: tui_dlogdie(mm_win); ! 540: tui_shutdown(); ! 541: exit(0); ! 542: } else if (c == 13) { ! 543: break; ! 544: } ! 545: ! 546: switch(c) { ! 547: case 100: DiskOptions(); break; ! 548: case 118: VideoOptions(); break; ! 549: case 109: MemoryOptions(); break; ! 550: case 104: HDOptions(); break; ! 551: case 115: SoundOptions(); break; ! 552: case 111: OtherOptions(); break; ! 553: } ! 554: } ! 555: ! 556: tui_dlogdie(mm_win); ! 557: if(mountok) ! 558: add_filesys_unit(mountvol, mountdir, 0); ! 559: ! 560: tui_shutdown(); ! 561: chdir (cwd); ! 562: return 0; ! 563: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.