Made sure the dummy "None"/"Internal" devices never get initialized and fixed some PCI AGP bridge mess (including AGP-less 440BX/ZX/GX erroneously initializing the 440LX/EX AGP bridge), fixes #3696.
This commit is contained in:
@@ -145,9 +145,7 @@ cdrom_interface_reset(void)
|
||||
cdrom_interface_current);
|
||||
|
||||
/* If we have a valid controller, add its device. */
|
||||
if (!controllers[cdrom_interface_current].device)
|
||||
return;
|
||||
|
||||
if ((cdrom_interface_current > 0) && controllers[cdrom_interface_current].device)
|
||||
device_add(controllers[cdrom_interface_current].device);
|
||||
}
|
||||
|
||||
|
||||
@@ -1672,7 +1672,8 @@ i4x0_init(const device_t *info)
|
||||
regs[0x52] = 0xea; /* 512 kB burst cache, set to 0xaa for 256 kB */
|
||||
regs[0x57] = 0x31;
|
||||
regs[0x59] = 0x0f;
|
||||
regs[0x60] = regs[0x61] = regs[0x62] = regs[0x63] = regs[0x64] = regs[0x65] = regs[0x66] = regs[0x67] = 0x02;
|
||||
regs[0x60] = regs[0x61] = regs[0x62] = regs[0x63] =
|
||||
regs[0x64] = regs[0x65] = regs[0x66] = regs[0x67] = 0x02;
|
||||
dev->max_drb = 7;
|
||||
dev->drb_unit = 1;
|
||||
dev->drb_default = 0x02;
|
||||
@@ -1705,7 +1706,8 @@ i4x0_init(const device_t *info)
|
||||
regs[0x57] |= 0x02;
|
||||
else if ((cpu_busspeed > 60000000) && (cpu_busspeed <= 66666667))
|
||||
regs[0x57] |= 0x03;
|
||||
regs[0x60] = regs[0x61] = regs[0x62] = regs[0x63] = regs[0x64] = regs[0x65] = regs[0x66] = regs[0x67] = 0x02;
|
||||
regs[0x60] = regs[0x61] = regs[0x62] = regs[0x63] =
|
||||
regs[0x64] = regs[0x65] = regs[0x66] = regs[0x67] = 0x02;
|
||||
regs[0x72] = 0x02;
|
||||
dev->max_drb = 7;
|
||||
dev->drb_unit = 4;
|
||||
@@ -1764,7 +1766,8 @@ i4x0_init(const device_t *info)
|
||||
regs[0x53] = 0x80;
|
||||
regs[0x57] = 0x01;
|
||||
regs[0x58] = 0x10;
|
||||
regs[0x60] = regs[0x61] = regs[0x62] = regs[0x63] = regs[0x64] = regs[0x65] = regs[0x66] = regs[0x67] = 0x02;
|
||||
regs[0x60] = regs[0x61] = regs[0x62] = regs[0x63] =
|
||||
regs[0x64] = regs[0x65] = regs[0x66] = regs[0x67] = 0x02;
|
||||
regs[0x71] = 0x10;
|
||||
regs[0x72] = 0x02;
|
||||
dev->max_drb = 7;
|
||||
@@ -1784,7 +1787,8 @@ i4x0_init(const device_t *info)
|
||||
regs[0x51] |= 0x00;
|
||||
regs[0x53] = 0x83;
|
||||
regs[0x57] = 0x01;
|
||||
regs[0x60] = regs[0x61] = regs[0x62] = regs[0x63] = regs[0x64] = regs[0x65] = regs[0x66] = regs[0x67] = 0x01;
|
||||
regs[0x60] = regs[0x61] = regs[0x62] = regs[0x63] =
|
||||
regs[0x64] = regs[0x65] = regs[0x66] = regs[0x67] = 0x01;
|
||||
regs[0x6c] = regs[0x6d] = regs[0x6e] = regs[0x6f] = 0x55;
|
||||
regs[0x72] = 0x02;
|
||||
regs[0xa0] = 0x02;
|
||||
@@ -1806,7 +1810,8 @@ i4x0_init(const device_t *info)
|
||||
regs[0x51] = 0x80;
|
||||
regs[0x53] = 0x83;
|
||||
regs[0x57] = 0x01;
|
||||
regs[0x60] = regs[0x61] = regs[0x62] = regs[0x63] = regs[0x64] = regs[0x65] = regs[0x66] = regs[0x67] = 0x01;
|
||||
regs[0x60] = regs[0x61] = regs[0x62] = regs[0x63] =
|
||||
regs[0x64] = regs[0x65] = regs[0x66] = regs[0x67] = 0x01;
|
||||
regs[0x6c] = regs[0x6d] = regs[0x6e] = regs[0x6f] = 0x55;
|
||||
regs[0x72] = 0x02;
|
||||
regs[0xa0] = 0x02;
|
||||
@@ -1834,7 +1839,8 @@ i4x0_init(const device_t *info)
|
||||
regs[0x51] |= 0x00;
|
||||
regs[0x57] = 0x28; /* 4 DIMMs, SDRAM */
|
||||
regs[0x58] = 0x03;
|
||||
regs[0x60] = regs[0x61] = regs[0x62] = regs[0x63] = regs[0x64] = regs[0x65] = regs[0x66] = regs[0x67] = 0x01;
|
||||
regs[0x60] = regs[0x61] = regs[0x62] = regs[0x63] =
|
||||
regs[0x64] = regs[0x65] = regs[0x66] = regs[0x67] = 0x01;
|
||||
regs[0x72] = 0x02;
|
||||
regs[0x73] = 0x38;
|
||||
regs[0x7b] = 0x38;
|
||||
@@ -1857,7 +1863,8 @@ i4x0_init(const device_t *info)
|
||||
regs[0x10] = 0x08;
|
||||
regs[0x34] = (regs[0x7a] & 0x02) ? 0x00 : 0xa0;
|
||||
regs[0x57] = 0x28;
|
||||
regs[0x60] = regs[0x61] = regs[0x62] = regs[0x63] = regs[0x64] = regs[0x65] = regs[0x66] = regs[0x67] = 0x01;
|
||||
regs[0x60] = regs[0x61] = regs[0x62] = regs[0x63] =
|
||||
regs[0x64] = regs[0x65] = regs[0x66] = regs[0x67] = 0x01;
|
||||
regs[0x72] = 0x02;
|
||||
regs[0x73] = 0x38;
|
||||
regs[0x7b] = 0x38;
|
||||
@@ -1918,7 +1925,7 @@ i4x0_init(const device_t *info)
|
||||
if ((dev->type >= INTEL_440BX) && !(regs[0x7a] & 0x02)) {
|
||||
device_add((dev->type == INTEL_440GX) ? &i440gx_agp_device : &i440bx_agp_device);
|
||||
dev->agpgart = device_add(&agpgart_device);
|
||||
} else if (dev->type >= INTEL_440LX) {
|
||||
} else if ((dev->type == INTEL_440LX) || (dev->type == INTEL_440EX)) {
|
||||
device_add(&i440lx_agp_device);
|
||||
dev->agpgart = device_add(&agpgart_device);
|
||||
}
|
||||
@@ -2109,7 +2116,7 @@ const device_t i440bx_device = {
|
||||
};
|
||||
|
||||
const device_t i440bx_no_agp_device = {
|
||||
.name = "Intel 82443BX",
|
||||
.name = "Intel 82443BX (No AGP)",
|
||||
.internal_name = "i440bx_no_agp",
|
||||
.flags = DEVICE_PCI,
|
||||
.local = 0x8200 | INTEL_440BX,
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
* Boston, MA 02111-1307
|
||||
* USA.
|
||||
*/
|
||||
#include <inttypes.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
@@ -158,6 +159,10 @@ device_add_common(const device_t *dev, const device_t *cd, void *p, void *params
|
||||
/* Do this so that a chained device_add will not identify the same ID
|
||||
its master device is already trying to assign. */
|
||||
devices[c] = (device_t *) dev;
|
||||
if (!strcmp(dev->name, "None") || !strcmp(dev->name, "Internal")) {
|
||||
uint32_t *p = NULL;
|
||||
*p = 5; /* Crash deliberately. */
|
||||
}
|
||||
|
||||
if (p == NULL) {
|
||||
memcpy(&device_prev, &device_current, sizeof(device_context_t));
|
||||
@@ -550,6 +555,8 @@ device_speed_changed(void)
|
||||
{
|
||||
for (uint16_t c = 0; c < DEVICE_MAX; c++) {
|
||||
if (devices[c] != NULL) {
|
||||
device_log("DEVICE: device '%s' speed changed\n", devices[c]->name);
|
||||
|
||||
if (devices[c]->speed_changed != NULL)
|
||||
devices[c]->speed_changed(device_priv[c]);
|
||||
}
|
||||
|
||||
@@ -546,8 +546,8 @@ kbd_write(uint16_t port, uint8_t val, void *priv)
|
||||
|
||||
timer_process();
|
||||
|
||||
if (((kbd->type == KBD_TYPE_PC81) || (kbd->type == KBD_TYPE_PC82) || (kbd->type == KBD_TYPE_PRAVETZ)) &&
|
||||
(cassette != NULL))
|
||||
if (((kbd->type == KBD_TYPE_PC81) || (kbd->type == KBD_TYPE_PC82) ||
|
||||
(kbd->type == KBD_TYPE_PRAVETZ)) && (cassette != NULL))
|
||||
pc_cas_set_motor(cassette, (kbd->pb & 0x08) == 0);
|
||||
|
||||
speaker_update();
|
||||
@@ -681,7 +681,8 @@ kbd_read(uint16_t port, void *priv)
|
||||
|
||||
/* This is needed to avoid error 131 (cassette error).
|
||||
This is serial read: bit 5 = clock, bit 4 = data, cassette header is 256 x 0xff. */
|
||||
if ((kbd->type == KBD_TYPE_PC81) || (kbd->type == KBD_TYPE_PC82) || (kbd->type == KBD_TYPE_PRAVETZ)) {
|
||||
if ((kbd->type == KBD_TYPE_PC81) || (kbd->type == KBD_TYPE_PC82) ||
|
||||
(kbd->type == KBD_TYPE_PRAVETZ)) {
|
||||
if (cassette == NULL)
|
||||
ret |= (ppispeakon ? 0x10 : 0);
|
||||
else
|
||||
|
||||
@@ -501,7 +501,9 @@ pci_bridge_init(const device_t *info)
|
||||
for (uint8_t i = 0; i < interrupt_count; i++)
|
||||
interrupts[i] = pci_get_int(dev->slot, PCI_INTA + i);
|
||||
}
|
||||
pci_bridge_log("PCI Bridge %d: upstream bus %02X slot %02X interrupts %02X %02X %02X %02X\n", dev->bus_index, (dev->slot >> 5) & 0xff, dev->slot & 31, interrupts[0], interrupts[1], interrupts[2], interrupts[3]);
|
||||
pci_bridge_log("PCI Bridge %d: upstream bus %02X slot %02X interrupts %02X %02X %02X %02X\n",
|
||||
dev->bus_index, (dev->slot >> 5) & 0xff, dev->slot & 31, interrupts[0],
|
||||
interrupts[1], interrupts[2], interrupts[3]);
|
||||
|
||||
if (info->local == PCI_BRIDGE_DEC_21150)
|
||||
slot_count = 9; /* 9 bus masters */
|
||||
@@ -510,7 +512,10 @@ pci_bridge_init(const device_t *info)
|
||||
|
||||
for (uint8_t i = 0; i < slot_count; i++) {
|
||||
/* Interrupts for bridge slots are assigned in round-robin: ABCD, BCDA, CDAB and so on. */
|
||||
pci_bridge_log("PCI Bridge %d: downstream slot %02X interrupts %02X %02X %02X %02X\n", dev->bus_index, i, interrupts[i & interrupt_mask], interrupts[(i + 1) & interrupt_mask], interrupts[(i + 2) & interrupt_mask], interrupts[(i + 3) & interrupt_mask]);
|
||||
pci_bridge_log("PCI Bridge %d: downstream slot %02X interrupts %02X %02X %02X %02X\n",
|
||||
dev->bus_index, i, interrupts[i & interrupt_mask],
|
||||
interrupts[(i + 1) & interrupt_mask], interrupts[(i + 2) & interrupt_mask],
|
||||
interrupts[(i + 3) & interrupt_mask]);
|
||||
pci_register_bus_slot(dev->bus_index, i, AGP_BRIDGE(dev->local) ? PCI_CARD_AGP : PCI_CARD_NORMAL,
|
||||
interrupts[i & interrupt_mask],
|
||||
interrupts[(i + 1) & interrupt_mask],
|
||||
|
||||
@@ -2917,7 +2917,9 @@ ide_board_init(int board, int irq, int base_main, int side_main, int type)
|
||||
|
||||
ide_log("IDE: Initializing board %i...\n", board);
|
||||
|
||||
if (ide_boards[board] == NULL)
|
||||
ide_boards[board] = (ide_board_t *) malloc(sizeof(ide_board_t));
|
||||
|
||||
memset(ide_boards[board], 0, sizeof(ide_board_t));
|
||||
ide_boards[board]->irq = irq;
|
||||
ide_boards[board]->cur_dev = board << 1;
|
||||
@@ -3072,7 +3074,8 @@ ide_init(const device_t *info)
|
||||
break;
|
||||
}
|
||||
|
||||
return ide_drives;
|
||||
// return ide_drives;
|
||||
return (void *) (intptr_t) -1;
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
@@ -191,9 +191,7 @@ fdc_card_get_from_internal_name(char *s)
|
||||
void
|
||||
fdc_card_init(void)
|
||||
{
|
||||
if (!fdc_cards[fdc_type].device)
|
||||
return;
|
||||
|
||||
if ((fdc_type > 0) && fdc_cards[fdc_type].device)
|
||||
device_add(fdc_cards[fdc_type].device);
|
||||
}
|
||||
|
||||
|
||||
@@ -579,6 +579,7 @@ network_reset(void)
|
||||
}
|
||||
|
||||
net_card_current = i;
|
||||
if (net_cards_conf[i].device_num > NET_INTERNAL)
|
||||
device_add_inst(net_cards[net_cards_conf[i].device_num], i + 1);
|
||||
}
|
||||
}
|
||||
@@ -684,7 +685,8 @@ network_dev_available(int id)
|
||||
{
|
||||
int available = (net_cards_conf[id].device_num > 0);
|
||||
|
||||
if (net_cards_conf[id].net_type == NET_TYPE_PCAP && (network_dev_to_id(net_cards_conf[id].host_dev_name) <= 0))
|
||||
if ((net_cards_conf[id].net_type == NET_TYPE_PCAP) &&
|
||||
(network_dev_to_id(net_cards_conf[id].host_dev_name) <= 0))
|
||||
available = 0;
|
||||
|
||||
// TODO: Handle VDE device
|
||||
|
||||
@@ -817,10 +817,12 @@ pci_add_bridge(uint8_t agp, uint8_t (*read)(int func, int addr, void *priv), voi
|
||||
pci_card_t *card;
|
||||
uint8_t bridge_slot = agp ? pci_find_slot(PCI_ADD_AGPBRIDGE, 0xff) : last_normal_pci_card_id;
|
||||
|
||||
if (bridge_slot != PCI_CARD_INVALID) {
|
||||
card = &pci_cards[bridge_slot];
|
||||
card->read = read;
|
||||
card->write = write;
|
||||
card->priv = priv;
|
||||
}
|
||||
|
||||
*slot = bridge_slot;
|
||||
}
|
||||
|
||||
@@ -178,9 +178,7 @@ scsi_card_init(void)
|
||||
bus left. */
|
||||
if (max > 0) {
|
||||
for (int i = 0; i < max; i++) {
|
||||
if (!scsi_cards[scsi_card_current[i]].device)
|
||||
continue;
|
||||
|
||||
if ((scsi_card_current[i] > 0) && scsi_cards[scsi_card_current[i]].device)
|
||||
device_add_inst(scsi_cards[scsi_card_current[i]].device, i + 1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -174,7 +174,7 @@ midi_out_device_get_from_internal_name(char *s)
|
||||
void
|
||||
midi_out_device_init(void)
|
||||
{
|
||||
if (devices[midi_output_device_current].device)
|
||||
if ((midi_output_device_current > 0) && devices[midi_output_device_current].device)
|
||||
device_add(devices[midi_output_device_current].device);
|
||||
midi_output_device_last = midi_output_device_current;
|
||||
}
|
||||
@@ -292,7 +292,7 @@ midi_in_device_get_from_internal_name(char *s)
|
||||
void
|
||||
midi_in_device_init(void)
|
||||
{
|
||||
if (midi_in_devices[midi_input_device_current].device)
|
||||
if ((midi_input_device_current > 0) && midi_in_devices[midi_input_device_current].device)
|
||||
device_add(midi_in_devices[midi_input_device_current].device);
|
||||
midi_input_device_last = midi_input_device_current;
|
||||
}
|
||||
|
||||
@@ -222,13 +222,13 @@ sound_card_get_from_internal_name(const char *s)
|
||||
void
|
||||
sound_card_init(void)
|
||||
{
|
||||
if ((sound_card_current[0] != SOUND_INTERNAL) && (sound_cards[sound_card_current[0]].device))
|
||||
if ((sound_card_current[0] > SOUND_INTERNAL) && (sound_cards[sound_card_current[0]].device))
|
||||
device_add(sound_cards[sound_card_current[0]].device);
|
||||
if (sound_cards[sound_card_current[1]].device)
|
||||
if ((sound_card_current[1] > SOUND_INTERNAL) && (sound_cards[sound_card_current[1]].device))
|
||||
device_add(sound_cards[sound_card_current[1]].device);
|
||||
if (sound_cards[sound_card_current[2]].device)
|
||||
if ((sound_card_current[2] > SOUND_INTERNAL) && (sound_cards[sound_card_current[2]].device))
|
||||
device_add(sound_cards[sound_card_current[2]].device);
|
||||
if (sound_cards[sound_card_current[3]].device)
|
||||
if ((sound_card_current[3] > SOUND_INTERNAL) && (sound_cards[sound_card_current[3]].device))
|
||||
device_add(sound_cards[sound_card_current[3]].device);
|
||||
}
|
||||
|
||||
|
||||
@@ -344,10 +344,8 @@ video_reset(int card)
|
||||
monitor_index_global = 0;
|
||||
loadfont("roms/video/mda/mda.rom", 0);
|
||||
|
||||
if ((card != VID_NONE)
|
||||
&& !machine_has_flags(machine, MACHINE_VIDEO_ONLY)
|
||||
&& (gfxcard[1] != 0)
|
||||
&& device_is_valid(video_card_getdevice(gfxcard[1]), machine)) {
|
||||
if ((card != VID_NONE) && !machine_has_flags(machine, MACHINE_VIDEO_ONLY) &&
|
||||
(gfxcard[1] > VID_INTERNAL) && device_is_valid(video_card_getdevice(gfxcard[1]), machine)) {
|
||||
video_monitor_init(1);
|
||||
monitor_index_global = 1;
|
||||
device_add(video_cards[gfxcard[1]].device);
|
||||
@@ -355,7 +353,7 @@ video_reset(int card)
|
||||
}
|
||||
|
||||
/* Do not initialize internal cards here. */
|
||||
if ((card != VID_NONE) && (card != VID_INTERNAL) && !machine_has_flags(machine, MACHINE_VIDEO_ONLY)) {
|
||||
if ((card > VID_INTERNAL) && !machine_has_flags(machine, MACHINE_VIDEO_ONLY)) {
|
||||
vid_table_log("VIDEO: initializing '%s'\n", video_cards[card].device->name);
|
||||
|
||||
video_prepare();
|
||||
|
||||
Reference in New Issue
Block a user