status = scsi_receive_data (scsi, &v1, true);
if (!status)
status = scsi_receive_data(scsi, &v2, true);
- put_word((wd->cdmac.dmac_acr << 1) & 0xffffff, (v1 << 8) | v2);
+ dma_put_word((wd->cdmac.dmac_acr << 1) & wd->dma_mask, (v1 << 8) | v2);
if (wd->wc.wd_dataoffset < sizeof wd->wc.wd_data - 1) {
wd->wc.wd_data[wd->wc.wd_dataoffset++] = v1;
wd->wc.wd_data[wd->wc.wd_dataoffset++] = v2;
break;
}
#if WD33C93_DEBUG > 0
- write_log (_T("%s Done DMA from WD, %d/%d %08X\n"), WD33C93, scsi->offset, scsi->data_len, (odmac_acr << 1) & 0xffffff);
+ write_log (_T("%s Done DMA from WD, %d/%d %08X\n"), WD33C93, scsi->offset, scsi->data_len, (odmac_acr << 1) & dma_mask);
#endif
wd->cdmac.c8727_pcsd |= 1 << 7;
return true;
#endif
for (;;) {
int status;
- uae_u16 v = get_word((wd->cdmac.dmac_acr << 1) & 0xffffff);
+ uae_u16 v = dma_get_word((wd->cdmac.dmac_acr << 1) & wd->dma_mask);
if (wd->wc.wd_dataoffset < sizeof wd->wc.wd_data - 1) {
wd->wc.wd_data[wd->wc.wd_dataoffset++] = v >> 8;
wd->wc.wd_data[wd->wc.wd_dataoffset++] = v;
break;
}
#if WD33C93_DEBUG > 0
- write_log (_T("%s Done DMA to WD, %d/%d %08x\n"), WD33C93, scsi->offset, scsi->data_len, (odmac_acr << 1) & 0xffffff);
+ write_log (_T("%s Done DMA to WD, %d/%d %08x\n"), WD33C93, scsi->offset, scsi->data_len, (odmac_acr << 1) & (currprefs.cs_z2dma32bit ? 0xffffffff : 0xffffff));
#endif
wd->cdmac.c8727_pcsd |= 1 << 7;
return true;
while (run) {
uae_u8 v;
int status = scsi_receive_data(scsi, &v, true);
- put_byte(wd->cdmac.dmac_acr, v);
+ dma_put_byte(wd->cdmac.dmac_acr & wd->dma_mask, v);
if (wd->wc.wd_dataoffset < sizeof wd->wc.wd_data)
wd->wc.wd_data[wd->wc.wd_dataoffset++] = v;
if (decreasetc (&wd->wc))
bool run = true;
while (run) {
int status;
- uae_u8 v = get_byte(wd->cdmac.dmac_acr);
+ uae_u8 v = dma_get_byte(wd->cdmac.dmac_acr & wd->dma_mask);
if (wd->wc.wd_dataoffset < sizeof wd->wc.wd_data)
wd->wc.wd_data[wd->wc.wd_dataoffset++] = v;
status = scsi_send_data (scsi, v);
for (;;) {
uae_u8 v;
int status = scsi_receive_data(scsi, &v, true);
- put_byte(get_gvp_s2_addr(&wd->gdmac), v);
+ dma_put_byte(get_gvp_s2_addr(&wd->gdmac) & wd->dma_mask, v);
if (wd->wc.wd_dataoffset < sizeof wd->wc.wd_data)
wd->wc.wd_data[wd->wc.wd_dataoffset++] = v;
wd->gdmac.addr++;
}
for (;;) {
int status;
- uae_u8 v = get_byte(get_gvp_s2_addr(&wd->gdmac));
+ uae_u8 v = dma_get_byte(get_gvp_s2_addr(&wd->gdmac) & wd->dma_mask);
if (wd->wc.wd_dataoffset < sizeof wd->wc.wd_data)
wd->wc.wd_data[wd->wc.wd_dataoffset++] = v;
status = scsi_send_data (scsi, v);
wds->scsi_thread_running = -1;
}
-void init_wd_scsi (struct wd_state *wd)
+void init_wd_scsi (struct wd_state *wd, bool dma24bit)
{
wd->configured = 0;
wd->enabled = true;
wd->wc.wd_used = 0;
wd->wc.wd33c93_ver = 1;
wd->baseaddress = 0;
+ wd->dma_mask = dma24bit ? 0x00ffffff : 0xffffffff;
if (wd == wd_cdtv) {
wd->cdtv = true;
}
struct wd_state *wd = wd_a3000;
if (!wd)
return false;
- init_wd_scsi (wd);
+ init_wd_scsi(wd, false);
wd->enabled = true;
wd->configured = -1;
wd->baseaddress = 0xdd0000;
if (!wd)
return false;
- init_wd_scsi(wd);
+ init_wd_scsi(wd, aci->rc->dma24bit);
wd->cdmac.old_dmac = aci->rc->subtype == 0;
wd->threaded = true;
if (!wd)
return false;
- init_wd_scsi(wd);
+ init_wd_scsi(wd, aci->rc->dma24bit);
if (aci->rc->device_settings & 1)
ew(aci->autoconfig_raw, 0x30, 0x80); // SCSI only flag
if (!wd)
return false;
- init_wd_scsi(wd);
+ init_wd_scsi(wd, aci->rc->dma24bit);
wd->configured = 0;
wd->threaded = true;
memcpy(&wd->bank, &gvp_bank, sizeof addrbank);
return false;
comspec_ac(aci);
- init_wd_scsi(wd);
+ init_wd_scsi(wd, aci->rc->dma24bit);
wd->configured = 0;
wd->dmac_type = COMSPEC_CHIP;
wd->autoconfig = true;
buf[1] = 0;
buf[2] = 0;
buf[3] = cdrom_sector_counter & 31;
- for (int i = 0; i < 2352; i++)
- put_byte (cdrom_addressdata + seccnt * 4096 + i, buf[i]);
- for (int i = 0; i < 73 * 2; i++)
- put_byte (cdrom_addressdata + seccnt * 4096 + 0xc00 + i, 0);
+ for (int i = 0; i < 2352; i++) {
+ dma_put_byte(cdrom_addressdata + seccnt * 4096 + i, buf[i]);
+ }
+ for (int i = 0; i < 73 * 2; i++) {
+ dma_put_byte(cdrom_addressdata + seccnt * 4096 + 0xc00 + i, 0);
+ }
cdrom_pbx &= ~(1 << seccnt);
set_status (CDINTERRUPT_PBX);
else
cdrom_subcodeoffset = 128;
// 96 byte subchannel data
- for (int i = 0; i < SUB_CHANNEL_SIZE; i++)
- put_byte(subcode_address + cdrom_subcodeoffset + i, subbuf[i]);
- put_long(subcode_address + cdrom_subcodeoffset + SUB_CHANNEL_SIZE, 0xffff0000);
+ for (int i = 0; i < SUB_CHANNEL_SIZE; i++) {
+ dma_put_byte(subcode_address + cdrom_subcodeoffset + i, subbuf[i]);
+ }
+ dma_put_word(subcode_address + cdrom_subcodeoffset + SUB_CHANNEL_SIZE + 0, 0xffff);
+ dma_put_word(subcode_address + cdrom_subcodeoffset + SUB_CHANNEL_SIZE + 2, 0x0000);
cdrom_subcodeoffset += 100;
set_status(CDINTERRUPT_SUBCODE);
}
static volatile uae_u32 dmac_acr;
static volatile int dmac_wtc;
static volatile int dmac_dma;
+static uae_u32 dma_mask;
static volatile int activate_stch, cdrom_command_done;
static volatile int cdrom_sector, cdrom_sectors, cdrom_length, cdrom_offset;
}
}
- put_byte (dmac_acr, buffer[(cdrom_offset % cdtv_sectorsize) + 0]);
- put_byte (dmac_acr + 1, buffer[(cdrom_offset % cdtv_sectorsize) + 1]);
+ dma_put_byte(dmac_acr & dma_mask, buffer[(cdrom_offset % cdtv_sectorsize) + 0]);
+ dma_put_byte((dmac_acr + 1) & dma_mask, buffer[(cdrom_offset % cdtv_sectorsize) + 1]);
cnt--;
dmac_acr += 2;
cdrom_length -= 2;
ew(0x24, 0x00); /* ser.no. Byte 3 */
if (aci) {
+ dma_mask = aci->rc->dma24bit ? 0x00ffffff : 0xffffffff;
aci->label = dmac_bank.name;
aci->hardwired = true;
aci->addrbank = &dmac_bank;
if (!aci->doinit)
return true;
cdtvscsi = true;
- init_wd_scsi(wd_cdtv);
+ init_wd_scsi(wd_cdtv, aci->rc->dma24bit);
wd_cdtv->dmac_type = COMMODORE_DMAC;
if (configured > 0)
map_banks_z2(&dmac_bank, configured, 0x10000 >> 16);
_stprintf(buf, _T("%s%s_rom"), name, i ? _T("_ext") : _T(""));
cfgfile_dwrite_str (f, buf, rc->romident);
}
- if (rc->autoboot_disabled || rc->inserted || ert->subtypes || ert->settings || ert->id_jumper || br->device_order > 0 || is_custom_romboard(br)) {
+ if (rc->autoboot_disabled || rc->dma24bit || rc->inserted || ert->subtypes || ert->settings || ert->id_jumper || br->device_order > 0 || is_custom_romboard(br)) {
TCHAR buf2[256], *p;
buf2[0] = 0;
p = buf2;
_tcscat(buf2, _T(","));
_tcscat(buf2, _T("autoboot_disabled=true"));
}
+ if (rc->dma24bit) {
+ if (buf2[0])
+ _tcscat(buf2, _T(","));
+ _tcscat(buf2, _T("dma24bit=true"));
+ }
if (rc->inserted) {
if (buf2[0])
_tcscat(buf2, _T(","));
if (s)
rb->no_reset_unmap = true;
xfree(s);
+ s = cfgfile_option_get(value, _T("nodma"));
+ if (s)
+ rb->nodma = true;
+ xfree(s);
s = cfgfile_option_get(value, _T("data"));
if (s && _tcslen(s) >= 3 * 16 - 1) {
rb->autoconfig_inuse = true;
_tcscpy(p, _T("no_reset_unmap=true"));
p += _tcslen(p);
}
+ if (rb->nodma) {
+ if (tmp2[0])
+ *p++ = ',';
+ _tcscpy(p, _T("nodma=true"));
+ p += _tcslen(p);
+ }
if (rb->autoconfig_inuse) {
uae_u8 *ac = rb->autoconfig;
if (tmp2[0])
if (cfgfile_option_bool(buf2, _T("autoboot_disabled")) == 1) {
brc->roms[idx].autoboot_disabled = true;
}
+ if (cfgfile_option_bool(buf2, _T("dma24bit")) == 1) {
+ brc->roms[idx].dma24bit = true;
+ }
if (cfgfile_option_bool(buf2, _T("inserted")) == 1) {
brc->roms[idx].inserted= true;
}
return true;
}
-static void loadboardfile(addrbank *ab, struct boardloadfile *lf)
-{
- if (!ab->baseaddr)
- return;
- if (!lf->loadfile[0])
- return;
- struct zfile *zf = zfile_fopen(lf->loadfile, _T("rb"));
- if (zf) {
- int size = lf->filesize;
- if (!size) {
- size = ab->allocated_size;
- }
- else if (lf->loadoffset + size > ab->allocated_size)
- size = ab->allocated_size - lf->loadoffset;
- if (size > 0) {
- int total = zfile_fread(ab->baseaddr + lf->loadoffset, 1, size, zf);
- write_log(_T("Expansion file '%s': load %u bytes, offset %u, start addr %08x\n"),
- lf->loadfile, total, lf->loadoffset, ab->start + lf->loadoffset);
- }
- zfile_fclose(zf);
- } else {
- write_log(_T("Couldn't open expansion file '%s'\n"), lf->loadfile);
- }
-}
-
-static void initramboard(addrbank *ab, struct ramboard *rb)
-{
- if (!ab->baseaddr)
- return;
- loadboardfile(ab, &rb->lf);
- if (rb->readonly) {
- ab->lput = empty_put;
- ab->wput = empty_put;
- ab->bput = empty_put;
- ab->jit_write_flag = 0;
- }
-}
-
/*
* Z3fastmem Memory
*/
static const struct expansionsubromtype supra_sub[] = {
{
_T("A500 ByteSync/XP"), _T("bytesync"), ROMTYPE_NONE | ROMTYPE_SUPRA,
- 1056, 9, 0, false,
+ 1056, 9, 0, false, 0,
{ 0xd1, 13, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00 },
},
{
_T("A2000 Word Sync"), _T("wordsync"), ROMTYPE_NONE | ROMTYPE_SUPRA,
- 1056, 9, 0, false,
+ 1056, 9, 0, false, 0,
{ 0xd1, 12, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00 },
},
{
_T("A500 Autoboot"), _T("500"), ROMTYPE_NONE | ROMTYPE_SUPRA,
- 1056, 5, 0, false,
+ 1056, 5, 0, false, 0,
{ 0xd1, 8, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00 },
},
{
_T("Non Autoboot (4x4)"), _T("4x4"), ROMTYPE_NOT | ROMTYPE_SUPRA,
- 1056, 2, 0, false,
+ 1056, 2, 0, false, 0,
{ 0xc1, 1, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
},
{
_T("A2000 DMA"), _T("dma"), ROMTYPE_NONE | ROMTYPE_SUPRADMA,
- 1056, 2, 0, false,
+ 1056, 2, 0, false, EXPANSIONTYPE_DMA24,
{ 0xd1, 3, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00 },
},
{
_T("cdtvdmac"), _T("CDTV DMAC"), _T("Commodore"),
NULL, cdtv_init, NULL, NULL, ROMTYPE_CDTVDMAC | ROMTYPE_NOT, 0, 0, BOARD_AUTOCONFIG_Z2, true,
NULL, 0,
- false, EXPANSIONTYPE_INTERNAL
+ false, EXPANSIONTYPE_INTERNAL | EXPANSIONTYPE_DMA24
},
{
_T("cdtvscsi"), _T("CDTV SCSI"), _T("Commodore"),
_T("cdtvcr"), _T("CDTV-CR"), _T("Commodore"),
NULL, cdtvcr_init, NULL, NULL, ROMTYPE_CDTVCR | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG_AFTER_Z2, true,
NULL, 0,
- false, EXPANSIONTYPE_INTERNAL
+ false, EXPANSIONTYPE_INTERNAL | EXPANSIONTYPE_DMA24
},
{
_T("scsi_a3000"), _T("A3000 SCSI"), _T("Commodore"),
_T("a2090a"), _T("A2090a"), _T("Commodore"),
NULL, a2090_init, NULL, a2090_add_scsi_unit, ROMTYPE_A2090 | ROMTYPE_NONE, 0, 0, BOARD_AUTOCONFIG_Z2, false,
NULL, 0,
- true, EXPANSIONTYPE_SCSI | EXPANSIONTYPE_CUSTOM_SECONDARY,
+ true, EXPANSIONTYPE_SCSI | EXPANSIONTYPE_CUSTOM_SECONDARY | EXPANSIONTYPE_DMA24,
0, 0, 0, false, NULL,
false, 0, a2090a_settings
},
_T("a2090b"), _T("A2090 Combitec"), _T("Commodore"),
a2090b_preinit, a2090b_init, NULL, a2090_add_scsi_unit, ROMTYPE_A2090B | ROMTYPE_NONE, 0, 0, BOARD_AUTOCONFIG_Z2, true,
NULL, 0,
- true, EXPANSIONTYPE_SCSI | EXPANSIONTYPE_CUSTOM_SECONDARY,
+ true, EXPANSIONTYPE_SCSI | EXPANSIONTYPE_CUSTOM_SECONDARY | EXPANSIONTYPE_DMA24,
0, 0, 0, false, NULL,
false, 0, a2090a_settings
},
_T("a2091"), _T("A590/A2091"), _T("Commodore"),
NULL, a2091_init, NULL, a2091_add_scsi_unit, ROMTYPE_A2091 | ROMTYPE_NONE, 0, 0, BOARD_AUTOCONFIG_Z2, false,
a2091_sub, 1,
- true, EXPANSIONTYPE_SCSI | EXPANSIONTYPE_CUSTOM_SECONDARY,
+ true, EXPANSIONTYPE_SCSI | EXPANSIONTYPE_CUSTOM_SECONDARY | EXPANSIONTYPE_DMA24,
commodore, commodore_a2091, 0, true, NULL
},
{
_T("comspec"), _T("SA series"), _T("Comspec Communications"),
comspec_preinit, comspec_init, NULL, comspec_add_scsi_unit, ROMTYPE_COMSPEC, 0, 0, BOARD_AUTOCONFIG_Z2, true,
comspec_sub, 0,
- true, EXPANSIONTYPE_SCSI,
+ true, EXPANSIONTYPE_SCSI | EXPANSIONTYPE_DMA24,
0, 0, 0, false, NULL,
false, 0, comspec_settings
},
_T("gvp"), _T("GVP Series II"), _T("Great Valley Products"),
NULL, gvp_init_s2, NULL, gvp_s2_add_scsi_unit, ROMTYPE_GVPS2 | ROMTYPE_NONE, ROMTYPE_GVPS12, 0, BOARD_AUTOCONFIG_Z2, false,
NULL, 0,
- true, EXPANSIONTYPE_SCSI,
+ true, EXPANSIONTYPE_SCSI | EXPANSIONTYPE_DMA24,
2017, 10, 0
},
{
_T("trifecta"), _T("Trifecta"), _T("ICD"),
NULL, trifecta_init, NULL, trifecta_add_idescsi_unit, ROMTYPE_TRIFECTA | ROMTYPE_NONE, 0, 0, BOARD_AUTOCONFIG_Z2, false,
trifecta_sub, 0,
- true, EXPANSIONTYPE_SCSI | EXPANSIONTYPE_IDE,
+ true, EXPANSIONTYPE_SCSI | EXPANSIONTYPE_IDE | EXPANSIONTYPE_DMA24,
2071, 32, 0, false, NULL,
true, 0, trifecta_settings,
{ 0xd1, 0x23, 0x40, 0x00, 0x08, 0x17, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00 }
_T("masoboshi"), _T("MasterCard"), _T("Masoboshi"),
NULL, masoboshi_init, NULL, masoboshi_add_idescsi_unit, ROMTYPE_MASOBOSHI | ROMTYPE_NONE, 0, 0, BOARD_AUTOCONFIG_Z2, false,
masoboshi_sub, 0,
- true, EXPANSIONTYPE_SCSI | EXPANSIONTYPE_IDE
+ true, EXPANSIONTYPE_SCSI | EXPANSIONTYPE_IDE | EXPANSIONTYPE_DMA24
},
{
_T("hardframe"), _T("HardFrame"), _T("Microbotics"),
NULL, hardframe_init, NULL, hardframe_add_scsi_unit, ROMTYPE_HARDFRAME, 0, 0, BOARD_AUTOCONFIG_Z2, false,
NULL, 0,
- true, EXPANSIONTYPE_SCSI,
+ true, EXPANSIONTYPE_SCSI | EXPANSIONTYPE_DMA24,
0, 0, 0, false, NULL,
true
},
_T("prelude1200"), _T("Prelude 1200"), _T("Albrecht Computer Technik"),
NULL, prelude1200_init, NULL, NULL, ROMTYPE_PRELUDE1200 | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG_BEFORE, true,
NULL, 0,
- false, EXPANSIONTYPE_SOUND,
+ false, EXPANSIONTYPE_SOUND | EXPANSIONTYPE_CLOCKPORT,
0, 0, 0, false, NULL,
false, 0, toccata_soundcard_settings
},
addrbank bank;
addrbank bank2;
void *userdata;
+ uae_u32 dma_mask;
};
extern wd_state *wd_cdtv;
-extern void init_wd_scsi (struct wd_state*);
+extern void init_wd_scsi (struct wd_state*, bool);
extern void scsi_dmac_a2091_start_dma (struct wd_state*);
extern void scsi_dmac_a2091_stop_dma (struct wd_state*);
#define EXPANSIONTYPE_X86_EXPANSION 0x20000
#define EXPANSIONTYPE_PCMCIA 0x40000
#define EXPANSIONTYPE_CUSTOMDISK 0x80000
+#define EXPANSIONTYPE_CLOCKPORT 0x100000
+#define EXPANSIONTYPE_DMA24 0x200000
#define EXPANSIONBOARD_CHECKBOX 0
#define EXPANSIONBOARD_MULTI 1
int memory_mid, memory_pid;
uae_u32 memory_serial;
bool memory_after;
+ int deviceflags;
uae_u8 autoconfig[16];
};
struct expansionromtype
ABFLAG_CHIPRAM = 4096, ABFLAG_CIA = 8192, ABFLAG_PPCIOSPACE = 16384,
ABFLAG_MAPPED = 32768,
ABFLAG_DIRECTACCESS = 65536,
+ ABFLAG_NODMA = 131072,
ABFLAG_CACHE_ENABLE_DATA = CACHE_ENABLE_DATA << ABFLAG_CACHE_SHIFT,
ABFLAG_CACHE_ENABLE_DATA_BURST = CACHE_ENABLE_DATA_BURST << ABFLAG_CACHE_SHIFT,
ABFLAG_CACHE_ENABLE_INS = CACHE_ENABLE_INS << ABFLAG_CACHE_SHIFT,
extern void reload_roms(void);
extern bool read_kickstart_version(struct uae_prefs *p);
extern void chipmem_setindirect(void);
+extern void initramboard(addrbank * ab, struct ramboard* rb);
+extern void loadboardfile(addrbank * ab, struct boardloadfile* lf);
uae_u32 memory_get_long(uaecptr);
uae_u32 memory_get_word(uaecptr);
# endif
#endif
+void dma_put_word(uaecptr addr, uae_u16 v);
+uae_u16 dma_get_word(uaecptr addr);
+void dma_put_byte(uaecptr addr, uae_u8 v);
+uae_u8 dma_get_byte(uaecptr addr);
+
void memory_put_long(uaecptr, uae_u32);
void memory_put_word(uaecptr, uae_u32);
void memory_put_byte(uaecptr, uae_u32);
uae_u32 board_ram_size;
bool autoboot_disabled;
bool inserted;
+ bool dma24bit;
int device_id;
int device_settings;
int subtype;
uae_u32 end_address;
uae_u32 write_address;
bool readonly;
+ bool nodma;
struct boardloadfile lf;
};
struct expansion_params
#endif /* SAVESTATE */
+static void REGPARAM2 empty_put(uaecptr addr, uae_u32 v)
+{
+}
+
+void loadboardfile(addrbank* ab, struct boardloadfile* lf)
+{
+ if (!ab->baseaddr)
+ return;
+ if (!lf->loadfile[0])
+ return;
+ struct zfile* zf = zfile_fopen(lf->loadfile, _T("rb"));
+ if (zf) {
+ int size = lf->filesize;
+ if (!size) {
+ size = ab->allocated_size;
+ }
+ else if (lf->loadoffset + size > ab->allocated_size)
+ size = ab->allocated_size - lf->loadoffset;
+ if (size > 0) {
+ int total = zfile_fread(ab->baseaddr + lf->loadoffset, 1, size, zf);
+ write_log(_T("Expansion file '%s': load %u bytes, offset %u, start addr %08x\n"),
+ lf->loadfile, total, lf->loadoffset, ab->start + lf->loadoffset);
+ }
+ zfile_fclose(zf);
+ }
+ else {
+ write_log(_T("Couldn't open expansion file '%s'\n"), lf->loadfile);
+ }
+}
+
+void initramboard(addrbank* ab, struct ramboard* rb)
+{
+ ab->flags &= ~ABFLAG_NODMA;
+ if (rb->nodma)
+ ab->flags |= ABFLAG_NODMA;
+ if (!ab->baseaddr)
+ return;
+ loadboardfile(ab, &rb->lf);
+ if (rb->readonly) {
+ ab->lput = empty_put;
+ ab->wput = empty_put;
+ ab->bput = empty_put;
+ ab->jit_write_flag = 0;
+ }
+}
+
+
/* memory helpers */
void memcpyha_safe(uaecptr dst, const uae_u8 *src, int size)
addr &= ab->mask;
return addr + size <= ab->allocated_size;
}
+
+void dma_put_word(uaecptr addr, uae_u16 v)
+{
+ addrbank* ab = &get_mem_bank(addr);
+ if (ab->flags & ABFLAG_NODMA)
+ return;
+ put_word(addr, v);
+}
+void dma_put_byte(uaecptr addr, uae_u8 v)
+{
+ addrbank* ab = &get_mem_bank(addr);
+ if (ab->flags & ABFLAG_NODMA)
+ return;
+ put_byte(addr, v);
+}
+uae_u16 dma_get_word(uaecptr addr)
+{
+ addrbank* ab = &get_mem_bank(addr);
+ if (ab->flags & ABFLAG_NODMA)
+ return 0xffff;
+ return get_word(addr);
+}
+uae_u8 dma_get_byte(uaecptr addr)
+{
+ addrbank* ab = &get_mem_bank(addr);
+ if (ab->flags & ABFLAG_NODMA)
+ return 0xff;
+ return get_byte(addr);
+}
uaecptr dma_ptr;
bool dma_on;
int dma_cnt;
+ uae_u32 dma_mask;
uae_u8 states[16];
struct romconfig *rc;
struct ncr9x_state **self_ptr;
if (ncr->dma_on) {
m68k_cancel_idle();
while (len > 0) {
- uae_u16 v = get_word(ncr->dma_ptr & ~1);
+ uae_u16 v = dma_get_word((ncr->dma_ptr & ~1) & ncr->dma_mask);
*buf++ = v >> 8;
len--;
if (len > 0) {
v |= *buf++;
len--;
}
- put_word(ncr->dma_ptr & ~1, v);
+ dma_put_word((ncr->dma_ptr & ~1) & ncr->dma_mask, v);
ncr->dma_ptr += 2;
}
return -1;
//write_log(_T("Trifecta DMA from %08x, %d bytes\n"), ncr->dma_ptr, len);
m68k_cancel_idle();
while (len > 0) {
- uae_u16 v = get_word(ncr->dma_ptr & ~1);
+ uae_u16 v = dma_get_word((ncr->dma_ptr & ~1) & ncr->dma_mask);
*buf++ = v >> 8;
len--;
if (len > 0) {
v |= *buf++;
len--;
}
- put_word(ncr->dma_ptr & ~1, v);
+ dma_put_word((ncr->dma_ptr & ~1) & ncr->dma_mask, v);
ncr->dma_ptr += 2;
}
return -1;
}
m68k_cancel_idle();
while (len > 0) {
- uae_u16 v = get_word(ncr->dma_ptr & ~1);
+ uae_u16 v = dma_get_word(ncr->dma_ptr & ~1);
*buf++ = v >> 8;
len--;
if (len > 0) {
v |= *buf++;
len--;
}
- put_word(ncr->dma_ptr & ~1, v);
+ dma_put_word(ncr->dma_ptr & ~1, v);
ncr->dma_ptr += 2;
}
return -1;
}
m68k_cancel_idle();
while (len > 0) {
- uae_u16 v = get_word(ncr->dma_ptr & ~1);
+ uae_u16 v = dma_get_word(ncr->dma_ptr & ~1);
*buf++ = v >> 8;
len--;
if (len > 0) {
v |= *buf++;
len--;
}
- put_word(ncr->dma_ptr & ~1, v);
+ dma_put_word(ncr->dma_ptr & ~1, v);
ncr->dma_ptr += 2;
}
return -1;
}
m68k_cancel_idle();
while (len > 0) {
- uae_u16 v = get_word((ncr->dma_ptr & 0x7fffffff) * 2);
+ uae_u16 v = dma_get_word((ncr->dma_ptr & 0x7fffffff) * 2);
*buf++ = v >> 8;
len--;
if (len > 0) {
v |= *buf++;
len--;
}
- put_word((ncr->dma_ptr & 0x7fffffff) * 2, v);
+ dma_put_word((ncr->dma_ptr & 0x7fffffff) * 2, v);
ncr->dma_ptr++;
}
return -1;
{
struct ncr9x_state *ncr = allocscsi(ncrp, rc, ch);
if (ch >= 0 && ncr) {
+ ncr->dma_mask = rc->dma24bit ? 0x00ffffff : 0xffffffff;
if (ci->type == UAEDEV_CD)
add_ncr_scsi_cd (ncr, ch, ci->device_emu_unit, ci->uae_unitnum);
else if (ci->type == UAEDEV_TAPE)
uae_u8 *p = (uae_u8*)buf;
while (len > 0) {
if (!dir) {
- *p = get_byte(addr);
+ *p = dma_get_byte(addr);
}
else {
- put_byte(addr, *p);
+ dma_put_byte(addr, *p);
}
p++;
len--;
uae_u8 *p = (uae_u8*)buf;
while (len > 0) {
if (!dir) {
- *p = get_byte (addr);
+ *p = dma_get_byte(addr);
} else {
- put_byte (addr, *p);
+ dma_put_byte(addr, *p);
}
p++;
len--;
ew(hDlg, IDC_AUTOCONFIG_DATA, ac && size);
ew(hDlg, IDC_FASTMEMAUTOCONFIGUSE, isfast);
ew(hDlg, IDC_FASTMEMNOAUTOCONFIG, isfast);
+ ew(hDlg, IDC_FASTMEMDMA, isfast);
ew(hDlg, IDC_MEMORYRAM, true);
ew(hDlg, IDC_MEMORYMEM, true);
ew(hDlg, IDC_RAM_ADDRESS, manual && size);
struct ramboard *rb = fastram_select_ramboard;
setchecked(hDlg, IDC_FASTMEMAUTOCONFIGUSE, rb && rb->autoconfig_inuse);
setchecked(hDlg, IDC_FASTMEMNOAUTOCONFIG, rb && rb->manual_config);
+ setchecked(hDlg, IDC_FASTMEMDMA, rb && rb->nodma == 0);
if (rb) {
if (rb->manual_config) {
if (rb->end_address <= rb->start_address || rb->start_address + rb->size < rb->end_address)
}
}
- SendDlgItemMessage(hDlg, IDC_SCSIROMSELECTNUM, CB_RESETCONTENT, 0, 0);
- for (int i = 0; i < MAX_DUPLICATE_EXPANSION_BOARDS; i++) {
- TCHAR tmp[10];
- _stprintf(tmp, _T("%d"), i + 1);
- SendDlgItemMessage(hDlg, IDC_SCSIROMSELECTNUM, CB_ADDSTRING, 0, (LPARAM)tmp);
- }
-
if (scsiromselected > 0)
gui_set_string_cursor(scsiromselect_table, hDlg, IDC_SCSIROMSELECT, scsiromselected);
SendDlgItemMessage(hDlg, IDC_SCSIROMSELECTCAT, CB_SETCURSEL, scsiromselectedcatnum, 0);
- SendDlgItemMessage(hDlg, IDC_SCSIROMSELECTNUM, CB_SETCURSEL, scsiromselectednum, 0);
SendDlgItemMessage(hDlg, IDC_SCSIROMID, CB_RESETCONTENT, 0, 0);
int index;
SendDlgItemMessage(hDlg, IDC_SCSIROMSUBSELECT, CB_RESETCONTENT, 0, 0);
const struct expansionromtype *er = &expansionroms[scsiromselected];
const struct expansionsubromtype *srt = er->subtypes;
+ int deviceflags = er->deviceflags;
ew(hDlg, IDC_SCSIROMSUBSELECT, srt != NULL);
while (srt && srt->name) {
SendDlgItemMessage(hDlg, IDC_SCSIROMSUBSELECT, CB_ADDSTRING, 0, (LPARAM) srt->name);
}
int index;
struct boardromconfig *brc = get_device_rom(&workprefs, expansionroms[scsiromselected].romtype, scsiromselectednum, &index);
- if (brc) {
+ if (brc && er->subtypes) {
SendDlgItemMessage(hDlg, IDC_SCSIROMSUBSELECT, CB_SETCURSEL, brc->roms[index].subtype, 0);
SendDlgItemMessage(hDlg, IDC_SCSIROMID, CB_SETCURSEL, brc->roms[index].device_id, 0);
+ deviceflags |= er->subtypes[brc->roms[index].subtype].deviceflags;
} else if (srt) {
SendDlgItemMessage(hDlg, IDC_SCSIROMSUBSELECT, CB_SETCURSEL, 0, 0);
SendDlgItemMessage(hDlg, IDC_SCSIROMID, CB_SETCURSEL, 0, 0);
}
- if (er->zorro < 2 || er->singleonly) {
+ SendDlgItemMessage(hDlg, IDC_SCSIROMSELECTNUM, CB_RESETCONTENT, 0, 0);
+ if (deviceflags & EXPANSIONTYPE_CLOCKPORT) {
+ SendDlgItemMessage(hDlg, IDC_SCSIROMSELECTNUM, CB_ADDSTRING, 0, (LPARAM)_T("-"));
+ }
+ for (int i = 0; i < MAX_AVAILABLE_DUPLICATE_EXPANSION_BOARDS; i++) {
+ TCHAR tmp[10];
+ _stprintf(tmp, _T("%d"), i + 1);
+ SendDlgItemMessage(hDlg, IDC_SCSIROMSELECTNUM, CB_ADDSTRING, 0, (LPARAM)tmp);
+ }
+ SendDlgItemMessage(hDlg, IDC_SCSIROMSELECTNUM, CB_SETCURSEL, scsiromselectednum, 0);
+ if ((er->zorro < 2 || er->singleonly) && !(deviceflags & EXPANSIONTYPE_CLOCKPORT)) {
scsiromselectednum = 0;
SendDlgItemMessage(hDlg, IDC_SCSIROMSELECTNUM, CB_SETCURSEL, 0, 0);
}
- ew(hDlg, IDC_SCSIROMSELECTNUM, er->zorro >= 2 && !er->singleonly);
+ ew(hDlg, IDC_SCSIROMSELECTNUM, (er->zorro >= 2 && !er->singleonly) || (deviceflags & EXPANSIONTYPE_CLOCKPORT));
+ hide(hDlg, IDC_SCSIROM24BITDMA, (deviceflags & EXPANSIONTYPE_DMA24) == 0);
+ ew(hDlg, IDC_SCSIROM24BITDMA, (deviceflags & EXPANSIONTYPE_DMA24) != 0);
}
static void values_from_expansion2dlg(HWND hDlg)
}
brc->roms[index].autoboot_disabled = ischecked(hDlg, IDC_SCSIROMFILEAUTOBOOT);
brc->roms[index].inserted = ischecked(hDlg, IDC_SCSIROMFILEPCMCIA);
+ brc->roms[index].dma24bit = ischecked(hDlg, IDC_SCSIROM24BITDMA);
int v = SendDlgItemMessage(hDlg, IDC_SCSIROMID, CB_GETCURSEL, 0, 0L);
if (v != CB_ERR && !isnew)
clear_device_rom(&workprefs, expansionroms[scsiromselected].romtype, scsiromselectednum, true);
}
if (changed) {
+ // singleonly check and removal
+ if (expansionroms[scsiromselected].singleonly) {
+ if (get_device_rom(&workprefs, expansionroms[scsiromselected].romtype, scsiromselectednum, &index)) {
+ for (int i = 0; i < MAX_EXPANSION_BOARDS; i++) {
+ if (i != scsiromselectednum) {
+ clear_device_rom(&workprefs, expansionroms[scsiromselected].romtype, i, true);
+ }
+ }
+ }
+ }
init_expansion2(hDlg, false);
values_to_expansion2dlg_sub(hDlg);
}
const struct expansionromtype *ert = &expansionroms[scsiromselected];
int romtype = ert->romtype;
int romtype_extra = ert->romtype_extra;
+ int deviceflags = ert->deviceflags;
brc = get_device_rom(&workprefs, romtype, scsiromselectednum, &index);
if (brc && ert->subtypes) {
romtype = esrt->romtype;
romtype_extra = 0;
}
+ deviceflags |= esrt->deviceflags;
}
ew(hDlg, IDC_SCSIROMFILE, true);
ew(hDlg, IDC_SCSIROMCHOOSER, true);
addromfiles(fkey, hDlg, IDC_SCSIROMFILE, brc ? brc->roms[index].romfile : NULL, romtype, romtype_extra);
setchecked(hDlg, IDC_SCSIROMFILEAUTOBOOT, brc && brc->roms[index].autoboot_disabled);
}
- if (ert->deviceflags & EXPANSIONTYPE_PCMCIA) {
+ if (deviceflags & EXPANSIONTYPE_PCMCIA) {
setchecked(hDlg, IDC_SCSIROMFILEPCMCIA, brc && brc->roms[index].inserted);
hide(hDlg, IDC_SCSIROMFILEPCMCIA, 0);
} else {
if (brc)
brc->roms[index].inserted = false;
}
+ hide(hDlg, IDC_SCSIROM24BITDMA, (deviceflags & EXPANSIONTYPE_DMA24) == 0);
+ ew(hDlg, IDC_SCSIROM24BITDMA, (deviceflags & EXPANSIONTYPE_DMA24) != 0);
+ setchecked(hDlg, IDC_SCSIROM24BITDMA, brc && brc->roms[index].dma24bit);
} else {
hide(hDlg, IDC_SCSIROMCHOOSER, 0);
hide(hDlg, IDC_SCSIROMFILE, 0);
SendDlgItemMessage(hDlg, IDC_SCSIROMFILE, CB_RESETCONTENT, 0, 0);
ew(hDlg, IDC_SCSIROMFILE, false);
ew(hDlg, IDC_SCSIROMCHOOSER, false);
+ ew(hDlg, IDC_SCSIROM24BITDMA, 0);
+ hide(hDlg, IDC_SCSIROM24BITDMA, 1);
}
if (keyallocated)
regclosetree(fkey);
load_keyring(&workprefs, NULL);
values_to_expansion2_expansion_roms(hDlg, fkey);
-
values_to_expansion2_expansion_settings(hDlg, mode);
if (workprefs.cpuboard_type) {
gui_set_string_cursor(scsiromselect_table, hDlg, IDC_SCSIROMSELECT, scsiromselected);
values_to_expansion2dlg_sub(hDlg);
-
-
}
static void updatecpuboardsubtypes(HWND hDlg)
break;
case IDC_SCSIROMFILEAUTOBOOT:
case IDC_SCSIROMFILEPCMCIA:
+ case IDC_SCSIROM24BITDMA:
values_from_expansion2dlg(hDlg);
break;
case IDC_SOCKETS:
recursive++;
switch (LOWORD(wParam))
{
+ case IDC_FASTMEMDMA:
+ if (fastram_select_ramboard) {
+ struct ramboard* rb = fastram_select_ramboard;
+ rb->nodma = ischecked(hDlg, IDC_FASTMEMDMA) == 0;
+ setfastram_selectmenu(hDlg, 0);
+ }
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;
+ 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;
bool dma_controller;
bool dma_drq;
bool dma_autodack;
+ uae_u32 dma_mask;
struct romconfig *rc;
struct soft_scsi **self_ptr;
ss->bank = &soft_bank_generic;
ss->subtype = rc->subtype;
ss->intena = false;
+ ss->dma_mask = 0xffffffff;
if (boardsize > 0) {
ss->board_size = boardsize;
ss->board_mask = ss->board_size - 1;
int len = ncr->dmac_length;
for (int i = 0; i < len; i++) {
if (ncr->dmac_direction < 0) {
- x_put_byte(ncr->dmac_address, ncr5380_bget(ncr, 0));
+ dma_put_byte(ncr->dmac_address & ncr->dma_mask, ncr5380_bget(ncr, 0));
} else if (ncr->dmac_direction > 0) {
- ncr5380_bput(ncr, 0, x_get_byte(ncr->dmac_address));
+ ncr5380_bput(ncr, 0, dma_get_byte(ncr->dmac_address & ncr->dma_mask));
}
ncr->dmac_length--;
ncr->dmac_address++;
uae_u8 v = aic_bget_dma(ncr, &phaseerr);
if (phaseerr)
break;
- x_put_byte(ncr->dmac_address, v);
+ dma_put_byte(ncr->dmac_address & ncr->dma_mask, v);
} else if (ncr->dmac_direction > 0) {
- uae_u8 v = x_get_byte(ncr->dmac_address);
+ uae_u8 v = dma_get_byte(ncr->dmac_address & ncr->dma_mask);
aic_bput_dma(ncr, v, &phaseerr);
if (phaseerr)
break;
struct raw_scsi *rs = &ncr->rscsi;
while (rs->bus_phase == SCSI_SIGNAL_PHASE_DATA_OUT || rs->bus_phase == SCSI_SIGNAL_PHASE_DATA_IN) {
if (rs->bus_phase == SCSI_SIGNAL_PHASE_DATA_IN) {
- x_put_byte(ncr->dmac_address, ncr5380_bget(ncr, 8));
+ dma_put_byte(ncr->dmac_address & ncr->dma_mask, ncr5380_bget(ncr, 8));
} else if (rs->bus_phase == SCSI_SIGNAL_PHASE_DATA_OUT) {
- ncr5380_bput(ncr, 8, x_get_byte(ncr->dmac_address));
+ ncr5380_bput(ncr, 8, dma_get_byte(ncr->dmac_address & ncr->dma_mask));
}
}
}
struct raw_scsi *rs = &ncr->rscsi;
while ((rs->bus_phase == SCSI_SIGNAL_PHASE_DATA_OUT || rs->bus_phase == SCSI_SIGNAL_PHASE_DATA_IN) && ncr->dmac_length > 0) {
if (rs->bus_phase == SCSI_SIGNAL_PHASE_DATA_IN) {
- x_put_byte(ncr->dmac_address, ncr5380_bget(ncr, 8));
+ dma_put_byte(ncr->dmac_address & ncr->dma_mask, ncr5380_bget(ncr, 8));
ncr->dmac_address++;
ncr->dmac_length--;
} else if (rs->bus_phase == SCSI_SIGNAL_PHASE_DATA_OUT) {
- ncr5380_bput(ncr, 8, x_get_byte(ncr->dmac_address));
+ ncr5380_bput(ncr, 8, dma_get_byte(ncr->dmac_address & ncr->dma_mask));
ncr->dmac_address++;
ncr->dmac_length--;
}
uae_u8 acmemory[128];
int configured;
uae_u32 baseaddress;
+ uae_u32 baseaddress_mask, baseaddress_value;
uae_u8 ad1848_index;
uae_u8 ad1848_index_mask;
uae_u8 ad1848_regs[32];
hit = false;
}
} else if (data->type == SNDDEV_PRELUDE1200) {
- if ((addr & 0x00ff) == 0x15) { // Reset FIFOs and CS4231A
- codec_stop(data);
- data->snddev_status = 0;
- data->snddev_irq = 0;
- data->fifo_write_index = 0;
- data->fifo_read_index = 0;
- data->data_in_fifo = 0;
- data->snddev_status = 0;
- data->snddev_irq = 0;
- data->fifo_half = 0;
- } else if ((addr & 0x00ff) == 0x19) { // ?
- ;
+
+ if ((addr & data->baseaddress_mask) == data->baseaddress_value) {
+ if ((addr & 0x00ff) == 0x15) { // Reset FIFOs and CS4231A
+ codec_stop(data);
+ data->snddev_status = 0;
+ data->snddev_irq = 0;
+ data->fifo_write_index = 0;
+ data->fifo_read_index = 0;
+ data->data_in_fifo = 0;
+ data->snddev_status = 0;
+ data->snddev_irq = 0;
+ data->fifo_half = 0;
+ } else if ((addr & 0x00ff) == 0x19) { // ?
+ ;
+ } else {
+ hit = false;
+ }
} else {
hit = false;
}
} else if (data->type == SNDDEV_PRELUDE1200) {
- if ((addr & 0x00ff) == 0x15) { // FIFO Status
- if (data->data_in_fifo >= data->fifo_size / 2)
- v |= 0x08;
- if (!data->data_in_fifo)
- v |= 0x04;
- if (data->data_in_record_fifo >= data->fifo_size / 2)
- v |= 0x02;
- if (data->data_in_record_fifo >= data->fifo_size)
- v |= 0x01;
- v ^= 0xff;
- } else if ((addr & 0x00ff) == 0x1d) { // id?
- v = 0x05;
- } else if ((addr & 0x00ff) == 0x19) { // ?
- v = 0x00;
+ if ((addr & data->baseaddress_mask) == data->baseaddress_value) {
+ if ((addr & 0x00ff) == 0x15) { // FIFO Status
+ if (data->data_in_fifo >= data->fifo_size / 2)
+ v |= 0x08;
+ if (!data->data_in_fifo)
+ v |= 0x04;
+ if (data->data_in_record_fifo >= data->fifo_size / 2)
+ v |= 0x02;
+ if (data->data_in_record_fifo >= data->fifo_size)
+ v |= 0x01;
+ v ^= 0xff;
+ } else if ((addr & 0x00ff) == 0x1d) { // id?
+ v = 0x05;
+ } else if ((addr & 0x00ff) == 0x19) { // ?
+ v = 0x00;
+ } else {
+ hit = false;
+ }
} else {
hit = false;
}
aci->addrbank = &prelude1200_bank;
aci->start = 0xd80000;
aci->size = 0x10000;
+ if (aci->devnum > 0) {
+ aci->start = 0xd80000 + (aci->devnum - 1) * 0x4000;
+ aci->size = 0x4000;
+ }
device_add_reset(sndboard_reset);
if (!aci->doinit)
data->configured = 1;
data->baseaddress = 0xd80000;
+ data->baseaddress_mask = 0;
+ data->baseaddress_value = 0;
+ if (aci->devnum > 0) {
+ data->baseaddress_mask = 0xc000;
+ data->baseaddress_value = (aci->devnum - 1) * 0x4000;
+ }
data->type = SNDDEV_PRELUDE1200;
data->fifo_size = 1024;
data->codec_reg1_mask = 0x00ff;