mirror of
https://github.com/holub/mame
synced 2025-04-22 16:31:49 +03:00
apple2: fix long hang on SCSI Card boot when a CD-ROM is present with no disc inserted [R. Belmont]
This commit is contained in:
parent
4cfb9da708
commit
ed75599352
@ -52,7 +52,7 @@ DEFINE_DEVICE_TYPE(A2BUS_SCSI, a2bus_scsi_device, "a2scsi", "Apple II SCSI Card"
|
||||
|
||||
static void scsi_devices(device_slot_interface &device)
|
||||
{
|
||||
device.option_add("cdrom", NSCSI_CDROM);
|
||||
device.option_add("cdrom", NSCSI_CDROM_APPLE);
|
||||
device.option_add("harddisk", NSCSI_HARDDISK);
|
||||
device.option_add_internal("ncr5380", NCR5380N);
|
||||
}
|
||||
|
@ -14,6 +14,7 @@ DEFINE_DEVICE_TYPE(NSCSI_XM5301SUN, nscsi_toshiba_xm5301_sun_device, "nxm5301sun
|
||||
DEFINE_DEVICE_TYPE(NSCSI_XM5401SUN, nscsi_toshiba_xm5401_sun_device, "nxm5401sun", "XM-5401B Sun 4x CD-ROM (New)")
|
||||
DEFINE_DEVICE_TYPE(NSCSI_XM5701, nscsi_toshiba_xm5701_device, "nxm5701", "XM-5701B 12x CD-ROM (New)")
|
||||
DEFINE_DEVICE_TYPE(NSCSI_XM5701SUN, nscsi_toshiba_xm5701_sun_device, "nxm5701sun", "XM-5701B Sun 12x CD-ROM (New)")
|
||||
DEFINE_DEVICE_TYPE(NSCSI_CDROM_APPLE, nscsi_cdrom_apple_device, "scsi_cdrom_apple", "Apple SCSI CD-ROM")
|
||||
|
||||
nscsi_cdrom_device::nscsi_cdrom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
|
||||
nscsi_cdrom_device(mconfig, NSCSI_CDROM, tag, owner, "Sony", "CDU-76S", "1.0", 0x00, 0x05)
|
||||
@ -55,6 +56,11 @@ nscsi_toshiba_xm5701_sun_device::nscsi_toshiba_xm5701_sun_device(const machine_c
|
||||
{
|
||||
}
|
||||
|
||||
nscsi_cdrom_apple_device::nscsi_cdrom_apple_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
|
||||
nscsi_cdrom_device(mconfig, NSCSI_CDROM_APPLE, tag, owner, "Sony", "CDU-76S", "1.0", 0x00, 0x05)
|
||||
{
|
||||
}
|
||||
|
||||
nscsi_cdrom_device::nscsi_cdrom_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
|
||||
: nscsi_full_device(mconfig, type, tag, owner, clock)
|
||||
, cdrom(nullptr)
|
||||
@ -624,3 +630,26 @@ bool nscsi_cdrom_sgi_device::scsi_command_done(uint8_t command, uint8_t length)
|
||||
return nscsi_full_device::scsi_command_done(command, length);
|
||||
}
|
||||
}
|
||||
/*
|
||||
The Apple II SCSI Card firmware demands that ASC on a failing TEST_UNIT_READY be either 0x28 or 0xb0.
|
||||
0x28 is MEDIA_CHANGED, 0xb0 is vendor-specific. If the drive returns the normal 0x3A for disc-not-present,
|
||||
the firmware assumes the drive is broken and retries the TEST_UNIT_READY for 60 seconds before giving up
|
||||
and booting the machine.
|
||||
*/
|
||||
void nscsi_cdrom_apple_device::scsi_command()
|
||||
{
|
||||
switch (scsi_cmdbuf[0]) {
|
||||
case SC_TEST_UNIT_READY:
|
||||
LOG("command TEST UNIT READY (AppleCD)\n");
|
||||
if(cdrom)
|
||||
scsi_status_complete(SS_GOOD);
|
||||
else
|
||||
sense(false, SK_NOT_READY, 0xb0);
|
||||
scsi_status_complete(SS_CHECK_CONDITION);
|
||||
break;
|
||||
|
||||
default:
|
||||
nscsi_cdrom_device::scsi_command();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -37,11 +37,12 @@ protected:
|
||||
virtual uint8_t scsi_get_data(int id, int pos) override;
|
||||
virtual void scsi_put_data(int buf, int offset, uint8_t data) override;
|
||||
|
||||
cdrom_file *cdrom;
|
||||
|
||||
private:
|
||||
static constexpr uint32_t bytes_per_sector = 2048;
|
||||
|
||||
uint8_t sector_buffer[bytes_per_sector];
|
||||
cdrom_file *cdrom;
|
||||
uint32_t bytes_per_block;
|
||||
int lba, cur_sector;
|
||||
required_device<cdrom_image_device> image;
|
||||
@ -103,6 +104,15 @@ public:
|
||||
nscsi_toshiba_xm5701_sun_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
|
||||
};
|
||||
|
||||
class nscsi_cdrom_apple_device : public nscsi_cdrom_device
|
||||
{
|
||||
public:
|
||||
nscsi_cdrom_apple_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
|
||||
|
||||
protected:
|
||||
virtual void scsi_command() override;
|
||||
};
|
||||
|
||||
DECLARE_DEVICE_TYPE(NSCSI_CDROM, nscsi_cdrom_device)
|
||||
DECLARE_DEVICE_TYPE(NSCSI_CDROM_SGI, nscsi_cdrom_sgi_device)
|
||||
DECLARE_DEVICE_TYPE(NSCSI_RRD45, nscsi_dec_rrd45_device)
|
||||
@ -111,5 +121,6 @@ DECLARE_DEVICE_TYPE(NSCSI_XM5301SUN, nscsi_toshiba_xm5301_sun_device)
|
||||
DECLARE_DEVICE_TYPE(NSCSI_XM5401SUN, nscsi_toshiba_xm5401_sun_device)
|
||||
DECLARE_DEVICE_TYPE(NSCSI_XM5701, nscsi_toshiba_xm5701_device)
|
||||
DECLARE_DEVICE_TYPE(NSCSI_XM5701SUN, nscsi_toshiba_xm5701_sun_device)
|
||||
DECLARE_DEVICE_TYPE(NSCSI_CDROM_APPLE, nscsi_cdrom_apple_device)
|
||||
|
||||
#endif // MAME_MACHINE_NSCSI_CD_H
|
||||
|
Loading…
Reference in New Issue
Block a user