Fixed the RPM slow down accounting for 86F version 1.21 images in d86f_get_raw_size();
Properly fixed serial port IRQ assignment with the National Semiconductors PC87306 Super I/O chip - DOS mouse drivers now work if mouse is set to serial.
This commit is contained in:
@@ -585,13 +585,13 @@ uint16_t d86f_get_raw_size(int drive)
|
|||||||
{
|
{
|
||||||
switch (d86f_get_rpm_mode(drive))
|
switch (d86f_get_rpm_mode(drive))
|
||||||
{
|
{
|
||||||
case 0:
|
case 1:
|
||||||
rpm_diff *= 2.0;
|
rpm_diff *= 2.0;
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 2:
|
||||||
rpm_diff *= 3.0;
|
rpm_diff *= 3.0;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 3:
|
||||||
rpm_diff *= 4.0;
|
rpm_diff *= 4.0;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|||||||
@@ -115,7 +115,8 @@ void serial2_handler()
|
|||||||
|
|
||||||
void pc87306_write(uint16_t port, uint8_t val, void *priv)
|
void pc87306_write(uint16_t port, uint8_t val, void *priv)
|
||||||
{
|
{
|
||||||
uint8_t index = (port & 1) ? 0 : 1;
|
uint8_t index;
|
||||||
|
index = (port & 1) ? 0 : 1;
|
||||||
int temp;
|
int temp;
|
||||||
uint8_t valxor;
|
uint8_t valxor;
|
||||||
// pclog("pc87306_write : port=%04x reg %02X = %02X locked=%i\n", port, pc87306_curreg, val, pc87306_locked);
|
// pclog("pc87306_write : port=%04x reg %02X = %02X locked=%i\n", port, pc87306_curreg, val, pc87306_locked);
|
||||||
@@ -123,6 +124,7 @@ void pc87306_write(uint16_t port, uint8_t val, void *priv)
|
|||||||
if (index)
|
if (index)
|
||||||
{
|
{
|
||||||
pc87306_curreg = val;
|
pc87306_curreg = val;
|
||||||
|
// pclog("Register set to: %02X\n", val);
|
||||||
tries = 0;
|
tries = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -133,6 +135,7 @@ void pc87306_write(uint16_t port, uint8_t val, void *priv)
|
|||||||
if (pc87306_curreg <= 28) valxor = val ^ pc87306_regs[pc87306_curreg];
|
if (pc87306_curreg <= 28) valxor = val ^ pc87306_regs[pc87306_curreg];
|
||||||
if (pc87306_curreg == 0xF) pc87306_gpio_remove();
|
if (pc87306_curreg == 0xF) pc87306_gpio_remove();
|
||||||
if (pc87306_curreg <= 28) pc87306_regs[pc87306_curreg] = val;
|
if (pc87306_curreg <= 28) pc87306_regs[pc87306_curreg] = val;
|
||||||
|
// pclog("Register %02X set to: %02X\n", pc87306_regs[pc87306_curreg], val);
|
||||||
tries = 0;
|
tries = 0;
|
||||||
if (pc87306_curreg <= 28) goto process_value;
|
if (pc87306_curreg <= 28) goto process_value;
|
||||||
}
|
}
|
||||||
@@ -142,6 +145,7 @@ void pc87306_write(uint16_t port, uint8_t val, void *priv)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
|
|
||||||
process_value:
|
process_value:
|
||||||
switch(pc87306_curreg)
|
switch(pc87306_curreg)
|
||||||
@@ -177,54 +181,73 @@ process_value:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
serial1_remove();
|
|
||||||
serial2_remove();
|
if (valxor & 2)
|
||||||
if (val & 2)
|
|
||||||
{
|
{
|
||||||
serial1_handler();
|
serial1_remove();
|
||||||
// if (mouse_always_serial) mouse_serial_init();
|
if (val & 2)
|
||||||
|
{
|
||||||
|
serial1_handler();
|
||||||
|
// if (mouse_always_serial) mouse_serial_init();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (valxor & 4)
|
||||||
|
{
|
||||||
|
serial2_remove();
|
||||||
|
if (val & 4) serial2_handler();
|
||||||
}
|
}
|
||||||
if (val & 4) serial2_handler();
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
lpt1_remove();
|
if (valxor & 1)
|
||||||
if (pc87306_regs[0] & 1)
|
|
||||||
{
|
{
|
||||||
if (pc87306_regs[0x1B] & 0x10)
|
lpt1_remove();
|
||||||
|
if (pc87306_regs[0] & 1)
|
||||||
{
|
{
|
||||||
temp = (pc87306_regs[0x1B] & 0x20) >> 5;
|
if (pc87306_regs[0x1B] & 0x10)
|
||||||
if (temp)
|
|
||||||
{
|
{
|
||||||
lpt_port = 0x378; break;
|
temp = (pc87306_regs[0x1B] & 0x20) >> 5;
|
||||||
|
if (temp)
|
||||||
|
{
|
||||||
|
lpt_port = 0x378; break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
lpt_port = 0x278; break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
lpt_port = 0x278; break;
|
temp = val & 3;
|
||||||
|
switch (temp)
|
||||||
|
{
|
||||||
|
case 0: lpt_port = 0x378; break;
|
||||||
|
case 1: lpt_port = 0x3bc; break;
|
||||||
|
case 2: lpt_port = 0x278; break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
lpt1_init(lpt_port);
|
||||||
|
pc87306_regs[0x19] = lpt_port >> 2;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
temp = val & 3;
|
|
||||||
switch (temp)
|
|
||||||
{
|
|
||||||
case 0: lpt_port = 0x378; break;
|
|
||||||
case 1: lpt_port = 0x3bc; break;
|
|
||||||
case 2: lpt_port = 0x278; break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
lpt1_init(lpt_port);
|
|
||||||
pc87306_regs[0x19] = lpt_port >> 2;
|
|
||||||
}
|
}
|
||||||
serial1_remove();
|
|
||||||
serial2_remove();
|
|
||||||
|
|
||||||
if (pc87306_regs[0] & 2)
|
if (valxor & 0xcc)
|
||||||
{
|
{
|
||||||
serial1_handler();
|
serial1_remove();
|
||||||
// if (mouse_always_serial) mouse_serial_init();
|
|
||||||
|
if (pc87306_regs[0] & 2)
|
||||||
|
{
|
||||||
|
serial1_handler();
|
||||||
|
// if (mouse_always_serial) mouse_serial_init();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (valxor & 0xf0)
|
||||||
|
{
|
||||||
|
serial2_remove();
|
||||||
|
|
||||||
|
if (pc87306_regs[0] & 4) serial2_handler();
|
||||||
}
|
}
|
||||||
if (pc87306_regs[0] & 4) serial2_handler();
|
|
||||||
break;
|
break;
|
||||||
case 9:
|
case 9:
|
||||||
// pclog("Setting DENSEL polarity to: %i (before: %i)\n", (val & 0x40 ? 1 : 0), fdc_get_densel_polarity());
|
// pclog("Setting DENSEL polarity to: %i (before: %i)\n", (val & 0x40 ? 1 : 0), fdc_get_densel_polarity());
|
||||||
@@ -234,7 +257,8 @@ process_value:
|
|||||||
pc87306_gpio_init();
|
pc87306_gpio_init();
|
||||||
break;
|
break;
|
||||||
case 0x1C:
|
case 0x1C:
|
||||||
if (valxor & 1)
|
// if (valxor & 0x25)
|
||||||
|
if (valxor)
|
||||||
{
|
{
|
||||||
serial1_remove();
|
serial1_remove();
|
||||||
serial2_remove();
|
serial2_remove();
|
||||||
@@ -257,7 +281,8 @@ uint8_t pc87306_gpio_read(uint16_t port, void *priv)
|
|||||||
uint8_t pc87306_read(uint16_t port, void *priv)
|
uint8_t pc87306_read(uint16_t port, void *priv)
|
||||||
{
|
{
|
||||||
// pclog("pc87306_read : port=%04x reg %02X locked=%i\n", port, pc87306_curreg, pc87306_locked);
|
// pclog("pc87306_read : port=%04x reg %02X locked=%i\n", port, pc87306_curreg, pc87306_locked);
|
||||||
uint8_t index = (port & 1) ? 0 : 1;
|
uint8_t index;
|
||||||
|
index = (port & 1) ? 0 : 1;
|
||||||
|
|
||||||
if (index)
|
if (index)
|
||||||
return pc87306_curreg;
|
return pc87306_curreg;
|
||||||
|
|||||||
Reference in New Issue
Block a user