Corrected the indentation in sio/it8661f.c and disabled the execess logging.
This commit is contained in:
@@ -8,18 +8,20 @@
|
||||
*
|
||||
* Implementation of the ITE IT8661F chipset.
|
||||
*
|
||||
* Note: This Super I/O is partially incomplete and intended only for having the intended machine to function
|
||||
* Note: This Super I/O is partially incomplete and intended only for having the intended machine to function
|
||||
*
|
||||
* Authors: Tiseno100
|
||||
* Authors: Tiseno100
|
||||
*
|
||||
* Copyright 2021 Tiseno100
|
||||
*
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <wchar.h>
|
||||
#define HAVE_STDARG_H
|
||||
#include <86box/86box.h>
|
||||
#include <86box/io.h>
|
||||
#include <86box/timer.h>
|
||||
@@ -31,8 +33,10 @@
|
||||
#include <86box/fdd_common.h>
|
||||
#include <86box/sio.h>
|
||||
|
||||
|
||||
#define LDN dev->regs[7]
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
fdc_t *fdc_controller;
|
||||
@@ -42,203 +46,233 @@ typedef struct
|
||||
int unlocked, enumerator;
|
||||
} it8661f_t;
|
||||
|
||||
uint8_t mb_pnp_key[32] = {0x6a, 0xb5, 0xda, 0xed, 0xf6, 0xfb, 0x7d, 0xbe, 0xdf, 0x6f, 0x37, 0x1b, 0x0d, 0x86, 0xc3, 0x61, 0xb0, 0x58, 0x2c, 0x16, 0x8b, 0x45, 0xa2, 0xd1, 0xe8, 0x74, 0x3a, 0x9d, 0xce, 0xe7, 0x73, 0x39};
|
||||
static void it8661f_reset(void *priv);
|
||||
|
||||
void it8661_fdc(uint16_t addr, uint8_t val, it8661f_t *dev)
|
||||
static uint8_t mb_pnp_key[32] = {0x6a, 0xb5, 0xda, 0xed, 0xf6, 0xfb, 0x7d, 0xbe, 0xdf, 0x6f, 0x37, 0x1b, 0x0d, 0x86, 0xc3, 0x61, 0xb0, 0x58, 0x2c, 0x16, 0x8b, 0x45, 0xa2, 0xd1, 0xe8, 0x74, 0x3a, 0x9d, 0xce, 0xe7, 0x73, 0x39};
|
||||
|
||||
|
||||
static void it8661f_reset(void *priv);
|
||||
|
||||
|
||||
#ifdef ENABLE_IT8661_LOG
|
||||
int it8661_do_log = ENABLE_IT8661_LOG;
|
||||
|
||||
|
||||
void
|
||||
it8661_log(const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
if (it8661_do_log) {
|
||||
va_start(ap, fmt);
|
||||
pclog_ex(fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
}
|
||||
#else
|
||||
#define it8661_log(fmt, ...)
|
||||
#endif
|
||||
|
||||
|
||||
static void
|
||||
it8661_fdc(uint16_t addr, uint8_t val, it8661f_t *dev)
|
||||
{
|
||||
fdc_remove(dev->fdc_controller);
|
||||
|
||||
if (((addr == 0x30) && (val & 1)) || (dev->device_regs[0][0x30] & 1))
|
||||
{
|
||||
switch (addr)
|
||||
{
|
||||
case 0x30:
|
||||
dev->device_regs[0][addr] = val & 1;
|
||||
break;
|
||||
if (((addr == 0x30) && (val & 1)) || (dev->device_regs[0][0x30] & 1)) {
|
||||
switch (addr) {
|
||||
case 0x30:
|
||||
dev->device_regs[0][addr] = val & 1;
|
||||
break;
|
||||
|
||||
case 0x31:
|
||||
dev->device_regs[0][addr] = val & 3;
|
||||
if (val & 1)
|
||||
dev->device_regs[0][addr] |= 0x55;
|
||||
break;
|
||||
case 0x31:
|
||||
dev->device_regs[0][addr] = val & 3;
|
||||
if (val & 1)
|
||||
dev->device_regs[0][addr] |= 0x55;
|
||||
break;
|
||||
|
||||
case 0x60:
|
||||
case 0x61:
|
||||
dev->device_regs[0][addr] = val & ((addr == 0x61) ? 0xff : 0xf8);
|
||||
break;
|
||||
case 0x60:
|
||||
case 0x61:
|
||||
dev->device_regs[0][addr] = val & ((addr == 0x61) ? 0xff : 0xf8);
|
||||
break;
|
||||
|
||||
case 0x70:
|
||||
dev->device_regs[0][addr] = val & 0x0f;
|
||||
break;
|
||||
case 0x70:
|
||||
dev->device_regs[0][addr] = val & 0x0f;
|
||||
break;
|
||||
|
||||
case 0x74:
|
||||
dev->device_regs[0][addr] = val & 7;
|
||||
break;
|
||||
case 0x74:
|
||||
dev->device_regs[0][addr] = val & 7;
|
||||
break;
|
||||
|
||||
case 0xf0:
|
||||
dev->device_regs[0][addr] = val & 0x0f;
|
||||
break;
|
||||
}
|
||||
fdc_set_base(dev->fdc_controller, (dev->device_regs[0][0x60] << 8) | (dev->device_regs[0][0x61]));
|
||||
fdc_set_irq(dev->fdc_controller, dev->device_regs[0][0x70] & 0x0f);
|
||||
fdc_set_dma_ch(dev->fdc_controller, dev->device_regs[0][0x74] & 7);
|
||||
case 0xf0:
|
||||
dev->device_regs[0][addr] = val & 0x0f;
|
||||
break;
|
||||
}
|
||||
|
||||
if (dev->device_regs[0][0xf0] & 1)
|
||||
fdc_writeprotect(dev->fdc_controller);
|
||||
fdc_set_base(dev->fdc_controller, (dev->device_regs[0][0x60] << 8) | (dev->device_regs[0][0x61]));
|
||||
fdc_set_irq(dev->fdc_controller, dev->device_regs[0][0x70] & 0x0f);
|
||||
fdc_set_dma_ch(dev->fdc_controller, dev->device_regs[0][0x74] & 7);
|
||||
|
||||
// if (dev->device_regs[0][0xf0] & 4)
|
||||
// fdc_swap(dev->fdc_controller);
|
||||
pclog("ITE 8661-FDC: BASE %04x IRQ %02x\n", (dev->device_regs[0][0x60] << 8) | (dev->device_regs[0][0x61]), dev->device_regs[0][0x70] & 0x0f);
|
||||
if (dev->device_regs[0][0xf0] & 1)
|
||||
fdc_writeprotect(dev->fdc_controller);
|
||||
|
||||
it8661_log("ITE 8661-FDC: BASE %04x IRQ %02x\n", (dev->device_regs[0][0x60] << 8) | (dev->device_regs[0][0x61]),
|
||||
dev->device_regs[0][0x70] & 0x0f);
|
||||
}
|
||||
}
|
||||
|
||||
void it8661_serial(int uart, uint16_t addr, uint8_t val, it8661f_t *dev)
|
||||
|
||||
static void
|
||||
it8661_serial(int uart, uint16_t addr, uint8_t val, it8661f_t *dev)
|
||||
{
|
||||
serial_remove(dev->uart[uart]);
|
||||
if (((addr == 0x30) && (val & 1)) || (dev->device_regs[1 + uart][0x30] & 1))
|
||||
{
|
||||
switch (addr)
|
||||
{
|
||||
case 0x30:
|
||||
dev->device_regs[1 + uart][addr] = val & 1;
|
||||
break;
|
||||
|
||||
case 0x60:
|
||||
case 0x61:
|
||||
dev->device_regs[1 + uart][addr] = val & ((addr == 0x61) ? 0xff : 0xf8);
|
||||
break;
|
||||
if (((addr == 0x30) && (val & 1)) || (dev->device_regs[1 + uart][0x30] & 1)) {
|
||||
switch (addr) {
|
||||
case 0x30:
|
||||
dev->device_regs[1 + uart][addr] = val & 1;
|
||||
break;
|
||||
|
||||
case 0x70:
|
||||
dev->device_regs[1 + uart][addr] = val & 0x0f;
|
||||
break;
|
||||
case 0x60:
|
||||
case 0x61:
|
||||
dev->device_regs[1 + uart][addr] = val & ((addr == 0x61) ? 0xff : 0xf8);
|
||||
break;
|
||||
|
||||
case 0x74:
|
||||
dev->device_regs[1 + uart][addr] = val & 7;
|
||||
break;
|
||||
case 0x70:
|
||||
dev->device_regs[1 + uart][addr] = val & 0x0f;
|
||||
break;
|
||||
|
||||
case 0xf0:
|
||||
dev->device_regs[1 + uart][addr] = val & 3;
|
||||
break;
|
||||
}
|
||||
serial_setup(dev->uart[uart], (dev->device_regs[1 + uart][0x60] << 8) | (dev->device_regs[1 + uart][0x61]), dev->device_regs[1 + uart][0x70] & 0x0f);
|
||||
pclog("ITE 8661-UART%01x: BASE %04x IRQ %02x\n", 1 + (LDN % 1), (dev->device_regs[1 + uart][0x60] << 8) | (dev->device_regs[1 + uart][0x61]), dev->device_regs[1 + uart][0x70] & 0x0f);
|
||||
case 0x74:
|
||||
dev->device_regs[1 + uart][addr] = val & 7;
|
||||
break;
|
||||
|
||||
case 0xf0:
|
||||
dev->device_regs[1 + uart][addr] = val & 3;
|
||||
break;
|
||||
}
|
||||
|
||||
serial_setup(dev->uart[uart], (dev->device_regs[1 + uart][0x60] << 8) | (dev->device_regs[1 + uart][0x61]), dev->device_regs[1 + uart][0x70] & 0x0f);
|
||||
|
||||
it8661_log("ITE 8661-UART%01x: BASE %04x IRQ %02x\n", 1 + (LDN % 1),
|
||||
(dev->device_regs[1 + uart][0x60] << 8) | (dev->device_regs[1 + uart][0x61]),
|
||||
dev->device_regs[1 + uart][0x70] & 0x0f);
|
||||
}
|
||||
}
|
||||
|
||||
void it8661_lpt(uint16_t addr, uint8_t val, it8661f_t *dev)
|
||||
|
||||
void
|
||||
it8661_lpt(uint16_t addr, uint8_t val, it8661f_t *dev)
|
||||
{
|
||||
lpt1_remove();
|
||||
if (((addr == 0x30) && (val & 1)) || (dev->device_regs[3][0x30] & 1))
|
||||
{
|
||||
switch (addr)
|
||||
{
|
||||
case 0x30:
|
||||
dev->device_regs[3][addr] = val & 1;
|
||||
break;
|
||||
|
||||
case 0x60:
|
||||
case 0x61:
|
||||
dev->device_regs[3][addr] = val & ((addr == 0x61) ? 0xff : 0xf8);
|
||||
break;
|
||||
if (((addr == 0x30) && (val & 1)) || (dev->device_regs[3][0x30] & 1)) {
|
||||
switch (addr) {
|
||||
case 0x30:
|
||||
dev->device_regs[3][addr] = val & 1;
|
||||
break;
|
||||
|
||||
case 0x70:
|
||||
dev->device_regs[3][addr] = val & 0x0f;
|
||||
break;
|
||||
case 0x60:
|
||||
case 0x61:
|
||||
dev->device_regs[3][addr] = val & ((addr == 0x61) ? 0xff : 0xf8);
|
||||
break;
|
||||
|
||||
case 0x74:
|
||||
dev->device_regs[3][addr] = val & 7;
|
||||
break;
|
||||
case 0x70:
|
||||
dev->device_regs[3][addr] = val & 0x0f;
|
||||
break;
|
||||
|
||||
case 0xf0:
|
||||
dev->device_regs[3][addr] = val & 3;
|
||||
break;
|
||||
}
|
||||
lpt1_init((dev->device_regs[3][0x60] << 8) | (dev->device_regs[3][0x61]));
|
||||
lpt1_irq(dev->device_regs[3][0x70] & 0x0f);
|
||||
pclog("ITE 8661-LPT: BASE %04x IRQ %02x\n", (dev->device_regs[3][0x60] << 8) | (dev->device_regs[3][0x61]), dev->device_regs[3][0x70] & 0x0f);
|
||||
case 0x74:
|
||||
dev->device_regs[3][addr] = val & 7;
|
||||
break;
|
||||
|
||||
case 0xf0:
|
||||
dev->device_regs[3][addr] = val & 3;
|
||||
break;
|
||||
}
|
||||
|
||||
lpt1_init((dev->device_regs[3][0x60] << 8) | (dev->device_regs[3][0x61]));
|
||||
lpt1_irq(dev->device_regs[3][0x70] & 0x0f);
|
||||
|
||||
it8661_log("ITE 8661-LPT: BASE %04x IRQ %02x\n", (dev->device_regs[3][0x60] << 8) | (dev->device_regs[3][0x61]),
|
||||
dev->device_regs[3][0x70] & 0x0f);
|
||||
}
|
||||
}
|
||||
|
||||
void it8661_ldn(uint16_t addr, uint8_t val, it8661f_t *dev)
|
||||
|
||||
void
|
||||
it8661_ldn(uint16_t addr, uint8_t val, it8661f_t *dev)
|
||||
{
|
||||
switch (LDN)
|
||||
{
|
||||
case 0:
|
||||
it8661_fdc(addr, val, dev);
|
||||
break;
|
||||
case 1:
|
||||
case 2:
|
||||
it8661_serial(LDN & 2, addr, val, dev);
|
||||
break;
|
||||
case 3:
|
||||
it8661_lpt(addr, val, dev);
|
||||
break;
|
||||
switch (LDN) {
|
||||
case 0:
|
||||
it8661_fdc(addr, val, dev);
|
||||
break;
|
||||
case 1:
|
||||
case 2:
|
||||
it8661_serial(LDN & 2, addr, val, dev);
|
||||
break;
|
||||
case 3:
|
||||
it8661_lpt(addr, val, dev);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
it8661f_write(uint16_t addr, uint8_t val, void *priv)
|
||||
{
|
||||
it8661f_t *dev = (it8661f_t *)priv;
|
||||
|
||||
switch (addr)
|
||||
{
|
||||
case 0x370:
|
||||
if (!dev->unlocked)
|
||||
{
|
||||
(val == mb_pnp_key[dev->enumerator]) ? dev->enumerator++ : (dev->enumerator = 0);
|
||||
if (dev->enumerator == 31)
|
||||
{
|
||||
dev->unlocked = 1;
|
||||
pclog("ITE8661F: Unlocked!\n");
|
||||
}
|
||||
}
|
||||
else
|
||||
dev->index = val;
|
||||
break;
|
||||
switch (addr) {
|
||||
case 0x370:
|
||||
if (!dev->unlocked) {
|
||||
(val == mb_pnp_key[dev->enumerator]) ? dev->enumerator++ : (dev->enumerator = 0);
|
||||
if (dev->enumerator == 31) {
|
||||
dev->unlocked = 1;
|
||||
it8661_log("ITE8661F: Unlocked!\n");
|
||||
}
|
||||
} else
|
||||
dev->index = val;
|
||||
break;
|
||||
|
||||
case 0x371:
|
||||
if (dev->unlocked)
|
||||
{
|
||||
switch (dev->index)
|
||||
{
|
||||
case 0x02:
|
||||
dev->regs[dev->index] = val;
|
||||
if (val & 1)
|
||||
it8661f_reset(dev);
|
||||
if (val & 2)
|
||||
dev->unlocked = 0;
|
||||
break;
|
||||
case 0x07:
|
||||
dev->regs[dev->index] = val;
|
||||
break;
|
||||
case 0x22:
|
||||
dev->regs[dev->index] = val & 0x30;
|
||||
break;
|
||||
case 0x23:
|
||||
dev->regs[dev->index] = val & 0x1f;
|
||||
break;
|
||||
default:
|
||||
it8661_ldn(dev->index, val, dev);
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 0x371:
|
||||
if (dev->unlocked) {
|
||||
switch (dev->index) {
|
||||
case 0x02:
|
||||
dev->regs[dev->index] = val;
|
||||
if (val & 1)
|
||||
it8661f_reset(dev);
|
||||
if (val & 2)
|
||||
dev->unlocked = 0;
|
||||
break;
|
||||
case 0x07:
|
||||
dev->regs[dev->index] = val;
|
||||
break;
|
||||
case 0x22:
|
||||
dev->regs[dev->index] = val & 0x30;
|
||||
break;
|
||||
case 0x23:
|
||||
dev->regs[dev->index] = val & 0x1f;
|
||||
break;
|
||||
default:
|
||||
it8661_ldn(dev->index, val, dev);
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
static uint8_t
|
||||
it8661f_read(uint16_t addr, void *priv)
|
||||
{
|
||||
it8661f_t *dev = (it8661f_t *)priv;
|
||||
|
||||
pclog("IT8661F:\n", addr, dev->regs[dev->index]);
|
||||
it8661_log("IT8661F:\n", addr, dev->regs[dev->index]);
|
||||
return (addr == 0xa79) ? dev->regs[dev->index] : 0xff;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
it8661f_reset(void *priv)
|
||||
{
|
||||
@@ -270,6 +304,7 @@ it8661f_reset(void *priv)
|
||||
dev->device_regs[3][0xf0] = 3;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
it8661f_close(void *priv)
|
||||
{
|
||||
@@ -278,6 +313,7 @@ it8661f_close(void *priv)
|
||||
free(dev);
|
||||
}
|
||||
|
||||
|
||||
static void *
|
||||
it8661f_init(const device_t *info)
|
||||
{
|
||||
@@ -299,6 +335,7 @@ it8661f_init(const device_t *info)
|
||||
return dev;
|
||||
}
|
||||
|
||||
|
||||
const device_t it8661f_device = {
|
||||
"ITE IT8661F",
|
||||
0,
|
||||
@@ -306,7 +343,8 @@ const device_t it8661f_device = {
|
||||
it8661f_init,
|
||||
it8661f_close,
|
||||
NULL,
|
||||
{NULL},
|
||||
{ NULL },
|
||||
NULL,
|
||||
NULL,
|
||||
NULL};
|
||||
NULL
|
||||
};
|
||||
|
Reference in New Issue
Block a user