Fixed legacy mode on the Winbond W83877F and TF Super I/O chips.
This commit is contained in:
@@ -11,10 +11,10 @@
|
|||||||
* Winbond W83877F Super I/O Chip
|
* Winbond W83877F Super I/O Chip
|
||||||
* Used by the Award 430HX
|
* Used by the Award 430HX
|
||||||
*
|
*
|
||||||
* Version: @(#)sio_w83877f.c 1.0.15 2019/05/17
|
* Version: @(#)sio_w83877f.c 1.0.16 2020/01/11
|
||||||
*
|
*
|
||||||
* Author: Miran Grca, <mgrca8@gmail.com>
|
* Author: Miran Grca, <mgrca8@gmail.com>
|
||||||
* Copyright 2016-2018 Miran Grca.
|
* Copyright 2016-2020 Miran Grca.
|
||||||
*/
|
*/
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
@@ -167,12 +167,21 @@ static void
|
|||||||
w83877f_write(uint16_t port, uint8_t val, void *priv)
|
w83877f_write(uint16_t port, uint8_t val, void *priv)
|
||||||
{
|
{
|
||||||
w83877f_t *dev = (w83877f_t *) priv;
|
w83877f_t *dev = (w83877f_t *) priv;
|
||||||
uint8_t index = (port & 1) ? 0 : 1;
|
|
||||||
uint8_t valxor = 0;
|
uint8_t valxor = 0;
|
||||||
uint8_t max = 0x2A;
|
uint8_t max = 0x2A;
|
||||||
uint8_t lpt_irq;
|
uint8_t lpt_irq;
|
||||||
|
|
||||||
if (index) {
|
if (port == 0x250) {
|
||||||
|
if (val == dev->key)
|
||||||
|
dev->locked = 1;
|
||||||
|
else
|
||||||
|
dev->locked = 0;
|
||||||
|
return;
|
||||||
|
} else if (port == 0x251) {
|
||||||
|
if (val <= max)
|
||||||
|
dev->cur_reg = val;
|
||||||
|
return;
|
||||||
|
} else if (port == 0x03f0) {
|
||||||
if ((val == dev->key) && !dev->locked) {
|
if ((val == dev->key) && !dev->locked) {
|
||||||
if (dev->key_times == 2) {
|
if (dev->key_times == 2) {
|
||||||
if (dev->tries) {
|
if (dev->tries) {
|
||||||
@@ -196,7 +205,7 @@ w83877f_write(uint16_t port, uint8_t val, void *priv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
} else {
|
} else if ((port == 0x252) || (port == 0x3f1)) {
|
||||||
if (dev->locked) {
|
if (dev->locked) {
|
||||||
if (dev->rw_locked)
|
if (dev->rw_locked)
|
||||||
return;
|
return;
|
||||||
@@ -214,7 +223,7 @@ w83877f_write(uint16_t port, uint8_t val, void *priv)
|
|||||||
|
|
||||||
switch (dev->cur_reg) {
|
switch (dev->cur_reg) {
|
||||||
case 0:
|
case 0:
|
||||||
if (valxor & 0xc0) {
|
if (valxor & 0x0c) {
|
||||||
lpt1_remove();
|
lpt1_remove();
|
||||||
if (!(dev->regs[4] & 0x80))
|
if (!(dev->regs[4] & 0x80))
|
||||||
lpt1_init(make_port(dev, 0x23));
|
lpt1_init(make_port(dev, 0x23));
|
||||||
@@ -340,12 +349,11 @@ w83877f_read(uint16_t port, void *priv)
|
|||||||
{
|
{
|
||||||
w83877f_t *dev = (w83877f_t *) priv;
|
w83877f_t *dev = (w83877f_t *) priv;
|
||||||
uint8_t ret = 0xff;
|
uint8_t ret = 0xff;
|
||||||
uint8_t index = (port & 1) ? 0 : 1;
|
|
||||||
|
|
||||||
if (dev->locked) {
|
if (dev->locked) {
|
||||||
if (index)
|
if ((port == 0x3f0) || (port == 0x251))
|
||||||
ret = dev->cur_reg;
|
ret = dev->cur_reg;
|
||||||
else {
|
else if ((port == 0x3f1) || (port == 0x252)) {
|
||||||
if (dev->cur_reg == 7)
|
if (dev->cur_reg == 7)
|
||||||
ret = (fdc_get_rwc(dev->fdc, 0) | (fdc_get_rwc(dev->fdc, 1) << 2));
|
ret = (fdc_get_rwc(dev->fdc, 0) | (fdc_get_rwc(dev->fdc, 1) << 2));
|
||||||
else if ((dev->cur_reg >= 0x18) || !dev->rw_locked)
|
else if ((dev->cur_reg >= 0x18) || !dev->rw_locked)
|
||||||
|
Reference in New Issue
Block a user