This is vic20ui.c in view mode; [Download] [Up]
/*
* vic20ui.c - Implementation of the C64-specific part of the UI.
*
* 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 <stdio.h>
#include "cartridge.h"
#include "joystick.h"
#include "resources.h"
#include "uicommands.h"
#include "uimenu.h"
#include "uisettings.h"
#include "vsync.h"
#ifdef XPM
#include <X11/xpm.h>
#include "vic20icon.xpm"
#endif
/* ------------------------------------------------------------------------- */
enum {
MEM_NONE,
MEM_ALL,
MEM_3K,
MEM_8K,
MEM_16K,
MEM_24K
};
enum {
BLOCK_0 = 1,
BLOCK_1 = 1 << 1,
BLOCK_2 = 1 << 2,
BLOCK_3 = 1 << 3,
BLOCK_5 = 1 << 5
};
static UI_CALLBACK(set_common_memory_configuration)
{
if (!call_data) {
int blocks;
switch ((int) client_data) {
case MEM_NONE:
blocks = 0;
break;
case MEM_ALL:
blocks = BLOCK_0 | BLOCK_1 | BLOCK_2 | BLOCK_3 | BLOCK_5;
break;
case MEM_3K:
blocks = BLOCK_0;
break;
case MEM_8K:
blocks = BLOCK_1;
break;
case MEM_16K:
blocks = BLOCK_1 | BLOCK_2;
break;
case MEM_24K:
blocks = BLOCK_1 | BLOCK_2 | BLOCK_3;
break;
default:
/* Shouldn't happen. */
fprintf(stderr, "What?!\n");
blocks = 0; /* Make compiler happy. */
}
resources_set_value("RamBlock0",
(resource_value_t) (blocks & BLOCK_0 ? 1 : 0));
resources_set_value("RamBlock1",
(resource_value_t) (blocks & BLOCK_1 ? 1 : 0));
resources_set_value("RamBlock2",
(resource_value_t) (blocks & BLOCK_2 ? 1 : 0));
resources_set_value("RamBlock3",
(resource_value_t) (blocks & BLOCK_3 ? 1 : 0));
resources_set_value("RamBlock5",
(resource_value_t) (blocks & BLOCK_5 ? 1 : 0));
ui_menu_update_all();
suspend_speed_eval();
}
}
static ui_menu_entry_t common_memory_configurations_submenu[] = {
{ "No expansion memory",
set_common_memory_configuration, (ui_callback_data_t) MEM_NONE, NULL },
{ "--" },
{ "3K (block 0)",
set_common_memory_configuration, (ui_callback_data_t) MEM_3K, NULL },
{ "8K (block 1)",
set_common_memory_configuration, (ui_callback_data_t) MEM_8K, NULL },
{ "16K (blocks 1/2)",
set_common_memory_configuration, (ui_callback_data_t) MEM_16K, NULL },
{ "24K (blocks 1/2/3)",
set_common_memory_configuration, (ui_callback_data_t) MEM_24K, NULL },
{ "--" },
{ "All (blocks 0/1/2/3/5)",
set_common_memory_configuration, (ui_callback_data_t) MEM_ALL, NULL },
{ NULL }
};
UI_MENU_DEFINE_TOGGLE(RAMBlock0)
UI_MENU_DEFINE_TOGGLE(RAMBlock1)
UI_MENU_DEFINE_TOGGLE(RAMBlock2)
UI_MENU_DEFINE_TOGGLE(RAMBlock3)
UI_MENU_DEFINE_TOGGLE(RAMBlock4)
UI_MENU_DEFINE_TOGGLE(RAMBlock5)
UI_MENU_DEFINE_TOGGLE(EmuID)
static ui_menu_entry_t memory_settings_submenu[] = {
{ "Common configurations",
NULL, NULL, common_memory_configurations_submenu },
{ "--" },
{ "*Block 0 (3K at $0400-$0FFF)",
(ui_callback_t) toggle_RAMBlock0, NULL, NULL },
{ "*Block 1 (8K at $2000-$3FFF)",
(ui_callback_t) toggle_RAMBlock1, NULL, NULL },
{ "*Block 2 (8K at $4000-$5FFF)",
(ui_callback_t) toggle_RAMBlock2, NULL, NULL },
{ "*Block 3 (8K at $6000-$7FFF)",
(ui_callback_t) toggle_RAMBlock3, NULL, NULL },
{ "*Block 5 (8K at $A000-$BFFF)",
(ui_callback_t) toggle_RAMBlock5, NULL, NULL },
{ "--" },
{ "*Emulator identification",
(ui_callback_t) toggle_EmuID, NULL, NULL },
{ NULL }
};
static ui_menu_entry_t memory_settings_menu[] = {
{ "Memory expansions",
NULL, NULL, memory_settings_submenu },
{ NULL }
};
/* ------------------------------------------------------------------------- */
static UI_CALLBACK(attach_cartridge)
{
int type = (int)client_data;
char *filename;
ui_button_t button;
suspend_speed_eval();
filename = ui_select_file("Attach cartridge image",
NULL, False, NULL, NULL, &button);
switch (button) {
case UI_BUTTON_OK:
if (cartridge_attach_image(type, filename) < 0)
ui_error("Invalid cartridge image");
ui_update_menus();
break;
default:
/* Do nothing special. */
break;
}
}
static UI_CALLBACK(detach_cartridge)
{
cartridge_detach_image();
}
static UI_CALLBACK(default_cartridge)
{
cartridge_set_default();
}
static ui_menu_entry_t attach_cartridge_image_submenu[] = {
{ "Smart-attach cartridge image...",
(ui_callback_t) attach_cartridge,
(ui_callback_data_t) CARTRIDGE_VIC20_DETECT, NULL,
XK_c, UI_HOTMOD_META },
{ "--" },
{ "Attach 4/8KB image at $2000...",
(ui_callback_t) attach_cartridge,
(ui_callback_data_t) CARTRIDGE_VIC20_8KB_2000, NULL },
{ "Attach 4/8KB image at $6000...",
(ui_callback_t) attach_cartridge,
(ui_callback_data_t) CARTRIDGE_VIC20_8KB_6000, NULL },
{ "Attach 4/8KB image at $A000...",
(ui_callback_t) attach_cartridge,
(ui_callback_data_t) CARTRIDGE_VIC20_8KB_A000, NULL },
{ "Attach 4KB image at $B000...",
(ui_callback_t) attach_cartridge,
(ui_callback_data_t) CARTRIDGE_VIC20_4KB_B000, NULL },
/*
{ "Attach 16KB image...",
(ui_callback_t) attach_cartridge, (ui_callback_data_t)
CARTRIDGE_VIC20_16KB, NULL },
*/
{ "--" },
{ "Set cartridge as default",
(ui_callback_t) default_cartridge, NULL, NULL },
{ NULL }
};
static ui_menu_entry_t vic20_cartridge_commands_menu[] = {
{ "Attach a cartridge image",
NULL, NULL, attach_cartridge_image_submenu },
{ "Detach cartridge image(s)",
(ui_callback_t) detach_cartridge, NULL, NULL },
{ NULL }
};
/* ------------------------------------------------------------------------- */
static UI_CALLBACK(set_joystick_device)
{
int tmp;
suspend_speed_eval();
if (!call_data) {
resources_set_value("JoyDevice1", (resource_value_t) client_data);
ui_update_menus();
} else {
resources_get_value("JoyDevice1", (resource_value_t *) &tmp);
ui_menu_set_tick(w, tmp == (int) client_data);
}
}
static ui_menu_entry_t set_joystick_device_1_submenu[] = {
{ "*None",
(ui_callback_t) set_joystick_device, (ui_callback_data_t) JOYDEV_NONE, NULL },
{ "*Numpad",
(ui_callback_t) set_joystick_device, (ui_callback_data_t) JOYDEV_NUMPAD, NULL },
{ "*Custom Keys",
(ui_callback_t) set_joystick_device, (ui_callback_data_t) JOYDEV_CUSTOM_KEYS, NULL },
#ifdef HAS_JOYSTICK
{ "*Analog Joystick 0",
(ui_callback_t) set_joystick_device, (ui_callback_data_t) JOYDEV_ANALOG_0, NULL },
{ "*Analog Joystick 1",
(ui_callback_t) set_joystick_device, (ui_callback_data_t) JOYDEV_ANALOG_1, NULL },
#ifdef HAS_DIGITAL_JOYSTICK
{ "*Digital Joystick 0",
(ui_callback_t) set_joystick_device, (ui_callback_data_t) JOYDEV_DIGITAL_0, NULL },
{ "*Digital Joystick 1",
(ui_callback_t) set_joystick_device, (ui_callback_data_t) JOYDEV_DIGITAL_1, NULL },
#endif
#endif
{ NULL }
};
static ui_menu_entry_t joystick_settings_menu[] = {
{ "Joystick settings",
NULL, NULL, set_joystick_device_1_submenu },
{ NULL }
};
int vic20_ui_init(void)
{
#ifdef XPM
{
Pixmap icon_pixmap;
/* Create the icon pixmap. */
XpmCreatePixmapFromData(display, DefaultRootWindow(display), icon_data,
&icon_pixmap, NULL, NULL);
ui_set_application_icon(icon_pixmap);
}
#endif
ui_set_left_menu(ui_menu_create("LeftMenu",
ui_disk_commands_menu,
ui_menu_separator,
ui_tape_commands_menu,
ui_menu_separator,
ui_smart_attach_commands_menu,
ui_menu_separator,
vic20_cartridge_commands_menu,
ui_menu_separator,
ui_directory_commands_menu,
ui_menu_separator,
ui_tool_commands_menu,
ui_menu_separator,
ui_help_commands_menu,
ui_menu_separator,
ui_run_commands_menu,
ui_menu_separator,
ui_exit_commands_menu,
NULL));
ui_set_right_menu(ui_menu_create("RightMenu",
ui_performance_settings_menu,
ui_menu_separator,
ui_video_settings_menu,
ui_keyboard_settings_menu,
ui_sound_settings_menu,
ui_true1541_settings_menu,
ui_peripheral_settings_menu,
joystick_settings_menu,
ui_menu_separator,
memory_settings_menu,
ui_menu_separator,
ui_settings_settings_menu,
NULL));
ui_update_menus();
return 0;
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.