sync 2.2.0

parent 516bc4b6
This diff is collapsed.
/* /*
* UAE - The Un*x Amiga Emulator * UAE - The Un*x Amiga Emulator
* *
* lowlevel device glue * lowlevel device glue
* *
*/ */
#include "sysconfig.h" #include "sysconfig.h"
#include "sysdeps.h" #include "sysdeps.h"
...@@ -16,6 +16,8 @@ ...@@ -16,6 +16,8 @@
struct device_functions *device_func[2]; struct device_functions *device_func[2];
static int have_ioctl; static int have_ioctl;
static int openlist[MAX_TOTAL_DEVICES];
static int forcedunit = -1;
#ifdef _WIN32 #ifdef _WIN32
...@@ -85,26 +87,40 @@ static void install_driver (int flags) ...@@ -85,26 +87,40 @@ static void install_driver (int flags)
# endif # endif
#endif #endif
int sys_command_isopen (int unitnum)
{
return openlist[unitnum];
}
void sys_command_setunit (int unitnum)
{
forcedunit = unitnum;
}
int sys_command_open (int mode, int unitnum) int sys_command_open (int mode, int unitnum)
{ {
int ret = 0;
if (mode == DF_SCSI || !have_ioctl) { if (mode == DF_SCSI || !have_ioctl) {
if (device_func[DF_SCSI] == NULL) if (device_func[DF_SCSI] != NULL)
return 0; ret = device_func[DF_SCSI]->opendev (unitnum);
return device_func[DF_SCSI]->opendev (unitnum);
} else { } else {
return device_func[DF_IOCTL]->opendev (unitnum); ret = device_func[DF_IOCTL]->opendev (unitnum);
} }
if (ret)
openlist[unitnum]++;
return ret;
} }
void sys_command_close (int mode, int unitnum) void sys_command_close (int mode, int unitnum)
{ {
if (mode == DF_SCSI || !have_ioctl) { if (mode == DF_SCSI || !have_ioctl) {
if (device_func[DF_SCSI] == NULL) if (device_func[DF_SCSI] != NULL)
return; device_func[DF_SCSI]->closedev (unitnum);
device_func[DF_SCSI]->closedev (unitnum);
} else { } else {
device_func[DF_IOCTL]->closedev (unitnum); device_func[DF_IOCTL]->closedev (unitnum);
} }
if (openlist[unitnum] > 0)
openlist[unitnum]--;
} }
void device_func_reset (void) void device_func_reset (void)
...@@ -117,6 +133,7 @@ int device_func_init (int flags) ...@@ -117,6 +133,7 @@ int device_func_init (int flags)
int support_scsi = 0, support_ioctl = 0; int support_scsi = 0, support_ioctl = 0;
int oflags = (flags & DEVICE_TYPE_SCSI) ? 0 : (1 << INQ_ROMD); int oflags = (flags & DEVICE_TYPE_SCSI) ? 0 : (1 << INQ_ROMD);
forcedunit = -1;
install_driver (flags); install_driver (flags);
if (device_func[DF_IOCTL]) if (device_func[DF_IOCTL])
have_ioctl = 1; have_ioctl = 1;
...@@ -286,6 +303,11 @@ int sys_command_ismedia (int mode, int unitnum, int quick) ...@@ -286,6 +303,11 @@ int sys_command_ismedia (int mode, int unitnum, int quick)
{ {
struct device_info di; struct device_info di;
if (forcedunit >= 0) {
if (unitnum != forcedunit)
return -1;
}
if (mode == DF_SCSI || !have_ioctl || !device_func[DF_IOCTL]->ismedia) { if (mode == DF_SCSI || !have_ioctl || !device_func[DF_IOCTL]->ismedia) {
if (quick) if (quick)
return -1; return -1;
......
...@@ -369,7 +369,7 @@ static int cdrom_info (uae_u8 *out) ...@@ -369,7 +369,7 @@ static int cdrom_info (uae_u8 *out)
uae_u32 size; uae_u32 size;
int i; int i;
if (!ismedia ()) if (ismedia () <= 0)
return -1; return -1;
cd_motor = 1; cd_motor = 1;
out[0] = cdrom_toc[2]; out[0] = cdrom_toc[2];
...@@ -392,7 +392,7 @@ static int read_toc (int track, int msflsn, uae_u8 *out) ...@@ -392,7 +392,7 @@ static int read_toc (int track, int msflsn, uae_u8 *out)
uae_u8 *buf = cdrom_toc, *s; uae_u8 *buf = cdrom_toc, *s;
int i, j; int i, j;
if (!ismedia ()) if (ismedia () <= 0)
return -1; return -1;
if (!out) if (!out)
return 0; return 0;
...@@ -615,10 +615,10 @@ static uae_u8 *read_raw (int sector, int size) ...@@ -615,10 +615,10 @@ static uae_u8 *read_raw (int sector, int size)
_stprintf (fname, "track%d.bin", trackcnt); _stprintf (fname, "track%d.bin", trackcnt);
zfile_fclose (f); zfile_fclose (f);
f = zfile_fopen (fname, "rb", ZFD_NORMAL); f = zfile_fopen (fname, "rb", ZFD_NORMAL);
if (!f) if (f)
write_log ("failed to open '%s'\n", fname);
else
write_log ("opened '%s'\n", fname); write_log ("opened '%s'\n", fname);
else
write_log ("failed to open '%s'\n", fname);
track = trackcnt; track = trackcnt;
} }
if (f) { if (f) {
...@@ -692,8 +692,14 @@ static void *dev_thread (void *p) ...@@ -692,8 +692,14 @@ static void *dev_thread (void *p)
break; break;
case 0x0101: case 0x0101:
{ {
if (ismedia () != cd_media) { int m = ismedia ();
cd_media = ismedia (); if (m < 0) {
write_log ("CDTV: device lost\n");
activate_stch = 1;
cd_hunt = 1;
cd_media = 0;
} else if (m != cd_media) {
cd_media = m;
get_toc (); get_toc ();
activate_stch = 1; activate_stch = 1;
if (cd_playing) if (cd_playing)
...@@ -887,8 +893,16 @@ static void do_hunt (void) ...@@ -887,8 +893,16 @@ static void do_hunt (void)
if (sys_command_ismedia (DF_IOCTL, i, 1) > 0) if (sys_command_ismedia (DF_IOCTL, i, 1) > 0)
break; break;
} }
if (i == MAX_TOTAL_DEVICES) if (i == MAX_TOTAL_DEVICES) {
return; if (unitnum >= 0 && sys_command_ismedia (DF_IOCTL, unitnum, 1) >= 0)
return;
for (i = 0; i < MAX_TOTAL_DEVICES; i++) {
if (sys_command_ismedia (DF_IOCTL, i, 1) >= 0)
break;
}
if (i == MAX_TOTAL_DEVICES)
return;
}
if (unitnum >= 0) { if (unitnum >= 0) {
cdaudiostop (); cdaudiostop ();
sys_command_close (DF_IOCTL, unitnum); sys_command_close (DF_IOCTL, unitnum);
......
...@@ -1414,6 +1414,10 @@ static int cfgfile_parse_host (struct uae_prefs *p, TCHAR *option, TCHAR *value) ...@@ -1414,6 +1414,10 @@ static int cfgfile_parse_host (struct uae_prefs *p, TCHAR *option, TCHAR *value)
} }
#ifdef GFXFILTER #ifdef GFXFILTER
if (_tcscmp (option, "gfx_filter_overlay") == 0) {
return 1;
}
if (_tcscmp (option, "gfx_filter") == 0) { if (_tcscmp (option, "gfx_filter") == 0) {
int i = 0; int i = 0;
TCHAR *s = _tcschr (value, ':'); TCHAR *s = _tcschr (value, ':');
......
...@@ -3769,9 +3769,10 @@ static void ...@@ -3769,9 +3769,10 @@ static void
possible_loadseg(); possible_loadseg();
} }
#endif #endif
if (valid_address (addr, size)) { if (size == 0) {
uae_u8 *realpt; actual = 0;
realpt = get_real_address (addr); } else if (valid_address (addr, size)) {
uae_u8 *realpt = get_real_address (addr);
actual = fs_read (k->fd, realpt, size); actual = fs_read (k->fd, realpt, size);
if (actual == 0) { if (actual == 0) {
...@@ -3826,8 +3827,8 @@ static void ...@@ -3826,8 +3827,8 @@ static void
{ {
Key *k = lookup_key (unit, GET_PCK_ARG1 (packet)); Key *k = lookup_key (unit, GET_PCK_ARG1 (packet));
uaecptr addr = GET_PCK_ARG2 (packet); uaecptr addr = GET_PCK_ARG2 (packet);
long size = GET_PCK_ARG3 (packet); uae_u32 size = GET_PCK_ARG3 (packet);
long actual; uae_u32 actual;
uae_u8 *buf; uae_u8 *buf;
int i; int i;
...@@ -3846,12 +3847,12 @@ static void ...@@ -3846,12 +3847,12 @@ static void
return; return;
} }
if (valid_address (addr, size)) { if (size == 0) {
actual = 0;
} else if (valid_address (addr, size)) {
uae_u8 *realpt = get_real_address (addr); uae_u8 *realpt = get_real_address (addr);
actual = fs_write (k->fd, realpt, size); actual = fs_write (k->fd, realpt, size);
} else { } else {
write_log ("unixfs warning: Bad pointer passed for write: %08x, size %d\n", addr, size); write_log ("unixfs warning: Bad pointer passed for write: %08x, size %d\n", addr, size);
/* ugh this is inefficient but easy */ /* ugh this is inefficient but easy */
buf = xmalloc (uae_u8, size); buf = xmalloc (uae_u8, size);
......
...@@ -121,6 +121,8 @@ extern int device_func_init(int flags); ...@@ -121,6 +121,8 @@ extern int device_func_init(int flags);
extern void device_func_reset(void); extern void device_func_reset(void);
extern int sys_command_open (int mode, int unitnum); extern int sys_command_open (int mode, int unitnum);
extern void sys_command_close (int mode, int unitnum); extern void sys_command_close (int mode, int unitnum);
extern int sys_command_isopen (int unitnum);
extern void sys_command_setunit (int unitnum);
extern struct device_info *sys_command_info (int mode, int unitnum, struct device_info *di); extern struct device_info *sys_command_info (int mode, int unitnum, struct device_info *di);
extern struct device_scsi_info *sys_command_scsi_info (int mode, int unitnum, struct device_scsi_info *di); extern struct device_scsi_info *sys_command_scsi_info (int mode, int unitnum, struct device_scsi_info *di);
extern void sys_command_cd_pause (int mode, int unitnum, int paused); extern void sys_command_cd_pause (int mode, int unitnum, int paused);
......
...@@ -14,10 +14,10 @@ STATIC_INLINE double to_single (uae_u32 value) ...@@ -14,10 +14,10 @@ STATIC_INLINE double to_single (uae_u32 value)
double frac; double frac;
if ((value & 0x7fffffff) == 0) if ((value & 0x7fffffff) == 0)
return (0.0); return (0.0);
frac = (double) ((value & 0x7fffff) | 0x800000) / 8388608.0; frac = (double) ((value & 0x7fffff) | 0x800000) / 8388608.0;
if (value & 0x80000000) if (value & 0x80000000)
frac = -frac; frac = -frac;
return (ldexp (frac, ((value >> 23) & 0xff) - 127)); return (ldexp (frac, ((value >> 23) & 0xff) - 127));
} }
#endif #endif
...@@ -30,18 +30,18 @@ STATIC_INLINE uae_u32 from_single (double src) ...@@ -30,18 +30,18 @@ STATIC_INLINE uae_u32 from_single (double src)
double frac; double frac;
if (src == 0.0) if (src == 0.0)
return 0; return 0;
if (src < 0) { if (src < 0) {
tmp = 0x80000000; tmp = 0x80000000;
src = -src; src = -src;
} else { } else {
tmp = 0; tmp = 0;
} }
frac = frexp (src, &expon); frac = frexp (src, &expon);
frac += 0.5 / 16777216.0; frac += 0.5 / 16777216.0;
if (frac >= 1.0) { if (frac >= 1.0) {
frac /= 2.0; frac /= 2.0;
expon++; expon++;
} }
return (tmp | (((expon + 127 - 1) & 0xff) << 23) | return (tmp | (((expon + 127 - 1) & 0xff) << 23) |
(((int) (frac * 16777216.0)) & 0x7fffff)); (((int) (frac * 16777216.0)) & 0x7fffff));
...@@ -54,11 +54,11 @@ STATIC_INLINE double to_exten(uae_u32 wrd1, uae_u32 wrd2, uae_u32 wrd3) ...@@ -54,11 +54,11 @@ STATIC_INLINE double to_exten(uae_u32 wrd1, uae_u32 wrd2, uae_u32 wrd3)
double frac; double frac;
if ((wrd1 & 0x7fff0000) == 0 && wrd2 == 0 && wrd3 == 0) if ((wrd1 & 0x7fff0000) == 0 && wrd2 == 0 && wrd3 == 0)
return 0.0; return 0.0;
frac = (double) wrd2 / 2147483648.0 + frac = (double) wrd2 / 2147483648.0 +
(double) wrd3 / 9223372036854775808.0; (double) wrd3 / 9223372036854775808.0;
if (wrd1 & 0x80000000) if (wrd1 & 0x80000000)
frac = -frac; frac = -frac;
return ldexp (frac, ((wrd1 >> 16) & 0x7fff) - 16383); return ldexp (frac, ((wrd1 >> 16) & 0x7fff) - 16383);
} }
#endif #endif
...@@ -70,22 +70,22 @@ STATIC_INLINE void from_exten(double src, uae_u32 * wrd1, uae_u32 * wrd2, uae_u3 ...@@ -70,22 +70,22 @@ STATIC_INLINE void from_exten(double src, uae_u32 * wrd1, uae_u32 * wrd2, uae_u3
double frac; double frac;
if (src == 0.0) { if (src == 0.0) {
*wrd1 = 0; *wrd1 = 0;
*wrd2 = 0; *wrd2 = 0;
*wrd3 = 0; *wrd3 = 0;
return; return;
} }
if (src < 0) { if (src < 0) {
*wrd1 = 0x80000000; *wrd1 = 0x80000000;
src = -src; src = -src;
} else { } else {
*wrd1 = 0; *wrd1 = 0;
} }
frac = frexp (src, &expon); frac = frexp (src, &expon);
frac += 0.5 / 18446744073709551616.0; frac += 0.5 / 18446744073709551616.0;
if (frac >= 1.0) { if (frac >= 1.0) {
frac /= 2.0; frac /= 2.0;
expon++; expon++;
} }
*wrd1 |= (((expon + 16383 - 1) & 0x7fff) << 16); *wrd1 |= (((expon + 16383 - 1) & 0x7fff) << 16);
*wrd2 = (uae_u32) (frac * 4294967296.0); *wrd2 = (uae_u32) (frac * 4294967296.0);
...@@ -99,11 +99,11 @@ STATIC_INLINE double to_double(uae_u32 wrd1, uae_u32 wrd2) ...@@ -99,11 +99,11 @@ STATIC_INLINE double to_double(uae_u32 wrd1, uae_u32 wrd2)
double frac; double frac;
if ((wrd1 & 0x7fffffff) == 0 && wrd2 == 0) if ((wrd1 & 0x7fffffff) == 0 && wrd2 == 0)
return 0.0; return 0.0;
frac = (double) ((wrd1 & 0xfffff) | 0x100000) / 1048576.0 + frac = (double) ((wrd1 & 0xfffff) | 0x100000) / 1048576.0 +
(double) wrd2 / 4503599627370496.0; (double) wrd2 / 4503599627370496.0;
if (wrd1 & 0x80000000) if (wrd1 & 0x80000000)
frac = -frac; frac = -frac;
return ldexp (frac, ((wrd1 >> 20) & 0x7ff) - 1023); return ldexp (frac, ((wrd1 >> 20) & 0x7ff) - 1023);
} }
#endif #endif
...@@ -116,21 +116,21 @@ STATIC_INLINE void from_double(double src, uae_u32 * wrd1, uae_u32 * wrd2) ...@@ -116,21 +116,21 @@ STATIC_INLINE void from_double(double src, uae_u32 * wrd1, uae_u32 * wrd2)
double frac; double frac;
if (src == 0.0) { if (src == 0.0) {
*wrd1 = 0; *wrd1 = 0;
*wrd2 = 0; *wrd2 = 0;
return; return;
} }
if (src < 0) { if (src < 0) {
*wrd1 = 0x80000000; *wrd1 = 0x80000000;
src = -src; src = -src;
} else { } else {
*wrd1 = 0; *wrd1 = 0;
} }
frac = frexp (src, &expon); frac = frexp (src, &expon);
frac += 0.5 / 9007199254740992.0; frac += 0.5 / 9007199254740992.0;
if (frac >= 1.0) { if (frac >= 1.0) {
frac /= 2.0; frac /= 2.0;
expon++; expon++;
} }
tmp = (uae_u32) (frac * 2097152.0); tmp = (uae_u32) (frac * 2097152.0);
*wrd1 |= (((expon + 1023 - 1) & 0x7ff) << 20) | (tmp & 0xfffff); *wrd1 |= (((expon + 1023 - 1) & 0x7ff) << 20) | (tmp & 0xfffff);
......
...@@ -18,8 +18,8 @@ ...@@ -18,8 +18,8 @@
/* Seems the same routines copy back and forth ;-) */ /* Seems the same routines copy back and forth ;-) */
#define PIC_READ (SPECIAL_MEM_READ|SPECIAL_MEM_WRITE) #define PIC_READ (SPECIAL_MEM_READ|SPECIAL_MEM_WRITE)
#define PIC_WRITE (SPECIAL_MEM_READ|SPECIAL_MEM_WRITE) #define PIC_WRITE (SPECIAL_MEM_READ|SPECIAL_MEM_WRITE)
#define JAM1 0 #define JAM1 0
#define JAM2 1 #define JAM2 1
......
...@@ -276,9 +276,15 @@ int scsiemul_switchscsi (TCHAR *name) ...@@ -276,9 +276,15 @@ int scsiemul_switchscsi (TCHAR *name)
{ {
struct devstruct *dev = NULL; struct devstruct *dev = NULL;
struct device_info *discsi, discsi2; struct device_info *discsi, discsi2;
int i, j; int i, j, opened[MAX_TOTAL_DEVICES];
bool wasopen = false;
for (i = 0; i < MAX_TOTAL_DEVICES; i++)
opened[i] = sys_command_isopen (i);
dev = &devst[0]; dev = &devst[0];
if ((dev->allow_ioctl || dev->allow_scsi) && dev->opencnt)
wasopen = true;
if (dev->allow_scsi) if (dev->allow_scsi)
sys_command_close (DF_SCSI, dev->unitnum); sys_command_close (DF_SCSI, dev->unitnum);
if (dev->allow_ioctl) if (dev->allow_ioctl)
...@@ -307,7 +313,7 @@ int scsiemul_switchscsi (TCHAR *name) ...@@ -307,7 +313,7 @@ int scsiemul_switchscsi (TCHAR *name)
dev->drivetype = discsi->type; dev->drivetype = discsi->type;
memcpy (&dev->di, discsi, sizeof (struct device_info)); memcpy (&dev->di, discsi, sizeof (struct device_info));
dev->iscd = 1; dev->iscd = 1;
write_log ("%s mounted as uaescsi.device:0 (SCSI=%d)\n", discsi->label, dev->allow_scsi); write_log ("%s mounted as uaescsi.device:0 (SCSI=%d IOCTL=%d)\n", discsi->label, dev->allow_scsi, dev->allow_ioctl);
if (dev->aunit >= 0) { if (dev->aunit >= 0) {
struct priv_devstruct *pdev = &pdevst[dev->aunit]; struct priv_devstruct *pdev = &pdevst[dev->aunit];
setpdev (pdev, dev); setpdev (pdev, dev);
...@@ -318,7 +324,7 @@ int scsiemul_switchscsi (TCHAR *name) ...@@ -318,7 +324,7 @@ int scsiemul_switchscsi (TCHAR *name)
} }
} }
} }
if (devst[0].opencnt == 0) if (opened[i] == 0 && !wasopen)
sys_command_close (mode, i); sys_command_close (mode, i);
} }
i++; i++;
...@@ -335,6 +341,7 @@ static int scsiemul_switchemu (const TCHAR *name) ...@@ -335,6 +341,7 @@ static int scsiemul_switchemu (const TCHAR *name)
if (!device_func_init (DEVICE_TYPE_ANY | DEVICE_TYPE_ALLOWEMU)) if (!device_func_init (DEVICE_TYPE_ANY | DEVICE_TYPE_ALLOWEMU))
return -1; return -1;
int opened = sys_command_isopen (0);
if (sys_command_open (DF_IOCTL, 0)) { if (sys_command_open (DF_IOCTL, 0)) {
if (discsi = sys_command_info (DF_IOCTL, 0, &discsi2)) { if (discsi = sys_command_info (DF_IOCTL, 0, &discsi2)) {
dev = &devst[0]; dev = &devst[0];
...@@ -351,7 +358,7 @@ static int scsiemul_switchemu (const TCHAR *name) ...@@ -351,7 +358,7 @@ static int scsiemul_switchemu (const TCHAR *name)
} }
dev->di.media_inserted = 0; dev->di.media_inserted = 0;
} }
if (devst[0].opencnt == 0) if (!opened)
sys_command_close (DF_IOCTL, 0); sys_command_close (DF_IOCTL, 0);
return 0; return 0;
} }
......
...@@ -445,7 +445,7 @@ configure:4344: $? = 0 ...@@ -445,7 +445,7 @@ configure:4344: $? = 0
configure:4344: result: yes configure:4344: result: yes
configure:4350: checking for _doprnt configure:4350: checking for _doprnt
configure:4350: gcc -o conftest -g -O2 -Wall -W -Wno-unused conftest.c >&5 configure:4350: gcc -o conftest -g -O2 -Wall -W -Wno-unused conftest.c >&5
/tmp/cc65mTgk.o: In function `main': /tmp/cczRCLXC.o: In function `main':
/home/gnostic/puaex/src/tools/conftest.c:67: undefined reference to `_doprnt' /home/gnostic/puaex/src/tools/conftest.c:67: undefined reference to `_doprnt'
collect2: ld returned 1 exit status collect2: ld returned 1 exit status
configure:4350: $? = 1 configure:4350: $? = 1
...@@ -533,7 +533,7 @@ configure:4364: $? = 0 ...@@ -533,7 +533,7 @@ configure:4364: $? = 0
configure:4364: result: yes configure:4364: result: yes
configure:4364: checking for strcmpi configure:4364: checking for strcmpi
configure:4364: gcc -o conftest -g -O2 -Wall -W -Wno-unused conftest.c >&5 configure:4364: gcc -o conftest -g -O2 -Wall -W -Wno-unused conftest.c >&5
/tmp/cc7AqVhB.o: In function `main': /tmp/ccZxlONG.o: In function `main':
/home/gnostic/puaex/src/tools/conftest.c:69: undefined reference to `strcmpi' /home/gnostic/puaex/src/tools/conftest.c:69: undefined reference to `strcmpi'
collect2: ld returned 1 exit status collect2: ld returned 1 exit status
configure:4364: $? = 1 configure:4364: $? = 1
...@@ -613,7 +613,7 @@ configure: failed program was: ...@@ -613,7 +613,7 @@ configure: failed program was:
configure:4364: result: no configure:4364: result: no
configure:4364: checking for stricmp configure:4364: checking for stricmp
configure:4364: gcc -o conftest -g -O2 -Wall -W -Wno-unused conftest.c >&5 configure:4364: gcc -o conftest -g -O2 -Wall -W -Wno-unused conftest.c >&5
/tmp/ccqJO3OI.o: In function `main': /tmp/ccRpVkEO.o: In function `main':
/home/gnostic/puaex/src/tools/conftest.c:69: undefined reference to `stricmp' /home/gnostic/puaex/src/tools/conftest.c:69: undefined reference to `stricmp'
collect2: ld returned 1 exit status collect2: ld returned 1 exit status
configure:4364: $? = 1 configure:4364: $? = 1
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment