mirror of
https://github.com/holub/mame
synced 2025-06-30 16:00:01 +03:00
floppy: Enhance ready support [O. Galibert]
This commit is contained in:
parent
f44e7c90fa
commit
bce74a2c73
@ -108,6 +108,11 @@ void floppy_image_device::setup_index_pulse_cb(index_pulse_cb cb)
|
|||||||
cur_index_pulse_cb = cb;
|
cur_index_pulse_cb = cb;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void floppy_image_device::setup_ready_cb(ready_cb cb)
|
||||||
|
{
|
||||||
|
cur_ready_cb = cb;
|
||||||
|
}
|
||||||
|
|
||||||
void floppy_image_device::set_formats(const floppy_format_type *formats)
|
void floppy_image_device::set_formats(const floppy_format_type *formats)
|
||||||
{
|
{
|
||||||
image_device_format **formatptr;
|
image_device_format **formatptr;
|
||||||
@ -205,6 +210,8 @@ void floppy_image_device::device_start()
|
|||||||
dskchg = exists() ? 1 : 0;
|
dskchg = exists() ? 1 : 0;
|
||||||
index_timer = timer_alloc(0);
|
index_timer = timer_alloc(0);
|
||||||
image_dirty = false;
|
image_dirty = false;
|
||||||
|
ready = true;
|
||||||
|
ready_counter = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void floppy_image_device::device_reset()
|
void floppy_image_device::device_reset()
|
||||||
@ -212,6 +219,11 @@ void floppy_image_device::device_reset()
|
|||||||
revolution_start_time = attotime::never;
|
revolution_start_time = attotime::never;
|
||||||
revolution_count = 0;
|
revolution_count = 0;
|
||||||
mon = 1;
|
mon = 1;
|
||||||
|
if(!ready) {
|
||||||
|
ready = true;
|
||||||
|
if(!cur_ready_cb.isnull())
|
||||||
|
cur_ready_cb(this, ready);
|
||||||
|
}
|
||||||
if(motor_always_on)
|
if(motor_always_on)
|
||||||
mon_w(0);
|
mon_w(0);
|
||||||
}
|
}
|
||||||
@ -280,6 +292,10 @@ bool floppy_image_device::call_load()
|
|||||||
|
|
||||||
if (!cur_load_cb.isnull())
|
if (!cur_load_cb.isnull())
|
||||||
return cur_load_cb(this);
|
return cur_load_cb(this);
|
||||||
|
|
||||||
|
if(motor_always_on || !mon)
|
||||||
|
ready_counter = 2;
|
||||||
|
|
||||||
return IMAGE_INIT_PASS;
|
return IMAGE_INIT_PASS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -295,6 +311,11 @@ void floppy_image_device::call_unload()
|
|||||||
}
|
}
|
||||||
if (!cur_unload_cb.isnull())
|
if (!cur_unload_cb.isnull())
|
||||||
cur_unload_cb(this);
|
cur_unload_cb(this);
|
||||||
|
if(!ready) {
|
||||||
|
ready = true;
|
||||||
|
if(!cur_ready_cb.isnull())
|
||||||
|
cur_ready_cb(this, ready);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool floppy_image_device::call_create(int format_type, option_resolution *format_options)
|
bool floppy_image_device::call_create(int format_type, option_resolution *format_options)
|
||||||
@ -316,6 +337,7 @@ void floppy_image_device::mon_w(int state)
|
|||||||
if (!mon && image)
|
if (!mon && image)
|
||||||
{
|
{
|
||||||
revolution_start_time = machine().time();
|
revolution_start_time = machine().time();
|
||||||
|
ready_counter = 2;
|
||||||
index_resync();
|
index_resync();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -325,6 +347,11 @@ void floppy_image_device::mon_w(int state)
|
|||||||
commit_image();
|
commit_image();
|
||||||
revolution_start_time = attotime::never;
|
revolution_start_time = attotime::never;
|
||||||
index_timer->adjust(attotime::zero);
|
index_timer->adjust(attotime::zero);
|
||||||
|
if(!ready) {
|
||||||
|
ready = true;
|
||||||
|
if(!cur_ready_cb.isnull())
|
||||||
|
cur_ready_cb(this, ready);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -365,7 +392,14 @@ void floppy_image_device::index_resync()
|
|||||||
|
|
||||||
if(new_idx != idx) {
|
if(new_idx != idx) {
|
||||||
idx = new_idx;
|
idx = new_idx;
|
||||||
|
if(idx && ready) {
|
||||||
|
ready_counter--;
|
||||||
|
if(!ready_counter) {
|
||||||
|
ready = false;
|
||||||
|
if(!cur_ready_cb.isnull())
|
||||||
|
cur_ready_cb(this, ready);
|
||||||
|
}
|
||||||
|
}
|
||||||
if (!cur_index_pulse_cb.isnull())
|
if (!cur_index_pulse_cb.isnull())
|
||||||
cur_index_pulse_cb(this, idx);
|
cur_index_pulse_cb(this, idx);
|
||||||
}
|
}
|
||||||
@ -373,14 +407,7 @@ void floppy_image_device::index_resync()
|
|||||||
|
|
||||||
bool floppy_image_device::ready_r()
|
bool floppy_image_device::ready_r()
|
||||||
{
|
{
|
||||||
if (exists())
|
return ready;
|
||||||
{
|
|
||||||
if (mon == 0)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
double floppy_image_device::get_pos()
|
double floppy_image_device::get_pos()
|
||||||
|
@ -49,6 +49,7 @@ public:
|
|||||||
typedef delegate<int (floppy_image_device *)> load_cb;
|
typedef delegate<int (floppy_image_device *)> load_cb;
|
||||||
typedef delegate<void (floppy_image_device *)> unload_cb;
|
typedef delegate<void (floppy_image_device *)> unload_cb;
|
||||||
typedef delegate<void (floppy_image_device *, int)> index_pulse_cb;
|
typedef delegate<void (floppy_image_device *, int)> index_pulse_cb;
|
||||||
|
typedef delegate<void (floppy_image_device *, int)> ready_cb;
|
||||||
|
|
||||||
// construction/destruction
|
// construction/destruction
|
||||||
floppy_image_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock);
|
floppy_image_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock);
|
||||||
@ -83,6 +84,7 @@ public:
|
|||||||
void setup_load_cb(load_cb cb);
|
void setup_load_cb(load_cb cb);
|
||||||
void setup_unload_cb(unload_cb cb);
|
void setup_unload_cb(unload_cb cb);
|
||||||
void setup_index_pulse_cb(index_pulse_cb cb);
|
void setup_index_pulse_cb(index_pulse_cb cb);
|
||||||
|
void setup_ready_cb(ready_cb cb);
|
||||||
|
|
||||||
UINT32* get_buffer() { return image->get_buffer(cyl, ss); }
|
UINT32* get_buffer() { return image->get_buffer(cyl, ss); }
|
||||||
UINT32 get_len() { return image->get_track_size(cyl, ss); }
|
UINT32 get_len() { return image->get_track_size(cyl, ss); }
|
||||||
@ -149,6 +151,7 @@ protected:
|
|||||||
int wpt; /* write protect */
|
int wpt; /* write protect */
|
||||||
int rdy; /* ready */
|
int rdy; /* ready */
|
||||||
int dskchg; /* disk changed */
|
int dskchg; /* disk changed */
|
||||||
|
bool ready;
|
||||||
|
|
||||||
/* rotation per minute => gives index pulse frequency */
|
/* rotation per minute => gives index pulse frequency */
|
||||||
float rpm;
|
float rpm;
|
||||||
@ -158,10 +161,12 @@ protected:
|
|||||||
int cyl;
|
int cyl;
|
||||||
|
|
||||||
bool image_dirty;
|
bool image_dirty;
|
||||||
|
int ready_counter;
|
||||||
|
|
||||||
load_cb cur_load_cb;
|
load_cb cur_load_cb;
|
||||||
unload_cb cur_unload_cb;
|
unload_cb cur_unload_cb;
|
||||||
index_pulse_cb cur_index_pulse_cb;
|
index_pulse_cb cur_index_pulse_cb;
|
||||||
|
ready_cb cur_ready_cb;
|
||||||
|
|
||||||
UINT32 find_position(attotime &base, attotime when);
|
UINT32 find_position(attotime &base, attotime when);
|
||||||
int find_index(UINT32 position, const UINT32 *buf, int buf_size);
|
int find_index(UINT32 position, const UINT32 *buf, int buf_size);
|
||||||
|
Loading…
Reference in New Issue
Block a user