Fixed #287: CD32 - Eject CD, Insert new and Reset doesn't boot the new CD
This commit is contained in:
parent
e3b7cf3776
commit
92df2f1a18
3 changed files with 147 additions and 116 deletions
|
@ -395,7 +395,24 @@ void blkdev_cd_change (int unitnum, const TCHAR *name)
|
|||
sys_command_info (unitnum, &di, 1);
|
||||
}
|
||||
|
||||
void device_func_reset (void)
|
||||
void device_func_reset(void)
|
||||
{
|
||||
// if reset during delayed CD change, re-insert the CD immediately
|
||||
for (int i = 0; i < MAX_TOTAL_SCSI_DEVICES; i++) {
|
||||
struct blkdevstate *st = &state[i];
|
||||
if (st->imagechangetime > 0 && st->newimagefile[0] && !currprefs.cdslots[i].name[0]) {
|
||||
_tcscpy(changed_prefs.cdslots[i].name, st->newimagefile);
|
||||
_tcscpy(currprefs.cdslots[i].name, st->newimagefile);
|
||||
//cd_statusline_label(i);
|
||||
}
|
||||
st->imagechangetime = 0;
|
||||
st->newimagefile[0] = 0;
|
||||
//st->mediawaschanged = false;
|
||||
st->waspaused = false;
|
||||
}
|
||||
}
|
||||
|
||||
void device_func_free(void)
|
||||
{
|
||||
for (int i = 0; i < MAX_TOTAL_SCSI_DEVICES; i++) {
|
||||
struct blkdevstate *st = &state[i];
|
||||
|
|
112
src/devices.cpp
112
src/devices.cpp
|
@ -35,23 +35,23 @@
|
|||
|
||||
void device_check_config(void)
|
||||
{
|
||||
check_prefs_changed_audio ();
|
||||
check_prefs_changed_custom ();
|
||||
check_prefs_changed_cpu ();
|
||||
check_prefs_changed_audio();
|
||||
check_prefs_changed_custom();
|
||||
check_prefs_changed_cpu();
|
||||
check_prefs_picasso();
|
||||
}
|
||||
|
||||
void devices_reset(int hardreset)
|
||||
{
|
||||
gayle_reset (hardreset);
|
||||
DISK_reset ();
|
||||
CIA_reset ();
|
||||
gayle_reset (0);
|
||||
gayle_reset(hardreset);
|
||||
DISK_reset();
|
||||
CIA_reset();
|
||||
gayle_reset(0);
|
||||
#ifdef JIT
|
||||
compemu_reset ();
|
||||
compemu_reset();
|
||||
#endif
|
||||
#ifdef AUTOCONFIG
|
||||
expamem_reset ();
|
||||
expamem_reset();
|
||||
rtarea_reset();
|
||||
#endif
|
||||
uae_int_requested = 0;
|
||||
|
@ -60,34 +60,34 @@ void devices_reset(int hardreset)
|
|||
|
||||
void devices_vsync_pre(void)
|
||||
{
|
||||
blkdev_vsync ();
|
||||
CIA_vsync_prehandler();
|
||||
inputdevice_vsync ();
|
||||
filesys_vsync ();
|
||||
blkdev_vsync();
|
||||
CIA_vsync_prehandler();
|
||||
inputdevice_vsync();
|
||||
filesys_vsync();
|
||||
}
|
||||
|
||||
void devices_hsync(void)
|
||||
{
|
||||
#ifdef CD32
|
||||
AKIKO_hsync_handler ();
|
||||
AKIKO_hsync_handler();
|
||||
cd32_fmv_hsync_handler();
|
||||
#endif
|
||||
decide_blitter (-1);
|
||||
decide_blitter(-1);
|
||||
|
||||
DISK_hsync ();
|
||||
audio_hsync ();
|
||||
gayle_hsync ();
|
||||
DISK_hsync();
|
||||
audio_hsync();
|
||||
gayle_hsync();
|
||||
}
|
||||
|
||||
// these really should be dynamically allocated..
|
||||
void devices_rethink(void)
|
||||
{
|
||||
rethink_cias ();
|
||||
rethink_cias();
|
||||
#ifdef CD32
|
||||
rethink_akiko ();
|
||||
rethink_akiko();
|
||||
rethink_cd32fmv();
|
||||
#endif
|
||||
rethink_gayle ();
|
||||
rethink_gayle();
|
||||
rethink_uae_int();
|
||||
}
|
||||
|
||||
|
@ -96,42 +96,43 @@ void devices_update_sync(double svpos, double syncadjust)
|
|||
cd32_fmv_set_sync(svpos, syncadjust);
|
||||
}
|
||||
|
||||
void reset_all_systems (void)
|
||||
void reset_all_systems(void)
|
||||
{
|
||||
init_eventtab ();
|
||||
init_eventtab();
|
||||
|
||||
#ifdef PICASSO96
|
||||
picasso_reset ();
|
||||
picasso_reset();
|
||||
#endif
|
||||
#ifdef FILESYS
|
||||
filesys_prepare_reset ();
|
||||
filesys_reset ();
|
||||
filesys_prepare_reset();
|
||||
filesys_reset();
|
||||
#endif
|
||||
init_shm ();
|
||||
memory_reset ();
|
||||
init_shm();
|
||||
memory_reset();
|
||||
#if defined (BSDSOCKET)
|
||||
bsdlib_reset ();
|
||||
bsdlib_reset();
|
||||
#endif
|
||||
#ifdef FILESYS
|
||||
filesys_start_threads ();
|
||||
hardfile_reset ();
|
||||
filesys_start_threads();
|
||||
hardfile_reset();
|
||||
#endif
|
||||
native2amiga_reset ();
|
||||
native2amiga_reset();
|
||||
device_func_reset();
|
||||
uae_int_requested = 0;
|
||||
}
|
||||
|
||||
void do_leave_program (void)
|
||||
void do_leave_program(void)
|
||||
{
|
||||
#ifdef JIT
|
||||
compiler_exit();
|
||||
compiler_exit();
|
||||
#endif
|
||||
graphics_leave ();
|
||||
inputdevice_close ();
|
||||
DISK_free ();
|
||||
close_sound ();
|
||||
dump_counts ();
|
||||
graphics_leave();
|
||||
inputdevice_close();
|
||||
DISK_free();
|
||||
close_sound();
|
||||
dump_counts();
|
||||
#ifdef CD32
|
||||
akiko_free ();
|
||||
akiko_free();
|
||||
cd32_fmv_free();
|
||||
#endif
|
||||
gui_exit();
|
||||
|
@ -149,42 +150,43 @@ void do_leave_program (void)
|
|||
bsdlib_reset();
|
||||
#endif
|
||||
gayle_free();
|
||||
device_func_reset();
|
||||
device_func_free();
|
||||
memory_cleanup();
|
||||
cfgfile_addcfgparam(0);
|
||||
cfgfile_addcfgparam(nullptr);
|
||||
machdep_free();
|
||||
rtarea_free();
|
||||
}
|
||||
|
||||
void virtualdevice_init (void)
|
||||
void virtualdevice_init(void)
|
||||
{
|
||||
#ifdef AUTOCONFIG
|
||||
rtarea_setup ();
|
||||
rtarea_setup();
|
||||
#endif
|
||||
#ifdef FILESYS
|
||||
rtarea_init ();
|
||||
uaeres_install ();
|
||||
hardfile_install ();
|
||||
rtarea_init();
|
||||
uaeres_install();
|
||||
hardfile_install();
|
||||
#endif
|
||||
#ifdef AUTOCONFIG
|
||||
expansion_init ();
|
||||
emulib_install ();
|
||||
expansion_init();
|
||||
emulib_install();
|
||||
#endif
|
||||
#ifdef FILESYS
|
||||
filesys_install ();
|
||||
filesys_install();
|
||||
#endif
|
||||
#if defined (BSDSOCKET)
|
||||
bsdlib_install ();
|
||||
bsdlib_install();
|
||||
#endif
|
||||
}
|
||||
|
||||
void devices_restore_start(void)
|
||||
{
|
||||
restore_cia_start ();
|
||||
restore_cia_start();
|
||||
restore_blkdev_start();
|
||||
changed_prefs.bogomem_size = 0;
|
||||
changed_prefs.chipmem_size = 0;
|
||||
for (int i = 0; i < MAX_RAM_BOARDS; i++) {
|
||||
changed_prefs.bogomem_size = 0;
|
||||
changed_prefs.chipmem_size = 0;
|
||||
for (int i = 0; i < MAX_RAM_BOARDS; i++)
|
||||
{
|
||||
changed_prefs.fastmem[i].size = 0;
|
||||
changed_prefs.z3fastmem[i].size = 0;
|
||||
}
|
||||
|
|
|
@ -31,6 +31,7 @@
|
|||
#define INQ_NOTPR 0x1F /* Logical unit not present (SCSI-1) */
|
||||
|
||||
#define MAX_TOC_ENTRIES 103
|
||||
|
||||
struct cd_toc
|
||||
{
|
||||
uae_u8 adr, control;
|
||||
|
@ -42,6 +43,7 @@ struct cd_toc
|
|||
uae_u8 zero;
|
||||
uae_u8 crc[2];
|
||||
};
|
||||
|
||||
struct cd_toc_head
|
||||
{
|
||||
int first_track, first_track_offset;
|
||||
|
@ -64,25 +66,26 @@ struct cd_toc_head
|
|||
#define AUDIO_STATUS_PLAY_ERROR 0x14
|
||||
#define AUDIO_STATUS_NO_STATUS 0x15
|
||||
|
||||
struct device_info {
|
||||
struct device_info
|
||||
{
|
||||
bool open;
|
||||
int type;
|
||||
int media_inserted;
|
||||
int type;
|
||||
int media_inserted;
|
||||
int audio_playing;
|
||||
int removable;
|
||||
int write_protected;
|
||||
int cylinders;
|
||||
int trackspercylinder;
|
||||
int sectorspertrack;
|
||||
int bytespersector;
|
||||
int bus, target, lun;
|
||||
int unitnum;
|
||||
TCHAR label[MAX_DPATH];
|
||||
int removable;
|
||||
int write_protected;
|
||||
int cylinders;
|
||||
int trackspercylinder;
|
||||
int sectorspertrack;
|
||||
int bytespersector;
|
||||
int bus, target, lun;
|
||||
int unitnum;
|
||||
TCHAR label[MAX_DPATH];
|
||||
TCHAR mediapath[MAX_DPATH];
|
||||
TCHAR vendorid[10];
|
||||
TCHAR productid[18];
|
||||
TCHAR revision[6];
|
||||
const TCHAR *backend;
|
||||
const TCHAR* backend;
|
||||
struct cd_toc_head toc;
|
||||
TCHAR system_id[33];
|
||||
TCHAR volume_id[33];
|
||||
|
@ -90,17 +93,17 @@ struct device_info {
|
|||
|
||||
struct amigascsi
|
||||
{
|
||||
uae_u8 *data;
|
||||
uae_s32 len;
|
||||
uae_u8 cmd[16];
|
||||
uae_s32 cmd_len;
|
||||
uae_u8 flags;
|
||||
uae_u8 sensedata[256];
|
||||
uae_u16 sense_len;
|
||||
uae_u16 cmdactual;
|
||||
uae_u8 status;
|
||||
uae_u16 actual;
|
||||
uae_u16 sactual;
|
||||
uae_u8* data;
|
||||
uae_s32 len;
|
||||
uae_u8 cmd[16];
|
||||
uae_s32 cmd_len;
|
||||
uae_u8 flags;
|
||||
uae_u8 sensedata[256];
|
||||
uae_u16 sense_len;
|
||||
uae_u16 cmdactual;
|
||||
uae_u8 status;
|
||||
uae_u16 actual;
|
||||
uae_u16 sactual;
|
||||
};
|
||||
|
||||
typedef int (*check_bus_func)(int flags);
|
||||
|
@ -126,8 +129,9 @@ typedef int (*isatapi_func)(int);
|
|||
typedef int (*ismedia_func)(int, int);
|
||||
typedef int (*scsiemu_func)(int, uae_u8*);
|
||||
|
||||
struct device_functions {
|
||||
const TCHAR *name;
|
||||
struct device_functions
|
||||
{
|
||||
const TCHAR* name;
|
||||
open_bus_func openbus;
|
||||
close_bus_func closebus;
|
||||
open_device_func opendev;
|
||||
|
@ -148,51 +152,59 @@ struct device_functions {
|
|||
ismedia_func ismedia;
|
||||
|
||||
scsiemu_func scsiemu;
|
||||
|
||||
};
|
||||
|
||||
extern int device_func_init(int flags);
|
||||
extern void device_func_free(void);
|
||||
extern void device_func_reset(void);
|
||||
extern int sys_command_open (int unitnum);
|
||||
extern void sys_command_close (int unitnum);
|
||||
extern struct device_info *sys_command_info (int unitnum, struct device_info *di, int);
|
||||
extern int sys_command_cd_pause (int unitnum, int paused);
|
||||
extern void sys_command_cd_stop (int unitnum);
|
||||
extern int sys_command_cd_play (int unitnum, int startlsn, int endlsn, int);
|
||||
extern int sys_command_cd_play (int unitnum, int startlsn, int endlsn, int scan, play_status_callback statusfunc, play_subchannel_callback subfunc);
|
||||
extern uae_u32 sys_command_cd_volume (int unitnum, uae_u16 volume_left, uae_u16 volume_right);
|
||||
extern int sys_command_cd_qcode (int unitnum, uae_u8*, int lsn, bool all);
|
||||
extern int sys_command_cd_toc (int unitnum, struct cd_toc_head*);
|
||||
extern int sys_command_cd_read (int unitnum, uae_u8 *data, int block, int size);
|
||||
extern int sys_command_cd_rawread (int unitnum, uae_u8 *data, int sector, int size, int sectorsize);
|
||||
int sys_command_cd_rawread (int unitnum, uae_u8 *data, int sector, int size, int sectorsize, uae_u8 sectortype, uae_u8 scsicmd9, uae_u8 subs);
|
||||
extern int sys_command_ismedia (int unitnum, int quick);
|
||||
extern struct device_info *sys_command_info_session (int unitnum, struct device_info *di, int, int);
|
||||
extern int sys_command_open(int unitnum);
|
||||
extern void sys_command_close(int unitnum);
|
||||
extern struct device_info* sys_command_info(int unitnum, struct device_info* di, int);
|
||||
extern int sys_command_cd_pause(int unitnum, int paused);
|
||||
extern void sys_command_cd_stop(int unitnum);
|
||||
extern int sys_command_cd_play(int unitnum, int startlsn, int endlsn, int);
|
||||
extern int sys_command_cd_play(int unitnum, int startlsn, int endlsn, int scan, play_status_callback statusfunc,
|
||||
play_subchannel_callback subfunc);
|
||||
extern uae_u32 sys_command_cd_volume(int unitnum, uae_u16 volume_left, uae_u16 volume_right);
|
||||
extern int sys_command_cd_qcode(int unitnum, uae_u8*, int lsn, bool all);
|
||||
extern int sys_command_cd_toc(int unitnum, struct cd_toc_head*);
|
||||
extern int sys_command_cd_read(int unitnum, uae_u8* data, int block, int size);
|
||||
extern int sys_command_cd_rawread(int unitnum, uae_u8* data, int sector, int size, int sectorsize);
|
||||
int sys_command_cd_rawread(int unitnum, uae_u8* data, int sector, int size, int sectorsize, uae_u8 sectortype,
|
||||
uae_u8 scsicmd9, uae_u8 subs);
|
||||
extern int sys_command_ismedia(int unitnum, int quick);
|
||||
extern struct device_info* sys_command_info_session(int unitnum, struct device_info* di, int, int);
|
||||
|
||||
extern void blkdev_vsync (void);
|
||||
extern void blkdev_vsync(void);
|
||||
extern void restore_blkdev_start(void);
|
||||
|
||||
extern int msf2lsn (int msf);
|
||||
extern int lsn2msf (int lsn);
|
||||
extern uae_u8 frombcd (uae_u8 v);
|
||||
extern uae_u8 tobcd (uae_u8 v);
|
||||
extern int fromlongbcd (uae_u8 *p);
|
||||
extern void tolongbcd (uae_u8 *p, int v);
|
||||
extern int msf2lsn(int msf);
|
||||
extern int lsn2msf(int lsn);
|
||||
extern uae_u8 frombcd(uae_u8 v);
|
||||
extern uae_u8 tobcd(uae_u8 v);
|
||||
extern int fromlongbcd(uae_u8 * p);
|
||||
extern void tolongbcd(uae_u8* p, int v);
|
||||
|
||||
extern void blkdev_default_prefs (struct uae_prefs *p);
|
||||
extern void blkdev_fix_prefs (struct uae_prefs *p);
|
||||
extern int isaudiotrack (struct cd_toc_head*, int block);
|
||||
extern int isdatatrack (struct cd_toc_head*, int block);
|
||||
void sub_to_interleaved (const uae_u8 *s, uae_u8 *d);
|
||||
void sub_to_deinterleaved (const uae_u8 *s, uae_u8 *d);
|
||||
extern void blkdev_default_prefs(struct uae_prefs* p);
|
||||
extern void blkdev_fix_prefs(struct uae_prefs* p);
|
||||
extern int isaudiotrack(struct cd_toc_head*, int block);
|
||||
extern int isdatatrack(struct cd_toc_head*, int block);
|
||||
void sub_to_interleaved(const uae_u8* s, uae_u8* d);
|
||||
void sub_to_deinterleaved(const uae_u8* s, uae_u8* d);
|
||||
|
||||
enum cd_standard_unit { CD_STANDARD_UNIT_DEFAULT, CD_STANDARD_UNIT_AUDIO, CD_STANDARD_UNIT_CDTV, CD_STANDARD_UNIT_CD32 };
|
||||
enum cd_standard_unit
|
||||
{
|
||||
CD_STANDARD_UNIT_DEFAULT,
|
||||
CD_STANDARD_UNIT_AUDIO,
|
||||
CD_STANDARD_UNIT_CDTV,
|
||||
CD_STANDARD_UNIT_CD32
|
||||
};
|
||||
|
||||
extern int get_standard_cd_unit (enum cd_standard_unit csu);
|
||||
extern void blkdev_cd_change (int unitnum, const TCHAR *name);
|
||||
extern int get_standard_cd_unit(enum cd_standard_unit csu);
|
||||
extern void blkdev_cd_change(int unitnum, const TCHAR* name);
|
||||
|
||||
extern void blkdev_entergui (void);
|
||||
extern void blkdev_exitgui (void);
|
||||
extern void blkdev_entergui(void);
|
||||
extern void blkdev_exitgui(void);
|
||||
|
||||
extern struct device_functions devicefunc_cdimage;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue