From 680a05b120e147cd42edf4cfcfd386ebe3da8822 Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Fri, 5 Jan 2024 19:35:52 +0200 Subject: [PATCH] DraCo is moved under MacroSystem and boot rom moved from extended rom to accelerator rom. --- draco.cpp | 118 ++++++++++++++++++++++++++++++++++----------- expansion.cpp | 31 ++++-------- include/cpuboard.h | 4 +- rommgr.cpp | 4 +- 4 files changed, 102 insertions(+), 55 deletions(-) diff --git a/draco.cpp b/draco.cpp index cdb2b661..1ca710be 100644 --- a/draco.cpp +++ b/draco.cpp @@ -19,6 +19,7 @@ #include "draco.h" #include "zfile.h" #include "keybuf.h" +#include "rommgr.h" static int maxcnt = 100; @@ -147,6 +148,8 @@ int draco_kbc_translate(uint8_t val); static void *draco_serial[2]; static void *draco_mouse_base, *draco_keyboard; +static uae_u8 *dracorom; +static int dracoromsize; static uae_u8 draco_intena, draco_intpen, draco_svga_irq_state; static uae_u16 draco_timer, draco_timer_latch; @@ -597,32 +600,6 @@ static void draco_1wire_reset(void) #endif } -static uae_u32 REGPARAM2 draco_lget(uaecptr addr) -{ - uae_u32 l = 0; - - if ((addr & 0x07c00000) == 0x04000000) { - - //write_log("draco scsi lput %08x %08x\n", addr, l); - int reg = addr & 0xffff; - l |= cpuboard_ncr710_io_bget(reg + 3) << 0; - l |= cpuboard_ncr710_io_bget(reg + 2) << 8; - l |= cpuboard_ncr710_io_bget(reg + 1) << 16; - l |= cpuboard_ncr710_io_bget(reg + 0) << 24; - - } else { - write_log(_T("draco_lget %08x %08x\n"), addr, M68K_GETPC); - } - - return l; -} -static uae_u32 REGPARAM2 draco_wget(uaecptr addr) -{ - write_log(_T("draco_wget %08x %08x\n"), addr, M68K_GETPC); - - return 0; -} - void draco_bustimeout(uaecptr addr) { write_log("draco bus timeout %08x\n", addr); @@ -764,6 +741,14 @@ static uae_u32 REGPARAM2 draco_bget(uaecptr addr) v = 0; break; } + + } else if (addr < 0x00100000) { + + // boot ROM + if (addr < dracoromsize) { + v = dracorom[addr]; + } + } else { write_log("draco unknown bank read %08x\n", addr); @@ -772,6 +757,51 @@ static uae_u32 REGPARAM2 draco_bget(uaecptr addr) return v; } +static uae_u32 REGPARAM2 draco_lget(uaecptr addr) +{ + uae_u32 l = 0; + + if ((addr & 0x07c00000) == 0x04000000) { + + //write_log("draco scsi lput %08x %08x\n", addr, l); + int reg = addr & 0xffff; + l |= cpuboard_ncr710_io_bget(reg + 3) << 0; + l |= cpuboard_ncr710_io_bget(reg + 2) << 8; + l |= cpuboard_ncr710_io_bget(reg + 1) << 16; + l |= cpuboard_ncr710_io_bget(reg + 0) << 24; + + } else if (addr < 0x00100000) { + + l = draco_bget(addr + 0) << 24; + l |= draco_bget(addr + 1) << 16; + l |= draco_bget(addr + 2) << 8; + l |= draco_bget(addr + 3) << 0; + + } else { + + write_log(_T("draco_lget %08x %08x\n"), addr, M68K_GETPC); + } + + return l; +} +static uae_u32 REGPARAM2 draco_wget(uaecptr addr) +{ + uae_u16 v = 0; + + if (addr < 0x00100000) { + + v = draco_bget(addr + 0) << 8; + v |= draco_bget(addr + 1); + + } else { + + write_log(_T("draco_wget %08x %08x\n"), addr, M68K_GETPC); + + } + + return v; +} + static void REGPARAM2 draco_lput(uaecptr addr, uae_u32 l) { if ((addr & 0x07c00000) == 0x04000000) { @@ -960,6 +990,10 @@ static void REGPARAM2 draco_bput(uaecptr addr, uae_u32 b) break; } + } else if (addr < 0x00100000) { + + // boot ROM + } else { write_log("draco unknown bank write %08x\n", addr); @@ -967,11 +1001,25 @@ static void REGPARAM2 draco_bput(uaecptr addr, uae_u32 b) } } +static int REGPARAM2 draco_check(uaecptr addr, uae_u32 size) +{ + if (addr >= 0x00100000) { + return 0; + } + return 1; +} + +static uae_u8 *REGPARAM2 draco_xlate(uaecptr addr) +{ + addr &= 0xfffff; + return dracorom + addr; +} + static addrbank draco_bank = { draco_lget, draco_wget, draco_bget, draco_lput, draco_wput, draco_bput, - default_xlate, default_check, NULL, NULL, _T("DraCo mainboard"), - dummy_lgeti, dummy_wgeti, ABFLAG_IO, S_READ, S_WRITE + draco_xlate, draco_check, NULL, NULL, _T("DraCo mainboard"), + draco_lget, draco_wget, ABFLAG_IO, S_READ, S_WRITE }; @@ -1080,6 +1128,8 @@ void draco_free(void) } xfree(draco_mouse_base); draco_mouse_base = NULL; + xfree(dracorom); + dracorom = NULL; } void draco_reset(int hardreset) @@ -1111,6 +1161,7 @@ void draco_reset(int hardreset) draco_superio_cfg[14] = 1; memset(draco_reg, 0, sizeof(draco_reg)); draco_reg[1] = DRCNTRL_FDCINTENA | DRCNTRL_KBDINTENA; + draco_reg[5] = 0xff; draco_keyboard_reset(); draco_1wire_rtc_validate(); @@ -1141,6 +1192,15 @@ void draco_init(void) zfile_fclose(draco_flashfile); } + int idx; + const TCHAR *romname = NULL; + struct boardromconfig *brc; + brc = get_device_rom(&currprefs, ROMTYPE_CPUBOARD, 0, &idx); + if (brc) { + romname = brc->roms[idx].romfile; + dracorom = zfile_load_file(romname, &dracoromsize); + } + draco_reset(1); device_add_rethink(draco_irq); @@ -1166,7 +1226,7 @@ void draco_map_overlay(void) // hide cias map_banks(&dummy_bank, 0xa00000 >> 16, 0x200000 >> 16, 0); - map_banks(&extendedkickmem_bank, 0 >> 16, 524288 >> 16, 0); + map_banks(&draco_bank, 0 >> 16, 0x00200000 >> 16, 0); map_banks(&draco_bank, 0x01000000 >> 16, 0x01c00000 >> 16, 0); map_banks(&kickmem_bank, 0x02c00000 >> 16, 524288 >> 16, 0); map_banks(&draco_bank, 0x04000000 >> 16, 0x01000000 >> 16, 0); diff --git a/expansion.cpp b/expansion.cpp index 229de393..8c4b8f17 100644 --- a/expansion.cpp +++ b/expansion.cpp @@ -6558,6 +6558,16 @@ static const struct cpuboardsubtype macrosystem_sub[] = { 0, 128 * 1024 * 1024, }, + { + _T("DraCo"), + _T("draco"), + ROMTYPE_CB_DRACO | ROMTYPE_NONE, 0, 4, + draco_add_scsi_unit, EXPANSIONTYPE_SCSI, + BOARD_MEMORY_HIGHMEM, + 128 * 1024 * 1024, + 0, + ncr710_draco_init, NULL, BOARD_NONAUTOCONFIG_BEFORE, 1, + }, { NULL } @@ -6881,22 +6891,6 @@ static const struct cpuboardsubtype harms_sub[] = { } }; -static const struct cpuboardsubtype draco_sub[] = { - { - _T("DraCo"), - _T("draco"), - ROMTYPE_CB_DRACO | ROMTYPE_NONE, 0, 4, - draco_add_scsi_unit, EXPANSIONTYPE_SCSI, - BOARD_MEMORY_HIGHMEM, - 128 * 1024 * 1024, - 0, - ncr710_draco_init, NULL, BOARD_NONAUTOCONFIG_BEFORE, 1, - }, - { - NULL - } -}; - static const struct cpuboardsubtype dummy_sub[] = { { NULL } }; @@ -6987,11 +6981,6 @@ const struct cpuboardtype cpuboards[] = { _T("Harms"), harms_sub, 0 }, - { - BOARD_DRACO, - _T("Draco"), - draco_sub, 0 - }, { NULL } diff --git a/include/cpuboard.h b/include/cpuboard.h index 2a95a128..12c8f175 100644 --- a/include/cpuboard.h +++ b/include/cpuboard.h @@ -79,6 +79,7 @@ void cpuboard_gvpmaprom(int); #define BOARD_MACROSYSTEM 7 #define BOARD_MACROSYSTEM_SUB_WARPENGINE_A4000 0 #define BOARD_MACROSYSTEM_SUB_FALCON040 1 +#define BOARD_MACROSYSTEM_SUB_DRACO 2 #define BOARD_MTEC 8 #define BOARD_MTEC_SUB_EMATRIX530 0 @@ -116,7 +117,4 @@ void cpuboard_gvpmaprom(int); #define BOARD_HARMS 16 #define BOARD_HARMS_SUB_3KPRO 0 -#define BOARD_DRACO 17 -#define BOARD_DRACO_SUB_DRACO 0 - #endif /* UAE_CPUBOARD_H */ diff --git a/rommgr.cpp b/rommgr.cpp index 0dc0ffe3..bb0f26f9 100644 --- a/rommgr.cpp +++ b/rommgr.cpp @@ -297,9 +297,9 @@ static struct romdata roms[] = { 0x2ec384e3,0x47f9ee6d, 0x0f8ac5a6,0x5c6eddc3,0x0bcd47c8,0x574d8725, NULL, NULL, 4 }, ALTROMPN(231, 1, 1, 524288, ROMTYPE_EVEN, _T("74095 00 717 02 01 U4"), 0x1bdcd18c, 0xabc7b734,0x1f8df24d,0xd4f1d062,0xfc0f7680,0x4d1053b9) ALTROMPN(231, 1, 2, 524288, ROMTYPE_ODD , _T("74095 00 717 02 02 U5"), 0x6ccb0431, 0xa2a43444,0xbeda38be,0x1fa5cabe,0x75fc4def,0x063bcd7a) - { _T("DraCo Boot ROM v1.3"), 1, 3, 1, 3, _T("DRACO\0"), 131072, 234, 2 | 4, 0, ROMTYPE_EXTCDTV, 0, 0, NULL, + { _T("DraCo Boot ROM v1.3"), 1, 3, 1, 3, _T("DRACO\0"), 131072, 234, 2 | 4, 0, ROMTYPE_CB_DRACO, 0, 0, NULL, 0x0e9c5899,0x82151324,0x01207554,0x60c8a068,0x4793ec18,0x3f744d74, NULL, NULL, 4 }, - { _T("DraCo Boot ROM v1.5"), 1, 5, 1, 5, _T("DRACO\0"), 131072, 311, 2 | 4, 0, ROMTYPE_EXTCDTV, 0, 0, NULL, + { _T("DraCo Boot ROM v1.5"), 1, 5, 1, 5, _T("DRACO\0"), 131072, 311, 2 | 4, 0, ROMTYPE_CB_DRACO, 0, 0, NULL, 0x7b4cdd4a,0x4d383adb,0x85c681a3,0xb625dcda,0x7a229a17,0x6af4d161, NULL, NULL, 4 }, { _T("CD32 KS ROM v3.1"), 3, 1, 40, 60, _T("CD32\0"), 524288, 18, 1, 0, ROMTYPE_KICKCD32, 0, 0, NULL, -- 2.47.3