sync 2.2.0

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