Merge branch 'master' into pc98x1

This commit is contained in:
TC1995
2024-09-18 12:13:49 +02:00
10 changed files with 85 additions and 33 deletions

View File

@@ -1076,6 +1076,7 @@ read_toc_normal(cdrom_t *dev, unsigned char *b, unsigned char start_track, int m
for (i = first_track; i <= last_track; i++) {
cdrom_log(" tracks(%i) = %02X, %02X, %i:%02i.%02i\n", i, ti.attr, ti.number, ti.m, ti.s, ti.f);
pclog(" tracks(%i) = %02X, %02X, %i:%02i.%02i\n", i, ti.attr, ti.number, ti.m, ti.s, ti.f);
dev->ops->get_track_info(dev, i + 1, 0, &ti);
b[len++] = 0; /* reserved */
@@ -1173,6 +1174,7 @@ read_toc_raw(cdrom_t *dev, unsigned char *b)
int last_track;
cdrom_log("read_toc_raw(%08X, %08X)\n", dev, b);
pclog("read_toc_raw(%08X, %08X)\n", dev, b);
dev->ops->get_tracks(dev, &first_track, &last_track);
@@ -1183,6 +1185,7 @@ read_toc_raw(cdrom_t *dev, unsigned char *b)
dev->ops->get_track_info(dev, i + 1, 0, &ti);
cdrom_log(" tracks(%i) = %02X, %02X, %i:%02i.%02i\n", i, ti.attr, ti.number, ti.m, ti.s, ti.f);
pclog(" tracks(%i) = %02X, %02X, %i:%02i.%02i\n", i, ti.attr, ti.number, ti.m, ti.s, ti.f);
b[len++] = 1; /* Session number */
b[len++] = ti.attr; /* Track ADR and Control */
@@ -2016,6 +2019,27 @@ cdrom_insert(uint8_t id)
dev->insert(dev->priv);
}
void
cdrom_exit(uint8_t id)
{
cdrom_t *dev = &cdrom[id];
strcpy(dev->prev_image_path, dev->image_path);
if (dev->ops) {
if (dev->ops->exit)
dev->ops->exit(dev);
dev->ops = NULL;
}
memset(dev->image_path, 0, sizeof(dev->image_path));
cdrom_insert(id);
pclog("CD-ROM exited\n");
}
/* The mechanics of ejecting a CD-ROM from a drive. */
void
cdrom_eject(uint8_t id)
@@ -2028,13 +2052,7 @@ cdrom_eject(uint8_t id)
return;
}
strcpy(dev->prev_image_path, dev->image_path);
dev->ops->exit(dev);
dev->ops = NULL;
memset(dev->image_path, 0, sizeof(dev->image_path));
cdrom_insert(id);
cdrom_exit(id);
plat_cdrom_ui_update(id, 0);

View File

@@ -372,7 +372,9 @@ esdi_callback(void *priv)
if (dev->in_reset) {
esdi_mca_log("ESDI reset.\n");
dev->in_reset = 0;
dev->status = STATUS_IRQ;
dev->status = STATUS_IRQ | STATUS_TRANSFER_REQ | STATUS_STATUS_OUT_FULL;
dev->status_len = 1; /*ToDo: better implementation for Xenix?*/
dev->status_data[0] = STATUS_LEN(1) | ATTN_HOST_ADAPTER;
dev->irq_status = IRQ_HOST_ADAPTER | IRQ_RESET_COMPLETE;
return;
}
@@ -1055,8 +1057,10 @@ esdi_readw(uint16_t port, void *priv)
switch (port & 7) {
case 0: /*Status Interface Register*/
if (dev->status_pos >= dev->status_len)
if (dev->status_pos >= dev->status_len) {
esdi_mca_log("esdi_readw port=%04x, ret=0000 (pos=%d, len=%d).\n", port, dev->status_pos, dev->status_len);
return 0;
}
ret = dev->status_data[dev->status_pos++];
if (dev->status_pos >= dev->status_len) {
dev->status &= ~STATUS_STATUS_OUT_FULL;
@@ -1068,6 +1072,7 @@ esdi_readw(uint16_t port, void *priv)
fatal("esdi_readw port=%04x\n", port);
}
esdi_mca_log("esdi_readw port=%04x, ret=%04x.\n", port, ret);
return ret;
}
@@ -1250,7 +1255,7 @@ esdi_init(UNUSED(const device_t *info))
drive->spt = hdd[i].spt;
drive->hpc = hdd[i].hpc;
drive->tracks = hdd[i].tracks;
drive->sectors = hdd_image_get_last_sector(i) + 1;
drive->sectors = hdd_image_get_last_sector(i);
drive->hdd_num = i;
/* Mark drive as present. */

View File

@@ -25,6 +25,7 @@
#define CD_STATUS_PLAYING_COMPLETED 5
/* Medium changed flag. */
#define CD_STATUS_TRANSITION 0x40
#define CD_STATUS_MEDIUM_CHANGED 0x80
#define CD_TRACK_AUDIO 0x08
@@ -298,6 +299,7 @@ extern void cdrom_seek(cdrom_t *dev, uint32_t pos, uint8_t vendor_type);
extern void cdrom_close_handler(uint8_t id);
extern void cdrom_insert(uint8_t id);
extern void cdrom_exit(uint8_t id);
extern void cdrom_eject(uint8_t id);
extern void cdrom_reload(uint8_t id);

View File

@@ -61,6 +61,8 @@ extern uint64_t tsc;
extern MainWindow *main_window;
static bool sbar_initialized = false;
namespace {
struct PixmapSetActive {
QPixmap normal;
@@ -380,6 +382,31 @@ hdd_count(int bus)
return c;
}
void
MachineStatus::refreshEmptyIcons()
{
/* Check if icons are initialized. */
if (!sbar_initialized)
return;
for (size_t i = 0; i < FDD_NUM; ++i)
d->fdd[i].setEmpty(machine_status.fdd[i].empty);
for (size_t i = 0; i < CDROM_NUM; ++i)
d->cdrom[i].setEmpty(machine_status.cdrom[i].empty);
for (size_t i = 0; i < ZIP_NUM; i++)
d->zip[i].setEmpty(machine_status.zip[i].empty);
for (size_t i = 0; i < MO_NUM; i++)
d->mo[i].setEmpty(machine_status.mo[i].empty);
d->cassette.setEmpty(machine_status.cassette.empty);
for (size_t i = 0; i < NET_CARD_MAX; i++)
d->net[i].setEmpty(machine_status.net[i].empty);
for (int i = 0; i < 2; ++i)
d->cartridge[i].setEmpty(machine_status.cartridge[i].empty);
}
void
MachineStatus::refreshIcons()
{
@@ -387,48 +414,32 @@ MachineStatus::refreshIcons()
if (!update_icons)
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].setEmpty(machine_status.fdd[i].empty);
}
for (size_t i = 0; i < CDROM_NUM; ++i) {
d->cdrom[i].setActive(machine_status.cdrom[i].active);
if (machine_status.cdrom[i].active)
ui_sb_update_icon(SB_CDROM | i, 0);
d->cdrom[i].setEmpty(machine_status.cdrom[i].empty);
}
for (size_t i = 0; i < ZIP_NUM; i++) {
d->zip[i].setActive(machine_status.zip[i].active);
if (machine_status.zip[i].active)
ui_sb_update_icon(SB_ZIP | i, 0);
d->zip[i].setEmpty(machine_status.zip[i].empty);
}
for (size_t i = 0; i < MO_NUM; i++) {
d->mo[i].setActive(machine_status.mo[i].active);
if (machine_status.mo[i].active)
ui_sb_update_icon(SB_MO | i, 0);
d->mo[i].setEmpty(machine_status.mo[i].empty);
}
d->cassette.setEmpty(machine_status.cassette.empty);
for (size_t i = 0; i < HDD_BUS_USB; i++) {
d->hdds[i].setActive(machine_status.hdd[i].active);
if (machine_status.hdd[i].active)
ui_sb_update_icon(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].setEmpty(machine_status.net[i].empty);
}
for (int i = 0; i < 2; ++i) {
d->cartridge[i].setEmpty(machine_status.cartridge[i].empty);
}
}
void
@@ -664,6 +675,10 @@ MachineStatus::refresh(QStatusBar *sbar)
sbar->addWidget(d->sound.get());
d->text = std::make_unique<QLabel>();
sbar->addWidget(d->text.get());
sbar_initialized = true;
refreshEmptyIcons();
}
void
@@ -719,4 +734,6 @@ MachineStatus::updateTip(int tag)
case SB_TEXT:
break;
}
refreshEmptyIcons();
}

View File

@@ -75,6 +75,7 @@ public slots:
void refresh(QStatusBar *sbar);
void message(const QString &msg);
void updateTip(int tag);
void refreshEmptyIcons();
void refreshIcons();
private:

View File

@@ -1904,6 +1904,13 @@ MainWindow::updateUiPauseState()
ui->actionPause->setToolTip(tooltip_text);
}
void
MainWindow::updateStatusEmptyIcons()
{
if (status != nullptr)
status->refreshEmptyIcons();
}
void
MainWindow::on_actionPreferences_triggered()
{

View File

@@ -63,6 +63,7 @@ public slots:
void togglePause();
void initRendererMonitorSlot(int monitor_index);
void destroyRendererMonitorSlot(int monitor_index);
void updateStatusEmptyIcons();
void updateUiPauseState();
private slots:
void on_actionFullscreen_triggered();

View File

@@ -526,11 +526,8 @@ MediaMenu::cdromMount(int i, const QString &filename)
{
QByteArray fn = filename.toUtf8().data();
strcpy(cdrom[i].prev_image_path, cdrom[i].image_path);
if (cdrom[i].ops && cdrom[i].ops->exit)
cdrom[i].ops->exit(&(cdrom[i]));
cdrom_exit(i);
cdrom[i].ops = nullptr;
memset(cdrom[i].image_path, 0, sizeof(cdrom[i].image_path));
#ifdef Q_OS_WINDOWS
if ((fn.data() != nullptr) && (strlen(fn.data()) >= 1) && (fn.data()[strlen(fn.data()) - 1] == '/'))
@@ -543,6 +540,7 @@ MediaMenu::cdromMount(int i, const QString &filename)
cdrom_ioctl_open(&(cdrom[i]), fn.data());
else
cdrom_image_open(&(cdrom[i]), fn.data());
/* Signal media change to the emulated machine. */
if (cdrom[i].insert)
cdrom[i].insert(cdrom[i].priv);

View File

@@ -256,6 +256,9 @@ ui_sb_update_icon_state(int tag, int state)
case SB_TEXT:
break;
}
if (main_window != nullptr)
main_window->updateStatusEmptyIcons();
}
void

View File

@@ -539,7 +539,7 @@ mach64_recalctimings(svga_t *svga)
break;
case BPP_8:
if (mach64->type != MACH64_GX)
svga->render = svga_render_8bpp_highres;
svga->render = svga_render_8bpp_clone_highres;
svga->hdisp <<= 3;
svga->rowoffset >>= 1;
break;