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:
OBattler
2017-12-05 22:39:21 +01:00
parent 8d8915e231
commit c15fb69584
5 changed files with 21 additions and 6 deletions

View File

@@ -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)
{

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;