pcem/src/wx-config.c

2493 lines
113 KiB
C

#include "wx-utils.h"
#include "wx-sdl2.h"
#include "wx-joystickconfig.h"
#include "ibm.h"
#include "ide.h"
#include "cpu.h"
#include "device.h"
#include "fdd.h"
#include "gameport.h"
#include "hdd.h"
#include "lpt.h"
#include "model.h"
#include "mouse.h"
#include "mem.h"
#include "nethandler.h"
#include "nvr.h"
#include "scsi_cd.h"
#include "sound.h"
#include "video.h"
#include "vid_voodoo.h"
#include "MiniVHD/minivhd.h"
#include "MiniVHD/minivhd_util.h"
//#define MAX_CYLINDERS ((((1 << 28)-1) / 16) / 63)
#define MAX_CYLINDERS 265264 /*Award 430VX won't POST with a larger drive*/
extern int pause;
extern int is486;
static int romstolist[ROM_MAX], listtomodel[ROM_MAX], romstomodel[ROM_MAX],
modeltolist[ROM_MAX];
static int settings_sound_to_list[20], settings_list_to_sound[20];
static int settings_mouse_to_list[20], settings_list_to_mouse[20];
#ifdef USE_NETWORKING
static int settings_network_to_list[20], settings_list_to_network[20];
#endif
static char *hdd_names[16];
int has_been_inited = 0;
static int hd_changed = 0;
static char hd_new_name[512];
static int hd_new_spt, hd_new_hpc, hd_new_cyl;
static int hd_new_type;
static int new_cdrom_channel;
static int new_zip_channel;
extern int pause;
static int memspin_old;
extern void deviceconfig_open(void* hwnd, device_t *device);
extern int hdconf_init(void* hdlg);
extern int hdconf_update(void* hdlg);
static int hdd_controller_selected_is_ide(void* hdlg);
static int hdd_controller_selected_is_scsi(void* hdlg);
static int hdd_controller_selected_has_config(void *hdlg);
static device_t *hdd_controller_selected_get_device(void *hdlg);
static int mouse_valid(int type, int model)
{
if (((type & MOUSE_TYPE_IF_MASK) == MOUSE_TYPE_PS2)
&& !(models[model].flags & MODEL_PS2))
return 0;
if (((type & MOUSE_TYPE_IF_MASK) == MOUSE_TYPE_AMSTRAD)
&& !(models[model].flags & MODEL_AMSTRAD))
return 0;
if (((type & MOUSE_TYPE_IF_MASK) == MOUSE_TYPE_OLIM24)
&& !(models[model].flags & MODEL_OLIM24))
return 0;
return 1;
}
/*static int mpu401_available(int sound_card)
{
char* name = sound_card_get_internal_name(sound_card);
if (name && (!strcmp(name, "sb16") || !strcmp(name, "sbawe32")))
return TRUE;
return FALSE;
}*/
static void recalc_fpu_list(void *hdlg, int model, int manu, int cpu, int fpu)
{
void *h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOFPU"));
int c = 0;
wx_sendmessage(h, WX_CB_RESETCONTENT, 0, 0);
wx_sendmessage(h, WX_CB_SETCURSEL, 0, 0);
while (1)
{
const char *name = fpu_get_name_from_index(model, manu, cpu, c);
int type = fpu_get_type_from_index(model, manu, cpu, c);
if (!name)
break;
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM)name);
if (!c || type == fpu)
wx_sendmessage(h, WX_CB_SETCURSEL, c, 0);
c++;
}
if (c > 1)
wx_enablewindow(h, TRUE);
else
wx_enablewindow(h, FALSE);
}
static void recalc_vid_list(void* hdlg, int model, int force_builtin_video)
{
void* h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOVID"));
int c = 0, d = 0;
int found_card = 0;
int cur_gfxcard = gfxcard;
int romset = model_getromset_from_model(model);
wx_sendmessage(h, WX_CB_RESETCONTENT, 0, 0);
wx_sendmessage(h, WX_CB_SETCURSEL, 0, 0);
if (model_has_fixed_gfx(model))
{
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM)"Built-in video");
wx_sendmessage(h, WX_CB_SETCURSEL, 0, 0);
wx_enablewindow(h, FALSE);
h = wx_getdlgitem(hdlg, WX_ID("IDC_CONFIGUREVID"));
wx_enablewindow(h, video_card_has_config(gfxcard, romset));
return;
}
if (model_has_optional_gfx(model))
{
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM)"Built-in video");
if (gfxcard == GFX_BUILTIN || force_builtin_video)
{
wx_sendmessage(h, WX_CB_SETCURSEL, d, 0);
found_card = 1;
cur_gfxcard = GFX_BUILTIN;
}
d++;
}
if (cur_gfxcard == GFX_BUILTIN && !model_has_fixed_gfx(model) && !model_has_optional_gfx(model))
cur_gfxcard = 0;
while (1)
{
char *s = video_card_getname(c);
if (!s[0])
break;
if (video_card_available(c) && gfx_present[video_new_to_old(c)] &&
((models[model].flags & MODEL_PCI) || !(video_card_getdevice(c, romset)->flags & DEVICE_PCI)) &&
((models[model].flags & MODEL_MCA) || !(video_card_getdevice(c, romset)->flags & DEVICE_MCA)) &&
(!(models[model].flags & MODEL_MCA) || (video_card_getdevice(c, romset)->flags & DEVICE_MCA))
)
{
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM)s);
if (video_new_to_old(c) == gfxcard && !found_card)
{
wx_sendmessage(h, WX_CB_SETCURSEL, d, 0);
found_card = 1;
}
d++;
}
c++;
}
if (!found_card)
wx_sendmessage(h, WX_CB_SETCURSEL, 0, 0);
wx_enablewindow(h, TRUE);
h = wx_getdlgitem(hdlg, WX_ID("IDC_CONFIGUREVID"));
if (video_card_has_config(video_old_to_new(cur_gfxcard), romset))
wx_enablewindow(h, TRUE);
else
wx_enablewindow(h, FALSE);
h = wx_getdlgitem(hdlg, WX_ID("IDC_CHECKVOODOO"));
wx_enablewindow(h, (models[model].flags & MODEL_PCI) ? TRUE : FALSE);
h = wx_getdlgitem(hdlg, WX_ID("IDC_CONFIGUREVOODOO"));
wx_enablewindow(h, (models[model].flags & MODEL_PCI) ? TRUE : FALSE);
}
static void recalc_snd_list(void* hdlg, int model)
{
void* h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOSND"));
int c = 0, d = 0;
wx_sendmessage(h, WX_CB_RESETCONTENT, 0, 0);
while (1)
{
char *s = sound_card_getname(c);
if (!s[0])
break;
settings_sound_to_list[c] = d;
if (sound_card_available(c))
{
device_t *sound_dev = sound_card_getdevice(c);
if (!sound_dev || (sound_dev->flags & DEVICE_MCA) == (models[model].flags & MODEL_MCA))
{
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM) s);
settings_list_to_sound[d] = c;
d++;
}
}
c++;
}
wx_sendmessage(h, WX_CB_SETCURSEL, settings_sound_to_list[sound_card_current], 0);
}
static void recalc_hdd_list(void* hdlg, int model, int use_selected_hdd, int force_ide)
{
void* h;
char *s;
int valid = 0;
char old_name[16];
int c, d;
int hdd_type;
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOHDD"));
if (force_ide)
strcpy(old_name, "ide");
else if (use_selected_hdd)
{
c = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
if (c != -1 && hdd_names[c])
strncpy(old_name, hdd_names[c], sizeof(old_name)-1);
else
{
if (models[model].flags & MODEL_HAS_IDE)
strcpy(old_name, "none");
else
strcpy(old_name, "ide");
}
}
else
strncpy(old_name, hdd_controller_name, sizeof(old_name)-1);
wx_sendmessage(h, WX_CB_RESETCONTENT, 0, 0);
c = d = 0;
while (1)
{
s = hdd_controller_get_name(c);
if (s[0] == 0)
break;
if ((((hdd_controller_get_flags(c) & DEVICE_AT) && !(models[model].flags & MODEL_AT)) ||
(hdd_controller_get_flags(c) & DEVICE_MCA) != (models[model].flags & MODEL_MCA)) && c)
{
c++;
continue;
}
if ((((hdd_controller_get_flags(c) & DEVICE_PS1) && models[model].id != ROM_IBMPS1_2011) ||
(!(hdd_controller_get_flags(c) & DEVICE_PS1) && models[model].id == ROM_IBMPS1_2011)) && c)
{
c++;
continue;
}
if (!hdd_controller_available(c))
{
c++;
continue;
}
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM)s);
hdd_names[d] = hdd_controller_get_internal_name(c);
if (!strcmp(old_name, hdd_names[d]))
{
wx_sendmessage(h, WX_CB_SETCURSEL, d, 0);
valid = 1;
}
c++;
d++;
}
if (!valid)
wx_sendmessage(h, WX_CB_SETCURSEL, 0, 0);
wx_enablewindow(h, TRUE);
h = wx_getdlgitem(hdlg, WX_ID("IDC_CONFIGUREHDD"));
if (hdd_controller_selected_has_config(hdlg))
wx_enablewindow(h, TRUE);
else
wx_enablewindow(h, FALSE);
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOHDD"));
hdd_type = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
h = wx_getdlgitem(hdlg, WX_ID("IDC_HDCBOOK"));
while (wx_sendmessage(h, WX_CHB_GETPAGECOUNT, 0, 0))
wx_sendmessage(h, WX_CHB_REMOVEPAGE, 0, 0);
for (c = 0; c < 7; c++)
{
void *page;
char s[80];
sprintf(s, "IDC_HDPANEL[%i]", c);
page = wx_getdlgitem(hdlg, WX_ID(s));
wx_sendmessage(page, WX_REPARENT, (LONG_PARAM)h, 0);
wx_sendmessage(h, WX_CHB_ADDPAGE, (LONG_PARAM)page, (LONG_PARAM)"dummy name");
}
if (hdd_controller_is_scsi(hdd_names[hdd_type]))
{
for (c = 0; c < 7; c++)
{
void *page;
char s[80];
sprintf(s, "IDC_HDPANEL[%i]", c);
page = wx_getdlgitem(hdlg, WX_ID(s));
wx_sendmessage(page, WX_REPARENT, (LONG_PARAM)h, 0);
sprintf(s, "SCSI ID %i (%c:)", c, 'C'+c);
wx_sendmessage(h, WX_CHB_SETPAGETEXT, c, (LONG_PARAM)s);
}
}
else if (hdd_controller_is_ide(hdd_names[hdd_type]))
{
for (c = 0; c < 4; c++)
{
void *page;
char s[80];
sprintf(s, "IDC_HDPANEL[%i]", c);
page = wx_getdlgitem(hdlg, WX_ID(s));
wx_sendmessage(page, WX_REPARENT, (LONG_PARAM)h, 0);
sprintf(s, "Drive %i %s %s (%c:)", c, (c & 2) ? "Secondary" : "Primary", (c & 1) ? "Slave" : "Master", 'C'+c);
wx_sendmessage(h, WX_CHB_SETPAGETEXT, c, (LONG_PARAM)s);
}
for (c = 6; c >= 4; c--)
{
wx_sendmessage(h, WX_CHB_REMOVEPAGE, c, 0);
}
}
else
{
for (c = 0; c < 2; c++)
{
void *page;
char s[80];
sprintf(s, "IDC_HDPANEL[%i]", c);
page = wx_getdlgitem(hdlg, WX_ID(s));
wx_sendmessage(page, WX_REPARENT, (LONG_PARAM)h, 0);
sprintf(s, "Drive %i %s (%c:)", c, (c & 1) ? "Secondary" : "Primary", 'C'+c);
wx_sendmessage(h, WX_CHB_SETPAGETEXT, c, (LONG_PARAM)s);
}
for (c = 6; c >= 2; c--)
{
wx_sendmessage(h, WX_CHB_REMOVEPAGE, c, 0);
}
}
}
// TODO: split this into model/speed recalcs?
static void recalc_cd_list(void *hdlg, int cur_speed, char *cur_model)
{
int temp_model = -1;
void *h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBO_CDMODEL"));
int c = 0;
int found = 0;
wx_sendmessage(h, WX_CB_RESETCONTENT, 0, 0);
if (hdd_controller_selected_is_ide(hdlg) || hdd_controller_selected_is_scsi(hdlg))
wx_enablewindow(h, TRUE);
else
wx_enablewindow(h, FALSE);
while (1)
{
char s[40];
char *model;
if ((cd_get_model_interfaces(c) == CD_MODEL_INTERFACE_ALL) ||
(cd_get_model_interfaces(c) == CD_MODEL_INTERFACE_IDE && hdd_controller_selected_is_ide(hdlg)) ||
(cd_get_model_interfaces(c) == CD_MODEL_INTERFACE_SCSI && hdd_controller_selected_is_scsi(hdlg)))
{
model = cd_get_model(c);
sprintf(s, "%s", model);
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM)s);
if (!strncmp(s, cur_model, 40))
{
wx_sendmessage(h, WX_CB_SETCURSEL, c, 0);
temp_model = c;
found = 1;
}
}
c++;
if (c > MAX_CD_MODEL)
break;
}
if (!found)
wx_sendmessage(h, WX_CB_SETCURSEL, 0, 0); // assume that there is always at least one TODO: is this necessary?
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBO_CDSPEED"));
c = 0;
found = 0;
wx_sendmessage(h, WX_CB_RESETCONTENT, 0, 0);
if (temp_model >= 0 && cd_get_model_speed(temp_model) != -1)
{
// this model has a specific speed
wx_enablewindow(h, FALSE);
cur_speed = cd_get_model_speed(temp_model);
}
else if (hdd_controller_selected_is_ide(hdlg) || hdd_controller_selected_is_scsi(hdlg))
wx_enablewindow(h, TRUE);
else
wx_enablewindow(h, FALSE);
while (1)
{
char s[8];
int speed;
speed = cd_get_speed(c);
sprintf(s, "%iX", speed);
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM)s);
if (speed == cur_speed)
{
wx_sendmessage(h, WX_CB_SETCURSEL, c, 0);
found = 1;
}
c++;
if (speed >= MAX_CD_SPEED)
break;
}
if (!found)
wx_sendmessage(h, WX_CB_SETCURSEL, 0, 0); // fall back TODO: is this necessary?
}
#ifdef USE_NETWORKING
static void recalc_net_list(void *hdlg, int model)
{
void *h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBO_NETCARD"));
int c = 0, d = 0;
int found_card = 0;
wx_sendmessage(h, WX_CB_RESETCONTENT, 0, 0);
while (1)
{
char *s = network_card_getname(c);
device_t *dev;
if (!s[0])
break;
settings_network_to_list[c] = d;
dev = network_card_getdevice(c);
if (network_card_available(c) &&
(!dev || (models[model].flags & MODEL_PCI) || !(dev->flags & DEVICE_PCI)))
{
device_t *network_dev = network_card_getdevice(c);
if (!network_dev || (network_dev->flags & DEVICE_MCA) == (models[model].flags & MODEL_MCA))
{
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM)s);
settings_list_to_network[d] = c;
if (c == network_card_current)
{
wx_sendmessage(h, WX_CB_SETCURSEL, d, 0);
found_card = 1;
}
d++;
}
}
c++;
}
if (!found_card)
wx_sendmessage(h, WX_CB_SETCURSEL, 0, 0);
}
#endif
int config_dlgsave(void* hdlg)
{
char temp_str[256];
void* h;
int c;
int gfx;//, fpu;
int temp_cpu, temp_cpu_m, temp_model, temp_fpu;
int temp_GAMEBLASTER, temp_GUS, temp_SSI2001, temp_voodoo, temp_sound_card_current;
int temp_dynarec;
int temp_fda_type, temp_fdb_type;
int temp_mouse_type;
int temp_lpt1_device;
int temp_joystick_type;
#ifdef USE_NETWORKING
int temp_network_card;
#endif
int hdd_changed = 0;
char s[260];
PcemHDC hd[7];
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBO1"));
temp_model = listtomodel[wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0)];
h = wx_getdlgitem(hdlg, WX_ID("IDC_MEMSPIN"));
int mem = wx_sendmessage(h, WX_UDM_GETPOS, 0, 0);
mem &= ~(models[temp_model].ram_granularity - 1);
if (mem < models[temp_model].min_ram)
mem = models[temp_model].min_ram;
else if (mem > models[temp_model].max_ram)
mem = models[temp_model].max_ram;
if ((models[temp_model].flags & MODEL_AT) && models[temp_model].ram_granularity < 128)
mem *= 1024;
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOVID"));
wx_sendmessage(h, WX_CB_GETLBTEXT, wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0),
(LONG_PARAM) temp_str);
gfx = video_new_to_old(video_card_getid(temp_str));
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOCPUM"));
temp_cpu_m = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBO3"));
temp_cpu = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
// fpu = (models[temp_model].cpu[temp_cpu_m].cpus[temp_cpu].cpu_type
// >= CPU_i486DX) ? 1 : 0;
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOFPU"));
temp_fpu = fpu_get_type_from_index(temp_model, temp_cpu_m, temp_cpu, wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0));
h = wx_getdlgitem(hdlg, WX_ID("IDC_CHECK3"));
temp_GAMEBLASTER = wx_sendmessage(h, WX_BM_GETCHECK, 0, 0);
h = wx_getdlgitem(hdlg, WX_ID("IDC_CHECKGUS"));
temp_GUS = wx_sendmessage(h, WX_BM_GETCHECK, 0, 0);
h = wx_getdlgitem(hdlg, WX_ID("IDC_CHECKSSI"));
temp_SSI2001 = wx_sendmessage(h, WX_BM_GETCHECK, 0, 0);
h = wx_getdlgitem(hdlg, WX_ID("IDC_CHECKSYNC"));
enable_sync = wx_sendmessage(h, WX_BM_GETCHECK, 0, 0);
h = wx_getdlgitem(hdlg, WX_ID("IDC_CHECKVOODOO"));
temp_voodoo = wx_sendmessage(h, WX_BM_GETCHECK, 0, 0);
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOSND"));
temp_sound_card_current = settings_list_to_sound[wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0)];
h = wx_getdlgitem(hdlg, WX_ID("IDC_CHECKDYNAREC"));
temp_dynarec = wx_sendmessage(h, WX_BM_GETCHECK, 0, 0);
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBODRA"));
temp_fda_type = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBODRB"));
temp_fdb_type = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOJOY"));
temp_joystick_type = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOMOUSE"));
temp_mouse_type = settings_list_to_mouse[wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0)];
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOHDD"));
c = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
if (hdd_names[c])
hdd_changed = strncmp(hdd_names[c], hdd_controller_name, sizeof(hdd_controller_name)-1);
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOLPT1"));
temp_lpt1_device = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
#ifdef USE_NETWORKING
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBO_NETCARD"));
temp_network_card = settings_list_to_network[wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0)];
#endif
if (temp_model != model || gfx != gfxcard || mem != mem_size || temp_fpu != fpu_type ||
temp_GAMEBLASTER != GAMEBLASTER || temp_GUS != GUS ||
temp_SSI2001 != SSI2001 || temp_sound_card_current != sound_card_current ||
temp_voodoo != voodoo_enabled || temp_dynarec != cpu_use_dynarec ||
temp_fda_type != fdd_get_type(0) || temp_fdb_type != fdd_get_type(1) ||
temp_mouse_type != mouse_type || hdd_changed || hd_changed || cdrom_channel != new_cdrom_channel ||
zip_channel != new_zip_channel || strcmp(lpt1_device_name, lpt_device_get_internal_name(temp_lpt1_device))
#ifdef USE_NETWORKING
|| temp_network_card != network_card_current
#endif
)
{
if (!has_been_inited || confirm())
{
savenvr();
model = temp_model;
romset = model_getromset();
gfxcard = gfx;
mem_size = mem;
cpu_manufacturer = temp_cpu_m;
cpu = temp_cpu;
fpu_type = temp_fpu;
GAMEBLASTER = temp_GAMEBLASTER;
GUS = temp_GUS;
SSI2001 = temp_SSI2001;
sound_card_current = temp_sound_card_current;
voodoo_enabled = temp_voodoo;
cpu_use_dynarec = temp_dynarec;
mouse_type = temp_mouse_type;
strcpy(lpt1_device_name, lpt_device_get_internal_name(temp_lpt1_device));
#ifdef USE_NETWORKING
network_card_current = temp_network_card;
#endif
fdd_set_type(0, temp_fda_type);
fdd_set_type(1, temp_fdb_type);
if (hdd_names[c])
strncpy(hdd_controller_name, hdd_names[c], sizeof(hdd_controller_name)-1);
else
strcpy(hdd_controller_name, "none");
for (c = 0; c < 7; c++)
{
sprintf(s, "IDC_EDIT_SPT[%i]", c);
h = wx_getdlgitem(hdlg, WX_ID(s));
wx_sendmessage(h, WX_WM_GETTEXT, 255, (LONG_PARAM)s);
sscanf(s, "%i", &hd[c].spt);
sprintf(s, "IDC_EDIT_HPC[%i]", c);
h = wx_getdlgitem(hdlg, WX_ID(s));
wx_sendmessage(h, WX_WM_GETTEXT, 255, (LONG_PARAM)s);
sscanf(s, "%i", &hd[c].hpc);
sprintf(s, "IDC_EDIT_CYL[%i]", c);
h = wx_getdlgitem(hdlg, WX_ID(s));
wx_sendmessage(h, WX_WM_GETTEXT, 255, (LONG_PARAM)s);
sscanf(s, "%i", &hd[c].tracks);
sprintf(s, "IDC_EDIT_FN[%i]", c);
h = wx_getdlgitem(hdlg, WX_ID(s));
wx_sendmessage(h, WX_WM_GETTEXT, 511, (LONG_PARAM)ide_fn[c]);
hdc[c] = hd[c];
}
cdrom_channel = new_cdrom_channel;
zip_channel = new_zip_channel;
if (has_been_inited)
{
mem_alloc();
loadbios();
resetpchard();
}
}
else
return TRUE;
}
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOSPD"));
video_speed = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0) - 1;
cpu_manufacturer = temp_cpu_m;
cpu = temp_cpu;
cpu_set();
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOWS"));
cpu_waitstates = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
cpu_update_waitstates();
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBO_CDSPEED"));
cd_speed = cd_get_speed(wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0));
cd_set_speed(cd_speed);
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBO_CDMODEL"));
cd_model = cd_get_model(wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0));
cd_set_model(cd_model);
if (has_been_inited)
saveconfig(NULL);
speedchanged();
joystick_type = temp_joystick_type;
gameport_update_joystick_type();
return TRUE;
}
static int prev_model;
int config_dlgproc(void* hdlg, int message, INT_PARAM wParam, LONG_PARAM lParam)
{
char temp_str[256];
void* h;
int c, d;
int gfx, mem;
int temp_cpu, temp_cpu_m, temp_model, temp_fpu;
int temp_sound_card_current;
int temp_dynarec;
int cpu_flags;
int cpu_type;
int temp_cd_model, temp_cd_speed;
int temp_mouse_type;
#ifdef USE_NETWORKING
int temp_network_card;
#endif
switch (message)
{
case WX_INITDIALOG:
{
pause = 1;
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBO1"));
for (c = 0; c < ROM_MAX; c++)
romstolist[c] = 0;
c = d = 0;
while (models[c].id != -1)
{
pclog("INITDIALOG : %i %i %i\n", c, models[c].id,
romspresent[models[c].id]);
if (romspresent[models[c].id])
{
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM) models[c].name);
modeltolist[c] = d;
listtomodel[d] = c;
romstolist[models[c].id] = d;
romstomodel[models[c].id] = c;
d++;
}
c++;
}
wx_sendmessage(h, WX_CB_SETCURSEL, modeltolist[model], 0);
prev_model = model;
recalc_vid_list(hdlg, romstomodel[romset], 0);
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOCPUM"));
c = 0;
while (models[romstomodel[romset]].cpu[c].cpus != NULL && c < 4)
{
wx_sendmessage(h, WX_CB_ADDSTRING, 0,
(LONG_PARAM) models[romstomodel[romset]].cpu[c].name);
c++;
}
wx_enablewindow(h, TRUE);
wx_sendmessage(h, WX_CB_SETCURSEL, cpu_manufacturer, 0);
if (c == 1)
wx_enablewindow(h, FALSE);
else
wx_enablewindow(h, TRUE);
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBO3"));
c = 0;
while (models[romstomodel[romset]].cpu[cpu_manufacturer].cpus[c].cpu_type != -1)
{
wx_sendmessage(h, WX_CB_ADDSTRING, 0,
(LONG_PARAM) models[romstomodel[romset]].cpu[cpu_manufacturer].cpus[c].name);
c++;
}
wx_enablewindow(h, TRUE);
wx_sendmessage(h, WX_CB_SETCURSEL, cpu, 0);
recalc_fpu_list(hdlg, romstomodel[romset], cpu_manufacturer, cpu, fpu_type);
recalc_snd_list(hdlg, romstomodel[romset]);
h = wx_getdlgitem(hdlg, WX_ID("IDC_CHECK3"));
wx_sendmessage(h, WX_BM_SETCHECK, GAMEBLASTER, 0);
h = wx_getdlgitem(hdlg, WX_ID("IDC_CHECKGUS"));
wx_sendmessage(h, WX_BM_SETCHECK, GUS, 0);
h = wx_getdlgitem(hdlg, WX_ID("IDC_CHECKSSI"));
wx_sendmessage(h, WX_BM_SETCHECK, SSI2001, 0);
h = wx_getdlgitem(hdlg, WX_ID("IDC_CHECKSYNC"));
wx_sendmessage(h, WX_BM_SETCHECK, enable_sync, 0);
h = wx_getdlgitem(hdlg, WX_ID("IDC_CHECKVOODOO"));
wx_sendmessage(h, WX_BM_SETCHECK, voodoo_enabled, 0);
cpu_flags =
models[romstomodel[romset]].cpu[cpu_manufacturer].cpus[cpu].cpu_flags;
h = wx_getdlgitem(hdlg, WX_ID("IDC_CHECKDYNAREC"));
if (!(cpu_flags & CPU_SUPPORTS_DYNAREC) || (cpu_flags & CPU_REQUIRES_DYNAREC))
wx_enablewindow(h, FALSE);
else
wx_enablewindow(h, TRUE);
wx_sendmessage(h, WX_BM_SETCHECK,
((cpu_flags & CPU_SUPPORTS_DYNAREC) && cpu_use_dynarec)
|| (cpu_flags & CPU_REQUIRES_DYNAREC), 0);
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOSPD"));
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM) "Default");
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM) "8-bit");
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM) "Slow 16-bit");
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM) "Fast 16-bit");
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM) "Slow VLB/PCI");
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM) "Mid VLB/PCI");
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM) "Fast VLB/PCI");
wx_sendmessage(h, WX_CB_SETCURSEL, video_speed+1, 0);
h = wx_getdlgitem(hdlg, WX_ID("IDC_MEMSPIN"));
printf("%d\n", models[model].ram_granularity);
wx_sendmessage(h, WX_UDM_SETRANGE, 0,
(models[romstomodel[romset]].min_ram << 16)
| models[romstomodel[romset]].max_ram);
wx_sendmessage(h, WX_UDM_SETINCR, 0, models[model].ram_granularity);
if (!((models[model].flags & MODEL_AT) && models[model].ram_granularity < 128))
{
wx_sendmessage(h, WX_UDM_SETPOS, 0, mem_size);
memspin_old = mem_size;
}
else
{
wx_sendmessage(h, WX_UDM_SETPOS, 0, mem_size / 1024);
memspin_old = mem_size / 1024;
}
h = wx_getdlgitem(hdlg, WX_ID("IDC_CONFIGUREMOD"));
if (model_getdevice(model))
wx_enablewindow(h, TRUE);
else
wx_enablewindow(h, FALSE);
h = wx_getdlgitem(hdlg, WX_ID("IDC_CONFIGURESND"));
if (sound_card_has_config(sound_card_current))
wx_enablewindow(h, TRUE);
else
wx_enablewindow(h, FALSE);
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBODRA"));
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM)"None");
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM)"5.25\" 360k");
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM)"5.25\" 1.2M");
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM)"5.25\" 1.2M Dual RPM");
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM)"3.5\" 720k");
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM)"3.5\" 1.44M");
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM)"3.5\" 1.44M 3-Mode");
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM)"3.5\" 2.88M");
wx_sendmessage(h, WX_CB_SETCURSEL, fdd_get_type(0), 0);
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBODRB"));
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM)"None");
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM)"5.25\" 360k");
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM)"5.25\" 1.2M");
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM)"5.25\" 1.2M Dual RPM");
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM)"3.5\" 720k");
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM)"3.5\" 1.44M");
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM)"3.5\" 1.44M 3-Mode");
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM)"3.5\" 2.88M");
wx_sendmessage(h, WX_CB_SETCURSEL, fdd_get_type(1), 0);
h = wx_getdlgitem(hdlg, WX_ID("IDC_TEXT_MB"));
if ((models[model].flags & MODEL_AT) && (models[model].ram_granularity < 128))
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM) "MB");
else
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM) "KB");
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOJOY"));
c = 0;
while (joystick_get_name(c))
{
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM)joystick_get_name(c));
c++;
}
wx_enablewindow(h, TRUE);
wx_sendmessage(h, WX_CB_SETCURSEL, joystick_type, 0);
h = wx_getdlgitem(hdlg, WX_ID("IDC_JOY1"));
wx_enablewindow(h, (joystick_get_max_joysticks(joystick_type) >= 1) ? TRUE : FALSE);
h = wx_getdlgitem(hdlg, WX_ID("IDC_JOY2"));
wx_enablewindow(h, (joystick_get_max_joysticks(joystick_type) >= 2) ? TRUE : FALSE);
h = wx_getdlgitem(hdlg, WX_ID("IDC_JOY3"));
wx_enablewindow(h, (joystick_get_max_joysticks(joystick_type) >= 3) ? TRUE : FALSE);
h = wx_getdlgitem(hdlg, WX_ID("IDC_JOY4"));
wx_enablewindow(h, (joystick_get_max_joysticks(joystick_type) >= 4) ? TRUE : FALSE);
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOWS"));
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM) "System default");
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM) "0 W/S");
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM) "1 W/S");
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM) "2 W/S");
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM) "3 W/S");
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM) "4 W/S");
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM) "5 W/S");
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM) "6 W/S");
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM) "7 W/S");
wx_sendmessage(h, WX_CB_SETCURSEL, cpu_waitstates, 0);
cpu_type =
models[romstomodel[romset]].cpu[cpu_manufacturer].cpus[cpu].cpu_type;
if ((cpu_type >= CPU_286) && (cpu_type <= CPU_386DX))
wx_enablewindow(h, TRUE);
else
wx_enablewindow(h, FALSE);
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOMOUSE"));
c = d = 0;
while (1)
{
char *s = mouse_get_name(c);
int type;
if (!s)
break;
type = mouse_get_type(c);
settings_mouse_to_list[c] = d;
if (mouse_valid(type, model))
{
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM) s);
settings_list_to_mouse[d] = c;
d++;
}
c++;
}
wx_sendmessage(h, WX_CB_SETCURSEL, settings_mouse_to_list[mouse_type], 0);
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOLPT1"));
c = d = 0;
while (1)
{
char *s = lpt_device_get_name(c);
if (!s)
break;
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM)s);
if (!strcmp(lpt1_device_name, lpt_device_get_internal_name(c)))
d = c;
c++;
}
wx_sendmessage(h, WX_CB_SETCURSEL, d, 0);
recalc_hdd_list(hdlg, romstomodel[romset], 0, 0);
hd_changed = 0;
new_cdrom_channel = cdrom_channel;
new_zip_channel = zip_channel;
hdconf_init(hdlg);
for (c = 0; c < 7; c++)
{
char s[80];
sprintf(s, "IDC_COMBODRIVETYPE[%i]", c);
h = wx_getdlgitem(hdlg, WX_ID(s));
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM)"Hard drive");
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM)"CD-ROM");
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM)"Iomega Zip");
if (cdrom_channel == c)
wx_sendmessage(h, WX_CB_SETCURSEL, 1, 0);
else if (zip_channel == c)
wx_sendmessage(h, WX_CB_SETCURSEL, 2, 0);
else
wx_sendmessage(h, WX_CB_SETCURSEL, 0, 0);
}
recalc_cd_list(hdlg, cd_speed, cd_model);
#ifdef USE_NETWORKING
recalc_net_list(hdlg, romstomodel[romset]);
h = wx_getdlgitem(hdlg, WX_ID("IDC_CONFIGURE_NETCARD"));
if (network_card_has_config(network_card_current))
wx_enablewindow(h, TRUE);
else
wx_enablewindow(h, FALSE);
#endif
return TRUE;
}
break;
case WX_COMMAND:
{
if (wParam == WX_ID("IDC_COMBO1"))
{
int force_ide = 0;
int force_builtin_video = 0;
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBO1"));
temp_model = listtomodel[wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0)];
if (temp_model == prev_model)
break;
if ((models[temp_model].flags & MODEL_HAS_IDE) && !(models[prev_model].flags & MODEL_HAS_IDE))
force_ide = 1;
if (model_has_optional_gfx(temp_model))
force_builtin_video = 1;
prev_model = temp_model;
/*Rebuild manufacturer list*/
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOCPUM"));
temp_cpu_m = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
wx_sendmessage(h, WX_CB_RESETCONTENT, 0, 0);
c = 0;
while (models[temp_model].cpu[c].cpus != NULL && c < 4)
{
wx_sendmessage(h, WX_CB_ADDSTRING, 0,
(LONG_PARAM) models[temp_model].cpu[c].name);
c++;
}
if (temp_cpu_m >= c)
temp_cpu_m = c - 1;
wx_sendmessage(h, WX_CB_SETCURSEL, temp_cpu_m, 0);
if (c == 1)
wx_enablewindow(h, FALSE);
else
wx_enablewindow(h, TRUE);
/*Rebuild CPU list*/
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBO3"));
temp_cpu = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
wx_sendmessage(h, WX_CB_RESETCONTENT, 0, 0);
c = 0;
while (models[temp_model].cpu[temp_cpu_m].cpus[c].cpu_type != -1)
{
wx_sendmessage(h, WX_CB_ADDSTRING, 0,
(LONG_PARAM) models[temp_model].cpu[temp_cpu_m].cpus[c].name);
c++;
}
if (temp_cpu >= c)
temp_cpu = c - 1;
wx_sendmessage(h, WX_CB_SETCURSEL, temp_cpu, 0);
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOFPU"));
temp_fpu = fpu_get_type_from_index(temp_model, temp_cpu_m, temp_cpu, wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0));
recalc_fpu_list(hdlg, temp_model, temp_cpu_m, temp_cpu, temp_fpu);
h = wx_getdlgitem(hdlg, WX_ID("IDC_CHECKDYNAREC"));
temp_dynarec = wx_sendmessage(h, WX_BM_GETCHECK, 0, 0);
cpu_flags =
models[temp_model].cpu[temp_cpu_m].cpus[temp_cpu].cpu_flags;
h = wx_getdlgitem(hdlg, WX_ID("IDC_CHECKDYNAREC"));
if (!(cpu_flags & CPU_SUPPORTS_DYNAREC) || (cpu_flags & CPU_REQUIRES_DYNAREC))
wx_enablewindow(h, FALSE);
else
wx_enablewindow(h, TRUE);
wx_sendmessage(h, WX_BM_SETCHECK,
((cpu_flags & CPU_SUPPORTS_DYNAREC) && temp_dynarec)
|| (cpu_flags & CPU_REQUIRES_DYNAREC), 0);
h = wx_getdlgitem(hdlg, WX_ID("IDC_TEXT_MB"));
if ((models[temp_model].flags & MODEL_AT) && models[temp_model].ram_granularity < 128)
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM) "MB");
else
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM) "KB");
h = wx_getdlgitem(hdlg, WX_ID("IDC_MEMSPIN"));
mem = wx_sendmessage(h, WX_UDM_GETPOS, 0, 0);
wx_sendmessage(h, WX_UDM_SETRANGE, 0,
(models[temp_model].min_ram << 16)
| models[temp_model].max_ram);
mem &= ~(models[temp_model].ram_granularity - 1);
if (mem < models[temp_model].min_ram)
mem = models[temp_model].min_ram;
else if (mem > models[temp_model].max_ram)
mem = models[temp_model].max_ram;
wx_sendmessage(h, WX_UDM_SETPOS, 0, mem);
wx_sendmessage(h, WX_UDM_SETINCR, 0, models[temp_model].ram_granularity);
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOWS"));
cpu_type =
models[temp_model].cpu[temp_cpu_m].cpus[temp_cpu].cpu_type;
if (cpu_type >= CPU_286 && cpu_type <= CPU_386DX)
wx_enablewindow(h, TRUE);
else
wx_enablewindow(h, FALSE);
h = wx_getdlgitem(hdlg, WX_ID("IDC_CONFIGUREMOD"));
if (model_getdevice(temp_model))
wx_enablewindow(h, TRUE);
else
wx_enablewindow(h, FALSE);
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOMOUSE"));
temp_mouse_type = settings_list_to_mouse[wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0)];
wx_sendmessage(h, WX_CB_RESETCONTENT, 0, 0);
c = d = 0;
while (1)
{
char *s = mouse_get_name(c);
int type;
if (!s)
break;
type = mouse_get_type(c);
settings_mouse_to_list[c] = d;
if (mouse_valid(type, temp_model))
{
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM) s);
settings_list_to_mouse[d] = c;
d++;
}
c++;
}
if (mouse_valid(mouse_get_type(temp_mouse_type), temp_model))
wx_sendmessage(h, WX_CB_SETCURSEL, settings_mouse_to_list[temp_mouse_type], 0);
else
wx_sendmessage(h, WX_CB_SETCURSEL, 0, 0);
recalc_vid_list(hdlg, temp_model, force_builtin_video);
recalc_hdd_list(hdlg, temp_model, 1, force_ide);
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBO_CDMODEL"));
temp_cd_model = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBO_CDSPEED"));
temp_cd_speed = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
recalc_cd_list(hdlg, cd_get_speed(temp_cd_speed), cd_get_model(temp_cd_model));
recalc_snd_list(hdlg, temp_model);
#ifdef USE_NETWORKING
recalc_net_list(hdlg, temp_model);
#endif
}
else if (wParam == WX_ID("IDC_COMBOCPUM"))
{
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBO1"));
temp_model = listtomodel[wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0)];
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOCPUM"));
temp_cpu_m = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
/*Rebuild CPU list*/
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBO3"));
temp_cpu = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
wx_sendmessage(h, WX_CB_RESETCONTENT, 0, 0);
c = 0;
while (models[temp_model].cpu[temp_cpu_m].cpus[c].cpu_type != -1)
{
wx_sendmessage(h, WX_CB_ADDSTRING, 0,
(LONG_PARAM) models[temp_model].cpu[temp_cpu_m].cpus[c].name);
c++;
}
if (temp_cpu >= c)
temp_cpu = c - 1;
wx_sendmessage(h, WX_CB_SETCURSEL, temp_cpu, 0);
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOFPU"));
temp_fpu = fpu_get_type_from_index(temp_model, temp_cpu_m, temp_cpu, wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0));
recalc_fpu_list(hdlg, temp_model, temp_cpu_m, temp_cpu, temp_fpu);
h = wx_getdlgitem(hdlg, WX_ID("IDC_CHECKDYNAREC"));
temp_dynarec = wx_sendmessage(h, WX_BM_GETCHECK, 0, 0);
cpu_flags =
models[temp_model].cpu[temp_cpu_m].cpus[temp_cpu].cpu_flags;
h = wx_getdlgitem(hdlg, WX_ID("IDC_CHECKDYNAREC"));
if (!(cpu_flags & CPU_SUPPORTS_DYNAREC) || (cpu_flags & CPU_REQUIRES_DYNAREC))
wx_enablewindow(h, FALSE);
else
wx_enablewindow(h, TRUE);
wx_sendmessage(h, WX_BM_SETCHECK,
((cpu_flags & CPU_SUPPORTS_DYNAREC) && temp_dynarec)
|| (cpu_flags & CPU_REQUIRES_DYNAREC), 0);
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOWS"));
cpu_type =
models[temp_model].cpu[temp_cpu_m].cpus[temp_cpu].cpu_type;
if (cpu_type >= CPU_286 && cpu_type <= CPU_386DX)
wx_enablewindow(h, TRUE);
else
wx_enablewindow(h, FALSE);
}
else if (wParam == WX_ID("IDC_COMBO3"))
{
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBO1"));
temp_model = listtomodel[wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0)];
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOCPUM"));
temp_cpu_m = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBO3"));
temp_cpu = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOFPU"));
temp_fpu = fpu_get_type_from_index(temp_model, temp_cpu_m, temp_cpu, wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0));
recalc_fpu_list(hdlg, temp_model, temp_cpu_m, temp_cpu, temp_fpu);
h = wx_getdlgitem(hdlg, WX_ID("IDC_CHECKDYNAREC"));
temp_dynarec = wx_sendmessage(h, WX_BM_GETCHECK, 0, 0);
cpu_flags =
models[temp_model].cpu[temp_cpu_m].cpus[temp_cpu].cpu_flags;
h = wx_getdlgitem(hdlg, WX_ID("IDC_CHECKDYNAREC"));
if (!(cpu_flags & CPU_SUPPORTS_DYNAREC) || (cpu_flags & CPU_REQUIRES_DYNAREC))
wx_enablewindow(h, FALSE);
else
wx_enablewindow(h, TRUE);
wx_sendmessage(h, WX_BM_SETCHECK,
((cpu_flags & CPU_SUPPORTS_DYNAREC) && temp_dynarec)
|| (cpu_flags & CPU_REQUIRES_DYNAREC), 0);
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOWS"));
cpu_type =
models[temp_model].cpu[temp_cpu_m].cpus[temp_cpu].cpu_type;
if (cpu_type >= CPU_286 && cpu_type <= CPU_386DX)
wx_enablewindow(h, TRUE);
else
wx_enablewindow(h, FALSE);
}
else if (wParam == WX_ID("IDC_CONFIGUREMOD"))
{
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBO1"));
temp_model = listtomodel[wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0)];
deviceconfig_open(hdlg, (void *) model_getdevice(temp_model));
}
else if (wParam == WX_ID("IDC_CONFIGUREVID"))
{
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOVID"));
wx_sendmessage(h, WX_CB_GETLBTEXT, wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0), (LONG_PARAM) temp_str);
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBO1"));
temp_model = listtomodel[wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0)];
deviceconfig_open(hdlg, (void *)video_card_getdevice(video_card_getid(temp_str), model_getromset_from_model(temp_model)));
}
else if (wParam == WX_ID("IDC_COMBOVID"))
{
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBO1"));
temp_model = listtomodel[wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0)];
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOVID"));
wx_sendmessage(h, WX_CB_GETLBTEXT, wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0),
(LONG_PARAM) temp_str);
gfx = video_card_getid(temp_str);
h = wx_getdlgitem(hdlg, WX_ID("IDC_CONFIGUREVID"));
if (video_card_has_config(gfx, model_getromset_from_model(temp_model)))
wx_enablewindow(h, TRUE);
else
wx_enablewindow(h, FALSE);
}
else if (wParam == WX_ID("IDC_CONFIGURESND"))
{
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOSND"));
temp_sound_card_current = settings_list_to_sound[wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0)];
deviceconfig_open(hdlg, (void *) sound_card_getdevice(temp_sound_card_current));
}
else if (wParam == WX_ID("IDC_COMBOSND"))
{
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOSND"));
temp_sound_card_current = settings_list_to_sound[wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0)];
h = wx_getdlgitem(hdlg, WX_ID("IDC_CONFIGURESND"));
if (sound_card_has_config(temp_sound_card_current))
wx_enablewindow(h, TRUE);
else
wx_enablewindow(h, FALSE);
}
else if (wParam == WX_ID("IDC_CONFIGUREVOODOO"))
{
deviceconfig_open(hdlg, (void *) &voodoo_device);
}
else if (wParam == WX_ID("IDC_COMBOHDD"))
{
hdconf_update(hdlg);
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBO1"));
temp_model = listtomodel[wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0)];
recalc_hdd_list(hdlg, temp_model, 1, 0);
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBO_CDMODEL"));
temp_cd_model = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBO_CDSPEED"));
temp_cd_speed = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
recalc_cd_list(hdlg, cd_get_speed(temp_cd_speed), cd_get_model(temp_cd_model));
}
else if (wParam == WX_ID("IDC_CONFIGUREHDD"))
{
deviceconfig_open(hdlg, (void *)hdd_controller_selected_get_device(hdlg));
}
else if (wParam == WX_ID("IDC_COMBO_CDMODEL"))
{
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBO_CDMODEL"));
temp_cd_model = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBO_CDSPEED"));
temp_cd_speed = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
recalc_cd_list(hdlg, cd_get_speed(temp_cd_speed), cd_get_model(temp_cd_model));
}
#ifdef USE_NETWORKING
else if (wParam == WX_ID("IDC_COMBO_NETCARD"))
{
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBO_NETCARD"));
temp_network_card = settings_list_to_network[wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0)];
h = wx_getdlgitem(hdlg, WX_ID("IDC_CONFIGURE_NETCARD"));
if (network_card_has_config(temp_network_card))
wx_enablewindow(h, TRUE);
else
wx_enablewindow(h, FALSE);
}
else if (wParam == WX_ID("IDC_CONFIGURE_NETCARD"))
{
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBO_NETCARD"));
temp_network_card = settings_list_to_network[wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0)];
deviceconfig_open(hdlg, (void *)network_card_getdevice(temp_network_card));
}
#endif
else if (wParam == WX_ID("IDC_COMBOJOY"))
{
int temp_joystick_type;
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOJOY"));
temp_joystick_type = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
h = wx_getdlgitem(hdlg, WX_ID("IDC_JOY1"));
wx_enablewindow(h, (joystick_get_max_joysticks(temp_joystick_type) >= 1) ? TRUE : FALSE);
h = wx_getdlgitem(hdlg, WX_ID("IDC_JOY2"));
wx_enablewindow(h, (joystick_get_max_joysticks(temp_joystick_type) >= 2) ? TRUE : FALSE);
h = wx_getdlgitem(hdlg, WX_ID("IDC_JOY3"));
wx_enablewindow(h, (joystick_get_max_joysticks(temp_joystick_type) >= 3) ? TRUE : FALSE);
h = wx_getdlgitem(hdlg, WX_ID("IDC_JOY4"));
wx_enablewindow(h, (joystick_get_max_joysticks(temp_joystick_type) >= 4) ? TRUE : FALSE);
}
else if (wParam == WX_ID("IDC_JOY1"))
{
int temp_joystick_type;
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOJOY"));
temp_joystick_type = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
joystickconfig_open(hdlg, 0, temp_joystick_type);
}
else if (wParam == WX_ID("IDC_JOY2"))
{
int temp_joystick_type;
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOJOY"));
temp_joystick_type = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
joystickconfig_open(hdlg, 1, temp_joystick_type);
}
else if (wParam == WX_ID("IDC_JOY3"))
{
int temp_joystick_type;
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOJOY"));
temp_joystick_type = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
joystickconfig_open(hdlg, 2, temp_joystick_type);
}
else if (wParam == WX_ID("IDC_JOY4"))
{
int temp_joystick_type;
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOJOY"));
temp_joystick_type = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
joystickconfig_open(hdlg, 3, temp_joystick_type);
}
#ifndef __WXGTK__
/*Emulate spinner granularity on systems that don't implement wxSpinCtrl->SetIncrement()*/
else if (wParam == WX_ID("IDC_MEMSPIN"))
{
int mem;
int granularity;
int granularity_mask;
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBO1"));
temp_model = listtomodel[wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0)];
granularity = models[temp_model].ram_granularity;
granularity_mask = granularity - 1;
h = wx_getdlgitem(hdlg, WX_ID("IDC_MEMSPIN"));
mem = wx_sendmessage(h, WX_UDM_GETPOS, 0, 0);
if (mem < memspin_old)
{
/*Assume decrease*/
mem &= ~granularity_mask;
}
else
{
/*Assume increase*/
mem = (mem + granularity_mask) & ~granularity_mask;
}
wx_sendmessage(h, WX_UDM_SETPOS, 0, mem);
memspin_old = mem;
}
#endif
return 0;
}
}
return 0;
}
static struct
{
int cylinders;
int heads;
} hd_types[] =
{
{306, 4}, {615, 4}, {615, 6}, {940, 8},
{940, 6}, {615, 4}, {462, 8}, {733, 5},
{900, 15}, {820, 3}, {855, 5}, {855, 7},
{306, 8}, {733, 7}, {0, 0}, {612, 4},
{977, 5}, {977, 7}, {1024, 7}, {733, 5},
{733, 7}, {733, 5}, {306, 4}, {925, 7},
{925, 9}, {754, 7}, {754, 11}, {699, 7},
{823, 10}, {918, 7}, {1024, 11}, {1024, 15},
{1024, 5}, {612, 2}, {1024, 9}, {1024, 8},
{615, 8}, {987, 3}, {462, 7}, {820, 6},
{977, 5}, {981, 5}, {830, 7}, {830, 10},
{917, 15}, {1224, 15}
};
static int hdd_controller_selected_is_mfm(void* hdlg)
{
void* h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOHDD"));
int c = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
if (hdd_names[c])
return hdd_controller_is_mfm(hdd_names[c]);
return 0;
}
static int hdd_controller_selected_is_ide(void* hdlg)
{
void* h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOHDD"));
int c = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
if (hdd_names[c])
return hdd_controller_is_ide(hdd_names[c]);
return 0;
}
static int hdd_controller_selected_is_scsi(void* hdlg)
{
void* h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOHDD"));
int c = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
if (hdd_names[c])
return hdd_controller_is_scsi(hdd_names[c]);
return 0;
}
static int hdd_controller_selected_has_config(void* hdlg)
{
void* h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOHDD"));
int c = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
if (hdd_names[c])
return hdd_controller_has_config(hdd_names[c]);
return 0;
}
static device_t *hdd_controller_selected_get_device(void *hdlg)
{
void* h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOHDD"));
int c = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
if (hdd_names[c])
return hdd_controller_get_device(hdd_names[c]);
return NULL;
}
static void check_hd_type(void* hdlg, off64_t sz)
{
int c;
hd_new_type = 0;
if (hdd_controller_selected_is_mfm(hdlg))
{
for (c = 0; c < 46; c++)
{
if ((hd_types[c].cylinders * hd_types[c].heads * 17 * 512) == sz)
{
hd_new_spt = 17;
hd_new_hpc = hd_types[c].heads;
hd_new_cyl = hd_types[c].cylinders;
hd_new_type = c+1;
return;
}
}
hd_new_spt = 63;
hd_new_hpc = 16;
hd_new_cyl = ((sz / 512) / 16) / 63;
}
else
{
if ((sz % 17) == 0 && sz <= 142606336)
{
hd_new_spt = 17;
if (sz <= 26738688)
hd_new_hpc = 4;
else if ((sz % 3072) == 0 && sz <= 53477376)
hd_new_hpc = 6;
else
{
for (c=5;c<16;c++)
{
if((sz % (c * 512)) == 0 && sz <= 1024*c*17*512) break;
if (c == 5) c++;
}
hd_new_hpc = c;
}
hd_new_cyl = (int)((sz / 512) / hd_new_hpc) / 17;
}
else
{
hd_new_spt = 63;
hd_new_hpc = 16;
hd_new_cyl = ((sz / 512) / 16) / 63;
}
}
}
static void update_hdd_cdrom(void* hdlg)
{
void* h;
int i, j, b;
char s[25];
int is_mfm = hdd_controller_selected_is_mfm(hdlg);
for (i = 0; i < 7; ++i)
{
b = !is_mfm && ((new_cdrom_channel == i) || (new_zip_channel == i));
pclog("update_hdd_cdrom: i=%i b=%i new_cdrom_channel=%i new_zip_channel=%i\n", i, b, new_cdrom_channel, new_zip_channel);
sprintf(s, "IDC_COMBODRIVETYPE[%d]", i);
h = wx_getdlgitem(hdlg, WX_ID(s));
if (i == new_cdrom_channel)
wx_sendmessage(h, WX_CB_SETCURSEL, 1, 0);
else if (i == new_zip_channel)
wx_sendmessage(h, WX_CB_SETCURSEL, 2, 0);
else
wx_sendmessage(h, WX_CB_SETCURSEL, 0, 0);
sprintf(s, "IDC_EDIT_FN[%d]", i);
wx_enablewindow(wx_getdlgitem(hdlg, WX_ID(s)), !b);
sprintf(s, "IDC_FILE[%d]", i);
wx_enablewindow(wx_getdlgitem(hdlg, WX_ID(s)), !b);
sprintf(s, "IDC_EJECT[%d]", i);
wx_enablewindow(wx_getdlgitem(hdlg, WX_ID(s)), !b);
sprintf(s, "IDC_NEW[%d]", i);
wx_enablewindow(wx_getdlgitem(hdlg, WX_ID(s)), !b);
sprintf(s, "IDC_EDIT_SPT[%d]", i);
wx_enablewindow(wx_getdlgitem(hdlg, WX_ID(s)), !b);
sprintf(s, "IDC_EDIT_HPC[%d]", i);
wx_enablewindow(wx_getdlgitem(hdlg, WX_ID(s)), !b);
sprintf(s, "IDC_EDIT_CYL[%d]", i);
wx_enablewindow(wx_getdlgitem(hdlg, WX_ID(s)), !b);
sprintf(s, "IDC_TEXT_SIZE[%d]", i);
wx_enablewindow(wx_getdlgitem(hdlg, WX_ID(s)), !b);
for (j = 1; j < 6; ++j)
{
sprintf(s, "IDC_HDD_LABEL[%d]", i*10+j);
wx_enablewindow(wx_getdlgitem(hdlg, WX_ID(s)), !b);
}
}
}
static volatile int create_drive_pos;
static int create_drive_raw(void* data)
{
int c;
uint8_t buf[512];
FILE* f = (FILE*)data;
memset(buf, 0, 512);
for (c = 0; c < (hd_new_cyl * hd_new_hpc * hd_new_spt); c++)
{
create_drive_pos = c;
fwrite(buf, 512, 1, f);
}
fclose(f);
return 1;
}
static void vhd_progress_callback(uint32_t current_sector, uint32_t total_sectors)
{
create_drive_pos = (int)current_sector;
}
/* If the disk geometry requested in the PCem GUI is not compatible with the internal VHD geometry,
* we adjust it to the next-largest size that is compatible. On average, this will be a difference
* of about 21 MB, and should only be necessary for VHDs larger than 31.5 GB, so should never be more
* than a tenth of a percent change in size.
*/
static void adjust_pcem_geometry_for_vhd(MVHDGeom *vhd_geometry)
{
if (hd_new_cyl <= 65535)
return;
int desired_sectors = hd_new_cyl * hd_new_hpc * hd_new_spt;
if (desired_sectors > 267321600)
desired_sectors = 267321600;
int remainder = desired_sectors % 85680; /* 8560 is the LCM of 1008 (63*16) and 4080 (255*16) */
if (remainder > 0)
desired_sectors += (85680 - remainder);
hd_new_cyl = desired_sectors / (16 * 63);
hd_new_hpc = 16;
hd_new_spt = 63;
vhd_geometry->cyl = desired_sectors / (16 * 255);
vhd_geometry->heads = 16;
vhd_geometry->spt = 255;
}
static void adjust_vhd_geometry_for_pcem()
{
if (hd_new_spt <= 63)
return;
int desired_sectors = hd_new_cyl * hd_new_hpc * hd_new_spt;
if (desired_sectors > 267321600)
desired_sectors = 267321600;
int remainder = desired_sectors % 85680; /* 8560 is the LCM of 1008 (63*16) and 4080 (255*16) */
if (remainder > 0)
desired_sectors -= remainder;
hd_new_cyl = desired_sectors / (16 * 63);
hd_new_hpc = 16;
hd_new_spt = 63;
}
static int create_drive_vhd_fixed(void *data)
{
MVHDGeom geometry = { .cyl = hd_new_cyl, .heads = hd_new_hpc, .spt = hd_new_spt };
adjust_pcem_geometry_for_vhd(&geometry);
int vhd_error = 0;
MVHDMeta *vhd = mvhd_create_fixed(hd_new_name, geometry, &vhd_error, vhd_progress_callback);
if (vhd == NULL)
{
return 0;
}
else
{
mvhd_close(vhd);
return 1;
}
}
static int create_drive_vhd_dynamic(int blocksize)
{
MVHDGeom geometry = { .cyl = hd_new_cyl, .heads = hd_new_hpc, .spt = hd_new_spt };
adjust_pcem_geometry_for_vhd(&geometry);
int vhd_error = 0;
MVHDCreationOptions options;
options.block_size_in_sectors = blocksize;
options.path = hd_new_name;
options.size_in_bytes = 0;
options.geometry = geometry;
options.type = MVHD_TYPE_DYNAMIC;
MVHDMeta *vhd = mvhd_create_ex(options, &vhd_error);
if (vhd == NULL)
{
return 0;
}
else
{
mvhd_close(vhd);
return 1;
}
}
static int create_drive_vhd_diff(char* parent_filename, int blocksize)
{
int vhd_error = 0;
MVHDCreationOptions options;
options.block_size_in_sectors = blocksize;
options.path = hd_new_name;
options.parent_path = parent_filename;
options.type = MVHD_TYPE_DIFF;
MVHDMeta *vhd = mvhd_create_ex(options, &vhd_error);
if (vhd == NULL)
{
return 0;
}
else
{
MVHDGeom vhd_geom = mvhd_get_geometry(vhd);
if (vhd_geom.spt > 63)
{
hd_new_cyl = mvhd_calc_size_sectors(&vhd_geom) / (16 * 63);
hd_new_hpc = 16;
hd_new_spt = 63;
}
else
{
hd_new_cyl = vhd_geom.cyl;
hd_new_hpc = vhd_geom.heads;
hd_new_spt = vhd_geom.spt;
}
mvhd_close(vhd);
return 1;
}
}
static int hdnew_dlgproc(void* hdlg, int message, INT_PARAM wParam, LONG_PARAM lParam)
{
char s[260];
void* h;
int c;
PcemHDC hd[7];
FILE *f;
int hd_type, hd_format, hd_blocksize;
int size;
switch (message)
{
case WX_INITDIALOG:
h = wx_getdlgitem(hdlg, WX_ID("IDC_EDIT1"));
sprintf(s, "%i", 63);
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM)s);
h = wx_getdlgitem(hdlg, WX_ID("IDC_EDIT2"));
sprintf(s, "%i", 16);
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM)s);
h = wx_getdlgitem(hdlg, WX_ID("IDC_EDIT3"));
sprintf(s, "%i", 511);
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM)s);
h = wx_getdlgitem(hdlg, WX_ID("IDC_EDITC"));
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM)"");
h = wx_getdlgitem(hdlg, WX_ID("IDC_EDIT4"));
sprintf(s, "%i", (((511*16*63)*512)/1024)/1024);
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM)s);
// hd_type = 0;
h = wx_getdlgitem(hdlg, WX_ID("IDC_HDTYPE"));
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM)"Custom type");
for (c = 1; c <= 46; c++)
{
sprintf(s, "Type %02i : cylinders=%i, heads=%i, size=%iMB", c, hd_types[c-1].cylinders, hd_types[c-1].heads, (hd_types[c-1].cylinders * hd_types[c-1].heads * 17 * 512) / (1024 * 1024));
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM)s);
}
wx_sendmessage(h, WX_CB_SETCURSEL, 0, 0);
h = wx_getdlgitem(hdlg, WX_ID("IDC_HDFORMAT"));
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM)"Raw (.img)");
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM)"Fixed-size VHD (.vhd)");
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM)"Dynamic-size VHD (.vhd)");
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM)"Differencing VHD (.vhd)");
wx_sendmessage(h, WX_CB_SETCURSEL, 0, 0);
h = wx_getdlgitem(hdlg, WX_ID("IDC_HDBLOCKSIZE"));
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM)"Large blocks (2 MB)");
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM)"Small blocks (512 KB)");
wx_sendmessage(h, WX_CB_SETCURSEL, 0, 0);
wx_sendmessage(h, WX_WM_SHOW, 0, (LONG_PARAM)0);
h = wx_getdlgitem(hdlg, WX_ID("IDC_HDBLOCKSIZELABEL"));
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM)" ");
return TRUE;
case WX_COMMAND:
if (wParam == wxID_OK) {
h = wx_getdlgitem(hdlg, WX_ID("IDC_EDITC"));
wx_sendmessage(h, WX_WM_GETTEXT, 511, (LONG_PARAM)hd_new_name);
if (!hd_new_name[0])
{
wx_messagebox(hdlg,"Please enter a valid filename","PCem error",WX_MB_OK);
return TRUE;
}
h = wx_getdlgitem(hdlg, WX_ID("IDC_EDIT1"));
wx_sendmessage(h, WX_WM_GETTEXT, 255, (LONG_PARAM)s);
sscanf(s, "%i", &hd_new_spt);
h = wx_getdlgitem(hdlg, WX_ID("IDC_EDIT2"));
wx_sendmessage(h, WX_WM_GETTEXT, 255, (LONG_PARAM)s);
sscanf(s, "%i", &hd_new_hpc);
h = wx_getdlgitem(hdlg, WX_ID("IDC_EDIT3"));
wx_sendmessage(h, WX_WM_GETTEXT, 255, (LONG_PARAM)s);
sscanf(s, "%i", &hd_new_cyl);
if (hd_new_spt > 63)
{
wx_messagebox(hdlg, "Drive has too many sectors (maximum is 63)", "PCem error", WX_MB_OK);
return TRUE;
}
if (hd_new_hpc > 16)
{
wx_messagebox(hdlg, "Drive has too many heads (maximum is 16)", "PCem error", WX_MB_OK);
return TRUE;
}
if (hd_new_cyl > MAX_CYLINDERS)
{
char s[256];
sprintf(s, "Drive has too many cylinders (maximum is %i)", MAX_CYLINDERS);
wx_messagebox(hdlg, s, "PCem error", WX_MB_OK);
return TRUE;
}
h = wx_getdlgitem(hdlg, WX_ID("IDC_HDFORMAT"));
hd_format = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
h = wx_getdlgitem(hdlg, WX_ID("IDC_HDBLOCKSIZE"));
hd_blocksize = (wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0) == 0) ? MVHD_BLOCK_LARGE : MVHD_BLOCK_SMALL;
if (hd_format == 0) /* Raw .img */
{
f = fopen64(hd_new_name, "wb");
if (!f)
{
wx_messagebox(hdlg, "Can't open file for write", "PCem error", WX_MB_OK);
return TRUE;
}
wx_progressdialog(hdlg, "PCem", "Creating drive, please wait...", create_drive_raw, f, hd_new_cyl * hd_new_hpc * hd_new_spt, &create_drive_pos);
}
else if (hd_format == 1) /* Fixed VHD */
{
if (!wx_progressdialog(hdlg, "PCem", "Creating drive, please wait...", create_drive_vhd_fixed, NULL, hd_new_cyl * hd_new_hpc * hd_new_spt, &create_drive_pos))
{
wx_messagebox(hdlg, "Can't create VHD", "PCem error", WX_MB_OK);
return TRUE;
}
}
else if (hd_format == 2) /* Dynamic VHD */
{
if (!create_drive_vhd_dynamic(hd_blocksize))
{
wx_messagebox(hdlg, "Can't create VHD", "PCem error", WX_MB_OK);
return TRUE;
}
}
else if (hd_format == 3) /* Differencing VHD */
{
if (!getfilewithcaption(hdlg, "VHD file (*.vhd)|*.vhd|All files (*.*)|*.*", "", "Select the parent VHD"))
{
if (!create_drive_vhd_diff(openfilestring, hd_blocksize))
{
wx_messagebox(hdlg, "Can't create VHD", "PCem error", WX_MB_OK);
return TRUE;
}
}
}
wx_messagebox(hdlg, "Drive created, remember to partition and format the new drive.", "PCem", WX_MB_OK);
wx_enddialog(hdlg, 1);
return TRUE;
} else if (wParam == wxID_CANCEL) {
wx_enddialog(hdlg, 0);
return TRUE;
} else if (ID_IS("IDC_CFILE")) {
h = wx_getdlgitem(hdlg, WX_ID("IDC_HDFORMAT"));
hd_format = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
if (!getsfile(hdlg,
hd_format == 0 ? "Raw Hard disc image (*.img)|*.img|All files (*.*)|*.*" : "VHD file (*.vhd)|*.vhd|All files (*.*)|*.*",
"",
NULL,
hd_format == 0 ? "img" : "vhd"))
{
h = wx_getdlgitem(hdlg, WX_ID("IDC_EDITC"));
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM) openfilestring);
}
return TRUE;
} else if (ID_IS("IDC_EDIT1") || ID_IS("IDC_EDIT2") || ID_IS("IDC_EDIT3")) {
h = wx_getdlgitem(hdlg, WX_ID("IDC_EDIT1"));
wx_sendmessage(h, WX_WM_GETTEXT, 255, (LONG_PARAM)s);
pclog("EDIT1: %s\n", s);
sscanf(s, "%i", &hd[0].spt);
h = wx_getdlgitem(hdlg, WX_ID("IDC_EDIT2"));
wx_sendmessage(h, WX_WM_GETTEXT, 255, (LONG_PARAM)s);
pclog("EDIT2: %s\n", s);
sscanf(s, "%i", &hd[0].hpc);
h = wx_getdlgitem(hdlg, WX_ID("IDC_EDIT3"));
wx_sendmessage(h, WX_WM_GETTEXT, 255, (LONG_PARAM)s);
pclog("EDIT3: %s\n", s);
sscanf(s, "%i", &hd[0].tracks);
h = wx_getdlgitem(hdlg, WX_ID("IDC_EDIT4"));
sprintf(s, "%i", (int)(((((uint64_t)hd[0].tracks*(uint64_t)hd[0].hpc)*(uint64_t)hd[0].spt)*512)/1024)/1024);
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM)s);
hd_type = 0;
for (c = 1; c <= 46; c++)
{
pclog("Compare %i,%i %i,%i %i,%i\n", hd[0].spt,17, hd[0].hpc,hd_types[c-1].heads, hd[0].tracks,hd_types[c-1].cylinders);
if (hd[0].spt == 17 && hd[0].hpc == hd_types[c-1].heads && hd[0].tracks == hd_types[c-1].cylinders)
{
hd_type = c;
break;
}
}
h = wx_getdlgitem(hdlg, WX_ID("IDC_HDTYPE"));
wx_sendmessage(h, WX_CB_SETCURSEL, hd_type, 0);
return TRUE;
}
else if (ID_IS("IDC_EDIT4"))
{
h = wx_getdlgitem(hdlg, WX_ID("IDC_EDIT4"));
wx_sendmessage(h, WX_WM_GETTEXT, 255, (LONG_PARAM)s);
pclog("EDIT4: %s\n", s);
sscanf(s, "%i", &size);
hd[0].spt = 63;
hd[0].hpc = 16;
hd[0].tracks = (int)(((int64_t)size * 1024 * 1024) / (16 * 63 * 512));
h = wx_getdlgitem(hdlg, WX_ID("IDC_EDIT1"));
sprintf(s, "%i", 63);
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM)s);
h = wx_getdlgitem(hdlg, WX_ID("IDC_EDIT2"));
sprintf(s, "%i", 16);
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM)s);
h = wx_getdlgitem(hdlg, WX_ID("IDC_EDIT3"));
sprintf(s, "%i", hd[0].tracks);
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM)s);
}
else if (ID_IS("IDC_HDTYPE")) {
h = wx_getdlgitem(hdlg, WX_ID("IDC_HDTYPE"));
hd_type = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
if (hd_type)
{
h = wx_getdlgitem(hdlg, WX_ID("IDC_EDIT3"));
sprintf(s, "%i", hd_types[hd_type-1].cylinders);
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM)s);
h = wx_getdlgitem(hdlg, WX_ID("IDC_EDIT2"));
sprintf(s, "%i", hd_types[hd_type-1].heads);
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM)s);
h = wx_getdlgitem(hdlg, WX_ID("IDC_EDIT1"));
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM)"17");
h = wx_getdlgitem(hdlg, WX_ID("IDC_EDIT4"));
sprintf(s, "%i", (int)(((uint64_t)hd_types[hd_type-1].cylinders*hd_types[hd_type-1].heads*17*512)/1024)/1024);
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM)s);
}
return TRUE;
}
else if (ID_IS("IDC_HDFORMAT")) {
h = wx_getdlgitem(hdlg, WX_ID("IDC_HDFORMAT"));
hd_format = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
if (hd_format == 3) /* They switched to a dynamic VHD; disable the geometry fields. */
{
h = wx_getdlgitem(hdlg, WX_ID("IDC_EDIT1"));
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM)"(use parent)");
wx_sendmessage(h, WX_WM_ENABLE, 0, (LONG_PARAM)0);
h = wx_getdlgitem(hdlg, WX_ID("IDC_EDIT2"));
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM)"(use parent)");
wx_sendmessage(h, WX_WM_ENABLE, 0, (LONG_PARAM)0);
h = wx_getdlgitem(hdlg, WX_ID("IDC_EDIT3"));
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM)"(use parent)");
wx_sendmessage(h, WX_WM_ENABLE, 0, (LONG_PARAM)0);
h = wx_getdlgitem(hdlg, WX_ID("IDC_EDIT4"));
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM)"(use parent)");
wx_sendmessage(h, WX_WM_ENABLE, 0, (LONG_PARAM)0);
h = wx_getdlgitem(hdlg, WX_ID("IDC_HDTYPE"));
wx_sendmessage(h, WX_CB_SETCURSEL, 0, 0);
wx_sendmessage(h, WX_WM_ENABLE, 0, (LONG_PARAM)0);
}
else /* Restore geometry fields if necessary. */
{
h = wx_getdlgitem(hdlg, WX_ID("IDC_EDIT1"));
wx_sendmessage(h, WX_WM_GETTEXT, 0, (LONG_PARAM)s);
if (!strncmp(s, "(use parent)", 12))
{
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM)"63");
wx_sendmessage(h, WX_WM_ENABLE, 0, (LONG_PARAM)1);
h = wx_getdlgitem(hdlg, WX_ID("IDC_EDIT2"));
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM)"16");
wx_sendmessage(h, WX_WM_ENABLE, 0, (LONG_PARAM)1);
h = wx_getdlgitem(hdlg, WX_ID("IDC_EDIT3"));
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM)"511");
wx_sendmessage(h, WX_WM_ENABLE, 0, (LONG_PARAM)1);
h = wx_getdlgitem(hdlg, WX_ID("IDC_EDIT4"));
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM)"251");
wx_sendmessage(h, WX_WM_ENABLE, 0, (LONG_PARAM)1);
h = wx_getdlgitem(hdlg, WX_ID("IDC_HDTYPE"));
wx_sendmessage(h, WX_WM_ENABLE, 0, (LONG_PARAM)1);
}
}
if (hd_format == 2 || hd_format == 3) /* For dynamic and diff VHDs, show the block size dropdown. */
{
h = wx_getdlgitem(hdlg, WX_ID("IDC_HDBLOCKSIZELABEL"));
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM)"Block size:");
h = wx_getdlgitem(hdlg, WX_ID("IDC_HDBLOCKSIZE"));
wx_sendmessage(h, WX_WM_SHOW, 0, (LONG_PARAM)1);
}
else /* Hide it otherwise. */
{
h = wx_getdlgitem(hdlg, WX_ID("IDC_HDBLOCKSIZELABEL"));
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM)" ");
h = wx_getdlgitem(hdlg, WX_ID("IDC_HDBLOCKSIZE"));
wx_sendmessage(h, WX_WM_SHOW, 0, (LONG_PARAM)0);
}
return TRUE;
}
break;
}
return FALSE;
}
static int hdsize_dlgproc(void* hdlg, int message, INT_PARAM wParam, LONG_PARAM lParam)
{
char s[260];
void* h;
PcemHDC hd[2];
int c;
switch (message)
{
case WX_INITDIALOG:
h = wx_getdlgitem(hdlg, WX_ID("IDC_HDTYPE"));
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM)"Custom type");
for (c = 1; c <= 46; c++)
{
sprintf(s, "Type %02i : cylinders=%i, heads=%i, size=%iMB", c, hd_types[c-1].cylinders, hd_types[c-1].heads, (hd_types[c-1].cylinders * hd_types[c-1].heads * 17 * 512) / (1024 * 1024));
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM)s);
}
wx_sendmessage(h, WX_CB_SETCURSEL, hd_new_type, 0);
h = wx_getdlgitem(hdlg, WX_ID("IDC_EDIT1"));
sprintf(s, "%i", hd_new_spt);
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM)s);
h = wx_getdlgitem(hdlg, WX_ID("IDC_EDIT2"));
sprintf(s, "%i", hd_new_hpc);
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM)s);
h = wx_getdlgitem(hdlg, WX_ID("IDC_EDIT3"));
sprintf(s, "%i", hd_new_cyl);
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM)s);
h = wx_getdlgitem(hdlg, WX_ID("IDC_TEXT1"));
sprintf(s, "%imb", (int)((((uint64_t)hd_new_spt*(uint64_t)hd_new_hpc*(uint64_t)hd_new_cyl)*512)/1024)/1024);
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM)s);
return TRUE;
case WX_COMMAND:
if (wParam == wxID_OK) {
h = wx_getdlgitem(hdlg, WX_ID("IDC_EDIT1"));
wx_sendmessage(h, WX_WM_GETTEXT, 255, (LONG_PARAM)s);
sscanf(s, "%i", &hd_new_spt);
h = wx_getdlgitem(hdlg, WX_ID("IDC_EDIT2"));
wx_sendmessage(h, WX_WM_GETTEXT, 255, (LONG_PARAM)s);
sscanf(s, "%i", &hd_new_hpc);
h = wx_getdlgitem(hdlg, WX_ID("IDC_EDIT3"));
wx_sendmessage(h, WX_WM_GETTEXT, 255, (LONG_PARAM)s);
sscanf(s, "%i", &hd_new_cyl);
if (hd_new_spt > 63)
{
wx_messagebox(hdlg,"Drive has too many sectors (maximum is 63)","PCem error",WX_MB_OK);
return TRUE;
}
if (hd_new_hpc > 16)
{
wx_messagebox(hdlg,"Drive has too many heads (maximum is 16)","PCem error",WX_MB_OK);
return TRUE;
}
if (hd_new_cyl > MAX_CYLINDERS)
{
char s[256];
sprintf(s, "Drive has too many cylinders (maximum is %i)", MAX_CYLINDERS);
wx_messagebox(hdlg,s,"PCem error",WX_MB_OK);
return TRUE;
}
wx_enddialog(hdlg,1);
return TRUE;
} else if (wParam == wxID_CANCEL) {
wx_enddialog(hdlg,0);
return TRUE;
} else if (ID_IS("IDC_EDIT1") || ID_IS("IDC_EDIT2") || ID_IS("IDC_EDIT3")) {
h = wx_getdlgitem(hdlg, WX_ID("IDC_EDIT1"));
wx_sendmessage(h, WX_WM_GETTEXT, 255, (LONG_PARAM)s);
sscanf(s, "%i", &hd[0].spt);
h = wx_getdlgitem(hdlg, WX_ID("IDC_EDIT2"));
wx_sendmessage(h, WX_WM_GETTEXT, 255, (LONG_PARAM)s);
sscanf(s, "%i", &hd[0].hpc);
h = wx_getdlgitem(hdlg, WX_ID("IDC_EDIT3"));
wx_sendmessage(h, WX_WM_GETTEXT, 255, (LONG_PARAM)s);
sscanf(s, "%i", &hd[0].tracks);
h = wx_getdlgitem(hdlg, WX_ID("IDC_TEXT1"));
sprintf(s, "%imb", (int)(((((uint64_t)hd[0].tracks*(uint64_t)hd[0].hpc)*(uint64_t)hd[0].spt)*512)/1024)/1024);
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM)s);
return TRUE;
}
}
return FALSE;
}
int hdconf_init(void* hdlg)
{
int c;
for (c = 0; c < 7; c++)
{
char s[260];
void *h;
sprintf(s, "IDC_EDIT_SPT[%i]", c);
h = wx_getdlgitem(hdlg, WX_ID(s));
sprintf(s, "%i", hdc[c].spt);
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM)s);
sprintf(s, "IDC_EDIT_HPC[%i]", c);
h = wx_getdlgitem(hdlg, WX_ID(s));
sprintf(s, "%i", hdc[c].hpc);
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM)s);
sprintf(s, "IDC_EDIT_CYL[%i]", c);
h = wx_getdlgitem(hdlg, WX_ID(s));
sprintf(s, "%i", hdc[c].tracks);
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM)s);
sprintf(s, "IDC_EDIT_FN[%i]", c);
h = wx_getdlgitem(hdlg, WX_ID(s));
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM)ide_fn[c]);
sprintf(s, "IDC_TEXT_SIZE[%i]", c);
h = wx_getdlgitem(hdlg, WX_ID(s));
sprintf(s, "%imb", (int)(((((uint64_t)hdc[c].tracks*(uint64_t)hdc[c].hpc)*(uint64_t)hdc[c].spt)*512)/1024)/1024);
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM)s);
}
return hdconf_update(hdlg);
}
int hdconf_update(void* hdlg)
{
char s[260];
void *h;
int is_mfm = hdd_controller_selected_is_mfm(hdlg);
update_hdd_cdrom(hdlg);
int i;
for (i = 0; i < 7; ++i)
{
sprintf(s, "IDC_HDD_LABEL[%d]", i*10);
wx_enablewindow(wx_getdlgitem(hdlg, WX_ID(s)), !is_mfm);
sprintf(s, "IDC_COMBODRIVETYPE[%d]", i);
h = wx_getdlgitem(hdlg, WX_ID(s));
wx_enablewindow(wx_getdlgitem(hdlg, WX_ID(s)), !is_mfm);
}
h = wx_getdlgitem(hdlg, WX_ID("IDC_CONFIGUREHDD"));
if (hdd_controller_selected_has_config(hdlg))
wx_enablewindow(h, TRUE);
else
wx_enablewindow(h, FALSE);
return TRUE;
}
static int hd_eject(void *hdlg, int drive)
{
char s[80];
ide_fn[drive][0] = 0;
sprintf(s, "IDC_EDIT_SPT[%i]", drive);
wx_setdlgitemtext(hdlg, WX_ID(s), "0");
sprintf(s, "IDC_EDIT_HPC[%i]", drive);
wx_setdlgitemtext(hdlg, WX_ID(s), "0");
sprintf(s, "IDC_EDIT_CYL[%i]", drive);
wx_setdlgitemtext(hdlg, WX_ID(s), "0");
sprintf(s, "IDC_EDIT_FN[%i]", drive);
wx_setdlgitemtext(hdlg, WX_ID(s), "");
hd_changed = 1;
return TRUE;
}
static int hd_new(void *hdlg, int drive)
{
if (wx_dialogbox(hdlg, "HdNewDlg", hdnew_dlgproc) == 1)
{
char s[80];
char id[80];
void *h;
sprintf(id, "IDC_EDIT_SPT[%i]", drive);
h = wx_getdlgitem(hdlg, WX_ID(id));
sprintf(s, "%i", hd_new_spt);
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM)s);
sprintf(id, "IDC_EDIT_HPC[%i]", drive);
h = wx_getdlgitem(hdlg, WX_ID(id));
sprintf(s, "%i", hd_new_hpc);
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM)s);
sprintf(id, "IDC_EDIT_CYL[%i]", drive);
h = wx_getdlgitem(hdlg, WX_ID(id));
sprintf(s, "%i", hd_new_cyl);
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM)s);
sprintf(id, "IDC_EDIT_FN[%i]", drive);
h = wx_getdlgitem(hdlg, WX_ID(id));
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM)hd_new_name);
sprintf(id, "IDC_TEXT_SIZE[%i]", drive);
h = wx_getdlgitem(hdlg, WX_ID(id));
sprintf(s, "%imb", (int)(((((uint64_t)hd_new_cyl*(uint64_t)hd_new_hpc)*(uint64_t)hd_new_spt)*512)/1024)/1024);
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM)s);
hd_changed = 1;
}
return TRUE;
}
static int hd_file(void *hdlg, int drive)
{
if (!getfile(hdlg, "Hard disc image (*.img;*.vhd)|*.img;*.vhd|All files (*.*)|*.*", ""))
{
off64_t sz;
FILE *f = fopen64(openfilestring, "rb");
if (!f)
{
wx_messagebox(hdlg,"Can't open file for read","PCem error",WX_MB_OK);
return TRUE;
}
if (mvhd_file_is_vhd(f))
{
fclose(f);
int vhdError = 0;
MVHDMeta *vhd = mvhd_open(openfilestring, false, &vhdError);
if (vhd == NULL)
{
wx_messagebox(hdlg,mvhd_strerr(vhdError),"PCem error",WX_MB_OK);
return TRUE;
}
else if (vhdError == MVHD_ERR_TIMESTAMP)
{
const char ts_warning[] =
"WARNING: VHD PARENT/CHILD TIMESTAMPS DO NOT MATCH!\n\n"
"This could indicate that the parent image was modified after this VHD was created.\n\n"
"This could also happen if the VHD files were moved/copied, or the differencing VHD was created with DiskPart.\n\n"
"Do you wish to fix this error after a file copy or DiskPart creation?";
int wx_res = wx_messagebox(hdlg,ts_warning,"PCem error", WX_MB_NODEFAULT);
if (wx_res == WX_MB_YES)
{
int ts_res = mvhd_diff_update_par_timestamp(vhd, &vhdError);
if (ts_res != 0)
{
wx_messagebox(hdlg,"Can't fix VHD timestamps","PCem error",WX_MB_OK);
mvhd_close(vhd);
return TRUE;
}
}
else
{
mvhd_close(vhd);
return TRUE;
}
}
MVHDGeom geom = mvhd_get_geometry(vhd);
hd_new_cyl = geom.cyl;
hd_new_hpc = geom.heads;
hd_new_spt = geom.spt;
hd_new_type = 0;
adjust_vhd_geometry_for_pcem();
mvhd_close(vhd);
}
else
{
fseeko64(f, -1, SEEK_END);
sz = ftello64(f) + 1;
fclose(f);
check_hd_type(hdlg, sz);
}
if (wx_dialogbox(hdlg, "HdSizeDlg", hdsize_dlgproc) == 1)
{
char s[80];
char id[80];
void *h;
sprintf(id, "IDC_EDIT_SPT[%i]", drive);
h = wx_getdlgitem(hdlg, WX_ID(id));
sprintf(s, "%i", hd_new_spt);
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM)s);
sprintf(id, "IDC_EDIT_HPC[%i]", drive);
h = wx_getdlgitem(hdlg, WX_ID(id));
sprintf(s, "%i", hd_new_hpc);
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM)s);
sprintf(id, "IDC_EDIT_CYL[%i]", drive);
h = wx_getdlgitem(hdlg, WX_ID(id));
sprintf(s, "%i", hd_new_cyl);
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM)s);
sprintf(id, "IDC_EDIT_FN[%i]", drive);
h = wx_getdlgitem(hdlg, WX_ID(id));
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM)openfilestring);
sprintf(id, "IDC_TEXT_SIZE[%i]", drive);
h = wx_getdlgitem(hdlg, WX_ID(id));
sprintf(s, "%imb", (int)(((((uint64_t)hd_new_cyl*(uint64_t)hd_new_hpc)*(uint64_t)hd_new_spt)*512)/1024)/1024);
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM)s);
hd_changed = 1;
}
}
return TRUE;
}
static int hd_edit(void *hdlg, int drive)
{
char s[80];
char id[80];
void *h;
int spt, hpc, tracks;
sprintf(id, "IDC_EDIT_SPT[%i]", drive);
h = wx_getdlgitem(hdlg, WX_ID(id));
wx_sendmessage(h, WX_WM_GETTEXT, 255, (LONG_PARAM)s);
sscanf(s, "%i", &spt);
sprintf(id, "IDC_EDIT_HPC[%i]", drive);
h = wx_getdlgitem(hdlg, WX_ID(id));
wx_sendmessage(h, WX_WM_GETTEXT, 255, (LONG_PARAM)s);
sscanf(s, "%i", &hpc);
sprintf(id, "IDC_EDIT_CYL[%i]", drive);
h = wx_getdlgitem(hdlg, WX_ID(id));
wx_sendmessage(h, WX_WM_GETTEXT, 255, (LONG_PARAM)s);
sscanf(s, "%i", &tracks);
sprintf(id, "IDC_TEXT_SIZE[%i]", drive);
h = wx_getdlgitem(hdlg, WX_ID(id));
sprintf(s, "%imb", ((((tracks*hpc)*spt)*512)/1024)/1024);
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM)s);
return TRUE;
}
static int hd_combodrivetype(void *hdlg, int drive)
{
int type;
char id[80];
void *h;
sprintf(id, "IDC_COMBODRIVETYPE[%i]", drive);
h = wx_getdlgitem(hdlg, WX_ID(id));
type = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
switch (type)
{
case 0: /*Hard drive*/
if (new_cdrom_channel == drive)
new_cdrom_channel = -1;
if (new_zip_channel == drive)
new_zip_channel = -1;
break;
case 1: /*CD-ROM*/
new_cdrom_channel = drive;
if (new_zip_channel == drive)
new_zip_channel = -1;
break;
case 2: /*Zip*/
new_zip_channel = drive;
if (new_cdrom_channel == drive)
new_cdrom_channel = -1;
break;
}
update_hdd_cdrom(hdlg);
return TRUE;
}
int hdconf_dlgproc(void* hdlg, int message, INT_PARAM wParam, LONG_PARAM lParam)
{
switch (message)
{
case WX_INITDIALOG:
pause = 1;
return hdconf_init(hdlg);
case WX_COMMAND:
if (ID_IS("IDC_EJECT[0]"))
return hd_eject(hdlg, 0);
else if (ID_IS("IDC_EJECT[1]"))
return hd_eject(hdlg, 1);
else if (ID_IS("IDC_EJECT[2]"))
return hd_eject(hdlg, 2);
else if (ID_IS("IDC_EJECT[3]"))
return hd_eject(hdlg, 3);
else if (ID_IS("IDC_EJECT[4]"))
return hd_eject(hdlg, 4);
else if (ID_IS("IDC_EJECT[5]"))
return hd_eject(hdlg, 5);
else if (ID_IS("IDC_EJECT[6]"))
return hd_eject(hdlg, 6);
else if (ID_IS("IDC_NEW[0]"))
return hd_new(hdlg, 0);
else if (ID_IS("IDC_NEW[1]"))
return hd_new(hdlg, 1);
else if (ID_IS("IDC_NEW[2]"))
return hd_new(hdlg, 2);
else if (ID_IS("IDC_NEW[3]"))
return hd_new(hdlg, 3);
else if (ID_IS("IDC_NEW[4]"))
return hd_new(hdlg, 4);
else if (ID_IS("IDC_NEW[5]"))
return hd_new(hdlg, 5);
else if (ID_IS("IDC_NEW[6]"))
return hd_new(hdlg, 6);
else if (ID_IS("IDC_FILE[0]"))
return hd_file(hdlg, 0);
else if (ID_IS("IDC_FILE[1]"))
return hd_file(hdlg, 1);
else if (ID_IS("IDC_FILE[2]"))
return hd_file(hdlg, 2);
else if (ID_IS("IDC_FILE[3]"))
return hd_file(hdlg, 3);
else if (ID_IS("IDC_FILE[4]"))
return hd_file(hdlg, 4);
else if (ID_IS("IDC_FILE[5]"))
return hd_file(hdlg, 5);
else if (ID_IS("IDC_FILE[6]"))
return hd_file(hdlg, 6);
else if (ID_IS("IDC_EDIT_SPT[0]") || ID_IS("IDC_EDIT_HPC[0]") || ID_IS("IDC_EDIT_CYL[0]"))
return hd_edit(hdlg, 0);
else if (ID_IS("IDC_EDIT_SPT[1]") || ID_IS("IDC_EDIT_HPC[1]") || ID_IS("IDC_EDIT_CYL[1]"))
return hd_edit(hdlg, 1);
else if (ID_IS("IDC_EDIT_SPT[2]") || ID_IS("IDC_EDIT_HPC[2]") || ID_IS("IDC_EDIT_CYL[2]"))
return hd_edit(hdlg, 2);
else if (ID_IS("IDC_EDIT_SPT[3]") || ID_IS("IDC_EDIT_HPC[3]") || ID_IS("IDC_EDIT_CYL[3]"))
return hd_edit(hdlg, 3);
else if (ID_IS("IDC_EDIT_SPT[4]") || ID_IS("IDC_EDIT_HPC[4]") || ID_IS("IDC_EDIT_CYL[4]"))
return hd_edit(hdlg, 4);
else if (ID_IS("IDC_EDIT_SPT[5]") || ID_IS("IDC_EDIT_HPC[5]") || ID_IS("IDC_EDIT_CYL[5]"))
return hd_edit(hdlg, 5);
else if (ID_IS("IDC_EDIT_SPT[6]") || ID_IS("IDC_EDIT_HPC[6]") || ID_IS("IDC_EDIT_CYL[6]"))
return hd_edit(hdlg, 6);
else if (ID_IS("IDC_COMBODRIVETYPE[0]"))
return hd_combodrivetype(hdlg, 0);
else if (ID_IS("IDC_COMBODRIVETYPE[1]"))
return hd_combodrivetype(hdlg, 1);
else if (ID_IS("IDC_COMBODRIVETYPE[2]"))
return hd_combodrivetype(hdlg, 2);
else if (ID_IS("IDC_COMBODRIVETYPE[3]"))
return hd_combodrivetype(hdlg, 3);
else if (ID_IS("IDC_COMBODRIVETYPE[4]"))
return hd_combodrivetype(hdlg, 4);
else if (ID_IS("IDC_COMBODRIVETYPE[5]"))
return hd_combodrivetype(hdlg, 5);
else if (ID_IS("IDC_COMBODRIVETYPE[6]"))
return hd_combodrivetype(hdlg, 6);
}
return FALSE;
}
int config_dialog_proc(void* hdlg, int message, INT_PARAM wParam, LONG_PARAM lParam)
{
switch (message)
{
case WX_INITDIALOG:
pause = 1;
return config_dlgproc(hdlg, message, wParam, lParam);
case WX_COMMAND:
{
if (wParam == wxID_OK)
{
config_dlgsave(hdlg);
pause = 0;
wx_enddialog(hdlg, 1);
return TRUE;
}
else if (wParam == wxID_CANCEL)
{
pause = 0;
wx_enddialog(hdlg, 0);
return TRUE;
}
else if (wParam == WX_ID("IDC_NOTEBOOK"))
{
if (lParam == 3)
hdconf_update(hdlg);
}
break;
}
}
config_dlgproc(hdlg, message, wParam, lParam);
hdconf_dlgproc(hdlg, message, wParam, lParam);
return TRUE;
}
int config_open(void* hwnd)
{
return wx_dialogbox(hwnd, "ConfigureDlg", config_dialog_proc);
}