diff --git a/src/include/86box/video.h b/src/include/86box/video.h index dfbf072c5..9ee710592 100644 --- a/src/include/86box/video.h +++ b/src/include/86box/video.h @@ -326,6 +326,7 @@ extern const device_t ati18800_device; /* ATi 28800 */ extern const device_t ati28800_device; +extern const device_t ati28800_wonder1024d_xl_plus_device; extern const device_t ati28800k_device; extern const device_t ati28800k_spc4620p_device; extern const device_t ati28800k_spc6033p_device; diff --git a/src/video/vid_ati28800.c b/src/video/vid_ati28800.c index 16bb36201..6f31d109d 100644 --- a/src/video/vid_ati28800.c +++ b/src/video/vid_ati28800.c @@ -36,10 +36,11 @@ #include <86box/vid_svga.h> #include <86box/vid_svga_render.h> -#define VGAWONDERXL 1 -#ifdef USE_XL24 -# define VGAWONDERXL24 2 -#endif /* USE_XL24 */ +#define VGAWONDERXL 1 +#define VGAWONDERXLPLUS 2 +#if defined(DEV_BRANCH) && defined(USE_XL24) +# define VGAWONDERXL24 3 +#endif #define BIOS_ATIKOR_PATH "roms/video/ati28800/atikorvga.bin" #define BIOS_ATIKOR_4620P_PATH_L "roms/machines/spc4620p/31005h.u8" @@ -52,13 +53,14 @@ #define BIOS_VGAXL_EVEN_PATH "roms/video/ati28800/xleven.bin" #define BIOS_VGAXL_ODD_PATH "roms/video/ati28800/xlodd.bin" -#ifdef USE_XL24 +#if defined(DEV_BRANCH) && defined(USE_XL24) # define BIOS_XL24_EVEN_PATH "roms/video/ati28800/112-14318-102.bin" # define BIOS_XL24_ODD_PATH "roms/video/ati28800/112-14319-102.bin" -#endif /* USE_XL24 */ +#endif -#define BIOS_ROM_PATH "roms/video/ati28800/bios.bin" -#define BIOS_VGAXL_ROM_PATH "roms/video/ati28800/ATI_VGAWonder_XL.bin" +#define BIOS_ROM_PATH "roms/video/ati28800/bios.bin" +#define BIOS_VGAXL_ROM_PATH "roms/video/ati28800/ATI_VGAWonder_XL.bin" +#define BIOS_VGAXL_PLUS_ROM_PATH "roms/video/ati28800/VGAWonder1024D_XL_Plus_VGABIOS_U19.BIN" typedef struct ati28800_t { svga_t svga; @@ -183,7 +185,7 @@ ati28800_out(uint16_t addr, uint8_t val, void *priv) case 0x3C7: case 0x3C8: case 0x3C9: - if (ati28800->type == 1) + if ((ati28800->type == VGAWONDERXL) || (ati28800->type == VGAWONDERXLPLUS)) sc1148x_ramdac_out(addr, 0, val, svga->ramdac, svga); else svga_out(addr, val, svga); @@ -339,7 +341,7 @@ ati28800_in(uint16_t addr, void *priv) case 0x3C7: case 0x3C8: case 0x3C9: - if (ati28800->type == 1) + if ((ati28800->type == VGAWONDERXL) || (ati28800->type == VGAWONDERXLPLUS)) return sc1148x_ramdac_in(addr, 0, svga->ramdac, svga); return svga_in(addr, svga); @@ -609,7 +611,17 @@ ati28800_init(const device_t *info) ati28800->svga.ramdac = device_add(&sc11486_ramdac_device); break; -#ifdef USE_XL24 + case VGAWONDERXLPLUS: + ati28800->id = 6; + rom_init(&ati28800->bios_rom, + BIOS_VGAXL_PLUS_ROM_PATH, + 0xc0000, 0x8000, 0x7fff, + 0, MEM_MAPPING_EXTERNAL); + ati28800->svga.ramdac = device_add(&sc11483_ramdac_device); + ati28800->memory = 1024; + break; + +#if defined(DEV_BRANCH) && defined(USE_XL24) case VGAWONDERXL24: ati28800->id = 6; rom_init_interleaved(&ati28800->bios_rom, @@ -618,7 +630,7 @@ ati28800_init(const device_t *info) 0xc0000, 0x10000, 0xffff, 0, MEM_MAPPING_EXTERNAL); break; -#endif /* USE_XL24 */ +#endif default: ati28800->id = 5; @@ -653,11 +665,15 @@ ati28800_init(const device_t *info) ati_eeprom_load(&ati28800->eeprom, "ati28800xl.nvr", 0); break; -#ifdef USE_XL24 + case VGAWONDERXLPLUS: + ati_eeprom_load(&ati28800->eeprom, "ati28800_wonder1024d_xl_plus.nvr", 0); + break; + +#if defined(DEV_BRANCH) && defined(USE_XL24) case VGAWONDERXL24: ati_eeprom_load(&ati28800->eeprom, "ati28800xl24.nvr", 0); break; -#endif /* USE_XL24 */ +#endif default: ati_eeprom_load(&ati28800->eeprom, "ati28800.nvr", 0); @@ -685,13 +701,19 @@ compaq_ati28800_available(void) return (rom_present(BIOS_VGAXL_ROM_PATH)); } -#ifdef USE_XL24 +static int +ati28800_wonder1024d_xl_plus_available(void) +{ + return (rom_present(BIOS_VGAXL_PLUS_ROM_PATH)); +} + +#if defined(DEV_BRANCH) && defined(USE_XL24) static int ati28800_wonderxl24_available(void) { return (rom_present(BIOS_XL24_EVEN_PATH) && rom_present(BIOS_XL24_ODD_PATH)); } -#endif /* USE_XL24 */ +#endif static void ati28800_close(void *priv) @@ -749,7 +771,7 @@ static const device_config_t ati28800_config[] = { } }; -#ifdef USE_XL24 +#if defined(DEV_BRANCH) && defined(USE_XL24) static const device_config_t ati28800_wonderxl_config[] = { { .name = "memory", @@ -778,7 +800,7 @@ static const device_config_t ati28800_wonderxl_config[] = { .type = CONFIG_END } }; -#endif /* USE_XL24 */ +#endif // clang-format on const device_t ati28800_device = { @@ -851,7 +873,21 @@ const device_t compaq_ati28800_device = { .config = ati28800_config }; -#ifdef USE_XL24 +const device_t ati28800_wonder1024d_xl_plus_device = { + .name = "ATI 28800-6 (ATI VGA Wonder 1024D XL Plus)", + .internal_name = "ati28800_wonder1024d_xl_plus", + .flags = DEVICE_ISA, + .local = VGAWONDERXLPLUS, + .init = ati28800_init, + .close = ati28800_close, + .reset = NULL, + { .available = ati28800_wonder1024d_xl_plus_available }, + .speed_changed = ati28800_speed_changed, + .force_redraw = ati28800_force_redraw, + .config = NULL +}; + +#if defined(DEV_BRANCH) && defined(USE_XL24) const device_t ati28800_wonderxl24_device = { .name = "ATI-28800 (VGA Wonder XL24)", .internal_name = "ati28800w", @@ -865,4 +901,4 @@ const device_t ati28800_wonderxl24_device = { .force_redraw = ati28800_force_redraw, .config = ati28800_wonderxl_config }; -#endif /* USE_XL24 */ +#endif diff --git a/src/video/vid_table.c b/src/video/vid_table.c index c4dee5719..859712357 100644 --- a/src/video/vid_table.c +++ b/src/video/vid_table.c @@ -60,6 +60,7 @@ video_cards[] = { { &ati18800_vga88_device }, { &ati28800_device }, { &compaq_ati28800_device }, + { &ati28800_wonder1024d_xl_plus_device }, #ifdef USE_XL24 { &ati28800_wonderxl24_device }, #endif /* USE_XL24 */