This commit is contained in:
Toni Wilen 2016-09-17 15:55:21 +03:00
parent 30a967fb69
commit 6b7202cf6c
22 changed files with 716 additions and 211 deletions

View File

@ -1292,7 +1292,7 @@ static bool cfgfile_readramboard(const TCHAR *option, const TCHAR *value, const
else
_stprintf(tmp1, _T("%s_options"), name);
if (!_tcsicmp(option, tmp1)) {
TCHAR *s;
TCHAR *s, *s1, *s2;
s = cfgfile_option_get(value, _T("order"));
if (s)
rb->device_order = _tstol(s);
@ -1314,6 +1314,17 @@ static bool cfgfile_readramboard(const TCHAR *option, const TCHAR *value, const
rb->autoconfig[i] = (uae_u8)_tcstol(s2, &endptr, 16);
}
}
s1 = cfgfile_option_get(value, _T("start"));
s2 = cfgfile_option_get(value, _T("end"));
if (s1 && s2) {
TCHAR *endptr;
rb->start_address = _tcstol(s1, &endptr, 16);
rb->end_address = _tcstol(s2, &endptr, 16);
if (rb->start_address && rb->end_address > rb->start_address) {
rb->manual_config = true;
rb->autoconfig_inuse = false;
}
}
return true;
}
}
@ -1350,6 +1361,13 @@ static void cfgfile_writeramboard(struct uae_prefs *prefs, struct zfile *f, cons
ac[8], ac[9], ac[10], ac[11], ac[12], ac[13], ac[14], ac[15]);
p += _tcslen(p);
}
if (rb->manual_config && rb->start_address && rb->end_address) {
if (tmp2[0])
*p++ = ',';
_stprintf(p, _T("start=%08x,end=%08x"), rb->start_address, rb->end_address);
p += _tcslen(p);
}
if (tmp2[0]) {
cfgfile_write(f, tmp1, tmp2);
}

View File

@ -239,7 +239,7 @@ bool ppc_interrupt(int new_m68k_ipl)
static bool mapromconfigured(void)
{
if (currprefs.maprom)
if (currprefs.maprom && !currprefs.cpuboard_type)
return true;
if (currprefs.cpuboard_settings & 1)
return true;
@ -1965,6 +1965,7 @@ bool cpuboard_maprom(void)
}
return true;
}
bool cpuboard_jitdirectompatible(struct uae_prefs *p)
{
if (cpuboard_memorytype(p) == BOARD_MEMORY_BLIZZARD_12xx || cpuboard_memorytype(p) == BOARD_MEMORY_BLIZZARD_PPC) {

View File

@ -1394,7 +1394,7 @@ static addrbank *expamem_map_fastcard(struct autoconfig_info *aci)
return ab;
}
static void fastmem_autoconfig(struct uae_prefs *p, struct autoconfig_info *aci, int zorro, uae_u8 type, uae_u32 serial, int allocated)
static bool fastmem_autoconfig(struct uae_prefs *p, struct autoconfig_info *aci, int zorro, uae_u8 type, uae_u32 serial, int allocated)
{
uae_u16 mid = 0;
uae_u8 pid;
@ -1434,10 +1434,11 @@ static void fastmem_autoconfig(struct uae_prefs *p, struct autoconfig_info *aci,
}
uae_u8 *forceac = NULL;
struct ramboard *rb = NULL;
if (!mid) {
if (zorro <= 2) {
struct ramboard *rb = &p->fastmem[boardnum];
rb = &p->fastmem[boardnum];
if (rb->autoconfig[0]) {
forceac = rb->autoconfig;
} else if (rb->manufacturer) {
@ -1509,6 +1510,15 @@ static void fastmem_autoconfig(struct uae_prefs *p, struct autoconfig_info *aci,
expamem_write(0x2c, 0x00); /* ROM-Offset lo */
expamem_write(0x40, 0x00); /* Ctrl/Statusreg.*/
if (rb && rb->manual_config) {
aci->start = rb->start_address;
aci->size = rb->end_address - rb->start_address + 1;
memcpy(&aci->autoconfig_bytes, ac, sizeof ac);
return false;
}
return true;
}
static const uae_u8 a2630_autoconfig[] = { 0xe7, 0x51, 0x40, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
@ -1522,14 +1532,15 @@ static bool megachipram_init(struct autoconfig_info *aci)
return true;
}
static bool expamem_init_fastcard(struct autoconfig_info *aci)
static bool expamem_init_fastcard_2(struct autoconfig_info *aci, int zorro)
{
struct uae_prefs *p = aci->prefs;
addrbank *bank = &fastmem_bank[aci->devnum];
uae_u8 type = add_memory | zorroII;
int size = p->fastmem[aci->devnum].size;
aci->label = _T("Z2 Fast RAM");
aci->label = zorro == 1 ? _T("Z1 Fast RAM") : _T("Z2 Fast RAM");
aci->zorro = zorro;
expamem_init_clear ();
if (size == 65536)
@ -1564,12 +1575,23 @@ static bool expamem_init_fastcard(struct autoconfig_info *aci)
}
}
fastmem_autoconfig(p, aci, BOARD_AUTOCONFIG_Z2, type, 1, size);
if (!fastmem_autoconfig(p, aci, BOARD_AUTOCONFIG_Z2, type, 1, size)) {
aci->zorro = -1;
}
memcpy(aci->autoconfig_raw, expamem, sizeof aci->autoconfig_raw);
return true;
}
static bool expamem_init_fastcard(struct autoconfig_info *aci)
{
return expamem_init_fastcard_2(aci, 2);
}
static bool expamem_init_fastcard_z1(struct autoconfig_info *aci)
{
return expamem_init_fastcard_2(aci, 1);
}
bool expansion_is_next_board_fastram(void)
{
return ecard + 1 < MAX_EXPANSION_BOARD_SPACE && cards[ecard + 1] && cards[ecard + 1]->map == expamem_map_fastcard;
@ -1610,6 +1632,7 @@ static addrbank *expamem_map_filesys (struct autoconfig_info *aci)
// can't show dialogs from PPC thread, deadlock danger.
regs.halted = -2;
}
mapped_free(&filesys_bank);
filesys_bank.start = expamem_board_pointer;
filesys_bank.mask = filesys_bank.reserved_size - 1;
mapped_malloc(&filesys_bank);
@ -1659,10 +1682,12 @@ static bool expamem_init_filesys(struct autoconfig_info *aci)
bool ks12 = ks12orolder();
bool hide = currprefs.uae_hide_autoconfig;
aci->label = _T("UAE FS ROM");
aci->get_params = get_params_filesys;
aci->set_params = set_params_filesys;
aci->addrbank = &filesys_bank;
if (aci) {
aci->label = ks12 ? _T("Pre-KS 1.3 UAE FS ROM") : _T("UAE FS ROM");
aci->get_params = get_params_filesys;
aci->set_params = set_params_filesys;
aci->addrbank = &filesys_bank;
}
#if 0
FILE *f = fopen("d:\\amiga\\amiga\\source\\acap\\autoconf", "rb");
@ -1703,7 +1728,7 @@ static bool expamem_init_filesys(struct autoconfig_info *aci)
expamem_write (0x40, 0x00); /* Ctrl/Statusreg.*/
if (!aci->doinit) {
if (aci && !aci->doinit) {
memcpy(aci->autoconfig_raw, expamem, sizeof aci->autoconfig_raw);
return true;
}
@ -1944,7 +1969,9 @@ static void allocate_expamem (void)
} else {
fastmem_bank[i].reserved_size = currprefs.fastmem[i].size;
fastmem_bank[i].mask = fastmem_bank[i].reserved_size - 1;
if (currprefs.fastmem[i].manual_config) {
fastmem_bank[i].start = currprefs.fastmem[i].start_address;
}
if (fastmem_bank[i].reserved_size && fastmem_bank[i].start != 0xffffffff) {
mapped_malloc (&fastmem_bank[i]);
if (fastmem_bank[i].baseaddr == 0) {
@ -2110,30 +2137,32 @@ static void add_cpu_expansions(struct uae_prefs *p, int zorro, int *fastmem_nump
if (cst->init && cst->initzorro == zorro) {
int idx;
struct boardromconfig *brc = get_device_rom(p, ROMTYPE_CPUBOARD, 0, &idx);
struct romconfig *rc = &brc->roms[idx];
cards_set[cardno].flags = cst->initflag;
cards_set[cardno].name = cst->name;
cards_set[cardno].initrc = cst->init;
cards_set[cardno].rc = rc;
cards_set[cardno].zorro = zorro;
cards_set[cardno].cst = cst;
cards_set[cardno++].map = NULL;
if (cst->init2) {
cards_set[cardno].flags = cst->initflag | CARD_FLAG_CHILD;
if (brc) {
struct romconfig *rc = &brc->roms[idx];
cards_set[cardno].flags = cst->initflag;
cards_set[cardno].name = cst->name;
cards_set[cardno].initrc = cst->init2;
cards_set[cardno].initrc = cst->init;
cards_set[cardno].rc = rc;
cards_set[cardno].zorro = zorro;
cards_set[cardno].cst = cst;
cards_set[cardno++].map = NULL;
}
if (fastmem_num < MAX_RAM_BOARDS && zorro == 2 && cst->memory_mid && p->fastmem[fastmem_num].size) {
cards_set[cardno].flags = (fastmem_num << 16) | CARD_FLAG_CHILD;
cards_set[cardno].name = _T("Z2Fast");
cards_set[cardno].initnum = expamem_init_fastcard;
cards_set[cardno].zorro = zorro;
cards_set[cardno].cst = cst;
cards_set[cardno++].map = expamem_map_fastcard;
fastmem_num++;
if (cst->init2) {
cards_set[cardno].flags = cst->initflag | CARD_FLAG_CHILD;
cards_set[cardno].name = cst->name;
cards_set[cardno].initrc = cst->init2;
cards_set[cardno].zorro = zorro;
cards_set[cardno].cst = cst;
cards_set[cardno++].map = NULL;
}
if (fastmem_num < MAX_RAM_BOARDS && zorro == 2 && cst->memory_mid && p->fastmem[fastmem_num].size) {
cards_set[cardno].flags = (fastmem_num << 16) | CARD_FLAG_CHILD;
cards_set[cardno].name = _T("Z2Fast");
cards_set[cardno].initnum = expamem_init_fastcard;
cards_set[cardno].zorro = zorro;
cards_set[cardno].cst = cst;
cards_set[cardno++].map = expamem_map_fastcard;
fastmem_num++;
}
}
}
if (fastmem_nump)
@ -2151,81 +2180,79 @@ static void add_expansions(struct uae_prefs *p, int zorro, int *fastmem_nump, in
for (int j = 0; j < MAX_DUPLICATE_EXPANSION_BOARDS; j++) {
struct romconfig *rc = get_device_romconfig(p, ert->romtype, j);
if (rc) {
if (zorro == 1) {
struct autoconfig_info aci = { 0 };
aci.prefs = p;
aci.doinit = true;
aci.rc = rc;
ert->init(&aci);
if (ert->init2) {
ert->init2(&aci);
}
} else {
int mid = ert->memory_mid;
bool memory_after = ert->memory_after;
bool added = false;
if (ert->subtypes) {
const struct expansionsubromtype *srt = &ert->subtypes[rc->subtype];
mid = srt->memory_mid;
memory_after = srt->memory_after;
}
int mid = ert->memory_mid;
bool memory_after = ert->memory_after;
bool added = false;
if (ert->subtypes) {
const struct expansionsubromtype *srt = &ert->subtypes[rc->subtype];
mid = srt->memory_mid;
memory_after = srt->memory_after;
}
if (mode == 1 && ert->memory_mid)
continue;
if (mode == 2 && !ert->memory_mid)
continue;
if (fastmem_num < MAX_RAM_BOARDS && zorro == 2 && mid && !memory_after && p->fastmem[fastmem_num].size) {
cards_set[cardno].flags = (fastmem_num << 16);
cards_set[cardno].name = _T("Z2Fast");
cards_set[cardno].initnum = expamem_init_fastcard;
cards_set[cardno].zorro = zorro;
cards_set[cardno].ert = ert;
cards_set[cardno++].map = expamem_map_fastcard;
fastmem_num++;
added = true;
}
if (fastmem_num < MAX_RAM_BOARDS && zorro == 3 && mid && !memory_after && p->z3fastmem[fastmem_num].size) {
cards_set[cardno].flags = CARD_FLAG_CAN_Z3 | (fastmem_num << 16);
cards_set[cardno].name = _T("Z3Fast");
cards_set[cardno].initnum = expamem_init_z3fastmem;
cards_set[cardno].zorro = zorro;
cards_set[cardno].ert = ert;
cards_set[cardno++].map = expamem_map_z3fastmem;
fastmem_num++;
added = true;
}
cards_set[cardno].flags = added ? CARD_FLAG_CHILD : 0;
if (mode == 1 && ert->memory_mid)
continue;
if (mode == 2 && !ert->memory_mid)
continue;
if (fastmem_num < MAX_RAM_BOARDS && zorro == 2 && mid && !memory_after && p->fastmem[fastmem_num].size) {
cards_set[cardno].flags = (fastmem_num << 16);
cards_set[cardno].name = _T("Z2Fast");
cards_set[cardno].initnum = expamem_init_fastcard;
cards_set[cardno].zorro = zorro;
cards_set[cardno].ert = ert;
cards_set[cardno++].map = expamem_map_fastcard;
fastmem_num++;
added = true;
}
if (fastmem_num < MAX_RAM_BOARDS && zorro == 3 && mid && !memory_after && p->z3fastmem[fastmem_num].size) {
cards_set[cardno].flags = CARD_FLAG_CAN_Z3 | (fastmem_num << 16);
cards_set[cardno].name = _T("Z3Fast");
cards_set[cardno].initnum = expamem_init_z3fastmem;
cards_set[cardno].zorro = zorro;
cards_set[cardno].ert = ert;
cards_set[cardno++].map = expamem_map_z3fastmem;
fastmem_num++;
added = true;
}
cards_set[cardno].flags = added ? CARD_FLAG_CHILD : 0;
cards_set[cardno].name = ert->name;
cards_set[cardno].initrc = ert->init;
cards_set[cardno].rc = rc;
cards_set[cardno].zorro = zorro;
cards_set[cardno++].map = NULL;
if (ert->init2) {
cards_set[cardno].flags = CARD_FLAG_CHILD;
cards_set[cardno].name = ert->name;
cards_set[cardno].initrc = ert->init;
cards_set[cardno].initrc = ert->init2;
cards_set[cardno].rc = rc;
cards_set[cardno].zorro = zorro;
cards_set[cardno++].map = NULL;
if (ert->init2) {
cards_set[cardno].flags = CARD_FLAG_CHILD;
cards_set[cardno].name = ert->name;
cards_set[cardno].initrc = ert->init2;
cards_set[cardno].rc = rc;
cards_set[cardno].zorro = zorro;
cards_set[cardno++].map = NULL;
}
if (fastmem_num < MAX_RAM_BOARDS && zorro == 2 && mid && memory_after && p->fastmem[fastmem_num].size) {
cards_set[cardno].flags = (fastmem_num << 16) | CARD_FLAG_CHILD;
cards_set[cardno].name = _T("Z2Fast");
cards_set[cardno].initnum = expamem_init_fastcard;
cards_set[cardno].zorro = zorro;
cards_set[cardno].ert = ert;
cards_set[cardno++].map = expamem_map_fastcard;
fastmem_num++;
}
if (fastmem_num < MAX_RAM_BOARDS && zorro == 3 && mid && memory_after && p->z3fastmem[fastmem_num].size) {
cards_set[cardno].flags = CARD_FLAG_CAN_Z3 | (fastmem_num << 16) | CARD_FLAG_CHILD;
cards_set[cardno].name = _T("Z3Fast");
cards_set[cardno].initnum = expamem_init_z3fastmem;
cards_set[cardno].zorro = zorro;
cards_set[cardno].ert = ert;
cards_set[cardno++].map = expamem_map_z3fastmem;
fastmem_num++;
}
}
if (fastmem_num < MAX_RAM_BOARDS && zorro == 1 && mid && p->fastmem[fastmem_num].size) {
cards_set[cardno].flags = (fastmem_num << 16) | CARD_FLAG_CHILD;
cards_set[cardno].name = _T("Z1Fast");
cards_set[cardno].initnum = expamem_init_fastcard_z1;
cards_set[cardno].zorro = zorro;
cards_set[cardno].ert = ert;
cards_set[cardno++].map = NULL;
fastmem_num++;
}
if (fastmem_num < MAX_RAM_BOARDS && zorro == 2 && mid && memory_after && p->fastmem[fastmem_num].size) {
cards_set[cardno].flags = (fastmem_num << 16) | CARD_FLAG_CHILD;
cards_set[cardno].name = _T("Z2Fast");
cards_set[cardno].initnum = expamem_init_fastcard;
cards_set[cardno].zorro = zorro;
cards_set[cardno].ert = ert;
cards_set[cardno++].map = expamem_map_fastcard;
fastmem_num++;
}
if (fastmem_num < MAX_RAM_BOARDS && zorro == 3 && mid && memory_after && p->z3fastmem[fastmem_num].size) {
cards_set[cardno].flags = CARD_FLAG_CAN_Z3 | (fastmem_num << 16) | CARD_FLAG_CHILD;
cards_set[cardno].name = _T("Z3Fast");
cards_set[cardno].initnum = expamem_init_z3fastmem;
cards_set[cardno].zorro = zorro;
cards_set[cardno].ert = ert;
cards_set[cardno++].map = expamem_map_z3fastmem;
fastmem_num++;
}
}
}
@ -2338,7 +2365,7 @@ static void reset_ac_data(struct uae_prefs *p)
if (p->mbresmem_high_size)
expamem_highmem_pointer = 0x08000000 + p->mbresmem_high_size;
if (p->mbresmem_high_size >= 128 * 1024 * 102)
if (p->mbresmem_high_size >= 128 * 1024 * 1024)
expamem_z3_pointer_uae += (p->mbresmem_high_size - 128 * 1024 * 1024) + 16 * 1024 * 1024;
expamem_z3_pointer_uae += p->z3chipmem_size;
expamem_board_pointer = 0;
@ -3121,14 +3148,6 @@ static void expansion_add_autoconfig(struct uae_prefs *p)
reset_ac(p);
if (p == &currprefs && do_mount < 0 && ks11orolder()) {
filesys_bank.start = 0xe90000;
mapped_malloc(&filesys_bank);
map_banks_z2(&filesys_bank, filesys_bank.start >> 16, 1);
expamem_init_filesys(0);
expamem_map_filesys_update();
}
if (p->cpuboard_type) {
// This may require first 128k slot.
cards_set[cardno].flags = 1;
@ -3152,6 +3171,7 @@ static void expansion_add_autoconfig(struct uae_prefs *p)
add_expansions(p, BOARD_NONAUTOCONFIG_BEFORE, NULL, 0);
fastmem_num = 0;
add_expansions(p, BOARD_PROTOAUTOCONFIG, &fastmem_num, 0);
add_cpu_expansions(p, BOARD_AUTOCONFIG_Z2, &fastmem_num);
// immediately after Z2Fast so that it can be emulated as A590/A2091 with fast ram.
add_expansions(p, BOARD_AUTOCONFIG_Z2, &fastmem_num, 0);
@ -3296,6 +3316,7 @@ static void expansion_add_autoconfig(struct uae_prefs *p)
add_cpu_expansions(p,BOARD_NONAUTOCONFIG_AFTER_Z3, NULL);
add_expansions(p, BOARD_NONAUTOCONFIG_AFTER_Z3, NULL, 0);
}
void expansion_scan_autoconfig(struct uae_prefs *p, bool log)
@ -3321,9 +3342,6 @@ void expamem_reset (void)
expansion_autoconfig_sort(&currprefs);
expansion_parse_cards(&currprefs, true);
if (currprefs.z3chipmem_size)
map_banks_z3(&z3chipmem_bank, z3chipmem_bank.start >> 16, currprefs.z3chipmem_size >> 16);
if (cardno == 0 || savestate_state)
expamem_init_clear_zero ();
else
@ -3369,6 +3387,7 @@ void expansion_init (void)
uaeboard_bank.reserved_size = 0x10000;
mapped_malloc(&uaeboard_bank);
}
}
void expansion_cleanup (void)
@ -3399,6 +3418,33 @@ void expansion_cleanup (void)
#endif
}
void expansion_map(void)
{
map_banks(&expamem_bank, 0xE8, 1, 0);
// map non-autoconfig ram boards
for (int i = 0; i < MAX_RAM_BOARDS; i++) {
struct ramboard *rb = &currprefs.fastmem[i];
if (rb->manual_config) {
map_banks(&fastmem_bank[i], rb->start_address >> 16, (rb->end_address - rb->start_address + 1) >> 16, 0);
}
rb = &currprefs.z3fastmem[i];
if (rb->manual_config) {
map_banks(&z3fastmem_bank[i], rb->start_address >> 16, (rb->end_address - rb->start_address + 1) >> 16, 0);
}
}
if (currprefs.z3chipmem_size) {
map_banks_z3(&z3chipmem_bank, z3chipmem_bank.start >> 16, currprefs.z3chipmem_size >> 16);
}
if (do_mount < 0 && ks11orolder()) {
filesys_bank.start = 0xe90000;
mapped_free(&filesys_bank);
mapped_malloc(&filesys_bank);
map_banks_z2(&filesys_bank, filesys_bank.start >> 16, 1);
expamem_init_filesys(0);
expamem_map_filesys_update();
}
}
static void clear_bank (addrbank *ab)
{
if (!ab->baseaddr || !ab->allocated_size)
@ -4229,6 +4275,24 @@ const struct expansionromtype expansionroms[] = {
false, EXPANSIONTYPE_SCSI,
18260, 8, 0, true
},
{
_T("scram8490"), _T("SCRAM (DP8490V)"), _T("MegaMicro"),
scram5380_init, NULL, scram5380_add_scsi_unit, ROMTYPE_SCRAM5380, 0, 0, BOARD_AUTOCONFIG_Z2, false,
NULL, 0,
true, EXPANSIONTYPE_SCSI,
4096, 4, 0, false, NULL,
false, 0, NULL,
{ 0xd1, 3, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00 }
},
{
_T("scram5394"), _T("SCRAM (NCR53C94)"), _T("MegaMicro"),
ncr_scram5394_init, NULL, scram5394_add_scsi_unit, ROMTYPE_SCRAM5394, 0, 0, BOARD_AUTOCONFIG_Z2, false,
NULL, 0,
true, EXPANSIONTYPE_SCSI,
4096, 4, 0, false, NULL,
false, 0, NULL,
{ 0xd1, 7, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00 }
},
{
_T("paradox"), _T("Paradox SCSI"), _T("Mainhattan Data"),
paradox_init, NULL, paradox_add_scsi_unit, ROMTYPE_PARADOX | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG_BEFORE, false,
@ -4257,6 +4321,15 @@ const struct expansionromtype expansionroms[] = {
{ 0xc1, 2, 0x00, 0x00, 0x03, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
},
{
_T("filecard2000"), _T("Filecard 2000/OSSI 500"), _T("Otronic"),
ossi_init, NULL, ossi_add_scsi_unit, ROMTYPE_OSSI, 0, 0, BOARD_AUTOCONFIG_Z2, true,
NULL, 0,
true, EXPANSIONTYPE_SCSI,
0, 0, 0, false, NULL,
false, 0, NULL,
{ 0xc1, 1, 0x00, 0x00, 0x07, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
},
{
_T("fastlane"), _T("Fastlane"), _T("Phase 5"),
ncr_fastlane_autoconfig_init, NULL, fastlane_add_scsi_unit, ROMTYPE_FASTLANE, 0, 0, BOARD_AUTOCONFIG_Z3, false,
@ -4329,9 +4402,10 @@ const struct expansionromtype expansionroms[] = {
},
{
_T("tecmar"), _T("T-Card/T-Disk"), _T("Tecmar"),
tecmar_init, NULL, tecmar_add_scsi_unit, ROMTYPE_TECMAR | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG_BEFORE, true,
tecmar_init, NULL, tecmar_add_scsi_unit, ROMTYPE_TECMAR | ROMTYPE_NOT, 0, 0, BOARD_PROTOAUTOCONFIG, true,
NULL, 0,
false, EXPANSIONTYPE_SASI | EXPANSIONTYPE_SCSI
false, EXPANSIONTYPE_SASI | EXPANSIONTYPE_SCSI,
1001, 1, 0
},
{
_T("system2000"), _T("System 2000"), _T("Vortex"),
@ -5071,28 +5145,33 @@ const struct cpuboardtype cpuboards[] = {
const struct memoryboardtype memoryboards[]
{
// z2
{
_T("DKB"), _T("Insider I/II"),
2, 0x800000, 0xffff, 0xff
},
{
_T("GVP"), _T("Impact A2000-RAM8"),
2, 2077, 9
2, 0, 2077, 9
},
{
_T("Kupke"), _T("Golem RAM-Card"),
2, 2073, 3
2, 0, 2073, 3
},
{
_T("Supra"), _T("SupraRAM 500RX"),
2, 1056, 10
2, 0, 1056, 10
},
{
_T("Supra"), _T("SupraRAM 2000"),
2, 1056, 9
2, 0, 1056, 9
},
// z3
{
_T("E3B"), _T("ZorRAM"),
3, 3643, 32
3, 0, 3643, 32
},
{
NULL
}

View File

@ -156,6 +156,7 @@ extern int expansion_autoconfig_move(struct uae_prefs *p, int index, int directi
extern bool expansion_can_move(struct uae_prefs *p, int index);
extern bool alloc_expansion_bank(addrbank *bank, struct autoconfig_info *aci);
extern void free_expansion_bank(addrbank *bank);
extern void expansion_map(void);
extern void uaegfx_install_code (uaecptr);
@ -260,6 +261,7 @@ struct memoryboardtype
const TCHAR *man;
const TCHAR *name;
uae_u8 z;
uae_u32 address;
uae_u16 manufacturer;
uae_u8 product;
uae_u8 autoconfig[16];

View File

@ -292,7 +292,6 @@ extern void inputdevice_joyport_config_store(struct uae_prefs *p, const TCHAR *v
extern int inputdevice_getjoyportdevice (int port, int val);
extern void inputdevice_validate_jports (struct uae_prefs *p, int changedport, bool *fixedports);
extern void inputdevice_fix_prefs(struct uae_prefs *p, bool userconfig);
extern void inputdevice_config_load_start(struct uae_prefs *p);
extern void inputdevice_init (void);
extern void inputdevice_close (void);

View File

@ -469,6 +469,7 @@ extern void memory_clear (void);
extern void free_fastmemory (int);
extern void set_roms_modified (void);
extern void reload_roms(void);
extern bool read_kickstart_version(struct uae_prefs *p);
#define longget(addr) (call_mem_get_func(get_mem_bank(addr).lget, addr))
#define wordget(addr) (call_mem_get_func(get_mem_bank(addr).wget, addr))

View File

@ -16,12 +16,14 @@ extern void masoboshi_add_scsi_unit(int ch, struct uaedev_config_info *ci, struc
extern void ematrix_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
extern void multievolution_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
extern void golemfast_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
extern void scram5394_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
extern bool ncr_fastlane_autoconfig_init(struct autoconfig_info *aci);
extern bool ncr_oktagon_autoconfig_init(struct autoconfig_info *aci);
extern bool ncr_dkb_autoconfig_init(struct autoconfig_info *aci);
extern bool ncr_ematrix_autoconfig_init(struct autoconfig_info *aci);
extern bool ncr_multievolution_init(struct autoconfig_info *aci);
extern bool ncr_scram5394_init(struct autoconfig_info *aci);
extern void cpuboard_ncr9x_scsi_put(uaecptr, uae_u32);
extern uae_u32 cpuboard_ncr9x_scsi_get(uaecptr);

View File

@ -50,6 +50,17 @@ struct strlist {
#define INTERNALEVENT_COUNT 1
#if 0
struct uae_input_device_event
{
uae_s16 eventid[MAX_INPUT_SUB_EVENT_ALL];
TCHAR *custom[MAX_INPUT_SUB_EVENT_ALL];
uae_u64 flags[MAX_INPUT_SUB_EVENT_ALL];
uae_u8 port[MAX_INPUT_SUB_EVENT_ALL];
uae_s16 extra;
};
#endif
struct uae_input_device {
TCHAR *name;
TCHAR *configname;
@ -367,7 +378,10 @@ struct ramboard
uae_u8 product;
uae_u8 autoconfig[16];
bool autoconfig_inuse;
bool manual_config;
int device_order;
uae_u32 start_address;
uae_u32 end_address;
};
struct expansion_params
{

View File

@ -132,6 +132,9 @@ extern int decode_cloanto_rom_do (uae_u8 *mem, int size, int real_size);
#define ROMTYPE_BUDDHA 0x0010004f
#define ROMTYPE_NE2KISA 0x00100050
#define ROMTYPE_BLIZKIT3 0x00100051
#define ROMTYPE_SCRAM5380 0x00100052
#define ROMTYPE_SCRAM5394 0x00100053
#define ROMTYPE_OSSI 0x00100054
#define ROMTYPE_NOT 0x00800000
#define ROMTYPE_QUAD 0x01000000

View File

@ -251,6 +251,12 @@ void phoenixboard_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct ro
bool trumpcardpro_init(struct autoconfig_info*);
void trumpcardpro_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
bool scram5380_init(struct autoconfig_info*);
void scram5380_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
bool ossi_init(struct autoconfig_info*);
void ossi_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
void x86_xt_hd_bput(int, uae_u8);
uae_u8 x86_xt_hd_bget(int);
bool x86_xt_hd_init(struct autoconfig_info *aci);

View File

@ -2665,6 +2665,8 @@ static int mouseedge (void)
y = get_word(ib + 68);
}
//write_log("%dx%d\n", x, y);
if (x || y)
isnonzero = 1;
if (!isnonzero)

View File

@ -340,6 +340,8 @@ void fixup_prefs (struct uae_prefs *p, bool userconfig)
cfgfile_compatibility_rtg(p);
cfgfile_compatibility_romtype(p);
read_kickstart_version(p);
if (p->cpuboard_type && p->cpuboardmem1_size > cpuboard_maxmemory(p)) {
error_log(_T("Unsupported accelerator board memory size %d (0x%x).\n"), p->cpuboardmem1_size, p->cpuboardmem1_size);
p->cpuboardmem1_size = cpuboard_maxmemory(p);
@ -674,6 +676,11 @@ void fixup_prefs (struct uae_prefs *p, bool userconfig)
if (((p->maprom & 0xff000000) && p->address_space_24) || (p->maprom && p->mbresmem_high_size >= 0x08000000)) {
p->maprom = 0x00e00000;
}
if (p->maprom && p->cpuboard_type) {
error_log(_T("UAE Maprom and accelerator board emulation are not compatible."));
p->maprom = 0;
}
if (p->tod_hack && p->cs_ciaatod == 0)
p->cs_ciaatod = p->ntscmode ? 2 : 1;

View File

@ -1200,12 +1200,15 @@ static int read_kickstart (struct zfile *f, uae_u8 *mem, int size, int dochecksu
}
memset (mem, 0, size);
for (i = 0; i < 8; i++)
mem[size - 16 + i * 2 + 1] = 0x18 + i;
mem[size - 20] = size >> 24;
mem[size - 19] = size >> 16;
mem[size - 18] = size >> 8;
mem[size - 17] = size >> 0;
if (size >= 131072) {
for (i = 0; i < 8; i++) {
mem[size - 16 + i * 2 + 1] = 0x18 + i;
}
mem[size - 20] = size >> 24;
mem[size - 19] = size >> 16;
mem[size - 18] = size >> 8;
mem[size - 17] = size >> 0;
}
i = zfile_fread (mem, 1, size, f);
@ -1231,6 +1234,10 @@ static int read_kickstart (struct zfile *f, uae_u8 *mem, int size, int dochecksu
if (!decode_rom (mem, size, cr, i))
return 0;
}
if (size <= 256)
return size;
if (currprefs.cs_a1000ram && i < ROM_SIZE_256) {
int off = 0;
if (!a1000_bootrom)
@ -1439,40 +1446,49 @@ static bool load_kickstart_replacement (void)
return true;
}
static int load_kickstart (void)
static struct zfile *get_kickstart_filehandle(struct uae_prefs *p)
{
struct zfile *f;
TCHAR tmprom[MAX_DPATH], tmprom2[MAX_DPATH];
cloanto_rom = 0;
if (!_tcscmp (currprefs.romfile, _T(":AROS")))
return load_kickstart_replacement ();
f = read_rom_name (currprefs.romfile);
_tcscpy (tmprom, currprefs.romfile);
f = read_rom_name(p->romfile);
_tcscpy(tmprom, p->romfile);
if (f == NULL) {
_stprintf (tmprom2, _T("%s%s"), start_path_data, currprefs.romfile);
f = rom_fopen (tmprom2, _T("rb"), ZFD_NORMAL);
_stprintf(tmprom2, _T("%s%s"), start_path_data, p->romfile);
f = rom_fopen(tmprom2, _T("rb"), ZFD_NORMAL);
if (f == NULL) {
_stprintf (currprefs.romfile, _T("%sroms/kick.rom"), start_path_data);
f = rom_fopen (currprefs.romfile, _T("rb"), ZFD_NORMAL);
_stprintf(p->romfile, _T("%sroms/kick.rom"), start_path_data);
f = rom_fopen(p->romfile, _T("rb"), ZFD_NORMAL);
if (f == NULL) {
_stprintf (currprefs.romfile, _T("%skick.rom"), start_path_data);
f = rom_fopen (currprefs.romfile, _T("rb"), ZFD_NORMAL);
_stprintf(p->romfile, _T("%skick.rom"), start_path_data);
f = rom_fopen(p->romfile, _T("rb"), ZFD_NORMAL);
if (f == NULL) {
_stprintf (currprefs.romfile, _T("%s../shared/rom/kick.rom"), start_path_data);
f = rom_fopen (currprefs.romfile, _T("rb"), ZFD_NORMAL);
_stprintf(p->romfile, _T("%s../shared/rom/kick.rom"), start_path_data);
f = rom_fopen(p->romfile, _T("rb"), ZFD_NORMAL);
if (f == NULL) {
_stprintf (currprefs.romfile, _T("%s../System/rom/kick.rom"), start_path_data);
f = rom_fopen (currprefs.romfile, _T("rb"), ZFD_NORMAL);
_stprintf(p->romfile, _T("%s../System/rom/kick.rom"), start_path_data);
f = rom_fopen(p->romfile, _T("rb"), ZFD_NORMAL);
if (f == NULL)
f = read_rom_name_guess (tmprom);
f = read_rom_name_guess(tmprom);
}
}
}
} else {
_tcscpy (currprefs.romfile, tmprom2);
_tcscpy(p->romfile, tmprom2);
}
}
return f;
}
static int load_kickstart (void)
{
TCHAR tmprom[MAX_DPATH];
cloanto_rom = 0;
if (!_tcscmp(currprefs.romfile, _T(":AROS"))) {
return load_kickstart_replacement();
}
_tcscpy(tmprom, currprefs.romfile);
struct zfile *f = get_kickstart_filehandle(&currprefs);
addkeydir (currprefs.romfile);
if (f == NULL) /* still no luck */
goto err;
@ -1692,7 +1708,7 @@ bool mapped_malloc (addrbank *ab)
static int recurse;
if (ab->allocated_size) {
write_log(_T("mapped_malloc with memory bank '%s' already allocated!?"), ab->name);
write_log(_T("mapped_malloc with memory bank '%s' already allocated!?\n"), ab->name);
}
ab->allocated_size = 0;
@ -2256,6 +2272,27 @@ static void restore_roms(void)
protect_roms (true);
}
bool read_kickstart_version(struct uae_prefs *p)
{
kickstart_version = 0;
cloanto_rom = 0;
struct zfile *z = get_kickstart_filehandle(p);
if (!z)
return false;
uae_u8 mem[32] = { 0 };
read_kickstart(z, mem, sizeof mem, 0, 0);
zfile_fclose(z);
kickstart_version = (mem[12] << 8) | mem[13];
if (kickstart_version == 0xffff) {
// 1.0-1.1 and older
kickstart_version = (mem[16] << 8) | mem[17];
if (kickstart_version > 33)
kickstart_version = 0;
}
write_log(_T("KS ver = %04x\n"), kickstart_version);
return true;
}
void reload_roms(void)
{
if (roms_modified)
@ -2413,7 +2450,7 @@ void memory_reset (void)
a1000_handle_kickstart (1);
#ifdef AUTOCONFIG
map_banks (&expamem_bank, 0xE8, 1, 0);
expansion_map();
#endif
if (a3000_f0)

View File

@ -164,6 +164,7 @@ static struct ncr9x_state *ncr_dkb1200_scsi;
static struct ncr9x_state *ncr_ematrix530_scsi;
static struct ncr9x_state *ncr_multievolution_scsi;
static struct ncr9x_state *ncr_golemfast_scsi[MAX_DUPLICATE_EXPANSION_BOARDS];
static struct ncr9x_state *ncr_scram5394_scsi[MAX_DUPLICATE_EXPANSION_BOARDS];
static struct ncr9x_state *ncr_units[MAX_NCR9X_UNITS + 1];
@ -604,7 +605,7 @@ int32_t scsiesp_req_enqueue(SCSIRequest *req)
sd->data_len = 0;
scsi_start_transfer(sd);
scsi_emulate_analyze(sd);
#if 0
#if NCR_DEBUG
write_log (_T("%02x.%02x.%02x.%02x.%02x.%02x\n"), sd->cmd[0], sd->cmd[1], sd->cmd[2], sd->cmd[3], sd->cmd[4], sd->cmd[5]);
#endif
if (sd->direction <= 0)
@ -628,8 +629,18 @@ uint8_t *scsiesp_req_get_buf(SCSIRequest *req)
SCSIDevice *scsiesp_device_find(SCSIBus *bus, int channel, int target, int lun)
{
struct ncr9x_state *ncr = (struct ncr9x_state*)bus->privdata;
if (lun != 0 || target < 0 || target >= 8)
if (lun != 0 || target < 0 || target >= 8) {
#if NCR_DEBUG
write_log(_T("Selected not supported: %d-%d-%d\n"), channel, target, lun);
#endif
return NULL;
}
#if NCR_DEBUG
if (ncr->scsid[target])
write_log(_T("Selected: %d-%d-%d\n"), channel, target, lun);
else
write_log(_T("Selected non-existing: %d-%d-%d\n"), channel, target, lun);
#endif
return ncr->scsid[target];
}
void scsiesp_req_cancel(SCSIRequest *req)
@ -659,7 +670,29 @@ static void ncr9x_io_bput(struct ncr9x_state *ncr, uaecptr addr, uae_u32 val)
uaecptr oldaddr = addr;
addr &= ncr->board_mask;
if (ncr == ncr_multievolution_scsi) {
if (isncr(ncr, ncr_scram5394_scsi)) {
if (addr >= 0x8000 && addr < 0xa000) {
if (ncr->fakedma_data_offset < ncr->fakedma_data_size) {
ncr->fakedma_data_buf[ncr->fakedma_data_offset++] = val;
if (ncr->fakedma_data_offset == ncr->fakedma_data_size) {
memcpy(ncr->fakedma_data_write_buffer, ncr->fakedma_data_buf, ncr->fakedma_data_size);
esp_fake_dma_done(ncr->devobject.lsistate);
}
}
return;
}
if (addr & 1) {
return;
}
if (addr < 0x6000 || addr >= 0xc000) {
return;
}
reg_shift = 1;
} else if (ncr == ncr_multievolution_scsi) {
reg_shift = 1;
if (addr & 0x1000) {
if (ncr->fakedma_data_offset < ncr->fakedma_data_size) {
@ -975,7 +1008,33 @@ static uae_u32 ncr9x_io_bget(struct ncr9x_state *ncr, uaecptr addr)
addr &= ncr->board_mask;
if (ncr == ncr_multievolution_scsi) {
if (isncr(ncr, ncr_scram5394_scsi)) {
if (addr >= 0x8000 && addr < 0xa000) {
if (ncr->fakedma_data_offset >= ncr->fakedma_data_size)
return 0;
v = ncr->fakedma_data_buf[ncr->fakedma_data_offset++];
if (ncr->fakedma_data_offset == ncr->fakedma_data_size) {
esp_fake_dma_done(ncr->devobject.lsistate);
}
return v;
}
if (addr & 1)
return v;
if (addr == 0) {
v = ncr->rom[0];
v |= !ncr->chipirq ? 0x80 : 0x00;
return v;
}
if (addr < 0x4000 || addr >= 0xc000) {
v = ncr->rom[(addr >> 1) & 8191];
return v;
}
if (addr < 0x6000)
return v;
reg_shift = 1;
} else if (ncr == ncr_multievolution_scsi) {
reg_shift = 1;
if (addr & 0x1000) {
@ -1242,12 +1301,24 @@ static uae_u32 ncr9x_bget2(struct ncr9x_state *ncr, uaecptr addr)
}
if (ncr->io_end && (addr < ncr->io_start || addr >= ncr->io_end))
return v;
return ncr9x_io_bget(ncr, addr);
v = ncr9x_io_bget(ncr, addr);
#if NCR_DEBUG > 5
write_log(_T("ncr9x_bget2 %08x %02x %08x\n"), addr, (uae_u8)v, M68K_GETPC);
#endif
return v;
}
static void ncr9x_bput2(struct ncr9x_state *ncr, uaecptr addr, uae_u32 val)
{
uae_u32 v = val;
#if NCR_DEBUG > 5
write_log(_T("ncr9x_bget2 %08x %02x %08x\n"), addr, (uae_u8)val, M68K_GETPC);
#endif
addr &= ncr->board_mask;
if (ncr->io_end && (addr < ncr->io_start || addr >= ncr->io_end))
return;
@ -1672,7 +1743,6 @@ bool ncr_oktagon_autoconfig_init(struct autoconfig_info *aci)
return true;
}
bool ncr_dkb_autoconfig_init(struct autoconfig_info *aci)
{
if (!aci->doinit) {
@ -1799,6 +1869,36 @@ void ncr_masoboshi_autoconfig_init(struct romconfig *rc, uaecptr baseaddress)
ncr9x_reset_board(ncr);
}
bool ncr_scram5394_init(struct autoconfig_info *aci)
{
const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_SCRAM5394);
if (!aci->doinit) {
aci->autoconfigp = ert->autoconfig;
return true;
}
struct ncr9x_state *ncr = getscsi(aci->rc);
if (!ncr)
return false;
ncr->enabled = true;
ncr->bank = &ncr9x_bank_generic;
ncr->board_mask = 65535;
xfree(ncr->rom);
ncr->rom = xcalloc(uae_u8, 8192);
load_rom_rc(aci->rc, ROMTYPE_SCRAM5394, 8192, 0, ncr->rom, 8192, 0);
for (int i = 0; i < 16; i++) {
uae_u8 b = ert->autoconfig[i];
ew(ncr, i * 4, b);
}
ncr9x_reset_board(ncr);
aci->addrbank = ncr->bank;
return true;
}
static void ncr9x_esp_scsi_init(struct ncr9x_state *ncr, ESPDMAMemoryReadWriteFunc read, ESPDMAMemoryReadWriteFunc write, void (*irq_func)(struct ncr9x_state*), int mode)
{
ncr->board_mask = 0xffff;
@ -1940,4 +2040,11 @@ void golemfast_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romco
esp_dma_enable(ncr_golemfast_scsi[ci->controller_type_unit]->devobject.lsistate, 1);
}
void scram5394_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
{
ncr9x_add_scsi_unit(&ncr_scram5394_scsi[ci->controller_type_unit], ch, ci, rc);
ncr9x_esp_scsi_init(ncr_scram5394_scsi[ci->controller_type_unit], fake_dma_read, fake_dma_write, set_irq2, 0);
esp_dma_enable(ncr_scram5394_scsi[ci->controller_type_unit]->devobject.lsistate, 1);
}
#endif

View File

@ -49,7 +49,7 @@
#include <signal.h>
#else
/* Need to have these somewhere */
bool check_prefs_changed_comp (void) { return false; }
bool check_prefs_changed_comp (bool checkonly) { return false; }
#endif
/* For faster JIT cycles handling */
uae_s32 pissoff = 0;

View File

@ -28,7 +28,6 @@
#define IDS_CHIPSET2 20
#define IDS_GAMEPORTS 21
#define IDS_EXPANSION 22
#define IDS_STRING23 23
#define IDS_EXPANSION2 23
#define IDS_BOARD 24
#define IDS_EXTTEXT 100
@ -384,7 +383,6 @@
#define IDS_SELECTTAPE 391
#define IDS_TAPE 392
#define IDS_SCREEN_NATIVE 392
#define IDS_STRING393 393
#define IDS_SCREEN_RTG 393
#define IDS_DISPLAYMODE_NATIVE 394
#define IDS_CURRENT_CONFIGURATION 395
@ -393,7 +391,6 @@
#define IDS_SLIRP 398
#define IDD_EXPANSION2 398
#define IDS_SLIRP_INBOUND 399
#define IDD_DIALOG2 399
#define IDD_BOARDS 399
#define IDS_FILTER_PAL_EXTRA 400
#define IDS_FILTER_3D_EXTRA 401
@ -404,6 +401,7 @@
#define IDS_AUTOSCALE_OVERSCAN_BLANK 408
#define IDS_SCREEN_ADAPTIVE_SYNC 409
#define IDS_NUMSG_NOMEMORY 410
#define IDS_EXPANSION_CATEGORY 411
#define IDS_QS_MODELS 1000
#define IDS_QS_MODEL_A500 1001
#define IDS_QS_MODEL_A500P 1002
@ -1212,6 +1210,7 @@
#define IDC_RTG_DISPLAYSELECT 1809
#define IDC_FASTMEMAUTOCONFIGUSE 1809
#define IDC_MISCLIST 1810
#define IDC_FASTMEMNOAUTOCONFIG 1810
#define IDC_STATENAME 1811
#define IDC_SAMPLER_STEREO 1812
#define IDC_LISTDIALOG_LIST 1813
@ -1262,7 +1261,9 @@
#define IDC_AUTOCONFIG_DATA 1851
#define IDC_AUTOCONFIGCUSTOMSORT 1851
#define IDC_BOARDS_DOWN 1852
#define IDC_RAM_ADDRESS 1852
#define IDC_BOARDS_UP 1853
#define IDC_RAM_ADDRESS2 1853
#define ID__FLOPPYDRIVES 40004
#define ID_FLOPPYDRIVES_DF0 40005
#define ID_ST_CONFIGURATION 40010

View File

@ -205,7 +205,7 @@ BEGIN
CONTROL "Monochrome video out",IDC_GRAYSCALE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,167,139,10
END
IDD_MEMORY DIALOGEX 0, 0, 396, 247
IDD_MEMORY DIALOGEX 0, 0, 396, 266
STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD
EXSTYLE WS_EX_CONTEXTHELP
FONT 8, "MS Sans Serif", 0, 0, 0x1
@ -227,11 +227,11 @@ BEGIN
CONTROL "",IDC_Z3CHIPMEM,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,248,71,60,20
EDITTEXT IDC_Z3CHIPRAM,311,76,40,12,ES_CENTER | ES_READONLY
EDITTEXT IDC_MAX32RAM,14,99,366,12,ES_CENTER | ES_READONLY
GROUPBOX "Advanced Memory Settings",IDC_STATIC,1,128,393,115
GROUPBOX "Advanced Memory Settings",IDC_STATIC,1,128,393,137
CONTROL "",IDC_MEMORYMEM,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,253,145,68,20
EDITTEXT IDC_MEMORYRAM,328,148,40,12,ES_CENTER | ES_READONLY
LTEXT "Z3 mapping mode:",IDC_STATIC,263,194,115,15,SS_CENTERIMAGE
COMBOBOX IDC_Z3MAPPING,262,216,117,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
LTEXT "Z3 mapping mode:",IDC_STATIC,263,215,115,15,SS_CENTERIMAGE
COMBOBOX IDC_Z3MAPPING,262,237,117,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
COMBOBOX IDC_MEMORYSELECT,14,151,228,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
EDITTEXT IDC_AUTOCONFIG_MANUFACTURER,78,175,45,13,ES_AUTOHSCROLL
EDITTEXT IDC_AUTOCONFIG_PRODUCT,196,175,45,13,ES_AUTOHSCROLL
@ -242,6 +242,10 @@ BEGIN
CONTROL "Edit Autoconfig data",IDC_FASTMEMAUTOCONFIGUSE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,261,177,103,8
RTEXT "Memory board",IDC_STATIC,15,216,53,15,SS_CENTERIMAGE
COMBOBOX IDC_MEMORYBOARDSELECT,77,216,165,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
CONTROL "Manual configuration",IDC_FASTMEMNOAUTOCONFIG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,261,195,103,8
RTEXT "Address range",IDC_STATIC,10,237,57,15,SS_CENTERIMAGE
EDITTEXT IDC_RAM_ADDRESS,77,237,79,13,ES_AUTOHSCROLL
EDITTEXT IDC_RAM_ADDRESS2,164,237,79,13,ES_AUTOHSCROLL
END
IDD_CPU DIALOGEX 0, 0, 396, 317
@ -1478,6 +1482,7 @@ BEGIN
IDD_MEMORY, DIALOG
BEGIN
BOTTOMMARGIN, 265
END
IDD_CPU, DIALOG
@ -2077,6 +2082,7 @@ BEGIN
IDS_AUTOSCALE_OVERSCAN_BLANK "Overscan blanking"
IDS_SCREEN_ADAPTIVE_SYNC "Variable Sync"
IDS_NUMSG_NOMEMORY "Out of memory or too much Z3 autoconfig space configured.\nIf 64-bit, make sure RTG board is first in board list."
IDS_EXPANSION_CATEGORY "Built-in expansions\nSCSI controllers\nIDE controllers\nSASI controllers\nCustom controllers\nPCI bridgeboards\nx86 bridgeboards\nRTG boards\nSound cards\nNetwork adapters\nDisk controllers"
END
#endif // English resources

View File

@ -20,12 +20,12 @@
#define LANG_DLL_FULL_VERSION_MATCH 1
#if WINUAEPUBLICBETA
#define WINUAEBETA _T("6")
#define WINUAEBETA _T("7")
#else
#define WINUAEBETA _T("")
#endif
#define WINUAEDATE MAKEBD(2016, 9, 11)
#define WINUAEDATE MAKEBD(2016, 9, 17)
//#define WINUAEEXTRA _T("AmiKit Preview")
//#define WINUAEEXTRA _T("Amiga Forever Edition")

View File

@ -2821,6 +2821,7 @@ int DiskSelection_2 (HWND hDlg, WPARAM wParam, int flag, struct uae_prefs *prefs
case IDC_ROMFILE:
_tcscpy (workprefs.romfile, full_path);
fullpath (workprefs.romfile, MAX_DPATH);
read_kickstart_version(&workprefs);
break;
case IDC_ROMFILE2:
_tcscpy (workprefs.romextfile, full_path);
@ -7958,6 +7959,9 @@ static struct ramboard *fastram_select_ramboard;
static void enable_for_memorydlg (HWND hDlg)
{
int z3 = workprefs.address_space_24 == false;
bool ac = fastram_select_ramboard && fastram_select_ramboard->autoconfig_inuse;
bool manual = fastram_select_ramboard && fastram_select_ramboard->manual_config;
bool size = fastram_select_ramboard && fastram_select_ramboard->size != 0;
#ifndef AUTOCONFIG
z3 = FALSE;
@ -7974,24 +7978,27 @@ static void enable_for_memorydlg (HWND hDlg)
ew (hDlg, IDC_FASTTEXT, true);
bool isfast = fastram_select < 2 * MAX_RAM_BOARDS && fastram_select_ramboard && fastram_select_ramboard->size;
ew(hDlg, IDC_AUTOCONFIG_MANUFACTURER, isfast);
ew(hDlg, IDC_AUTOCONFIG_PRODUCT, isfast);
ew(hDlg, IDC_AUTOCONFIG_MANUFACTURER, isfast && !manual);
ew(hDlg, IDC_AUTOCONFIG_PRODUCT, isfast && !manual);
ew(hDlg, IDC_MEMORYBOARDSELECT, isfast);
ew(hDlg, IDC_AUTOCONFIG_DATA, fastram_select_ramboard && fastram_select_ramboard->autoconfig_inuse && fastram_select_ramboard->size);
ew(hDlg, IDC_AUTOCONFIG_DATA, ac && size);
ew(hDlg, IDC_FASTMEMAUTOCONFIGUSE, isfast);
ew(hDlg, IDC_FASTMEMNOAUTOCONFIG, isfast);
ew(hDlg, IDC_MEMORYRAM, true);
ew(hDlg, IDC_MEMORYMEM, true);
ew(hDlg, IDC_RAM_ADDRESS, manual && size);
ew(hDlg, IDC_RAM_ADDRESS2, false);
}
static void setfastram_ramboard(HWND hDlg, int zram)
{
if (!fastram_select_ramboard)
return;
int idx = 0;
int idx = 1;
for (int i = 0; memoryboards[i].name; i++) {
const struct memoryboardtype *mbt = &memoryboards[i];
if (mbt->z == zram) {
if (mbt->manufacturer == fastram_select_ramboard->manufacturer && mbt->product == fastram_select_ramboard->product) {
if ((mbt->manufacturer == fastram_select_ramboard->manufacturer && mbt->product == fastram_select_ramboard->product) || (mbt->address && mbt->address == fastram_select_ramboard->start_address)) {
SendDlgItemMessage(hDlg, IDC_MEMORYBOARDSELECT, CB_SETCURSEL, idx, 0);
break;
}
@ -8088,11 +8095,20 @@ static void setfastram_selectmenu(HWND hDlg, int mode)
expansion_generate_autoconfig_info(&workprefs);
struct ramboard *rb = fastram_select_ramboard;
setchecked(hDlg, IDC_FASTMEMAUTOCONFIGUSE, rb && rb->autoconfig_inuse);
setchecked(hDlg, IDC_FASTMEMNOAUTOCONFIG, rb && rb->manual_config);
if (rb) {
if (rb->manual_config) {
rb->end_address = rb->start_address + rb->size - 1;
} else {
rb->start_address = 0;
rb->end_address = 0;
}
if (fastram_select_ramboard_old != fastram_select_ramboard || mode < 0) {
if (zram) {
ew(hDlg, IDC_MEMORYBOARDSELECT, TRUE);
SendDlgItemMessage(hDlg, IDC_MEMORYBOARDSELECT, CB_RESETCONTENT, 0, 0);
SendDlgItemMessage(hDlg, IDC_MEMORYBOARDSELECT, CB_ADDSTRING, 0, (LPARAM)_T("-"));
for (int i = 0; memoryboards[i].name; i++) {
const struct memoryboardtype *mbt = &memoryboards[i];
if (mbt->z == zram) {
@ -8123,6 +8139,23 @@ static void setfastram_selectmenu(HWND hDlg, int mode)
}
}
}
if (mode != 3) {
if (aci && !rb->manual_config) {
_stprintf(tmp, _T("%08x"), aci->start);
SetDlgItemText(hDlg, IDC_RAM_ADDRESS, tmp);
_stprintf(tmp, _T("%08x"), aci->start + aci->size - 1);
SetDlgItemText(hDlg, IDC_RAM_ADDRESS2, tmp);
} else if (rb->manual_config) {
_stprintf(tmp, _T("%08x"), rb->start_address);
SetDlgItemText(hDlg, IDC_RAM_ADDRESS, tmp);
_stprintf(tmp, _T("%08x"), rb->end_address);
SetDlgItemText(hDlg, IDC_RAM_ADDRESS2, tmp);
} else {
SetDlgItemText(hDlg, IDC_RAM_ADDRESS, _T(""));
SetDlgItemText(hDlg, IDC_RAM_ADDRESS2, _T(""));
}
}
if (mode == 1 && rb->autoconfig_inuse) {
rb->autoconfig[1] = rb->product;
rb->autoconfig[4] = (rb->manufacturer >> 8) & 0xff;
@ -9042,6 +9075,8 @@ static void values_to_expansion2_expansion_settings(HWND hDlg, int mode)
ew(hDlg, IDC_SCSIROMID, ert->id_jumper);
const struct expansionboardsettings *cbs = ert->settings;
create_expansionrom_gui(hDlg, &expansion_gui_item, cbs, brc ? brc->roms[index].device_settings : 0, IDC_EXPANSIONBOARDITEMSELECTOR, IDC_EXPANSIONBOARDSELECTOR, IDC_EXPANSIONBOARDCHECKBOX);
} else {
reset_expansionrom_gui(hDlg, &expansion_gui_item, IDC_EXPANSIONBOARDITEMSELECTOR, IDC_EXPANSIONBOARDSELECTOR, IDC_EXPANSIONBOARDCHECKBOX);
}
@ -9205,7 +9240,7 @@ static void expansion2filebuttons(HWND hDlg, WPARAM wParam, TCHAR *path)
static INT_PTR CALLBACK Expansion2DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
int v, val;
TCHAR tmp[100];
TCHAR tmp[MAX_DPATH];
static int recursive = 0;
static int enumerated;
@ -9242,18 +9277,19 @@ static INT_PTR CALLBACK Expansion2DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LP
SendDlgItemMessage(hDlg, IDC_CPUBOARD_TYPE, CB_ADDSTRING, 0, (LPARAM) cpuboards[i].name);
}
WIN32GUI_LoadUIString(IDS_EXPANSION_CATEGORY, tmp, sizeof tmp / sizeof(TCHAR));
SendDlgItemMessage(hDlg, IDC_SCSIROMSELECTCAT, CB_RESETCONTENT, 0, 0);
SendDlgItemMessage(hDlg, IDC_SCSIROMSELECTCAT, CB_ADDSTRING, 0, (LPARAM)_T("Built-in CD/HD Controllers"));
SendDlgItemMessage(hDlg, IDC_SCSIROMSELECTCAT, CB_ADDSTRING, 0, (LPARAM)_T("SCSI Controllers"));
SendDlgItemMessage(hDlg, IDC_SCSIROMSELECTCAT, CB_ADDSTRING, 0, (LPARAM)_T("IDE Controllers"));
SendDlgItemMessage(hDlg, IDC_SCSIROMSELECTCAT, CB_ADDSTRING, 0, (LPARAM)_T("SASI Controllers"));
SendDlgItemMessage(hDlg, IDC_SCSIROMSELECTCAT, CB_ADDSTRING, 0, (LPARAM)_T("Custom Controllers"));
SendDlgItemMessage(hDlg, IDC_SCSIROMSELECTCAT, CB_ADDSTRING, 0, (LPARAM)_T("PCI Bridgeboards"));
SendDlgItemMessage(hDlg, IDC_SCSIROMSELECTCAT, CB_ADDSTRING, 0, (LPARAM)_T("x86 Bridgeboards"));
SendDlgItemMessage(hDlg, IDC_SCSIROMSELECTCAT, CB_ADDSTRING, 0, (LPARAM)_T("RTG boards"));
SendDlgItemMessage(hDlg, IDC_SCSIROMSELECTCAT, CB_ADDSTRING, 0, (LPARAM)_T("Sound cards"));
SendDlgItemMessage(hDlg, IDC_SCSIROMSELECTCAT, CB_ADDSTRING, 0, (LPARAM)_T("Network adapters"));
SendDlgItemMessage(hDlg, IDC_SCSIROMSELECTCAT, CB_ADDSTRING, 0, (LPARAM)_T("Disk controllers"));
_tcscat(tmp, _T("\n"));
TCHAR *p1 = tmp;
for (;;) {
TCHAR *p2 = _tcschr(p1, '\n');
if (p2 && _tcslen(p2) > 0) {
*p2++ = 0;
SendDlgItemMessage(hDlg, IDC_SCSIROMSELECTCAT, CB_ADDSTRING, 0, (LPARAM)p1);
p1 = p2;
} else
break;
}
reset_expansionrom_gui(hDlg, &expansion_gui_item, IDC_EXPANSIONBOARDITEMSELECTOR, IDC_EXPANSIONBOARDSELECTOR, IDC_EXPANSIONBOARDCHECKBOX);
reset_expansionrom_gui(hDlg, &accelerator_gui_item, IDC_ACCELERATORBOARDITEMSELECTOR, IDC_ACCELERATORBOARDSELECTOR, IDC_ACCELERATORBOARDCHECKBOX);
@ -10057,6 +10093,24 @@ static INT_PTR CALLBACK BoardsDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM
return FALSE;
}
static const struct memoryboardtype* getmemoryboardselect(HWND hDlg)
{
int v = SendDlgItemMessage(hDlg, IDC_MEMORYBOARDSELECT, CB_GETCURSEL, 0, 0L);
if (v == CB_ERR)
return NULL;
int idx = 1;
for (int i = 0; memoryboards[i].name; i++) {
const struct memoryboardtype *mbt = &memoryboards[i];
if ((fastram_select < MAX_RAM_BOARDS && mbt->z == 2) || (fastram_select >= MAX_RAM_BOARDS && mbt->z == 3)) {
if (idx == v) {
return mbt;
}
}
idx++;
}
return NULL;
}
static INT_PTR CALLBACK MemoryDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
@ -10100,10 +10154,24 @@ static INT_PTR CALLBACK MemoryDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARA
recursive++;
switch (LOWORD(wParam))
{
case IDC_FASTMEMAUTOCONFIGUSE:
case IDC_FASTMEMAUTOCONFIGUSE:
if (fastram_select_ramboard) {
struct ramboard *rb = fastram_select_ramboard;
rb->autoconfig_inuse = ischecked(hDlg, IDC_FASTMEMAUTOCONFIGUSE);
rb->manual_config = false;
setfastram_selectmenu(hDlg, 0);
}
break;
case IDC_FASTMEMNOAUTOCONFIG:
if (fastram_select_ramboard) {
struct ramboard *rb = fastram_select_ramboard;
rb->autoconfig_inuse = ischecked(hDlg, IDC_FASTMEMAUTOCONFIGUSE);
rb->manual_config = ischecked(hDlg, IDC_FASTMEMNOAUTOCONFIG);
rb->autoconfig_inuse = false;
const struct memoryboardtype *mbt = getmemoryboardselect(hDlg);
if (mbt && fastram_select_ramboard->manual_config && mbt->address) {
fastram_select_ramboard->start_address = mbt->address;
fastram_select_ramboard->end_address = mbt->address + fastram_select_ramboard->size - 1;
}
setfastram_selectmenu(hDlg, 0);
}
break;
@ -10126,26 +10194,26 @@ static INT_PTR CALLBACK MemoryDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARA
break;
case IDC_MEMORYBOARDSELECT:
if (fastram_select_ramboard) {
v = SendDlgItemMessage(hDlg, IDC_MEMORYBOARDSELECT, CB_GETCURSEL, 0, 0L);
if (v != CB_ERR) {
int idx = 0;
for (int i = 0; memoryboards[i].name; i++) {
const struct memoryboardtype *mbt = &memoryboards[i];
if ((fastram_select < MAX_RAM_BOARDS && mbt->z == 2) || (fastram_select >= MAX_RAM_BOARDS && mbt->z == 3)) {
if (idx == v) {
fastram_select_ramboard->manufacturer = mbt->manufacturer;
fastram_select_ramboard->product = mbt->product;
setfastram_selectmenu(hDlg, 0);
break;
}
idx++;
}
const struct memoryboardtype *mbt = getmemoryboardselect(hDlg);
if (mbt) {
if (mbt->manufacturer != 0xffff) {
fastram_select_ramboard->manufacturer = mbt->manufacturer;
fastram_select_ramboard->product = mbt->product;
} else {
fastram_select_ramboard->autoconfig_inuse = false;
fastram_select_ramboard->manual_config = true;
}
if (fastram_select_ramboard->manual_config && mbt->address) {
fastram_select_ramboard->start_address = mbt->address;
fastram_select_ramboard->end_address = mbt->address + fastram_select_ramboard->size - 1;
}
setfastram_selectmenu(hDlg, 0);
break;
}
}
break;
}
} else if (HIWORD(wParam) == EN_CHANGE) {
} else if (HIWORD(wParam) == EN_CHANGE || HIWORD(wParam) == EN_KILLFOCUS) {
switch (LOWORD(wParam))
{
case IDC_AUTOCONFIG_MANUFACTURER:
@ -10158,6 +10226,15 @@ static INT_PTR CALLBACK MemoryDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARA
setfastram_selectmenu(hDlg, 1);
}
break;
case IDC_RAM_ADDRESS:
case IDC_RAM_ADDRESS2:
if (fastram_select_ramboard) {
TCHAR *endptr;
GetDlgItemText(hDlg, IDC_RAM_ADDRESS, tmp, sizeof tmp / sizeof(TCHAR));
fastram_select_ramboard->start_address = _tcstol(tmp, &endptr, 16);
setfastram_selectmenu(hDlg, HIWORD(wParam) == EN_KILLFOCUS ? 0 : 3);
}
break;
case IDC_AUTOCONFIG_DATA:
if (fastram_select_ramboard && fastram_select_ramboard->autoconfig_inuse) {
struct ramboard *rb = fastram_select_ramboard;
@ -10271,6 +10348,7 @@ static void values_from_kickstartdlg(HWND hDlg)
getromfile(hDlg, IDC_ROMFILE2, workprefs.romextfile, sizeof(workprefs.romextfile) / sizeof(TCHAR));
getromfile(hDlg, IDC_CARTFILE, workprefs.cartfile, sizeof(workprefs.cartfile) / sizeof(TCHAR));
read_kickstart_version(&workprefs);
int v = SendDlgItemMessage(hDlg, IDC_UAEBOARD_TYPE, CB_GETCURSEL, 0, 0);
if (v > 0) {
workprefs.uaeboard = v - 1;
@ -10283,9 +10361,7 @@ static void values_from_kickstartdlg(HWND hDlg)
static void init_kickstart (HWND hDlg)
{
#if !defined(AUTOCONFIG)
ew (hDlg, IDC_MAPROM), FALSE);
#endif
ew (hDlg, IDC_MAPROM, workprefs.cpuboard_type == 0);
#if !defined (CDTV) && !defined (CD32)
ew (hDlg, IDC_FLASHFILE), FALSE);
ew (hDlg, IDC_ROMFILE2), FALSE);

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="packages\VisualCppTools.14.0.24509-Pre\build\native\VisualCppTools.props" Condition="Exists('packages\VisualCppTools.14.0.24509-Pre\build\native\VisualCppTools.props')" />
<Import Project="packages\VisualCppTools.14.0.24515-Pre\build\native\VisualCppTools.props" Condition="Exists('packages\VisualCppTools.14.0.24515-Pre\build\native\VisualCppTools.props')" />
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
@ -1124,6 +1124,6 @@
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('packages\VisualCppTools.14.0.24509-Pre\build\native\VisualCppTools.props')" Text="$([System.String]::Format('$(ErrorText)', 'packages\VisualCppTools.14.0.24509-Pre\build\native\VisualCppTools.props'))" />
<Error Condition="!Exists('packages\VisualCppTools.14.0.24515-Pre\build\native\VisualCppTools.props')" Text="$([System.String]::Format('$(ErrorText)', 'packages\VisualCppTools.14.0.24515-Pre\build\native\VisualCppTools.props'))" />
</Target>
</Project>

View File

@ -5,6 +5,29 @@ JIT Direct current rules are less complex now. It automatically switches off onl
- RTG VRAM is outside of reserved natmem space. Workaround: Move RTG in earlier position using Hardware info GUI panel.
Note that in 64-bit version RTG VRAM must be inside of reserved natmem space. (Outside = error message and return back to GUI)
- CD32 FMV ROM image was not loaded correctly from pre-3.4 config files.
- CD32 first CD audio track play attempt from the beginning was confused with TOC subchannel read.
- Z2/Z3 autoconfig data first byte's upper 5 bits was not editable. Only low 3 size bits should be forced (board size).
- Implemented non-autoconfig RAM board definition support. Added DKB Insider I/II.
- CD emulation didn't automatically load TOC when accessing the CD for the first time and program didn't request TOC previously. (Fixes
Buddha ATAPI device not reading CD in non-image mode)
- Added manual (non-autoconfig) GUI memory board support. Any Z2 or Z3 board can be configured as manually mapped.
- Pre-KS1.2 boot support works again. Now expansion tree is build before emulation starts but pre-KS1.2 boot support obviously needs
to know KS version before emulation starts but KS won't be loaded until emulation starts..
- Fixed harmless "SCSI command xx, no direction specified!" messages when attempting to play audio CD using hardware SCSI/ATAPI emulation.
- Fixed unstable Portaudio audio in vsync modes.
- Tecmar T-Card RAM works again. First Z2 RAM is emulated as Tecmar autoconfig RAM board.
- Shortcuts with SHIFT work again in optimized builds. It was buffer overflow (reading past end of buffer) very deep in input handling.
- Both SCRAM 500/2000 SCSI board variants emulated (DP8490V = 53C80 and NCR53C94).
- More ESP/NCR5394/FAS216 updates, FIFO in PIO mode only can contain max 1 byte. (SCRAM NCR53C94 fix)
- Otronic Filecard 2000/OSSI 500 emulation. (Official ROM is MIA, Aminet replacement rom works but it needs to be merged first)
- Automatically loaded default.uae with unplugged input device: set it to none, not layout A.
- Include CD/FMV audio caused infinite loop when playing CD audio.
- Disable ROM panel UAE MapROM option if accelerator board emulation is enabled. They are incompatible.
- Accelerator boards that required ROM but nothing was selected: crashed during expansion tree building.
- DD-only drive + turbo floppy mode + standard ADF HD floppy image: valid MFM was returned.
- Ignore all write attempts if standard ADF HD image in DD-only flpppy drive.
Beta 6:
- Workaround for possible NCR53C720+ emulation bug when read is shorter than command's allocation size. CSPPC SCSI driver gets confused
@ -18,7 +41,7 @@ Beta 6:
- Compiled again with pre-release MSVC compiler. Does speed now match 3.3.0? (Few reported that 3.4 betas have slower performance)
This breaks most SHIFT+<something> shortcuts.. (It appears to be optimizer bug related to 64-bit variables in 32-bit mode)
Temporary change, either I'll add workaround or I'll use official version or final/fixed version will be released soon.
Only confirming if this helps with performance.
Only confirming if this helps with performance. (3.3.0 was accidentally compiled with pre-release version..)
Beta 5:

133
scsi.cpp
View File

@ -56,13 +56,15 @@
#define NCR5380_PHOENIXBOARD 25
#define NCR5380_TRUMPCARDPRO 26
#define NCR5380_IVSVECTOR 27 // nearly identical to trumpcard pro
#define NCR_LAST 28
#define NCR5380_SCRAM 28
#define NCR5380_OSSI 29
#define NCR_LAST 30
extern int log_scsiemu;
static const int outcmd[] = { 0x04, 0x0a, 0x0c, 0x2a, 0xaa, 0x15, 0x55, 0x0f, -1 };
static const int incmd[] = { 0x01, 0x03, 0x08, 0x12, 0x1a, 0x5a, 0x25, 0x28, 0x34, 0x37, 0x42, 0x43, 0xa8, 0x51, 0x52, 0xb9, 0xbd, 0xbe, -1 };
static const int nonecmd[] = { 0x00, 0x05, 0x09, 0x0b, 0x11, 0x16, 0x17, 0x19, 0x1b, 0x1e, 0x2b, 0x35, 0xe0, 0xe3, 0xe4, -1 };
static const int nonecmd[] = { 0x00, 0x05, 0x09, 0x0b, 0x11, 0x16, 0x17, 0x19, 0x1b, 0x1d, 0x1e, 0x2b, 0x35, 0x45, 0x47, 0x48, 0x49, 0x4b, 0x4e, 0xa5, 0xa9, 0xba, 0xbc, 0xe0, 0xe3, 0xe4, -1 };
static const int scsicmdsizes[] = { 6, 10, 10, 12, 16, 12, 10, 6 };
static void scsi_illegal_command(struct scsi_data *sd)
@ -259,12 +261,15 @@ static void copysense(struct scsi_data *sd)
len = 4;
memset(sd->buffer, 0, len);
int tlen = sd->sense_len > len ? len : sd->sense_len;
if (log_scsiemu)
write_log(_T("REQUEST SENSE %d (%d -> %d)\n"), sd->cmd[4], sd->sense_len, tlen);
memcpy(sd->buffer, sd->sense, tlen);
if (!sasi && sd->sense_len == 0) {
// at least 0x12 bytes if SCSI and no sense
tlen = len > 0x12 ? 0x12 : len;
sd->buffer[0] = 0x70;
sd->sense_len = tlen;
}
if (log_scsiemu)
write_log(_T("REQUEST SENSE %d (%d -> %d)\n"), sd->cmd[4], sd->sense_len, tlen);
showsense (sd);
sd->data_len = tlen;
scsi_clear_sense(sd);
@ -1451,10 +1456,10 @@ static void ncr5380_reset(struct soft_scsi *scsi)
{
struct raw_scsi *r = &scsi->rscsi;
scsi->irq = true;
memset(scsi->regs, 0, sizeof scsi->regs);
raw_scsi_reset_bus(scsi);
scsi->regs[1] = 0x80;
ncr5380_set_irq(scsi);
}
uae_u8 ncr5380_bget(struct soft_scsi *scsi, int reg)
@ -2114,6 +2119,19 @@ static int microforge_reg(struct soft_scsi *ncr, uaecptr addr, bool write)
return reg;
}
static int ossi_reg(struct soft_scsi *ncr, uaecptr addr)
{
int reg = -1;
if (!(addr & 1))
return -1;
if ((addr & 0x8020) == 0x8020)
return 8;
if ((addr & 0x8010) != 0x8010)
return -1;
reg = (addr >> 1) & 7;
return reg;
}
static int phoenixboard_reg(struct soft_scsi *ncr, uaecptr addr)
{
if (addr & 1)
@ -2638,6 +2656,32 @@ static uae_u32 ncr80_bget2(struct soft_scsi *ncr, uaecptr addr, int size)
v = ncr->rom[addr];
}
} else if (ncr->type == NCR5380_SCRAM) {
if (addr < 0x4000 || addr >= 0xc000) {
v = 0xff;
if (!(addr & 1))
v = ncr->rom[(addr >> 1) & 8191];
} else if (addr >= 0x8000 && addr < 0xa000) {
if (!(addr & 1))
v = ncr5380_bget(ncr, 8);
} else if (addr >= 0x6000 && addr < 0x8000) {
if (!(addr & 1)) {
reg = (addr >> 1) & 7;
v = ncr5380_bget(ncr, reg);
}
}
} else if (ncr->type == NCR5380_OSSI) {
if (!(addr & 0x8000)) {
v = ncr->rom[addr & 16383];
} else {
reg = ossi_reg(ncr, addr);
if (reg >= 0)
v = ncr5380_bget(ncr, reg);
}
} else if (ncr->type == NCR5380_TRUMPCARDPRO || ncr->type == NCR5380_IVSVECTOR) {
reg = trumpcardpro_reg(ncr, addr, ncr->type == NCR5380_IVSVECTOR);
@ -2860,6 +2904,7 @@ static void ncr80_bput2(struct soft_scsi *ncr, uaecptr addr, uae_u32 val, int si
ncr->rom[addr] = val & (0x80 | 0x40 | 0x02);
} else if (addr == 0x1024) {
// memory board memory address reg
write_log(_T("TECMAR RAM %08x-%08x\n"), val << 16, (val << 16) + currprefs.fastmem[0].size);
if (currprefs.fastmem[0].size)
map_banks_z2(&fastmem_bank[0], val, currprefs.fastmem[0].size >> 16);
}
@ -2929,6 +2974,24 @@ static void ncr80_bput2(struct soft_scsi *ncr, uaecptr addr, uae_u32 val, int si
ncr5380_bput(ncr, reg, val);
}
} else if (ncr->type == NCR5380_SCRAM) {
if (addr >= 0x6000 && addr < 0x8000) {
if (!(addr & 1)) {
reg = (addr >> 1) & 7;
ncr5380_bput(ncr, reg, val);
}
} else if (addr >= 0x8000 && addr < 0xc000) {
if (!(addr & 1))
ncr5380_bput(ncr, 8, val);
}
} else if (ncr->type == NCR5380_OSSI) {
reg = ossi_reg(ncr, addr);
if (reg >= 0)
ncr5380_bput(ncr, reg, val);
} else if (ncr->type == NCR5380_TRUMPCARDPRO || ncr->type == NCR5380_IVSVECTOR) {
reg = trumpcardpro_reg(ncr, addr, ncr->type == NCR5380_IVSVECTOR);
@ -3652,7 +3715,7 @@ static void expansion_add_protoautoconfig_board(uae_u8 *p, int board, uae_u16 ma
bool tecmar_init(struct autoconfig_info *aci)
{
static const uae_u8 ac[16] = { 0x40, 0xff, 0, 0, 1001 >> 8, (uae_u8)1001 };
static const uae_u8 ac[16] = { 0x40, 0x00, 0, 0, 1001 >> 8, (uae_u8)1001 };
aci->hardwired = true;
if (!aci->doinit) {
@ -3976,3 +4039,61 @@ bool ivsvector_init(struct autoconfig_info *aci)
return true;
}
bool scram5380_init(struct autoconfig_info *aci)
{
const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_SCRAM5380);
if (!aci->doinit) {
aci->autoconfigp = ert->autoconfig;
return true;
}
struct soft_scsi *scsi = getscsi(aci->rc);
if (!scsi)
return false;
scsi->intena = true;
load_rom_rc(aci->rc, ROMTYPE_SCRAM5380, 8192, 0, scsi->rom, 8192, 0);
for (int i = 0; i < 16; i++) {
uae_u8 b = ert->autoconfig[i];
ew(scsi, i * 4, b);
}
aci->addrbank = scsi->bank;
return true;
}
void scram5380_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
{
generic_soft_scsi_add(ch, ci, rc, NCR5380_SCRAM, 65536, 8192, ROMTYPE_SCRAM5380);
}
bool ossi_init(struct autoconfig_info *aci)
{
const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_OSSI);
if (!aci->doinit) {
if (!load_rom_rc(aci->rc, ROMTYPE_OSSI, 32768, aci->rc->autoboot_disabled ? 16384 : 0, aci->autoconfig_raw, 128, 0))
aci->autoconfigp = ert->autoconfig;
return true;
}
struct soft_scsi *scsi = getscsi(aci->rc);
if (!scsi)
return false;
if (load_rom_rc(aci->rc, ROMTYPE_OSSI, 32768, aci->rc->autoboot_disabled ? 16384 : 0, scsi->rom, 16384, 0)) {
memcpy(scsi->acmemory, scsi->rom, sizeof scsi->acmemory);
} else {
for (int i = 0; i < 16; i++) {
uae_u8 b = ert->autoconfig[i];
ew(scsi, i * 4, b);
}
}
aci->addrbank = scsi->bank;
return true;
}
void ossi_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
{
generic_soft_scsi_add(ch, ci, rc, NCR5380_OSSI, 65536, 16384, ROMTYPE_OSSI);
}