if (addr < 0x800 || addr >= 0xe00)
return reg;
*portnum = (addr - 0x800) / 0x200;
+ if ((board->aci->rc->device_settings & 3) == 1) {
+ if ((addr & 0xc0) == 0x80) {
+ return IDE_DATA;
+ }
+ }
reg = (addr >> 2) & 15;
if (addr & 0x100)
reg |= IDE_SECONDARY;
if (board->ide[portnum])
v = get_ide_reg_multi(board, regnum, portnum, 1);
} else if (addr >= 0xf00 && addr < 0x1000) {
- if ((addr & ~3) == 0xf00)
+ if ((addr & ~3) == 0xf00) {
v = ide_irq_check(board->ide[0], false) ? 0x80 : 0x00;
- else if ((addr & ~3) == 0xf40)
+ } else if ((addr & ~3) == 0xf40) {
v = ide_irq_check(board->ide[1], false) ? 0x80 : 0x00;
- else if ((addr & ~3) == 0xf80)
+ } else if ((addr & ~3) == 0xf80 && (board->aci->rc->device_settings & 3) != 1) {
v = ide_irq_check(board->ide[2], false) ? 0x80 : 0x00;
- else
+ } else {
v = 0;
+ }
} else if (addr >= 0x7fc && addr <= 0x7ff) {
v = board->userdata;
} else {
load_rom_rc(aci->rc, ROMTYPE_BUDDHA, 32768, 0, ide->rom, 65536, LOADROM_EVENONLY_ODDONE | LOADROM_FILL);
for (int i = 0; i < 16; i++) {
uae_u8 b = ert->autoconfig[i];
- if (i == 1 && (aci->rc->device_settings & 1))
+ if (i == 1 && (aci->rc->device_settings & 3) == 2)
b = 42;
+ if (i == 9 && (aci->rc->device_settings & 3) == 1)
+ b = 6;
ew(ide, i * 4, b);
}
aci->addrbank = ide->bank;
void buddha_add_ide_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
{
add_ide_standard_unit(ch, ci, rc, buddha_board, BUDDHA_IDE, false, false, 6);
+ if ((rc->device_settings & 3) == 1) {
+ // 3rd port has no interrupt
+ buddha_board[ci->controller_type_unit]->ide[2]->irq_inhibit = true;
+ }
}
void rochard_add_idescsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
#define ALIGN_POINTER_TO32(p) ((~(uae_u32)(p)) & 3)
#endif
+#define do_get_mem_byte(a) ((uae_u32)*(uae_u8 *)(a))
+STATIC_INLINE void do_put_mem_byte(uae_u8 *a, uae_u8 v)
+{
+ *a = v;
+}
+
+#ifdef HAVE_MOVBE
+
+#include <immintrin.h>
+
+STATIC_INLINE uae_u64 do_get_mem_quad(uae_u64 *a)
+{
+ return _load_be_u64(a);
+}
+
+STATIC_INLINE uae_u32 do_get_mem_long(uae_u32 *a)
+{
+ return _load_be_u32(a);
+}
+
+STATIC_INLINE uae_u16 do_get_mem_word(uae_u16 *a)
+{
+ return _load_be_u16(a);
+}
+
+STATIC_INLINE void do_put_mem_quad(uae_u64 *a, uae_u64 v)
+{
+ _store_be_u64(a, v);
+}
+
+STATIC_INLINE void do_put_mem_long(uae_u32 *a, uae_u32 v)
+{
+ _store_be_u32(a, v);
+}
+
+STATIC_INLINE void do_put_mem_word(uae_u16 *a, uae_u16 v)
+{
+ _store_be_u16(a, v);
+}
+
+
+#else
+
STATIC_INLINE uae_u64 do_get_mem_quad(uae_u64 *a)
{
return _byteswap_uint64(*a);
return _byteswap_ushort(*a);
}
-#define do_get_mem_byte(a) ((uae_u32)*(uae_u8 *)(a))
STATIC_INLINE void do_put_mem_quad(uae_u64 *a, uae_u64 v)
{
*a = _byteswap_ushort(v);
}
-STATIC_INLINE void do_put_mem_byte(uae_u8 *a, uae_u8 v)
-{
- *a = v;
-}
+
+#endif
STATIC_INLINE uae_u64 do_byteswap_64(uae_u64 v)
{
pages[ABOUT_ID] = hDlg;
currentpage = ABOUT_ID;
- font1 = CreateFont(getscaledfontsize(60), 0, 0, 0, 0,
+ font1 = CreateFont(getscaledfontsize(-1) * 3, 0, 0, 0, 0,
0, FALSE, FALSE, DEFAULT_CHARSET, 0, 0,
PROOF_QUALITY, FF_DONTCARE, _T("Segoe UI"));
- font2 = CreateFont(getscaledfontsize(32), 0, 0, 0, 0,
+ font2 = CreateFont(getscaledfontsize(-1) * 2, 0, 0, 0, 0,
0, FALSE, FALSE, DEFAULT_CHARSET, 0, 0,
PROOF_QUALITY, FF_DONTCARE, _T("Segoe UI"));
}
}
if (i == 16) {
- hdf_read (&hfd, id, 0, 512);
+ hdf_read (&hfd, id, 0, 512, &error);
current_hfdlg.dostype = (id[0] << 24) | (id[1] << 16) | (id[2] << 8) | (id[3] << 0);
}
}
return -1;
return drv;
}
-static int floppyslot_addfile (struct uae_prefs *prefs, const TCHAR *file, int drv, int firstdrv, int maxdrv)
-{
- struct zdirectory *zd = zfile_opendir_archive (file, ZFD_ARCHIVE | ZFD_NORECURSE);
- if (zd && zfile_readdir_archive (zd, NULL, true) > 1) {
- TCHAR out[MAX_DPATH];
- while (zfile_readdir_archive (zd, out, true)) {
- struct zfile *zf = zfile_fopen (out, _T("rb"), ZFD_NORMAL);
- if (zf) {
- int type = zfile_gettype (zf);
- if (type == ZFILE_DISKIMAGE) {
- drv = floppyslot_addfile2 (prefs, out, drv, firstdrv, maxdrv);
- if (drv < 0)
- break;
+static int floppyslot_addfile (struct uae_prefs *prefs, const TCHAR *filepath, const TCHAR *file, int drv, int firstdrv, int maxdrv)
+{
+ if (!filepath[0]) {
+ struct zdirectory *zd = zfile_opendir_archive (file, ZFD_ARCHIVE | ZFD_NORECURSE);
+ if (zd && zfile_readdir_archive (zd, NULL, true) > 1) {
+ TCHAR out[MAX_DPATH];
+ while (zfile_readdir_archive (zd, out, true)) {
+ struct zfile *zf = zfile_fopen (out, _T("rb"), ZFD_NORMAL);
+ if (zf) {
+ int type = zfile_gettype (zf);
+ if (type == ZFILE_DISKIMAGE) {
+ drv = floppyslot_addfile2 (prefs, out, drv, firstdrv, maxdrv);
+ if (drv < 0)
+ break;
+ }
}
}
+ zfile_closedir_archive (zd);
+ } else {
+ drv = floppyslot_addfile2 (prefs, file, drv, firstdrv, maxdrv);
}
- zfile_closedir_archive (zd);
} else {
- drv = floppyslot_addfile2 (prefs, file, drv, firstdrv, maxdrv);
+ drv = floppyslot_addfile2(prefs, filepath, drv, firstdrv, maxdrv);
}
return drv;
}
struct zfile *z;
int type = -1, zip = 0;
int mask;
+ TCHAR filepath[MAX_DPATH];
DragQueryFile (hd, i, file, sizeof (file) / sizeof (TCHAR));
my_resolvesoftlink (file, sizeof file / sizeof (TCHAR), true);
mask = ZFD_ALL;
else
mask = ZFD_NORMAL;
+ filepath[0] = 0;
if (type < 0) {
if (currentpage < 0) {
z = zfile_fopen (file, _T("rb"), 0);
zip = 1;
} else {
type = zfile_gettype (z);
- if (type == ZFILE_ROM)
+ if (type == ZFILE_ROM) {
rd = getromdatabyzfile (z);
+ }
+ if (type > 0) {
+ _tcscpy(filepath, z->name);
+ }
}
zfile_fclose (z);
z = NULL;
} else if (harddrive) {
do_filesys_insert (file, cnt);
} else {
- drv = floppyslot_addfile (prefs, file, drv, firstdrv, i);
+ drv = floppyslot_addfile (prefs, filepath, file, drv, firstdrv, i);
if (drv < 0)
i = cnt;
}