2022-12-20 21:23:55 -05:00
|
|
|
/*
|
|
|
|
|
* 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.
|
|
|
|
|
*
|
|
|
|
|
* Emulation of Sergey Kiselev's Monster Floppy Disk Controller.
|
|
|
|
|
*
|
|
|
|
|
*
|
|
|
|
|
*
|
|
|
|
|
* Authors: Jasmine Iwanek, <jasmine@iwanek.co.uk>
|
|
|
|
|
*
|
|
|
|
|
* Copyright 2022 Jasmine Iwanek.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#include <stdarg.h>
|
|
|
|
|
#include <stdint.h>
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
#include <string.h>
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
#include <wchar.h>
|
|
|
|
|
#define HAVE_STDARG_H
|
|
|
|
|
#include <86box/86box.h>
|
|
|
|
|
#include <86box/device.h>
|
|
|
|
|
#include <86box/io.h>
|
|
|
|
|
#include <86box/mem.h>
|
|
|
|
|
#include <86box/rom.h>
|
|
|
|
|
#include <86box/machine.h>
|
|
|
|
|
#include <86box/timer.h>
|
|
|
|
|
#include <86box/fdd.h>
|
|
|
|
|
#include <86box/fdc.h>
|
|
|
|
|
#include <86box/fdc_ext.h>
|
|
|
|
|
|
2023-02-28 23:24:58 -05:00
|
|
|
#define BIOS_ADDR (uint32_t)(device_get_config_hex20("bios_addr") & 0x000fffff)
|
2022-12-21 16:14:59 -05:00
|
|
|
#define ROM_MONSTER_FDC "roms/floppy/monster-fdc/floppy_bios.bin"
|
2022-12-20 21:23:55 -05:00
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
|
{
|
2023-02-28 23:24:58 -05:00
|
|
|
rom_t bios_rom;
|
2023-02-03 00:37:20 -05:00
|
|
|
fdc_t *fdc_pri;
|
|
|
|
|
fdc_t *fdc_sec;
|
2022-12-20 21:23:55 -05:00
|
|
|
} monster_fdc_t;
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
monster_fdc_close(void *priv)
|
|
|
|
|
{
|
2023-02-28 23:24:58 -05:00
|
|
|
monster_fdc_t *dev = (monster_fdc_t *) priv;
|
2022-12-20 21:23:55 -05:00
|
|
|
|
|
|
|
|
free(dev);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void *
|
|
|
|
|
monster_fdc_init(const device_t *info)
|
|
|
|
|
{
|
|
|
|
|
monster_fdc_t *dev;
|
|
|
|
|
|
2023-02-28 23:24:58 -05:00
|
|
|
dev = (monster_fdc_t *) malloc(sizeof(monster_fdc_t));
|
2022-12-20 21:23:55 -05:00
|
|
|
memset(dev, 0, sizeof(monster_fdc_t));
|
|
|
|
|
|
2023-02-03 00:37:20 -05:00
|
|
|
#if 0
|
|
|
|
|
uint8_t sec_irq = device_get_config_int("sec_irq");
|
|
|
|
|
uint8_t sec_dma = device_get_config_int("sec_dma");
|
|
|
|
|
#endif
|
|
|
|
|
|
2022-12-20 21:23:55 -05:00
|
|
|
if (BIOS_ADDR != 0)
|
|
|
|
|
rom_init(&dev->bios_rom, ROM_MONSTER_FDC, BIOS_ADDR, 0x2000, 0x1ffff, 0, MEM_MAPPING_EXTERNAL);
|
|
|
|
|
|
|
|
|
|
// Primary FDC
|
2023-02-03 00:37:20 -05:00
|
|
|
dev->fdc_pri = device_add(&fdc_at_device);
|
2022-12-20 21:23:55 -05:00
|
|
|
|
2023-02-03 00:37:20 -05:00
|
|
|
#if 0
|
2022-12-20 21:23:55 -05:00
|
|
|
// Secondary FDC
|
2023-02-03 00:37:20 -05:00
|
|
|
uint8_t sec_enabled = device_get_config_int("sec_enabled");
|
|
|
|
|
if (sec_enabled)
|
|
|
|
|
dev->fdc_sec = device_add(&fdc_at_sec_device);
|
|
|
|
|
fdc_set_irq(dev->fdc_sec, sec_irq);
|
|
|
|
|
fdc_set_dma_ch(dev->fdc_sec, sec_dma);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#if 0
|
|
|
|
|
uint8_t rom_writes_enabled = device_get_config_int("rom_writes_enabled");
|
|
|
|
|
#endif
|
2022-12-20 21:23:55 -05:00
|
|
|
|
|
|
|
|
return dev;
|
|
|
|
|
}
|
|
|
|
|
|
2023-02-28 23:24:58 -05:00
|
|
|
static int
|
|
|
|
|
monster_fdc_available(void)
|
2022-12-20 21:23:55 -05:00
|
|
|
{
|
|
|
|
|
return rom_present(ROM_MONSTER_FDC);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static const device_config_t monster_fdc_config[] = {
|
2023-02-28 23:24:58 -05:00
|
|
|
// clang-format off
|
2023-02-03 00:37:20 -05:00
|
|
|
#if 0
|
|
|
|
|
{
|
|
|
|
|
.name = "sec_enabled",
|
|
|
|
|
.description = "Enable Secondary Controller",
|
|
|
|
|
.type = CONFIG_BINARY,
|
|
|
|
|
.default_string = "",
|
|
|
|
|
.default_int = 0
|
|
|
|
|
},
|
2022-12-20 21:23:55 -05:00
|
|
|
{
|
|
|
|
|
.name = "sec_irq",
|
|
|
|
|
.description = "Secondary Controller IRQ",
|
|
|
|
|
.type = CONFIG_SELECTION,
|
|
|
|
|
.default_string = "",
|
|
|
|
|
.default_int = 6,
|
|
|
|
|
.file_filter = "",
|
|
|
|
|
.spinner = { 0 },
|
|
|
|
|
.selection = {
|
|
|
|
|
{
|
|
|
|
|
.description = "IRQ 2",
|
|
|
|
|
.value = 2
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
.description = "IRQ 3",
|
|
|
|
|
.value = 3
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
.description = "IRQ 4",
|
|
|
|
|
.value = 4
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
.description = "IRQ 5",
|
|
|
|
|
.value = 5
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
.description = "IRQ 6",
|
|
|
|
|
.value = 6
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
.description = "IRQ 7",
|
|
|
|
|
.value = 7
|
|
|
|
|
},
|
|
|
|
|
{ .description = "" }
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
.name = "sec_dma",
|
|
|
|
|
.description = "Secondary Controller DMA",
|
|
|
|
|
.type = CONFIG_SELECTION,
|
|
|
|
|
.default_string = "",
|
|
|
|
|
.default_int = 2,
|
|
|
|
|
.file_filter = "",
|
|
|
|
|
.spinner = { 0 },
|
|
|
|
|
.selection = {
|
|
|
|
|
{
|
|
|
|
|
.description = "DMA 1",
|
|
|
|
|
.value = 1
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
.description = "DMA 2",
|
|
|
|
|
.value = 2
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
.description = "DMA 3",
|
|
|
|
|
.value = 3
|
|
|
|
|
},
|
|
|
|
|
{ .description = "" }
|
|
|
|
|
}
|
|
|
|
|
},
|
2023-02-03 00:37:20 -05:00
|
|
|
#endif
|
2022-12-20 21:23:55 -05:00
|
|
|
{
|
|
|
|
|
.name = "bios_addr",
|
|
|
|
|
.description = "BIOS Address:",
|
|
|
|
|
.type = CONFIG_HEX20,
|
|
|
|
|
.default_string = "",
|
|
|
|
|
.default_int = 0xc8000,
|
|
|
|
|
.file_filter = "",
|
|
|
|
|
.spinner = { 0 },
|
|
|
|
|
.selection = {
|
|
|
|
|
{ .description = "Disabled", .value = 0 },
|
|
|
|
|
{ .description = "C000H", .value = 0xc0000 },
|
|
|
|
|
{ .description = "C800H", .value = 0xc8000 },
|
|
|
|
|
{ .description = "D000H", .value = 0xd0000 },
|
|
|
|
|
{ .description = "D800H", .value = 0xd8000 },
|
|
|
|
|
{ .description = "E000H", .value = 0xe0000 },
|
|
|
|
|
{ .description = "E800H", .value = 0xe8000 },
|
|
|
|
|
{ .description = "" }
|
|
|
|
|
}
|
|
|
|
|
},
|
2023-02-03 00:37:20 -05:00
|
|
|
#if 0
|
2022-12-20 21:23:55 -05:00
|
|
|
{
|
|
|
|
|
.name = "bios_size",
|
|
|
|
|
.description = "BIOS Size:",
|
|
|
|
|
.type = CONFIG_HEX20,
|
|
|
|
|
.default_string = "32",
|
|
|
|
|
.default_int = 0xc8000,
|
|
|
|
|
.file_filter = "",
|
|
|
|
|
.spinner = { 0 },
|
|
|
|
|
.selection = {
|
|
|
|
|
{ .description = "8K", .value = 8 },
|
|
|
|
|
{ .description = "32K", .value = 32 },
|
|
|
|
|
{ .description = "" }
|
|
|
|
|
}
|
|
|
|
|
},
|
2023-02-03 00:37:20 -05:00
|
|
|
{
|
|
|
|
|
.name = "rom_writes_enabled",
|
|
|
|
|
.description = "Enable BIOS extension ROM Writes",
|
|
|
|
|
.type = CONFIG_BINARY,
|
|
|
|
|
.default_string = "",
|
|
|
|
|
.default_int = 0
|
|
|
|
|
},
|
|
|
|
|
#endif
|
2022-12-20 21:23:55 -05:00
|
|
|
{ .name = "", .description = "", .type = CONFIG_END }
|
2023-02-28 23:24:58 -05:00
|
|
|
// clang-format on
|
2022-12-20 21:23:55 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const device_t fdc_monster_device = {
|
2023-02-28 23:24:58 -05:00
|
|
|
.name = "Monster FDC Floppy Drive Controller",
|
2022-12-20 21:23:55 -05:00
|
|
|
.internal_name = "monster_fdc",
|
2023-02-28 23:24:58 -05:00
|
|
|
.flags = DEVICE_ISA,
|
|
|
|
|
.local = 0,
|
|
|
|
|
.init = monster_fdc_init,
|
|
|
|
|
.close = monster_fdc_close,
|
|
|
|
|
.reset = NULL,
|
2022-12-20 21:23:55 -05:00
|
|
|
{ .available = monster_fdc_available },
|
|
|
|
|
.speed_changed = NULL,
|
2023-02-28 23:24:58 -05:00
|
|
|
.force_redraw = NULL,
|
|
|
|
|
.config = monster_fdc_config
|
2022-12-20 21:23:55 -05:00
|
|
|
};
|