From 9a3cabbe85a07a834c6192ce38feb6366d1e705e Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sun, 18 Sep 2022 17:13:28 -0400 Subject: [PATCH] clang-format in src/device/ --- src/device/bugger.c | 281 ++- src/device/cartridge.c | 118 +- src/device/cassette.c | 849 ++++----- src/device/clock_ics9xxx.c | 357 ++-- src/device/hasp.c | 342 ++-- src/device/hwm.c | 4 +- src/device/hwm_gl518sm.c | 249 ++- src/device/hwm_lm75.c | 152 +- src/device/hwm_lm78.c | 954 +++++----- src/device/hwm_vt82c686.c | 185 +- src/device/i2c.c | 261 ++- src/device/i2c_gpio.c | 143 +- src/device/ibm_5161.c | 1 - src/device/isamem.c | 991 +++++----- src/device/isapnp.c | 1317 ++++++------- src/device/isartc.c | 696 ++++--- src/device/keyboard.c | 311 ++-- src/device/keyboard_at.c | 3106 ++++++++++++++++--------------- src/device/keyboard_xt.c | 643 ++++--- src/device/mouse.c | 157 +- src/device/mouse_bus.c | 828 ++++---- src/device/mouse_ps2.c | 359 ++-- src/device/mouse_serial.c | 842 ++++----- src/device/pci_bridge.c | 784 ++++---- src/device/phoenix_486_jumper.c | 62 +- src/device/postcard.c | 83 +- src/device/serial.c | 2 +- src/device/smbus_ali7101.c | 291 ++- src/device/smbus_piix4.c | 438 +++-- 29 files changed, 7451 insertions(+), 7355 deletions(-) diff --git a/src/device/bugger.c b/src/device/bugger.c index bcea70af3..d346f2bd7 100644 --- a/src/device/bugger.c +++ b/src/device/bugger.c @@ -62,76 +62,69 @@ #include <86box/ui.h> #include <86box/bugger.h> - /* BugBugger registers. */ -#define BUG_CTRL 0 -# define CTRL_RLED 0x00 /* write to the RED LED block */ -# define CTRL_GLED 0x01 /* write to the GREEN LED block */ -# define CTRL_SEG1 0x02 /* write to the RIGHT 7SEG displays */ -# define CTRL_SEG2 0x04 /* write to the LEFT 7SEG displays */ -# define CTRL_SPORT 0x20 /* enable the serial port */ -# define CTRL_SPCFG 0x40 /* set up the serial port */ -# define CTRL_INIT 0x80 /* enable and reset the card */ -# define CTRL_RESET 0xff /* this resets the board */ -#define BUG_DATA 1 +#define BUG_CTRL 0 +#define CTRL_RLED 0x00 /* write to the RED LED block */ +#define CTRL_GLED 0x01 /* write to the GREEN LED block */ +#define CTRL_SEG1 0x02 /* write to the RIGHT 7SEG displays */ +#define CTRL_SEG2 0x04 /* write to the LEFT 7SEG displays */ +#define CTRL_SPORT 0x20 /* enable the serial port */ +#define CTRL_SPCFG 0x40 /* set up the serial port */ +#define CTRL_INIT 0x80 /* enable and reset the card */ +#define CTRL_RESET 0xff /* this resets the board */ +#define BUG_DATA 1 +static uint8_t bug_ctrl, /* control register */ + bug_data, /* data register */ + bug_ledr, bug_ledg, /* RED and GREEN LEDs */ + bug_seg1, bug_seg2, /* LEFT and RIGHT 7SEG displays */ + bug_spcfg; /* serial port configuration */ +#define FIFO_LEN 256 +static uint8_t bug_buff[FIFO_LEN], /* serial port data buffer */ + *bug_bptr; +#define UISTR_LEN 24 +static char bug_str[UISTR_LEN]; /* UI output string */ -static uint8_t bug_ctrl, /* control register */ - bug_data, /* data register */ - bug_ledr, bug_ledg, /* RED and GREEN LEDs */ - bug_seg1, bug_seg2, /* LEFT and RIGHT 7SEG displays */ - bug_spcfg; /* serial port configuration */ -# define FIFO_LEN 256 -static uint8_t bug_buff[FIFO_LEN], /* serial port data buffer */ - *bug_bptr; -# define UISTR_LEN 24 -static char bug_str[UISTR_LEN]; /* UI output string */ - - -extern void ui_sb_bugui(char *__str); - +extern void ui_sb_bugui(char *__str); #ifdef ENABLE_BUGGER_LOG int bugger_do_log = ENABLE_BUGGER_LOG; - static void bugger_log(const char *fmt, ...) { va_list ap; if (bugger_do_log) { - va_start(ap, fmt); - pclog_ex(fmt, ap); - va_end(ap); + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); } } #else -#define bugger_log(fmt, ...) +# define bugger_log(fmt, ...) #endif - /* Update the system's UI with the actual Bugger status. */ static void bug_setui(void) { /* Format all current info in a string. */ sprintf(bug_str, "%02X:%02X %c%c%c%c%c%c%c%c-%c%c%c%c%c%c%c%c", - bug_seg2, bug_seg1, - (bug_ledg&0x80)?'G':'g', (bug_ledg&0x40)?'G':'g', - (bug_ledg&0x20)?'G':'g', (bug_ledg&0x10)?'G':'g', - (bug_ledg&0x08)?'G':'g', (bug_ledg&0x04)?'G':'g', - (bug_ledg&0x02)?'G':'g', (bug_ledg&0x01)?'G':'g', - (bug_ledr&0x80)?'R':'r', (bug_ledr&0x40)?'R':'r', - (bug_ledr&0x20)?'R':'r', (bug_ledr&0x10)?'R':'r', - (bug_ledr&0x08)?'R':'r', (bug_ledr&0x04)?'R':'r', - (bug_ledr&0x02)?'R':'r', (bug_ledr&0x01)?'R':'r'); + bug_seg2, bug_seg1, + (bug_ledg & 0x80) ? 'G' : 'g', (bug_ledg & 0x40) ? 'G' : 'g', + (bug_ledg & 0x20) ? 'G' : 'g', (bug_ledg & 0x10) ? 'G' : 'g', + (bug_ledg & 0x08) ? 'G' : 'g', (bug_ledg & 0x04) ? 'G' : 'g', + (bug_ledg & 0x02) ? 'G' : 'g', (bug_ledg & 0x01) ? 'G' : 'g', + (bug_ledr & 0x80) ? 'R' : 'r', (bug_ledr & 0x40) ? 'R' : 'r', + (bug_ledr & 0x20) ? 'R' : 'r', (bug_ledr & 0x10) ? 'R' : 'r', + (bug_ledr & 0x08) ? 'R' : 'r', (bug_ledr & 0x04) ? 'R' : 'r', + (bug_ledr & 0x02) ? 'R' : 'r', (bug_ledr & 0x01) ? 'R' : 'r'); /* Send formatted string to the UI. */ ui_sb_bugui(bug_str); } - /* Flush the serial port. */ static void bug_spflsh(void) @@ -141,7 +134,6 @@ bug_spflsh(void) bug_bptr = bug_buff; } - /* Handle a write to the Serial Port Data register. */ static void bug_wsport(uint8_t val) @@ -152,9 +144,9 @@ bug_wsport(uint8_t val) bug_ctrl &= ~CTRL_SPORT; /* Delay while processing byte.. */ - if (bug_bptr == &bug_buff[FIFO_LEN-1]) { - /* Buffer full, gotta flush. */ - bug_spflsh(); + if (bug_bptr == &bug_buff[FIFO_LEN - 1]) { + /* Buffer full, gotta flush. */ + bug_spflsh(); } /* Write (store) the byte. */ @@ -166,7 +158,6 @@ bug_wsport(uint8_t val) bugger_log("BUGGER- sport %02x\n", val); } - /* Handle a write to the Serial Port Configuration register. */ static void bug_wspcfg(uint8_t val) @@ -176,50 +167,48 @@ bug_wspcfg(uint8_t val) bugger_log("BUGGER- spcfg %02x\n", bug_spcfg); } - /* Handle a write to the control register. */ static void bug_wctrl(uint8_t val) { if (val == CTRL_RESET) { - /* User wants us to reset. */ - bug_ctrl = CTRL_INIT; - bug_spcfg = 0x00; - bug_bptr = NULL; + /* User wants us to reset. */ + bug_ctrl = CTRL_INIT; + bug_spcfg = 0x00; + bug_bptr = NULL; } else { - /* If turning off the serial port, flush it. */ - if ((bug_ctrl & CTRL_SPORT) && !(val & CTRL_SPORT)) - bug_spflsh(); + /* If turning off the serial port, flush it. */ + if ((bug_ctrl & CTRL_SPORT) && !(val & CTRL_SPORT)) + bug_spflsh(); - /* FIXME: did they do this using an XOR of operation bits? --FvK */ + /* FIXME: did they do this using an XOR of operation bits? --FvK */ - if (val & CTRL_SPCFG) { - /* User wants to configure the serial port. */ - bug_ctrl &= ~(CTRL_SPORT|CTRL_SEG2|CTRL_SEG1|CTRL_GLED); - bug_ctrl |= CTRL_SPCFG; - } else if (val & CTRL_SPORT) { - /* User wants to talk to the serial port. */ - bug_ctrl &= ~(CTRL_SPCFG|CTRL_SEG2|CTRL_SEG1|CTRL_GLED); - bug_ctrl |= CTRL_SPORT; - if (bug_bptr == NULL) - bug_bptr = bug_buff; - } else if (val & CTRL_SEG2) { - /* User selected SEG2 (LEFT, Plus only) for output. */ - bug_ctrl &= ~(CTRL_SPCFG|CTRL_SPORT|CTRL_SEG1|CTRL_GLED); - bug_ctrl |= CTRL_SEG2; - } else if (val & CTRL_SEG1) { - /* User selected SEG1 (RIGHT) for output. */ - bug_ctrl &= ~(CTRL_SPCFG|CTRL_SPORT|CTRL_SEG2|CTRL_GLED); - bug_ctrl |= CTRL_SEG1; - } else if (val & CTRL_GLED) { - /* User selected the GREEN LEDs for output. */ - bug_ctrl &= ~(CTRL_SPCFG|CTRL_SPORT|CTRL_SEG2|CTRL_SEG1); - bug_ctrl |= CTRL_GLED; - } else { - /* User selected the RED LEDs for output. */ - bug_ctrl &= - ~(CTRL_SPCFG|CTRL_SPORT|CTRL_SEG2|CTRL_SEG1|CTRL_GLED); - } + if (val & CTRL_SPCFG) { + /* User wants to configure the serial port. */ + bug_ctrl &= ~(CTRL_SPORT | CTRL_SEG2 | CTRL_SEG1 | CTRL_GLED); + bug_ctrl |= CTRL_SPCFG; + } else if (val & CTRL_SPORT) { + /* User wants to talk to the serial port. */ + bug_ctrl &= ~(CTRL_SPCFG | CTRL_SEG2 | CTRL_SEG1 | CTRL_GLED); + bug_ctrl |= CTRL_SPORT; + if (bug_bptr == NULL) + bug_bptr = bug_buff; + } else if (val & CTRL_SEG2) { + /* User selected SEG2 (LEFT, Plus only) for output. */ + bug_ctrl &= ~(CTRL_SPCFG | CTRL_SPORT | CTRL_SEG1 | CTRL_GLED); + bug_ctrl |= CTRL_SEG2; + } else if (val & CTRL_SEG1) { + /* User selected SEG1 (RIGHT) for output. */ + bug_ctrl &= ~(CTRL_SPCFG | CTRL_SPORT | CTRL_SEG2 | CTRL_GLED); + bug_ctrl |= CTRL_SEG1; + } else if (val & CTRL_GLED) { + /* User selected the GREEN LEDs for output. */ + bug_ctrl &= ~(CTRL_SPCFG | CTRL_SPORT | CTRL_SEG2 | CTRL_SEG1); + bug_ctrl |= CTRL_GLED; + } else { + /* User selected the RED LEDs for output. */ + bug_ctrl &= ~(CTRL_SPCFG | CTRL_SPORT | CTRL_SEG2 | CTRL_SEG1 | CTRL_GLED); + } } /* Update the UI with active settings. */ @@ -227,7 +216,6 @@ bug_wctrl(uint8_t val) bug_setui(); } - /* Handle a write to the data register. */ static void bug_wdata(uint8_t val) @@ -235,27 +223,26 @@ bug_wdata(uint8_t val) bug_data = val; if (bug_ctrl & CTRL_SPCFG) - bug_wspcfg(val); - else if (bug_ctrl & CTRL_SPORT) - bug_wsport(val); - else { - if (bug_ctrl & CTRL_SEG2) - bug_seg2 = val; - else if (bug_ctrl & CTRL_SEG1) - bug_seg1 = val; - else if (bug_ctrl & CTRL_GLED) - bug_ledg = val; - else - bug_ledr = val; + bug_wspcfg(val); + else if (bug_ctrl & CTRL_SPORT) + bug_wsport(val); + else { + if (bug_ctrl & CTRL_SEG2) + bug_seg2 = val; + else if (bug_ctrl & CTRL_SEG1) + bug_seg1 = val; + else if (bug_ctrl & CTRL_GLED) + bug_ledg = val; + else + bug_ledr = val; - bugger_log("BUGGER- data %02x\n", bug_data); + bugger_log("BUGGER- data %02x\n", bug_data); } /* Update the UI with active settings. */ bug_setui(); } - /* Reset the ISA BusBugger controller. */ static void bug_reset(void) @@ -264,71 +251,70 @@ bug_reset(void) bug_data = 0x00; /* Clear the RED and GREEN LEDs. */ - bug_ledr = 0x00; bug_ledg = 0x00; + bug_ledr = 0x00; + bug_ledg = 0x00; /* Clear both 7SEG displays. */ - bug_seg1 = 0x00; bug_seg2 = 0x00; + bug_seg1 = 0x00; + bug_seg2 = 0x00; /* Reset the control register (updates UI.) */ bug_wctrl(CTRL_RESET); } - /* Handle a WRITE operation to one of our registers. */ static void bug_write(uint16_t port, uint8_t val, void *priv) { - switch (port-BUGGER_ADDR) { - case BUG_CTRL: /* control register */ - if (val == CTRL_RESET) { - /* Perform a full reset. */ - bug_reset(); - } else if (bug_ctrl & CTRL_INIT) { - /* Only allow writes if initialized. */ - bug_wctrl(val); - } - break; - - case BUG_DATA: /* data register */ - if (bug_ctrl & CTRL_INIT) { - bug_wdata(val); - } - break; + switch (port - BUGGER_ADDR) { + case BUG_CTRL: /* control register */ + if (val == CTRL_RESET) { + /* Perform a full reset. */ + bug_reset(); + } else if (bug_ctrl & CTRL_INIT) { + /* Only allow writes if initialized. */ + bug_wctrl(val); + } + break; + case BUG_DATA: /* data register */ + if (bug_ctrl & CTRL_INIT) { + bug_wdata(val); + } + break; } } - /* Handle a READ operation from one of our registers. */ static uint8_t bug_read(uint16_t port, void *priv) { uint8_t ret = 0xff; - if (bug_ctrl & CTRL_INIT) switch (port-BUGGER_ADDR) { - case BUG_CTRL: /* control register */ - ret = bug_ctrl; - break; + if (bug_ctrl & CTRL_INIT) + switch (port - BUGGER_ADDR) { + case BUG_CTRL: /* control register */ + ret = bug_ctrl; + break; - case BUG_DATA: /* data register */ - if (bug_ctrl & CTRL_SPCFG) { - ret = bug_spcfg; - } else if (bug_ctrl & CTRL_SPORT) { - ret = 0x00; /* input not supported */ - } else { - /* Just read the DIP switch. */ - ret = bug_data; - } - break; + case BUG_DATA: /* data register */ + if (bug_ctrl & CTRL_SPCFG) { + ret = bug_spcfg; + } else if (bug_ctrl & CTRL_SPORT) { + ret = 0x00; /* input not supported */ + } else { + /* Just read the DIP switch. */ + ret = bug_data; + } + break; - default: - break; - } + default: + break; + } - return(ret); + return (ret); } - /* Initialize the ISA BusBugger emulator. */ static void * bug_init(const device_t *info) @@ -339,31 +325,30 @@ bug_init(const device_t *info) bug_reset(); io_sethandler(BUGGER_ADDR, BUGGER_ADDRLEN, - bug_read, NULL, NULL, bug_write, NULL, NULL, NULL); + bug_read, NULL, NULL, bug_write, NULL, NULL, NULL); /* Just so its not NULL. */ - return(&bug_ctrl); + return (&bug_ctrl); } - /* Remove the ISA BusBugger emulator from the system. */ static void bug_close(UNUSED(void *priv)) { io_removehandler(BUGGER_ADDR, BUGGER_ADDRLEN, - bug_read, NULL, NULL, bug_write, NULL, NULL, NULL); + bug_read, NULL, NULL, bug_write, NULL, NULL, NULL); } const device_t bugger_device = { - .name = "ISA/PCI Bus Bugger", + .name = "ISA/PCI Bus Bugger", .internal_name = "bugger", - .flags = DEVICE_ISA | DEVICE_AT, - .local = 0, - .init = bug_init, - .close = bug_close, - .reset = NULL, + .flags = DEVICE_ISA | DEVICE_AT, + .local = 0, + .init = bug_init, + .close = bug_close, + .reset = NULL, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; diff --git a/src/device/cartridge.c b/src/device/cartridge.c index c4bd69cc2..ea043e0f4 100644 --- a/src/device/cartridge.c +++ b/src/device/cartridge.c @@ -29,43 +29,36 @@ #include <86box/machine.h> #include <86box/cartridge.h> - typedef struct { - uint8_t * buf; - uint32_t base; + uint8_t *buf; + uint32_t base; } cart_t; +char cart_fns[2][512]; -char cart_fns[2][512]; - - -static cart_t carts[2]; - -static mem_mapping_t cart_mappings[2]; +static cart_t carts[2]; +static mem_mapping_t cart_mappings[2]; #ifdef ENABLE_CARTRIDGE_LOG int cartridge_do_log = ENABLE_CARTRIDGE_LOG; - static void cartridge_log(const char *fmt, ...) { - va_list ap; + va_list ap; - if (cartridge_do_log) - { - va_start(ap, fmt); - pclog_ex(fmt, ap); - va_end(ap); - } + if (cartridge_do_log) { + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); + } } #else -#define cartridge_log(fmt, ...) +# define cartridge_log(fmt, ...) #endif - static uint8_t cart_read(uint32_t addr, void *priv) { @@ -74,22 +67,20 @@ cart_read(uint32_t addr, void *priv) return dev->buf[addr - dev->base]; } - static void cart_load_error(int drive, char *fn) { - cartridge_log("Cartridge: could not load '%s'\n",fn); + cartridge_log("Cartridge: could not load '%s'\n", fn); memset(cart_fns[drive], 0, sizeof(cart_fns[drive])); ui_sb_update_icon_state(SB_CARTRIDGE | drive, 1); } - static void cart_image_close(int drive) { if (carts[drive].buf != NULL) { - free(carts[drive].buf); - carts[drive].buf = NULL; + free(carts[drive].buf); + carts[drive].buf = NULL; } carts[drive].base = 0x00000000; @@ -97,11 +88,10 @@ cart_image_close(int drive) mem_mapping_disable(&cart_mappings[drive]); } - static void cart_image_load(int drive, char *fn) { - FILE *f; + FILE *f; uint32_t size; uint32_t base = 0x00000000; @@ -109,32 +99,32 @@ cart_image_load(int drive, char *fn) f = fopen(fn, "rb"); if (fseek(f, 0, SEEK_END) == -1) - fatal("cart_image_load(): Error seeking to the end of the file\n"); + fatal("cart_image_load(): Error seeking to the end of the file\n"); size = ftell(f); if (size < 0x1200) { - cartridge_log("cart_image_load(): File size %i is too small\n", size); - cart_load_error(drive, fn); - return; + cartridge_log("cart_image_load(): File size %i is too small\n", size); + cart_load_error(drive, fn); + return; } if (size & 0x00000fff) { - size -= 0x00000200; - fseek(f, 0x000001ce, SEEK_SET); - (void) !fread(&base, 1, 2, f); - base <<= 4; - fseek(f, 0x00000200, SEEK_SET); - carts[drive].buf = (uint8_t *) malloc(size); - memset(carts[drive].buf, 0x00, size); - (void) !fread(carts[drive].buf, 1, size, f); - fclose(f); + size -= 0x00000200; + fseek(f, 0x000001ce, SEEK_SET); + (void) !fread(&base, 1, 2, f); + base <<= 4; + fseek(f, 0x00000200, SEEK_SET); + carts[drive].buf = (uint8_t *) malloc(size); + memset(carts[drive].buf, 0x00, size); + (void) !fread(carts[drive].buf, 1, size, f); + fclose(f); } else { - base = drive ? 0xe0000 : 0xd0000; - if (size == 32768) - base += 0x8000; - fseek(f, 0x00000000, SEEK_SET); - carts[drive].buf = (uint8_t *) malloc(size); - memset(carts[drive].buf, 0x00, size); - (void) !fread(carts[drive].buf, 1, size, f); - fclose(f); + base = drive ? 0xe0000 : 0xd0000; + if (size == 32768) + base += 0x8000; + fseek(f, 0x00000000, SEEK_SET); + carts[drive].buf = (uint8_t *) malloc(size); + memset(carts[drive].buf, 0x00, size); + (void) !fread(carts[drive].buf, 1, size, f); + fclose(f); } cartridge_log("cart_image_load(): %s at %08X-%08X\n", fn, base, base + size - 1); @@ -144,7 +134,6 @@ cart_image_load(int drive, char *fn) mem_mapping_set_p(&cart_mappings[drive], &(carts[drive])); } - static void cart_load_common(int drive, char *fn, uint8_t hard_reset) { @@ -153,28 +142,26 @@ cart_load_common(int drive, char *fn, uint8_t hard_reset) cartridge_log("Cartridge: loading drive %d with '%s'\n", drive, fn); if (!fn) - return; + return; f = plat_fopen(fn, "rb"); if (f) { - fclose(f); - strcpy(cart_fns[drive], fn); - cart_image_load(drive, cart_fns[drive]); - /* On the real PCjr, inserting a cartridge causes a reset - in order to boot from the cartridge. */ - if (!hard_reset) - resetx86(); + fclose(f); + strcpy(cart_fns[drive], fn); + cart_image_load(drive, cart_fns[drive]); + /* On the real PCjr, inserting a cartridge causes a reset + in order to boot from the cartridge. */ + if (!hard_reset) + resetx86(); } else - cart_load_error(drive, fn); + cart_load_error(drive, fn); } - void cart_load(int drive, char *fn) { cart_load_common(drive, fn, 0); } - void cart_close(int drive) { @@ -185,7 +172,6 @@ cart_close(int drive) ui_sb_update_icon_state(SB_CARTRIDGE | drive, 1); } - void cart_reset(void) { @@ -195,14 +181,14 @@ cart_reset(void) cart_image_close(0); if (!machine_has_cartridge(machine)) - return; + return; for (i = 0; i < 2; i++) { - mem_mapping_add(&cart_mappings[i], 0x000d0000, 0x00002000, - cart_read,NULL,NULL, - NULL,NULL,NULL, - NULL, MEM_MAPPING_EXTERNAL, NULL); - mem_mapping_disable(&cart_mappings[i]); + mem_mapping_add(&cart_mappings[i], 0x000d0000, 0x00002000, + cart_read, NULL, NULL, + NULL, NULL, NULL, + NULL, MEM_MAPPING_EXTERNAL, NULL); + mem_mapping_disable(&cart_mappings[i]); } cart_load_common(0, cart_fns[0], 1); diff --git a/src/device/cassette.c b/src/device/cassette.c index 211909dcb..8d8f15c80 100644 --- a/src/device/cassette.c +++ b/src/device/cassette.c @@ -19,7 +19,6 @@ * Public License for more details. * *****************************************************************************/ - #include #include #include @@ -40,689 +39,691 @@ // #include - #define CAS_CLK 1193182 +pc_cassette_t *cassette; -pc_cassette_t * cassette; +char cassette_fname[512]; +char cassette_mode[512]; +unsigned long cassette_pos, cassette_srate; +int cassette_enable; +int cassette_append, cassette_pcm; +int cassette_ui_writeprot; -char cassette_fname[512]; -char cassette_mode[512]; -unsigned long cassette_pos, cassette_srate; -int cassette_enable; -int cassette_append, cassette_pcm; -int cassette_ui_writeprot; - - -static int cassette_cycles = -1; - - -static void pc_cas_reset (pc_cassette_t *cas); +static int cassette_cycles = -1; +static void pc_cas_reset(pc_cassette_t *cas); #ifdef ENABLE_CASSETTE_LOG int cassette_do_log = ENABLE_CASSETTE_LOG; - static void cassette_log(const char *fmt, ...) { - va_list ap; + va_list ap; - if (cassette_do_log) - { - va_start(ap, fmt); - pclog_ex(fmt, ap); - va_end(ap); - } + if (cassette_do_log) { + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); + } } #else -#define cassette_log(fmt, ...) +# define cassette_log(fmt, ...) #endif - -void pc_cas_init (pc_cassette_t *cas) +void +pc_cas_init(pc_cassette_t *cas) { - cas->save = 0; - cas->pcm = 0; + cas->save = 0; + cas->pcm = 0; - cas->motor = 0; - ui_sb_update_icon(SB_CASSETTE, 0); + cas->motor = 0; + ui_sb_update_icon(SB_CASSETTE, 0); - cas->position = 0; + cas->position = 0; - cas->position_save = 0; - cas->position_load = 0; + cas->position_save = 0; + cas->position_load = 0; - cas->data_out = 0; - cas->data_inp = 0; + cas->data_out = 0; + cas->data_inp = 0; - cas->pcm_out_vol = 64; - cas->pcm_out_val = 0; + cas->pcm_out_vol = 64; + cas->pcm_out_val = 0; - cas->cas_out_cnt = 0; - cas->cas_out_buf = 0; + cas->cas_out_cnt = 0; + cas->cas_out_buf = 0; - cas->cas_inp_cnt = 0; - cas->cas_inp_buf = 0; - cas->cas_inp_bit = 0; + cas->cas_inp_cnt = 0; + cas->cas_inp_buf = 0; + cas->cas_inp_bit = 0; - cas->clk = 0; + cas->clk = 0; - cas->clk_pcm = 0; + cas->clk_pcm = 0; - cas->clk_out = 0; - cas->clk_inp = 0; + cas->clk_out = 0; + cas->clk_inp = 0; - cas->srate = 44100; + cas->srate = 44100; - cas->close = 0; - cas->fname = NULL; - cas->fp = NULL; + cas->close = 0; + cas->fname = NULL; + cas->fp = NULL; - pc_cas_reset (cas); + pc_cas_reset(cas); } -void pc_cas_free (pc_cassette_t *cas) +void +pc_cas_free(pc_cassette_t *cas) { - free (cas->fname); + free(cas->fname); - if (cas->close) { - fclose (cas->fp); - } + if (cas->close) { + fclose(cas->fp); + } } -pc_cassette_t *pc_cas_new (void) +pc_cassette_t * +pc_cas_new(void) { - pc_cassette_t *cas; + pc_cassette_t *cas; - cas = malloc (sizeof (pc_cassette_t)); + cas = malloc(sizeof(pc_cassette_t)); - if (cas == NULL) { - return (NULL); - } + if (cas == NULL) { + return (NULL); + } - pc_cas_init (cas); + pc_cas_init(cas); - return (cas); + return (cas); } -void pc_cas_del (pc_cassette_t *cas) +void +pc_cas_del(pc_cassette_t *cas) { - if (cas != NULL) { - pc_cas_free (cas); - free (cas); - } + if (cas != NULL) { + pc_cas_free(cas); + free(cas); + } } -int pc_cas_set_fname (pc_cassette_t *cas, const char *fname) +int +pc_cas_set_fname(pc_cassette_t *cas, const char *fname) { - unsigned n; - const char * ext; + unsigned n; + const char *ext; - if (cas->close) - fclose (cas->fp); + if (cas->close) + fclose(cas->fp); - cas->close = 0; - cas->fp = NULL; + cas->close = 0; + cas->fp = NULL; - free (cas->fname); - cas->fname = NULL; + free(cas->fname); + cas->fname = NULL; - cas->position = 0; + cas->position = 0; - cas->position_save = 0; - cas->position_load = 0; + cas->position_save = 0; + cas->position_load = 0; - if (fname == NULL) { - ui_sb_update_icon_state(SB_CASSETTE, 1); - return (0); - } + if (fname == NULL) { + ui_sb_update_icon_state(SB_CASSETTE, 1); + return (0); + } - cas->fp = plat_fopen (fname, "r+b"); + cas->fp = plat_fopen(fname, "r+b"); - if (cas->fp == NULL) - cas->fp = plat_fopen (fname, "w+b"); + if (cas->fp == NULL) + cas->fp = plat_fopen(fname, "w+b"); - if (cas->fp == NULL) { - ui_sb_update_icon_state(SB_CASSETTE, 1); - return (1); - } + if (cas->fp == NULL) { + ui_sb_update_icon_state(SB_CASSETTE, 1); + return (1); + } - cas->close = 1; + cas->close = 1; - pc_cas_append (cas); + pc_cas_append(cas); - cas->position_save = cas->position; + cas->position_save = cas->position; - if (cas->save == 0) - pc_cas_set_position (cas, 0); + if (cas->save == 0) + pc_cas_set_position(cas, 0); - n = strlen (fname); + n = strlen(fname); - cas->fname = malloc ((n + 1) * sizeof(char)); + cas->fname = malloc((n + 1) * sizeof(char)); - if (cas->fname != NULL) - memcpy (cas->fname, fname, (n + 1) * sizeof(char)); + if (cas->fname != NULL) + memcpy(cas->fname, fname, (n + 1) * sizeof(char)); - if (n > 4) { - ext = fname + (n - 4); + if (n > 4) { + ext = fname + (n - 4); - /* Has to be 44.1 kHz, mono, 8-bit. */ - if (stricmp (ext, ".pcm") == 0) - pc_cas_set_pcm (cas, 1); - else if (stricmp (ext, ".raw") == 0) - pc_cas_set_pcm (cas, 1); - else if (stricmp (ext, ".wav") == 0) - pc_cas_set_pcm (cas, 1); - else if (stricmp (ext, ".cas") == 0) - pc_cas_set_pcm (cas, 0); - } + /* Has to be 44.1 kHz, mono, 8-bit. */ + if (stricmp(ext, ".pcm") == 0) + pc_cas_set_pcm(cas, 1); + else if (stricmp(ext, ".raw") == 0) + pc_cas_set_pcm(cas, 1); + else if (stricmp(ext, ".wav") == 0) + pc_cas_set_pcm(cas, 1); + else if (stricmp(ext, ".cas") == 0) + pc_cas_set_pcm(cas, 0); + } - return (0); + return (0); } -static -void pc_cas_reset (pc_cassette_t *cas) +static void +pc_cas_reset(pc_cassette_t *cas) { - unsigned i; + unsigned i; - cas->clk_pcm = 0; + cas->clk_pcm = 0; - cas->clk_out = cas->clk; - cas->clk_inp = 0; + cas->clk_out = cas->clk; + cas->clk_inp = 0; - cas->pcm_out_val = 0; + cas->pcm_out_val = 0; - cas->cas_out_cnt = 0; - cas->cas_out_buf = 0; + cas->cas_out_cnt = 0; + cas->cas_out_buf = 0; - cas->cas_inp_cnt = 0; - cas->cas_inp_buf = 0; - cas->cas_inp_bit = 0; + cas->cas_inp_cnt = 0; + cas->cas_inp_buf = 0; + cas->cas_inp_bit = 0; - for (i = 0; i < 3; i++) { - cas->pcm_inp_fir[i] = 0; - } + for (i = 0; i < 3; i++) { + cas->pcm_inp_fir[i] = 0; + } } -int pc_cas_get_mode (const pc_cassette_t *cas) +int +pc_cas_get_mode(const pc_cassette_t *cas) { - return (cas->save); + return (cas->save); } -void pc_cas_set_mode (pc_cassette_t *cas, int save) +void +pc_cas_set_mode(pc_cassette_t *cas, int save) { - save = (save != 0); + save = (save != 0); - if (cas->save == save) { - return; - } + if (cas->save == save) { + return; + } - if (cas->save) { - cas->position_save = cas->position; - cas->position = cas->position_load; - } - else { - cas->position_load = cas->position; - cas->position = cas->position_save; - } + if (cas->save) { + cas->position_save = cas->position; + cas->position = cas->position_load; + } else { + cas->position_load = cas->position; + cas->position = cas->position_save; + } - cas->save = save; + cas->save = save; - memset(cassette_mode, 0x00, sizeof(cassette_mode)); - if (save) - memcpy(cassette_mode, "save", strlen("save") + 1); - else - memcpy(cassette_mode, "load", strlen("load") + 1); + memset(cassette_mode, 0x00, sizeof(cassette_mode)); + if (save) + memcpy(cassette_mode, "save", strlen("save") + 1); + else + memcpy(cassette_mode, "load", strlen("load") + 1); - if (cas->fp != NULL) { - fflush (cas->fp); + if (cas->fp != NULL) { + fflush(cas->fp); - pc_cas_set_position (cas, cas->position); - } + pc_cas_set_position(cas, cas->position); + } - pc_cas_reset (cas); + pc_cas_reset(cas); } -int pc_cas_get_pcm (const pc_cassette_t *cas) +int +pc_cas_get_pcm(const pc_cassette_t *cas) { - return (cas->pcm); + return (cas->pcm); } -void pc_cas_set_pcm (pc_cassette_t *cas, int pcm) +void +pc_cas_set_pcm(pc_cassette_t *cas, int pcm) { - cas->pcm = (pcm != 0); + cas->pcm = (pcm != 0); - cassette_pcm = (pcm != 0); + cassette_pcm = (pcm != 0); - pc_cas_reset (cas); + pc_cas_reset(cas); } -unsigned long pc_cas_get_srate (const pc_cassette_t *cas) +unsigned long +pc_cas_get_srate(const pc_cassette_t *cas) { - return (cas->srate); + return (cas->srate); } -void pc_cas_set_srate (pc_cassette_t *cas, unsigned long srate) +void +pc_cas_set_srate(pc_cassette_t *cas, unsigned long srate) { - cas->srate = srate; + cas->srate = srate; - pc_cas_reset (cas); + pc_cas_reset(cas); } -void pc_cas_rewind (pc_cassette_t *cas) +void +pc_cas_rewind(pc_cassette_t *cas) { - if (cas->fp != NULL) { - rewind (cas->fp); - cas->position = 0; - } + if (cas->fp != NULL) { + rewind(cas->fp); + cas->position = 0; + } - pc_cas_reset (cas); + pc_cas_reset(cas); } -void pc_cas_append (pc_cassette_t *cas) +void +pc_cas_append(pc_cassette_t *cas) { - if (cas->fp != NULL) { - fseek (cas->fp, 0, SEEK_END); - cas->position = ftell (cas->fp); - } + if (cas->fp != NULL) { + fseek(cas->fp, 0, SEEK_END); + cas->position = ftell(cas->fp); + } - pc_cas_reset (cas); + pc_cas_reset(cas); } -unsigned long pc_cas_get_position (const pc_cassette_t *cas) +unsigned long +pc_cas_get_position(const pc_cassette_t *cas) { - return (cas->position); + return (cas->position); } -int pc_cas_set_position (pc_cassette_t *cas, unsigned long pos) +int +pc_cas_set_position(pc_cassette_t *cas, unsigned long pos) { - if (cas->fp == NULL) { - return (1); - } + if (cas->fp == NULL) { + return (1); + } - if (fseek (cas->fp, pos, SEEK_SET) != 0) { - return (1); - } + if (fseek(cas->fp, pos, SEEK_SET) != 0) { + return (1); + } - cas->position = pos; + cas->position = pos; - pc_cas_reset (cas); + pc_cas_reset(cas); - return (0); + return (0); } -static -void pc_cas_read_bit (pc_cassette_t *cas) +static void +pc_cas_read_bit(pc_cassette_t *cas) { - int val; + int val; - if (cas->cas_inp_cnt == 0) { - if (cas->fp == NULL) { - return; - } + if (cas->cas_inp_cnt == 0) { + if (cas->fp == NULL) { + return; + } - if (feof (cas->fp)) { - return; - } + if (feof(cas->fp)) { + return; + } - val = fgetc (cas->fp); + val = fgetc(cas->fp); - if (val == EOF) { - cassette_log ("cassette EOF at %lu\n", cas->position); - return; - } + if (val == EOF) { + cassette_log("cassette EOF at %lu\n", cas->position); + return; + } - cas->position += 1; + cas->position += 1; - cas->cas_inp_cnt = 8; - cas->cas_inp_buf = val; - } + cas->cas_inp_cnt = 8; + cas->cas_inp_buf = val; + } - cas->cas_inp_bit = ((cas->cas_inp_buf & 0x80) != 0); + cas->cas_inp_bit = ((cas->cas_inp_buf & 0x80) != 0); - cas->cas_inp_buf = (cas->cas_inp_buf << 1) & 0xff; - cas->cas_inp_cnt -= 1; + cas->cas_inp_buf = (cas->cas_inp_buf << 1) & 0xff; + cas->cas_inp_cnt -= 1; } -static -int pc_cas_read_smp (pc_cassette_t *cas) +static int +pc_cas_read_smp(pc_cassette_t *cas) { - int smp, *fir; + int smp, *fir; - if (feof (cas->fp)) { - return (0); - } + if (feof(cas->fp)) { + return (0); + } - smp = fgetc (cas->fp); + smp = fgetc(cas->fp); - if (smp == EOF) { - cassette_log ("cassette EOF at %lu\n", cas->position); - return (0); - } + if (smp == EOF) { + cassette_log("cassette EOF at %lu\n", cas->position); + return (0); + } - cas->position += 1; + cas->position += 1; - fir = cas->pcm_inp_fir; + fir = cas->pcm_inp_fir; - fir[0] = fir[1]; - fir[1] = fir[2]; - fir[2] = (smp & 0x80) ? (smp - 256) : smp; + fir[0] = fir[1]; + fir[1] = fir[2]; + fir[2] = (smp & 0x80) ? (smp - 256) : smp; - smp = (fir[0] + 2 * fir[1] + fir[2]) / 4; + smp = (fir[0] + 2 * fir[1] + fir[2]) / 4; - return (smp); + return (smp); } -static -void pc_cas_write_bit (pc_cassette_t *cas, unsigned char val) +static void +pc_cas_write_bit(pc_cassette_t *cas, unsigned char val) { - if (val && !cassette_ui_writeprot) { - cas->cas_out_buf |= (0x80 >> cas->cas_out_cnt); - } + if (val && !cassette_ui_writeprot) { + cas->cas_out_buf |= (0x80 >> cas->cas_out_cnt); + } - cas->cas_out_cnt += 1; + cas->cas_out_cnt += 1; - if (cas->cas_out_cnt >= 8) { - if (cas->fp != NULL) { - if (!cassette_ui_writeprot) - fputc (cas->cas_out_buf, cas->fp); - cas->position += 1; - } + if (cas->cas_out_cnt >= 8) { + if (cas->fp != NULL) { + if (!cassette_ui_writeprot) + fputc(cas->cas_out_buf, cas->fp); + cas->position += 1; + } - cas->cas_out_buf = 0; - cas->cas_out_cnt = 0; - } + cas->cas_out_buf = 0; + cas->cas_out_cnt = 0; + } } -static -void pc_cas_write_smp (pc_cassette_t *cas, int val) +static void +pc_cas_write_smp(pc_cassette_t *cas, int val) { - unsigned char smp; + unsigned char smp; - if (val < 0) { - smp = (val < -127) ? 0x80 : (val + 256); - } - else { - smp = (val > 127) ? 0x7f : val; - } + if (val < 0) { + smp = (val < -127) ? 0x80 : (val + 256); + } else { + smp = (val > 127) ? 0x7f : val; + } - if (!cassette_ui_writeprot) - fputc (smp, cas->fp); + if (!cassette_ui_writeprot) + fputc(smp, cas->fp); - cas->position += 1; + cas->position += 1; } -void pc_cas_set_motor (pc_cassette_t *cas, unsigned char val) +void +pc_cas_set_motor(pc_cassette_t *cas, unsigned char val) { - unsigned i; + unsigned i; - val = (val != 0); + val = (val != 0); - if (val == cas->motor) { - return; - } + if (val == cas->motor) { + return; + } - if ((val == 0) && cas->save && cas->pcm) { - for (i = 0; i < (cas->srate / 16); i++) { - pc_cas_write_smp (cas, 0); - } - } + if ((val == 0) && cas->save && cas->pcm) { + for (i = 0; i < (cas->srate / 16); i++) { + pc_cas_write_smp(cas, 0); + } + } - cassette_log ("cassette %S at %lu motor %s\n", (cas->fname != NULL) ? cas->fname : "", cas->position, val ? "on" : "off"); + cassette_log("cassette %S at %lu motor %s\n", (cas->fname != NULL) ? cas->fname : "", cas->position, val ? "on" : "off"); - cas->motor = val; + cas->motor = val; - if (cas->fp != NULL) { - fflush (cas->fp); + if (cas->fp != NULL) { + fflush(cas->fp); - pc_cas_set_position (cas, cas->position); - } + pc_cas_set_position(cas, cas->position); + } - pc_cas_reset (cas); + pc_cas_reset(cas); - if (cas->motor) - timer_set_delay_u64(&cas->timer, 8ULL * PITCONST); - else - timer_disable(&cas->timer); + if (cas->motor) + timer_set_delay_u64(&cas->timer, 8ULL * PITCONST); + else + timer_disable(&cas->timer); - ui_sb_update_icon(SB_CASSETTE, !!val); + ui_sb_update_icon(SB_CASSETTE, !!val); } -unsigned char pc_cas_get_inp (const pc_cassette_t *cas) +unsigned char +pc_cas_get_inp(const pc_cassette_t *cas) { - return (cas->data_inp); + return (cas->data_inp); } -void pc_cas_set_out (pc_cassette_t *cas, unsigned char val) +void +pc_cas_set_out(pc_cassette_t *cas, unsigned char val) { - unsigned long clk; + unsigned long clk; - val = (val != 0); + val = (val != 0); - if (cas->motor == 0) { - cas->data_inp = val; - return; - } + if (cas->motor == 0) { + cas->data_inp = val; + return; + } - if (cas->data_out == val) { - return; - } + if (cas->data_out == val) { + return; + } - cas->data_out = val; + cas->data_out = val; - if (cas->pcm) { - cas->pcm_out_val = val ? -cas->pcm_out_vol : cas->pcm_out_vol; - return; - } + if (cas->pcm) { + cas->pcm_out_val = val ? -cas->pcm_out_vol : cas->pcm_out_vol; + return; + } - if (cas->save == 0) { - return; - } + if (cas->save == 0) { + return; + } - if (val == 0) { - return; - } + if (val == 0) { + return; + } - clk = cas->clk - cas->clk_out; - cas->clk_out = cas->clk; + clk = cas->clk - cas->clk_out; + cas->clk_out = cas->clk; - if (clk < (CAS_CLK / 4000)) { - ; - } - else if (clk < ((3 * CAS_CLK) / 4000)) { - pc_cas_write_bit (cas, 0); - } - else if (clk < ((5 * CAS_CLK) / 4000)) { - pc_cas_write_bit (cas, 1); - } + if (clk < (CAS_CLK / 4000)) { + ; + } else if (clk < ((3 * CAS_CLK) / 4000)) { + pc_cas_write_bit(cas, 0); + } else if (clk < ((5 * CAS_CLK) / 4000)) { + pc_cas_write_bit(cas, 1); + } } -void pc_cas_print_state (const pc_cassette_t *cas) +void +pc_cas_print_state(const pc_cassette_t *cas) { - cassette_log ("%s %s %lu %s %lu\n", (cas->fname != NULL) ? cas->fname : "", cas->pcm ? "pcm" : "cas", cas->srate, cas->save ? "save" : "load", cas->position); + cassette_log("%s %s %lu %s %lu\n", (cas->fname != NULL) ? cas->fname : "", cas->pcm ? "pcm" : "cas", cas->srate, cas->save ? "save" : "load", cas->position); } -static -void pc_cas_clock_pcm (pc_cassette_t *cas, unsigned long cnt) +static void +pc_cas_clock_pcm(pc_cassette_t *cas, unsigned long cnt) { - unsigned long i, n; - int v = 0; + unsigned long i, n; + int v = 0; - n = cas->srate * cnt + cas->clk_pcm; + n = cas->srate * cnt + cas->clk_pcm; - cas->clk_pcm = n % CAS_CLK; + cas->clk_pcm = n % CAS_CLK; - n = n / CAS_CLK; + n = n / CAS_CLK; - if (n == 0) { - return; - } + if (n == 0) { + return; + } - if (cas->save) { - for (i = 0; i < n; i++) { - pc_cas_write_smp (cas, cas->pcm_out_val); - } - } - else { - for (i = 0; i < n; i++) { - v = pc_cas_read_smp (cas); - } + if (cas->save) { + for (i = 0; i < n; i++) { + pc_cas_write_smp(cas, cas->pcm_out_val); + } + } else { + for (i = 0; i < n; i++) { + v = pc_cas_read_smp(cas); + } - cas->data_inp = (v < 0) ? 0 : 1; - } + cas->data_inp = (v < 0) ? 0 : 1; + } } -void pc_cas_clock (pc_cassette_t *cas, unsigned long cnt) +void +pc_cas_clock(pc_cassette_t *cas, unsigned long cnt) { - cas->clk += cnt; + cas->clk += cnt; - if (cas->motor == 0) { - return; - } + if (cas->motor == 0) { + return; + } - if (cas->pcm) { - pc_cas_clock_pcm (cas, cnt); - return; - } + if (cas->pcm) { + pc_cas_clock_pcm(cas, cnt); + return; + } - if (cas->save) { - return; - } + if (cas->save) { + return; + } - if (cas->clk_inp > cnt) { - cas->clk_inp -= cnt; - return; - } + if (cas->clk_inp > cnt) { + cas->clk_inp -= cnt; + return; + } - cnt -= cas->clk_inp; + cnt -= cas->clk_inp; - cas->data_inp = !cas->data_inp; + cas->data_inp = !cas->data_inp; - if (cas->data_inp) { - pc_cas_read_bit (cas); - } + if (cas->data_inp) { + pc_cas_read_bit(cas); + } - if (cas->cas_inp_bit) { - cas->clk_inp = CAS_CLK / 2000; - } - else { - cas->clk_inp = CAS_CLK / 4000; - } + if (cas->cas_inp_bit) { + cas->clk_inp = CAS_CLK / 2000; + } else { + cas->clk_inp = CAS_CLK / 4000; + } - if (cas->clk_inp > cnt) { - cas->clk_inp -= cnt; - } + if (cas->clk_inp > cnt) { + cas->clk_inp -= cnt; + } } - -void pc_cas_advance (pc_cassette_t *cas) +void +pc_cas_advance(pc_cassette_t *cas) { int ticks; cpu_s = (CPU *) &cpu_f->cpus[cpu_effective]; if (cas->motor == 0) - return; + return; if (cassette_cycles == -1) - cassette_cycles = cycles; + cassette_cycles = cycles; if (cycles <= cassette_cycles) - ticks = (cassette_cycles - cycles); + ticks = (cassette_cycles - cycles); else - ticks = (cassette_cycles + (cpu_s->rspeed / 100) - cycles); + ticks = (cassette_cycles + (cpu_s->rspeed / 100) - cycles); cassette_cycles = cycles; pc_cas_clock(cas, ticks); } - static void cassette_close(void *p) { if (cassette != NULL) { - free(cassette); - cassette = NULL; + free(cassette); + cassette = NULL; } } - static void cassette_callback(void *p) { pc_cassette_t *cas = (pc_cassette_t *) p; - pc_cas_clock (cas, 8); + pc_cas_clock(cas, 8); if (cas->motor) - ui_sb_update_icon(SB_CASSETTE, 1); + ui_sb_update_icon(SB_CASSETTE, 1); timer_advance_u64(&cas->timer, 8ULL * PITCONST); } - static void * cassette_init(const device_t *info) { - cassette = NULL; + cassette = NULL; - if (cassette_pcm == 1) - cassette_pcm = -1; + if (cassette_pcm == 1) + cassette_pcm = -1; - cassette_log("CASSETTE: file=%s mode=%s pcm=%d srate=%lu pos=%lu append=%d\n", - (cassette_fname != NULL) ? cassette_fname : "", cassette_mode, cassette_pcm, cassette_srate, cassette_pos, cassette_append); + cassette_log("CASSETTE: file=%s mode=%s pcm=%d srate=%lu pos=%lu append=%d\n", + (cassette_fname != NULL) ? cassette_fname : "", cassette_mode, cassette_pcm, cassette_srate, cassette_pos, cassette_append); - cassette = pc_cas_new(); + cassette = pc_cas_new(); - if (cassette == NULL) { - cassette_log("ERROR: *** alloc failed\n"); - return NULL; - } + if (cassette == NULL) { + cassette_log("ERROR: *** alloc failed\n"); + return NULL; + } - if (strlen(cassette_fname) == 0) { - if (pc_cas_set_fname (cassette, NULL)) { - cassette_log("ERROR: *** opening file failed (%s)\n", cassette_fname); - } - } else { - if (pc_cas_set_fname (cassette, cassette_fname)) { - cassette_log("ERROR: *** opening file failed (%s)\n", cassette_fname); - } - } + if (strlen(cassette_fname) == 0) { + if (pc_cas_set_fname(cassette, NULL)) { + cassette_log("ERROR: *** opening file failed (%s)\n", cassette_fname); + } + } else { + if (pc_cas_set_fname(cassette, cassette_fname)) { + cassette_log("ERROR: *** opening file failed (%s)\n", cassette_fname); + } + } - if (strcmp (cassette_mode, "load") == 0) - pc_cas_set_mode (cassette, 0); - else if (strcmp (cassette_mode, "save") == 0) - pc_cas_set_mode (cassette, 1); - else { - cassette_log ("ERROR: *** unknown cassette mode (%s)\n", cassette_mode); - } + if (strcmp(cassette_mode, "load") == 0) + pc_cas_set_mode(cassette, 0); + else if (strcmp(cassette_mode, "save") == 0) + pc_cas_set_mode(cassette, 1); + else { + cassette_log("ERROR: *** unknown cassette mode (%s)\n", cassette_mode); + } - if (cassette_append) - pc_cas_append (cassette); - else - pc_cas_set_position (cassette, cassette_pos); + if (cassette_append) + pc_cas_append(cassette); + else + pc_cas_set_position(cassette, cassette_pos); - if (cassette_pcm >= 0) - pc_cas_set_pcm (cassette, cassette_pcm); + if (cassette_pcm >= 0) + pc_cas_set_pcm(cassette, cassette_pcm); - pc_cas_set_srate (cassette, cassette_srate); + pc_cas_set_srate(cassette, cassette_srate); - timer_add(&cassette->timer, cassette_callback, cassette, 0); + timer_add(&cassette->timer, cassette_callback, cassette, 0); - return cassette; + return cassette; } - const device_t cassette_device = { - .name = "IBM PC/PCjr Cassette Device", + .name = "IBM PC/PCjr Cassette Device", .internal_name = "cassette", - .flags = 0, - .local = 0, - .init = cassette_init, - .close = cassette_close, - .reset = NULL, + .flags = 0, + .local = 0, + .init = cassette_init, + .close = cassette_close, + .reset = NULL, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; diff --git a/src/device/clock_ics9xxx.c b/src/device/clock_ics9xxx.c index da4de6c43..47d1301ee 100644 --- a/src/device/clock_ics9xxx.c +++ b/src/device/clock_ics9xxx.c @@ -27,78 +27,75 @@ #include "cpu.h" #include <86box/clock.h> - #ifdef ENABLE_ICS9xxx_LOG int ics9xxx_do_log = ENABLE_ICS9xxx_LOG; - static void ics9xxx_log(const char *fmt, ...) { va_list ap; if (ics9xxx_do_log) { - va_start(ap, fmt); - pclog_ex(fmt, ap); - va_end(ap); + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); } } -#define ICS9xxx_MODEL(model) [model] = {.name = #model, +# define ICS9xxx_MODEL(model) [model] = { .name = # model, #else -#define ics9xxx_log(fmt, ...) -#define ICS9xxx_MODEL(model) [model] = { +# define ics9xxx_log(fmt, ...) +# define ICS9xxx_MODEL(model) [model] = { #endif -#define ICS9xxx_MODEL_END() }, -#define agp_div ram_mult /* temporarily saves space while neither field matters */ - - +#define ICS9xxx_MODEL_END() \ + } \ + , +#define agp_div ram_mult /* temporarily saves space while neither field matters */ typedef struct { - uint16_t bus: 15; - uint8_t ram_mult: 2; /* change to full float when this becomes useful */ - uint8_t pci_div: 3; + uint16_t bus : 15; + uint8_t ram_mult : 2; /* change to full float when this becomes useful */ + uint8_t pci_div : 3; } ics9xxx_frequency_t; typedef struct { #if defined(ENABLE_ICS9xxx_LOG) || defined(ENABLE_ICS9xxx_DETECT) - const char *name; /* populated by macro */ + const char *name; /* populated by macro */ #endif - uint8_t max_reg: 3; /* largest register index */ - uint8_t regs[7]; /* default registers */ - struct { /* for each hardware frequency select bit [FS0:FS4]: */ - uint8_t normal_reg: 3; /* which register (or -1) for non-inverted input (FSn) */ - uint8_t normal_bit: 3; /* which bit (0-7) for non-inverted input (FSn) */ - uint8_t inv_reg: 3; /* which register (or -1) for inverted input (FSn#) */ - uint8_t inv_bit: 3; /* which bit (0-7) for inverted input (FSn#) */ + uint8_t max_reg : 3; /* largest register index */ + uint8_t regs[7]; /* default registers */ + struct { /* for each hardware frequency select bit [FS0:FS4]: */ + uint8_t normal_reg : 3; /* which register (or -1) for non-inverted input (FSn) */ + uint8_t normal_bit : 3; /* which bit (0-7) for non-inverted input (FSn) */ + uint8_t inv_reg : 3; /* which register (or -1) for inverted input (FSn#) */ + uint8_t inv_bit : 3; /* which bit (0-7) for inverted input (FSn#) */ } fs_regs[5]; - uint8_t normal_bits_fixed: 1; /* set to 1 if the non-inverted bits are straps (hardware select only) */ - struct { /* hardware select bit, which should be cleared for hardware select (latched inputs), or set for programming */ - uint8_t normal_reg: 3; /* which register (or -1) */ - uint8_t normal_bit: 3; /* which bit (0-7) */ + uint8_t normal_bits_fixed : 1; /* set to 1 if the non-inverted bits are straps (hardware select only) */ + struct { /* hardware select bit, which should be cleared for hardware select (latched inputs), or set for programming */ + uint8_t normal_reg : 3; /* which register (or -1) */ + uint8_t normal_bit : 3; /* which bit (0-7) */ } hw_select; - uint8_t frequencies_ref; /* which other model to use the frequency table from (or 0) */ - const ics9xxx_frequency_t *frequencies; /* frequency table, if not using another model's table */ + uint8_t frequencies_ref; /* which other model to use the frequency table from (or 0) */ + const ics9xxx_frequency_t *frequencies; /* frequency table, if not using another model's table */ } ics9xxx_model_t; typedef struct { - uint8_t model_idx; + uint8_t model_idx; ics9xxx_model_t *model; - device_t *dyn_device; + device_t *dyn_device; ics9xxx_frequency_t *frequencies_ptr; - uint8_t regs[7]; - int8_t addr_register: 4; - uint8_t relevant_regs: 7; - uint8_t bus_match: 5; + uint8_t regs[7]; + int8_t addr_register : 4; + uint8_t relevant_regs : 7; + uint8_t bus_match : 5; } ics9xxx_t; - static const ics9xxx_model_t ics9xxx_models[] = { #ifdef ENABLE_ICS9xxx_DETECT ICS9xxx_MODEL(ICS9xxx_xx) - .max_reg = 6 - ICS9xxx_MODEL_END() + .max_reg + = 6 ICS9xxx_MODEL_END() #endif ICS9xxx_MODEL(ICS9150_08) .max_reg = 5, @@ -910,13 +907,11 @@ static const ics9xxx_model_t ics9xxx_models[] = { #endif }; - /* Don't enable the detection device here. Enable it further up near logging. */ #ifdef ENABLE_ICS9xxx_DETECT -static uint16_t detect_bus = 0; -static uint8_t detect_reg = 0; -static uint8_t discarded[ICS9xxx_MAX] = {0}; - +static uint16_t detect_bus = 0; +static uint8_t detect_reg = 0; +static uint8_t discarded[ICS9xxx_MAX] = { 0 }; static void ics9xxx_detect_reset(void *priv) @@ -924,71 +919,69 @@ ics9xxx_detect_reset(void *priv) pclog("Please enter the frequency set in the BIOS (7500 for 75.00 MHz)\nAnswer 0 if unsure or set to auto, I'll ask again next reset.\n"); scanf("%hu", &detect_bus); if ((detect_bus > 0) && (detect_bus < 1000)) - detect_bus *= 100; + detect_bus *= 100; pclog("Frequency interpreted as %d\n", detect_bus); } - static void ics9xxx_detect(ics9xxx_t *dev) { if (!detect_bus) { - pclog("Frequency not entered on this reset, ignoring change.\n"); - return; + pclog("Frequency not entered on this reset, ignoring change.\n"); + return; } if ((detect_reg == 0) && (dev->regs[detect_reg] >= 0xfe)) { - pclog("Register %d set to %02X, probably not it, trying %d instead\n", detect_reg, dev->regs[detect_reg], 3); - detect_reg = 3; - dev->relevant_regs = 1 << detect_reg; - return; + pclog("Register %d set to %02X, probably not it, trying %d instead\n", detect_reg, dev->regs[detect_reg], 3); + detect_reg = 3; + dev->relevant_regs = 1 << detect_reg; + return; } if (!(dev->regs[detect_reg] & 0x40)) - pclog("Bit 3 of register %d is clear, probably in hardware select mode!\n", detect_reg); + pclog("Bit 3 of register %d is clear, probably in hardware select mode!\n", detect_reg); - uint8_t i = 0, matches = 0, val, bitmask; + uint8_t i = 0, matches = 0, val, bitmask; ics9xxx_frequency_t *frequencies_ptr; - uint32_t delta; + uint32_t delta; for (uint8_t j = 0; j < ICS9xxx_MAX; j++) { - if (discarded[j]) - continue; - discarded[j] = 1; + if (discarded[j]) + continue; + discarded[j] = 1; - frequencies_ptr = (ics9xxx_frequency_t *) ics9xxx_models[ics9xxx_models[j].frequencies_ref ? ics9xxx_models[j].frequencies_ref : j].frequencies; - if (!frequencies_ptr) - continue; + frequencies_ptr = (ics9xxx_frequency_t *) ics9xxx_models[ics9xxx_models[j].frequencies_ref ? ics9xxx_models[j].frequencies_ref : j].frequencies; + if (!frequencies_ptr) + continue; - while (frequencies_ptr[i].bus) { - delta = ABS((int32_t) (detect_bus - frequencies_ptr[i].bus)); - if (delta <= 100) { - val = bitmask = 0; - for (uint8_t k = 0; k < sizeof(ics9xxx_models[j].fs_regs) / sizeof(ics9xxx_models[j].fs_regs[0]); k++) { - if (ics9xxx_models[j].fs_regs[k].normal_reg == detect_reg) { - bitmask |= 1 << k; - val |= (1 << k) * !!(dev->regs[detect_reg] & (1 << ics9xxx_models[j].fs_regs[k].normal_bit)); - } - } - if (bitmask && (val == (i & bitmask))) { - matches++; - discarded[j] = 0; - pclog("> Potential match for %s (frequency %d index %d)\n", ics9xxx_models[j].name, frequencies_ptr[i].bus, val); - } - } + while (frequencies_ptr[i].bus) { + delta = ABS((int32_t) (detect_bus - frequencies_ptr[i].bus)); + if (delta <= 100) { + val = bitmask = 0; + for (uint8_t k = 0; k < sizeof(ics9xxx_models[j].fs_regs) / sizeof(ics9xxx_models[j].fs_regs[0]); k++) { + if (ics9xxx_models[j].fs_regs[k].normal_reg == detect_reg) { + bitmask |= 1 << k; + val |= (1 << k) * !!(dev->regs[detect_reg] & (1 << ics9xxx_models[j].fs_regs[k].normal_bit)); + } + } + if (bitmask && (val == (i & bitmask))) { + matches++; + discarded[j] = 0; + pclog("> Potential match for %s (frequency %d index %d)\n", ics9xxx_models[j].name, frequencies_ptr[i].bus, val); + } + } - i++; - } + i++; + } } pclog("Found a total of %d matches for register %d value %02X and bus frequency %d\n", matches, detect_reg, dev->regs[detect_reg], detect_bus); if (matches == 0) { - pclog("Resetting list of discarded models since there were no matches.\n"); - memset(discarded, 0, sizeof(discarded)); + pclog("Resetting list of discarded models since there were no matches.\n"); + memset(discarded, 0, sizeof(discarded)); } } #endif - static uint8_t ics9xxx_start(void *bus, uint8_t addr, uint8_t read, void *priv) { @@ -1001,53 +994,51 @@ ics9xxx_start(void *bus, uint8_t addr, uint8_t read, void *priv) return 1; } - static uint8_t ics9xxx_read(void *bus, uint8_t addr, void *priv) { ics9xxx_t *dev = (ics9xxx_t *) priv; - uint8_t ret = 0xff; + uint8_t ret = 0xff; if (dev->addr_register < 0) { - dev->addr_register = -1; - ret = dev->model->max_reg + 1; + dev->addr_register = -1; + ret = dev->model->max_reg + 1; } #if 0 else if ((dev->model_idx == ICS9250_50) && (dev->addr_register == 0)) ret = dev->regs[dev->addr_register] & 0x0b; /* -50 reads back revision ID instead */ #endif else - ret = dev->regs[dev->addr_register]; + ret = dev->regs[dev->addr_register]; #ifdef ENABLE_ICS9xxx_LOG if (dev->addr_register < 0) - ics9xxx_log("ICS9xxx: read(%s) = %02X\n", (dev->addr_register == -1) ? "blocklen" : "command", ret); + ics9xxx_log("ICS9xxx: read(%s) = %02X\n", (dev->addr_register == -1) ? "blocklen" : "command", ret); else - ics9xxx_log("ICS9xxx: read(%x) = %02X\n", dev->addr_register, ret); + ics9xxx_log("ICS9xxx: read(%x) = %02X\n", dev->addr_register, ret); #endif if (dev->addr_register >= dev->model->max_reg) - dev->addr_register = 0; /* roll-over */ + dev->addr_register = 0; /* roll-over */ else - dev->addr_register++; + dev->addr_register++; return ret; } - static void ics9xxx_set(ics9xxx_t *dev, uint8_t val) { /* Get the active mode, which determines what to add to the static frequency bits we were passed. */ uint8_t hw_select = (dev->model->hw_select.normal_reg < 7) && !(dev->regs[dev->model->hw_select.normal_reg] & (1 << dev->model->hw_select.normal_bit)); if (hw_select) { - /* Hardware select mode: add strapped frequency bits. */ - val |= dev->bus_match; + /* Hardware select mode: add strapped frequency bits. */ + val |= dev->bus_match; } else { - /* Programmable mode: add register-defined frequency bits. */ - for (uint8_t i = 0; i < sizeof(dev->model->fs_regs) / sizeof(dev->model->fs_regs[0]); i++) { - if ((dev->model->fs_regs[i].normal_reg < 7) && (dev->regs[dev->model->fs_regs[i].normal_reg] & (1 << dev->model->fs_regs[i].normal_bit))) - val |= 1 << i; - } + /* Programmable mode: add register-defined frequency bits. */ + for (uint8_t i = 0; i < sizeof(dev->model->fs_regs) / sizeof(dev->model->fs_regs[0]); i++) { + if ((dev->model->fs_regs[i].normal_reg < 7) && (dev->regs[dev->model->fs_regs[i].normal_reg] & (1 << dev->model->fs_regs[i].normal_bit))) + val |= 1 << i; + } } uint16_t bus = dev->frequencies_ptr[val].bus; @@ -1057,7 +1048,6 @@ ics9xxx_set(ics9xxx_t *dev, uint8_t val) ics9xxx_log("ICS9xxx: set(%d) = hw=%d bus=%d ram=%d pci=%d\n", val, hw_select, bus, bus * dev->frequencies_ptr[val].ram_mult, pci); } - static uint8_t ics9xxx_write(void *bus, uint8_t addr, uint8_t data, void *priv) { @@ -1065,24 +1055,24 @@ ics9xxx_write(void *bus, uint8_t addr, uint8_t data, void *priv) #ifdef ENABLE_ICS9xxx_LOG if (dev->addr_register < 0) - ics9xxx_log("ICS9xxx: write(%s, %02X)\n", (dev->addr_register == -1) ? "blocklen" : "command", data); + ics9xxx_log("ICS9xxx: write(%s, %02X)\n", (dev->addr_register == -1) ? "blocklen" : "command", data); else - ics9xxx_log("ICS9xxx: write(%x, %02X)\n", dev->addr_register, data); + ics9xxx_log("ICS9xxx: write(%x, %02X)\n", dev->addr_register, data); #endif if (dev->addr_register >= 0) { - /* Preserve fixed bits. */ + /* Preserve fixed bits. */ #ifdef ENABLE_ICS9xxx_DETECT - if (dev->model != ICS9xxx_xx) + if (dev->model != ICS9xxx_xx) #endif - { - for (uint8_t i = 0; i < sizeof(dev->model->fs_regs) / sizeof(dev->model->fs_regs[0]); i++) { - if (dev->model->normal_bits_fixed && (dev->model->fs_regs[i].normal_reg == dev->addr_register)) - data = (dev->regs[dev->addr_register] & (1 << dev->model->fs_regs[i].normal_bit)) | (data & ~(1 << dev->model->fs_regs[i].normal_bit)); - if (dev->model->fs_regs[i].inv_reg == dev->addr_register) - data = (dev->regs[dev->addr_register] & (1 << dev->model->fs_regs[i].inv_bit)) | (data & ~(1 << dev->model->fs_regs[i].inv_bit)); - } - } + { + for (uint8_t i = 0; i < sizeof(dev->model->fs_regs) / sizeof(dev->model->fs_regs[0]); i++) { + if (dev->model->normal_bits_fixed && (dev->model->fs_regs[i].normal_reg == dev->addr_register)) + data = (dev->regs[dev->addr_register] & (1 << dev->model->fs_regs[i].normal_bit)) | (data & ~(1 << dev->model->fs_regs[i].normal_bit)); + if (dev->model->fs_regs[i].inv_reg == dev->addr_register) + data = (dev->regs[dev->addr_register] & (1 << dev->model->fs_regs[i].inv_bit)) | (data & ~(1 << dev->model->fs_regs[i].inv_bit)); + } + } #if 0 switch (dev->addr_register) { @@ -1112,15 +1102,15 @@ ics9xxx_write(void *bus, uint8_t addr, uint8_t data, void *priv) break; } #endif - dev->regs[dev->addr_register] = data; + dev->regs[dev->addr_register] = data; - /* Update frequency if a relevant register was written to. */ - if (dev->relevant_regs & (1 << dev->addr_register)) { - switch (dev->model_idx) { + /* Update frequency if a relevant register was written to. */ + if (dev->relevant_regs & (1 << dev->addr_register)) { + switch (dev->model_idx) { #ifdef ENABLE_ICS9xxx_DETECT - case ICS9xxx_xx: - ics9xxx_detect(dev); - break; + case ICS9xxx_xx: + ics9xxx_detect(dev); + break; #endif #if 0 case ICS9250_10: @@ -1138,44 +1128,44 @@ ics9xxx_write(void *bus, uint8_t addr, uint8_t data, void *priv) ics9xxx_set(dev, ((cpu_busspeed == 100000000) * 0x02) | ((cpu_busspeed > 100000000) * 0x01)); break; #endif - default: - ics9xxx_set(dev, 0x00); - break; - } - } + default: + ics9xxx_set(dev, 0x00); + break; + } + } } if (dev->addr_register >= dev->model->max_reg) - dev->addr_register = 0; /* roll-over */ + dev->addr_register = 0; /* roll-over */ else - dev->addr_register++; + dev->addr_register++; return 1; } - static uint8_t -ics9xxx_find_bus_match(ics9xxx_t *dev, uint32_t bus, uint8_t preset_mask, uint8_t preset) { - uint8_t best_match = 0; +ics9xxx_find_bus_match(ics9xxx_t *dev, uint32_t bus, uint8_t preset_mask, uint8_t preset) +{ + uint8_t best_match = 0; uint32_t delta, best_delta = -1; #ifdef ENABLE_ICS9xxx_DETECT if (dev->model_idx == ICS9xxx_xx) - return 0; + return 0; #endif bus /= 10000; uint8_t i = 0; while (dev->frequencies_ptr[i].bus) { - if ((i & preset_mask) == preset) { - delta = ABS((int32_t) (bus - dev->frequencies_ptr[i].bus)); - if (delta < best_delta) { - best_match = i; - best_delta = delta; - } - } + if ((i & preset_mask) == preset) { + delta = ABS((int32_t) (bus - dev->frequencies_ptr[i].bus)); + if (delta < best_delta) { + best_match = i; + best_delta = delta; + } + } - i++; + i++; } ics9xxx_log("ICS9xxx: find_match(%s, %d) = match=%d bus=%d\n", dev->model->name, bus, best_match, dev->frequencies_ptr[best_match].bus); @@ -1183,15 +1173,14 @@ ics9xxx_find_bus_match(ics9xxx_t *dev, uint32_t bus, uint8_t preset_mask, uint8_ return best_match; } - static void * ics9xxx_init(const device_t *info) { ics9xxx_t *dev = (ics9xxx_t *) malloc(sizeof(ics9xxx_t)); memset(dev, 0, sizeof(ics9xxx_t)); - dev->model_idx = info->local; - dev->model = (ics9xxx_model_t *) &ics9xxx_models[dev->model_idx]; + dev->model_idx = info->local; + dev->model = (ics9xxx_model_t *) &ics9xxx_models[dev->model_idx]; dev->dyn_device = (device_t *) info; memcpy(&dev->regs, &dev->model->regs, dev->model->max_reg + 1); @@ -1200,56 +1189,56 @@ ics9xxx_init(const device_t *info) uint8_t i; #ifdef ENABLE_ICS9xxx_DETECT for (i = ICS9xxx_xx + 1; i < ICS9xxx_MAX; i++) { - if (ics9xxx_models[i].frequencies_ref || !ics9xxx_models[i].name) - continue; - for (uint8_t j = 0; j < i; j++) { - if (ics9xxx_models[j].frequencies_ref || !ics9xxx_models[j].name) - continue; - if (!memcmp(&ics9xxx_models[i].frequencies, &ics9xxx_models[j].frequencies, sizeof(ics9xxx_models[i].frequencies))) - pclog("Optimization warning: %s and %s have duplicate tables\n", ics9xxx_models[j].name, ics9xxx_models[i].name); - } + if (ics9xxx_models[i].frequencies_ref || !ics9xxx_models[i].name) + continue; + for (uint8_t j = 0; j < i; j++) { + if (ics9xxx_models[j].frequencies_ref || !ics9xxx_models[j].name) + continue; + if (!memcmp(&ics9xxx_models[i].frequencies, &ics9xxx_models[j].frequencies, sizeof(ics9xxx_models[i].frequencies))) + pclog("Optimization warning: %s and %s have duplicate tables\n", ics9xxx_models[j].name, ics9xxx_models[i].name); + } } if (dev->model_idx == ICS9xxx_xx) { /* detection device */ - dev->relevant_regs = 1 << 0; /* register 0 matters the most on the detection device */ + dev->relevant_regs = 1 << 0; /* register 0 matters the most on the detection device */ - ics9xxx_detect_reset(dev); + ics9xxx_detect_reset(dev); } else #endif { /* regular device */ - dev->frequencies_ptr = (ics9xxx_frequency_t *) (dev->model->frequencies_ref ? ics9xxx_models[dev->model->frequencies_ref].frequencies : dev->model->frequencies); - if (!dev->frequencies_ptr) - fatal("ICS9xxx: NULL frequency table\n"); + dev->frequencies_ptr = (ics9xxx_frequency_t *) (dev->model->frequencies_ref ? ics9xxx_models[dev->model->frequencies_ref].frequencies : dev->model->frequencies); + if (!dev->frequencies_ptr) + fatal("ICS9xxx: NULL frequency table\n"); - /* Determine which frequency bits cannot be strapped (register only). */ - uint8_t register_only_bits = 0x00; - for (i = 0; i < sizeof(dev->model->fs_regs) / sizeof(dev->model->fs_regs[0]); i++) { - if (!dev->model->normal_bits_fixed && (dev->model->fs_regs[i].normal_reg < 7)) /* mark a normal, programmable bit as relevant */ - dev->relevant_regs |= 1 << dev->model->fs_regs[i].normal_reg; - if ((dev->model->fs_regs[i].normal_reg == 7) && (dev->model->fs_regs[i].inv_reg == 7)) /* mark as register only */ - register_only_bits |= 1 << i; - } + /* Determine which frequency bits cannot be strapped (register only). */ + uint8_t register_only_bits = 0x00; + for (i = 0; i < sizeof(dev->model->fs_regs) / sizeof(dev->model->fs_regs[0]); i++) { + if (!dev->model->normal_bits_fixed && (dev->model->fs_regs[i].normal_reg < 7)) /* mark a normal, programmable bit as relevant */ + dev->relevant_regs |= 1 << dev->model->fs_regs[i].normal_reg; + if ((dev->model->fs_regs[i].normal_reg == 7) && (dev->model->fs_regs[i].inv_reg == 7)) /* mark as register only */ + register_only_bits |= 1 << i; + } - /* Mark the hardware select bit's register as relevant, if there's one. */ - if (dev->model->hw_select.normal_reg < 7) - dev->relevant_regs |= 1 << dev->model->hw_select.normal_reg; + /* Mark the hardware select bit's register as relevant, if there's one. */ + if (dev->model->hw_select.normal_reg < 7) + dev->relevant_regs |= 1 << dev->model->hw_select.normal_reg; - /* Find bus speed match and set default register bits accordingly. */ - dev->bus_match = ics9xxx_find_bus_match(dev, cpu_busspeed, register_only_bits, 0x00); - for (i = 0; i < sizeof(dev->model->fs_regs) / sizeof(dev->model->fs_regs[0]); i++) { - if (dev->model->fs_regs[i].normal_reg < 7) { - if (dev->bus_match & (1 << i)) - dev->regs[dev->model->fs_regs[i].normal_reg] |= 1 << dev->model->fs_regs[i].normal_bit; - else - dev->regs[dev->model->fs_regs[i].normal_reg] &= ~(1 << dev->model->fs_regs[i].normal_bit); - } - if (dev->model->fs_regs[i].inv_reg < 7) { - if (dev->bus_match & (1 << i)) - dev->regs[dev->model->fs_regs[i].inv_reg] &= ~(1 << dev->model->fs_regs[i].inv_bit); - else - dev->regs[dev->model->fs_regs[i].inv_reg] |= 1 << dev->model->fs_regs[i].inv_bit; - } - } + /* Find bus speed match and set default register bits accordingly. */ + dev->bus_match = ics9xxx_find_bus_match(dev, cpu_busspeed, register_only_bits, 0x00); + for (i = 0; i < sizeof(dev->model->fs_regs) / sizeof(dev->model->fs_regs[0]); i++) { + if (dev->model->fs_regs[i].normal_reg < 7) { + if (dev->bus_match & (1 << i)) + dev->regs[dev->model->fs_regs[i].normal_reg] |= 1 << dev->model->fs_regs[i].normal_bit; + else + dev->regs[dev->model->fs_regs[i].normal_reg] &= ~(1 << dev->model->fs_regs[i].normal_bit); + } + if (dev->model->fs_regs[i].inv_reg < 7) { + if (dev->bus_match & (1 << i)) + dev->regs[dev->model->fs_regs[i].inv_reg] &= ~(1 << dev->model->fs_regs[i].inv_bit); + else + dev->regs[dev->model->fs_regs[i].inv_reg] |= 1 << dev->model->fs_regs[i].inv_bit; + } + } } i2c_sethandler(i2c_smbus, 0x69, 1, ics9xxx_start, ics9xxx_read, ics9xxx_write, NULL, dev); @@ -1257,7 +1246,6 @@ ics9xxx_init(const device_t *info) return dev; } - static void ics9xxx_close(void *priv) { @@ -1271,21 +1259,20 @@ ics9xxx_close(void *priv) free(dev); } - device_t * ics9xxx_get(uint8_t model) { device_t *dev = (device_t *) malloc(sizeof(device_t)); memset(dev, 0, sizeof(device_t)); - dev->name = "ICS9xxx-xx Clock Generator"; + dev->name = "ICS9xxx-xx Clock Generator"; dev->local = model; dev->flags = DEVICE_ISA; #ifdef ENABLE_ICS9xxx_DETECT if (model == ICS9xxx_xx) - dev->reset = ics9xxx_detect_reset; + dev->reset = ics9xxx_detect_reset; #endif - dev->init = ics9xxx_init; + dev->init = ics9xxx_init; dev->close = ics9xxx_close; return dev; diff --git a/src/device/hasp.c b/src/device/hasp.c index 299796a6d..7d7d92a53 100644 --- a/src/device/hasp.c +++ b/src/device/hasp.c @@ -30,14 +30,16 @@ #include <86box/lpt.h> #include <86box/device.h> -#define HASP_BYTEARRAY(...) {__VA_ARGS__} -#define HASP_TYPE(type, password_arr, prodinfo_arr) [type] = { \ - .password = (const uint8_t[]) password_arr, \ - .prodinfo = (const uint8_t[]) prodinfo_arr, \ - .password_size = sizeof((uint8_t[]) password_arr), \ - .prodinfo_size = sizeof((uint8_t[]) prodinfo_arr) \ - }, - +#define HASP_BYTEARRAY(...) \ + { \ + __VA_ARGS__ \ + } +#define HASP_TYPE(type, password_arr, prodinfo_arr) [type] = { \ + .password = (const uint8_t[]) password_arr, \ + .prodinfo = (const uint8_t[]) prodinfo_arr, \ + .password_size = sizeof((uint8_t[]) password_arr), \ + .prodinfo_size = sizeof((uint8_t[]) prodinfo_arr) \ +}, enum { HASP_STATE_NONE = 0, @@ -50,30 +52,28 @@ enum { HASP_TYPE_SAVQUEST = 0 }; - typedef struct { const uint8_t *password, *prodinfo; - const uint8_t password_size, prodinfo_size; + const uint8_t password_size, prodinfo_size; } hasp_type_t; typedef struct { - void *lpt; + void *lpt; const hasp_type_t *type; - int index, state, passindex, passmode, prodindex; - uint8_t tmppass[0x29], status; + int index, state, passindex, passmode, prodindex; + uint8_t tmppass[0x29], status; } hasp_t; static const hasp_type_t hasp_types[] = { HASP_TYPE(HASP_TYPE_SAVQUEST, - HASP_BYTEARRAY(0xc3, 0xd9, 0xd3, 0xfb, 0x9d, 0x89, 0xb9, 0xa1, 0xb3, 0xc1, 0xf1, 0xcd, 0xdf, 0x9d), - HASP_BYTEARRAY(0x51, 0x4c, 0x52, 0x4d, 0x53, 0x4e, 0x53, 0x4e, 0x53, 0x49, 0x53, 0x48, 0x53, 0x4b, 0x53, 0x4a, - 0x53, 0x43, 0x53, 0x45, 0x52, 0x46, 0x53, 0x43, 0x53, 0x41, 0xac, 0x40, 0x53, 0xbc, 0x53, 0x42, - 0x53, 0x57, 0x53, 0x5d, 0x52, 0x5e, 0x53, 0x5b, 0x53, 0x59, 0xac, 0x58, 0x53, 0xa4)) + HASP_BYTEARRAY(0xc3, 0xd9, 0xd3, 0xfb, 0x9d, 0x89, 0xb9, 0xa1, 0xb3, 0xc1, 0xf1, 0xcd, 0xdf, 0x9d), + HASP_BYTEARRAY(0x51, 0x4c, 0x52, 0x4d, 0x53, 0x4e, 0x53, 0x4e, 0x53, 0x49, 0x53, 0x48, 0x53, 0x4b, 0x53, 0x4a, + 0x53, 0x43, 0x53, 0x45, 0x52, 0x46, 0x53, 0x43, 0x53, 0x41, 0xac, 0x40, 0x53, 0xbc, 0x53, 0x42, + 0x53, 0x57, 0x53, 0x5d, 0x52, 0x5e, 0x53, 0x5b, 0x53, 0x59, 0xac, 0x58, 0x53, 0xa4)) }; - #ifdef ENABLE_HASP_LOG int hasp_do_log = ENABLE_HASP_LOG; @@ -83,16 +83,15 @@ hasp_log(const char *fmt, ...) va_list ap; if (hasp_do_log) { - va_start(ap, fmt); - pclog_ex(fmt, ap); - va_end(ap); + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); } } #else -#define hasp_log(fmt, ...) +# define hasp_log(fmt, ...) #endif - static void hasp_write_data(uint8_t val, void *priv) { @@ -101,161 +100,188 @@ hasp_write_data(uint8_t val, void *priv) hasp_log("HASP: write_data(%02X)\n", val); switch (dev->index) { - case 0: - if (val == 0xc6) - dev->index++; - else - dev->index = 0; - break; + case 0: + if (val == 0xc6) + dev->index++; + else + dev->index = 0; + break; - case 1: - if (val == 0xc7) - dev->index++; - else - dev->index = 0; - break; + case 1: + if (val == 0xc7) + dev->index++; + else + dev->index = 0; + break; - case 2: - if (val == 0xc6) { - dev->index++; - } else { - dev->index = 0; - dev->state = HASP_STATE_NONE; - } - break; + case 2: + if (val == 0xc6) { + dev->index++; + } else { + dev->index = 0; + dev->state = HASP_STATE_NONE; + } + break; - case 3: - dev->index = 0; - if (val == 0x80) { - dev->state = HASP_STATE_PASSWORD_BEGIN; - dev->passindex = 0; - return; - } - break; + case 3: + dev->index = 0; + if (val == 0x80) { + dev->state = HASP_STATE_PASSWORD_BEGIN; + dev->passindex = 0; + return; + } + break; } dev->status = 0; if (dev->state == HASP_STATE_READ) { - /* different passwords cause different values to be returned - but there are really only two passwords of interest - passmode 2 is used to verify that the dongle is responding correctly */ - if (dev->passmode == 2) { - switch (val) { - case 0x94: case 0x9e: case 0xa4: - case 0xb2: case 0xbe: case 0xd0: - return; + /* different passwords cause different values to be returned + but there are really only two passwords of interest + passmode 2 is used to verify that the dongle is responding correctly */ + if (dev->passmode == 2) { + switch (val) { + case 0x94: + case 0x9e: + case 0xa4: + case 0xb2: + case 0xbe: + case 0xd0: + return; - case 0x8a: case 0x8e: case 0xca: case 0xd2: - case 0xe2: case 0xf0: case 0xfc: - /* someone with access to the actual dongle could dump the true values - I've never seen it so I just determined the relevant bits instead - from the disassembly of the software - some of the keys are verified explicitly, the others implicitly - I guessed the implicit ones with a bit of trial and error */ - dev->status = 0x20; - return; - } - } + case 0x8a: + case 0x8e: + case 0xca: + case 0xd2: + case 0xe2: + case 0xf0: + case 0xfc: + /* someone with access to the actual dongle could dump the true values + I've never seen it so I just determined the relevant bits instead + from the disassembly of the software + some of the keys are verified explicitly, the others implicitly + I guessed the implicit ones with a bit of trial and error */ + dev->status = 0x20; + return; + } + } - switch (val) { - /* in passmode 0, some values remain unknown: 8a, 8e (inconclusive), 94, 96, 9a, a4, b2, be, c4, d2, d4 (inconclusive), e2, ec, f8, fc - this is less of a concern since the contents seem to decrypt correctly */ - case 0x88: - case 0x94: case 0x98: case 0x9c: case 0x9e: - case 0xa0: case 0xa4: case 0xaa: case 0xae: - case 0xb0: case 0xb2: case 0xbc: case 0xbe: - case 0xc2: case 0xc6: case 0xc8: case 0xce: - case 0xd0: case 0xd6: case 0xd8: case 0xdc: - case 0xe0: case 0xe6: case 0xea: case 0xee: - case 0xf2: case 0xf6: - /* again, just the relevant bits instead of the true values */ - dev->status = 0x20; - break; - } + switch (val) { + /* in passmode 0, some values remain unknown: 8a, 8e (inconclusive), 94, 96, 9a, a4, b2, be, c4, d2, d4 (inconclusive), e2, ec, f8, fc + this is less of a concern since the contents seem to decrypt correctly */ + case 0x88: + case 0x94: + case 0x98: + case 0x9c: + case 0x9e: + case 0xa0: + case 0xa4: + case 0xaa: + case 0xae: + case 0xb0: + case 0xb2: + case 0xbc: + case 0xbe: + case 0xc2: + case 0xc6: + case 0xc8: + case 0xce: + case 0xd0: + case 0xd6: + case 0xd8: + case 0xdc: + case 0xe0: + case 0xe6: + case 0xea: + case 0xee: + case 0xf2: + case 0xf6: + /* again, just the relevant bits instead of the true values */ + dev->status = 0x20; + break; + } } else if (dev->state == HASP_STATE_PASSWORD_END) { - if (val & 1) { - if ((dev->passmode == 1) && (val == 0x9d)) - dev->passmode = 2; - dev->state = HASP_STATE_READ; - } else if (dev->passmode == 1) { - dev->tmppass[dev->passindex++] = val; + if (val & 1) { + if ((dev->passmode == 1) && (val == 0x9d)) + dev->passmode = 2; + dev->state = HASP_STATE_READ; + } else if (dev->passmode == 1) { + dev->tmppass[dev->passindex++] = val; - if (dev->passindex == sizeof(dev->tmppass)) { - if ((dev->tmppass[0] == 0x9c) && (dev->tmppass[1] == 0x9e)) { - int i = 2; - dev->prodindex = 0; + if (dev->passindex == sizeof(dev->tmppass)) { + if ((dev->tmppass[0] == 0x9c) && (dev->tmppass[1] == 0x9e)) { + int i = 2; + dev->prodindex = 0; - do { - dev->prodindex = (dev->prodindex << 1) + ((dev->tmppass[i] >> 6) & 1); - } while ((i += 3) < sizeof(dev->tmppass)); + do { + dev->prodindex = (dev->prodindex << 1) + ((dev->tmppass[i] >> 6) & 1); + } while ((i += 3) < sizeof(dev->tmppass)); - dev->prodindex = (dev->prodindex - 0xc08) << 4; + dev->prodindex = (dev->prodindex - 0xc08) << 4; - hasp_log("HASP: Password prodindex = %d\n", dev->prodindex); + hasp_log("HASP: Password prodindex = %d\n", dev->prodindex); - if (dev->prodindex < (0x38 << 4)) - dev->passmode = 3; - } + if (dev->prodindex < (0x38 << 4)) + dev->passmode = 3; + } - dev->state = HASP_STATE_READ; - } - } + dev->state = HASP_STATE_READ; + } + } } else if ((dev->state == HASP_STATE_PASSWORD_BEGIN) && (val & 1)) { - dev->tmppass[dev->passindex++] = val; + dev->tmppass[dev->passindex++] = val; - if (dev->passindex == dev->type->password_size) { - dev->state = HASP_STATE_PASSWORD_END; - dev->passindex = 0; - dev->passmode = (int) !memcmp(dev->tmppass, dev->type->password, dev->type->password_size); - hasp_log("HASP: Password comparison result = %d\n", dev->passmode); - } + if (dev->passindex == dev->type->password_size) { + dev->state = HASP_STATE_PASSWORD_END; + dev->passindex = 0; + dev->passmode = (int) !memcmp(dev->tmppass, dev->type->password, dev->type->password_size); + hasp_log("HASP: Password comparison result = %d\n", dev->passmode); + } } } - static uint8_t hasp_read_status(void *priv) { hasp_t *dev = (hasp_t *) priv; if ((dev->state == HASP_STATE_READ) && (dev->passmode == 3)) { - /* passmode 3 is used to retrieve the product(s) information - it comes in two parts: header and product - the header has this format: - offset range purpose - 00 01 header type - 01 01-05 count of used product slots, must be 2 - 02 01-05 count of unused product slots - this is assumed to be 6-(count of used slots) - but it is not enforced here - however a total of 6 structures will be checked - 03 01-02 unknown - 04 01-46 country code - 05-0f 00 reserved - the used product slots have this format: - (the unused product slots must be entirely zeroes) - 00-01 0001-000a product ID, one must be 6, the other 0a - 02 0001-0003 unknown but must be 0001 - 04 01-05 HASP plug country ID - 05 01-02 unknown but must be 01 - 06 05 unknown - 07-0a any unknown, not used - 0b ff unknown - 0c ff unknown - 0d-0f 00 reserved - the read is performed by accessing an array of 16-bit big-endian values - and returning one bit at a time into bit 5 of the result - the 16-bit value is then XORed with 0x534d and the register index */ + /* passmode 3 is used to retrieve the product(s) information + it comes in two parts: header and product + the header has this format: + offset range purpose + 00 01 header type + 01 01-05 count of used product slots, must be 2 + 02 01-05 count of unused product slots + this is assumed to be 6-(count of used slots) + but it is not enforced here + however a total of 6 structures will be checked + 03 01-02 unknown + 04 01-46 country code + 05-0f 00 reserved + the used product slots have this format: + (the unused product slots must be entirely zeroes) + 00-01 0001-000a product ID, one must be 6, the other 0a + 02 0001-0003 unknown but must be 0001 + 04 01-05 HASP plug country ID + 05 01-02 unknown but must be 01 + 06 05 unknown + 07-0a any unknown, not used + 0b ff unknown + 0c ff unknown + 0d-0f 00 reserved + the read is performed by accessing an array of 16-bit big-endian values + and returning one bit at a time into bit 5 of the result + the 16-bit value is then XORed with 0x534d and the register index */ - if (dev->prodindex <= (dev->type->prodinfo_size * 8)) - dev->status = ((dev->type->prodinfo[(dev->prodindex - 1) >> 3] >> ((8 - dev->prodindex) & 7)) & 1) << 5; /* return defined info */ - else - dev->status = (((0x534d ^ ((dev->prodindex - 1) >> 4)) >> ((16 - dev->prodindex) & 15)) & 1) << 5; /* then just alternate between the two key values */ + if (dev->prodindex <= (dev->type->prodinfo_size * 8)) + dev->status = ((dev->type->prodinfo[(dev->prodindex - 1) >> 3] >> ((8 - dev->prodindex) & 7)) & 1) << 5; /* return defined info */ + else + dev->status = (((0x534d ^ ((dev->prodindex - 1) >> 4)) >> ((16 - dev->prodindex) & 15)) & 1) << 5; /* then just alternate between the two key values */ - hasp_log("HASP: Reading %02X from prodindex %d\n", dev->status, dev->prodindex); + hasp_log("HASP: Reading %02X from prodindex %d\n", dev->status, dev->prodindex); - dev->prodindex++; + dev->prodindex++; } hasp_log("HASP: read_status() = %02X\n", dev->status); @@ -263,7 +289,6 @@ hasp_read_status(void *priv) return dev->status; } - static void * hasp_init(void *lpt, int type) { @@ -272,7 +297,7 @@ hasp_init(void *lpt, int type) hasp_log("HASP: init(%d)\n", type); - dev->lpt = lpt; + dev->lpt = lpt; dev->type = &hasp_types[type]; dev->status = 0x80; @@ -280,14 +305,12 @@ hasp_init(void *lpt, int type) return dev; } - static void * hasp_init_savquest(void *lpt) { return hasp_init(lpt, HASP_TYPE_SAVQUEST); } - static void hasp_close(void *priv) { @@ -298,15 +321,14 @@ hasp_close(void *priv) free(dev); } - const lpt_device_t lpt_hasp_savquest_device = { - .name = "Protection Dongle for Savage Quest", + .name = "Protection Dongle for Savage Quest", .internal_name = "dongle_savquest", - .init = hasp_init_savquest, - .close = hasp_close, - .write_data = hasp_write_data, - .write_ctrl = NULL, - .read_data = NULL, - .read_status = hasp_read_status, - .read_ctrl = NULL + .init = hasp_init_savquest, + .close = hasp_close, + .write_data = hasp_write_data, + .write_ctrl = NULL, + .read_data = NULL, + .read_status = hasp_read_status, + .read_ctrl = NULL }; diff --git a/src/device/hwm.c b/src/device/hwm.c index 83ac74699..5d9950285 100644 --- a/src/device/hwm.c +++ b/src/device/hwm.c @@ -27,10 +27,8 @@ #include <86box/machine.h> #include <86box/hwm.h> - /* Refer to specific hardware monitor implementations for the meaning of hwm_values. */ -hwm_values_t hwm_values; - +hwm_values_t hwm_values; uint16_t hwm_get_vcore() diff --git a/src/device/hwm_gl518sm.c b/src/device/hwm_gl518sm.c index 102026294..99318ae6f 100644 --- a/src/device/hwm_gl518sm.c +++ b/src/device/hwm_gl518sm.c @@ -28,69 +28,62 @@ #include <86box/i2c.h> #include <86box/hwm.h> - -#define CLAMP(a, min, max) (((a) < (min)) ? (min) : (((a) > (max)) ? (max) : (a))) +#define CLAMP(a, min, max) (((a) < (min)) ? (min) : (((a) > (max)) ? (max) : (a))) /* Formulas and factors derived from Linux's gl518sm.c driver. */ -#define GL518SM_RPM_TO_REG(r, d) ((r) ? CLAMP((480000 + (r) * (d) / 2) / (r) * (d), 1, 255) : 0) -#define GL518SM_VOLTAGE_TO_REG(v) ((uint8_t) round((v) / 19.0)) -#define GL518SM_VDD_TO_REG(v) ((uint8_t) (((v) * 4) / 95.0)) - +#define GL518SM_RPM_TO_REG(r, d) ((r) ? CLAMP((480000 + (r) * (d) / 2) / (r) * (d), 1, 255) : 0) +#define GL518SM_VOLTAGE_TO_REG(v) ((uint8_t) round((v) / 19.0)) +#define GL518SM_VDD_TO_REG(v) ((uint8_t) (((v) *4) / 95.0)) typedef struct { - uint32_t local; - hwm_values_t *values; + uint32_t local; + hwm_values_t *values; uint16_t regs[32]; - uint8_t addr_register: 5; + uint8_t addr_register : 5; - uint8_t i2c_addr: 7, i2c_state: 2, i2c_enabled: 1; + uint8_t i2c_addr : 7, i2c_state : 2, i2c_enabled : 1; } gl518sm_t; - -static uint8_t gl518sm_i2c_start(void *bus, uint8_t addr, uint8_t read, void *priv); -static uint8_t gl518sm_i2c_read(void *bus, uint8_t addr, void *priv); -static uint16_t gl518sm_read(gl518sm_t *dev, uint8_t reg); -static uint8_t gl518sm_i2c_write(void *bus, uint8_t addr, uint8_t data, void *priv); -static uint8_t gl518sm_write(gl518sm_t *dev, uint8_t reg, uint16_t val); -static void gl518sm_reset(gl518sm_t *dev); - +static uint8_t gl518sm_i2c_start(void *bus, uint8_t addr, uint8_t read, void *priv); +static uint8_t gl518sm_i2c_read(void *bus, uint8_t addr, void *priv); +static uint16_t gl518sm_read(gl518sm_t *dev, uint8_t reg); +static uint8_t gl518sm_i2c_write(void *bus, uint8_t addr, uint8_t data, void *priv); +static uint8_t gl518sm_write(gl518sm_t *dev, uint8_t reg, uint16_t val); +static void gl518sm_reset(gl518sm_t *dev); #ifdef ENABLE_GL518SM_LOG int gl518sm_do_log = ENABLE_GL518SM_LOG; - static void gl518sm_log(const char *fmt, ...) { va_list ap; if (gl518sm_do_log) { - va_start(ap, fmt); - pclog_ex(fmt, ap); - va_end(ap); + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); } } #else -#define gl518sm_log(fmt, ...) +# define gl518sm_log(fmt, ...) #endif - static void gl518sm_remap(gl518sm_t *dev, uint8_t addr) { gl518sm_log("GL518SM: remapping to SMBus %02Xh\n", addr); if (dev->i2c_enabled) - i2c_removehandler(i2c_smbus, dev->i2c_addr, 1, gl518sm_i2c_start, gl518sm_i2c_read, gl518sm_i2c_write, NULL, dev); + i2c_removehandler(i2c_smbus, dev->i2c_addr, 1, gl518sm_i2c_start, gl518sm_i2c_read, gl518sm_i2c_write, NULL, dev); if (addr < 0x80) - i2c_sethandler(i2c_smbus, addr, 1, gl518sm_i2c_start, gl518sm_i2c_read, gl518sm_i2c_write, NULL, dev); + i2c_sethandler(i2c_smbus, addr, 1, gl518sm_i2c_start, gl518sm_i2c_read, gl518sm_i2c_write, NULL, dev); - dev->i2c_addr = addr & 0x7f; + dev->i2c_addr = addr & 0x7f; dev->i2c_enabled = !(addr & 0x80); } - static uint8_t gl518sm_i2c_start(void *bus, uint8_t addr, uint8_t read, void *priv) { @@ -101,29 +94,27 @@ gl518sm_i2c_start(void *bus, uint8_t addr, uint8_t read, void *priv) return 1; } - static uint8_t gl518sm_i2c_read(void *bus, uint8_t addr, void *priv) { - gl518sm_t *dev = (gl518sm_t *) priv; - uint16_t read = gl518sm_read(dev, dev->addr_register); - uint8_t ret = 0; + gl518sm_t *dev = (gl518sm_t *) priv; + uint16_t read = gl518sm_read(dev, dev->addr_register); + uint8_t ret = 0; if (dev->i2c_state == 0) - dev->i2c_state = 1; + dev->i2c_state = 1; if ((dev->i2c_state == 1) && (dev->addr_register >= 0x07) && (dev->addr_register <= 0x0c)) { /* two-byte registers: read MSB first */ - dev->i2c_state = 2; - ret = read >> 8; + dev->i2c_state = 2; + ret = read >> 8; } else { - ret = read; - dev->addr_register++; + ret = read; + dev->addr_register++; } return ret; } - static uint16_t gl518sm_read(gl518sm_t *dev, uint8_t reg) { @@ -132,34 +123,34 @@ gl518sm_read(gl518sm_t *dev, uint8_t reg) reg &= 0x1f; switch (reg) { - case 0x04: /* temperature */ - ret = (dev->values->temperatures[0] + 119) & 0xff; - break; + case 0x04: /* temperature */ + ret = (dev->values->temperatures[0] + 119) & 0xff; + break; - case 0x07: /* fan speeds */ - ret = GL518SM_RPM_TO_REG(dev->values->fans[0], 1 << ((dev->regs[0x0f] >> 6) & 0x3)) << 8; - ret |= GL518SM_RPM_TO_REG(dev->values->fans[1], 1 << ((dev->regs[0x0f] >> 4) & 0x3)); - break; + case 0x07: /* fan speeds */ + ret = GL518SM_RPM_TO_REG(dev->values->fans[0], 1 << ((dev->regs[0x0f] >> 6) & 0x3)) << 8; + ret |= GL518SM_RPM_TO_REG(dev->values->fans[1], 1 << ((dev->regs[0x0f] >> 4) & 0x3)); + break; - case 0x0d: /* VIN3 */ - ret = GL518SM_VOLTAGE_TO_REG(dev->values->voltages[2]); - break; + case 0x0d: /* VIN3 */ + ret = GL518SM_VOLTAGE_TO_REG(dev->values->voltages[2]); + break; - case 0x13: /* VIN2 */ - ret = GL518SM_VOLTAGE_TO_REG(dev->values->voltages[1]); - break; + case 0x13: /* VIN2 */ + ret = GL518SM_VOLTAGE_TO_REG(dev->values->voltages[1]); + break; - case 0x14: /* VIN1 */ - ret = GL518SM_VOLTAGE_TO_REG(dev->values->voltages[0]); - break; + case 0x14: /* VIN1 */ + ret = GL518SM_VOLTAGE_TO_REG(dev->values->voltages[0]); + break; - case 0x15: /* VDD */ - ret = GL518SM_VDD_TO_REG(dev->values->voltages[3]); - break; + case 0x15: /* VDD */ + ret = GL518SM_VDD_TO_REG(dev->values->voltages[3]); + break; - default: /* other registers */ - ret = dev->regs[reg]; - break; + default: /* other registers */ + ret = dev->regs[reg]; + break; } gl518sm_log("GL518SM: read(%02X) = %04X\n", reg, ret); @@ -167,72 +158,77 @@ gl518sm_read(gl518sm_t *dev, uint8_t reg) return ret; } - static uint8_t gl518sm_i2c_write(void *bus, uint8_t addr, uint8_t data, void *priv) { gl518sm_t *dev = (gl518sm_t *) priv; switch (dev->i2c_state++) { - case 0: - dev->addr_register = data; - break; + case 0: + dev->addr_register = data; + break; - case 1: - gl518sm_write(dev, dev->addr_register, (gl518sm_read(dev, dev->addr_register) & 0xff00) | data); - break; + case 1: + gl518sm_write(dev, dev->addr_register, (gl518sm_read(dev, dev->addr_register) & 0xff00) | data); + break; - case 2: - gl518sm_write(dev, dev->addr_register, (gl518sm_read(dev, dev->addr_register) << 8) | data); - break; + case 2: + gl518sm_write(dev, dev->addr_register, (gl518sm_read(dev, dev->addr_register) << 8) | data); + break; - default: - dev->i2c_state = 3; - return 0; + default: + dev->i2c_state = 3; + return 0; } return 1; } - static uint8_t gl518sm_write(gl518sm_t *dev, uint8_t reg, uint16_t val) { gl518sm_log("GL518SM: write(%02X, %04X)\n", reg, val); switch (reg) { - case 0x00: case 0x01: case 0x04: case 0x07: case 0x0d: case 0x12: case 0x13: case 0x14: case 0x15: - /* read-only registers */ - return 0; + case 0x00: + case 0x01: + case 0x04: + case 0x07: + case 0x0d: + case 0x12: + case 0x13: + case 0x14: + case 0x15: + /* read-only registers */ + return 0; - case 0x0a: - dev->regs[0x13] = val & 0xff; - break; + case 0x0a: + dev->regs[0x13] = val & 0xff; + break; - case 0x03: - dev->regs[reg] = val & 0xfc; + case 0x03: + dev->regs[reg] = val & 0xfc; - if (val & 0x80) /* Init */ - gl518sm_reset(dev); - break; + if (val & 0x80) /* Init */ + gl518sm_reset(dev); + break; - case 0x0f: - dev->regs[reg] = val & 0xf8; - break; + case 0x0f: + dev->regs[reg] = val & 0xf8; + break; - case 0x11: - dev->regs[reg] = val & 0x7f; - break; + case 0x11: + dev->regs[reg] = val & 0x7f; + break; - default: - dev->regs[reg] = val; - break; + default: + dev->regs[reg] = val; + break; } return 1; } - static void gl518sm_reset(gl518sm_t *dev) { @@ -252,7 +248,6 @@ gl518sm_reset(gl518sm_t *dev) gl518sm_remap(dev, dev->i2c_addr | (dev->i2c_enabled ? 0x00 : 0x80)); } - static void gl518sm_close(void *priv) { @@ -263,7 +258,6 @@ gl518sm_close(void *priv) free(dev); } - static void * gl518sm_init(const device_t *info) { @@ -274,19 +268,24 @@ gl518sm_init(const device_t *info) /* Set default values. */ hwm_values_t defaults = { - { /* fan speeds */ - 3000, /* usually Chassis */ - 3000 /* usually CPU */ - }, { /* temperatures */ - 30 /* usually CPU */ - }, { /* voltages */ - hwm_get_vcore(), /* Vcore */ - RESISTOR_DIVIDER(12000, 150, 47), /* +12V (15K/4.7K divider suggested in the datasheet) */ - 3300, /* +3.3V */ - 5000 /* +5V */ - } + { + /* fan speeds */ + 3000, /* usually Chassis */ + 3000 /* usually CPU */ + }, + { + /* temperatures */ + 30 /* usually CPU */ + }, + { + /* voltages */ + hwm_get_vcore(), /* Vcore */ + RESISTOR_DIVIDER(12000, 150, 47), /* +12V (15K/4.7K divider suggested in the datasheet) */ + 3300, /* +3.3V */ + 5000 /* +5V */ + } }; - hwm_values = defaults; + hwm_values = defaults; dev->values = &hwm_values; gl518sm_reset(dev); @@ -297,30 +296,30 @@ gl518sm_init(const device_t *info) /* GL518SM on SMBus address 2Ch */ const device_t gl518sm_2c_device = { - .name = "Genesys Logic GL518SM Hardware Monitor", + .name = "Genesys Logic GL518SM Hardware Monitor", .internal_name = "gl518sm_2c", - .flags = DEVICE_ISA, - .local = 0x2c, - .init = gl518sm_init, - .close = gl518sm_close, - .reset = NULL, + .flags = DEVICE_ISA, + .local = 0x2c, + .init = gl518sm_init, + .close = gl518sm_close, + .reset = NULL, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; /* GL518SM on SMBus address 2Dh */ const device_t gl518sm_2d_device = { - .name = "Genesys Logic GL518SM Hardware Monitor", + .name = "Genesys Logic GL518SM Hardware Monitor", .internal_name = "gl518sm_2d", - .flags = DEVICE_ISA, - .local = 0x2d, - .init = gl518sm_init, - .close = gl518sm_close, - .reset = NULL, + .flags = DEVICE_ISA, + .local = 0x2d, + .init = gl518sm_init, + .close = gl518sm_close, + .reset = NULL, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; diff --git a/src/device/hwm_lm75.c b/src/device/hwm_lm75.c index b169d8e9e..bf0c0a77a 100644 --- a/src/device/hwm_lm75.c +++ b/src/device/hwm_lm75.c @@ -26,30 +26,26 @@ #include <86box/i2c.h> #include <86box/hwm.h> - -#define LM75_TEMP_TO_REG(t) ((t) << 8) - +#define LM75_TEMP_TO_REG(t) ((t) << 8) #ifdef ENABLE_LM75_LOG int lm75_do_log = ENABLE_LM75_LOG; - static void lm75_log(const char *fmt, ...) { va_list ap; if (lm75_do_log) { - va_start(ap, fmt); - pclog_ex(fmt, ap); - va_end(ap); + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); } } #else -#define lm75_log(fmt, ...) +# define lm75_log(fmt, ...) #endif - static uint8_t lm75_i2c_start(void *bus, uint8_t addr, uint8_t read, void *priv) { @@ -60,25 +56,23 @@ lm75_i2c_start(void *bus, uint8_t addr, uint8_t read, void *priv) return 1; } - uint8_t lm75_read(lm75_t *dev, uint8_t reg) { uint8_t ret; if ((reg & 0x7) == 0x0) /* temperature high byte */ - ret = LM75_TEMP_TO_REG(dev->values->temperatures[dev->local >> 8]) >> 8; + ret = LM75_TEMP_TO_REG(dev->values->temperatures[dev->local >> 8]) >> 8; else if ((reg & 0x7) == 0x1) /* temperature low byte */ - ret = LM75_TEMP_TO_REG(dev->values->temperatures[dev->local >> 8]); + ret = LM75_TEMP_TO_REG(dev->values->temperatures[dev->local >> 8]); else - ret = dev->regs[reg & 0x7]; + ret = dev->regs[reg & 0x7]; lm75_log("LM75: read(%02X) = %02X\n", reg, ret); return ret; } - static uint8_t lm75_i2c_read(void *bus, uint8_t addr, void *priv) { @@ -86,39 +80,38 @@ lm75_i2c_read(void *bus, uint8_t addr, void *priv) uint8_t ret = 0; if (dev->i2c_state == 0) - dev->i2c_state = 1; + dev->i2c_state = 1; /* The AS99127F hardware monitor uses its primary LM75 device's address to access some of its proprietary registers. Pass this operation on to the main monitor code, if necessary. */ if ((dev->addr_register & 0x80) && dev->as99127f) { - ret = lm78_as99127f_read(dev->as99127f, dev->addr_register); + ret = lm78_as99127f_read(dev->as99127f, dev->addr_register); } else { - switch (dev->addr_register & 0x3) { - case 0x0: /* temperature */ - ret = lm75_read(dev, (dev->i2c_state == 1) ? 0x0 : 0x1); - break; + switch (dev->addr_register & 0x3) { + case 0x0: /* temperature */ + ret = lm75_read(dev, (dev->i2c_state == 1) ? 0x0 : 0x1); + break; - case 0x1: /* configuration */ - ret = lm75_read(dev, 0x2); - break; + case 0x1: /* configuration */ + ret = lm75_read(dev, 0x2); + break; - case 0x2: /* Thyst */ - ret = lm75_read(dev, (dev->i2c_state == 1) ? 0x3 : 0x4); - break; - case 0x3: /* Tos */ - ret = lm75_read(dev, (dev->i2c_state == 1) ? 0x5 : 0x6); - break; - } + case 0x2: /* Thyst */ + ret = lm75_read(dev, (dev->i2c_state == 1) ? 0x3 : 0x4); + break; + case 0x3: /* Tos */ + ret = lm75_read(dev, (dev->i2c_state == 1) ? 0x5 : 0x6); + break; + } } if (dev->i2c_state < 2) - dev->i2c_state++; + dev->i2c_state++; return ret; } - uint8_t lm75_write(lm75_t *dev, uint8_t reg, uint8_t val) { @@ -127,77 +120,74 @@ lm75_write(lm75_t *dev, uint8_t reg, uint8_t val) uint8_t reg_idx = (reg & 0x7); if ((reg_idx <= 0x1) || (reg_idx == 0x7)) - return 0; /* read-only registers */ + return 0; /* read-only registers */ dev->regs[reg_idx] = val; return 1; } - static uint8_t lm75_i2c_write(void *bus, uint8_t addr, uint8_t data, void *priv) { lm75_t *dev = (lm75_t *) priv; if ((dev->i2c_state > 2) || ((dev->i2c_state == 2) && ((dev->addr_register & 0x3) == 0x1))) { - return 0; + return 0; } else if (dev->i2c_state == 0) { - dev->i2c_state = 1; - /* Linux lm75.c driver relies on the address register not changing if bit 2 is set. */ - if (((dev->addr_register & 0x80) && dev->as99127f) || !(data & 0x04)) - dev->addr_register = data; - return 1; + dev->i2c_state = 1; + /* Linux lm75.c driver relies on the address register not changing if bit 2 is set. */ + if (((dev->addr_register & 0x80) && dev->as99127f) || !(data & 0x04)) + dev->addr_register = data; + return 1; } /* The AS99127F hardware monitor uses its primary LM75 device's address to access some of its proprietary registers. Pass this operation on to the main monitor code, if necessary. */ if ((dev->addr_register & 0x80) && dev->as99127f) { - return lm78_as99127f_write(dev->as99127f, dev->addr_register, data); + return lm78_as99127f_write(dev->as99127f, dev->addr_register, data); } else { - switch (dev->addr_register & 0x3) { - case 0x0: /* temperature */ - lm75_write(dev, (dev->i2c_state == 1) ? 0x0 : 0x1, data); - break; + switch (dev->addr_register & 0x3) { + case 0x0: /* temperature */ + lm75_write(dev, (dev->i2c_state == 1) ? 0x0 : 0x1, data); + break; - case 0x1: /* configuration */ - lm75_write(dev, 0x2, data); - break; + case 0x1: /* configuration */ + lm75_write(dev, 0x2, data); + break; - case 0x2: /* Thyst */ - lm75_write(dev, (dev->i2c_state == 1) ? 0x3 : 0x4, data); - break; + case 0x2: /* Thyst */ + lm75_write(dev, (dev->i2c_state == 1) ? 0x3 : 0x4, data); + break; - case 0x3: /* Tos */ - lm75_write(dev, (dev->i2c_state == 1) ? 0x5 : 0x6, data); - break; - } + case 0x3: /* Tos */ + lm75_write(dev, (dev->i2c_state == 1) ? 0x5 : 0x6, data); + break; + } } if (dev->i2c_state == 1) - dev->i2c_state = 2; + dev->i2c_state = 2; return 1; } - void lm75_remap(lm75_t *dev, uint8_t addr) { lm75_log("LM75: remapping to SMBus %02Xh\n", addr); if (dev->i2c_enabled) - i2c_removehandler(i2c_smbus, dev->i2c_addr, 1, lm75_i2c_start, lm75_i2c_read, lm75_i2c_write, NULL, dev); + i2c_removehandler(i2c_smbus, dev->i2c_addr, 1, lm75_i2c_start, lm75_i2c_read, lm75_i2c_write, NULL, dev); if (addr < 0x80) - i2c_sethandler(i2c_smbus, addr, 1, lm75_i2c_start, lm75_i2c_read, lm75_i2c_write, NULL, dev); + i2c_sethandler(i2c_smbus, addr, 1, lm75_i2c_start, lm75_i2c_read, lm75_i2c_write, NULL, dev); - dev->i2c_addr = addr & 0x7f; + dev->i2c_addr = addr & 0x7f; dev->i2c_enabled = !(addr & 0x80); } - static void lm75_reset(lm75_t *dev) { @@ -207,7 +197,6 @@ lm75_reset(lm75_t *dev) lm75_remap(dev, dev->i2c_addr | (dev->i2c_enabled ? 0x00 : 0x80)); } - static void lm75_close(void *priv) { @@ -218,7 +207,6 @@ lm75_close(void *priv) free(dev); } - static void * lm75_init(const device_t *info) { @@ -229,10 +217,10 @@ lm75_init(const device_t *info) /* Set default value. */ if (dev->local) - hwm_values.temperatures[dev->local >> 8] = 30; + hwm_values.temperatures[dev->local >> 8] = 30; dev->values = &hwm_values; - dev->i2c_addr = dev->local & 0x7f; + dev->i2c_addr = dev->local & 0x7f; dev->i2c_enabled = 1; lm75_reset(dev); @@ -240,35 +228,33 @@ lm75_init(const device_t *info) return dev; } - /* LM75 on SMBus address 4Ah, reporting temperatures[1]. */ const device_t lm75_1_4a_device = { - .name = "National Semiconductor LM75 Temperature Sensor", + .name = "National Semiconductor LM75 Temperature Sensor", .internal_name = "lm75_1_4a", - .flags = DEVICE_ISA, - .local = 0x14a, - .init = lm75_init, - .close = lm75_close, - .reset = NULL, + .flags = DEVICE_ISA, + .local = 0x14a, + .init = lm75_init, + .close = lm75_close, + .reset = NULL, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; - /* LM75 secondary/tertiary temperature sensors built into the Winbond W83781D family. Not to be used stand-alone. */ const device_t lm75_w83781d_device = { - .name = "Winbond W83781D Secondary Temperature Sensor", + .name = "Winbond W83781D Secondary Temperature Sensor", .internal_name = "lm75_w83781d", - .flags = DEVICE_ISA, - .local = 0, - .init = lm75_init, - .close = lm75_close, - .reset = NULL, + .flags = DEVICE_ISA, + .local = 0, + .init = lm75_init, + .close = lm75_close, + .reset = NULL, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; diff --git a/src/device/hwm_lm78.c b/src/device/hwm_lm78.c index 03e4bb477..f446053d7 100644 --- a/src/device/hwm_lm78.c +++ b/src/device/hwm_lm78.c @@ -31,95 +31,88 @@ #include <86box/i2c.h> #include <86box/hwm.h> +#define LM78_I2C 0x010000 +#define LM78_W83781D 0x020000 +#define LM78_AS99127F_REV1 0x040000 +#define LM78_AS99127F_REV2 0x080000 +#define LM78_W83782D 0x100000 +#define LM78_P5A 0x200000 +#define LM78_AS99127F (LM78_AS99127F_REV1 | LM78_AS99127F_REV2) /* mask covering both _REV1 and _REV2 */ +#define LM78_WINBOND (LM78_W83781D | LM78_AS99127F | LM78_W83782D) /* mask covering all Winbond variants */ +#define LM78_WINBOND_VENDOR_ID ((dev->local & LM78_AS99127F_REV1) ? 0x12c3 : 0x5ca3) +#define LM78_WINBOND_BANK (dev->regs[0x4e] & 0x07) -#define LM78_I2C 0x010000 -#define LM78_W83781D 0x020000 -#define LM78_AS99127F_REV1 0x040000 -#define LM78_AS99127F_REV2 0x080000 -#define LM78_W83782D 0x100000 -#define LM78_P5A 0x200000 -#define LM78_AS99127F (LM78_AS99127F_REV1 | LM78_AS99127F_REV2) /* mask covering both _REV1 and _REV2 */ -#define LM78_WINBOND (LM78_W83781D | LM78_AS99127F | LM78_W83782D) /* mask covering all Winbond variants */ -#define LM78_WINBOND_VENDOR_ID ((dev->local & LM78_AS99127F_REV1) ? 0x12c3 : 0x5ca3) -#define LM78_WINBOND_BANK (dev->regs[0x4e] & 0x07) - -#define CLAMP(a, min, max) (((a) < (min)) ? (min) : (((a) > (max)) ? (max) : (a))) -#define LM78_RPM_TO_REG(r, d) ((r) ? CLAMP(1350000 / (r * d), 1, 255) : 0) -#define LM78_VOLTAGE_TO_REG(v) ((v) >> 4) -#define LM78_NEG_VOLTAGE(v, r) (v * (604.0 / ((double) r))) /* negative voltage formula from the W83781D datasheet */ -#define LM78_NEG_VOLTAGE2(v, r) (((3600 + v) * (((double) r) / (((double) r) + 56.0))) - v) /* negative voltage formula from the W83782D datasheet */ - +#define CLAMP(a, min, max) (((a) < (min)) ? (min) : (((a) > (max)) ? (max) : (a))) +#define LM78_RPM_TO_REG(r, d) ((r) ? CLAMP(1350000 / (r * d), 1, 255) : 0) +#define LM78_VOLTAGE_TO_REG(v) ((v) >> 4) +#define LM78_NEG_VOLTAGE(v, r) (v * (604.0 / ((double) r))) /* negative voltage formula from the W83781D datasheet */ +#define LM78_NEG_VOLTAGE2(v, r) (((3600 + v) * (((double) r) / (((double) r) + 56.0))) - v) /* negative voltage formula from the W83782D datasheet */ typedef struct { - uint32_t local; + uint32_t local; hwm_values_t *values; - device_t *lm75[2]; - pc_timer_t reset_timer; + device_t *lm75[2]; + pc_timer_t reset_timer; - uint8_t regs[256]; + uint8_t regs[256]; union { - struct { - uint8_t regs[2][16]; - } w83782d; - struct { - uint8_t regs[3][128]; + struct { + uint8_t regs[2][16]; + } w83782d; + struct { + uint8_t regs[3][128]; - uint8_t nvram[1024], nvram_i2c_state: 2, nvram_updated: 1; - uint16_t nvram_addr_register: 10; - int8_t nvram_block_len: 6; + uint8_t nvram[1024], nvram_i2c_state : 2, nvram_updated : 1; + uint16_t nvram_addr_register : 10; + int8_t nvram_block_len : 6; - uint8_t security_i2c_state: 1, security_addr_register: 7; - } as99127f; + uint8_t security_i2c_state : 1, security_addr_register : 7; + } as99127f; }; - uint8_t addr_register, data_register; + uint8_t addr_register, data_register; - uint8_t i2c_addr: 7, i2c_state: 1, i2c_enabled: 1; + uint8_t i2c_addr : 7, i2c_state : 1, i2c_enabled : 1; } lm78_t; - -static void lm78_remap(lm78_t *dev, uint8_t addr); - +static void lm78_remap(lm78_t *dev, uint8_t addr); #ifdef ENABLE_LM78_LOG int lm78_do_log = ENABLE_LM78_LOG; - static void lm78_log(const char *fmt, ...) { va_list ap; if (lm78_do_log) { - va_start(ap, fmt); - pclog_ex(fmt, ap); - va_end(ap); + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); } } #else -#define lm78_log(fmt, ...) +# define lm78_log(fmt, ...) #endif - void lm78_nvram(lm78_t *dev, uint8_t save) { - size_t l = strlen(machine_get_internal_name_ex(machine)) + 14; - char *nvr_path = (char *) malloc(l); + size_t l = strlen(machine_get_internal_name_ex(machine)) + 14; + char *nvr_path = (char *) malloc(l); sprintf(nvr_path, "%s_as99127f.nvr", machine_get_internal_name_ex(machine)); FILE *f = nvr_fopen(nvr_path, save ? "wb" : "rb"); if (f) { - if (save) - fwrite(&dev->as99127f.nvram, sizeof(dev->as99127f.nvram), 1, f); - else - (void) !fread(&dev->as99127f.nvram, sizeof(dev->as99127f.nvram), 1, f); - fclose(f); + if (save) + fwrite(&dev->as99127f.nvram, sizeof(dev->as99127f.nvram), 1, f); + else + (void) !fread(&dev->as99127f.nvram, sizeof(dev->as99127f.nvram), 1, f); + fclose(f); } free(nvr_path); } - static uint8_t lm78_nvram_start(void *bus, uint8_t addr, uint8_t read, void *priv) { @@ -130,7 +123,6 @@ lm78_nvram_start(void *bus, uint8_t addr, uint8_t read, void *priv) return 1; } - static uint8_t lm78_nvram_read(void *bus, uint8_t addr, void *priv) { @@ -138,72 +130,70 @@ lm78_nvram_read(void *bus, uint8_t addr, void *priv) uint8_t ret = 0xff; switch (dev->as99127f.nvram_i2c_state) { - case 0: - dev->as99127f.nvram_i2c_state = 1; - /* fall-through */ + case 0: + dev->as99127f.nvram_i2c_state = 1; + /* fall-through */ - case 1: - ret = dev->as99127f.regs[0][0x0b] & 0x3f; - lm78_log("LM78: nvram_read(blocklen) = %02X\n", ret); - break; + case 1: + ret = dev->as99127f.regs[0][0x0b] & 0x3f; + lm78_log("LM78: nvram_read(blocklen) = %02X\n", ret); + break; - case 2: - ret = dev->as99127f.nvram[dev->as99127f.nvram_addr_register]; - lm78_log("LM78: nvram_read(%03X) = %02X\n", dev->as99127f.nvram_addr_register, ret); + case 2: + ret = dev->as99127f.nvram[dev->as99127f.nvram_addr_register]; + lm78_log("LM78: nvram_read(%03X) = %02X\n", dev->as99127f.nvram_addr_register, ret); - dev->as99127f.nvram_addr_register++; - break; + dev->as99127f.nvram_addr_register++; + break; - default: - lm78_log("LM78: nvram_read(unknown) = %02X\n", ret); - break; + default: + lm78_log("LM78: nvram_read(unknown) = %02X\n", ret); + break; } if (dev->as99127f.nvram_i2c_state < 2) - dev->as99127f.nvram_i2c_state++; + dev->as99127f.nvram_i2c_state++; return ret; } - static uint8_t lm78_nvram_write(void *bus, uint8_t addr, uint8_t val, void *priv) { lm78_t *dev = (lm78_t *) priv; switch (dev->as99127f.nvram_i2c_state) { - case 0: - lm78_log("LM78: nvram_write(address, %02X)\n", val); - dev->as99127f.nvram_addr_register = (addr << 8) | val; - break; + case 0: + lm78_log("LM78: nvram_write(address, %02X)\n", val); + dev->as99127f.nvram_addr_register = (addr << 8) | val; + break; - case 1: - lm78_log("LM78: nvram_write(blocklen, %02X)\n", val); - dev->as99127f.nvram_block_len = val & 0x3f; - if (dev->as99127f.nvram_block_len <= 0) - dev->as99127f.nvram_i2c_state = 3; - break; + case 1: + lm78_log("LM78: nvram_write(blocklen, %02X)\n", val); + dev->as99127f.nvram_block_len = val & 0x3f; + if (dev->as99127f.nvram_block_len <= 0) + dev->as99127f.nvram_i2c_state = 3; + break; - case 2: - lm78_log("LM78: nvram_write(%03X, %02X)\n", dev->as99127f.nvram_addr_register, val); - dev->as99127f.nvram[dev->as99127f.nvram_addr_register++] = val; - dev->as99127f.nvram_updated = 1; - if (--dev->as99127f.nvram_block_len <= 0) - dev->as99127f.nvram_i2c_state = 3; - break; + case 2: + lm78_log("LM78: nvram_write(%03X, %02X)\n", dev->as99127f.nvram_addr_register, val); + dev->as99127f.nvram[dev->as99127f.nvram_addr_register++] = val; + dev->as99127f.nvram_updated = 1; + if (--dev->as99127f.nvram_block_len <= 0) + dev->as99127f.nvram_i2c_state = 3; + break; - default: - lm78_log("LM78: nvram_write(unknown, %02X)\n", val); - break; + default: + lm78_log("LM78: nvram_write(unknown, %02X)\n", val); + break; } if (dev->as99127f.nvram_i2c_state < 2) - dev->as99127f.nvram_i2c_state++; + dev->as99127f.nvram_i2c_state++; return dev->as99127f.nvram_i2c_state < 3; } - static uint8_t lm78_security_start(void *bus, uint8_t addr, uint8_t read, void *priv) { @@ -214,7 +204,6 @@ lm78_security_start(void *bus, uint8_t addr, uint8_t read, void *priv) return 1; } - static uint8_t lm78_security_read(void *bus, uint8_t addr, void *priv) { @@ -223,33 +212,35 @@ lm78_security_read(void *bus, uint8_t addr, void *priv) return dev->as99127f.regs[2][dev->as99127f.security_addr_register++]; } - static uint8_t lm78_security_write(void *bus, uint8_t addr, uint8_t val, void *priv) { lm78_t *dev = (lm78_t *) priv; if (dev->as99127f.security_i2c_state == 0) { - dev->as99127f.security_i2c_state = 1; - dev->as99127f.security_addr_register = val; + dev->as99127f.security_i2c_state = 1; + dev->as99127f.security_addr_register = val; } else { - switch (dev->as99127f.security_addr_register) { - case 0xe0: case 0xe4: case 0xe5: case 0xe6: case 0xe7: - /* read-only registers */ - return 1; - } + switch (dev->as99127f.security_addr_register) { + case 0xe0: + case 0xe4: + case 0xe5: + case 0xe6: + case 0xe7: + /* read-only registers */ + return 1; + } - dev->as99127f.regs[2][dev->as99127f.security_addr_register++] = val; + dev->as99127f.regs[2][dev->as99127f.security_addr_register++] = val; } return 1; } - static void lm78_reset(void *priv) { - lm78_t *dev = (lm78_t *) priv; + lm78_t *dev = (lm78_t *) priv; uint8_t initialization = dev->regs[0x40] & 0x80; memset(dev->regs, 0, 256); @@ -259,72 +250,71 @@ lm78_reset(void *priv) dev->regs[0x46] = 0x40; dev->regs[0x47] = 0x50; if (dev->local & LM78_I2C) { - if (!initialization) { /* don't reset main I2C address if the reset was triggered by the INITIALIZATION bit */ - if (dev->local & LM78_P5A) - dev->i2c_addr = 0x77; - else - dev->i2c_addr = 0x2d; - dev->i2c_enabled = 1; - } - dev->regs[0x48] = dev->i2c_addr; - if (dev->local & LM78_WINBOND) - dev->regs[0x4a] = 0x01; + if (!initialization) { /* don't reset main I2C address if the reset was triggered by the INITIALIZATION bit */ + if (dev->local & LM78_P5A) + dev->i2c_addr = 0x77; + else + dev->i2c_addr = 0x2d; + dev->i2c_enabled = 1; + } + dev->regs[0x48] = dev->i2c_addr; + if (dev->local & LM78_WINBOND) + dev->regs[0x4a] = 0x01; } else { - dev->regs[0x48] = 0x00; - if (dev->local & LM78_WINBOND) - dev->regs[0x4a] = 0x88; + dev->regs[0x48] = 0x00; + if (dev->local & LM78_WINBOND) + dev->regs[0x4a] = 0x88; } if (dev->local & LM78_WINBOND) { - dev->regs[0x49] = 0x02; - dev->regs[0x4b] = 0x44; - dev->regs[0x4c] = 0x01; - dev->regs[0x4d] = 0x15; - dev->regs[0x4e] = 0x80; - dev->regs[0x4f] = LM78_WINBOND_VENDOR_ID >> 8; - dev->regs[0x57] = 0x80; + dev->regs[0x49] = 0x02; + dev->regs[0x4b] = 0x44; + dev->regs[0x4c] = 0x01; + dev->regs[0x4d] = 0x15; + dev->regs[0x4e] = 0x80; + dev->regs[0x4f] = LM78_WINBOND_VENDOR_ID >> 8; + dev->regs[0x57] = 0x80; - if (dev->local & LM78_AS99127F) { - dev->regs[0x49] = 0x20; - dev->regs[0x4c] = 0x00; - dev->regs[0x56] = 0xff; - dev->regs[0x57] = 0xff; - dev->regs[0x58] = 0x31; - dev->regs[0x59] = 0x8f; - dev->regs[0x5a] = 0x8f; - dev->regs[0x5b] = 0x2a; - dev->regs[0x5c] = 0xe0; - dev->regs[0x5d] = 0x48; - dev->regs[0x5e] = 0xe2; - dev->regs[0x5f] = 0x1f; + if (dev->local & LM78_AS99127F) { + dev->regs[0x49] = 0x20; + dev->regs[0x4c] = 0x00; + dev->regs[0x56] = 0xff; + dev->regs[0x57] = 0xff; + dev->regs[0x58] = 0x31; + dev->regs[0x59] = 0x8f; + dev->regs[0x5a] = 0x8f; + dev->regs[0x5b] = 0x2a; + dev->regs[0x5c] = 0xe0; + dev->regs[0x5d] = 0x48; + dev->regs[0x5e] = 0xe2; + dev->regs[0x5f] = 0x1f; - dev->as99127f.regs[0][0x02] = 0xff; - dev->as99127f.regs[0][0x03] = 0xff; - dev->as99127f.regs[0][0x08] = 0xff; - dev->as99127f.regs[0][0x09] = 0xff; - dev->as99127f.regs[0][0x0b] = 0x01; + dev->as99127f.regs[0][0x02] = 0xff; + dev->as99127f.regs[0][0x03] = 0xff; + dev->as99127f.regs[0][0x08] = 0xff; + dev->as99127f.regs[0][0x09] = 0xff; + dev->as99127f.regs[0][0x0b] = 0x01; - /* regs[1] and regs[2] start at 0x80 */ - dev->as99127f.regs[1][0x00] = 0x88; - dev->as99127f.regs[1][0x01] = 0x10; - dev->as99127f.regs[1][0x03] = 0x02; /* GPO, but things break if GPO16 isn't set */ - dev->as99127f.regs[1][0x04] = 0x01; - dev->as99127f.regs[1][0x05] = 0x1f; - lm78_as99127f_write(dev, 0x06, 0x2f); + /* regs[1] and regs[2] start at 0x80 */ + dev->as99127f.regs[1][0x00] = 0x88; + dev->as99127f.regs[1][0x01] = 0x10; + dev->as99127f.regs[1][0x03] = 0x02; /* GPO, but things break if GPO16 isn't set */ + dev->as99127f.regs[1][0x04] = 0x01; + dev->as99127f.regs[1][0x05] = 0x1f; + lm78_as99127f_write(dev, 0x06, 0x2f); - dev->as99127f.regs[2][0x60] = 0xf0; - } else if (dev->local & LM78_W83781D) { - dev->regs[0x58] = 0x10; - } else if (dev->local & LM78_W83782D) { - dev->regs[0x58] = 0x30; - } + dev->as99127f.regs[2][0x60] = 0xf0; + } else if (dev->local & LM78_W83781D) { + dev->regs[0x58] = 0x10; + } else if (dev->local & LM78_W83782D) { + dev->regs[0x58] = 0x30; + } } else { - dev->regs[0x49] = 0x40; + dev->regs[0x49] = 0x40; } lm78_remap(dev, dev->i2c_addr | (dev->i2c_enabled ? 0x00 : 0x80)); } - static uint8_t lm78_i2c_start(void *bus, uint8_t addr, uint8_t read, void *priv) { @@ -335,7 +325,6 @@ lm78_i2c_start(void *bus, uint8_t addr, uint8_t read, void *priv) return 1; } - static uint8_t lm78_read(lm78_t *dev, uint8_t reg, uint8_t bank) { @@ -343,41 +332,41 @@ lm78_read(lm78_t *dev, uint8_t reg, uint8_t bank) lm75_t *lm75; if ((dev->local & LM78_AS99127F) && (bank == 3) && (reg != 0x4e)) { - /* AS99127F additional registers */ - if (!((dev->local & LM78_AS99127F_REV2) && ((reg == 0x80) || (reg == 0x81)))) - ret = dev->as99127f.regs[0][reg & 0x7f]; + /* AS99127F additional registers */ + if (!((dev->local & LM78_AS99127F_REV2) && ((reg == 0x80) || (reg == 0x81)))) + ret = dev->as99127f.regs[0][reg & 0x7f]; } else if (bankswitched && ((bank == 1) || (bank == 2))) { - /* LM75 registers */ - lm75 = device_get_priv(dev->lm75[bank - 1]); - if (lm75) - ret = lm75_read(lm75, reg); + /* LM75 registers */ + lm75 = device_get_priv(dev->lm75[bank - 1]); + if (lm75) + ret = lm75_read(lm75, reg); } else if (bankswitched && ((bank == 4) || (bank == 5) || (bank == 6))) { - /* W83782D additional registers */ - if (dev->local & LM78_W83782D) { - if ((bank == 5) && ((reg == 0x50) || (reg == 0x51))) /* voltages */ - ret = LM78_VOLTAGE_TO_REG(dev->values->voltages[7 + (reg & 1)]); - else if (bank < 6) - ret = dev->w83782d.regs[bank - 4][reg & 0x0f]; - } + /* W83782D additional registers */ + if (dev->local & LM78_W83782D) { + if ((bank == 5) && ((reg == 0x50) || (reg == 0x51))) /* voltages */ + ret = LM78_VOLTAGE_TO_REG(dev->values->voltages[7 + (reg & 1)]); + else if (bank < 6) + ret = dev->w83782d.regs[bank - 4][reg & 0x0f]; + } } else { - /* regular registers */ - if ((reg >= 0x60) && (reg <= 0x94)) /* read auto-increment value RAM registers from their non-auto-increment locations */ - masked_reg = reg & 0x3f; - if ((masked_reg >= 0x20) && (masked_reg <= 0x26)) /* voltages */ - ret = LM78_VOLTAGE_TO_REG(dev->values->voltages[reg & 7]); - else if ((dev->local & LM78_AS99127F) && (masked_reg <= 0x05)) /* AS99127F additional voltages */ - ret = LM78_VOLTAGE_TO_REG(dev->values->voltages[7 + masked_reg]); - else if (masked_reg == 0x27) /* temperature */ - ret = dev->values->temperatures[0]; - else if ((masked_reg >= 0x28) && (masked_reg <= 0x2a)) { /* fan speeds */ - ret = (dev->regs[((reg & 3) == 2) ? 0x4b : 0x47] >> ((reg & 3) ? 6 : 4)) & 0x03; /* bits [1:0] */ - if (dev->local & LM78_W83782D) - ret |= (dev->regs[0x5d] >> (3 + (reg & 3))) & 0x04; /* bit 2 */ - ret = LM78_RPM_TO_REG(dev->values->fans[reg & 3], 1 << ret); - } else if ((reg == 0x4f) && (dev->local & LM78_WINBOND)) /* two-byte vendor ID register */ - ret = (dev->regs[0x4e] & 0x80) ? (uint8_t) (LM78_WINBOND_VENDOR_ID >> 8) : (uint8_t) LM78_WINBOND_VENDOR_ID; - else - ret = dev->regs[masked_reg]; + /* regular registers */ + if ((reg >= 0x60) && (reg <= 0x94)) /* read auto-increment value RAM registers from their non-auto-increment locations */ + masked_reg = reg & 0x3f; + if ((masked_reg >= 0x20) && (masked_reg <= 0x26)) /* voltages */ + ret = LM78_VOLTAGE_TO_REG(dev->values->voltages[reg & 7]); + else if ((dev->local & LM78_AS99127F) && (masked_reg <= 0x05)) /* AS99127F additional voltages */ + ret = LM78_VOLTAGE_TO_REG(dev->values->voltages[7 + masked_reg]); + else if (masked_reg == 0x27) /* temperature */ + ret = dev->values->temperatures[0]; + else if ((masked_reg >= 0x28) && (masked_reg <= 0x2a)) { /* fan speeds */ + ret = (dev->regs[((reg & 3) == 2) ? 0x4b : 0x47] >> ((reg & 3) ? 6 : 4)) & 0x03; /* bits [1:0] */ + if (dev->local & LM78_W83782D) + ret |= (dev->regs[0x5d] >> (3 + (reg & 3))) & 0x04; /* bit 2 */ + ret = LM78_RPM_TO_REG(dev->values->fans[reg & 3], 1 << ret); + } else if ((reg == 0x4f) && (dev->local & LM78_WINBOND)) /* two-byte vendor ID register */ + ret = (dev->regs[0x4e] & 0x80) ? (uint8_t) (LM78_WINBOND_VENDOR_ID >> 8) : (uint8_t) LM78_WINBOND_VENDOR_ID; + else + ret = dev->regs[masked_reg]; } lm78_log("LM78: read(%02X, %d) = %02X\n", reg, bank, ret); @@ -385,7 +374,6 @@ lm78_read(lm78_t *dev, uint8_t reg, uint8_t bank) return ret; } - static uint8_t lm78_isa_read(uint16_t port, void *priv) { @@ -393,31 +381,27 @@ lm78_isa_read(uint16_t port, void *priv) uint8_t ret = 0xff; switch (port & 0x7) { - case 0x5: - ret = dev->addr_register & 0x7f; - break; + case 0x5: + ret = dev->addr_register & 0x7f; + break; - case 0x6: - ret = lm78_read(dev, dev->addr_register, LM78_WINBOND_BANK); + case 0x6: + ret = lm78_read(dev, dev->addr_register, LM78_WINBOND_BANK); - if (((LM78_WINBOND_BANK == 0) && - ((dev->addr_register == 0x41) || (dev->addr_register == 0x43) || (dev->addr_register == 0x45) || (dev->addr_register == 0x56) || - ((dev->addr_register >= 0x60) && (dev->addr_register < 0x94)))) || - ((dev->local & LM78_W83782D) && (LM78_WINBOND_BANK == 5) && (dev->addr_register >= 0x50) && (dev->addr_register < 0x58))) { - /* auto-increment registers */ - dev->addr_register++; - } - break; + if (((LM78_WINBOND_BANK == 0) && ((dev->addr_register == 0x41) || (dev->addr_register == 0x43) || (dev->addr_register == 0x45) || (dev->addr_register == 0x56) || ((dev->addr_register >= 0x60) && (dev->addr_register < 0x94)))) || ((dev->local & LM78_W83782D) && (LM78_WINBOND_BANK == 5) && (dev->addr_register >= 0x50) && (dev->addr_register < 0x58))) { + /* auto-increment registers */ + dev->addr_register++; + } + break; - default: - lm78_log("LM78: Read from unknown ISA port %d\n", port & 0x7); - break; + default: + lm78_log("LM78: Read from unknown ISA port %d\n", port & 0x7); + break; } return ret; } - static uint8_t lm78_i2c_read(void *bus, uint8_t addr, void *priv) { @@ -426,7 +410,6 @@ lm78_i2c_read(void *bus, uint8_t addr, void *priv) return lm78_read(dev, dev->addr_register++, LM78_WINBOND_BANK); } - uint8_t lm78_as99127f_read(void *priv, uint8_t reg) { @@ -438,7 +421,6 @@ lm78_as99127f_read(void *priv, uint8_t reg) return ret; } - static uint8_t lm78_write(lm78_t *dev, uint8_t reg, uint8_t val, uint8_t bank) { @@ -447,174 +429,232 @@ lm78_write(lm78_t *dev, uint8_t reg, uint8_t val, uint8_t bank) lm78_log("LM78: write(%02X, %d, %02X)\n", reg, bank, val); if ((dev->local & LM78_AS99127F) && (bank == 3) && (reg != 0x4e)) { - /* AS99127F additional registers */ - reg &= 0x7f; - switch (reg) { - case 0x00: case 0x01: case 0x04: case 0x05: case 0x06: case 0x07: - /* read-only registers */ - return 0; + /* AS99127F additional registers */ + reg &= 0x7f; + switch (reg) { + case 0x00: + case 0x01: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + /* read-only registers */ + return 0; - case 0x20: - val &= 0x7f; - break; - } + case 0x20: + val &= 0x7f; + break; + } - dev->as99127f.regs[0][reg] = val; - return 1; + dev->as99127f.regs[0][reg] = val; + return 1; } else if ((reg & 0xf8) == 0x50) { - if ((bank == 1) || (bank == 2)) { - /* LM75 registers */ - lm75 = device_get_priv(dev->lm75[bank - 1]); - if (lm75) - return lm75_write(lm75, reg, val); - return 1; - } else if (dev->local & LM78_W83782D) { - /* W83782D additional registers */ - if (bank == 4) { - switch (reg) { - case 0x50: case 0x52: case 0x53: case 0x54: case 0x55: case 0x56: case 0x57: - case 0x58: case 0x59: case 0x5a: case 0x5b: case 0x5d: case 0x5e: case 0x5f: - /* read-only registers */ - return 0; - } + if ((bank == 1) || (bank == 2)) { + /* LM75 registers */ + lm75 = device_get_priv(dev->lm75[bank - 1]); + if (lm75) + return lm75_write(lm75, reg, val); + return 1; + } else if (dev->local & LM78_W83782D) { + /* W83782D additional registers */ + if (bank == 4) { + switch (reg) { + case 0x50: + case 0x52: + case 0x53: + case 0x54: + case 0x55: + case 0x56: + case 0x57: + case 0x58: + case 0x59: + case 0x5a: + case 0x5b: + case 0x5d: + case 0x5e: + case 0x5f: + /* read-only registers */ + return 0; + } - dev->w83782d.regs[0][reg & 0x0f] = val; - return 1; - } else if (bank == 5) { - switch (reg) { - case 0x50: case 0x51: case 0x52: case 0x53: case 0x58: case 0x59: case 0x5a: - case 0x5b: case 0x5c: case 0x5d: case 0x5e: case 0x5f: - /* read-only registers */ - return 0; - } + dev->w83782d.regs[0][reg & 0x0f] = val; + return 1; + } else if (bank == 5) { + switch (reg) { + case 0x50: + case 0x51: + case 0x52: + case 0x53: + case 0x58: + case 0x59: + case 0x5a: + case 0x5b: + case 0x5c: + case 0x5d: + case 0x5e: + case 0x5f: + /* read-only registers */ + return 0; + } - dev->w83782d.regs[1][reg & 0x0f] = val; - return 1; - } else if (bank == 6) { - return 0; - } - } + dev->w83782d.regs[1][reg & 0x0f] = val; + return 1; + } else if (bank == 6) { + return 0; + } + } } /* regular registers */ switch (reg) { - case 0x41: case 0x42: case 0x4f: case 0x58: - case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27: case 0x28: case 0x29: case 0x2a: - case 0x60: case 0x61: case 0x62: case 0x63: case 0x64: case 0x65: case 0x66: case 0x67: case 0x68: case 0x69: case 0x6a: - case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: - case 0x80: case 0x81: case 0x82: case 0x83: case 0x84: case 0x85: - /* read-only registers */ - return 0; + case 0x41: + case 0x42: + case 0x4f: + case 0x58: + case 0x20: + case 0x21: + case 0x22: + case 0x23: + case 0x24: + case 0x25: + case 0x26: + case 0x27: + case 0x28: + case 0x29: + case 0x2a: + case 0x60: + case 0x61: + case 0x62: + case 0x63: + case 0x64: + case 0x65: + case 0x66: + case 0x67: + case 0x68: + case 0x69: + case 0x6a: + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x80: + case 0x81: + case 0x82: + case 0x83: + case 0x84: + case 0x85: + /* read-only registers */ + return 0; - case 0x4a: case 0x4b: case 0x4c: case 0x4d: case 0x4e: - /* Winbond-only registers */ - if (!(dev->local & LM78_WINBOND)) - return 0; - break; + case 0x4a: + case 0x4b: + case 0x4c: + case 0x4d: + case 0x4e: + /* Winbond-only registers */ + if (!(dev->local & LM78_WINBOND)) + return 0; + break; } if ((reg >= 0x60) && (reg <= 0x94)) /* write auto-increment value RAM registers to their non-auto-increment locations */ - reg &= 0x3f; - uint8_t prev = dev->regs[reg]; + reg &= 0x3f; + uint8_t prev = dev->regs[reg]; dev->regs[reg] = val; switch (reg) { - case 0x40: - if (val & 0x80) /* INITIALIZATION bit resets all registers except main I2C address */ - lm78_reset(dev); - break; + case 0x40: + if (val & 0x80) /* INITIALIZATION bit resets all registers except main I2C address */ + lm78_reset(dev); + break; - case 0x48: - /* set main I2C address */ - if (dev->local & LM78_I2C) - lm78_remap(dev, dev->regs[0x48] & 0x7f); - break; + case 0x48: + /* set main I2C address */ + if (dev->local & LM78_I2C) + lm78_remap(dev, dev->regs[0x48] & 0x7f); + break; - case 0x49: - if (!(dev->local & LM78_WINBOND)) { - if (val & 0x20) /* Chip Reset bit (LM78 only) resets all registers */ - lm78_reset(dev); - else - dev->regs[0x49] = 0x40; - } else { - dev->regs[0x49] &= 0x01; - } - break; + case 0x49: + if (!(dev->local & LM78_WINBOND)) { + if (val & 0x20) /* Chip Reset bit (LM78 only) resets all registers */ + lm78_reset(dev); + else + dev->regs[0x49] = 0x40; + } else { + dev->regs[0x49] &= 0x01; + } + break; - case 0x4a: - /* set LM75 I2C addresses (Winbond only) */ - if (dev->local & LM78_I2C) { - for (uint8_t i = 0; i <= 1; i++) { - lm75 = device_get_priv(dev->lm75[i]); - if (!lm75) - continue; - if (val & (0x08 * (0x10 * i))) /* DIS_T2 and DIS_T3 bit disable those interfaces */ - lm75_remap(lm75, 0x80); - else - lm75_remap(lm75, 0x48 + ((val >> (i * 4)) & 0x7)); - } - } - break; + case 0x4a: + /* set LM75 I2C addresses (Winbond only) */ + if (dev->local & LM78_I2C) { + for (uint8_t i = 0; i <= 1; i++) { + lm75 = device_get_priv(dev->lm75[i]); + if (!lm75) + continue; + if (val & (0x08 * (0x10 * i))) /* DIS_T2 and DIS_T3 bit disable those interfaces */ + lm75_remap(lm75, 0x80); + else + lm75_remap(lm75, 0x48 + ((val >> (i * 4)) & 0x7)); + } + } + break; - case 0x5c: - /* enable/disable AS99127F NVRAM */ - if (dev->local & LM78_AS99127F) { - if (prev & 0x01) - i2c_removehandler(i2c_smbus, (prev & 0xf8) >> 1, 4, lm78_nvram_start, lm78_nvram_read, lm78_nvram_write, NULL, dev); - if (val & 0x01) - i2c_sethandler(i2c_smbus, (val & 0xf8) >> 1, 4, lm78_nvram_start, lm78_nvram_read, lm78_nvram_write, NULL, dev); - } - break; + case 0x5c: + /* enable/disable AS99127F NVRAM */ + if (dev->local & LM78_AS99127F) { + if (prev & 0x01) + i2c_removehandler(i2c_smbus, (prev & 0xf8) >> 1, 4, lm78_nvram_start, lm78_nvram_read, lm78_nvram_write, NULL, dev); + if (val & 0x01) + i2c_sethandler(i2c_smbus, (val & 0xf8) >> 1, 4, lm78_nvram_start, lm78_nvram_read, lm78_nvram_write, NULL, dev); + } + break; } return 1; } - static void lm78_isa_write(uint16_t port, uint8_t val, void *priv) { lm78_t *dev = (lm78_t *) priv; switch (port & 0x7) { - case 0x5: - dev->addr_register = val & 0x7f; - break; + case 0x5: + dev->addr_register = val & 0x7f; + break; - case 0x6: - lm78_write(dev, dev->addr_register, val, LM78_WINBOND_BANK); + case 0x6: + lm78_write(dev, dev->addr_register, val, LM78_WINBOND_BANK); - if (((LM78_WINBOND_BANK == 0) && - ((dev->addr_register == 0x41) || (dev->addr_register == 0x43) || (dev->addr_register == 0x45) || (dev->addr_register == 0x56) || - ((dev->addr_register >= 0x60) && (dev->addr_register < 0x94)))) || - ((dev->local & LM78_W83782D) && (LM78_WINBOND_BANK == 5) && (dev->addr_register >= 0x50) && (dev->addr_register < 0x58))) { - /* auto-increment registers */ - dev->addr_register++; - } - break; + if (((LM78_WINBOND_BANK == 0) && ((dev->addr_register == 0x41) || (dev->addr_register == 0x43) || (dev->addr_register == 0x45) || (dev->addr_register == 0x56) || ((dev->addr_register >= 0x60) && (dev->addr_register < 0x94)))) || ((dev->local & LM78_W83782D) && (LM78_WINBOND_BANK == 5) && (dev->addr_register >= 0x50) && (dev->addr_register < 0x58))) { + /* auto-increment registers */ + dev->addr_register++; + } + break; - default: - lm78_log("LM78: Write %02X to unknown ISA port %d\n", val, port & 0x7); - break; + default: + lm78_log("LM78: Write %02X to unknown ISA port %d\n", val, port & 0x7); + break; } } - static uint8_t lm78_i2c_write(void *bus, uint8_t addr, uint8_t val, void *priv) { lm78_t *dev = (lm78_t *) priv; if (dev->i2c_state == 0) { - dev->i2c_state = 1; - dev->addr_register = val; + dev->i2c_state = 1; + dev->addr_register = val; } else - lm78_write(dev, dev->addr_register++, val, LM78_WINBOND_BANK); + lm78_write(dev, dev->addr_register++, val, LM78_WINBOND_BANK); return 1; } - uint8_t lm78_as99127f_write(void *priv, uint8_t reg, uint8_t val) { @@ -623,75 +663,73 @@ lm78_as99127f_write(void *priv, uint8_t reg, uint8_t val) lm78_log("LM78: write(%02X, AS99127F, %02X)\n", reg, val); reg &= 0x7f; - uint8_t prev = dev->as99127f.regs[1][reg]; + uint8_t prev = dev->as99127f.regs[1][reg]; dev->as99127f.regs[1][reg] = val; switch (reg) { - case 0x01: - if (val & 0x40) { - dev->as99127f.regs[1][0x00] = 0x88; - dev->as99127f.regs[1][0x01] &= 0xe0; - dev->as99127f.regs[1][0x03] &= 0xf7; - dev->as99127f.regs[1][0x07] &= 0xfe; - } - if (!(val & 0x10)) { /* CUV4X-LS */ - lm78_log("LM78: Reset requested through AS99127F CLKRST\n"); - timer_set_delay_u64(&dev->reset_timer, 300000 * TIMER_USEC); - } - break; + case 0x01: + if (val & 0x40) { + dev->as99127f.regs[1][0x00] = 0x88; + dev->as99127f.regs[1][0x01] &= 0xe0; + dev->as99127f.regs[1][0x03] &= 0xf7; + dev->as99127f.regs[1][0x07] &= 0xfe; + } + if (!(val & 0x10)) { /* CUV4X-LS */ + lm78_log("LM78: Reset requested through AS99127F CLKRST\n"); + timer_set_delay_u64(&dev->reset_timer, 300000 * TIMER_USEC); + } + break; - case 0x06: - /* security device I2C address */ - i2c_removehandler(i2c_smbus, prev & 0x7f, 1, lm78_security_start, lm78_security_read, lm78_security_write, NULL, dev); - i2c_sethandler(i2c_smbus, val & 0x7f, 1, lm78_security_start, lm78_security_read, lm78_security_write, NULL, dev); - break; + case 0x06: + /* security device I2C address */ + i2c_removehandler(i2c_smbus, prev & 0x7f, 1, lm78_security_start, lm78_security_read, lm78_security_write, NULL, dev); + i2c_sethandler(i2c_smbus, val & 0x7f, 1, lm78_security_start, lm78_security_read, lm78_security_write, NULL, dev); + break; - case 0x07: - if (val & 0x01) { /* other AS99127F boards */ - lm78_log("LM78: Reset requested through AS99127F GPO15\n"); - resetx86(); - } - break; + case 0x07: + if (val & 0x01) { /* other AS99127F boards */ + lm78_log("LM78: Reset requested through AS99127F GPO15\n"); + resetx86(); + } + break; } return 1; } - static void lm78_reset_timer(void *priv) { pc_reset_hard(); } - static void lm78_remap(lm78_t *dev, uint8_t addr) { lm75_t *lm75; - if (!(dev->local & LM78_I2C)) return; + if (!(dev->local & LM78_I2C)) + return; lm78_log("LM78: remapping to SMBus %02Xh\n", addr); if (dev->i2c_enabled) - i2c_removehandler(i2c_smbus, dev->i2c_addr, 1, lm78_i2c_start, lm78_i2c_read, lm78_i2c_write, NULL, dev); + i2c_removehandler(i2c_smbus, dev->i2c_addr, 1, lm78_i2c_start, lm78_i2c_read, lm78_i2c_write, NULL, dev); if (addr < 0x80) - i2c_sethandler(i2c_smbus, addr, 1, lm78_i2c_start, lm78_i2c_read, lm78_i2c_write, NULL, dev); + i2c_sethandler(i2c_smbus, addr, 1, lm78_i2c_start, lm78_i2c_read, lm78_i2c_write, NULL, dev); - dev->i2c_addr = addr & 0x7f; + dev->i2c_addr = addr & 0x7f; dev->i2c_enabled = !(addr & 0x80); if (dev->local & LM78_AS99127F) { - /* Store our handle on the primary LM75 device to ensure reads/writes - to the AS99127F's proprietary registers are passed through to this side. */ - if ((lm75 = device_get_priv(dev->lm75[0]))) - lm75->as99127f = dev; + /* Store our handle on the primary LM75 device to ensure reads/writes + to the AS99127F's proprietary registers are passed through to this side. */ + if ((lm75 = device_get_priv(dev->lm75[0]))) + lm75->as99127f = dev; } } - static void lm78_close(void *priv) { @@ -699,15 +737,14 @@ lm78_close(void *priv) uint16_t isa_io = dev->local & 0xffff; if (isa_io) - io_removehandler(isa_io, 8, lm78_isa_read, NULL, NULL, lm78_isa_write, NULL, NULL, dev); + io_removehandler(isa_io, 8, lm78_isa_read, NULL, NULL, lm78_isa_write, NULL, NULL, dev); if (dev->as99127f.nvram_updated) - lm78_nvram(dev, 1); + lm78_nvram(dev, 1); free(dev); } - static void * lm78_init(const device_t *info) { @@ -718,158 +755,163 @@ lm78_init(const device_t *info) /* Set global default values. */ hwm_values_t defaults = { - { /* fan speeds */ - 3000, /* usually Chassis, sometimes CPU */ - 3000, /* usually CPU, sometimes Chassis */ - 3000 /* usually PSU, sometimes Chassis */ - }, { /* temperatures */ - 30, /* usually Board, sometimes Chassis */ - 30, /* Winbond only: usually CPU, sometimes Probe */ - 30 /* Winbond only: usually CPU when not the one above */ - }, { /* voltages */ - hwm_get_vcore(), /* Vcore */ - 0, /* sometimes Vtt, Vio or second CPU */ - 3300, /* +3.3V */ - RESISTOR_DIVIDER(5000, 11, 16), /* +5V (divider values bruteforced) */ - RESISTOR_DIVIDER(12000, 28, 10), /* +12V (28K/10K divider suggested in the W83781D datasheet) */ - LM78_NEG_VOLTAGE(12000, 2100), /* -12V */ - LM78_NEG_VOLTAGE(5000, 909), /* -5V */ - RESISTOR_DIVIDER(5000, 51, 75), /* W83782D/AS99127F only: +5VSB (5.1K/7.5K divider suggested in the datasheet) */ - 3000, /* W83782D/AS99127F only: Vbat */ - 2500, /* AS99127F only: +2.5V */ - 1500, /* AS99127F only: +1.5V */ - 3000, /* AS99127F only: NVRAM */ - 3300 /* AS99127F only: +3.3VSB */ - } + { + /* fan speeds */ + 3000, /* usually Chassis, sometimes CPU */ + 3000, /* usually CPU, sometimes Chassis */ + 3000 /* usually PSU, sometimes Chassis */ + }, + { + /* temperatures */ + 30, /* usually Board, sometimes Chassis */ + 30, /* Winbond only: usually CPU, sometimes Probe */ + 30 /* Winbond only: usually CPU when not the one above */ + }, + { + /* voltages */ + hwm_get_vcore(), /* Vcore */ + 0, /* sometimes Vtt, Vio or second CPU */ + 3300, /* +3.3V */ + RESISTOR_DIVIDER(5000, 11, 16), /* +5V (divider values bruteforced) */ + RESISTOR_DIVIDER(12000, 28, 10), /* +12V (28K/10K divider suggested in the W83781D datasheet) */ + LM78_NEG_VOLTAGE(12000, 2100), /* -12V */ + LM78_NEG_VOLTAGE(5000, 909), /* -5V */ + RESISTOR_DIVIDER(5000, 51, 75), /* W83782D/AS99127F only: +5VSB (5.1K/7.5K divider suggested in the datasheet) */ + 3000, /* W83782D/AS99127F only: Vbat */ + 2500, /* AS99127F only: +2.5V */ + 1500, /* AS99127F only: +1.5V */ + 3000, /* AS99127F only: NVRAM */ + 3300 /* AS99127F only: +3.3VSB */ + } }; /* Set chip-specific default values. */ if (dev->local & LM78_AS99127F) { - /* AS99127F: different -12V Rin value (bruteforced) */ - defaults.voltages[5] = LM78_NEG_VOLTAGE(12000, 2400); + /* AS99127F: different -12V Rin value (bruteforced) */ + defaults.voltages[5] = LM78_NEG_VOLTAGE(12000, 2400); - timer_add(&dev->reset_timer, lm78_reset_timer, dev, 0); + timer_add(&dev->reset_timer, lm78_reset_timer, dev, 0); - lm78_nvram(dev, 0); + lm78_nvram(dev, 0); } else if (dev->local & LM78_W83782D) { - /* W83782D: different negative voltage formula */ - defaults.voltages[5] = LM78_NEG_VOLTAGE2(12000, 232); - defaults.voltages[6] = LM78_NEG_VOLTAGE2(5000, 120); + /* W83782D: different negative voltage formula */ + defaults.voltages[5] = LM78_NEG_VOLTAGE2(12000, 232); + defaults.voltages[6] = LM78_NEG_VOLTAGE2(5000, 120); } - hwm_values = defaults; + hwm_values = defaults; dev->values = &hwm_values; /* Initialize secondary/tertiary LM75 sensors on Winbond. */ for (uint8_t i = 0; i <= 1; i++) { - if (dev->local & LM78_WINBOND) { - dev->lm75[i] = (device_t *) malloc(sizeof(device_t)); - memcpy(dev->lm75[i], &lm75_w83781d_device, sizeof(device_t)); - dev->lm75[i]->local = (i + 1) << 8; - if (dev->local & LM78_I2C) - dev->lm75[i]->local |= 0x48 + i; - device_add(dev->lm75[i]); - } else { - dev->lm75[i] = NULL; - } + if (dev->local & LM78_WINBOND) { + dev->lm75[i] = (device_t *) malloc(sizeof(device_t)); + memcpy(dev->lm75[i], &lm75_w83781d_device, sizeof(device_t)); + dev->lm75[i]->local = (i + 1) << 8; + if (dev->local & LM78_I2C) + dev->lm75[i]->local |= 0x48 + i; + device_add(dev->lm75[i]); + } else { + dev->lm75[i] = NULL; + } } lm78_reset(dev); uint16_t isa_io = dev->local & 0xffff; if (isa_io) - io_sethandler(isa_io, 8, lm78_isa_read, NULL, NULL, lm78_isa_write, NULL, NULL, dev); + io_sethandler(isa_io, 8, lm78_isa_read, NULL, NULL, lm78_isa_write, NULL, NULL, dev); return dev; } /* National Semiconductor LM78 on ISA and SMBus. */ const device_t lm78_device = { - .name = "National Semiconductor LM78 Hardware Monitor", + .name = "National Semiconductor LM78 Hardware Monitor", .internal_name = "lm78", - .flags = DEVICE_ISA, - .local = 0x290 | LM78_I2C, - .init = lm78_init, - .close = lm78_close, - .reset = lm78_reset, + .flags = DEVICE_ISA, + .local = 0x290 | LM78_I2C, + .init = lm78_init, + .close = lm78_close, + .reset = lm78_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; /* Winbond W83781D on ISA and SMBus. */ const device_t w83781d_device = { - .name = "Winbond W83781D Hardware Monitor", + .name = "Winbond W83781D Hardware Monitor", .internal_name = "w83781d", - .flags = DEVICE_ISA, - .local = 0x290 | LM78_I2C | LM78_W83781D, - .init = lm78_init, - .close = lm78_close, - .reset = lm78_reset, + .flags = DEVICE_ISA, + .local = 0x290 | LM78_I2C | LM78_W83781D, + .init = lm78_init, + .close = lm78_close, + .reset = lm78_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; /* Winbond W83781D on ISA and SMBus. */ const device_t w83781d_p5a_device = { - .name = "Winbond W83781D Hardware Monitor (ASUS P5A)", + .name = "Winbond W83781D Hardware Monitor (ASUS P5A)", .internal_name = "w83781d_p5a", - .flags = DEVICE_ISA, - .local = 0x290 | LM78_I2C | LM78_W83781D | LM78_P5A, - .init = lm78_init, - .close = lm78_close, - .reset = lm78_reset, + .flags = DEVICE_ISA, + .local = 0x290 | LM78_I2C | LM78_W83781D | LM78_P5A, + .init = lm78_init, + .close = lm78_close, + .reset = lm78_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; /* The AS99127F is an ASIC manufactured by Holtek for ASUS, containing an I2C-only W83781D clone with additional voltages, GPIOs and fan control. */ const device_t as99127f_device = { - .name = "ASUS AS99127F Rev. 1 Hardware Monitor", + .name = "ASUS AS99127F Rev. 1 Hardware Monitor", .internal_name = "as99137f", - .flags = DEVICE_ISA, - .local = LM78_I2C | LM78_AS99127F_REV1, - .init = lm78_init, - .close = lm78_close, - .reset = lm78_reset, + .flags = DEVICE_ISA, + .local = LM78_I2C | LM78_AS99127F_REV1, + .init = lm78_init, + .close = lm78_close, + .reset = lm78_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; /* Rev. 2 is manufactured by Winbond and differs only in GPI registers. */ const device_t as99127f_rev2_device = { - .name = "ASUS AS99127F Rev. 2 Hardware Monitor", + .name = "ASUS AS99127F Rev. 2 Hardware Monitor", .internal_name = "as99127f_rev2", - .flags = DEVICE_ISA, - .local = LM78_I2C | LM78_AS99127F_REV2, - .init = lm78_init, - .close = lm78_close, - .reset = lm78_reset, + .flags = DEVICE_ISA, + .local = LM78_I2C | LM78_AS99127F_REV2, + .init = lm78_init, + .close = lm78_close, + .reset = lm78_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; /* Winbond W83782D on ISA and SMBus. */ const device_t w83782d_device = { - .name = "Winbond W83782D Hardware Monitor", + .name = "Winbond W83782D Hardware Monitor", .internal_name = "w83783d", - .flags = DEVICE_ISA, - .local = 0x290 | LM78_I2C | LM78_W83782D, - .init = lm78_init, - .close = lm78_close, - .reset = lm78_reset, + .flags = DEVICE_ISA, + .local = 0x290 | LM78_I2C | LM78_W83782D, + .init = lm78_init, + .close = lm78_close, + .reset = lm78_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; diff --git a/src/device/hwm_vt82c686.c b/src/device/hwm_vt82c686.c index 83e67b66e..88603e10a 100644 --- a/src/device/hwm_vt82c686.c +++ b/src/device/hwm_vt82c686.c @@ -26,94 +26,98 @@ #include <86box/io.h> #include <86box/hwm.h> - -#define CLAMP(a, min, max) (((a) < (min)) ? (min) : (((a) > (max)) ? (max) : (a))) +#define CLAMP(a, min, max) (((a) < (min)) ? (min) : (((a) > (max)) ? (max) : (a))) /* Formulas and factors derived from Linux's via686a.c driver. */ -#define VT82C686_RPM_TO_REG(r, d) ((r) ? CLAMP(1350000 / (r * d), 1, 255) : 0) -#define VT82C686_TEMP_TO_REG(t) (-1.160370e-10*(t*t*t*t*t*t) + 3.193693e-08*(t*t*t*t*t) - 1.464447e-06*(t*t*t*t) - 2.525453e-04*(t*t*t) + 1.424593e-02*(t*t) + 2.148941e+00*t + 7.275808e+01) -#define VT82C686_VOLTAGE_TO_REG(v, f) CLAMP((((v) * (2.628 / (f))) - 120.5) / 25, 0, 255) - +#define VT82C686_RPM_TO_REG(r, d) ((r) ? CLAMP(1350000 / (r * d), 1, 255) : 0) +#define VT82C686_TEMP_TO_REG(t) (-1.160370e-10 * (t * t * t * t * t * t) + 3.193693e-08 * (t * t * t * t * t) - 1.464447e-06 * (t * t * t * t) - 2.525453e-04 * (t * t * t) + 1.424593e-02 * (t * t) + 2.148941e+00 * t + 7.275808e+01) +#define VT82C686_VOLTAGE_TO_REG(v, f) CLAMP((((v) * (2.628 / (f))) - 120.5) / 25, 0, 255) typedef struct { hwm_values_t *values; - uint8_t enable; - uint16_t io_base; - uint8_t regs[128]; + uint8_t enable; + uint16_t io_base; + uint8_t regs[128]; } vt82c686_t; +static double voltage_factors[5] = { 1.25, 1.25, 1.67, 2.6, 6.3 }; -static double voltage_factors[5] = {1.25, 1.25, 1.67, 2.6, 6.3}; - - -static void vt82c686_reset(vt82c686_t *dev, uint8_t initialization); - +static void vt82c686_reset(vt82c686_t *dev, uint8_t initialization); static uint8_t vt82c686_read(uint16_t addr, void *priv) { vt82c686_t *dev = (vt82c686_t *) priv; - uint8_t ret; + uint8_t ret; addr -= dev->io_base; switch (addr) { - case 0x00 ... 0x0f: case 0x50 ... 0x7f: /* undefined registers */ - /* Real 686B returns the contents of 0x40. */ - ret = dev->regs[0x40]; - break; + case 0x00 ... 0x0f: + case 0x50 ... 0x7f: /* undefined registers */ + /* Real 686B returns the contents of 0x40. */ + ret = dev->regs[0x40]; + break; - case 0x1f: case 0x20: case 0x21: /* temperatures */ - ret = VT82C686_TEMP_TO_REG(dev->values->temperatures[(addr == 0x1f) ? 2 : (addr & 1)]); - break; + case 0x1f: + case 0x20: + case 0x21: /* temperatures */ + ret = VT82C686_TEMP_TO_REG(dev->values->temperatures[(addr == 0x1f) ? 2 : (addr & 1)]); + break; - case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: /* voltages */ - ret = VT82C686_VOLTAGE_TO_REG(dev->values->voltages[addr - 0x22], voltage_factors[addr - 0x22]); - break; + case 0x22: + case 0x23: + case 0x24: + case 0x25: + case 0x26: /* voltages */ + ret = VT82C686_VOLTAGE_TO_REG(dev->values->voltages[addr - 0x22], voltage_factors[addr - 0x22]); + break; - case 0x29: case 0x2a: /* fan speeds */ - ret = VT82C686_RPM_TO_REG(dev->values->fans[addr - 0x29], 1 << ((dev->regs[0x47] >> ((addr == 0x29) ? 4 : 6)) & 0x3)); - break; + case 0x29: + case 0x2a: /* fan speeds */ + ret = VT82C686_RPM_TO_REG(dev->values->fans[addr - 0x29], 1 << ((dev->regs[0x47] >> ((addr == 0x29) ? 4 : 6)) & 0x3)); + break; - default: /* other registers */ - ret = dev->regs[addr]; - break; + default: /* other registers */ + ret = dev->regs[addr]; + break; } return ret; } - static void vt82c686_write(uint16_t port, uint8_t val, void *priv) { vt82c686_t *dev = (vt82c686_t *) priv; - uint8_t reg = port & 0x7f; + uint8_t reg = port & 0x7f; switch (reg) { - case 0x00 ... 0x0f: - case 0x3f: case 0x41: case 0x42: case 0x4a: - case 0x4c ... 0x7f: - /* Read-only registers. */ - return; + case 0x00 ... 0x0f: + case 0x3f: + case 0x41: + case 0x42: + case 0x4a: + case 0x4c ... 0x7f: + /* Read-only registers. */ + return; - case 0x40: - /* Reset if requested. */ - if (val & 0x80) { - vt82c686_reset(dev, 1); - return; - } - break; + case 0x40: + /* Reset if requested. */ + if (val & 0x80) { + vt82c686_reset(dev, 1); + return; + } + break; - case 0x48: - val &= 0x7f; - break; + case 0x48: + val &= 0x7f; + break; } dev->regs[reg] = val; } - /* Writes to hardware monitor-related configuration space registers of the VT82C686 power management function are sent here by via_pipc.c */ void @@ -122,31 +126,30 @@ vt82c686_hwm_write(uint8_t addr, uint8_t val, void *priv) vt82c686_t *dev = (vt82c686_t *) priv; if (dev->io_base) - io_removehandler(dev->io_base, 128, - vt82c686_read, NULL, NULL, vt82c686_write, NULL, NULL, dev); + io_removehandler(dev->io_base, 128, + vt82c686_read, NULL, NULL, vt82c686_write, NULL, NULL, dev); switch (addr) { - case 0x70: - dev->io_base &= 0xff00; - dev->io_base |= val & 0x80; - break; + case 0x70: + dev->io_base &= 0xff00; + dev->io_base |= val & 0x80; + break; - case 0x71: - dev->io_base &= 0x00ff; - dev->io_base |= val << 8; - break; + case 0x71: + dev->io_base &= 0x00ff; + dev->io_base |= val << 8; + break; - case 0x74: - dev->enable = val & 0x01; - break; + case 0x74: + dev->enable = val & 0x01; + break; } if (dev->enable && dev->io_base) - io_sethandler(dev->io_base, 128, - vt82c686_read, NULL, NULL, vt82c686_write, NULL, NULL, dev); + io_sethandler(dev->io_base, 128, + vt82c686_read, NULL, NULL, vt82c686_write, NULL, NULL, dev); } - static void vt82c686_reset(vt82c686_t *dev, uint8_t initialization) { @@ -159,10 +162,9 @@ vt82c686_reset(vt82c686_t *dev, uint8_t initialization) dev->regs[0x4b] = 0x15; if (!initialization) - vt82c686_hwm_write(0x74, 0x00, dev); + vt82c686_hwm_write(0x74, 0x00, dev); } - static void vt82c686_close(void *priv) { @@ -171,7 +173,6 @@ vt82c686_close(void *priv) free(dev); } - static void * vt82c686_init(const device_t *info) { @@ -181,22 +182,24 @@ vt82c686_init(const device_t *info) /* Set default values. Since this hardware monitor has a complex voltage factor system, the values struct contains voltage values *before* applying their respective factors. */ hwm_values_t defaults = { - { /* fan speeds */ - 3000, /* usually CPU */ - 3000 /* usually Chassis */ - }, { /* temperatures */ - 30, /* usually CPU */ - 30, /* usually System */ - 30 - }, { /* voltages */ - hwm_get_vcore(), /* Vcore */ - 2500, /* +2.5V */ - 3300, /* +3.3V */ - 5000, /* +5V */ - 12000 /* +12V */ - } +// clang-format on + { /* fan speeds */ + 3000, /* usually CPU */ + 3000 /* usually Chassis */ + }, { /* temperatures */ + 30, /* usually CPU */ + 30, /* usually System */ + 30 + }, { /* voltages */ + hwm_get_vcore(), /* Vcore */ + 2500, /* +2.5V */ + 3300, /* +3.3V */ + 5000, /* +5V */ + 12000 /* +12V */ + } +// clang-format on }; - hwm_values = defaults; + hwm_values = defaults; dev->values = &hwm_values; vt82c686_reset(dev, 0); @@ -205,15 +208,15 @@ vt82c686_init(const device_t *info) } const device_t via_vt82c686_hwm_device = { - .name = "VIA VT82C686 Integrated Hardware Monitor", + .name = "VIA VT82C686 Integrated Hardware Monitor", .internal_name = "via_vt82c686_hwm", - .flags = DEVICE_ISA, - .local = 0, - .init = vt82c686_init, - .close = vt82c686_close, - .reset = NULL, + .flags = DEVICE_ISA, + .local = 0, + .init = vt82c686_init, + .close = vt82c686_close, + .reset = NULL, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; diff --git a/src/device/i2c.c b/src/device/i2c.c index ac0e5ee83..79586a9ed 100644 --- a/src/device/i2c.c +++ b/src/device/i2c.c @@ -24,51 +24,45 @@ #include <86box/86box.h> #include <86box/i2c.h> - -#define NADDRS 128 /* I2C supports 128 addresses */ +#define NADDRS 128 /* I2C supports 128 addresses */ #define MAX(a, b) ((a) > (b) ? (a) : (b)) - typedef struct _i2c_ { - uint8_t (*start)(void *bus, uint8_t addr, uint8_t read, void *priv); - uint8_t (*read)(void *bus, uint8_t addr, void *priv); - uint8_t (*write)(void *bus, uint8_t addr, uint8_t data, void *priv); - void (*stop)(void *bus, uint8_t addr, void *priv); + uint8_t (*start)(void *bus, uint8_t addr, uint8_t read, void *priv); + uint8_t (*read)(void *bus, uint8_t addr, void *priv); + uint8_t (*write)(void *bus, uint8_t addr, uint8_t data, void *priv); + void (*stop)(void *bus, uint8_t addr, void *priv); - void *priv; + void *priv; struct _i2c_ *prev, *next; } i2c_t; typedef struct { - char *name; + char *name; i2c_t *devices[NADDRS], *last[NADDRS]; } i2c_bus_t; - void *i2c_smbus; - #ifdef ENABLE_I2C_LOG int i2c_do_log = ENABLE_I2C_LOG; - static void i2c_log(const char *fmt, ...) { va_list ap; if (i2c_do_log) { - va_start(ap, fmt); - pclog_ex(fmt, ap); - va_end(ap); + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); } } #else -#define i2c_log(fmt, ...) +# define i2c_log(fmt, ...) #endif - void * i2c_addbus(char *name) { @@ -80,235 +74,226 @@ i2c_addbus(char *name) return bus; } - void i2c_removebus(void *bus_handle) { - int c; - i2c_t *p, *q; + int c; + i2c_t *p, *q; i2c_bus_t *bus = (i2c_bus_t *) bus_handle; if (!bus_handle) - return; + return; for (c = 0; c < NADDRS; c++) { - p = bus->devices[c]; - if (!p) - continue; - while(p) { - q = p->next; - free(p); - p = q; - } + p = bus->devices[c]; + if (!p) + continue; + while (p) { + q = p->next; + free(p); + p = q; + } } free(bus); } - char * i2c_getbusname(void *bus_handle) { i2c_bus_t *bus = (i2c_bus_t *) bus_handle; if (!bus_handle) - return(NULL); + return (NULL); - return(bus->name); + return (bus->name); } - void i2c_sethandler(void *bus_handle, uint8_t base, int size, - uint8_t (*start)(void *bus, uint8_t addr, uint8_t read, void *priv), - uint8_t (*read)(void *bus, uint8_t addr, void *priv), - uint8_t (*write)(void *bus, uint8_t addr, uint8_t data, void *priv), - void (*stop)(void *bus, uint8_t addr, void *priv), - void *priv) + uint8_t (*start)(void *bus, uint8_t addr, uint8_t read, void *priv), + uint8_t (*read)(void *bus, uint8_t addr, void *priv), + uint8_t (*write)(void *bus, uint8_t addr, uint8_t data, void *priv), + void (*stop)(void *bus, uint8_t addr, void *priv), + void *priv) { - int c; - i2c_t *p, *q = NULL; + int c; + i2c_t *p, *q = NULL; i2c_bus_t *bus = (i2c_bus_t *) bus_handle; if (!bus_handle || ((base + size) > NADDRS)) - return; + return; for (c = 0; c < size; c++) { - p = bus->last[base + c]; - q = (i2c_t *) malloc(sizeof(i2c_t)); - memset(q, 0, sizeof(i2c_t)); - if (p) { - p->next = q; - q->prev = p; - } else { - bus->devices[base + c] = q; - q->prev = NULL; - } + p = bus->last[base + c]; + q = (i2c_t *) malloc(sizeof(i2c_t)); + memset(q, 0, sizeof(i2c_t)); + if (p) { + p->next = q; + q->prev = p; + } else { + bus->devices[base + c] = q; + q->prev = NULL; + } - q->start = start; - q->read = read; - q->write = write; - q->stop = stop; + q->start = start; + q->read = read; + q->write = write; + q->stop = stop; - q->priv = priv; - q->next = NULL; + q->priv = priv; + q->next = NULL; - bus->last[base + c] = q; + bus->last[base + c] = q; } } - void i2c_removehandler(void *bus_handle, uint8_t base, int size, - uint8_t (*start)(void *bus, uint8_t addr, uint8_t read, void *priv), - uint8_t (*read)(void *bus, uint8_t addr, void *priv), - uint8_t (*write)(void *bus, uint8_t addr, uint8_t data, void *priv), - void (*stop)(void *bus, uint8_t addr, void *priv), - void *priv) + uint8_t (*start)(void *bus, uint8_t addr, uint8_t read, void *priv), + uint8_t (*read)(void *bus, uint8_t addr, void *priv), + uint8_t (*write)(void *bus, uint8_t addr, uint8_t data, void *priv), + void (*stop)(void *bus, uint8_t addr, void *priv), + void *priv) { - int c; - i2c_t *p, *q; + int c; + i2c_t *p, *q; i2c_bus_t *bus = (i2c_bus_t *) bus_handle; if (!bus_handle || ((base + size) > NADDRS)) - return; + return; for (c = 0; c < size; c++) { - p = bus->devices[base + c]; - if (!p) - continue; - while(p) { - q = p->next; - if ((p->start == start) && (p->read == read) && (p->write == write) && (p->stop == stop) && (p->priv == priv)) { - if (p->prev) - p->prev->next = p->next; - else - bus->devices[base + c] = p->next; - if (p->next) - p->next->prev = p->prev; - else - bus->last[base + c] = p->prev; - free(p); - p = NULL; - break; - } - p = q; - } + p = bus->devices[base + c]; + if (!p) + continue; + while (p) { + q = p->next; + if ((p->start == start) && (p->read == read) && (p->write == write) && (p->stop == stop) && (p->priv == priv)) { + if (p->prev) + p->prev->next = p->next; + else + bus->devices[base + c] = p->next; + if (p->next) + p->next->prev = p->prev; + else + bus->last[base + c] = p->prev; + free(p); + p = NULL; + break; + } + p = q; + } } } - void i2c_handler(int set, void *bus_handle, uint8_t base, int size, - uint8_t (*start)(void *bus, uint8_t addr, uint8_t read, void *priv), - uint8_t (*read)(void *bus, uint8_t addr, void *priv), - uint8_t (*write)(void *bus, uint8_t addr, uint8_t data, void *priv), - void (*stop)(void *bus, uint8_t addr, void *priv), - void *priv) + uint8_t (*start)(void *bus, uint8_t addr, uint8_t read, void *priv), + uint8_t (*read)(void *bus, uint8_t addr, void *priv), + uint8_t (*write)(void *bus, uint8_t addr, uint8_t data, void *priv), + void (*stop)(void *bus, uint8_t addr, void *priv), + void *priv) { if (set) - i2c_sethandler(bus_handle, base, size, start, read, write, stop, priv); + i2c_sethandler(bus_handle, base, size, start, read, write, stop, priv); else - i2c_removehandler(bus_handle, base, size, start, read, write, stop, priv); + i2c_removehandler(bus_handle, base, size, start, read, write, stop, priv); } - uint8_t i2c_start(void *bus_handle, uint8_t addr, uint8_t read) { - uint8_t ret = 0; + uint8_t ret = 0; i2c_bus_t *bus = (i2c_bus_t *) bus_handle; - i2c_t *p; + i2c_t *p; if (!bus) - return(ret); + return (ret); p = bus->devices[addr]; if (p) { - while(p) { - if (p->start) { - ret |= p->start(bus_handle, addr, read, p->priv); - } - p = p->next; - } + while (p) { + if (p->start) { + ret |= p->start(bus_handle, addr, read, p->priv); + } + p = p->next; + } } i2c_log("I2C %s: start(%02X) = %d\n", bus->name, addr, ret); - return(ret); + return (ret); } - uint8_t i2c_read(void *bus_handle, uint8_t addr) { - uint8_t ret = 0; + uint8_t ret = 0; i2c_bus_t *bus = (i2c_bus_t *) bus_handle; - i2c_t *p; + i2c_t *p; if (!bus) - return(ret); + return (ret); p = bus->devices[addr]; if (p) { - while(p) { - if (p->read) { - ret = p->read(bus_handle, addr, p->priv); - break; - } - p = p->next; - } + while (p) { + if (p->read) { + ret = p->read(bus_handle, addr, p->priv); + break; + } + p = p->next; + } } i2c_log("I2C %s: read(%02X) = %02X\n", bus->name, addr, ret); - return(ret); + return (ret); } - uint8_t i2c_write(void *bus_handle, uint8_t addr, uint8_t data) { - uint8_t ret = 0; - i2c_t *p; + uint8_t ret = 0; + i2c_t *p; i2c_bus_t *bus = (i2c_bus_t *) bus_handle; if (!bus) - return(ret); + return (ret); p = bus->devices[addr]; if (p) { - while(p) { - if (p->write) { - ret |= p->write(bus_handle, addr, data, p->priv); - } - p = p->next; - } + while (p) { + if (p->write) { + ret |= p->write(bus_handle, addr, data, p->priv); + } + p = p->next; + } } i2c_log("I2C %s: write(%02X, %02X) = %d\n", bus->name, addr, data, ret); - return(ret); + return (ret); } - void i2c_stop(void *bus_handle, uint8_t addr) { i2c_bus_t *bus = (i2c_bus_t *) bus_handle; - i2c_t *p; + i2c_t *p; if (!bus) - return; + return; p = bus->devices[addr]; if (p) { - while(p) { - if (p->stop) { - p->stop(bus_handle, addr, p->priv); - } - p = p->next; - } + while (p) { + if (p->stop) { + p->stop(bus_handle, addr, p->priv); + } + p = p->next; + } } i2c_log("I2C %s: stop(%02X)\n", bus->name, addr); diff --git a/src/device/i2c_gpio.c b/src/device/i2c_gpio.c index e3902baaa..e2af6d1de 100644 --- a/src/device/i2c_gpio.c +++ b/src/device/i2c_gpio.c @@ -24,35 +24,31 @@ #include <86box/86box.h> #include <86box/i2c.h> - typedef struct { - char *bus_name; - void *i2c; - uint8_t prev_scl, prev_sda, slave_sda, started, - slave_addr_received, slave_addr, slave_read, pos, byte; + char *bus_name; + void *i2c; + uint8_t prev_scl, prev_sda, slave_sda, started, + slave_addr_received, slave_addr, slave_read, pos, byte; } i2c_gpio_t; - #ifdef ENABLE_I2C_GPIO_LOG int i2c_gpio_do_log = ENABLE_I2C_GPIO_LOG; - static void i2c_gpio_log(int level, const char *fmt, ...) { va_list ap; if (i2c_gpio_do_log >= level) { - va_start(ap, fmt); - pclog_ex(fmt, ap); - va_end(ap); + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); } } #else -#define i2c_gpio_log(fmt, ...) +# define i2c_gpio_log(fmt, ...) #endif - void * i2c_gpio_init(char *bus_name) { @@ -62,14 +58,13 @@ i2c_gpio_init(char *bus_name) i2c_gpio_log(1, "I2C GPIO %s: init()\n", bus_name); dev->bus_name = bus_name; - dev->i2c = i2c_addbus(dev->bus_name); + dev->i2c = i2c_addbus(dev->bus_name); dev->prev_scl = dev->prev_sda = dev->slave_sda = 1; - dev->slave_addr = 0xff; + dev->slave_addr = 0xff; return dev; } - void i2c_gpio_close(void *dev_handle) { @@ -82,7 +77,6 @@ i2c_gpio_close(void *dev_handle) free(dev); } - void i2c_gpio_set(void *dev_handle, uint8_t scl, uint8_t sda) { @@ -91,80 +85,79 @@ i2c_gpio_set(void *dev_handle, uint8_t scl, uint8_t sda) i2c_gpio_log(3, "I2C GPIO %s: write scl=%d->%d sda=%d->%d read=%d\n", dev->bus_name, dev->prev_scl, scl, dev->prev_sda, sda, dev->slave_read); if (dev->prev_scl && scl) { - if (dev->prev_sda && !sda) { - i2c_gpio_log(2, "I2C GPIO %s: Start condition\n", dev->bus_name); - dev->started = 1; - dev->pos = 0; - dev->slave_addr = 0xff; - dev->slave_read = 2; /* start with address transfer */ - dev->slave_sda = 1; - } else if (!dev->prev_sda && sda) { - i2c_gpio_log(2, "I2C GPIO %s: Stop condition\n", dev->bus_name); - dev->started = 0; - if (dev->slave_addr != 0xff) - i2c_stop(dev->i2c, dev->slave_addr); - dev->slave_addr = 0xff; - dev->slave_sda = 1; - } + if (dev->prev_sda && !sda) { + i2c_gpio_log(2, "I2C GPIO %s: Start condition\n", dev->bus_name); + dev->started = 1; + dev->pos = 0; + dev->slave_addr = 0xff; + dev->slave_read = 2; /* start with address transfer */ + dev->slave_sda = 1; + } else if (!dev->prev_sda && sda) { + i2c_gpio_log(2, "I2C GPIO %s: Stop condition\n", dev->bus_name); + dev->started = 0; + if (dev->slave_addr != 0xff) + i2c_stop(dev->i2c, dev->slave_addr); + dev->slave_addr = 0xff; + dev->slave_sda = 1; + } } else if (!dev->prev_scl && scl && dev->started) { - if (dev->pos++ < 8) { - if (dev->slave_read == 1) { - dev->slave_sda = !!(dev->byte & 0x80); - dev->byte <<= 1; - } else { - dev->byte <<= 1; - dev->byte |= sda; - } + if (dev->pos++ < 8) { + if (dev->slave_read == 1) { + dev->slave_sda = !!(dev->byte & 0x80); + dev->byte <<= 1; + } else { + dev->byte <<= 1; + dev->byte |= sda; + } - i2c_gpio_log(2, "I2C GPIO %s: Bit %d = %d\n", dev->bus_name, 8 - dev->pos, (dev->slave_read == 1) ? dev->slave_sda : sda); - } + i2c_gpio_log(2, "I2C GPIO %s: Bit %d = %d\n", dev->bus_name, 8 - dev->pos, (dev->slave_read == 1) ? dev->slave_sda : sda); + } - if (dev->pos == 8) { - i2c_gpio_log(2, "I2C GPIO %s: Byte = %02X\n", dev->bus_name, dev->byte); + if (dev->pos == 8) { + i2c_gpio_log(2, "I2C GPIO %s: Byte = %02X\n", dev->bus_name, dev->byte); - /* (N)ACKing here instead of at the 9th bit may sound odd, but is required by the Matrox Mystique Windows drivers. */ - switch (dev->slave_read) { - case 2: /* address transfer */ - dev->slave_addr = dev->byte >> 1; - dev->slave_read = dev->byte & 1; + /* (N)ACKing here instead of at the 9th bit may sound odd, but is required by the Matrox Mystique Windows drivers. */ + switch (dev->slave_read) { + case 2: /* address transfer */ + dev->slave_addr = dev->byte >> 1; + dev->slave_read = dev->byte & 1; - /* slave ACKs? */ - dev->slave_sda = !i2c_start(dev->i2c, dev->slave_addr, dev->slave_read); - i2c_gpio_log(2, "I2C GPIO %s: Slave %02X %s %sACK\n", dev->bus_name, dev->slave_addr, dev->slave_read ? "read" : "write", dev->slave_sda ? "N" : ""); + /* slave ACKs? */ + dev->slave_sda = !i2c_start(dev->i2c, dev->slave_addr, dev->slave_read); + i2c_gpio_log(2, "I2C GPIO %s: Slave %02X %s %sACK\n", dev->bus_name, dev->slave_addr, dev->slave_read ? "read" : "write", dev->slave_sda ? "N" : ""); - if (!dev->slave_sda && dev->slave_read) /* read first byte on an ACKed read transfer */ - dev->byte = i2c_read(dev->i2c, dev->slave_addr); + if (!dev->slave_sda && dev->slave_read) /* read first byte on an ACKed read transfer */ + dev->byte = i2c_read(dev->i2c, dev->slave_addr); - dev->slave_read |= 0x80; /* slave_read was overwritten; stop the master ACK read logic from running at the 9th bit if we're reading */ - break; + dev->slave_read |= 0x80; /* slave_read was overwritten; stop the master ACK read logic from running at the 9th bit if we're reading */ + break; - case 0: /* write transfer */ - dev->slave_sda = !i2c_write(dev->i2c, dev->slave_addr, dev->byte); - i2c_gpio_log(2, "I2C GPIO %s: Write %02X %sACK\n", dev->bus_name, dev->byte, dev->slave_sda ? "N" : ""); - break; - } - } else if (dev->pos == 9) { - switch (dev->slave_read) { - case 1: /* read transfer (unless we're in an address transfer) */ - if (!sda) /* master ACKs? */ - dev->byte = i2c_read(dev->i2c, dev->slave_addr); - i2c_gpio_log(2, "I2C GPIO %s: Read %02X %sACK\n", dev->bus_name, dev->byte, sda ? "N" : ""); - break; + case 0: /* write transfer */ + dev->slave_sda = !i2c_write(dev->i2c, dev->slave_addr, dev->byte); + i2c_gpio_log(2, "I2C GPIO %s: Write %02X %sACK\n", dev->bus_name, dev->byte, dev->slave_sda ? "N" : ""); + break; + } + } else if (dev->pos == 9) { + switch (dev->slave_read) { + case 1: /* read transfer (unless we're in an address transfer) */ + if (!sda) /* master ACKs? */ + dev->byte = i2c_read(dev->i2c, dev->slave_addr); + i2c_gpio_log(2, "I2C GPIO %s: Read %02X %sACK\n", dev->bus_name, dev->byte, sda ? "N" : ""); + break; - default: - dev->slave_read &= 1; /* if we're in an address transfer, clear it */ - } - dev->pos = 0; /* start over */ - } + default: + dev->slave_read &= 1; /* if we're in an address transfer, clear it */ + } + dev->pos = 0; /* start over */ + } } else if (dev->prev_scl && !scl && (dev->pos != 8)) { /* keep (N)ACK computed at the 8th bit when transitioning to the 9th bit */ - dev->slave_sda = 1; + dev->slave_sda = 1; } dev->prev_scl = scl; dev->prev_sda = sda; } - uint8_t i2c_gpio_get_scl(void *dev_handle) { @@ -172,7 +165,6 @@ i2c_gpio_get_scl(void *dev_handle) return dev->prev_scl; } - uint8_t i2c_gpio_get_sda(void *dev_handle) { @@ -181,7 +173,6 @@ i2c_gpio_get_sda(void *dev_handle) return dev->prev_sda && dev->slave_sda; } - void * i2c_gpio_get_bus(void *dev_handle) { diff --git a/src/device/ibm_5161.c b/src/device/ibm_5161.c index 9e47199b7..d2ba5cac0 100644 --- a/src/device/ibm_5161.c +++ b/src/device/ibm_5161.c @@ -29,7 +29,6 @@ #include <86box/port_92.h> #include <86box/machine.h> - typedef struct { uint8_t regs[8]; diff --git a/src/device/isamem.c b/src/device/isamem.c index 4fd3e6ab2..512289716 100644 --- a/src/device/isamem.c +++ b/src/device/isamem.c @@ -86,249 +86,242 @@ #include "cpu.h" -#define ISAMEM_IBMXT_CARD 0 -#define ISAMEM_GENXT_CARD 1 -#define ISAMEM_RAMCARD_CARD 2 +#define ISAMEM_IBMXT_CARD 0 +#define ISAMEM_GENXT_CARD 1 +#define ISAMEM_RAMCARD_CARD 2 #define ISAMEM_SYSTEMCARD_CARD 3 -#define ISAMEM_IBMAT_CARD 4 -#define ISAMEM_GENAT_CARD 5 -#define ISAMEM_P5PAK_CARD 6 -#define ISAMEM_A6PAK_CARD 7 -#define ISAMEM_EMS5150_CARD 8 -#define ISAMEM_EV159_CARD 10 -#define ISAMEM_RAMPAGEXT_CARD 11 +#define ISAMEM_IBMAT_CARD 4 +#define ISAMEM_GENAT_CARD 5 +#define ISAMEM_P5PAK_CARD 6 +#define ISAMEM_A6PAK_CARD 7 +#define ISAMEM_EMS5150_CARD 8 +#define ISAMEM_EV159_CARD 10 +#define ISAMEM_RAMPAGEXT_CARD 11 #define ISAMEM_ABOVEBOARD_CARD 12 -#define ISAMEM_BRAT_CARD 13 +#define ISAMEM_BRAT_CARD 13 -#define ISAMEM_DEBUG 0 +#define ISAMEM_DEBUG 0 -#define RAM_TOPMEM (640 << 10) /* end of low memory */ -#define RAM_UMAMEM (384 << 10) /* upper memory block */ -#define RAM_EXTMEM (1024 << 10) /* start of high memory */ +#define RAM_TOPMEM (640 << 10) /* end of low memory */ +#define RAM_UMAMEM (384 << 10) /* upper memory block */ +#define RAM_EXTMEM (1024 << 10) /* start of high memory */ -#define EMS_MAXSIZE (2048 << 10) /* max EMS memory size */ -#define EMS_PGSIZE (16 << 10) /* one page is this big */ -#define EMS_MAXPAGE 4 /* number of viewport pages */ +#define EMS_MAXSIZE (2048 << 10) /* max EMS memory size */ +#define EMS_PGSIZE (16 << 10) /* one page is this big */ +#define EMS_MAXPAGE 4 /* number of viewport pages */ -#define EXTRAM_CONVENTIONAL 0 -#define EXTRAM_HIGH 1 -#define EXTRAM_XMS 2 +#define EXTRAM_CONVENTIONAL 0 +#define EXTRAM_HIGH 1 +#define EXTRAM_XMS 2 typedef struct { - int8_t enabled; /* 1=ENABLED */ - uint8_t page; /* page# in EMS RAM */ - uint8_t frame; /* (varies with board) */ - char pad; - uint8_t *addr; /* start addr in EMS RAM */ - mem_mapping_t mapping; /* mapping entry for page */ + int8_t enabled; /* 1=ENABLED */ + uint8_t page; /* page# in EMS RAM */ + uint8_t frame; /* (varies with board) */ + char pad; + uint8_t *addr; /* start addr in EMS RAM */ + mem_mapping_t mapping; /* mapping entry for page */ } emsreg_t; typedef struct { - uint32_t base; - uint8_t *ptr; + uint32_t base; + uint8_t *ptr; } ext_ram_t; typedef struct { - const char *name; - uint8_t board : 6, /* board type */ - reserved : 2; + const char *name; + uint8_t board : 6, /* board type */ + reserved : 2; - uint8_t flags; -#define FLAG_CONFIG 0x01 /* card is configured */ -#define FLAG_WIDE 0x10 /* card uses 16b mode */ -#define FLAG_FAST 0x20 /* fast (<= 120ns) chips */ -#define FLAG_EMS 0x40 /* card has EMS mode enabled */ + uint8_t flags; +#define FLAG_CONFIG 0x01 /* card is configured */ +#define FLAG_WIDE 0x10 /* card uses 16b mode */ +#define FLAG_FAST 0x20 /* fast (<= 120ns) chips */ +#define FLAG_EMS 0x40 /* card has EMS mode enabled */ - uint16_t total_size; /* configured size in KB */ - uint32_t base_addr, /* configured I/O address */ - start_addr, /* configured memory start */ - frame_addr; /* configured frame address */ + uint16_t total_size; /* configured size in KB */ + uint32_t base_addr, /* configured I/O address */ + start_addr, /* configured memory start */ + frame_addr; /* configured frame address */ - uint16_t ems_size, /* EMS size in KB */ - ems_pages; /* EMS size in pages */ - uint32_t ems_start; /* start of EMS in RAM */ + uint16_t ems_size, /* EMS size in KB */ + ems_pages; /* EMS size in pages */ + uint32_t ems_start; /* start of EMS in RAM */ - uint8_t *ram; /* allocated RAM buffer */ + uint8_t *ram; /* allocated RAM buffer */ - ext_ram_t ext_ram[3]; /* structures for the mappings */ + ext_ram_t ext_ram[3]; /* structures for the mappings */ - mem_mapping_t low_mapping; /* mapping for low mem */ - mem_mapping_t high_mapping; /* mapping for high mem */ + mem_mapping_t low_mapping; /* mapping for low mem */ + mem_mapping_t high_mapping; /* mapping for high mem */ - emsreg_t ems[EMS_MAXPAGE]; /* EMS controller registers */ + emsreg_t ems[EMS_MAXPAGE]; /* EMS controller registers */ } memdev_t; #ifdef ENABLE_ISAMEM_LOG int isamem_do_log = ENABLE_ISAMEM_LOG; - static void isamem_log(const char *fmt, ...) { va_list ap; if (isamem_do_log) { - va_start(ap, fmt); - pclog_ex(fmt, ap); - va_end(ap); + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); } } #else -#define isamem_log(fmt, ...) +# define isamem_log(fmt, ...) #endif - /* Why this convoluted setup with the mem_dev stuff when it's much simpler to just pass the exec pointer as p as well, and then just use that. */ /* Read one byte from onboard RAM. */ static uint8_t ram_readb(uint32_t addr, void *priv) { - ext_ram_t *dev = (ext_ram_t *)priv; - uint8_t ret = 0xff; + ext_ram_t *dev = (ext_ram_t *) priv; + uint8_t ret = 0xff; /* Grab the data. */ - ret = *(uint8_t *)(dev->ptr + (addr - dev->base)); + ret = *(uint8_t *) (dev->ptr + (addr - dev->base)); - return(ret); + return (ret); } - /* Read one word from onboard RAM. */ static uint16_t ram_readw(uint32_t addr, void *priv) { - ext_ram_t *dev = (ext_ram_t *)priv; - uint16_t ret = 0xffff; + ext_ram_t *dev = (ext_ram_t *) priv; + uint16_t ret = 0xffff; /* Grab the data. */ - ret = *(uint16_t *)(dev->ptr + (addr - dev->base)); + ret = *(uint16_t *) (dev->ptr + (addr - dev->base)); - return(ret); + return (ret); } - /* Write one byte to onboard RAM. */ static void ram_writeb(uint32_t addr, uint8_t val, void *priv) { - ext_ram_t *dev = (ext_ram_t *)priv; + ext_ram_t *dev = (ext_ram_t *) priv; /* Write the data. */ - *(uint8_t *)(dev->ptr + (addr - dev->base)) = val; + *(uint8_t *) (dev->ptr + (addr - dev->base)) = val; } - /* Write one word to onboard RAM. */ static void ram_writew(uint32_t addr, uint16_t val, void *priv) { - ext_ram_t *dev = (ext_ram_t *)priv; + ext_ram_t *dev = (ext_ram_t *) priv; /* Write the data. */ - *(uint16_t *)(dev->ptr + (addr - dev->base)) = val; + *(uint16_t *) (dev->ptr + (addr - dev->base)) = val; } - /* Read one byte from onboard paged RAM. */ static uint8_t ems_readb(uint32_t addr, void *priv) { - memdev_t *dev = (memdev_t *)priv; - uint8_t ret = 0xff; + memdev_t *dev = (memdev_t *) priv; + uint8_t ret = 0xff; /* Grab the data. */ - ret = *(uint8_t *)(dev->ems[((addr & 0xffff) >> 14)].addr + (addr & 0x3fff)); + ret = *(uint8_t *) (dev->ems[((addr & 0xffff) >> 14)].addr + (addr & 0x3fff)); #if ISAMEM_DEBUG - if ((addr % 4096)==0) isamem_log("EMS readb(%06x) = %02x\n",addr-dev&0x3fff,ret); + if ((addr % 4096) == 0) + isamem_log("EMS readb(%06x) = %02x\n", addr - dev & 0x3fff, ret); #endif - return(ret); + return (ret); } - /* Read one word from onboard paged RAM. */ static uint16_t ems_readw(uint32_t addr, void *priv) { - memdev_t *dev = (memdev_t *)priv; - uint16_t ret = 0xffff; + memdev_t *dev = (memdev_t *) priv; + uint16_t ret = 0xffff; /* Grab the data. */ - ret = *(uint16_t *)(dev->ems[((addr & 0xffff) >> 14)].addr + (addr & 0x3fff)); + ret = *(uint16_t *) (dev->ems[((addr & 0xffff) >> 14)].addr + (addr & 0x3fff)); #if ISAMEM_DEBUG - if ((addr % 4096)==0) isamem_log("EMS readw(%06x) = %04x\n",addr-dev&0x3fff,ret); + if ((addr % 4096) == 0) + isamem_log("EMS readw(%06x) = %04x\n", addr - dev & 0x3fff, ret); #endif - return(ret); + return (ret); } - /* Write one byte to onboard paged RAM. */ static void ems_writeb(uint32_t addr, uint8_t val, void *priv) { - memdev_t *dev = (memdev_t *)priv; + memdev_t *dev = (memdev_t *) priv; /* Write the data. */ #if ISAMEM_DEBUG - if ((addr % 4096)==0) isamem_log("EMS writeb(%06x, %02x)\n",addr-dev&0x3fff,val); + if ((addr % 4096) == 0) + isamem_log("EMS writeb(%06x, %02x)\n", addr - dev & 0x3fff, val); #endif - *(uint8_t *)(dev->ems[((addr & 0xffff) >> 14)].addr + (addr & 0x3fff)) = val; + *(uint8_t *) (dev->ems[((addr & 0xffff) >> 14)].addr + (addr & 0x3fff)) = val; } - /* Write one word to onboard paged RAM. */ static void ems_writew(uint32_t addr, uint16_t val, void *priv) { - memdev_t *dev = (memdev_t *)priv; + memdev_t *dev = (memdev_t *) priv; /* Write the data. */ #if ISAMEM_DEBUG - if ((addr % 4096)==0) isamem_log("EMS writew(%06x, %04x)\n",addr&0x3fff,val); + if ((addr % 4096) == 0) + isamem_log("EMS writew(%06x, %04x)\n", addr & 0x3fff, val); #endif - *(uint16_t *)(dev->ems[((addr & 0xffff) >> 14)].addr + (addr & 0x3fff)) = val; + *(uint16_t *) (dev->ems[((addr & 0xffff) >> 14)].addr + (addr & 0x3fff)) = val; } - /* Handle a READ operation from one of our registers. */ static uint8_t ems_read(uint16_t port, void *priv) { - memdev_t *dev = (memdev_t *)priv; - uint8_t ret = 0xff; - int vpage; + memdev_t *dev = (memdev_t *) priv; + uint8_t ret = 0xff; + int vpage; /* Get the viewport page number. */ vpage = (port / EMS_PGSIZE); port &= (EMS_PGSIZE - 1); - switch(port - dev->base_addr) { - case 0x0000: /* page number register */ - ret = dev->ems[vpage].page; - if (dev->ems[vpage].enabled) - ret |= 0x80; - break; + switch (port - dev->base_addr) { + case 0x0000: /* page number register */ + ret = dev->ems[vpage].page; + if (dev->ems[vpage].enabled) + ret |= 0x80; + break; - case 0x0001: /* W/O */ - break; + case 0x0001: /* W/O */ + break; } #if ISAMEM_DEBUG isamem_log("ISAMEM: read(%04x) = %02x)\n", port, ret); #endif - return(ret); + return (ret); } - /* Handle a WRITE operation to one of our registers. */ static void ems_write(uint16_t port, uint8_t val, void *priv) { - memdev_t *dev = (memdev_t *)priv; - int vpage; + memdev_t *dev = (memdev_t *) priv; + int vpage; /* Get the viewport page number. */ vpage = (port / EMS_PGSIZE); @@ -338,136 +331,135 @@ ems_write(uint16_t port, uint8_t val, void *priv) isamem_log("ISAMEM: write(%04x, %02x) page=%d\n", port, val, vpage); #endif - switch(port - dev->base_addr) { - case 0x0000: /* page mapping registers */ - /* Set the page number. */ - dev->ems[vpage].enabled = (val & 0x80); - dev->ems[vpage].page = (val & 0x7f); + switch (port - dev->base_addr) { + case 0x0000: /* page mapping registers */ + /* Set the page number. */ + dev->ems[vpage].enabled = (val & 0x80); + dev->ems[vpage].page = (val & 0x7f); - /* Make sure we can do that.. */ - if (dev->flags & FLAG_CONFIG) { - if (dev->ems[vpage].page < dev->ems_pages) { - /* Pre-calculate the page address in EMS RAM. */ - dev->ems[vpage].addr = dev->ram + dev->ems_start + ((val & 0x7f) * EMS_PGSIZE); - } else { - /* That page does not exist. */ - dev->ems[vpage].enabled = 0; - } + /* Make sure we can do that.. */ + if (dev->flags & FLAG_CONFIG) { + if (dev->ems[vpage].page < dev->ems_pages) { + /* Pre-calculate the page address in EMS RAM. */ + dev->ems[vpage].addr = dev->ram + dev->ems_start + ((val & 0x7f) * EMS_PGSIZE); + } else { + /* That page does not exist. */ + dev->ems[vpage].enabled = 0; + } - if (dev->ems[vpage].enabled) { - /* Update the EMS RAM address for this page. */ - mem_mapping_set_exec(&dev->ems[vpage].mapping, - dev->ems[vpage].addr); + if (dev->ems[vpage].enabled) { + /* Update the EMS RAM address for this page. */ + mem_mapping_set_exec(&dev->ems[vpage].mapping, + dev->ems[vpage].addr); - /* Enable this page. */ - mem_mapping_enable(&dev->ems[vpage].mapping); - } else { - /* Disable this page. */ - mem_mapping_disable(&dev->ems[vpage].mapping); - } - } - break; + /* Enable this page. */ + mem_mapping_enable(&dev->ems[vpage].mapping); + } else { + /* Disable this page. */ + mem_mapping_disable(&dev->ems[vpage].mapping); + } + } + break; - case 0x0001: /* page frame registers */ - /* - * The EV-159 EMM driver configures the frame address - * by setting bits in these registers. The information - * in their manual is unclear, but here is what was - * found out by repeatedly changing EMM's config: - * - * 00 04 08 Address - * ----------------- - * 80 c0 e0 C0000 - * 80 c0 e0 C4000 - * 80 c0 e0 C8000 - * 80 c0 e0 CC000 - * 80 c0 e0 D0000 - * 80 c0 e0 D4000 - * 80 c0 e0 D8000 - * 80 c0 e0 DC000 - * 80 c0 e0 E0000 - */ -isamem_log("EMS: write(%02x) to register 1 !\n"); - dev->ems[vpage].frame = val; - if (val) - dev->flags |= FLAG_CONFIG; - break; + case 0x0001: /* page frame registers */ + /* + * The EV-159 EMM driver configures the frame address + * by setting bits in these registers. The information + * in their manual is unclear, but here is what was + * found out by repeatedly changing EMM's config: + * + * 00 04 08 Address + * ----------------- + * 80 c0 e0 C0000 + * 80 c0 e0 C4000 + * 80 c0 e0 C8000 + * 80 c0 e0 CC000 + * 80 c0 e0 D0000 + * 80 c0 e0 D4000 + * 80 c0 e0 D8000 + * 80 c0 e0 DC000 + * 80 c0 e0 E0000 + */ + isamem_log("EMS: write(%02x) to register 1 !\n"); + dev->ems[vpage].frame = val; + if (val) + dev->flags |= FLAG_CONFIG; + break; } } - /* Initialize the device for use. */ static void * isamem_init(const device_t *info) { memdev_t *dev; - uint32_t k, t; - uint32_t addr; - uint32_t tot; - uint8_t *ptr; - int i; + uint32_t k, t; + uint32_t addr; + uint32_t tot; + uint8_t *ptr; + int i; /* Find our device and create an instance. */ - dev = (memdev_t *)malloc(sizeof(memdev_t)); + dev = (memdev_t *) malloc(sizeof(memdev_t)); memset(dev, 0x00, sizeof(memdev_t)); - dev->name = info->name; + dev->name = info->name; dev->board = info->local; /* Do per-board initialization. */ tot = 0; - switch(dev->board) { - case ISAMEM_IBMXT_CARD: /* IBM PC/XT Memory Expansion Card */ - case ISAMEM_GENXT_CARD: /* Generic PC/XT Memory Expansion Card */ - case ISAMEM_RAMCARD_CARD: /* Microsoft RAMCard for IBM PC */ - case ISAMEM_SYSTEMCARD_CARD: /* Microsoft SystemCard */ - case ISAMEM_P5PAK_CARD: /* Paradise Systems 5-PAK */ - case ISAMEM_A6PAK_CARD: /* AST SixPakPlus */ - dev->total_size = device_get_config_int("size"); - dev->start_addr = device_get_config_int("start"); - tot = dev->total_size; - break; + switch (dev->board) { + case ISAMEM_IBMXT_CARD: /* IBM PC/XT Memory Expansion Card */ + case ISAMEM_GENXT_CARD: /* Generic PC/XT Memory Expansion Card */ + case ISAMEM_RAMCARD_CARD: /* Microsoft RAMCard for IBM PC */ + case ISAMEM_SYSTEMCARD_CARD: /* Microsoft SystemCard */ + case ISAMEM_P5PAK_CARD: /* Paradise Systems 5-PAK */ + case ISAMEM_A6PAK_CARD: /* AST SixPakPlus */ + dev->total_size = device_get_config_int("size"); + dev->start_addr = device_get_config_int("start"); + tot = dev->total_size; + break; - case ISAMEM_IBMAT_CARD: /* IBM PC/AT Memory Expansion Card */ - case ISAMEM_GENAT_CARD: /* Generic PC/AT Memory Expansion Card */ - dev->total_size = device_get_config_int("size"); - dev->start_addr = device_get_config_int("start"); - tot = dev->total_size; - dev->flags |= FLAG_WIDE; - break; + case ISAMEM_IBMAT_CARD: /* IBM PC/AT Memory Expansion Card */ + case ISAMEM_GENAT_CARD: /* Generic PC/AT Memory Expansion Card */ + dev->total_size = device_get_config_int("size"); + dev->start_addr = device_get_config_int("start"); + tot = dev->total_size; + dev->flags |= FLAG_WIDE; + break; - case ISAMEM_EMS5150_CARD: /* Micro Mainframe EMS-5150(T) */ - dev->base_addr = device_get_config_hex16("base"); - dev->total_size = device_get_config_int("size"); - dev->frame_addr = 0xD0000; - dev->flags |= (FLAG_EMS | FLAG_CONFIG); - break; + case ISAMEM_EMS5150_CARD: /* Micro Mainframe EMS-5150(T) */ + dev->base_addr = device_get_config_hex16("base"); + dev->total_size = device_get_config_int("size"); + dev->frame_addr = 0xD0000; + dev->flags |= (FLAG_EMS | FLAG_CONFIG); + break; - case ISAMEM_EV159_CARD: /* Everex EV-159 RAM 3000 */ - dev->base_addr = device_get_config_hex16("base"); - dev->total_size = device_get_config_int("size"); - dev->start_addr = device_get_config_int("start"); - tot = device_get_config_int("length"); - if (!!device_get_config_int("width")) - dev->flags |= FLAG_WIDE; - if (!!device_get_config_int("speed")) - dev->flags |= FLAG_FAST; - if (!!device_get_config_int("ems")) - dev->flags |= FLAG_EMS; -dev->frame_addr = 0xE0000; - break; + case ISAMEM_EV159_CARD: /* Everex EV-159 RAM 3000 */ + dev->base_addr = device_get_config_hex16("base"); + dev->total_size = device_get_config_int("size"); + dev->start_addr = device_get_config_int("start"); + tot = device_get_config_int("length"); + if (!!device_get_config_int("width")) + dev->flags |= FLAG_WIDE; + if (!!device_get_config_int("speed")) + dev->flags |= FLAG_FAST; + if (!!device_get_config_int("ems")) + dev->flags |= FLAG_EMS; + dev->frame_addr = 0xE0000; + break; - case ISAMEM_RAMPAGEXT_CARD: /* AST RAMpage/XT */ - case ISAMEM_ABOVEBOARD_CARD: /* Intel AboveBoard */ - case ISAMEM_BRAT_CARD: /* BocaRAM/AT */ - dev->base_addr = device_get_config_hex16("base"); - dev->total_size = device_get_config_int("size"); - dev->start_addr = device_get_config_int("start"); - dev->frame_addr = device_get_config_hex20("frame"); - if (!!device_get_config_int("width")) - dev->flags |= FLAG_WIDE; - if (!!device_get_config_int("speed")) - dev->flags |= FLAG_FAST; - break; + case ISAMEM_RAMPAGEXT_CARD: /* AST RAMpage/XT */ + case ISAMEM_ABOVEBOARD_CARD: /* Intel AboveBoard */ + case ISAMEM_BRAT_CARD: /* BocaRAM/AT */ + dev->base_addr = device_get_config_hex16("base"); + dev->total_size = device_get_config_int("size"); + dev->start_addr = device_get_config_int("start"); + dev->frame_addr = device_get_config_hex20("frame"); + if (!!device_get_config_int("width")) + dev->flags |= FLAG_WIDE; + if (!!device_get_config_int("speed")) + dev->flags |= FLAG_FAST; + break; } /* Fix up the memory start address. */ @@ -476,20 +468,22 @@ dev->frame_addr = 0xE0000; /* Say hello! */ isamem_log("ISAMEM: %s (%iKB", info->name, dev->total_size); if (tot && (dev->total_size != tot)) - isamem_log(", %iKB for RAM", tot); - if (dev->flags & FLAG_FAST) isamem_log(", FAST"); - if (dev->flags & FLAG_WIDE) isamem_log(", 16BIT"); + isamem_log(", %iKB for RAM", tot); + if (dev->flags & FLAG_FAST) + isamem_log(", FAST"); + if (dev->flags & FLAG_WIDE) + isamem_log(", 16BIT"); isamem_log(")\n"); /* Force (back to) 8-bit bus if needed. */ if ((!is286) && (dev->flags & FLAG_WIDE)) { - isamem_log("ISAMEM: not AT+ system, forcing 8-bit mode!\n"); - dev->flags &= ~FLAG_WIDE; + isamem_log("ISAMEM: not AT+ system, forcing 8-bit mode!\n"); + dev->flags &= ~FLAG_WIDE; } /* Allocate and initialize our RAM. */ - k = dev->total_size << 10; - dev->ram = (uint8_t *)malloc(k); + k = dev->total_size << 10; + dev->ram = (uint8_t *) malloc(k); memset(dev->ram, 0x00, k); ptr = dev->ram; @@ -501,82 +495,82 @@ dev->frame_addr = 0xE0000; tot <<= 10; addr = dev->start_addr; if (addr > 0 && tot > 0) { - /* Adjust K for the RAM we will use. */ - k -= tot; + /* Adjust K for the RAM we will use. */ + k -= tot; - /* - * First, see if we have to expand the conventional - * (low) memory area. This can extend up to 640KB, - * so check this first. - */ - t = (addr < RAM_TOPMEM) ? RAM_TOPMEM - addr : 0; - if (t > 0) { - /* - * We need T bytes to extend that area. - * - * If the board doesn't have that much, grab - * as much as we can. - */ - if (t > tot) - t = tot; - isamem_log("ISAMEM: RAM at %05iKB (%iKB)\n", addr>>10, t>>10); + /* + * First, see if we have to expand the conventional + * (low) memory area. This can extend up to 640KB, + * so check this first. + */ + t = (addr < RAM_TOPMEM) ? RAM_TOPMEM - addr : 0; + if (t > 0) { + /* + * We need T bytes to extend that area. + * + * If the board doesn't have that much, grab + * as much as we can. + */ + if (t > tot) + t = tot; + isamem_log("ISAMEM: RAM at %05iKB (%iKB)\n", addr >> 10, t >> 10); - dev->ext_ram[EXTRAM_CONVENTIONAL].ptr = ptr; - dev->ext_ram[EXTRAM_CONVENTIONAL].base = addr; + dev->ext_ram[EXTRAM_CONVENTIONAL].ptr = ptr; + dev->ext_ram[EXTRAM_CONVENTIONAL].base = addr; - /* Create, initialize and enable the low-memory mapping. */ - mem_mapping_add(&dev->low_mapping, addr, t, - ram_readb, - (dev->flags&FLAG_WIDE) ? ram_readw : NULL, - NULL, - ram_writeb, - (dev->flags&FLAG_WIDE) ? ram_writew : NULL, - NULL, - ptr, MEM_MAPPING_EXTERNAL, &dev->ext_ram[EXTRAM_CONVENTIONAL]); + /* Create, initialize and enable the low-memory mapping. */ + mem_mapping_add(&dev->low_mapping, addr, t, + ram_readb, + (dev->flags & FLAG_WIDE) ? ram_readw : NULL, + NULL, + ram_writeb, + (dev->flags & FLAG_WIDE) ? ram_writew : NULL, + NULL, + ptr, MEM_MAPPING_EXTERNAL, &dev->ext_ram[EXTRAM_CONVENTIONAL]); - /* Tell the memory system this is external RAM. */ - mem_set_mem_state(addr, t, - MEM_READ_EXTERNAL | MEM_WRITE_EXTERNAL); + /* Tell the memory system this is external RAM. */ + mem_set_mem_state(addr, t, + MEM_READ_EXTERNAL | MEM_WRITE_EXTERNAL); - /* Update pointers. */ - ptr += t; - tot -= t; - addr += t; - } + /* Update pointers. */ + ptr += t; + tot -= t; + addr += t; + } - /* Skip to high memory if needed. */ - if ((addr == RAM_TOPMEM) && (tot >= RAM_UMAMEM)) { - /* - * We have more RAM available, but we are at the - * top of conventional RAM. So, the next 384K are - * skipped, and placed into different mappings so - * they can be re-mapped later. - */ - t = RAM_UMAMEM; /* 384KB */ + /* Skip to high memory if needed. */ + if ((addr == RAM_TOPMEM) && (tot >= RAM_UMAMEM)) { + /* + * We have more RAM available, but we are at the + * top of conventional RAM. So, the next 384K are + * skipped, and placed into different mappings so + * they can be re-mapped later. + */ + t = RAM_UMAMEM; /* 384KB */ - isamem_log("ISAMEM: RAM at %05iKB (%iKB)\n", addr>>10, t>>10); + isamem_log("ISAMEM: RAM at %05iKB (%iKB)\n", addr >> 10, t >> 10); - dev->ext_ram[EXTRAM_HIGH].ptr = ptr; - dev->ext_ram[EXTRAM_HIGH].base = addr + tot; + dev->ext_ram[EXTRAM_HIGH].ptr = ptr; + dev->ext_ram[EXTRAM_HIGH].base = addr + tot; - /* Update and enable the remap. */ - mem_mapping_set(&ram_remapped_mapping, - addr + tot, t, - ram_readb, ram_readw, NULL, - ram_writeb, ram_writew, NULL, - ptr, MEM_MAPPING_EXTERNAL, - &dev->ext_ram[EXTRAM_HIGH]); - mem_mapping_disable(&ram_remapped_mapping); + /* Update and enable the remap. */ + mem_mapping_set(&ram_remapped_mapping, + addr + tot, t, + ram_readb, ram_readw, NULL, + ram_writeb, ram_writew, NULL, + ptr, MEM_MAPPING_EXTERNAL, + &dev->ext_ram[EXTRAM_HIGH]); + mem_mapping_disable(&ram_remapped_mapping); - /* Tell the memory system this is external RAM. */ - mem_set_mem_state(addr + tot, t, - MEM_READ_EXTERNAL | MEM_WRITE_EXTERNAL); + /* Tell the memory system this is external RAM. */ + mem_set_mem_state(addr + tot, t, + MEM_READ_EXTERNAL | MEM_WRITE_EXTERNAL); - /* Update pointers. */ - ptr += t; - tot -= t; - addr += t; - } + /* Update pointers. */ + ptr += t; + tot -= t; + addr += t; + } } /* @@ -587,101 +581,99 @@ dev->frame_addr = 0xE0000; * protected mode. */ if (is286 && addr > 0 && tot > 0) { - t = tot; - isamem_log("ISAMEM: RAM at %05iKB (%iKB)\n", addr>>10, t>>10); + t = tot; + isamem_log("ISAMEM: RAM at %05iKB (%iKB)\n", addr >> 10, t >> 10); - dev->ext_ram[EXTRAM_XMS].ptr = ptr; - dev->ext_ram[EXTRAM_XMS].base = addr; + dev->ext_ram[EXTRAM_XMS].ptr = ptr; + dev->ext_ram[EXTRAM_XMS].base = addr; - /* Create, initialize and enable the high-memory mapping. */ - mem_mapping_add(&dev->high_mapping, addr, t, - ram_readb, ram_readw, NULL, - ram_writeb, ram_writew, NULL, - ptr, MEM_MAPPING_EXTERNAL, &dev->ext_ram[EXTRAM_XMS]); + /* Create, initialize and enable the high-memory mapping. */ + mem_mapping_add(&dev->high_mapping, addr, t, + ram_readb, ram_readw, NULL, + ram_writeb, ram_writew, NULL, + ptr, MEM_MAPPING_EXTERNAL, &dev->ext_ram[EXTRAM_XMS]); - /* Tell the memory system this is external RAM. */ - mem_set_mem_state(addr, t, MEM_READ_EXTERNAL | MEM_WRITE_EXTERNAL); + /* Tell the memory system this is external RAM. */ + mem_set_mem_state(addr, t, MEM_READ_EXTERNAL | MEM_WRITE_EXTERNAL); - /* Update pointers. */ - ptr += t; - tot -= t; - addr += t; + /* Update pointers. */ + ptr += t; + tot -= t; + addr += t; } isa_mem_size += dev->total_size - (k >> 10); /* If EMS is enabled, use the remainder for EMS. */ if (dev->flags & FLAG_EMS) { - /* EMS 3.2 cannot have more than 2048KB per board. */ - t = k; - if (t > EMS_MAXSIZE) - t = EMS_MAXSIZE; + /* EMS 3.2 cannot have more than 2048KB per board. */ + t = k; + if (t > EMS_MAXSIZE) + t = EMS_MAXSIZE; - /* Set up where EMS begins in local RAM, and how much we have. */ - dev->ems_start = ptr - dev->ram; - dev->ems_size = t >> 10; - dev->ems_pages = t / EMS_PGSIZE; - isamem_log("ISAMEM: EMS enabled, I/O=%04XH, %iKB (%i pages)", - dev->base_addr, dev->ems_size, dev->ems_pages); - if (dev->frame_addr > 0) - isamem_log(", Frame=%05XH", dev->frame_addr); - isamem_log("\n"); + /* Set up where EMS begins in local RAM, and how much we have. */ + dev->ems_start = ptr - dev->ram; + dev->ems_size = t >> 10; + dev->ems_pages = t / EMS_PGSIZE; + isamem_log("ISAMEM: EMS enabled, I/O=%04XH, %iKB (%i pages)", + dev->base_addr, dev->ems_size, dev->ems_pages); + if (dev->frame_addr > 0) + isamem_log(", Frame=%05XH", dev->frame_addr); + isamem_log("\n"); - /* - * For each supported page (we can have a maximum of 4), - * create, initialize and disable the mappings, and set - * up the I/O control handler. - */ - for (i = 0; i < EMS_MAXPAGE; i++) { - /* Create and initialize a page mapping. */ - mem_mapping_add(&dev->ems[i].mapping, - dev->frame_addr + (EMS_PGSIZE*i), EMS_PGSIZE, - ems_readb, - (dev->flags&FLAG_WIDE) ? ems_readw : NULL, - NULL, - ems_writeb, - (dev->flags&FLAG_WIDE) ? ems_writew : NULL, - NULL, - ptr, MEM_MAPPING_EXTERNAL, - dev); + /* + * For each supported page (we can have a maximum of 4), + * create, initialize and disable the mappings, and set + * up the I/O control handler. + */ + for (i = 0; i < EMS_MAXPAGE; i++) { + /* Create and initialize a page mapping. */ + mem_mapping_add(&dev->ems[i].mapping, + dev->frame_addr + (EMS_PGSIZE * i), EMS_PGSIZE, + ems_readb, + (dev->flags & FLAG_WIDE) ? ems_readw : NULL, + NULL, + ems_writeb, + (dev->flags & FLAG_WIDE) ? ems_writew : NULL, + NULL, + ptr, MEM_MAPPING_EXTERNAL, + dev); - /* For now, disable it. */ - mem_mapping_disable(&dev->ems[i].mapping); + /* For now, disable it. */ + mem_mapping_disable(&dev->ems[i].mapping); - /* Set up an I/O port handler. */ - io_sethandler(dev->base_addr + (EMS_PGSIZE*i), 2, - ems_read,NULL,NULL, ems_write,NULL,NULL, dev); - } + /* Set up an I/O port handler. */ + io_sethandler(dev->base_addr + (EMS_PGSIZE * i), 2, + ems_read, NULL, NULL, ems_write, NULL, NULL, dev); + } } /* Let them know our device instance. */ - return((void *) dev); + return ((void *) dev); } - /* Remove the device from the system. */ static void isamem_close(void *priv) { - memdev_t *dev = (memdev_t *)priv; - int i; + memdev_t *dev = (memdev_t *) priv; + int i; if (dev->flags & FLAG_EMS) { - for (i = 0; i < EMS_MAXPAGE; i++) { - io_removehandler(dev->base_addr + (EMS_PGSIZE*i), 2, - ems_read,NULL,NULL, ems_write,NULL,NULL, dev); - - } + for (i = 0; i < EMS_MAXPAGE; i++) { + io_removehandler(dev->base_addr + (EMS_PGSIZE * i), 2, + ems_read, NULL, NULL, ems_write, NULL, NULL, dev); + } } if (dev->ram != NULL) - free(dev->ram); + free(dev->ram); free(dev); } static const device_config_t ibmxt_config[] = { -// clang-format off + // clang-format off { .name = "size", .description = "Memory Size", @@ -711,25 +703,25 @@ static const device_config_t ibmxt_config[] = { .selection = { { 0 } } }, { .name = "", .description = "", .type = CONFIG_END } -// clang-format on + // clang-format on }; static const device_t ibmxt_device = { - .name = "IBM PC/XT Memory Expansion", + .name = "IBM PC/XT Memory Expansion", .internal_name = "ibmxt", - .flags = DEVICE_ISA, - .local = ISAMEM_IBMXT_CARD, - .init = isamem_init, - .close = isamem_close, - .reset = NULL, + .flags = DEVICE_ISA, + .local = ISAMEM_IBMXT_CARD, + .init = isamem_init, + .close = isamem_close, + .reset = NULL, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = ibmxt_config + .force_redraw = NULL, + .config = ibmxt_config }; static const device_config_t genericxt_config[] = { -// clang-format off + // clang-format off { .name = "size", .description = "Memory Size", @@ -759,25 +751,25 @@ static const device_config_t genericxt_config[] = { .selection = { { 0 } } }, { .name = "", .description = "", .type = CONFIG_END } -// clang-format on + // clang-format on }; static const device_t genericxt_device = { - .name = "Generic PC/XT Memory Expansion", + .name = "Generic PC/XT Memory Expansion", .internal_name = "genericxt", - .flags = DEVICE_ISA, - .local = ISAMEM_GENXT_CARD, - .init = isamem_init, - .close = isamem_close, - .reset = NULL, + .flags = DEVICE_ISA, + .local = ISAMEM_GENXT_CARD, + .init = isamem_init, + .close = isamem_close, + .reset = NULL, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = genericxt_config + .force_redraw = NULL, + .config = genericxt_config }; static const device_config_t msramcard_config[] = { -// clang-format off + // clang-format off { .name = "size", .description = "Memory Size", @@ -807,25 +799,25 @@ static const device_config_t msramcard_config[] = { .selection = { { 0 } } }, { .name = "", .description = "", .type = CONFIG_END } -// clang-format on + // clang-format on }; static const device_t msramcard_device = { - .name = "Microsoft RAMCard for IBM PC", + .name = "Microsoft RAMCard for IBM PC", .internal_name = "msramcard", - .flags = DEVICE_ISA, - .local = ISAMEM_RAMCARD_CARD, - .init = isamem_init, - .close = isamem_close, - .reset = NULL, + .flags = DEVICE_ISA, + .local = ISAMEM_RAMCARD_CARD, + .init = isamem_init, + .close = isamem_close, + .reset = NULL, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = msramcard_config + .force_redraw = NULL, + .config = msramcard_config }; static const device_config_t mssystemcard_config[] = { -// clang-format off + // clang-format off { .name = "size", .description = "Memory Size", @@ -855,25 +847,25 @@ static const device_config_t mssystemcard_config[] = { .selection = { { 0 } } }, { .name = "", .description = "", .type = CONFIG_END } -// clang-format on + // clang-format on }; static const device_t mssystemcard_device = { - .name = "Microsoft SystemCard", + .name = "Microsoft SystemCard", .internal_name = "mssystemcard", - .flags = DEVICE_ISA, - .local = ISAMEM_SYSTEMCARD_CARD, - .init = isamem_init, - .close = isamem_close, - .reset = NULL, + .flags = DEVICE_ISA, + .local = ISAMEM_SYSTEMCARD_CARD, + .init = isamem_init, + .close = isamem_close, + .reset = NULL, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = mssystemcard_config + .force_redraw = NULL, + .config = mssystemcard_config }; static const device_config_t ibmat_config[] = { -// clang-format off + // clang-format off { .name = "size", .description = "Memory Size", @@ -903,25 +895,25 @@ static const device_config_t ibmat_config[] = { .selection = { { 0 } } }, { .name = "", .description = "", .type = CONFIG_END } -// clang-format on + // clang-format on }; static const device_t ibmat_device = { - .name = "IBM PC/AT Memory Expansion", + .name = "IBM PC/AT Memory Expansion", .internal_name = "ibmat", - .flags = DEVICE_ISA, - .local = ISAMEM_IBMAT_CARD, - .init = isamem_init, - .close = isamem_close, - .reset = NULL, + .flags = DEVICE_ISA, + .local = ISAMEM_IBMAT_CARD, + .init = isamem_init, + .close = isamem_close, + .reset = NULL, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = ibmat_config + .force_redraw = NULL, + .config = ibmat_config }; static const device_config_t genericat_config[] = { -// clang-format off + // clang-format off { .name = "size", .description = "Memory Size", @@ -951,25 +943,25 @@ static const device_config_t genericat_config[] = { .selection = { { 0 } } }, { .name = "", .description = "", .type = CONFIG_END } -// clang-format on + // clang-format on }; static const device_t genericat_device = { - .name = "Generic PC/AT Memory Expansion", + .name = "Generic PC/AT Memory Expansion", .internal_name = "genericat", - .flags = DEVICE_ISA, - .local = ISAMEM_GENAT_CARD, - .init = isamem_init, - .close = isamem_close, - .reset = NULL, + .flags = DEVICE_ISA, + .local = ISAMEM_GENAT_CARD, + .init = isamem_init, + .close = isamem_close, + .reset = NULL, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = genericat_config + .force_redraw = NULL, + .config = genericat_config }; static const device_config_t p5pak_config[] = { -// clang-format off + // clang-format off { .name = "size", .description = "Memory Size", @@ -999,26 +991,25 @@ static const device_config_t p5pak_config[] = { .selection = { { 0 } } }, { .name = "", .description = "", .type = CONFIG_END } -// clang-format on + // clang-format on }; static const device_t p5pak_device = { - .name = "Paradise Systems 5-PAK", + .name = "Paradise Systems 5-PAK", .internal_name = "p5pak", - .flags = DEVICE_ISA, - .local = ISAMEM_P5PAK_CARD, - .init = isamem_init, - .close = isamem_close, - .reset = NULL, + .flags = DEVICE_ISA, + .local = ISAMEM_P5PAK_CARD, + .init = isamem_init, + .close = isamem_close, + .reset = NULL, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = p5pak_config + .force_redraw = NULL, + .config = p5pak_config }; - static const device_config_t a6pak_config[] = { -// clang-format off + // clang-format off { .name = "size", .description = "Memory Size", @@ -1048,25 +1039,25 @@ static const device_config_t a6pak_config[] = { .selection = { { 0 } } }, { .name = "", .description = "", .type = CONFIG_END } -// clang-format on + // clang-format on }; static const device_t a6pak_device = { - .name = "AST SixPakPlus", + .name = "AST SixPakPlus", .internal_name = "a6pak", - .flags = DEVICE_ISA, - .local = ISAMEM_A6PAK_CARD, - .init = isamem_init, - .close = isamem_close, - .reset = NULL, + .flags = DEVICE_ISA, + .local = ISAMEM_A6PAK_CARD, + .init = isamem_init, + .close = isamem_close, + .reset = NULL, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = a6pak_config + .force_redraw = NULL, + .config = a6pak_config }; static const device_config_t ems5150_config[] = { -// clang-format off + // clang-format off { .name = "size", .description = "Memory Size", @@ -1099,25 +1090,25 @@ static const device_config_t ems5150_config[] = { }, }, { .name = "", .description = "", .type = CONFIG_END } -// clang-format on + // clang-format on }; static const device_t ems5150_device = { - .name = "Micro Mainframe EMS-5150(T)", + .name = "Micro Mainframe EMS-5150(T)", .internal_name = "ems5150", - .flags = DEVICE_ISA, - .local = ISAMEM_EMS5150_CARD, - .init = isamem_init, - .close = isamem_close, - .reset = NULL, + .flags = DEVICE_ISA, + .local = ISAMEM_EMS5150_CARD, + .init = isamem_init, + .close = isamem_close, + .reset = NULL, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = ems5150_config + .force_redraw = NULL, + .config = ems5150_config }; static const device_config_t ev159_config[] = { -// clang-format off + // clang-format off { .name = "size", .description = "Memory Size", @@ -1222,26 +1213,26 @@ static const device_config_t ev159_config[] = { }, }, { .name = "", .description = "", .type = CONFIG_END } -// clang-format on + // clang-format on }; static const device_t ev159_device = { - .name = "Everex EV-159 RAM 3000 Deluxe", + .name = "Everex EV-159 RAM 3000 Deluxe", .internal_name = "ev159", - .flags = DEVICE_ISA, - .local = ISAMEM_EV159_CARD, - .init = isamem_init, - .close = isamem_close, - .reset = NULL, + .flags = DEVICE_ISA, + .local = ISAMEM_EV159_CARD, + .init = isamem_init, + .close = isamem_close, + .reset = NULL, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = ev159_config + .force_redraw = NULL, + .config = ev159_config }; #if defined(DEV_BRANCH) && defined(USE_ISAMEM_BRAT) static const device_config_t brat_config[] = { -// clang-format off + // clang-format off { .name = "base", .description = "Address", @@ -1316,27 +1307,27 @@ static const device_config_t brat_config[] = { .selection = { { 0 } } }, { .name = "", .description = "", .type = CONFIG_END } -// clang-format on + // clang-format on }; static const device_t brat_device = { - .name = "BocaRAM/AT", + .name = "BocaRAM/AT", .internal_name = "brat", - .flags = DEVICE_ISA, - .local = ISAMEM_BRAT_CARD, - .init = isamem_init, - .close = isamem_close, - .reset = NULL, + .flags = DEVICE_ISA, + .local = ISAMEM_BRAT_CARD, + .init = isamem_init, + .close = isamem_close, + .reset = NULL, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = brat_config + .force_redraw = NULL, + .config = brat_config }; #endif #if defined(DEV_BRANCH) && defined(USE_ISAMEM_RAMPAGE) static const device_config_t rampage_config[] = { -// clang-format off + // clang-format off { .name = "base", .description = "Address", @@ -1415,27 +1406,27 @@ static const device_config_t rampage_config[] = { .selection = { { 0 } } }, { .name = "", .description = "", .type = CONFIG_END } -// clang-format on + // clang-format on }; static const device_t rampage_device = { - .name = "AST RAMpage/XT", + .name = "AST RAMpage/XT", .internal_name = "rampage", - .flags = DEVICE_ISA, - .local = ISAMEM_RAMPAGEXT_CARD, - .init = isamem_init, - .close = isamem_close, - .reset = NULL, + .flags = DEVICE_ISA, + .local = ISAMEM_RAMPAGEXT_CARD, + .init = isamem_init, + .close = isamem_close, + .reset = NULL, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = rampage_config + .force_redraw = NULL, + .config = rampage_config }; #endif #if defined(DEV_BRANCH) && defined(USE_ISAMEM_IAB) static const device_config_t iab_config[] = { -// clang-format off + // clang-format off { .name = "base", .description = "Address", @@ -1514,42 +1505,42 @@ static const device_config_t iab_config[] = { .selection = { { 0 } } }, { .name = "", .description = "", .type = CONFIG_END } -// clang-format on + // clang-format on }; static const device_t iab_device = { - .name = "Intel AboveBoard", + .name = "Intel AboveBoard", .internal_name = "iab", - .flags = DEVICE_ISA, - .local = ISAMEM_ABOVEBOARD_CARD, - .init = isamem_init, - .close = isamem_close, - .reset = NULL, + .flags = DEVICE_ISA, + .local = ISAMEM_ABOVEBOARD_CARD, + .init = isamem_init, + .close = isamem_close, + .reset = NULL, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = iab_config + .force_redraw = NULL, + .config = iab_config }; #endif static const device_t isa_none_device = { - .name = "None", + .name = "None", .internal_name = "none", - .flags = 0, - .local = 0, - .init = NULL, - .close = NULL, - .reset = NULL, + .flags = 0, + .local = 0, + .init = NULL, + .close = NULL, + .reset = NULL, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; static const struct { - const device_t *dev; + const device_t *dev; } boards[] = { -// clang-format off + // clang-format off { &isa_none_device }, { &ibmxt_device }, { &genericxt_device }, @@ -1571,7 +1562,7 @@ static const struct { { &iab_device }, #endif { NULL } -// clang-format on + // clang-format on }; void @@ -1583,20 +1574,22 @@ isamem_reset(void) isa_mem_size = 0; for (i = 0; i < ISAMEM_MAX; i++) { - k = isamem_type[i]; - if (k == 0) continue; + k = isamem_type[i]; + if (k == 0) + continue; - /* Add the instance to the system. */ - device_add_inst(boards[k].dev, i + 1); + /* Add the instance to the system. */ + device_add_inst(boards[k].dev, i + 1); } } const char * isamem_get_name(int board) { - if (boards[board].dev == NULL) return(NULL); + if (boards[board].dev == NULL) + return (NULL); - return(boards[board].dev->name); + return (boards[board].dev->name); } const char * @@ -1611,18 +1604,18 @@ isamem_get_from_internal_name(const char *s) int c = 0; while (boards[c].dev != NULL) { - if (! strcmp(boards[c].dev->internal_name, s)) - return(c); - c++; + if (!strcmp(boards[c].dev->internal_name, s)) + return (c); + c++; } /* Not found. */ - return(0); + return (0); } const device_t * isamem_get_device(int board) { - /* Add the instance to the system. */ +/* Add the instance to the system. */ return boards[board].dev; } diff --git a/src/device/isapnp.c b/src/device/isapnp.c index 669a45eec..b2392b6a3 100644 --- a/src/device/isapnp.c +++ b/src/device/isapnp.c @@ -27,53 +27,50 @@ #include <86box/io.h> #include <86box/isapnp.h> +#define CHECK_CURRENT_LD() \ + if (!dev->current_ld) { \ + isapnp_log("ISAPnP: No logical device selected\n"); \ + break; \ + } -#define CHECK_CURRENT_LD() if (!dev->current_ld) { \ - isapnp_log("ISAPnP: No logical device selected\n"); \ - break; \ - } +#define CHECK_CURRENT_CARD() \ + if (1) { \ + card = dev->first_card; \ + while (card) { \ + if (card->enable && (card->state == PNP_STATE_CONFIG)) \ + break; \ + card = card->next; \ + } \ + if (!card) { \ + isapnp_log("ISAPnP: No card in CONFIG state\n"); \ + break; \ + } \ + } -#define CHECK_CURRENT_CARD() if (1) { \ - card = dev->first_card; \ - while (card) { \ - if (card->enable && (card->state == PNP_STATE_CONFIG)) \ - break; \ - card = card->next; \ - } \ - if (!card) { \ - isapnp_log("ISAPnP: No card in CONFIG state\n"); \ - break; \ - } \ - } - - -static const uint8_t pnp_init_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 const uint8_t pnp_init_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 const device_t isapnp_device; - #ifdef ENABLE_ISAPNP_LOG int isapnp_do_log = ENABLE_ISAPNP_LOG; - static void isapnp_log(const char *fmt, ...) { va_list ap; if (isapnp_do_log) { - va_start(ap, fmt); - pclog_ex(fmt, ap); - va_end(ap); + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); } } #else -#define isapnp_log(fmt, ...) +# define isapnp_log(fmt, ...) #endif - enum { PNP_STATE_WAIT_FOR_KEY = 0, PNP_STATE_CONFIG, @@ -82,140 +79,137 @@ enum { }; typedef struct _isapnp_device_ { - uint8_t number; - uint8_t regs[256]; - uint8_t mem_upperlimit, irq_types, io_16bit, io_len[8]; + uint8_t number; + uint8_t regs[256]; + uint8_t mem_upperlimit, irq_types, io_16bit, io_len[8]; const isapnp_device_config_t *defaults; struct _isapnp_device_ *next; } isapnp_device_t; typedef struct _isapnp_card_ { - uint8_t enable, state, csn, id_checksum, serial_read, serial_read_pair, serial_read_pos, *rom; - uint16_t rom_pos, rom_size; - void *priv; + uint8_t enable, state, csn, id_checksum, serial_read, serial_read_pair, serial_read_pos, *rom; + uint16_t rom_pos, rom_size; + void *priv; /* ISAPnP memory and I/O addresses are awkwardly big endian, so we populate this structure whenever something on some device changes, and pass it on instead. */ isapnp_device_config_t config; - void (*config_changed)(uint8_t ld, isapnp_device_config_t *config, void *priv); - void (*csn_changed)(uint8_t csn, void *priv); - uint8_t (*read_vendor_reg)(uint8_t ld, uint8_t reg, void *priv); - void (*write_vendor_reg)(uint8_t ld, uint8_t reg, uint8_t val, void *priv); + void (*config_changed)(uint8_t ld, isapnp_device_config_t *config, void *priv); + void (*csn_changed)(uint8_t csn, void *priv); + uint8_t (*read_vendor_reg)(uint8_t ld, uint8_t reg, void *priv); + void (*write_vendor_reg)(uint8_t ld, uint8_t reg, uint8_t val, void *priv); - isapnp_device_t *first_ld; + isapnp_device_t *first_ld; struct _isapnp_card_ *next; } isapnp_card_t; typedef struct { - uint8_t reg, key_pos: 5; - uint16_t read_data_addr; + uint8_t reg, key_pos : 5; + uint16_t read_data_addr; - isapnp_card_t *first_card, *isolated_card, *current_ld_card; + isapnp_card_t *first_card, *isolated_card, *current_ld_card; isapnp_device_t *current_ld; } isapnp_t; - static void isapnp_device_config_changed(isapnp_card_t *card, isapnp_device_t *ld) { /* Ignore card if it hasn't signed up for configuration changes. */ if (!card->config_changed) - return; + return; /* Populate config structure, performing endianness conversion as needed. */ card->config.activate = ld->regs[0x30] & 0x01; uint8_t i, reg_base; for (i = 0; i < 4; i++) { - reg_base = 0x40 + (8 * i); - card->config.mem[i].base = (ld->regs[reg_base] << 16) | (ld->regs[reg_base + 1] << 8); - card->config.mem[i].size = (ld->regs[reg_base + 3] << 16) | (ld->regs[reg_base + 4] << 8); - if (ld->regs[reg_base + 2] & 0x01) /* upper limit */ - card->config.mem[i].size -= card->config.mem[i].base; + reg_base = 0x40 + (8 * i); + card->config.mem[i].base = (ld->regs[reg_base] << 16) | (ld->regs[reg_base + 1] << 8); + card->config.mem[i].size = (ld->regs[reg_base + 3] << 16) | (ld->regs[reg_base + 4] << 8); + if (ld->regs[reg_base + 2] & 0x01) /* upper limit */ + card->config.mem[i].size -= card->config.mem[i].base; } for (i = 0; i < 4; i++) { - reg_base = (i == 0) ? 0x76 : (0x80 + (16 * i)); - card->config.mem32[i].base = (ld->regs[reg_base] << 24) | (ld->regs[reg_base + 1] << 16) | (ld->regs[reg_base + 2] << 8) | ld->regs[reg_base + 3]; - card->config.mem32[i].size = (ld->regs[reg_base + 5] << 24) | (ld->regs[reg_base + 6] << 16) | (ld->regs[reg_base + 7] << 8) | ld->regs[reg_base + 8]; - if (ld->regs[reg_base + 4] & 0x01) /* upper limit */ - card->config.mem32[i].size -= card->config.mem32[i].base; + reg_base = (i == 0) ? 0x76 : (0x80 + (16 * i)); + card->config.mem32[i].base = (ld->regs[reg_base] << 24) | (ld->regs[reg_base + 1] << 16) | (ld->regs[reg_base + 2] << 8) | ld->regs[reg_base + 3]; + card->config.mem32[i].size = (ld->regs[reg_base + 5] << 24) | (ld->regs[reg_base + 6] << 16) | (ld->regs[reg_base + 7] << 8) | ld->regs[reg_base + 8]; + if (ld->regs[reg_base + 4] & 0x01) /* upper limit */ + card->config.mem32[i].size -= card->config.mem32[i].base; } for (i = 0; i < 8; i++) { - reg_base = 0x60 + (2 * i); - if (ld->regs[0x31] & 0x02) - card->config.io[i].base = 0; /* let us handle I/O range check reads */ - else - card->config.io[i].base = (ld->regs[reg_base] << 8) | ld->regs[reg_base + 1]; + reg_base = 0x60 + (2 * i); + if (ld->regs[0x31] & 0x02) + card->config.io[i].base = 0; /* let us handle I/O range check reads */ + else + card->config.io[i].base = (ld->regs[reg_base] << 8) | ld->regs[reg_base + 1]; } for (i = 0; i < 2; i++) { - reg_base = 0x70 + (2 * i); - card->config.irq[i].irq = ld->regs[reg_base]; - card->config.irq[i].level = ld->regs[reg_base + 1] & 0x02; - card->config.irq[i].type = ld->regs[reg_base + 1] & 0x01; + reg_base = 0x70 + (2 * i); + card->config.irq[i].irq = ld->regs[reg_base]; + card->config.irq[i].level = ld->regs[reg_base + 1] & 0x02; + card->config.irq[i].type = ld->regs[reg_base + 1] & 0x01; } for (i = 0; i < 2; i++) { - reg_base = 0x74 + i; - card->config.dma[i].dma = ld->regs[reg_base]; + reg_base = 0x74 + i; + card->config.dma[i].dma = ld->regs[reg_base]; } /* Signal the configuration change. */ card->config_changed(ld->number, &card->config, card->priv); } - static void isapnp_reset_ld_config(isapnp_device_t *ld) { /* Do nothing if there's no default configuration for this device. */ const isapnp_device_config_t *config = ld->defaults; if (!config) - return; + return; /* Populate configuration registers. */ ld->regs[0x30] = !!config->activate; - uint8_t i, reg_base; + uint8_t i, reg_base; uint32_t size; for (i = 0; i < 4; i++) { - reg_base = 0x40 + (8 * i); - ld->regs[reg_base] = config->mem[i].base >> 16; - ld->regs[reg_base + 1] = config->mem[i].base >> 8; - size = config->mem[i].size; - if (ld->regs[reg_base + 2] & 0x01) /* upper limit */ - size += config->mem[i].base; - ld->regs[reg_base + 3] = size >> 16; - ld->regs[reg_base + 4] = size >> 8; + reg_base = 0x40 + (8 * i); + ld->regs[reg_base] = config->mem[i].base >> 16; + ld->regs[reg_base + 1] = config->mem[i].base >> 8; + size = config->mem[i].size; + if (ld->regs[reg_base + 2] & 0x01) /* upper limit */ + size += config->mem[i].base; + ld->regs[reg_base + 3] = size >> 16; + ld->regs[reg_base + 4] = size >> 8; } for (i = 0; i < 4; i++) { - reg_base = (i == 0) ? 0x76 : (0x80 + (16 * i)); - ld->regs[reg_base] = config->mem32[i].base >> 24; - ld->regs[reg_base + 1] = config->mem32[i].base >> 16; - ld->regs[reg_base + 2] = config->mem32[i].base >> 8; - ld->regs[reg_base + 3] = config->mem32[i].base; - size = config->mem32[i].size; - if (ld->regs[reg_base + 4] & 0x01) /* upper limit */ - size += config->mem32[i].base; - ld->regs[reg_base + 5] = size >> 24; - ld->regs[reg_base + 6] = size >> 16; - ld->regs[reg_base + 7] = size >> 8; - ld->regs[reg_base + 8] = size; + reg_base = (i == 0) ? 0x76 : (0x80 + (16 * i)); + ld->regs[reg_base] = config->mem32[i].base >> 24; + ld->regs[reg_base + 1] = config->mem32[i].base >> 16; + ld->regs[reg_base + 2] = config->mem32[i].base >> 8; + ld->regs[reg_base + 3] = config->mem32[i].base; + size = config->mem32[i].size; + if (ld->regs[reg_base + 4] & 0x01) /* upper limit */ + size += config->mem32[i].base; + ld->regs[reg_base + 5] = size >> 24; + ld->regs[reg_base + 6] = size >> 16; + ld->regs[reg_base + 7] = size >> 8; + ld->regs[reg_base + 8] = size; } for (i = 0; i < 8; i++) { - reg_base = 0x60 + (2 * i); - ld->regs[reg_base] = config->io[i].base >> 8; - ld->regs[reg_base + 1] = config->io[i].base; + reg_base = 0x60 + (2 * i); + ld->regs[reg_base] = config->io[i].base >> 8; + ld->regs[reg_base + 1] = config->io[i].base; } for (i = 0; i < 2; i++) { - reg_base = 0x70 + (2 * i); - ld->regs[reg_base] = config->irq[i].irq; - ld->regs[reg_base + 1] = (!!config->irq[i].level << 1) | !!config->irq[i].type; + reg_base = 0x70 + (2 * i); + ld->regs[reg_base] = config->irq[i].irq; + ld->regs[reg_base + 1] = (!!config->irq[i].level << 1) | !!config->irq[i].type; } for (i = 0; i < 2; i++) { - reg_base = 0x74 + i; - ld->regs[reg_base] = config->dma[i].dma; + reg_base = 0x74 + i; + ld->regs[reg_base] = config->dma[i].dma; } } - static void isapnp_reset_ld_regs(isapnp_device_t *ld) { @@ -227,28 +221,27 @@ isapnp_reset_ld_regs(isapnp_device_t *ld) /* Set the upper limit bit on memory ranges which require it. */ uint8_t i; for (i = 0; i < 4; i++) - ld->regs[0x42 + (8 * i)] |= !!(ld->mem_upperlimit & (1 << i)); + ld->regs[0x42 + (8 * i)] |= !!(ld->mem_upperlimit & (1 << i)); ld->regs[0x7a] |= !!(ld->mem_upperlimit & (1 << 4)); for (i = 1; i < 4; i++) - ld->regs[0x84 + (16 * i)] |= !!(ld->mem_upperlimit & (1 << (4 + i))); + ld->regs[0x84 + (16 * i)] |= !!(ld->mem_upperlimit & (1 << (4 + i))); /* Set the default IRQ type bits. */ for (i = 0; i < 2; i++) { - if (ld->irq_types & (0x1 << (4 * i))) - ld->regs[0x70 + (2 * i)] = 0x02; - else if (ld->irq_types & (0x2 << (4 * i))) - ld->regs[0x70 + (2 * i)] = 0x00; - else if (ld->irq_types & (0x4 << (4 * i))) - ld->regs[0x70 + (2 * i)] = 0x03; - else if (ld->irq_types & (0x8 << (4 * i))) - ld->regs[0x70 + (2 * i)] = 0x01; + if (ld->irq_types & (0x1 << (4 * i))) + ld->regs[0x70 + (2 * i)] = 0x02; + else if (ld->irq_types & (0x2 << (4 * i))) + ld->regs[0x70 + (2 * i)] = 0x00; + else if (ld->irq_types & (0x4 << (4 * i))) + ld->regs[0x70 + (2 * i)] = 0x03; + else if (ld->irq_types & (0x8 << (4 * i))) + ld->regs[0x70 + (2 * i)] = 0x01; } /* Reset configuration registers to match the default configuration. */ isapnp_reset_ld_config(ld); } - static uint8_t isapnp_read_rangecheck(uint16_t addr, void *priv) { @@ -256,119 +249,147 @@ isapnp_read_rangecheck(uint16_t addr, void *priv) return (dev->regs[0x31] & 0x01) ? 0x55 : 0xaa; } - static uint8_t isapnp_read_data(uint16_t addr, void *priv) { - isapnp_t *dev = (isapnp_t *) priv; - uint8_t ret = 0xff, bit, next_shift; + isapnp_t *dev = (isapnp_t *) priv; + uint8_t ret = 0xff, bit, next_shift; isapnp_card_t *card; switch (dev->reg) { - case 0x01: /* Serial Isolation */ - card = dev->first_card; - while (card) { - if (card->enable && card->rom && (card->state == PNP_STATE_ISOLATION)) - break; - card = card->next; - } - dev->isolated_card = card; + case 0x01: /* Serial Isolation */ + card = dev->first_card; + while (card) { + if (card->enable && card->rom && (card->state == PNP_STATE_ISOLATION)) + break; + card = card->next; + } + dev->isolated_card = card; - if (card) { - if (card->serial_read_pair) { /* second byte (aa/00) */ - card->serial_read <<= 1; - if (!card->serial_read_pos) - card->rom_pos = 0x09; - } else { /* first byte (55/00) */ - if (card->serial_read_pos < 64) { /* reading 64-bit vendor/serial */ - bit = (card->rom[card->serial_read_pos >> 3] >> (card->serial_read_pos & 0x7)) & 0x01; - next_shift = (!!(card->id_checksum & 0x02) ^ !!(card->id_checksum & 0x01) ^ bit) & 0x01; - card->id_checksum >>= 1; - card->id_checksum |= (next_shift << 7); - } else { /* reading 8-bit checksum */ - if (card->serial_read_pos == 64) /* populate ID checksum in ROM */ - card->rom[0x08] = card->id_checksum; - bit = (card->id_checksum >> (card->serial_read_pos & 0x7)) & 0x01; - } - isapnp_log("ISAPnP: Read bit %d of byte %02X (%02X) = %d\n", card->serial_read_pos & 0x7, card->serial_read_pos >> 3, card->rom[card->serial_read_pos >> 3], bit); - card->serial_read = bit ? 0x55 : 0x00; - card->serial_read_pos = (card->serial_read_pos + 1) % 72; - } - card->serial_read_pair ^= 1; - ret = card->serial_read; - } + if (card) { + if (card->serial_read_pair) { /* second byte (aa/00) */ + card->serial_read <<= 1; + if (!card->serial_read_pos) + card->rom_pos = 0x09; + } else { /* first byte (55/00) */ + if (card->serial_read_pos < 64) { /* reading 64-bit vendor/serial */ + bit = (card->rom[card->serial_read_pos >> 3] >> (card->serial_read_pos & 0x7)) & 0x01; + next_shift = (!!(card->id_checksum & 0x02) ^ !!(card->id_checksum & 0x01) ^ bit) & 0x01; + card->id_checksum >>= 1; + card->id_checksum |= (next_shift << 7); + } else { /* reading 8-bit checksum */ + if (card->serial_read_pos == 64) /* populate ID checksum in ROM */ + card->rom[0x08] = card->id_checksum; + bit = (card->id_checksum >> (card->serial_read_pos & 0x7)) & 0x01; + } + isapnp_log("ISAPnP: Read bit %d of byte %02X (%02X) = %d\n", card->serial_read_pos & 0x7, card->serial_read_pos >> 3, card->rom[card->serial_read_pos >> 3], bit); + card->serial_read = bit ? 0x55 : 0x00; + card->serial_read_pos = (card->serial_read_pos + 1) % 72; + } + card->serial_read_pair ^= 1; + ret = card->serial_read; + } - break; + break; - case 0x04: /* Resource Data */ - CHECK_CURRENT_CARD(); + case 0x04: /* Resource Data */ + CHECK_CURRENT_CARD(); - isapnp_log("ISAPnP: Read resource data index %02X (%02X) from CSN %02X\n", card->rom_pos, card->rom[card->rom_pos], card->csn); - if (card->rom_pos >= card->rom_size) - ret = 0xff; - else - ret = card->rom[card->rom_pos++]; + isapnp_log("ISAPnP: Read resource data index %02X (%02X) from CSN %02X\n", card->rom_pos, card->rom[card->rom_pos], card->csn); + if (card->rom_pos >= card->rom_size) + ret = 0xff; + else + ret = card->rom[card->rom_pos++]; - break; + break; - case 0x05: /* Status */ - ret = 0x00; - CHECK_CURRENT_CARD(); + case 0x05: /* Status */ + ret = 0x00; + CHECK_CURRENT_CARD(); - isapnp_log("ISAPnP: Query status for CSN %02X\n", card->csn); - ret = 0x01; + isapnp_log("ISAPnP: Query status for CSN %02X\n", card->csn); + ret = 0x01; - break; + break; - case 0x06: /* Card Select Number */ - ret = 0x00; - CHECK_CURRENT_CARD(); + case 0x06: /* Card Select Number */ + ret = 0x00; + CHECK_CURRENT_CARD(); - isapnp_log("ISAPnP: Query CSN %02X\n", card->csn); - ret = card->csn; + isapnp_log("ISAPnP: Query CSN %02X\n", card->csn); + ret = card->csn; - break; + break; - case 0x07: /* Logical Device Number */ - ret = 0x00; - CHECK_CURRENT_LD(); + case 0x07: /* Logical Device Number */ + ret = 0x00; + CHECK_CURRENT_LD(); - isapnp_log("ISAPnP: Query LDN for CSN %02X device %02X\n", dev->current_ld_card->csn, dev->current_ld->number); - ret = dev->current_ld->number; + isapnp_log("ISAPnP: Query LDN for CSN %02X device %02X\n", dev->current_ld_card->csn, dev->current_ld->number); + ret = dev->current_ld->number; - break; + break; - case 0x20: case 0x21: case 0x22: case 0x23: - case 0x24: case 0x25: case 0x26: case 0x27: - case 0x28: case 0x29: case 0x2a: case 0x2b: - case 0x2c: case 0x2d: case 0x2e: case 0x2f: - CHECK_CURRENT_CARD(); + case 0x20: + case 0x21: + case 0x22: + case 0x23: + case 0x24: + case 0x25: + case 0x26: + case 0x27: + case 0x28: + case 0x29: + case 0x2a: + case 0x2b: + case 0x2c: + case 0x2d: + case 0x2e: + case 0x2f: + CHECK_CURRENT_CARD(); - isapnp_log("ISAPnP: Read vendor-defined register %02X from CSN %02X\n", dev->reg, card->csn); + isapnp_log("ISAPnP: Read vendor-defined register %02X from CSN %02X\n", dev->reg, card->csn); - if (card->read_vendor_reg) - ret = card->read_vendor_reg(0, dev->reg, card->priv); - break; + if (card->read_vendor_reg) + ret = card->read_vendor_reg(0, dev->reg, card->priv); + break; - case 0x38: case 0x39: case 0x3a: case 0x3b: - case 0x3c: case 0x3d: case 0x3e: case 0x3f: - case 0xf0: case 0xf1: case 0xf2: case 0xf3: - case 0xf4: case 0xf5: case 0xf6: case 0xf7: - case 0xf8: case 0xf9: case 0xfa: case 0xfb: - case 0xfc: case 0xfd: case 0xfe: - CHECK_CURRENT_LD(); - isapnp_log("ISAPnP: Read vendor-defined register %02X from CSN %02X device %02X\n", dev->reg, dev->current_ld_card->csn, dev->current_ld->number); - if (dev->current_ld_card->read_vendor_reg) - ret = dev->current_ld_card->read_vendor_reg(dev->current_ld->number, dev->reg, dev->current_ld_card->priv); - break; + case 0x38: + case 0x39: + case 0x3a: + case 0x3b: + case 0x3c: + case 0x3d: + case 0x3e: + case 0x3f: + case 0xf0: + case 0xf1: + case 0xf2: + case 0xf3: + case 0xf4: + case 0xf5: + case 0xf6: + case 0xf7: + case 0xf8: + case 0xf9: + case 0xfa: + case 0xfb: + case 0xfc: + case 0xfd: + case 0xfe: + CHECK_CURRENT_LD(); + isapnp_log("ISAPnP: Read vendor-defined register %02X from CSN %02X device %02X\n", dev->reg, dev->current_ld_card->csn, dev->current_ld->number); + if (dev->current_ld_card->read_vendor_reg) + ret = dev->current_ld_card->read_vendor_reg(dev->current_ld->number, dev->reg, dev->current_ld_card->priv); + break; - default: - if (dev->reg >= 0x30) { - CHECK_CURRENT_LD(); - isapnp_log("ISAPnP: Read register %02X from CSN %02X device %02X\n", dev->reg, dev->current_ld_card->csn, dev->current_ld->number); - ret = dev->current_ld->regs[dev->reg]; - } - break; + default: + if (dev->reg >= 0x30) { + CHECK_CURRENT_LD(); + isapnp_log("ISAPnP: Read register %02X from CSN %02X device %02X\n", dev->reg, dev->current_ld_card->csn, dev->current_ld->number); + ret = dev->current_ld->regs[dev->reg]; + } + break; } isapnp_log("ISAPnP: read_data(%02X) = %02X\n", dev->reg, ret); @@ -376,255 +397,294 @@ isapnp_read_data(uint16_t addr, void *priv) return ret; } - static void isapnp_set_read_data(uint16_t addr, isapnp_t *dev) { /* Remove existing READ_DATA port if set. */ if (dev->read_data_addr) { - io_removehandler(dev->read_data_addr, 1, isapnp_read_data, NULL, NULL, NULL, NULL, NULL, dev); - dev->read_data_addr = 0; + io_removehandler(dev->read_data_addr, 1, isapnp_read_data, NULL, NULL, NULL, NULL, NULL, dev); + dev->read_data_addr = 0; } /* Set new READ_DATA port if within range. */ if ((addr >= 0x203) && (addr <= 0x3ff)) { - dev->read_data_addr = addr; - io_sethandler(dev->read_data_addr, 1, isapnp_read_data, NULL, NULL, NULL, NULL, NULL, dev); + dev->read_data_addr = addr; + io_sethandler(dev->read_data_addr, 1, isapnp_read_data, NULL, NULL, NULL, NULL, NULL, dev); } } - static void isapnp_write_addr(uint16_t addr, uint8_t val, void *priv) { - isapnp_t *dev = (isapnp_t *) priv; + isapnp_t *dev = (isapnp_t *) priv; isapnp_card_t *card = dev->first_card; isapnp_log("ISAPnP: write_addr(%02X)\n", val); if (!card) /* don't do anything if we have no PnP cards */ - return; + return; dev->reg = val; if (card->state == PNP_STATE_WAIT_FOR_KEY) { /* checking only the first card should be fine */ - /* Check written value against LFSR key. */ - if (val == pnp_init_key[dev->key_pos]) { - dev->key_pos++; - if (!dev->key_pos) { - isapnp_log("ISAPnP: Key unlocked, putting cards to SLEEP\n"); - while (card) { - if (card->enable && (card->enable != ISAPNP_CARD_NO_KEY) && (card->state == PNP_STATE_WAIT_FOR_KEY)) - card->state = PNP_STATE_SLEEP; - card = card->next; - } - } - } else { - dev->key_pos = 0; - } + /* Check written value against LFSR key. */ + if (val == pnp_init_key[dev->key_pos]) { + dev->key_pos++; + if (!dev->key_pos) { + isapnp_log("ISAPnP: Key unlocked, putting cards to SLEEP\n"); + while (card) { + if (card->enable && (card->enable != ISAPNP_CARD_NO_KEY) && (card->state == PNP_STATE_WAIT_FOR_KEY)) + card->state = PNP_STATE_SLEEP; + card = card->next; + } + } + } else { + dev->key_pos = 0; + } } } - static void isapnp_write_data(uint16_t addr, uint8_t val, void *priv) { - isapnp_t *dev = (isapnp_t *) priv; - isapnp_card_t *card; + isapnp_t *dev = (isapnp_t *) priv; + isapnp_card_t *card; isapnp_device_t *ld; - uint16_t io_addr, reset_cards = 0; + uint16_t io_addr, reset_cards = 0; isapnp_log("ISAPnP: write_data(%02X)\n", val); switch (dev->reg) { - case 0x00: /* Set RD_DATA Port */ - isapnp_set_read_data((val << 2) | 3, dev); - isapnp_log("ISAPnP: Read data port set to %04X\n", dev->read_data_addr); - break; + case 0x00: /* Set RD_DATA Port */ + isapnp_set_read_data((val << 2) | 3, dev); + isapnp_log("ISAPnP: Read data port set to %04X\n", dev->read_data_addr); + break; - case 0x02: /* Config Control */ - if (val & 0x01) { - isapnp_log("ISAPnP: Reset\n"); + case 0x02: /* Config Control */ + if (val & 0x01) { + isapnp_log("ISAPnP: Reset\n"); - card = dev->first_card; - while (card) { - ld = card->first_ld; - while (ld) { - if (card->state != PNP_STATE_WAIT_FOR_KEY) { - isapnp_reset_ld_regs(ld); - isapnp_device_config_changed(card, ld); - reset_cards++; - } - ld = ld->next; - } - card = card->next; - } + card = dev->first_card; + while (card) { + ld = card->first_ld; + while (ld) { + if (card->state != PNP_STATE_WAIT_FOR_KEY) { + isapnp_reset_ld_regs(ld); + isapnp_device_config_changed(card, ld); + reset_cards++; + } + ld = ld->next; + } + card = card->next; + } - if (reset_cards != 0) { - dev->current_ld = NULL; - dev->current_ld_card = NULL; - dev->isolated_card = NULL; - } - } - if (val & 0x02) { - isapnp_log("ISAPnP: Return to WAIT_FOR_KEY\n"); - card = dev->first_card; - while (card) { - card->state = PNP_STATE_WAIT_FOR_KEY; - card = card->next; - } - } - if (val & 0x04) { - isapnp_log("ISAPnP: Reset CSN\n"); - card = dev->first_card; - while (card) { - isapnp_set_csn(card, 0); - card = card->next; - } - } - break; + if (reset_cards != 0) { + dev->current_ld = NULL; + dev->current_ld_card = NULL; + dev->isolated_card = NULL; + } + } + if (val & 0x02) { + isapnp_log("ISAPnP: Return to WAIT_FOR_KEY\n"); + card = dev->first_card; + while (card) { + card->state = PNP_STATE_WAIT_FOR_KEY; + card = card->next; + } + } + if (val & 0x04) { + isapnp_log("ISAPnP: Reset CSN\n"); + card = dev->first_card; + while (card) { + isapnp_set_csn(card, 0); + card = card->next; + } + } + break; - case 0x03: /* Wake[CSN] */ - isapnp_log("ISAPnP: Wake[%02X]\n", val); - card = dev->first_card; - while (card) { - if (card->csn == val) { - card->rom_pos = 0; - card->id_checksum = pnp_init_key[0]; - if (card->state == PNP_STATE_SLEEP) - card->state = (val == 0) ? PNP_STATE_ISOLATION : PNP_STATE_CONFIG; - } else { - card->state = PNP_STATE_SLEEP; - } + case 0x03: /* Wake[CSN] */ + isapnp_log("ISAPnP: Wake[%02X]\n", val); + card = dev->first_card; + while (card) { + if (card->csn == val) { + card->rom_pos = 0; + card->id_checksum = pnp_init_key[0]; + if (card->state == PNP_STATE_SLEEP) + card->state = (val == 0) ? PNP_STATE_ISOLATION : PNP_STATE_CONFIG; + } else { + card->state = PNP_STATE_SLEEP; + } - card = card->next; - } - break; + card = card->next; + } + break; - case 0x06: /* Card Select Number */ - if (dev->isolated_card) { - isapnp_log("ISAPnP: Set CSN %02X\n", val); - isapnp_set_csn(dev->isolated_card, val); - dev->isolated_card->state = PNP_STATE_CONFIG; - dev->isolated_card = NULL; - } else { - isapnp_log("ISAPnP: Set CSN %02X but no card is isolated\n", val); - } - break; + case 0x06: /* Card Select Number */ + if (dev->isolated_card) { + isapnp_log("ISAPnP: Set CSN %02X\n", val); + isapnp_set_csn(dev->isolated_card, val); + dev->isolated_card->state = PNP_STATE_CONFIG; + dev->isolated_card = NULL; + } else { + isapnp_log("ISAPnP: Set CSN %02X but no card is isolated\n", val); + } + break; - case 0x07: /* Logical Device Number */ - CHECK_CURRENT_CARD(); + case 0x07: /* Logical Device Number */ + CHECK_CURRENT_CARD(); - ld = card->first_ld; - while (ld) { - if (ld->number == val) { - isapnp_log("ISAPnP: Select CSN %02X device %02X\n", card->csn, val); - dev->current_ld_card = card; - dev->current_ld = ld; - break; - } - ld = ld->next; - } + ld = card->first_ld; + while (ld) { + if (ld->number == val) { + isapnp_log("ISAPnP: Select CSN %02X device %02X\n", card->csn, val); + dev->current_ld_card = card; + dev->current_ld = ld; + break; + } + ld = ld->next; + } - if (!ld) - isapnp_log("ISAPnP: CSN %02X has no device %02X\n", card->csn, val); + if (!ld) + isapnp_log("ISAPnP: CSN %02X has no device %02X\n", card->csn, val); - break; + break; - case 0x30: /* Activate */ - CHECK_CURRENT_LD(); + case 0x30: /* Activate */ + CHECK_CURRENT_LD(); - isapnp_log("ISAPnP: %sctivate CSN %02X device %02X\n", (val & 0x01) ? "A" : "Dea", dev->current_ld_card->csn, dev->current_ld->number); + isapnp_log("ISAPnP: %sctivate CSN %02X device %02X\n", (val & 0x01) ? "A" : "Dea", dev->current_ld_card->csn, dev->current_ld->number); - dev->current_ld->regs[dev->reg] = val & 0x01; - isapnp_device_config_changed(dev->current_ld_card, dev->current_ld); + dev->current_ld->regs[dev->reg] = val & 0x01; + isapnp_device_config_changed(dev->current_ld_card, dev->current_ld); - break; + break; - case 0x31: /* I/O Range Check */ - CHECK_CURRENT_LD(); + case 0x31: /* I/O Range Check */ + CHECK_CURRENT_LD(); - for (uint8_t i = 0; i < 8; i++) { - if (!dev->current_ld->io_len[i]) - continue; + for (uint8_t i = 0; i < 8; i++) { + if (!dev->current_ld->io_len[i]) + continue; - io_addr = (dev->current_ld->regs[0x60 + (2 * i)] << 8) | dev->current_ld->regs[0x61 + (2 * i)]; - if (dev->current_ld->regs[dev->reg] & 0x02) - io_removehandler(io_addr, dev->current_ld->io_len[i], isapnp_read_rangecheck, NULL, NULL, NULL, NULL, NULL, dev->current_ld); - if (val & 0x02) - io_sethandler(io_addr, dev->current_ld->io_len[i], isapnp_read_rangecheck, NULL, NULL, NULL, NULL, NULL, dev->current_ld); - } + io_addr = (dev->current_ld->regs[0x60 + (2 * i)] << 8) | dev->current_ld->regs[0x61 + (2 * i)]; + if (dev->current_ld->regs[dev->reg] & 0x02) + io_removehandler(io_addr, dev->current_ld->io_len[i], isapnp_read_rangecheck, NULL, NULL, NULL, NULL, NULL, dev->current_ld); + if (val & 0x02) + io_sethandler(io_addr, dev->current_ld->io_len[i], isapnp_read_rangecheck, NULL, NULL, NULL, NULL, NULL, dev->current_ld); + } - dev->current_ld->regs[dev->reg] = val & 0x03; - isapnp_device_config_changed(dev->current_ld_card, dev->current_ld); + dev->current_ld->regs[dev->reg] = val & 0x03; + isapnp_device_config_changed(dev->current_ld_card, dev->current_ld); - break; + break; - case 0x20: case 0x21: case 0x22: case 0x23: - case 0x24: case 0x25: case 0x26: case 0x27: - case 0x28: case 0x29: case 0x2a: case 0x2b: - case 0x2c: case 0x2d: case 0x2e: case 0x2f: - CHECK_CURRENT_CARD(); + case 0x20: + case 0x21: + case 0x22: + case 0x23: + case 0x24: + case 0x25: + case 0x26: + case 0x27: + case 0x28: + case 0x29: + case 0x2a: + case 0x2b: + case 0x2c: + case 0x2d: + case 0x2e: + case 0x2f: + CHECK_CURRENT_CARD(); - isapnp_log("ISAPnP: Write %02X to vendor-defined register %02X on CSN %02X\n", val, dev->reg, card->csn); + isapnp_log("ISAPnP: Write %02X to vendor-defined register %02X on CSN %02X\n", val, dev->reg, card->csn); - if (card->write_vendor_reg) - card->write_vendor_reg(0, dev->reg, val, card->priv); - break; + if (card->write_vendor_reg) + card->write_vendor_reg(0, dev->reg, val, card->priv); + break; - case 0x38: case 0x39: case 0x3a: case 0x3b: - case 0x3c: case 0x3d: case 0x3e: case 0x3f: - case 0xf0: case 0xf1: case 0xf2: case 0xf3: - case 0xf4: case 0xf5: case 0xf6: case 0xf7: - case 0xf8: case 0xf9: case 0xfa: case 0xfb: - case 0xfc: case 0xfd: case 0xfe: - CHECK_CURRENT_LD(); - isapnp_log("ISAPnP: Write %02X to vendor-defined register %02X on CSN %02X device %02X\n", val, dev->reg, dev->current_ld_card->csn, dev->current_ld->number); - if (dev->current_ld_card->write_vendor_reg) - dev->current_ld_card->write_vendor_reg(dev->current_ld->number, dev->reg, val, dev->current_ld_card->priv); - break; + case 0x38: + case 0x39: + case 0x3a: + case 0x3b: + case 0x3c: + case 0x3d: + case 0x3e: + case 0x3f: + case 0xf0: + case 0xf1: + case 0xf2: + case 0xf3: + case 0xf4: + case 0xf5: + case 0xf6: + case 0xf7: + case 0xf8: + case 0xf9: + case 0xfa: + case 0xfb: + case 0xfc: + case 0xfd: + case 0xfe: + CHECK_CURRENT_LD(); + isapnp_log("ISAPnP: Write %02X to vendor-defined register %02X on CSN %02X device %02X\n", val, dev->reg, dev->current_ld_card->csn, dev->current_ld->number); + if (dev->current_ld_card->write_vendor_reg) + dev->current_ld_card->write_vendor_reg(dev->current_ld->number, dev->reg, val, dev->current_ld_card->priv); + break; - default: - if (dev->reg >= 0x40) { - CHECK_CURRENT_LD(); - isapnp_log("ISAPnP: Write %02X to register %02X on CSN %02X device %02X\n", val, dev->reg, dev->current_ld_card->csn, dev->current_ld->number); + default: + if (dev->reg >= 0x40) { + CHECK_CURRENT_LD(); + isapnp_log("ISAPnP: Write %02X to register %02X on CSN %02X device %02X\n", val, dev->reg, dev->current_ld_card->csn, dev->current_ld->number); - switch (dev->reg) { - case 0x42: case 0x4a: case 0x52: case 0x5a: - case 0x7a: case 0x84: case 0x94: case 0xa4: - /* Read-only memory range length / upper limit bit. */ - val = (val & 0xfe) | (dev->current_ld->regs[dev->reg] & 0x01); - break; + switch (dev->reg) { + case 0x42: + case 0x4a: + case 0x52: + case 0x5a: + case 0x7a: + case 0x84: + case 0x94: + case 0xa4: + /* Read-only memory range length / upper limit bit. */ + val = (val & 0xfe) | (dev->current_ld->regs[dev->reg] & 0x01); + break; - case 0x60: case 0x62: case 0x64: case 0x66: case 0x68: case 0x6a: case 0x6c: case 0x6e: - /* Discard upper address bits if this I/O range can only decode 10-bit. */ - if (!(dev->current_ld->io_16bit & (1 << ((dev->reg >> 1) & 0x07)))) - val &= 0x03; - break; + case 0x60: + case 0x62: + case 0x64: + case 0x66: + case 0x68: + case 0x6a: + case 0x6c: + case 0x6e: + /* Discard upper address bits if this I/O range can only decode 10-bit. */ + if (!(dev->current_ld->io_16bit & (1 << ((dev->reg >> 1) & 0x07)))) + val &= 0x03; + break; - case 0x71: case 0x73: - /* Limit IRQ types to supported ones. */ - if ((val & 0x01) && !(dev->current_ld->irq_types & ((dev->reg == 0x71) ? 0x0c : 0xc0))) /* level, not supported = force edge */ - val &= ~0x01; - else if (!(val & 0x01) && !(dev->current_ld->irq_types & ((dev->reg == 0x71) ? 0x03 : 0x30))) /* edge, not supported = force level */ - val |= 0x01; + case 0x71: + case 0x73: + /* Limit IRQ types to supported ones. */ + if ((val & 0x01) && !(dev->current_ld->irq_types & ((dev->reg == 0x71) ? 0x0c : 0xc0))) /* level, not supported = force edge */ + val &= ~0x01; + else if (!(val & 0x01) && !(dev->current_ld->irq_types & ((dev->reg == 0x71) ? 0x03 : 0x30))) /* edge, not supported = force level */ + val |= 0x01; - if ((val & 0x02) && !(dev->current_ld->irq_types & ((dev->reg == 0x71) ? 0x05 : 0x50))) /* high, not supported = force low */ - val &= ~0x02; - else if (!(val & 0x02) && !(dev->current_ld->irq_types & ((dev->reg == 0x71) ? 0x0a : 0xa0))) /* low, not supported = force high */ - val |= 0x02; + if ((val & 0x02) && !(dev->current_ld->irq_types & ((dev->reg == 0x71) ? 0x05 : 0x50))) /* high, not supported = force low */ + val &= ~0x02; + else if (!(val & 0x02) && !(dev->current_ld->irq_types & ((dev->reg == 0x71) ? 0x0a : 0xa0))) /* low, not supported = force high */ + val |= 0x02; - break; - } + break; + } - dev->current_ld->regs[dev->reg] = val; - isapnp_device_config_changed(dev->current_ld_card, dev->current_ld); - } - break; + dev->current_ld->regs[dev->reg] = val; + isapnp_device_config_changed(dev->current_ld_card, dev->current_ld); + } + break; } } - static void * isapnp_init(const device_t *info) { @@ -637,25 +697,24 @@ isapnp_init(const device_t *info) return dev; } - static void isapnp_close(void *priv) { - isapnp_t *dev = (isapnp_t *) priv; - isapnp_card_t *card = dev->first_card, *next_card; + isapnp_t *dev = (isapnp_t *) priv; + isapnp_card_t *card = dev->first_card, *next_card; isapnp_device_t *ld, *next_ld; while (card) { - ld = card->first_ld; - while (ld) { - next_ld = ld->next; - free(ld); - ld = next_ld; - } + ld = card->first_ld; + while (ld) { + next_ld = ld->next; + free(ld); + ld = next_ld; + } - next_card = card->next; - free(card); - card = next_card; + next_card = card->next; + free(card); + card = next_card; } io_removehandler(0x279, 1, NULL, NULL, NULL, isapnp_write_addr, NULL, NULL, dev); @@ -664,51 +723,49 @@ isapnp_close(void *priv) free(dev); } - void * isapnp_add_card(uint8_t *rom, uint16_t rom_size, - void (*config_changed)(uint8_t ld, isapnp_device_config_t *config, void *priv), - void (*csn_changed)(uint8_t csn, void *priv), - uint8_t (*read_vendor_reg)(uint8_t ld, uint8_t reg, void *priv), - void (*write_vendor_reg)(uint8_t ld, uint8_t reg, uint8_t val, void *priv), - void *priv) + void (*config_changed)(uint8_t ld, isapnp_device_config_t *config, void *priv), + void (*csn_changed)(uint8_t csn, void *priv), + uint8_t (*read_vendor_reg)(uint8_t ld, uint8_t reg, void *priv), + void (*write_vendor_reg)(uint8_t ld, uint8_t reg, uint8_t val, void *priv), + void *priv) { isapnp_t *dev = (isapnp_t *) device_get_priv(&isapnp_device); if (!dev) - dev = (isapnp_t *) device_add(&isapnp_device); + dev = (isapnp_t *) device_add(&isapnp_device); isapnp_card_t *card = (isapnp_card_t *) malloc(sizeof(isapnp_card_t)); memset(card, 0, sizeof(isapnp_card_t)); - card->enable = 1; - card->priv = priv; - card->config_changed = config_changed; - card->csn_changed = csn_changed; - card->read_vendor_reg = read_vendor_reg; + card->enable = 1; + card->priv = priv; + card->config_changed = config_changed; + card->csn_changed = csn_changed; + card->read_vendor_reg = read_vendor_reg; card->write_vendor_reg = write_vendor_reg; if (!dev->first_card) { - dev->first_card = card; + dev->first_card = card; } else { - isapnp_card_t *prev_card = dev->first_card; - while (prev_card->next) - prev_card = prev_card->next; - prev_card->next = card; + isapnp_card_t *prev_card = dev->first_card; + while (prev_card->next) + prev_card = prev_card->next; + prev_card->next = card; } if (rom && rom_size) - isapnp_update_card_rom(card, rom, rom_size); + isapnp_update_card_rom(card, rom, rom_size); return card; } - void isapnp_update_card_rom(void *priv, uint8_t *rom, uint16_t rom_size) { isapnp_card_t *card = (isapnp_card_t *) priv; - card->rom = rom; - card->rom_size = rom_size; + card->rom = rom; + card->rom_size = rom_size; /* Parse resources in ROM to allocate logical devices, and determine the state of read-only register bits. */ @@ -716,10 +773,10 @@ isapnp_update_card_rom(void *priv, uint8_t *rom, uint16_t rom_size) uint16_t vendor = (card->rom[0] << 8) | card->rom[1]; isapnp_log("ISAPnP: Parsing ROM resources for card %c%c%c%02X%02X (serial %08X)\n", '@' + ((vendor >> 10) & 0x1f), '@' + ((vendor >> 5) & 0x1f), '@' + (vendor & 0x1f), card->rom[2], card->rom[3], (card->rom[7] << 24) | (card->rom[6] << 16) | (card->rom[5] << 8) | card->rom[4]); #endif - uint16_t i = 9, j; - uint8_t existing = 0, ldn = 0, res, in_df = 0; - uint8_t irq = 0, io = 0, mem_range = 0, mem_range_32 = 0, irq_df = 0, io_df = 0, mem_range_df = 0, mem_range_32_df = 0; - uint32_t len; + uint16_t i = 9, j; + uint8_t existing = 0, ldn = 0, res, in_df = 0; + uint8_t irq = 0, io = 0, mem_range = 0, mem_range_32 = 0, irq_df = 0, io_df = 0, mem_range_df = 0, mem_range_32_df = 0; + uint32_t len; isapnp_device_t *ld = NULL, *prev_ld = NULL; /* Check if this is an existing card which already has logical devices. @@ -729,276 +786,274 @@ isapnp_update_card_rom(void *priv, uint8_t *rom, uint16_t rom_size) /* Iterate through ROM resources. */ while (i < card->rom_size) { - if (card->rom[i] & 0x80) { /* large resource */ - res = card->rom[i] & 0x7f; - len = (card->rom[i + 2] << 8) | card->rom[i + 1]; + if (card->rom[i] & 0x80) { /* large resource */ + res = card->rom[i] & 0x7f; + len = (card->rom[i + 2] << 8) | card->rom[i + 1]; - switch (res) { - case 0x01: /* memory range */ - case 0x05: /* 32-bit memory range */ - if (res == 0x01) { - if (!ld) { - isapnp_log("ISAPnP: >>%s Memory descriptor with no logical device\n", in_df ? ">" : ""); - break; - } + switch (res) { + case 0x01: /* memory range */ + case 0x05: /* 32-bit memory range */ + if (res == 0x01) { + if (!ld) { + isapnp_log("ISAPnP: >>%s Memory descriptor with no logical device\n", in_df ? ">" : ""); + break; + } - if (mem_range > 3) { - isapnp_log("ISAPnP: >>%s Memory descriptor overflow (%d)\n", in_df ? ">" : "", mem_range++); - break; - } + if (mem_range > 3) { + isapnp_log("ISAPnP: >>%s Memory descriptor overflow (%d)\n", in_df ? ">" : "", mem_range++); + break; + } - isapnp_log("ISAPnP: >>%s Memory range %d uses upper limit = ", in_df ? ">" : "", mem_range); - res = 1 << mem_range; - mem_range++; - } else { - if (!ld) { - isapnp_log("ISAPnP: >>%s 32-bit memory descriptor with no logical device\n", in_df ? ">" : ""); - break; - } + isapnp_log("ISAPnP: >>%s Memory range %d uses upper limit = ", in_df ? ">" : "", mem_range); + res = 1 << mem_range; + mem_range++; + } else { + if (!ld) { + isapnp_log("ISAPnP: >>%s 32-bit memory descriptor with no logical device\n", in_df ? ">" : ""); + break; + } - if (mem_range_32 > 3) { - isapnp_log("ISAPnP: >>%s 32-bit memory descriptor overflow (%d)\n", in_df ? ">" : "", mem_range_32++); - break; - } + if (mem_range_32 > 3) { + isapnp_log("ISAPnP: >>%s 32-bit memory descriptor overflow (%d)\n", in_df ? ">" : "", mem_range_32++); + break; + } - isapnp_log("ISAPnP: >>%s 32-bit memory range %d uses upper limit = ", in_df ? ">" : "", mem_range_32); - res = 1 << (4 + mem_range_32); - mem_range_32++; - } + isapnp_log("ISAPnP: >>%s 32-bit memory range %d uses upper limit = ", in_df ? ">" : "", mem_range_32); + res = 1 << (4 + mem_range_32); + mem_range_32++; + } - if (card->rom[i + 3] & 0x4) { - isapnp_log("yes\n"); - ld->mem_upperlimit |= res; - } else { - isapnp_log("no\n"); - ld->mem_upperlimit &= ~res; - } + if (card->rom[i + 3] & 0x4) { + isapnp_log("yes\n"); + ld->mem_upperlimit |= res; + } else { + isapnp_log("no\n"); + ld->mem_upperlimit &= ~res; + } - break; + break; #ifdef ENABLE_ISAPNP_LOG - case 0x02: /* ANSI identifier */ - res = card->rom[i + 3 + len]; - card->rom[i + 3 + len] = '\0'; - isapnp_log("ISAPnP: >%s ANSI identifier: \"%s\"\n", ldn ? ">" : "", &card->rom[i + 3]); - card->rom[i + 3 + len] = res; - break; + case 0x02: /* ANSI identifier */ + res = card->rom[i + 3 + len]; + card->rom[i + 3 + len] = '\0'; + isapnp_log("ISAPnP: >%s ANSI identifier: \"%s\"\n", ldn ? ">" : "", &card->rom[i + 3]); + card->rom[i + 3 + len] = res; + break; - default: - isapnp_log("ISAPnP: >%s%s Large resource %02X (length %d)\n", ldn ? ">" : "", in_df ? ">" : "", res, (card->rom[i + 2] << 8) | card->rom[i + 1]); - break; + default: + isapnp_log("ISAPnP: >%s%s Large resource %02X (length %d)\n", ldn ? ">" : "", in_df ? ">" : "", res, (card->rom[i + 2] << 8) | card->rom[i + 1]); + break; #endif - } + } - i += 3; /* header */ - } else { /* small resource */ - res = (card->rom[i] >> 3) & 0x0f; - len = card->rom[i] & 0x07; + i += 3; /* header */ + } else { /* small resource */ + res = (card->rom[i] >> 3) & 0x0f; + len = card->rom[i] & 0x07; - switch (res) { - case 0x02: + switch (res) { + case 0x02: #ifdef ENABLE_ISAPNP_LOG - vendor = (card->rom[i + 1] << 8) | card->rom[i + 2]; - isapnp_log("ISAPnP: > Logical device %02X: %c%c%c%02X%02X\n", ldn, '@' + ((vendor >> 10) & 0x1f), '@' + ((vendor >> 5) & 0x1f), '@' + (vendor & 0x1f), card->rom[i + 3], card->rom[i + 4]); + vendor = (card->rom[i + 1] << 8) | card->rom[i + 2]; + isapnp_log("ISAPnP: > Logical device %02X: %c%c%c%02X%02X\n", ldn, '@' + ((vendor >> 10) & 0x1f), '@' + ((vendor >> 5) & 0x1f), '@' + (vendor & 0x1f), card->rom[i + 3], card->rom[i + 4]); #endif - /* We're done with the previous logical device. */ - if (ld && !existing) - isapnp_reset_ld_regs(ld); + /* We're done with the previous logical device. */ + if (ld && !existing) + isapnp_reset_ld_regs(ld); - /* Look for an existing logical device with this number, - and create one if none exist. */ - if (existing) { - ld = card->first_ld; - while (ld && (ld->number != ldn)) - ld = ld->next; - } - if (ld && (ld->number == ldn)) { - /* Reset some logical device state. */ - ld->mem_upperlimit = ld->io_16bit = ld->irq_types = 0; - memset(ld->io_len, 0, sizeof(ld->io_len)); - } else { - /* Create logical device. */ - ld = (isapnp_device_t *) malloc(sizeof(isapnp_device_t)); - memset(ld, 0, sizeof(isapnp_device_t)); + /* Look for an existing logical device with this number, + and create one if none exist. */ + if (existing) { + ld = card->first_ld; + while (ld && (ld->number != ldn)) + ld = ld->next; + } + if (ld && (ld->number == ldn)) { + /* Reset some logical device state. */ + ld->mem_upperlimit = ld->io_16bit = ld->irq_types = 0; + memset(ld->io_len, 0, sizeof(ld->io_len)); + } else { + /* Create logical device. */ + ld = (isapnp_device_t *) malloc(sizeof(isapnp_device_t)); + memset(ld, 0, sizeof(isapnp_device_t)); - /* Add to end of list. */ - prev_ld = card->first_ld; - if (prev_ld) { - while (prev_ld->next) - prev_ld = prev_ld->next; - prev_ld->next = ld; - } else { - card->first_ld = ld; - } - } + /* Add to end of list. */ + prev_ld = card->first_ld; + if (prev_ld) { + while (prev_ld->next) + prev_ld = prev_ld->next; + prev_ld->next = ld; + } else { + card->first_ld = ld; + } + } - /* Set and increment logical device number. */ - ld->number = ldn++; + /* Set and increment logical device number. */ + ld->number = ldn++; - /* Start the position counts over. */ - irq = io = mem_range = mem_range_32 = irq_df = io_df = mem_range_df = mem_range_32_df = 0; + /* Start the position counts over. */ + irq = io = mem_range = mem_range_32 = irq_df = io_df = mem_range_df = mem_range_32_df = 0; - break; + break; #ifdef ENABLE_ISAPNP_LOG - case 0x03: /* compatible device ID */ - if (!ld) { - isapnp_log("ISAPnP: >> Compatible device ID with no logical device\n"); - break; - } + case 0x03: /* compatible device ID */ + if (!ld) { + isapnp_log("ISAPnP: >> Compatible device ID with no logical device\n"); + break; + } - vendor = (card->rom[i + 1] << 8) | card->rom[i + 2]; - isapnp_log("ISAPnP: >> Compatible device ID: %c%c%c%02X%02X\n", '@' + ((vendor >> 10) & 0x1f), '@' + ((vendor >> 5) & 0x1f), '@' + (vendor & 0x1f), card->rom[i + 3], card->rom[i + 4]); - break; + vendor = (card->rom[i + 1] << 8) | card->rom[i + 2]; + isapnp_log("ISAPnP: >> Compatible device ID: %c%c%c%02X%02X\n", '@' + ((vendor >> 10) & 0x1f), '@' + ((vendor >> 5) & 0x1f), '@' + (vendor & 0x1f), card->rom[i + 3], card->rom[i + 4]); + break; #endif - case 0x04: /* IRQ */ - if (!ld) { - isapnp_log("ISAPnP: >>%s IRQ descriptor with no logical device\n", in_df ? ">" : ""); - break; - } + case 0x04: /* IRQ */ + if (!ld) { + isapnp_log("ISAPnP: >>%s IRQ descriptor with no logical device\n", in_df ? ">" : ""); + break; + } - if (irq > 1) { - isapnp_log("ISAPnP: >>%s IRQ descriptor overflow (%d)\n", in_df ? ">" : "", irq++); - break; - } + if (irq > 1) { + isapnp_log("ISAPnP: >>%s IRQ descriptor overflow (%d)\n", in_df ? ">" : "", irq++); + break; + } - if (len == 2) /* default */ - res = 0x01; /* high true edge sensitive */ - else /* specific */ - res = card->rom[i + 3] & 0x0f; + if (len == 2) /* default */ + res = 0x01; /* high true edge sensitive */ + else /* specific */ + res = card->rom[i + 3] & 0x0f; - isapnp_log("ISAPnP: >>%s IRQ index %d interrupt types = %01X\n", in_df ? ">" : "", irq, res); + isapnp_log("ISAPnP: >>%s IRQ index %d interrupt types = %01X\n", in_df ? ">" : "", irq, res); - ld->irq_types &= ~(0x0f << (4 * irq)); - ld->irq_types |= res << (4 * irq); + ld->irq_types &= ~(0x0f << (4 * irq)); + ld->irq_types |= res << (4 * irq); - irq++; + irq++; - break; + break; - case 0x06: /* start dependent function */ - if (!ld) { - isapnp_log("ISAPnP: >> Start dependent function with no logical device\n"); - break; - } + case 0x06: /* start dependent function */ + if (!ld) { + isapnp_log("ISAPnP: >> Start dependent function with no logical device\n"); + break; + } - isapnp_log("ISAPnP: >> Start dependent function: %s\n", (((len == 0) || (card->rom[i + 1] == 1)) ? "acceptable" : ((card->rom[i + 1] == 0) ? "good" : ((card->rom[i + 1] == 2) ? "sub-optimal" : "unknown priority")))); + isapnp_log("ISAPnP: >> Start dependent function: %s\n", (((len == 0) || (card->rom[i + 1] == 1)) ? "acceptable" : ((card->rom[i + 1] == 0) ? "good" : ((card->rom[i + 1] == 2) ? "sub-optimal" : "unknown priority")))); - if (in_df) { - /* We're in a dependent function and this is the next one starting. - Walk positions back to the saved values. */ - irq = irq_df; - io = io_df; - mem_range = mem_range_df; - mem_range_32 = mem_range_32_df; - } else { - /* Save current positions to restore at the next DF. */ - irq_df = irq; - io_df = io; - mem_range_df = mem_range; - mem_range_32_df = mem_range_32; - in_df = 1; - } + if (in_df) { + /* We're in a dependent function and this is the next one starting. + Walk positions back to the saved values. */ + irq = irq_df; + io = io_df; + mem_range = mem_range_df; + mem_range_32 = mem_range_32_df; + } else { + /* Save current positions to restore at the next DF. */ + irq_df = irq; + io_df = io; + mem_range_df = mem_range; + mem_range_32_df = mem_range_32; + in_df = 1; + } - break; + break; - case 0x07: /* end dependent function */ - isapnp_log("ISAPnP: >> End dependent function\n"); - in_df = 0; - break; + case 0x07: /* end dependent function */ + isapnp_log("ISAPnP: >> End dependent function\n"); + in_df = 0; + break; - case 0x08: /* I/O port */ - if (!ld) { - isapnp_log("ISAPnP: >>%s I/O descriptor with no logical device\n", in_df ? ">" : ""); - break; - } + case 0x08: /* I/O port */ + if (!ld) { + isapnp_log("ISAPnP: >>%s I/O descriptor with no logical device\n", in_df ? ">" : ""); + break; + } - if (io > 7) { - isapnp_log("ISAPnP: >>%s I/O descriptor overflow (%d)\n", in_df ? ">" : "", io++); - break; - } + if (io > 7) { + isapnp_log("ISAPnP: >>%s I/O descriptor overflow (%d)\n", in_df ? ">" : "", io++); + break; + } - isapnp_log("ISAPnP: >>%s I/O range %d %d-bit decode, %d ports\n", in_df ? ">" : "", io, (card->rom[i + 1] & 0x01) ? 16 : 10, card->rom[i + 7]); + isapnp_log("ISAPnP: >>%s I/O range %d %d-bit decode, %d ports\n", in_df ? ">" : "", io, (card->rom[i + 1] & 0x01) ? 16 : 10, card->rom[i + 7]); - if (card->rom[i + 1] & 0x01) - ld->io_16bit |= 1 << io; - else - ld->io_16bit &= ~(1 << io); + if (card->rom[i + 1] & 0x01) + ld->io_16bit |= 1 << io; + else + ld->io_16bit &= ~(1 << io); - if (card->rom[i + 7] > ld->io_len[io]) - ld->io_len[io] = card->rom[i + 7]; + if (card->rom[i + 7] > ld->io_len[io]) + ld->io_len[io] = card->rom[i + 7]; - io++; + io++; - break; + break; - case 0x0f: /* end tag */ - /* Calculate checksum. */ - res = 0x00; - for (j = 9; j <= i; j++) - res += card->rom[j]; - card->rom[i + 1] = -res; + case 0x0f: /* end tag */ + /* Calculate checksum. */ + res = 0x00; + for (j = 9; j <= i; j++) + res += card->rom[j]; + card->rom[i + 1] = -res; - isapnp_log("ISAPnP: End card resources (checksum %02X)\n", card->rom[i + 1]); + isapnp_log("ISAPnP: End card resources (checksum %02X)\n", card->rom[i + 1]); - /* Stop parsing here. */ - card->rom_size = i + 2; - break; + /* Stop parsing here. */ + card->rom_size = i + 2; + break; #ifdef ENABLE_ISAPNP_LOG - default: - isapnp_log("ISAPnP: >%s%s Small resource %02X (length %d)\n", ldn ? ">" : "", in_df ? ">" : "", res, card->rom[i] & 0x07); - break; + default: + isapnp_log("ISAPnP: >%s%s Small resource %02X (length %d)\n", ldn ? ">" : "", in_df ? ">" : "", res, card->rom[i] & 0x07); + break; #endif - } + } - i++; /* header */ - } - i += len; /* specified length */ + i++; /* header */ + } + i += len; /* specified length */ } /* We're done with the last logical device. */ if (ld && !existing) - isapnp_reset_ld_regs(ld); + isapnp_reset_ld_regs(ld); } - void isapnp_enable_card(void *priv, uint8_t enable) { isapnp_t *dev = (isapnp_t *) device_get_priv(&isapnp_device); if (!dev) - return; + return; /* Look for a matching card. */ isapnp_card_t *card = dev->first_card; while (card) { - if (card == priv) { - /* Enable or disable the card. */ - if (!!enable ^ !!card->enable) - card->state = (enable == ISAPNP_CARD_FORCE_CONFIG) ? PNP_STATE_CONFIG : PNP_STATE_WAIT_FOR_KEY; - card->enable = enable; + if (card == priv) { + /* Enable or disable the card. */ + if (!!enable ^ !!card->enable) + card->state = (enable == ISAPNP_CARD_FORCE_CONFIG) ? PNP_STATE_CONFIG : PNP_STATE_WAIT_FOR_KEY; + card->enable = enable; - /* Invalidate other references if we're disabling this card. */ - if (!card->enable) { - if (dev->isolated_card == card) - dev->isolated_card = NULL; - if (dev->current_ld_card == card) { - dev->current_ld = NULL; - dev->current_ld_card = NULL; - } - } + /* Invalidate other references if we're disabling this card. */ + if (!card->enable) { + if (dev->isolated_card == card) + dev->isolated_card = NULL; + if (dev->current_ld_card == card) { + dev->current_ld = NULL; + dev->current_ld_card = NULL; + } + } - break; - } + break; + } - card = card->next; + card = card->next; } } - void isapnp_set_csn(void *priv, uint8_t csn) { @@ -1006,65 +1061,61 @@ isapnp_set_csn(void *priv, uint8_t csn) card->csn = csn; if (card->csn_changed) - card->csn_changed(card->csn, card->priv); + card->csn_changed(card->csn, card->priv); } - void isapnp_set_device_defaults(void *priv, uint8_t ldn, const isapnp_device_config_t *config) { - isapnp_card_t *card = (isapnp_card_t *) priv; - isapnp_device_t *ld = card->first_ld; + isapnp_card_t *card = (isapnp_card_t *) priv; + isapnp_device_t *ld = card->first_ld; /* Look for a logical device with this number. */ while (ld && (ld->number != ldn)) - ld = ld->next; + ld = ld->next; if (!ld) /* none found */ - return; + return; ld->defaults = config; } - void isapnp_reset_card(void *priv) { - isapnp_card_t *card = (isapnp_card_t *) priv; - isapnp_device_t *ld = card->first_ld; + isapnp_card_t *card = (isapnp_card_t *) priv; + isapnp_device_t *ld = card->first_ld; /* Reset all logical devices. */ while (ld) { - /* Reset the logical device's configuration. */ - isapnp_reset_ld_config(ld); - isapnp_device_config_changed(card, ld); + /* Reset the logical device's configuration. */ + isapnp_reset_ld_config(ld); + isapnp_device_config_changed(card, ld); - ld = ld->next; + ld = ld->next; } } - void isapnp_reset_device(void *priv, uint8_t ldn) { - isapnp_card_t *card = (isapnp_card_t *) priv; - isapnp_device_t *ld = card->first_ld; + isapnp_card_t *card = (isapnp_card_t *) priv; + isapnp_device_t *ld = card->first_ld; /* Look for a logical device with this number. */ while (ld && (ld->number != ldn)) - ld = ld->next; + ld = ld->next; if (!ld) /* none found */ - return; + return; /* Reset the logical device's configuration. */ isapnp_reset_ld_config(ld); isapnp_device_config_changed(card, ld); } - static const device_t isapnp_device = { - .name = "ISA Plug and Play", + .name = "ISA Plug and Play", .internal_name = "isapnp", .flags = 0, .local = 0, diff --git a/src/device/isartc.c b/src/device/isartc.c index dc9557e3e..b2f268569 100644 --- a/src/device/isartc.c +++ b/src/device/isartc.c @@ -63,7 +63,7 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ + */ #include #include #include @@ -82,108 +82,101 @@ #include <86box/pic.h> #include <86box/isartc.h> +#define ISARTC_EV170 0 +#define ISARTC_DTK 1 +#define ISARTC_P5PAK 2 +#define ISARTC_A6PAK 3 -#define ISARTC_EV170 0 -#define ISARTC_DTK 1 -#define ISARTC_P5PAK 2 -#define ISARTC_A6PAK 3 - -#define ISARTC_DEBUG 0 - +#define ISARTC_DEBUG 0 typedef struct { - const char *name; /* board name */ - uint8_t board; /* board type */ + const char *name; /* board name */ + uint8_t board; /* board type */ - uint8_t flags; /* various flags */ -#define FLAG_YEAR80 0x01 /* YEAR byte is base-80 */ -#define FLAG_YEARBCD 0x02 /* YEAR byte is in BCD */ + uint8_t flags; /* various flags */ +#define FLAG_YEAR80 0x01 /* YEAR byte is base-80 */ +#define FLAG_YEARBCD 0x02 /* YEAR byte is in BCD */ - int8_t irq; /* configured IRQ channel */ - int8_t base_addrsz; - uint32_t base_addr; /* configured I/O address */ + int8_t irq; /* configured IRQ channel */ + int8_t base_addrsz; + uint32_t base_addr; /* configured I/O address */ /* Fields for the specific driver. */ - void (*f_wr)(uint16_t, uint8_t, void *); - uint8_t (*f_rd)(uint16_t, void *); - int8_t year; /* register for YEAR value */ - char pad[3]; + void (*f_wr)(uint16_t, uint8_t, void *); + uint8_t (*f_rd)(uint16_t, void *); + int8_t year; /* register for YEAR value */ + char pad[3]; - nvr_t nvr; /* RTC/NVR */ + nvr_t nvr; /* RTC/NVR */ } rtcdev_t; - /************************************************************************ * * * Driver for the NatSemi MM58167 chip. * * * ************************************************************************/ -#define MM67_REGS 32 +#define MM67_REGS 32 /* Define the RTC chip registers - see datasheet, pg4. */ -#define MM67_MSEC 0 /* milliseconds */ -#define MM67_HUNTEN 1 /* hundredths/tenths of seconds */ -#define MM67_SEC 2 /* seconds */ -#define MM67_MIN 3 /* minutes */ -#define MM67_HOUR 4 /* hours */ -#define MM67_DOW 5 /* day of the week */ -#define MM67_DOM 6 /* day of the month */ -#define MM67_MON 7 /* month */ -#define MM67_AL_MSEC 8 /* milliseconds */ -#define MM67_AL_HUNTEN 9 /* hundredths/tenths of seconds */ -#define MM67_AL_SEC 10 /* seconds */ -#define MM67_AL_MIN 11 /* minutes */ -#define MM67_AL_HOUR 12 /* hours */ -#define MM67_AL_DOW 13 /* day of the week */ -#define MM67_AL_DOM 14 /* day of the month */ -#define MM67_AL_MON 15 /* month */ -# define MM67_AL_DONTCARE 0xc0 /* always match in compare */ -#define MM67_ISTAT 16 /* IRQ status */ -#define MM67_ICTRL 17 /* IRQ control */ -# define MM67INT_COMPARE 0x01 /* Compare */ -# define MM67INT_TENTH 0x02 /* Tenth */ -# define MM67INT_SEC 0x04 /* Second */ -# define MM67INT_MIN 0x08 /* Minute */ -# define MM67INT_HOUR 0x10 /* Hour */ -# define MM67INT_DAY 0x20 /* Day */ -# define MM67INT_WEEK 0x40 /* Week */ -# define MM67INT_MON 0x80 /* Month */ -#define MM67_RSTCTR 18 /* reset counters */ -#define MM67_RSTRAM 19 /* reset RAM */ -#define MM67_STATUS 20 /* status bit */ -#define MM67_GOCMD 21 /* GO Command */ -#define MM67_STBYIRQ 22 /* standby IRQ */ -#define MM67_TEST 31 /* test mode */ +#define MM67_MSEC 0 /* milliseconds */ +#define MM67_HUNTEN 1 /* hundredths/tenths of seconds */ +#define MM67_SEC 2 /* seconds */ +#define MM67_MIN 3 /* minutes */ +#define MM67_HOUR 4 /* hours */ +#define MM67_DOW 5 /* day of the week */ +#define MM67_DOM 6 /* day of the month */ +#define MM67_MON 7 /* month */ +#define MM67_AL_MSEC 8 /* milliseconds */ +#define MM67_AL_HUNTEN 9 /* hundredths/tenths of seconds */ +#define MM67_AL_SEC 10 /* seconds */ +#define MM67_AL_MIN 11 /* minutes */ +#define MM67_AL_HOUR 12 /* hours */ +#define MM67_AL_DOW 13 /* day of the week */ +#define MM67_AL_DOM 14 /* day of the month */ +#define MM67_AL_MON 15 /* month */ +#define MM67_AL_DONTCARE 0xc0 /* always match in compare */ +#define MM67_ISTAT 16 /* IRQ status */ +#define MM67_ICTRL 17 /* IRQ control */ +#define MM67INT_COMPARE 0x01 /* Compare */ +#define MM67INT_TENTH 0x02 /* Tenth */ +#define MM67INT_SEC 0x04 /* Second */ +#define MM67INT_MIN 0x08 /* Minute */ +#define MM67INT_HOUR 0x10 /* Hour */ +#define MM67INT_DAY 0x20 /* Day */ +#define MM67INT_WEEK 0x40 /* Week */ +#define MM67INT_MON 0x80 /* Month */ +#define MM67_RSTCTR 18 /* reset counters */ +#define MM67_RSTRAM 19 /* reset RAM */ +#define MM67_STATUS 20 /* status bit */ +#define MM67_GOCMD 21 /* GO Command */ +#define MM67_STBYIRQ 22 /* standby IRQ */ +#define MM67_TEST 31 /* test mode */ #ifdef ENABLE_ISARTC_LOG int isartc_do_log = ENABLE_ISARTC_LOG; - static void isartc_log(const char *fmt, ...) { va_list ap; if (isartc_do_log) { - va_start(ap, fmt); - pclog_ex(fmt, ap); - va_end(ap); + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); } } #else -#define isartc_log(fmt, ...) +# define isartc_log(fmt, ...) #endif - /* Check if the current time matches a set alarm time. */ static int8_t mm67_chkalrm(nvr_t *nvr, int8_t addr) { - return((nvr->regs[addr-MM67_AL_SEC+MM67_SEC] == nvr->regs[addr]) || - ((nvr->regs[addr] & MM67_AL_DONTCARE) == MM67_AL_DONTCARE)); + return ((nvr->regs[addr - MM67_AL_SEC + MM67_SEC] == nvr->regs[addr]) || ((nvr->regs[addr] & MM67_AL_DONTCARE) == MM67_AL_DONTCARE)); } - /* * This is called every second through the NVR/RTC hook. * @@ -197,160 +190,163 @@ mm67_chkalrm(nvr_t *nvr, int8_t addr) static void mm67_tick(nvr_t *nvr) { - rtcdev_t *dev = (rtcdev_t *)nvr->data; - uint8_t *regs = nvr->regs; - int mon, year, f = 0; + rtcdev_t *dev = (rtcdev_t *) nvr->data; + uint8_t *regs = nvr->regs; + int mon, year, f = 0; /* Update and set interrupt if needed. */ regs[MM67_SEC] = RTC_BCDINC(nvr->regs[MM67_SEC], 1); - if (regs[MM67_ICTRL] & MM67INT_SEC) f = MM67INT_SEC; + if (regs[MM67_ICTRL] & MM67INT_SEC) + f = MM67INT_SEC; /* Roll over? */ if (regs[MM67_SEC] >= RTC_BCD(60)) { - /* Update and set interrupt if needed. */ - regs[MM67_SEC] = RTC_BCD(0); - regs[MM67_MIN] = RTC_BCDINC(regs[MM67_MIN], 1); - if (regs[MM67_ICTRL] & MM67INT_MIN) f = MM67INT_MIN; + /* Update and set interrupt if needed. */ + regs[MM67_SEC] = RTC_BCD(0); + regs[MM67_MIN] = RTC_BCDINC(regs[MM67_MIN], 1); + if (regs[MM67_ICTRL] & MM67INT_MIN) + f = MM67INT_MIN; - /* Roll over? */ - if (regs[MM67_MIN] >= RTC_BCD(60)) { - /* Update and set interrupt if needed. */ - regs[MM67_MIN] = RTC_BCD(0); - regs[MM67_HOUR] = RTC_BCDINC(regs[MM67_HOUR], 1); - if (regs[MM67_ICTRL] & MM67INT_HOUR) f = MM67INT_HOUR; + /* Roll over? */ + if (regs[MM67_MIN] >= RTC_BCD(60)) { + /* Update and set interrupt if needed. */ + regs[MM67_MIN] = RTC_BCD(0); + regs[MM67_HOUR] = RTC_BCDINC(regs[MM67_HOUR], 1); + if (regs[MM67_ICTRL] & MM67INT_HOUR) + f = MM67INT_HOUR; - /* Roll over? */ - if (regs[MM67_HOUR] >= RTC_BCD(24)) { - /* Update and set interrupt if needed. */ - regs[MM67_HOUR] = RTC_BCD(0); - regs[MM67_DOW] = RTC_BCDINC(regs[MM67_DOW], 1); - if (regs[MM67_ICTRL] & MM67INT_DAY) f = MM67INT_DAY; + /* Roll over? */ + if (regs[MM67_HOUR] >= RTC_BCD(24)) { + /* Update and set interrupt if needed. */ + regs[MM67_HOUR] = RTC_BCD(0); + regs[MM67_DOW] = RTC_BCDINC(regs[MM67_DOW], 1); + if (regs[MM67_ICTRL] & MM67INT_DAY) + f = MM67INT_DAY; - /* Roll over? */ - if (regs[MM67_DOW] > RTC_BCD(7)) { - /* Update and set interrupt if needed. */ - regs[MM67_DOW] = RTC_BCD(1); - if (regs[MM67_ICTRL] & MM67INT_WEEK) f = MM67INT_WEEK; - } + /* Roll over? */ + if (regs[MM67_DOW] > RTC_BCD(7)) { + /* Update and set interrupt if needed. */ + regs[MM67_DOW] = RTC_BCD(1); + if (regs[MM67_ICTRL] & MM67INT_WEEK) + f = MM67INT_WEEK; + } - /* Roll over? */ - regs[MM67_DOM] = RTC_BCDINC(regs[MM67_DOM], 1); - mon = RTC_DCB(regs[MM67_MON]); - if (dev->year != -1) { - year = RTC_DCB(regs[dev->year]); - if (dev->flags & FLAG_YEAR80) - year += 80; - } else - year = 80; - year += 1900; - if (RTC_DCB(regs[MM67_DOM]) > nvr_get_days(mon, year)) { - /* Update and set interrupt if needed. */ - regs[MM67_DOM] = RTC_BCD(1); - regs[MM67_MON] = RTC_BCDINC(regs[MM67_MON], 1); - if (regs[MM67_ICTRL] & MM67INT_MON) f = MM67INT_MON; + /* Roll over? */ + regs[MM67_DOM] = RTC_BCDINC(regs[MM67_DOM], 1); + mon = RTC_DCB(regs[MM67_MON]); + if (dev->year != -1) { + year = RTC_DCB(regs[dev->year]); + if (dev->flags & FLAG_YEAR80) + year += 80; + } else + year = 80; + year += 1900; + if (RTC_DCB(regs[MM67_DOM]) > nvr_get_days(mon, year)) { + /* Update and set interrupt if needed. */ + regs[MM67_DOM] = RTC_BCD(1); + regs[MM67_MON] = RTC_BCDINC(regs[MM67_MON], 1); + if (regs[MM67_ICTRL] & MM67INT_MON) + f = MM67INT_MON; - /* Roll over? */ - if (regs[MM67_MON] > RTC_BCD(12)) { - /* Update. */ - regs[MM67_MON] = RTC_BCD(1); - if (dev->year != -1) { - year++; - if (dev->flags & FLAG_YEAR80) - year -= 80; + /* Roll over? */ + if (regs[MM67_MON] > RTC_BCD(12)) { + /* Update. */ + regs[MM67_MON] = RTC_BCD(1); + if (dev->year != -1) { + year++; + if (dev->flags & FLAG_YEAR80) + year -= 80; - if (dev->flags & FLAG_YEARBCD) - regs[dev->year] = RTC_BCD(year % 100); - else - regs[dev->year] = year % 100; - } - } - } - } - } + if (dev->flags & FLAG_YEARBCD) + regs[dev->year] = RTC_BCD(year % 100); + else + regs[dev->year] = year % 100; + } + } + } + } + } } /* Check for programmed alarm interrupt. */ if (regs[MM67_ICTRL] & MM67INT_COMPARE) { - year = 1; - for (mon = MM67_AL_SEC; mon <= MM67_AL_MON; mon++) - if (mon != dev->year) - year &= mm67_chkalrm(nvr, mon); - f = year ? MM67INT_COMPARE : 0x00; + year = 1; + for (mon = MM67_AL_SEC; mon <= MM67_AL_MON; mon++) + if (mon != dev->year) + year &= mm67_chkalrm(nvr, mon); + f = year ? MM67INT_COMPARE : 0x00; } /* Raise the IRQ if needed (and if we have one..) */ if (f != 0) { - regs[MM67_ISTAT] = f; - if (nvr->irq != -1) - picint(1 << nvr->irq); + regs[MM67_ISTAT] = f; + if (nvr->irq != -1) + picint(1 << nvr->irq); } } - /* Get the current NVR time. */ static void mm67_time_get(nvr_t *nvr, struct tm *tm) { - rtcdev_t *dev = (rtcdev_t *)nvr->data; - uint8_t *regs = nvr->regs; + rtcdev_t *dev = (rtcdev_t *) nvr->data; + uint8_t *regs = nvr->regs; /* NVR is in BCD data mode. */ - tm->tm_sec = RTC_DCB(regs[MM67_SEC]); - tm->tm_min = RTC_DCB(regs[MM67_MIN]); + tm->tm_sec = RTC_DCB(regs[MM67_SEC]); + tm->tm_min = RTC_DCB(regs[MM67_MIN]); tm->tm_hour = RTC_DCB(regs[MM67_HOUR]); tm->tm_wday = (RTC_DCB(regs[MM67_DOW]) - 1); tm->tm_mday = RTC_DCB(regs[MM67_DOM]); - tm->tm_mon = (RTC_DCB(regs[MM67_MON]) - 1); + tm->tm_mon = (RTC_DCB(regs[MM67_MON]) - 1); if (dev->year != -1) { - if (dev->flags & FLAG_YEARBCD) - tm->tm_year = RTC_DCB(regs[dev->year]); - else - tm->tm_year = regs[dev->year]; - if (dev->flags & FLAG_YEAR80) - tm->tm_year += 80; + if (dev->flags & FLAG_YEARBCD) + tm->tm_year = RTC_DCB(regs[dev->year]); + else + tm->tm_year = regs[dev->year]; + if (dev->flags & FLAG_YEAR80) + tm->tm_year += 80; #ifdef MM67_CENTURY - tm->tm_year += (regs[MM67_CENTURY] * 100) - 1900; + tm->tm_year += (regs[MM67_CENTURY] * 100) - 1900; #endif #if ISARTC_DEBUG > 1 - isartc_log("ISARTC: get_time: year=%i [%02x]\n", tm->tm_year, regs[dev->year]); + isartc_log("ISARTC: get_time: year=%i [%02x]\n", tm->tm_year, regs[dev->year]); #endif } } - /* Set the current NVR time. */ static void mm67_time_set(nvr_t *nvr, struct tm *tm) { - rtcdev_t *dev = (rtcdev_t *)nvr->data; - uint8_t *regs = nvr->regs; - int year; + rtcdev_t *dev = (rtcdev_t *) nvr->data; + uint8_t *regs = nvr->regs; + int year; /* NVR is in BCD data mode. */ - regs[MM67_SEC] = RTC_BCD(tm->tm_sec); - regs[MM67_MIN] = RTC_BCD(tm->tm_min); + regs[MM67_SEC] = RTC_BCD(tm->tm_sec); + regs[MM67_MIN] = RTC_BCD(tm->tm_min); regs[MM67_HOUR] = RTC_BCD(tm->tm_hour); - regs[MM67_DOW] = RTC_BCD(tm->tm_wday + 1); - regs[MM67_DOM] = RTC_BCD(tm->tm_mday); - regs[MM67_MON] = RTC_BCD(tm->tm_mon + 1); + regs[MM67_DOW] = RTC_BCD(tm->tm_wday + 1); + regs[MM67_DOM] = RTC_BCD(tm->tm_mday); + regs[MM67_MON] = RTC_BCD(tm->tm_mon + 1); if (dev->year != -1) { - year = tm->tm_year; - if (dev->flags & FLAG_YEAR80) - year -= 80; - if (dev->flags & FLAG_YEARBCD) - regs[dev->year] = RTC_BCD(year % 100); - else - regs[dev->year] = year % 100; + year = tm->tm_year; + if (dev->flags & FLAG_YEAR80) + year -= 80; + if (dev->flags & FLAG_YEARBCD) + regs[dev->year] = RTC_BCD(year % 100); + else + regs[dev->year] = year % 100; #ifdef MM67_CENTURY - regs[MM67_CENTURY] = (year + 1900) / 100; + regs[MM67_CENTURY] = (year + 1900) / 100; #endif #if ISARTC_DEBUG > 1 - isartc_log("ISARTC: set_time: [%02x] year=%i (%i)\n", regs[dev->year], year, tm->tm_year); + isartc_log("ISARTC: set_time: [%02x] year=%i (%i)\n", regs[dev->year], year, tm->tm_year); #endif } } - static void mm67_start(nvr_t *nvr) { @@ -358,17 +354,16 @@ mm67_start(nvr_t *nvr) /* Initialize the internal and chip times. */ if (time_sync) { - /* Use the internal clock's time. */ - nvr_time_get(&tm); - mm67_time_set(nvr, &tm); + /* Use the internal clock's time. */ + nvr_time_get(&tm); + mm67_time_set(nvr, &tm); } else { - /* Set the internal clock from the chip time. */ - mm67_time_get(nvr, &tm); - nvr_time_set(&tm); + /* Set the internal clock from the chip time. */ + mm67_time_get(nvr, &tm); + nvr_time_set(&tm); } } - /* Reset the RTC counters to a sane state. */ static void mm67_reset(nvr_t *nvr) @@ -377,116 +372,113 @@ mm67_reset(nvr_t *nvr) /* Initialize the RTC to a known state. */ for (i = MM67_MSEC; i <= MM67_MON; i++) - nvr->regs[i] = RTC_BCD(0); + nvr->regs[i] = RTC_BCD(0); nvr->regs[MM67_DOW] = RTC_BCD(1); nvr->regs[MM67_DOM] = RTC_BCD(1); nvr->regs[MM67_MON] = RTC_BCD(1); } - /* Handle a READ operation from one of our registers. */ static uint8_t mm67_read(uint16_t port, void *priv) { - rtcdev_t *dev = (rtcdev_t *)priv; - int reg = port - dev->base_addr; - uint8_t ret = 0xff; + rtcdev_t *dev = (rtcdev_t *) priv; + int reg = port - dev->base_addr; + uint8_t ret = 0xff; /* This chip is directly mapped on I/O. */ cycles -= ISA_CYCLES(4); - switch(reg) { - case MM67_ISTAT: /* IRQ status (RO) */ - ret = dev->nvr.regs[reg]; - dev->nvr.regs[reg] = 0x00; - if (dev->irq != -1) - picintc(1 << dev->irq); - break; + switch (reg) { + case MM67_ISTAT: /* IRQ status (RO) */ + ret = dev->nvr.regs[reg]; + dev->nvr.regs[reg] = 0x00; + if (dev->irq != -1) + picintc(1 << dev->irq); + break; - default: - ret = dev->nvr.regs[reg]; - break; + default: + ret = dev->nvr.regs[reg]; + break; } -#if ISARTC_DEBUG - isartc_log("ISARTC: read(%04x) = %02x\n", port-dev->base_addr, ret); +#if ISARTC_DEBUG + isartc_log("ISARTC: read(%04x) = %02x\n", port - dev->base_addr, ret); #endif - return(ret); + return (ret); } - /* Handle a WRITE operation to one of our registers. */ static void mm67_write(uint16_t port, uint8_t val, void *priv) { - rtcdev_t *dev = (rtcdev_t *)priv; - int reg = port - dev->base_addr; - int i; + rtcdev_t *dev = (rtcdev_t *) priv; + int reg = port - dev->base_addr; + int i; -#if ISARTC_DEBUG - isartc_log("ISARTC: write(%04x, %02x)\n", port-dev->base_addr, val); +#if ISARTC_DEBUG + isartc_log("ISARTC: write(%04x, %02x)\n", port - dev->base_addr, val); #endif /* This chip is directly mapped on I/O. */ cycles -= ISA_CYCLES(4); - switch(reg) { - case MM67_ISTAT: /* intr status (RO) */ - break; + switch (reg) { + case MM67_ISTAT: /* intr status (RO) */ + break; - case MM67_ICTRL: /* intr control */ - dev->nvr.regs[MM67_ISTAT] = 0x00; - dev->nvr.regs[reg] = val; - break; + case MM67_ICTRL: /* intr control */ + dev->nvr.regs[MM67_ISTAT] = 0x00; + dev->nvr.regs[reg] = val; + break; - case MM67_RSTCTR: - if (val == 0xff) - mm67_reset(&dev->nvr); - break; + case MM67_RSTCTR: + if (val == 0xff) + mm67_reset(&dev->nvr); + break; - case MM67_RSTRAM: - if (val == 0xff) { - for (i = MM67_AL_MSEC; i <= MM67_AL_MON; i++) - dev->nvr.regs[i] = RTC_BCD(0); - dev->nvr.regs[MM67_DOW] = RTC_BCD(1); - dev->nvr.regs[MM67_DOM] = RTC_BCD(1); - dev->nvr.regs[MM67_MON] = RTC_BCD(1); - if (dev->year != -1) { - val = (dev->flags & FLAG_YEAR80) ? 0 : 80; - if (dev->flags & FLAG_YEARBCD) - dev->nvr.regs[dev->year] = RTC_BCD(val); - else - dev->nvr.regs[dev->year] = val; + case MM67_RSTRAM: + if (val == 0xff) { + for (i = MM67_AL_MSEC; i <= MM67_AL_MON; i++) + dev->nvr.regs[i] = RTC_BCD(0); + dev->nvr.regs[MM67_DOW] = RTC_BCD(1); + dev->nvr.regs[MM67_DOM] = RTC_BCD(1); + dev->nvr.regs[MM67_MON] = RTC_BCD(1); + if (dev->year != -1) { + val = (dev->flags & FLAG_YEAR80) ? 0 : 80; + if (dev->flags & FLAG_YEARBCD) + dev->nvr.regs[dev->year] = RTC_BCD(val); + else + dev->nvr.regs[dev->year] = val; #ifdef MM67_CENTURY - dev->nvr.regs[MM67_CENTURY] = 19; + dev->nvr.regs[MM67_CENTURY] = 19; #endif - } - } - break; + } + } + break; - case MM67_STATUS: /* STATUS (RO) */ - break; + case MM67_STATUS: /* STATUS (RO) */ + break; - case MM67_GOCMD: -isartc_log("RTC: write gocmd=%02x\n", val); - break; + case MM67_GOCMD: + isartc_log("RTC: write gocmd=%02x\n", val); + break; - case MM67_STBYIRQ: -isartc_log("RTC: write stby=%02x\n", val); - break; + case MM67_STBYIRQ: + isartc_log("RTC: write stby=%02x\n", val); + break; - case MM67_TEST: -isartc_log("RTC: write test=%02x\n", val); - break; + case MM67_TEST: + isartc_log("RTC: write test=%02x\n", val); + break; - default: - dev->nvr.regs[reg] = val; - break; + default: + dev->nvr.regs[reg] = val; + break; } } - /************************************************************************ * * * Generic code for all supported chips. * @@ -498,102 +490,101 @@ static void * isartc_init(const device_t *info) { rtcdev_t *dev; - int is_at = IS_AT(machine); - is_at = is_at || !strcmp(machine_get_internal_name(), "xi8088"); + int is_at = IS_AT(machine); + is_at = is_at || !strcmp(machine_get_internal_name(), "xi8088"); /* Create a device instance. */ - dev = (rtcdev_t *)malloc(sizeof(rtcdev_t)); + dev = (rtcdev_t *) malloc(sizeof(rtcdev_t)); memset(dev, 0x00, sizeof(rtcdev_t)); - dev->name = info->name; - dev->board = info->local; - dev->irq = -1; - dev->year = -1; + dev->name = info->name; + dev->board = info->local; + dev->irq = -1; + dev->year = -1; dev->nvr.data = dev; dev->nvr.size = 16; /* Do per-board initialization. */ - switch(dev->board) { - case ISARTC_EV170: /* Everex EV-170 Magic I/O */ - dev->flags |= FLAG_YEAR80; - dev->base_addr = device_get_config_hex16("base"); - dev->base_addrsz = 32; - dev->irq = device_get_config_int("irq"); - dev->f_rd = mm67_read; - dev->f_wr = mm67_write; - dev->nvr.reset = mm67_reset; - dev->nvr.start = mm67_start; - dev->nvr.tick = mm67_tick; - dev->year = MM67_AL_DOM; /* year, NON STANDARD */ - break; + switch (dev->board) { + case ISARTC_EV170: /* Everex EV-170 Magic I/O */ + dev->flags |= FLAG_YEAR80; + dev->base_addr = device_get_config_hex16("base"); + dev->base_addrsz = 32; + dev->irq = device_get_config_int("irq"); + dev->f_rd = mm67_read; + dev->f_wr = mm67_write; + dev->nvr.reset = mm67_reset; + dev->nvr.start = mm67_start; + dev->nvr.tick = mm67_tick; + dev->year = MM67_AL_DOM; /* year, NON STANDARD */ + break; - case ISARTC_DTK: /* DTK PII-147 Hexa I/O Plus */ - dev->flags |= FLAG_YEARBCD; - dev->base_addr = device_get_config_hex16("base"); - dev->base_addrsz = 32; - dev->f_rd = mm67_read; - dev->f_wr = mm67_write; - dev->nvr.reset = mm67_reset; - dev->nvr.start = mm67_start; - dev->nvr.tick = mm67_tick; - dev->year = MM67_AL_HUNTEN; /* year, NON STANDARD */ - break; + case ISARTC_DTK: /* DTK PII-147 Hexa I/O Plus */ + dev->flags |= FLAG_YEARBCD; + dev->base_addr = device_get_config_hex16("base"); + dev->base_addrsz = 32; + dev->f_rd = mm67_read; + dev->f_wr = mm67_write; + dev->nvr.reset = mm67_reset; + dev->nvr.start = mm67_start; + dev->nvr.tick = mm67_tick; + dev->year = MM67_AL_HUNTEN; /* year, NON STANDARD */ + break; - case ISARTC_P5PAK: /* Paradise Systems 5PAK */ - case ISARTC_A6PAK: /* AST SixPakPlus */ - dev->flags |= FLAG_YEAR80; - dev->base_addr = 0x02c0; - dev->base_addrsz = 32; - dev->irq = device_get_config_int("irq"); - dev->f_rd = mm67_read; - dev->f_wr = mm67_write; - dev->nvr.reset = mm67_reset; - dev->nvr.start = mm67_start; - dev->nvr.tick = mm67_tick; - dev->year = MM67_AL_DOM; /* year, NON STANDARD */ - break; + case ISARTC_P5PAK: /* Paradise Systems 5PAK */ + case ISARTC_A6PAK: /* AST SixPakPlus */ + dev->flags |= FLAG_YEAR80; + dev->base_addr = 0x02c0; + dev->base_addrsz = 32; + dev->irq = device_get_config_int("irq"); + dev->f_rd = mm67_read; + dev->f_wr = mm67_write; + dev->nvr.reset = mm67_reset; + dev->nvr.start = mm67_start; + dev->nvr.tick = mm67_tick; + dev->year = MM67_AL_DOM; /* year, NON STANDARD */ + break; - default: - break; + default: + break; } /* Say hello! */ isartc_log("ISARTC: %s (I/O=%04XH", info->name, dev->base_addr); if (dev->irq != -1) - isartc_log(", IRQ%i", dev->irq); + isartc_log(", IRQ%i", dev->irq); isartc_log(")\n"); /* Set up an I/O port handler. */ io_sethandler(dev->base_addr, dev->base_addrsz, - dev->f_rd,NULL,NULL, dev->f_wr,NULL,NULL, dev); + dev->f_rd, NULL, NULL, dev->f_wr, NULL, NULL, dev); /* Hook into the NVR backend. */ - dev->nvr.fn = isartc_get_internal_name(isartc_type); + dev->nvr.fn = isartc_get_internal_name(isartc_type); dev->nvr.irq = dev->irq; if (!is_at) - nvr_init(&dev->nvr); + nvr_init(&dev->nvr); /* Let them know our device instance. */ - return((void *)dev); + return ((void *) dev); } - /* Remove the device from the system. */ static void isartc_close(void *priv) { - rtcdev_t *dev = (rtcdev_t *)priv; + rtcdev_t *dev = (rtcdev_t *) priv; io_removehandler(dev->base_addr, dev->base_addrsz, - dev->f_rd,NULL,NULL, dev->f_wr,NULL,NULL, dev); + dev->f_rd, NULL, NULL, dev->f_wr, NULL, NULL, dev); if (dev->nvr.fn != NULL) - free(dev->nvr.fn); + free(dev->nvr.fn); free(dev); } static const device_config_t ev170_config[] = { -// clang-format off + // clang-format off { "base", "Address", CONFIG_HEX16, "", 0x02C0, "", { 0 }, { @@ -613,25 +604,25 @@ static const device_config_t ev170_config[] = { }, }, { "", "", -1 } -// clang-format on + // clang-format on }; static const device_t ev170_device = { - .name = "Everex EV-170 Magic I/O", + .name = "Everex EV-170 Magic I/O", .internal_name = "ev170", - .flags = DEVICE_ISA, - .local = ISARTC_EV170, - .init = isartc_init, - .close = isartc_close, - .reset = NULL, + .flags = DEVICE_ISA, + .local = ISARTC_EV170, + .init = isartc_init, + .close = isartc_close, + .reset = NULL, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = ev170_config + .force_redraw = NULL, + .config = ev170_config }; static const device_config_t pii147_config[] = { -// clang-format off + // clang-format off { "base", "Address", CONFIG_HEX16, "", 0x0240, "", { 0 }, { @@ -641,25 +632,25 @@ static const device_config_t pii147_config[] = { }, }, { "", "", -1 } -// clang-format on + // clang-format on }; static const device_t pii147_device = { - .name = "DTK PII-147 Hexa I/O Plus", + .name = "DTK PII-147 Hexa I/O Plus", .internal_name = "pii147", - .flags = DEVICE_ISA, - .local = ISARTC_DTK, - .init = isartc_init, - .close = isartc_close, - .reset = NULL, + .flags = DEVICE_ISA, + .local = ISARTC_DTK, + .init = isartc_init, + .close = isartc_close, + .reset = NULL, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = pii147_config + .force_redraw = NULL, + .config = pii147_config }; static const device_config_t p5pak_config[] = { -// clang-format off + // clang-format off { "irq", "IRQ", CONFIG_SELECTION, "", -1, "", { 0 }, { @@ -671,25 +662,25 @@ static const device_config_t p5pak_config[] = { }, }, { "", "", -1 } -// clang-format on + // clang-format on }; static const device_t p5pak_device = { - .name = "Paradise Systems 5-PAK", + .name = "Paradise Systems 5-PAK", .internal_name = "p5pak", - .flags = DEVICE_ISA, - .local = ISARTC_P5PAK, - .init = isartc_init, - .close = isartc_close, - .reset = NULL, + .flags = DEVICE_ISA, + .local = ISARTC_P5PAK, + .init = isartc_init, + .close = isartc_close, + .reset = NULL, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = p5pak_config + .force_redraw = NULL, + .config = p5pak_config }; static const device_config_t a6pak_config[] = { -// clang-format off + // clang-format off { "irq", "IRQ", CONFIG_SELECTION, "", -1, "", { 0 }, { @@ -701,54 +692,55 @@ static const device_config_t a6pak_config[] = { }, }, { "", "", -1 } -// clang-format on + // clang-format on }; static const device_t a6pak_device = { - .name = "AST SixPakPlus", + .name = "AST SixPakPlus", .internal_name = "a6pak", - .flags = DEVICE_ISA, - .local = ISARTC_A6PAK, - .init = isartc_init, - .close = isartc_close, - .reset = NULL, + .flags = DEVICE_ISA, + .local = ISARTC_A6PAK, + .init = isartc_init, + .close = isartc_close, + .reset = NULL, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = a6pak_config + .force_redraw = NULL, + .config = a6pak_config }; static const device_t isartc_none_device = { - .name = "None", + .name = "None", .internal_name = "none", - .flags = 0, - .local = 0, - .init = NULL, - .close = NULL, - .reset = NULL, + .flags = 0, + .local = 0, + .init = NULL, + .close = NULL, + .reset = NULL, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; static const struct { - const device_t *dev; + const device_t *dev; } boards[] = { -// clang-format off + // clang-format off { &isartc_none_device }, { &ev170_device }, { &pii147_device }, { &p5pak_device }, { &a6pak_device }, { NULL }, -// clang-format on + // clang-format on }; void isartc_reset(void) { - if (isartc_type == 0) return; + if (isartc_type == 0) + return; /* Add the device to the system. */ device_add(boards[isartc_type].dev); @@ -760,25 +752,23 @@ isartc_get_internal_name(int board) return device_get_internal_name(boards[board].dev); } - int isartc_get_from_internal_name(char *s) { int c = 0; while (boards[c].dev != NULL) { - if (! strcmp(boards[c].dev->internal_name, s)) - return(c); - c++; + if (!strcmp(boards[c].dev->internal_name, s)) + return (c); + c++; } - /* Not found. */ - return(0); +/* Not found. */ + return (0); } - const device_t * isartc_get_device(int board) { - return(boards[board].dev); + return (boards[board].dev); } diff --git a/src/device/keyboard.c b/src/device/keyboard.c index 7c1581d52..ef3dafb11 100644 --- a/src/device/keyboard.c +++ b/src/device/keyboard.c @@ -28,23 +28,20 @@ #include "cpu.h" +int keyboard_scan; +void (*keyboard_send)(uint16_t val); -int keyboard_scan; -void (*keyboard_send)(uint16_t val); - - -static int recv_key[512]; /* keyboard input buffer */ -static int oldkey[512]; +static int recv_key[512]; /* keyboard input buffer */ +static int oldkey[512]; #if 0 static int keydelay[512]; #endif -static scancode *scan_table; /* scancode table for keyboard */ - -static uint8_t caps_lock = 0; -static uint8_t num_lock = 0; -static uint8_t scroll_lock = 0; -static uint8_t shift = 0; +static scancode *scan_table; /* scancode table for keyboard */ +static uint8_t caps_lock = 0; +static uint8_t num_lock = 0; +static uint8_t scroll_lock = 0; +static uint8_t shift = 0; void keyboard_init(void) @@ -52,82 +49,78 @@ keyboard_init(void) memset(recv_key, 0x00, sizeof(recv_key)); keyboard_scan = 1; - scan_table = NULL; + scan_table = NULL; memset(keyboard_set3_flags, 0x00, sizeof(keyboard_set3_flags)); keyboard_set3_all_repeat = 0; - keyboard_set3_all_break = 0; + keyboard_set3_all_break = 0; } - void keyboard_set_table(const scancode *ptr) { scan_table = (scancode *) ptr; } - static uint8_t fake_shift_needed(uint16_t scan) { - switch(scan) { - case 0x147: - case 0x148: - case 0x149: - case 0x14a: - case 0x14b: - case 0x14d: - case 0x14f: - case 0x150: - case 0x151: - case 0x152: - case 0x153: - return 1; - default: - return 0; + switch (scan) { + case 0x147: + case 0x148: + case 0x149: + case 0x14a: + case 0x14b: + case 0x14d: + case 0x14f: + case 0x150: + case 0x151: + case 0x152: + case 0x153: + return 1; + default: + return 0; } } - void key_process(uint16_t scan, int down) { scancode *codes = scan_table; - int c; + int c; if (!keyboard_scan || (keyboard_send == NULL)) - return; + return; oldkey[scan] = down; - if (down && codes[scan].mk[0] == 0) - return; + if (down && codes[scan].mk[0] == 0) + return; if (!down && codes[scan].brk[0] == 0) - return; + return; /* TODO: The keyboard controller needs to report the AT flag to us here. */ if (is286 && ((keyboard_mode & 3) == 3)) { - if (!keyboard_set3_all_break && !down && !(keyboard_set3_flags[codes[scan].mk[0]] & 2)) - return; + if (!keyboard_set3_all_break && !down && !(keyboard_set3_flags[codes[scan].mk[0]] & 2)) + return; } c = 0; if (down) { - /* Send the special code indicating an opening fake shift might be needed. */ - if (fake_shift_needed(scan)) - keyboard_send(0x100); - while (codes[scan].mk[c] != 0) - keyboard_send(codes[scan].mk[c++]); + /* Send the special code indicating an opening fake shift might be needed. */ + if (fake_shift_needed(scan)) + keyboard_send(0x100); + while (codes[scan].mk[c] != 0) + keyboard_send(codes[scan].mk[c++]); } else { - while (codes[scan].brk[c] != 0) - keyboard_send(codes[scan].brk[c++]); - /* Send the special code indicating a closing fake shift might be needed. */ - if (fake_shift_needed(scan)) - keyboard_send(0x101); + while (codes[scan].brk[c] != 0) + keyboard_send(codes[scan].brk[c++]); + /* Send the special code indicating a closing fake shift might be needed. */ + if (fake_shift_needed(scan)) + keyboard_send(0x101); } } - /* Handle a keystroke event from the UI layer. */ void keyboard_input(int down, uint16_t scan) @@ -135,72 +128,72 @@ keyboard_input(int down, uint16_t scan) /* Translate E0 xx scan codes to 01xx because we use 512-byte arrays for states and scan code sets. */ if ((scan >> 8) == 0xe0) { - scan &= 0x00ff; - scan |= 0x0100; /* extended key code */ + scan &= 0x00ff; + scan |= 0x0100; /* extended key code */ } else if ((scan >> 8) != 0x01) - scan &= 0x00ff; /* we can receive a scan code whose upper byte is 0x01, - this means we're the Win32 version running on windows - that already sends us preprocessed scan codes, which - means we then use the scan code as is, and need to - make sure we do not accidentally strip that upper byte */ + scan &= 0x00ff; /* we can receive a scan code whose upper byte is 0x01, + this means we're the Win32 version running on windows + that already sends us preprocessed scan codes, which + means we then use the scan code as is, and need to + make sure we do not accidentally strip that upper byte */ if (recv_key[scan & 0x1ff] ^ down) { - if (down) { - switch(scan & 0x1ff) { - case 0x01c: /* Left Ctrl */ - shift |= 0x01; - break; - case 0x11c: /* Right Ctrl */ - shift |= 0x10; - break; - case 0x02a: /* Left Shift */ - shift |= 0x02; - break; - case 0x036: /* Right Shift */ - shift |= 0x20; - break; - case 0x038: /* Left Alt */ - shift |= 0x04; - break; - case 0x138: /* Right Alt */ - shift |= 0x40; - break; - } - } else { - switch(scan & 0x1ff) { - case 0x01c: /* Left Ctrl */ - shift &= ~0x01; - break; - case 0x11c: /* Right Ctrl */ - shift &= ~0x10; - break; - case 0x02a: /* Left Shift */ - shift &= ~0x02; - break; - case 0x036: /* Right Shift */ - shift &= ~0x20; - break; - case 0x038: /* Left Alt */ - shift &= ~0x04; - break; - case 0x138: /* Right Alt */ - shift &= ~0x40; - break; - case 0x03a: /* Caps Lock */ - caps_lock ^= 1; - break; - case 0x045: - num_lock ^= 1; - break; - case 0x046: - scroll_lock ^= 1; - break; - } - } + if (down) { + switch (scan & 0x1ff) { + case 0x01c: /* Left Ctrl */ + shift |= 0x01; + break; + case 0x11c: /* Right Ctrl */ + shift |= 0x10; + break; + case 0x02a: /* Left Shift */ + shift |= 0x02; + break; + case 0x036: /* Right Shift */ + shift |= 0x20; + break; + case 0x038: /* Left Alt */ + shift |= 0x04; + break; + case 0x138: /* Right Alt */ + shift |= 0x40; + break; + } + } else { + switch (scan & 0x1ff) { + case 0x01c: /* Left Ctrl */ + shift &= ~0x01; + break; + case 0x11c: /* Right Ctrl */ + shift &= ~0x10; + break; + case 0x02a: /* Left Shift */ + shift &= ~0x02; + break; + case 0x036: /* Right Shift */ + shift &= ~0x20; + break; + case 0x038: /* Left Alt */ + shift &= ~0x04; + break; + case 0x138: /* Right Alt */ + shift &= ~0x40; + break; + case 0x03a: /* Caps Lock */ + caps_lock ^= 1; + break; + case 0x045: + num_lock ^= 1; + break; + case 0x046: + scroll_lock ^= 1; + break; + } + } } /* NOTE: Shouldn't this be some sort of bit shift? An array of 8 unsigned 64-bit integers - should be enough. */ + should be enough. */ /* recv_key[scan >> 6] |= ((uint64_t) down << ((uint64_t) scan & 0x3fLL)); */ /* pclog("Received scan code: %03X (%s)\n", scan & 0x1ff, down ? "down" : "up"); */ @@ -209,7 +202,6 @@ keyboard_input(int down, uint16_t scan) key_process(scan & 0x1ff, down); } - static uint8_t keyboard_do_break(uint16_t scan) { @@ -217,48 +209,42 @@ keyboard_do_break(uint16_t scan) /* TODO: The keyboard controller needs to report the AT flag to us here. */ if (is286 && ((keyboard_mode & 3) == 3)) { - if (!keyboard_set3_all_break && - !recv_key[scan] && - !(keyboard_set3_flags[codes[scan].mk[0]] & 2)) - return 0; - else - return 1; + if (!keyboard_set3_all_break && !recv_key[scan] && !(keyboard_set3_flags[codes[scan].mk[0]] & 2)) + return 0; + else + return 1; } else - return 1; + return 1; } - /* Also called by the emulated keyboard controller to update the states of Caps Lock, Num Lock, and Scroll Lock when receving the "Set keyboard LEDs" command. */ void keyboard_update_states(uint8_t cl, uint8_t nl, uint8_t sl) { - caps_lock = cl; - num_lock = nl; - scroll_lock = sl; + caps_lock = cl; + num_lock = nl; + scroll_lock = sl; } - uint8_t keyboard_get_shift(void) { - return shift; + return shift; } - void keyboard_get_states(uint8_t *cl, uint8_t *nl, uint8_t *sl) { - if (cl) - *cl = caps_lock; - if (nl) - *nl = num_lock; - if (sl) - *sl = scroll_lock; + if (cl) + *cl = caps_lock; + if (nl) + *nl = num_lock; + if (sl) + *sl = scroll_lock; } - /* Called by the UI to update the states of Caps Lock, Num Lock, and Scroll Lock. */ void keyboard_set_states(uint8_t cl, uint8_t nl, uint8_t sl) @@ -268,68 +254,63 @@ keyboard_set_states(uint8_t cl, uint8_t nl, uint8_t sl) int i; if (caps_lock != cl) { - i = 0; - while (codes[0x03a].mk[i] != 0) - keyboard_send(codes[0x03a].mk[i++]); - if (keyboard_do_break(0x03a)) { - i = 0; - while (codes[0x03a].brk[i] != 0) - keyboard_send(codes[0x03a].brk[i++]); - } + i = 0; + while (codes[0x03a].mk[i] != 0) + keyboard_send(codes[0x03a].mk[i++]); + if (keyboard_do_break(0x03a)) { + i = 0; + while (codes[0x03a].brk[i] != 0) + keyboard_send(codes[0x03a].brk[i++]); + } } if (num_lock != nl) { - i = 0; - while (codes[0x045].mk[i] != 0) - keyboard_send(codes[0x045].mk[i++]); - if (keyboard_do_break(0x045)) { - i = 0; - while (codes[0x045].brk[i] != 0) - keyboard_send(codes[0x045].brk[i++]); - } + i = 0; + while (codes[0x045].mk[i] != 0) + keyboard_send(codes[0x045].mk[i++]); + if (keyboard_do_break(0x045)) { + i = 0; + while (codes[0x045].brk[i] != 0) + keyboard_send(codes[0x045].brk[i++]); + } } if (scroll_lock != sl) { - i = 0; - while (codes[0x046].mk[i] != 0) - keyboard_send(codes[0x046].mk[i++]); - if (keyboard_do_break(0x046)) { - i = 0; - while (codes[0x046].brk[i] != 0) - keyboard_send(codes[0x046].brk[i++]); - } + i = 0; + while (codes[0x046].mk[i] != 0) + keyboard_send(codes[0x046].mk[i++]); + if (keyboard_do_break(0x046)) { + i = 0; + while (codes[0x046].brk[i] != 0) + keyboard_send(codes[0x046].brk[i++]); + } } keyboard_update_states(cl, nl, sl); } - int keyboard_recv(uint16_t key) { - return recv_key[key]; + return recv_key[key]; } - /* Do we have Control-Alt-PgDn in the keyboard buffer? */ int keyboard_isfsexit(void) { - return( (recv_key[0x01D] || recv_key[0x11D]) && - (recv_key[0x038] || recv_key[0x138]) && - (recv_key[0x051] || recv_key[0x151]) ); + return ((recv_key[0x01D] || recv_key[0x11D]) && (recv_key[0x038] || recv_key[0x138]) && (recv_key[0x051] || recv_key[0x151])); } - /* Do we have F8-F12 in the keyboard buffer? */ int keyboard_ismsexit(void) { #ifdef _WIN32 /* Windows: F8+F12 */ - return( recv_key[0x042] && recv_key[0x058] ); + return (recv_key[0x042] && recv_key[0x058]); #else /* WxWidgets cannot do two regular keys.. CTRL+END */ - return( (recv_key[0x01D] || recv_key[0x11D]) && (recv_key[0x04F] || recv_key[0x14F]) ); + return ((recv_key[0x01D] || recv_key[0x11D]) && (recv_key[0x04F] || recv_key[0x14F])); #endif } diff --git a/src/device/keyboard_at.c b/src/device/keyboard_at.c index 5d38088ed..e808f9507 100644 --- a/src/device/keyboard_at.c +++ b/src/device/keyboard_at.c @@ -46,136 +46,132 @@ #include <86box/video.h> #include <86box/keyboard.h> +#define STAT_PARITY 0x80 +#define STAT_RTIMEOUT 0x40 +#define STAT_TTIMEOUT 0x20 +#define STAT_MFULL 0x20 +#define STAT_UNLOCKED 0x10 +#define STAT_CD 0x08 +#define STAT_SYSFLAG 0x04 +#define STAT_IFULL 0x02 +#define STAT_OFULL 0x01 -#define STAT_PARITY 0x80 -#define STAT_RTIMEOUT 0x40 -#define STAT_TTIMEOUT 0x20 -#define STAT_MFULL 0x20 -#define STAT_UNLOCKED 0x10 -#define STAT_CD 0x08 -#define STAT_SYSFLAG 0x04 -#define STAT_IFULL 0x02 -#define STAT_OFULL 0x01 +#define RESET_DELAY_TIME (100 * 10) /* 600ms */ -#define RESET_DELAY_TIME (100 * 10) /* 600ms */ +#define CCB_UNUSED 0x80 +#define CCB_TRANSLATE 0x40 +#define CCB_PCMODE 0x20 +#define CCB_ENABLEKBD 0x10 +#define CCB_IGNORELOCK 0x08 +#define CCB_SYSTEM 0x04 +#define CCB_ENABLEMINT 0x02 +#define CCB_ENABLEKINT 0x01 -#define CCB_UNUSED 0x80 -#define CCB_TRANSLATE 0x40 -#define CCB_PCMODE 0x20 -#define CCB_ENABLEKBD 0x10 -#define CCB_IGNORELOCK 0x08 -#define CCB_SYSTEM 0x04 -#define CCB_ENABLEMINT 0x02 -#define CCB_ENABLEKINT 0x01 +#define CCB_MASK 0x68 +#define MODE_MASK 0x6c -#define CCB_MASK 0x68 -#define MODE_MASK 0x6c - -#define KBC_TYPE_ISA 0x00 /* AT ISA-based chips */ -#define KBC_TYPE_PS2_NOREF 0x01 /* PS2 type, no refresh */ -#define KBC_TYPE_PS2_1 0x02 /* PS2 on PS/2, type 1 */ -#define KBC_TYPE_PS2_2 0x03 /* PS2 on PS/2, type 2 */ -#define KBC_TYPE_MASK 0x03 - -#define KBC_VEN_GENERIC 0x00 -#define KBC_VEN_AMI 0x04 -#define KBC_VEN_IBM_MCA 0x08 -#define KBC_VEN_QUADTEL 0x0c -#define KBC_VEN_TOSHIBA 0x10 -#define KBC_VEN_XI8088 0x14 -#define KBC_VEN_IBM_PS1 0x18 -#define KBC_VEN_ACER 0x1c -#define KBC_VEN_INTEL_AMI 0x20 -#define KBC_VEN_OLIVETTI 0x24 -#define KBC_VEN_NCR 0x28 -#define KBC_VEN_SAMSUNG 0x2c -#define KBC_VEN_ALI 0x30 -#define KBC_VEN_MASK 0x3c +#define KBC_TYPE_ISA 0x00 /* AT ISA-based chips */ +#define KBC_TYPE_PS2_NOREF 0x01 /* PS2 type, no refresh */ +#define KBC_TYPE_PS2_1 0x02 /* PS2 on PS/2, type 1 */ +#define KBC_TYPE_PS2_2 0x03 /* PS2 on PS/2, type 2 */ +#define KBC_TYPE_MASK 0x03 +#define KBC_VEN_GENERIC 0x00 +#define KBC_VEN_AMI 0x04 +#define KBC_VEN_IBM_MCA 0x08 +#define KBC_VEN_QUADTEL 0x0c +#define KBC_VEN_TOSHIBA 0x10 +#define KBC_VEN_XI8088 0x14 +#define KBC_VEN_IBM_PS1 0x18 +#define KBC_VEN_ACER 0x1c +#define KBC_VEN_INTEL_AMI 0x20 +#define KBC_VEN_OLIVETTI 0x24 +#define KBC_VEN_NCR 0x28 +#define KBC_VEN_SAMSUNG 0x2c +#define KBC_VEN_ALI 0x30 +#define KBC_VEN_MASK 0x3c typedef struct { - uint8_t command, status, old_status, out, old_out, secr_phase, - mem_addr, input_port, output_port, old_output_port, - key_command, output_locked, ami_stat, want60, - wantirq, key_wantdata, ami_flags, first_write; + uint8_t command, status, old_status, out, old_out, secr_phase, + mem_addr, input_port, output_port, old_output_port, + key_command, output_locked, ami_stat, want60, + wantirq, key_wantdata, ami_flags, first_write; - uint8_t mem[0x100]; + uint8_t mem[0x100]; - int last_irq, old_last_irq, - reset_delay, - out_new, out_delayed; + int last_irq, old_last_irq, + reset_delay, + out_new, out_delayed; - uint32_t flags; + uint32_t flags; - pc_timer_t pulse_cb; + pc_timer_t pulse_cb; - uint8_t (*write60_ven)(void *p, uint8_t val); - uint8_t (*write64_ven)(void *p, uint8_t val); + uint8_t (*write60_ven)(void *p, uint8_t val); + uint8_t (*write64_ven)(void *p, uint8_t val); pc_timer_t send_delay_timer; } atkbd_t; - /* bit 0 = repeat, bit 1 = makes break code? */ -uint8_t keyboard_set3_flags[512]; -uint8_t keyboard_set3_all_repeat; -uint8_t keyboard_set3_all_break; +uint8_t keyboard_set3_flags[512]; +uint8_t keyboard_set3_all_repeat; +uint8_t keyboard_set3_all_break; /* Bits 0 - 1 = scan code set, bit 6 = translate or not. */ -uint8_t keyboard_mode = 0x42; - - -static uint8_t key_ctrl_queue[16]; -static int key_ctrl_queue_start = 0, key_ctrl_queue_end = 0; -static uint8_t key_queue[16]; -static int key_queue_start = 0, key_queue_end = 0; -uint8_t mouse_queue[16]; -int mouse_queue_start = 0, mouse_queue_end = 0; -static uint8_t kbd_last_scan_code; -static void (*mouse_write)(uint8_t val, void *priv) = NULL; -static void *mouse_p = NULL; -static uint8_t sc_or = 0; -static atkbd_t *SavedKbd = NULL; // FIXME: remove!!! --FvK +uint8_t keyboard_mode = 0x42; +static uint8_t key_ctrl_queue[16]; +static int key_ctrl_queue_start = 0, key_ctrl_queue_end = 0; +static uint8_t key_queue[16]; +static int key_queue_start = 0, key_queue_end = 0; +uint8_t mouse_queue[16]; +int mouse_queue_start = 0, mouse_queue_end = 0; +static uint8_t kbd_last_scan_code; +static void (*mouse_write)(uint8_t val, void *priv) = NULL; +static void *mouse_p = NULL; +static uint8_t sc_or = 0; +static atkbd_t *SavedKbd = NULL; // FIXME: remove!!! --FvK /* Non-translated to translated scan codes. */ static const uint8_t nont_to_t[256] = { - 0xff, 0x43, 0x41, 0x3f, 0x3d, 0x3b, 0x3c, 0x58, - 0x64, 0x44, 0x42, 0x40, 0x3e, 0x0f, 0x29, 0x59, - 0x65, 0x38, 0x2a, 0x70, 0x1d, 0x10, 0x02, 0x5a, - 0x66, 0x71, 0x2c, 0x1f, 0x1e, 0x11, 0x03, 0x5b, - 0x67, 0x2e, 0x2d, 0x20, 0x12, 0x05, 0x04, 0x5c, - 0x68, 0x39, 0x2f, 0x21, 0x14, 0x13, 0x06, 0x5d, - 0x69, 0x31, 0x30, 0x23, 0x22, 0x15, 0x07, 0x5e, - 0x6a, 0x72, 0x32, 0x24, 0x16, 0x08, 0x09, 0x5f, - 0x6b, 0x33, 0x25, 0x17, 0x18, 0x0b, 0x0a, 0x60, - 0x6c, 0x34, 0x35, 0x26, 0x27, 0x19, 0x0c, 0x61, - 0x6d, 0x73, 0x28, 0x74, 0x1a, 0x0d, 0x62, 0x6e, - 0x3a, 0x36, 0x1c, 0x1b, 0x75, 0x2b, 0x63, 0x76, - 0x55, 0x56, 0x77, 0x78, 0x79, 0x7a, 0x0e, 0x7b, - 0x7c, 0x4f, 0x7d, 0x4b, 0x47, 0x7e, 0x7f, 0x6f, - 0x52, 0x53, 0x50, 0x4c, 0x4d, 0x48, 0x01, 0x45, - 0x57, 0x4e, 0x51, 0x4a, 0x37, 0x49, 0x46, 0x54, - 0x80, 0x81, 0x82, 0x41, 0x54, 0x85, 0x86, 0x87, - 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, - 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, - 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, - 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, - 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, - 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, - 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, - 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, - 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, - 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, - 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, - 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, - 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, - 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, - 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff + 0xff, 0x43, 0x41, 0x3f, 0x3d, 0x3b, 0x3c, 0x58, + 0x64, 0x44, 0x42, 0x40, 0x3e, 0x0f, 0x29, 0x59, + 0x65, 0x38, 0x2a, 0x70, 0x1d, 0x10, 0x02, 0x5a, + 0x66, 0x71, 0x2c, 0x1f, 0x1e, 0x11, 0x03, 0x5b, + 0x67, 0x2e, 0x2d, 0x20, 0x12, 0x05, 0x04, 0x5c, + 0x68, 0x39, 0x2f, 0x21, 0x14, 0x13, 0x06, 0x5d, + 0x69, 0x31, 0x30, 0x23, 0x22, 0x15, 0x07, 0x5e, + 0x6a, 0x72, 0x32, 0x24, 0x16, 0x08, 0x09, 0x5f, + 0x6b, 0x33, 0x25, 0x17, 0x18, 0x0b, 0x0a, 0x60, + 0x6c, 0x34, 0x35, 0x26, 0x27, 0x19, 0x0c, 0x61, + 0x6d, 0x73, 0x28, 0x74, 0x1a, 0x0d, 0x62, 0x6e, + 0x3a, 0x36, 0x1c, 0x1b, 0x75, 0x2b, 0x63, 0x76, + 0x55, 0x56, 0x77, 0x78, 0x79, 0x7a, 0x0e, 0x7b, + 0x7c, 0x4f, 0x7d, 0x4b, 0x47, 0x7e, 0x7f, 0x6f, + 0x52, 0x53, 0x50, 0x4c, 0x4d, 0x48, 0x01, 0x45, + 0x57, 0x4e, 0x51, 0x4a, 0x37, 0x49, 0x46, 0x54, + 0x80, 0x81, 0x82, 0x41, 0x54, 0x85, 0x86, 0x87, + 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, + 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, + 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, + 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, + 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, + 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, + 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, + 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, + 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, + 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, + 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, + 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, + 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff }; #ifdef USE_SET1 static const scancode scancode_set1[512] = { + // clang-format off { { 0},{ 0} }, { { 0x01,0},{ 0x81,0} }, { { 0x02,0},{ 0x82,0} }, { { 0x03,0},{ 0x83,0} }, /*000*/ { { 0x04,0},{ 0x84,0} }, { { 0x05,0},{ 0x85,0} }, { { 0x06,0},{ 0x86,0} }, { { 0x07,0},{ 0x87,0} }, /*004*/ { { 0x08,0},{ 0x88,0} }, { { 0x09,0},{ 0x89,0} }, { { 0x0a,0},{ 0x8a,0} }, { { 0x0b,0},{ 0x8b,0} }, /*008*/ @@ -303,10 +299,12 @@ static const scancode scancode_set1[512] = { { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1f4*/ { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1f8*/ { { 0},{ 0} }, { { 0},{ 0} }, { {0xe0,0xfe,0},{ 0} }, { {0xe0,0xff,0},{ 0} } /*1fc*/ + // clang-format on }; #endif static const scancode scancode_set2[512] = { + // clang-format off { { 0},{ 0} }, { { 0x76,0},{ 0xF0,0x76,0} }, { { 0x16,0},{ 0xF0,0x16,0} }, { { 0x1E,0},{ 0xF0,0x1E,0} }, /*000*/ { { 0x26,0},{ 0xF0,0x26,0} }, { { 0x25,0},{ 0xF0,0x25,0} }, { { 0x2E,0},{ 0xF0,0x2E,0} }, { { 0x36,0},{ 0xF0,0x36,0} }, /*004*/ { { 0x3D,0},{ 0xF0,0x3D,0} }, { { 0x3E,0},{ 0xF0,0x3E,0} }, { { 0x46,0},{ 0xF0,0x46,0} }, { { 0x45,0},{ 0xF0,0x45,0} }, /*008*/ @@ -434,9 +432,11 @@ static const scancode scancode_set2[512] = { { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1f4*/ { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1f8*/ { { 0},{ 0} }, { { 0},{ 0} }, { {0xe0,0xfe,0},{0xe0,0xF0,0xFE,0} }, { {0xe0,0xff,0},{0xe0,0xF0,0xFF,0} } /*1fc*/ + // clang-format on }; static const scancode scancode_set3[512] = { + // clang-format off { { 0},{ 0} }, { { 0x08,0},{ 0xf0,0x08,0} }, { { 0x16,0},{ 0xf0,0x16,0} }, { { 0x1E,0},{ 0xf0,0x1E,0} }, /*000*/ { { 0x26,0},{ 0xf0,0x26,0} }, { { 0x25,0},{ 0xf0,0x25,0} }, { { 0x2E,0},{ 0xf0,0x2E,0} }, { { 0x36,0},{ 0xf0,0x36,0} }, /*004*/ { { 0x3D,0},{ 0xf0,0x3D,0} }, { { 0x3E,0},{ 0xf0,0x3E,0} }, { { 0x46,0},{ 0xf0,0x46,0} }, { { 0x45,0},{ 0xf0,0x45,0} }, /*008*/ @@ -564,187 +564,175 @@ static const scancode scancode_set3[512] = { { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1f4*/ { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1f8*/ { { 0},{ 0} }, { { 0},{ 0} }, { {0xe0,0xfe,0},{0xe0,0xF0,0xFE,0} }, { {0xe0,0xff,0},{0xe0,0xF0,0xFF,0} } /*1fc*/ + // clang-format on }; - -static void add_data_kbd(uint16_t val); - +static void add_data_kbd(uint16_t val); #ifdef ENABLE_KEYBOARD_AT_LOG int keyboard_at_do_log = ENABLE_KEYBOARD_AT_LOG; - static void kbd_log(const char *fmt, ...) { va_list ap; if (keyboard_at_do_log) { - va_start(ap, fmt); - pclog_ex(fmt, ap); - va_end(ap); + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); } } #else -#define kbd_log(fmt, ...) +# define kbd_log(fmt, ...) #endif - static void set_scancode_map(atkbd_t *dev) { switch (keyboard_mode & 3) { #ifdef USE_SET1 - case 1: - default: - keyboard_set_table(scancode_set1); - break; + case 1: + default: + keyboard_set_table(scancode_set1); + break; #else - default: + default: #endif - case 2: - keyboard_set_table(scancode_set2); - break; + case 2: + keyboard_set_table(scancode_set2); + break; - case 3: - keyboard_set_table(scancode_set3); - break; + case 3: + keyboard_set_table(scancode_set3); + break; } if (keyboard_mode & 0x20) #ifdef USE_SET1 - keyboard_set_table(scancode_set1); + keyboard_set_table(scancode_set1); #else - keyboard_set_table(scancode_set2); + keyboard_set_table(scancode_set2); #endif } - - static void kbc_queue_reset(uint8_t channel) { if (channel == 2) { - mouse_queue_start = mouse_queue_end = 0; - memset(mouse_queue, 0x00, sizeof(mouse_queue)); + mouse_queue_start = mouse_queue_end = 0; + memset(mouse_queue, 0x00, sizeof(mouse_queue)); } else if (channel == 1) { - key_queue_start = key_queue_end = 0; - memset(key_queue, 0x00, sizeof(key_queue)); + key_queue_start = key_queue_end = 0; + memset(key_queue, 0x00, sizeof(key_queue)); } else { - key_ctrl_queue_start = key_ctrl_queue_end = 0; - memset(key_ctrl_queue, 0x00, sizeof(key_ctrl_queue)); + key_ctrl_queue_start = key_ctrl_queue_end = 0; + memset(key_ctrl_queue, 0x00, sizeof(key_ctrl_queue)); } } - static void kbc_queue_add(atkbd_t *dev, uint8_t val, uint8_t channel, uint8_t stat_hi) { uint8_t kbc_ven = dev->flags & KBC_VEN_MASK; if ((kbc_ven == KBC_VEN_AMI) || ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF)) - stat_hi |= ((dev->input_port & 0x80) ? 0x10 : 0x00); + stat_hi |= ((dev->input_port & 0x80) ? 0x10 : 0x00); else - stat_hi |= 0x10; + stat_hi |= 0x10; dev->status = (dev->status & 0x0f) | stat_hi; if (channel == 2) { - kbd_log("ATkbc: mouse_queue[%02X] = %02X;\n", mouse_queue_end, val); - mouse_queue[mouse_queue_end] = val; - mouse_queue_end = (mouse_queue_end + 1) & 0xf; + kbd_log("ATkbc: mouse_queue[%02X] = %02X;\n", mouse_queue_end, val); + mouse_queue[mouse_queue_end] = val; + mouse_queue_end = (mouse_queue_end + 1) & 0xf; } else if (channel == 1) { - kbd_log("ATkbc: key_queue[%02X] = %02X;\n", key_queue_end, val); - key_queue[key_queue_end] = val; - key_queue_end = (key_queue_end + 1) & 0xf; + kbd_log("ATkbc: key_queue[%02X] = %02X;\n", key_queue_end, val); + key_queue[key_queue_end] = val; + key_queue_end = (key_queue_end + 1) & 0xf; } else { - kbd_log("ATkbc: key_ctrl_queue[%02X] = %02X;\n", key_ctrl_queue_end, val); - key_ctrl_queue[key_ctrl_queue_end] = val; - key_ctrl_queue_end = (key_ctrl_queue_end + 1) & 0xf; + kbd_log("ATkbc: key_ctrl_queue[%02X] = %02X;\n", key_ctrl_queue_end, val); + key_ctrl_queue[key_ctrl_queue_end] = val; + key_ctrl_queue_end = (key_ctrl_queue_end + 1) & 0xf; } } - static void add_to_kbc_queue_front(atkbd_t *dev, uint8_t val, uint8_t channel, uint8_t stat_hi) { uint8_t kbc_ven = dev->flags & KBC_VEN_MASK; if ((kbc_ven == KBC_VEN_AMI) || ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF)) - stat_hi |= ((dev->input_port & 0x80) ? 0x10 : 0x00); + stat_hi |= ((dev->input_port & 0x80) ? 0x10 : 0x00); else - stat_hi |= 0x10; + stat_hi |= 0x10; kbd_log("ATkbc: Adding %02X to front...\n", val); dev->wantirq = 0; if (channel == 2) { - if (dev->mem[0] & 0x02) - picint(0x1000); - if (kbc_ven != KBC_VEN_OLIVETTI) - dev->last_irq = 0x1000; + if (dev->mem[0] & 0x02) + picint(0x1000); + if (kbc_ven != KBC_VEN_OLIVETTI) + dev->last_irq = 0x1000; } else { - if (dev->mem[0] & 0x01) - picint(2); - if (kbc_ven != KBC_VEN_OLIVETTI) - dev->last_irq = 2; + if (dev->mem[0] & 0x01) + picint(2); + if (kbc_ven != KBC_VEN_OLIVETTI) + dev->last_irq = 2; } dev->out = val; if (channel == 2) - dev->status = (dev->status & ~STAT_IFULL) | (STAT_OFULL | STAT_MFULL) | stat_hi; + dev->status = (dev->status & ~STAT_IFULL) | (STAT_OFULL | STAT_MFULL) | stat_hi; else - dev->status = (dev->status & ~(STAT_IFULL | STAT_MFULL)) | STAT_OFULL | stat_hi; + dev->status = (dev->status & ~(STAT_IFULL | STAT_MFULL)) | STAT_OFULL | stat_hi; if (kbc_ven == KBC_VEN_OLIVETTI) - dev->last_irq = 0x0000; + dev->last_irq = 0x0000; } - static void add_data_kbd_queue(atkbd_t *dev, int direct, uint8_t val) { if ((!keyboard_scan && !direct) || (dev->reset_delay > 0) || (key_queue_end >= 16)) { - kbd_log("ATkbc: Unable to add to queue, conditions: %i, %i, %i\n", !keyboard_scan, (dev->reset_delay > 0), (key_queue_end >= 16)); - return; + kbd_log("ATkbc: Unable to add to queue, conditions: %i, %i, %i\n", !keyboard_scan, (dev->reset_delay > 0), (key_queue_end >= 16)); + return; } - kbd_log("ATkbc: key_queue[%02X] = %02X;\n", key_queue_end, val); + kbd_log("ATkbc: key_queue[%02X] = %02X;\n", key_queue_end, val); kbc_queue_add(dev, val, 1, 0x00); kbd_last_scan_code = val; } - - static void add_data_kbd_direct(atkbd_t *dev, uint8_t val) { - int xt_mode = (keyboard_mode & 0x20) && ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF); - int translate = (keyboard_mode & 0x40); + int xt_mode = (keyboard_mode & 0x20) && ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF); + int translate = (keyboard_mode & 0x40); uint8_t send; if (dev->reset_delay) - return; + return; translate = translate || (keyboard_mode & 0x40) || xt_mode; translate = translate || ((dev->flags & KBC_TYPE_MASK) == KBC_TYPE_PS2_2); if (translate) - send = nont_to_t[val]; + send = nont_to_t[val]; else - send = val; + send = val; add_data_kbd_queue(dev, 1, send); } - static void add_data_kbd_raw(atkbd_t *dev, uint8_t val) { add_data_kbd_queue(dev, 1, val); } - static void kbd_poll(void *priv) { - atkbd_t *dev = (atkbd_t *)priv; + atkbd_t *dev = (atkbd_t *) priv; #ifdef ENABLE_KEYBOARD_AT_LOG const uint8_t channels[4] = { 1, 2, 0, 0 }; #endif @@ -752,54 +740,53 @@ kbd_poll(void *priv) timer_advance_u64(&dev->send_delay_timer, (100ULL * TIMER_USEC)); if (dev->out_new != -1 && !dev->last_irq) { - dev->wantirq = 0; - if (dev->out_new & 0x100) { - if (dev->mem[0] & 0x02) - picint(0x1000); - kbd_log("ATkbc: %02X coming from channel 2\n"); - dev->out = dev->out_new & 0xff; - dev->out_new = -1; - dev->status = (dev->status & ~STAT_IFULL) | (STAT_OFULL | STAT_MFULL); - dev->last_irq = 0x1000; - } else { - if (dev->mem[0] & 0x01) - picint(2); - kbd_log("ATkbc: %02X coming from channel %i\n", dev->out_new & 0xff, channels[(dev->out_new >> 8) & 0x03]); - dev->out = dev->out_new & 0xff; - dev->out_new = -1; - dev->status = (dev->status & ~(STAT_IFULL | STAT_MFULL)) | STAT_OFULL; - dev->last_irq = 2; - } + dev->wantirq = 0; + if (dev->out_new & 0x100) { + if (dev->mem[0] & 0x02) + picint(0x1000); + kbd_log("ATkbc: %02X coming from channel 2\n"); + dev->out = dev->out_new & 0xff; + dev->out_new = -1; + dev->status = (dev->status & ~STAT_IFULL) | (STAT_OFULL | STAT_MFULL); + dev->last_irq = 0x1000; + } else { + if (dev->mem[0] & 0x01) + picint(2); + kbd_log("ATkbc: %02X coming from channel %i\n", dev->out_new & 0xff, channels[(dev->out_new >> 8) & 0x03]); + dev->out = dev->out_new & 0xff; + dev->out_new = -1; + dev->status = (dev->status & ~(STAT_IFULL | STAT_MFULL)) | STAT_OFULL; + dev->last_irq = 2; + } } - if (dev->out_new == -1 && !(dev->status & STAT_OFULL) && key_ctrl_queue_start != key_ctrl_queue_end) { - kbd_log("ATkbc: %02X on channel 0\n", key_ctrl_queue[key_ctrl_queue_start]); - dev->out_new = key_ctrl_queue[key_ctrl_queue_start] | 0x200; - key_ctrl_queue_start = (key_ctrl_queue_start + 1) & 0xf; + if (dev->out_new == -1 && !(dev->status & STAT_OFULL) && key_ctrl_queue_start != key_ctrl_queue_end) { + kbd_log("ATkbc: %02X on channel 0\n", key_ctrl_queue[key_ctrl_queue_start]); + dev->out_new = key_ctrl_queue[key_ctrl_queue_start] | 0x200; + key_ctrl_queue_start = (key_ctrl_queue_start + 1) & 0xf; } else if (!(dev->status & STAT_OFULL) && dev->out_new == -1 && dev->out_delayed != -1) { - kbd_log("ATkbc: %02X delayed on channel %i\n", dev->out_delayed & 0xff, channels[(dev->out_delayed >> 8) & 0x03]); - dev->out_new = dev->out_delayed; - dev->out_delayed = -1; + kbd_log("ATkbc: %02X delayed on channel %i\n", dev->out_delayed & 0xff, channels[(dev->out_delayed >> 8) & 0x03]); + dev->out_new = dev->out_delayed; + dev->out_delayed = -1; } else if (!(dev->status & STAT_OFULL) && dev->out_new == -1 && mouse_queue_start != mouse_queue_end) { - kbd_log("ATkbc: %02X on channel 2\n", mouse_queue[mouse_queue_start]); - dev->out_new = mouse_queue[mouse_queue_start] | 0x100; - mouse_queue_start = (mouse_queue_start + 1) & 0xf; + kbd_log("ATkbc: %02X on channel 2\n", mouse_queue[mouse_queue_start]); + dev->out_new = mouse_queue[mouse_queue_start] | 0x100; + mouse_queue_start = (mouse_queue_start + 1) & 0xf; } else if (!(dev->status & STAT_OFULL) && dev->out_new == -1 && !(dev->mem[0] & 0x10) && key_queue_start != key_queue_end) { - kbd_log("ATkbc: %02X on channel 1\n", key_queue[key_queue_start]); - dev->out_new = key_queue[key_queue_start]; - key_queue_start = (key_queue_start + 1) & 0xf; + kbd_log("ATkbc: %02X on channel 1\n", key_queue[key_queue_start]); + dev->out_new = key_queue[key_queue_start]; + key_queue_start = (key_queue_start + 1) & 0xf; } if (dev->reset_delay) { - dev->reset_delay--; - if (!dev->reset_delay) { - kbd_log("ATkbc: Sending AA on keyboard reset...\n"); - add_data_kbd_direct(dev, 0xaa); - } + dev->reset_delay--; + if (!dev->reset_delay) { + kbd_log("ATkbc: Sending AA on keyboard reset...\n"); + add_data_kbd_direct(dev, 0xaa); + } } } - static void add_data(atkbd_t *dev, uint8_t val) { @@ -809,56 +796,54 @@ add_data(atkbd_t *dev, uint8_t val) kbc_queue_add(dev, val, 0, 0x00); if (!(dev->out_new & 0x300)) { - dev->out_delayed = dev->out_new; - dev->out_new = -1; + dev->out_delayed = dev->out_new; + dev->out_new = -1; } } - static void add_data_vals(atkbd_t *dev, uint8_t *val, uint8_t len) { - int xt_mode = (keyboard_mode & 0x20) && ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF); + int xt_mode = (keyboard_mode & 0x20) && ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF); int translate = (keyboard_mode & 0x40); int i; uint8_t or = 0; uint8_t send; if (dev->reset_delay) - return; + return; translate = translate || (keyboard_mode & 0x40) || xt_mode; translate = translate || ((dev->flags & KBC_TYPE_MASK) == KBC_TYPE_PS2_2); for (i = 0; i < len; i++) { if (translate) { - if (val[i] == 0xf0) { - or = 0x80; - continue; - } - send = nont_to_t[val[i]] | or; - if (or == 0x80) - or = 0; - } else - send = val[i]; + if (val[i] == 0xf0) { + or = 0x80; + continue; + } + send = nont_to_t[val[i]] | or ; + if (or == 0x80) + or = 0; + } else + send = val[i]; - add_data_kbd_queue(dev, 0, send); + add_data_kbd_queue(dev, 0, send); } } - static void add_data_kbd(uint16_t val) { - atkbd_t *dev = SavedKbd; - int xt_mode = (keyboard_mode & 0x20) && ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF); - int translate = (keyboard_mode & 0x40); - uint8_t fake_shift[4]; - uint8_t num_lock = 0, shift_states = 0; - uint8_t kbc_ven = dev->flags & KBC_VEN_MASK; + atkbd_t *dev = SavedKbd; + int xt_mode = (keyboard_mode & 0x20) && ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF); + int translate = (keyboard_mode & 0x40); + uint8_t fake_shift[4]; + uint8_t num_lock = 0, shift_states = 0; + uint8_t kbc_ven = dev->flags & KBC_VEN_MASK; if (dev->reset_delay) - return; + return; translate = translate || (keyboard_mode & 0x40) || xt_mode; translate = translate || ((dev->flags & KBC_TYPE_MASK) == KBC_TYPE_PS2_2); @@ -868,191 +853,235 @@ add_data_kbd(uint16_t val) /* Allow for scan code translation. */ if (translate && (val == 0xf0)) { - kbd_log("ATkbd: translate is on, F0 prefix detected\n"); - sc_or = 0x80; - return; + kbd_log("ATkbd: translate is on, F0 prefix detected\n"); + sc_or = 0x80; + return; } /* Skip break code if translated make code has bit 7 set. */ if (translate && (sc_or == 0x80) && (val & 0x80)) { - kbd_log("ATkbd: translate is on, skipping scan code: %02X (original: F0 %02X)\n", nont_to_t[val], val); - sc_or = 0; - return; + kbd_log("ATkbd: translate is on, skipping scan code: %02X (original: F0 %02X)\n", nont_to_t[val], val); + sc_or = 0; + return; } /* Test for T3100E 'Fn' key (Right Alt / Right Ctrl) */ - if ((dev != NULL) && (kbc_ven == KBC_VEN_TOSHIBA) && - (keyboard_recv(0xb8) || keyboard_recv(0x9d))) switch (val) { - case 0x4f: t3100e_notify_set(0x01); break; /* End */ - case 0x50: t3100e_notify_set(0x02); break; /* Down */ - case 0x51: t3100e_notify_set(0x03); break; /* PgDn */ - case 0x52: t3100e_notify_set(0x04); break; /* Ins */ - case 0x53: t3100e_notify_set(0x05); break; /* Del */ - case 0x54: t3100e_notify_set(0x06); break; /* SysRQ */ - case 0x45: t3100e_notify_set(0x07); break; /* NumLock */ - case 0x46: t3100e_notify_set(0x08); break; /* ScrLock */ - case 0x47: t3100e_notify_set(0x09); break; /* Home */ - case 0x48: t3100e_notify_set(0x0a); break; /* Up */ - case 0x49: t3100e_notify_set(0x0b); break; /* PgUp */ - case 0x4A: t3100e_notify_set(0x0c); break; /* Keypad -*/ - case 0x4B: t3100e_notify_set(0x0d); break; /* Left */ - case 0x4C: t3100e_notify_set(0x0e); break; /* KP 5 */ - case 0x4D: t3100e_notify_set(0x0f); break; /* Right */ - } + if ((dev != NULL) && (kbc_ven == KBC_VEN_TOSHIBA) && (keyboard_recv(0xb8) || keyboard_recv(0x9d))) + switch (val) { + case 0x4f: + t3100e_notify_set(0x01); + break; /* End */ + case 0x50: + t3100e_notify_set(0x02); + break; /* Down */ + case 0x51: + t3100e_notify_set(0x03); + break; /* PgDn */ + case 0x52: + t3100e_notify_set(0x04); + break; /* Ins */ + case 0x53: + t3100e_notify_set(0x05); + break; /* Del */ + case 0x54: + t3100e_notify_set(0x06); + break; /* SysRQ */ + case 0x45: + t3100e_notify_set(0x07); + break; /* NumLock */ + case 0x46: + t3100e_notify_set(0x08); + break; /* ScrLock */ + case 0x47: + t3100e_notify_set(0x09); + break; /* Home */ + case 0x48: + t3100e_notify_set(0x0a); + break; /* Up */ + case 0x49: + t3100e_notify_set(0x0b); + break; /* PgUp */ + case 0x4A: + t3100e_notify_set(0x0c); + break; /* Keypad -*/ + case 0x4B: + t3100e_notify_set(0x0d); + break; /* Left */ + case 0x4C: + t3100e_notify_set(0x0e); + break; /* KP 5 */ + case 0x4D: + t3100e_notify_set(0x0f); + break; /* Right */ + } kbd_log("ATkbd: translate is %s, ", translate ? "on" : "off"); - switch(val) { - case FAKE_LSHIFT_ON: - kbd_log("fake left shift on, scan code: "); - if (num_lock) { - if (shift_states) { - kbd_log("N/A (one or both shifts on)\n"); - break; - } else { - /* Num lock on and no shifts are pressed, send non-inverted fake shift. */ - switch(keyboard_mode & 0x02) { - case 1: - fake_shift[0] = 0xe0; fake_shift[1] = 0x2a; - add_data_vals(dev, fake_shift, 2); - break; + switch (val) { + case FAKE_LSHIFT_ON: + kbd_log("fake left shift on, scan code: "); + if (num_lock) { + if (shift_states) { + kbd_log("N/A (one or both shifts on)\n"); + break; + } else { + /* Num lock on and no shifts are pressed, send non-inverted fake shift. */ + switch (keyboard_mode & 0x02) { + case 1: + fake_shift[0] = 0xe0; + fake_shift[1] = 0x2a; + add_data_vals(dev, fake_shift, 2); + break; - case 2: - fake_shift[0] = 0xe0; fake_shift[1] = 0x12; - add_data_vals(dev, fake_shift, 2); - break; + case 2: + fake_shift[0] = 0xe0; + fake_shift[1] = 0x12; + add_data_vals(dev, fake_shift, 2); + break; - default: - kbd_log("N/A (scan code set %i)\n", keyboard_mode & 0x02); - break; - } - } - } else { - if (shift_states & STATE_LSHIFT) { - /* Num lock off and left shift pressed. */ - switch(keyboard_mode & 0x02) { - case 1: - fake_shift[0] = 0xe0; fake_shift[1] = 0xaa; - add_data_vals(dev, fake_shift, 2); - break; + default: + kbd_log("N/A (scan code set %i)\n", keyboard_mode & 0x02); + break; + } + } + } else { + if (shift_states & STATE_LSHIFT) { + /* Num lock off and left shift pressed. */ + switch (keyboard_mode & 0x02) { + case 1: + fake_shift[0] = 0xe0; + fake_shift[1] = 0xaa; + add_data_vals(dev, fake_shift, 2); + break; - case 2: - fake_shift[0] = 0xe0; fake_shift[1] = 0xf0; fake_shift[2] = 0x12; - add_data_vals(dev, fake_shift, 3); - break; + case 2: + fake_shift[0] = 0xe0; + fake_shift[1] = 0xf0; + fake_shift[2] = 0x12; + add_data_vals(dev, fake_shift, 3); + break; - default: - kbd_log("N/A (scan code set %i)\n", keyboard_mode & 0x02); - break; - } - } - if (shift_states & STATE_RSHIFT) { - /* Num lock off and right shift pressed. */ - switch(keyboard_mode & 0x02) { - case 1: - fake_shift[0] = 0xe0; fake_shift[1] = 0xb6; - add_data_vals(dev, fake_shift, 2); - break; + default: + kbd_log("N/A (scan code set %i)\n", keyboard_mode & 0x02); + break; + } + } + if (shift_states & STATE_RSHIFT) { + /* Num lock off and right shift pressed. */ + switch (keyboard_mode & 0x02) { + case 1: + fake_shift[0] = 0xe0; + fake_shift[1] = 0xb6; + add_data_vals(dev, fake_shift, 2); + break; - case 2: - fake_shift[0] = 0xe0; fake_shift[1] = 0xf0; fake_shift[2] = 0x59; - add_data_vals(dev, fake_shift, 3); - break; + case 2: + fake_shift[0] = 0xe0; + fake_shift[1] = 0xf0; + fake_shift[2] = 0x59; + add_data_vals(dev, fake_shift, 3); + break; - default: - kbd_log("N/A (scan code set %i)\n", keyboard_mode & 0x02); - break; - } - } - kbd_log(shift_states ? "" : "N/A (both shifts off)\n"); - } - break; + default: + kbd_log("N/A (scan code set %i)\n", keyboard_mode & 0x02); + break; + } + } + kbd_log(shift_states ? "" : "N/A (both shifts off)\n"); + } + break; - case FAKE_LSHIFT_OFF: - kbd_log("fake left shift on, scan code: "); - if (num_lock) { - if (shift_states) { - kbd_log("N/A (one or both shifts on)\n"); - break; - } else { - /* Num lock on and no shifts are pressed, send non-inverted fake shift. */ - switch(keyboard_mode & 0x02) { - case 1: - fake_shift[0] = 0xe0; fake_shift[1] = 0xaa; - add_data_vals(dev, fake_shift, 2); - break; + case FAKE_LSHIFT_OFF: + kbd_log("fake left shift on, scan code: "); + if (num_lock) { + if (shift_states) { + kbd_log("N/A (one or both shifts on)\n"); + break; + } else { + /* Num lock on and no shifts are pressed, send non-inverted fake shift. */ + switch (keyboard_mode & 0x02) { + case 1: + fake_shift[0] = 0xe0; + fake_shift[1] = 0xaa; + add_data_vals(dev, fake_shift, 2); + break; - case 2: - fake_shift[0] = 0xe0; fake_shift[1] = 0xf0; fake_shift[2] = 0x12; - add_data_vals(dev, fake_shift, 3); - break; + case 2: + fake_shift[0] = 0xe0; + fake_shift[1] = 0xf0; + fake_shift[2] = 0x12; + add_data_vals(dev, fake_shift, 3); + break; - default: - kbd_log("N/A (scan code set %i)\n", keyboard_mode & 0x02); - break; - } - } - } else { - if (shift_states & STATE_LSHIFT) { - /* Num lock off and left shift pressed. */ - switch(keyboard_mode & 0x02) { - case 1: - fake_shift[0] = 0xe0; fake_shift[1] = 0x2a; - add_data_vals(dev, fake_shift, 2); - break; + default: + kbd_log("N/A (scan code set %i)\n", keyboard_mode & 0x02); + break; + } + } + } else { + if (shift_states & STATE_LSHIFT) { + /* Num lock off and left shift pressed. */ + switch (keyboard_mode & 0x02) { + case 1: + fake_shift[0] = 0xe0; + fake_shift[1] = 0x2a; + add_data_vals(dev, fake_shift, 2); + break; - case 2: - fake_shift[0] = 0xe0; fake_shift[1] = 0x12; - add_data_vals(dev, fake_shift, 2); - break; + case 2: + fake_shift[0] = 0xe0; + fake_shift[1] = 0x12; + add_data_vals(dev, fake_shift, 2); + break; - default: - kbd_log("N/A (scan code set %i)\n", keyboard_mode & 0x02); - break; - } - } - if (shift_states & STATE_RSHIFT) { - /* Num lock off and right shift pressed. */ - switch(keyboard_mode & 0x02) { - case 1: - fake_shift[0] = 0xe0; fake_shift[1] = 0x36; - add_data_vals(dev, fake_shift, 2); - break; + default: + kbd_log("N/A (scan code set %i)\n", keyboard_mode & 0x02); + break; + } + } + if (shift_states & STATE_RSHIFT) { + /* Num lock off and right shift pressed. */ + switch (keyboard_mode & 0x02) { + case 1: + fake_shift[0] = 0xe0; + fake_shift[1] = 0x36; + add_data_vals(dev, fake_shift, 2); + break; - case 2: - fake_shift[0] = 0xe0; fake_shift[1] = 0x59; - add_data_vals(dev, fake_shift, 2); - break; + case 2: + fake_shift[0] = 0xe0; + fake_shift[1] = 0x59; + add_data_vals(dev, fake_shift, 2); + break; - default: - kbd_log("N/A (scan code set %i)\n", keyboard_mode & 0x02); - break; - } - } - kbd_log(shift_states ? "" : "N/A (both shifts off)\n"); - } - break; + default: + kbd_log("N/A (scan code set %i)\n", keyboard_mode & 0x02); + break; + } + } + kbd_log(shift_states ? "" : "N/A (both shifts off)\n"); + } + break; - default: + default: #ifdef ENABLE_KEYBOARD_AT_LOG - kbd_log("scan code: "); - if (translate) { - kbd_log("%02X (original: ", (nont_to_t[val] | sc_or)); - if (sc_or == 0x80) - kbd_log("F0 "); - kbd_log("%02X)\n", val); - } else - kbd_log("%02X\n", val); + kbd_log("scan code: "); + if (translate) { + kbd_log("%02X (original: ", (nont_to_t[val] | sc_or)); + if (sc_or == 0x80) + kbd_log("F0 "); + kbd_log("%02X)\n", val); + } else + kbd_log("%02X\n", val); #endif - add_data_kbd_queue(dev, 0, translate ? (nont_to_t[val] | sc_or) : val); - break; + add_data_kbd_queue(dev, 0, translate ? (nont_to_t[val] | sc_or) : val); + break; } if (sc_or == 0x80) - sc_or = 0; + sc_or = 0; } - static void write_output(atkbd_t *dev, uint8_t val) { @@ -1061,49 +1090,48 @@ write_output(atkbd_t *dev, uint8_t val) uint8_t kbc_ven = dev->flags & KBC_VEN_MASK; if ((kbc_ven != KBC_VEN_OLIVETTI) && ((kbc_ven == KBC_VEN_AMI) || ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF))) - val |= ((dev->mem[0] << 4) & 0x10); + val |= ((dev->mem[0] << 4) & 0x10); /*IRQ 12*/ if ((old ^ val) & 0x20) { - if (val & 0x20) - picint(1 << 12); - else - picintc(1 << 12); + if (val & 0x20) + picint(1 << 12); + else + picintc(1 << 12); } /*IRQ 1*/ if ((old ^ val) & 0x10) { - if (val & 0x10) - picint(1 << 1); - else - picintc(1 << 1); + if (val & 0x10) + picint(1 << 1); + else + picintc(1 << 1); } if ((old ^ val) & 0x02) { /*A20 enable change*/ - mem_a20_key = val & 0x02; - mem_a20_recalc(); - flushmmucache(); + mem_a20_key = val & 0x02; + mem_a20_recalc(); + flushmmucache(); } /* 0 holds the CPU in the RESET state, 1 releases it. To simplify this, we just do everything on release. */ if ((old ^ val) & 0x01) { /*Reset*/ - if (! (val & 0x01)) { /* Pin 0 selected. */ - /* Pin 0 selected. */ - kbd_log("write_output(): Pulse reset!\n"); - softresetx86(); /*Pulse reset!*/ - cpu_set_edx(); - flushmmucache(); - if (kbc_ven == KBC_VEN_ALI) - smbase = 0x00030000; - } + if (!(val & 0x01)) { /* Pin 0 selected. */ + /* Pin 0 selected. */ + kbd_log("write_output(): Pulse reset!\n"); + softresetx86(); /*Pulse reset!*/ + cpu_set_edx(); + flushmmucache(); + if (kbc_ven == KBC_VEN_ALI) + smbase = 0x00030000; + } } /* Do this here to avoid an infinite reset loop. */ dev->output_port = val; } - static void write_cmd(atkbd_t *dev, uint8_t val) { @@ -1111,35 +1139,34 @@ write_cmd(atkbd_t *dev, uint8_t val) kbd_log("ATkbc: write command byte: %02X (old: %02X)\n", val, dev->mem[0]); if ((val & 1) && (dev->status & STAT_OFULL)) - dev->wantirq = 1; + dev->wantirq = 1; if (!(val & 1) && dev->wantirq) - dev->wantirq = 0; + dev->wantirq = 0; /* PS/2 type 2 keyboard controllers always force the XLAT bit to 0. */ if ((dev->flags & KBC_TYPE_MASK) == KBC_TYPE_PS2_2) { - val &= ~CCB_TRANSLATE; - dev->mem[0] &= ~CCB_TRANSLATE; + val &= ~CCB_TRANSLATE; + dev->mem[0] &= ~CCB_TRANSLATE; } /* Scan code translate ON/OFF. */ keyboard_mode &= 0x93; keyboard_mode |= (val & MODE_MASK); - kbd_log("ATkbc: keyboard interrupt is now %s\n", (val & 0x01) ? "enabled" : "disabled"); + kbd_log("ATkbc: keyboard interrupt is now %s\n", (val & 0x01) ? "enabled" : "disabled"); /* ISA AT keyboard controllers use bit 5 for keyboard mode (1 = PC/XT, 2 = AT); PS/2 (and EISA/PCI) keyboard controllers use it as the PS/2 mouse enable switch. The AMIKEY firmware apparently uses this bit for something else. */ - if ((kbc_ven == KBC_VEN_AMI) || - ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF)) { - keyboard_mode &= ~CCB_PCMODE; + if ((kbc_ven == KBC_VEN_AMI) || ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF)) { + keyboard_mode &= ~CCB_PCMODE; - kbd_log("ATkbc: mouse interrupt is now %s\n", (val & 0x02) ? "enabled" : "disabled"); + kbd_log("ATkbc: mouse interrupt is now %s\n", (val & 0x02) ? "enabled" : "disabled"); } if ((kbc_ven == KBC_VEN_AMI) || ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF)) { - /* Update the output port to mirror the KBD DIS and AUX DIS bits, if active. */ - write_output(dev, dev->output_port); + /* Update the output port to mirror the KBD DIS and AUX DIS bits, if active. */ + write_output(dev, dev->output_port); } kbd_log("Command byte now: %02X (%02X)\n", dev->mem[0], val); @@ -1147,29 +1174,26 @@ write_cmd(atkbd_t *dev, uint8_t val) dev->status = (dev->status & ~STAT_SYSFLAG) | (val & STAT_SYSFLAG); } - static void pulse_output(atkbd_t *dev, uint8_t mask) { if (mask != 0x0f) { - dev->old_output_port = dev->output_port & ~(0xf0 | mask); - kbd_log("pulse_output(): Output port now: %02X\n", dev->output_port & (0xf0 | mask)); - write_output(dev, dev->output_port & (0xf0 | mask)); - timer_set_delay_u64(&dev->pulse_cb, 6ULL * TIMER_USEC); + dev->old_output_port = dev->output_port & ~(0xf0 | mask); + kbd_log("pulse_output(): Output port now: %02X\n", dev->output_port & (0xf0 | mask)); + write_output(dev, dev->output_port & (0xf0 | mask)); + timer_set_delay_u64(&dev->pulse_cb, 6ULL * TIMER_USEC); } } - static void pulse_poll(void *priv) { - atkbd_t *dev = (atkbd_t *)priv; + atkbd_t *dev = (atkbd_t *) priv; kbd_log("pulse_poll(): Output port now: %02X\n", dev->output_port | dev->old_output_port); write_output(dev, dev->output_port | dev->old_output_port); } - static void set_enable_kbd(atkbd_t *dev, uint8_t enable) { @@ -1177,7 +1201,6 @@ set_enable_kbd(atkbd_t *dev, uint8_t enable) dev->mem[0] |= (enable ? 0x00 : 0x10); } - static void set_enable_mouse(atkbd_t *dev, uint8_t enable) { @@ -1185,434 +1208,526 @@ set_enable_mouse(atkbd_t *dev, uint8_t enable) dev->mem[0] |= (enable ? 0x00 : 0x20); } - static uint8_t write64_generic(void *priv, uint8_t val) { - atkbd_t *dev = (atkbd_t *)priv; - uint8_t current_drive, fixed_bits; - uint8_t kbc_ven = 0x0; - kbc_ven = dev->flags & KBC_VEN_MASK; - + atkbd_t *dev = (atkbd_t *) priv; + uint8_t current_drive, fixed_bits; + uint8_t kbc_ven = 0x0; + kbc_ven = dev->flags & KBC_VEN_MASK; switch (val) { - case 0xa4: /* check if password installed */ - if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) { - kbd_log("ATkbc: check if password installed\n"); - add_data(dev, 0xf1); - return 0; - } - break; + case 0xa4: /* check if password installed */ + if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) { + kbd_log("ATkbc: check if password installed\n"); + add_data(dev, 0xf1); + return 0; + } + break; - case 0xa7: /* disable mouse port */ - if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) { - kbd_log("ATkbc: disable mouse port\n"); - set_enable_mouse(dev, 0); - return 0; - } - break; + case 0xa7: /* disable mouse port */ + if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) { + kbd_log("ATkbc: disable mouse port\n"); + set_enable_mouse(dev, 0); + return 0; + } + break; - case 0xa8: /*Enable mouse port*/ - if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) { - kbd_log("ATkbc: enable mouse port\n"); - set_enable_mouse(dev, 1); - return 0; - } - break; + case 0xa8: /*Enable mouse port*/ + if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) { + kbd_log("ATkbc: enable mouse port\n"); + set_enable_mouse(dev, 1); + return 0; + } + break; - case 0xa9: /*Test mouse port*/ - kbd_log("ATkbc: test mouse port\n"); - if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) { - add_data(dev, 0x00); /* no error, this is testing the channel 2 interface */ - return 0; - } - break; + case 0xa9: /*Test mouse port*/ + kbd_log("ATkbc: test mouse port\n"); + if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) { + add_data(dev, 0x00); /* no error, this is testing the channel 2 interface */ + return 0; + } + break; - case 0xaf: /* read keyboard version */ - kbd_log("ATkbc: read keyboard version\n"); - add_data(dev, 0x00); - return 0; + case 0xaf: /* read keyboard version */ + kbd_log("ATkbc: read keyboard version\n"); + add_data(dev, 0x00); + return 0; - case 0xc0: /* read input port */ - kbd_log("ATkbc: read input port\n"); - fixed_bits = 4; - /* The SMM handlers of Intel AMI Pentium BIOS'es expect bit 6 to be set. */ - if (kbc_ven == KBC_VEN_INTEL_AMI) - fixed_bits |= 0x40; - if (kbc_ven == KBC_VEN_IBM_PS1) { - current_drive = fdc_get_current_drive(); - add_to_kbc_queue_front(dev, dev->input_port | fixed_bits | (fdd_is_525(current_drive) ? 0x40 : 0x00), - 0, 0x00); - dev->input_port = ((dev->input_port + 1) & 3) | - (dev->input_port & 0xfc) | - (fdd_is_525(current_drive) ? 0x40 : 0x00); - } else if (kbc_ven == KBC_VEN_NCR) { - /* switch settings - * bit 7: keyboard disable - * bit 6: display type (0 color, 1 mono) - * bit 5: power-on default speed (0 high, 1 low) - * bit 4: sense RAM size (0 unsupported, 1 512k on system board) - * bit 3: coprocessor detect - * bit 2: unused - * bit 1: high/auto speed - * bit 0: dma mode - */ - add_to_kbc_queue_front(dev, (dev->input_port | fixed_bits | (video_is_mda() ? 0x40 : 0x00) | (hasfpu ? 0x08 : 0x00)) & 0xdf, - 0, 0x00); - dev->input_port = ((dev->input_port + 1) & 3) | - (dev->input_port & 0xfc); - } else { - if (((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) && - ((dev->flags & KBC_VEN_MASK) != KBC_VEN_INTEL_AMI)) + case 0xc0: /* read input port */ + kbd_log("ATkbc: read input port\n"); + fixed_bits = 4; + /* The SMM handlers of Intel AMI Pentium BIOS'es expect bit 6 to be set. */ + if (kbc_ven == KBC_VEN_INTEL_AMI) + fixed_bits |= 0x40; + if (kbc_ven == KBC_VEN_IBM_PS1) { + current_drive = fdc_get_current_drive(); + add_to_kbc_queue_front(dev, dev->input_port | fixed_bits | (fdd_is_525(current_drive) ? 0x40 : 0x00), + 0, 0x00); + dev->input_port = ((dev->input_port + 1) & 3) | (dev->input_port & 0xfc) | (fdd_is_525(current_drive) ? 0x40 : 0x00); + } else if (kbc_ven == KBC_VEN_NCR) { + /* switch settings + * bit 7: keyboard disable + * bit 6: display type (0 color, 1 mono) + * bit 5: power-on default speed (0 high, 1 low) + * bit 4: sense RAM size (0 unsupported, 1 512k on system board) + * bit 3: coprocessor detect + * bit 2: unused + * bit 1: high/auto speed + * bit 0: dma mode + */ + add_to_kbc_queue_front(dev, (dev->input_port | fixed_bits | (video_is_mda() ? 0x40 : 0x00) | (hasfpu ? 0x08 : 0x00)) & 0xdf, + 0, 0x00); + dev->input_port = ((dev->input_port + 1) & 3) | (dev->input_port & 0xfc); + } else { + if (((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) && ((dev->flags & KBC_VEN_MASK) != KBC_VEN_INTEL_AMI)) #if 0 add_to_kbc_queue_front(dev, (dev->input_port | fixed_bits) & (((dev->flags & KBC_VEN_MASK) == KBC_VEN_ACER) ? 0xeb : 0xef), 0, 0x00); #else - add_to_kbc_queue_front(dev, ((dev->input_port | fixed_bits) & 0xf0) | (((dev->flags & KBC_VEN_MASK) == KBC_VEN_ACER) ? 0x08 : 0x0c), 0, 0x00); + add_to_kbc_queue_front(dev, ((dev->input_port | fixed_bits) & 0xf0) | (((dev->flags & KBC_VEN_MASK) == KBC_VEN_ACER) ? 0x08 : 0x0c), 0, 0x00); #endif - else - add_to_kbc_queue_front(dev, dev->input_port | fixed_bits, 0, 0x00); - dev->input_port = ((dev->input_port + 1) & 3) | - (dev->input_port & 0xfc); - } - return 0; + else add_to_kbc_queue_front(dev, dev->input_port | fixed_bits, 0, 0x00); + dev->input_port = ((dev->input_port + 1) & 3) | (dev->input_port & 0xfc); + } + return 0; - case 0xd3: /* write mouse output buffer */ - if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) { - kbd_log("ATkbc: write mouse output buffer\n"); - dev->want60 = 1; - return 0; - } - break; + case 0xd3: /* write mouse output buffer */ + if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) { + kbd_log("ATkbc: write mouse output buffer\n"); + dev->want60 = 1; + return 0; + } + break; - case 0xd4: /* write to mouse */ - kbd_log("ATkbc: write to mouse\n"); - dev->want60 = 1; - return 0; + case 0xd4: /* write to mouse */ + kbd_log("ATkbc: write to mouse\n"); + dev->want60 = 1; + return 0; - case 0xf0: case 0xf1: case 0xf2: case 0xf3: - case 0xf4: case 0xf5: case 0xf6: case 0xf7: - case 0xf8: case 0xf9: case 0xfa: case 0xfb: - case 0xfc: case 0xfd: case 0xfe: case 0xff: - kbd_log("ATkbc: pulse %01X\n", val & 0x0f); - pulse_output(dev, val & 0x0f); - return 0; + case 0xf0: + case 0xf1: + case 0xf2: + case 0xf3: + case 0xf4: + case 0xf5: + case 0xf6: + case 0xf7: + case 0xf8: + case 0xf9: + case 0xfa: + case 0xfb: + case 0xfc: + case 0xfd: + case 0xfe: + case 0xff: + kbd_log("ATkbc: pulse %01X\n", val & 0x0f); + pulse_output(dev, val & 0x0f); + return 0; } kbd_log("ATkbc: bad command %02X\n", val); return 1; } - static uint8_t write60_ami(void *priv, uint8_t val) { - atkbd_t *dev = (atkbd_t *)priv; + atkbd_t *dev = (atkbd_t *) priv; - switch(dev->command) { - /* 0x40 - 0x5F are aliases for 0x60-0x7F */ - case 0x40: case 0x41: case 0x42: case 0x43: - case 0x44: case 0x45: case 0x46: case 0x47: - case 0x48: case 0x49: case 0x4a: case 0x4b: - case 0x4c: case 0x4d: case 0x4e: case 0x4f: - case 0x50: case 0x51: case 0x52: case 0x53: - case 0x54: case 0x55: case 0x56: case 0x57: - case 0x58: case 0x59: case 0x5a: case 0x5b: - case 0x5c: case 0x5d: case 0x5e: case 0x5f: - kbd_log("ATkbc: AMI - alias write to %08X\n", dev->command); - dev->mem[dev->command & 0x1f] = val; - if (dev->command == 0x60) - write_cmd(dev, val); - return 0; + switch (dev->command) { + /* 0x40 - 0x5F are aliases for 0x60-0x7F */ + case 0x40: + case 0x41: + case 0x42: + case 0x43: + case 0x44: + case 0x45: + case 0x46: + case 0x47: + case 0x48: + case 0x49: + case 0x4a: + case 0x4b: + case 0x4c: + case 0x4d: + case 0x4e: + case 0x4f: + case 0x50: + case 0x51: + case 0x52: + case 0x53: + case 0x54: + case 0x55: + case 0x56: + case 0x57: + case 0x58: + case 0x59: + case 0x5a: + case 0x5b: + case 0x5c: + case 0x5d: + case 0x5e: + case 0x5f: + kbd_log("ATkbc: AMI - alias write to %08X\n", dev->command); + dev->mem[dev->command & 0x1f] = val; + if (dev->command == 0x60) + write_cmd(dev, val); + return 0; - case 0xaf: /* set extended controller RAM */ - kbd_log("ATkbc: AMI - set extended controller RAM\n"); - if (dev->secr_phase == 1) { - dev->mem_addr = val; - dev->want60 = 1; - dev->secr_phase = 2; - } else if (dev->secr_phase == 2) { - dev->mem[dev->mem_addr] = val; - dev->secr_phase = 0; - } - return 0; + case 0xaf: /* set extended controller RAM */ + kbd_log("ATkbc: AMI - set extended controller RAM\n"); + if (dev->secr_phase == 1) { + dev->mem_addr = val; + dev->want60 = 1; + dev->secr_phase = 2; + } else if (dev->secr_phase == 2) { + dev->mem[dev->mem_addr] = val; + dev->secr_phase = 0; + } + return 0; - case 0xc1: - kbd_log("ATkbc: AMI MegaKey - write %02X to input port\n", val); - dev->input_port = val; - return 0; + case 0xc1: + kbd_log("ATkbc: AMI MegaKey - write %02X to input port\n", val); + dev->input_port = val; + return 0; - case 0xcb: /* set keyboard mode */ - kbd_log("ATkbc: AMI - set keyboard mode\n"); - dev->ami_flags = val; - return 0; + case 0xcb: /* set keyboard mode */ + kbd_log("ATkbc: AMI - set keyboard mode\n"); + dev->ami_flags = val; + return 0; } return 1; } - static uint8_t write64_ami(void *priv, uint8_t val) { - atkbd_t *dev = (atkbd_t *)priv; - uint8_t kbc_ven = dev->flags & KBC_VEN_MASK; + atkbd_t *dev = (atkbd_t *) priv; + uint8_t kbc_ven = dev->flags & KBC_VEN_MASK; switch (val) { - case 0x00: case 0x01: case 0x02: case 0x03: - case 0x04: case 0x05: case 0x06: case 0x07: - case 0x08: case 0x09: case 0x0a: case 0x0b: - case 0x0c: case 0x0d: case 0x0e: case 0x0f: - case 0x10: case 0x11: case 0x12: case 0x13: - case 0x14: case 0x15: case 0x16: case 0x17: - case 0x18: case 0x19: case 0x1a: case 0x1b: - case 0x1c: case 0x1d: case 0x1e: case 0x1f: - kbd_log("ATkbc: AMI - alias read from %08X\n", val); - add_data(dev, dev->mem[val]); - return 0; + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0a: + case 0x0b: + case 0x0c: + case 0x0d: + case 0x0e: + case 0x0f: + case 0x10: + case 0x11: + case 0x12: + case 0x13: + case 0x14: + case 0x15: + case 0x16: + case 0x17: + case 0x18: + case 0x19: + case 0x1a: + case 0x1b: + case 0x1c: + case 0x1d: + case 0x1e: + case 0x1f: + kbd_log("ATkbc: AMI - alias read from %08X\n", val); + add_data(dev, dev->mem[val]); + return 0; - case 0x40: case 0x41: case 0x42: case 0x43: - case 0x44: case 0x45: case 0x46: case 0x47: - case 0x48: case 0x49: case 0x4a: case 0x4b: - case 0x4c: case 0x4d: case 0x4e: case 0x4f: - case 0x50: case 0x51: case 0x52: case 0x53: - case 0x54: case 0x55: case 0x56: case 0x57: - case 0x58: case 0x59: case 0x5a: case 0x5b: - case 0x5c: case 0x5d: case 0x5e: case 0x5f: - kbd_log("ATkbc: AMI - alias write to %08X\n", dev->command); - dev->want60 = 1; - return 0; + case 0x40: + case 0x41: + case 0x42: + case 0x43: + case 0x44: + case 0x45: + case 0x46: + case 0x47: + case 0x48: + case 0x49: + case 0x4a: + case 0x4b: + case 0x4c: + case 0x4d: + case 0x4e: + case 0x4f: + case 0x50: + case 0x51: + case 0x52: + case 0x53: + case 0x54: + case 0x55: + case 0x56: + case 0x57: + case 0x58: + case 0x59: + case 0x5a: + case 0x5b: + case 0x5c: + case 0x5d: + case 0x5e: + case 0x5f: + kbd_log("ATkbc: AMI - alias write to %08X\n", dev->command); + dev->want60 = 1; + return 0; - case 0xa0: /* copyright message */ - add_data(dev, 0x28); - add_data(dev, 0x00); - break; + case 0xa0: /* copyright message */ + add_data(dev, 0x28); + add_data(dev, 0x00); + break; - case 0xa1: /* get controller version */ - kbd_log("ATkbc: AMI - get controller version\n"); - if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) { - if (kbc_ven == KBC_VEN_ALI) - add_data(dev, 'F'); - else if ((dev->flags & KBC_VEN_MASK) == KBC_VEN_INTEL_AMI) - add_data(dev, '5'); - else - add_data(dev, 'H'); - } else - add_data(dev, 'F'); - return 0; + case 0xa1: /* get controller version */ + kbd_log("ATkbc: AMI - get controller version\n"); + if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) { + if (kbc_ven == KBC_VEN_ALI) + add_data(dev, 'F'); + else if ((dev->flags & KBC_VEN_MASK) == KBC_VEN_INTEL_AMI) + add_data(dev, '5'); + else + add_data(dev, 'H'); + } else + add_data(dev, 'F'); + return 0; - case 0xa2: /* clear keyboard controller lines P22/P23 */ - if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) { - kbd_log("ATkbc: AMI - clear KBC lines P22 and P23\n"); - write_output(dev, dev->output_port & 0xf3); - add_data(dev, 0x00); - return 0; - } - break; + case 0xa2: /* clear keyboard controller lines P22/P23 */ + if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) { + kbd_log("ATkbc: AMI - clear KBC lines P22 and P23\n"); + write_output(dev, dev->output_port & 0xf3); + add_data(dev, 0x00); + return 0; + } + break; - case 0xa3: /* set keyboard controller lines P22/P23 */ - if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) { - kbd_log("ATkbc: AMI - set KBC lines P22 and P23\n"); - write_output(dev, dev->output_port | 0x0c); - add_data(dev, 0x00); - return 0; - } - break; + case 0xa3: /* set keyboard controller lines P22/P23 */ + if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) { + kbd_log("ATkbc: AMI - set KBC lines P22 and P23\n"); + write_output(dev, dev->output_port | 0x0c); + add_data(dev, 0x00); + return 0; + } + break; - case 0xa4: /* write clock = low */ - if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) { - kbd_log("ATkbc: AMI - write clock = low\n"); - dev->ami_stat &= 0xfe; - return 0; - } - break; + case 0xa4: /* write clock = low */ + if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) { + kbd_log("ATkbc: AMI - write clock = low\n"); + dev->ami_stat &= 0xfe; + return 0; + } + break; - case 0xa5: /* write clock = high */ - if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) { - kbd_log("ATkbc: AMI - write clock = high\n"); - dev->ami_stat |= 0x01; - return 0; - } - break; + case 0xa5: /* write clock = high */ + if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) { + kbd_log("ATkbc: AMI - write clock = high\n"); + dev->ami_stat |= 0x01; + return 0; + } + break; - case 0xa6: /* read clock */ - if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) { - kbd_log("ATkbc: AMI - read clock\n"); - add_to_kbc_queue_front(dev, (dev->ami_stat & 1) ? 0xff : 0x00, 0, 0x00); - return 0; - } - break; + case 0xa6: /* read clock */ + if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) { + kbd_log("ATkbc: AMI - read clock\n"); + add_to_kbc_queue_front(dev, (dev->ami_stat & 1) ? 0xff : 0x00, 0, 0x00); + return 0; + } + break; - case 0xa7: /* write cache bad */ - if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) { - kbd_log("ATkbc: AMI - write cache bad\n"); - dev->ami_stat &= 0xfd; - return 0; - } - break; + case 0xa7: /* write cache bad */ + if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) { + kbd_log("ATkbc: AMI - write cache bad\n"); + dev->ami_stat &= 0xfd; + return 0; + } + break; - case 0xa8: /* write cache good */ - if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) { - kbd_log("ATkbc: AMI - write cache good\n"); - dev->ami_stat |= 0x02; - return 0; - } - break; + case 0xa8: /* write cache good */ + if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) { + kbd_log("ATkbc: AMI - write cache good\n"); + dev->ami_stat |= 0x02; + return 0; + } + break; - case 0xa9: /* read cache */ - if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) { - kbd_log("ATkbc: AMI - read cache\n"); - add_to_kbc_queue_front(dev, (dev->ami_stat & 2) ? 0xff : 0x00, 0, 0x00); - return 0; - } - break; + case 0xa9: /* read cache */ + if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) { + kbd_log("ATkbc: AMI - read cache\n"); + add_to_kbc_queue_front(dev, (dev->ami_stat & 2) ? 0xff : 0x00, 0, 0x00); + return 0; + } + break; - case 0xaf: /* set extended controller RAM */ - if (kbc_ven == KBC_VEN_ALI) { - kbd_log("ATkbc: Award/ALi/VIA keyboard controller revision\n"); - add_to_kbc_queue_front(dev, 0x43, 0, 0x00); - } else { - kbd_log("ATkbc: set extended controller RAM\n"); - dev->want60 = 1; - dev->secr_phase = 1; - } - return 0; + case 0xaf: /* set extended controller RAM */ + if (kbc_ven == KBC_VEN_ALI) { + kbd_log("ATkbc: Award/ALi/VIA keyboard controller revision\n"); + add_to_kbc_queue_front(dev, 0x43, 0, 0x00); + } else { + kbd_log("ATkbc: set extended controller RAM\n"); + dev->want60 = 1; + dev->secr_phase = 1; + } + return 0; - case 0xb0: case 0xb1: case 0xb2: case 0xb3: - /* set KBC lines P10-P13 (input port bits 0-3) low */ - kbd_log("ATkbc: set KBC lines P10-P13 (input port bits 0-3) low\n"); - if (!(dev->flags & DEVICE_PCI) || (val > 0xb1)) - dev->input_port &= ~(1 << (val & 0x03)); - add_data(dev, 0x00); - return 0; + case 0xb0: + case 0xb1: + case 0xb2: + case 0xb3: + /* set KBC lines P10-P13 (input port bits 0-3) low */ + kbd_log("ATkbc: set KBC lines P10-P13 (input port bits 0-3) low\n"); + if (!(dev->flags & DEVICE_PCI) || (val > 0xb1)) + dev->input_port &= ~(1 << (val & 0x03)); + add_data(dev, 0x00); + return 0; - case 0xb4: case 0xb5: - /* set KBC lines P22-P23 (output port bits 2-3) low */ - kbd_log("ATkbc: set KBC lines P22-P23 (output port bits 2-3) low\n"); - if (! (dev->flags & DEVICE_PCI)) - write_output(dev, dev->output_port & ~(4 << (val & 0x01))); - add_data(dev, 0x00); - return 0; + case 0xb4: + case 0xb5: + /* set KBC lines P22-P23 (output port bits 2-3) low */ + kbd_log("ATkbc: set KBC lines P22-P23 (output port bits 2-3) low\n"); + if (!(dev->flags & DEVICE_PCI)) + write_output(dev, dev->output_port & ~(4 << (val & 0x01))); + add_data(dev, 0x00); + return 0; - case 0xb8: case 0xb9: case 0xba: case 0xbb: - /* set KBC lines P10-P13 (input port bits 0-3) high */ - kbd_log("ATkbc: set KBC lines P10-P13 (input port bits 0-3) high\n"); - if (!(dev->flags & DEVICE_PCI) || (val > 0xb9)) { - dev->input_port |= (1 << (val & 0x03)); - add_data(dev, 0x00); - } - return 0; + case 0xb8: + case 0xb9: + case 0xba: + case 0xbb: + /* set KBC lines P10-P13 (input port bits 0-3) high */ + kbd_log("ATkbc: set KBC lines P10-P13 (input port bits 0-3) high\n"); + if (!(dev->flags & DEVICE_PCI) || (val > 0xb9)) { + dev->input_port |= (1 << (val & 0x03)); + add_data(dev, 0x00); + } + return 0; - case 0xbc: case 0xbd: - /* set KBC lines P22-P23 (output port bits 2-3) high */ - kbd_log("ATkbc: set KBC lines P22-P23 (output port bits 2-3) high\n"); - if (! (dev->flags & DEVICE_PCI)) - write_output(dev, dev->output_port | (4 << (val & 0x01))); - add_data(dev, 0x00); - return 0; + case 0xbc: + case 0xbd: + /* set KBC lines P22-P23 (output port bits 2-3) high */ + kbd_log("ATkbc: set KBC lines P22-P23 (output port bits 2-3) high\n"); + if (!(dev->flags & DEVICE_PCI)) + write_output(dev, dev->output_port | (4 << (val & 0x01))); + add_data(dev, 0x00); + return 0; - case 0xc1: /* write input port */ - kbd_log("ATkbc: AMI MegaKey - write input port\n"); - dev->want60 = 1; - return 0; + case 0xc1: /* write input port */ + kbd_log("ATkbc: AMI MegaKey - write input port\n"); + dev->want60 = 1; + return 0; - case 0xc4: - /* set KBC line P14 low */ - kbd_log("ATkbc: set KBC line P14 (input port bit 4) low\n"); - dev->input_port &= 0xef; - add_data(dev, 0x00); - return 0; - case 0xc5: - /* set KBC line P15 low */ - kbd_log("ATkbc: set KBC line P15 (input port bit 5) low\n"); - dev->input_port &= 0xdf; - add_data(dev, 0x00); - return 0; + case 0xc4: + /* set KBC line P14 low */ + kbd_log("ATkbc: set KBC line P14 (input port bit 4) low\n"); + dev->input_port &= 0xef; + add_data(dev, 0x00); + return 0; + case 0xc5: + /* set KBC line P15 low */ + kbd_log("ATkbc: set KBC line P15 (input port bit 5) low\n"); + dev->input_port &= 0xdf; + add_data(dev, 0x00); + return 0; - case 0xc8: - /* - * unblock KBC lines P22/P23 - * (allow command D1 to change bits 2/3 of the output port) - */ - kbd_log("ATkbc: AMI - unblock KBC lines P22 and P23\n"); - dev->ami_flags &= 0xfb; - return 0; + case 0xc8: + /* + * unblock KBC lines P22/P23 + * (allow command D1 to change bits 2/3 of the output port) + */ + kbd_log("ATkbc: AMI - unblock KBC lines P22 and P23\n"); + dev->ami_flags &= 0xfb; + return 0; - case 0xc9: - /* - * block KBC lines P22/P23 - * (disallow command D1 from changing bits 2/3 of the port) - */ - kbd_log("ATkbc: AMI - block KBC lines P22 and P23\n"); - dev->ami_flags |= 0x04; - return 0; + case 0xc9: + /* + * block KBC lines P22/P23 + * (disallow command D1 from changing bits 2/3 of the port) + */ + kbd_log("ATkbc: AMI - block KBC lines P22 and P23\n"); + dev->ami_flags |= 0x04; + return 0; - case 0xcc: - /* set KBC line P14 high */ - kbd_log("ATkbc: set KBC line P14 (input port bit 4) high\n"); - dev->input_port |= 0x10; - add_data(dev, 0x00); - return 0; - case 0xcd: - /* set KBC line P15 high */ - kbd_log("ATkbc: set KBC line P15 (input port bit 5) high\n"); - dev->input_port |= 0x20; - add_data(dev, 0x00); - return 0; + case 0xcc: + /* set KBC line P14 high */ + kbd_log("ATkbc: set KBC line P14 (input port bit 4) high\n"); + dev->input_port |= 0x10; + add_data(dev, 0x00); + return 0; + case 0xcd: + /* set KBC line P15 high */ + kbd_log("ATkbc: set KBC line P15 (input port bit 5) high\n"); + dev->input_port |= 0x20; + add_data(dev, 0x00); + return 0; - case 0xef: /* ??? - sent by AMI486 */ - kbd_log("ATkbc: ??? - sent by AMI486\n"); - return 0; + case 0xef: /* ??? - sent by AMI486 */ + kbd_log("ATkbc: ??? - sent by AMI486\n"); + return 0; } return write64_generic(dev, val); } - static uint8_t write64_ibm_mca(void *priv, uint8_t val) { - atkbd_t *dev = (atkbd_t *)priv; + atkbd_t *dev = (atkbd_t *) priv; switch (val) { - case 0xc1: /*Copy bits 0 to 3 of input port to status bits 4 to 7*/ - kbd_log("ATkbc: copy bits 0 to 3 of input port to status bits 4 to 7\n"); - dev->status &= 0x0f; - dev->status |= ((((dev->input_port & 0xfc) | 0x84) & 0x0f) << 4); - return 0; + case 0xc1: /*Copy bits 0 to 3 of input port to status bits 4 to 7*/ + kbd_log("ATkbc: copy bits 0 to 3 of input port to status bits 4 to 7\n"); + dev->status &= 0x0f; + dev->status |= ((((dev->input_port & 0xfc) | 0x84) & 0x0f) << 4); + return 0; - case 0xc2: /*Copy bits 4 to 7 of input port to status bits 4 to 7*/ - kbd_log("ATkbc: copy bits 4 to 7 of input port to status bits 4 to 7\n"); - dev->status &= 0x0f; - dev->status |= (((dev->input_port & 0xfc) | 0x84) & 0xf0); - return 0; + case 0xc2: /*Copy bits 4 to 7 of input port to status bits 4 to 7*/ + kbd_log("ATkbc: copy bits 4 to 7 of input port to status bits 4 to 7\n"); + dev->status &= 0x0f; + dev->status |= (((dev->input_port & 0xfc) | 0x84) & 0xf0); + return 0; - case 0xaf: - kbd_log("ATkbc: bad KBC command AF\n"); - return 1; + case 0xaf: + kbd_log("ATkbc: bad KBC command AF\n"); + return 1; - case 0xf0: case 0xf1: case 0xf2: case 0xf3: - case 0xf4: case 0xf5: case 0xf6: case 0xf7: - case 0xf8: case 0xf9: case 0xfa: case 0xfb: - case 0xfc: case 0xfd: case 0xfe: case 0xff: - kbd_log("ATkbc: pulse: %01X\n", (val & 0x03) | 0x0c); - pulse_output(dev, (val & 0x03) | 0x0c); - return 0; + case 0xf0: + case 0xf1: + case 0xf2: + case 0xf3: + case 0xf4: + case 0xf5: + case 0xf6: + case 0xf7: + case 0xf8: + case 0xf9: + case 0xfa: + case 0xfb: + case 0xfc: + case 0xfd: + case 0xfe: + case 0xff: + kbd_log("ATkbc: pulse: %01X\n", (val & 0x03) | 0x0c); + pulse_output(dev, (val & 0x03) | 0x0c); + return 0; } return write64_generic(dev, val); } - static uint8_t write60_quadtel(void *priv, uint8_t val) { - atkbd_t *dev = (atkbd_t *)priv; + atkbd_t *dev = (atkbd_t *) priv; - switch(dev->command) { - case 0xcf: /*??? - sent by MegaPC BIOS*/ - kbd_log("ATkbc: ??? - sent by MegaPC BIOS\n"); - return 0; + switch (dev->command) { + case 0xcf: /*??? - sent by MegaPC BIOS*/ + kbd_log("ATkbc: ??? - sent by MegaPC BIOS\n"); + return 0; } return 1; @@ -1621,607 +1736,672 @@ write60_quadtel(void *priv, uint8_t val) static uint8_t write64_olivetti(void *priv, uint8_t val) { - atkbd_t *dev = (atkbd_t *)priv; + atkbd_t *dev = (atkbd_t *) priv; switch (val) { - case 0x80: /* Olivetti-specific command */ - /* - * bit 7: bus expansion board present (M300) / keyboard unlocked (M290) - * bits 4-6: ??? - * bit 3: fast ram check (if inactive keyboard works erratically) - * bit 2: keyboard fuse present - * bits 0-1: ??? - */ - add_to_kbc_queue_front(dev, (0x0c | ((is386) ? 0x00 : 0x80)) & 0xdf, 0, 0x00); - dev->input_port = ((dev->input_port + 1) & 3) | - (dev->input_port & 0xfc); - return 0; - } - - return write64_generic(dev, val); -} - - -static uint8_t -write64_quadtel(void *priv, uint8_t val) -{ - atkbd_t *dev = (atkbd_t *)priv; - - switch (val) { - case 0xaf: - kbd_log("ATkbc: bad KBC command AF\n"); - return 1; - - case 0xcf: /*??? - sent by MegaPC BIOS*/ - kbd_log("ATkbc: ??? - sent by MegaPC BIOS\n"); - dev->want60 = 1; - return 0; + case 0x80: /* Olivetti-specific command */ + /* + * bit 7: bus expansion board present (M300) / keyboard unlocked (M290) + * bits 4-6: ??? + * bit 3: fast ram check (if inactive keyboard works erratically) + * bit 2: keyboard fuse present + * bits 0-1: ??? + */ + add_to_kbc_queue_front(dev, (0x0c | ((is386) ? 0x00 : 0x80)) & 0xdf, 0, 0x00); + dev->input_port = ((dev->input_port + 1) & 3) | (dev->input_port & 0xfc); + return 0; } return write64_generic(dev, val); } +static uint8_t +write64_quadtel(void *priv, uint8_t val) +{ + atkbd_t *dev = (atkbd_t *) priv; + + switch (val) { + case 0xaf: + kbd_log("ATkbc: bad KBC command AF\n"); + return 1; + + case 0xcf: /*??? - sent by MegaPC BIOS*/ + kbd_log("ATkbc: ??? - sent by MegaPC BIOS\n"); + dev->want60 = 1; + return 0; + } + + return write64_generic(dev, val); +} static uint8_t write60_toshiba(void *priv, uint8_t val) { - atkbd_t *dev = (atkbd_t *)priv; + atkbd_t *dev = (atkbd_t *) priv; - switch(dev->command) { - case 0xb6: /* T3100e - set color/mono switch */ - kbd_log("ATkbc: T3100e - set color/mono switch\n"); - t3100e_mono_set(val); - return 0; + switch (dev->command) { + case 0xb6: /* T3100e - set color/mono switch */ + kbd_log("ATkbc: T3100e - set color/mono switch\n"); + t3100e_mono_set(val); + return 0; } return 1; } - static uint8_t write64_toshiba(void *priv, uint8_t val) { - atkbd_t *dev = (atkbd_t *)priv; + atkbd_t *dev = (atkbd_t *) priv; switch (val) { - case 0xaf: - kbd_log("ATkbc: bad KBC command AF\n"); - return 1; + case 0xaf: + kbd_log("ATkbc: bad KBC command AF\n"); + return 1; - case 0xb0: /* T3100e: Turbo on */ - kbd_log("ATkbc: T3100e: Turbo on\n"); - t3100e_turbo_set(1); - return 0; + case 0xb0: /* T3100e: Turbo on */ + kbd_log("ATkbc: T3100e: Turbo on\n"); + t3100e_turbo_set(1); + return 0; - case 0xb1: /* T3100e: Turbo off */ - kbd_log("ATkbc: T3100e: Turbo off\n"); - t3100e_turbo_set(0); - return 0; + case 0xb1: /* T3100e: Turbo off */ + kbd_log("ATkbc: T3100e: Turbo off\n"); + t3100e_turbo_set(0); + return 0; - case 0xb2: /* T3100e: Select external display */ - kbd_log("ATkbc: T3100e: Select external display\n"); - t3100e_display_set(0x00); - return 0; + case 0xb2: /* T3100e: Select external display */ + kbd_log("ATkbc: T3100e: Select external display\n"); + t3100e_display_set(0x00); + return 0; - case 0xb3: /* T3100e: Select internal display */ - kbd_log("ATkbc: T3100e: Select internal display\n"); - t3100e_display_set(0x01); - return 0; + case 0xb3: /* T3100e: Select internal display */ + kbd_log("ATkbc: T3100e: Select internal display\n"); + t3100e_display_set(0x01); + return 0; - case 0xb4: /* T3100e: Get configuration / status */ - kbd_log("ATkbc: T3100e: Get configuration / status\n"); - add_data(dev, t3100e_config_get()); - return 0; + case 0xb4: /* T3100e: Get configuration / status */ + kbd_log("ATkbc: T3100e: Get configuration / status\n"); + add_data(dev, t3100e_config_get()); + return 0; - case 0xb5: /* T3100e: Get colour / mono byte */ - kbd_log("ATkbc: T3100e: Get colour / mono byte\n"); - add_data(dev, t3100e_mono_get()); - return 0; + case 0xb5: /* T3100e: Get colour / mono byte */ + kbd_log("ATkbc: T3100e: Get colour / mono byte\n"); + add_data(dev, t3100e_mono_get()); + return 0; - case 0xb6: /* T3100e: Set colour / mono byte */ - kbd_log("ATkbc: T3100e: Set colour / mono byte\n"); - dev->want60 = 1; - return 0; + case 0xb6: /* T3100e: Set colour / mono byte */ + kbd_log("ATkbc: T3100e: Set colour / mono byte\n"); + dev->want60 = 1; + return 0; - case 0xb7: /* T3100e: Emulate PS/2 keyboard */ - case 0xb8: /* T3100e: Emulate AT keyboard */ - dev->flags &= ~KBC_TYPE_MASK; - if (val == 0xb7) { - kbd_log("ATkbc: T3100e: Emulate PS/2 keyboard\n"); - dev->flags |= KBC_TYPE_PS2_NOREF; - } else { - kbd_log("ATkbc: T3100e: Emulate AT keyboard\n"); - dev->flags |= KBC_TYPE_ISA; - } - return 0; + case 0xb7: /* T3100e: Emulate PS/2 keyboard */ + case 0xb8: /* T3100e: Emulate AT keyboard */ + dev->flags &= ~KBC_TYPE_MASK; + if (val == 0xb7) { + kbd_log("ATkbc: T3100e: Emulate PS/2 keyboard\n"); + dev->flags |= KBC_TYPE_PS2_NOREF; + } else { + kbd_log("ATkbc: T3100e: Emulate AT keyboard\n"); + dev->flags |= KBC_TYPE_ISA; + } + return 0; - case 0xbb: /* T3100e: Read 'Fn' key. - Return it for right Ctrl and right Alt; on the real - T3100e, these keystrokes could only be generated - using 'Fn'. */ - kbd_log("ATkbc: T3100e: Read 'Fn' key\n"); - if (keyboard_recv(0xb8) || /* Right Alt */ - keyboard_recv(0x9d)) /* Right Ctrl */ - add_data(dev, 0x04); - else add_data(dev, 0x00); - return 0; + case 0xbb: /* T3100e: Read 'Fn' key. + Return it for right Ctrl and right Alt; on the real + T3100e, these keystrokes could only be generated + using 'Fn'. */ + kbd_log("ATkbc: T3100e: Read 'Fn' key\n"); + if (keyboard_recv(0xb8) || /* Right Alt */ + keyboard_recv(0x9d)) /* Right Ctrl */ + add_data(dev, 0x04); + else + add_data(dev, 0x00); + return 0; - case 0xbc: /* T3100e: Reset Fn+Key notification */ - kbd_log("ATkbc: T3100e: Reset Fn+Key notification\n"); - t3100e_notify_set(0x00); - return 0; + case 0xbc: /* T3100e: Reset Fn+Key notification */ + kbd_log("ATkbc: T3100e: Reset Fn+Key notification\n"); + t3100e_notify_set(0x00); + return 0; - case 0xc0: /*Read input port*/ - kbd_log("ATkbc: read input port\n"); - - /* The T3100e returns all bits set except bit 6 which - * is set by t3100e_mono_set() */ - dev->input_port = (t3100e_mono_get() & 1) ? 0xff : 0xbf; - add_data(dev, dev->input_port); - return 0; + case 0xc0: /*Read input port*/ + kbd_log("ATkbc: read input port\n"); + /* The T3100e returns all bits set except bit 6 which + * is set by t3100e_mono_set() */ + dev->input_port = (t3100e_mono_get() & 1) ? 0xff : 0xbf; + add_data(dev, dev->input_port); + return 0; } return write64_generic(dev, val); } - static void kbd_write(uint16_t port, uint8_t val, void *priv) { - atkbd_t *dev = (atkbd_t *)priv; - int i = 0, bad = 1; - uint8_t mask, kbc_ven = dev->flags & KBC_VEN_MASK; + atkbd_t *dev = (atkbd_t *) priv; + int i = 0, bad = 1; + uint8_t mask, kbc_ven = dev->flags & KBC_VEN_MASK; switch (port) { - case 0x60: - dev->status &= ~STAT_CD; - if (dev->want60) { - /* Write data to controller. */ - dev->want60 = 0; + case 0x60: + dev->status &= ~STAT_CD; + if (dev->want60) { + /* Write data to controller. */ + dev->want60 = 0; - switch (dev->command) { - case 0x60: case 0x61: case 0x62: case 0x63: - case 0x64: case 0x65: case 0x66: case 0x67: - case 0x68: case 0x69: case 0x6a: case 0x6b: - case 0x6c: case 0x6d: case 0x6e: case 0x6f: - case 0x70: case 0x71: case 0x72: case 0x73: - case 0x74: case 0x75: case 0x76: case 0x77: - case 0x78: case 0x79: case 0x7a: case 0x7b: - case 0x7c: case 0x7d: case 0x7e: case 0x7f: - dev->mem[dev->command & 0x1f] = val; - if (dev->command == 0x60) - write_cmd(dev, val); - break; + switch (dev->command) { + case 0x60: + case 0x61: + case 0x62: + case 0x63: + case 0x64: + case 0x65: + case 0x66: + case 0x67: + case 0x68: + case 0x69: + case 0x6a: + case 0x6b: + case 0x6c: + case 0x6d: + case 0x6e: + case 0x6f: + case 0x70: + case 0x71: + case 0x72: + case 0x73: + case 0x74: + case 0x75: + case 0x76: + case 0x77: + case 0x78: + case 0x79: + case 0x7a: + case 0x7b: + case 0x7c: + case 0x7d: + case 0x7e: + case 0x7f: + dev->mem[dev->command & 0x1f] = val; + if (dev->command == 0x60) + write_cmd(dev, val); + break; - case 0xd1: /* write output port */ - kbd_log("ATkbc: write output port\n"); - /* Bit 2 of AMI flags is P22-P23 blocked (1 = yes, 0 = no), - discovered by reverse-engineering the AOpeN Vi15G BIOS. */ - if (dev->ami_flags & 0x04) { - /*If keyboard controller lines P22-P23 are blocked, - we force them to remain unchanged.*/ - val &= ~0x0c; - val |= (dev->output_port & 0x0c); - } - write_output(dev, val); - break; + case 0xd1: /* write output port */ + kbd_log("ATkbc: write output port\n"); + /* Bit 2 of AMI flags is P22-P23 blocked (1 = yes, 0 = no), + discovered by reverse-engineering the AOpeN Vi15G BIOS. */ + if (dev->ami_flags & 0x04) { + /*If keyboard controller lines P22-P23 are blocked, + we force them to remain unchanged.*/ + val &= ~0x0c; + val |= (dev->output_port & 0x0c); + } + write_output(dev, val); + break; - case 0xd2: /* write to keyboard output buffer */ - kbd_log("ATkbc: write to keyboard output buffer\n"); - add_to_kbc_queue_front(dev, val, 0, 0x00); - break; + case 0xd2: /* write to keyboard output buffer */ + kbd_log("ATkbc: write to keyboard output buffer\n"); + add_to_kbc_queue_front(dev, val, 0, 0x00); + break; - case 0xd3: /* write to mouse output buffer */ - kbd_log("ATkbc: write to mouse output buffer\n"); - if (mouse_write && ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF)) - keyboard_at_adddata_mouse(val); - break; + case 0xd3: /* write to mouse output buffer */ + kbd_log("ATkbc: write to mouse output buffer\n"); + if (mouse_write && ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF)) + keyboard_at_adddata_mouse(val); + break; - case 0xd4: /* write to mouse */ - kbd_log("ATkbc: write to mouse (%02X)\n", val); + case 0xd4: /* write to mouse */ + kbd_log("ATkbc: write to mouse (%02X)\n", val); - if (val == 0xbb) - break; + if (val == 0xbb) + break; - if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) { - set_enable_mouse(dev, 1); - if (mouse_write) - mouse_write(val, mouse_p); - else - add_to_kbc_queue_front(dev, 0xfe, 2, 0x40); - } - break; + if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) { + set_enable_mouse(dev, 1); + if (mouse_write) + mouse_write(val, mouse_p); + else + add_to_kbc_queue_front(dev, 0xfe, 2, 0x40); + } + break; - default: - /* - * Run the vendor-specific handler - * if we have one. Otherwise, or if - * it returns an error, log a bad - * controller command. - */ - if (dev->write60_ven) - bad = dev->write60_ven(dev, val); + default: + /* + * Run the vendor-specific handler + * if we have one. Otherwise, or if + * it returns an error, log a bad + * controller command. + */ + if (dev->write60_ven) + bad = dev->write60_ven(dev, val); - if (bad) { - kbd_log("ATkbc: bad controller command %02x data %02x\n", dev->command, val); - add_data_kbd(0xfe); - } - } - } else { - /* Write data to keyboard. */ - dev->mem[0] &= ~0x10; + if (bad) { + kbd_log("ATkbc: bad controller command %02x data %02x\n", dev->command, val); + add_data_kbd(0xfe); + } + } + } else { + /* Write data to keyboard. */ + dev->mem[0] &= ~0x10; - if (dev->key_wantdata) { - dev->key_wantdata = 0; + if (dev->key_wantdata) { + dev->key_wantdata = 0; - /* - * Several system BIOSes and OS device drivers - * mess up with this, and repeat the command - * code many times. Fun! - */ - if (val == dev->key_command) { - /* Respond NAK and ignore it. */ - add_data_kbd(0xfe); - dev->key_command = 0x00; - break; - } + /* + * Several system BIOSes and OS device drivers + * mess up with this, and repeat the command + * code many times. Fun! + */ + if (val == dev->key_command) { + /* Respond NAK and ignore it. */ + add_data_kbd(0xfe); + dev->key_command = 0x00; + break; + } - switch (dev->key_command) { - case 0xed: /* set/reset LEDs */ - add_data_kbd_direct(dev, 0xfa); - kbd_log("ATkbd: set LEDs [%02x]\n", val); - break; + switch (dev->key_command) { + case 0xed: /* set/reset LEDs */ + add_data_kbd_direct(dev, 0xfa); + kbd_log("ATkbd: set LEDs [%02x]\n", val); + break; - case 0xf0: /* get/set scancode set */ - add_data_kbd_direct(dev, 0xfa); - if (val == 0) { - kbd_log("Get scan code set: %02X\n", keyboard_mode & 3); - add_data_kbd_direct(dev, keyboard_mode & 3); - } else { - if ((val <= 3) && (val != 1)) { - keyboard_mode &= 0xfc; - keyboard_mode |= (val & 3); - kbd_log("Scan code set now: %02X\n", val); - } - set_scancode_map(dev); - } - break; + case 0xf0: /* get/set scancode set */ + add_data_kbd_direct(dev, 0xfa); + if (val == 0) { + kbd_log("Get scan code set: %02X\n", keyboard_mode & 3); + add_data_kbd_direct(dev, keyboard_mode & 3); + } else { + if ((val <= 3) && (val != 1)) { + keyboard_mode &= 0xfc; + keyboard_mode |= (val & 3); + kbd_log("Scan code set now: %02X\n", val); + } + set_scancode_map(dev); + } + break; - case 0xf3: /* set typematic rate/delay */ - add_data_kbd_direct(dev, 0xfa); - break; + case 0xf3: /* set typematic rate/delay */ + add_data_kbd_direct(dev, 0xfa); + break; - default: - kbd_log("ATkbd: bad keyboard 0060 write %02X command %02X\n", val, dev->key_command); - add_data_kbd_direct(dev, 0xfe); - break; - } + default: + kbd_log("ATkbd: bad keyboard 0060 write %02X command %02X\n", val, dev->key_command); + add_data_kbd_direct(dev, 0xfe); + break; + } - /* Keyboard command is now done. */ - dev->key_command = 0x00; - } else { - /* No keyboard command in progress. */ - dev->key_command = 0x00; + /* Keyboard command is now done. */ + dev->key_command = 0x00; + } else { + /* No keyboard command in progress. */ + dev->key_command = 0x00; - set_enable_kbd(dev, 1); + set_enable_kbd(dev, 1); - switch (val) { - case 0x00: - kbd_log("ATkbd: command 00\n"); - add_data_kbd_direct(dev, 0xfa); - break; + switch (val) { + case 0x00: + kbd_log("ATkbd: command 00\n"); + add_data_kbd_direct(dev, 0xfa); + break; - case 0x05: /*??? - sent by NT 4.0*/ - kbd_log("ATkbd: command 05 (NT 4.0)\n"); - add_data_kbd_direct(dev, 0xfe); - break; + case 0x05: /*??? - sent by NT 4.0*/ + kbd_log("ATkbd: command 05 (NT 4.0)\n"); + add_data_kbd_direct(dev, 0xfe); + break; - /* Sent by Pentium-era AMI BIOS'es.*/ - case 0x71: case 0x82: - kbd_log("ATkbd: Pentium-era AMI BIOS command %02X\n", val); - break; + /* Sent by Pentium-era AMI BIOS'es.*/ + case 0x71: + case 0x82: + kbd_log("ATkbd: Pentium-era AMI BIOS command %02X\n", val); + break; - case 0xed: /* set/reset LEDs */ - kbd_log("ATkbd: set/reset leds\n"); - add_data_kbd_direct(dev, 0xfa); + case 0xed: /* set/reset LEDs */ + kbd_log("ATkbd: set/reset leds\n"); + add_data_kbd_direct(dev, 0xfa); - dev->key_wantdata = 1; - break; + dev->key_wantdata = 1; + break; - case 0xee: /* diagnostic echo */ - kbd_log("ATkbd: ECHO\n"); - add_data_kbd_direct(dev, 0xee); - break; + case 0xee: /* diagnostic echo */ + kbd_log("ATkbd: ECHO\n"); + add_data_kbd_direct(dev, 0xee); + break; - case 0xef: /* NOP (reserved for future use) */ - kbd_log("ATkbd: NOP\n"); - break; + case 0xef: /* NOP (reserved for future use) */ + kbd_log("ATkbd: NOP\n"); + break; - case 0xf0: /* get/set scan code set */ - kbd_log("ATkbd: scan code set\n"); - add_data_kbd_direct(dev, 0xfa); - dev->key_wantdata = 1; - break; + case 0xf0: /* get/set scan code set */ + kbd_log("ATkbd: scan code set\n"); + add_data_kbd_direct(dev, 0xfa); + dev->key_wantdata = 1; + break; - case 0xf2: /* read ID */ - /* Fixed as translation will be done in add_data_kbd(). */ - kbd_log("ATkbd: read keyboard id\n"); - /* TODO: After keyboard type selection is implemented, make this - return the correct keyboard ID for the selected type. */ - add_data_kbd_direct(dev, 0xfa); - add_data_kbd_direct(dev, 0xab); - add_data_kbd_direct(dev, 0x83); - break; + case 0xf2: /* read ID */ + /* Fixed as translation will be done in add_data_kbd(). */ + kbd_log("ATkbd: read keyboard id\n"); + /* TODO: After keyboard type selection is implemented, make this + return the correct keyboard ID for the selected type. */ + add_data_kbd_direct(dev, 0xfa); + add_data_kbd_direct(dev, 0xab); + add_data_kbd_direct(dev, 0x83); + break; - case 0xf3: /* set typematic rate/delay */ - kbd_log("ATkbd: set typematic rate/delay\n"); - add_data_kbd_direct(dev, 0xfa); - dev->key_wantdata = 1; - break; + case 0xf3: /* set typematic rate/delay */ + kbd_log("ATkbd: set typematic rate/delay\n"); + add_data_kbd_direct(dev, 0xfa); + dev->key_wantdata = 1; + break; - case 0xf4: /* enable keyboard */ - kbd_log("ATkbd: enable keyboard\n"); - add_data_kbd_direct(dev, 0xfa); - keyboard_scan = 1; - break; + case 0xf4: /* enable keyboard */ + kbd_log("ATkbd: enable keyboard\n"); + add_data_kbd_direct(dev, 0xfa); + keyboard_scan = 1; + break; - case 0xf5: /* set defaults and disable keyboard */ - case 0xf6: /* set defaults */ - kbd_log("ATkbd: set defaults%s\n", (val == 0xf6) ? "" : " and disable keyboard"); - keyboard_scan = (val == 0xf6); - kbd_log("val = %02X, keyboard_scan = %i, dev->mem[0] = %02X\n", - val, keyboard_scan, dev->mem[0]); - add_data_kbd_direct(dev, 0xfa); + case 0xf5: /* set defaults and disable keyboard */ + case 0xf6: /* set defaults */ + kbd_log("ATkbd: set defaults%s\n", (val == 0xf6) ? "" : " and disable keyboard"); + keyboard_scan = (val == 0xf6); + kbd_log("val = %02X, keyboard_scan = %i, dev->mem[0] = %02X\n", + val, keyboard_scan, dev->mem[0]); + add_data_kbd_direct(dev, 0xfa); - keyboard_set3_all_break = 0; - keyboard_set3_all_repeat = 0; - memset(keyboard_set3_flags, 0, 512); - keyboard_mode = (keyboard_mode & 0xfc) | 0x02; - set_scancode_map(dev); - break; + keyboard_set3_all_break = 0; + keyboard_set3_all_repeat = 0; + memset(keyboard_set3_flags, 0, 512); + keyboard_mode = (keyboard_mode & 0xfc) | 0x02; + set_scancode_map(dev); + break; - case 0xf7: /* set all keys to repeat */ - kbd_log("ATkbd: set all keys to repeat\n"); - add_data_kbd_direct(dev, 0xfa); - keyboard_set3_all_break = 1; - break; + case 0xf7: /* set all keys to repeat */ + kbd_log("ATkbd: set all keys to repeat\n"); + add_data_kbd_direct(dev, 0xfa); + keyboard_set3_all_break = 1; + break; - case 0xf8: /* set all keys to give make/break codes */ - kbd_log("ATkbd: set all keys to give make/break codes\n"); - add_data_kbd_direct(dev, 0xfa); - keyboard_set3_all_break = 1; - break; + case 0xf8: /* set all keys to give make/break codes */ + kbd_log("ATkbd: set all keys to give make/break codes\n"); + add_data_kbd_direct(dev, 0xfa); + keyboard_set3_all_break = 1; + break; - case 0xf9: /* set all keys to give make codes only */ - kbd_log("ATkbd: set all keys to give make codes only\n"); - add_data_kbd_direct(dev, 0xfa); - keyboard_set3_all_break = 0; - break; + case 0xf9: /* set all keys to give make codes only */ + kbd_log("ATkbd: set all keys to give make codes only\n"); + add_data_kbd_direct(dev, 0xfa); + keyboard_set3_all_break = 0; + break; - case 0xfa: /* set all keys to repeat and give make/break codes */ - kbd_log("ATkbd: set all keys to repeat and give make/break codes\n"); - add_data_kbd_direct(dev, 0xfa); - keyboard_set3_all_repeat = 1; - keyboard_set3_all_break = 1; - break; + case 0xfa: /* set all keys to repeat and give make/break codes */ + kbd_log("ATkbd: set all keys to repeat and give make/break codes\n"); + add_data_kbd_direct(dev, 0xfa); + keyboard_set3_all_repeat = 1; + keyboard_set3_all_break = 1; + break; - case 0xfe: /* resend last scan code */ - kbd_log("ATkbd: reset last scan code\n"); - add_data_kbd_raw(dev, kbd_last_scan_code); - break; + case 0xfe: /* resend last scan code */ + kbd_log("ATkbd: reset last scan code\n"); + add_data_kbd_raw(dev, kbd_last_scan_code); + break; - case 0xff: /* reset */ - kbd_log("ATkbd: kbd reset\n"); - kbc_queue_reset(1); - kbd_last_scan_code = 0x00; - add_data_kbd_direct(dev, 0xfa); + case 0xff: /* reset */ + kbd_log("ATkbd: kbd reset\n"); + kbc_queue_reset(1); + kbd_last_scan_code = 0x00; + add_data_kbd_direct(dev, 0xfa); - /* Set scan code set to 2. */ - keyboard_mode = (keyboard_mode & 0xfc) | 0x02; - set_scancode_map(dev); + /* Set scan code set to 2. */ + keyboard_mode = (keyboard_mode & 0xfc) | 0x02; + set_scancode_map(dev); - dev->reset_delay = RESET_DELAY_TIME; - break; + dev->reset_delay = RESET_DELAY_TIME; + break; - default: - kbd_log("ATkbd: bad keyboard command %02X\n", val); - add_data_kbd_direct(dev, 0xfe); - } + default: + kbd_log("ATkbd: bad keyboard command %02X\n", val); + add_data_kbd_direct(dev, 0xfe); + } - /* If command needs data, remember command. */ - if (dev->key_wantdata == 1) - dev->key_command = val; - } - } - break; + /* If command needs data, remember command. */ + if (dev->key_wantdata == 1) + dev->key_command = val; + } + } + break; - case 0x64: - /* Controller command. */ - dev->want60 = 0; - dev->status |= STAT_CD; + case 0x64: + /* Controller command. */ + dev->want60 = 0; + dev->status |= STAT_CD; - switch (val) { - /* Read data from KBC memory. */ - case 0x20: case 0x21: case 0x22: case 0x23: - case 0x24: case 0x25: case 0x26: case 0x27: - case 0x28: case 0x29: case 0x2a: case 0x2b: - case 0x2c: case 0x2d: case 0x2e: case 0x2f: - case 0x30: case 0x31: case 0x32: case 0x33: - case 0x34: case 0x35: case 0x36: case 0x37: - case 0x38: case 0x39: case 0x3a: case 0x3b: - case 0x3c: case 0x3d: case 0x3e: case 0x3f: - add_data(dev, dev->mem[val & 0x1f]); - break; + switch (val) { + /* Read data from KBC memory. */ + case 0x20: + case 0x21: + case 0x22: + case 0x23: + case 0x24: + case 0x25: + case 0x26: + case 0x27: + case 0x28: + case 0x29: + case 0x2a: + case 0x2b: + case 0x2c: + case 0x2d: + case 0x2e: + case 0x2f: + case 0x30: + case 0x31: + case 0x32: + case 0x33: + case 0x34: + case 0x35: + case 0x36: + case 0x37: + case 0x38: + case 0x39: + case 0x3a: + case 0x3b: + case 0x3c: + case 0x3d: + case 0x3e: + case 0x3f: + add_data(dev, dev->mem[val & 0x1f]); + break; - /* Write data to KBC memory. */ - case 0x60: case 0x61: case 0x62: case 0x63: - case 0x64: case 0x65: case 0x66: case 0x67: - case 0x68: case 0x69: case 0x6a: case 0x6b: - case 0x6c: case 0x6d: case 0x6e: case 0x6f: - case 0x70: case 0x71: case 0x72: case 0x73: - case 0x74: case 0x75: case 0x76: case 0x77: - case 0x78: case 0x79: case 0x7a: case 0x7b: - case 0x7c: case 0x7d: case 0x7e: case 0x7f: - dev->want60 = 1; - break; + /* Write data to KBC memory. */ + case 0x60: + case 0x61: + case 0x62: + case 0x63: + case 0x64: + case 0x65: + case 0x66: + case 0x67: + case 0x68: + case 0x69: + case 0x6a: + case 0x6b: + case 0x6c: + case 0x6d: + case 0x6e: + case 0x6f: + case 0x70: + case 0x71: + case 0x72: + case 0x73: + case 0x74: + case 0x75: + case 0x76: + case 0x77: + case 0x78: + case 0x79: + case 0x7a: + case 0x7b: + case 0x7c: + case 0x7d: + case 0x7e: + case 0x7f: + dev->want60 = 1; + break; - case 0xaa: /* self-test */ - kbd_log("ATkbc: self-test\n"); - if ((kbc_ven == KBC_VEN_TOSHIBA) || (kbc_ven == KBC_VEN_SAMSUNG)) - dev->status |= STAT_IFULL; - write_output(dev, ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) ? 0x4b : 0xcf); + case 0xaa: /* self-test */ + kbd_log("ATkbc: self-test\n"); + if ((kbc_ven == KBC_VEN_TOSHIBA) || (kbc_ven == KBC_VEN_SAMSUNG)) + dev->status |= STAT_IFULL; + write_output(dev, ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) ? 0x4b : 0xcf); - /* Always reinitialize all queues - the real hardware pulls keyboard and mouse - clocks high, which stops keyboard scanning. */ - kbd_log("ATkbc: self-test reinitialization\n"); - dev->out_new = dev->out_delayed = -1; - for (i = 0; i < 3; i++) - kbc_queue_reset(i); - kbd_last_scan_code = 0x00; - dev->status &= ~STAT_OFULL; - dev->last_irq = dev->old_last_irq = 0; + /* Always reinitialize all queues - the real hardware pulls keyboard and mouse + clocks high, which stops keyboard scanning. */ + kbd_log("ATkbc: self-test reinitialization\n"); + dev->out_new = dev->out_delayed = -1; + for (i = 0; i < 3; i++) + kbc_queue_reset(i); + kbd_last_scan_code = 0x00; + dev->status &= ~STAT_OFULL; + dev->last_irq = dev->old_last_irq = 0; - if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) - write_cmd(dev, 0x30 | STAT_SYSFLAG); - else - write_cmd(dev, 0x10 | STAT_SYSFLAG); - add_data(dev, 0x55); - break; + if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) + write_cmd(dev, 0x30 | STAT_SYSFLAG); + else + write_cmd(dev, 0x10 | STAT_SYSFLAG); + add_data(dev, 0x55); + break; - case 0xab: /* interface test */ - kbd_log("ATkbc: interface test\n"); - add_data(dev, 0x00); /*no error*/ - break; + case 0xab: /* interface test */ + kbd_log("ATkbc: interface test\n"); + add_data(dev, 0x00); /*no error*/ + break; - case 0xac: /* diagnostic dump */ - kbd_log("ATkbc: diagnostic dump\n"); - for (i = 0; i < 16; i++) - add_data(dev, dev->mem[i]); - add_data(dev, (dev->input_port & 0xf0) | 0x80); - add_data(dev, dev->output_port); - add_data(dev, dev->status); - break; + case 0xac: /* diagnostic dump */ + kbd_log("ATkbc: diagnostic dump\n"); + for (i = 0; i < 16; i++) + add_data(dev, dev->mem[i]); + add_data(dev, (dev->input_port & 0xf0) | 0x80); + add_data(dev, dev->output_port); + add_data(dev, dev->status); + break; - case 0xad: /* disable keyboard */ - kbd_log("ATkbc: disable keyboard\n"); - set_enable_kbd(dev, 0); - break; + case 0xad: /* disable keyboard */ + kbd_log("ATkbc: disable keyboard\n"); + set_enable_kbd(dev, 0); + break; - case 0xae: /* enable keyboard */ - kbd_log("ATkbc: enable keyboard\n"); - set_enable_kbd(dev, 1); - break; + case 0xae: /* enable keyboard */ + kbd_log("ATkbc: enable keyboard\n"); + set_enable_kbd(dev, 1); + break; - case 0xca: /* read keyboard mode */ - kbd_log("ATkbc: AMI - read keyboard mode\n"); - add_data(dev, dev->ami_flags); - break; + case 0xca: /* read keyboard mode */ + kbd_log("ATkbc: AMI - read keyboard mode\n"); + add_data(dev, dev->ami_flags); + break; - case 0xcb: /* set keyboard mode */ - kbd_log("ATkbc: AMI - set keyboard mode\n"); - dev->want60 = 1; - break; + case 0xcb: /* set keyboard mode */ + kbd_log("ATkbc: AMI - set keyboard mode\n"); + dev->want60 = 1; + break; - case 0xd0: /* read output port */ - kbd_log("ATkbc: read output port\n"); - mask = 0xff; - if ((kbc_ven != KBC_VEN_OLIVETTI) && ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) && (dev->mem[0] & 0x10)) - mask &= 0xbf; - add_to_kbc_queue_front(dev, dev->output_port & mask, 0, 0x00); - break; + case 0xd0: /* read output port */ + kbd_log("ATkbc: read output port\n"); + mask = 0xff; + if ((kbc_ven != KBC_VEN_OLIVETTI) && ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) && (dev->mem[0] & 0x10)) + mask &= 0xbf; + add_to_kbc_queue_front(dev, dev->output_port & mask, 0, 0x00); + break; - case 0xd1: /* write output port */ - kbd_log("ATkbc: write output port\n"); - dev->want60 = 1; - break; + case 0xd1: /* write output port */ + kbd_log("ATkbc: write output port\n"); + dev->want60 = 1; + break; - case 0xd2: /* write keyboard output buffer */ - kbd_log("ATkbc: write keyboard output buffer\n"); - dev->want60 = 1; - break; + case 0xd2: /* write keyboard output buffer */ + kbd_log("ATkbc: write keyboard output buffer\n"); + dev->want60 = 1; + break; - case 0xdd: /* disable A20 address line */ - case 0xdf: /* enable A20 address line */ - kbd_log("ATkbc: %sable A20\n", (val == 0xdd) ? "dis": "en"); - write_output(dev, (dev->output_port & 0xfd) | (val & 0x02)); - break; + case 0xdd: /* disable A20 address line */ + case 0xdf: /* enable A20 address line */ + kbd_log("ATkbc: %sable A20\n", (val == 0xdd) ? "dis" : "en"); + write_output(dev, (dev->output_port & 0xfd) | (val & 0x02)); + break; - case 0xe0: /* read test inputs */ - kbd_log("ATkbc: read test inputs\n"); - add_data(dev, 0x00); - break; + case 0xe0: /* read test inputs */ + kbd_log("ATkbc: read test inputs\n"); + add_data(dev, 0x00); + break; - default: - /* - * Unrecognized controller command. - * - * If we have a vendor-specific handler, run - * that. Otherwise, or if that handler fails, - * log a bad command. - */ - if (dev->write64_ven) - bad = dev->write64_ven(dev, val); + default: + /* + * Unrecognized controller command. + * + * If we have a vendor-specific handler, run + * that. Otherwise, or if that handler fails, + * log a bad command. + */ + if (dev->write64_ven) + bad = dev->write64_ven(dev, val); - kbd_log(bad ? "ATkbc: bad controller command %02X\n" : "", val); - } + kbd_log(bad ? "ATkbc: bad controller command %02X\n" : "", val); + } - /* If the command needs data, remember the command. */ - if (dev->want60) - dev->command = val; - break; + /* If the command needs data, remember the command. */ + if (dev->want60) + dev->command = val; + break; } } - static uint8_t kbd_read(uint16_t port, void *priv) { - atkbd_t *dev = (atkbd_t *)priv; - uint8_t ret = 0xff; - uint8_t kbc_ven = 0x0; - kbc_ven = dev->flags & KBC_VEN_MASK; + atkbd_t *dev = (atkbd_t *) priv; + uint8_t ret = 0xff; + uint8_t kbc_ven = 0x0; + kbc_ven = dev->flags & KBC_VEN_MASK; if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) - cycles -= ISA_CYCLES(8); + cycles -= ISA_CYCLES(8); switch (port) { - case 0x60: - ret = dev->out; - dev->status &= ~STAT_OFULL; - picintc(dev->last_irq); - dev->last_irq = 0; - break; + case 0x60: + ret = dev->out; + dev->status &= ~STAT_OFULL; + picintc(dev->last_irq); + dev->last_irq = 0; + break; - case 0x64: - ret = (dev->status & 0xfb); - if (dev->mem[0] & STAT_SYSFLAG) - ret |= STAT_SYSFLAG; - /* Only clear the transmit timeout flag on non-PS/2 controllers, as on - PS/2 controller, it is the keyboard/mouse output source bit. */ - // dev->status &= ~STAT_RTIMEOUT; - if (((dev->flags & KBC_TYPE_MASK) > KBC_TYPE_PS2_NOREF) && - (kbc_ven != KBC_VEN_IBM_MCA)) - dev->status &= ~STAT_TTIMEOUT; - break; + case 0x64: + ret = (dev->status & 0xfb); + if (dev->mem[0] & STAT_SYSFLAG) + ret |= STAT_SYSFLAG; + /* Only clear the transmit timeout flag on non-PS/2 controllers, as on + PS/2 controller, it is the keyboard/mouse output source bit. */ + // dev->status &= ~STAT_RTIMEOUT; + if (((dev->flags & KBC_TYPE_MASK) > KBC_TYPE_PS2_NOREF) && (kbc_ven != KBC_VEN_IBM_MCA)) + dev->status &= ~STAT_TTIMEOUT; + break; - default: - kbd_log("ATkbc: read(%04x) invalid!\n", port); - break; + default: + kbd_log("ATkbc: read(%04x) invalid!\n", port); + break; } kbd_log((port == 0x61) ? "" : "ATkbc: read(%04X) = %02X\n", port, ret); - return(ret); + return (ret); } - static void kbd_reset(void *priv) { - atkbd_t *dev = (atkbd_t *)priv; - int i; - uint8_t kbc_ven = dev->flags & KBC_VEN_MASK; + atkbd_t *dev = (atkbd_t *) priv; + int i; + uint8_t kbc_ven = dev->flags & KBC_VEN_MASK; dev->first_write = 1; // dev->status = STAT_UNLOCKED | STAT_CD; @@ -2231,14 +2411,14 @@ kbd_reset(void *priv) dev->wantirq = 0; write_output(dev, 0xcf); dev->last_irq = dev->old_last_irq = 0; - dev->secr_phase = 0; - dev->key_wantdata = 0; + dev->secr_phase = 0; + dev->key_wantdata = 0; /* Set up the correct Video Type bits. */ if ((kbc_ven == KBC_VEN_XI8088) || (kbc_ven == KBC_VEN_ACER)) - dev->input_port = video_is_mda() ? 0xb0 : 0xf0; + dev->input_port = video_is_mda() ? 0xb0 : 0xf0; else - dev->input_port = video_is_mda() ? 0xf0 : 0xb0; + dev->input_port = video_is_mda() ? 0xf0 : 0xb0; kbd_log("ATkbc: input port = %02x\n", dev->input_port); keyboard_mode = 0x02 | (dev->mem[0] & CCB_TRANSLATE); @@ -2251,7 +2431,7 @@ kbd_reset(void *priv) dev->out_new = dev->out_delayed = -1; for (i = 0; i < 3; i++) - kbc_queue_reset(i); + kbc_queue_reset(i); kbd_last_scan_code = 0; sc_or = 0; @@ -2264,7 +2444,6 @@ kbd_reset(void *priv) dev->ami_stat |= 0x02; } - /* Reset the AT keyboard - this is needed for the PCI TRC and is done until a better solution is found. */ void @@ -2273,11 +2452,10 @@ keyboard_at_reset(void) kbd_reset(SavedKbd); } - static void kbd_close(void *priv) { - atkbd_t *dev = (atkbd_t *)priv; + atkbd_t *dev = (atkbd_t *) priv; kbd_reset(dev); @@ -2294,13 +2472,12 @@ kbd_close(void *priv) free(dev); } - static void * kbd_init(const device_t *info) { atkbd_t *dev; - dev = (atkbd_t *)malloc(sizeof(atkbd_t)); + dev = (atkbd_t *) malloc(sizeof(atkbd_t)); memset(dev, 0x00, sizeof(atkbd_t)); dev->flags = info->local; @@ -2318,350 +2495,349 @@ kbd_init(const device_t *info) dev->write60_ven = NULL; dev->write64_ven = NULL; - switch(dev->flags & KBC_VEN_MASK) { - case KBC_VEN_ACER: - case KBC_VEN_GENERIC: - case KBC_VEN_NCR: - case KBC_VEN_IBM_PS1: - case KBC_VEN_XI8088: - dev->write64_ven = write64_generic; - break; + switch (dev->flags & KBC_VEN_MASK) { + case KBC_VEN_ACER: + case KBC_VEN_GENERIC: + case KBC_VEN_NCR: + case KBC_VEN_IBM_PS1: + case KBC_VEN_XI8088: + dev->write64_ven = write64_generic; + break; - case KBC_VEN_OLIVETTI: - dev->write64_ven = write64_olivetti; - break; + case KBC_VEN_OLIVETTI: + dev->write64_ven = write64_olivetti; + break; - case KBC_VEN_AMI: - case KBC_VEN_INTEL_AMI: - case KBC_VEN_SAMSUNG: - case KBC_VEN_ALI: - dev->write60_ven = write60_ami; - dev->write64_ven = write64_ami; - break; + case KBC_VEN_AMI: + case KBC_VEN_INTEL_AMI: + case KBC_VEN_SAMSUNG: + case KBC_VEN_ALI: + dev->write60_ven = write60_ami; + dev->write64_ven = write64_ami; + break; - case KBC_VEN_IBM_MCA: - dev->write64_ven = write64_ibm_mca; - break; + case KBC_VEN_IBM_MCA: + dev->write64_ven = write64_ibm_mca; + break; - case KBC_VEN_QUADTEL: - dev->write60_ven = write60_quadtel; - dev->write64_ven = write64_quadtel; - break; + case KBC_VEN_QUADTEL: + dev->write60_ven = write60_quadtel; + dev->write64_ven = write64_quadtel; + break; - case KBC_VEN_TOSHIBA: - dev->write60_ven = write60_toshiba; - dev->write64_ven = write64_toshiba; - break; + case KBC_VEN_TOSHIBA: + dev->write60_ven = write60_toshiba; + dev->write64_ven = write64_toshiba; + break; } /* We need this, sadly. */ SavedKbd = dev; - return(dev); + return (dev); } const device_t keyboard_at_device = { - .name = "PC/AT Keyboard", + .name = "PC/AT Keyboard", .internal_name = "keyboard_at", - .flags = 0, - .local = KBC_TYPE_ISA | KBC_VEN_GENERIC, - .init = kbd_init, - .close = kbd_close, - .reset = kbd_reset, + .flags = 0, + .local = KBC_TYPE_ISA | KBC_VEN_GENERIC, + .init = kbd_init, + .close = kbd_close, + .reset = kbd_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; const device_t keyboard_at_ami_device = { - .name = "PC/AT Keyboard (AMI)", + .name = "PC/AT Keyboard (AMI)", .internal_name = "keyboard_at_ami", - .flags = 0, - .local = KBC_TYPE_ISA | KBC_VEN_AMI, - .init = kbd_init, - .close = kbd_close, - .reset = kbd_reset, + .flags = 0, + .local = KBC_TYPE_ISA | KBC_VEN_AMI, + .init = kbd_init, + .close = kbd_close, + .reset = kbd_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; const device_t keyboard_at_samsung_device = { - .name = "PC/AT Keyboard (Samsung)", + .name = "PC/AT Keyboard (Samsung)", .internal_name = "keyboard_at_samsung", - .flags = 0, - .local = KBC_TYPE_ISA | KBC_VEN_SAMSUNG, - .init = kbd_init, - .close = kbd_close, - .reset = kbd_reset, + .flags = 0, + .local = KBC_TYPE_ISA | KBC_VEN_SAMSUNG, + .init = kbd_init, + .close = kbd_close, + .reset = kbd_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; const device_t keyboard_at_toshiba_device = { - .name = "PC/AT Keyboard (Toshiba)", + .name = "PC/AT Keyboard (Toshiba)", .internal_name = "keyboard_at_toshiba", - .flags = 0, - .local = KBC_TYPE_ISA | KBC_VEN_TOSHIBA, - .init = kbd_init, - .close = kbd_close, - .reset = kbd_reset, + .flags = 0, + .local = KBC_TYPE_ISA | KBC_VEN_TOSHIBA, + .init = kbd_init, + .close = kbd_close, + .reset = kbd_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; const device_t keyboard_at_olivetti_device = { - .name = "PC/AT Keyboard (Olivetti)", + .name = "PC/AT Keyboard (Olivetti)", .internal_name = "keyboard_at_olivetti", - .flags = 0, - .local = KBC_TYPE_ISA | KBC_VEN_OLIVETTI, - .init = kbd_init, - .close = kbd_close, - .reset = kbd_reset, + .flags = 0, + .local = KBC_TYPE_ISA | KBC_VEN_OLIVETTI, + .init = kbd_init, + .close = kbd_close, + .reset = kbd_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; const device_t keyboard_at_ncr_device = { - .name = "PC/AT Keyboard (NCR)", + .name = "PC/AT Keyboard (NCR)", .internal_name = "keyboard_at_ncr", - .flags = 0, - .local = KBC_TYPE_ISA | KBC_VEN_NCR, - .init = kbd_init, - .close = kbd_close, - .reset = kbd_reset, + .flags = 0, + .local = KBC_TYPE_ISA | KBC_VEN_NCR, + .init = kbd_init, + .close = kbd_close, + .reset = kbd_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; const device_t keyboard_ps2_device = { - .name = "PS/2 Keyboard", + .name = "PS/2 Keyboard", .internal_name = "keyboard_ps2", - .flags = 0, - .local = KBC_TYPE_PS2_NOREF | KBC_VEN_GENERIC, - .init = kbd_init, - .close = kbd_close, - .reset = kbd_reset, + .flags = 0, + .local = KBC_TYPE_PS2_NOREF | KBC_VEN_GENERIC, + .init = kbd_init, + .close = kbd_close, + .reset = kbd_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; const device_t keyboard_ps2_ps2_device = { - .name = "PS/2 Keyboard", + .name = "PS/2 Keyboard", .internal_name = "keyboard_ps2_ps2", - .flags = 0, - .local = KBC_TYPE_PS2_1 | KBC_VEN_GENERIC, - .init = kbd_init, - .close = kbd_close, - .reset = kbd_reset, + .flags = 0, + .local = KBC_TYPE_PS2_1 | KBC_VEN_GENERIC, + .init = kbd_init, + .close = kbd_close, + .reset = kbd_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; const device_t keyboard_ps2_ps1_device = { - .name = "PS/2 Keyboard (IBM PS/1)", + .name = "PS/2 Keyboard (IBM PS/1)", .internal_name = "keyboard_ps2_ps1", - .flags = 0, - .local = KBC_TYPE_PS2_NOREF | KBC_VEN_IBM_PS1, - .init = kbd_init, - .close = kbd_close, - .reset = kbd_reset, + .flags = 0, + .local = KBC_TYPE_PS2_NOREF | KBC_VEN_IBM_PS1, + .init = kbd_init, + .close = kbd_close, + .reset = kbd_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; const device_t keyboard_ps2_ps1_pci_device = { - .name = "PS/2 Keyboard (IBM PS/1)", + .name = "PS/2 Keyboard (IBM PS/1)", .internal_name = "keyboard_ps2_ps1_pci", - .flags = DEVICE_PCI, - .local = KBC_TYPE_PS2_NOREF | KBC_VEN_IBM_PS1, - .init = kbd_init, - .close = kbd_close, - .reset = kbd_reset, + .flags = DEVICE_PCI, + .local = KBC_TYPE_PS2_NOREF | KBC_VEN_IBM_PS1, + .init = kbd_init, + .close = kbd_close, + .reset = kbd_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; const device_t keyboard_ps2_xi8088_device = { - .name = "PS/2 Keyboard (Xi8088)", + .name = "PS/2 Keyboard (Xi8088)", .internal_name = "keyboard_ps2_xi8088", - .flags = 0, - .local = KBC_TYPE_PS2_1 | KBC_VEN_XI8088, - .init = kbd_init, - .close = kbd_close, - .reset = kbd_reset, + .flags = 0, + .local = KBC_TYPE_PS2_1 | KBC_VEN_XI8088, + .init = kbd_init, + .close = kbd_close, + .reset = kbd_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; const device_t keyboard_ps2_ami_device = { - .name = "PS/2 Keyboard (AMI)", + .name = "PS/2 Keyboard (AMI)", .internal_name = "keyboard_ps2_ami", - .flags = 0, - .local = KBC_TYPE_PS2_NOREF | KBC_VEN_AMI, - .init = kbd_init, - .close = kbd_close, - .reset = kbd_reset, + .flags = 0, + .local = KBC_TYPE_PS2_NOREF | KBC_VEN_AMI, + .init = kbd_init, + .close = kbd_close, + .reset = kbd_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; const device_t keyboard_ps2_olivetti_device = { - .name = "PS/2 Keyboard (Olivetti)", + .name = "PS/2 Keyboard (Olivetti)", .internal_name = "keyboard_ps2_olivetti", - .flags = 0, - .local = KBC_TYPE_PS2_NOREF | KBC_VEN_OLIVETTI, - .init = kbd_init, - .close = kbd_close, - .reset = kbd_reset, + .flags = 0, + .local = KBC_TYPE_PS2_NOREF | KBC_VEN_OLIVETTI, + .init = kbd_init, + .close = kbd_close, + .reset = kbd_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; const device_t keyboard_ps2_mca_device = { - .name = "PS/2 Keyboard", + .name = "PS/2 Keyboard", .internal_name = "keyboard_ps2_mca", - .flags = 0, - .local = KBC_TYPE_PS2_1 | KBC_VEN_IBM_MCA, - .init = kbd_init, - .close = kbd_close, - .reset = kbd_reset, + .flags = 0, + .local = KBC_TYPE_PS2_1 | KBC_VEN_IBM_MCA, + .init = kbd_init, + .close = kbd_close, + .reset = kbd_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; const device_t keyboard_ps2_mca_2_device = { - .name = "PS/2 Keyboard", + .name = "PS/2 Keyboard", .internal_name = "keyboard_ps2_mca_2", - .flags = 0, - .local = KBC_TYPE_PS2_2 | KBC_VEN_IBM_MCA, - .init = kbd_init, - .close = kbd_close, - .reset = kbd_reset, + .flags = 0, + .local = KBC_TYPE_PS2_2 | KBC_VEN_IBM_MCA, + .init = kbd_init, + .close = kbd_close, + .reset = kbd_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; const device_t keyboard_ps2_quadtel_device = { - .name = "PS/2 Keyboard (Quadtel/MegaPC)", + .name = "PS/2 Keyboard (Quadtel/MegaPC)", .internal_name = "keyboard_ps2_quadtel", - .flags = 0, - .local = KBC_TYPE_PS2_NOREF | KBC_VEN_QUADTEL, - .init = kbd_init, - .close = kbd_close, - .reset = kbd_reset, + .flags = 0, + .local = KBC_TYPE_PS2_NOREF | KBC_VEN_QUADTEL, + .init = kbd_init, + .close = kbd_close, + .reset = kbd_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; const device_t keyboard_ps2_pci_device = { - .name = "PS/2 Keyboard", + .name = "PS/2 Keyboard", .internal_name = "keyboard_ps2_pci", - .flags = DEVICE_PCI, - .local = KBC_TYPE_PS2_NOREF | KBC_VEN_GENERIC, - .init = kbd_init, - .close = kbd_close, - .reset = kbd_reset, + .flags = DEVICE_PCI, + .local = KBC_TYPE_PS2_NOREF | KBC_VEN_GENERIC, + .init = kbd_init, + .close = kbd_close, + .reset = kbd_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; const device_t keyboard_ps2_ami_pci_device = { - .name = "PS/2 Keyboard (AMI)", + .name = "PS/2 Keyboard (AMI)", .internal_name = "keyboard_ps2_ami_pci", - .flags = DEVICE_PCI, - .local = KBC_TYPE_PS2_NOREF | KBC_VEN_AMI, - .init = kbd_init, - .close = kbd_close, - .reset = kbd_reset, + .flags = DEVICE_PCI, + .local = KBC_TYPE_PS2_NOREF | KBC_VEN_AMI, + .init = kbd_init, + .close = kbd_close, + .reset = kbd_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; const device_t keyboard_ps2_ali_pci_device = { - .name = "PS/2 Keyboard (ALi M5123/M1543C)", + .name = "PS/2 Keyboard (ALi M5123/M1543C)", .internal_name = "keyboard_ps2_ali_pci", - .flags = DEVICE_PCI, - .local = KBC_TYPE_PS2_NOREF | KBC_VEN_ALI, - .init = kbd_init, - .close = kbd_close, - .reset = kbd_reset, + .flags = DEVICE_PCI, + .local = KBC_TYPE_PS2_NOREF | KBC_VEN_ALI, + .init = kbd_init, + .close = kbd_close, + .reset = kbd_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; const device_t keyboard_ps2_intel_ami_pci_device = { - .name = "PS/2 Keyboard (AMI)", + .name = "PS/2 Keyboard (AMI)", .internal_name = "keyboard_ps2_intel_ami_pci", - .flags = DEVICE_PCI, - .local = KBC_TYPE_PS2_NOREF | KBC_VEN_INTEL_AMI, - .init = kbd_init, - .close = kbd_close, - .reset = kbd_reset, + .flags = DEVICE_PCI, + .local = KBC_TYPE_PS2_NOREF | KBC_VEN_INTEL_AMI, + .init = kbd_init, + .close = kbd_close, + .reset = kbd_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; const device_t keyboard_ps2_acer_pci_device = { - .name = "PS/2 Keyboard (Acer 90M002A)", + .name = "PS/2 Keyboard (Acer 90M002A)", .internal_name = "keyboard_ps2_acer_pci", - .flags = DEVICE_PCI, - .local = KBC_TYPE_PS2_NOREF | KBC_VEN_ACER, - .init = kbd_init, - .close = kbd_close, - .reset = kbd_reset, + .flags = DEVICE_PCI, + .local = KBC_TYPE_PS2_NOREF | KBC_VEN_ACER, + .init = kbd_init, + .close = kbd_close, + .reset = kbd_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; void keyboard_at_set_mouse(void (*func)(uint8_t val, void *priv), void *priv) { mouse_write = func; - mouse_p = priv; + mouse_p = priv; } - void keyboard_at_adddata_keyboard_raw(uint8_t val) { @@ -2670,7 +2846,6 @@ keyboard_at_adddata_keyboard_raw(uint8_t val) add_data_kbd_queue(dev, 0, val); } - void keyboard_at_adddata_mouse(uint8_t val) { @@ -2679,45 +2854,40 @@ keyboard_at_adddata_mouse(uint8_t val) kbc_queue_add(dev, val, 2, 0x00); } - void keyboard_at_mouse_reset(void) { kbc_queue_reset(2); } - uint8_t keyboard_at_mouse_pos(void) { return ((mouse_queue_end - mouse_queue_start) & 0xf); } - void keyboard_at_set_mouse_scan(uint8_t val) { - atkbd_t *dev = SavedKbd; - uint8_t temp_mouse_scan = val ? 1 : 0; + atkbd_t *dev = SavedKbd; + uint8_t temp_mouse_scan = val ? 1 : 0; if (temp_mouse_scan == !(dev->mem[0] & 0x20)) - return; + return; set_enable_mouse(dev, val ? 1 : 0); kbd_log("ATkbc: mouse scan %sabled via PCI\n", mouse_scan ? "en" : "dis"); } - uint8_t keyboard_at_get_mouse_scan(void) { atkbd_t *dev = SavedKbd; - return((dev->mem[0] & 0x20) ? 0x00 : 0x10); + return ((dev->mem[0] & 0x20) ? 0x00 : 0x10); } - void keyboard_at_set_a20_key(int state) { diff --git a/src/device/keyboard_xt.c b/src/device/keyboard_xt.c index d13bab56d..d3db6a467 100644 --- a/src/device/keyboard_xt.c +++ b/src/device/keyboard_xt.c @@ -45,15 +45,14 @@ #include <86box/video.h> #include <86box/keyboard.h> - -#define STAT_PARITY 0x80 -#define STAT_RTIMEOUT 0x40 -#define STAT_TTIMEOUT 0x20 -#define STAT_LOCK 0x10 -#define STAT_CD 0x08 -#define STAT_SYSFLAG 0x04 -#define STAT_IFULL 0x02 -#define STAT_OFULL 0x01 +#define STAT_PARITY 0x80 +#define STAT_RTIMEOUT 0x40 +#define STAT_TTIMEOUT 0x20 +#define STAT_LOCK 0x10 +#define STAT_CD 0x08 +#define STAT_SYSFLAG 0x04 +#define STAT_IFULL 0x02 +#define STAT_OFULL 0x01 // Keyboard Types #define KBD_TYPE_PC81 0 @@ -79,9 +78,9 @@ typedef struct { pc_timer_t send_delay_timer; } xtkbd_t; - /*XT keyboard has no escape scancodes, and no scancodes beyond 53*/ const scancode scancode_xt[512] = { + // clang-format off { {0}, {0} }, { {0x01, 0}, {0x81, 0} }, { {0x02, 0}, {0x82, 0} }, { {0x03, 0}, {0x83, 0} }, { {0x04, 0}, {0x84, 0} }, { {0x05, 0}, {0x85, 0} }, @@ -338,43 +337,42 @@ const scancode scancode_xt[512] = { { {0}, {0} }, { {0}, {0} }, /*1f8*/ { {0}, {0} }, { {0}, {0} }, { {0}, {0} }, { {0}, {0} } /*1fc*/ + // clang-format on }; - -static uint8_t key_queue[16]; -static int key_queue_start = 0, - key_queue_end = 0; -static int is_tandy = 0, is_t1x00 = 0, - is_amstrad = 0; - +static uint8_t key_queue[16]; +static int key_queue_start = 0, + key_queue_end = 0; +static int is_tandy = 0, is_t1x00 = 0, + is_amstrad = 0; #ifdef ENABLE_KEYBOARD_XT_LOG int keyboard_xt_do_log = ENABLE_KEYBOARD_XT_LOG; - static void kbd_log(const char *fmt, ...) { va_list ap; if (keyboard_xt_do_log) { - va_start(ap, fmt); - pclog_ex(fmt, ap); - va_end(ap); + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); } } #else -#define kbd_log(fmt, ...) +# define kbd_log(fmt, ...) #endif static uint8_t -get_fdd_switch_settings() { +get_fdd_switch_settings() +{ int i, fdd_count = 0; for (i = 0; i < FDD_NUM; i++) { - if (fdd_get_flags(i)) - fdd_count++; + if (fdd_get_flags(i)) + fdd_count++; } if (!fdd_count) @@ -384,12 +382,13 @@ get_fdd_switch_settings() { } static uint8_t -get_videomode_switch_settings() { +get_videomode_switch_settings() +{ if (video_is_mda()) return 0x30; else if (video_is_cga()) - return 0x20; /* 0x10 would be 40x25 */ + return 0x20; /* 0x10 would be 40x25 */ else return 0x00; } @@ -397,307 +396,304 @@ get_videomode_switch_settings() { static void kbd_poll(void *priv) { - xtkbd_t *kbd = (xtkbd_t *)priv; + xtkbd_t *kbd = (xtkbd_t *) priv; timer_advance_u64(&kbd->send_delay_timer, 1000 * TIMER_USEC); if (!(kbd->pb & 0x40) && (kbd->type != KBD_TYPE_TANDY)) - return; + return; if (kbd->want_irq) { - kbd->want_irq = 0; - kbd->pa = kbd->key_waiting; - kbd->blocked = 1; - picint(2); + kbd->want_irq = 0; + kbd->pa = kbd->key_waiting; + kbd->blocked = 1; + picint(2); #ifdef ENABLE_KEYBOARD_XT_LOG - kbd_log("kbd_poll(): keyboard_xt : take IRQ\n"); + kbd_log("kbd_poll(): keyboard_xt : take IRQ\n"); #endif } if ((key_queue_start != key_queue_end) && !kbd->blocked) { - kbd->key_waiting = key_queue[key_queue_start]; - kbd_log("XTkbd: reading %02X from the key queue at %i\n", - kbd->key_waiting, key_queue_start); - key_queue_start = (key_queue_start + 1) & 0x0f; - kbd->want_irq = 1; + kbd->key_waiting = key_queue[key_queue_start]; + kbd_log("XTkbd: reading %02X from the key queue at %i\n", + kbd->key_waiting, key_queue_start); + key_queue_start = (key_queue_start + 1) & 0x0f; + kbd->want_irq = 1; } } - static void kbd_adddata(uint16_t val) { /* Test for T1000 'Fn' key (Right Alt / Right Ctrl) */ if (is_t1x00) { - if (keyboard_recv(0xb8) || keyboard_recv(0x9d)) { /* 'Fn' pressed */ - t1000_syskey(0x00, 0x04, 0x00); /* Set 'Fn' indicator */ - switch (val) { - case 0x45: /* Num Lock => toggle numpad */ - t1000_syskey(0x00, 0x00, 0x10); break; - case 0x47: /* Home => internal display */ - t1000_syskey(0x40, 0x00, 0x00); break; - case 0x49: /* PgDn => turbo on */ - t1000_syskey(0x80, 0x00, 0x00); break; - case 0x4D: /* Right => toggle LCD font */ - t1000_syskey(0x00, 0x00, 0x20); break; - case 0x4F: /* End => external display */ - t1000_syskey(0x00, 0x40, 0x00); break; - case 0x51: /* PgDn => turbo off */ - t1000_syskey(0x00, 0x80, 0x00); break; - case 0x54: /* SysRQ => toggle window */ - t1000_syskey(0x00, 0x00, 0x08); break; - } - } else - t1000_syskey(0x04, 0x00, 0x00); /* Reset 'Fn' indicator */ + if (keyboard_recv(0xb8) || keyboard_recv(0x9d)) { /* 'Fn' pressed */ + t1000_syskey(0x00, 0x04, 0x00); /* Set 'Fn' indicator */ + switch (val) { + case 0x45: /* Num Lock => toggle numpad */ + t1000_syskey(0x00, 0x00, 0x10); + break; + case 0x47: /* Home => internal display */ + t1000_syskey(0x40, 0x00, 0x00); + break; + case 0x49: /* PgDn => turbo on */ + t1000_syskey(0x80, 0x00, 0x00); + break; + case 0x4D: /* Right => toggle LCD font */ + t1000_syskey(0x00, 0x00, 0x20); + break; + case 0x4F: /* End => external display */ + t1000_syskey(0x00, 0x40, 0x00); + break; + case 0x51: /* PgDn => turbo off */ + t1000_syskey(0x00, 0x80, 0x00); + break; + case 0x54: /* SysRQ => toggle window */ + t1000_syskey(0x00, 0x00, 0x08); + break; + } + } else + t1000_syskey(0x04, 0x00, 0x00); /* Reset 'Fn' indicator */ } key_queue[key_queue_end] = val; kbd_log("XTkbd: %02X added to key queue at %i\n", - val, key_queue_end); + val, key_queue_end); key_queue_end = (key_queue_end + 1) & 0x0f; } - void kbd_adddata_process(uint16_t val, void (*adddata)(uint16_t val)) { uint8_t num_lock = 0, shift_states = 0; if (!adddata) - return; + return; keyboard_get_states(NULL, &num_lock, NULL); shift_states = keyboard_get_shift() & STATE_LSHIFT; if (is_amstrad) - num_lock = !num_lock; + num_lock = !num_lock; /* If NumLock is on, invert the left shift state so we can always check for the the same way flag being set (and with NumLock on that then means it is actually *NOT* set). */ if (num_lock) - shift_states ^= STATE_LSHIFT; + shift_states ^= STATE_LSHIFT; - switch(val) { - case FAKE_LSHIFT_ON: - /* If NumLock is on, fake shifts are sent when shift is *NOT* presed, - if NumLock is off, fake shifts are sent when shift is pressed. */ - if (shift_states) { - /* Send fake shift. */ - adddata(num_lock ? 0x2a : 0xaa); - } - break; - case FAKE_LSHIFT_OFF: - if (shift_states) { - /* Send fake shift. */ - adddata(num_lock ? 0xaa : 0x2a); - } - break; - default: - adddata(val); - break; + switch (val) { + case FAKE_LSHIFT_ON: + /* If NumLock is on, fake shifts are sent when shift is *NOT* presed, + if NumLock is off, fake shifts are sent when shift is pressed. */ + if (shift_states) { + /* Send fake shift. */ + adddata(num_lock ? 0x2a : 0xaa); + } + break; + case FAKE_LSHIFT_OFF: + if (shift_states) { + /* Send fake shift. */ + adddata(num_lock ? 0xaa : 0x2a); + } + break; + default: + adddata(val); + break; } } - static void kbd_adddata_ex(uint16_t val) { kbd_adddata_process(val, kbd_adddata); } - static void kbd_write(uint16_t port, uint8_t val, void *priv) { - xtkbd_t *kbd = (xtkbd_t *)priv; + xtkbd_t *kbd = (xtkbd_t *) priv; switch (port) { - case 0x61: /* Keyboard Control Register (aka Port B) */ - if (!(kbd->pb & 0x40) && (val & 0x40)) { - key_queue_start = key_queue_end = 0; - kbd->want_irq = 0; - kbd->blocked = 0; - kbd_adddata(0xaa); - } - kbd->pb = val; - ppi.pb = val; + case 0x61: /* Keyboard Control Register (aka Port B) */ + if (!(kbd->pb & 0x40) && (val & 0x40)) { + key_queue_start = key_queue_end = 0; + kbd->want_irq = 0; + kbd->blocked = 0; + kbd_adddata(0xaa); + } + kbd->pb = val; + ppi.pb = val; - timer_process(); + timer_process(); - if (((kbd->type == KBD_TYPE_PC81) || (kbd->type == KBD_TYPE_PC82)) && (cassette != NULL)) - pc_cas_set_motor(cassette, (kbd->pb & 0x08) == 0); + if (((kbd->type == KBD_TYPE_PC81) || (kbd->type == KBD_TYPE_PC82)) && (cassette != NULL)) + pc_cas_set_motor(cassette, (kbd->pb & 0x08) == 0); - speaker_update(); + speaker_update(); - speaker_gated = val & 1; - speaker_enable = val & 2; + speaker_gated = val & 1; + speaker_enable = val & 2; - if (speaker_enable) - was_speaker_enable = 1; - pit_devs[0].set_gate(pit_devs[0].data, 2, val & 1); + if (speaker_enable) + was_speaker_enable = 1; + pit_devs[0].set_gate(pit_devs[0].data, 2, val & 1); - if (val & 0x80) { - kbd->pa = 0; - kbd->blocked = 0; - picintc(2); - } + if (val & 0x80) { + kbd->pa = 0; + kbd->blocked = 0; + picintc(2); + } #ifdef ENABLE_KEYBOARD_XT_LOG - if ((kbd->type == KBD_TYPE_PC81) || (kbd->type == KBD_TYPE_PC82)) - kbd_log("Cassette motor is %s\n", !(val & 0x08) ? "ON" : "OFF"); + if ((kbd->type == KBD_TYPE_PC81) || (kbd->type == KBD_TYPE_PC82)) + kbd_log("Cassette motor is %s\n", !(val & 0x08) ? "ON" : "OFF"); #endif - break; + break; #ifdef ENABLE_KEYBOARD_XT_LOG - case 0x62: /* Switch Register (aka Port C) */ - if ((kbd->type == KBD_TYPE_PC81) || (kbd->type == KBD_TYPE_PC82)) - kbd_log("Cassette IN is %i\n", !!(val & 0x10)); - break; + case 0x62: /* Switch Register (aka Port C) */ + if ((kbd->type == KBD_TYPE_PC81) || (kbd->type == KBD_TYPE_PC82)) + kbd_log("Cassette IN is %i\n", !!(val & 0x10)); + break; #endif } } - static uint8_t kbd_read(uint16_t port, void *priv) { - xtkbd_t *kbd = (xtkbd_t *)priv; - uint8_t ret = 0xff; + xtkbd_t *kbd = (xtkbd_t *) priv; + uint8_t ret = 0xff; switch (port) { - case 0x60: /* Keyboard Data Register (aka Port A) */ - if ((kbd->pb & 0x80) && ((kbd->type == KBD_TYPE_PC81) || (kbd->type == KBD_TYPE_PC82) - || (kbd->type == KBD_TYPE_XT82) || (kbd->type == KBD_TYPE_XT86) - || (kbd->type == KBD_TYPE_ZENITH))) { - if ((kbd->type == KBD_TYPE_PC81) || (kbd->type == KBD_TYPE_PC82)) - ret = (kbd->pd & ~0x02) | (hasfpu ? 0x02 : 0x00); - else if ((kbd->type == KBD_TYPE_XT82) || (kbd->type == KBD_TYPE_XT86)) - ret = 0xff; /* According to Ruud on the PCem forum, this is supposed to return 0xFF on the XT. */ - else if (kbd->type == KBD_TYPE_ZENITH) { - /* Zenith Data Systems Z-151 - * SW1 switch settings: - * bits 6-7: floppy drive number - * bits 4-5: video mode - * bit 2-3: base memory size - * bit 1: fpu enable - * bit 0: fdc enable - */ - ret = get_fdd_switch_settings(); + case 0x60: /* Keyboard Data Register (aka Port A) */ + if ((kbd->pb & 0x80) && ((kbd->type == KBD_TYPE_PC81) || (kbd->type == KBD_TYPE_PC82) || (kbd->type == KBD_TYPE_XT82) || (kbd->type == KBD_TYPE_XT86) || (kbd->type == KBD_TYPE_ZENITH))) { + if ((kbd->type == KBD_TYPE_PC81) || (kbd->type == KBD_TYPE_PC82)) + ret = (kbd->pd & ~0x02) | (hasfpu ? 0x02 : 0x00); + else if ((kbd->type == KBD_TYPE_XT82) || (kbd->type == KBD_TYPE_XT86)) + ret = 0xff; /* According to Ruud on the PCem forum, this is supposed to return 0xFF on the XT. */ + else if (kbd->type == KBD_TYPE_ZENITH) { + /* Zenith Data Systems Z-151 + * SW1 switch settings: + * bits 6-7: floppy drive number + * bits 4-5: video mode + * bit 2-3: base memory size + * bit 1: fpu enable + * bit 0: fdc enable + */ + ret = get_fdd_switch_settings(); - ret |= get_videomode_switch_settings(); + ret |= get_videomode_switch_settings(); - /* Base memory size should always be 64k */ - ret |= 0x0c; + /* Base memory size should always be 64k */ + ret |= 0x0c; - if (hasfpu) - ret |= 0x02; - } - } else - ret = kbd->pa; - break; - - case 0x61: /* Keyboard Control Register (aka Port B) */ - ret = kbd->pb; - break; - - case 0x62: /* Switch Register (aka Port C) */ - if ((kbd->type == KBD_TYPE_PC81) || (kbd->type == KBD_TYPE_PC82)) { - if (kbd->pb & 0x04) /* PB2 */ - switch (mem_size + isa_mem_size) { - case 64: - case 48: - case 32: - case 16: - ret = 0x00; - break; - default: - ret = (((mem_size + isa_mem_size) - 64) / 32) & 0x0f; - break; + if (hasfpu) + ret |= 0x02; } - else - ret = (((mem_size + isa_mem_size) - 64) / 32) >> 4; - } else if (kbd->type == KBD_TYPE_OLIVETTI - || kbd->type == KBD_TYPE_ZENITH) { - /* Olivetti M19 or Zenith Data Systems Z-151 */ - if (kbd->pb & 0x04) /* PB2 */ - ret = kbd->pd & 0xbf; - else - ret = kbd->pd >> 4; - } else { - if (kbd->pb & 0x08) /* PB3 */ - ret = kbd->pd >> 4; - else { - /* LaserXT = Always 512k RAM; - LaserXT/3 = Bit 0: set = 512k, clear = 256k. */ + } else + ret = kbd->pa; + break; + + case 0x61: /* Keyboard Control Register (aka Port B) */ + ret = kbd->pb; + break; + + case 0x62: /* Switch Register (aka Port C) */ + if ((kbd->type == KBD_TYPE_PC81) || (kbd->type == KBD_TYPE_PC82)) { + if (kbd->pb & 0x04) /* PB2 */ + switch (mem_size + isa_mem_size) { + case 64: + case 48: + case 32: + case 16: + ret = 0x00; + break; + default: + ret = (((mem_size + isa_mem_size) - 64) / 32) & 0x0f; + break; + } + else + ret = (((mem_size + isa_mem_size) - 64) / 32) >> 4; + } else if (kbd->type == KBD_TYPE_OLIVETTI + || kbd->type == KBD_TYPE_ZENITH) { + /* Olivetti M19 or Zenith Data Systems Z-151 */ + if (kbd->pb & 0x04) /* PB2 */ + ret = kbd->pd & 0xbf; + else + ret = kbd->pd >> 4; + } else { + if (kbd->pb & 0x08) /* PB3 */ + ret = kbd->pd >> 4; + else { + /* LaserXT = Always 512k RAM; + LaserXT/3 = Bit 0: set = 512k, clear = 256k. */ #if defined(DEV_BRANCH) && defined(USE_LASERXT) - if (kbd->type == KBD_TYPE_TOSHIBA) - ret = ((mem_size == 512) ? 0x0d : 0x0c) | (hasfpu ? 0x02 : 0x00); - else + if (kbd->type == KBD_TYPE_TOSHIBA) + ret = ((mem_size == 512) ? 0x0d : 0x0c) | (hasfpu ? 0x02 : 0x00); + else #endif - ret = (kbd->pd & 0x0d) | (hasfpu ? 0x02 : 0x00); - } - } - ret |= (ppispeakon ? 0x20 : 0); + ret = (kbd->pd & 0x0d) | (hasfpu ? 0x02 : 0x00); + } + } + ret |= (ppispeakon ? 0x20 : 0); - /* This is needed to avoid error 131 (cassette error). - This is serial read: bit 5 = clock, bit 4 = data, cassette header is 256 x 0xff. */ - if ((kbd->type == KBD_TYPE_PC81) || (kbd->type == KBD_TYPE_PC82)) { - if (cassette == NULL) - ret |= (ppispeakon ? 0x10 : 0); - else - ret |= (pc_cas_get_inp(cassette) ? 0x10 : 0); - } + /* This is needed to avoid error 131 (cassette error). + This is serial read: bit 5 = clock, bit 4 = data, cassette header is 256 x 0xff. */ + if ((kbd->type == KBD_TYPE_PC81) || (kbd->type == KBD_TYPE_PC82)) { + if (cassette == NULL) + ret |= (ppispeakon ? 0x10 : 0); + else + ret |= (pc_cas_get_inp(cassette) ? 0x10 : 0); + } - if (kbd->type == KBD_TYPE_TANDY) - ret |= (tandy1k_eeprom_read() ? 0x10 : 0); - break; + if (kbd->type == KBD_TYPE_TANDY) + ret |= (tandy1k_eeprom_read() ? 0x10 : 0); + break; - case 0x63: /* Keyboard Configuration Register (aka Port D) */ - if ((kbd->type == KBD_TYPE_XT82) || (kbd->type == KBD_TYPE_XT86) + case 0x63: /* Keyboard Configuration Register (aka Port D) */ + if ((kbd->type == KBD_TYPE_XT82) || (kbd->type == KBD_TYPE_XT86) || (kbd->type == KBD_TYPE_COMPAQ) || (kbd->type == KBD_TYPE_TOSHIBA)) - ret = kbd->pd; - break; + ret = kbd->pd; + break; } - return(ret); + return (ret); } - static void kbd_reset(void *priv) { - xtkbd_t *kbd = (xtkbd_t *)priv; + xtkbd_t *kbd = (xtkbd_t *) priv; kbd->want_irq = 0; - kbd->blocked = 0; - kbd->pa = 0x00; - kbd->pb = 0x00; + kbd->blocked = 0; + kbd->pa = 0x00; + kbd->pb = 0x00; keyboard_scan = 1; key_queue_start = 0, - key_queue_end = 0; + key_queue_end = 0; } - void keyboard_set_is_amstrad(int ams) { is_amstrad = ams; } - static void * kbd_init(const device_t *info) { xtkbd_t *kbd; - kbd = (xtkbd_t *)malloc(sizeof(xtkbd_t)); + kbd = (xtkbd_t *) malloc(sizeof(xtkbd_t)); memset(kbd, 0x00, sizeof(xtkbd_t)); io_sethandler(0x0060, 4, - kbd_read, NULL, NULL, kbd_write, NULL, NULL, kbd); + kbd_read, NULL, NULL, kbd_write, NULL, NULL, kbd); keyboard_send = kbd_adddata_ex; kbd_reset(kbd); kbd->type = info->local; @@ -707,31 +703,31 @@ kbd_init(const device_t *info) video_reset(gfxcard); if ((kbd->type == KBD_TYPE_PC81) || (kbd->type == KBD_TYPE_PC82) - || (kbd->type == KBD_TYPE_XT82) || (kbd->type <= KBD_TYPE_XT86) - || (kbd->type == KBD_TYPE_COMPAQ) - || (kbd->type == KBD_TYPE_TOSHIBA) - || (kbd->type == KBD_TYPE_OLIVETTI)) { + || (kbd->type == KBD_TYPE_XT82) || (kbd->type <= KBD_TYPE_XT86) + || (kbd->type == KBD_TYPE_COMPAQ) + || (kbd->type == KBD_TYPE_TOSHIBA) + || (kbd->type == KBD_TYPE_OLIVETTI)) { /* DIP switch readout: bit set = OFF, clear = ON. */ if (kbd->type == KBD_TYPE_OLIVETTI) - /* Olivetti M19 - * Jumpers J1, J2 - monitor type. - * 01 - mono (high-res) - * 10 - color (low-res, disables 640x400x2 mode) - * 00 - autoswitching - */ - kbd->pd |= 0x00; - else - /* Switches 7, 8 - floppy drives. */ - kbd->pd = get_fdd_switch_settings(); + /* Olivetti M19 + * Jumpers J1, J2 - monitor type. + * 01 - mono (high-res) + * 10 - color (low-res, disables 640x400x2 mode) + * 00 - autoswitching + */ + kbd->pd |= 0x00; + else + /* Switches 7, 8 - floppy drives. */ + kbd->pd = get_fdd_switch_settings(); /* Siitches 5, 6 - video card type */ - kbd->pd |= get_videomode_switch_settings(); + kbd->pd |= get_videomode_switch_settings(); /* Switches 3, 4 - memory size. */ if ((kbd->type == KBD_TYPE_XT86) - || (kbd->type == KBD_TYPE_COMPAQ) - || (kbd->type == KBD_TYPE_TOSHIBA)) { + || (kbd->type == KBD_TYPE_COMPAQ) + || (kbd->type == KBD_TYPE_TOSHIBA)) { switch (mem_size) { case 256: kbd->pd |= 0x00; @@ -747,9 +743,9 @@ kbd_init(const device_t *info) kbd->pd |= 0x0c; break; } - } else if (kbd->type == KBD_TYPE_XT82) { + } else if (kbd->type == KBD_TYPE_XT82) { switch (mem_size) { - case 64: /* 1x64k */ + case 64: /* 1x64k */ kbd->pd |= 0x00; break; case 128: /* 2x64k */ @@ -763,7 +759,7 @@ kbd_init(const device_t *info) kbd->pd |= 0x0c; break; } - } else if (kbd->type == KBD_TYPE_PC82) { + } else if (kbd->type == KBD_TYPE_PC82) { switch (mem_size) { case 192: /* 3x64k, not supported by stock BIOS due to bugs */ kbd->pd |= 0x08; @@ -793,19 +789,19 @@ kbd_init(const device_t *info) default: kbd->pd |= 0x0c; break; - } - } + } + } /* Switch 2 - 8087 FPU. */ if (hasfpu) kbd->pd |= 0x02; - } else if (kbd-> type == KBD_TYPE_ZENITH) { + } else if (kbd->type == KBD_TYPE_ZENITH) { /* Zenith Data Systems Z-151 - * SW2 switch settings: - * bit 7: monitor frequency - * bits 5-6: autoboot (00-11 resident monitor, 10 hdd, 01 fdd) - * bits 0-4: installed memory - */ + * SW2 switch settings: + * bit 7: monitor frequency + * bits 5-6: autoboot (00-11 resident monitor, 10 hdd, 01 fdd) + * bits 0-4: installed memory + */ kbd->pd = 0x20; switch (mem_size) { case 128: @@ -848,14 +844,13 @@ kbd_init(const device_t *info) is_amstrad = 0; - return(kbd); + return (kbd); } - static void kbd_close(void *priv) { - xtkbd_t *kbd = (xtkbd_t *)priv; + xtkbd_t *kbd = (xtkbd_t *) priv; /* Stop the timer. */ timer_disable(&kbd->send_delay_timer); @@ -866,149 +861,149 @@ kbd_close(void *priv) keyboard_send = NULL; io_removehandler(0x0060, 4, - kbd_read, NULL, NULL, kbd_write, NULL, NULL, kbd); + kbd_read, NULL, NULL, kbd_write, NULL, NULL, kbd); free(kbd); } const device_t keyboard_pc_device = { - .name = "IBM PC Keyboard (1981)", + .name = "IBM PC Keyboard (1981)", .internal_name = "keyboard_pc", - .flags = 0, - .local = KBD_TYPE_PC81, - .init = kbd_init, - .close = kbd_close, - .reset = kbd_reset, + .flags = 0, + .local = KBD_TYPE_PC81, + .init = kbd_init, + .close = kbd_close, + .reset = kbd_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; const device_t keyboard_pc82_device = { - .name = "IBM PC Keyboard (1982)", + .name = "IBM PC Keyboard (1982)", .internal_name = "keyboard_pc82", - .flags = 0, - .local = KBD_TYPE_PC82, - .init = kbd_init, - .close = kbd_close, - .reset = kbd_reset, + .flags = 0, + .local = KBD_TYPE_PC82, + .init = kbd_init, + .close = kbd_close, + .reset = kbd_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; const device_t keyboard_xt_device = { - .name = "XT (1982) Keyboard", + .name = "XT (1982) Keyboard", .internal_name = "keyboard_xt", - .flags = 0, - .local = KBD_TYPE_XT82, - .init = kbd_init, - .close = kbd_close, - .reset = kbd_reset, + .flags = 0, + .local = KBD_TYPE_XT82, + .init = kbd_init, + .close = kbd_close, + .reset = kbd_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; const device_t keyboard_xt86_device = { - .name = "XT (1986) Keyboard", + .name = "XT (1986) Keyboard", .internal_name = "keyboard_xt86", - .flags = 0, - .local = KBD_TYPE_XT86, - .init = kbd_init, - .close = kbd_close, - .reset = kbd_reset, + .flags = 0, + .local = KBD_TYPE_XT86, + .init = kbd_init, + .close = kbd_close, + .reset = kbd_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; const device_t keyboard_xt_compaq_device = { - .name = "Compaq Portable Keyboard", + .name = "Compaq Portable Keyboard", .internal_name = "keyboard_xt_compaq", - .flags = 0, - .local = KBD_TYPE_COMPAQ, - .init = kbd_init, - .close = kbd_close, - .reset = kbd_reset, + .flags = 0, + .local = KBD_TYPE_COMPAQ, + .init = kbd_init, + .close = kbd_close, + .reset = kbd_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; const device_t keyboard_tandy_device = { - .name = "Tandy 1000 Keyboard", + .name = "Tandy 1000 Keyboard", .internal_name = "keyboard_tandy", - .flags = 0, - .local = KBD_TYPE_TANDY, - .init = kbd_init, - .close = kbd_close, - .reset = kbd_reset, + .flags = 0, + .local = KBD_TYPE_TANDY, + .init = kbd_init, + .close = kbd_close, + .reset = kbd_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; const device_t keyboard_xt_t1x00_device = { - .name = "Toshiba T1x00 Keyboard", + .name = "Toshiba T1x00 Keyboard", .internal_name = "keyboard_xt_t1x00", - .flags = 0, - .local = KBD_TYPE_TOSHIBA, - .init = kbd_init, - .close = kbd_close, - .reset = kbd_reset, + .flags = 0, + .local = KBD_TYPE_TOSHIBA, + .init = kbd_init, + .close = kbd_close, + .reset = kbd_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; #if defined(DEV_BRANCH) && defined(USE_LASERXT) const device_t keyboard_xt_lxt3_device = { - .name = "VTech Laser XT3 Keyboard", + .name = "VTech Laser XT3 Keyboard", .internal_name = "keyboard_xt_lxt3", - .flags = 0, - .local = KBD_TYPE_VTECH, - .init = kbd_init, - .close = kbd_close, - .reset = kbd_reset, + .flags = 0, + .local = KBD_TYPE_VTECH, + .init = kbd_init, + .close = kbd_close, + .reset = kbd_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; #endif const device_t keyboard_xt_olivetti_device = { - .name = "Olivetti XT Keyboard", + .name = "Olivetti XT Keyboard", .internal_name = "keyboard_xt_olivetti", - .flags = 0, - .local = KBD_TYPE_OLIVETTI, - .init = kbd_init, - .close = kbd_close, - .reset = kbd_reset, + .flags = 0, + .local = KBD_TYPE_OLIVETTI, + .init = kbd_init, + .close = kbd_close, + .reset = kbd_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; const device_t keyboard_xt_zenith_device = { - .name = "Zenith XT Keyboard", + .name = "Zenith XT Keyboard", .internal_name = "keyboard_xt_zenith", - .flags = 0, - .local = KBD_TYPE_ZENITH, - .init = kbd_init, - .close = kbd_close, - .reset = kbd_reset, + .flags = 0, + .local = KBD_TYPE_ZENITH, + .init = kbd_init, + .close = kbd_close, + .reset = kbd_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; diff --git a/src/device/mouse.c b/src/device/mouse.c index 4fc9b5378..88a068e07 100644 --- a/src/device/mouse.c +++ b/src/device/mouse.c @@ -29,48 +29,46 @@ #include <86box/device.h> #include <86box/mouse.h> - typedef struct { - const device_t *device; + const device_t *device; } mouse_t; - -int mouse_type = 0; -int mouse_x, - mouse_y, - mouse_z, - mouse_buttons; +int mouse_type = 0; +int mouse_x, + mouse_y, + mouse_z, + mouse_buttons; static const device_t mouse_none_device = { - .name = "None", + .name = "None", .internal_name = "none", - .flags = 0, - .local = MOUSE_TYPE_NONE, - .init = NULL, - .close = NULL, - .reset = NULL, + .flags = 0, + .local = MOUSE_TYPE_NONE, + .init = NULL, + .close = NULL, + .reset = NULL, { .poll = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; static const device_t mouse_internal_device = { - .name = "Internal", + .name = "Internal", .internal_name = "internal", - .flags = 0, - .local = MOUSE_TYPE_INTERNAL, - .init = NULL, - .close = NULL, - .reset = NULL, + .flags = 0, + .local = MOUSE_TYPE_INTERNAL, + .init = NULL, + .close = NULL, + .reset = NULL, { .poll = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; static mouse_t mouse_devices[] = { -// clang-format off + // clang-format off { &mouse_none_device }, { &mouse_internal_device }, { &mouse_logibus_device }, @@ -83,87 +81,82 @@ static mouse_t mouse_devices[] = { { &mouse_ltserial_device }, { &mouse_ps2_device }, { NULL } -// clang-format on + // clang-format on }; - -static const device_t *mouse_curr; -static void *mouse_priv; -static int mouse_nbut; -static int (*mouse_dev_poll)(); - +static const device_t *mouse_curr; +static void *mouse_priv; +static int mouse_nbut; +static int (*mouse_dev_poll)(); #ifdef ENABLE_MOUSE_LOG int mouse_do_log = ENABLE_MOUSE_LOG; - static void mouse_log(const char *fmt, ...) { va_list ap; if (mouse_do_log) { - va_start(ap, fmt); - pclog_ex(fmt, ap); - va_end(ap); + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); } } #else -#define mouse_log(fmt, ...) +# define mouse_log(fmt, ...) #endif - /* Initialize the mouse module. */ void mouse_init(void) { /* Initialize local data. */ mouse_x = mouse_y = mouse_z = 0; - mouse_buttons = 0x00; + mouse_buttons = 0x00; - mouse_type = MOUSE_TYPE_NONE; - mouse_curr = NULL; - mouse_priv = NULL; - mouse_nbut = 0; + mouse_type = MOUSE_TYPE_NONE; + mouse_curr = NULL; + mouse_priv = NULL; + mouse_nbut = 0; mouse_dev_poll = NULL; } - void mouse_close(void) { - if (mouse_curr == NULL) return; + if (mouse_curr == NULL) + return; - mouse_curr = NULL; - mouse_priv = NULL; - mouse_nbut = 0; + mouse_curr = NULL; + mouse_priv = NULL; + mouse_nbut = 0; mouse_dev_poll = NULL; } - void mouse_reset(void) { if (mouse_curr != NULL) - return; /* Mouse already initialized. */ + return; /* Mouse already initialized. */ mouse_log("MOUSE: reset(type=%d, '%s')\n", - mouse_type, mouse_devices[mouse_type].device->name); + mouse_type, mouse_devices[mouse_type].device->name); /* Clear local data. */ mouse_x = mouse_y = mouse_z = 0; - mouse_buttons = 0x00; + mouse_buttons = 0x00; /* If no mouse configured, we're done. */ - if (mouse_type == 0) return; + if (mouse_type == 0) + return; mouse_curr = mouse_devices[mouse_type].device; if (mouse_curr != NULL) - mouse_priv = device_add(mouse_curr); + mouse_priv = device_add(mouse_curr); } - /* Callback from the hardware driver. */ void mouse_set_buttons(int buttons) @@ -171,98 +164,92 @@ mouse_set_buttons(int buttons) mouse_nbut = buttons; } - void mouse_process(void) { static int poll_delay = 2; if (mouse_curr == NULL) - return; + return; - if (--poll_delay) return; + if (--poll_delay) + return; mouse_poll(); if ((mouse_dev_poll != NULL) || (mouse_curr->poll != NULL)) { - if (mouse_curr->poll != NULL) - mouse_curr->poll(mouse_x,mouse_y,mouse_z,mouse_buttons, mouse_priv); - else - mouse_dev_poll(mouse_x,mouse_y,mouse_z,mouse_buttons, mouse_priv); + if (mouse_curr->poll != NULL) + mouse_curr->poll(mouse_x, mouse_y, mouse_z, mouse_buttons, mouse_priv); + else + mouse_dev_poll(mouse_x, mouse_y, mouse_z, mouse_buttons, mouse_priv); - /* Reset mouse deltas. */ - mouse_x = mouse_y = mouse_z = 0; + /* Reset mouse deltas. */ + mouse_x = mouse_y = mouse_z = 0; } poll_delay = 2; } - void -mouse_set_poll(int (*func)(int,int,int,int,void *), void *arg) +mouse_set_poll(int (*func)(int, int, int, int, void *), void *arg) { - if (mouse_type != MOUSE_TYPE_INTERNAL) return; + if (mouse_type != MOUSE_TYPE_INTERNAL) + return; mouse_dev_poll = func; - mouse_priv = arg; + mouse_priv = arg; } - char * mouse_get_name(int mouse) { - return((char *)mouse_devices[mouse].device->name); + return ((char *) mouse_devices[mouse].device->name); } - char * mouse_get_internal_name(int mouse) { return device_get_internal_name(mouse_devices[mouse].device); } - int mouse_get_from_internal_name(char *s) { int c = 0; while (mouse_devices[c].device != NULL) { - if (! strcmp((char *)mouse_devices[c].device->internal_name, s)) - return(c); - c++; + if (!strcmp((char *) mouse_devices[c].device->internal_name, s)) + return (c); + c++; } - return(0); + return (0); } - int mouse_has_config(int mouse) { - if (mouse_devices[mouse].device == NULL) return(0); + if (mouse_devices[mouse].device == NULL) + return (0); - return(mouse_devices[mouse].device->config ? 1 : 0); + return (mouse_devices[mouse].device->config ? 1 : 0); } - const device_t * mouse_get_device(int mouse) { - return(mouse_devices[mouse].device); + return (mouse_devices[mouse].device); } - int mouse_get_buttons(void) { - return(mouse_nbut); + return (mouse_nbut); } - /* Return number of MOUSE types we know about. */ int mouse_get_ndev(void) { - return((sizeof(mouse_devices)/sizeof(mouse_t)) - 1); + return ((sizeof(mouse_devices) / sizeof(mouse_t)) - 1); } diff --git a/src/device/mouse_bus.c b/src/device/mouse_bus.c index 2a098a22b..cc9f6ecca 100644 --- a/src/device/mouse_bus.c +++ b/src/device/mouse_bus.c @@ -85,10 +85,10 @@ #define IRQ_MASK ((1 << 5) >> dev->irq) /* MS Inport Bus Mouse Adapter */ -#define INP_PORT_CONTROL 0x0000 -#define INP_PORT_DATA 0x0001 -#define INP_PORT_SIGNATURE 0x0002 -#define INP_PORT_CONFIG 0x0003 +#define INP_PORT_CONTROL 0x0000 +#define INP_PORT_DATA 0x0001 +#define INP_PORT_SIGNATURE 0x0002 +#define INP_PORT_CONFIG 0x0003 #define INP_CTRL_READ_BUTTONS 0x00 #define INP_CTRL_READ_X 0x01 @@ -103,123 +103,119 @@ #define INP_PERIOD_MASK 0x07 /* MS/Logictech Standard Bus Mouse Adapter */ -#define BUSM_PORT_DATA 0x0000 -#define BUSM_PORT_SIGNATURE 0x0001 -#define BUSM_PORT_CONTROL 0x0002 -#define BUSM_PORT_CONFIG 0x0003 +#define BUSM_PORT_DATA 0x0000 +#define BUSM_PORT_SIGNATURE 0x0001 +#define BUSM_PORT_CONTROL 0x0002 +#define BUSM_PORT_CONFIG 0x0003 -#define HOLD_COUNTER (1 << 7) -#define READ_X (0 << 6) -#define READ_Y (1 << 6) -#define READ_LOW (0 << 5) -#define READ_HIGH (1 << 5) -#define DISABLE_IRQ (1 << 4) +#define HOLD_COUNTER (1 << 7) +#define READ_X (0 << 6) +#define READ_Y (1 << 6) +#define READ_LOW (0 << 5) +#define READ_HIGH (1 << 5) +#define DISABLE_IRQ (1 << 4) -#define DEVICE_ACTIVE (1 << 7) +#define DEVICE_ACTIVE (1 << 7) -#define READ_X_LOW (READ_X | READ_LOW) -#define READ_X_HIGH (READ_X | READ_HIGH) -#define READ_Y_LOW (READ_Y | READ_LOW) -#define READ_Y_HIGH (READ_Y | READ_HIGH) +#define READ_X_LOW (READ_X | READ_LOW) +#define READ_X_HIGH (READ_X | READ_HIGH) +#define READ_Y_LOW (READ_Y | READ_LOW) +#define READ_Y_HIGH (READ_Y | READ_HIGH) -#define FLAG_INPORT (1 << 0) -#define FLAG_ENABLED (1 << 1) -#define FLAG_HOLD (1 << 2) -#define FLAG_TIMER_INT (1 << 3) -#define FLAG_DATA_INT (1 << 4) +#define FLAG_INPORT (1 << 0) +#define FLAG_ENABLED (1 << 1) +#define FLAG_HOLD (1 << 2) +#define FLAG_TIMER_INT (1 << 3) +#define FLAG_DATA_INT (1 << 4) static const uint8_t periods[4] = { 30, 50, 100, 200 }; - /* Our mouse device. */ typedef struct mouse { - uint8_t current_b, control_val, - config_val, sig_val, - command_val, pad; + uint8_t current_b, control_val, + config_val, sig_val, + command_val, pad; - int8_t current_x, current_y; + int8_t current_x, current_y; - int base, irq, bn, flags, - mouse_delayed_dx, mouse_delayed_dy, - mouse_buttons, mouse_buttons_last, - toggle_counter, timer_enabled; + int base, irq, bn, flags, + mouse_delayed_dx, mouse_delayed_dy, + mouse_buttons, mouse_buttons_last, + toggle_counter, timer_enabled; - double period; - pc_timer_t timer; /* mouse event timer */ + double period; + pc_timer_t timer; /* mouse event timer */ } mouse_t; - #ifdef ENABLE_MOUSE_BUS_LOG int bm_do_log = ENABLE_MOUSE_BUS_LOG; - static void bm_log(const char *fmt, ...) { va_list ap; if (bm_do_log) { - va_start(ap, fmt); - pclog_ex(fmt, ap); - va_end(ap); + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); } } #else -#define bm_log(fmt, ...) +# define bm_log(fmt, ...) #endif - /* Handle a READ operation from one of our registers. */ static uint8_t lt_read(uint16_t port, void *priv) { - mouse_t *dev = (mouse_t *)priv; - uint8_t value = 0xff; + mouse_t *dev = (mouse_t *) priv; + uint8_t value = 0xff; switch (port & 0x03) { - case BUSM_PORT_DATA: - /* Testing and another source confirm that the buttons are - *ALWAYS* present, so I'm going to change this a bit. */ - switch (dev->control_val & 0x60) { - case READ_X_LOW: - value = dev->current_x & 0x0F; - dev->current_x &= ~0x0F; - break; - case READ_X_HIGH: - value = (dev->current_x >> 4) & 0x0F; - dev->current_x &= ~0xF0; - break; - case READ_Y_LOW: - value = dev->current_y & 0x0F; - dev->current_y &= ~0x0F; - break; - case READ_Y_HIGH: - value = (dev->current_y >> 4) & 0x0F; - dev->current_y &= ~0xF0; - break; - default: - bm_log("ERROR: Reading data port in unsupported mode 0x%02x\n", dev->control_val); - } - value |= ((dev->current_b ^ 7) << 5); - break; - case BUSM_PORT_SIGNATURE: - value = dev->sig_val; - break; - case BUSM_PORT_CONTROL: - value = dev->control_val; - dev->control_val |= 0x0F; - /* If the conditions are right, simulate the flakiness of the correct IRQ bit. */ - if (dev->flags & FLAG_TIMER_INT) - dev->control_val = (dev->control_val & ~IRQ_MASK) | (random_generate() & IRQ_MASK); - break; - case BUSM_PORT_CONFIG: - /* Read from config port returns control_val in the upper 4 bits when enabled, - possibly solid interrupt readout in the lower 4 bits, 0xff when not (at power-up). */ - if (dev->flags & FLAG_ENABLED) - return (dev->control_val | 0x0F) & ~IRQ_MASK; - else - return 0xff; - break; + case BUSM_PORT_DATA: + /* Testing and another source confirm that the buttons are + *ALWAYS* present, so I'm going to change this a bit. */ + switch (dev->control_val & 0x60) { + case READ_X_LOW: + value = dev->current_x & 0x0F; + dev->current_x &= ~0x0F; + break; + case READ_X_HIGH: + value = (dev->current_x >> 4) & 0x0F; + dev->current_x &= ~0xF0; + break; + case READ_Y_LOW: + value = dev->current_y & 0x0F; + dev->current_y &= ~0x0F; + break; + case READ_Y_HIGH: + value = (dev->current_y >> 4) & 0x0F; + dev->current_y &= ~0xF0; + break; + default: + bm_log("ERROR: Reading data port in unsupported mode 0x%02x\n", dev->control_val); + } + value |= ((dev->current_b ^ 7) << 5); + break; + case BUSM_PORT_SIGNATURE: + value = dev->sig_val; + break; + case BUSM_PORT_CONTROL: + value = dev->control_val; + dev->control_val |= 0x0F; + /* If the conditions are right, simulate the flakiness of the correct IRQ bit. */ + if (dev->flags & FLAG_TIMER_INT) + dev->control_val = (dev->control_val & ~IRQ_MASK) | (random_generate() & IRQ_MASK); + break; + case BUSM_PORT_CONFIG: + /* Read from config port returns control_val in the upper 4 bits when enabled, + possibly solid interrupt readout in the lower 4 bits, 0xff when not (at power-up). */ + if (dev->flags & FLAG_ENABLED) + return (dev->control_val | 0x0F) & ~IRQ_MASK; + else + return 0xff; + break; } bm_log("DEBUG: read from address 0x%04x, value = 0x%02x\n", port, value); @@ -227,47 +223,46 @@ lt_read(uint16_t port, void *priv) return value; } - static uint8_t ms_read(uint16_t port, void *priv) { - mouse_t *dev = (mouse_t *)priv; - uint8_t value = 0xff; + mouse_t *dev = (mouse_t *) priv; + uint8_t value = 0xff; switch (port & 0x03) { - case INP_PORT_CONTROL: - value = dev->control_val; - break; - case INP_PORT_DATA: - switch (dev->command_val) { - case INP_CTRL_READ_BUTTONS: - value = dev->current_b; - break; - case INP_CTRL_READ_X: - value = dev->current_x; - dev->current_x = 0; - break; - case INP_CTRL_READ_Y: - value = dev->current_y; - dev->current_y = 0; - break; - case INP_CTRL_COMMAND: - value = dev->control_val; - break; - default: - bm_log("ERROR: Reading data port in unsupported mode 0x%02x\n", dev->control_val); - } - break; - case INP_PORT_SIGNATURE: - if (dev->toggle_counter) - value = 0x12; - else - value = 0xDE; - dev->toggle_counter ^= 1; - break; - case INP_PORT_CONFIG: - bm_log("ERROR: Unsupported read from port 0x%04x\n", port); - break; + case INP_PORT_CONTROL: + value = dev->control_val; + break; + case INP_PORT_DATA: + switch (dev->command_val) { + case INP_CTRL_READ_BUTTONS: + value = dev->current_b; + break; + case INP_CTRL_READ_X: + value = dev->current_x; + dev->current_x = 0; + break; + case INP_CTRL_READ_Y: + value = dev->current_y; + dev->current_y = 0; + break; + case INP_CTRL_COMMAND: + value = dev->control_val; + break; + default: + bm_log("ERROR: Reading data port in unsupported mode 0x%02x\n", dev->control_val); + } + break; + case INP_PORT_SIGNATURE: + if (dev->toggle_counter) + value = 0x12; + else + value = 0xDE; + dev->toggle_counter ^= 1; + break; + case INP_PORT_CONFIG: + bm_log("ERROR: Unsupported read from port 0x%04x\n", port); + break; } bm_log("DEBUG: read from address 0x%04x, value = 0x%02x\n", port, value); @@ -275,426 +270,421 @@ ms_read(uint16_t port, void *priv) return value; } - /* Handle a WRITE operation to one of our registers. */ static void lt_write(uint16_t port, uint8_t val, void *priv) { - mouse_t *dev = (mouse_t *)priv; - uint8_t bit; + mouse_t *dev = (mouse_t *) priv; + uint8_t bit; bm_log("DEBUG: write to address 0x%04x, value = 0x%02x\n", port, val); switch (port & 0x03) { - case BUSM_PORT_DATA: - bm_log("ERROR: Unsupported write to port 0x%04x (value = 0x%02x)\n", port, val); - break; - case BUSM_PORT_SIGNATURE: - dev->sig_val = val; - break; - case BUSM_PORT_CONTROL: - dev->control_val = val | 0x0F; + case BUSM_PORT_DATA: + bm_log("ERROR: Unsupported write to port 0x%04x (value = 0x%02x)\n", port, val); + break; + case BUSM_PORT_SIGNATURE: + dev->sig_val = val; + break; + case BUSM_PORT_CONTROL: + dev->control_val = val | 0x0F; - if (!(val & DISABLE_IRQ)) - dev->flags |= FLAG_TIMER_INT; - else - dev->flags &= ~FLAG_TIMER_INT; + if (!(val & DISABLE_IRQ)) + dev->flags |= FLAG_TIMER_INT; + else + dev->flags &= ~FLAG_TIMER_INT; - if (val & HOLD_COUNTER) - dev->flags |= FLAG_HOLD; - else - dev->flags &= ~FLAG_HOLD; + if (val & HOLD_COUNTER) + dev->flags |= FLAG_HOLD; + else + dev->flags &= ~FLAG_HOLD; - if (dev->irq != -1) - picintc(1 << dev->irq); + if (dev->irq != -1) + picintc(1 << dev->irq); - break; - case BUSM_PORT_CONFIG: - /* - * The original Logitech design was based on using a - * 8255 parallel I/O chip. This chip has to be set up - * for proper operation, and this configuration data - * is what is programmed into this register. - * - * A snippet of code found in the FreeBSD kernel source - * explains the value: - * - * D7 = Mode set flag (1 = active) - * This indicates the mode of operation of D7: - * 1 = Mode set, 0 = Bit set/reset - * D6,D5 = Mode selection (port A) - * 00 = Mode 0 = Basic I/O - * 01 = Mode 1 = Strobed I/O - * 10 = Mode 2 = Bi-dir bus - * D4 = Port A direction (1 = input) - * D3 = Port C (upper 4 bits) direction. (1 = input) - * D2 = Mode selection (port B & C) - * 0 = Mode 0 = Basic I/O - * 1 = Mode 1 = Strobed I/O - * D1 = Port B direction (1 = input) - * D0 = Port C (lower 4 bits) direction. (1 = input) - * - * So 91 means Basic I/O on all 3 ports, Port A is an input - * port, B is an output port, C is split with upper 4 bits - * being an output port and lower 4 bits an input port, and - * enable the sucker. Courtesy Intel 8255 databook. Lars - * - * 1001 1011 9B 1111 Default state - * 1001 0001 91 1001 Driver-initialized state - * The only difference is - port C upper and port B go from - * input to output. - */ - if (val & DEVICE_ACTIVE) { - /* Mode set/reset - enable this */ - dev->config_val = val; - if (dev->timer_enabled) - dev->flags |= (FLAG_ENABLED | FLAG_TIMER_INT); - else - dev->flags |= FLAG_ENABLED; - dev->control_val = 0x0F & ~IRQ_MASK; - } else { - /* Single bit set/reset */ - bit = 1 << ((val >> 1) & 0x07); /* Bits 3-1 specify the target bit */ - if (val & 1) - dev->control_val |= bit; /* Set */ - else - dev->control_val &= ~bit; /* Reset */ - } - break; + break; + case BUSM_PORT_CONFIG: + /* + * The original Logitech design was based on using a + * 8255 parallel I/O chip. This chip has to be set up + * for proper operation, and this configuration data + * is what is programmed into this register. + * + * A snippet of code found in the FreeBSD kernel source + * explains the value: + * + * D7 = Mode set flag (1 = active) + * This indicates the mode of operation of D7: + * 1 = Mode set, 0 = Bit set/reset + * D6,D5 = Mode selection (port A) + * 00 = Mode 0 = Basic I/O + * 01 = Mode 1 = Strobed I/O + * 10 = Mode 2 = Bi-dir bus + * D4 = Port A direction (1 = input) + * D3 = Port C (upper 4 bits) direction. (1 = input) + * D2 = Mode selection (port B & C) + * 0 = Mode 0 = Basic I/O + * 1 = Mode 1 = Strobed I/O + * D1 = Port B direction (1 = input) + * D0 = Port C (lower 4 bits) direction. (1 = input) + * + * So 91 means Basic I/O on all 3 ports, Port A is an input + * port, B is an output port, C is split with upper 4 bits + * being an output port and lower 4 bits an input port, and + * enable the sucker. Courtesy Intel 8255 databook. Lars + * + * 1001 1011 9B 1111 Default state + * 1001 0001 91 1001 Driver-initialized state + * The only difference is - port C upper and port B go from + * input to output. + */ + if (val & DEVICE_ACTIVE) { + /* Mode set/reset - enable this */ + dev->config_val = val; + if (dev->timer_enabled) + dev->flags |= (FLAG_ENABLED | FLAG_TIMER_INT); + else + dev->flags |= FLAG_ENABLED; + dev->control_val = 0x0F & ~IRQ_MASK; + } else { + /* Single bit set/reset */ + bit = 1 << ((val >> 1) & 0x07); /* Bits 3-1 specify the target bit */ + if (val & 1) + dev->control_val |= bit; /* Set */ + else + dev->control_val &= ~bit; /* Reset */ + } + break; } } - /* Handle a WRITE operation to one of our registers. */ static void ms_write(uint16_t port, uint8_t val, void *priv) { - mouse_t *dev = (mouse_t *)priv; + mouse_t *dev = (mouse_t *) priv; bm_log("DEBUG: write to address 0x%04x, value = 0x%02x\n", port, val); switch (port & 0x03) { - case INP_PORT_CONTROL: - /* Bit 7 is reset. */ - if (val & INP_CTRL_RESET) - dev->control_val = 0; + case INP_PORT_CONTROL: + /* Bit 7 is reset. */ + if (val & INP_CTRL_RESET) + dev->control_val = 0; - /* Bits 0-2 are the internal register index. */ - switch(val & 0x07) { - case INP_CTRL_COMMAND: - case INP_CTRL_READ_BUTTONS: - case INP_CTRL_READ_X: - case INP_CTRL_READ_Y: - dev->command_val = val & 0x07; - break; - default: - bm_log("ERROR: Unsupported command written to port 0x%04x (value = 0x%02x)\n", port, val); - } - break; - case INP_PORT_DATA: - if (dev->irq != -1) - picintc(1 << dev->irq); - switch(dev->command_val) { - case INP_CTRL_COMMAND: - if (val & INP_HOLD_COUNTER) - dev->flags |= FLAG_HOLD; - else - dev->flags &= ~FLAG_HOLD; + /* Bits 0-2 are the internal register index. */ + switch (val & 0x07) { + case INP_CTRL_COMMAND: + case INP_CTRL_READ_BUTTONS: + case INP_CTRL_READ_X: + case INP_CTRL_READ_Y: + dev->command_val = val & 0x07; + break; + default: + bm_log("ERROR: Unsupported command written to port 0x%04x (value = 0x%02x)\n", port, val); + } + break; + case INP_PORT_DATA: + if (dev->irq != -1) + picintc(1 << dev->irq); + switch (dev->command_val) { + case INP_CTRL_COMMAND: + if (val & INP_HOLD_COUNTER) + dev->flags |= FLAG_HOLD; + else + dev->flags &= ~FLAG_HOLD; - if (val & INP_ENABLE_TIMER_IRQ) - dev->flags |= FLAG_TIMER_INT; - else - dev->flags &= ~FLAG_TIMER_INT; + if (val & INP_ENABLE_TIMER_IRQ) + dev->flags |= FLAG_TIMER_INT; + else + dev->flags &= ~FLAG_TIMER_INT; - if (val & INP_ENABLE_DATA_IRQ) - dev->flags |= FLAG_DATA_INT; - else - dev->flags &= ~FLAG_DATA_INT; + if (val & INP_ENABLE_DATA_IRQ) + dev->flags |= FLAG_DATA_INT; + else + dev->flags &= ~FLAG_DATA_INT; - switch(val & INP_PERIOD_MASK) { - case 0: - dev->period = 0.0; - timer_disable(&dev->timer); - dev->timer_enabled = 0; - break; + switch (val & INP_PERIOD_MASK) { + case 0: + dev->period = 0.0; + timer_disable(&dev->timer); + dev->timer_enabled = 0; + break; - case 1: - case 2: - case 3: - case 4: - dev->period = (1000000.0 / (double)periods[(val & INP_PERIOD_MASK) - 1]); - dev->timer_enabled = (val & INP_ENABLE_TIMER_IRQ) ? 1 : 0; - timer_disable(&dev->timer); - if (dev->timer_enabled) - timer_set_delay_u64(&dev->timer, (uint64_t) (dev->period * (double)TIMER_USEC)); - bm_log("DEBUG: Timer is now %sabled at period %i\n", (val & INP_ENABLE_TIMER_IRQ) ? "en" : "dis", (int32_t) dev->period); - break; + case 1: + case 2: + case 3: + case 4: + dev->period = (1000000.0 / (double) periods[(val & INP_PERIOD_MASK) - 1]); + dev->timer_enabled = (val & INP_ENABLE_TIMER_IRQ) ? 1 : 0; + timer_disable(&dev->timer); + if (dev->timer_enabled) + timer_set_delay_u64(&dev->timer, (uint64_t) (dev->period * (double) TIMER_USEC)); + bm_log("DEBUG: Timer is now %sabled at period %i\n", (val & INP_ENABLE_TIMER_IRQ) ? "en" : "dis", (int32_t) dev->period); + break; - case 6: - if ((val & INP_ENABLE_TIMER_IRQ) && (dev->irq != -1)) - picint(1 << dev->irq); - dev->control_val &= INP_PERIOD_MASK; - dev->control_val |= (val & ~INP_PERIOD_MASK); - return; - default: - bm_log("ERROR: Unsupported period written to port 0x%04x (value = 0x%02x)\n", port, val); - } + case 6: + if ((val & INP_ENABLE_TIMER_IRQ) && (dev->irq != -1)) + picint(1 << dev->irq); + dev->control_val &= INP_PERIOD_MASK; + dev->control_val |= (val & ~INP_PERIOD_MASK); + return; + default: + bm_log("ERROR: Unsupported period written to port 0x%04x (value = 0x%02x)\n", port, val); + } - dev->control_val = val; + dev->control_val = val; - break; - default: - bm_log("ERROR: Unsupported write to port 0x%04x (value = 0x%02x)\n", port, val); - } - break; - case INP_PORT_SIGNATURE: - case INP_PORT_CONFIG: - bm_log("ERROR: Unsupported write to port 0x%04x (value = 0x%02x)\n", port, val); - break; + break; + default: + bm_log("ERROR: Unsupported write to port 0x%04x (value = 0x%02x)\n", port, val); + } + break; + case INP_PORT_SIGNATURE: + case INP_PORT_CONFIG: + bm_log("ERROR: Unsupported write to port 0x%04x (value = 0x%02x)\n", port, val); + break; } } - /* The emulator calls us with an update on the host mouse device. */ static int bm_poll(int x, int y, int z, int b, void *priv) { - mouse_t *dev = (mouse_t *)priv; - int xor; + mouse_t *dev = (mouse_t *) priv; + int xor ; if (!(dev->flags & FLAG_ENABLED)) - return(1); /* Mouse is disabled, do nothing. */ + return (1); /* Mouse is disabled, do nothing. */ if (!x && !y && !((b ^ dev->mouse_buttons_last) & 0x07)) { - dev->mouse_buttons_last = b; - return(1); /* State has not changed, do nothing. */ + dev->mouse_buttons_last = b; + return (1); /* State has not changed, do nothing. */ } /* Converts button states from MRL to LMR. */ dev->mouse_buttons = (uint8_t) (((b & 1) << 2) | ((b & 2) >> 1)); if (dev->bn == 3) - dev->mouse_buttons |= ((b & 4) >> 1); + dev->mouse_buttons |= ((b & 4) >> 1); if ((dev->flags & FLAG_INPORT) && !dev->timer_enabled) { - /* This is an InPort mouse in data interrupt mode, - so update bits 6-3 here. */ + /* This is an InPort mouse in data interrupt mode, + so update bits 6-3 here. */ - /* If the mouse has moved, set bit 6. */ - if (x || y) - dev->mouse_buttons |= 0x40; + /* If the mouse has moved, set bit 6. */ + if (x || y) + dev->mouse_buttons |= 0x40; - /* Set bits 3-5 according to button state changes. */ - xor = ((dev->current_b ^ dev->mouse_buttons) & 0x07) << 3; - dev->mouse_buttons |= xor; + /* Set bits 3-5 according to button state changes. */ + xor = ((dev->current_b ^ dev->mouse_buttons) & 0x07) << 3; + dev->mouse_buttons |= xor; } dev->mouse_buttons_last = b; /* Clamp x and y to between -128 and 127 (int8_t range). */ - if (x > 127) x = 127; - if (x < -128) x = -128; + if (x > 127) + x = 127; + if (x < -128) + x = -128; - if (y > 127) y = 127; - if (y < -128) y = -128; + if (y > 127) + y = 127; + if (y < -128) + y = -128; if (dev->timer_enabled) { - /* Update delayed coordinates. */ - dev->mouse_delayed_dx += x; - dev->mouse_delayed_dy += y; + /* Update delayed coordinates. */ + dev->mouse_delayed_dx += x; + dev->mouse_delayed_dy += y; } else { - /* If the counters are not frozen, update them. */ - if (!(dev->flags & FLAG_HOLD)) { - dev->current_x = (int8_t) x; - dev->current_y = (int8_t) y; + /* If the counters are not frozen, update them. */ + if (!(dev->flags & FLAG_HOLD)) { + dev->current_x = (int8_t) x; + dev->current_y = (int8_t) y; - dev->current_b = dev->mouse_buttons; - } + dev->current_b = dev->mouse_buttons; + } - /* Send interrupt. */ - if ((dev->flags & FLAG_DATA_INT) && (dev->irq != -1)) { - picint(1 << dev->irq); - bm_log("DEBUG: Data Interrupt Fired...\n"); - } + /* Send interrupt. */ + if ((dev->flags & FLAG_DATA_INT) && (dev->irq != -1)) { + picint(1 << dev->irq); + bm_log("DEBUG: Data Interrupt Fired...\n"); + } } - return(0); + return (0); } - /* The timer calls us on every tick if the mouse is in timer mode (InPort mouse is so configured, MS/Logitech Bus mouse always). */ static void bm_update_data(mouse_t *dev) { int delta_x, delta_y; - int xor; + int xor ; /* If the counters are not frozen, update them. */ if (!(dev->flags & FLAG_HOLD)) { - /* Update the deltas and the delays. */ - if (dev->mouse_delayed_dx > 127) { - delta_x = 127; - dev->mouse_delayed_dx -= 127; - } else if (dev->mouse_delayed_dx < -128) { - delta_x = -128; - dev->mouse_delayed_dx += 128; - } else { - delta_x = dev->mouse_delayed_dx; - dev->mouse_delayed_dx = 0; - } + /* Update the deltas and the delays. */ + if (dev->mouse_delayed_dx > 127) { + delta_x = 127; + dev->mouse_delayed_dx -= 127; + } else if (dev->mouse_delayed_dx < -128) { + delta_x = -128; + dev->mouse_delayed_dx += 128; + } else { + delta_x = dev->mouse_delayed_dx; + dev->mouse_delayed_dx = 0; + } - if (dev->mouse_delayed_dy > 127) { - delta_y = 127; - dev->mouse_delayed_dy -= 127; - } else if (dev->mouse_delayed_dy < -128) { - delta_y = -128; - dev->mouse_delayed_dy += 128; - } else { - delta_y = dev->mouse_delayed_dy; - dev->mouse_delayed_dy = 0; - } + if (dev->mouse_delayed_dy > 127) { + delta_y = 127; + dev->mouse_delayed_dy -= 127; + } else if (dev->mouse_delayed_dy < -128) { + delta_y = -128; + dev->mouse_delayed_dy += 128; + } else { + delta_y = dev->mouse_delayed_dy; + dev->mouse_delayed_dy = 0; + } - dev->current_x = (int8_t) delta_x; - dev->current_y = (int8_t) delta_y; + dev->current_x = (int8_t) delta_x; + dev->current_y = (int8_t) delta_y; } else - delta_x = delta_y = 0; + delta_x = delta_y = 0; if (dev->flags & FLAG_INPORT) { - /* This is an InPort mouse in timer mode, so update current_b always, - and update bits 6-3 (mouse moved and button state changed) here. */ - xor = ((dev->current_b ^ dev->mouse_buttons) & 0x07) << 3; - dev->current_b = (dev->mouse_buttons & 0x87) | xor; - if (delta_x || delta_y) - dev->current_b |= 0x40; + /* This is an InPort mouse in timer mode, so update current_b always, + and update bits 6-3 (mouse moved and button state changed) here. */ + xor = ((dev->current_b ^ dev->mouse_buttons) & 0x07) << 3; + dev->current_b = (dev->mouse_buttons & 0x87) | xor; + if (delta_x || delta_y) + dev->current_b |= 0x40; } else if (!(dev->flags & FLAG_HOLD)) { - /* This is a MS/Logitech Bus Mouse, so only update current_b if the - counters are frozen. */ - dev->current_b = dev->mouse_buttons; + /* This is a MS/Logitech Bus Mouse, so only update current_b if the + counters are frozen. */ + dev->current_b = dev->mouse_buttons; } } - /* Called at the configured period (InPort mouse) or 45 times per second (MS/Logitech Bus mouse). */ static void bm_timer(void *priv) { - mouse_t *dev = (mouse_t *)priv; + mouse_t *dev = (mouse_t *) priv; bm_log("DEBUG: Timer Tick (flags=%08X)...\n", dev->flags); /* The period is configured either via emulator settings (for MS/Logitech Bus mouse) or via software (for InPort mouse). */ - timer_advance_u64(&dev->timer, (uint64_t) (dev->period * (double)TIMER_USEC)); + timer_advance_u64(&dev->timer, (uint64_t) (dev->period * (double) TIMER_USEC)); if ((dev->flags & FLAG_TIMER_INT) && (dev->irq != -1)) { - picint(1 << dev->irq); - bm_log("DEBUG: Timer Interrupt Fired...\n"); + picint(1 << dev->irq); + bm_log("DEBUG: Timer Interrupt Fired...\n"); } bm_update_data(dev); } - /* Release all resources held by the device. */ static void bm_close(void *priv) { - mouse_t *dev = (mouse_t *)priv; + mouse_t *dev = (mouse_t *) priv; if (dev) - free(dev); + free(dev); } - /* Set the mouse's IRQ. */ void mouse_bus_set_irq(void *priv, int irq) { - mouse_t *dev = (mouse_t *)priv; + mouse_t *dev = (mouse_t *) priv; dev->irq = irq; } - /* Initialize the device for use by the user. */ static void * bm_init(const device_t *info) { mouse_t *dev; - int hz; + int hz; - dev = (mouse_t *)malloc(sizeof(mouse_t)); + dev = (mouse_t *) malloc(sizeof(mouse_t)); memset(dev, 0x00, sizeof(mouse_t)); if ((info->local & ~MOUSE_TYPE_ONBOARD) == MOUSE_TYPE_INPORT) - dev->flags = FLAG_INPORT; + dev->flags = FLAG_INPORT; else - dev->flags = 0; + dev->flags = 0; if (info->local & MOUSE_TYPE_ONBOARD) { - dev->base = 0x023c; - dev->irq = -1; - dev->bn = 2; + dev->base = 0x023c; + dev->irq = -1; + dev->bn = 2; } else { - dev->base = device_get_config_hex16("base"); - dev->irq = device_get_config_int("irq"); - dev->bn = device_get_config_int("buttons"); + dev->base = device_get_config_hex16("base"); + dev->irq = device_get_config_int("irq"); + dev->bn = device_get_config_int("buttons"); } mouse_set_buttons(dev->bn); - dev->mouse_delayed_dx = 0; - dev->mouse_delayed_dy = 0; - dev->mouse_buttons = 0; - dev->mouse_buttons_last = 0; - dev->sig_val = 0; /* the signature port value */ - dev->current_x = - dev->current_y = 0; - dev->current_b = 0; - dev->command_val = 0; /* command byte */ - dev->toggle_counter = 0; /* signature byte / IRQ bit toggle */ - dev->period = 0.0; + dev->mouse_delayed_dx = 0; + dev->mouse_delayed_dy = 0; + dev->mouse_buttons = 0; + dev->mouse_buttons_last = 0; + dev->sig_val = 0; /* the signature port value */ + dev->current_x = dev->current_y = 0; + dev->current_b = 0; + dev->command_val = 0; /* command byte */ + dev->toggle_counter = 0; /* signature byte / IRQ bit toggle */ + dev->period = 0.0; timer_add(&dev->timer, bm_timer, dev, 0); if (dev->flags & FLAG_INPORT) { - dev->control_val = 0; /* the control port value */ - dev->flags |= FLAG_ENABLED; + dev->control_val = 0; /* the control port value */ + dev->flags |= FLAG_ENABLED; - io_sethandler(dev->base, 4, - ms_read, NULL, NULL, ms_write, NULL, NULL, dev); + io_sethandler(dev->base, 4, + ms_read, NULL, NULL, ms_write, NULL, NULL, dev); - dev->timer_enabled = 0; + dev->timer_enabled = 0; } else { - dev->control_val = 0x0f; /* the control port value */ - dev->config_val = 0x9b; /* the config port value - 0x9b is the - default state of the 8255: all ports - are set to input */ + dev->control_val = 0x0f; /* the control port value */ + dev->config_val = 0x9b; /* the config port value - 0x9b is the + default state of the 8255: all ports + are set to input */ - hz = device_get_config_int("hz"); - if (hz > 0) - dev->period = (1000000.0 / (double)hz); + hz = device_get_config_int("hz"); + if (hz > 0) + dev->period = (1000000.0 / (double) hz); - io_sethandler(dev->base, 4, - lt_read, NULL, NULL, lt_write, NULL, NULL, dev); + io_sethandler(dev->base, 4, + lt_read, NULL, NULL, lt_write, NULL, NULL, dev); - if (hz > 0) { - timer_set_delay_u64(&dev->timer, (uint64_t) (dev->period * (double)TIMER_USEC)); - dev->timer_enabled = 1; - } else { - dev->flags |= FLAG_DATA_INT; - dev->timer_enabled = 0; - } + if (hz > 0) { + timer_set_delay_u64(&dev->timer, (uint64_t) (dev->period * (double) TIMER_USEC)); + dev->timer_enabled = 1; + } else { + dev->flags |= FLAG_DATA_INT; + dev->timer_enabled = 0; + } } if (dev->flags & FLAG_INPORT) - bm_log("MS Inport BusMouse initialized\n"); + bm_log("MS Inport BusMouse initialized\n"); else - bm_log("Standard MS/Logitech BusMouse initialized\n"); + bm_log("Standard MS/Logitech BusMouse initialized\n"); return dev; } static const device_config_t lt_config[] = { -// clang-format off + // clang-format off { .name = "base", .description = "Address", @@ -758,11 +748,11 @@ static const device_config_t lt_config[] = { } }, { .name = "", .description = "", .type = CONFIG_END } -// clang-format on + // clang-format on }; static const device_config_t ms_config[] = { -// clang-format off + // clang-format off { .name = "base", .description = "Address", @@ -814,43 +804,43 @@ static const device_config_t ms_config[] = { }; const device_t mouse_logibus_device = { - .name = "Logitech/Microsoft Bus Mouse", + .name = "Logitech/Microsoft Bus Mouse", .internal_name = "logibus", - .flags = DEVICE_ISA, - .local = MOUSE_TYPE_LOGIBUS, - .init = bm_init, - .close = bm_close, - .reset = NULL, + .flags = DEVICE_ISA, + .local = MOUSE_TYPE_LOGIBUS, + .init = bm_init, + .close = bm_close, + .reset = NULL, { .poll = bm_poll }, .speed_changed = NULL, - .force_redraw = NULL, - .config = lt_config + .force_redraw = NULL, + .config = lt_config }; const device_t mouse_logibus_onboard_device = { - .name = "Logitech Bus Mouse (On-Board)", + .name = "Logitech Bus Mouse (On-Board)", .internal_name = "logibus_onboard", - .flags = DEVICE_ISA, - .local = MOUSE_TYPE_LOGIBUS | MOUSE_TYPE_ONBOARD, - .init = bm_init, - .close = bm_close, - .reset = NULL, + .flags = DEVICE_ISA, + .local = MOUSE_TYPE_LOGIBUS | MOUSE_TYPE_ONBOARD, + .init = bm_init, + .close = bm_close, + .reset = NULL, { .poll = bm_poll }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; const device_t mouse_msinport_device = { - .name = "Microsoft Bus Mouse (InPort)", + .name = "Microsoft Bus Mouse (InPort)", .internal_name = "msbus", - .flags = DEVICE_ISA, - .local = MOUSE_TYPE_INPORT, - .init = bm_init, - .close = bm_close, - .reset = NULL, + .flags = DEVICE_ISA, + .local = MOUSE_TYPE_INPORT, + .init = bm_init, + .close = bm_close, + .reset = NULL, { .poll = bm_poll }, .speed_changed = NULL, - .force_redraw = NULL, - .config = ms_config + .force_redraw = NULL, + .config = ms_config }; diff --git a/src/device/mouse_ps2.c b/src/device/mouse_ps2.c index cd4225e11..24e8996c4 100644 --- a/src/device/mouse_ps2.c +++ b/src/device/mouse_ps2.c @@ -24,215 +24,205 @@ #include <86box/keyboard.h> #include <86box/mouse.h> - enum { MODE_STREAM, MODE_REMOTE, MODE_ECHO }; - typedef struct { - const char *name; /* name of this device */ - int8_t type; /* type of this device */ + const char *name; /* name of this device */ + int8_t type; /* type of this device */ - int mode; + int mode; - uint8_t flags; - uint8_t resolution; - uint8_t sample_rate; + uint8_t flags; + uint8_t resolution; + uint8_t sample_rate; - uint8_t command; + uint8_t command; - int x, y, z, b; + int x, y, z, b; - uint8_t last_data[6]; + uint8_t last_data[6]; } mouse_t; -#define FLAG_INTELLI 0x80 /* device is IntelliMouse */ -#define FLAG_INTMODE 0x40 /* using Intellimouse mode */ -#define FLAG_SCALED 0x20 /* enable delta scaling */ -#define FLAG_ENABLED 0x10 /* dev is enabled for use */ -#define FLAG_CTRLDAT 0x08 /* ctrl or data mode */ - +#define FLAG_INTELLI 0x80 /* device is IntelliMouse */ +#define FLAG_INTMODE 0x40 /* using Intellimouse mode */ +#define FLAG_SCALED 0x20 /* enable delta scaling */ +#define FLAG_ENABLED 0x10 /* dev is enabled for use */ +#define FLAG_CTRLDAT 0x08 /* ctrl or data mode */ int mouse_scan = 0; - #ifdef ENABLE_MOUSE_PS2_LOG int mouse_ps2_do_log = ENABLE_MOUSE_PS2_LOG; - static void mouse_ps2_log(const char *fmt, ...) { va_list ap; if (mouse_ps2_do_log) { - va_start(ap, fmt); - pclog_ex(fmt, ap); - va_end(ap); + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); } } #else -#define mouse_ps2_log(fmt, ...) +# define mouse_ps2_log(fmt, ...) #endif - void mouse_clear_data(void *priv) { - mouse_t *dev = (mouse_t *)priv; + mouse_t *dev = (mouse_t *) priv; dev->flags &= ~FLAG_CTRLDAT; } - static void ps2_write(uint8_t val, void *priv) { - mouse_t *dev = (mouse_t *)priv; - uint8_t temp; + mouse_t *dev = (mouse_t *) priv; + uint8_t temp; if (dev->flags & FLAG_CTRLDAT) { - dev->flags &= ~FLAG_CTRLDAT; + dev->flags &= ~FLAG_CTRLDAT; - if (val == 0xff) - goto mouse_reset; + if (val == 0xff) + goto mouse_reset; - switch (dev->command) { - case 0xe8: /* set mouse resolution */ - dev->resolution = val; - keyboard_at_adddata_mouse(0xfa); - break; + switch (dev->command) { + case 0xe8: /* set mouse resolution */ + dev->resolution = val; + keyboard_at_adddata_mouse(0xfa); + break; - case 0xf3: /* set sample rate */ - dev->sample_rate = val; - keyboard_at_adddata_mouse(0xfa); /* Command response */ - break; + case 0xf3: /* set sample rate */ + dev->sample_rate = val; + keyboard_at_adddata_mouse(0xfa); /* Command response */ + break; - default: - keyboard_at_adddata_mouse(0xfc); - } + default: + keyboard_at_adddata_mouse(0xfc); + } } else { - dev->command = val; + dev->command = val; - switch (dev->command) { - case 0xe6: /* set scaling to 1:1 */ - dev->flags &= ~FLAG_SCALED; - keyboard_at_adddata_mouse(0xfa); - break; + switch (dev->command) { + case 0xe6: /* set scaling to 1:1 */ + dev->flags &= ~FLAG_SCALED; + keyboard_at_adddata_mouse(0xfa); + break; - case 0xe7: /* set scaling to 2:1 */ - dev->flags |= FLAG_SCALED; - keyboard_at_adddata_mouse(0xfa); - break; + case 0xe7: /* set scaling to 2:1 */ + dev->flags |= FLAG_SCALED; + keyboard_at_adddata_mouse(0xfa); + break; - case 0xe8: /* set mouse resolution */ - dev->flags |= FLAG_CTRLDAT; - keyboard_at_adddata_mouse(0xfa); - break; + case 0xe8: /* set mouse resolution */ + dev->flags |= FLAG_CTRLDAT; + keyboard_at_adddata_mouse(0xfa); + break; - case 0xe9: /* status request */ - keyboard_at_adddata_mouse(0xfa); - temp = (dev->flags & 0x30); - if (mouse_buttons & 0x01) - temp |= 0x01; - if (mouse_buttons & 0x02) - temp |= 0x02; - if (mouse_buttons & 0x04) - temp |= 0x03; - keyboard_at_adddata_mouse(temp); - keyboard_at_adddata_mouse(dev->resolution); - keyboard_at_adddata_mouse(dev->sample_rate); - break; + case 0xe9: /* status request */ + keyboard_at_adddata_mouse(0xfa); + temp = (dev->flags & 0x30); + if (mouse_buttons & 0x01) + temp |= 0x01; + if (mouse_buttons & 0x02) + temp |= 0x02; + if (mouse_buttons & 0x04) + temp |= 0x03; + keyboard_at_adddata_mouse(temp); + keyboard_at_adddata_mouse(dev->resolution); + keyboard_at_adddata_mouse(dev->sample_rate); + break; - case 0xeb: /* Get mouse data */ - keyboard_at_adddata_mouse(0xfa); + case 0xeb: /* Get mouse data */ + keyboard_at_adddata_mouse(0xfa); - temp = 0; - if (dev->x < 0) - temp |= 0x10; - if (dev->y < 0) - temp |= 0x20; - if (mouse_buttons & 1) - temp |= 1; - if (mouse_buttons & 2) - temp |= 2; - if ((mouse_buttons & 4) && (dev->flags & FLAG_INTELLI)) - temp |= 4; - keyboard_at_adddata_mouse(temp); - keyboard_at_adddata_mouse(dev->x & 0xff); - keyboard_at_adddata_mouse(dev->y & 0xff); - if (dev->flags & FLAG_INTMODE) - keyboard_at_adddata_mouse(dev->z); - break; + temp = 0; + if (dev->x < 0) + temp |= 0x10; + if (dev->y < 0) + temp |= 0x20; + if (mouse_buttons & 1) + temp |= 1; + if (mouse_buttons & 2) + temp |= 2; + if ((mouse_buttons & 4) && (dev->flags & FLAG_INTELLI)) + temp |= 4; + keyboard_at_adddata_mouse(temp); + keyboard_at_adddata_mouse(dev->x & 0xff); + keyboard_at_adddata_mouse(dev->y & 0xff); + if (dev->flags & FLAG_INTMODE) + keyboard_at_adddata_mouse(dev->z); + break; - case 0xf2: /* read ID */ - keyboard_at_adddata_mouse(0xfa); - if (dev->flags & FLAG_INTMODE) - keyboard_at_adddata_mouse(0x03); - else - keyboard_at_adddata_mouse(0x00); - break; + case 0xf2: /* read ID */ + keyboard_at_adddata_mouse(0xfa); + if (dev->flags & FLAG_INTMODE) + keyboard_at_adddata_mouse(0x03); + else + keyboard_at_adddata_mouse(0x00); + break; - case 0xf3: /* set command mode */ - dev->flags |= FLAG_CTRLDAT; - keyboard_at_adddata_mouse(0xfa); /* ACK for command byte */ - break; + case 0xf3: /* set command mode */ + dev->flags |= FLAG_CTRLDAT; + keyboard_at_adddata_mouse(0xfa); /* ACK for command byte */ + break; - case 0xf4: /* enable */ - dev->flags |= FLAG_ENABLED; - mouse_scan = 1; - keyboard_at_adddata_mouse(0xfa); - break; + case 0xf4: /* enable */ + dev->flags |= FLAG_ENABLED; + mouse_scan = 1; + keyboard_at_adddata_mouse(0xfa); + break; - case 0xf5: /* disable */ - dev->flags &= ~FLAG_ENABLED; - mouse_scan = 0; - keyboard_at_adddata_mouse(0xfa); - break; + case 0xf5: /* disable */ + dev->flags &= ~FLAG_ENABLED; + mouse_scan = 0; + keyboard_at_adddata_mouse(0xfa); + break; - case 0xf6: /* set defaults */ - case 0xff: /* reset */ + case 0xf6: /* set defaults */ + case 0xff: /* reset */ mouse_reset: - dev->mode = MODE_STREAM; - dev->flags &= 0x88; - mouse_scan = 1; - keyboard_at_mouse_reset(); - keyboard_at_adddata_mouse(0xfa); - if (dev->command == 0xff) { - keyboard_at_adddata_mouse(0xaa); - keyboard_at_adddata_mouse(0x00); - } - break; + dev->mode = MODE_STREAM; + dev->flags &= 0x88; + mouse_scan = 1; + keyboard_at_mouse_reset(); + keyboard_at_adddata_mouse(0xfa); + if (dev->command == 0xff) { + keyboard_at_adddata_mouse(0xaa); + keyboard_at_adddata_mouse(0x00); + } + break; - default: - keyboard_at_adddata_mouse(0xfe); - } + default: + keyboard_at_adddata_mouse(0xfe); + } } if (dev->flags & FLAG_INTELLI) { - for (temp = 0; temp < 5; temp++) - dev->last_data[temp] = dev->last_data[temp + 1]; + for (temp = 0; temp < 5; temp++) + dev->last_data[temp] = dev->last_data[temp + 1]; - dev->last_data[5] = val; + dev->last_data[5] = val; - if (dev->last_data[0] == 0xf3 && dev->last_data[1] == 0xc8 && - dev->last_data[2] == 0xf3 && dev->last_data[3] == 0x64 && - dev->last_data[4] == 0xf3 && dev->last_data[5] == 0x50) - dev->flags |= FLAG_INTMODE; + if (dev->last_data[0] == 0xf3 && dev->last_data[1] == 0xc8 && dev->last_data[2] == 0xf3 && dev->last_data[3] == 0x64 && dev->last_data[4] == 0xf3 && dev->last_data[5] == 0x50) + dev->flags |= FLAG_INTMODE; } } - static int ps2_poll(int x, int y, int z, int b, void *priv) { - mouse_t *dev = (mouse_t *)priv; - uint8_t buff[3] = { 0x08, 0x00, 0x00 }; + mouse_t *dev = (mouse_t *) priv; + uint8_t buff[3] = { 0x08, 0x00, 0x00 }; if (!x && !y && !z && (b == dev->b)) - return(0xff); + return (0xff); #if 0 if (!(dev->flags & FLAG_ENABLED)) @@ -240,50 +230,54 @@ ps2_poll(int x, int y, int z, int b, void *priv) #endif if (!mouse_scan) - return(0xff); + return (0xff); dev->x += x; dev->y -= y; dev->z -= z; - if ((dev->mode == MODE_STREAM) && (dev->flags & FLAG_ENABLED) && - (keyboard_at_mouse_pos() < 13)) { - dev->b = b; + if ((dev->mode == MODE_STREAM) && (dev->flags & FLAG_ENABLED) && (keyboard_at_mouse_pos() < 13)) { + dev->b = b; - if (dev->x > 255) dev->x = 255; - if (dev->x < -256) dev->x = -256; - if (dev->y > 255) dev->y = 255; - if (dev->y < -256) dev->y = -256; - if (dev->z < -8) dev->z = -8; - if (dev->z > 7) dev->z = 7; + if (dev->x > 255) + dev->x = 255; + if (dev->x < -256) + dev->x = -256; + if (dev->y > 255) + dev->y = 255; + if (dev->y < -256) + dev->y = -256; + if (dev->z < -8) + dev->z = -8; + if (dev->z > 7) + dev->z = 7; - if (dev->x < 0) - buff[0] |= 0x10; - if (dev->y < 0) - buff[0] |= 0x20; - if (mouse_buttons & 0x01) - buff[0] |= 0x01; - if (mouse_buttons & 0x02) - buff[0] |= 0x02; - if (dev->flags & FLAG_INTELLI) { - if (mouse_buttons & 0x04) - buff[0] |= 0x04; - } - buff[1] = (dev->x & 0xff); - buff[2] = (dev->y & 0xff); + if (dev->x < 0) + buff[0] |= 0x10; + if (dev->y < 0) + buff[0] |= 0x20; + if (mouse_buttons & 0x01) + buff[0] |= 0x01; + if (mouse_buttons & 0x02) + buff[0] |= 0x02; + if (dev->flags & FLAG_INTELLI) { + if (mouse_buttons & 0x04) + buff[0] |= 0x04; + } + buff[1] = (dev->x & 0xff); + buff[2] = (dev->y & 0xff); - keyboard_at_adddata_mouse(buff[0]); - keyboard_at_adddata_mouse(buff[1]); - keyboard_at_adddata_mouse(buff[2]); - if (dev->flags & FLAG_INTMODE) - keyboard_at_adddata_mouse(dev->z); + keyboard_at_adddata_mouse(buff[0]); + keyboard_at_adddata_mouse(buff[1]); + keyboard_at_adddata_mouse(buff[2]); + if (dev->flags & FLAG_INTMODE) + keyboard_at_adddata_mouse(dev->z); - dev->x = dev->y = dev->z = 0; + dev->x = dev->y = dev->z = 0; } - return(0); + return (0); } - /* * Initialize the device for use by the user. * @@ -293,15 +287,15 @@ void * mouse_ps2_init(const device_t *info) { mouse_t *dev; - int i; + int i; - dev = (mouse_t *)malloc(sizeof(mouse_t)); + dev = (mouse_t *) malloc(sizeof(mouse_t)); memset(dev, 0x00, sizeof(mouse_t)); dev->name = info->name; dev->type = info->local; dev->mode = MODE_STREAM; - i = device_get_config_int("buttons"); + i = device_get_config_int("buttons"); if (i > 2) dev->flags |= FLAG_INTELLI; @@ -314,14 +308,13 @@ mouse_ps2_init(const device_t *info) mouse_set_buttons((dev->flags & FLAG_INTELLI) ? 3 : 2); /* Return our private data to the I/O layer. */ - return(dev); + return (dev); } - static void ps2_close(void *priv) { - mouse_t *dev = (mouse_t *)priv; + mouse_t *dev = (mouse_t *) priv; /* Unhook from the general AT Keyboard driver. */ keyboard_at_set_mouse(NULL, NULL); @@ -330,7 +323,7 @@ ps2_close(void *priv) } static const device_config_t ps2_config[] = { -// clang-format off + // clang-format off { .name = "buttons", .description = "Buttons", @@ -353,15 +346,15 @@ static const device_config_t ps2_config[] = { }; const device_t mouse_ps2_device = { - .name = "Standard PS/2 Mouse", + .name = "Standard PS/2 Mouse", .internal_name = "ps2", - .flags = DEVICE_PS2, - .local = MOUSE_TYPE_PS2, - .init = mouse_ps2_init, - .close = ps2_close, - .reset = NULL, + .flags = DEVICE_PS2, + .local = MOUSE_TYPE_PS2, + .init = mouse_ps2_init, + .close = ps2_close, + .reset = NULL, { .poll = ps2_poll }, .speed_changed = NULL, - .force_redraw = NULL, - .config = ps2_config + .force_redraw = NULL, + .config = ps2_config }; diff --git a/src/device/mouse_serial.c b/src/device/mouse_serial.c index 68b570565..2658a9e49 100644 --- a/src/device/mouse_serial.c +++ b/src/device/mouse_serial.c @@ -27,8 +27,7 @@ #include <86box/serial.h> #include <86box/mouse.h> - -#define SERMOUSE_PORT 0 /* attach to Serial0 */ +#define SERMOUSE_PORT 0 /* attach to Serial0 */ enum { PHASE_IDLE, @@ -46,70 +45,66 @@ enum { REPORT_PHASE_TRANSMIT }; - typedef struct { - const char *name; /* name of this device */ - int8_t type, /* type of this device */ - port; - uint8_t flags, but, /* device flags */ - want_data, - status, format, - prompt, on_change, - id_len, id[255], - data_len, data[5]; - int abs_x, abs_y, - rel_x, rel_y, - rel_z, - oldb, lastb; + const char *name; /* name of this device */ + int8_t type, /* type of this device */ + port; + uint8_t flags, but, /* device flags */ + want_data, + status, format, + prompt, on_change, + id_len, id[255], + data_len, data[5]; + int abs_x, abs_y, + rel_x, rel_y, + rel_z, + oldb, lastb; - int command_pos, command_phase, - report_pos, report_phase, - command_enabled, report_enabled; - double transmit_period, report_period; - pc_timer_t command_timer, report_timer; + int command_pos, command_phase, + report_pos, report_phase, + command_enabled, report_enabled; + double transmit_period, report_period; + pc_timer_t command_timer, report_timer; - serial_t *serial; + serial_t *serial; } mouse_t; -#define FLAG_INPORT 0x80 /* device is MS InPort */ -#define FLAG_3BTN 0x20 /* enable 3-button mode */ -#define FLAG_SCALED 0x10 /* enable delta scaling */ -#define FLAG_INTR 0x04 /* dev can send interrupts */ -#define FLAG_FROZEN 0x02 /* do not update counters */ -#define FLAG_ENABLED 0x01 /* dev is enabled for use */ - +#define FLAG_INPORT 0x80 /* device is MS InPort */ +#define FLAG_3BTN 0x20 /* enable 3-button mode */ +#define FLAG_SCALED 0x10 /* enable delta scaling */ +#define FLAG_INTR 0x04 /* dev can send interrupts */ +#define FLAG_FROZEN 0x02 /* do not update counters */ +#define FLAG_ENABLED 0x01 /* dev is enabled for use */ #ifdef ENABLE_MOUSE_SERIAL_LOG int mouse_serial_do_log = ENABLE_MOUSE_SERIAL_LOG; - static void mouse_serial_log(const char *fmt, ...) { va_list ap; if (mouse_serial_do_log) { - va_start(ap, fmt); - pclog_ex(fmt, ap); - va_end(ap); + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); } } #else -#define mouse_serial_log(fmt, ...) +# define mouse_serial_log(fmt, ...) #endif - static void sermouse_timer_on(mouse_t *dev, double period, int report) { pc_timer_t *timer; - int *enabled; + int *enabled; if (report) { - timer = &dev->report_timer; - enabled = &dev->report_enabled; + timer = &dev->report_timer; + enabled = &dev->report_enabled; } else { - timer = &dev->command_timer; - enabled = &dev->command_enabled; + timer = &dev->command_timer; + enabled = &dev->command_enabled; } timer_on_auto(timer, period); @@ -117,60 +112,58 @@ sermouse_timer_on(mouse_t *dev, double period, int report) *enabled = 1; } - static double sermouse_transmit_period(mouse_t *dev, int bps, int rps) { double dbps = (double) bps; double temp = 0.0; - int word_len; + int word_len; switch (dev->format) { - case 0: - case 1: /* Mouse Systems and Three Byte Packed formats: 8 data, no parity, 2 stop, 1 start */ - word_len = 11; - break; - case 2: /* Hexadecimal format - 8 data, no parity, 1 stop, 1 start - number of stop bits is a guess because - it is not documented anywhere. */ - word_len = 10; - break; - case 3: - case 6: /* Bit Pad One formats: 7 data, even parity, 2 stop, 1 start */ - word_len = 11; - break; - case 5: /* MM Series format: 8 data, odd parity, 1 stop, 1 start */ - word_len = 11; - break; - default: - case 7: /* Microsoft-compatible format: 7 data, no parity, 1 stop, 1 start */ - word_len = 9; - break; + case 0: + case 1: /* Mouse Systems and Three Byte Packed formats: 8 data, no parity, 2 stop, 1 start */ + word_len = 11; + break; + case 2: /* Hexadecimal format - 8 data, no parity, 1 stop, 1 start - number of stop bits is a guess because + it is not documented anywhere. */ + word_len = 10; + break; + case 3: + case 6: /* Bit Pad One formats: 7 data, even parity, 2 stop, 1 start */ + word_len = 11; + break; + case 5: /* MM Series format: 8 data, odd parity, 1 stop, 1 start */ + word_len = 11; + break; + default: + case 7: /* Microsoft-compatible format: 7 data, no parity, 1 stop, 1 start */ + word_len = 9; + break; } if (rps == -1) - temp = (double) word_len; + temp = (double) word_len; else { - temp = (double) rps; - temp = (9600.0 - (temp * 33.0)); - temp /= rps; + temp = (double) rps; + temp = (9600.0 - (temp * 33.0)); + temp /= rps; } temp = (1000000.0 / dbps) * temp; return temp; } - /* Callback from serial driver: RTS was toggled. */ static void sermouse_callback(struct serial_s *serial, void *priv) { - mouse_t *dev = (mouse_t *)priv; + mouse_t *dev = (mouse_t *) priv; /* Start a timer to wake us up in a little while. */ - dev->command_pos = 0; + dev->command_pos = 0; dev->command_phase = PHASE_ID; if (dev->id[0] != 'H') - dev->format = 7; + dev->format = 7; dev->transmit_period = sermouse_transmit_period(dev, 1200, -1); timer_stop(&dev->command_timer); #ifdef USE_NEW_DYNAREC @@ -180,66 +173,62 @@ sermouse_callback(struct serial_s *serial, void *priv) #endif } - static uint8_t sermouse_data_msystems(mouse_t *dev, int x, int y, int b) { dev->data[0] = 0x80; - dev->data[0] |= (b & 0x01) ? 0x00 : 0x04; /* left button */ - dev->data[0] |= (b & 0x02) ? 0x00 : 0x01; /* middle button */ - dev->data[0] |= (b & 0x04) ? 0x00 : 0x02; /* right button */ + dev->data[0] |= (b & 0x01) ? 0x00 : 0x04; /* left button */ + dev->data[0] |= (b & 0x02) ? 0x00 : 0x01; /* middle button */ + dev->data[0] |= (b & 0x04) ? 0x00 : 0x02; /* right button */ dev->data[1] = x; dev->data[2] = -y; - dev->data[3] = x; /* same as byte 1 */ - dev->data[4] = -y; /* same as byte 2 */ + dev->data[3] = x; /* same as byte 1 */ + dev->data[4] = -y; /* same as byte 2 */ return 5; } - static uint8_t sermouse_data_3bp(mouse_t *dev, int x, int y, int b) { - dev->data[0] |= (b & 0x01) ? 0x00 : 0x04; /* left button */ - dev->data[0] |= (b & 0x04) ? 0x00 : 0x02; /* middle button */ - dev->data[0] |= (b & 0x02) ? 0x00 : 0x01; /* right button */ + dev->data[0] |= (b & 0x01) ? 0x00 : 0x04; /* left button */ + dev->data[0] |= (b & 0x04) ? 0x00 : 0x02; /* middle button */ + dev->data[0] |= (b & 0x02) ? 0x00 : 0x01; /* right button */ dev->data[1] = x; dev->data[2] = -y; return 3; } - static uint8_t sermouse_data_mmseries(mouse_t *dev, int x, int y, int b) { if (x < -127) - x = -127; + x = -127; if (y < -127) - y = -127; + y = -127; dev->data[0] = 0x80; if (x >= 0) - dev->data[0] |= 0x10; + dev->data[0] |= 0x10; if (y < 0) - dev->data[0] |= 0x08; - dev->data[0] |= (b & 0x01) ? 0x04 : 0x00; /* left button */ - dev->data[0] |= (b & 0x04) ? 0x02 : 0x00; /* middle button */ - dev->data[0] |= (b & 0x02) ? 0x01 : 0x00; /* right button */ + dev->data[0] |= 0x08; + dev->data[0] |= (b & 0x01) ? 0x04 : 0x00; /* left button */ + dev->data[0] |= (b & 0x04) ? 0x02 : 0x00; /* middle button */ + dev->data[0] |= (b & 0x02) ? 0x01 : 0x00; /* right button */ dev->data[1] = abs(x); dev->data[2] = abs(y); return 3; } - static uint8_t sermouse_data_bp1(mouse_t *dev, int x, int y, int b) { dev->data[0] = 0x80; - dev->data[0] |= (b & 0x01) ? 0x10 : 0x00; /* left button */ - dev->data[0] |= (b & 0x04) ? 0x08 : 0x00; /* middle button */ - dev->data[0] |= (b & 0x02) ? 0x04 : 0x00; /* right button */ + dev->data[0] |= (b & 0x01) ? 0x10 : 0x00; /* left button */ + dev->data[0] |= (b & 0x04) ? 0x08 : 0x00; /* middle button */ + dev->data[0] |= (b & 0x02) ? 0x04 : 0x00; /* right button */ dev->data[1] = (x & 0x3f); dev->data[2] = (x >> 6); dev->data[3] = (y & 0x3f); @@ -248,7 +237,6 @@ sermouse_data_bp1(mouse_t *dev, int x, int y, int b) return 5; } - static uint8_t sermouse_data_ms(mouse_t *dev, int x, int y, int z, int b) { @@ -258,57 +246,55 @@ sermouse_data_ms(mouse_t *dev, int x, int y, int z, int b) dev->data[0] |= (((y >> 6) & 0x03) << 2); dev->data[0] |= ((x >> 6) & 0x03); if (b & 0x01) - dev->data[0] |= 0x20; + dev->data[0] |= 0x20; if (b & 0x02) - dev->data[0] |= 0x10; + dev->data[0] |= 0x10; dev->data[1] = x & 0x3F; dev->data[2] = y & 0x3F; if (dev->but == 3) { - len = 3; - if (dev->type == MOUSE_TYPE_LT3BUTTON) { - if (b & 0x04) { - dev->data[3] = 0x20; - len++; - } - } else { - if ((b ^ dev->oldb) & 0x04) { - /* Microsoft 3-button mice send a fourth byte of 0x00 when the middle button - has changed. */ - dev->data[3] = 0x00; - len++; - } - } + len = 3; + if (dev->type == MOUSE_TYPE_LT3BUTTON) { + if (b & 0x04) { + dev->data[3] = 0x20; + len++; + } + } else { + if ((b ^ dev->oldb) & 0x04) { + /* Microsoft 3-button mice send a fourth byte of 0x00 when the middle button + has changed. */ + dev->data[3] = 0x00; + len++; + } + } } else if (dev->but == 4) { - len = 4; - dev->data[3] = z & 0x0F; - if (b & 0x04) - dev->data[3] |= 0x10; + len = 4; + dev->data[3] = z & 0x0F; + if (b & 0x04) + dev->data[3] |= 0x10; } else - len = 3; + len = 3; return len; } - static uint8_t sermouse_data_hex(mouse_t *dev, int x, int y, int b) { - char ret[6] = { 0, 0, 0, 0, 0, 0 }; + char ret[6] = { 0, 0, 0, 0, 0, 0 }; uint8_t i, but = 0x00; - but |= (b & 0x01) ? 0x04 : 0x00; /* left button */ - but |= (b & 0x04) ? 0x02 : 0x00; /* middle button */ - but |= (b & 0x02) ? 0x01 : 0x00; /* right button */ + but |= (b & 0x01) ? 0x04 : 0x00; /* left button */ + but |= (b & 0x04) ? 0x02 : 0x00; /* middle button */ + but |= (b & 0x02) ? 0x01 : 0x00; /* right button */ sprintf(ret, "%02X%02X%01X", (int8_t) y, (int8_t) x, but & 0x0f); for (i = 0; i < 5; i++) - dev->data[i] = ret[4 - i]; + dev->data[i] = ret[4 - i]; return 5; } - static void sermouse_report(int x, int y, int z, int b, mouse_t *dev) { @@ -318,102 +304,97 @@ sermouse_report(int x, int y, int z, int b, mouse_t *dev) /* If the mouse is 2-button, ignore the middle button. */ if (dev->but == 2) - b &= ~0x04; + b &= ~0x04; switch (dev->format) { - case 0: - len = sermouse_data_msystems(dev, x, y, b); - break; - case 1: - len = sermouse_data_3bp(dev, x, y, b); - break; - case 2: - len = sermouse_data_hex(dev, x, y, b); - break; - case 3: /* Relative */ - len = sermouse_data_bp1(dev, x, y, b); - break; - case 5: - len = sermouse_data_mmseries(dev, x, y, b); - break; - case 6: /* Absolute */ - len = sermouse_data_bp1(dev, dev->abs_x, dev->abs_y, b); - break; - case 7: - len = sermouse_data_ms(dev, x, y, z, b); - break; + case 0: + len = sermouse_data_msystems(dev, x, y, b); + break; + case 1: + len = sermouse_data_3bp(dev, x, y, b); + break; + case 2: + len = sermouse_data_hex(dev, x, y, b); + break; + case 3: /* Relative */ + len = sermouse_data_bp1(dev, x, y, b); + break; + case 5: + len = sermouse_data_mmseries(dev, x, y, b); + break; + case 6: /* Absolute */ + len = sermouse_data_bp1(dev, dev->abs_x, dev->abs_y, b); + break; + case 7: + len = sermouse_data_ms(dev, x, y, z, b); + break; } dev->data_len = len; } - static void sermouse_command_phase_idle(mouse_t *dev) { - dev->command_pos = 0; - dev->command_phase = PHASE_IDLE; + dev->command_pos = 0; + dev->command_phase = PHASE_IDLE; dev->command_enabled = 0; } - static void sermouse_command_pos_check(mouse_t *dev, int len) { if (++dev->command_pos == len) - sermouse_command_phase_idle(dev); + sermouse_command_phase_idle(dev); else - timer_on_auto(&dev->command_timer, dev->transmit_period); + timer_on_auto(&dev->command_timer, dev->transmit_period); } - static uint8_t sermouse_last_button_status(mouse_t *dev) { uint8_t ret = 0x00; if (dev->oldb & 0x01) - ret |= 0x04; + ret |= 0x04; if (dev->oldb & 0x02) - ret |= 0x02; + ret |= 0x02; if (dev->oldb & 0x04) - ret |= 0x01; + ret |= 0x01; return ret; } - static void sermouse_update_delta(mouse_t *dev, int *local, int *global) { int min, max; if (dev->format == 3) { - min = -2048; - max = 2047; + min = -2048; + max = 2047; } else { - min = -128; - max = 127; + min = -128; + max = 127; } if (*global > max) { - *local = max; - *global -= max; + *local = max; + *global -= max; } else if (*global < min) { - *local = min; - *global += -min; + *local = min; + *global += -min; } else { - *local = *global; - *global = 0; + *local = *global; + *global = 0; } } - static uint8_t sermouse_update_data(mouse_t *dev) { uint8_t ret = 0; - int delta_x, delta_y, delta_z; + int delta_x, delta_y, delta_z; /* Update the deltas and the delays. */ sermouse_update_delta(dev, &delta_x, &dev->rel_x); @@ -423,10 +404,10 @@ sermouse_update_data(mouse_t *dev) sermouse_report(delta_x, delta_y, delta_z, dev->oldb, dev); mouse_serial_log("delta_x = %i, delta_y = %i, delta_z = %i, dev->oldb = %02X\n", - delta_x, delta_y, delta_z, dev->oldb); + delta_x, delta_y, delta_z, dev->oldb); if (delta_x || delta_y || delta_z || (dev->oldb != dev->lastb) || !dev->on_change) - ret = 1; + ret = 1; dev->lastb = dev->oldb; @@ -435,167 +416,167 @@ sermouse_update_data(mouse_t *dev) return ret; } - static double sermouse_report_period(mouse_t *dev) { if (dev->report_period == 0) - return dev->transmit_period; + return dev->transmit_period; else - return dev->report_period; + return dev->report_period; } - static void sermouse_report_prepare(mouse_t *dev) { if (sermouse_update_data(dev)) { - /* Start sending data. */ - dev->report_phase = REPORT_PHASE_TRANSMIT; - dev->report_pos = 0; - sermouse_timer_on(dev, dev->transmit_period, 1); + /* Start sending data. */ + dev->report_phase = REPORT_PHASE_TRANSMIT; + dev->report_pos = 0; + sermouse_timer_on(dev, dev->transmit_period, 1); } else { - dev->report_phase = REPORT_PHASE_PREPARE; - sermouse_timer_on(dev, sermouse_report_period(dev), 1); + dev->report_phase = REPORT_PHASE_PREPARE; + sermouse_timer_on(dev, sermouse_report_period(dev), 1); } } - static void sermouse_report_timer(void *priv) { - mouse_t *dev = (mouse_t *)priv; + mouse_t *dev = (mouse_t *) priv; if (dev->report_phase == REPORT_PHASE_PREPARE) - sermouse_report_prepare(dev); + sermouse_report_prepare(dev); else { - /* If using the Mouse Systems format, update data because - the last two bytes are the X and Y delta since bytes 1 - and 2 were transmitted. */ - if (!dev->format && (dev->report_pos == 3)) - sermouse_update_data(dev); - serial_write_fifo(dev->serial, dev->data[dev->report_pos]); - if (++dev->report_pos == dev->data_len) { - if (!dev->report_enabled) - sermouse_report_prepare(dev); - else { - sermouse_timer_on(dev, sermouse_report_period(dev), 1); - dev->report_phase = REPORT_PHASE_PREPARE; - } - } else - sermouse_timer_on(dev, dev->transmit_period, 1); + /* If using the Mouse Systems format, update data because + the last two bytes are the X and Y delta since bytes 1 + and 2 were transmitted. */ + if (!dev->format && (dev->report_pos == 3)) + sermouse_update_data(dev); + serial_write_fifo(dev->serial, dev->data[dev->report_pos]); + if (++dev->report_pos == dev->data_len) { + if (!dev->report_enabled) + sermouse_report_prepare(dev); + else { + sermouse_timer_on(dev, sermouse_report_period(dev), 1); + dev->report_phase = REPORT_PHASE_PREPARE; + } + } else + sermouse_timer_on(dev, dev->transmit_period, 1); } } - /* Callback timer expired, now send our "mouse ID" to the serial port. */ static void sermouse_command_timer(void *priv) { - mouse_t *dev = (mouse_t *)priv; + mouse_t *dev = (mouse_t *) priv; switch (dev->command_phase) { - case PHASE_ID: - serial_write_fifo(dev->serial, dev->id[dev->command_pos]); - sermouse_command_pos_check(dev, dev->id_len); - if ((dev->command_phase == PHASE_IDLE) && (dev->type != MOUSE_TYPE_MSYSTEMS)) { - /* This resets back to Microsoft-compatible mode. */ - dev->report_phase = REPORT_PHASE_PREPARE; - sermouse_report_timer((void *) dev); - } - break; - case PHASE_DATA: - serial_write_fifo(dev->serial, dev->data[dev->command_pos]); - sermouse_command_pos_check(dev, dev->data_len); - break; - case PHASE_STATUS: - serial_write_fifo(dev->serial, dev->status); - sermouse_command_phase_idle(dev); - break; - case PHASE_DIAGNOSTIC: - if (dev->command_pos) - serial_write_fifo(dev->serial, 0x00); - else - serial_write_fifo(dev->serial, sermouse_last_button_status(dev)); - sermouse_command_pos_check(dev, 3); - break; - case PHASE_FORMAT_AND_REVISION: - serial_write_fifo(dev->serial, 0x10 | (dev->format << 1)); - sermouse_command_phase_idle(dev); - break; - case PHASE_BUTTONS: - serial_write_fifo(dev->serial, dev->but); - sermouse_command_phase_idle(dev); - break; - default: - sermouse_command_phase_idle(dev); - break; + case PHASE_ID: + serial_write_fifo(dev->serial, dev->id[dev->command_pos]); + sermouse_command_pos_check(dev, dev->id_len); + if ((dev->command_phase == PHASE_IDLE) && (dev->type != MOUSE_TYPE_MSYSTEMS)) { + /* This resets back to Microsoft-compatible mode. */ + dev->report_phase = REPORT_PHASE_PREPARE; + sermouse_report_timer((void *) dev); + } + break; + case PHASE_DATA: + serial_write_fifo(dev->serial, dev->data[dev->command_pos]); + sermouse_command_pos_check(dev, dev->data_len); + break; + case PHASE_STATUS: + serial_write_fifo(dev->serial, dev->status); + sermouse_command_phase_idle(dev); + break; + case PHASE_DIAGNOSTIC: + if (dev->command_pos) + serial_write_fifo(dev->serial, 0x00); + else + serial_write_fifo(dev->serial, sermouse_last_button_status(dev)); + sermouse_command_pos_check(dev, 3); + break; + case PHASE_FORMAT_AND_REVISION: + serial_write_fifo(dev->serial, 0x10 | (dev->format << 1)); + sermouse_command_phase_idle(dev); + break; + case PHASE_BUTTONS: + serial_write_fifo(dev->serial, dev->but); + sermouse_command_phase_idle(dev); + break; + default: + sermouse_command_phase_idle(dev); + break; } } - static int sermouse_poll(int x, int y, int z, int b, void *priv) { - mouse_t *dev = (mouse_t *)priv; + mouse_t *dev = (mouse_t *) priv; if (!x && !y && !z && (b == dev->oldb)) { - dev->oldb = b; - return(1); + dev->oldb = b; + return (1); } dev->oldb = b; dev->abs_x += x; dev->abs_y += y; if (dev->abs_x < 0) - dev->abs_x = 0; + dev->abs_x = 0; if (dev->abs_x > 4095) - dev->abs_x = 4095; + dev->abs_x = 4095; if (dev->abs_y < 0) - dev->abs_y = 0; + dev->abs_y = 0; if (dev->abs_y > 4095) - dev->abs_y = 4095; + dev->abs_y = 4095; if (dev->format == 3) { - if (x > 2047) x = 2047; - if (y > 2047) y = 2047; - if (x <- 2048) x = -2048; - if (y <- 2048) y = -2048; + if (x > 2047) + x = 2047; + if (y > 2047) + y = 2047; + if (x < -2048) + x = -2048; + if (y < -2048) + y = -2048; } else { - if (x > 127) x = 127; - if (y > 127) y = 127; - if (x <- 128) x = -128; - if (y <- 128) y = -128; + if (x > 127) + x = 127; + if (y > 127) + y = 127; + if (x < -128) + x = -128; + if (y < -128) + y = -128; } dev->rel_x += x; dev->rel_y += y; dev->rel_z += z; - return(0); + return (0); } - static void ltsermouse_prompt_mode(mouse_t *dev, int prompt) { dev->prompt = prompt; dev->status &= 0xBF; if (prompt) - dev->status |= 0x40; + dev->status |= 0x40; } - static void ltsermouse_command_phase(mouse_t *dev, int phase) { - dev->command_pos = 0; + dev->command_pos = 0; dev->command_phase = phase; timer_stop(&dev->command_timer); sermouse_timer_on(dev, dev->transmit_period, 0); } - static void ltsermouse_set_report_period(mouse_t *dev, int rps) { @@ -606,198 +587,197 @@ ltsermouse_set_report_period(mouse_t *dev, int rps) dev->report_phase = REPORT_PHASE_PREPARE; } - static void ltsermouse_write(struct serial_s *serial, void *priv, uint8_t data) { - mouse_t *dev = (mouse_t *)priv; + mouse_t *dev = (mouse_t *) priv; /* Stop reporting when we're processing a command. */ dev->report_phase = REPORT_PHASE_PREPARE; - if (dev->want_data) switch (dev->want_data) { - case 0x2A: - dev->data_len--; - dev->want_data = 0; - switch (data) { - default: - mouse_serial_log("Serial mouse: Invalid period %02X, using 1200 bps\n", data); - /*FALLTHROUGH*/ - case 0x6E: - dev->transmit_period = sermouse_transmit_period(dev, 1200, -1); - break; - case 0x6F: - dev->transmit_period = sermouse_transmit_period(dev, 2400, -1); - break; - case 0x70: - dev->transmit_period = sermouse_transmit_period(dev, 4800, -1); - break; - case 0x71: - dev->transmit_period = sermouse_transmit_period(dev, 9600, -1); - break; - } - break; - } else switch (data) { - case 0x2A: - dev->want_data = data; - dev->data_len = 1; - break; - case 0x44: /* Set prompt mode */ - ltsermouse_prompt_mode(dev, 1); - break; - case 0x50: - if (!dev->prompt) - ltsermouse_prompt_mode(dev, 1); - sermouse_update_data(dev); - ltsermouse_command_phase(dev, PHASE_DATA); - break; - case 0x73: /* Status */ - ltsermouse_command_phase(dev, PHASE_STATUS); - break; - case 0x4A: /* Report Rate Selection commands */ - ltsermouse_set_report_period(dev, 10); - break; - case 0x4B: - ltsermouse_set_report_period(dev, 20); - break; - case 0x4C: - ltsermouse_set_report_period(dev, 35); - break; - case 0x52: - ltsermouse_set_report_period(dev, 50); - break; - case 0x4D: - ltsermouse_set_report_period(dev, 70); - break; - case 0x51: - ltsermouse_set_report_period(dev, 100); - break; - case 0x4E: - ltsermouse_set_report_period(dev, 150); - break; - case 0x4F: - ltsermouse_prompt_mode(dev, 0); - dev->report_period = 0; - timer_stop(&dev->report_timer); - dev->report_phase = REPORT_PHASE_PREPARE; - sermouse_report_timer((void *) dev); - break; - case 0x41: - dev->format = 6; /* Aboslute Bit Pad One Format */ - dev->abs_x = dev->abs_y = 0; - break; - case 0x42: - dev->format = 3; /* Relative Bit Pad One Format */ - break; - case 0x53: - dev->format = 5; /* MM Series Format */ - break; - case 0x54: - dev->format = 1; /* Three Byte Packed Binary Format */ - break; - case 0x55: /* This is the Mouse Systems-compatible format */ - dev->format = 0; /* Five Byte Packed Binary Format */ - break; - case 0x56: - dev->format = 7; /* Microsoft Compatible Format */ - break; - case 0x57: - dev->format = 2; /* Hexadecimal Format */ - break; - case 0x05: - ltsermouse_command_phase(dev, PHASE_DIAGNOSTIC); - break; - case 0x66: - ltsermouse_command_phase(dev, PHASE_FORMAT_AND_REVISION); - break; - case 0x6B: - ltsermouse_command_phase(dev, PHASE_BUTTONS); - break; - } + if (dev->want_data) + switch (dev->want_data) { + case 0x2A: + dev->data_len--; + dev->want_data = 0; + switch (data) { + default: + mouse_serial_log("Serial mouse: Invalid period %02X, using 1200 bps\n", data); + /*FALLTHROUGH*/ + case 0x6E: + dev->transmit_period = sermouse_transmit_period(dev, 1200, -1); + break; + case 0x6F: + dev->transmit_period = sermouse_transmit_period(dev, 2400, -1); + break; + case 0x70: + dev->transmit_period = sermouse_transmit_period(dev, 4800, -1); + break; + case 0x71: + dev->transmit_period = sermouse_transmit_period(dev, 9600, -1); + break; + } + break; + } + else + switch (data) { + case 0x2A: + dev->want_data = data; + dev->data_len = 1; + break; + case 0x44: /* Set prompt mode */ + ltsermouse_prompt_mode(dev, 1); + break; + case 0x50: + if (!dev->prompt) + ltsermouse_prompt_mode(dev, 1); + sermouse_update_data(dev); + ltsermouse_command_phase(dev, PHASE_DATA); + break; + case 0x73: /* Status */ + ltsermouse_command_phase(dev, PHASE_STATUS); + break; + case 0x4A: /* Report Rate Selection commands */ + ltsermouse_set_report_period(dev, 10); + break; + case 0x4B: + ltsermouse_set_report_period(dev, 20); + break; + case 0x4C: + ltsermouse_set_report_period(dev, 35); + break; + case 0x52: + ltsermouse_set_report_period(dev, 50); + break; + case 0x4D: + ltsermouse_set_report_period(dev, 70); + break; + case 0x51: + ltsermouse_set_report_period(dev, 100); + break; + case 0x4E: + ltsermouse_set_report_period(dev, 150); + break; + case 0x4F: + ltsermouse_prompt_mode(dev, 0); + dev->report_period = 0; + timer_stop(&dev->report_timer); + dev->report_phase = REPORT_PHASE_PREPARE; + sermouse_report_timer((void *) dev); + break; + case 0x41: + dev->format = 6; /* Aboslute Bit Pad One Format */ + dev->abs_x = dev->abs_y = 0; + break; + case 0x42: + dev->format = 3; /* Relative Bit Pad One Format */ + break; + case 0x53: + dev->format = 5; /* MM Series Format */ + break; + case 0x54: + dev->format = 1; /* Three Byte Packed Binary Format */ + break; + case 0x55: /* This is the Mouse Systems-compatible format */ + dev->format = 0; /* Five Byte Packed Binary Format */ + break; + case 0x56: + dev->format = 7; /* Microsoft Compatible Format */ + break; + case 0x57: + dev->format = 2; /* Hexadecimal Format */ + break; + case 0x05: + ltsermouse_command_phase(dev, PHASE_DIAGNOSTIC); + break; + case 0x66: + ltsermouse_command_phase(dev, PHASE_FORMAT_AND_REVISION); + break; + case 0x6B: + ltsermouse_command_phase(dev, PHASE_BUTTONS); + break; + } } - static void sermouse_speed_changed(void *priv) { - mouse_t *dev = (mouse_t *)priv; + mouse_t *dev = (mouse_t *) priv; if (dev->report_enabled) { - timer_stop(&dev->report_timer); - if (dev->report_phase == REPORT_PHASE_TRANSMIT) - sermouse_timer_on(dev, dev->transmit_period, 1); - else - sermouse_timer_on(dev, sermouse_report_period(dev), 1); + timer_stop(&dev->report_timer); + if (dev->report_phase == REPORT_PHASE_TRANSMIT) + sermouse_timer_on(dev, dev->transmit_period, 1); + else + sermouse_timer_on(dev, sermouse_report_period(dev), 1); } if (dev->command_enabled) { - timer_stop(&dev->command_timer); - sermouse_timer_on(dev, dev->transmit_period, 0); + timer_stop(&dev->command_timer); + sermouse_timer_on(dev, dev->transmit_period, 0); } } - static void sermouse_close(void *priv) { - mouse_t *dev = (mouse_t *)priv; + mouse_t *dev = (mouse_t *) priv; /* Detach serial port from the mouse. */ if (dev && dev->serial && dev->serial->sd) - memset(dev->serial->sd, 0, sizeof(serial_device_t)); + memset(dev->serial->sd, 0, sizeof(serial_device_t)); free(dev); } - /* Initialize the device for use by the user. */ static void * sermouse_init(const device_t *info) { mouse_t *dev; - dev = (mouse_t *)malloc(sizeof(mouse_t)); + dev = (mouse_t *) malloc(sizeof(mouse_t)); memset(dev, 0x00, sizeof(mouse_t)); dev->name = info->name; - dev->but = device_get_config_int("buttons"); + dev->but = device_get_config_int("buttons"); if (dev->but > 2) - dev->flags |= FLAG_3BTN; + dev->flags |= FLAG_3BTN; if (info->local == MOUSE_TYPE_MSYSTEMS) { - dev->on_change = 1; - dev->format = 0; - dev->type = info->local; - dev->id_len = 1; - dev->id[0] = 'H'; + dev->on_change = 1; + dev->format = 0; + dev->type = info->local; + dev->id_len = 1; + dev->id[0] = 'H'; } else { - dev->on_change = !info->local; - dev->format = 7; - dev->status = 0x0f; - dev->id_len = 1; - dev->id[0] = 'M'; - switch(dev->but) { - case 2: - default: - dev->type = info->local ? MOUSE_TYPE_LOGITECH : MOUSE_TYPE_MICROSOFT; - break; - case 3: - dev->type = info->local ? MOUSE_TYPE_LT3BUTTON : MOUSE_TYPE_MS3BUTTON; - dev->id_len = 2; - dev->id[1] = '3'; - break; - case 4: - dev->type = MOUSE_TYPE_MSWHEEL; - dev->id_len = 6; - dev->id[1] = 'Z'; - dev->id[2] = '@'; - break; - } + dev->on_change = !info->local; + dev->format = 7; + dev->status = 0x0f; + dev->id_len = 1; + dev->id[0] = 'M'; + switch (dev->but) { + case 2: + default: + dev->type = info->local ? MOUSE_TYPE_LOGITECH : MOUSE_TYPE_MICROSOFT; + break; + case 3: + dev->type = info->local ? MOUSE_TYPE_LT3BUTTON : MOUSE_TYPE_MS3BUTTON; + dev->id_len = 2; + dev->id[1] = '3'; + break; + case 4: + dev->type = MOUSE_TYPE_MSWHEEL; + dev->id_len = 6; + dev->id[1] = 'Z'; + dev->id[2] = '@'; + break; + } } dev->transmit_period = sermouse_transmit_period(dev, 1200, -1); /* Default: Continuous reporting = no delay between reports. */ - dev->report_phase = REPORT_PHASE_PREPARE; + dev->report_phase = REPORT_PHASE_PREPARE; dev->report_period = 0; /* Default: Doing nothing - command transmit timer deactivated. */ @@ -807,9 +787,9 @@ sermouse_init(const device_t *info) /* Attach a serial port to the mouse. */ if (info->local) - dev->serial = serial_attach(dev->port, sermouse_callback, ltsermouse_write, dev); + dev->serial = serial_attach(dev->port, sermouse_callback, ltsermouse_write, dev); else - dev->serial = serial_attach(dev->port, sermouse_callback, NULL, dev); + dev->serial = serial_attach(dev->port, sermouse_callback, NULL, dev); mouse_serial_log("%s: port=COM%d\n", dev->name, dev->port + 1); @@ -817,19 +797,19 @@ sermouse_init(const device_t *info) timer_add(&dev->command_timer, sermouse_command_timer, dev, 0); if (info->local == MOUSE_TYPE_MSYSTEMS) { - sermouse_timer_on(dev, dev->transmit_period, 1); - dev->report_enabled = 1; + sermouse_timer_on(dev, dev->transmit_period, 1); + dev->report_enabled = 1; } /* Tell them how many buttons we have. */ mouse_set_buttons((dev->flags & FLAG_3BTN) ? 3 : 2); /* Return our private data to the I/O layer. */ - return(dev); + return (dev); } static const device_config_t mssermouse_config[] = { -// clang-format off + // clang-format off { .name = "port", .description = "Serial Port", @@ -862,11 +842,11 @@ static const device_config_t mssermouse_config[] = { } }, { .name = "", .description = "", .type = CONFIG_END } -// clang-format on + // clang-format on }; static const device_config_t ltsermouse_config[] = { -// clang-format off + // clang-format off { .name = "port", .description = "Serial Port", @@ -902,43 +882,43 @@ static const device_config_t ltsermouse_config[] = { }; const device_t mouse_mssystems_device = { - .name = "Mouse Systems Serial Mouse", + .name = "Mouse Systems Serial Mouse", .internal_name = "mssystems", - .flags = DEVICE_COM, - .local = MOUSE_TYPE_MSYSTEMS, - .init = sermouse_init, - .close = sermouse_close, - .reset = NULL, + .flags = DEVICE_COM, + .local = MOUSE_TYPE_MSYSTEMS, + .init = sermouse_init, + .close = sermouse_close, + .reset = NULL, { .poll = sermouse_poll }, .speed_changed = sermouse_speed_changed, - .force_redraw = NULL, - .config = mssermouse_config + .force_redraw = NULL, + .config = mssermouse_config }; const device_t mouse_msserial_device = { - .name = "Microsoft Serial Mouse", + .name = "Microsoft Serial Mouse", .internal_name = "msserial", - .flags = DEVICE_COM, - .local = 0, - .init = sermouse_init, - .close = sermouse_close, - .reset = NULL, + .flags = DEVICE_COM, + .local = 0, + .init = sermouse_init, + .close = sermouse_close, + .reset = NULL, { .poll = sermouse_poll }, .speed_changed = sermouse_speed_changed, - .force_redraw = NULL, - .config = mssermouse_config + .force_redraw = NULL, + .config = mssermouse_config }; const device_t mouse_ltserial_device = { - .name = "Logitech Serial Mouse", + .name = "Logitech Serial Mouse", .internal_name = "ltserial", - .flags = DEVICE_COM, - .local = 1, - .init = sermouse_init, - .close = sermouse_close, - .reset = NULL, + .flags = DEVICE_COM, + .local = 1, + .init = sermouse_init, + .close = sermouse_close, + .reset = NULL, { .poll = sermouse_poll }, .speed_changed = sermouse_speed_changed, - .force_redraw = NULL, - .config = ltsermouse_config + .force_redraw = NULL, + .config = ltsermouse_config }; diff --git a/src/device/pci_bridge.c b/src/device/pci_bridge.c index 583b77262..bc0f685d3 100644 --- a/src/device/pci_bridge.c +++ b/src/device/pci_bridge.c @@ -31,55 +31,50 @@ #include <86box/device.h> #include <86box/pci.h> +#define PCI_BRIDGE_DEC_21150 0x10110022 +#define AGP_BRIDGE_ALI_M5243 0x10b95243 +#define AGP_BRIDGE_ALI_M5247 0x10b95247 +#define AGP_BRIDGE_INTEL_440LX 0x80867181 +#define AGP_BRIDGE_INTEL_440BX 0x80867191 +#define AGP_BRIDGE_INTEL_440GX 0x808671a1 +#define AGP_BRIDGE_VIA_597 0x11068597 +#define AGP_BRIDGE_VIA_598 0x11068598 +#define AGP_BRIDGE_VIA_691 0x11068691 +#define AGP_BRIDGE_VIA_8601 0x11068601 -#define PCI_BRIDGE_DEC_21150 0x10110022 -#define AGP_BRIDGE_ALI_M5243 0x10b95243 -#define AGP_BRIDGE_ALI_M5247 0x10b95247 -#define AGP_BRIDGE_INTEL_440LX 0x80867181 -#define AGP_BRIDGE_INTEL_440BX 0x80867191 -#define AGP_BRIDGE_INTEL_440GX 0x808671a1 -#define AGP_BRIDGE_VIA_597 0x11068597 -#define AGP_BRIDGE_VIA_598 0x11068598 -#define AGP_BRIDGE_VIA_691 0x11068691 -#define AGP_BRIDGE_VIA_8601 0x11068601 - -#define AGP_BRIDGE_ALI(x) (((x) >> 16) == 0x10b9) -#define AGP_BRIDGE_INTEL(x) (((x) >> 16) == 0x8086) -#define AGP_BRIDGE_VIA(x) (((x) >> 16) == 0x1106) -#define AGP_BRIDGE(x) ((x) >= AGP_BRIDGE_ALI_M5243) - +#define AGP_BRIDGE_ALI(x) (((x) >> 16) == 0x10b9) +#define AGP_BRIDGE_INTEL(x) (((x) >> 16) == 0x8086) +#define AGP_BRIDGE_VIA(x) (((x) >> 16) == 0x1106) +#define AGP_BRIDGE(x) ((x) >= AGP_BRIDGE_ALI_M5243) typedef struct { - uint32_t local; - uint8_t type, ctl; + uint32_t local; + uint8_t type, ctl; - uint8_t regs[256]; - uint8_t bus_index; - int slot; + uint8_t regs[256]; + uint8_t bus_index; + int slot; } pci_bridge_t; - #ifdef ENABLE_PCI_BRIDGE_LOG int pci_bridge_do_log = ENABLE_PCI_BRIDGE_LOG; - static void pci_bridge_log(const char *fmt, ...) { va_list ap; if (pci_bridge_do_log) { - va_start(ap, fmt); - pclog_ex(fmt, ap); - va_end(ap); + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); } } #else -#define pci_bridge_log(fmt, ...) +# define pci_bridge_log(fmt, ...) #endif - void pci_bridge_set_ctl(void *priv, uint8_t ctl) { @@ -88,7 +83,6 @@ pci_bridge_set_ctl(void *priv, uint8_t ctl) dev->ctl = ctl; } - static void pci_bridge_write(int func, int addr, uint8_t val, void *priv) { @@ -97,266 +91,287 @@ pci_bridge_write(int func, int addr, uint8_t val, void *priv) pci_bridge_log("PCI Bridge %d: write(%d, %02X, %02X)\n", dev->bus_index, func, addr, val); if (func > 0) - return; + return; if ((dev->local == AGP_BRIDGE_ALI_M5247) && (addr >= 0x40)) - return; + return; switch (addr) { - case 0x00: case 0x01: case 0x02: case 0x03: - case 0x06: case 0x08: case 0x09: case 0x0a: - case 0x0b: case 0x0e: case 0x0f: case 0x10: - case 0x11: case 0x12: case 0x13: case 0x14: - case 0x15: case 0x16: case 0x17: case 0x1e: - case 0x34: case 0x3d: case 0x67: case 0xdc: - case 0xdd: case 0xde: case 0xdf: - return; + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x06: + case 0x08: + case 0x09: + case 0x0a: + case 0x0b: + case 0x0e: + case 0x0f: + case 0x10: + case 0x11: + case 0x12: + case 0x13: + case 0x14: + case 0x15: + case 0x16: + case 0x17: + case 0x1e: + case 0x34: + case 0x3d: + case 0x67: + case 0xdc: + case 0xdd: + case 0xde: + case 0xdf: + return; - case 0x04: - if (AGP_BRIDGE_INTEL(dev->local)) { - if (dev->local == AGP_BRIDGE_INTEL_440BX) - val &= 0x1f; - } else if (dev->local == AGP_BRIDGE_ALI_M5243) - val |= 0x02; - else if (dev->local == AGP_BRIDGE_ALI_M5247) - val &= 0xc3; - else - val &= 0x67; - break; + case 0x04: + if (AGP_BRIDGE_INTEL(dev->local)) { + if (dev->local == AGP_BRIDGE_INTEL_440BX) + val &= 0x1f; + } else if (dev->local == AGP_BRIDGE_ALI_M5243) + val |= 0x02; + else if (dev->local == AGP_BRIDGE_ALI_M5247) + val &= 0xc3; + else + val &= 0x67; + break; - case 0x05: - if (AGP_BRIDGE_INTEL(dev->local)) - val &= 0x01; - else if (AGP_BRIDGE_ALI(dev->local)) - val &= 0x01; - else - val &= 0x03; - break; + case 0x05: + if (AGP_BRIDGE_INTEL(dev->local)) + val &= 0x01; + else if (AGP_BRIDGE_ALI(dev->local)) + val &= 0x01; + else + val &= 0x03; + break; - case 0x07: - if (dev->local == AGP_BRIDGE_INTEL_440LX) - dev->regs[addr] &= ~(val & 0x40); - else if (dev->local == AGP_BRIDGE_ALI_M5243) - dev->regs[addr] &= ~(val & 0xf8); - else if (dev->local == AGP_BRIDGE_ALI_M5247) - dev->regs[addr] &= ~(val & 0xc0); - return; + case 0x07: + if (dev->local == AGP_BRIDGE_INTEL_440LX) + dev->regs[addr] &= ~(val & 0x40); + else if (dev->local == AGP_BRIDGE_ALI_M5243) + dev->regs[addr] &= ~(val & 0xf8); + else if (dev->local == AGP_BRIDGE_ALI_M5247) + dev->regs[addr] &= ~(val & 0xc0); + return; - case 0x0c: case 0x18: - /* Parent bus number (0x18) is always 0 on AGP bridges. */ - if (AGP_BRIDGE(dev->local)) - return; - break; + case 0x0c: + case 0x18: + /* Parent bus number (0x18) is always 0 on AGP bridges. */ + if (AGP_BRIDGE(dev->local)) + return; + break; - case 0x0d: - if (AGP_BRIDGE_VIA(dev->local)) - return; - else if (AGP_BRIDGE_INTEL(dev->local)) - val &= 0xf8; - else if (AGP_BRIDGE_ALI(dev->local)) - val &= 0xf8; - break; + case 0x0d: + if (AGP_BRIDGE_VIA(dev->local)) + return; + else if (AGP_BRIDGE_INTEL(dev->local)) + val &= 0xf8; + else if (AGP_BRIDGE_ALI(dev->local)) + val &= 0xf8; + break; - case 0x19: - /* Set our bus number. */ - pci_bridge_log("PCI Bridge %d: remapping from bus %02X to %02X\n", dev->bus_index, dev->regs[addr], val); - pci_remap_bus(dev->bus_index, val); - break; + case 0x19: + /* Set our bus number. */ + pci_bridge_log("PCI Bridge %d: remapping from bus %02X to %02X\n", dev->bus_index, dev->regs[addr], val); + pci_remap_bus(dev->bus_index, val); + break; - case 0x1f: - if (AGP_BRIDGE_INTEL(dev->local)) { - if (dev->local == AGP_BRIDGE_INTEL_440LX) - dev->regs[addr] &= ~(val & 0xf1); - else if ((dev->local == AGP_BRIDGE_INTEL_440BX) || - (dev->local == AGP_BRIDGE_INTEL_440GX)) - dev->regs[addr] &= ~(val & 0xf0); - } else if (AGP_BRIDGE_ALI(dev->local)) - dev->regs[addr] &= ~(val & 0xf0); - return; + case 0x1f: + if (AGP_BRIDGE_INTEL(dev->local)) { + if (dev->local == AGP_BRIDGE_INTEL_440LX) + dev->regs[addr] &= ~(val & 0xf1); + else if ((dev->local == AGP_BRIDGE_INTEL_440BX) || (dev->local == AGP_BRIDGE_INTEL_440GX)) + dev->regs[addr] &= ~(val & 0xf0); + } else if (AGP_BRIDGE_ALI(dev->local)) + dev->regs[addr] &= ~(val & 0xf0); + return; - case 0x1c: case 0x1d: case 0x20: case 0x22: - case 0x24: case 0x26: - val &= 0xf0; - break; + case 0x1c: + case 0x1d: + case 0x20: + case 0x22: + case 0x24: + case 0x26: + val &= 0xf0; + break; - case 0x3c: - if (!(dev->ctl & 0x80)) - return; - break; + case 0x3c: + if (!(dev->ctl & 0x80)) + return; + break; - case 0x3e: - if (AGP_BRIDGE_VIA(dev->local)) - val &= 0x0c; - else if (dev->local == AGP_BRIDGE_ALI_M5247) - val &= 0x0f; - else if (dev->local == AGP_BRIDGE_ALI_M5243) - return; - else if (AGP_BRIDGE(dev->local)) { - if ((dev->local == AGP_BRIDGE_INTEL_440BX) || - (dev->local == AGP_BRIDGE_INTEL_440GX)) - val &= 0xed; - else - val &= 0x0f; - } - else if (dev->local == PCI_BRIDGE_DEC_21150) - val &= 0xef; - break; + case 0x3e: + if (AGP_BRIDGE_VIA(dev->local)) + val &= 0x0c; + else if (dev->local == AGP_BRIDGE_ALI_M5247) + val &= 0x0f; + else if (dev->local == AGP_BRIDGE_ALI_M5243) + return; + else if (AGP_BRIDGE(dev->local)) { + if ((dev->local == AGP_BRIDGE_INTEL_440BX) || (dev->local == AGP_BRIDGE_INTEL_440GX)) + val &= 0xed; + else + val &= 0x0f; + } else if (dev->local == PCI_BRIDGE_DEC_21150) + val &= 0xef; + break; - case 0x3f: - if (dev->local == AGP_BRIDGE_INTEL_440LX) { - dev->regs[addr] = ((dev->regs[addr] & 0x04) | (val & 0x02)) & ~(val & 0x04); - return; - } else if (dev->local == AGP_BRIDGE_ALI_M5247) - return; - else if (dev->local == AGP_BRIDGE_ALI_M5243) - val &= 0x06; - else if (AGP_BRIDGE(dev->local)) - return; - else if (dev->local == PCI_BRIDGE_DEC_21150) - val &= 0x0f; - break; + case 0x3f: + if (dev->local == AGP_BRIDGE_INTEL_440LX) { + dev->regs[addr] = ((dev->regs[addr] & 0x04) | (val & 0x02)) & ~(val & 0x04); + return; + } else if (dev->local == AGP_BRIDGE_ALI_M5247) + return; + else if (dev->local == AGP_BRIDGE_ALI_M5243) + val &= 0x06; + else if (AGP_BRIDGE(dev->local)) + return; + else if (dev->local == PCI_BRIDGE_DEC_21150) + val &= 0x0f; + break; - case 0x40: - if (dev->local == PCI_BRIDGE_DEC_21150) - val &= 0x32; - break; + case 0x40: + if (dev->local == PCI_BRIDGE_DEC_21150) + val &= 0x32; + break; - case 0x41: - if (AGP_BRIDGE_VIA(dev->local)) - val &= 0x7e; - else if (dev->local == PCI_BRIDGE_DEC_21150) - val &= 0x07; - break; + case 0x41: + if (AGP_BRIDGE_VIA(dev->local)) + val &= 0x7e; + else if (dev->local == PCI_BRIDGE_DEC_21150) + val &= 0x07; + break; - case 0x42: - if (AGP_BRIDGE_VIA(dev->local)) - val &= 0xfe; - break; + case 0x42: + if (AGP_BRIDGE_VIA(dev->local)) + val &= 0xfe; + break; - case 0x43: - if (dev->local == PCI_BRIDGE_DEC_21150) - val &= 0x03; - break; + case 0x43: + if (dev->local == PCI_BRIDGE_DEC_21150) + val &= 0x03; + break; - case 0x64: - if (dev->local == PCI_BRIDGE_DEC_21150) - val &= 0x7e; - break; + case 0x64: + if (dev->local == PCI_BRIDGE_DEC_21150) + val &= 0x7e; + break; - case 0x69: - if (dev->local == PCI_BRIDGE_DEC_21150) - val &= 0x3f; - break; + case 0x69: + if (dev->local == PCI_BRIDGE_DEC_21150) + val &= 0x3f; + break; - case 0x86: - if (AGP_BRIDGE_ALI(dev->local)) - val &= 0x3f; - break; + case 0x86: + if (AGP_BRIDGE_ALI(dev->local)) + val &= 0x3f; + break; - case 0x87: - if (AGP_BRIDGE_ALI(dev->local)) - val &= 0x60; - break; + case 0x87: + if (AGP_BRIDGE_ALI(dev->local)) + val &= 0x60; + break; - case 0x88: - if (AGP_BRIDGE_ALI(dev->local)) - val &= 0x8c; - break; + case 0x88: + if (AGP_BRIDGE_ALI(dev->local)) + val &= 0x8c; + break; - case 0x8b: - if (AGP_BRIDGE_ALI(dev->local)) - val &= 0x0f; - break; + case 0x8b: + if (AGP_BRIDGE_ALI(dev->local)) + val &= 0x0f; + break; - case 0x8c: - if (AGP_BRIDGE_ALI(dev->local)) - val &= 0x83; - break; + case 0x8c: + if (AGP_BRIDGE_ALI(dev->local)) + val &= 0x83; + break; - case 0x8d: - if (AGP_BRIDGE_ALI(dev->local)) - return; - break; + case 0x8d: + if (AGP_BRIDGE_ALI(dev->local)) + return; + break; - case 0xe0: case 0xe1: - if (AGP_BRIDGE_ALI(dev->local)) { - if (!(dev->ctl & 0x20)) - return; - } else - return; - break; + case 0xe0: + case 0xe1: + if (AGP_BRIDGE_ALI(dev->local)) { + if (!(dev->ctl & 0x20)) + return; + } else + return; + break; - case 0xe2: - if (AGP_BRIDGE_ALI(dev->local)) { - if (dev->ctl & 0x20) - val &= 0x3f; - else - return; - } else - return; - break; - case 0xe3: - if (AGP_BRIDGE_ALI(dev->local)) { - if (dev->ctl & 0x20) - val &= 0xfe; - else - return; - } else - return; - break; + case 0xe2: + if (AGP_BRIDGE_ALI(dev->local)) { + if (dev->ctl & 0x20) + val &= 0x3f; + else + return; + } else + return; + break; + case 0xe3: + if (AGP_BRIDGE_ALI(dev->local)) { + if (dev->ctl & 0x20) + val &= 0xfe; + else + return; + } else + return; + break; - case 0xe4: - if (AGP_BRIDGE_ALI(dev->local)) { - if (dev->ctl & 0x20) - val &= 0x03; - else - return; - } - break; - case 0xe5: - if (AGP_BRIDGE_ALI(dev->local)) { - if (!(dev->ctl & 0x20)) - return; - } - break; + case 0xe4: + if (AGP_BRIDGE_ALI(dev->local)) { + if (dev->ctl & 0x20) + val &= 0x03; + else + return; + } + break; + case 0xe5: + if (AGP_BRIDGE_ALI(dev->local)) { + if (!(dev->ctl & 0x20)) + return; + } + break; - case 0xe6: - if (AGP_BRIDGE_ALI(dev->local)) { - if (dev->ctl & 0x20) - val &= 0xc0; - else - return; - } - break; + case 0xe6: + if (AGP_BRIDGE_ALI(dev->local)) { + if (dev->ctl & 0x20) + val &= 0xc0; + else + return; + } + break; - case 0xe7: - if (AGP_BRIDGE_ALI(dev->local)) { - if (!(dev->ctl & 0x20)) - return; - } - break; + case 0xe7: + if (AGP_BRIDGE_ALI(dev->local)) { + if (!(dev->ctl & 0x20)) + return; + } + break; } dev->regs[addr] = val; } - static uint8_t pci_bridge_read(int func, int addr, void *priv) { pci_bridge_t *dev = (pci_bridge_t *) priv; - uint8_t ret; + uint8_t ret; if (func > 0) - ret = 0xff; + ret = 0xff; else - ret = dev->regs[addr]; + ret = dev->regs[addr]; pci_bridge_log("PCI Bridge %d: read(%d, %02X) = %02X\n", dev->bus_index, func, addr, ret); return ret; } - static void pci_bridge_reset(void *priv) { @@ -374,51 +389,51 @@ pci_bridge_reset(void *priv) /* command and status */ switch (dev->local) { - case PCI_BRIDGE_DEC_21150: - dev->regs[0x06] = 0x80; - dev->regs[0x07] = 0x02; - break; + case PCI_BRIDGE_DEC_21150: + dev->regs[0x06] = 0x80; + dev->regs[0x07] = 0x02; + break; - case AGP_BRIDGE_ALI_M5243: - dev->regs[0x04] = 0x06; - dev->regs[0x07] = 0x04; - dev->regs[0x0d] = 0x20; - dev->regs[0x19] = 0x01; - dev->regs[0x1b] = 0x20; - dev->regs[0x34] = 0xe0; - dev->regs[0x89] = 0x20; - dev->regs[0x8a] = 0xa0; - dev->regs[0x8e] = 0x20; - dev->regs[0x8f] = 0x20; - dev->regs[0xe0] = 0x01; - pci_remap_bus(dev->bus_index, 0x01); - break; + case AGP_BRIDGE_ALI_M5243: + dev->regs[0x04] = 0x06; + dev->regs[0x07] = 0x04; + dev->regs[0x0d] = 0x20; + dev->regs[0x19] = 0x01; + dev->regs[0x1b] = 0x20; + dev->regs[0x34] = 0xe0; + dev->regs[0x89] = 0x20; + dev->regs[0x8a] = 0xa0; + dev->regs[0x8e] = 0x20; + dev->regs[0x8f] = 0x20; + dev->regs[0xe0] = 0x01; + pci_remap_bus(dev->bus_index, 0x01); + break; - case AGP_BRIDGE_ALI_M5247: - dev->regs[0x04] = 0x03; - dev->regs[0x08] = 0x01; - break; + case AGP_BRIDGE_ALI_M5247: + dev->regs[0x04] = 0x03; + dev->regs[0x08] = 0x01; + break; - case AGP_BRIDGE_INTEL_440LX: - dev->regs[0x06] = 0xa0; - dev->regs[0x07] = 0x02; - dev->regs[0x08] = 0x03; - break; + case AGP_BRIDGE_INTEL_440LX: + dev->regs[0x06] = 0xa0; + dev->regs[0x07] = 0x02; + dev->regs[0x08] = 0x03; + break; - case AGP_BRIDGE_INTEL_440BX: - case AGP_BRIDGE_INTEL_440GX: - dev->regs[0x06] = 0x20; - dev->regs[0x07] = dev->regs[0x08] = 0x02; - break; + case AGP_BRIDGE_INTEL_440BX: + case AGP_BRIDGE_INTEL_440GX: + dev->regs[0x06] = 0x20; + dev->regs[0x07] = dev->regs[0x08] = 0x02; + break; - case AGP_BRIDGE_VIA_597: - case AGP_BRIDGE_VIA_598: - case AGP_BRIDGE_VIA_691: - case AGP_BRIDGE_VIA_8601: - dev->regs[0x04] = 0x07; - dev->regs[0x06] = 0x20; - dev->regs[0x07] = 0x02; - break; + case AGP_BRIDGE_VIA_597: + case AGP_BRIDGE_VIA_598: + case AGP_BRIDGE_VIA_691: + case AGP_BRIDGE_VIA_8601: + dev->regs[0x04] = 0x07; + dev->regs[0x06] = 0x20; + dev->regs[0x07] = 0x02; + break; } /* class */ @@ -428,34 +443,33 @@ pci_bridge_reset(void *priv) /* IO BARs */ if (AGP_BRIDGE(dev->local)) - dev->regs[0x1c] = 0xf0; + dev->regs[0x1c] = 0xf0; else - dev->regs[0x1c] = dev->regs[0x1d] = 0x01; + dev->regs[0x1c] = dev->regs[0x1d] = 0x01; if (dev->local == AGP_BRIDGE_ALI_M5247) - dev->regs[0x1e] = 0x20; + dev->regs[0x1e] = 0x20; else if (!AGP_BRIDGE_VIA(dev->local)) { - dev->regs[0x1e] = AGP_BRIDGE(dev->local) ? 0xa0 : 0x80; - dev->regs[0x1f] = 0x02; + dev->regs[0x1e] = AGP_BRIDGE(dev->local) ? 0xa0 : 0x80; + dev->regs[0x1f] = 0x02; } /* prefetchable memory limits */ if (AGP_BRIDGE(dev->local)) { - dev->regs[0x20] = dev->regs[0x24] = 0xf0; - dev->regs[0x21] = dev->regs[0x25] = 0xff; + dev->regs[0x20] = dev->regs[0x24] = 0xf0; + dev->regs[0x21] = dev->regs[0x25] = 0xff; } else { - dev->regs[0x24] = dev->regs[0x26] = 0x01; + dev->regs[0x24] = dev->regs[0x26] = 0x01; } /* power management */ if (dev->local == PCI_BRIDGE_DEC_21150) { - dev->regs[0x34] = 0xdc; - dev->regs[0x43] = 0x02; - dev->regs[0xdc] = dev->regs[0xde] = 0x01; + dev->regs[0x34] = 0xdc; + dev->regs[0x43] = 0x02; + dev->regs[0xdc] = dev->regs[0xde] = 0x01; } } - static void * pci_bridge_init(const device_t *info) { @@ -464,7 +478,7 @@ pci_bridge_init(const device_t *info) pci_bridge_t *dev = (pci_bridge_t *) malloc(sizeof(pci_bridge_t)); memset(dev, 0, sizeof(pci_bridge_t)); - dev->local = info->local; + dev->local = info->local; dev->bus_index = pci_register_bus(); pci_bridge_log("PCI Bridge %d: init()\n", dev->bus_index); @@ -473,26 +487,26 @@ pci_bridge_init(const device_t *info) dev->slot = pci_add_card(AGP_BRIDGE(dev->local) ? PCI_ADD_AGPBRIDGE : PCI_ADD_BRIDGE, pci_bridge_read, pci_bridge_write, dev); interrupt_count = sizeof(interrupts); - interrupt_mask = interrupt_count - 1; + interrupt_mask = interrupt_count - 1; if (dev->slot < 32) { - for (i = 0; i < interrupt_count; i++) - interrupts[i] = pci_get_int(dev->slot, PCI_INTA + i); + for (i = 0; i < interrupt_count; i++) + interrupts[i] = pci_get_int(dev->slot, PCI_INTA + i); } pci_bridge_log("PCI Bridge %d: upstream bus %02X slot %02X interrupts %02X %02X %02X %02X\n", dev->bus_index, (dev->slot >> 5) & 0xff, dev->slot & 31, interrupts[0], interrupts[1], interrupts[2], interrupts[3]); if (info->local == PCI_BRIDGE_DEC_21150) - slot_count = 9; /* 9 bus masters */ + slot_count = 9; /* 9 bus masters */ else - slot_count = 1; /* AGP bridges always have 1 slot */ + slot_count = 1; /* AGP bridges always have 1 slot */ for (i = 0; i < slot_count; i++) { - /* Interrupts for bridge slots are assigned in round-robin: ABCD, BCDA, CDAB and so on. */ - pci_bridge_log("PCI Bridge %d: downstream slot %02X interrupts %02X %02X %02X %02X\n", dev->bus_index, i, interrupts[i & interrupt_mask], interrupts[(i + 1) & interrupt_mask], interrupts[(i + 2) & interrupt_mask], interrupts[(i + 3) & interrupt_mask]); - pci_register_bus_slot(dev->bus_index, i, AGP_BRIDGE(dev->local) ? PCI_CARD_AGP : PCI_CARD_NORMAL, - interrupts[i & interrupt_mask], - interrupts[(i + 1) & interrupt_mask], - interrupts[(i + 2) & interrupt_mask], - interrupts[(i + 3) & interrupt_mask]); + /* Interrupts for bridge slots are assigned in round-robin: ABCD, BCDA, CDAB and so on. */ + pci_bridge_log("PCI Bridge %d: downstream slot %02X interrupts %02X %02X %02X %02X\n", dev->bus_index, i, interrupts[i & interrupt_mask], interrupts[(i + 1) & interrupt_mask], interrupts[(i + 2) & interrupt_mask], interrupts[(i + 3) & interrupt_mask]); + pci_register_bus_slot(dev->bus_index, i, AGP_BRIDGE(dev->local) ? PCI_CARD_AGP : PCI_CARD_NORMAL, + interrupts[i & interrupt_mask], + interrupts[(i + 1) & interrupt_mask], + interrupts[(i + 2) & interrupt_mask], + interrupts[(i + 3) & interrupt_mask]); } return dev; @@ -500,143 +514,143 @@ pci_bridge_init(const device_t *info) /* PCI bridges */ const device_t dec21150_device = { - .name = "DEC 21150 PCI Bridge", + .name = "DEC 21150 PCI Bridge", .internal_name = "dec21150", - .flags = DEVICE_PCI, - .local = PCI_BRIDGE_DEC_21150, - .init = pci_bridge_init, - .close = NULL, - .reset = pci_bridge_reset, + .flags = DEVICE_PCI, + .local = PCI_BRIDGE_DEC_21150, + .init = pci_bridge_init, + .close = NULL, + .reset = pci_bridge_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; /* AGP bridges */ const device_t ali5243_agp_device = { - .name = "ALi M5243 AGP Bridge", + .name = "ALi M5243 AGP Bridge", .internal_name = "ali5243_agp", - .flags = DEVICE_PCI, - .local = AGP_BRIDGE_ALI_M5243, - .init = pci_bridge_init, - .close = NULL, - .reset = pci_bridge_reset, + .flags = DEVICE_PCI, + .local = AGP_BRIDGE_ALI_M5243, + .init = pci_bridge_init, + .close = NULL, + .reset = pci_bridge_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; /* AGP bridges */ const device_t ali5247_agp_device = { - .name = "ALi M5247 AGP Bridge", + .name = "ALi M5247 AGP Bridge", .internal_name = "ali5247_agp", - .flags = DEVICE_PCI, - .local = AGP_BRIDGE_ALI_M5247, - .init = pci_bridge_init, - .close = NULL, - .reset = pci_bridge_reset, + .flags = DEVICE_PCI, + .local = AGP_BRIDGE_ALI_M5247, + .init = pci_bridge_init, + .close = NULL, + .reset = pci_bridge_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; const device_t i440lx_agp_device = { - .name = "Intel 82443LX/EX AGP Bridge", + .name = "Intel 82443LX/EX AGP Bridge", .internal_name = "i440lx_agp", - .flags = DEVICE_PCI, - .local = AGP_BRIDGE_INTEL_440LX, - .init = pci_bridge_init, - .close = NULL, - .reset = pci_bridge_reset, + .flags = DEVICE_PCI, + .local = AGP_BRIDGE_INTEL_440LX, + .init = pci_bridge_init, + .close = NULL, + .reset = pci_bridge_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; const device_t i440bx_agp_device = { - .name = "Intel 82443BX/ZX AGP Bridge", + .name = "Intel 82443BX/ZX AGP Bridge", .internal_name = "i440bx_agp", - .flags = DEVICE_PCI, - .local = AGP_BRIDGE_INTEL_440BX, - .init = pci_bridge_init, - .close = NULL, - .reset = pci_bridge_reset, + .flags = DEVICE_PCI, + .local = AGP_BRIDGE_INTEL_440BX, + .init = pci_bridge_init, + .close = NULL, + .reset = pci_bridge_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; const device_t i440gx_agp_device = { - .name = "Intel 82443GX AGP Bridge", + .name = "Intel 82443GX AGP Bridge", .internal_name = "i440gx_agp", - .flags = DEVICE_PCI, - .local = AGP_BRIDGE_INTEL_440GX, - .init = pci_bridge_init, - .close = NULL, - .reset = pci_bridge_reset, + .flags = DEVICE_PCI, + .local = AGP_BRIDGE_INTEL_440GX, + .init = pci_bridge_init, + .close = NULL, + .reset = pci_bridge_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; const device_t via_vp3_agp_device = { - .name = "VIA Apollo VP3 AGP Bridge", + .name = "VIA Apollo VP3 AGP Bridge", .internal_name = "via_vp3_agp", - .flags = DEVICE_PCI, - .local = AGP_BRIDGE_VIA_597, - .init = pci_bridge_init, - .close = NULL, - .reset = pci_bridge_reset, + .flags = DEVICE_PCI, + .local = AGP_BRIDGE_VIA_597, + .init = pci_bridge_init, + .close = NULL, + .reset = pci_bridge_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; const device_t via_mvp3_agp_device = { - .name = "VIA Apollo MVP3 AGP Bridge", + .name = "VIA Apollo MVP3 AGP Bridge", .internal_name = "via_mvp3_agp", - .flags = DEVICE_PCI, - .local = AGP_BRIDGE_VIA_598, - .init = pci_bridge_init, - .close = NULL, - .reset = pci_bridge_reset, + .flags = DEVICE_PCI, + .local = AGP_BRIDGE_VIA_598, + .init = pci_bridge_init, + .close = NULL, + .reset = pci_bridge_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; const device_t via_apro_agp_device = { - .name = "VIA Apollo Pro AGP Bridge", + .name = "VIA Apollo Pro AGP Bridge", .internal_name = "via_apro_agp", - .flags = DEVICE_PCI, - .local = AGP_BRIDGE_VIA_691, - .init = pci_bridge_init, - .close = NULL, - .reset = pci_bridge_reset, + .flags = DEVICE_PCI, + .local = AGP_BRIDGE_VIA_691, + .init = pci_bridge_init, + .close = NULL, + .reset = pci_bridge_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; const device_t via_vt8601_agp_device = { - .name = "VIA Apollo ProMedia AGP Bridge", + .name = "VIA Apollo ProMedia AGP Bridge", .internal_name = "via_vt8601_agp", - .flags = DEVICE_PCI, - .local = AGP_BRIDGE_VIA_8601, - .init = pci_bridge_init, - .close = NULL, - .reset = pci_bridge_reset, + .flags = DEVICE_PCI, + .local = AGP_BRIDGE_VIA_8601, + .init = pci_bridge_init, + .close = NULL, + .reset = pci_bridge_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; diff --git a/src/device/phoenix_486_jumper.c b/src/device/phoenix_486_jumper.c index 10f37c4ce..a0f6fdedf 100644 --- a/src/device/phoenix_486_jumper.c +++ b/src/device/phoenix_486_jumper.c @@ -11,7 +11,6 @@ * Copyright 2020 Tiseno100 */ - #include #include #include @@ -39,42 +38,38 @@ typedef struct { - uint8_t type, jumper; + uint8_t type, jumper; } phoenix_486_jumper_t; - #ifdef ENABLE_PHOENIX_486_JUMPER_LOG int phoenix_486_jumper_do_log = ENABLE_PHOENIX_486_JUMPER_LOG; - static void phoenix_486_jumper_log(const char *fmt, ...) { va_list ap; if (phoenix_486_jumper_do_log) { - va_start(ap, fmt); - pclog_ex(fmt, ap); - va_end(ap); + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); } } #else -#define phoenix_486_jumper_log(fmt, ...) +# define phoenix_486_jumper_log(fmt, ...) #endif - static void phoenix_486_jumper_write(uint16_t addr, uint8_t val, void *priv) { phoenix_486_jumper_t *dev = (phoenix_486_jumper_t *) priv; phoenix_486_jumper_log("Phoenix 486 Jumper: Write %02x\n", val); if (dev->type == 1) - dev->jumper = val & 0xbf; + dev->jumper = val & 0xbf; else - dev->jumper = val; + dev->jumper = val; } - static uint8_t phoenix_486_jumper_read(uint16_t addr, void *priv) { @@ -83,22 +78,20 @@ phoenix_486_jumper_read(uint16_t addr, void *priv) return dev->jumper; } - static void phoenix_486_jumper_reset(void *priv) { phoenix_486_jumper_t *dev = (phoenix_486_jumper_t *) priv; if (dev->type == 1) - dev->jumper = 0x00; + dev->jumper = 0x00; else { - dev->jumper = 0x9f; - if (gfxcard != 0x01) - dev->jumper |= 0x40; + dev->jumper = 0x9f; + if (gfxcard != 0x01) + dev->jumper |= 0x40; } } - static void phoenix_486_jumper_close(void *priv) { @@ -107,7 +100,6 @@ phoenix_486_jumper_close(void *priv) free(dev); } - static void * phoenix_486_jumper_init(const device_t *info) { @@ -124,29 +116,29 @@ phoenix_486_jumper_init(const device_t *info) } const device_t phoenix_486_jumper_device = { - .name = "Phoenix 486 Jumper Readout", + .name = "Phoenix 486 Jumper Readout", .internal_name = "phoenix_486_jumper", - .flags = 0, - .local = 0, - .init = phoenix_486_jumper_init, - .close = phoenix_486_jumper_close, - .reset = phoenix_486_jumper_reset, + .flags = 0, + .local = 0, + .init = phoenix_486_jumper_init, + .close = phoenix_486_jumper_close, + .reset = phoenix_486_jumper_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; const device_t phoenix_486_jumper_pci_device = { - .name = "Phoenix 486 Jumper Readout (PCI machines)", + .name = "Phoenix 486 Jumper Readout (PCI machines)", .internal_name = "phoenix_486_jumper_pci", - .flags = 0, - .local = 1, - .init = phoenix_486_jumper_init, - .close = phoenix_486_jumper_close, - .reset = phoenix_486_jumper_reset, + .flags = 0, + .local = 1, + .init = phoenix_486_jumper_init, + .close = phoenix_486_jumper_close, + .reset = phoenix_486_jumper_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; diff --git a/src/device/postcard.c b/src/device/postcard.c index 22598613f..e139d8592 100644 --- a/src/device/postcard.c +++ b/src/device/postcard.c @@ -29,58 +29,52 @@ #include <86box/postcard.h> #include "cpu.h" +static uint16_t postcard_port; +static uint8_t postcard_written; +static uint8_t postcard_code, postcard_prev_code; +#define UISTR_LEN 13 +static char postcard_str[UISTR_LEN]; /* UI output string */ -static uint16_t postcard_port; -static uint8_t postcard_written; -static uint8_t postcard_code, postcard_prev_code; -#define UISTR_LEN 13 -static char postcard_str[UISTR_LEN]; /* UI output string */ - - -extern void ui_sb_bugui(char *__str); - +extern void ui_sb_bugui(char *__str); #ifdef ENABLE_POSTCARD_LOG int postcard_do_log = ENABLE_POSTCARD_LOG; - static void postcard_log(const char *fmt, ...) { va_list ap; if (postcard_do_log) { - va_start(ap, fmt); - pclog_ex(fmt, ap); - va_end(ap); + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); } } #else int postcard_do_log = 0; -#define postcard_log(fmt, ...) +# define postcard_log(fmt, ...) #endif - static void postcard_setui(void) { if (!postcard_written) - sprintf(postcard_str, "POST: -- --"); + sprintf(postcard_str, "POST: -- --"); else if (postcard_written == 1) - sprintf(postcard_str, "POST: %02X --", postcard_code); + sprintf(postcard_str, "POST: %02X --", postcard_code); else - sprintf(postcard_str, "POST: %02X %02X", postcard_code, postcard_prev_code); + sprintf(postcard_str, "POST: %02X %02X", postcard_code, postcard_prev_code); ui_sb_bugui(postcard_str); if (postcard_do_log) { - /* log same string sent to the UI */ - postcard_log("[%04X:%08X] %s\n", CS, cpu_state.pc, postcard_str); + /* log same string sent to the UI */ + postcard_log("[%04X:%08X] %s\n", CS, cpu_state.pc, postcard_str); } } - static void postcard_reset(void) { @@ -90,65 +84,64 @@ postcard_reset(void) postcard_setui(); } - static void postcard_write(uint16_t port, uint8_t val, void *priv) { if (postcard_written && (val == postcard_code)) - return; + return; postcard_prev_code = postcard_code; - postcard_code = val; + postcard_code = val; if (postcard_written < 2) - postcard_written++; + postcard_written++; postcard_setui(); } - static void * postcard_init(const device_t *info) { postcard_reset(); if (machine_has_bus(machine, MACHINE_BUS_MCA)) - postcard_port = 0x680; /* MCA machines */ + postcard_port = 0x680; /* MCA machines */ else if (strstr(machines[machine].name, " PS/2 ") || strstr(machine_getname_ex(machine), " PS/1 ")) - postcard_port = 0x190; /* ISA PS/2 machines */ + postcard_port = 0x190; /* ISA PS/2 machines */ else if (strstr(machines[machine].name, " IBM XT ")) - postcard_port = 0x60; /* IBM XT */ + postcard_port = 0x60; /* IBM XT */ else if (strstr(machines[machine].name, " IBM PCjr")) - postcard_port = 0x10; /* IBM PCjr */ + postcard_port = 0x10; /* IBM PCjr */ else if (strstr(machines[machine].name, " Compaq ") && !machine_has_bus(machine, MACHINE_BUS_PCI)) - postcard_port = 0x84; /* ISA Compaq machines */ + postcard_port = 0x84; /* ISA Compaq machines */ else - postcard_port = 0x80; /* AT and clone machines */ + postcard_port = 0x80; /* AT and clone machines */ postcard_log("POST card initializing on port %04Xh\n", postcard_port); - if (postcard_port) io_sethandler(postcard_port, 1, - NULL, NULL, NULL, postcard_write, NULL, NULL, NULL); + if (postcard_port) + io_sethandler(postcard_port, 1, + NULL, NULL, NULL, postcard_write, NULL, NULL, NULL); return postcard_write; } - static void postcard_close(UNUSED(void *priv)) { - if (postcard_port) io_removehandler(postcard_port, 1, - NULL, NULL, NULL, postcard_write, NULL, NULL, NULL); + if (postcard_port) + io_removehandler(postcard_port, 1, + NULL, NULL, NULL, postcard_write, NULL, NULL, NULL); } const device_t postcard_device = { - .name = "POST Card", + .name = "POST Card", .internal_name = "postcard", - .flags = DEVICE_ISA, - .local = 0, - .init = postcard_init, - .close = postcard_close, - .reset = NULL, + .flags = DEVICE_ISA, + .local = 0, + .init = postcard_init, + .close = postcard_close, + .reset = NULL, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; diff --git a/src/device/serial.c b/src/device/serial.c index 67063413f..48f206f84 100644 --- a/src/device/serial.c +++ b/src/device/serial.c @@ -38,7 +38,7 @@ #include <86box/serial.h> #include <86box/mouse.h> -serial_port_t com_ports[SERIAL_MAX]; +serial_port_t com_ports[SERIAL_MAX]; enum { SERIAL_INT_LSR = 1, diff --git a/src/device/smbus_ali7101.c b/src/device/smbus_ali7101.c index c56ecd881..1ac3f1710 100644 --- a/src/device/smbus_ali7101.c +++ b/src/device/smbus_ali7101.c @@ -29,59 +29,56 @@ #include <86box/i2c.h> #include <86box/smbus.h> - #ifdef ENABLE_SMBUS_ALI7101_LOG int smbus_ali7101_do_log = ENABLE_SMBUS_ALI7101_LOG; - static void smbus_ali7101_log(const char *fmt, ...) { va_list ap; if (smbus_ali7101_do_log) { - va_start(ap, fmt); - pclog_ex(fmt, ap); - va_end(ap); + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); } } #else -#define smbus_ali7101_log(fmt, ...) +# define smbus_ali7101_log(fmt, ...) #endif - static uint8_t smbus_ali7101_read(uint16_t addr, void *priv) { smbus_ali7101_t *dev = (smbus_ali7101_t *) priv; - uint8_t ret = 0x00; + uint8_t ret = 0x00; switch (addr - dev->io_base) { - case 0x00: - ret = dev->stat; - break; + case 0x00: + ret = dev->stat; + break; - case 0x03: - ret = dev->addr; - break; + case 0x03: + ret = dev->addr; + break; - case 0x04: - ret = dev->data0; - break; + case 0x04: + ret = dev->data0; + break; - case 0x05: - ret = dev->data1; - break; + case 0x05: + ret = dev->data1; + break; - case 0x06: - ret = dev->data[dev->index++]; - if (dev->index >= SMBUS_ALI7101_BLOCK_DATA_SIZE) - dev->index = 0; - break; + case 0x06: + ret = dev->data[dev->index++]; + if (dev->index >= SMBUS_ALI7101_BLOCK_DATA_SIZE) + dev->index = 0; + break; - case 0x07: - ret = dev->cmd; - break; + case 0x07: + ret = dev->cmd; + break; } smbus_ali7101_log("SMBus ALI7101: read(%02X) = %02x\n", addr, ret); @@ -89,152 +86,150 @@ smbus_ali7101_read(uint16_t addr, void *priv) return ret; } - static void smbus_ali7101_write(uint16_t addr, uint8_t val, void *priv) { smbus_ali7101_t *dev = (smbus_ali7101_t *) priv; - uint8_t smbus_addr, cmd, read, prev_stat; - uint16_t timer_bytes = 0; + uint8_t smbus_addr, cmd, read, prev_stat; + uint16_t timer_bytes = 0; smbus_ali7101_log("SMBus ALI7101: write(%02X, %02X)\n", addr, val); - prev_stat = dev->next_stat; + prev_stat = dev->next_stat; dev->next_stat = 0x04; switch (addr - dev->io_base) { - case 0x00: - dev->stat &= ~(val & 0xf2); - /* Make sure IDLE is set if we're not busy or errored. */ - if (dev->stat == 0x00) - dev->stat = 0x04; - break; + case 0x00: + dev->stat &= ~(val & 0xf2); + /* Make sure IDLE is set if we're not busy or errored. */ + if (dev->stat == 0x00) + dev->stat = 0x04; + break; - case 0x01: - dev->ctl = val & 0xfc; - if (val & 0x04) { /* cancel an in-progress command if KILL is set */ - if (prev_stat) { /* cancel only if a command is in progress */ - timer_disable(&dev->response_timer); - dev->stat = 0x80; /* raise FAILED */ - } - } else if (val & 0x08) { /* T_OUT_CMD */ - if (prev_stat) { /* cancel only if a command is in progress */ - timer_disable(&dev->response_timer); - dev->stat = 0x20; /* raise DEVICE_ERR */ - } - } + case 0x01: + dev->ctl = val & 0xfc; + if (val & 0x04) { /* cancel an in-progress command if KILL is set */ + if (prev_stat) { /* cancel only if a command is in progress */ + timer_disable(&dev->response_timer); + dev->stat = 0x80; /* raise FAILED */ + } + } else if (val & 0x08) { /* T_OUT_CMD */ + if (prev_stat) { /* cancel only if a command is in progress */ + timer_disable(&dev->response_timer); + dev->stat = 0x20; /* raise DEVICE_ERR */ + } + } - if (val & 0x80) - dev->index = 0; - break; + if (val & 0x80) + dev->index = 0; + break; - case 0x02: - /* dispatch command if START is set */ - timer_bytes++; /* address */ + case 0x02: + /* dispatch command if START is set */ + timer_bytes++; /* address */ - smbus_addr = (dev->addr >> 1); - read = dev->addr & 0x01; + smbus_addr = (dev->addr >> 1); + read = dev->addr & 0x01; - cmd = (dev->ctl >> 4) & 0x7; - smbus_ali7101_log("SMBus ALI7101: addr=%02X read=%d protocol=%X cmd=%02X data0=%02X data1=%02X\n", smbus_addr, read, cmd, dev->cmd, dev->data0, dev->data1); + cmd = (dev->ctl >> 4) & 0x7; + smbus_ali7101_log("SMBus ALI7101: addr=%02X read=%d protocol=%X cmd=%02X data0=%02X data1=%02X\n", smbus_addr, read, cmd, dev->cmd, dev->data0, dev->data1); - /* Raise DEV_ERR if no device is at this address, or if the device returned NAK when starting the transfer. */ - if (!i2c_start(i2c_smbus, smbus_addr, read)) { - dev->next_stat = 0x40; - break; - } + /* Raise DEV_ERR if no device is at this address, or if the device returned NAK when starting the transfer. */ + if (!i2c_start(i2c_smbus, smbus_addr, read)) { + dev->next_stat = 0x40; + break; + } - dev->next_stat = 0x10; /* raise INTER (command completed) by default */ + dev->next_stat = 0x10; /* raise INTER (command completed) by default */ - /* Decode the command protocol. */ - switch (cmd) { - case 0x0: /* quick R/W */ - break; + /* Decode the command protocol. */ + switch (cmd) { + case 0x0: /* quick R/W */ + break; - case 0x1: /* byte R/W */ - if (read) /* byte read */ - dev->data0 = i2c_read(i2c_smbus, smbus_addr); - else /* byte write */ - i2c_write(i2c_smbus, smbus_addr, dev->data0); - timer_bytes++; + case 0x1: /* byte R/W */ + if (read) /* byte read */ + dev->data0 = i2c_read(i2c_smbus, smbus_addr); + else /* byte write */ + i2c_write(i2c_smbus, smbus_addr, dev->data0); + timer_bytes++; - break; + break; - case 0x2: /* byte data R/W */ - /* command write */ - i2c_write(i2c_smbus, smbus_addr, dev->cmd); - timer_bytes++; + case 0x2: /* byte data R/W */ + /* command write */ + i2c_write(i2c_smbus, smbus_addr, dev->cmd); + timer_bytes++; - if (read) /* byte read */ - dev->data0 = i2c_read(i2c_smbus, smbus_addr); - else /* byte write */ - i2c_write(i2c_smbus, smbus_addr, dev->data0); - timer_bytes++; + if (read) /* byte read */ + dev->data0 = i2c_read(i2c_smbus, smbus_addr); + else /* byte write */ + i2c_write(i2c_smbus, smbus_addr, dev->data0); + timer_bytes++; - break; + break; - case 0x3: /* word data R/W */ - /* command write */ - i2c_write(i2c_smbus, smbus_addr, dev->cmd); - timer_bytes++; + case 0x3: /* word data R/W */ + /* command write */ + i2c_write(i2c_smbus, smbus_addr, dev->cmd); + timer_bytes++; - if (read) { /* word read */ - dev->data0 = i2c_read(i2c_smbus, smbus_addr); - dev->data1 = i2c_read(i2c_smbus, smbus_addr); - } else { /* word write */ - i2c_write(i2c_smbus, smbus_addr, dev->data0); - i2c_write(i2c_smbus, smbus_addr, dev->data1); - } - timer_bytes += 2; + if (read) { /* word read */ + dev->data0 = i2c_read(i2c_smbus, smbus_addr); + dev->data1 = i2c_read(i2c_smbus, smbus_addr); + } else { /* word write */ + i2c_write(i2c_smbus, smbus_addr, dev->data0); + i2c_write(i2c_smbus, smbus_addr, dev->data1); + } + timer_bytes += 2; - break; + break; - case 0x4: /* block R/W */ - timer_bytes++; /* count the SMBus length byte now */ + case 0x4: /* block R/W */ + timer_bytes++; /* count the SMBus length byte now */ - /* fall-through */ + /* fall-through */ - default: /* unknown */ - dev->next_stat = 0x20; /* raise DEV_ERR */ - timer_bytes = 0; - break; - } + default: /* unknown */ + dev->next_stat = 0x20; /* raise DEV_ERR */ + timer_bytes = 0; + break; + } - /* Finish transfer. */ - i2c_stop(i2c_smbus, smbus_addr); - break; + /* Finish transfer. */ + i2c_stop(i2c_smbus, smbus_addr); + break; - case 0x03: - dev->addr = val; - break; + case 0x03: + dev->addr = val; + break; - case 0x04: - dev->data0 = val; - break; + case 0x04: + dev->data0 = val; + break; - case 0x05: - dev->data1 = val; - break; + case 0x05: + dev->data1 = val; + break; - case 0x06: - dev->data[dev->index++] = val; - if (dev->index >= SMBUS_ALI7101_BLOCK_DATA_SIZE) - dev->index = 0; - break; + case 0x06: + dev->data[dev->index++] = val; + if (dev->index >= SMBUS_ALI7101_BLOCK_DATA_SIZE) + dev->index = 0; + break; - case 0x07: - dev->cmd = val; - break; + case 0x07: + dev->cmd = val; + break; } if (dev->next_stat != 0x04) { /* schedule dispatch of any pending status register update */ - dev->stat = 0x08; /* raise HOST_BUSY while waiting */ - timer_disable(&dev->response_timer); - /* delay = ((half clock for start + half clock for stop) + (bytes * (8 bits + ack))) * 60us period measured on real VIA 686B */ - timer_set_delay_u64(&dev->response_timer, (1 + (timer_bytes * 9)) * 60 * TIMER_USEC); + dev->stat = 0x08; /* raise HOST_BUSY while waiting */ + timer_disable(&dev->response_timer); + /* delay = ((half clock for start + half clock for stop) + (bytes * (8 bits + ack))) * 60us period measured on real VIA 686B */ + timer_set_delay_u64(&dev->response_timer, (1 + (timer_bytes * 9)) * 60 * TIMER_USEC); } } - static void smbus_ali7101_response(void *priv) { @@ -244,21 +239,19 @@ smbus_ali7101_response(void *priv) dev->stat = dev->next_stat; } - void smbus_ali7101_remap(smbus_ali7101_t *dev, uint16_t new_io_base, uint8_t enable) { if (dev->io_base) - io_removehandler(dev->io_base, 0x10, smbus_ali7101_read, NULL, NULL, smbus_ali7101_write, NULL, NULL, dev); + io_removehandler(dev->io_base, 0x10, smbus_ali7101_read, NULL, NULL, smbus_ali7101_write, NULL, NULL, dev); dev->io_base = new_io_base; smbus_ali7101_log("SMBus ALI7101: remap to %04Xh (%sabled)\n", dev->io_base, enable ? "en" : "dis"); if (enable && dev->io_base) - io_sethandler(dev->io_base, 0x10, smbus_ali7101_read, NULL, NULL, smbus_ali7101_write, NULL, NULL, dev); + io_sethandler(dev->io_base, 0x10, smbus_ali7101_read, NULL, NULL, smbus_ali7101_write, NULL, NULL, dev); } - static void smbus_ali7101_reset(void *priv) { @@ -268,7 +261,6 @@ smbus_ali7101_reset(void *priv) dev->stat = 0x04; } - static void * smbus_ali7101_init(const device_t *info) { @@ -276,7 +268,7 @@ smbus_ali7101_init(const device_t *info) memset(dev, 0, sizeof(smbus_ali7101_t)); dev->local = info->local; - dev->stat = 0x04; + dev->stat = 0x04; /* We save the I2C bus handle on dev but use i2c_smbus for all operations because dev and therefore dev->i2c will be invalidated if a device triggers a hard reset. */ i2c_smbus = dev->i2c = i2c_addbus("smbus_ali7101"); @@ -286,29 +278,28 @@ smbus_ali7101_init(const device_t *info) return dev; } - static void smbus_ali7101_close(void *priv) { smbus_ali7101_t *dev = (smbus_ali7101_t *) priv; if (i2c_smbus == dev->i2c) - i2c_smbus = NULL; + i2c_smbus = NULL; i2c_removebus(dev->i2c); free(dev); } const device_t ali7101_smbus_device = { - .name = "ALi M7101-compatible SMBus Host Controller", + .name = "ALi M7101-compatible SMBus Host Controller", .internal_name = "ali7101_smbus", - .flags = DEVICE_AT, - .local = 0, - .init = smbus_ali7101_init, - .close = smbus_ali7101_close, - .reset = smbus_ali7101_reset, + .flags = DEVICE_AT, + .local = 0, + .init = smbus_ali7101_init, + .close = smbus_ali7101_close, + .reset = smbus_ali7101_reset, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; diff --git a/src/device/smbus_piix4.c b/src/device/smbus_piix4.c index c96a9fa57..607a0e055 100644 --- a/src/device/smbus_piix4.c +++ b/src/device/smbus_piix4.c @@ -31,60 +31,58 @@ #ifdef ENABLE_SMBUS_PIIX4_LOG int smbus_piix4_do_log = ENABLE_SMBUS_PIIX4_LOG; - static void smbus_piix4_log(const char *fmt, ...) { va_list ap; if (smbus_piix4_do_log) { - va_start(ap, fmt); - pclog_ex(fmt, ap); - va_end(ap); + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); } } #else -#define smbus_piix4_log(fmt, ...) +# define smbus_piix4_log(fmt, ...) #endif - static uint8_t smbus_piix4_read(uint16_t addr, void *priv) { smbus_piix4_t *dev = (smbus_piix4_t *) priv; - uint8_t ret = 0x00; + uint8_t ret = 0x00; switch (addr - dev->io_base) { - case 0x00: - ret = dev->stat; - break; + case 0x00: + ret = dev->stat; + break; - case 0x02: - dev->index = 0; /* reading from this resets the block data index */ - ret = dev->ctl; - break; + case 0x02: + dev->index = 0; /* reading from this resets the block data index */ + ret = dev->ctl; + break; - case 0x03: - ret = dev->cmd; - break; + case 0x03: + ret = dev->cmd; + break; - case 0x04: - ret = dev->addr; - break; + case 0x04: + ret = dev->addr; + break; - case 0x05: - ret = dev->data0; - break; + case 0x05: + ret = dev->data0; + break; - case 0x06: - ret = dev->data1; - break; + case 0x06: + ret = dev->data1; + break; - case 0x07: - ret = dev->data[dev->index++]; - if (dev->index >= SMBUS_PIIX4_BLOCK_DATA_SIZE) - dev->index = 0; - break; + case 0x07: + ret = dev->data[dev->index++]; + if (dev->index >= SMBUS_PIIX4_BLOCK_DATA_SIZE) + dev->index = 0; + break; } smbus_piix4_log("SMBus PIIX4: read(%02X) = %02x\n", addr, ret); @@ -92,232 +90,230 @@ smbus_piix4_read(uint16_t addr, void *priv) return ret; } - static void smbus_piix4_write(uint16_t addr, uint8_t val, void *priv) { smbus_piix4_t *dev = (smbus_piix4_t *) priv; - uint8_t smbus_addr, cmd, read, block_len, prev_stat; - uint16_t timer_bytes = 0, i = 0; + uint8_t smbus_addr, cmd, read, block_len, prev_stat; + uint16_t timer_bytes = 0, i = 0; smbus_piix4_log("SMBus PIIX4: write(%02X, %02X)\n", addr, val); - prev_stat = dev->next_stat; + prev_stat = dev->next_stat; dev->next_stat = 0x00; switch (addr - dev->io_base) { - case 0x00: - for (smbus_addr = 0x02; smbus_addr <= 0x10; smbus_addr <<= 1) { /* handle clearable bits */ - if (val & smbus_addr) - dev->stat &= ~smbus_addr; - } - break; + case 0x00: + for (smbus_addr = 0x02; smbus_addr <= 0x10; smbus_addr <<= 1) { /* handle clearable bits */ + if (val & smbus_addr) + dev->stat &= ~smbus_addr; + } + break; - case 0x02: - dev->ctl = val & ((dev->local == SMBUS_VIA) ? 0x3f : 0x1f); - if (val & 0x02) { /* cancel an in-progress command if KILL is set */ - if (prev_stat) { /* cancel only if a command is in progress */ - timer_disable(&dev->response_timer); - dev->stat = 0x10; /* raise FAILED */ - } - } - if (val & 0x40) { /* dispatch command if START is set */ - timer_bytes++; /* address */ + case 0x02: + dev->ctl = val & ((dev->local == SMBUS_VIA) ? 0x3f : 0x1f); + if (val & 0x02) { /* cancel an in-progress command if KILL is set */ + if (prev_stat) { /* cancel only if a command is in progress */ + timer_disable(&dev->response_timer); + dev->stat = 0x10; /* raise FAILED */ + } + } + if (val & 0x40) { /* dispatch command if START is set */ + timer_bytes++; /* address */ - smbus_addr = dev->addr >> 1; - read = dev->addr & 0x01; + smbus_addr = dev->addr >> 1; + read = dev->addr & 0x01; - cmd = (dev->ctl >> 2) & 0xf; - smbus_piix4_log("SMBus PIIX4: addr=%02X read=%d protocol=%X cmd=%02X data0=%02X data1=%02X\n", smbus_addr, read, cmd, dev->cmd, dev->data0, dev->data1); + cmd = (dev->ctl >> 2) & 0xf; + smbus_piix4_log("SMBus PIIX4: addr=%02X read=%d protocol=%X cmd=%02X data0=%02X data1=%02X\n", smbus_addr, read, cmd, dev->cmd, dev->data0, dev->data1); - /* Raise DEV_ERR if no device is at this address, or if the device returned NAK. */ - if (!i2c_start(i2c_smbus, smbus_addr, read)) { - dev->next_stat = 0x04; - break; - } + /* Raise DEV_ERR if no device is at this address, or if the device returned NAK. */ + if (!i2c_start(i2c_smbus, smbus_addr, read)) { + dev->next_stat = 0x04; + break; + } - dev->next_stat = 0x02; /* raise INTER (command completed) by default */ + dev->next_stat = 0x02; /* raise INTER (command completed) by default */ - /* Decode the command protocol. - VIA-specific modes (0x4 and [0x6:0xf]) are undocumented and required real hardware research. */ - switch (cmd) { - case 0x0: /* quick R/W */ - break; + /* Decode the command protocol. + VIA-specific modes (0x4 and [0x6:0xf]) are undocumented and required real hardware research. */ + switch (cmd) { + case 0x0: /* quick R/W */ + break; - case 0x1: /* byte R/W */ - if (read) /* byte read */ - dev->data0 = i2c_read(i2c_smbus, smbus_addr); - else /* byte write */ - i2c_write(i2c_smbus, smbus_addr, dev->data0); - timer_bytes++; + case 0x1: /* byte R/W */ + if (read) /* byte read */ + dev->data0 = i2c_read(i2c_smbus, smbus_addr); + else /* byte write */ + i2c_write(i2c_smbus, smbus_addr, dev->data0); + timer_bytes++; - break; + break; - case 0x2: /* byte data R/W */ - /* command write */ - i2c_write(i2c_smbus, smbus_addr, dev->cmd); - timer_bytes++; + case 0x2: /* byte data R/W */ + /* command write */ + i2c_write(i2c_smbus, smbus_addr, dev->cmd); + timer_bytes++; - if (read) /* byte read */ - dev->data0 = i2c_read(i2c_smbus, smbus_addr); - else /* byte write */ - i2c_write(i2c_smbus, smbus_addr, dev->data0); - timer_bytes++; + if (read) /* byte read */ + dev->data0 = i2c_read(i2c_smbus, smbus_addr); + else /* byte write */ + i2c_write(i2c_smbus, smbus_addr, dev->data0); + timer_bytes++; - break; + break; - case 0x3: /* word data R/W */ - /* command write */ - i2c_write(i2c_smbus, smbus_addr, dev->cmd); - timer_bytes++; + case 0x3: /* word data R/W */ + /* command write */ + i2c_write(i2c_smbus, smbus_addr, dev->cmd); + timer_bytes++; - if (read) { /* word read */ - dev->data0 = i2c_read(i2c_smbus, smbus_addr); - dev->data1 = i2c_read(i2c_smbus, smbus_addr); - } else { /* word write */ - i2c_write(i2c_smbus, smbus_addr, dev->data0); - i2c_write(i2c_smbus, smbus_addr, dev->data1); - } - timer_bytes += 2; + if (read) { /* word read */ + dev->data0 = i2c_read(i2c_smbus, smbus_addr); + dev->data1 = i2c_read(i2c_smbus, smbus_addr); + } else { /* word write */ + i2c_write(i2c_smbus, smbus_addr, dev->data0); + i2c_write(i2c_smbus, smbus_addr, dev->data1); + } + timer_bytes += 2; - break; + break; - case 0x4: /* process call */ - if (dev->local != SMBUS_VIA) /* VIA only */ - goto unknown_protocol; + case 0x4: /* process call */ + if (dev->local != SMBUS_VIA) /* VIA only */ + goto unknown_protocol; - if (!read) { /* command write (only when writing) */ - i2c_write(i2c_smbus, smbus_addr, dev->cmd); - timer_bytes++; - } + if (!read) { /* command write (only when writing) */ + i2c_write(i2c_smbus, smbus_addr, dev->cmd); + timer_bytes++; + } - /* fall-through */ + /* fall-through */ - case 0xc: /* I2C process call */ - if (!read) { /* word write (only when writing) */ - i2c_write(i2c_smbus, smbus_addr, dev->data0); - i2c_write(i2c_smbus, smbus_addr, dev->data1); - timer_bytes += 2; - } + case 0xc: /* I2C process call */ + if (!read) { /* word write (only when writing) */ + i2c_write(i2c_smbus, smbus_addr, dev->data0); + i2c_write(i2c_smbus, smbus_addr, dev->data1); + timer_bytes += 2; + } - /* word read */ - dev->data0 = i2c_read(i2c_smbus, smbus_addr); - dev->data1 = i2c_read(i2c_smbus, smbus_addr); - timer_bytes += 2; + /* word read */ + dev->data0 = i2c_read(i2c_smbus, smbus_addr); + dev->data1 = i2c_read(i2c_smbus, smbus_addr); + timer_bytes += 2; - break; + break; - case 0x5: /* block R/W */ - timer_bytes++; /* count the SMBus length byte now */ + case 0x5: /* block R/W */ + timer_bytes++; /* count the SMBus length byte now */ - /* fall-through */ + /* fall-through */ - case 0xd: /* I2C block R/W */ - i2c_write(i2c_smbus, smbus_addr, dev->cmd); - timer_bytes++; + case 0xd: /* I2C block R/W */ + i2c_write(i2c_smbus, smbus_addr, dev->cmd); + timer_bytes++; - if (read) { - /* block read [data0] (I2C) or [first byte] (SMBus) bytes */ - if (cmd == 0x5) - dev->data0 = i2c_read(i2c_smbus, smbus_addr); - for (i = 0; i < dev->data0; i++) - dev->data[i & SMBUS_PIIX4_BLOCK_DATA_MASK] = i2c_read(i2c_smbus, smbus_addr); - } else { - if (cmd == 0x5) /* send length [data0] as first byte on SMBus */ - i2c_write(i2c_smbus, smbus_addr, dev->data0); - /* block write [data0] bytes */ - for (i = 0; i < dev->data0; i++) { - if (!i2c_write(i2c_smbus, smbus_addr, dev->data[i & SMBUS_PIIX4_BLOCK_DATA_MASK])) - break; - } - } - timer_bytes += i; + if (read) { + /* block read [data0] (I2C) or [first byte] (SMBus) bytes */ + if (cmd == 0x5) + dev->data0 = i2c_read(i2c_smbus, smbus_addr); + for (i = 0; i < dev->data0; i++) + dev->data[i & SMBUS_PIIX4_BLOCK_DATA_MASK] = i2c_read(i2c_smbus, smbus_addr); + } else { + if (cmd == 0x5) /* send length [data0] as first byte on SMBus */ + i2c_write(i2c_smbus, smbus_addr, dev->data0); + /* block write [data0] bytes */ + for (i = 0; i < dev->data0; i++) { + if (!i2c_write(i2c_smbus, smbus_addr, dev->data[i & SMBUS_PIIX4_BLOCK_DATA_MASK])) + break; + } + } + timer_bytes += i; - break; + break; - case 0x6: /* I2C with 10-bit address */ - if (dev->local != SMBUS_VIA) /* VIA only */ - goto unknown_protocol; + case 0x6: /* I2C with 10-bit address */ + if (dev->local != SMBUS_VIA) /* VIA only */ + goto unknown_protocol; - /* command write */ - i2c_write(i2c_smbus, smbus_addr, dev->cmd); - timer_bytes++; + /* command write */ + i2c_write(i2c_smbus, smbus_addr, dev->cmd); + timer_bytes++; - /* fall-through */ + /* fall-through */ - case 0xe: /* I2C with 7-bit address */ - if (!read) { /* word write (only when writing) */ - i2c_write(i2c_smbus, smbus_addr, dev->data0); - i2c_write(i2c_smbus, smbus_addr, dev->data1); - timer_bytes += 2; - } + case 0xe: /* I2C with 7-bit address */ + if (!read) { /* word write (only when writing) */ + i2c_write(i2c_smbus, smbus_addr, dev->data0); + i2c_write(i2c_smbus, smbus_addr, dev->data1); + timer_bytes += 2; + } - /* block read [first byte] bytes */ - block_len = dev->data[0]; - for (i = 0; i < block_len; i++) - dev->data[i & SMBUS_PIIX4_BLOCK_DATA_MASK] = i2c_read(i2c_smbus, smbus_addr); - timer_bytes += i; + /* block read [first byte] bytes */ + block_len = dev->data[0]; + for (i = 0; i < block_len; i++) + dev->data[i & SMBUS_PIIX4_BLOCK_DATA_MASK] = i2c_read(i2c_smbus, smbus_addr); + timer_bytes += i; - break; + break; - case 0xf: /* universal */ - /* block write [data0] bytes */ - for (i = 0; i < dev->data0; i++) { - if (!i2c_write(i2c_smbus, smbus_addr, dev->data[i & SMBUS_PIIX4_BLOCK_DATA_MASK])) - break; /* write NAK behavior is unknown */ - } - timer_bytes += i; + case 0xf: /* universal */ + /* block write [data0] bytes */ + for (i = 0; i < dev->data0; i++) { + if (!i2c_write(i2c_smbus, smbus_addr, dev->data[i & SMBUS_PIIX4_BLOCK_DATA_MASK])) + break; /* write NAK behavior is unknown */ + } + timer_bytes += i; - /* block read [data1] bytes */ - for (i = 0; i < dev->data1; i++) - dev->data[i & SMBUS_PIIX4_BLOCK_DATA_MASK] = i2c_read(i2c_smbus, smbus_addr); - timer_bytes += i; + /* block read [data1] bytes */ + for (i = 0; i < dev->data1; i++) + dev->data[i & SMBUS_PIIX4_BLOCK_DATA_MASK] = i2c_read(i2c_smbus, smbus_addr); + timer_bytes += i; - break; + break; - default: /* unknown */ + default: /* unknown */ unknown_protocol: - dev->next_stat = 0x04; /* raise DEV_ERR */ - timer_bytes = 0; - break; - } + dev->next_stat = 0x04; /* raise DEV_ERR */ + timer_bytes = 0; + break; + } - /* Finish transfer. */ - i2c_stop(i2c_smbus, smbus_addr); - } - break; + /* Finish transfer. */ + i2c_stop(i2c_smbus, smbus_addr); + } + break; - case 0x03: - dev->cmd = val; - break; + case 0x03: + dev->cmd = val; + break; - case 0x04: - dev->addr = val; - break; + case 0x04: + dev->addr = val; + break; - case 0x05: - dev->data0 = val; - break; + case 0x05: + dev->data0 = val; + break; - case 0x06: - dev->data1 = val; - break; + case 0x06: + dev->data1 = val; + break; - case 0x07: - dev->data[dev->index++] = val; - if (dev->index >= SMBUS_PIIX4_BLOCK_DATA_SIZE) - dev->index = 0; - break; + case 0x07: + dev->data[dev->index++] = val; + if (dev->index >= SMBUS_PIIX4_BLOCK_DATA_SIZE) + dev->index = 0; + break; } if (dev->next_stat) { /* schedule dispatch of any pending status register update */ - dev->stat = 0x01; /* raise HOST_BUSY while waiting */ - timer_disable(&dev->response_timer); - /* delay = ((half clock for start + half clock for stop) + (bytes * (8 bits + ack))) * bit period in usecs */ - timer_set_delay_u64(&dev->response_timer, (1 + (timer_bytes * 9)) * dev->bit_period * TIMER_USEC); + dev->stat = 0x01; /* raise HOST_BUSY while waiting */ + timer_disable(&dev->response_timer); + /* delay = ((half clock for start + half clock for stop) + (bytes * (8 bits + ack))) * bit period in usecs */ + timer_set_delay_u64(&dev->response_timer, (1 + (timer_bytes * 9)) * dev->bit_period * TIMER_USEC); } } - static void smbus_piix4_response(void *priv) { @@ -327,21 +323,19 @@ smbus_piix4_response(void *priv) dev->stat = dev->next_stat; } - void smbus_piix4_remap(smbus_piix4_t *dev, uint16_t new_io_base, uint8_t enable) { if (dev->io_base) - io_removehandler(dev->io_base, 0x10, smbus_piix4_read, NULL, NULL, smbus_piix4_write, NULL, NULL, dev); + io_removehandler(dev->io_base, 0x10, smbus_piix4_read, NULL, NULL, smbus_piix4_write, NULL, NULL, dev); dev->io_base = new_io_base; smbus_piix4_log("SMBus PIIX4: remap to %04Xh (%sabled)\n", dev->io_base, enable ? "en" : "dis"); if (enable && dev->io_base) - io_sethandler(dev->io_base, 0x10, smbus_piix4_read, NULL, NULL, smbus_piix4_write, NULL, NULL, dev); + io_sethandler(dev->io_base, 0x10, smbus_piix4_read, NULL, NULL, smbus_piix4_write, NULL, NULL, dev); } - void smbus_piix4_setclock(smbus_piix4_t *dev, int clock) { @@ -351,7 +345,6 @@ smbus_piix4_setclock(smbus_piix4_t *dev, int clock) dev->bit_period = 1000000.0 / dev->clock; } - static void * smbus_piix4_init(const device_t *info) { @@ -370,43 +363,42 @@ smbus_piix4_init(const device_t *info) return dev; } - static void smbus_piix4_close(void *priv) { smbus_piix4_t *dev = (smbus_piix4_t *) priv; if (i2c_smbus == dev->i2c) - i2c_smbus = NULL; + i2c_smbus = NULL; i2c_removebus(dev->i2c); free(dev); } const device_t piix4_smbus_device = { - .name = "PIIX4-compatible SMBus Host Controller", + .name = "PIIX4-compatible SMBus Host Controller", .internal_name = "piix4_smbus", - .flags = DEVICE_AT, - .local = SMBUS_PIIX4, - .init = smbus_piix4_init, - .close = smbus_piix4_close, - .reset = NULL, + .flags = DEVICE_AT, + .local = SMBUS_PIIX4, + .init = smbus_piix4_init, + .close = smbus_piix4_close, + .reset = NULL, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL }; const device_t via_smbus_device = { - .name = "VIA VT82C686B SMBus Host Controller", + .name = "VIA VT82C686B SMBus Host Controller", .internal_name = "via_smbus", - .flags = DEVICE_AT, - .local = SMBUS_VIA, - .init = smbus_piix4_init, - .close = smbus_piix4_close, - .reset = NULL, + .flags = DEVICE_AT, + .local = SMBUS_VIA, + .init = smbus_piix4_init, + .close = smbus_piix4_close, + .reset = NULL, { .available = NULL }, .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL + .force_redraw = NULL, + .config = NULL };