Separated main code from UI and PLATform support code, plus other generally small fixes here and there.

This commit is contained in:
waltje
2017-10-10 03:07:29 -04:00
parent e88899bb3c
commit bd89e66b7b
47 changed files with 924 additions and 872 deletions

View File

@@ -9,7 +9,7 @@
* Implementation of the CD-ROM drive with SCSI(-like)
* commands, for both ATAPI and SCSI usage.
*
* Version: @(#)cdrom.c 1.0.13 2017/10/08
* Version: @(#)cdrom.c 1.0.14 2017/10/09
*
* Author: Miran Grca, <mgrca8@gmail.com>
*
@@ -30,9 +30,8 @@
#include "../nvr.h"
#include "../disk/hdc.h"
#include "../disk/hdc_ide.h"
#include "../win/win.h"
#include "../win/win_cdrom_ioctl.h"
#include "../win/plat_iodev.h"
#include "../plat.h"
#include "../ui.h"
#include "cdrom.h"
#include "cdrom_image.h"
#include "cdrom_null.h"
@@ -2017,6 +2016,47 @@ static int cdrom_read_dvd_structure(uint8_t id, int format, const uint8_t *packe
}
}
/*SCSI Get Event Status Notification*/
static uint32_t cdrom_get_event_status(uint8_t id, uint8_t *buffer)
{
uint8_t event_code, media_status = 0;
if (buffer[5])
{
media_status = MS_TRAY_OPEN;
if (cdrom_drives[id].handler->stop)
{
cdrom_drives[id].handler->stop(id);
}
}
else
{
media_status = MS_MEDIA_PRESENT;
}
event_code = MEC_NO_CHANGE;
if (media_status != MS_TRAY_OPEN)
{
if (!buffer[4])
{
event_code = MEC_NEW_MEDIA;
cdrom_drives[id].handler->load(id);
}
else if (buffer[4]==2)
{
event_code = MEC_EJECT_REQUESTED;
cdrom_drives[id].handler->eject(id);
}
}
buffer[4] = event_code;
buffer[5] = media_status;
buffer[6] = 0;
buffer[7] = 0;
return 8;
}
void cdrom_insert(uint8_t id)
{
cdrom[id].unit_attention = 1;
@@ -2120,15 +2160,6 @@ skip_ready_check:
}
/* Next it's time for NOT READY. */
if (!ready)
{
cdrom[id].media_status = MEC_MEDIA_REMOVAL;
}
else
{
cdrom[id].media_status = (cdrom[id].unit_attention) ? MEC_NEW_MEDIA : MEC_NO_CHANGE;
}
if ((cdrom_command_flags[cdb[0]] & CHECK_READY) && !ready)
{
cdrom_log("CD-ROM %i: Not ready (%02X)\n", id, cdb[0]);
@@ -2569,11 +2600,11 @@ cdrom_readtoc_fallback:
cdrom[id].all_blocks_total = cdrom[id].block_total;
if (cdrom[id].packet_status != CDROM_PHASE_COMPLETE)
{
StatusBarUpdateIcon(SB_CDROM | id, 1);
ui_sb_update_icon(SB_CDROM | id, 1);
}
else
{
StatusBarUpdateIcon(SB_CDROM | id, 0);
ui_sb_update_icon(SB_CDROM | id, 0);
}
return;
@@ -2833,12 +2864,7 @@ cdrom_readtoc_fallback:
if (gesn_cdb->class & (1 << GESN_MEDIA))
{
gesn_event_header->notification_class |= GESN_MEDIA;
cdbufferb[4] = cdrom[id].media_status; /* Bits 7-4 = Reserved, Bits 4-1 = Media Status */
cdbufferb[5] = 1; /* Power Status (1 = Active) */
cdbufferb[6] = 0;
cdbufferb[7] = 0;
used_len = 8;
used_len = cdrom_get_event_status(id, cdbufferb);
}
else
{
@@ -2847,8 +2873,6 @@ cdrom_readtoc_fallback:
}
gesn_event_header->len = used_len - sizeof(*gesn_event_header);
memcpy(cdbufferb, gesn_event_header, 4);
if (SCSI_BufferLength == -1)
{
SCSI_BufferLength = used_len;
@@ -3790,7 +3814,7 @@ void cdrom_phase_callback(uint8_t id)
cdrom[id].status = READY_STAT;
cdrom[id].phase = 3;
cdrom[id].packet_status = 0xFF;
StatusBarUpdateIcon(SB_CDROM | id, 0);
ui_sb_update_icon(SB_CDROM | id, 0);
cdrom_irq_raise(id);
return;
case CDROM_PHASE_DATA_OUT:
@@ -3805,7 +3829,7 @@ void cdrom_phase_callback(uint8_t id)
cdrom[id].packet_status = CDROM_PHASE_COMPLETE;
cdrom[id].status = READY_STAT;
cdrom[id].phase = 3;
StatusBarUpdateIcon(SB_CDROM | id, 0);
ui_sb_update_icon(SB_CDROM | id, 0);
cdrom_irq_raise(id);
return;
case CDROM_PHASE_DATA_IN:
@@ -3820,7 +3844,7 @@ void cdrom_phase_callback(uint8_t id)
cdrom[id].packet_status = CDROM_PHASE_COMPLETE;
cdrom[id].status = READY_STAT;
cdrom[id].phase = 3;
StatusBarUpdateIcon(SB_CDROM | id, 0);
ui_sb_update_icon(SB_CDROM | id, 0);
cdrom_irq_raise(id);
return;
case CDROM_PHASE_ERROR: