]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
ROM handling update.
authorToni Wilen <twilen@winuae.net>
Fri, 4 Sep 2015 16:53:13 +0000 (19:53 +0300)
committerToni Wilen <twilen@winuae.net>
Fri, 4 Sep 2015 16:53:13 +0000 (19:53 +0300)
a2091.cpp
expansion.cpp
gayle.cpp
idecontrollers.cpp
include/devices.h
include/ide.h
include/rommgr.h
ncr9x_scsi.cpp
ncr_scsi.cpp
rommgr.cpp
scsi.cpp

index 0e6bef8d75d9a66ea49e9a142a066d3d052bd51f..3bb74bd2f270f46ff55b7dacf449a6ec8e9a8d45 100644 (file)
--- a/a2091.cpp
+++ b/a2091.cpp
@@ -3475,7 +3475,6 @@ void a2091_reset (void)
 addrbank *a2091_init (struct romconfig *rc)
 {
        struct wd_state *wd = getscsi(rc);
-       int roms[6];
        int slotsize;
 
        if (!wd)
@@ -3504,13 +3503,6 @@ addrbank *a2091_init (struct romconfig *rc)
        ew (wd, 0x20, 0x00); /* ser.no. Byte 2 */
        ew (wd, 0x24, 0x00); /* ser.no. Byte 3 */
 
-       roms[0] = 55; // 7.0
-       roms[1] = 54; // 6.6
-       roms[2] = 53; // 6.0
-       roms[3] = 56; // guru
-       roms[4] = 87;
-       roms[5] = -1;
-
        wd->rombankswitcher = 0;
        wd->rombank = 0;
        slotsize = 65536;
@@ -3519,7 +3511,7 @@ addrbank *a2091_init (struct romconfig *rc)
        wd->rom_size = 16384;
        wd->rom_mask = wd->rom_size - 1;
        if (!rc->autoboot_disabled) {
-               struct zfile *z = read_device_from_romconfig(rc, roms);
+               struct zfile *z = read_device_from_romconfig(rc, ROMTYPE_A2091);
                if (z) {
                        wd->rom_size = zfile_size (z);
                        zfile_fread (wd->rom, wd->rom_size, 1, z);
@@ -3543,7 +3535,6 @@ addrbank *a2091_init (struct romconfig *rc)
 addrbank *a2090_init (struct romconfig *rc)
 {
        struct wd_state *wd = getscsi(rc);
-       int roms[6];
        int slotsize;
 
        if (!wd)
@@ -3573,9 +3564,6 @@ addrbank *a2090_init (struct romconfig *rc)
 
        //ew(wd, 0x30, 0x80); // SCSI only flag
 
-       roms[0] = 122;
-       roms[1] = -1;
-
        wd->rombankswitcher = 0;
        wd->rombank = 0;
        slotsize = 65536;
@@ -3584,7 +3572,7 @@ addrbank *a2090_init (struct romconfig *rc)
        wd->rom_size = 16384;
        wd->rom_mask = wd->rom_size - 1;
        if (!rc->autoboot_disabled) {
-               struct zfile *z = read_device_from_romconfig(rc, roms);
+               struct zfile *z = read_device_from_romconfig(rc, ROMTYPE_A2090);
                if (z) {
                        wd->rom_size = zfile_size (z);
                        zfile_fread (wd->rom, wd->rom_size, 1, z);
@@ -3648,7 +3636,6 @@ static bool is_gvp_accelerator(void)
 static addrbank *gvp_init(struct romconfig *rc, bool series2, bool accel)
 {
        struct wd_state *wd = getscsi(rc);
-       int roms[6];
        bool isscsi = true;
        const uae_u8 *ac;
        int romtype;
@@ -3672,11 +3659,6 @@ static addrbank *gvp_init(struct romconfig *rc, bool series2, bool accel)
        wd->gdmac.use_version = series2;
        wd->board_mask = 65535;
 
-       roms[0] = 109;
-       roms[1] = 110;
-       roms[2] = 111;
-       roms[3] = -1;
-
        wd->rom_size = 32768;
        wd->rom = xcalloc(uae_u8, 2 * wd->rom_size);
        memset(wd->rom, 0xff, 2 * wd->rom_size);
@@ -3704,7 +3686,7 @@ static addrbank *gvp_init(struct romconfig *rc, bool series2, bool accel)
        xfree(wd->gdmac.buffer);
        wd->gdmac.buffer = xcalloc(uae_u8, 16384);
        if (!rc->autoboot_disabled) {
-               struct zfile *z = read_device_from_romconfig(rc, roms);
+               struct zfile *z = read_device_from_romconfig(rc, ROMTYPE_GVPS2);
                if (z) {
                        int size = zfile_size(z);
                        if (series2) {
index f5c421907471ad9087bbd1eeae9719bbbb216793..210f1f791585551a95fdcdaaacaf78e6bf8f08b5 100644 (file)
@@ -169,6 +169,7 @@ struct card_data
        struct romconfig *rc;
        const TCHAR *name;
        int flags;
+       int zorro;
 };
 
 static struct card_data cards[MAX_EXPANSION_BOARD_SPACE];
@@ -509,10 +510,19 @@ void expamem_next (addrbank *mapped, addrbank *next)
 
        expamem_init_clear();
        expamem_init_clear_zero();
-       ++ecard;
-       if (ecard < cardno) {
-               call_card_init(ecard);
-       } else {
+       for (;;) {
+               ++ecard;
+               if (ecard >= cardno)
+                       break;
+               struct card_data *ec = &cards[ecard];
+               if (ec->initrc && ec->zorro == BOARD_NONAUTOCONFIG) {
+                       ec->initrc(cards[ecard].rc);
+               } else {
+                       call_card_init(ecard);
+                       break;
+               }
+       }
+       if (ecard >= cardno) {
                expamem_init_clear2();
                expamem_init_last();
        }
@@ -1903,11 +1913,13 @@ static void add_cpu_expansions(int zorro)
                cards[cardno].name = cst->name;
                cards[cardno].initrc = cst->init;
                cards[cardno].rc = rc;
+               cards[cardno].zorro = zorro;
                cards[cardno++].map = NULL;
                if (cst->init2) {
                        cards[cardno].flags = cst->initflag;
                        cards[cardno].name = cst->name;
                        cards[cardno].initrc = cst->init2;
+                       cards[cardno].zorro = zorro;
                        cards[cardno++].map = NULL;
                }
        }
@@ -1950,12 +1962,14 @@ static void add_expansions(int zorro)
                                                cards[cardno].name = ert->name;
                                                cards[cardno].initrc = ert->init;
                                                cards[cardno].rc = rc;
+                                               cards[cardno].zorro = zorro;
                                                cards[cardno++].map = NULL;
                                                if (ert->init2) {
                                                        cards[cardno].flags = 0;
                                                        cards[cardno].name = ert->name;
                                                        cards[cardno].initrc = ert->init2;
                                                        cards[cardno].rc = rc;
+                                                       cards[cardno].zorro = zorro;
                                                        cards[cardno++].map = NULL;
                                                }
                                        }
@@ -2552,7 +2566,7 @@ static const struct expansionboardsettings bridge_settings[] = {
        }
 };
 
-static const struct expansionboardsettings x86at_bridge_settings[] = {
+static const struct expansionboardsettings x86at286_bridge_settings[] = {
        {
                // 14
                _T("Default video\0") _T("Monochrome\0") _T("Color\0"),
@@ -2566,8 +2580,8 @@ static const struct expansionboardsettings x86at_bridge_settings[] = {
                false
        },
        {       // 16 - 18
-               _T("Memory\0") _T("1M\0") _T("2M\0") _T("4M\0") _T("8M\0") _T("16M\0") _T("32M\0"),
-               _T("memory\0") _T("1M\0") _T("2M\0") _T("4M\0") _T("8M\0") _T("16M\0") _T("32M\0"),
+               _T("Memory\0") _T("1M\0") _T("2M\0") _T("4M\0") _T("8M\0") _T("16M\0"),
+               _T("memory\0") _T("1M\0") _T("2M\0") _T("4M\0") _T("8M\0") _T("16M\0"),
                true, false, 0
        },
        {       // 19 - 20
@@ -2580,11 +2594,47 @@ static const struct expansionboardsettings x86at_bridge_settings[] = {
                _T("fpu"),
                false, false, 1
        },
+       {       // 23 - 25
+               _T("CPU Arch\0") _T("auto") _T("386\0") _T("386_prefetch\0") _T("386_slow\0") _T("486_slow\0") _T("486_prefetch\0") _T("pentium_slow\0"), 
+               _T("cpuarch\0") _T("auto") _T("386\0") _T("386_prefetch\0") _T("386_slow\0") _T("486_slow\0") _T("486_prefetch\0") _T("pentium_slow\0"),
+               true, false, 0
+       },
        {
                NULL
        }
 };
 
+static const struct expansionboardsettings x86at386_bridge_settings[] = {
+       {
+               // 15
+               _T("Keyboard lock"),
+               _T("keylock"),
+               false, false, 15
+       },
+       {       // 16 - 18
+               _T("Memory\0") _T("1M\0") _T("2M\0") _T("4M\0") _T("8M\0") _T("16M\0") _T("32M\0") _T("64M\0"),
+               _T("memory\0") _T("1M\0") _T("2M\0") _T("4M\0") _T("8M\0") _T("16M\0") _T("32M\0") _T("64M\0"),
+               true, false, 0
+       },
+       {       // 19 - 20
+               _T("CPU core\0") _T("DOSBox simple\0") _T("DOSBox normal\0") _T("DOSBox full\0") _T("DOSBox auto\0"),
+               _T("cpu\0") _T("dbsimple\0") _T("dbnormal\0") _T("dbfull\0") _T("dbauto\0"),
+               true, false, 0
+       },
+       {       // 22
+               _T("FPU"),
+               _T("fpu"),
+               false, false, 1
+       },
+       {       // 23 - 25
+               _T("CPU Arch\0") _T("auto\0") _T("386\0") _T("386_prefetch\0") _T("386_slow\0") _T("486_slow\0") _T("486_prefetch\0") _T("pentium_slow\0"),
+               _T("cpuarch\0") _T("auto\0") _T("386\0") _T("386_prefetch\0") _T("386_slow\0") _T("486_slow\0") _T("486_prefetch\0") _T("pentium_slow\0"),
+               true, false, 0
+       },
+       {
+               NULL
+       }
+};
 
 static const struct expansionboardsettings x86_bridge_settings[] = {
        {
@@ -2673,6 +2723,17 @@ static const struct expansionboardsettings x86_bridge_sidecar_settings[] = {
        }
 };
 
+static const struct expansionboardsettings x86_athdxt_settings[] = {
+       {
+               _T("ROM Address\0") _T("0xCC000\0") _T("0xDC000\0") _T("0xEC000\0"),
+               _T("baseaddress\0") _T("0xcc000\0") _T("0xdc000\0") _T("0xec000\0"),
+               true
+       },
+       {
+               NULL
+       }
+};
+
 static void fastlane_memory_callback(struct romconfig *rc, uae_u8 *ac, int size)
 {
        struct zfile *z = read_device_from_romconfig(rc, NULL);
@@ -3082,7 +3143,10 @@ const struct expansionromtype expansionroms[] = {
                _T("x86athdxt"), _T("XTIDE Universal BIOS HD"), _T("x86"),
                x86_at_hd_init_xt, NULL, x86_add_at_hd_unit_xt, ROMTYPE_X86_XT_IDE | ROMTYPE_NONE, 0, 0, BOARD_NONAUTOCONFIG, true,
                NULL, 0,
-               false, EXPANSIONTYPE_IDE
+               false, EXPANSIONTYPE_IDE,
+               0, 0, 0, false, NULL,
+               false,
+               x86_athdxt_settings
        },
 
        {
@@ -3119,7 +3183,7 @@ const struct expansionromtype expansionroms[] = {
                false, EXPANSIONTYPE_X86_BRIDGE,
                0, 0, 0, false, NULL,
                false,
-               x86at_bridge_settings
+               x86at286_bridge_settings
        },
        {
                _T("a2386"), _T("A2386SX"), _T("Commodore"),
@@ -3128,7 +3192,7 @@ const struct expansionromtype expansionroms[] = {
                false, EXPANSIONTYPE_X86_BRIDGE,
                0, 0, 0, false, NULL,
                false,
-               x86at_bridge_settings
+               x86at386_bridge_settings
        },
 
        // only here for rom selection
index 6c818ea8761351b4ce1ee3b2ce96295d5a351bfb..0bbe894ef78caf9242ea1d8edc4585ebdd8c34df 100644 (file)
--- a/gayle.cpp
+++ b/gayle.cpp
@@ -552,7 +552,7 @@ static bool isdataflyerscsiplus(uaecptr addr, uae_u32 *v, int size)
                                break;
                                case 3:
                                *v = 0;
-                               if (ide_irq_check(idedrive[0]))
+                               if (ide_irq_check(idedrive[0], false))
                                        *v = dataflyer_byte;
                                break;
                                case 4: // select SCSI
index f5bd7755834aa504ae79dad9ee3fd7ed1e6a0e58..717be7f7aa1104837d12be2a3cb11072037a6743 100644 (file)
@@ -202,14 +202,14 @@ static void add_ide_standard_unit(int ch, struct uaedev_config_info *ci, struct
        init_ide(ideb, idetype + ci->controller_type_unit, maxunit, byteswap, adide);
 }
 
-static bool ide_interrupt_check(struct ide_board *board)
+static bool ide_interrupt_check(struct ide_board *board, bool edge_triggered)
 {
        if (!board->configured)
                return false;
        bool irq = false;
        for (int i = 0; i < MAX_IDE_PORTS_BOARD; i++) {
                if (board->ide[i] && !irq) {
-                       irq = ide_irq_check(board->ide[i]);
+                       irq = ide_irq_check(board->ide[i], edge_triggered);
                }
        }
 #if 0
@@ -220,11 +220,11 @@ static bool ide_interrupt_check(struct ide_board *board)
        return irq;
 }
 
-static bool ide_rethink(struct ide_board *board)
+static bool ide_rethink(struct ide_board *board, bool edge_triggered)
 {
        bool irq = false;
        if (board->configured) {
-               if (board->intena && ide_interrupt_check(board)) {
+               if (board->intena && ide_interrupt_check(board, edge_triggered)) {
                        irq = true;
                }
        }
@@ -238,12 +238,13 @@ void idecontroller_rethink(void)
        bool irq = false;
        for (int i = 0; ide_boards[i]; i++) {
                if (ide_boards[i] == x86_at_ide_board[0] || ide_boards[i] == x86_at_ide_board[1]) {
-                       bool x86irq = ide_rethink(ide_boards[i]);
+                       bool x86irq = ide_rethink(ide_boards[i], true);
                        if (x86irq) {
+                               //write_log(_T("x86 IDE IRQ\n"));
                                x86_doirq(ide_boards[i] == x86_at_ide_board[0] ? 14 : 15);
                        }
                } else {
-                       irq |= ide_rethink(ide_boards[i]);
+                       irq |= ide_rethink(ide_boards[i], false);
                }
        }
        if (irq && !(intreq & 0x0008)) {
@@ -261,7 +262,7 @@ void idecontroller_hsync(void)
                                        ide_interrupt_hsync(board->ide[j]);
                                }
                        }
-                       if (ide_interrupt_check(board)) {
+                       if (ide_interrupt_check(board, false)) {
                                idecontroller_rethink();
                        }
                }
@@ -303,6 +304,16 @@ static bool is_gvp1_intreq(uaecptr addr)
        return false;
 }
 
+static bool get_ide_is_8bit(struct ide_board *board)
+{
+       struct ide_hdf *ide = board->ide[0];
+       if (!ide)
+               return false;
+       if (ide->ide_drv)
+               ide = ide->pair;
+       return ide->mode_8bit;
+}
+
 static uae_u32 get_ide_reg_multi(struct ide_board *board, int reg, int portnum, int dataportsize)
 {
        struct ide_hdf *ide = board->ide[portnum];
@@ -496,7 +507,7 @@ static uae_u32 ide_read_byte(struct ide_board *board, uaecptr addr)
                                v = masoboshi_ncr9x_scsi_get(oaddr, getidenum(board, masoboshi_board));
                } else if (addr == 0xf040) {
                        v = 1;
-                       if (ide_irq_check(board->ide[0])) {
+                       if (ide_irq_check(board->ide[0], false)) {
                                v |= 2;
                                board->irq = true;
                        }
@@ -575,13 +586,13 @@ static uae_u32 ide_read_byte(struct ide_board *board, uaecptr addr)
 #if DEBUG_IDE_GVP
                                        write_log(_T("GVP IRQ %02x\n"), v);
 #endif
-                                       ide_interrupt_check(board);
+                                       ide_interrupt_check(board, false);
                                } else if (is_gvp1_intreq(addr)) {
                                        v = board->irq ? 0x80 : 0x00;
 #if DEBUG_IDE_GVP
                                        write_log(_T("GVP IRQ %02x\n"), v);
 #endif
-                                       ide_interrupt_check(board);
+                                       ide_interrupt_check(board, false);
                                }
                        }
                } else {
@@ -1103,7 +1114,6 @@ static const uae_u8 gvp_ide1_controller_autoconfig[16] = { 0xd1, 0x08, 0x00, 0x0
 addrbank *gvp_ide_rom_autoconfig_init(struct romconfig *rc)
 {
        struct ide_board *ide = getide(rc);
-       int roms[2];
        const uae_u8 *autoconfig;
 
        if (ISCPUBOARD(BOARD_GVP, BOARD_GVP_SUB_A3001SI)) {
@@ -1114,13 +1124,10 @@ addrbank *gvp_ide_rom_autoconfig_init(struct romconfig *rc)
                gvp_ide_controller_board->intena = true;
                ide->intena = true;
                gvp_ide_controller_board->configured = -1;
-               roms[0] = 114;
-               roms[1] = -1;
        } else {
                ide->bank = &gvp_ide_rom_bank;
                autoconfig = gvp_ide2_rom_autoconfig;
                ide->rom_size = 16384;
-               roms[0] = -1;
        }
        ide->configured = 0;
        ide->mask = 65536 - 1;
@@ -1132,7 +1139,7 @@ addrbank *gvp_ide_rom_autoconfig_init(struct romconfig *rc)
        memset(ide->rom, 0xff, ide->rom_size);
        ide->rom_mask = ide->rom_size - 1;
 
-       load_rom_rc(rc, roms, ide->rom_size, 0, ide->rom, ide->rom_size, LOADROM_FILL);
+       load_rom_rc(rc, ROMTYPE_CB_A3001S1, ide->rom_size, 0, ide->rom, ide->rom_size, LOADROM_FILL);
        for (int i = 0; i < 16; i++) {
                uae_u8 b = autoconfig[i];
                ew(ide, i * 4, b);
@@ -1172,7 +1179,6 @@ static const uae_u8 alfplus_autoconfig[16] = { 0xd1, 38, 0x00, 0x00, 0x08, 0x2c,
 addrbank *alf_init(struct romconfig *rc)
 {
        struct ide_board *ide = getide(rc);
-       int roms[2];
        bool alfplus = cfgfile_board_enabled(&currprefs, ROMTYPE_ALFAPLUS, 0);
 
        if (!ide)
@@ -1180,9 +1186,6 @@ addrbank *alf_init(struct romconfig *rc)
 
        ide->configured = 0;
 
-       roms[0] = alfplus ? 118 : 117;
-       roms[1] = -1;
-
        ide->configured = 0;
        ide->bank = &ide_bank_generic;
        ide->type = ALF_IDE;
@@ -1203,7 +1206,7 @@ addrbank *alf_init(struct romconfig *rc)
        }
 
        if (!rc->autoboot_disabled) {
-               struct zfile *z = read_device_from_romconfig(rc, roms);
+               struct zfile *z = read_device_from_romconfig(rc, alfplus ? ROMTYPE_ALFAPLUS : ROMTYPE_ALFA);
                if (z) {
                        for (int i = 0; i < 0x1000 / 2; i++) {
                                uae_u8 b;
@@ -1241,13 +1244,11 @@ const uae_u8 apollo_autoconfig_cpuboard_060[16] = { 0xd2, 0x23, 0x00, 0x00, 0x22
 static addrbank *apollo_init(struct romconfig *rc, bool cpuboard)
 {
        struct ide_board *ide = getide(rc);
-       int roms[2];
        const uae_u8 *autoconfig;
 
        if (!ide)
                return &expamem_null;
 
-       roms[0] = -1;
        ide->configured = 0;
        ide->bank = &ide_bank_generic;
        ide->rom_size = 32768;
@@ -1272,7 +1273,7 @@ static addrbank *apollo_init(struct romconfig *rc, bool cpuboard)
        }
        if (cpuboard) {
                ide->mask = 131072 - 1;
-               struct zfile *z = read_device_from_romconfig(rc, roms);
+               struct zfile *z = read_device_from_romconfig(rc, ROMTYPE_APOLLO);
                if (z) {
                        int len = zfile_size(z);
                        // skip 68060 $f0 ROM block
@@ -1287,7 +1288,7 @@ static addrbank *apollo_init(struct romconfig *rc, bool cpuboard)
                }
        } else {
                ide->mask = 65536 - 1;
-               load_rom_rc(rc, roms, 16384, 0, ide->rom, 32768, LOADROM_EVENONLY_ODDONE | LOADROM_FILL);
+               load_rom_rc(rc, ROMTYPE_APOLLO, 16384, 0, ide->rom, 32768, LOADROM_EVENONLY_ODDONE | LOADROM_FILL);
        }
        return ide->bank;
 }
@@ -1309,15 +1310,12 @@ void apollo_add_ide_unit(int ch, struct uaedev_config_info *ci, struct romconfig
 addrbank *masoboshi_init(struct romconfig *rc)
 {
        struct ide_board *ide = getide(rc);
-       int roms[2];
 
        if (!ide)
                return &expamem_null;
 
        ide->configured = 0;
 
-       roms[0] = 120;
-       roms[1] = -1;
        ide->configured = 0;
        ide->bank = &ide_bank_generic;
        ide->type = MASOBOSHI_IDE;
@@ -1330,7 +1328,7 @@ addrbank *masoboshi_init(struct romconfig *rc)
        memset(ide->acmemory, 0xff, sizeof ide->acmemory);
        ide->rom_mask = ide->rom_size - 1;
 
-       load_rom_rc(rc, roms, 32768, 0, ide->rom, 65536, LOADROM_EVENONLY_ODDONE | LOADROM_FILL);
+       load_rom_rc(rc, ROMTYPE_MASOBOSHI, 32768, 0, ide->rom, 65536, LOADROM_EVENONLY_ODDONE | LOADROM_FILL);
        ide->subtype = rc->subtype;
        if (rc && rc->autoboot_disabled)
                memcpy(ide->acmemory, ide->rom + 0x100, sizeof ide->acmemory);
@@ -1363,10 +1361,7 @@ static const uae_u8 adide_autoconfig[16] = { 0xd1, 0x02, 0x00, 0x00, 0x08, 0x17,
 addrbank *adide_init(struct romconfig *rc)
 {
        struct ide_board *ide = getide(rc);
-       int roms[2];
 
-       roms[0] = 129;
-       roms[1] = -1;
        ide->configured = 0;
        ide->keepautoconfig = false;
        ide->bank = &ide_bank_generic;
@@ -1379,7 +1374,7 @@ addrbank *adide_init(struct romconfig *rc)
        memset(ide->rom, 0xff, ide->rom_size);
        ide->rom_mask = ide->rom_size - 1;
        if (!rc->autoboot_disabled) {
-               load_rom_rc(rc, roms, 16384, 0, ide->rom, 32768, LOADROM_EVENONLY_ODDONE | LOADROM_FILL);
+               load_rom_rc(rc, ROMTYPE_ADIDE, 16384, 0, ide->rom, 32768, LOADROM_EVENONLY_ODDONE | LOADROM_FILL);
        }
        for (int i = 0; i < 16; i++) {
                uae_u8 b = adide_autoconfig[i];
@@ -1396,10 +1391,7 @@ void adide_add_ide_unit(int ch, struct uaedev_config_info *ci, struct romconfig
 addrbank *mtec_init(struct romconfig *rc)
 {
        struct ide_board *ide = getide(rc);
-       int roms[2];
 
-       roms[0] = 130;
-       roms[1] = -1;
        ide->configured = 0;
        ide->bank = &ide_bank_generic;
        ide->rom_size = 32768;
@@ -1410,7 +1402,7 @@ addrbank *mtec_init(struct romconfig *rc)
        ide->rom = xcalloc(uae_u8, ide->rom_size);
        memset(ide->rom, 0xff, ide->rom_size);
        ide->rom_mask = ide->rom_size - 1;
-       load_rom_rc(rc, roms, 16384, !rc->autoboot_disabled ? 16384 : 0, ide->rom, 32768, LOADROM_EVENONLY_ODDONE | LOADROM_FILL);
+       load_rom_rc(rc, ROMTYPE_MTEC, 16384, !rc->autoboot_disabled ? 16384 : 0, ide->rom, 32768, LOADROM_EVENONLY_ODDONE | LOADROM_FILL);
        memcpy(ide->acmemory, ide->rom, sizeof ide->acmemory);
        return ide->bank;
 }
@@ -1423,11 +1415,7 @@ void mtec_add_ide_unit(int ch, struct uaedev_config_info *ci, struct romconfig *
 addrbank *rochard_init(struct romconfig *rc)
 {
        struct ide_board *ide = getide(rc);
-       int roms[3];
 
-       roms[0] = 138;
-       roms[1] = 146;
-       roms[2] = -1;
        ide->configured = 0;
        ide->bank = &ide_bank_generic;
        ide->rom_size = 32768;
@@ -1439,7 +1427,7 @@ addrbank *rochard_init(struct romconfig *rc)
        ide->rom = xcalloc(uae_u8, ide->rom_size);
        memset(ide->rom, 0xff, ide->rom_size);
        ide->rom_mask = ide->rom_size - 1;
-       load_rom_rc(rc, roms, 8192, !rc->autoboot_disabled ? 8192 : 0, ide->rom, 16384, 0);
+       load_rom_rc(rc, ROMTYPE_ROCHARD, 8192, !rc->autoboot_disabled ? 8192 : 0, ide->rom, 16384, 0);
        memcpy(ide->acmemory, ide->rom, sizeof ide->acmemory);
        return ide->bank;
 }
@@ -1462,7 +1450,7 @@ void rochard_add_idescsi_unit(int ch, struct uaedev_config_info *ci, struct romc
        }
 }
 
-extern void x86_xt_ide_bios(struct zfile*);
+extern void x86_xt_ide_bios(struct zfile*, struct romconfig*);
 static addrbank *x86_at_hd_init(struct romconfig *rc, int type)
 {
        struct ide_board *ide = getide(rc);
@@ -1476,7 +1464,7 @@ static addrbank *x86_at_hd_init(struct romconfig *rc, int type)
 
        struct zfile *f = read_device_from_romconfig(rc, NULL);
        if (f) {
-               x86_xt_ide_bios(f);
+               x86_xt_ide_bios(f, rc);
                zfile_fclose(f);
        }
 
@@ -1514,21 +1502,33 @@ static int x86_ide_reg(int portnum, int *unit)
                *unit = 0;
                return portnum & 7;
        }
+       if (portnum == 0x3f6) {
+               *unit = 0;
+               return 6 | IDE_SECONDARY;
+       }
        if (portnum >= 0x170 && portnum < 0x178) {
                *unit = 1;
                return portnum & 7;
        }
+       if (portnum == 0x376) {
+               *unit = 1;
+               return 6 | IDE_SECONDARY;
+       }
        if (portnum >= 0x300 && portnum < 0x310) {
                *unit = 2;
+               if (portnum < 0x308)
+                       return portnum & 7;
+               if (portnum == 0x308)
+                       return 8;
                if (portnum >= 0x308+6)
                        return (portnum & 7) | IDE_SECONDARY;
-               return portnum & 7;
        }
        return -1;
 }
 
 void x86_ide_hd_put(int portnum, uae_u16 v, int size)
 {
+
        if (portnum < 0) {
                for (int i = 0; i < MAX_DUPLICATE_EXPANSION_BOARDS; i++) {
                        struct ide_board *board = x86_at_ide_board[i];
@@ -1542,10 +1542,27 @@ void x86_ide_hd_put(int portnum, uae_u16 v, int size)
        if (regnum >= 0) {
                struct ide_board *board = x86_at_ide_board[unit];
                if (board) {
-                       if (size == 0)
-                               put_ide_reg_8bitdata(board, regnum, v);
-                       else
-                               put_ide_reg(board, regnum, v);
+#if 0
+                       if (regnum == 0 || regnum == 8)
+                               write_log(_T("WRITE %04x = %04x %d\n"), portnum, v, size);
+#endif
+                       if (size == 0) {
+                               if (get_ide_is_8bit(board)) {
+                                       v = get_ide_reg_8bitdata(board, regnum);
+                               } else {
+                                       if (regnum == 8) {
+                                               board->data_latch = v;
+                                       } else if (regnum == 0) {
+                                               v <<= 8;
+                                               v |= board->data_latch;
+                                               put_ide_reg(board, regnum, v);
+                                       } else {
+                                               put_ide_reg_8bitdata(board, regnum, v);
+                                       }
+                               }
+                       } else {
+                               put_ide_reg(board, regnum, (v >> 8) | (v << 8));
+                       }
                }
        }
 }
@@ -1557,11 +1574,28 @@ uae_u16 x86_ide_hd_get(int portnum, int size)
        if (regnum >= 0) {
                struct ide_board *board = x86_at_ide_board[unit];
                if (board) {
-                       if (size == 0)
-                               v = get_ide_reg_8bitdata(board, regnum);
-                       else
-                               v = get_ide_reg(board, regnum);
 
+                       if (size == 0) {
+                               if (get_ide_is_8bit(board)) {
+                                       v = get_ide_reg_8bitdata(board, regnum);
+                               } else {
+                                       if (regnum == 0) {
+                                               board->data_latch = get_ide_reg(board, regnum);
+                                               v = board->data_latch >> 8;
+                                       } else if (regnum == 8) {
+                                               v = board->data_latch;
+                                       } else {
+                                               v = get_ide_reg_8bitdata(board, regnum & 7);
+                                       }
+                               }
+                       } else {
+                               v = get_ide_reg(board, regnum);
+                               v = (v >> 8) | (v << 8);
+                       }
+#if 0
+                       if (regnum == 0 || regnum == 8)
+                               write_log(_T("READ %04x = %04x %d\n"), portnum, v, size);
+#endif
                }
        }
        return v;
index 54aad0dcbccf57419723deb37653a7fbbeb1a2bb..f9df21545cd7b3d63eb7e13e0578602113d4d82b 100644 (file)
@@ -4,6 +4,7 @@ void devices_vsync_pre(void);
 void devices_vsync_post(void);
 void devices_hsync(void);
 void devices_rethink(void);
+void devices_syncchange(void);
 void devices_update_sound(double clk, double syncadjust);
 void devices_update_sync(double svpos, double syncadjust);
 void reset_all_systems(void);
index 689e4b34601161482ccb7e97abe9a4a72a8f98d4..a0f2855d1526c8499cbb2dc7d17f49eb54595c76 100644 (file)
@@ -43,6 +43,7 @@ struct ide_board
        int type;
        int userdata;
        int subtype;
+       uae_u16 data_latch;
        struct romconfig *rc, *original_rc;
        struct ide_board **self_ptr;
 };
@@ -57,6 +58,7 @@ struct ide_hdf
        struct ide_hdf *pair; // master<>slave
        struct ide_thread_state *its;
        bool byteswap;
+       int byteswapped_buffer;
        bool adide;
 
        uae_u8 *secbuf;
@@ -74,12 +76,14 @@ struct ide_hdf
        uae_u8 multiple_mode;
        int irq_delay;
        int irq;
+       bool irq_new;
        int num;
        int blocksize;
        int maxtransferstate;
        int ata_level;
        int ide_drv;
        int media_type;
+       bool mode_8bit;
 
        bool atapi;
        bool atapi_drdy;
@@ -107,7 +111,7 @@ void ide_put_data_8bit(struct ide_hdf *ide, uae_u8 v);
 uae_u8 ide_get_data_8bit(struct ide_hdf *ide);
 
 bool ide_interrupt_hsync(struct ide_hdf *ide);
-bool ide_irq_check(struct ide_hdf *ide);
+bool ide_irq_check(struct ide_hdf *ide, bool edge_triggered);
 bool ide_drq_check(struct ide_hdf *ide);
 bool ide_isdrive(struct ide_hdf *ide);
 void ide_initialize(struct ide_hdf **idetable, int chpair);
index 035ef895203914906243f8dbfc3063898e4d8d0a..868e9b95ccc5c520bc69eb0ec77620f3151730d5 100644 (file)
@@ -158,6 +158,7 @@ extern void getromname (const struct romdata*, TCHAR*);
 extern struct romdata *getromdatabyname (const TCHAR*);
 extern struct romlist *getromlistbyids (const int *ids, const TCHAR *romname);
 extern struct romdata *getromdatabyids (const int *ids);
+extern struct romlist *getromlistbyromtype(uae_u32 romtype);
 extern void romwarning(const int *ids);
 extern struct romlist *getromlistbyromdata (const struct romdata *rd);
 extern void romlist_add (const TCHAR *path, struct romdata *rd);
@@ -165,7 +166,7 @@ extern TCHAR *romlist_get (const struct romdata *rd);
 extern void romlist_clear (void);
 extern struct zfile *read_rom (struct romdata *rd);
 extern struct zfile *read_rom_name (const TCHAR *filename);
-extern struct zfile *read_device_from_romconfig(struct romconfig *rc, const int *roms);
+extern struct zfile *read_device_from_romconfig(struct romconfig *rc, uae_u32 romtype);
 
 extern int load_keyring (struct uae_prefs *p, const TCHAR *path);
 extern uae_u8 *target_load_keyfile (struct uae_prefs *p, const TCHAR *path, int *size, TCHAR *name);
@@ -199,4 +200,4 @@ struct boardromconfig *get_boardromconfig(struct uae_prefs *p, int romtype, int
 #define LOADROM_ONEFILL 4
 #define LOADROM_ZEROFILL 8
 #define LOADROM_ODDFILL(x) ((x << 16) | LOADROM_EVENONLY)
-bool load_rom_rc(struct romconfig *rc, const int *roms, int maxfilesize, int fileoffset, uae_u8 *rom, int maxromsize, int flags);
\ No newline at end of file
+bool load_rom_rc(struct romconfig *rc, uae_u32 romtype, int maxfilesize, int fileoffset, uae_u8 *rom, int maxromsize, int flags);
\ No newline at end of file
index fbeda730d2fb2aa0a7b8708a6e836f7f25bac54e..baaa8b57cdf14fcd724e37f10af40537ad35e577 100644 (file)
@@ -1362,7 +1362,6 @@ void ncr9x_reset(void)
 
 addrbank *ncr_fastlane_autoconfig_init(struct romconfig *rc)
 {
-       int roms[2];
        struct ncr9x_state *ncr = getscsi(rc);
 
        xfree(ncr->rom);
@@ -1371,9 +1370,6 @@ addrbank *ncr_fastlane_autoconfig_init(struct romconfig *rc)
        if (!ncr)
                return &expamem_null;
 
-       roms[0] = 102;
-       roms[1] = -1;
-
        ncr->enabled = true;
        memset (ncr->acmemory, 0xff, sizeof ncr->acmemory);
        ncr->rom_start = 0x800;
@@ -1385,7 +1381,7 @@ addrbank *ncr_fastlane_autoconfig_init(struct romconfig *rc)
 
        ncr9x_reset_board(ncr);
 
-       struct zfile *z = read_device_from_romconfig(rc, roms);
+       struct zfile *z = read_device_from_romconfig(rc, ROMTYPE_FASTLANE);
        ncr->rom = xcalloc (uae_u8, FASTLANE_ROM_SIZE * 4);
        if (z) {
                // memory board at offset 0x100
@@ -1421,7 +1417,6 @@ static const uae_u8 oktagon_eeprom[16] =
 
 addrbank *ncr_oktagon_autoconfig_init(struct romconfig *rc)
 {
-       int roms[2];
        struct ncr9x_state *ncr = getscsi(rc);
 
        if (!ncr)
@@ -1432,9 +1427,6 @@ addrbank *ncr_oktagon_autoconfig_init(struct romconfig *rc)
        eeprom_free(ncr->eeprom);
        ncr->eeprom = NULL;
 
-       roms[0] = 103;
-       roms[1] = -1;
-
        ncr->enabled = true;
        memset (ncr->acmemory, 0xff, sizeof ncr->acmemory);
        ncr->rom_start = 0;
@@ -1454,7 +1446,7 @@ addrbank *ncr_oktagon_autoconfig_init(struct romconfig *rc)
        ncr9x_reset_board(ncr);
 
        if (!rc->autoboot_disabled) {
-               struct zfile *z = read_device_from_romconfig(rc, roms);
+               struct zfile *z = read_device_from_romconfig(rc, ROMTYPE_OKTAGON);
                if (z) {
                        // memory board at offset 0x100
                        memset(ncr->rom, 0xff, OKTAGON_ROM_SIZE * 4);
@@ -1486,7 +1478,6 @@ addrbank *ncr_oktagon_autoconfig_init(struct romconfig *rc)
 
 addrbank *ncr_dkb_autoconfig_init(struct romconfig *rc)
 {
-       int roms[2];
        struct ncr9x_state *ncr = getscsi(rc);
 
        if (!ncr)
@@ -1495,9 +1486,6 @@ addrbank *ncr_dkb_autoconfig_init(struct romconfig *rc)
        xfree(ncr->rom);
        ncr->rom = NULL;
 
-       roms[0] = 112;
-       roms[1] = -1;
-
        ncr->enabled = true;
        memset (ncr->acmemory, 0xff, sizeof ncr->acmemory);
        ncr->rom_start = 0;
@@ -1510,7 +1498,7 @@ addrbank *ncr_dkb_autoconfig_init(struct romconfig *rc)
 
        ncr9x_reset_board(ncr);
 
-       struct zfile *z = read_device_from_romconfig(rc, roms);
+       struct zfile *z = read_device_from_romconfig(rc, ROMTYPE_CB_DKB12x0);
        ncr->rom = xcalloc (uae_u8, DKB_ROM_SIZE * 2);
        if (z) {
                // memory board at offset 0x100
@@ -1538,7 +1526,6 @@ addrbank *ncr_dkb_autoconfig_init(struct romconfig *rc)
 
 addrbank *ncr_ematrix_autoconfig_init(struct romconfig *rc)
 {
-       int roms[2];
        struct ncr9x_state *ncr = getscsi(rc);
 
        if (!ncr)
@@ -1547,9 +1534,6 @@ addrbank *ncr_ematrix_autoconfig_init(struct romconfig *rc)
        xfree(ncr->rom);
        ncr->rom = NULL;
 
-       roms[0] = 144;
-       roms[1] = -1;
-
        ncr->enabled = true;
        memset(ncr->acmemory, 0xff, sizeof ncr->acmemory);
        ncr->rom_start = 0;
@@ -1562,7 +1546,7 @@ addrbank *ncr_ematrix_autoconfig_init(struct romconfig *rc)
 
        ncr9x_reset_board(ncr);
 
-       struct zfile *z = read_device_from_romconfig(rc, roms);
+       struct zfile *z = read_device_from_romconfig(rc, ROMTYPE_CB_EMATRIX);
        ncr->rom = xcalloc(uae_u8, 65536);
        if (z) {
                int i;
index c7a6efee4f63a2bf0ca83b9a86e56b048b340573..d7553c0b0d5d261f82d62f4b54765f47328d4170 100644 (file)
@@ -762,7 +762,6 @@ static const uae_u8 warpengine_a4000_autoconfig[16] = {
 
 addrbank *ncr710_warpengine_autoconfig_init(struct romconfig *rc)
 {
-       int roms[2];
        struct ncr_state *ncr = getscsi(rc);
 
        if (!ncr)
@@ -772,9 +771,6 @@ addrbank *ncr710_warpengine_autoconfig_init(struct romconfig *rc)
        xfree(ncr->rom);
        ncr->rom = NULL;
 
-       roms[0] = 93;
-       roms[1] = -1;
-
        ncr->enabled = true;
        memset (ncr->acmemory, 0xff, sizeof ncr->acmemory);
        ncr->rom_start = 0x10;
@@ -795,7 +791,7 @@ addrbank *ncr710_warpengine_autoconfig_init(struct romconfig *rc)
                ew(ncr, i * 4, b);
        }
        ncr->rom = xcalloc (uae_u8, WARP_ENGINE_ROM_SIZE * 4);
-       struct zfile *z = read_device_from_romconfig(rc, roms);
+       struct zfile *z = read_device_from_romconfig(rc, ROMTYPE_CB_WENGINE);
        if (z) {
                for (int i = 0; i < WARP_ENGINE_ROM_SIZE; i++) {
                        uae_u8 b = 0xff;
@@ -816,7 +812,6 @@ addrbank *ncr710_warpengine_autoconfig_init(struct romconfig *rc)
 addrbank *ncr710_a4091_autoconfig_init (struct romconfig *rc)
 {
        struct ncr_state *ncr = getscsi(rc);
-       int roms[3];
 
        if (!ncr)
                return &expamem_null;
@@ -824,10 +819,6 @@ addrbank *ncr710_a4091_autoconfig_init (struct romconfig *rc)
        xfree(ncr->rom);
        ncr->rom = NULL;
 
-       roms[0] = 58;
-       roms[1] = 57;
-       roms[2] = -1;
-
        ncr->enabled = true;
        memset (ncr->acmemory, 0xff, sizeof ncr->acmemory);
        ncr->rom_start = 0;
@@ -838,7 +829,7 @@ addrbank *ncr710_a4091_autoconfig_init (struct romconfig *rc)
 
        ncr_reset_board(ncr);
 
-       struct zfile *z = read_device_from_romconfig(rc, roms);
+       struct zfile *z = read_device_from_romconfig(rc, ROMTYPE_A4091);
        if (z) {
                ncr->rom = xmalloc (uae_u8, A4091_ROM_SIZE * 4);
                for (int i = 0; i < A4091_ROM_SIZE; i++) {
index 49fffbc56d615b16189afc66cb2b7f28b6647b6c..4f78779bbea572f9372d41912b940275ca71921f 100644 (file)
@@ -95,7 +95,7 @@ struct romdata *getromdatabypath (const TCHAR *path)
        return NULL;
 }
 
-#define NEXT_ROM_ID 147
+#define NEXT_ROM_ID 156
 
 static struct romheader romheaders[] = {
        { _T("Freezer Cartridges"), 1 },
@@ -450,6 +450,29 @@ static struct romdata roms[] = {
        { _T("Picasso IV"), 7, 4, 7, 4, _T("PIV\0"), 131072, 91, 0, 0, ROMTYPE_PIV, 0, 0, NULL,
        0xa8133e7e, 0xcafafb91,0x6f16b9f3,0xec9b49aa,0x4b40eb4e,0xeceb5b5b },
 
+       { _T("A1060 BIOS 2.06"), 2, 6, 2, 6, _T("A1060\0"), 16384, 147, 0, 0, ROMTYPE_A1060, 0, 0, _T("380619-03"),
+       0x185f2bbd, 0xeba74ad1,0x000a5351,0xa5d99179,0xbf75f831,0xac2d2402, NULL, NULL },
+       { _T("A2088 BIOS 3.4"), 3, 4, 3, 4, _T("A2088\0"), 16384, 148, 0, 0, ROMTYPE_A2088, 0, 0, _T("380788-04"),
+       0x05552160, 0xd1defdee,0x1c0eae41,0x07d81e26,0x74915cd2,0x9d352f2e, NULL, NULL },
+       { _T("A2088 BIOS 3.6.1"), 3, 61, 3, 61, _T("A2088\0"), 16384, 149, 0, 0, ROMTYPE_A2088, 0, 0, _T("380788-06"),
+       0x5fd93e56, 0xc1b707a8,0xa62907d7,0x5299f10a,0xa60efd1f,0x44514b26, NULL, NULL },
+       { _T("A2088T BIOS 4.10"), 4, 10, 4, 11, _T("A2088T\0"), 32768, 150, 0, 0, ROMTYPE_A2088T, 0, 0, _T("390657-02"),
+       0x20c5d1a9, 0x08e3fbb7,0x28dfc514,0x24083313,0x373ea7a5,0xa2c3e965, NULL, NULL },
+       { _T("A2088T BIOS 4.11"), 4, 11, 4, 11, _T("A2088T\0"), 32768, 151, 0, 0, ROMTYPE_A2088T, 0, 0, _T("390547-02"),
+       0x074bc9b0, 0x2a3f56bc,0xe395f203,0x46eb68c4,0xade7153e,0x3e69f892, NULL, NULL },
+       { _T("A2088T BIOS 4.12"), 4, 12, 4, 12, _T("A2088T\0"), 32768, 152, 0, 0, ROMTYPE_A2088T, 0, 0, _T("390547-03"),
+       0x92447176, 0x582fa254,0x73aa2679,0xefcd41a5,0xbdadf1a2,0x6a87a75f, NULL, NULL },
+       { _T("A2286 BIOS 3.6"), 3, 6, 3, 6, _T("A2286\0"), 32768, 153, 0, 0, ROMTYPE_A2286, 0, 0, NULL,
+       0x63d75f70, 0x9f5d6c78,0x656d2fe7,0x36608644,0x771b6d30,0x31083264, NULL, NULL },
+       ALTROMPN(153, 1, 1, 16384, ROMTYPE_ODD  | ROMTYPE_8BIT, _T("380682-03"), 0xb3f76402, 0xef9ba5f2, 0x2714ad6d, 0xfa5e0aef, 0x2d09ce83, 0x578ee26d)
+       ALTROMPN(153, 1, 2, 16384, ROMTYPE_EVEN | ROMTYPE_8BIT, _T("380683-03"), 0xab053693, 0x75229d80, 0x443fad78, 0xa298d04b, 0x37c8e6c3, 0x2c1b6df0)
+       { _T("A2286 BIOS 4.2"), 4, 2, 4, 2, _T("A2286\0"), 32768, 154, 0, 0, ROMTYPE_A2286, 0, 0, NULL,
+       0xd572e205, 0x74fdf0f8,0x325fbc41,0x2b98c72d,0xf5095804,0x831c46b5, NULL, NULL },
+       ALTROMPN(154, 1, 1, 16384, ROMTYPE_ODD  | ROMTYPE_8BIT, _T("380682-04"), 0xc23dcd55, 0x38dc24b7, 0x14427b15, 0xd5214cc9, 0xb9be0de7, 0x20bd6a34)
+       ALTROMPN(154, 1, 2, 16384, ROMTYPE_EVEN | ROMTYPE_8BIT, _T("380683-04"), 0xdad80c0b, 0x12fe2916, 0x64f8c412, 0x3877a24e, 0x05837091, 0x44d8acd0)
+       { _T("A2386SX BIOS 1.0"), 1, 0, 1, 0, _T("A2386SX\0"), 65536, 155, 0, 0, ROMTYPE_A2386, 0, 0, NULL,
+       0x37003e0c, 0x2e127e9c,0x8581d30c,0x2e46404b,0x21608e3c,0xe935fa27, NULL, NULL },
+
        { _T("Arcadia OnePlay 2.11"), 0, 0, 0, 0, _T("ARCADIA\0"), 0, 49, 0, 0, ROMTYPE_ARCADIABIOS, 0, 0 },
        { _T("Arcadia TenPlay 2.11"), 0, 0, 0, 0, _T("ARCADIA\0"), 0, 50, 0, 0, ROMTYPE_ARCADIABIOS, 0, 0 },
        { _T("Arcadia TenPlay 2.20"), 0, 0, 0, 0, _T("ARCADIA\0"), 0, 75, 0, 0, ROMTYPE_ARCADIABIOS, 0, 0 },
@@ -1149,6 +1172,22 @@ struct romlist *getromlistbyromdata (const struct romdata *rd)
        return getromlistbyids(ids, NULL);
 }
 
+struct romlist *getromlistbyromtype(uae_u32 romtype)
+{
+       int i = 0;
+       while (roms[i].name) {
+               if (roms[i].type == romtype) {
+                       struct romdata *rd = &roms[i];
+                       for (int j = 0; j < romlist_cnt; j++) {
+                               if (rl[j].rd->id == rd->id)
+                                       return &rl[j];
+                       }
+               }
+               i++;
+       }
+       return NULL;
+}
+
 struct romlist *getromlistbyids (const int *ids, const TCHAR *romname)
 {
        struct romdata *rd;
@@ -1740,19 +1779,28 @@ struct romconfig *get_device_romconfig(struct uae_prefs *p, int romtype, int dev
        return NULL;
 }
 
-struct zfile *read_device_from_romconfig(struct romconfig *rc, const int *roms)
+static bool isspecialrom(const TCHAR *name)
 {
-       if (!_tcsicmp(rc->romfile, _T(":NOROM")))
-               return NULL;
-       struct zfile *z = read_rom_name (rc->romfile);
-       if (!z && roms) {
-               struct romlist *rl = getromlistbyids(roms, rc->romfile);
+       if (!_tcsicmp(name, _T(":NOROM")))
+               return true;
+       if (!_tcsicmp(name, _T(":ENABLED")))
+               return true;
+       return false;
+}
+
+struct zfile *read_device_from_romconfig(struct romconfig *rc, uae_u32 romtype)
+{
+       struct zfile *z = NULL;
+       if (isspecialrom(rc->romfile))
+               return z;
+       z = read_rom_name (rc->romfile);
+       if (z)
+               return z;
+       if (romtype) {
+               struct romlist *rl = getromlistbyromtype(romtype);
                if (rl) {
                        struct romdata *rd = rl->rd;
-                       z = read_rom (rd);
-               }
-               if (!z) {
-                       romwarning (roms);
+                       z = read_rom(rd);
                }
        }
        return z;
@@ -1764,7 +1812,7 @@ struct zfile *read_device_rom(struct uae_prefs *p, int romtype, int devnum, int
        struct boardromconfig *brc = get_device_rom(p, romtype, devnum, &idx);
        if (brc) {
                const TCHAR *romname = brc->roms[idx].romfile;
-               if (!_tcsicmp(romname, _T(":NOROM")))
+               if (isspecialrom(romname))
                        return NULL;
                struct zfile *z = read_rom_name (romname);
                if (!z && roms) {
@@ -1787,7 +1835,7 @@ int is_device_rom(struct uae_prefs *p, int romtype, int devnum)
                const TCHAR *romname = brc->roms[idx].romfile;
                if (_tcslen(romname) == 0)
                        return -1;
-               if (!_tcsicmp(romname, _T(":NOROM")))
+               if (isspecialrom(romname))
                        return 0;
                return 1;
        }
@@ -1813,24 +1861,27 @@ struct boardromconfig *get_boardromconfig(struct uae_prefs *p, int romtype, int
        return NULL;
 }
 
-bool load_rom_rc(struct romconfig *rc, const int *roms, int maxfilesize, int fileoffset, uae_u8 *rom, int maxromsize, int flags)
+bool load_rom_rc(struct romconfig *rc, uae_u32 romtype, int maxfilesize, int fileoffset, uae_u8 *rom, int maxromsize, int flags)
 {
        if (flags & LOADROM_ONEFILL)
                memset(rom, 0xff, maxromsize);
        if (flags & LOADROM_ZEROFILL)
                memset(rom, 0x00, maxromsize);
-       struct zfile *f = read_device_from_romconfig(rc, roms);
+       struct zfile *f = read_device_from_romconfig(rc, romtype);
        if (!f)
                return false;
        zfile_fseek(f, fileoffset, SEEK_SET);
        int cnt = 0;
        int pos = 0;
+       int bytes = 0;
        bool eof = false;
        while (cnt < maxromsize && cnt < maxfilesize && pos < maxromsize) {
                uae_u8 b = 0xff;
                if (!eof) {
                        if (!zfile_fread(&b, 1, 1, f))
                                eof = true;
+                       else
+                               bytes++;
                }
                if (eof) {
                        int bitcnt = 0;
@@ -1851,6 +1902,8 @@ bool load_rom_rc(struct romconfig *rc, const int *roms, int maxfilesize, int fil
                }
                cnt++;
        }
+       if (f)
+               write_log(_T("ROM '%s' loaded, %d bytes.\n"), zfile_getname(f), bytes);
        zfile_fclose(f);
        int posend = pos;
        if (!(flags & LOADROM_FILL))
index 01579d2def9775c62e6f3563f9d54af85d3f2f11..e1ec1cfdc330669d499ff2500f570f04b078cbfe 100644 (file)
--- a/scsi.cpp
+++ b/scsi.cpp
@@ -3093,14 +3093,10 @@ uae_u32 soft_scsi_get(uaecptr addr, int size)
 addrbank *supra_init(struct romconfig *rc)
 {
        struct soft_scsi *scsi = getscsi(rc);
-       int roms[2];
        
        if (!scsi)
                return &expamem_null;
 
-       roms[0] = 121;
-       roms[1] = -1;
-
        scsi->intena = true;
 
        const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_SUPRA);
@@ -3111,7 +3107,7 @@ addrbank *supra_init(struct romconfig *rc)
                        uae_u8 b = ert->subtypes[rc->subtype].autoconfig[i];
                        ew(scsi, i * 4, b);
                }
-               load_rom_rc(rc, roms, 16384, 0, scsi->rom, 32768, LOADROM_EVENONLY_ODDONE | LOADROM_FILL);
+               load_rom_rc(rc, ROMTYPE_SUPRA, 16384, 0, scsi->rom, 32768, LOADROM_EVENONLY_ODDONE | LOADROM_FILL);
        }
        return scsi->bank;
 }
@@ -3124,17 +3120,13 @@ void supra_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig
 addrbank *golem_init(struct romconfig *rc)
 {
        struct soft_scsi *scsi = getscsi(rc);
-       int roms[2];
        
        if (!scsi)
                return &expamem_null;
 
-       roms[0] = 124;
-       roms[1] = -1;
-
        scsi->intena = true;
 
-       load_rom_rc(rc, roms, 8192, rc->autoboot_disabled ? 8192 : 0, scsi->rom, 8192, 0);
+       load_rom_rc(rc, ROMTYPE_GOLEM, 8192, rc->autoboot_disabled ? 8192 : 0, scsi->rom, 8192, 0);
        memcpy(scsi->acmemory, scsi->rom, sizeof scsi->acmemory);
 
        return scsi->bank;
@@ -3168,17 +3160,13 @@ void stardrive_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romco
 addrbank *kommos_init(struct romconfig *rc)
 {
        struct soft_scsi *scsi = getscsi(rc);
-       int roms[2];
        
        if (!scsi)
                return NULL;
 
        scsi->configured = 1;
 
-       roms[0] = 127;
-       roms[1] = -1;
-
-       load_rom_rc(rc, roms, 32768, 0, scsi->rom, 32768, 0);
+       load_rom_rc(rc, ROMTYPE_KOMMOS, 32768, 0, scsi->rom, 32768, 0);
 
        map_banks(scsi->bank, 0xf10000 >> 16, 1, 0);
        map_banks(scsi->bank, 0xeb0000 >> 16, 1, 0);
@@ -3207,7 +3195,7 @@ addrbank *vector_init(struct romconfig *rc)
        scsi->intena = true;
 
        if (!rc->autoboot_disabled) {
-               load_rom_rc(rc, roms, 32768, 0, scsi->rom, 32768, 0);
+               load_rom_rc(rc, ROMTYPE_VECTOR, 32768, 0, scsi->rom, 32768, 0);
                memcpy(scsi->acmemory, scsi->rom, sizeof scsi->acmemory);
        }
        return scsi->bank;
@@ -3222,15 +3210,11 @@ void vector_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfi
 addrbank *protar_init(struct romconfig *rc)
 {
        struct soft_scsi *scsi = getscsi(rc);
-       int roms[2];
        
        if (!scsi)
                return &expamem_null;
 
-       roms[0] = 131;
-       roms[1] = -1;
-
-       load_rom_rc(rc, roms, 32768, 0, scsi->rom, 32768, LOADROM_EVENONLY_ODDONE);
+       load_rom_rc(rc, ROMTYPE_PROTAR, 32768, 0, scsi->rom, 32768, LOADROM_EVENONLY_ODDONE);
        memcpy(scsi->acmemory, scsi->rom + 0x200 * 2, sizeof scsi->acmemory);
        return scsi->bank;
 }
@@ -3243,15 +3227,11 @@ void protar_add_ide_unit(int ch, struct uaedev_config_info *ci, struct romconfig
 addrbank *add500_init(struct romconfig *rc)
 {
        struct soft_scsi *scsi = getscsi(rc);
-       int roms[2];
        
        if (!scsi)
                return &expamem_null;
 
-       roms[0] = 132;
-       roms[1] = -1;
-
-       load_rom_rc(rc, roms, 16384, 0, scsi->rom, 32768, LOADROM_EVENONLY_ODDONE | LOADROM_FILL);
+       load_rom_rc(rc, ROMTYPE_ADD500, 16384, 0, scsi->rom, 32768, LOADROM_EVENONLY_ODDONE | LOADROM_FILL);
        memcpy(scsi->acmemory, scsi->rom, sizeof scsi->acmemory);
        return scsi->bank;
 }
@@ -3264,17 +3244,14 @@ void add500_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfi
 addrbank *kronos_init(struct romconfig *rc)
 {
        struct soft_scsi *scsi = getscsi(rc);
-       int roms[2];
        
        if (!scsi)
                return &expamem_null;
 
-       roms[0] = -1;
-       roms[1] = -1;
        scsi->databuffer_size = 1024;
        scsi->databufferptr = xcalloc(uae_u8, scsi->databuffer_size);
 
-       load_rom_rc(rc, roms, 4096, 0, scsi->rom, 32768, LOADROM_EVENONLY_ODDONE | LOADROM_FILL);
+       load_rom_rc(rc, ROMTYPE_KRONOS, 4096, 0, scsi->rom, 32768, LOADROM_EVENONLY_ODDONE | LOADROM_FILL);
        return scsi->bank;
 }
 
@@ -3286,15 +3263,11 @@ void kronos_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfi
 addrbank *adscsi_init(struct romconfig *rc)
 {
        struct soft_scsi *scsi = getscsi(rc);
-       int roms[2];
        
        if (!scsi)
                return &expamem_null;
 
-       roms[0] = 132;
-       roms[1] = -1;
-
-       load_rom_rc(rc, roms, 32768, 0, scsi->rom, 65536, LOADROM_EVENONLY_ODDONE | LOADROM_FILL);
+       load_rom_rc(rc, ROMTYPE_ADSCSI, 32768, 0, scsi->rom, 65536, LOADROM_EVENONLY_ODDONE | LOADROM_FILL);
        memcpy(scsi->acmemory, scsi->rom, sizeof scsi->acmemory);
        return scsi->bank;
 }
@@ -3352,14 +3325,10 @@ void cltda1000scsi_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct r
 addrbank *ptnexus_init(struct romconfig *rc)
 {
        struct soft_scsi *scsi = getscsi(rc);
-       int roms[2];
 
        if (!scsi)
                return &expamem_null;
 
-       roms[0] = -1;
-       roms[1] = -1;
-
        scsi->intena = true;
        scsi->delayed_irq = true;
 
@@ -3369,7 +3338,7 @@ addrbank *ptnexus_init(struct romconfig *rc)
                ew(scsi, i * 4, b);
        }
 
-       load_rom_rc(rc, roms, 8192, 0, scsi->rom, 65536, LOADROM_EVENONLY_ODDONE | LOADROM_FILL);
+       load_rom_rc(rc, ROMTYPE_PTNEXUS, 8192, 0, scsi->rom, 65536, LOADROM_EVENONLY_ODDONE | LOADROM_FILL);
        return scsi->bank;
 }
 
@@ -3645,15 +3614,15 @@ void omtiadapter_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconf
        generic_soft_scsi_add(ch, ci, rc, OMTI_ADAPTER, 65536, 0, ROMTYPE_OMTIADAPTER);
 }
 
-extern void x86_xt_ide_bios(struct zfile*);
+extern void x86_xt_ide_bios(struct zfile*, struct romconfig *rc);
 addrbank *x86_xt_hd_init(struct romconfig *rc)
 {
        struct soft_scsi *scsi = getscsi(rc);
 
        if (!scsi)
                return NULL;
-       struct zfile *f = read_device_from_romconfig(rc, NULL);
-       x86_xt_ide_bios(f);
+       struct zfile *f = read_device_from_romconfig(rc, 0);
+       x86_xt_ide_bios(f, rc);
        zfile_fclose(f);
        scsi->configured = 1;
        x86_hd_data = scsi;