2 * Copyright (C) 1996-1998 Szeredi Miklos
3 * Email: mszeredi@inf.bme.hu
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version. See the file COPYING.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 #include "lib/configfile.h"
23 #include "lib/oldmenuapi.h"
49 #include "zxbox_keyb.h"
51 int endofsingle IBSS_ATTR
;
53 int sp_nosync IBSS_ATTR
= 0;
55 int showframe IBSS_ATTR
= 1;
58 qbyte sp_int_ctr IBSS_ATTR
= 0;
59 int intkeys
[5] IBSS_ATTR
;
65 #define GLOBALCFG "zxbox.cfg"
67 /* here goes settings hadling */
69 /*static struct zxbox_settings settings;*/
70 static struct zxbox_settings old_settings
;
72 static char* noyes_options
[] = { "No", "Yes" };
73 /*static char* kempston_options[] = { "No", "Yes" };
74 static char* showfps_options[] = {"No", "Yes"};*/
76 static struct configdata config
[] =
78 {TYPE_ENUM
, 0, 2, &settings
.invert_colors
, "Invert Colors", noyes_options
, NULL
},
79 {TYPE_ENUM
, 0, 2, &settings
.kempston
, "Map keys to kempston", noyes_options
, NULL
},
80 {TYPE_ENUM
, 0, 2, &settings
.showfps
, "Show Speed", noyes_options
, NULL
},
81 {TYPE_ENUM
, 0, 2, &settings
.sound
, "Sound", noyes_options
, NULL
},
82 {TYPE_INT
, 0, 9, &settings
.frameskip
, "Frameskip", NULL
, NULL
},
83 {TYPE_INT
, 1, 10, &settings
.volume
, "Volume", NULL
, NULL
},
84 {TYPE_STRING
, 0, 5, NULL
,"Key Mapping", NULL
, (char*)&settings
.keymap
},
86 int spcf_read_conf_file(const char *filename
)
90 settings
.keymap
[0]='2';
91 settings
.keymap
[1]='w';
92 settings
.keymap
[2]='9';
93 settings
.keymap
[3]='0';
94 settings
.keymap
[4]='z';
95 settings
.kempston
= 1 ;
96 settings
.invert_colors
=0;
98 settings
.frameskip
= 0;
102 if (configfile_load(filename
, config
,
103 sizeof(config
)/sizeof(*config
),
107 /* If the loading failed, save a new config file (as the disk is
109 configfile_save(filename
, config
,
110 sizeof(config
)/sizeof(*config
),
113 /* Keep a copy of the saved version of the settings - so we can check if
114 the settings have changed when we quit */
115 old_settings
= settings
;
116 sound_on
= settings
.sound
;
117 showframe
= settings
.frameskip
+1;
119 for ( i
=0 ; i
<5 ; i
++){
120 if (settings
.keymap
[i
] == 'E')
121 intkeys
[i
]=SK_KP_Enter
;
122 else if ( settings
.keymap
[i
] == 'S' )
123 intkeys
[i
]=SK_KP_Space
;
125 intkeys
[i
] = (unsigned) settings
.keymap
[i
];
130 /* and here it stops (settings loading ;) )*/
133 static void set_keys(void){
138 static const struct menu_item items
[] = {
139 { "Map Up key", NULL
},
140 { "Map Down key", NULL
},
141 { "Map Left key", NULL
},
142 { "Map Right key", NULL
},
143 { "Map Fire/Jump key", NULL
},
146 m
= menu_init(rb
,items
, sizeof(items
) / sizeof(*items
),
147 NULL
, NULL
, NULL
, NULL
);
149 rb
->button_clear_queue();
157 if (!zx_kbd_input((char*) &c
))
159 settings
.keymap
[0]=c
;
163 if (!zx_kbd_input((char*) &c
))
165 settings
.keymap
[1]=c
;
169 if (!zx_kbd_input((char*) &c
))
171 settings
.keymap
[2]=c
;
175 if (!zx_kbd_input((char*) &c
))
177 settings
.keymap
[3]=c
;
181 if (!zx_kbd_input((char*) &c
))
183 settings
.keymap
[4]=c
;
195 /* select predefined keymap */
196 static void select_keymap(void){
200 static const struct menu_item items
[] = {
206 m
= menu_init(rb
,items
, sizeof(items
) / sizeof(*items
),
207 NULL
, NULL
, NULL
, NULL
);
209 rb
->button_clear_queue();
217 rb
->memcpy ( (void*)&settings
.keymap
[0] , (void*)items
[0].desc
, sizeof(items
[0].desc
));
221 rb
->memcpy ( (void*)&settings
.keymap
[0] , (void*)items
[1].desc
, sizeof(items
[1].desc
));
225 rb
->memcpy ( (void*)&settings
.keymap
[0] , (void*)items
[2].desc
, sizeof(items
[2].desc
));
238 static void options_menu(void){
239 static const struct opt_items no_yes
[2] = {
247 static const struct menu_item items
[] = {
248 { "Map Keys to kempston", NULL
},
249 { "Display Speed", NULL
},
250 { "Invert Colors", NULL
},
251 { "Frameskip", NULL
},
254 { "Predefined keymap", NULL
},
255 { "Custom keymap", NULL
},
257 static struct opt_items frameskip_items
[] = {
271 m
= menu_init(rb
,items
, sizeof(items
) / sizeof(*items
),
272 NULL
, NULL
, NULL
, NULL
);
274 rb
->button_clear_queue();
282 new_setting
=settings
.kempston
;
283 rb
->set_option("Map Keys to kempston",&new_setting
,INT
,
285 if (new_setting
!= settings
.kempston
)
286 settings
.kempston
=new_setting
;
289 new_setting
= settings
.showfps
;
290 rb
->set_option("Display Speed",&new_setting
,INT
,
292 if (new_setting
!= settings
.showfps
)
293 settings
.showfps
=new_setting
;
296 new_setting
= settings
.invert_colors
;
297 rb
->set_option("Invert Colors",&new_setting
,INT
,
299 if (new_setting
!= settings
.invert_colors
)
300 settings
.invert_colors
=new_setting
;
301 rb
->splash(HZ
, "Restart to see effect");
304 new_setting
= settings
.frameskip
;
305 rb
->set_option("Frameskip",&new_setting
,INT
,
306 frameskip_items
, 10, NULL
);
307 if (new_setting
!= settings
.frameskip
)
308 settings
.frameskip
=new_setting
;
311 new_setting
= settings
.sound
;
312 rb
->set_option("Sound",&new_setting
,INT
,
314 if (new_setting
!= settings
.sound
)
315 settings
.sound
=new_setting
;
316 #if CONFIG_CODEC == SWCODEC && !defined SIMULATOR
321 new_setting
= 9 - settings
.volume
;
322 rb
->set_option("Volume",&new_setting
,INT
,
323 frameskip_items
, 10, NULL
);
324 new_setting
= 9 - new_setting
;
325 if (new_setting
!= settings
.volume
)
326 settings
.volume
=new_setting
;
344 static bool zxbox_menu(void)
346 #if CONFIG_CODEC == SWCODEC && !defined SIMULATOR
354 static const struct menu_item items
[] = {
355 { "VKeyboard", NULL
},
356 { "Play/Pause Tape", NULL
},
357 { "Save quick snapshot", NULL
},
358 { "Load quick snapshot", NULL
},
359 { "Save Snapshot", NULL
},
360 { "Toggle \"fast\" mode", NULL
},
365 m
= menu_init(rb
,items
, sizeof(items
) / sizeof(*items
),
366 NULL
, NULL
, NULL
, NULL
);
368 rb
->button_clear_queue();
376 if (!zx_kbd_input((char*) &c
))
388 save_quick_snapshot();
392 load_quick_snapshot();
399 sp_nosync
=!sp_nosync
;
416 #if defined(HAVE_ADJUSTABLE_CPU_FREQ)
421 for ( i
=0 ; i
<5 ; i
++){
422 if (settings
.keymap
[i
] == 'E')
423 intkeys
[i
]=SK_KP_Enter
;
424 else if ( settings
.keymap
[i
] == 'S' )
425 intkeys
[i
]=SK_KP_Space
;
427 intkeys
[i
] = (unsigned) settings
.keymap
[i
];
437 extern unsigned char loadim
[];
438 extern unsigned long loadim_size
;
442 static void update(void)
445 sp_border_update
>>= 1;
446 sp_imag_vert
= sp_imag_horiz
= 0;
449 static void run_singlemode(void)
452 int evenframe
, halfsec
, updateframe
;
458 while(!endofsingle
) {
466 /* Save the user settings if they have changed */
467 if (rb
->memcmp(&settings
,&old_settings
,sizeof(settings
))!=0) {
471 rb
->splash(0, "Saving settings...");
472 configfile_save(GLOBALCFG
, config
,sizeof(config
)/sizeof(*config
),SETTINGS_VERSION
);
479 start_time
= *rb
->current_tick
;
480 sound_on
= settings
.sound
;
481 showframe
= settings
.frameskip
+1;
484 halfsec
= !(sp_int_ctr
% 25);
485 evenframe
= !(sp_int_ctr
& 1);
487 if(screen_visible
) updateframe
= sp_nosync
? halfsec
:
488 !((sp_int_ctr
+SHOW_OFFS
) % showframe
);
489 else updateframe
= 0;
491 sp_flash_state
= ~sp_flash_state
;
498 spkb_process_events(evenframe
);
499 sp_updating
= updateframe
;
501 t
= sp_halfframe(t
, evenframe
? EVENHF
: ODDHF
);
502 if(SPNM(load_trapped
)) {
503 SPNM(load_trapped
) = 0;
509 if(!evenframe
) rec_tape();
511 if(!sound_avail
) spti_wait();
513 if(updateframe
) update();
514 play_sound(evenframe
);
516 else if(updateframe
) update();
522 void check_params(const void* parameter
)
524 spcf_read_conf_file(GLOBALCFG
);
525 spcf_read_command_line(parameter
);
528 static void init_load(const void *parameter
)
530 if(load_immed
) snsh_z80_load_intern(loadim
, loadim_size
);
532 check_params(parameter
);
533 if(spcf_init_snapshot
!= NULL
) {
535 rb
->splashf(HZ
, "Loading snapshot '%s'", spcf_init_snapshot
);
538 load_snapshot_file_type(spcf_init_snapshot
, spcf_init_snapshot_type
);
539 free_string(spcf_init_snapshot
);
542 if(spcf_init_tapefile
!= NULL
) {
543 /*sprintf(msgbuf, "Loading tape '%s'", spcf_init_tapefile);
545 start_play_file_type(spcf_init_tapefile
, 0, spcf_init_tapefile_type
);
546 if(!load_immed
) pause_play();
547 free_string(spcf_init_tapefile
);
551 void start_spectemu(const void *parameter
)
554 init_load(parameter
);