/* * 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 Socket 3 machines. * * Authors: Miran Grca, * * Copyright 2016-2025 Miran Grca. */ #include #include #include #include #include #define HAVE_STDARG_H #include <86box/86box.h> #include "cpu.h" #include <86box/timer.h> #include <86box/io.h> #include <86box/device.h> #include <86box/chipset.h> #include <86box/keyboard.h> #include <86box/mem.h> #include <86box/nvr.h> #include <86box/pci.h> #include <86box/dma.h> #include <86box/fdd.h> #include <86box/fdc.h> #include <86box/fdc_ext.h> #include <86box/gameport.h> #include <86box/pic.h> #include <86box/pit.h> #include <86box/rom.h> #include <86box/sio.h> #include <86box/hdc.h> #include <86box/port_6x.h> #include <86box/port_92.h> #include <86box/video.h> #include <86box/flash.h> #include <86box/scsi_ncr53c8xx.h> #include <86box/hwm.h> #include <86box/machine.h> #include <86box/plat_unused.h> #include <86box/sound.h> /* ALi M1429G */ int machine_at_atc1762_init(const machine_t *model) { int ret; ret = bios_load_linear("roms/machines/atc1762/atc1762.bin", 0x000f0000, 65536, 0); if (bios_only || !ret) return ret; machine_at_common_init(model); device_add(&ali1429g_device); device_add_params(machine_get_kbc_device(machine), (void *) model->kbc_params); if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); return ret; } int machine_at_ecsal486_init(const machine_t *model) { int ret; ret = bios_load_linear("roms/machines/ecsal486/ECS_AL486.BIN", 0x000f0000, 65536, 0); if (bios_only || !ret) return ret; machine_at_common_init(model); device_add(&ali1429g_device); device_add_params(machine_get_kbc_device(machine), (void *) model->kbc_params); if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); return ret; } int machine_at_ap4100aa_init(const machine_t *model) { int ret; ret = bios_load_linear("roms/machines/ap4100aa/M27C512DIP28.BIN", 0x000f0000, 65536, 0); if (bios_only || !ret) return ret; machine_at_common_init_ex(model, 2); device_add(&ami_1994_nvr_device); device_add(&ali1429g_device); device_add_params(machine_get_kbc_device(machine), (void *) model->kbc_params); device_add(&ide_vlb_device); device_add_params(&um866x_device, (void *) UM8663BF); return ret; } /* Contaq 82C596A */ int machine_at_4gpv5_init(const machine_t *model) { int ret; ret = bios_load_linear("roms/machines/4gpv5/4GPV5.bin", 0x000f0000, 65536, 0); if (bios_only || !ret) return ret; machine_at_common_init(model); if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); device_add(&contaq_82c596a_device); device_add_params(machine_get_kbc_device(machine), (void *) model->kbc_params); return ret; } /* Contaq 82C597 */ int machine_at_greenb_init(const machine_t *model) { int ret; ret = bios_load_linear("roms/machines/greenb/4gpv31-ami-1993-8273517.bin", 0x000f0000, 65536, 0); if (bios_only || !ret) return ret; machine_at_common_init(model); if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); device_add(&contaq_82c597_device); device_add_params(machine_get_kbc_device(machine), (void *) model->kbc_params); return ret; } /* OPTi 895 */ static const device_config_t j403tg_config[] = { // clang-format off { .name = "bios", .description = "BIOS Version", .type = CONFIG_BIOS, .default_string = "403tg", .default_int = 0, .file_filter = NULL, .spinner = { 0 }, .selection = { { 0 } }, .bios = { { .name = "AMI WinBIOS (121593)", .internal_name = "403tg", .bios_type = BIOS_NORMAL, .files_no = 1, .local = 0, .size = 65536, .files = { "roms/machines/403tg/J403TGRevD.BIN", "" } }, { .name = "Award Modular BIOS v4.50G", .internal_name = "403tg_award", .bios_type = BIOS_NORMAL, .files_no = 1, .local = 0, .size = 65536, .files = { "roms/machines/403tg/403TG.BIN", "" } }, { .name = "MR BIOS V2.02", .internal_name = "403tg_mr", .bios_type = BIOS_NORMAL, .files_no = 1, .local = 0, .size = 65536, .files = { "roms/machines/403tg/MRBiosOPT895.bin", "" } }, { .files_no = 0 } } }, { .name = "", .description = "", .type = CONFIG_END } // clang-format on }; const device_t j403tg_device = { .name = "Jetway J-403TG", .internal_name = "403tg_device", .flags = 0, .local = 0, .init = NULL, .close = NULL, .reset = NULL, .available = NULL, .speed_changed = NULL, .force_redraw = NULL, .config = j403tg_config }; int machine_at_403tg_init(const machine_t *model) { int ret = 0; const char *fn; /* No ROMs available */ if (!device_available(model->device)) return ret; device_context(model->device); int nvr_hack = !strcmp(device_get_config_bios("bios"), "403tg"); fn = device_get_bios_file(machine_get_device(machine), device_get_config_bios("bios"), 0); ret = bios_load_linear(fn, 0x000f0000, 65536, 0); if (nvr_hack) { machine_at_common_init_ex(model, 2); device_add(&ami_1994_nvr_device); } else machine_at_common_init(model); device_add(&opti895_device); device_add_params(machine_get_kbc_device(machine), (void *) model->kbc_params); if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); return ret; } /* SiS 461 */ int machine_at_acerv10_init(const machine_t *model) { int ret; ret = bios_load_linear("roms/machines/acerv10/ALL.BIN", 0x000e0000, 131072, 0); if (bios_only || !ret) return ret; machine_at_common_init(model); device_add(&sis_85c461_device); device_add_params(machine_get_kbc_device(machine), (void *) model->kbc_params); device_add(&ide_isa_device); if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); return ret; } /* SiS 471 */ static void machine_at_sis_85c471_common_init(const machine_t *model) { machine_at_common_init(model); if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); device_add(&sis_85c471_device); } int machine_at_win471_init(const machine_t *model) { int ret; ret = bios_load_linear("roms/machines/win471/486-SiS_AC0360136.BIN", 0x000f0000, 65536, 0); if (bios_only || !ret) return ret; machine_at_sis_85c471_common_init(model); device_add_params(machine_get_kbc_device(machine), (void *) model->kbc_params); return ret; } int machine_at_win471t_init(const machine_t *model) { int ret; ret = bios_load_linear("roms/machines/win471t/486-SiS_AB6680759.BIN", 0x000f0000, 65536, 0); if (bios_only || !ret) return ret; machine_at_sis_85c471_common_init(model); device_add_params(machine_get_kbc_device(machine), (void *) model->kbc_params); return ret; } int machine_at_vi15g_init(const machine_t *model) { int ret; ret = bios_load_linear("roms/machines/vi15g/vi15gr23.rom", 0x000f0000, 65536, 0); if (bios_only || !ret) return ret; machine_at_sis_85c471_common_init(model); device_add_params(machine_get_kbc_device(machine), (void *) model->kbc_params); return ret; } int machine_at_vli486sv2g_init(const machine_t *model) { int ret; ret = bios_load_linear("roms/machines/vli486sv2g/0402.001", 0x000f0000, 65536, 0); if (bios_only || !ret) return ret; machine_at_sis_85c471_common_init(model); device_add_params(machine_get_kbc_device(machine), (void *) model->kbc_params); return ret; } int machine_at_dvent4xx_init(const machine_t *model) { int ret; ret = bios_load_linear("roms/machines/dvent4xx/Venturis466_BIOS.BIN", 0x000e0000, 131072, 0); if (bios_only || !ret) return ret; machine_at_common_init(model); device_add(&sis_85c471_device); device_add(&ide_cmd640_vlb_pri_device); device_add_params(&fdc37c6xx_device, (void *) (FDC37C665 | FDC37C6XX_IDE_SEC)); device_add_params(machine_get_kbc_device(machine), (void *) model->kbc_params); if (gfxcard[0] == VID_INTERNAL) device_add(machine_get_vid_device(machine)); return ret; } int machine_at_dtk486_init(const machine_t *model) { int ret; ret = bios_load_linear("roms/machines/dtk486/4siw005.bin", 0x000f0000, 65536, 0); if (bios_only || !ret) return ret; machine_at_sis_85c471_common_init(model); device_add_params(machine_get_kbc_device(machine), (void *) model->kbc_params); return ret; } int machine_at_ami471_init(const machine_t *model) { int ret; ret = bios_load_linear("roms/machines/ami471/SIS471BE.AMI", 0x000f0000, 65536, 0); if (bios_only || !ret) return ret; machine_at_sis_85c471_common_init(model); device_add_params(machine_get_kbc_device(machine), (void *) model->kbc_params); return ret; } int machine_at_px471_init(const machine_t *model) { int ret; ret = bios_load_linear("roms/machines/px471/SIS471A1.PHO", 0x000f0000, 65536, 0); if (bios_only || !ret) return ret; machine_at_sis_85c471_common_init(model); device_add(&ide_vlb_device); device_add_params(machine_get_kbc_device(machine), (void *) model->kbc_params); return ret; } int machine_at_tg486g_init(const machine_t *model) { int ret; ret = bios_load_linear("roms/machines/tg486g/tg486g.bin", 0x000c0000, 262144, 0); if (bios_only || !ret) return ret; machine_at_common_init_ex(model, 2); device_add(&amstrad_megapc_nvr_device); device_add(&sis_85c471_device); device_add(&ide_isa_device); device_add_params(&fdc37c6xx_device, (void *) (FDC37C651 | FDC37C6XX_IDE_PRI)); device_add_params(machine_get_kbc_device(machine), (void *) model->kbc_params); if (gfxcard[0] != VID_INTERNAL) { for (uint16_t i = 0; i < 32768; i++) rom[i] = mem_readb_phys(0x000c0000 + i); } mem_mapping_set_addr(&bios_mapping, 0x0c0000, 0x40000); mem_mapping_set_exec(&bios_mapping, rom); return ret; }