Write indicators (except for floppy drives)

This commit is contained in:
Cacodemon345
2025-04-22 17:37:00 +06:00
parent b15f25ffa4
commit e703ac760b
20 changed files with 232 additions and 68 deletions

View File

@@ -395,7 +395,7 @@ esdi_write(uint16_t port, uint8_t val, void *priv)
fatal("Write with ECC\n"); fatal("Write with ECC\n");
esdi->status = STAT_READY | STAT_DRQ | STAT_DSC; esdi->status = STAT_READY | STAT_DRQ | STAT_DSC;
esdi->pos = 0; esdi->pos = 0;
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 1); ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 1);
break; break;
case CMD_VERIFY: case CMD_VERIFY:
@@ -412,7 +412,7 @@ esdi_write(uint16_t port, uint8_t val, void *priv)
case CMD_FORMAT: case CMD_FORMAT:
esdi->status = STAT_DRQ; esdi->status = STAT_DRQ;
esdi->pos = 0; esdi->pos = 0;
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 1); ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 1);
break; break;
case CMD_SET_PARAMETERS: /* Initialize Drive Parameters */ case CMD_SET_PARAMETERS: /* Initialize Drive Parameters */
@@ -593,6 +593,7 @@ esdi_callback(void *priv)
esdi->reset = 0; esdi->reset = 0;
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0);
return; return;
} }
@@ -650,7 +651,7 @@ read_error:
esdi->status = STAT_READY | STAT_ERR | STAT_DSC; esdi->status = STAT_READY | STAT_ERR | STAT_DSC;
esdi->error = ERR_ABRT; esdi->error = ERR_ABRT;
irq_raise(esdi); irq_raise(esdi);
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0);
break; break;
} else { } else {
if (get_sector(esdi, &addr)) { if (get_sector(esdi, &addr)) {
@@ -658,7 +659,7 @@ read_error:
write_error: write_error:
esdi->status = STAT_READY | STAT_DSC | STAT_ERR; esdi->status = STAT_READY | STAT_DSC | STAT_ERR;
irq_raise(esdi); irq_raise(esdi);
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0);
break; break;
} }
@@ -672,10 +673,10 @@ write_error:
esdi->status = STAT_DRQ | STAT_READY | STAT_DSC; esdi->status = STAT_DRQ | STAT_READY | STAT_DSC;
esdi->pos = 0; esdi->pos = 0;
next_sector(esdi); next_sector(esdi);
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 1); ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 1);
} else { } else {
esdi->status = STAT_READY | STAT_DSC; esdi->status = STAT_READY | STAT_DSC;
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0);
} }
} }
break; break;
@@ -718,7 +719,7 @@ verify_error:
break; break;
case CMD_FORMAT: case CMD_FORMAT:
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0);
if (!drive->present) { if (!drive->present) {
esdi->status = STAT_READY | STAT_ERR | STAT_DSC; esdi->status = STAT_READY | STAT_ERR | STAT_DSC;
esdi->error = ERR_ABRT; esdi->error = ERR_ABRT;
@@ -752,10 +753,12 @@ format_error:
esdi->status = STAT_READY | STAT_DSC; esdi->status = STAT_READY | STAT_DSC;
irq_raise(esdi); irq_raise(esdi);
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0);
break; break;
case CMD_SET_PARAMETERS: /* Initialize Drive Parameters */ case CMD_SET_PARAMETERS: /* Initialize Drive Parameters */
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0);
if (!drive->present) { if (!drive->present) {
esdi->status = STAT_READY | STAT_ERR | STAT_DSC; esdi->status = STAT_READY | STAT_ERR | STAT_DSC;
esdi->error = ERR_ABRT; esdi->error = ERR_ABRT;
@@ -778,10 +781,12 @@ format_error:
esdi->error = ERR_ABRT; esdi->error = ERR_ABRT;
irq_raise(esdi); irq_raise(esdi);
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0);
break; break;
case 0xe0: case 0xe0:
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0);
if (!drive->present) { if (!drive->present) {
esdi->status = STAT_READY | STAT_ERR | STAT_DSC; esdi->status = STAT_READY | STAT_ERR | STAT_DSC;
esdi->error = ERR_ABRT; esdi->error = ERR_ABRT;
@@ -825,6 +830,7 @@ format_error:
} }
irq_raise(esdi); irq_raise(esdi);
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0);
break; break;
case CMD_READ_PARAMETERS: case CMD_READ_PARAMETERS:
@@ -869,6 +875,7 @@ format_error:
irq_raise(esdi); irq_raise(esdi);
} }
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0);
break; break;
default: default:
@@ -880,6 +887,7 @@ format_error:
esdi->error = ERR_ABRT; esdi->error = ERR_ABRT;
irq_raise(esdi); irq_raise(esdi);
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0);
break; break;
} }
} }
@@ -954,6 +962,7 @@ wd1007vse1_init(UNUSED(const device_t *info))
timer_add(&esdi->callback_timer, esdi_callback, esdi, 0); timer_add(&esdi->callback_timer, esdi_callback, esdi, 0);
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0);
return esdi; return esdi;
} }
@@ -973,6 +982,7 @@ wd1007vse1_close(void *priv)
free(esdi); free(esdi);
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0);
} }
static int static int

View File

@@ -288,6 +288,7 @@ cmd_unsupported(esdi_t *dev)
dev->irq_in_progress = 1; dev->irq_in_progress = 1;
set_irq(dev); set_irq(dev);
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0);
} }
static void static void
@@ -309,6 +310,7 @@ device_not_present(esdi_t *dev)
dev->irq_in_progress = 1; dev->irq_in_progress = 1;
set_irq(dev); set_irq(dev);
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0);
} }
static void static void
@@ -330,6 +332,7 @@ rba_out_of_range(esdi_t *dev)
dev->irq_in_progress = 1; dev->irq_in_progress = 1;
set_irq(dev); set_irq(dev);
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0);
} }
static void static void
@@ -351,6 +354,7 @@ defective_block(esdi_t *dev)
dev->irq_in_progress = 1; dev->irq_in_progress = 1;
set_irq(dev); set_irq(dev);
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0);
} }
static void static void
@@ -368,6 +372,7 @@ complete_command_status(esdi_t *dev)
dev->status_data[5] = (dev->rba - 1) >> 8; dev->status_data[5] = (dev->rba - 1) >> 8;
dev->status_data[6] = 0; /*Number of blocks requiring error recovery*/ dev->status_data[6] = 0; /*Number of blocks requiring error recovery*/
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0);
} }
#define ESDI_ADAPTER_ONLY() \ #define ESDI_ADAPTER_ONLY() \
@@ -696,6 +701,7 @@ esdi_callback(void *priv)
dev->irq_in_progress = 1; dev->irq_in_progress = 1;
set_irq(dev); set_irq(dev);
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0);
break; break;
case CMD_GET_DEV_CONFIG: case CMD_GET_DEV_CONFIG:
@@ -744,6 +750,7 @@ esdi_callback(void *priv)
dev->irq_in_progress = 1; dev->irq_in_progress = 1;
set_irq(dev); set_irq(dev);
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0);
break; break;
case CMD_GET_POS_INFO: case CMD_GET_POS_INFO:
@@ -764,6 +771,7 @@ esdi_callback(void *priv)
dev->irq_in_progress = 1; dev->irq_in_progress = 1;
set_irq(dev); set_irq(dev);
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0);
break; break;
case 0x10: case 0x10:
@@ -817,6 +825,7 @@ esdi_callback(void *priv)
dev->irq_in_progress = 1; dev->irq_in_progress = 1;
set_irq(dev); set_irq(dev);
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0);
break; break;
default: default:

View File

@@ -1827,7 +1827,7 @@ ide_writeb(uint16_t addr, uint8_t val, void *priv)
ide->blockcount = 0; ide->blockcount = 0;
/* Turn on the activity indicator *here* so that it gets turned on /* Turn on the activity indicator *here* so that it gets turned on
less times. */ less times. */
ui_sb_update_icon(SB_HDD | hdd[ide->hdd_num].bus_type, 1); ui_sb_update_icon_write(SB_HDD | hdd[ide->hdd_num].bus_type, 1);
fallthrough; fallthrough;
case WIN_WRITE: case WIN_WRITE:
@@ -2479,10 +2479,10 @@ ide_callback(void *priv)
ide->tf->atastat = DRQ_STAT | DRDY_STAT | DSC_STAT; ide->tf->atastat = DRQ_STAT | DRDY_STAT | DSC_STAT;
ide->tf->pos = 0; ide->tf->pos = 0;
ide_next_sector(ide); ide_next_sector(ide);
ui_sb_update_icon(SB_HDD | hdd[ide->hdd_num].bus_type, 1); ui_sb_update_icon_write(SB_HDD | hdd[ide->hdd_num].bus_type, 1);
} else { } else {
ide->tf->atastat = DRDY_STAT | DSC_STAT; ide->tf->atastat = DRDY_STAT | DSC_STAT;
ui_sb_update_icon(SB_HDD | hdd[ide->hdd_num].bus_type, 0); ui_sb_update_icon_write(SB_HDD | hdd[ide->hdd_num].bus_type, 0);
} }
if (ret < 0) if (ret < 0)
err = UNC_ERR; err = UNC_ERR;
@@ -2524,7 +2524,7 @@ ide_callback(void *priv)
err = UNC_ERR; err = UNC_ERR;
ide_irq_raise(ide); ide_irq_raise(ide);
ui_sb_update_icon(SB_HDD | hdd[ide->hdd_num].bus_type, 0); ui_sb_update_icon_write(SB_HDD | hdd[ide->hdd_num].bus_type, 0);
} else { } else {
/* Bus master DMA error, abort the command. */ /* Bus master DMA error, abort the command. */
ide_log("IDE %i: DMA read aborted (failed)\n", ide->channel); ide_log("IDE %i: DMA read aborted (failed)\n", ide->channel);
@@ -2562,7 +2562,7 @@ ide_callback(void *priv)
ide_next_sector(ide); ide_next_sector(ide);
} else { } else {
ide->tf->atastat = DRDY_STAT | DSC_STAT; ide->tf->atastat = DRDY_STAT | DSC_STAT;
ui_sb_update_icon(SB_HDD | hdd[ide->hdd_num].bus_type, 0); ui_sb_update_icon_write(SB_HDD | hdd[ide->hdd_num].bus_type, 0);
} }
if (ret < 0) if (ret < 0)
err = UNC_ERR; err = UNC_ERR;
@@ -2596,7 +2596,7 @@ ide_callback(void *priv)
err = UNC_ERR; err = UNC_ERR;
ide_irq_raise(ide); ide_irq_raise(ide);
ui_sb_update_icon(SB_HDD | hdd[ide->hdd_num].bus_type, 1); ui_sb_update_icon_write(SB_HDD | hdd[ide->hdd_num].bus_type, 1);
} }
break; break;

View File

@@ -557,6 +557,7 @@ do_callback(void *priv)
mfm->reset = 0; mfm->reset = 0;
ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 0); ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_MFM, 0);
return; return;
} }
@@ -627,9 +628,9 @@ write_error:
mfm->status |= STAT_DRQ; mfm->status |= STAT_DRQ;
mfm->pos = 0; mfm->pos = 0;
next_sector(mfm); next_sector(mfm);
ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 1); ui_sb_update_icon_write(SB_HDD | HDD_BUS_MFM, 1);
} else } else
ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 0); ui_sb_update_icon_write(SB_HDD | HDD_BUS_MFM, 0);
break; break;
case CMD_VERIFY: case CMD_VERIFY:
@@ -657,7 +658,7 @@ write_error:
mfm->status = STAT_READY | STAT_DSC; mfm->status = STAT_READY | STAT_DSC;
irq_raise(mfm); irq_raise(mfm);
ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 1); ui_sb_update_icon_write(SB_HDD | HDD_BUS_MFM, 1);
break; break;
case CMD_DIAGNOSE: case CMD_DIAGNOSE:
@@ -772,6 +773,7 @@ mfm_init(UNUSED(const device_t *info))
timer_add(&mfm->callback_timer, do_callback, mfm, 0); timer_add(&mfm->callback_timer, do_callback, mfm, 0);
ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 0); ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_MFM, 0);
return mfm; return mfm;
} }
@@ -790,6 +792,7 @@ mfm_close(void *priv)
free(mfm); free(mfm);
ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 0); ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_MFM, 0);
} }
const device_t st506_at_wd1003_device = { const device_t st506_at_wd1003_device = {

View File

@@ -580,14 +580,14 @@ st506_callback(void *priv)
(void) get_chs(dev, drive); (void) get_chs(dev, drive);
st506_xt_log("ST506: FORMAT_DRIVE(%i) interleave=%i\n", st506_xt_log("ST506: FORMAT_DRIVE(%i) interleave=%i\n",
dev->drive_sel, dev->command[4]); dev->drive_sel, dev->command[4]);
ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 1); ui_sb_update_icon_write(SB_HDD | HDD_BUS_MFM, 1);
timer_advance_u64(&dev->timer, ST506_TIME); timer_advance_u64(&dev->timer, ST506_TIME);
dev->state = STATE_SEND_DATA; dev->state = STATE_SEND_DATA;
break; break;
case STATE_SEND_DATA: /* wrong, but works */ case STATE_SEND_DATA: /* wrong, but works */
if (!get_sector(dev, drive, &addr)) { if (!get_sector(dev, drive, &addr)) {
ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 0); ui_sb_update_icon_write(SB_HDD | HDD_BUS_MFM, 0);
st506_error(dev, dev->error); st506_error(dev, dev->error);
st506_complete(dev); st506_complete(dev);
return; return;
@@ -604,7 +604,7 @@ st506_callback(void *priv)
break; break;
case STATE_SENT_DATA: case STATE_SENT_DATA:
ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 0); ui_sb_update_icon_write(SB_HDD | HDD_BUS_MFM, 0);
st506_complete(dev); st506_complete(dev);
break; break;
@@ -663,14 +663,14 @@ st506_callback(void *priv)
st506_xt_log("ST506: FORMAT_%sTRACK(%i, %i/%i)\n", st506_xt_log("ST506: FORMAT_%sTRACK(%i, %i/%i)\n",
(dev->command[0] == CMD_FORMAT_BAD_TRACK) ? "BAD_" : "", (dev->command[0] == CMD_FORMAT_BAD_TRACK) ? "BAD_" : "",
dev->drive_sel, dev->cylinder, dev->head); dev->drive_sel, dev->cylinder, dev->head);
ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 1); ui_sb_update_icon_write(SB_HDD | HDD_BUS_MFM, 1);
timer_advance_u64(&dev->timer, ST506_TIME); timer_advance_u64(&dev->timer, ST506_TIME);
dev->state = STATE_SEND_DATA; dev->state = STATE_SEND_DATA;
break; break;
case STATE_SEND_DATA: /* wrong, but works */ case STATE_SEND_DATA: /* wrong, but works */
if (!get_sector(dev, drive, &addr)) { if (!get_sector(dev, drive, &addr)) {
ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 0); ui_sb_update_icon_write(SB_HDD | HDD_BUS_MFM, 0);
st506_error(dev, dev->error); st506_error(dev, dev->error);
st506_complete(dev); st506_complete(dev);
return; return;
@@ -686,7 +686,7 @@ st506_callback(void *priv)
break; break;
case STATE_SENT_DATA: case STATE_SENT_DATA:
ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 0); ui_sb_update_icon_write(SB_HDD | HDD_BUS_MFM, 0);
st506_complete(dev); st506_complete(dev);
break; break;
@@ -828,7 +828,7 @@ read_error_sent:
return; return;
} }
ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 1); ui_sb_update_icon_write(SB_HDD | HDD_BUS_MFM, 1);
/* Set up the data transfer. */ /* Set up the data transfer. */
dev->buff_pos = 0; dev->buff_pos = 0;
@@ -865,7 +865,7 @@ read_error_sent:
case STATE_RECEIVED_DATA: case STATE_RECEIVED_DATA:
if (!get_sector(dev, drive, &addr)) { if (!get_sector(dev, drive, &addr)) {
write_error: write_error:
ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 0); ui_sb_update_icon_write(SB_HDD | HDD_BUS_MFM, 0);
st506_error(dev, dev->error); st506_error(dev, dev->error);
st506_complete(dev); st506_complete(dev);
return; return;
@@ -879,7 +879,7 @@ write_error:
} }
if (--dev->count == 0) { if (--dev->count == 0) {
ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 0); ui_sb_update_icon_write(SB_HDD | HDD_BUS_MFM, 0);
st506_complete(dev); st506_complete(dev);
break; break;
} }

View File

@@ -385,7 +385,7 @@ do_format(hdc_t *dev, drive_t *drive, dcb_t *dcb)
dev->sector = 0; dev->sector = 0;
/* Activate the status icon. */ /* Activate the status icon. */
ui_sb_update_icon(SB_HDD | HDD_BUS_XTA, 1); ui_sb_update_icon_write(SB_HDD | HDD_BUS_XTA, 1);
do_fmt: do_fmt:
/* /*
@@ -426,7 +426,7 @@ do_fmt:
} }
/* De-activate the status icon. */ /* De-activate the status icon. */
ui_sb_update_icon(SB_HDD | HDD_BUS_XTA, 0); ui_sb_update_icon_write(SB_HDD | HDD_BUS_XTA, 0);
} }
/* Execute the DCB we just received. */ /* Execute the DCB we just received. */
@@ -631,7 +631,7 @@ read_error:
case STATE_RECV: case STATE_RECV:
/* Activate the status icon. */ /* Activate the status icon. */
ui_sb_update_icon(SB_HDD | HDD_BUS_XTA, 1); ui_sb_update_icon_write(SB_HDD | HDD_BUS_XTA, 1);
do_recv: do_recv:
/* Ready to transfer the data in. */ /* Ready to transfer the data in. */
dev->state = STATE_RDATA; dev->state = STATE_RDATA;
@@ -680,7 +680,7 @@ do_recv:
if (get_sector(dev, drive, &addr)) { if (get_sector(dev, drive, &addr)) {
write_error: write_error:
/* De-activate the status icon. */ /* De-activate the status icon. */
ui_sb_update_icon(SB_HDD | HDD_BUS_XTA, 0); ui_sb_update_icon_write(SB_HDD | HDD_BUS_XTA, 0);
dev->comp |= COMP_ERR; dev->comp |= COMP_ERR;
set_intr(dev); set_intr(dev);
@@ -697,7 +697,7 @@ write_error:
dev->buf_idx = 0; dev->buf_idx = 0;
if (--dev->count == 0) { if (--dev->count == 0) {
/* De-activate the status icon. */ /* De-activate the status icon. */
ui_sb_update_icon(SB_HDD | HDD_BUS_XTA, 0); ui_sb_update_icon_write(SB_HDD | HDD_BUS_XTA, 0);
set_intr(dev); set_intr(dev);
return; return;

View File

@@ -628,6 +628,7 @@ mo_cmd_error(mo_t *dev)
dev->callback = 50.0 * MO_TIME; dev->callback = 50.0 * MO_TIME;
mo_set_callback(dev); mo_set_callback(dev);
ui_sb_update_icon(SB_MO | dev->id, 0); ui_sb_update_icon(SB_MO | dev->id, 0);
ui_sb_update_icon_write(SB_MO | dev->id, 0);
mo_log(dev->log, "[%02X] ERROR: %02X/%02X/%02X\n", dev->current_cdb[0], mo_sense_key, mo_log(dev->log, "[%02X] ERROR: %02X/%02X/%02X\n", dev->current_cdb[0], mo_sense_key,
mo_asc, mo_ascq); mo_asc, mo_ascq);
} }
@@ -644,6 +645,7 @@ mo_unit_attention(mo_t *dev)
dev->callback = 50.0 * MO_TIME; dev->callback = 50.0 * MO_TIME;
mo_set_callback(dev); mo_set_callback(dev);
ui_sb_update_icon(SB_MO | dev->id, 0); ui_sb_update_icon(SB_MO | dev->id, 0);
ui_sb_update_icon_write(SB_MO | dev->id, 0);
mo_log(dev->log, "UNIT ATTENTION\n"); mo_log(dev->log, "UNIT ATTENTION\n");
} }
@@ -1462,7 +1464,7 @@ mo_command(scsi_common_t *sc, const uint8_t *cdb)
mo_data_command_finish(dev, dev->packet_len, dev->drv->sector_size, mo_data_command_finish(dev, dev->packet_len, dev->drv->sector_size,
dev->packet_len, 1); dev->packet_len, 1);
ui_sb_update_icon(SB_MO | dev->id, ui_sb_update_icon_write(SB_MO | dev->id,
dev->packet_status != PHASE_COMPLETE); dev->packet_status != PHASE_COMPLETE);
} else { } else {
mo_set_phase(dev, SCSI_PHASE_STATUS); mo_set_phase(dev, SCSI_PHASE_STATUS);
@@ -1501,7 +1503,7 @@ mo_command(scsi_common_t *sc, const uint8_t *cdb)
dev->drv->sector_size, dev->drv->sector_size,
alloc_length, 1); alloc_length, 1);
ui_sb_update_icon(SB_MO | dev->id, ui_sb_update_icon_write(SB_MO | dev->id,
dev->packet_status != PHASE_COMPLETE); dev->packet_status != PHASE_COMPLETE);
} else { } else {
mo_set_phase(dev, SCSI_PHASE_STATUS); mo_set_phase(dev, SCSI_PHASE_STATUS);

View File

@@ -709,6 +709,7 @@ zip_cmd_error(zip_t *dev)
dev->callback = 50.0 * ZIP_TIME; dev->callback = 50.0 * ZIP_TIME;
zip_set_callback(dev); zip_set_callback(dev);
ui_sb_update_icon(SB_ZIP | dev->id, 0); ui_sb_update_icon(SB_ZIP | dev->id, 0);
ui_sb_update_icon_write(SB_ZIP | dev->id, 0);
zip_log(dev->log, "[%02X] ERROR: %02X/%02X/%02X\n", dev->current_cdb[0], zip_sense_key, zip_log(dev->log, "[%02X] ERROR: %02X/%02X/%02X\n", dev->current_cdb[0], zip_sense_key,
zip_asc, zip_ascq); zip_asc, zip_ascq);
} }
@@ -725,6 +726,7 @@ zip_unit_attention(zip_t *dev)
dev->callback = 50.0 * ZIP_TIME; dev->callback = 50.0 * ZIP_TIME;
zip_set_callback(dev); zip_set_callback(dev);
ui_sb_update_icon(SB_ZIP | dev->id, 0); ui_sb_update_icon(SB_ZIP | dev->id, 0);
ui_sb_update_icon_write(SB_ZIP | dev->id, 0);
zip_log(dev->log, "UNIT ATTENTION\n", dev->id); zip_log(dev->log, "UNIT ATTENTION\n", dev->id);
} }
@@ -1485,7 +1487,7 @@ zip_command(scsi_common_t *sc, const uint8_t *cdb)
zip_data_command_finish(dev, dev->packet_len, 512, zip_data_command_finish(dev, dev->packet_len, 512,
dev->packet_len, 1); dev->packet_len, 1);
ui_sb_update_icon(SB_ZIP | dev->id, ui_sb_update_icon_write(SB_ZIP | dev->id,
dev->packet_status != PHASE_COMPLETE); dev->packet_status != PHASE_COMPLETE);
} else { } else {
zip_set_phase(dev, SCSI_PHASE_STATUS); zip_set_phase(dev, SCSI_PHASE_STATUS);
@@ -1526,7 +1528,7 @@ zip_command(scsi_common_t *sc, const uint8_t *cdb)
zip_data_command_finish(dev, 512, 512, zip_data_command_finish(dev, 512, 512,
alloc_length, 1); alloc_length, 1);
ui_sb_update_icon(SB_ZIP | dev->id, ui_sb_update_icon_write(SB_ZIP | dev->id,
dev->packet_status != PHASE_COMPLETE); dev->packet_status != PHASE_COMPLETE);
} else { } else {
zip_set_phase(dev, SCSI_PHASE_STATUS); zip_set_phase(dev, SCSI_PHASE_STATUS);

View File

@@ -4,10 +4,12 @@
typedef struct dev_status_empty_active_t { typedef struct dev_status_empty_active_t {
atomic_bool_t empty; atomic_bool_t empty;
atomic_bool_t active; atomic_bool_t active;
atomic_bool_t write_active;
} dev_status_empty_active_t; } dev_status_empty_active_t;
typedef struct dev_status_active_t { typedef struct dev_status_active_t {
atomic_bool_t active; atomic_bool_t active;
atomic_bool_t write_active;
} dev_status_active_t; } dev_status_active_t;
typedef struct dev_status_empty_t { typedef struct dev_status_empty_t {

View File

@@ -65,6 +65,7 @@ extern void ui_sb_update_panes(void);
extern void ui_sb_update_text(void); extern void ui_sb_update_text(void);
extern void ui_sb_update_tip(int meaning); extern void ui_sb_update_tip(int meaning);
extern void ui_sb_update_icon(int tag, int active); extern void ui_sb_update_icon(int tag, int active);
extern void ui_sb_update_icon_write(int tag, int write);
extern void ui_sb_update_icon_state(int tag, int state); extern void ui_sb_update_icon_state(int tag, int state);
extern void ui_sb_set_text_w(wchar_t *wstr); extern void ui_sb_set_text_w(wchar_t *wstr);
extern void ui_sb_set_text(char *str); extern void ui_sb_set_text(char *str);

View File

@@ -653,7 +653,7 @@ do_format(hdc_t *dev, drive_t *drive, ccb_t *ccb)
case STATE_FINIT: case STATE_FINIT:
do_fmt: do_fmt:
/* Activate the status icon. */ /* Activate the status icon. */
ui_sb_update_icon(SB_HDD | HDD_BUS_XTA, 1); ui_sb_update_icon_write(SB_HDD | HDD_BUS_XTA, 1);
/* Seek to cylinder. */ /* Seek to cylinder. */
if (do_seek(dev, drive, start_cyl)) { if (do_seek(dev, drive, start_cyl)) {
@@ -691,7 +691,7 @@ do_fmt:
} }
/* De-activate the status icon. */ /* De-activate the status icon. */
ui_sb_update_icon(SB_HDD | HDD_BUS_XTA, 0); ui_sb_update_icon_write(SB_HDD | HDD_BUS_XTA, 0);
/* This saves us a LOT of code. */ /* This saves us a LOT of code. */
dev->state = STATE_FINIT; dev->state = STATE_FINIT;
@@ -705,6 +705,7 @@ do_fmt:
if (intr) { if (intr) {
/* De-activate the status icon. */ /* De-activate the status icon. */
ui_sb_update_icon(SB_HDD | HDD_BUS_XTA, 0); ui_sb_update_icon(SB_HDD | HDD_BUS_XTA, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_XTA, 0);
do_finish(dev); do_finish(dev);
} }
@@ -970,7 +971,7 @@ do_send:
case STATE_RECV: case STATE_RECV:
/* Activate the status icon. */ /* Activate the status icon. */
ui_sb_update_icon(SB_HDD | HDD_BUS_XTA, 1); ui_sb_update_icon_write(SB_HDD | HDD_BUS_XTA, 1);
do_recv: do_recv:
/* Ready to transfer the data in. */ /* Ready to transfer the data in. */
dev->state = STATE_RDATA; dev->state = STATE_RDATA;
@@ -1000,7 +1001,7 @@ do_recv:
ps1_hdc_log("HDC: CMD_WRITE_SECTORS out of data (idx=%d, len=%d)!\n", dev->buf_idx, dev->buf_len); ps1_hdc_log("HDC: CMD_WRITE_SECTORS out of data (idx=%d, len=%d)!\n", dev->buf_idx, dev->buf_len);
/* De-activate the status icon. */ /* De-activate the status icon. */
ui_sb_update_icon(SB_HDD | HDD_BUS_XTA, 0); ui_sb_update_icon_write(SB_HDD | HDD_BUS_XTA, 0);
dev->intstat |= ISR_EQUIP_CHECK; dev->intstat |= ISR_EQUIP_CHECK;
dev->ssb.need_reset = 1; dev->ssb.need_reset = 1;
@@ -1025,7 +1026,7 @@ do_recv:
/* Get address of sector to write. */ /* Get address of sector to write. */
if (get_sector(dev, drive, &addr)) { if (get_sector(dev, drive, &addr)) {
/* De-activate the status icon. */ /* De-activate the status icon. */
ui_sb_update_icon(SB_HDD | HDD_BUS_XTA, 0); ui_sb_update_icon_write(SB_HDD | HDD_BUS_XTA, 0);
do_finish(dev); do_finish(dev);
return; return;
@@ -1038,7 +1039,7 @@ do_recv:
dev->buf_idx = 0; dev->buf_idx = 0;
if (--dev->count == 0) { if (--dev->count == 0) {
/* De-activate the status icon. */ /* De-activate the status icon. */
ui_sb_update_icon(SB_HDD | HDD_BUS_XTA, 0); ui_sb_update_icon_write(SB_HDD | HDD_BUS_XTA, 0);
if (!(dev->ctrl & ACR_DMA_EN)) if (!(dev->ctrl & ACR_DMA_EN))
dev->status &= ~ASR_DATA_REQ; dev->status &= ~ASR_DATA_REQ;

View File

@@ -432,7 +432,8 @@ network_rx_queue(void *priv)
bool activity = rx_bytes || tx_bytes; bool activity = rx_bytes || tx_bytes;
bool led_on = card->led_timer & 0x80000000; bool led_on = card->led_timer & 0x80000000;
if ((activity && !led_on) || (card->led_timer & 0x7fffffff) >= 150000) { if ((activity && !led_on) || (card->led_timer & 0x7fffffff) >= 150000) {
ui_sb_update_icon(SB_NETWORK | card->card_num, activity); ui_sb_update_icon(SB_NETWORK | card->card_num, !!(rx_bytes));
ui_sb_update_icon_write(SB_NETWORK | card->card_num, !!(tx_bytes));
card->led_timer = 0 | (activity << 31); card->led_timer = 0 | (activity << 31);
} }
@@ -577,6 +578,7 @@ void
network_reset(void) network_reset(void)
{ {
ui_sb_update_icon(SB_NETWORK, 0); ui_sb_update_icon(SB_NETWORK, 0);
ui_sb_update_icon_write(SB_NETWORK, 0);
#ifdef ENABLE_NETWORK_LOG #ifdef ENABLE_NETWORK_LOG
network_dump_mutex = thread_create_mutex(); network_dump_mutex = thread_create_mutex();

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

View File

@@ -8,6 +8,8 @@ getIndicatorIcon(IconIndicator indicator)
switch (indicator) { switch (indicator) {
case Active: case Active:
return QIcon(":/settings/qt/icons/active.ico"); return QIcon(":/settings/qt/icons/active.ico");
case WriteActive:
return QIcon(":/settings/qt/icons/write_active.ico");
case Disabled: case Disabled:
return QIcon(":/settings/qt/icons/disabled.ico"); return QIcon(":/settings/qt/icons/disabled.ico");
default: default:
@@ -24,9 +26,13 @@ getIconWithIndicator(const QIcon &icon, const QSize &size, QIcon::Mode iconMode,
return iconPixmap; return iconPixmap;
auto painter = QPainter(&iconPixmap); auto painter = QPainter(&iconPixmap);
auto indicatorPixmap = getIndicatorIcon(indicator).pixmap(size); auto indicatorPixmap = getIndicatorIcon(indicator == ReadWriteActive ? Active : indicator).pixmap(size);
painter.drawPixmap(0, 0, indicatorPixmap); painter.drawPixmap(0, 0, indicatorPixmap);
if (indicator == ReadWriteActive) {
auto writeIndicatorPixmap = getIndicatorIcon(WriteActive).pixmap(size);
painter.drawPixmap(0, 0, writeIndicatorPixmap);
}
painter.end(); painter.end();
return iconPixmap; return iconPixmap;

View File

@@ -7,6 +7,8 @@
enum IconIndicator { enum IconIndicator {
None, None,
Active, Active,
WriteActive,
ReadWriteActive,
Disabled, Disabled,
}; };

View File

@@ -68,6 +68,8 @@ namespace {
struct PixmapSetActive { struct PixmapSetActive {
QPixmap normal; QPixmap normal;
QPixmap active; QPixmap active;
QPixmap write_active;
QPixmap read_write_active;
void load(const QIcon &icon); void load(const QIcon &icon);
}; };
struct PixmapSetDisabled { struct PixmapSetDisabled {
@@ -85,6 +87,10 @@ struct PixmapSetEmptyActive {
QPixmap active; QPixmap active;
QPixmap empty; QPixmap empty;
QPixmap empty_active; QPixmap empty_active;
QPixmap write_active;
QPixmap read_write_active;
QPixmap empty_write_active;
QPixmap empty_read_write_active;
void load(const QIcon &icon); void load(const QIcon &icon);
}; };
struct Pixmaps { struct Pixmaps {
@@ -105,6 +111,7 @@ struct StateActive {
std::unique_ptr<QLabel> label; std::unique_ptr<QLabel> label;
PixmapSetActive *pixmaps = nullptr; PixmapSetActive *pixmaps = nullptr;
bool active = false; bool active = false;
bool write_active = false;
void setActive(bool b) void setActive(bool b)
{ {
@@ -115,11 +122,23 @@ struct StateActive {
refresh(); refresh();
} }
void setWriteActive(bool b)
{
if (!label || b == write_active)
return;
write_active = b;
refresh();
}
void refresh() void refresh()
{ {
if (!label) if (!label)
return; return;
label->setPixmap(active ? pixmaps->active : pixmaps->normal); if (active && write_active)
label->setPixmap(pixmaps->read_write_active);
else
label->setPixmap(write_active ? pixmaps->write_active : (active ? pixmaps->active : pixmaps->normal));
} }
}; };
struct StateEmpty { struct StateEmpty {
@@ -145,9 +164,10 @@ struct StateEmpty {
}; };
struct StateEmptyActive { struct StateEmptyActive {
std::unique_ptr<QLabel> label; std::unique_ptr<QLabel> label;
PixmapSetEmptyActive *pixmaps = nullptr; PixmapSetEmptyActive *pixmaps = nullptr;
bool empty = false; bool empty = false;
bool active = false; bool active = false;
bool write_active = false;
void setActive(bool b) void setActive(bool b)
{ {
@@ -157,6 +177,14 @@ struct StateEmptyActive {
active = b; active = b;
refresh(); refresh();
} }
void setWriteActive(bool b)
{
if (!label || b == write_active)
return;
write_active = b;
refresh();
}
void setEmpty(bool b) void setEmpty(bool b)
{ {
if (!label || b == empty) if (!label || b == empty)
@@ -170,9 +198,15 @@ struct StateEmptyActive {
if (!label) if (!label)
return; return;
if (empty) { if (empty) {
label->setPixmap(active ? pixmaps->empty_active : pixmaps->empty); if (active && write_active)
label->setPixmap(pixmaps->empty_read_write_active);
else
label->setPixmap(write_active ? pixmaps->empty_write_active : (active ? pixmaps->empty_active : pixmaps->empty));
} else { } else {
label->setPixmap(active ? pixmaps->active : pixmaps->normal); if (active && write_active)
label->setPixmap(pixmaps->read_write_active);
else
label->setPixmap(write_active ? pixmaps->write_active : (active ? pixmaps->active : pixmaps->normal));
} }
} }
}; };
@@ -191,6 +225,9 @@ PixmapSetActive::load(const QIcon &icon)
{ {
normal = getIconWithIndicator(icon, pixmap_size, QIcon::Normal, None); normal = getIconWithIndicator(icon, pixmap_size, QIcon::Normal, None);
active = getIconWithIndicator(icon, pixmap_size, QIcon::Normal, Active); active = getIconWithIndicator(icon, pixmap_size, QIcon::Normal, Active);
write_active = getIconWithIndicator(icon, pixmap_size, QIcon::Normal, WriteActive);
read_write_active = getIconWithIndicator(icon, pixmap_size, QIcon::Normal, ReadWriteActive);
} }
void void
@@ -203,10 +240,14 @@ PixmapSetDisabled::load(const QIcon &icon)
void void
PixmapSetEmptyActive::load(const QIcon &icon) PixmapSetEmptyActive::load(const QIcon &icon)
{ {
normal = getIconWithIndicator(icon, pixmap_size, QIcon::Normal, None); normal = getIconWithIndicator(icon, pixmap_size, QIcon::Normal, None);
active = getIconWithIndicator(icon, pixmap_size, QIcon::Normal, Active); active = getIconWithIndicator(icon, pixmap_size, QIcon::Normal, Active);
empty = getIconWithIndicator(icon, pixmap_size, QIcon::Disabled, None); write_active = getIconWithIndicator(icon, pixmap_size, QIcon::Normal, WriteActive);
empty_active = getIconWithIndicator(icon, pixmap_size, QIcon::Disabled, Active); read_write_active = getIconWithIndicator(icon, pixmap_size, QIcon::Normal, ReadWriteActive);
empty = getIconWithIndicator(icon, pixmap_size, QIcon::Disabled, None);
empty_active = getIconWithIndicator(icon, pixmap_size, QIcon::Disabled, Active);
empty_write_active = getIconWithIndicator(icon, pixmap_size, QIcon::Disabled, WriteActive);
empty_read_write_active = getIconWithIndicator(icon, pixmap_size, QIcon::Disabled, ReadWriteActive);
} }
} }
@@ -217,10 +258,13 @@ struct MachineStatus::States {
{ {
pixmaps.cartridge.load(QIcon(":/settings/qt/icons/cartridge.ico")); pixmaps.cartridge.load(QIcon(":/settings/qt/icons/cartridge.ico"));
pixmaps.cassette.load(QIcon(":/settings/qt/icons/cassette.ico")); pixmaps.cassette.load(QIcon(":/settings/qt/icons/cassette.ico"));
pixmaps.floppy_disabled.normal = QIcon(":/settings/qt/icons/floppy_disabled.ico").pixmap(pixmap_size); pixmaps.floppy_disabled.normal = QIcon(":/settings/qt/icons/floppy_disabled.ico").pixmap(pixmap_size);
pixmaps.floppy_disabled.active = pixmaps.floppy_disabled.normal; pixmaps.floppy_disabled.active = pixmaps.floppy_disabled.normal;
pixmaps.floppy_disabled.empty = pixmaps.floppy_disabled.normal; pixmaps.floppy_disabled.read_write_active = pixmaps.floppy_disabled.normal;
pixmaps.floppy_disabled.empty_active = pixmaps.floppy_disabled.normal; pixmaps.floppy_disabled.empty = pixmaps.floppy_disabled.normal;
pixmaps.floppy_disabled.empty_active = pixmaps.floppy_disabled.normal;
pixmaps.floppy_disabled.empty_write_active = pixmaps.floppy_disabled.normal;
pixmaps.floppy_disabled.empty_read_write_active = pixmaps.floppy_disabled.normal;
pixmaps.floppy_525.load(QIcon(":/settings/qt/icons/floppy_525.ico")); pixmaps.floppy_525.load(QIcon(":/settings/qt/icons/floppy_525.ico"));
pixmaps.floppy_35.load(QIcon(":/settings/qt/icons/floppy_35.ico")); pixmaps.floppy_35.load(QIcon(":/settings/qt/icons/floppy_35.ico"));
pixmaps.cdrom.load(QIcon(":/settings/qt/icons/cdrom.ico")); pixmaps.cdrom.load(QIcon(":/settings/qt/icons/cdrom.ico"));
@@ -435,49 +479,79 @@ MachineStatus::refreshIcons()
if (!update_icons) if (!update_icons)
return; return;
for (size_t i = 0; i < FDD_NUM; ++i) for (size_t i = 0; i < FDD_NUM; ++i) {
d->fdd[i].setActive(machine_status.fdd[i].active); d->fdd[i].setActive(machine_status.fdd[i].active);
d->fdd[i].setWriteActive(machine_status.fdd[i].write_active);
}
for (size_t i = 0; i < CDROM_NUM; ++i) { for (size_t i = 0; i < CDROM_NUM; ++i) {
d->cdrom[i].setActive(machine_status.cdrom[i].active); d->cdrom[i].setActive(machine_status.cdrom[i].active);
if (machine_status.cdrom[i].active) d->cdrom[i].setWriteActive(machine_status.cdrom[i].write_active);
if (machine_status.cdrom[i].active) {
ui_sb_update_icon(SB_CDROM | i, 0); ui_sb_update_icon(SB_CDROM | i, 0);
}
if (machine_status.cdrom[i].write_active) {
ui_sb_update_icon_write(SB_CDROM | i, 0);
}
} }
for (size_t i = 0; i < ZIP_NUM; i++) { for (size_t i = 0; i < ZIP_NUM; i++) {
d->zip[i].setActive(machine_status.zip[i].active); d->zip[i].setActive(machine_status.zip[i].active);
d->zip[i].setWriteActive(machine_status.zip[i].write_active);
if (machine_status.zip[i].active) if (machine_status.zip[i].active)
ui_sb_update_icon(SB_ZIP | i, 0); ui_sb_update_icon(SB_ZIP | i, 0);
if (machine_status.zip[i].write_active)
ui_sb_update_icon_write(SB_ZIP | i, 0);
} }
for (size_t i = 0; i < MO_NUM; i++) { for (size_t i = 0; i < MO_NUM; i++) {
d->mo[i].setActive(machine_status.mo[i].active); d->mo[i].setActive(machine_status.mo[i].active);
d->mo[i].setWriteActive(machine_status.mo[i].write_active);
if (machine_status.mo[i].active) if (machine_status.mo[i].active)
ui_sb_update_icon(SB_MO | i, 0); ui_sb_update_icon(SB_MO | i, 0);
if (machine_status.mo[i].write_active)
ui_sb_update_icon_write(SB_MO | i, 0);
} }
for (size_t i = 0; i < HDD_BUS_USB; i++) { for (size_t i = 0; i < HDD_BUS_USB; i++) {
d->hdds[i].setActive(machine_status.hdd[i].active); d->hdds[i].setActive(machine_status.hdd[i].active);
d->hdds[i].setWriteActive(machine_status.hdd[i].write_active);
if (machine_status.hdd[i].active) if (machine_status.hdd[i].active)
ui_sb_update_icon(SB_HDD | i, 0); ui_sb_update_icon(SB_HDD | i, 0);
if (machine_status.hdd[i].write_active)
ui_sb_update_icon_write(SB_HDD | i, 0);
} }
for (size_t i = 0; i < NET_CARD_MAX; i++) for (size_t i = 0; i < NET_CARD_MAX; i++) {
d->net[i].setActive(machine_status.net[i].active); d->net[i].setActive(machine_status.net[i].active);
d->net[i].setWriteActive(machine_status.net[i].write_active);
}
} }
void void
MachineStatus::clearActivity() MachineStatus::clearActivity()
{ {
for (auto &fdd : d->fdd) for (auto &fdd : d->fdd) {
fdd.setActive(false); fdd.setActive(false);
for (auto &cdrom : d->cdrom) fdd.setWriteActive(false);
}
for (auto &cdrom : d->cdrom) {
cdrom.setActive(false); cdrom.setActive(false);
for (auto &zip : d->zip) cdrom.setWriteActive(false);
}
for (auto &zip : d->zip) {
zip.setActive(false); zip.setActive(false);
for (auto &mo : d->mo) zip.setWriteActive(false);
}
for (auto &mo : d->mo) {
mo.setActive(false); mo.setActive(false);
for (auto &hdd : d->hdds) mo.setWriteActive(false);
}
for (auto &hdd : d->hdds) {
hdd.setActive(false); hdd.setActive(false);
for (auto &net : d->net) hdd.setWriteActive(false);
}
for (auto &net : d->net) {
net.setActive(false); net.setActive(false);
net.setWriteActive(false);
}
} }
void void
@@ -562,6 +636,7 @@ MachineStatus::refresh(QStatusBar *sbar)
d->fdd[i].label = std::make_unique<ClickableLabel>(); d->fdd[i].label = std::make_unique<ClickableLabel>();
d->fdd[i].setEmpty(QString(floppyfns[i]).isEmpty()); d->fdd[i].setEmpty(QString(floppyfns[i]).isEmpty());
d->fdd[i].setActive(false); d->fdd[i].setActive(false);
d->fdd[i].setWriteActive(false);
d->fdd[i].refresh(); d->fdd[i].refresh();
connect((ClickableLabel *) d->fdd[i].label.get(), &ClickableLabel::clicked, [i](QPoint pos) { connect((ClickableLabel *) d->fdd[i].label.get(), &ClickableLabel::clicked, [i](QPoint pos) {
MediaMenu::ptr->floppyMenus[i]->popup(pos - QPoint(0, MediaMenu::ptr->floppyMenus[i]->sizeHint().height())); MediaMenu::ptr->floppyMenus[i]->popup(pos - QPoint(0, MediaMenu::ptr->floppyMenus[i]->sizeHint().height()));
@@ -578,6 +653,7 @@ MachineStatus::refresh(QStatusBar *sbar)
d->cdrom[i].label = std::make_unique<ClickableLabel>(); d->cdrom[i].label = std::make_unique<ClickableLabel>();
d->cdrom[i].setEmpty(QString(cdrom[i].image_path).isEmpty()); d->cdrom[i].setEmpty(QString(cdrom[i].image_path).isEmpty());
d->cdrom[i].setActive(false); d->cdrom[i].setActive(false);
d->cdrom[i].setWriteActive(false);
d->cdrom[i].refresh(); d->cdrom[i].refresh();
connect((ClickableLabel *) d->cdrom[i].label.get(), &ClickableLabel::clicked, [i](QPoint pos) { connect((ClickableLabel *) d->cdrom[i].label.get(), &ClickableLabel::clicked, [i](QPoint pos) {
MediaMenu::ptr->cdromMenus[i]->popup(pos - QPoint(0, MediaMenu::ptr->cdromMenus[i]->sizeHint().height())); MediaMenu::ptr->cdromMenus[i]->popup(pos - QPoint(0, MediaMenu::ptr->cdromMenus[i]->sizeHint().height()));
@@ -594,6 +670,7 @@ MachineStatus::refresh(QStatusBar *sbar)
d->zip[i].label = std::make_unique<ClickableLabel>(); d->zip[i].label = std::make_unique<ClickableLabel>();
d->zip[i].setEmpty(QString(zip_drives[i].image_path).isEmpty()); d->zip[i].setEmpty(QString(zip_drives[i].image_path).isEmpty());
d->zip[i].setActive(false); d->zip[i].setActive(false);
d->zip[i].setWriteActive(false);
d->zip[i].refresh(); d->zip[i].refresh();
connect((ClickableLabel *) d->zip[i].label.get(), &ClickableLabel::clicked, [i](QPoint pos) { connect((ClickableLabel *) d->zip[i].label.get(), &ClickableLabel::clicked, [i](QPoint pos) {
MediaMenu::ptr->zipMenus[i]->popup(pos - QPoint(0, MediaMenu::ptr->zipMenus[i]->sizeHint().height())); MediaMenu::ptr->zipMenus[i]->popup(pos - QPoint(0, MediaMenu::ptr->zipMenus[i]->sizeHint().height()));
@@ -610,6 +687,7 @@ MachineStatus::refresh(QStatusBar *sbar)
d->mo[i].label = std::make_unique<ClickableLabel>(); d->mo[i].label = std::make_unique<ClickableLabel>();
d->mo[i].setEmpty(QString(mo_drives[i].image_path).isEmpty()); d->mo[i].setEmpty(QString(mo_drives[i].image_path).isEmpty());
d->mo[i].setActive(false); d->mo[i].setActive(false);
d->mo[i].setWriteActive(false);
d->mo[i].refresh(); d->mo[i].refresh();
connect((ClickableLabel *) d->mo[i].label.get(), &ClickableLabel::clicked, [i](QPoint pos) { connect((ClickableLabel *) d->mo[i].label.get(), &ClickableLabel::clicked, [i](QPoint pos) {
MediaMenu::ptr->moMenus[i]->popup(pos - QPoint(0, MediaMenu::ptr->moMenus[i]->sizeHint().height())); MediaMenu::ptr->moMenus[i]->popup(pos - QPoint(0, MediaMenu::ptr->moMenus[i]->sizeHint().height()));
@@ -626,6 +704,7 @@ MachineStatus::refresh(QStatusBar *sbar)
d->net[i].label = std::make_unique<ClickableLabel>(); d->net[i].label = std::make_unique<ClickableLabel>();
d->net[i].setEmpty(!network_is_connected(i)); d->net[i].setEmpty(!network_is_connected(i));
d->net[i].setActive(false); d->net[i].setActive(false);
d->net[i].setWriteActive(false);
d->net[i].refresh(); d->net[i].refresh();
d->net[i].label->setToolTip(MediaMenu::ptr->netMenus[i]->title()); d->net[i].label->setToolTip(MediaMenu::ptr->netMenus[i]->title());
connect((ClickableLabel *) d->net[i].label.get(), &ClickableLabel::clicked, [i](QPoint pos) { connect((ClickableLabel *) d->net[i].label.get(), &ClickableLabel::clicked, [i](QPoint pos) {
@@ -638,6 +717,7 @@ MachineStatus::refresh(QStatusBar *sbar)
if ((has_mfm || (hdc_name.left(5) == QStringLiteral("st506"))) && (c_mfm > 0)) { if ((has_mfm || (hdc_name.left(5) == QStringLiteral("st506"))) && (c_mfm > 0)) {
d->hdds[HDD_BUS_MFM].label = std::make_unique<QLabel>(); d->hdds[HDD_BUS_MFM].label = std::make_unique<QLabel>();
d->hdds[HDD_BUS_MFM].setActive(false); d->hdds[HDD_BUS_MFM].setActive(false);
d->hdds[HDD_BUS_MFM].setWriteActive(false);
d->hdds[HDD_BUS_MFM].refresh(); d->hdds[HDD_BUS_MFM].refresh();
d->hdds[HDD_BUS_MFM].label->setToolTip(tr("Hard disk (%1)").arg("MFM/RLL")); d->hdds[HDD_BUS_MFM].label->setToolTip(tr("Hard disk (%1)").arg("MFM/RLL"));
auto tooltip = d->hdds[HDD_BUS_MFM].label->toolTip(); auto tooltip = d->hdds[HDD_BUS_MFM].label->toolTip();
@@ -653,6 +733,7 @@ MachineStatus::refresh(QStatusBar *sbar)
if ((has_esdi || (hdc_name.left(4) == QStringLiteral("esdi"))) && (c_esdi > 0)) { if ((has_esdi || (hdc_name.left(4) == QStringLiteral("esdi"))) && (c_esdi > 0)) {
d->hdds[HDD_BUS_ESDI].label = std::make_unique<QLabel>(); d->hdds[HDD_BUS_ESDI].label = std::make_unique<QLabel>();
d->hdds[HDD_BUS_ESDI].setActive(false); d->hdds[HDD_BUS_ESDI].setActive(false);
d->hdds[HDD_BUS_ESDI].setWriteActive(false);
d->hdds[HDD_BUS_ESDI].refresh(); d->hdds[HDD_BUS_ESDI].refresh();
d->hdds[HDD_BUS_ESDI].label->setToolTip(tr("Hard disk (%1)").arg("ESDI")); d->hdds[HDD_BUS_ESDI].label->setToolTip(tr("Hard disk (%1)").arg("ESDI"));
auto tooltip = d->hdds[HDD_BUS_ESDI].label->toolTip(); auto tooltip = d->hdds[HDD_BUS_ESDI].label->toolTip();
@@ -668,6 +749,7 @@ MachineStatus::refresh(QStatusBar *sbar)
if ((has_xta || (hdc_name.left(3) == QStringLiteral("xta"))) && (c_xta > 0)) { if ((has_xta || (hdc_name.left(3) == QStringLiteral("xta"))) && (c_xta > 0)) {
d->hdds[HDD_BUS_XTA].label = std::make_unique<QLabel>(); d->hdds[HDD_BUS_XTA].label = std::make_unique<QLabel>();
d->hdds[HDD_BUS_XTA].setActive(false); d->hdds[HDD_BUS_XTA].setActive(false);
d->hdds[HDD_BUS_XTA].setWriteActive(false);
d->hdds[HDD_BUS_XTA].refresh(); d->hdds[HDD_BUS_XTA].refresh();
d->hdds[HDD_BUS_XTA].label->setToolTip(tr("Hard disk (%1)").arg("XTA")); d->hdds[HDD_BUS_XTA].label->setToolTip(tr("Hard disk (%1)").arg("XTA"));
auto tooltip = d->hdds[HDD_BUS_XTA].label->toolTip(); auto tooltip = d->hdds[HDD_BUS_XTA].label->toolTip();
@@ -686,6 +768,7 @@ MachineStatus::refresh(QStatusBar *sbar)
if (c_ide > 0) { if (c_ide > 0) {
d->hdds[HDD_BUS_IDE].label = std::make_unique<QLabel>(); d->hdds[HDD_BUS_IDE].label = std::make_unique<QLabel>();
d->hdds[HDD_BUS_IDE].setActive(false); d->hdds[HDD_BUS_IDE].setActive(false);
d->hdds[HDD_BUS_IDE].setWriteActive(false);
d->hdds[HDD_BUS_IDE].refresh(); d->hdds[HDD_BUS_IDE].refresh();
d->hdds[HDD_BUS_IDE].label->setToolTip(tr("Hard disk (%1)").arg("IDE")); d->hdds[HDD_BUS_IDE].label->setToolTip(tr("Hard disk (%1)").arg("IDE"));
auto tooltip = d->hdds[HDD_BUS_IDE].label->toolTip(); auto tooltip = d->hdds[HDD_BUS_IDE].label->toolTip();
@@ -701,6 +784,7 @@ MachineStatus::refresh(QStatusBar *sbar)
if (c_atapi > 0) { if (c_atapi > 0) {
d->hdds[HDD_BUS_ATAPI].label = std::make_unique<QLabel>(); d->hdds[HDD_BUS_ATAPI].label = std::make_unique<QLabel>();
d->hdds[HDD_BUS_ATAPI].setActive(false); d->hdds[HDD_BUS_ATAPI].setActive(false);
d->hdds[HDD_BUS_ATAPI].setWriteActive(false);
d->hdds[HDD_BUS_ATAPI].refresh(); d->hdds[HDD_BUS_ATAPI].refresh();
d->hdds[HDD_BUS_ATAPI].label->setToolTip(tr("Hard disk (%1)").arg("ATAPI")); d->hdds[HDD_BUS_ATAPI].label->setToolTip(tr("Hard disk (%1)").arg("ATAPI"));
auto tooltip = d->hdds[HDD_BUS_ATAPI].label->toolTip(); auto tooltip = d->hdds[HDD_BUS_ATAPI].label->toolTip();
@@ -720,6 +804,7 @@ MachineStatus::refresh(QStatusBar *sbar)
(c_scsi > 0)) { (c_scsi > 0)) {
d->hdds[HDD_BUS_SCSI].label = std::make_unique<QLabel>(); d->hdds[HDD_BUS_SCSI].label = std::make_unique<QLabel>();
d->hdds[HDD_BUS_SCSI].setActive(false); d->hdds[HDD_BUS_SCSI].setActive(false);
d->hdds[HDD_BUS_SCSI].setWriteActive(false);
d->hdds[HDD_BUS_SCSI].refresh(); d->hdds[HDD_BUS_SCSI].refresh();
d->hdds[HDD_BUS_SCSI].label->setToolTip(tr("Hard disk (%1)").arg("SCSI")); d->hdds[HDD_BUS_SCSI].label->setToolTip(tr("Hard disk (%1)").arg("SCSI"));
auto tooltip = d->hdds[HDD_BUS_SCSI].label->toolTip(); auto tooltip = d->hdds[HDD_BUS_SCSI].label->toolTip();

View File

@@ -314,4 +314,41 @@ ui_sb_update_icon(int tag, int active)
break; break;
} }
} }
void
ui_sb_update_icon_write(int tag, int write)
{
const auto temp = static_cast<unsigned int>(tag);
const int category = static_cast<int>(temp & 0xfffffff0);
const int item = tag & 0xf;
switch (category) {
default:
case SB_CASSETTE:
case SB_CARTRIDGE:
break;
case SB_FLOPPY:
machine_status.fdd[item].write_active = write > 0 ? true : false;
break;
case SB_CDROM:
machine_status.cdrom[item].write_active = write > 0 ? true : false;
break;
case SB_ZIP:
machine_status.zip[item].write_active = write > 0 ? true : false;
break;
case SB_MO:
machine_status.mo[item].write_active = write > 0 ? true : false;
break;
case SB_HDD:
machine_status.hdd[item].write_active = write > 0 ? true : false;
break;
case SB_NETWORK:
machine_status.net[item].write_active = write > 0 ? true : false;
break;
case SB_SOUND:
case SB_TEXT:
break;
}
}
} }

View File

@@ -28,6 +28,7 @@
<file>qt/icons/zip.ico</file> <file>qt/icons/zip.ico</file>
<file>qt/icons/zip_disabled.ico</file> <file>qt/icons/zip_disabled.ico</file>
<file>qt/icons/active.ico</file> <file>qt/icons/active.ico</file>
<file>qt/icons/write_active.ico</file>
<file>qt/icons/disabled.ico</file> <file>qt/icons/disabled.ico</file>
<file>qt/icons/86Box-gray.ico</file> <file>qt/icons/86Box-gray.ico</file>
<file>qt/icons/86Box-green.ico</file> <file>qt/icons/86Box-green.ico</file>

View File

@@ -614,6 +614,7 @@ scsi_disk_cmd_error(scsi_disk_t *dev)
dev->callback = 50.0 * SCSI_TIME; dev->callback = 50.0 * SCSI_TIME;
scsi_disk_set_callback(dev); scsi_disk_set_callback(dev);
ui_sb_update_icon(SB_HDD | dev->drv->bus_type, 0); ui_sb_update_icon(SB_HDD | dev->drv->bus_type, 0);
ui_sb_update_icon_write(SB_HDD | dev->drv->bus_type, 0);
scsi_disk_log(dev->log, "ERROR: %02X/%02X/%02X\n", scsi_disk_sense_key, scsi_disk_log(dev->log, "ERROR: %02X/%02X/%02X\n", scsi_disk_sense_key,
scsi_disk_asc, scsi_disk_ascq); scsi_disk_asc, scsi_disk_ascq);
} }
@@ -1208,7 +1209,7 @@ scsi_disk_command(scsi_common_t *sc, const uint8_t *cdb)
scsi_disk_data_command_finish(dev, dev->packet_len, 512, dev->packet_len, 1); scsi_disk_data_command_finish(dev, dev->packet_len, 512, dev->packet_len, 1);
ui_sb_update_icon(SB_HDD | dev->drv->bus_type, dev->packet_status != PHASE_COMPLETE); ui_sb_update_icon_write(SB_HDD | dev->drv->bus_type, dev->packet_status != PHASE_COMPLETE);
} else { } else {
scsi_disk_set_phase(dev, SCSI_PHASE_STATUS); scsi_disk_set_phase(dev, SCSI_PHASE_STATUS);
scsi_disk_log(dev->log, "All done - callback set\n"); scsi_disk_log(dev->log, "All done - callback set\n");
@@ -1243,7 +1244,7 @@ scsi_disk_command(scsi_common_t *sc, const uint8_t *cdb)
scsi_disk_data_command_finish(dev, 512, 512, alloc_length, 1); scsi_disk_data_command_finish(dev, 512, 512, alloc_length, 1);
ui_sb_update_icon(SB_HDD | dev->drv->bus_type, ui_sb_update_icon_write(SB_HDD | dev->drv->bus_type,
dev->packet_status != PHASE_COMPLETE); dev->packet_status != PHASE_COMPLETE);
} else { } else {
scsi_disk_set_phase(dev, SCSI_PHASE_STATUS); scsi_disk_set_phase(dev, SCSI_PHASE_STATUS);

View File

@@ -146,7 +146,7 @@ if(FLUIDSYNTH)
pkg_check_modules(FLUIDSYNTH REQUIRED IMPORTED_TARGET fluidsynth) pkg_check_modules(FLUIDSYNTH REQUIRED IMPORTED_TARGET fluidsynth)
target_link_libraries(86Box PkgConfig::FLUIDSYNTH) target_link_libraries(86Box PkgConfig::FLUIDSYNTH)
if(STATIC_BUILD) if(STATIC_BUILD)
target_link_libraries(86Box -static ${FLUIDSYNTH_STATIC_LIBRARIES} -fopenmp) target_link_libraries(86Box -static ${FLUIDSYNTH_STATIC_LIBRARIES} -fopenmp -lgomp)
if(WIN32) if(WIN32)
add_compile_definitions(FLUIDSYNTH_NOT_A_DLL) add_compile_definitions(FLUIDSYNTH_NOT_A_DLL)