2
* vic20ui.c - Implementation of the VIC20-specific part of the UI.
5
* Ettore Perazzoli <ettore@comm2000.it>
6
* Andreas Boose <viceteam@t-online.de>
8
* This file is part of VICE, the Versatile Commodore Emulator.
9
* See README for copyright notice.
11
* This program is free software; you can redistribute it and/or modify
12
* it under the terms of the GNU General Public License as published by
13
* the Free Software Foundation; either version 2 of the License, or
14
* (at your option) any later version.
16
* This program is distributed in the hope that it will be useful,
17
* but WITHOUT ANY WARRANTY; without even the implied warranty of
18
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
* GNU General Public License for more details.
21
* You should have received a copy of the GNU General Public License
22
* along with this program; if not, write to the Free Software
23
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
34
#include "cartridge.h"
39
#include "machine-video.h"
40
#include "resources.h"
42
#include "uicommands.h"
43
#include "uidatasette.h"
45
#include "uidrivec64vic20.h"
46
#include "uidrivevic20.h"
47
#include "uikeyboard.h"
49
#include "uiperipheraliec.h"
52
#include "uirs232user.h"
53
#include "uiscreenshot.h"
54
#include "uisettings.h"
55
#include "uisidcart.h"
79
static UI_CALLBACK(set_common_memory_configuration)
83
switch ((int) UI_MENU_CB_PARAM) {
88
blocks = BLOCK_0 | BLOCK_1 | BLOCK_2 | BLOCK_3 | BLOCK_5;
97
blocks = BLOCK_1 | BLOCK_2;
100
blocks = BLOCK_1 | BLOCK_2 | BLOCK_3;
103
/* Shouldn't happen. */
104
fprintf(stderr, _("What?!\n"));
105
blocks = 0; /* Make compiler happy. */
107
resources_set_int("RamBlock0", blocks & BLOCK_0 ? 1 : 0);
108
resources_set_int("RamBlock1", blocks & BLOCK_1 ? 1 : 0);
109
resources_set_int("RamBlock2", blocks & BLOCK_2 ? 1 : 0);
110
resources_set_int("RamBlock3", blocks & BLOCK_3 ? 1 : 0);
111
resources_set_int("RamBlock5", blocks & BLOCK_5 ? 1 : 0);
112
ui_menu_update_all();
113
vsync_suspend_speed_eval();
116
UI_MENU_DEFINE_TOGGLE(SidCart)
117
UI_MENU_DEFINE_TOGGLE(SidFilters)
119
UI_MENU_DEFINE_RADIO(SidAddress)
121
static ui_menu_entry_t sidcart_address_submenu[] = {
123
(ui_callback_t)radio_SidAddress, (ui_callback_data_t)0, NULL },
125
(ui_callback_t)radio_SidAddress, (ui_callback_data_t)1, NULL },
129
UI_MENU_DEFINE_RADIO(SidClock)
131
static ui_menu_entry_t sidcart_clock_submenu[] = {
132
{ "*C64", (ui_callback_t)radio_SidClock,
133
(ui_callback_data_t)0, NULL },
134
{ "*VIC20", (ui_callback_t)radio_SidClock,
135
(ui_callback_data_t)1, NULL },
139
ui_menu_entry_t sidcart_submenu[] = {
140
{ N_("*Enable SID cart"),
141
(ui_callback_t)toggle_SidCart, NULL, NULL },
143
NULL, NULL, sidcart_engine_submenu },
145
NULL, NULL, sidcart_model_submenu },
146
{ N_("*Emulate filters"),
147
(ui_callback_t)toggle_SidFilters, NULL, NULL },
149
NULL, NULL, sidcart_address_submenu },
151
NULL, NULL, sidcart_clock_submenu },
155
static ui_menu_entry_t vic20ui_main_romset_submenu[] = {
156
{ N_("Load new Kernal ROM"),
157
(ui_callback_t)ui_load_rom_file,
158
(ui_callback_data_t)"KernalName", NULL },
159
{ N_("Load new Basic ROM"),
160
(ui_callback_t)ui_load_rom_file,
161
(ui_callback_data_t)"BasicName", NULL },
162
{ N_("Load new Character ROM"),
163
(ui_callback_t)ui_load_rom_file,
164
(ui_callback_data_t)"ChargenName", NULL },
168
static ui_menu_entry_t vic20_romset_submenu[] = {
169
{ N_("Load default ROMs"),
170
(ui_callback_t)ui_set_romset, (ui_callback_data_t)"default.vrs", NULL },
172
{ N_("Load new computer ROM"),
173
NULL, NULL, vic20ui_main_romset_submenu },
174
{ N_("Load new drive ROM"),
175
NULL, NULL, ui_drivec64vic20_romset_submenu },
177
{ N_("ROM set type"),
178
NULL, NULL, uiromset_type_submenu },
180
{ N_("ROM set archive"),
181
NULL, NULL, uiromset_archive_submenu },
182
{ N_("ROM set file"),
183
NULL, NULL, uiromset_file_submenu },
187
static ui_menu_entry_t common_memory_configurations_submenu[] = {
188
{ N_("No expansion memory"),
189
(ui_callback_t) set_common_memory_configuration,
190
(ui_callback_data_t)MEM_NONE, NULL },
192
{ N_("3K (block 0)"),
193
(ui_callback_t) set_common_memory_configuration,
194
(ui_callback_data_t)MEM_3K, NULL },
195
{ N_("8K (block 1)"),
196
(ui_callback_t) set_common_memory_configuration,
197
(ui_callback_data_t)MEM_8K, NULL },
198
{ N_("16K (blocks 1/2)"),
199
(ui_callback_t) set_common_memory_configuration,
200
(ui_callback_data_t)MEM_16K, NULL },
201
{ N_("24K (blocks 1/2/3)"),
202
(ui_callback_t) set_common_memory_configuration,
203
(ui_callback_data_t)MEM_24K, NULL },
205
{ N_("All (blocks 0/1/2/3/5)"),
206
(ui_callback_t) set_common_memory_configuration,
207
(ui_callback_data_t)MEM_ALL, NULL },
211
UI_MENU_DEFINE_TOGGLE(RAMBlock0)
212
UI_MENU_DEFINE_TOGGLE(RAMBlock1)
213
UI_MENU_DEFINE_TOGGLE(RAMBlock2)
214
UI_MENU_DEFINE_TOGGLE(RAMBlock3)
215
UI_MENU_DEFINE_TOGGLE(RAMBlock5)
217
UI_MENU_DEFINE_TOGGLE(EmuID)
219
static ui_menu_entry_t memory_settings_submenu[] = {
220
{ N_("Common configurations"),
221
NULL, NULL, common_memory_configurations_submenu },
224
NULL, NULL, vic20_romset_submenu },
226
{ N_("*Block 0 (3K at $0400-$0FFF)"),
227
(ui_callback_t)toggle_RAMBlock0, NULL, NULL },
228
{ N_("*Block 1 (8K at $2000-$3FFF)"),
229
(ui_callback_t)toggle_RAMBlock1, NULL, NULL },
230
{ N_("*Block 2 (8K at $4000-$5FFF)"),
231
(ui_callback_t)toggle_RAMBlock2, NULL, NULL },
232
{ N_("*Block 3 (8K at $6000-$7FFF)"),
233
(ui_callback_t)toggle_RAMBlock3, NULL, NULL },
234
{ N_("*Block 5 (8K at $A000-$BFFF)"),
235
(ui_callback_t)toggle_RAMBlock5, NULL, NULL },
237
{ N_("*Emulator identification"),
238
(ui_callback_t)toggle_EmuID, NULL, NULL },
243
static ui_menu_entry_t memory_settings_menu[] = {
244
{ N_("Memory expansions"),
245
NULL, NULL, memory_settings_submenu },
250
/* ------------------------------------------------------------------------- */
252
static UI_CALLBACK(attach_cartridge)
254
int type = (int)UI_MENU_CB_PARAM;
257
static char *last_dir;
259
vsync_suspend_speed_eval();
260
filename = ui_select_file(_("Attach cartridge image"),
261
NULL, 0, False, last_dir, "*.prg", &button,
265
if (cartridge_attach_image(type, filename) < 0)
266
ui_error(_("Invalid cartridge image"));
269
util_fname_split(filename, &last_dir, NULL);
273
/* Do nothing special. */
276
if (filename != NULL)
280
static UI_CALLBACK(detach_cartridge)
282
cartridge_detach_image();
285
static UI_CALLBACK(default_cartridge)
287
cartridge_set_default();
290
static ui_menu_entry_t attach_cartridge_image_submenu[] = {
291
{ N_("Smart-attach cartridge image..."),
292
(ui_callback_t)attach_cartridge,
293
(ui_callback_data_t)CARTRIDGE_VIC20_DETECT, NULL,
294
XK_c, UI_HOTMOD_META },
296
{ N_("Attach 4/8/16KB image at $2000..."),
297
(ui_callback_t)attach_cartridge,
298
(ui_callback_data_t)CARTRIDGE_VIC20_16KB_2000, NULL },
299
{ N_("Attach 4/8/16KB image at $4000..."),
300
(ui_callback_t)attach_cartridge,
301
(ui_callback_data_t)CARTRIDGE_VIC20_16KB_4000, NULL },
302
{ N_("Attach 4/8/16KB image at $6000..."),
303
(ui_callback_t)attach_cartridge,
304
(ui_callback_data_t)CARTRIDGE_VIC20_16KB_6000, NULL },
305
{ N_("Attach 4/8KB image at $A000..."),
306
(ui_callback_t)attach_cartridge,
307
(ui_callback_data_t)CARTRIDGE_VIC20_8KB_A000, NULL },
308
{ N_("Attach 4KB image at $B000..."),
309
(ui_callback_t)attach_cartridge,
310
(ui_callback_data_t)CARTRIDGE_VIC20_4KB_B000, NULL },
312
{ N_("Set cartridge as default"),
313
(ui_callback_t)default_cartridge, NULL, NULL },
317
static ui_menu_entry_t vic20_cartridge_commands_menu[] = {
318
{ N_("Attach a cartridge image"),
319
NULL, NULL, attach_cartridge_image_submenu },
320
{ N_("Detach cartridge image(s)"),
321
(ui_callback_t)detach_cartridge, NULL, NULL },
326
/* ------------------------------------------------------------------------- */
328
static UI_CALLBACK(set_joystick_device)
330
vsync_suspend_speed_eval();
332
resources_set_int("JoyDevice1", (int)UI_MENU_CB_PARAM);
337
resources_get_int("JoyDevice1", &tmp);
338
ui_menu_set_tick(w, tmp == (int)UI_MENU_CB_PARAM);
342
static ui_menu_entry_t set_joystick_device_1_submenu[] = {
344
(ui_callback_t)set_joystick_device,
345
(ui_callback_data_t)JOYDEV_NONE, NULL },
347
(ui_callback_t)set_joystick_device,
348
(ui_callback_data_t)JOYDEV_NUMPAD, NULL },
350
(ui_callback_t)set_joystick_device,
351
(ui_callback_data_t)JOYDEV_KEYSET1, NULL },
353
(ui_callback_t)set_joystick_device,
354
(ui_callback_data_t)JOYDEV_KEYSET2, NULL },
356
{ N_("*Analog Joystick 0"),
357
(ui_callback_t)set_joystick_device,
358
(ui_callback_data_t)JOYDEV_ANALOG_0, NULL },
359
{ N_("*Analog Joystick 1"),
360
(ui_callback_t)set_joystick_device,
361
(ui_callback_data_t)JOYDEV_ANALOG_1, NULL },
362
#ifdef HAS_DIGITAL_JOYSTICK
363
{ N_("*Digital Joystick 0"),
364
(ui_callback_t)set_joystick_device,
365
(ui_callback_data_t)JOYDEV_DIGITAL_0, NULL },
366
{ N_("*Digital Joystick 1"),
367
(ui_callback_t)set_joystick_device,
368
(ui_callback_data_t)JOYDEV_DIGITAL_1, NULL },
370
#ifdef HAS_USB_JOYSTICK
371
{ N_("*USB Joystick 0"),
372
(ui_callback_t)set_joystick_device,
373
(ui_callback_data_t)JOYDEV_USB_0, NULL },
374
{ N_("*USB Joystick 1"),
375
(ui_callback_t)set_joystick_device,
376
(ui_callback_data_t)JOYDEV_USB_1, NULL },
382
static ui_menu_entry_t joystick_settings_menu[] = {
383
{ N_("Joystick settings"),
384
NULL, NULL, set_joystick_device_1_submenu },
388
/*------------------------------------------------------------*/
390
UI_MENU_DEFINE_TOGGLE(RsUserEnable)
392
static ui_menu_entry_t vic20_rs232_submenu[] = {
393
{ N_("*Userport RS232 emulation"),
394
(ui_callback_t)toggle_RsUserEnable, NULL, NULL },
395
{ N_("Userport RS232 baud rate"),
396
NULL, NULL, rs232user_baudrate_submenu },
397
{ N_("Userport RS232 device"),
398
NULL, NULL, rs232user_device_submenu },
400
{ N_("Serial 1 device..."), (ui_callback_t)set_rs232_device_file,
401
(ui_callback_data_t)"RsDevice1", NULL },
402
{ N_("Serial 1 baudrate"),
403
NULL, NULL, ser1_baud_submenu },
405
{ N_("Serial 2 device..."), (ui_callback_t)set_rs232_device_file,
406
(ui_callback_data_t)"RsDevice2", NULL },
407
{ N_("Serial 2 baudrate"),
408
NULL, NULL, ser2_baud_submenu },
410
{ N_("Dump filename..."), (ui_callback_t)set_rs232_dump_file,
411
(ui_callback_data_t)"RsDevice3", NULL },
413
{ N_("Program name to exec..."), (ui_callback_t)set_rs232_exec_file,
414
(ui_callback_data_t)"RsDevice4", NULL },
418
static ui_menu_entry_t rs232_settings_menu[] = {
419
{ N_("RS232 settings"),
420
NULL, NULL, vic20_rs232_submenu },
424
/*------------------------------------------------------------*/
427
UI_MENU_DEFINE_TOGGLE(IEEE488)
429
static ui_menu_entry_t vic20_io_submenu[] = {
430
{ "*VIC-1112 IEEE 488 module",
431
(ui_callback_t)toggle_IEEE488, NULL, NULL },
435
static ui_menu_entry_t vic20_io_settings_menu[] = {
437
NULL, NULL, vic20_io_submenu },
442
/*------------------------------------------------------------*/
444
static UI_CALLBACK(save_screenshot)
446
/* Where does the 1024 come from? */
448
unsigned int wid = (unsigned int)UI_MENU_CB_PARAM;
450
vsync_suspend_speed_eval();
452
/* The following code depends on a zeroed filename. */
453
memset(filename, 0, 1024);
455
if (ui_screenshot_dialog(filename, machine_video_canvas_get(wid)) < 0)
459
static ui_menu_entry_t ui_screenshot_commands_menu[] = {
460
{ N_("Save media file"),
461
(ui_callback_t)save_screenshot, (ui_callback_data_t)0, NULL },
465
static ui_menu_entry_t vic20_menu[] = {
466
{ N_("VIC settings"),
467
NULL, NULL, vic_submenu },
468
{ N_("Memory expansions"),
469
NULL, NULL, memory_settings_submenu },
470
{ N_("SID cartridge settings"),
471
NULL, NULL, sidcart_submenu },
475
static ui_menu_entry_t vic20_left_menu[] = {
477
NULL, NULL, uiattach_disk_menu },
479
NULL, NULL, uiattach_tape_menu },
481
NULL, NULL, ui_datasette_commands_menu },
483
NULL, NULL, uiattach_smart_attach_menu },
485
NULL, NULL, vic20_cartridge_commands_menu },
487
NULL, NULL, ui_directory_commands_menu },
489
NULL, NULL, ui_snapshot_commands_menu },
491
NULL, NULL, ui_screenshot_commands_menu },
493
NULL, NULL, ui_sound_record_commands_menu },
495
NULL, NULL, ui_tool_commands_menu },
497
NULL, NULL, ui_help_commands_menu },
499
NULL, NULL, ui_run_commands_menu },
501
NULL, NULL, ui_exit_commands_menu },
505
static ui_menu_entry_t vic20_right_menu[] = {
507
NULL, NULL, ui_performance_settings_menu },
509
NULL, NULL, uikeyboard_settings_menu },
511
NULL, NULL, ui_sound_settings_menu },
513
NULL, NULL, ui_drivevic20_settings_menu },
515
NULL, NULL, ui_peripheraliec_settings_menu },
517
vic20_io_settings_menu,
520
NULL, NULL, joystick_settings_menu },
522
NULL, NULL, rs232_settings_menu },
524
NULL, NULL, vic20_menu },
526
NULL, NULL, ui_settings_settings_menu },
529
NULL, NULL, ui_debug_settings_menu },
534
static ui_menu_entry_t vic20_tape_menu[] = {
536
NULL, NULL, uiattach_tape_menu },
538
NULL, NULL, datasette_control_submenu },
542
static ui_menu_entry_t vic20_file_menu[] = {
544
NULL, NULL, uiattach_smart_attach_menu },
546
NULL, NULL, uiattach_disk_menu },
548
NULL, NULL, uiattach_tape_menu },
550
NULL, NULL, ui_datasette_commands_menu },
552
NULL, NULL, vic20_cartridge_commands_menu },
554
NULL, NULL, ui_directory_commands_menu },
556
NULL, NULL, ui_tool_commands_menu },
558
NULL, NULL, ui_run_commands_menu },
560
NULL, NULL, ui_exit_commands_menu },
564
static ui_menu_entry_t vic20_snapshot_menu[] = {
566
NULL, NULL, ui_snapshot_commands_submenu },
568
NULL, NULL, ui_screenshot_commands_menu },
570
NULL, NULL, ui_sound_record_commands_menu },
574
static ui_menu_entry_t vic20_options_menu[] = {
576
NULL, NULL, ui_performance_settings_menu },
578
NULL, NULL, ui_drive_options_submenu },
582
static ui_menu_entry_t vic20_settings_menu[] = {
584
NULL, NULL, uikeyboard_settings_menu },
586
NULL, NULL, ui_sound_settings_menu },
588
NULL, NULL, ui_drivevic20_settings_menu },
590
NULL, NULL, ui_peripheraliec_settings_menu },
592
NULL, NULL, joystick_settings_menu },
594
NULL, NULL, rs232_settings_menu },
596
NULL, NULL, vic20_menu },
598
NULL, NULL, ui_settings_settings_menu },
602
static ui_menu_entry_t vic20_top_menu[] = {
604
NULL, NULL, vic20_file_menu },
606
NULL, NULL, vic20_snapshot_menu },
608
NULL, NULL, vic20_options_menu },
610
NULL, NULL, vic20_settings_menu },
611
/* Translators: RJ means right justify and should be
612
saved in your tranlation! e.g. german "RJHilfe" */
614
NULL, NULL, ui_help_commands_menu },
618
static void vic20ui_dynamic_menu_create(void)
620
uisound_menu_create();
624
static void vic20ui_dynamic_menu_shutdown(void)
626
uivic_menu_shutdown();
627
uisound_menu_shutdown();
630
int vic20ui_init(void)
632
ui_set_application_icon(vic20_icon_data);
633
vic20ui_dynamic_menu_create();
634
ui_set_left_menu(vic20_left_menu);
636
ui_set_right_menu(vic20_right_menu);
638
ui_set_tape_menu(vic20_tape_menu);
639
ui_set_topmenu(vic20_top_menu);
640
ui_set_speedmenu(ui_performance_settings_menu);
646
void vic20ui_shutdown(void)
648
vic20ui_dynamic_menu_shutdown();