addrbank *a2091_init (struct romconfig *rc)
{
struct wd_state *wd = getscsi(rc);
- int roms[6];
int slotsize;
if (!wd)
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;
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);
addrbank *a2090_init (struct romconfig *rc)
{
struct wd_state *wd = getscsi(rc);
- int roms[6];
int slotsize;
if (!wd)
//ew(wd, 0x30, 0x80); // SCSI only flag
- roms[0] = 122;
- roms[1] = -1;
-
wd->rombankswitcher = 0;
wd->rombank = 0;
slotsize = 65536;
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);
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;
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);
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) {
struct romconfig *rc;
const TCHAR *name;
int flags;
+ int zorro;
};
static struct card_data cards[MAX_EXPANSION_BOARD_SPACE];
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();
}
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;
}
}
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;
}
}
}
};
-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"),
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
_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[] = {
{
}
};
+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);
_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
},
{
false, EXPANSIONTYPE_X86_BRIDGE,
0, 0, 0, false, NULL,
false,
- x86at_bridge_settings
+ x86at286_bridge_settings
},
{
_T("a2386"), _T("A2386SX"), _T("Commodore"),
false, EXPANSIONTYPE_X86_BRIDGE,
0, 0, 0, false, NULL,
false,
- x86at_bridge_settings
+ x86at386_bridge_settings
},
// only here for rom selection
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
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
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;
}
}
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)) {
ide_interrupt_hsync(board->ide[j]);
}
}
- if (ide_interrupt_check(board)) {
+ if (ide_interrupt_check(board, false)) {
idecontroller_rethink();
}
}
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];
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;
}
#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 {
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)) {
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;
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);
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)
ide->configured = 0;
- roms[0] = alfplus ? 118 : 117;
- roms[1] = -1;
-
ide->configured = 0;
ide->bank = &ide_bank_generic;
ide->type = ALF_IDE;
}
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;
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;
}
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
}
} 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;
}
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;
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);
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;
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];
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;
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;
}
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;
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;
}
}
}
-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);
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);
}
*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];
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));
+ }
}
}
}
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;
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);
int type;
int userdata;
int subtype;
+ uae_u16 data_latch;
struct romconfig *rc, *original_rc;
struct ide_board **self_ptr;
};
struct ide_hdf *pair; // master<>slave
struct ide_thread_state *its;
bool byteswap;
+ int byteswapped_buffer;
bool adide;
uae_u8 *secbuf;
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;
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);
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);
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);
#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
addrbank *ncr_fastlane_autoconfig_init(struct romconfig *rc)
{
- int roms[2];
struct ncr9x_state *ncr = getscsi(rc);
xfree(ncr->rom);
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;
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
addrbank *ncr_oktagon_autoconfig_init(struct romconfig *rc)
{
- int roms[2];
struct ncr9x_state *ncr = getscsi(rc);
if (!ncr)
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;
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);
addrbank *ncr_dkb_autoconfig_init(struct romconfig *rc)
{
- int roms[2];
struct ncr9x_state *ncr = getscsi(rc);
if (!ncr)
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;
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
addrbank *ncr_ematrix_autoconfig_init(struct romconfig *rc)
{
- int roms[2];
struct ncr9x_state *ncr = getscsi(rc);
if (!ncr)
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;
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;
addrbank *ncr710_warpengine_autoconfig_init(struct romconfig *rc)
{
- int roms[2];
struct ncr_state *ncr = getscsi(rc);
if (!ncr)
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;
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;
addrbank *ncr710_a4091_autoconfig_init (struct romconfig *rc)
{
struct ncr_state *ncr = getscsi(rc);
- int roms[3];
if (!ncr)
return &expamem_null;
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;
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++) {
return NULL;
}
-#define NEXT_ROM_ID 147
+#define NEXT_ROM_ID 156
static struct romheader romheaders[] = {
{ _T("Freezer Cartridges"), 1 },
{ _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 },
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;
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;
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) {
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;
}
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;
}
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))
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);
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;
}
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;
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);
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;
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;
}
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;
}
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;
}
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;
}
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;
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;
}
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;