sync 2.2.0

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