- devices 'e1000' and 'es1370': moved config parameter creation and bochsrc
option parsing to the plugin device code - TODO: some more optional device plugins could be modified this way
This commit is contained in:
parent
8b4a2c2034
commit
046b74d94c
@ -1,6 +1,17 @@
|
|||||||
# You may now use double quotes around pathnames, in case
|
# You may now use double quotes around pathnames, in case
|
||||||
# your pathname includes spaces.
|
# your pathname includes spaces.
|
||||||
|
|
||||||
|
#=======================================================================
|
||||||
|
# PLUGIN_CTRL:
|
||||||
|
# Controls the presence of optional device plugins. These plugins are loaded
|
||||||
|
# directly with this option and some of them install a config option that is
|
||||||
|
# only available when the plugin device is loaded. The value "1" means to load
|
||||||
|
# the plugin and "0" will unload it (if loaded before).
|
||||||
|
# These plugins are currently supported: 'acpi', 'biosdev', 'e1000', 'es1370',
|
||||||
|
# 'extfpuirq', 'gameport', 'iodebug', 'speaker' and 'unmapped'.
|
||||||
|
#=======================================================================
|
||||||
|
#plugin_ctrl: unmapped=1, biosdev=1, speaker=1, e1000=1
|
||||||
|
|
||||||
#=======================================================================
|
#=======================================================================
|
||||||
# CONFIG_INTERFACE
|
# CONFIG_INTERFACE
|
||||||
#
|
#
|
||||||
@ -706,10 +717,10 @@ parport1: enabled=1, file="parport.out"
|
|||||||
#=======================================================================
|
#=======================================================================
|
||||||
# ES1370:
|
# ES1370:
|
||||||
# This defines the ES1370 sound emulation. The parameter 'enabled' controls the
|
# This defines the ES1370 sound emulation. The parameter 'enabled' controls the
|
||||||
# presence of the device. In addition to this, it must be assigned to a PCI
|
# presence of the device. In addition to this, it must be loaded with 'plugin_ctrl'
|
||||||
# slot. The 'wavedev' parameter is similar to the 'wave' parameter of the SB16
|
# and assigned to a PCI slot. The 'wavedev' parameter is similar to the 'wave'
|
||||||
# soundcard. The emulation supports recording and playback (except DAC1+DAC2
|
# parameter of the SB16 soundcard. The emulation supports recording and playback
|
||||||
# output at the same time).
|
# (except DAC1+DAC2 output at the same time).
|
||||||
#
|
#
|
||||||
# Examples:
|
# Examples:
|
||||||
# es1370: enabled=1, wavedev="" # win32
|
# es1370: enabled=1, wavedev="" # win32
|
||||||
@ -879,7 +890,7 @@ private_colormap: enabled=0
|
|||||||
#
|
#
|
||||||
# The E1000 accepts the same syntax (for mac, ethmod, ethdev, script, bootrom)
|
# The E1000 accepts the same syntax (for mac, ethmod, ethdev, script, bootrom)
|
||||||
# and supports the same networking modules as the NE2000 adapter. In addition
|
# and supports the same networking modules as the NE2000 adapter. In addition
|
||||||
# to this, it must be assigned to a PCI slot.
|
# to this, it must be loaded with 'plugin_ctrl' and assigned to a PCI slot.
|
||||||
#=======================================================================
|
#=======================================================================
|
||||||
#e1000: enabled=1, mac=52:54:00:12:34:56, ethmod=slirp, script=/usr/local/bin/slirp
|
#e1000: enabled=1, mac=52:54:00:12:34:56, ethmod=slirp, script=/usr/local/bin/slirp
|
||||||
|
|
||||||
@ -1062,15 +1073,6 @@ pci: enabled=1, chipset=i440fx
|
|||||||
#=======================================================================
|
#=======================================================================
|
||||||
#gdbstub: enabled=0, port=1234, text_base=0, data_base=0, bss_base=0
|
#gdbstub: enabled=0, port=1234, text_base=0, data_base=0, bss_base=0
|
||||||
|
|
||||||
#=======================================================================
|
|
||||||
# PLUGIN_CTRL:
|
|
||||||
# Controls the presence of optional plugins without a separate option.
|
|
||||||
# By default all existing plugins are enabled. These plugins are currently
|
|
||||||
# supported: 'acpi', 'biosdev', 'extfpuirq', 'gameport', 'iodebug',
|
|
||||||
# 'pci_ide', 'speaker' and 'unmapped'.
|
|
||||||
#=======================================================================
|
|
||||||
#plugin_ctrl: biosdev=0, speaker=0
|
|
||||||
|
|
||||||
#=======================================================================
|
#=======================================================================
|
||||||
# USER_PLUGIN:
|
# USER_PLUGIN:
|
||||||
# Load user-defined plugin. This option is available only if Bochs is
|
# Load user-defined plugin. This option is available only if Bochs is
|
||||||
|
@ -1574,18 +1574,6 @@ void bx_init_options()
|
|||||||
enabled->set_enabled(BX_SUPPORT_PCIPNIC);
|
enabled->set_enabled(BX_SUPPORT_PCIPNIC);
|
||||||
bx_init_std_nic_options("Pseudo NIC", menu);
|
bx_init_std_nic_options("Pseudo NIC", menu);
|
||||||
enabled->set_dependent_list(menu->clone());
|
enabled->set_dependent_list(menu->clone());
|
||||||
// e1000 options
|
|
||||||
menu = new bx_list_c(network, "e1000", "Intel(R) Gigabit Ethernet");
|
|
||||||
menu->set_options(menu->SHOW_PARENT);
|
|
||||||
menu->set_enabled(BX_SUPPORT_E1000);
|
|
||||||
enabled = new bx_param_bool_c(menu,
|
|
||||||
"enabled",
|
|
||||||
"Enable Intel(R) Gigabit Ethernet emulation",
|
|
||||||
"Enables the Intel(R) Gigabit Ethernet emulation",
|
|
||||||
0);
|
|
||||||
enabled->set_enabled(BX_SUPPORT_E1000);
|
|
||||||
bx_init_std_nic_options("Intel(R) Gigabit Ethernet", menu);
|
|
||||||
enabled->set_dependent_list(menu->clone());
|
|
||||||
|
|
||||||
// sound subtree
|
// sound subtree
|
||||||
bx_list_c *sound = new bx_list_c(root_param, "sound", "Sound Configuration");
|
bx_list_c *sound = new bx_list_c(root_param, "sound", "Sound Configuration");
|
||||||
@ -1663,27 +1651,6 @@ void bx_init_options()
|
|||||||
deplist->add(logfile);
|
deplist->add(logfile);
|
||||||
loglevel->set_dependent_list(deplist);
|
loglevel->set_dependent_list(deplist);
|
||||||
|
|
||||||
menu = new bx_list_c(sound, "es1370", "ES1370 Configuration", 8);
|
|
||||||
menu->set_options(menu->SHOW_PARENT);
|
|
||||||
menu->set_enabled(BX_SUPPORT_ES1370);
|
|
||||||
|
|
||||||
// ES1370 options
|
|
||||||
enabled = new bx_param_bool_c(menu,
|
|
||||||
"enabled",
|
|
||||||
"Enable ES1370 emulation",
|
|
||||||
"Enables the ES1370 emulation",
|
|
||||||
0);
|
|
||||||
enabled->set_enabled(BX_SUPPORT_ES1370);
|
|
||||||
|
|
||||||
bx_param_filename_c *wavedev = new bx_param_filename_c(menu,
|
|
||||||
"wavedev",
|
|
||||||
"Wave device",
|
|
||||||
"This is the device where the wave output is sent to",
|
|
||||||
"", BX_PATHNAME_LEN);
|
|
||||||
deplist = new bx_list_c(NULL, 1);
|
|
||||||
deplist->add(wavedev);
|
|
||||||
enabled->set_dependent_list(deplist);
|
|
||||||
|
|
||||||
// misc options subtree
|
// misc options subtree
|
||||||
bx_list_c *misc = new bx_list_c(root_param, "misc", "Configure Everything Else");
|
bx_list_c *misc = new bx_list_c(root_param, "misc", "Configure Everything Else");
|
||||||
misc->set_options(misc->SHOW_PARENT);
|
misc->set_options(misc->SHOW_PARENT);
|
||||||
@ -1837,7 +1804,7 @@ void bx_reset_options()
|
|||||||
// network devices
|
// network devices
|
||||||
SIM->get_param("network")->reset();
|
SIM->get_param("network")->reset();
|
||||||
|
|
||||||
// SB16 & ES1370
|
// sound devices
|
||||||
SIM->get_param("sound")->reset();
|
SIM->get_param("sound")->reset();
|
||||||
|
|
||||||
// misc
|
// misc
|
||||||
@ -3037,17 +3004,6 @@ static int parse_line_formatted(const char *context, int num_params, char *param
|
|||||||
SIM->get_param_bool("enabled", base)->set(1);
|
SIM->get_param_bool("enabled", base)->set(1);
|
||||||
else
|
else
|
||||||
SIM->get_param_bool("enabled", base)->set(0);
|
SIM->get_param_bool("enabled", base)->set(0);
|
||||||
} else if (!strcmp(params[0], "es1370")) {
|
|
||||||
base = (bx_list_c*) SIM->get_param(BXPN_SOUND_ES1370);
|
|
||||||
for (i=1; i<num_params; i++) {
|
|
||||||
if (!strncmp(params[i], "enabled=", 8)) {
|
|
||||||
SIM->get_param_bool("enabled", base)->set(atol(¶ms[i][8]));
|
|
||||||
} else if (!strncmp(params[i], "wavedev=", 8)) {
|
|
||||||
SIM->get_param_string("wavedev", base)->set(¶ms[i][8]);
|
|
||||||
} else {
|
|
||||||
BX_ERROR(("%s: unknown parameter for es1370 ignored.", context));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if ((!strncmp(params[0], "com", 3)) && (strlen(params[0]) == 4)) {
|
} else if ((!strncmp(params[0], "com", 3)) && (strlen(params[0]) == 4)) {
|
||||||
char tmpname[80];
|
char tmpname[80];
|
||||||
idx = params[0][3];
|
idx = params[0][3];
|
||||||
@ -3412,29 +3368,6 @@ static int parse_line_formatted(const char *context, int num_params, char *param
|
|||||||
SIM->get_param_bool("enabled", base)->set(0);
|
SIM->get_param_bool("enabled", base)->set(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (!strcmp(params[0], "e1000")) {
|
|
||||||
int ret, valid = 0;
|
|
||||||
base = (bx_list_c*) SIM->get_param(BXPN_E1000);
|
|
||||||
if (!SIM->get_param_bool("enabled", base)->get()) {
|
|
||||||
SIM->get_param_enum("ethmod", base)->set_by_name("null");
|
|
||||||
}
|
|
||||||
for (i=1; i<num_params; i++) {
|
|
||||||
ret = bx_parse_nic_params(context, params[i], base);
|
|
||||||
if (ret > 0) {
|
|
||||||
valid |= ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!SIM->get_param_bool("enabled", base)->get()) {
|
|
||||||
if (valid == 0x04) {
|
|
||||||
SIM->get_param_bool("enabled", base)->set(1);
|
|
||||||
} else if (valid < 0x80) {
|
|
||||||
PARSE_ERR(("%s: 'e1000' directive incomplete (mac is required)", context));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (valid & 0x80) {
|
|
||||||
SIM->get_param_bool("enabled", base)->set(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (!strcmp(params[0], "load32bitOSImage")) {
|
} else if (!strcmp(params[0], "load32bitOSImage")) {
|
||||||
if ((num_params!=4) && (num_params!=5)) {
|
if ((num_params!=4) && (num_params!=5)) {
|
||||||
PARSE_ERR(("%s: load32bitOSImage directive: wrong # args.", context));
|
PARSE_ERR(("%s: load32bitOSImage directive: wrong # args.", context));
|
||||||
@ -3771,8 +3704,6 @@ int bx_write_sound_options(FILE *fp, bx_list_c *base)
|
|||||||
SIM->get_param_num("loglevel", base)->get(),
|
SIM->get_param_num("loglevel", base)->get(),
|
||||||
SIM->get_param_string("logfile", base)->getptr(),
|
SIM->get_param_string("logfile", base)->getptr(),
|
||||||
SIM->get_param_num("dmatimer", base)->get());
|
SIM->get_param_num("dmatimer", base)->get());
|
||||||
} else if (!strcmp(base->get_name(), "es1370")) {
|
|
||||||
fprintf(fp, ", wavedev=%s", SIM->get_param_string("wavedev", base)->getptr());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fprintf(fp, "\n");
|
fprintf(fp, "\n");
|
||||||
@ -4121,9 +4052,7 @@ int bx_write_configuration(const char *rc, int overwrite)
|
|||||||
bx_write_clock_cmos_options(fp);
|
bx_write_clock_cmos_options(fp);
|
||||||
bx_write_ne2k_options(fp, (bx_list_c*) SIM->get_param(BXPN_NE2K));
|
bx_write_ne2k_options(fp, (bx_list_c*) SIM->get_param(BXPN_NE2K));
|
||||||
bx_write_pci_nic_options(fp, (bx_list_c*) SIM->get_param(BXPN_PNIC));
|
bx_write_pci_nic_options(fp, (bx_list_c*) SIM->get_param(BXPN_PNIC));
|
||||||
bx_write_pci_nic_options(fp, (bx_list_c*) SIM->get_param(BXPN_E1000));
|
|
||||||
bx_write_sound_options(fp, (bx_list_c*) SIM->get_param(BXPN_SOUND_SB16));
|
bx_write_sound_options(fp, (bx_list_c*) SIM->get_param(BXPN_SOUND_SB16));
|
||||||
bx_write_sound_options(fp, (bx_list_c*) SIM->get_param(BXPN_SOUND_ES1370));
|
|
||||||
bx_write_loader_options(fp);
|
bx_write_loader_options(fp);
|
||||||
bx_write_log_options(fp, (bx_list_c*) SIM->get_param("log"));
|
bx_write_log_options(fp, (bx_list_c*) SIM->get_param("log"));
|
||||||
bx_write_keyboard_options(fp);
|
bx_write_keyboard_options(fp);
|
||||||
|
@ -238,11 +238,6 @@ void bx_devices_c::init(BX_MEM_C *newmem)
|
|||||||
if (SIM->get_param_bool(BXPN_PNIC_ENABLED)->get()) {
|
if (SIM->get_param_bool(BXPN_PNIC_ENABLED)->get()) {
|
||||||
PLUG_load_plugin(pcipnic, PLUGTYPE_OPTIONAL);
|
PLUG_load_plugin(pcipnic, PLUGTYPE_OPTIONAL);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
#if BX_SUPPORT_E1000
|
|
||||||
if (SIM->get_param_bool(BXPN_E1000_ENABLED)->get()) {
|
|
||||||
PLUG_load_plugin(e1000, PLUGTYPE_OPTIONAL);
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -264,13 +259,6 @@ void bx_devices_c::init(BX_MEM_C *newmem)
|
|||||||
BX_ERROR(("Bochs is not compiled with SB16 support"));
|
BX_ERROR(("Bochs is not compiled with SB16 support"));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
if (SIM->get_param_bool(BXPN_ES1370_ENABLED)->get()) {
|
|
||||||
#if BX_SUPPORT_ES1370
|
|
||||||
PLUG_load_plugin(es1370, PLUGTYPE_OPTIONAL);
|
|
||||||
#else
|
|
||||||
BX_ERROR(("Bochs is not compiled with ES1370 support"));
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
// CMOS RAM & RTC
|
// CMOS RAM & RTC
|
||||||
pluginCmosDevice->init();
|
pluginCmosDevice->init();
|
||||||
|
@ -277,15 +277,78 @@ static const Bit16u e1000_eeprom_template[64] = {
|
|||||||
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000,
|
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// builtin configuration handling functions
|
||||||
|
|
||||||
|
void e1000_init_options(void)
|
||||||
|
{
|
||||||
|
bx_param_c *network = SIM->get_param("network");
|
||||||
|
bx_list_c *menu = new bx_list_c(network, "e1000", "Intel(R) Gigabit Ethernet");
|
||||||
|
menu->set_options(menu->SHOW_PARENT);
|
||||||
|
bx_param_bool_c *enabled = new bx_param_bool_c(menu,
|
||||||
|
"enabled",
|
||||||
|
"Enable Intel(R) Gigabit Ethernet emulation",
|
||||||
|
"Enables the Intel(R) Gigabit Ethernet emulation",
|
||||||
|
0);
|
||||||
|
bx_init_std_nic_options("Intel(R) Gigabit Ethernet", menu);
|
||||||
|
enabled->set_dependent_list(menu->clone());
|
||||||
|
}
|
||||||
|
|
||||||
|
Bit32s e1000_options_parser(const char *context, int num_params, char *params[])
|
||||||
|
{
|
||||||
|
int ret, valid = 0;
|
||||||
|
|
||||||
|
if (!strcmp(params[0], "e1000")) {
|
||||||
|
bx_list_c *base = (bx_list_c*) SIM->get_param(BXPN_E1000);
|
||||||
|
if (!SIM->get_param_bool("enabled", base)->get()) {
|
||||||
|
SIM->get_param_enum("ethmod", base)->set_by_name("null");
|
||||||
|
}
|
||||||
|
for (int i = 1; i < num_params; i++) {
|
||||||
|
ret = bx_parse_nic_params(context, params[i], base);
|
||||||
|
if (ret > 0) {
|
||||||
|
valid |= ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!SIM->get_param_bool("enabled", base)->get()) {
|
||||||
|
if (valid == 0x04) {
|
||||||
|
SIM->get_param_bool("enabled", base)->set(1);
|
||||||
|
} else if (valid < 0x80) {
|
||||||
|
BX_PANIC(("%s: 'e1000' directive incomplete (mac is required)", context));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (valid & 0x80) {
|
||||||
|
SIM->get_param_bool("enabled", base)->set(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
BX_PANIC(("%s: unknown directive '%s'", context, params[0]));
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
Bit32s e1000_options_save(FILE *fp)
|
||||||
|
{
|
||||||
|
bx_write_pci_nic_options(fp, (bx_list_c*) SIM->get_param(BXPN_E1000));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// device plugin entry points
|
||||||
|
|
||||||
int libe1000_LTX_plugin_init(plugin_t *plugin, plugintype_t type, int argc, char *argv[])
|
int libe1000_LTX_plugin_init(plugin_t *plugin, plugintype_t type, int argc, char *argv[])
|
||||||
{
|
{
|
||||||
theE1000Device = new bx_e1000_c();
|
theE1000Device = new bx_e1000_c();
|
||||||
BX_REGISTER_DEVICE_DEVMODEL(plugin, type, theE1000Device, BX_PLUGIN_E1000);
|
BX_REGISTER_DEVICE_DEVMODEL(plugin, type, theE1000Device, BX_PLUGIN_E1000);
|
||||||
|
// add new configuration parameter for the config interface
|
||||||
|
e1000_init_options();
|
||||||
|
// register add-on option for bochsrc and command line
|
||||||
|
SIM->register_addon_option("e1000", e1000_options_parser, e1000_options_save);
|
||||||
return 0; // Success
|
return 0; // Success
|
||||||
}
|
}
|
||||||
|
|
||||||
void libe1000_LTX_plugin_fini(void)
|
void libe1000_LTX_plugin_fini(void)
|
||||||
{
|
{
|
||||||
|
SIM->unregister_addon_option("e1000");
|
||||||
|
bx_list_c *menu = (bx_list_c*)SIM->get_param("network");
|
||||||
|
menu->remove("e1000");
|
||||||
delete theE1000Device;
|
delete theE1000Device;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -342,6 +405,8 @@ Bit16u net_checksum_finish(Bit32u sum)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// the device object
|
||||||
|
|
||||||
bx_e1000_c::bx_e1000_c()
|
bx_e1000_c::bx_e1000_c()
|
||||||
{
|
{
|
||||||
put("E1000");
|
put("E1000");
|
||||||
@ -366,14 +431,19 @@ bx_e1000_c::~bx_e1000_c()
|
|||||||
|
|
||||||
void bx_e1000_c::init(void)
|
void bx_e1000_c::init(void)
|
||||||
{
|
{
|
||||||
bx_list_c *base;
|
|
||||||
Bit8u macaddr[6];
|
Bit8u macaddr[6];
|
||||||
int i;
|
int i;
|
||||||
Bit16u checksum = 0;
|
Bit16u checksum = 0;
|
||||||
const char *bootrom;
|
const char *bootrom;
|
||||||
|
|
||||||
// Read in values from config interface
|
// Read in values from config interface
|
||||||
base = (bx_list_c*) SIM->get_param(BXPN_E1000);
|
bx_list_c *base = (bx_list_c*) SIM->get_param(BXPN_E1000);
|
||||||
|
// Check if the device is disabled or not configured
|
||||||
|
if (!SIM->get_param_bool("enabled", base)->get()) {
|
||||||
|
BX_INFO(("E1000 disabled"));
|
||||||
|
BX_UNREGISTER_DEVICE_DEVMODEL("e1000");
|
||||||
|
return;
|
||||||
|
}
|
||||||
memcpy(macaddr, SIM->get_param_string("macaddr", base)->getptr(), 6);
|
memcpy(macaddr, SIM->get_param_string("macaddr", base)->getptr(), 6);
|
||||||
|
|
||||||
memcpy(BX_E1000_THIS s.eeprom_data, e1000_eeprom_template,
|
memcpy(BX_E1000_THIS s.eeprom_data, e1000_eeprom_template,
|
||||||
|
@ -86,18 +86,85 @@ const Bit16u ctl_ch_en[3] = {0x0040, 0x0020, 0x0010};
|
|||||||
const Bit16u sctl_ch_pause[3] = {0x0800, 0x1000, 0x0000};
|
const Bit16u sctl_ch_pause[3] = {0x0800, 0x1000, 0x0000};
|
||||||
const Bit16u sctl_loop_sel[3] = {0x2000, 0x4000, 0x8000};
|
const Bit16u sctl_loop_sel[3] = {0x2000, 0x4000, 0x8000};
|
||||||
|
|
||||||
|
// builtin configuration handling functions
|
||||||
|
|
||||||
|
void es1370_init_options(void)
|
||||||
|
{
|
||||||
|
bx_param_c *sound = SIM->get_param("sound");
|
||||||
|
bx_list_c *menu = new bx_list_c(sound, "es1370", "ES1370 Configuration", 8);
|
||||||
|
menu->set_options(menu->SHOW_PARENT);
|
||||||
|
menu->set_enabled(BX_SUPPORT_ES1370);
|
||||||
|
|
||||||
|
bx_param_bool_c *enabled = new bx_param_bool_c(menu,
|
||||||
|
"enabled",
|
||||||
|
"Enable ES1370 emulation",
|
||||||
|
"Enables the ES1370 emulation",
|
||||||
|
0);
|
||||||
|
enabled->set_enabled(BX_SUPPORT_ES1370);
|
||||||
|
|
||||||
|
bx_param_filename_c *wavedev = new bx_param_filename_c(menu,
|
||||||
|
"wavedev",
|
||||||
|
"Wave device",
|
||||||
|
"This is the device where the wave output is sent to",
|
||||||
|
"", BX_PATHNAME_LEN);
|
||||||
|
bx_list_c *deplist = new bx_list_c(NULL, 1);
|
||||||
|
deplist->add(wavedev);
|
||||||
|
enabled->set_dependent_list(deplist);
|
||||||
|
}
|
||||||
|
|
||||||
|
Bit32s es1370_options_parser(const char *context, int num_params, char *params[])
|
||||||
|
{
|
||||||
|
if (!strcmp(params[0], "es1370")) {
|
||||||
|
bx_list_c *base = (bx_list_c*) SIM->get_param(BXPN_SOUND_ES1370);
|
||||||
|
for (int i = 1; i < num_params; i++) {
|
||||||
|
if (!strncmp(params[i], "enabled=", 8)) {
|
||||||
|
SIM->get_param_bool("enabled", base)->set(atol(¶ms[i][8]));
|
||||||
|
} else if (!strncmp(params[i], "wavedev=", 8)) {
|
||||||
|
SIM->get_param_string("wavedev", base)->set(¶ms[i][8]);
|
||||||
|
} else {
|
||||||
|
BX_ERROR(("%s: unknown parameter for es1370 ignored.", context));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
BX_PANIC(("%s: unknown directive '%s'", context, params[0]));
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
Bit32s es1370_options_save(FILE *fp)
|
||||||
|
{
|
||||||
|
bx_list_c *base = (bx_list_c*) SIM->get_param(BXPN_SOUND_ES1370);
|
||||||
|
fprintf(fp, "es1370: enabled=%d", SIM->get_param_bool("enabled", base)->get());
|
||||||
|
if (SIM->get_param_bool("enabled", base)->get()) {
|
||||||
|
fprintf(fp, ", wavedev=%s", SIM->get_param_string("wavedev", base)->getptr());
|
||||||
|
}
|
||||||
|
fprintf(fp, "\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// device plugin entry points
|
||||||
|
|
||||||
int libes1370_LTX_plugin_init(plugin_t *plugin, plugintype_t type, int argc, char *argv[])
|
int libes1370_LTX_plugin_init(plugin_t *plugin, plugintype_t type, int argc, char *argv[])
|
||||||
{
|
{
|
||||||
theES1370Device = new bx_es1370_c();
|
theES1370Device = new bx_es1370_c();
|
||||||
BX_REGISTER_DEVICE_DEVMODEL(plugin, type, theES1370Device, BX_PLUGIN_ES1370);
|
BX_REGISTER_DEVICE_DEVMODEL(plugin, type, theES1370Device, BX_PLUGIN_ES1370);
|
||||||
|
// add new configuration parameter for the config interface
|
||||||
|
es1370_init_options();
|
||||||
|
// register add-on option for bochsrc and command line
|
||||||
|
SIM->register_addon_option("es1370", es1370_options_parser, es1370_options_save);
|
||||||
return 0; // Success
|
return 0; // Success
|
||||||
}
|
}
|
||||||
|
|
||||||
void libes1370_LTX_plugin_fini(void)
|
void libes1370_LTX_plugin_fini(void)
|
||||||
{
|
{
|
||||||
|
SIM->unregister_addon_option("es1370");
|
||||||
|
bx_list_c *menu = (bx_list_c*)SIM->get_param("sound");
|
||||||
|
menu->remove("es1370");
|
||||||
delete theES1370Device;
|
delete theES1370Device;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// the device object
|
||||||
|
|
||||||
bx_es1370_c::bx_es1370_c()
|
bx_es1370_c::bx_es1370_c()
|
||||||
{
|
{
|
||||||
put("E1370");
|
put("E1370");
|
||||||
@ -121,6 +188,14 @@ bx_es1370_c::~bx_es1370_c()
|
|||||||
|
|
||||||
void bx_es1370_c::init(void)
|
void bx_es1370_c::init(void)
|
||||||
{
|
{
|
||||||
|
// Read in values from config interface
|
||||||
|
bx_list_c *base = (bx_list_c*) SIM->get_param(BXPN_SOUND_ES1370);
|
||||||
|
// Check if the device is disabled or not configured
|
||||||
|
if (!SIM->get_param_bool("enabled", base)->get()) {
|
||||||
|
BX_INFO(("ES1370 disabled"));
|
||||||
|
BX_UNREGISTER_DEVICE_DEVMODEL("es1370");
|
||||||
|
return;
|
||||||
|
}
|
||||||
BX_ES1370_THIS s.devfunc = 0x00;
|
BX_ES1370_THIS s.devfunc = 0x00;
|
||||||
DEV_register_pci_handlers(this, &BX_ES1370_THIS s.devfunc, BX_PLUGIN_ES1370,
|
DEV_register_pci_handlers(this, &BX_ES1370_THIS s.devfunc, BX_PLUGIN_ES1370,
|
||||||
"Experimental ES1370 soundcard");
|
"Experimental ES1370 soundcard");
|
||||||
|
@ -836,6 +836,12 @@ static builtin_plugin_t builtin_opt_plugins[] = {
|
|||||||
#endif
|
#endif
|
||||||
#if BX_SUPPORT_APIC
|
#if BX_SUPPORT_APIC
|
||||||
BUILTIN_PLUGIN_ENTRY(ioapic),
|
BUILTIN_PLUGIN_ENTRY(ioapic),
|
||||||
|
#endif
|
||||||
|
#if BX_SUPPORT_E1000
|
||||||
|
BUILTIN_PLUGIN_ENTRY(e1000),
|
||||||
|
#endif
|
||||||
|
#if BX_SUPPORT_ES1370
|
||||||
|
BUILTIN_PLUGIN_ENTRY(es1370),
|
||||||
#endif
|
#endif
|
||||||
{"NULL", NULL, NULL, 0}
|
{"NULL", NULL, NULL, 0}
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user