From 7dcb8f6f1f696db1ac48f57ad3b09e956c51ab87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Thu, 23 Apr 2020 01:24:01 +0200 Subject: [PATCH 01/13] win: Add the "Media" menu to the menubar This is an alternative way to mount images to the virtual drives, as many people found the current behavior confusing. --- src/include/86box/language.h | 3 +- src/include/86box/win.h | 1 + src/win/86Box.rc | 1 + src/win/win_stbar.c | 463 +++++++++++++++++++++-------------- src/win/win_ui.c | 3 + 5 files changed, 281 insertions(+), 190 deletions(-) diff --git a/src/include/86box/language.h b/src/include/86box/language.h index f112ec19f..7aa2e17ee 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 // "Media" #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/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/win/86Box.rc b/src/win/86Box.rc index 432a0b8c1..214dd945a 100644 --- a/src/win/86Box.rc +++ b/src/win/86Box.rc @@ -915,6 +915,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 "&Media" END STRINGTABLE DISCARDABLE diff --git a/src/win/win_stbar.c b/src/win/win_stbar.c index ecb9c8a62..0dfd7af1d 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: @@ -1148,6 +1222,7 @@ StatusBarCreate(HWND hwndParent, uintptr_t idStatus, HINSTANCE hInst) RECT rectDialog; int dw, dh; uint8_t i; + HMENU hmenu; /* Load our icons into the cache for faster access. */ for (i = 16; i < 18; i++) @@ -1219,6 +1294,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; @@ -1227,6 +1304,12 @@ StatusBarCreate(HWND hwndParent, uintptr_t idStatus, HINSTANCE hInst) SendMessage(hwndSBAR, SB_SETPARTS, (WPARAM)sb_parts, (LPARAM)iStatusWidths); SendMessage(hwndSBAR, SB_SETTEXT, 0 | SBT_NOBORDERS, (LPARAM)L"Welcome to 86Box !"); + + hmenu = GetMenu(hwndParent); + hmenuMedia = CreatePopupMenu(); + InsertMenu(hmenu, 2, MF_BYPOSITION | MF_STRING | MF_POPUP, (UINT_PTR)hmenuMedia, plat_get_string(IDS_2126)); + DrawMenuBar(hwndParent); + sb_ready = 1; } @@ -1245,6 +1328,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 +1346,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); From 870fdaef3df769b8ff5a402fe9caaa5c239159d6 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 23 Apr 2020 02:22:27 +0200 Subject: [PATCH 02/13] Fixed some warnings in win_jsconf.c. --- src/win/win_jsconf.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) 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; } From e3296f452964d462519868ac9db70a3188634efd Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 23 Apr 2020 02:23:59 +0200 Subject: [PATCH 03/13] Split USB and Distributed DMA into their own files in preparation for the overhaul of the VIA southbridges. --- src/ddma.c | 200 +++++++++++++++++++++++++++++ src/include/86box/ddma.h | 56 ++++++++ src/include/86box/usb.h | 86 +++++++------ src/intel_piix.c | 253 +++---------------------------------- src/usb.c | 196 +++++++++++++++++++++++----- src/win/Makefile.mingw | 6 +- src/win/Makefile_ndr.mingw | 6 +- 7 files changed, 496 insertions(+), 307 deletions(-) create mode 100644 src/ddma.c create mode 100644 src/include/86box/ddma.h 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/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/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/intel_piix.c b/src/intel_piix.c index 8e83e0f0e..33061c4dd 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,10 +444,12 @@ 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: @@ -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 */ @@ -1394,20 +1189,12 @@ 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); + dev->usb = device_add(&usb_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; 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/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 \ From 3b85d4f0c7ef0ee1490a2d5583838f4c090baf1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Thu, 23 Apr 2020 12:58:19 +0200 Subject: [PATCH 04/13] win: Add a placeholder menuitem for the Media menu This makes it possible to change the position of the menu by only editing the resource script itself. --- src/include/86box/resource.h | 2 ++ src/win/86Box.rc | 1 + src/win/win_stbar.c | 29 +++++++++++++++++++++++------ 3 files changed, 26 insertions(+), 6 deletions(-) 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/win/86Box.rc b/src/win/86Box.rc index 214dd945a..caba77e71 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 diff --git a/src/win/win_stbar.c b/src/win/win_stbar.c index 0dfd7af1d..080afad72 100644 --- a/src/win/win_stbar.c +++ b/src/win/win_stbar.c @@ -1215,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) @@ -1222,7 +1243,6 @@ StatusBarCreate(HWND hwndParent, uintptr_t idStatus, HINSTANCE hInst) RECT rectDialog; int dw, dh; uint8_t i; - HMENU hmenu; /* Load our icons into the cache for faster access. */ for (i = 16; i < 18; i++) @@ -1305,11 +1325,8 @@ StatusBarCreate(HWND hwndParent, uintptr_t idStatus, HINSTANCE hInst) SendMessage(hwndSBAR, SB_SETTEXT, 0 | SBT_NOBORDERS, (LPARAM)L"Welcome to 86Box !"); - hmenu = GetMenu(hwndParent); - hmenuMedia = CreatePopupMenu(); - InsertMenu(hmenu, 2, MF_BYPOSITION | MF_STRING | MF_POPUP, (UINT_PTR)hmenuMedia, plat_get_string(IDS_2126)); - DrawMenuBar(hwndParent); - + MediaMenuCreate(hwndParent, idStatus, hInst); + sb_ready = 1; } From cab0bb845ad375d9f83318161c939ed7c950061f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Thu, 23 Apr 2020 13:02:14 +0200 Subject: [PATCH 05/13] win: Move the statusbar initial text to resources --- src/include/86box/language.h | 2 +- src/win/86Box.rc | 2 +- src/win/win_stbar.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/include/86box/language.h b/src/include/86box/language.h index 7aa2e17ee..9b3065be9 100644 --- a/src/include/86box/language.h +++ b/src/include/86box/language.h @@ -99,7 +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 // "Media" +#define IDS_2126 2126 // "Welcome to 86Box!" #define IDS_4096 4096 // "Hard disk (%s)" #define IDS_4097 4097 // "%01i:%01i" diff --git a/src/win/86Box.rc b/src/win/86Box.rc index caba77e71..c71fb8b43 100644 --- a/src/win/86Box.rc +++ b/src/win/86Box.rc @@ -916,7 +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 "&Media" + IDS_2126 "Welcome to 86Box!" END STRINGTABLE DISCARDABLE diff --git a/src/win/win_stbar.c b/src/win/win_stbar.c index 080afad72..bdbd13f87 100644 --- a/src/win/win_stbar.c +++ b/src/win/win_stbar.c @@ -1323,7 +1323,7 @@ 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); From 812999f480d27f77d771d386abb995aaa0070c78 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 23 Apr 2020 14:42:32 +0200 Subject: [PATCH 06/13] The PIIX code now also initializes the USB device on the PIIX3, fixes #713. --- src/intel_piix.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/intel_piix.c b/src/intel_piix.c index 33061c4dd..64f5c6c0a 100644 --- a/src/intel_piix.c +++ b/src/intel_piix.c @@ -1182,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); @@ -1191,7 +1194,6 @@ static void acpi_set_nvr(dev->acpi, dev->nvr); dev->ddma = device_add(&ddma_device); - dev->usb = device_add(&usb_device); } else timer_add(&dev->fast_off_timer, piix_fast_off_count, dev, 0); From 8b8ba3d5a797e0269e7bfb7feccefe69db3cf06c Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 23 Apr 2020 15:11:32 +0200 Subject: [PATCH 07/13] IDE sector and sector count now return 0xFF (noise) on an unassigned IDE device, fixed TC430HX hanging with empty IDE channels. --- src/disk/hdc_ide.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 */ From ae36bb093b134d3e99f8c69f49215f9882891877 Mon Sep 17 00:00:00 2001 From: tiseno100 <58827426+tiseno100@users.noreply.github.com> Date: Thu, 23 Apr 2020 16:57:52 +0300 Subject: [PATCH 08/13] 430VX rework Make the 430HX & 430VX Phoenix boards available while removed the 596B AMI machine --- src/include/86box/machine.h | 13 ++---- src/machine/m_at_socket370.c | 29 ------------ src/machine/m_at_socket7_s7.c | 86 +++++++++++++++++------------------ src/machine/machine_table.c | 38 ++++++++++++---- 4 files changed, 73 insertions(+), 93 deletions(-) diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index 838dc9a0d..c07f74ed7 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -287,15 +287,14 @@ 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_p55xb2_init(const machine_t *); extern int machine_at_tx97_init(const machine_t *); @@ -336,10 +335,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/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..c0314ad88 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(&i430vx_device); + device_add(&piix3_device); + device_add(&keyboard_ps2_ami_pci_device); + device_add(&fdc37c932fr_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,49 +501,21 @@ 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(&fdc37c932fr_device); device_add(&intel_flash_bxt_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 ae8f41b08..cd64e4830 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,24 @@ 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] Micronics M7S-Hi", "m7shi", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_m7shi_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] 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 }, + //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,39 +260,50 @@ 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 P3B-F", "p3bf", {{"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_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 } }; From 9c6493a6f8765081bafeb3d2051a4ea180fbeb36 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 23 Apr 2020 17:49:04 +0200 Subject: [PATCH 09/13] Fixed the two new Phoenix machines by switching their Super I/O chips to SMC FDC73C935 (it's really 932/935 without additional letters), fixing some things in said Super I/O chips, and giving the HP Brio 80xx the correct (SST 29EE020) Flash chip. --- src/machine/m_at_socket7_s7.c | 9 +++++---- src/machine/machine_table.c | 2 +- src/sio_fdc37c93x.c | 14 ++++++++++++++ 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/machine/m_at_socket7_s7.c b/src/machine/m_at_socket7_s7.c index c0314ad88..5dbd00b48 100644 --- a/src/machine/m_at_socket7_s7.c +++ b/src/machine/m_at_socket7_s7.c @@ -322,10 +322,10 @@ machine_at_m7shi_init(const machine_t *model) 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(&i430vx_device); + device_add(&i430hx_device); device_add(&piix3_device); device_add(&keyboard_ps2_ami_pci_device); - device_add(&fdc37c932fr_device); + device_add(&fdc37c935_device); device_add(&intel_flash_bxt_device); return ret; @@ -510,8 +510,9 @@ machine_at_brio80xx_init(const machine_t *model) device_add(&i430vx_device); device_add(&piix3_device); device_add(&keyboard_ps2_ami_pci_device); - device_add(&fdc37c932fr_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; } diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index cd64e4830..b116a452a 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -242,7 +242,7 @@ const machine_t machines[] = { { "[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] Micronics M7S-Hi", "m7shi", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_m7shi_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] 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 }, 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); From d042939600dfa494af5d305c5109db0030be2b34 Mon Sep 17 00:00:00 2001 From: tiseno100 <58827426+tiseno100@users.noreply.github.com> Date: Thu, 23 Apr 2020 20:17:18 +0300 Subject: [PATCH 10/13] Added the Packard Bell PB680 Intel AMI based board. To cover up the needs for an AMI BIOS on 430VX --- src/include/86box/machine.h | 1 + src/machine/m_at_socket7_s7.c | 33 +++++++++++++++++++++++++++++++++ src/machine/machine_table.c | 1 + 3 files changed, 35 insertions(+) diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index c07f74ed7..b24bbcff1 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -295,6 +295,7 @@ extern int machine_at_p55tvp4_init(const machine_t *); extern int machine_at_p55va_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 *); diff --git a/src/machine/m_at_socket7_s7.c b/src/machine/m_at_socket7_s7.c index 5dbd00b48..702f7d9d3 100644 --- a/src/machine/m_at_socket7_s7.c +++ b/src/machine/m_at_socket7_s7.c @@ -517,6 +517,39 @@ machine_at_brio80xx_init(const machine_t *model) 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 b116a452a..c00091cbb 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -251,6 +251,7 @@ const machine_t machines[] = { { "[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 }, From e132bf21e36bc818463296e46055cafff2c2382b Mon Sep 17 00:00:00 2001 From: TC1995 Date: Thu, 23 Apr 2020 20:15:20 +0200 Subject: [PATCH 11/13] Simplified memory handler for the wd80x3 nic family. --- src/network/net_wd8003.c | 87 ++++++++-------------------------------- 1 file changed, 17 insertions(+), 70 deletions(-) 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); From 191687e5ac130e5b5274efaa23992ab080a81008 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Thu, 23 Apr 2020 20:19:40 +0200 Subject: [PATCH 12/13] Hopefully fixed the dp8390 side of the wd80x3. --- src/network/net_dp8390.c | 24 ++++++------------------ 1 file changed, 6 insertions(+), 18 deletions(-) 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; From e42a99cc0e129c7f56e88a6cb82d6b8915066852 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 23 Apr 2020 20:57:13 +0200 Subject: [PATCH 13/13] Added a PCI APM device that has a reset function that clears and status back to 0x00 on device reset, fixes soft reset hangs on the ASUS P/I-P55TVP4, and also made it clear that the TC430HX is Intel. --- src/apm.c | 57 +++++++++++++++++++++++++++---------- src/include/86box/apm.h | 3 +- src/intel_piix.c | 6 ++-- src/machine/machine_table.c | 2 +- src/pci.c | 1 - 5 files changed, 48 insertions(+), 21 deletions(-) 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/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/intel_piix.c b/src/intel_piix.c index 64f5c6c0a..257b9be9a 100644 --- a/src/intel_piix.c +++ b/src/intel_piix.c @@ -455,7 +455,7 @@ piix_write(int func, int addr, uint8_t val, void *priv) 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; @@ -480,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: @@ -1206,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/machine_table.c b/src/machine/machine_table.c index c00091cbb..b358fde33 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -243,7 +243,7 @@ const machine_t machines[] = { { "[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] 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] 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] 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 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);