Fixed the AHA-1640 and BT-640A MCA SCSI controllers, they both work correctly now;
IBM PS/2 Model 80-486 now correctly loads and saves a second NVR file.
This commit is contained in:
@@ -68,6 +68,7 @@ static void *ps2_nvr_init(device_t *info)
|
||||
switch (romset)
|
||||
{
|
||||
case ROM_IBMPS2_M80: f = nvr_fopen(L"ibmps2_m80_sec.nvr", L"rb"); break;
|
||||
case ROM_IBMPS2_M80_486: f = nvr_fopen(L"ibmps2_m80-486_sec.nvr", L"rb"); break;
|
||||
}
|
||||
if (f)
|
||||
{
|
||||
@@ -88,6 +89,7 @@ void ps2_nvr_close(void *p)
|
||||
switch (romset)
|
||||
{
|
||||
case ROM_IBMPS2_M80: f = nvr_fopen(L"ibmps2_m80_sec.nvr", L"wb"); break;
|
||||
case ROM_IBMPS2_M80_486: f = nvr_fopen(L"ibmps2_m80-486_sec.nvr", L"wb"); break;
|
||||
}
|
||||
if (f)
|
||||
{
|
||||
|
@@ -503,7 +503,7 @@ aha_mca_write(int port, uint8_t val, void *priv)
|
||||
|
||||
/* Get the new assigned I/O base address. */
|
||||
dev->Base = (dev->pos_regs[3] & 7) << 8;
|
||||
dev->Base |= ((dev->pos_regs[3] & 0xc0) ? 4 : 0);
|
||||
dev->Base |= ((dev->pos_regs[3] & 0xc0) ? 0x34 : 0x30);
|
||||
|
||||
/* Save the new IRQ and DMA channel values. */
|
||||
dev->Irq = (dev->pos_regs[4] & 0x07) + 8;
|
||||
@@ -578,6 +578,10 @@ aha_mca_write(int port, uint8_t val, void *priv)
|
||||
mem_mapping_enable(&dev->bios.mapping);
|
||||
mem_mapping_set_addr(&dev->bios.mapping, dev->rom_addr, ROM_SIZE);
|
||||
}
|
||||
|
||||
/* Say hello. */
|
||||
pclog("AHA-1640: I/O=%04x, IRQ=%d, DMA=%d, BIOS @%05X, HOST ID %i\n",
|
||||
dev->Base, dev->Irq, dev->DmaChannel, dev->rom_addr, dev->HostID);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -760,6 +764,7 @@ aha_init(device_t *info)
|
||||
dev->int_geom_writable = 0;
|
||||
dev->cdrom_boot = 0;
|
||||
dev->bit32 = 0;
|
||||
dev->lba_bios = 0;
|
||||
|
||||
dev->ven_thread = aha_thread;
|
||||
dev->ven_cmd_is_fast = aha_cmd_is_fast;
|
||||
@@ -838,6 +843,8 @@ aha_init(device_t *info)
|
||||
dev->bios_path = L"roms/scsi/adaptec/aha1640.bin";
|
||||
dev->fw_rev = "BB01";
|
||||
|
||||
dev->lba_bios = 1;
|
||||
|
||||
/* Enable MCA. */
|
||||
dev->pos_regs[0] = 0x1F; /* MCA board ID */
|
||||
dev->pos_regs[1] = 0x0F;
|
||||
|
@@ -1337,7 +1337,7 @@ buslogic_mca_write(int port, uint8_t val, void *priv)
|
||||
/* Get the new assigned I/O base address. */
|
||||
if (dev->pos_regs[3]) {
|
||||
dev->Base = dev->pos_regs[3] << 8;
|
||||
dev->Base |= ((dev->pos_regs[2] & 0x10) ? 4 : 0);
|
||||
dev->Base |= ((dev->pos_regs[2] & 0x10) ? 0x34 : 0x30);
|
||||
} else {
|
||||
dev->Base = 0x0000;
|
||||
}
|
||||
@@ -1347,7 +1347,7 @@ buslogic_mca_write(int port, uint8_t val, void *priv)
|
||||
dev->DmaChannel = dev->pos_regs[5] & 0x0f;
|
||||
|
||||
/* Extract the BIOS ROM address info. */
|
||||
if (dev->pos_regs[0] & 0xe0) switch(dev->pos_regs[0] & 0xe0) {
|
||||
if (dev->pos_regs[2] & 0xe0) switch(dev->pos_regs[2] & 0xe0) {
|
||||
case 0xe0: /* [0]=111x xxxx */
|
||||
bl->bios_addr = 0xDC000;
|
||||
break;
|
||||
@@ -1433,6 +1433,10 @@ buslogic_mca_write(int port, uint8_t val, void *priv)
|
||||
mem_mapping_enable(&bl->bios.mapping);
|
||||
mem_mapping_set_addr(&bl->bios.mapping, bl->bios_addr, ROM_SIZE);
|
||||
}
|
||||
|
||||
/* Say hello. */
|
||||
pclog("BT-640A: I/O=%04x, IRQ=%d, DMA=%d, BIOS @%05X, HOST ID %i\n",
|
||||
dev->Base, dev->Irq, dev->DmaChannel, bl->bios_addr, dev->HostID);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1490,6 +1494,7 @@ buslogic_init(device_t *info)
|
||||
dev->int_geom_writable = 1;
|
||||
dev->cdrom_boot = 0;
|
||||
dev->bit32 = 0;
|
||||
dev->lba_bios = 0;
|
||||
|
||||
bl->chip = info->local;
|
||||
bl->PCIBase = 0;
|
||||
|
@@ -1609,12 +1609,12 @@ x54x_out(uint16_t port, uint8_t val, void *priv)
|
||||
|
||||
case CMD_BIOSCMD: /* execute BIOS */
|
||||
cmd = (BIOSCMD *)dev->CmdBuf;
|
||||
if (!(dev->bus & DEVICE_MCA)) {
|
||||
if (!dev->lba_bios) {
|
||||
/* 1640 uses LBA. */
|
||||
cyl = ((cmd->u.chs.cyl & 0xff) << 8) | ((cmd->u.chs.cyl >> 8) & 0xff);
|
||||
cmd->u.chs.cyl = cyl;
|
||||
}
|
||||
if (dev->bus & DEVICE_MCA) {
|
||||
if (dev->lba_bios) {
|
||||
/* 1640 uses LBA. */
|
||||
x54x_log("BIOS LBA=%06lx (%lu)\n",
|
||||
lba32_blk(cmd),
|
||||
@@ -1627,7 +1627,7 @@ x54x_out(uint16_t port, uint8_t val, void *priv)
|
||||
cmd->u.chs.head,
|
||||
cmd->u.chs.sec);
|
||||
}
|
||||
dev->DataBuf[0] = x54x_bios_command(dev, dev->max_id, cmd, (dev->bus & DEVICE_MCA)?1:0);
|
||||
dev->DataBuf[0] = x54x_bios_command(dev, dev->max_id, cmd, (dev->lba_bios)?1:0);
|
||||
x54x_log("BIOS Completion/Status Code %x\n", dev->DataBuf[0]);
|
||||
dev->DataReplyLeft = 1;
|
||||
break;
|
||||
|
@@ -424,6 +424,7 @@ typedef struct {
|
||||
uint8_t max_id;
|
||||
uint8_t pci_slot;
|
||||
uint8_t bit32;
|
||||
uint8_t lba_bios;
|
||||
|
||||
mem_mapping_t mmio_mapping;
|
||||
|
||||
|
Reference in New Issue
Block a user