sync 2.2.0

parent 516bc4b6
/*
/*
* UAE - The Un*x Amiga Emulator
*
* CD32 Akiko emulation
......@@ -159,7 +159,7 @@ static void i2c_do (void)
bitcounter = -1;
}
} else {
//write_log ("NVRAM received bit %d, offset %d\n", sda_out, bitcounter);
//write_log (L"NVRAM received bit %d, offset %d\n", sda_out, bitcounter);
nvram_byte <<= 1;
nvram_byte |= sda_out;
bitcounter++;
......@@ -390,11 +390,11 @@ static uae_u8 cdrom_result_buffer[32];
static uae_u8 cdrom_command_buffer[32];
static uae_u8 cdrom_command;
#define MAX_TOC_ENTRIES 103 /* tracks 1-99, A0,A1 and A2 */
#define MAX_TOC_ENTRIES 103 /* tracks 1-99, A0, A1 and A2 */
static int cdrom_toc_entries;
static int cdrom_toc_counter;
static uae_u32 cdrom_toc_crc;
static uae_u8 cdrom_toc_buffer[MAX_TOC_ENTRIES*13];
static uae_u8 cdrom_toc_buffer[MAX_TOC_ENTRIES * 13];
static uae_u8 cdrom_toc_cd_buffer[4 + MAX_TOC_ENTRIES * 11];
static uae_u8 qcode_buf[12];
static int qcode_valid;
......@@ -714,7 +714,7 @@ static int sys_cddev_open (void)
sys_command_close (DF_IOCTL, unitnum);
return 1;
}
if (!sys_command_ismedia (DF_IOCTL, unitnum, 0))
if (sys_command_ismedia (DF_IOCTL, unitnum, 0) <= 0)
cd_hunt = 1;
write_log ("using drive %s (unit %d, media %d)\n", di2->label, unitnum, di2->media_inserted);
/* make sure CD audio is not playing */
......@@ -789,7 +789,7 @@ static int cdrom_command_led (void)
static int cdrom_command_media_status (void)
{
cdrom_result_buffer[0] = 0x0a;
cdrom_result_buffer[1] = sys_command_ismedia (DF_IOCTL, unitnum, 0) ? 0x83: 0x80;
cdrom_result_buffer[1] = sys_command_ismedia (DF_IOCTL, unitnum, 0) > 0 ? 0x83: 0x80;
return 2;
}
......@@ -980,7 +980,7 @@ static void cdrom_run_command (void)
write_log ("%02X ", cdrom_command_buffer[i]);
#endif
}
if (checksum!=0xff) {
if (checksum != 0xff) {
#if AKIKO_DEBUG_IO_CMD
write_log (" checksum error");
#endif
......@@ -1001,7 +1001,7 @@ static void cdrom_run_command_run (void)
int len;
cdcomtxinx = (cdcomtxinx + cdrom_command_length + 1) & 0xff;
memset (cdrom_result_buffer, 0, sizeof(cdrom_result_buffer));
memset (cdrom_result_buffer, 0, sizeof (cdrom_result_buffer));
switch (cdrom_command & 0x0f)
{
case 2:
......@@ -1052,7 +1052,7 @@ static void cdrom_run_read (void)
}
if (!(cdrom_flags & CDFLAG_PBX))
return;
if (cdrom_data_offset<0)
if (cdrom_data_offset < 0)
return;
if (unitnum < 0)
return;
......@@ -1151,8 +1151,16 @@ static void do_hunt (void)
if (sys_command_ismedia (DF_IOCTL, i, 1) > 0)
break;
}
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) {
int ou = unitnum;
unitnum = -1;
......@@ -1289,10 +1297,16 @@ static void *akiko_thread (void *null)
}
if (mediacheckcounter <= 0) {
int media = sys_command_ismedia (DF_IOCTL, unitnum, 1);
mediacheckcounter = 312 * 50 * 2;
if (media != lastmediastate) {
write_log ("media changed = %d\n", media);
int media = sys_command_ismedia (DF_IOCTL, unitnum, 1);
if (media < 0) {
cd_hunt = 1;
write_log ("CD32: device unit %d lost\n", unitnum);
media = lastmediastate = cdrom_disk = 0;
mediachanged = 1;
cdaudiostop_do ();
} else if (media != lastmediastate) {
write_log ("CD32: media changed = %d (hunt=%d)\n", media, cd_hunt);
lastmediastate = cdrom_disk = media;
mediachanged = 1;
cdaudiostop_do ();
......@@ -1657,7 +1671,7 @@ static void akiko_cdrom_free (void)
sector_buffer_info_1 = 0;
sector_buffer_info_2 = 0;
cdromok = 0;
}
}
void akiko_reset (void)
{
......
/*
* 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;
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) {
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);
......
......@@ -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