This is ui.c in view mode; [Download] [Up]
/* * ui.c - A (very) simple user interface for MS-DOS. * * Written by * Ettore Perazzoli (ettore@comm2000.it) * * This file is part of VICE, the Versatile Commodore Emulator. * See README for copyright notice. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA. * */ #include "vice.h" #include <fcntl.h> #include <go32.h> #include <io.h> #include <math.h> #include <stdio.h> #include <sys/movedata.h> #include <unistd.h> #include "ui.h" #include "cmdline.h" #include "dos.h" #include "log.h" #include "machine.h" #include "menudefs.h" #include "mon.h" #include "resources.h" #include "sound.h" #include "tui.h" #include "tuimenu.h" #include "types.h" #include "utils.h" #include "video.h" #include "vsync.h" /* Status of keyboard LEDs. */ static int real_kbd_led_status = -1; static int kbd_led_status; #define DRIVE_LED_MSK 4 #define WARP_LED_MSK 1 /* ------------------------------------------------------------------------- */ /* UI-related resources and command-line options. */ /* Flag: Use keyboard LEDs? */ static int use_leds; static int set_use_leds(resource_value_t v) { use_leds = (int) v; return 0; } static resource_t resources[] = { { "UseLeds", RES_INTEGER, (resource_value_t) 1, (resource_value_t *) &use_leds, set_use_leds }, { NULL } }; int ui_init_resources(void) { return resources_register(resources); } static cmdline_option_t cmdline_options[] = { { "-leds", SET_RESOURCE, 0, NULL, NULL, "UseLeds", (resource_value_t) 1, NULL, "Enable usage of PC keyboard LEDs" }, { "+leds", SET_RESOURCE, 0, NULL, NULL, "UseLeds", (resource_value_t) 0, NULL, "Disable usage of PC keyboard LEDs" }, { NULL }, }; int ui_init_cmdline_options(void) { return cmdline_register_options(cmdline_options); } /* ------------------------------------------------------------------------- */ inline static void set_kbd_leds(int value) { /* FIXME: Is this the 100% correct way to do it? */ if (use_leds) { outportb(0x60, 0xed); delay(1); outportb(0x60, value); delay(1); } } /* ------------------------------------------------------------------------- */ static void ui_exit(void) { _setcursortype(_NORMALCURSOR); normvideo(); _set_screen_lines(25); #ifdef UNSTABLE cprintf("VICE version %s (unstable).\n\r", VERSION); #else cprintf("VICE version %s.\n\r", VERSION); #endif cprintf("\nOfficial VICE homepage: http://www.tu-chemnitz.de/~fachat/vice/vice.html\n\n\r"); } int ui_init(int *argc, char **argv) { /* This forces Ctrl-C and Ctrl-Break to be treated as normal key sequences. */ _go32_want_ctrl_break(1); return 0; } int ui_init_finish(void) { log_enable(1); tui_init(); atexit(ui_exit); return 0; } void ui_main(char hotkey) { char s[256]; double speed_index, frame_rate; int old_stdin_mode = setmode(STDIN_FILENO, O_BINARY); sound_suspend(); speed_index = vsync_get_avg_speed_index(); frame_rate = vsync_get_avg_frame_rate(); if (speed_index > 0.0 && frame_rate > 0.0) sprintf(s, "%s emulator at %d%% speed, %d fps", machine_name, (int)floor(speed_index), (int)floor(frame_rate)); else sprintf(s, "%s emulator", machine_name); /* Get the BIOS LED status and restore it. */ { BYTE bios_leds; int leds = 0; _dosmemgetb(0x417, 1, &bios_leds); if (bios_leds & 16) leds |= 1; /* Scroll Lock */ if (bios_leds & 32) leds |= 2; /* Num Lock */ if (bios_leds & 64) leds |= 4; /* Caps Lock */ set_kbd_leds(leds); } enable_text(); tui_clear_screen(); tui_set_attr(FIRST_LINE_FORE, FIRST_LINE_BACK, 0); tui_display(tui_num_cols() - strlen(s), 0, 0, "%s", s); /* FIXME: This should not be necessary. */ tui_menu_update(ui_main_menu); tui_menu_handle(ui_main_menu, hotkey); disable_text(); suspend_speed_eval(); set_kbd_leds(real_kbd_led_status); setmode(STDIN_FILENO, old_stdin_mode); } void ui_error(const char *format,...) { char tmp[1024]; va_list ap; enable_text(); tui_clear_screen(); va_start(ap, format); vsprintf(tmp, format, ap); tui_error(tmp); disable_text(); } ui_jam_action_t ui_jam_dialog(const char *format,...) { char tmp[1024]; va_list ap; enable_text(); tui_clear_screen(); va_start(ap, format); vsprintf(tmp, format, ap); tui_error(tmp); disable_text(); /* Always reset. */ return 0; } void ui_show_text(const char *title, const char *text) { } void ui_update_menus(void) { if (ui_main_menu != NULL) tui_menu_update(ui_main_menu); } void ui_toggle_drive_status(int state) { if (!state) ui_display_drive_led(0); } void ui_display_drive_track(double track_number) { } void ui_display_drive_led(int status) { if (status) kbd_led_status |= DRIVE_LED_MSK; else kbd_led_status &= ~DRIVE_LED_MSK; } void ui_set_warp_status(int status) { if (status) kbd_led_status |= WARP_LED_MSK; else kbd_led_status &= ~WARP_LED_MSK; } int ui_extend_image_dialog(void) { int ret; enable_text(); tui_clear_screen(); ret = tui_ask_confirmation("Extend disk image in drive 8 to 40 tracks? (Y/N)"); disable_text(); return ret; } /* ------------------------------------------------------------------------- */ void ui_dispatch_events(void) { /* Update keyboard LED status. */ if (kbd_led_status != real_kbd_led_status) { set_kbd_leds(kbd_led_status); real_kbd_led_status = kbd_led_status; } }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.