diff --git a/src/apm.c b/src/apm.c index 59f8e40e2..b197c0964 100644 --- a/src/apm.c +++ b/src/apm.c @@ -49,43 +49,55 @@ apm_log(const char *fmt, ...) void -apm_set_do_smi(apm_t *apm, uint8_t do_smi) +apm_set_do_smi(apm_t *dev, uint8_t do_smi) { - apm->do_smi = do_smi; + dev->do_smi = do_smi; } static void apm_out(uint16_t port, uint8_t val, void *p) { - apm_t *apm = (apm_t *) p; + apm_t *dev = (apm_t *) p; apm_log("[%04X:%08X] APM write: %04X = %02X (BX = %04X, CX = %04X)\n", CS, cpu_state.pc, port, val, BX, CX); port &= 0x0001; if (port == 0x0000) { - apm->cmd = val; - if (apm->do_smi) + dev->cmd = val; + if (dev->do_smi) smi_line = 1; } else - apm->stat = val; + dev->stat = val; } static uint8_t apm_in(uint16_t port, void *p) { - apm_t *apm = (apm_t *) p; - - apm_log("[%04X:%08X] APM read: %04X = FF\n", CS, cpu_state.pc, port); + apm_t *dev = (apm_t *) p; + uint8_t ret = 0xff; port &= 0x0001; if (port == 0x0000) - return apm->cmd; + ret = dev->cmd; else - return apm->stat; + ret = dev->stat; + + apm_log("[%04X:%08X] APM read: %04X = %02X\n", CS, cpu_state.pc, port, ret); + + return ret; +} + + +static void +apm_reset(void *p) +{ + apm_t *dev = (apm_t *)p; + + dev->cmd = dev->stat = 0x00; } @@ -101,12 +113,12 @@ apm_close(void *p) static void *apm_init(const device_t *info) { - apm_t *apm = (apm_t *) malloc(sizeof(apm_t)); - memset(apm, 0, sizeof(apm_t)); + apm_t *dev = (apm_t *) malloc(sizeof(apm_t)); + memset(dev, 0, sizeof(apm_t)); - io_sethandler(0x00b2, 0x0002, apm_in, NULL, NULL, apm_out, NULL, NULL, apm); + io_sethandler(0x00b2, 0x0002, apm_in, NULL, NULL, apm_out, NULL, NULL, dev); - return apm; + return dev; } @@ -123,3 +135,18 @@ const device_t apm_device = NULL, NULL }; + + +const device_t apm_pci_device = +{ + "Advanced Power Management (PCI)", + DEVICE_PCI, + 0, + apm_init, + apm_close, + apm_reset, + NULL, + NULL, + NULL, + NULL +}; diff --git a/src/ddma.c b/src/ddma.c new file mode 100644 index 000000000..98e4da293 --- /dev/null +++ b/src/ddma.c @@ -0,0 +1,200 @@ +/* + * 86Box A hypervisor and IBM PC system emulator that specializes in + * running old operating systems and software designed for IBM + * PC systems and compatibles from 1981 through fairly recent + * system designs based on the PCI bus. + * + * This file is part of the 86Box distribution. + * + * Distributed DMA emulation. + * + * + * + * Authors: Miran Grca, + * + * Copyright 2020 Miran Grca. + */ +#include +#include +#include +#include +#include +#include +#define HAVE_STDARG_H +#include <86box/86box.h> +#include "cpu.h" +#include <86box/device.h> +#include <86box/mem.h> +#include <86box/io.h> +#include <86box/pci.h> +#include <86box/pic.h> +#include <86box/timer.h> +#include <86box/keyboard.h> +#include <86box/nvr.h> +#include <86box/pit.h> +#include <86box/dma.h> +#include <86box/ddma.h> + + +#ifdef ENABLE_DDMA_LOG +int ddma_do_log = ENABLE_DDMA_LOG; + + +static void +ddma_log(const char *fmt, ...) +{ + va_list ap; + + if (ddma_do_log) { + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); + } +} +#else +#define ddma_log(fmt, ...) +#endif + +static uint8_t +ddma_reg_read(uint16_t addr, void *p) +{ + ddma_channel_t *dev = (ddma_channel_t *) p; + uint8_t ret = 0xff; + int ch = dev->channel; + int dmab = (ch >= 4) ? 0xc0 : 0x00; + + switch (addr & 0x0f) { + case 0x00: + ret = dma[ch].ac & 0xff; + break; + case 0x01: + ret = (dma[ch].ac >> 8) & 0xff; + break; + case 0x02: + ret = dma[ch].page; + break; + case 0x04: + ret = dma[ch].cc & 0xff; + break; + case 0x05: + ret = (dma[ch].cc >> 8) & 0xff; + break; + case 0x09: + ret = inb(dmab + 0x08); + break; + } + + return ret; +} + + +static void +ddma_reg_write(uint16_t addr, uint8_t val, void *p) +{ + ddma_channel_t *dev = (ddma_channel_t *) p; + int ch = dev->channel; + int page_regs[4] = { 7, 3, 1, 2 }; + int i, dmab = (ch >= 4) ? 0xc0 : 0x00; + + switch (addr & 0x0f) { + case 0x00: + dma[ch].ab = (dma[ch].ab & 0xffff00) | val; + dma[ch].ac = dma[ch].ab; + break; + case 0x01: + dma[ch].ab = (dma[ch].ab & 0xff00ff) | (val << 8); + dma[ch].ac = dma[ch].ab; + break; + case 0x02: + if (ch >= 4) + outb(0x88 + page_regs[ch], val); + else + outb(0x80 + page_regs[ch], val); + break; + case 0x04: + dma[ch].cb = (dma[ch].cb & 0xffff00) | val; + dma[ch].cc = dma[ch].cb; + break; + case 0x05: + dma[ch].cb = (dma[ch].cb & 0xff00ff) | (val << 8); + dma[ch].cc = dma[ch].cb; + break; + case 0x08: + outb(dmab + 0x08, val); + break; + case 0x09: + outb(dmab + 0x09, val); + break; + case 0x0a: + outb(dmab + 0x0a, val); + break; + case 0x0b: + outb(dmab + 0x0b, val); + break; + case 0x0d: + outb(dmab + 0x0d, val); + break; + case 0x0e: + for (i = 0; i < 4; i++) + outb(dmab + 0x0a, i); + break; + case 0x0f: + outb(dmab + 0x0a, (val << 2) | (ch & 3)); + break; + } +} + + +void +ddma_update_io_mapping(ddma_t *dev, int ch, uint8_t base_l, uint8_t base_h, int enable) +{ + if (dev->channels[ch].enable && (dev->channels[ch].io_base != 0x0000)) + io_removehandler(dev->channels[ch].io_base, 0x10, ddma_reg_read, NULL, NULL, ddma_reg_write, NULL, NULL, &dev->channels[ch]); + + dev->channels[ch].io_base = base_l | (base_h << 8); + dev->channels[ch].enable = enable; + + if (dev->channels[ch].enable && (dev->channels[ch].io_base != 0x0000)) + io_sethandler(dev->channels[ch].io_base, 0x10, ddma_reg_read, NULL, NULL, ddma_reg_write, NULL, NULL, &dev->channels[ch]); +} + + +static void +ddma_close(void *priv) +{ + ddma_t *dev = (ddma_t *) priv; + + free(dev); +} + + +static void * +ddma_init(const device_t *info) +{ + ddma_t *dev; + int i; + + dev = (ddma_t *)malloc(sizeof(ddma_t)); + if (dev == NULL) return(NULL); + memset(dev, 0x00, sizeof(ddma_t)); + + for (i = 0; i < 8; i++) + dev->channels[i].channel = i; + + return dev; +} + + +const device_t ddma_device = +{ + "Distributed DMA", + DEVICE_PCI, + 0, + ddma_init, + ddma_close, + NULL, + NULL, + NULL, + NULL, + NULL +}; diff --git a/src/disk/hdc_ide.c b/src/disk/hdc_ide.c index 4b2e46b13..2b6104ee8 100644 --- a/src/disk/hdc_ide.c +++ b/src/disk/hdc_ide.c @@ -1815,12 +1815,13 @@ ide_readb(uint16_t addr, void *priv) case 0x2: /* Sector count */ if (ide->type == IDE_ATAPI) temp = ide->sc->phase; - else + else if (ide->type != IDE_NONE) temp = ide->secount; break; case 0x3: /* Sector */ - temp = (uint8_t) ide->sector; + if (ide->type != IDE_NONE) + temp = (uint8_t) ide->sector; break; case 0x4: /* Cylinder low */ diff --git a/src/include/86box/apm.h b/src/include/86box/apm.h index e420ec717..b7754f78a 100644 --- a/src/include/86box/apm.h +++ b/src/include/86box/apm.h @@ -38,10 +38,11 @@ typedef struct /* Global variables. */ extern const device_t apm_device; +extern const device_t apm_pci_device; /* Functions. */ -extern void apm_set_do_smi(apm_t *apm, uint8_t do_smi); +extern void apm_set_do_smi(apm_t *dev, uint8_t do_smi); #ifdef __cplusplus } diff --git a/src/include/86box/ddma.h b/src/include/86box/ddma.h new file mode 100644 index 000000000..2d0a9f8d9 --- /dev/null +++ b/src/include/86box/ddma.h @@ -0,0 +1,56 @@ +/* + * 86Box A hypervisor and IBM PC system emulator that specializes in + * running old operating systems and software designed for IBM + * PC systems and compatibles from 1981 through fairly recent + * system designs based on the PCI bus. + * + * This file is part of the 86Box distribution. + * + * Implementation of the ISA Bus (de)Bugger expansion card + * sold as a DIY kit in the late 1980's in The Netherlands. + * This card was a assemble-yourself 8bit ISA addon card for + * PC and AT systems that had several tools to aid in low- + * level debugging (mostly for faulty BIOSes, bootloaders + * and system kernels...) + * + * Definitions for the Distributed DMA emulation. + * + * + * + * Authors: Miran Grca, + * + * Copyright 2020 Miran Grca. + */ +#ifndef DDMA_H +# define DDMA_H + + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct +{ + uint16_t io_base; + int channel, enable; +} ddma_channel_t; + +typedef struct +{ + ddma_channel_t channels[8]; +} ddma_t; + + +/* Global variables. */ +extern const device_t ddma_device; + + +/* Functions. */ +extern void ddma_update_io_mapping(ddma_t *dev, int ch, uint8_t base_l, uint8_t base_h, int enable); + +#ifdef __cplusplus +} +#endif + + +#endif /*DDMA_H*/ diff --git a/src/include/86box/language.h b/src/include/86box/language.h index f112ec19f..9b3065be9 100644 --- a/src/include/86box/language.h +++ b/src/include/86box/language.h @@ -99,6 +99,7 @@ #define IDS_2123 2123 // "Unable to initialize Ghostscript..." #define IDS_2124 2124 // "MO %i (%03i): %ls" #define IDS_2125 2125 // "MO images (*.IM?)\0*.IM..." +#define IDS_2126 2126 // "Welcome to 86Box!" #define IDS_4096 4096 // "Hard disk (%s)" #define IDS_4097 4097 // "%01i:%01i" @@ -177,7 +178,7 @@ #define IDS_LANG_ENUS IDS_7168 -#define STR_NUM_2048 78 +#define STR_NUM_2048 79 #define STR_NUM_3072 11 #define STR_NUM_4096 18 #define STR_NUM_4352 7 diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index 9640f1349..453c18132 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -289,15 +289,15 @@ extern int machine_at_acerv35n_init(const machine_t *); extern int machine_at_ap53_init(const machine_t *); extern int machine_at_p55t2p4_init(const machine_t *); extern int machine_at_p55t2s_init(const machine_t *); +extern int machine_at_m7shi_init(const machine_t *); extern int machine_at_tc430hx_init(const machine_t *); -extern int machine_at_equium5200_init(const machine_t *); /* Toshiba branded CU430HX. - Works as intended (No need to set an MPU too). */ +extern int machine_at_equium5200_init(const machine_t *); extern int machine_at_p55tvp4_init(const machine_t *); -extern int machine_at_i430vx_init(const machine_t *); extern int machine_at_p55va_init(const machine_t *); -extern int machine_at_j656vxd_init(const machine_t *); -extern int machine_at_mb520n_init(const machine_t *); +extern int machine_at_i430vx_init(const machine_t *); +extern int machine_at_brio80xx_init(const machine_t *); +extern int machine_at_pb680_init(const machine_t *); extern int machine_at_p55xb2_init(const machine_t *); extern int machine_at_tx97_init(const machine_t *); @@ -338,10 +338,6 @@ extern int machine_at_atc7020bxii_init(const machine_t *); extern int machine_at_63a_init(const machine_t *); extern int machine_at_apas3_init(const machine_t *); -#if defined(DEV_BRANCH) && defined(USE_596B) -extern int machine_at_bx98_init(const machine_t *); -#endif - /* m_at_t3100e.c */ extern int machine_at_t3100e_init(const machine_t *); diff --git a/src/include/86box/resource.h b/src/include/86box/resource.h index 60990f691..59dc27d0d 100644 --- a/src/include/86box/resource.h +++ b/src/include/86box/resource.h @@ -300,6 +300,8 @@ #define IDM_VID_GRAY_GREEN 40083 #define IDM_VID_GRAY_WHITE 40084 +#define IDM_MEDIA 40085 + #ifdef USE_DISCORD #define IDM_DISCORD 40090 #endif diff --git a/src/include/86box/usb.h b/src/include/86box/usb.h index 69adcf96b..b027796a2 100644 --- a/src/include/86box/usb.h +++ b/src/include/86box/usb.h @@ -1,41 +1,55 @@ -/* Copyright holders: Melissa Goad - see COPYING for more details -*/ +/* + * 86Box A hypervisor and IBM PC system emulator that specializes in + * running old operating systems and software designed for IBM + * PC systems and compatibles from 1981 through fairly recent + * system designs based on the PCI bus. + * + * This file is part of the 86Box distribution. + * + * Implementation of the ISA Bus (de)Bugger expansion card + * sold as a DIY kit in the late 1980's in The Netherlands. + * This card was a assemble-yourself 8bit ISA addon card for + * PC and AT systems that had several tools to aid in low- + * level debugging (mostly for faulty BIOSes, bootloaders + * and system kernels...) + * + * Definitions for the Distributed DMA emulation. + * + * + * + * Authors: Miran Grca, + * + * Copyright 2020 Miran Grca. + */ +#ifndef USB_H +# define USB_H + + +#ifdef __cplusplus +extern "C" { +#endif typedef struct { - uint8_t pid; //low 4 bits are the real pid, top 4 bits are just ~pid - uint8_t dev_addr; - uint8_t dev_endpoint; - int crc5; - uint16_t crc16; - uint8_t data[1024]; - int len; - void* device; -} usb_packet_t; + uint8_t ohci_mmio[4096]; + uint16_t uhci_io_base; + int uhci_enable, ohci_enable; + uint32_t ohci_mem_base; + mem_mapping_t ohci_mmio_mapping; +} usb_t; -typedef enum -{ - USB_DEV_TYPE_NONE = 0, - USB_DEV_TYPE_MOUSE, - USB_DEV_TYPE_TABLET, - USB_DEV_TYPE_KEYPAD, - USB_DEV_TYPE_DISK, - USB_DEV_TYPE_CDROM, - USB_DEV_TYPE_HUB, - USB_DEV_TYPE_PRINTER -} usb_device_type_t; -typedef enum -{ - USB_PID_TOKEN_STALL = 0x1e, - USB_PID_TOKEN_SETUP = 0x2d, - USB_PID_TOKEN_PRE = 0x3c, - USB_PID_TOKEN_DATA1 = 0x4b, - USB_PID_TOKEN_NAK = 0x5a, - USB_PID_TOKEN_IN = 0x69, - USB_PID_TOKEN_SOF = 0xa5, - USB_PID_TOKEN_DATA0 = 0xc3, - USB_PID_TOKEN_ACK = 0xd2, - USB_PID_TOKEN_OUT = 0xe1 -} usb_pid_type_t; \ No newline at end of file +/* Global variables. */ +extern const device_t usb_device; + + +/* Functions. */ +extern void uhci_update_io_mapping(usb_t *dev, uint8_t base_l, uint8_t base_h, int enable); +extern void ohci_update_mem_mapping(usb_t *dev, uint8_t base1, uint8_t base2, uint8_t base3, int enable); + +#ifdef __cplusplus +} +#endif + + +#endif /*USB_H*/ diff --git a/src/include/86box/win.h b/src/include/86box/win.h index 597ebaa59..5498d3f07 100644 --- a/src/include/86box/win.h +++ b/src/include/86box/win.h @@ -168,6 +168,7 @@ extern void win_settings_open_ex(HWND hwnd, int category); /* Functions in win_stbar.c: */ extern HWND hwndSBAR; extern void StatusBarCreate(HWND hwndParent, uintptr_t idStatus, HINSTANCE hInst); +extern int MediaMenuHandler(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); /* Functions in win_dialog.c: */ diff --git a/src/intel_piix.c b/src/intel_piix.c index 8e83e0f0e..257b9be9a 100644 --- a/src/intel_piix.c +++ b/src/intel_piix.c @@ -40,6 +40,7 @@ #include <86box/timer.h> #include <86box/nvr.h> #include <86box/acpi.h> +#include <86box/ddma.h> #include <86box/pci.h> #include <86box/pic.h> #include <86box/pit.h> @@ -47,19 +48,13 @@ #include <86box/hdc.h> #include <86box/hdc_ide.h> #include <86box/hdc_ide_sff8038i.h> +#include <86box/usb.h> #include <86box/zip.h> #include <86box/machine.h> #include <86box/smbus_piix4.h> #include <86box/piix.h> -typedef struct -{ - uint16_t io_base; - int base_channel; -} ddma_t; - - typedef struct { uint8_t cur_readout_reg, rev, @@ -68,15 +63,14 @@ typedef struct regs[4][256], readout_regs[256], board_config[2]; uint16_t func0_id, nvr_io_base, - usb_io_base, acpi_io_base; + acpi_io_base; double fast_off_period; - uint8_t *usb_smsc_mmio; - mem_mapping_t usb_smsc_mmio_mapping; sff8038i_t *bm[2]; - ddma_t ddma[2]; smbus_piix4_t * smbus; apm_t * apm; nvr_t * nvr; + ddma_t * ddma; + usb_t * usb; acpi_t * acpi; port_92_t * port_92; pc_timer_t fast_off_timer; @@ -246,200 +240,6 @@ kbc_alias_update_io_mapping(piix_t *dev) } -static uint8_t -ddma_reg_read(uint16_t addr, void *p) -{ - ddma_t *dev = (ddma_t *) p; - uint8_t ret = 0xff; - int rel_ch = (addr & 0x30) >> 4; - int ch = dev->base_channel + rel_ch; - int dmab = (ch >= 4) ? 0xc0 : 0x00; - - switch (addr & 0x0f) { - case 0x00: - ret = dma[ch].ac & 0xff; - break; - case 0x01: - ret = (dma[ch].ac >> 8) & 0xff; - break; - case 0x02: - ret = dma[ch].page; - break; - case 0x04: - ret = dma[ch].cc & 0xff; - break; - case 0x05: - ret = (dma[ch].cc >> 8) & 0xff; - break; - case 0x09: - ret = inb(dmab + 0x08); - break; - } - - return ret; -} - - -static void -ddma_reg_write(uint16_t addr, uint8_t val, void *p) -{ - ddma_t *dev = (ddma_t *) p; - int rel_ch = (addr & 0x30) >> 4; - int ch = dev->base_channel + rel_ch; - int page_regs[4] = { 7, 3, 1, 2 }; - int i, dmab = (ch >= 4) ? 0xc0 : 0x00; - - switch (addr & 0x0f) { - case 0x00: - dma[ch].ab = (dma[ch].ab & 0xffff00) | val; - dma[ch].ac = dma[ch].ab; - break; - case 0x01: - dma[ch].ab = (dma[ch].ab & 0xff00ff) | (val << 8); - dma[ch].ac = dma[ch].ab; - break; - case 0x02: - if (ch >= 4) - outb(0x88 + page_regs[rel_ch], val); - else - outb(0x80 + page_regs[rel_ch], val); - break; - case 0x04: - dma[ch].cb = (dma[ch].cb & 0xffff00) | val; - dma[ch].cc = dma[ch].cb; - break; - case 0x05: - dma[ch].cb = (dma[ch].cb & 0xff00ff) | (val << 8); - dma[ch].cc = dma[ch].cb; - break; - case 0x08: - outb(dmab + 0x08, val); - break; - case 0x09: - outb(dmab + 0x09, val); - break; - case 0x0a: - outb(dmab + 0x0a, val); - break; - case 0x0b: - outb(dmab + 0x0b, val); - break; - case 0x0d: - outb(dmab + 0x0d, val); - break; - case 0x0e: - for (i = 0; i < 4; i++) - outb(dmab + 0x0a, i); - break; - case 0x0f: - outb(dmab + 0x0a, (val << 2) | rel_ch); - break; - } -} - - -static void -ddma_update_io_mapping(piix_t *dev, int n) -{ - int base_reg = 0x92 + (n << 1); - - if (dev->ddma[n].io_base != 0x0000) - io_removehandler(dev->ddma[n].io_base, 0x40, ddma_reg_read, NULL, NULL, ddma_reg_write, NULL, NULL, &dev->ddma[n]); - - dev->ddma[n].io_base = (dev->regs[0][base_reg] & ~0x3f) | (dev->regs[0][base_reg + 1] << 8); - - if (dev->ddma[n].io_base != 0x0000) - io_sethandler(dev->ddma[n].io_base, 0x40, ddma_reg_read, NULL, NULL, ddma_reg_write, NULL, NULL, &dev->ddma[n]); -} - - -static uint8_t -usb_reg_read(uint16_t addr, void *p) -{ - uint8_t ret = 0xff; - - switch (addr & 0x1f) { - case 0x10: case 0x11: case 0x12: case 0x13: - /* Port status */ - ret = 0x00; - break; - } - - return ret; -} - - -static void -usb_reg_write(uint16_t addr, uint8_t val, void *p) -{ -} - - -static void -usb_update_io_mapping(piix_t *dev) -{ - if (dev->usb_io_base != 0x0000) - io_removehandler(dev->usb_io_base, 0x20, usb_reg_read, NULL, NULL, usb_reg_write, NULL, NULL, dev); - - dev->usb_io_base = (dev->regs[2][0x20] & ~0x1f) | (dev->regs[2][0x21] << 8); - - if ((dev->regs[2][PCI_REG_COMMAND] & PCI_COMMAND_IO) && (dev->usb_io_base != 0x0000)) - io_sethandler(dev->usb_io_base, 0x20, usb_reg_read, NULL, NULL, usb_reg_write, NULL, NULL, dev); -} - - -static void -usb_smsc_update_mem_mapping(piix_t *dev) -{ - uint32_t usb_bar; - - mem_mapping_disable(&dev->usb_smsc_mmio_mapping); - - usb_bar = ((dev->regs[2][0x11] << 8) | (dev->regs[2][0x12] << 16) | (dev->regs[2][0x13] << 24)) & 0xfffff000; - - if ((dev->regs[2][0x04] & 0x02) && (usb_bar != 0x00000000)) - mem_mapping_set_addr(&dev->usb_smsc_mmio_mapping, usb_bar, 0x1000); -} - - -static uint8_t -usb_smsc_mmio_read(uint32_t addr, void *p) -{ - piix_t *dev = (piix_t *) p; - uint8_t ret = 0x00; - - addr &= 0x00000fff; - - ret = dev->usb_smsc_mmio[addr]; - - return ret; -} - - -static void -usb_smsc_mmio_write(uint32_t addr, uint8_t val, void *p) -{ - piix_t *dev = (piix_t *) p; - - addr &= 0x00000fff; - - switch (addr) { - case 0x08: /* HCCOMMANDSTATUS */ - /* bit HostControllerReset must be cleared for the controller to be seen as initialized */ - val &= ~0x01; - - /* bit OwnershipChangeRequest triggers an ownership change (SMM <-> OS) */ - if (val & 0x0f) { - dev->usb_smsc_mmio[0x0f] = 0x40; - dev->usb_smsc_mmio[0x05] &= ~(dev->usb_smsc_mmio[0x05] & 0x01); - } - break; - } - - dev->usb_smsc_mmio[addr] = val; -} - - static void smbus_update_io_mapping(piix_t *dev) { @@ -480,6 +280,7 @@ piix_write(int func, int addr, uint8_t val, void *priv) { piix_t *dev = (piix_t *) priv; uint8_t *fregs; + int i; /* Return on unsupported function. */ if (dev->max_func > 0) { @@ -643,16 +444,18 @@ piix_write(int func, int addr, uint8_t val, void *priv) case 0x92: case 0x93: case 0x94: case 0x95: if (dev->type > 3) { if (addr & 0x01) - fregs[addr] = val & 0xc0; - else fregs[addr] = val & 0xff; - ddma_update_io_mapping(dev, (addr >> 2) & 1); + else + fregs[addr] = val & 0xc0; + + for (i = 0; i < 4; i++) + ddma_update_io_mapping(dev->ddma, (addr & 4) + i, fregs[addr & 0xfe] + (i << 4), fregs[addr | 0x01], 1); } break; case 0xa0: if (dev->type < 4) { fregs[addr] = val & 0x1f; - apm_set_do_smi(dev->apm, (val & 0x01) | (fregs[0xa2] & 0x80)); + apm_set_do_smi(dev->apm, !!(val & 0x01) && !!(fregs[0xa2] & 0x80)); switch ((val & 0x18) >> 3) { case 0x00: dev->fast_off_period = PCICLK * 32768.0 * 60000.0; @@ -677,7 +480,7 @@ piix_write(int func, int addr, uint8_t val, void *priv) case 0xa2: if (dev->type < 4) { fregs[addr] = val & 0xff; - apm_set_do_smi(dev->apm, (fregs[0xa0] & 0x01) | (val & 0x80)); + apm_set_do_smi(dev->apm, !!(fregs[0xa0] & 0x01) && !!(val & 0x80)); } break; case 0xaa: case 0xac: case 0xae: @@ -886,10 +689,10 @@ piix_write(int func, int addr, uint8_t val, void *priv) case 0x04: if (dev->type > 4) { fregs[0x04] = (val & 7); - usb_smsc_update_mem_mapping(dev); + ohci_update_mem_mapping(dev->usb, fregs[0x11], fregs[0x12], fregs[0x13], fregs[PCI_REG_COMMAND] & PCI_COMMAND_MEM); } else { fregs[0x04] = (val & 5); - usb_update_io_mapping(dev); + uhci_update_io_mapping(dev->usb, fregs[0x20] & ~0x1f, fregs[0x21], fregs[PCI_REG_COMMAND] & PCI_COMMAND_IO); } break; case 0x07: @@ -917,25 +720,25 @@ piix_write(int func, int addr, uint8_t val, void *priv) case 0x11: if (dev->type > 4) { fregs[addr] = val & 0xf0; - usb_smsc_update_mem_mapping(dev); + ohci_update_mem_mapping(dev->usb, fregs[0x11], fregs[0x12], fregs[0x13], fregs[PCI_REG_COMMAND] & PCI_COMMAND_MEM); } break; case 0x12: case 0x13: if (dev->type > 4) { fregs[addr] = val; - usb_smsc_update_mem_mapping(dev); + ohci_update_mem_mapping(dev->usb, fregs[0x11], fregs[0x12], fregs[0x13], fregs[PCI_REG_COMMAND] & PCI_COMMAND_MEM); } break; case 0x20: if (dev->type < 5) { fregs[0x20] = (val & 0xe0) | 1; - usb_update_io_mapping(dev); + uhci_update_io_mapping(dev->usb, fregs[0x20] & ~0x1f, fregs[0x21], fregs[PCI_REG_COMMAND] & PCI_COMMAND_IO); } break; case 0x21: if (dev->type < 5) { fregs[0x21] = val; - usb_update_io_mapping(dev); + uhci_update_io_mapping(dev->usb, fregs[0x20] & ~0x1f, fregs[0x21], fregs[PCI_REG_COMMAND] & PCI_COMMAND_IO); } break; case 0x3c: @@ -1263,14 +1066,6 @@ piix_reset_hard(piix_t *dev) fregs[0xff] = (dev->type > 3) ? 0x10 : 0x00; } dev->max_func = 1; /* It starts with USB disabled, then enables it. */ - - /* SMSC OHCI memory-mapped registers */ - if (dev->usb_smsc_mmio) { - memset(dev->usb_smsc_mmio, 0, 4096); - dev->usb_smsc_mmio[0x00] = 0x10; - dev->usb_smsc_mmio[0x01] = 0x01; - dev->usb_smsc_mmio[0x48] = 0x02; - } } /* Function 3: Power Management */ @@ -1387,6 +1182,9 @@ static void dev->bm[0] = device_add_inst(&sff8038i_device, 1); dev->bm[1] = device_add_inst(&sff8038i_device, 2); + if (dev->type >= 3) + dev->usb = device_add(&usb_device); + if (dev->type > 3) { dev->nvr = device_add(&piix4_nvr_device); dev->smbus = device_add(&piix4_smbus_device); @@ -1394,20 +1192,11 @@ static void dev->acpi = device_add(&acpi_device); acpi_set_slot(dev->acpi, dev->pci_slot); acpi_set_nvr(dev->acpi, dev->nvr); + + dev->ddma = device_add(&ddma_device); } else timer_add(&dev->fast_off_timer, piix_fast_off_count, dev, 0); - if (dev->type > 4) { - dev->usb_smsc_mmio = (uint8_t *) malloc(4096); - memset(dev->usb_smsc_mmio, 0x00, 4096); - - mem_mapping_add(&dev->usb_smsc_mmio_mapping, 0, 0, - usb_smsc_mmio_read, NULL, NULL, - usb_smsc_mmio_write, NULL, NULL, - NULL, MEM_MAPPING_EXTERNAL, dev); - mem_mapping_disable(&dev->usb_smsc_mmio_mapping); - } - piix_reset_hard(dev); piix_log("Maximum function: %i\n", dev->max_func); cpu_fast_off_flags = 0x00000000; @@ -1417,7 +1206,7 @@ static void } else cpu_fast_off_val = cpu_fast_off_count = 0; - dev->apm = device_add(&apm_device); + dev->apm = device_add(&apm_pci_device); /* APM intercept handler to update PIIX/PIIX3 and PIIX4/4E/SMSC ACPI SMI status on APM SMI. */ io_sethandler(0x00b2, 0x0001, NULL, NULL, NULL, piix_apm_out, NULL, NULL, dev); dev->port_92 = device_add(&port_92_pci_device); diff --git a/src/machine/m_at_socket370.c b/src/machine/m_at_socket370.c index 24425793a..009999f07 100644 --- a/src/machine/m_at_socket370.c +++ b/src/machine/m_at_socket370.c @@ -199,32 +199,3 @@ machine_at_apas3_init(const machine_t *model) return ret; } - -#if defined(DEV_BRANCH) && defined(USE_596B) -int -machine_at_bx98_init(const machine_t *model) -{ - int ret; - - ret = bios_load_linear(L"roms/machines/bx98/vc98103e.bin", - 0x000c0000, 262144, 0); - - if (bios_only || !ret) - return ret; - - machine_at_common_init_ex(model, 2); - - pci_init(PCI_CONFIG_TYPE_1); - pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); - pci_register_slot(0x01, PCI_CARD_NORMAL, 1, 2, 3, 4); - device_add(&via_apro_device); - device_add(&via_vt82c596b_device); - device_add(&um8669f_device); - device_add(&keyboard_ps2_ami_pci_device); - device_add(&sst_flash_39sf020_device); - spd_register(SPD_TYPE_SDRAM, 0x7, 256); - - return ret; -} -#endif diff --git a/src/machine/m_at_socket7_s7.c b/src/machine/m_at_socket7_s7.c index 9b4a615db..702f7d9d3 100644 --- a/src/machine/m_at_socket7_s7.c +++ b/src/machine/m_at_socket7_s7.c @@ -302,6 +302,34 @@ machine_at_p55t2s_init(const machine_t *model) return ret; } +int +machine_at_m7shi_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear(L"roms/machines/m7shi/m7shi2n.rom", + 0x000c0000, 262144, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_init(model); + + pci_init(PCI_CONFIG_TYPE_1); + pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x12, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x11, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x10, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + device_add(&i430hx_device); + device_add(&piix3_device); + device_add(&keyboard_ps2_ami_pci_device); + device_add(&fdc37c935_device); + device_add(&intel_flash_bxt_device); + + return ret; +} int machine_at_tc430hx_init(const machine_t *model) @@ -372,13 +400,12 @@ machine_at_equium5200_init(const machine_t *model) // Information about that mac return ret; } - int machine_at_p55tvp4_init(const machine_t *model) { int ret; - ret = bios_load_linear(L"roms/machines/p55tvp4/tv5i0204.awd", + ret = bios_load_linear(L"roms/machines/p55tvp4/0204_128.BIN", 0x000e0000, 131072, 0); if (bios_only || !ret) @@ -388,21 +415,20 @@ machine_at_p55tvp4_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 4, 1, 2); pci_register_slot(0x09, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&i430vx_device); device_add(&piix3_device); - device_add(&keyboard_ps2_pci_device); + device_add(&keyboard_ps2_ami_pci_device); //It uses the AMIKEY KBC device_add(&w83877f_device); device_add(&intel_flash_bxt_device); return ret; } - int machine_at_i430vx_init(const machine_t *model) { @@ -432,7 +458,6 @@ machine_at_i430vx_init(const machine_t *model) return ret; } - int machine_at_p55va_init(const machine_t *model) { @@ -462,14 +487,13 @@ machine_at_p55va_init(const machine_t *model) return ret; } - int -machine_at_j656vxd_init(const machine_t *model) +machine_at_brio80xx_init(const machine_t *model) { int ret; - ret = bios_load_linear(L"roms/machines/j656vxd/J656VXD.BIN", - 0x000e0000, 131072, 0); + ret = bios_load_linear(L"roms/machines/brio80xx/Hf0705.rom", + 0x000c0000, 262144, 0); if (bios_only || !ret) return ret; @@ -477,48 +501,54 @@ machine_at_j656vxd_init(const machine_t *model) machine_at_common_init(model); pci_init(PCI_CONFIG_TYPE_1); - pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x14, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x11, PCI_CARD_NORMAL, 3, 4, 1, 2); pci_register_slot(0x12, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x13, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); - device_add(&i430vx_device); - device_add(&piix3_device); - device_add(&keyboard_ps2_pci_device); - device_add(&fdc37c669_device); - device_add(&intel_flash_bxt_device); - - return ret; -} -int -machine_at_mb520n_init(const machine_t *model) -{ - int ret; - - ret = bios_load_linear(L"roms/machines/mb520n/520n503s.rom", - 0x000e0000, 131072, 0); - - if (bios_only || !ret) - return ret; - - machine_at_common_init(model); - - pci_init(PCI_CONFIG_TYPE_1); - pci_register_slot(0x11, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x12, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x14, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x13, PCI_CARD_NORMAL, 1, 2, 3, 4); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); device_add(&i430vx_device); device_add(&piix3_device); device_add(&keyboard_ps2_ami_pci_device); - device_add(&fdc37c669_device); - device_add(&intel_flash_bxt_device); + device_add(&fdc37c935_device); + // device_add(&intel_flash_bxt_device); + device_add(&sst_flash_29ee020_device); return ret; } +int +machine_at_pb680_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear_combined2(L"roms/machines/pb680/1012DN0R.BIO", + L"roms/machines/pb680/1012DN0R.BI1", + L"roms/machines/pb680/1012DN0R.BI2", + L"roms/machines/pb680/1012DN0R.BI3", + L"roms/machines/pb680/1012DN0R.RCV", + 0x3a000, 128); + + if (bios_only || !ret) + return ret; + + machine_at_common_init(model); + + pci_init(PCI_CONFIG_TYPE_1); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x08, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); + device_add(&i430vx_device); + device_add(&piix3_device); + device_add(&keyboard_ps2_ami_pci_device); + device_add(&pc87306_device); + device_add(&intel_flash_bxt_ami_device); + + return ret; +} int machine_at_p55xb2_init(const machine_t *model) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index a3f125a8a..5b8abfb7e 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -201,6 +201,7 @@ const machine_t machines[] = { { "[486 PCI] Zida Tomato 4DP", "4dps", {{"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_HDC, 1, 255, 1, 127, machine_at_4dps_init, NULL }, /* Socket 4 machines */ + //430LX { "[Socket 4 LX] IBM Ambra DP60 PCI", "ambradp60", {{"Intel", cpus_Pentium5V}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 2, 128, 2, 127, machine_at_ambradp60_init, NULL }, #if defined(DEV_BRANCH) && defined(USE_VPP60) { "[Socket 4 LX] IBM PS/ValuePoint P60", "valuepointp60", {{"Intel", cpus_Pentium5V}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 2, 128, 2, 127, machine_at_valuepointp60_init, NULL }, @@ -209,10 +210,12 @@ const machine_t machines[] = { { "[Socket 4 LX] Micro Star 586MC1", "586mc1", {{"Intel", cpus_Pentium5V}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 2, 128, 2, 127, machine_at_586mc1_init, NULL }, /* Socket 5 machines */ + //430NX { "[Socket 5 NX] Intel Premiere/PCI II", "plato", MACHINE_CPUS_PENTIUM_S5, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 2, 128, 2, 127, machine_at_plato_init, NULL }, { "[Socket 5 NX] IBM Ambra DP90 PCI", "ambradp90", MACHINE_CPUS_PENTIUM_S5, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 2, 128, 2, 127, machine_at_ambradp90_init, NULL }, { "[Socket 5 NX] Gigabyte GA-586IP", "430nx", MACHINE_CPUS_PENTIUM_S5, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 2, 128, 2, 127, machine_at_430nx_init, NULL }, - + + //430FX { "[Socket 5 FX] AMI Apollo", "apollo", MACHINE_CPUS_PENTIUM_S5, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_HDC, 8, 128, 8, 127, machine_at_apollo_init, NULL }, #if defined(DEV_BRANCH) && defined(USE_VECTRA54) { "[Socket 5 FX] HP Vectra VL 5 Series 4", "vectra54", MACHINE_CPUS_PENTIUM_S5, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_HDC, 8, 128, 8, 511, machine_at_vectra54_init, NULL }, @@ -223,6 +226,7 @@ const machine_t machines[] = { { "[Socket 5 FX] President Award 430FX PCI","president", MACHINE_CPUS_PENTIUM_S5, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_HDC, 8, 128, 8, 127, machine_at_president_init, NULL }, /* Socket 7 machines */ + //430FX { "[Socket 7-3V FX] ASUS P/I-P54TP4XE", "p54tp4xe", MACHINE_CPUS_PENTIUM_S73V, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_p54tp4xe_init, NULL }, { "[Socket 7-3V FX] Intel Advanced/ATX", "thor", MACHINE_CPUS_PENTIUM_S73V, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_thor_init, NULL }, { "[Socket 7-3V FX] Intel Advanced/EV", "endeavor", MACHINE_CPUS_PENTIUM_S73V, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC | MACHINE_VIDEO, 8, 128, 8, 127, machine_at_endeavor_init, at_endeavor_get_device }, @@ -231,21 +235,25 @@ const machine_t machines[] = { #endif { "[Socket 7-3V FX] Packard Bell PB640", "pb640", MACHINE_CPUS_PENTIUM_S73V, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC | MACHINE_VIDEO, 8, 128, 8, 127, machine_at_pb640_init, at_pb640_get_device }, + //430HX { "[Socket 7-3V HX] Acer M3a", "acerm3a", MACHINE_CPUS_PENTIUM_S73V, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 192, 8, 127, machine_at_acerm3a_init, NULL }, { "[Socket 7-3V HX] AOpen AP53", "ap53", MACHINE_CPUS_PENTIUM_S73V, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 512, 8, 127, machine_at_ap53_init, NULL }, { "[Socket 7-3V HX] SuperMicro Super P55T2S","p55t2s", MACHINE_CPUS_PENTIUM_S73V, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 768, 8, 127, machine_at_p55t2s_init, NULL }, { "[Socket 7 HX] Acer V35n", "acerv35n", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 192, 8, 127, machine_at_acerv35n_init, NULL }, { "[Socket 7 HX] ASUS P/I-P55T2P4", "p55t2p4", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 256, 8, 127, machine_at_p55t2p4_init, NULL }, - { "[Socket 7 HX] TC430HX", "tc430hx", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 255, machine_at_tc430hx_init, NULL }, + { "[Socket 7 HX] Micronics M7S-Hi", "m7shi", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 511, machine_at_m7shi_init, NULL }, + { "[Socket 7 HX] Intel TC430HX", "tc430hx", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 255, machine_at_tc430hx_init, NULL }, { "[Socket 7 HX] Toshiba Equium 5200D", "equium5200", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 192, 8, 127, machine_at_equium5200_init, NULL }, + //430VX { "[Socket 7 VX] ASUS P/I-P55TVP4", "p55tvp4", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_p55tvp4_init, NULL }, - { "[Socket 7 VX] Epox P55-VA", "p55va", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_p55va_init, NULL }, - { "[Socket 7 VX] Jetway J656VXD", "j656vxd", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_j656vxd_init, NULL }, - { "[Socket 7 VX] PC Partner MB520N", "mb520n", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_mb520n_init, NULL }, { "[Socket 7 VX] Shuttle HOT-557", "430vx", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_i430vx_init, NULL }, + { "[Socket 7 VX] Epox P55-VA", "p55va", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_p55va_init, NULL }, + { "[Socket 7 VX] HP Brio 80xx", "brio80xx", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_brio80xx_init, NULL }, + { "[Socket 7 VX] Packard Bell PB680", "pb680", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_pb680_init, NULL }, + //430TX { "[Socket 7 TX] ASUS TX97", "tx97", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 256, 8, 255, machine_at_tx97_init, NULL }, { "[Socket 7 TX] Gigabyte GA-586T2", "586t2", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 256, 8, 255, machine_at_586t2_init, NULL }, { "[Socket 7 TX] Intel YM430TX", "ym430tx", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 256, 8, 255, machine_at_ym430tx_init, NULL }, @@ -253,23 +261,32 @@ const machine_t machines[] = { { "[Socket 7 TX] PC Partner TXA807DS", "807ds", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 256, 8, 255, machine_at_807ds_init, NULL }, { "[Socket 7 TX] SuperMicro P5MMS98", "p5mms98", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 256, 8, 255, machine_at_p5mms98_init, NULL }, + //Apollo VPX { "[Socket 7 VPX] Zida Tomato TX100", "tx100", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 512, 8, 127, machine_at_tx100_init, NULL }, - + + //Apollo VP3 { "[Socket 7 VP3] QDI Advance II", "advanceii", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_advanceii_init, NULL }, /* Super Socket 7 machines */ + //Apollo MVP3 { "[Super 7 MVP3] AOpen AX59 Pro", "ax59pro", MACHINE_CPUS_PENTIUM_SS7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 1024, 8, 255, machine_at_ax59pro_init, NULL }, { "[Super 7 MVP3] FIC VA-503+", "ficva503p", MACHINE_CPUS_PENTIUM_SS7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 512, 8, 255, machine_at_mvp3_init, NULL }, /* Socket 8 machines */ + //440FX { "[Socket 8 FX] Gigabyte GA-686NX", "686nx", {{"Intel", cpus_PentiumPro}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 512, 8, 127, machine_at_686nx_init, NULL }, { "[Socket 8 FX] PC Partner MB600N", "mb600n", {{"Intel", cpus_PentiumPro}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 512, 8, 127, machine_at_mb600n_init, NULL }, { "[Socket 8 FX] Biostar MB-8500ttc", "8500ttc", {{"Intel", cpus_PentiumPro}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 512, 8, 127, machine_at_8500ttc_init, NULL }, { "[Socket 8 FX] Micronics M6MI", "m6mi", {{"Intel", cpus_PentiumPro}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 384, 8, 127, machine_at_m6mi_init, NULL }, /* Slot 1 machines */ + //440FX { "[Slot 1 FX] ECS P6KFX-A", "p6kfx", {{"Intel", cpus_PentiumII_28v},{"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 384, 8, 127, machine_at_p6kfx_init, NULL }, + //440LX + + + //440BX { "[Slot 1 BX] Gigabyte GA-6BXC", "6bxc", {{"Intel", cpus_PentiumII}, {"Intel/PGA370", cpus_Celeron},{"VIA", cpus_Cyrix3},{"", NULL},{"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 768, 8, 255, machine_at_6bxc_init, NULL }, { "[Slot 1 BX] ASUS P2B-LS", "p2bls", {{"Intel", cpus_PentiumII}, {"Intel/PGA370", cpus_Celeron},{"VIA", cpus_Cyrix3},{"", NULL},{"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 1024, 8, 255, machine_at_p2bls_init, NULL }, { "[Slot 1 BX] ASUS P2B-LS (coreboot BIOS)","p2bls_cb", {{"Intel", cpus_PentiumII}, {"Intel/PGA370", cpus_Celeron},{"", NULL}, {"", NULL},{"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC | MACHINE_COREBOOT, 8, 1024, 8, 255, machine_at_p2bls_init, NULL }, @@ -277,17 +294,19 @@ const machine_t machines[] = { { "[Slot 1 BX] ASUS P3B-F (coreboot BIOS)", "p3bf_cb", {{"Intel", cpus_PentiumII}, {"Intel/PGA370", cpus_Celeron},{"", NULL}, {"", NULL},{"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC | MACHINE_COREBOOT, 8, 1024, 8, 255, machine_at_p3bf_init, NULL }, { "[Slot 1 BX] ABit BF6", "bf6", {{"Intel", cpus_PentiumII}, {"Intel/PGA370", cpus_Celeron},{"VIA", cpus_Cyrix3},{"", NULL},{"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 768, 8, 255, machine_at_bf6_init, NULL }, + //440ZX { "[Slot 1 ZX] Packard Bell Bora Pro", "borapro", {{"Intel", cpus_PentiumII}, {"Intel/PGA370", cpus_Celeron},{"VIA", cpus_Cyrix3},{"", NULL},{"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 512, 8, 255, machine_at_borapro_init, NULL }, /* PGA370 machines */ + //440BX { "[Socket 370 BX] ASUS CUBX", "cubx", {{"Intel", cpus_Celeron}, {"VIA", cpus_Cyrix3}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 1024, 8, 255, machine_at_cubx_init, NULL }, { "[Socket 370 BX] A-Trend ATC7020BXII", "atc7020bxii", {{"Intel", cpus_Celeron}, {"VIA", cpus_Cyrix3}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 1024, 8, 255, machine_at_atc7020bxii_init, NULL }, - { "[Socket 370 ZX] Soltek SL-63A1", "63a", {{"Intel", cpus_Celeron}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 512, 8, 255, machine_at_63a_init, NULL }, - { "[Socket 370 APRO] PC Partner APAS3", "apas3", {{"Intel", cpus_Celeron}, {"VIA", cpus_Cyrix3}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 1024, 8, 255, machine_at_apas3_init, NULL }, -#if defined(DEV_BRANCH) && defined(USE_596B) - { "[Socket 370 APRO] Zida Tomato BX98", "bx98", {{"Intel", cpus_Celeron}, {"VIA", cpus_Cyrix3}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 1024, 8, 255, machine_at_bx98_init, NULL }, -#endif + //440ZX + { "[Socket 370 ZX] Soltek SL-63A1", "63a", {{"Intel", cpus_Celeron}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 512, 8, 255, machine_at_63a_init, NULL }, + + //VIA Apollo Pro + { "[Socket 370 APRO] PC Partner APAS3", "apas3", {{"Intel", cpus_Celeron}, {"VIA", cpus_Cyrix3}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 1024, 8, 255, machine_at_apas3_init, NULL }, { NULL, NULL, {{"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0}}, 0, 0, 0, 0, 0, NULL, NULL } }; diff --git a/src/network/net_dp8390.c b/src/network/net_dp8390.c index 376b4dc51..892101976 100644 --- a/src/network/net_dp8390.c +++ b/src/network/net_dp8390.c @@ -204,11 +204,8 @@ dp8390_write_cr(dp8390_t *dev, uint32_t val) /* Check for start-tx */ if ((val & 0x04) && dev->TCR.loop_cntl) { if (dev->TCR.loop_cntl) { - if ((dev->flags & DP8390_FLAG_CHECK_CR) || (dev->flags & DP8390_FLAG_EVEN_MAC)) - dp8390_rx(dev, &dev->mem[(dev->tx_page_start * 256) - dev->mem_start], - dev->tx_bytes); - else - dp8390_rx(dev, dev->mem, dev->tx_bytes); + dp8390_rx(dev, &dev->mem[(dev->tx_page_start * 256) - dev->mem_start], + dev->tx_bytes); } } else if (val & 0x04) { if (dev->CR.stop || (!dev->CR.start && (dev->flags & DP8390_FLAG_CHECK_CR))) { @@ -226,11 +223,8 @@ dp8390_write_cr(dp8390_t *dev, uint32_t val) /* Send the packet to the system driver */ dev->CR.tx_packet = 1; - - if ((dev->flags & DP8390_FLAG_CHECK_CR) || (dev->flags & DP8390_FLAG_EVEN_MAC)) - network_tx(&dev->mem[(dev->tx_page_start * 256) - dev->mem_start], dev->tx_bytes); - else - network_tx(dev->mem, dev->tx_bytes); + + network_tx(&dev->mem[(dev->tx_page_start * 256) - dev->mem_start], dev->tx_bytes); /* some more debug */ #ifdef ENABLE_DP8390_LOG @@ -394,10 +388,7 @@ dp8390_rx(void *priv, uint8_t *buf, int io_len) pkthdr[0], pkthdr[1], pkthdr[2], pkthdr[3]); /* Copy into buffer, update curpage, and signal interrupt if config'd */ - if ((dev->flags & DP8390_FLAG_CHECK_CR) || (dev->flags & DP8390_FLAG_EVEN_MAC)) - startptr = &dev->mem[(dev->curr_page * 256) - dev->mem_start]; - else - startptr = dev->mem + ((dev->curr_page * 256) - dev->mem_start); + startptr = &dev->mem[(dev->curr_page * 256) - dev->mem_start]; memcpy(startptr, pkthdr, sizeof(pkthdr)); if ((nextpage > dev->curr_page) || ((dev->curr_page + pages) == dev->page_stop)) { @@ -405,10 +396,7 @@ dp8390_rx(void *priv, uint8_t *buf, int io_len) } else { endbytes = (dev->page_stop - dev->curr_page) * 256; memcpy(startptr+sizeof(pkthdr), buf, endbytes-sizeof(pkthdr)); - if ((dev->flags & DP8390_FLAG_CHECK_CR) || (dev->flags & DP8390_FLAG_EVEN_MAC)) - startptr = &dev->mem[(dev->page_start * 256) - dev->mem_start]; - else - startptr = dev->mem + ((dev->page_start * 256) - dev->mem_start); + startptr = &dev->mem[(dev->page_start * 256) - dev->mem_start]; memcpy(startptr, buf+endbytes-sizeof(pkthdr), io_len-endbytes+8); } dev->curr_page = nextpage; diff --git a/src/network/net_wd8003.c b/src/network/net_wd8003.c index 953212a0b..7eeb4d136 100644 --- a/src/network/net_wd8003.c +++ b/src/network/net_wd8003.c @@ -175,68 +175,22 @@ wd_soft_reset(void *priv) } -static uint32_t -wd_ram_read(uint32_t addr, unsigned len, void *priv) -{ - wd_t *dev = (wd_t *)priv; - uint32_t ret; - uint16_t ram_mask = dev->ram_size - 1; - - ret = dev->dp8390->mem[addr & ram_mask]; - - if (len == 2) - ret |= dev->dp8390->mem[(addr + 1) & ram_mask] << 8; - - return ret; -} - - static uint8_t -wd_ram_readb(uint32_t addr, void *priv) +wd_ram_read(uint32_t addr, void *priv) { wd_t *dev = (wd_t *)priv; - - return wd_ram_read(addr, 1, dev); + + wdlog("WD80x3: RAM Read: addr=%06x, val=%02x\n", addr & (dev->ram_size - 1), dev->dp8390->mem[addr & (dev->ram_size - 1)]); + return dev->dp8390->mem[addr & (dev->ram_size - 1)]; } - -static uint16_t -wd_ram_readw(uint32_t addr, void *priv) -{ - wd_t *dev = (wd_t *)priv; - - return wd_ram_read(addr, 2, dev); -} - - static void -wd_ram_write(uint32_t addr, uint32_t val, unsigned len, void *priv) +wd_ram_write(uint32_t addr, uint8_t val, void *priv) { wd_t *dev = (wd_t *)priv; - uint16_t ram_mask = dev->ram_size - 1; - - dev->dp8390->mem[addr & ram_mask] = val & 0xff; - - if (len == 2) - dev->dp8390->mem[(addr + 1) & ram_mask] = val >> 8; -} - - -static void -wd_ram_writeb(uint32_t addr, uint8_t val, void *priv) -{ - wd_t *dev = (wd_t *)priv; - - wd_ram_write(addr, val, 1, dev); -} - - -static void -wd_ram_writew(uint32_t addr, uint16_t val, void *priv) -{ - wd_t *dev = (wd_t *)priv; - - wd_ram_write(addr, val, 2, dev); + + dev->dp8390->mem[addr & (dev->ram_size - 1)] = val; + wdlog("WD80x3: RAM Write: addr=%06x, val=%02x\n", addr & (dev->ram_size - 1), val); } @@ -605,7 +559,7 @@ wd_mca_write(int port, uint8_t val, void *priv) * So, remove current address, if any. */ if (dev->base_address) - wd_io_remove(dev, dev->base_address); + wd_io_remove(dev, dev->base_address); dev->base_address = (dev->pos_regs[2] & 0xfe) << 4; dev->ram_addr = (dev->pos_regs[3] & 0xfc) << 12; @@ -685,7 +639,7 @@ wd_init(const device_t *info) dev->dp8390 = device_add(&dp8390_device); dev->dp8390->priv = dev; dev->dp8390->interrupt = wd_interrupt; - dp8390_set_defaults(dev->dp8390, DP8390_FLAG_CLEAR_IRQ); + dp8390_set_defaults(dev->dp8390, DP8390_FLAG_CHECK_CR | DP8390_FLAG_CLEAR_IRQ); switch(dev->board) { /* Ethernet, ISA, no interface chip, RAM 8k */ @@ -748,25 +702,18 @@ wd_init(const device_t *info) memcpy(dev->dp8390->physaddr, dev->maclocal, sizeof(dev->maclocal)); wdlog("%s: I/O=%04x, IRQ=%d, MAC=%02x:%02x:%02x:%02x:%02x:%02x\n", - dev->name, dev->base_address, dev->irq, - dev->dp8390->physaddr[0], dev->dp8390->physaddr[1], dev->dp8390->physaddr[2], - dev->dp8390->physaddr[3], dev->dp8390->physaddr[4], dev->dp8390->physaddr[5]); + dev->name, dev->base_address, dev->irq, + dev->dp8390->physaddr[0], dev->dp8390->physaddr[1], dev->dp8390->physaddr[2], + dev->dp8390->physaddr[3], dev->dp8390->physaddr[4], dev->dp8390->physaddr[5]); /* Reset the board. */ wd_reset(dev); /* Map this system into the memory map. */ - if (dev->bit16 & 1) { - mem_mapping_add(&dev->ram_mapping, dev->ram_addr, dev->ram_size, - wd_ram_readb, wd_ram_readw, NULL, - wd_ram_writeb, wd_ram_writew, NULL, - NULL, MEM_MAPPING_EXTERNAL, dev); - } else { - mem_mapping_add(&dev->ram_mapping, dev->ram_addr, dev->ram_size, - wd_ram_readb, NULL, NULL, - wd_ram_writeb, NULL, NULL, - NULL, MEM_MAPPING_EXTERNAL, dev); - } + mem_mapping_add(&dev->ram_mapping, dev->ram_addr, dev->ram_size, + wd_ram_read, NULL, NULL, + wd_ram_write, NULL, NULL, + NULL, MEM_MAPPING_EXTERNAL, dev); mem_mapping_disable(&dev->ram_mapping); diff --git a/src/pci.c b/src/pci.c index f0b411d71..1e142a554 100644 --- a/src/pci.c +++ b/src/pci.c @@ -710,7 +710,6 @@ void trc_write(uint16_t port, uint8_t val, void *priv) { pci_log("TRC Write: %02X\n", val); - pci_log("TRC Write: %02X\n", val); if (!(trc_reg & 4) && (val & 4)) trc_reset(val); diff --git a/src/sio_fdc37c93x.c b/src/sio_fdc37c93x.c index e5ed9e164..7e08ab373 100644 --- a/src/sio_fdc37c93x.c +++ b/src/sio_fdc37c93x.c @@ -393,6 +393,8 @@ fdc37c93x_write(uint16_t port, uint8_t val, void *priv) fdc37c93x_serial_handler(dev, 0); if (valxor & 0x20) fdc37c93x_serial_handler(dev, 1); + if ((valxor & 0x40) && (dev->chip_id != 0x02)) + fdc37c932fr_access_bus_handler(dev); break; } @@ -406,6 +408,8 @@ fdc37c93x_write(uint16_t port, uint8_t val, void *priv) case 0x30: case 0x60: case 0x61: + if ((dev->cur_reg == 0x30) && (val & 0x01)) + dev->regs[0x22] |= 0x01; if (valxor) fdc37c93x_fdc_handler(dev); break; @@ -454,6 +458,8 @@ fdc37c93x_write(uint16_t port, uint8_t val, void *priv) case 0x60: case 0x61: case 0x70: + if ((dev->cur_reg == 0x30) && (val & 0x01)) + dev->regs[0x22] |= 0x08; if (valxor) fdc37c93x_lpt_handler(dev); break; @@ -466,6 +472,8 @@ fdc37c93x_write(uint16_t port, uint8_t val, void *priv) case 0x60: case 0x61: case 0x70: + if ((dev->cur_reg == 0x30) && (val & 0x01)) + dev->regs[0x22] |= 0x10; if (valxor) fdc37c93x_serial_handler(dev, 0); break; @@ -478,6 +486,8 @@ fdc37c93x_write(uint16_t port, uint8_t val, void *priv) case 0x60: case 0x61: case 0x70: + if ((dev->cur_reg == 0x30) && (val & 0x01)) + dev->regs[0x22] |= 0x20; if (valxor) fdc37c93x_serial_handler(dev, 1); break; @@ -556,6 +566,8 @@ fdc37c93x_write(uint16_t port, uint8_t val, void *priv) case 0x60: case 0x61: case 0x70: + if ((dev->cur_reg == 0x30) && (val & 0x01)) + dev->regs[0x22] |= 0x40; if (valxor) fdc37c932fr_access_bus_handler(dev); break; @@ -757,6 +769,8 @@ fdc37c93x_init(const device_t *info) if (dev->chip_id == 0x03) dev->access_bus = device_add(&access_bus_device); + io_sethandler(0x370, 0x0002, + fdc37c93x_read, NULL, NULL, fdc37c93x_write, NULL, NULL, dev); io_sethandler(0x3f0, 0x0002, fdc37c93x_read, NULL, NULL, fdc37c93x_write, NULL, NULL, dev); diff --git a/src/usb.c b/src/usb.c index 721289afb..9b04c0383 100644 --- a/src/usb.c +++ b/src/usb.c @@ -1,53 +1,185 @@ -/* Copyright holders: Melissa Goad - see COPYING for more details -*/ +/* + * 86Box A hypervisor and IBM PC system emulator that specializes in + * running old operating systems and software designed for IBM + * PC systems and compatibles from 1981 through fairly recent + * system designs based on the PCI bus. + * + * This file is part of the 86Box distribution. + * + * Universal Serial Bus emulation (currently dummy UHCI and + * OHCI). + * + * + * + * Authors: Miran Grca, + * + * Copyright 2020 Miran Grca. + */ +#include #include #include +#include #include #include +#define HAVE_STDARG_H +#include <86box/86box.h> +#include <86box/device.h> #include <86box/io.h> #include <86box/mem.h> #include <86box/usb.h> -void *usb_priv[32]; -static int usb_min_card, usb_max_card; +#ifdef ENABLE_USB_LOG +int usb_do_log = ENABLE_USB_LOG; -void (*usb_packet_handle[32])(usb_packet_t* packet, void *priv); - - -void usb_init(int min_card, int max_card) +static void +usb_log(const char *fmt, ...) { - int c; - - for (c = 0; c < 32; c++) - usb_packet_handle[c] = usb_priv[c] = NULL; - - usb_min_card = min_card; - usb_max_card = max_card; + va_list ap; + + if (usb_do_log) { + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); + } +} +#else +#define usb_log(fmt, ...) +#endif + + +static uint8_t +uhci_reg_read(uint16_t addr, void *p) +{ + uint8_t ret = 0xff; + + switch (addr & 0x1f) { + case 0x10: case 0x11: case 0x12: case 0x13: + /* Port status */ + ret = 0x00; + break; + } + + return ret; } -void usb_add_specific(int card, void (*packet_handle)(usb_packet_t *packet, void *priv), void *priv) +static void +uhci_reg_write(uint16_t addr, uint8_t val, void *p) { - usb_packet_handle[card] = packet_handle; - usb_priv[card] = priv; } -void usb_add(void (*packet_handle)(usb_packet_t *packet, void *priv), void *priv) +void +uhci_update_io_mapping(usb_t *dev, uint8_t base_l, uint8_t base_h, int enable) { - int c; - - for (c = usb_min_card; c <= usb_max_card; c++) - { - if (!usb_packet_handle[c]) - { - usb_packet_handle[c] = packet_handle; - usb_priv[c] = priv; - // pclog("USB device added to card: %i\n", c); - return; - } - } + if (dev->uhci_enable && (dev->uhci_io_base != 0x0000)) + io_removehandler(dev->uhci_io_base, 0x20, uhci_reg_read, NULL, NULL, uhci_reg_write, NULL, NULL, dev); + + dev->uhci_io_base = base_l | (base_h << 8); + dev->uhci_enable = enable; + + if (dev->uhci_enable && (dev->uhci_io_base != 0x0000)) + io_sethandler(dev->uhci_io_base, 0x20, uhci_reg_read, NULL, NULL, uhci_reg_write, NULL, NULL, dev); } + + +static uint8_t +ohci_mmio_read(uint32_t addr, void *p) +{ + usb_t *dev = (usb_t *) p; + uint8_t ret = 0x00; + + addr &= 0x00000fff; + + ret = dev->ohci_mmio[addr]; + + return ret; +} + + +static void +ohci_mmio_write(uint32_t addr, uint8_t val, void *p) +{ + usb_t *dev = (usb_t *) p; + + addr &= 0x00000fff; + + switch (addr) { + case 0x08: /* HCCOMMANDSTATUS */ + /* bit HostControllerReset must be cleared for the controller to be seen as initialized */ + val &= ~0x01; + + /* bit OwnershipChangeRequest triggers an ownership change (SMM <-> OS) */ + if (val & 0x0f) { + dev->ohci_mmio[0x0f] = 0x40; + dev->ohci_mmio[0x05] &= ~(dev->ohci_mmio[0x05] & 0x01); + } + break; + } + + dev->ohci_mmio[addr] = val; +} + + +void +ohci_update_mem_mapping(usb_t *dev, uint8_t base1, uint8_t base2, uint8_t base3, int enable) +{ + if (dev->ohci_enable && (dev->ohci_mem_base != 0x00000000)) + mem_mapping_disable(&dev->ohci_mmio_mapping); + + dev->ohci_mem_base = ((base1 << 8) | (base2 << 16) | (base3 << 24)) & 0xfffff000; + dev->ohci_enable = enable; + + if (dev->ohci_enable && (dev->ohci_mem_base != 0x00000000)) + mem_mapping_set_addr(&dev->ohci_mmio_mapping, dev->ohci_mem_base, 0x1000); +} + + +static void +usb_close(void *priv) +{ + usb_t *dev = (usb_t *) priv; + + free(dev); +} + + +static void * +usb_init(const device_t *info) +{ + usb_t *dev; + + dev = (usb_t *)malloc(sizeof(usb_t)); + if (dev == NULL) return(NULL); + memset(dev, 0x00, sizeof(usb_t)); + + memset(dev->ohci_mmio, 0x00, 4096); + dev->ohci_mmio[0x00] = 0x10; + dev->ohci_mmio[0x01] = 0x01; + dev->ohci_mmio[0x48] = 0x02; + + mem_mapping_add(&dev->ohci_mmio_mapping, 0, 0, + ohci_mmio_read, NULL, NULL, + ohci_mmio_write, NULL, NULL, + NULL, MEM_MAPPING_EXTERNAL, dev); + mem_mapping_disable(&dev->ohci_mmio_mapping); + + return dev; +} + + +const device_t usb_device = +{ + "Universal Serial Bus", + DEVICE_PCI, + 0, + usb_init, + usb_close, + NULL, + NULL, + NULL, + NULL, + NULL +}; diff --git a/src/win/86Box.rc b/src/win/86Box.rc index 432a0b8c1..c71fb8b43 100644 --- a/src/win/86Box.rc +++ b/src/win/86Box.rc @@ -112,6 +112,7 @@ BEGIN MENUITEM "CGA/PCjr/Tandy/E&GA/(S)VGA overscan", IDM_VID_OVERSCAN MENUITEM "Change contrast for &monochrome display", IDM_VID_CGACON END + MENUITEM "&Media", IDM_MEDIA POPUP "&Tools" BEGIN MENUITEM "&Settings...", IDM_CONFIG @@ -915,6 +916,7 @@ BEGIN IDS_2123 "Unable to initialize Ghostscript, gsdll32.dll is required for automatic convertion of PostScript files to PDF.\n\nAny documents sent to the generic PostScript printer will be saved as PostScript files (.ps)." IDS_2124 "MO %i (%03i): %ls" IDS_2125 "MO images (*.IM?)\0*.IM?\0All files (*.*)\0*.*\0" + IDS_2126 "Welcome to 86Box!" END STRINGTABLE DISCARDABLE diff --git a/src/win/Makefile.mingw b/src/win/Makefile.mingw index f48318b7d..f8044ddd5 100644 --- a/src/win/Makefile.mingw +++ b/src/win/Makefile.mingw @@ -512,9 +512,9 @@ CXXFLAGS := $(CFLAGS) ######################################################################### # Create the (final) list of objects to build. # ######################################################################### -MAINOBJ := pc.o config.o random.o timer.o io.o acpi.o apm.o dma.o nmi.o \ - pic.o pit.o port_92.o ppi.o pci.o mca.o mcr.o mem.o \ - rom.o device.o nvr.o nvr_at.o nvr_ps2.o sst_flash.o via_vt82c586b.o \ +MAINOBJ := pc.o config.o random.o timer.o io.o acpi.o apm.o dma.o ddma.o \ + nmi.o pic.o pit.o port_92.o ppi.o pci.o mca.o mcr.o mem.o rom.o \ + usb.o device.o nvr.o nvr_at.o nvr_ps2.o sst_flash.o via_vt82c586b.o \ via_vt82c596b.o $(VNCOBJ) INTELOBJ := intel_flash.o \ diff --git a/src/win/Makefile_ndr.mingw b/src/win/Makefile_ndr.mingw index a5242812d..1a15963e6 100644 --- a/src/win/Makefile_ndr.mingw +++ b/src/win/Makefile_ndr.mingw @@ -516,9 +516,9 @@ CXXFLAGS := $(CFLAGS) ######################################################################### # Create the (final) list of objects to build. # ######################################################################### -MAINOBJ := pc.o config.o random.o timer.o io.o acpi.o apm.o dma.o nmi.o \ - pic.o pit.o port_92.o ppi.o pci.o mca.o mcr.o mem.o \ - rom.o device.o nvr.o nvr_at.o nvr_ps2.o sst_flash.o via_vt82c586b.o \ +MAINOBJ := pc.o config.o random.o timer.o io.o acpi.o apm.o dma.o ddma.o \ + nmi.o pic.o pit.o port_92.o ppi.o pci.o mca.o mcr.o mem.o rom.o \ + usb.o device.o nvr.o nvr_at.o nvr_ps2.o sst_flash.o via_vt82c586b.o \ via_vt82c596b.o $(VNCOBJ) INTELOBJ := intel_flash.o \ diff --git a/src/win/win_jsconf.c b/src/win/win_jsconf.c index f4269871b..a557f753d 100644 --- a/src/win/win_jsconf.c +++ b/src/win/win_jsconf.c @@ -59,7 +59,7 @@ static void rebuild_axis_button_selections(HWND hdlg) sprintf(s, "%s (Y axis)", plat_joystick_state[joystick-1].pov[d].name); SendMessage(h, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)s); } - for (d = 0; d < plat_joystick_state[joystick - 1].nr_sliders; d++) + for (d = 0; d < plat_joystick_state[joystick - 1].nr_sliders; d++) { SendMessage(h, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)plat_joystick_state[joystick - 1].slider[d].name); } @@ -126,8 +126,7 @@ static int get_axis(HWND hdlg, int id) HWND h = GetDlgItem(hdlg, id); int axis_sel = SendMessage(h, CB_GETCURSEL, 0, 0); int nr_axes = plat_joystick_state[joystick_state[joystick_nr].plat_joystick_nr-1].nr_axes; - int nr_povs = plat_joystick_state[joystick_state[joystick_nr].plat_joystick_nr - 1].nr_povs; - int nr_sliders = plat_joystick_state[joystick_state[joystick_nr].plat_joystick_nr - 1].nr_sliders; + int nr_povs = plat_joystick_state[joystick_state[joystick_nr].plat_joystick_nr - 1].nr_povs; if (axis_sel < nr_axes) return axis_sel; @@ -175,7 +174,6 @@ joystickconfig_dlgproc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) int joystick; int nr_axes; int nr_povs; - int nr_sliders; int mapping; switch (message) @@ -199,7 +197,6 @@ joystickconfig_dlgproc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) { nr_axes = plat_joystick_state[joystick-1].nr_axes; nr_povs = plat_joystick_state[joystick-1].nr_povs; - nr_sliders = plat_joystick_state[joystick - 1].nr_sliders; for (c = 0; c < joystick_get_axis_count(joystick_config_type); c++) { @@ -211,8 +208,8 @@ joystickconfig_dlgproc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) else if (mapping & POV_Y) SendMessage(h, CB_SETCURSEL, nr_axes + (mapping & 3)*2 + 1, 0); else if (mapping & SLIDER) - SendMessage(h, CB_SETCURSEL, nr_axes + nr_povs * 2 + (mapping & 3), 0); - else + SendMessage(h, CB_SETCURSEL, nr_axes + nr_povs * 2 + (mapping & 3), 0); + else SendMessage(h, CB_SETCURSEL, mapping, 0); id += 2; } diff --git a/src/win/win_stbar.c b/src/win/win_stbar.c index ecb9c8a62..bdbd13f87 100644 --- a/src/win/win_stbar.c +++ b/src/win/win_stbar.c @@ -72,6 +72,9 @@ static int sb_parts = 0; static int sb_ready = 0; static uint8_t sb_map[256]; +static HMENU hmenuMedia; +static HMENU *media_menu_handles; + /* Also used by win_settings.c */ intptr_t @@ -483,10 +486,33 @@ ui_sb_update_tip(int meaning) } SendMessage(hwndSBAR, SB_SETTIPTEXT, part, (LPARAM)sbTips[part]); + ModifyMenu(hmenuMedia, part, MF_BYPOSITION, (UINT_PTR)media_menu_handles[part], sbTips[part]); } } +static void +MediaMenuDestroyMenus(void) +{ + int i; + + if (sb_parts == 0) return; + + if (! media_menu_handles) return; + + for (i=0; iexit) + cdrom[id].ops->exit(&(cdrom[id])); + cdrom[id].ops = NULL; + memset(cdrom[id].image_path, 0, sizeof(cdrom[id].image_path)); + cdrom_image_open(&(cdrom[id]), temp_path); + /* Signal media change to the emulated machine. */ + if (cdrom[id].insert) + cdrom[id].insert(cdrom[id].priv); + cdrom[id].host_drive = (wcslen(cdrom[id].image_path) == 0) ? 0 : 200; + if (cdrom[id].host_drive == 200) { + ui_sb_check_menu_item(SB_CDROM | id, IDM_CDROM_EMPTY | id, MF_UNCHECKED); + ui_sb_check_menu_item(SB_CDROM | id, IDM_CDROM_IMAGE | id, MF_CHECKED); + ui_sb_update_icon_state(SB_CDROM | id, 0); + } else { + ui_sb_check_menu_item(SB_CDROM | id, IDM_CDROM_IMAGE | id, MF_UNCHECKED); + ui_sb_check_menu_item(SB_CDROM | id, IDM_CDROM_EMPTY | id, MF_CHECKED); + ui_sb_update_icon_state(SB_CDROM | id, 1); + } + ui_sb_enable_menu_item(SB_CDROM | id, IDM_CDROM_RELOAD | id, MF_BYCOMMAND | MF_GRAYED); + ui_sb_update_tip(SB_CDROM | id); + config_save(); + } + break; + + case IDM_ZIP_IMAGE_NEW: + id = item_params & 0x0003; + part = sb_map[SB_ZIP | id]; + NewFloppyDialogCreate(hwnd, id | 0x80, part); /* NewZIPDialogCreate */ + break; + + case IDM_ZIP_IMAGE_EXISTING: + case IDM_ZIP_IMAGE_EXISTING_WP: + id = item_params & 0x0003; + part = sb_map[SB_ZIP | id]; + if ((part == 0xff) || (sb_menu_handles == NULL)) + break; + + ret = file_dlg_w_st(hwnd, IDS_2058, zip_drives[id].image_path, 0); + if (! ret) + ui_sb_mount_zip_img(id, part, (item_id == IDM_ZIP_IMAGE_EXISTING_WP) ? 1 : 0, wopenfilestring); + break; + + case IDM_ZIP_EJECT: + id = item_params & 0x0003; + zip_eject(id); + break; + + case IDM_ZIP_RELOAD: + id = item_params & 0x0003; + zip_reload(id); + break; + + case IDM_MO_IMAGE_NEW: + id = item_params & 0x0003; + part = sb_map[SB_MO | id]; + NewFloppyDialogCreate(hwnd, id | 0x80, part); /* NewZIPDialogCreate */ + break; + + case IDM_MO_IMAGE_EXISTING: + case IDM_MO_IMAGE_EXISTING_WP: + id = item_params & 0x0003; + part = sb_map[SB_MO | id]; + if ((part == 0xff) || (sb_menu_handles == NULL)) + break; + + ret = file_dlg_w_st(hwnd, IDS_2125, mo_drives[id].image_path, 0); + if (! ret) + ui_sb_mount_mo_img(id, part, (item_id == IDM_MO_IMAGE_EXISTING_WP) ? 1 : 0, wopenfilestring); + break; + + case IDM_MO_EJECT: + id = item_params & 0x0003; + mo_eject(id); + break; + + case IDM_MO_RELOAD: + id = item_params & 0x0003; + mo_reload(id); + break; + + default: + return(0); + } + + return(1); +} + /* Handle messages for the Status Bar window. */ #if defined(__amd64__) || defined(__aarch64__) @@ -921,195 +1177,13 @@ static BOOL CALLBACK #endif StatusBarProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { - WCHAR temp_path[1024]; RECT rc; POINT pt; - int ret = 0; int item_id = 0; - int item_params = 0; - int id = 0; - uint8_t part = 0; switch (message) { case WM_COMMAND: - item_id = LOWORD(wParam) & 0xff00; /* low 8 bits */ - item_params = LOWORD(wParam) & 0x00ff; /* high 8 bits */ - - switch (item_id) { - case IDM_FLOPPY_IMAGE_NEW: - id = item_params & 0x0003; - part = sb_map[SB_FLOPPY | id]; - if ((part == 0xff) || (sb_menu_handles == NULL)) - break; - - NewFloppyDialogCreate(hwnd, id, part); - break; - - case IDM_FLOPPY_IMAGE_EXISTING: - case IDM_FLOPPY_IMAGE_EXISTING_WP: - id = item_params & 0x0003; - part = sb_map[SB_FLOPPY | id]; - if ((part == 0xff) || (sb_menu_handles == NULL)) - break; - - ret = file_dlg_w_st(hwnd, IDS_2118, floppyfns[id], 0); - if (! ret) - ui_sb_mount_floppy_img(id, part, (item_id == IDM_FLOPPY_IMAGE_EXISTING_WP) ? 1 : 0, wopenfilestring); - break; - - case IDM_FLOPPY_EJECT: - id = item_params & 0x0003; - part = sb_map[SB_FLOPPY | id]; - if ((part == 0xff) || (sb_menu_handles == NULL)) - break; - - fdd_close(id); - ui_sb_update_icon_state(SB_FLOPPY | id, 1); - EnableMenuItem(sb_menu_handles[part], IDM_FLOPPY_EJECT | id, MF_BYCOMMAND | MF_GRAYED); - EnableMenuItem(sb_menu_handles[part], IDM_FLOPPY_EXPORT_TO_86F | id, MF_BYCOMMAND | MF_GRAYED); - ui_sb_update_tip(SB_FLOPPY | id); - config_save(); - break; - - case IDM_FLOPPY_EXPORT_TO_86F: - id = item_params & 0x0003; - part = sb_map[SB_FLOPPY | id]; - if ((part == 0xff) || (sb_menu_handles == NULL)) - break; - - ret = file_dlg_w_st(hwnd, IDS_2076, floppyfns[id], 1); - if (! ret) { - plat_pause(1); - ret = d86f_export(id, wopenfilestring); - if (!ret) - ui_msgbox(MBX_ERROR, (wchar_t *)IDS_4108); - plat_pause(0); - } - break; - - case IDM_CDROM_MUTE: - id = item_params & 0x0007; - part = sb_map[SB_CDROM | id]; - if ((part == 0xff) || (sb_menu_handles == NULL)) - break; - - cdrom[id].sound_on ^= 1; - CheckMenuItem(sb_menu_handles[part], IDM_CDROM_MUTE | id, cdrom[id].sound_on ? MF_UNCHECKED : MF_CHECKED); - config_save(); - sound_cd_thread_reset(); - break; - - case IDM_CDROM_EMPTY: - id = item_params & 0x0007; - part = sb_map[SB_CDROM | id]; - if ((part == 0xff) || (sb_menu_handles == NULL)) - break; - - cdrom_eject(id); - break; - - case IDM_CDROM_RELOAD: - id = item_params & 0x0007; - part = sb_map[SB_CDROM | id]; - if ((part == 0xff) || (sb_menu_handles == NULL)) - break; - - cdrom_reload(id); - break; - - case IDM_CDROM_IMAGE: - id = item_params & 0x0007; - part = sb_map[SB_CDROM | id]; - if ((part == 0xff) || (sb_menu_handles == NULL)) - break; - - if (!file_dlg_w_st(hwnd, IDS_2075, cdrom[id].image_path, 0)) { - cdrom[id].prev_host_drive = cdrom[id].host_drive; - wcscpy(temp_path, wopenfilestring); - wcscpy(cdrom[id].prev_image_path, cdrom[id].image_path); - if (cdrom[id].ops && cdrom[id].ops->exit) - cdrom[id].ops->exit(&(cdrom[id])); - cdrom[id].ops = NULL; - memset(cdrom[id].image_path, 0, sizeof(cdrom[id].image_path)); - cdrom_image_open(&(cdrom[id]), temp_path); - /* Signal media change to the emulated machine. */ - if (cdrom[id].insert) - cdrom[id].insert(cdrom[id].priv); - cdrom[id].host_drive = (wcslen(cdrom[id].image_path) == 0) ? 0 : 200; - if (cdrom[id].host_drive == 200) { - CheckMenuItem(sb_menu_handles[part], IDM_CDROM_EMPTY | id, MF_UNCHECKED); - CheckMenuItem(sb_menu_handles[part], IDM_CDROM_IMAGE | id, MF_CHECKED); - ui_sb_update_icon_state(SB_CDROM | id, 0); - } else { - CheckMenuItem(sb_menu_handles[part], IDM_CDROM_IMAGE | id, MF_UNCHECKED); - CheckMenuItem(sb_menu_handles[part], IDM_CDROM_EMPTY | id, MF_CHECKED); - ui_sb_update_icon_state(SB_CDROM | id, 1); - } - EnableMenuItem(sb_menu_handles[part], IDM_CDROM_RELOAD | id, MF_BYCOMMAND | MF_GRAYED); - ui_sb_update_tip(SB_CDROM | id); - config_save(); - } - break; - - case IDM_ZIP_IMAGE_NEW: - id = item_params & 0x0003; - part = sb_map[SB_ZIP | id]; - NewFloppyDialogCreate(hwnd, id | 0x80, part); /* NewZIPDialogCreate */ - break; - - case IDM_ZIP_IMAGE_EXISTING: - case IDM_ZIP_IMAGE_EXISTING_WP: - id = item_params & 0x0003; - part = sb_map[SB_ZIP | id]; - if ((part == 0xff) || (sb_menu_handles == NULL)) - break; - - ret = file_dlg_w_st(hwnd, IDS_2058, zip_drives[id].image_path, 0); - if (! ret) - ui_sb_mount_zip_img(id, part, (item_id == IDM_ZIP_IMAGE_EXISTING_WP) ? 1 : 0, wopenfilestring); - break; - - case IDM_ZIP_EJECT: - id = item_params & 0x0003; - zip_eject(id); - break; - - case IDM_ZIP_RELOAD: - id = item_params & 0x0003; - zip_reload(id); - break; - - case IDM_MO_IMAGE_NEW: - id = item_params & 0x0003; - part = sb_map[SB_MO | id]; - NewFloppyDialogCreate(hwnd, id | 0x80, part); /* NewZIPDialogCreate */ - break; - - case IDM_MO_IMAGE_EXISTING: - case IDM_MO_IMAGE_EXISTING_WP: - id = item_params & 0x0003; - part = sb_map[SB_MO | id]; - if ((part == 0xff) || (sb_menu_handles == NULL)) - break; - - ret = file_dlg_w_st(hwnd, IDS_2125, mo_drives[id].image_path, 0); - if (! ret) - ui_sb_mount_mo_img(id, part, (item_id == IDM_MO_IMAGE_EXISTING_WP) ? 1 : 0, wopenfilestring); - break; - - case IDM_MO_EJECT: - id = item_params & 0x0003; - mo_eject(id); - break; - - case IDM_MO_RELOAD: - id = item_params & 0x0003; - mo_reload(id); - break; - - default: - break; - } + MediaMenuHandler(hwnd, message, wParam, lParam); return(0); case WM_LBUTTONDOWN: @@ -1141,6 +1215,27 @@ StatusBarProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) } +void +MediaMenuCreate(HWND hwndParent, uintptr_t idStatus, HINSTANCE hInst) +{ + HMENU hmenu; + LPWSTR lpMenuName; + + hmenu = GetMenu(hwndParent); + hmenuMedia = CreatePopupMenu(); + + int len = GetMenuString(hmenu, IDM_MEDIA, NULL, 0, MF_BYCOMMAND); + lpMenuName = malloc((len + 1) * sizeof(WCHAR)); + GetMenuString(hmenu, IDM_MEDIA, lpMenuName, len + 1, MF_BYCOMMAND); + + InsertMenu(hmenu, IDM_MEDIA, MF_BYCOMMAND | MF_STRING | MF_POPUP, (UINT_PTR)hmenuMedia, lpMenuName); + RemoveMenu(hmenu, IDM_MEDIA, MF_BYCOMMAND); + DrawMenuBar(hwndParent); + + free(lpMenuName); +} + + /* API: Create and set up the Status Bar window. */ void StatusBarCreate(HWND hwndParent, uintptr_t idStatus, HINSTANCE hInst) @@ -1219,6 +1314,8 @@ StatusBarCreate(HWND hwndParent, uintptr_t idStatus, HINSTANCE hInst) memset(sb_menu_handles, 0, sb_parts * sizeof(HMENU)); sbTips = (WCHAR **)malloc(sb_parts * sizeof(WCHAR *)); memset(sbTips, 0, sb_parts * sizeof(WCHAR *)); + media_menu_handles = (HMENU *)malloc(sb_parts * sizeof(HMENU)); + memset(media_menu_handles, 0, sb_parts * sizeof(HMENU)); sb_parts = 0; iStatusWidths[sb_parts] = -1; sb_part_meanings[sb_parts] = SB_TEXT; @@ -1226,7 +1323,10 @@ StatusBarCreate(HWND hwndParent, uintptr_t idStatus, HINSTANCE hInst) sb_parts++; SendMessage(hwndSBAR, SB_SETPARTS, (WPARAM)sb_parts, (LPARAM)iStatusWidths); SendMessage(hwndSBAR, SB_SETTEXT, 0 | SBT_NOBORDERS, - (LPARAM)L"Welcome to 86Box !"); + (LPARAM)plat_get_string(IDS_2126)); + + MediaMenuCreate(hwndParent, idStatus, hInst); + sb_ready = 1; } @@ -1245,6 +1345,7 @@ ui_sb_check_menu_item(int tag, int id, int chk) return; CheckMenuItem(sb_menu_handles[part], id, chk); + CheckMenuItem(media_menu_handles[part], id, chk); } @@ -1262,6 +1363,7 @@ ui_sb_enable_menu_item(int tag, int id, int flg) return; EnableMenuItem(sb_menu_handles[part], id, flg); + EnableMenuItem(media_menu_handles[part], id, flg); } diff --git a/src/win/win_ui.c b/src/win/win_ui.c index 2a9099c3f..cc4240949 100644 --- a/src/win/win_ui.c +++ b/src/win/win_ui.c @@ -594,6 +594,9 @@ MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) svga_dump_vram(); break; #endif + default: + MediaMenuHandler(hwnd, message, wParam, lParam); + break; } return(0);