floppy: Enhance ready support [O. Galibert]

This commit is contained in:
Olivier Galibert 2012-12-01 14:57:14 +00:00
parent f44e7c90fa
commit bce74a2c73
2 changed files with 41 additions and 9 deletions

View File

@ -108,6 +108,11 @@ void floppy_image_device::setup_index_pulse_cb(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)
{
image_device_format **formatptr;
@ -205,6 +210,8 @@ void floppy_image_device::device_start()
dskchg = exists() ? 1 : 0;
index_timer = timer_alloc(0);
image_dirty = false;
ready = true;
ready_counter = 0;
}
void floppy_image_device::device_reset()
@ -212,6 +219,11 @@ void floppy_image_device::device_reset()
revolution_start_time = attotime::never;
revolution_count = 0;
mon = 1;
if(!ready) {
ready = true;
if(!cur_ready_cb.isnull())
cur_ready_cb(this, ready);
}
if(motor_always_on)
mon_w(0);
}
@ -280,6 +292,10 @@ bool floppy_image_device::call_load()
if (!cur_load_cb.isnull())
return cur_load_cb(this);
if(motor_always_on || !mon)
ready_counter = 2;
return IMAGE_INIT_PASS;
}
@ -295,6 +311,11 @@ void floppy_image_device::call_unload()
}
if (!cur_unload_cb.isnull())
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)
@ -316,6 +337,7 @@ void floppy_image_device::mon_w(int state)
if (!mon && image)
{
revolution_start_time = machine().time();
ready_counter = 2;
index_resync();
}
@ -325,6 +347,11 @@ void floppy_image_device::mon_w(int state)
commit_image();
revolution_start_time = attotime::never;
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) {
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())
cur_index_pulse_cb(this, idx);
}
@ -373,14 +407,7 @@ void floppy_image_device::index_resync()
bool floppy_image_device::ready_r()
{
if (exists())
{
if (mon == 0)
{
return 0;
}
}
return 1;
return ready;
}
double floppy_image_device::get_pos()

View File

@ -49,6 +49,7 @@ public:
typedef delegate<int (floppy_image_device *)> load_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)> ready_cb;
// construction/destruction
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_unload_cb(unload_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_len() { return image->get_track_size(cyl, ss); }
@ -149,6 +151,7 @@ protected:
int wpt; /* write protect */
int rdy; /* ready */
int dskchg; /* disk changed */
bool ready;
/* rotation per minute => gives index pulse frequency */
float rpm;
@ -158,10 +161,12 @@ protected:
int cyl;
bool image_dirty;
int ready_counter;
load_cb cur_load_cb;
unload_cb cur_unload_cb;
index_pulse_cb cur_index_pulse_cb;
ready_cb cur_ready_cb;
UINT32 find_position(attotime &base, attotime when);
int find_index(UINT32 position, const UINT32 *buf, int buf_size);