Fixed datasheet erratum in floppy handling on the PC87307 and PC87309 Super I/O chip, and added a variant of the PC87307 on ports 15C and 15D.

This commit is contained in:
OBattler
2020-09-07 18:35:30 +02:00
parent bb9a657d1c
commit ec1a3e3784
3 changed files with 21 additions and 5 deletions

View File

@@ -30,6 +30,7 @@ extern const device_t i82091aa_device;
extern const device_t i82091aa_ide_device;
extern const device_t pc87306_device;
extern const device_t pc87307_device;
extern const device_t pc87307_15c_device;
extern const device_t pc87309_device;
extern const device_t pc87332_device;
extern const device_t pc87332_ps1_device;

View File

@@ -157,7 +157,7 @@ fdc_handler(pc87307_t *dev)
addr = ((dev->ld_regs[0x03][0x30] << 8) | dev->ld_regs[0x03][0x31]) - 0x0002;
irq = (dev->ld_regs[0x03][0x40] & 0x0f);
if (active && (addr <= 0xfff2)) {
if (active && (addr <= 0xfff8)) {
fdc_set_base(dev->fdc, addr);
fdc_set_irq(dev->fdc, irq);
}
@@ -322,7 +322,7 @@ pc87307_write(uint16_t port, uint8_t val, void *priv)
dev->ld_regs[dev->regs[0x07]][dev->cur_reg - 0x30] = val & 0xfb;
break;
case 0x03:
dev->ld_regs[dev->regs[0x07]][dev->cur_reg - 0x30] = val & 0xfa;
dev->ld_regs[dev->regs[0x07]][dev->cur_reg - 0x30] = (val & 0xfa) | 0x02;
fdc_handler(dev);
break;
case 0x04:
@@ -542,8 +542,13 @@ pc87307_init(const device_t *info)
pc87307_reset(dev);
io_sethandler(0x02e, 0x0002,
pc87307_read, NULL, NULL, pc87307_write, NULL, NULL, dev);
if (info->local & 0x100) {
io_sethandler(0x15c, 0x0002,
pc87307_read, NULL, NULL, pc87307_write, NULL, NULL, dev);
} else {
io_sethandler(0x02e, 0x0002,
pc87307_read, NULL, NULL, pc87307_write, NULL, NULL, dev);
}
return dev;
}
@@ -559,6 +564,16 @@ const device_t pc87307_device = {
};
const device_t pc87307_15c_device = {
"National Semiconductor PC87307 Super I/O (Port 15Ch)",
0,
0x1c0,
pc87307_init, pc87307_close, NULL,
NULL, NULL, NULL,
NULL
};
const device_t pc97307_device = {
"National Semiconductor PC97307 Super I/O",
0,

View File

@@ -255,7 +255,7 @@ pc87309_write(uint16_t port, uint8_t val, void *priv)
case 0x61:
switch (dev->regs[0x07]) {
case 0x00:
dev->ld_regs[dev->regs[0x07]][dev->cur_reg - 0x30] = val & 0xfa;
dev->ld_regs[dev->regs[0x07]][dev->cur_reg - 0x30] = (val & 0xfa) | 0x02;
fdc_handler(dev);
break;
case 0x01: