From 3d53a8d43e010b604d5f02a5e1551c2c27ba5a80 Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Mon, 4 Dec 2017 20:08:36 +0200 Subject: [PATCH] Gigatron Arriba boot ROM support. --- expansion.cpp | 6 +++--- idecontrollers.cpp | 35 ++++++++++++++++------------------- 2 files changed, 19 insertions(+), 22 deletions(-) diff --git a/expansion.cpp b/expansion.cpp index 382d6801..abaf4b9e 100644 --- a/expansion.cpp +++ b/expansion.cpp @@ -4783,12 +4783,12 @@ const struct expansionromtype expansionroms[] = { }, { _T("arriba"), _T("Arriba"), _T("Gigatron"), - NULL, arriba_init, NULL, arriba_add_ide_unit, ROMTYPE_ARRIBA | ROMTYPE_NOT, 0, 0, BOARD_AUTOCONFIG_Z2, false, + NULL, arriba_init, NULL, arriba_add_ide_unit, ROMTYPE_ARRIBA | ROMTYPE_NONE, 0, 0, BOARD_AUTOCONFIG_Z2, true, NULL, 0, - false, EXPANSIONTYPE_IDE, + true, EXPANSIONTYPE_IDE, 0, 0, 0, false, NULL, false, 0, NULL, - { 0xc1, 0x01, 0x00, 0x00, 0x08, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0xd1, 0x01, 0x00, 0x00, 0x08, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00 }, }, { _T("gvp1"), _T("GVP Series I"), _T("Great Valley Products"), diff --git a/idecontrollers.cpp b/idecontrollers.cpp index a2b61a24..6e96fa54 100644 --- a/idecontrollers.cpp +++ b/idecontrollers.cpp @@ -815,6 +815,9 @@ static uae_u32 ide_read_byte(struct ide_board *board, uaecptr addr) int reg = get_arriba_reg(addr, board); if (reg >= 0) { v = get_ide_reg(board, reg); + } else if (board->rom && !(addr & 0x8000)) { + int offset = addr & 0x7fff; + v = board->rom[offset]; } } else if (board->type == FASTATA4K_IDE) { @@ -1043,6 +1046,11 @@ static uae_u32 ide_read_word(struct ide_board *board, uaecptr addr) int reg = get_arriba_reg(addr, board); if (reg == 0) { v = get_ide_reg_multi(board, IDE_DATA, 0, 1); + } else if (board->rom && !(addr & 0x8000)) { + int offset = addr & 0x7fff; + v = board->rom[(offset + 0) & board->rom_mask]; + v <<= 8; + v |= board->rom[(offset + 1) & board->rom_mask]; } } else if (board->type == FASTATA4K_IDE) { @@ -1470,26 +1478,9 @@ static void ide_write_word(struct ide_board *board, uaecptr addr, uae_u16 v) static uae_u32 ide_read_wordi(struct ide_board *board, uaecptr addr) { - uae_u16 v = 0; - if (board->type == GOLEMFAST_IDE) { - - if (!(addr & 0x8000)) { - if (board->rom) { - v = board->rom[addr & board->rom_mask] << 8; - v |= board->rom[(addr + 1) & board->rom_mask]; - } - } - - } else { - - v = dummy_wgeti(addr); - - } - return v; + return ide_read_word(board, addr); } - - IDE_MEMORY_FUNCTIONS(ide_controller_gvp, ide, gvp_ide_controller_board); addrbank gvp_ide_controller_bank = { @@ -1578,7 +1569,6 @@ static uae_u8 *REGPARAM2 ide_generic_xlate(uaecptr addr) return NULL; addr &= ide->rom_mask; return ide->rom + addr; - } static int REGPARAM2 ide_generic_check(uaecptr a, uae_u32 b) { @@ -2244,9 +2234,16 @@ bool arriba_init(struct autoconfig_info *aci) ide->bank = &ide_bank_generic; ide->mask = 65536 - 1; + ide->rom_size = 32768; + ide->rom_mask = 32768 - 1; + + ide->rom = xcalloc(uae_u8, 32768); + load_rom_rc(aci->rc, ROMTYPE_ARRIBA, 32768, 0, ide->rom, 32768, LOADROM_FILL); for (int i = 0; i < 16; i++) { uae_u8 b = ert->autoconfig[i]; + if (i == 0 && aci->rc->autoboot_disabled) + b &= ~0x10; ew(ide, i * 4, b); } -- 2.47.3