mirror of
https://github.com/86Box/86Box.git
synced 2026-02-22 09:35:32 -07:00
Merge remote-tracking branch 'origin/master' into version/4.1
This commit is contained in:
@@ -124,7 +124,7 @@ acpi_update_irq(acpi_t *dev)
|
||||
if (dev->vendor == VEN_SMC)
|
||||
sci_level |= (dev->regs.pmsts & BM_STS);
|
||||
|
||||
if (sci_level) {
|
||||
if ((dev->regs.pmcntrl & 0x01) && sci_level) {
|
||||
if (dev->irq_mode == 1)
|
||||
pci_set_irq(dev->slot, dev->irq_pin, &dev->irq_state);
|
||||
else if (dev->irq_mode == 2)
|
||||
@@ -658,6 +658,7 @@ acpi_reg_write_common_regs(UNUSED(int size), uint16_t addr, uint8_t val, void *p
|
||||
acpi_t *dev = (acpi_t *) priv;
|
||||
int shift16;
|
||||
int sus_typ;
|
||||
uint8_t old;
|
||||
|
||||
addr &= 0x3f;
|
||||
#ifdef ENABLE_ACPI_LOG
|
||||
@@ -684,6 +685,7 @@ acpi_reg_write_common_regs(UNUSED(int size), uint16_t addr, uint8_t val, void *p
|
||||
case 0x04:
|
||||
case 0x05:
|
||||
/* PMCNTRL - Power Management Control Register (IO) */
|
||||
old = dev->regs.pmcntrl & 0xff;
|
||||
if ((addr == 0x05) && (val & 0x20)) {
|
||||
sus_typ = dev->suspend_types[(val >> 2) & 7];
|
||||
acpi_log("ACPI suspend type %d flags %02X\n", (val >> 2) & 7, sus_typ);
|
||||
@@ -726,6 +728,8 @@ acpi_reg_write_common_regs(UNUSED(int size), uint16_t addr, uint8_t val, void *p
|
||||
}
|
||||
}
|
||||
dev->regs.pmcntrl = ((dev->regs.pmcntrl & ~(0xff << shift16)) | (val << shift16)) & 0x3f07 /* 0x3c07 */;
|
||||
if ((addr == 0x04) && ((old ^ val) & 0x01))
|
||||
acpi_update_irq(dev);
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -789,7 +793,7 @@ acpi_reg_write_ali(int size, uint16_t addr, uint8_t val, void *priv)
|
||||
dev->regs.gpcntrl = ((dev->regs.gpcntrl & ~(0xff << shift32)) | (val << shift32)) & 0x00000001;
|
||||
break;
|
||||
case 0x30:
|
||||
/* PM2_CNTRL - Power Management 2 Control Register( */
|
||||
/* PM2_CNTRL - Power Management 2 Control Register */
|
||||
dev->regs.pmcntrl = val & 1;
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -1414,7 +1414,7 @@ cdrom_read_disc_info_toc(cdrom_t *dev, unsigned char *b, unsigned char track, in
|
||||
b[3] = ti.attr;
|
||||
cdrom_log("CD-ROM %i: Returned Toshiba/NEC disc information (type 2) at %02i:%02i.%02i, track=%d, m=%02i,s=%02i,f=%02i, tno=%02x.\n", dev->id, b[0], b[1], b[2], bcd2bin(track), m, s, f, ti.attr);
|
||||
break;
|
||||
case 3: /*Undocumented on NEC CD-ROM's, from information based on sr_vendor.c from Android's source code*/
|
||||
case 3: /* Undocumented on NEC CD-ROM's, from information based on sr_vendor.c from the Linux kernel */
|
||||
switch (dev->type) {
|
||||
case CDROM_TYPE_NEC_25_10a:
|
||||
case CDROM_TYPE_NEC_38_103:
|
||||
|
||||
@@ -139,6 +139,8 @@ load_general(void)
|
||||
rctrl_is_lalt = ini_section_get_int(cat, "rctrl_is_lalt", 0);
|
||||
update_icons = ini_section_get_int(cat, "update_icons", 1);
|
||||
|
||||
status_icons_fullscreen = !!config_get_int(cat, "status_icons_fullscreen", 0);
|
||||
|
||||
window_remember = ini_section_get_int(cat, "window_remember", 0);
|
||||
|
||||
if (!window_remember && !(vid_resize & 2))
|
||||
@@ -1782,6 +1784,11 @@ save_general(void)
|
||||
else
|
||||
ini_section_delete_var(cat, "open_dir_usr_path");
|
||||
|
||||
if (status_icons_fullscreen)
|
||||
config_set_int(cat, "status_icons_fullscreen", status_icons_fullscreen);
|
||||
else
|
||||
config_delete_var(cat, "status_icons_fullscreen");
|
||||
|
||||
if (video_framerate != -1)
|
||||
ini_section_set_int(cat, "video_gl_framerate", video_framerate);
|
||||
else
|
||||
|
||||
@@ -1796,7 +1796,9 @@ pmodeiret(int is32)
|
||||
}
|
||||
|
||||
if (cpu_state.flags & NT_FLAG) {
|
||||
cpl_override = 1;
|
||||
seg = readmemw(tr.base, 0);
|
||||
cpl_override = 0;
|
||||
addr = seg & 0xfff8;
|
||||
if (seg & 0x0004) {
|
||||
x86seg_log("TS LDT %04X %04X IRET\n", seg, gdt.limit);
|
||||
@@ -1809,8 +1811,8 @@ pmodeiret(int is32)
|
||||
}
|
||||
addr += gdt.base;
|
||||
}
|
||||
cpl_override = 1;
|
||||
read_descriptor(addr, segdat, segdat32, 1);
|
||||
cpl_override = 1;
|
||||
op_taskswitch286(seg, segdat, segdat[2] & 0x0800);
|
||||
cpl_override = 0;
|
||||
return;
|
||||
|
||||
@@ -2147,6 +2147,9 @@ mo_hard_reset(void)
|
||||
|
||||
dev = (mo_t *) mo_drives[c].priv;
|
||||
|
||||
if (dev->tf == NULL)
|
||||
continue;
|
||||
|
||||
dev->id = c;
|
||||
dev->drv = &mo_drives[c];
|
||||
|
||||
|
||||
@@ -2386,6 +2386,9 @@ zip_hard_reset(void)
|
||||
|
||||
dev = (zip_t *) zip_drives[c].priv;
|
||||
|
||||
if (dev->tf == NULL)
|
||||
continue;
|
||||
|
||||
dev->id = c;
|
||||
dev->drv = &zip_drives[c];
|
||||
|
||||
|
||||
@@ -107,6 +107,7 @@ extern int infocus;
|
||||
extern char emu_version[200]; /* version ID string */
|
||||
extern int rctrl_is_lalt;
|
||||
extern int update_icons;
|
||||
extern int status_icons_fullscreen;
|
||||
|
||||
extern int kbd_req_capture;
|
||||
extern int hide_status_bar;
|
||||
|
||||
@@ -41,7 +41,7 @@ typedef struct ibm8514_t {
|
||||
int type;
|
||||
int local;
|
||||
int bpp;
|
||||
int on;
|
||||
int on[2];
|
||||
int accel_bpp;
|
||||
|
||||
uint32_t vram_size;
|
||||
@@ -64,7 +64,7 @@ typedef struct ibm8514_t {
|
||||
struct {
|
||||
uint16_t subsys_cntl;
|
||||
uint16_t setup_md;
|
||||
uint8_t advfunc_cntl;
|
||||
uint16_t advfunc_cntl;
|
||||
uint8_t ext_advfunc_cntl;
|
||||
uint16_t cur_y;
|
||||
uint16_t cur_y_bitres;
|
||||
|
||||
@@ -136,6 +136,22 @@ HardwareRenderer::initializeGL()
|
||||
m_context->swapBuffers(this);
|
||||
}
|
||||
|
||||
void
|
||||
HardwareRenderer::paintOverGL()
|
||||
{
|
||||
/* Context switching is needed to make use of QPainter to draw status bar icons in fullscreen.
|
||||
Especially since it seems to be impossible to use QPainter on externally-created OpenGL contexts. */
|
||||
if (video_fullscreen && status_icons_fullscreen) {
|
||||
m_context->makeCurrent(nullptr);
|
||||
makeCurrent();
|
||||
QPainter painter(this);
|
||||
drawStatusBarIcons(&painter);
|
||||
painter.end();
|
||||
doneCurrent();
|
||||
m_context->makeCurrent(this);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
HardwareRenderer::paintGL()
|
||||
{
|
||||
|
||||
@@ -53,6 +53,7 @@ public:
|
||||
{
|
||||
onResize(size().width(), size().height());
|
||||
}
|
||||
void paintOverGL() override;
|
||||
std::vector<std::tuple<uint8_t *, std::atomic_flag *>> getBuffers() override;
|
||||
HardwareRenderer(QWidget *parent = nullptr, RenderType rtype = RenderType::OpenGL)
|
||||
: QOpenGLWindow(QOpenGLWindow::NoPartialUpdate, parent->windowHandle())
|
||||
|
||||
@@ -429,11 +429,12 @@ MachineStatus::refresh(QStatusBar *sbar)
|
||||
bool has_xta = machine_has_flags(machine, MACHINE_XTA) > 0;
|
||||
bool has_esdi = machine_has_flags(machine, MACHINE_ESDI) > 0;
|
||||
|
||||
int c_mfm = hdd_count(HDD_BUS_MFM);
|
||||
int c_esdi = hdd_count(HDD_BUS_ESDI);
|
||||
int c_xta = hdd_count(HDD_BUS_XTA);
|
||||
int c_ide = hdd_count(HDD_BUS_IDE);
|
||||
int c_scsi = hdd_count(HDD_BUS_SCSI);
|
||||
int c_mfm = hdd_count(HDD_BUS_MFM);
|
||||
int c_esdi = hdd_count(HDD_BUS_ESDI);
|
||||
int c_xta = hdd_count(HDD_BUS_XTA);
|
||||
int c_ide = hdd_count(HDD_BUS_IDE);
|
||||
int c_atapi = hdd_count(HDD_BUS_ATAPI);
|
||||
int c_scsi = hdd_count(HDD_BUS_SCSI);
|
||||
|
||||
sbar->removeWidget(d->cassette.label.get());
|
||||
for (int i = 0; i < 2; ++i) {
|
||||
@@ -597,12 +598,21 @@ MachineStatus::refresh(QStatusBar *sbar)
|
||||
d->hdds[HDD_BUS_XTA].label->setToolTip(tr("Hard disk (%s)").replace("%s", "XTA"));
|
||||
sbar->addWidget(d->hdds[HDD_BUS_XTA].label.get());
|
||||
}
|
||||
if ((hasIDE() || hdc_name.left(5) == QStringLiteral("xtide") || hdc_name.left(3) == QStringLiteral("ide")) && c_ide > 0) {
|
||||
d->hdds[HDD_BUS_IDE].label = std::make_unique<QLabel>();
|
||||
d->hdds[HDD_BUS_IDE].setActive(false);
|
||||
d->hdds[HDD_BUS_IDE].refresh();
|
||||
d->hdds[HDD_BUS_IDE].label->setToolTip(tr("Hard disk (%s)").replace("%s", "IDE"));
|
||||
sbar->addWidget(d->hdds[HDD_BUS_IDE].label.get());
|
||||
if (hasIDE() || hdc_name.left(5) == QStringLiteral("xtide") || hdc_name.left(3) == QStringLiteral("ide")) {
|
||||
if (c_ide > 0) {
|
||||
d->hdds[HDD_BUS_IDE].label = std::make_unique<QLabel>();
|
||||
d->hdds[HDD_BUS_IDE].setActive(false);
|
||||
d->hdds[HDD_BUS_IDE].refresh();
|
||||
d->hdds[HDD_BUS_IDE].label->setToolTip(tr("Hard disk (%s)").replace("%s", "IDE"));
|
||||
sbar->addWidget(d->hdds[HDD_BUS_IDE].label.get());
|
||||
}
|
||||
if (c_atapi > 0) {
|
||||
d->hdds[HDD_BUS_ATAPI].label = std::make_unique<QLabel>();
|
||||
d->hdds[HDD_BUS_ATAPI].setActive(false);
|
||||
d->hdds[HDD_BUS_ATAPI].refresh();
|
||||
d->hdds[HDD_BUS_ATAPI].label->setToolTip(tr("Hard disk (%s)").replace("%s", "ATAPI"));
|
||||
sbar->addWidget(d->hdds[HDD_BUS_ATAPI].label.get());
|
||||
}
|
||||
}
|
||||
if ((hasSCSI() || (scsi_card_current[0] != 0) || (scsi_card_current[1] != 0) || (scsi_card_current[2] != 0) || (scsi_card_current[3] != 0)) && c_scsi > 0) {
|
||||
d->hdds[HDD_BUS_SCSI].label = std::make_unique<QLabel>();
|
||||
|
||||
@@ -346,6 +346,7 @@ MainWindow::MainWindow(QWidget *parent)
|
||||
ui->actionUpdate_status_bar_icons->setChecked(update_icons);
|
||||
ui->actionEnable_Discord_integration->setChecked(enable_discord);
|
||||
ui->actionApply_fullscreen_stretch_mode_when_maximized->setChecked(video_fullscreen_scale_maximized);
|
||||
ui->actionShow_status_icons_in_fullscreen->setChecked(status_icons_fullscreen);
|
||||
|
||||
#ifndef DISCORD
|
||||
ui->actionEnable_Discord_integration->setVisible(false);
|
||||
@@ -614,6 +615,15 @@ MainWindow::MainWindow(QWidget *parent)
|
||||
if (!vnc_enabled)
|
||||
video_setblit(qt_blit);
|
||||
|
||||
if (start_in_fullscreen) {
|
||||
connect(ui->stackedWidget, &RendererStack::blit, this, [this] () {
|
||||
if (start_in_fullscreen) {
|
||||
QTimer::singleShot(100, ui->actionFullscreen, &QAction::trigger);
|
||||
start_in_fullscreen = 0;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
#ifdef MTR_ENABLED
|
||||
{
|
||||
ui->actionBegin_trace->setVisible(true);
|
||||
@@ -840,10 +850,6 @@ MainWindow::showEvent(QShowEvent *event)
|
||||
QApplication::processEvents();
|
||||
this->adjustSize();
|
||||
}
|
||||
if (start_in_fullscreen) {
|
||||
start_in_fullscreen = 0;
|
||||
QTimer::singleShot(0, ui->actionFullscreen, &QAction::trigger);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
@@ -2027,3 +2033,11 @@ void MainWindow::on_actionACPI_Shutdown_triggered()
|
||||
{
|
||||
acpi_pwrbut_pressed = 1;
|
||||
}
|
||||
|
||||
void MainWindow::on_actionShow_status_icons_in_fullscreen_triggered()
|
||||
{
|
||||
status_icons_fullscreen = !status_icons_fullscreen;
|
||||
ui->actionShow_status_icons_in_fullscreen->setChecked(status_icons_fullscreen);
|
||||
config_save();
|
||||
}
|
||||
|
||||
|
||||
@@ -144,6 +144,7 @@ private slots:
|
||||
void on_actionCursor_Puck_triggered();
|
||||
|
||||
void on_actionACPI_Shutdown_triggered();
|
||||
void on_actionShow_status_icons_in_fullscreen_triggered();
|
||||
|
||||
private slots:
|
||||
void on_actionShow_non_primary_monitors_triggered();
|
||||
|
||||
@@ -180,6 +180,7 @@
|
||||
</widget>
|
||||
<addaction name="actionHide_tool_bar"/>
|
||||
<addaction name="actionHide_status_bar"/>
|
||||
<addaction name="actionShow_status_icons_in_fullscreen"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionShow_non_primary_monitors"/>
|
||||
<addaction name="actionResizable_window"/>
|
||||
@@ -881,6 +882,14 @@
|
||||
<string>Cursor/Puck</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionShow_status_icons_in_fullscreen">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Show status icons in fullscreen</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionPen">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
|
||||
@@ -17,11 +17,15 @@
|
||||
|
||||
#include "qt_renderercommon.hpp"
|
||||
#include "qt_mainwindow.hpp"
|
||||
#include "qt_machinestatus.hpp"
|
||||
|
||||
#include <QPainter>
|
||||
#include <QWidget>
|
||||
#include <QEvent>
|
||||
#include <QApplication>
|
||||
#include <QFontMetrics>
|
||||
#include <QStatusBar>
|
||||
#include <QLayout>
|
||||
|
||||
#include <cmath>
|
||||
|
||||
@@ -29,6 +33,8 @@ extern "C" {
|
||||
#include <86box/86box.h>
|
||||
#include <86box/plat.h>
|
||||
#include <86box/video.h>
|
||||
|
||||
int status_icons_fullscreen = 0;
|
||||
}
|
||||
|
||||
RendererCommon::RendererCommon() = default;
|
||||
@@ -131,6 +137,50 @@ RendererCommon::onResize(int width, int height)
|
||||
monitors[r_monitor_index].mon_res_y = (double) destination.height();
|
||||
}
|
||||
|
||||
void RendererCommon::drawStatusBarIcons(QPainter* painter)
|
||||
{
|
||||
uint32_t x = 0;
|
||||
auto prevcompositionMode = painter->compositionMode();
|
||||
painter->setCompositionMode(QPainter::CompositionMode::CompositionMode_SourceOver);
|
||||
for (int i = 0; i < main_window->statusBar()->children().count(); i++) {
|
||||
QLabel* label = qobject_cast<QLabel*>(main_window->statusBar()->children()[i]);
|
||||
if (label) {
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
|
||||
const QPixmap pixmap = label->pixmap();
|
||||
#else
|
||||
const QPixmap pixmap = label->pixmap() ? *label->pixmap() : QPixmap();
|
||||
#endif
|
||||
if (!pixmap.isNull()) {
|
||||
painter->setBrush(QColor::fromRgbF(0, 0, 0, 1.));
|
||||
painter->fillRect(x, painter->device()->height() - pixmap.height() - 5,
|
||||
pixmap.width(), pixmap.height() + 5, QColor::fromRgbF(0, 0, 0, .5));
|
||||
painter->drawPixmap(x + main_window->statusBar()->layout()->spacing() / 2,
|
||||
painter->device()->height() - pixmap.height() - 3, pixmap);
|
||||
x += pixmap.width();
|
||||
if (i <= main_window->statusBar()->children().count() - 3) {
|
||||
painter->fillRect(x, painter->device()->height() - pixmap.height() - 5,
|
||||
main_window->statusBar()->layout()->spacing(), pixmap.height() + 5,
|
||||
QColor::fromRgbF(0, 0, 0, .5));
|
||||
x += main_window->statusBar()->layout()->spacing();
|
||||
} else
|
||||
painter->fillRect(x, painter->device()->height() - pixmap.height() - 4, 4,
|
||||
pixmap.height() + 4, QColor::fromRgbF(0, 0, 0, .5));
|
||||
}
|
||||
}
|
||||
}
|
||||
if (main_window->status->getMessage().isEmpty() == false) {
|
||||
auto curStatusMsg = main_window->status->getMessage();
|
||||
auto textSize = painter->fontMetrics().size(Qt::TextSingleLine, QChar(' ') + curStatusMsg + QChar(' '));
|
||||
painter->setPen(QColor(0, 0, 0, 127));
|
||||
painter->fillRect(painter->device()->width() - textSize.width(), painter->device()->height() - textSize.height(),
|
||||
textSize.width(), textSize.height(), QColor(0, 0, 0, 127));
|
||||
painter->setPen(QColor(255, 255, 255, 255));
|
||||
painter->drawText(QRectF(painter->device()->width() - textSize.width(), painter->device()->height() - textSize.height(),
|
||||
textSize.width(), textSize.height()), Qt::TextSingleLine, QChar(' ') + curStatusMsg + QChar(' '));
|
||||
}
|
||||
painter->setCompositionMode(prevcompositionMode);
|
||||
}
|
||||
|
||||
bool
|
||||
RendererCommon::eventDelegate(QEvent *event, bool &result)
|
||||
{
|
||||
|
||||
@@ -42,6 +42,7 @@ public:
|
||||
|
||||
protected:
|
||||
bool eventDelegate(QEvent *event, bool &result);
|
||||
void drawStatusBarIcons(QPainter* painter);
|
||||
|
||||
QRect source { 0, 0, 0, 0 };
|
||||
QRect destination;
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
|
||||
extern "C" {
|
||||
#include <86box/86box.h>
|
||||
#include <86box/plat.h>
|
||||
#include <86box/video.h>
|
||||
}
|
||||
|
||||
@@ -113,6 +114,7 @@ SoftwareRenderer::onPaint(QPaintDevice *device)
|
||||
#endif
|
||||
painter.setCompositionMode(QPainter::CompositionMode_Plus);
|
||||
painter.drawImage(destination, *images[cur_image], source);
|
||||
if (video_fullscreen && status_icons_fullscreen) drawStatusBarIcons(&painter);
|
||||
}
|
||||
|
||||
std::vector<std::tuple<uint8_t *, std::atomic_flag *>>
|
||||
|
||||
@@ -1997,7 +1997,7 @@ begin:
|
||||
case CDROM_TYPE_NEC_211_100:
|
||||
case CDROM_TYPE_NEC_464_105: /*GPCMD_READ_DISC_INFORMATION_NEC*/
|
||||
scsi_cdrom_set_phase(dev, SCSI_PHASE_DATA_IN);
|
||||
scsi_cdrom_buf_alloc(dev, 22); /*NEC manual claims 4 bytes, but the Android source code (namely sr_vendor.c) actually states otherwise.*/
|
||||
scsi_cdrom_buf_alloc(dev, 22); /* NEC manual claims 4 bytes, but the Linux kernel (namely sr_vendor.c) actually states otherwise. */
|
||||
|
||||
if (!dev->drv->ops) {
|
||||
scsi_cdrom_not_ready(dev);
|
||||
|
||||
@@ -1636,8 +1636,6 @@ static void
|
||||
sb_vibra16_pnp_config_changed(uint8_t ld, isapnp_device_config_t *config, void *priv)
|
||||
{
|
||||
sb_t *sb = (sb_t *) priv;
|
||||
uint16_t addr = sb->dsp.sb_addr;
|
||||
uint8_t val;
|
||||
|
||||
switch (ld) {
|
||||
case 0: /* Audio */
|
||||
|
||||
@@ -60,6 +60,7 @@ extern wchar_t sdl_win_title[512];
|
||||
plat_joystick_t plat_joystick_state[MAX_PLAT_JOYSTICKS];
|
||||
joystick_t joystick_state[MAX_JOYSTICKS];
|
||||
int joysticks_present;
|
||||
int status_icons_fullscreen = 0; /* unused. */
|
||||
SDL_mutex *blitmtx;
|
||||
SDL_threadID eventthread;
|
||||
static int exit_event = 0;
|
||||
|
||||
@@ -964,8 +964,8 @@ ibm8514_accel_out(uint16_t port, uint32_t val, svga_t *svga, int len)
|
||||
if (!val)
|
||||
break;
|
||||
dev->accel.advfunc_cntl = val & 0x0f;
|
||||
dev->on = val & 0x01;
|
||||
vga_on = !dev->on;
|
||||
dev->on[0] = val & 0x01;
|
||||
vga_on = !dev->on[0];
|
||||
ibm8514_log("IBM 8514/A: VGA ON = %i, val = %02x\n", vga_on, val);
|
||||
svga_recalctimings(svga);
|
||||
break;
|
||||
@@ -1200,17 +1200,16 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat
|
||||
|
||||
if (cpu_input) {
|
||||
if ((dev->accel.cmd & 2) || (pixcntl == 2)) {
|
||||
if ((frgd_mix == 2) || (bkgd_mix == 2)) {
|
||||
if ((frgd_mix == 2) || (bkgd_mix == 2))
|
||||
count >>= 3;
|
||||
} else if (pixcntl == 2) {
|
||||
if (dev->accel.cmd & 2) {
|
||||
else if (pixcntl == 2) {
|
||||
if (dev->accel.cmd & 2)
|
||||
count >>= 1;
|
||||
} else
|
||||
else
|
||||
count >>= 3;
|
||||
}
|
||||
} else {
|
||||
} else
|
||||
count >>= 3;
|
||||
}
|
||||
|
||||
if (dev->bpp) {
|
||||
if ((dev->accel.cmd & 0x200) && (count == 2))
|
||||
@@ -1299,7 +1298,8 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat
|
||||
/*Bit 4 of the Command register is the draw yes bit, which enables writing to memory/reading from memory when enabled.
|
||||
When this bit is disabled, no writing to memory/reading from memory is allowed. (This bit is almost meaningless on
|
||||
the NOP command)*/
|
||||
ibm8514_log("CMD8514: CMD=%d, full=%04x, pixcntl=%x, count=%d, frgdmix = %02x, bkgdmix = %02x, polygon=%x.\n", cmd, dev->accel.cmd, pixcntl, count, frgd_mix, bkgd_mix, dev->accel.multifunc[0x0a] & 6);
|
||||
if (dev->accel.cmd == 0x53b1 && !cpu_dat)
|
||||
ibm8514_log("CMD8514: CMD=%d, full=%04x, pixcntl=%x, count=%d, frgdmix = %02x, bkgdmix = %02x, polygon=%x, cpu=%08x, frgdmix=%02x, bkgdmix=%02x.\n", cmd, dev->accel.cmd, pixcntl, count, frgd_mix, bkgd_mix, dev->accel.multifunc[0x0a] & 6, cpu_dat, dev->accel.frgd_mix, dev->accel.bkgd_mix);
|
||||
|
||||
switch (cmd) {
|
||||
case 0: /*NOP (Short Stroke Vectors)*/
|
||||
@@ -4243,7 +4243,7 @@ ibm8514_recalctimings(svga_t *svga)
|
||||
{
|
||||
ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
|
||||
|
||||
if (dev->on) {
|
||||
if (dev->on[0]) {
|
||||
dev->h_disp = (dev->hdisp + 1) << 3;
|
||||
dev->pitch = (dev->accel.advfunc_cntl & 4) ? 1024 : 640;
|
||||
dev->h_total = (dev->htotal + 1);
|
||||
|
||||
@@ -73,16 +73,16 @@ ati68860_ramdac_out(uint16_t addr, uint8_t val, void *priv, svga_t *svga)
|
||||
|
||||
switch (addr) {
|
||||
case 0:
|
||||
svga_out((dev && dev->on) ? 0x2ec : 0x3c8, val, svga);
|
||||
svga_out((dev && (dev->on[0] || dev->on[1])) ? 0x2ec : 0x3c8, val, svga);
|
||||
break;
|
||||
case 1:
|
||||
svga_out((dev && dev->on) ? 0x2ed : 0x3c9, val, svga);
|
||||
svga_out((dev && (dev->on[0] || dev->on[1])) ? 0x2ed : 0x3c9, val, svga);
|
||||
break;
|
||||
case 2:
|
||||
svga_out((dev && dev->on) ? 0x2ea : 0x3c6, val, svga);
|
||||
svga_out((dev && (dev->on[0] || dev->on[1])) ? 0x2ea : 0x3c6, val, svga);
|
||||
break;
|
||||
case 3:
|
||||
svga_out((dev && dev->on) ? 0x2eb : 0x3c7, val, svga);
|
||||
svga_out((dev && (dev->on[0] || dev->on[1])) ? 0x2eb : 0x3c7, val, svga);
|
||||
break;
|
||||
default:
|
||||
ramdac->regs[addr & 0xf] = val;
|
||||
@@ -178,16 +178,16 @@ ati68860_ramdac_in(uint16_t addr, void *priv, svga_t *svga)
|
||||
|
||||
switch (addr) {
|
||||
case 0:
|
||||
temp = svga_in((dev && dev->on) ? 0x2ec : 0x3c8, svga);
|
||||
temp = svga_in((dev && (dev->on[0] || dev->on[1])) ? 0x2ec : 0x3c8, svga);
|
||||
break;
|
||||
case 1:
|
||||
temp = svga_in((dev && dev->on) ? 0x2ed : 0x3c9, svga);
|
||||
temp = svga_in((dev && (dev->on[0] || dev->on[1])) ? 0x2ed : 0x3c9, svga);
|
||||
break;
|
||||
case 2:
|
||||
temp = svga_in((dev && dev->on) ? 0x2ea : 0x3c6, svga);
|
||||
temp = svga_in((dev && (dev->on[0] || dev->on[1])) ? 0x2ea : 0x3c6, svga);
|
||||
break;
|
||||
case 3:
|
||||
temp = svga_in((dev && dev->on) ? 0x2eb : 0x3c7, svga);
|
||||
temp = svga_in((dev && (dev->on[0] || dev->on[1])) ? 0x2eb : 0x3c7, svga);
|
||||
break;
|
||||
case 4:
|
||||
case 8:
|
||||
|
||||
@@ -100,8 +100,8 @@ typedef struct mach_t {
|
||||
uint8_t bank_w;
|
||||
uint8_t bank_r;
|
||||
uint16_t shadow_set;
|
||||
int ext_on;
|
||||
int ati_mode;
|
||||
int ext_on[2];
|
||||
int ati_mode[2];
|
||||
|
||||
struct {
|
||||
uint8_t line_idx;
|
||||
@@ -1140,9 +1140,9 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3
|
||||
mix = 1;
|
||||
break;
|
||||
case 1:
|
||||
if (mach->accel.mono_pattern_enable) {
|
||||
if (mach->accel.mono_pattern_enable)
|
||||
mix = mach->accel.mono_pattern[dev->accel.dy & 7][dev->accel.dx & 7];
|
||||
} else {
|
||||
else {
|
||||
if ((dev->accel_bpp == 24) && (frgd_sel == 5) && (mach->accel.patt_len_reg & 0x4000))
|
||||
mix = 1;
|
||||
else {
|
||||
@@ -1205,18 +1205,16 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3
|
||||
src_dat = cpu_dat;
|
||||
else {
|
||||
READ(dev->accel.src + (dev->accel.cx), src_dat);
|
||||
if (mono_src == 3) {
|
||||
if (mono_src == 3)
|
||||
src_dat = (src_dat & rd_mask) == rd_mask;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 5:
|
||||
if (mix) {
|
||||
if (dev->bpp) {
|
||||
if (dev->bpp)
|
||||
src_dat = mach->accel.color_pattern_word[mach->accel.color_pattern_idx];
|
||||
} else {
|
||||
else
|
||||
src_dat = mach->accel.color_pattern[mach->accel.color_pattern_idx];
|
||||
}
|
||||
} else
|
||||
src_dat = 0;
|
||||
break;
|
||||
@@ -1318,9 +1316,9 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3
|
||||
mach->accel.color_pattern_idx++;
|
||||
if (mach->accel.color_pattern_idx == 3)
|
||||
mach->accel.color_pattern_idx = 0;
|
||||
} else {
|
||||
} else
|
||||
mach->accel.color_pattern_idx = (mach->accel.color_pattern_idx + mach->accel.stepx) & mach->accel.patt_len;
|
||||
}
|
||||
|
||||
} else if ((dev->accel_bpp == 24) && (mach->accel.patt_len_reg & 0x4000) && (frgd_sel == 5)) {
|
||||
mach->accel.color_pattern_idx++;
|
||||
if (mach->accel.color_pattern_idx == 3)
|
||||
@@ -1346,9 +1344,9 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3
|
||||
|
||||
if (dev->bpp)
|
||||
dev->accel.dest = (mach->accel.ge_offset << 1) + (dev->accel.dy * (dev->pitch));
|
||||
else {
|
||||
else
|
||||
dev->accel.dest = (mach->accel.ge_offset << 2) + (dev->accel.dy * (dev->pitch));
|
||||
}
|
||||
|
||||
if ((mono_src == 1) && (dev->accel_bpp == 24) && (frgd_sel == 5))
|
||||
mach->accel.color_pattern_idx = 0;
|
||||
else
|
||||
@@ -2347,7 +2345,7 @@ mach_out(uint16_t addr, uint8_t val, void *priv)
|
||||
mach->bank_r |= ((mach->regs[0xae] & 0x0c) << 2);
|
||||
mach->bank_w |= ((mach->regs[0xae] & 3) << 4);
|
||||
}
|
||||
if (dev->on)
|
||||
if (dev->on[0] || dev->on[1])
|
||||
mach_log("Separate B2Bank = %02x, AEbank = %02x.\n", mach->regs[0xb2], mach->regs[0xae]);
|
||||
} else { /* Single bank mode */
|
||||
mach->bank_w = ((mach->regs[0xb2] & 0x1e) >> 1);
|
||||
@@ -2355,7 +2353,7 @@ mach_out(uint16_t addr, uint8_t val, void *priv)
|
||||
mach->bank_w |= ((mach->regs[0xae] & 3) << 4);
|
||||
}
|
||||
mach->bank_r = mach->bank_w;
|
||||
if (dev->on)
|
||||
if (dev->on[0] || dev->on[1])
|
||||
mach_log("Single B2Bank = %02x, AEbank = %02x.\n", mach->regs[0xb2], mach->regs[0xae]);
|
||||
}
|
||||
svga->read_bank = mach->bank_r << 16;
|
||||
@@ -2590,7 +2588,7 @@ mach_recalctimings(svga_t *svga)
|
||||
if (mach->regs[0xb0] & 0x20)
|
||||
svga->gdcreg[5] |= 0x40;
|
||||
|
||||
if (dev->on) {
|
||||
if (dev->on[0] || dev->on[1]) {
|
||||
mach_log("8514/A ON.\n");
|
||||
if (dev->local >= 2) {
|
||||
dev->h_disp = (dev->hdisp + 1) << 3;
|
||||
@@ -3686,19 +3684,16 @@ mach_accel_out(uint16_t port, uint8_t val, mach_t *mach)
|
||||
|
||||
case 0x4ae8:
|
||||
case 0x4ae9:
|
||||
if (!(port & 1)) {
|
||||
if (dev->local < 2)
|
||||
dev->ext_crt_pitch = 128;
|
||||
if (dev->local < 2)
|
||||
dev->ext_crt_pitch = 128;
|
||||
|
||||
dev->accel.advfunc_cntl = val & 0x0f;
|
||||
} else {
|
||||
dev->on = (dev->accel.advfunc_cntl & 0x01);
|
||||
vga_on = !dev->on;
|
||||
mach->ext_on = dev->on;
|
||||
mach_log("ATI 8514/A: (0x4ae9) val = %04x, ext = %d.\n", dev->accel.advfunc_cntl & 0x01, mach->ext_on);
|
||||
mach32_updatemapping(mach);
|
||||
}
|
||||
mach->ati_mode = 0;
|
||||
WRITE8(port, dev->accel.advfunc_cntl, val);
|
||||
dev->on[port & 1] = (dev->accel.advfunc_cntl & 0x01);
|
||||
mach_log("%04x: ON=%d.\n", port, dev->on[port & 1]);
|
||||
vga_on = !dev->on[port & 1];
|
||||
mach->ext_on[port & 1] = dev->on[port & 1];
|
||||
mach32_updatemapping(mach);
|
||||
mach->ati_mode[port & 1] = 0;
|
||||
svga_recalctimings(svga);
|
||||
break;
|
||||
|
||||
@@ -3806,29 +3801,22 @@ mach_accel_out(uint16_t port, uint8_t val, mach_t *mach)
|
||||
break;
|
||||
|
||||
case 0x42ee:
|
||||
mach->accel.test2[0] = val;
|
||||
break;
|
||||
case 0x42ef:
|
||||
mach->accel.test2[1] = val;
|
||||
mach->accel.test2[port & 1] = val;
|
||||
break;
|
||||
|
||||
case 0x46ee:
|
||||
mach->accel.test3[0] = val;
|
||||
break;
|
||||
case 0x46ef:
|
||||
mach->accel.test3[1] = val;
|
||||
mach->accel.test3[port & 1] = val;
|
||||
break;
|
||||
|
||||
case 0x4aee:
|
||||
case 0x4aef:
|
||||
WRITE8(port, mach->accel.clock_sel, val);
|
||||
if (port & 1) {
|
||||
dev->on = mach->accel.clock_sel & 0x01;
|
||||
mach->ext_on = dev->on;
|
||||
vga_on = !dev->on;
|
||||
mach_log("ATI 8514/A: (0x4aef) val = %04x, ext = %d.\n", mach->accel.clock_sel & 0x01, mach->ext_on);
|
||||
}
|
||||
mach->ati_mode = 1;
|
||||
dev->on[port & 1] = mach->accel.clock_sel & 0x01;
|
||||
mach->ext_on[port & 1] = dev->on[port & 1];
|
||||
vga_on = !dev->on[port & 1];
|
||||
mach->ati_mode[port & 1] = 1;
|
||||
svga_recalctimings(svga);
|
||||
break;
|
||||
|
||||
@@ -3836,16 +3824,14 @@ mach_accel_out(uint16_t port, uint8_t val, mach_t *mach)
|
||||
case 0x52ef:
|
||||
mach_log("ATI 8514/A: (0x%04x) val = %04x.\n", port, val);
|
||||
WRITE8(port, mach->accel.scratch0, val);
|
||||
if (port & 1)
|
||||
mach->ext_on = 1;
|
||||
mach->ext_on[port & 1] = 1;
|
||||
break;
|
||||
|
||||
case 0x56ee:
|
||||
case 0x56ef:
|
||||
mach_log("ATI 8514/A: (0x%04x) val = %04x.\n", port, val);
|
||||
WRITE8(port, mach->accel.scratch1, val);
|
||||
if (port & 1)
|
||||
mach->ext_on = 1;
|
||||
mach->ext_on[port & 1] = 1;
|
||||
break;
|
||||
|
||||
case 0x5aee:
|
||||
@@ -3926,11 +3912,8 @@ mach_accel_out(uint16_t port, uint8_t val, mach_t *mach)
|
||||
break;
|
||||
}
|
||||
svga_set_ramdac_type(svga, !!(mach->accel.ext_ge_config & 0x4000));
|
||||
if (port & 1) {
|
||||
mach->ati_mode = 1;
|
||||
mach_log("ATI 8514/A: (0x%04x) val = %04x.\n", port, val);
|
||||
mach32_updatemapping(mach);
|
||||
}
|
||||
mach->ati_mode[port & 1] = 1;
|
||||
mach32_updatemapping(mach);
|
||||
}
|
||||
svga_recalctimings(svga);
|
||||
break;
|
||||
@@ -5115,10 +5098,12 @@ mach32_updatemapping(mach_t *mach)
|
||||
mach->ap_size = 4;
|
||||
mem_mapping_disable(&mach->mmio_linear_mapping);
|
||||
}
|
||||
if (mach->ext_on && (dev->local >= 2) && mach->ati_mode) {
|
||||
if ((mach->ext_on[0] || mach->ext_on[1]) && (dev->local >= 2) && (mach->ati_mode[0] || mach->ati_mode[1])) {
|
||||
mach_log("ExtON.\n");
|
||||
mem_mapping_set_handler(&svga->mapping, mach32_read, mach32_readw, mach32_readl, mach32_write, mach32_writew, mach32_writel);
|
||||
mem_mapping_set_p(&svga->mapping, mach);
|
||||
} else {
|
||||
mach_log("ExtOFF.\n");
|
||||
mem_mapping_set_handler(&svga->mapping, svga_read, svga_readw, svga_readl, svga_write, svga_writew, svga_writel);
|
||||
mem_mapping_set_p(&svga->mapping, svga);
|
||||
}
|
||||
@@ -5456,7 +5441,8 @@ mach_mca_reset(void *priv)
|
||||
mem_mapping_disable(&mach->bios_rom.mapping);
|
||||
mem_mapping_disable(&mach->bios_rom2.mapping);
|
||||
mach_log("MCA reset.\n");
|
||||
dev->on = 0;
|
||||
dev->on[0] = 0;
|
||||
dev->on[1] = 0;
|
||||
vga_on = 1;
|
||||
mach_mca_write(0x102, 0, mach);
|
||||
}
|
||||
@@ -5564,12 +5550,10 @@ mach32_pci_write(UNUSED(int func), int addr, uint8_t val, void *priv)
|
||||
|
||||
case 0x12:
|
||||
mach->linear_base = (mach->linear_base & 0xff000000) | ((val & 0xc0) << 16);
|
||||
mach->ati_mode = 1;
|
||||
mach32_updatemapping(mach);
|
||||
break;
|
||||
case 0x13:
|
||||
mach->linear_base = (mach->linear_base & 0xc00000) | (val << 24);
|
||||
mach->ati_mode = 1;
|
||||
mach32_updatemapping(mach);
|
||||
break;
|
||||
|
||||
@@ -5722,7 +5706,8 @@ mach8_init(const device_t *info)
|
||||
dev->bpp = 0;
|
||||
svga->getclock = ics2494_getclock;
|
||||
|
||||
dev->on = 0;
|
||||
dev->on[0] = 0;
|
||||
dev->on[1] = 0;
|
||||
dev->ext_pitch = 1024;
|
||||
dev->ext_crt_pitch = 0x80;
|
||||
dev->accel_bpp = 8;
|
||||
|
||||
@@ -212,10 +212,12 @@ svga_out(uint16_t addr, uint8_t val, void *priv)
|
||||
svga_recalctimings(svga);
|
||||
break;
|
||||
case 0x3c3:
|
||||
if (xga_active)
|
||||
if (xga_active && xga)
|
||||
xga->on = (val & 0x01) ? 0 : 1;
|
||||
if (ibm8514_active)
|
||||
dev->on = (val & 0x01) ? 0 : 1;
|
||||
if (ibm8514_active && dev) {
|
||||
dev->on[0] = (val & 0x01) ? 0 : 1;
|
||||
dev->on[1] = dev->on[0];
|
||||
}
|
||||
|
||||
svga_log("3C3: XGA ON = %d.\n", xga->on);
|
||||
vga_on = val & 0x01;
|
||||
@@ -527,7 +529,7 @@ svga_set_ramdac_type(svga_t *svga, int type)
|
||||
svga->ramdac_type = type;
|
||||
|
||||
for (int c = 0; c < 256; c++) {
|
||||
if (ibm8514_active) {
|
||||
if (ibm8514_active && dev) {
|
||||
if (svga->ramdac_type == RAMDAC_8BIT)
|
||||
dev->pallook[c] = makecol32(svga->vgapal[c].r, svga->vgapal[c].g, svga->vgapal[c].b);
|
||||
else
|
||||
@@ -535,7 +537,7 @@ svga_set_ramdac_type(svga_t *svga, int type)
|
||||
(svga->vgapal[c].g & 0x3f) * 4,
|
||||
(svga->vgapal[c].b & 0x3f) * 4);
|
||||
}
|
||||
if (xga_active) {
|
||||
if (xga_active && xga) {
|
||||
if (svga->ramdac_type == RAMDAC_8BIT)
|
||||
xga->pallook[c] = makecol32(svga->vgapal[c].r, svga->vgapal[c].g, svga->vgapal[c].b);
|
||||
else
|
||||
@@ -834,11 +836,11 @@ svga_poll(void *priv)
|
||||
int old_ma;
|
||||
|
||||
if (!svga->override) {
|
||||
if (ibm8514_active && dev->on) {
|
||||
if (ibm8514_active && dev && (dev->on[0] || dev->on[1])) {
|
||||
ibm8514_poll(dev, svga);
|
||||
return;
|
||||
}
|
||||
if (xga_active && xga->on) {
|
||||
if (xga_active && xga && xga->on) {
|
||||
if ((xga->disp_cntl_2 & 7) >= 2) {
|
||||
xga_poll(xga, svga);
|
||||
return;
|
||||
@@ -1253,7 +1255,7 @@ svga_write_common(uint32_t addr, uint8_t val, uint8_t linear, void *priv)
|
||||
cycles -= svga->monitor->mon_video_timing_write_b;
|
||||
|
||||
if (!linear) {
|
||||
if (xga_active) {
|
||||
if (xga_active && xga) {
|
||||
if (((xga->op_mode & 7) >= 4) && (xga->aperture_cntl >= 1)) {
|
||||
if (val == 0xa5) { /*Memory size test of XGA*/
|
||||
xga->test = val;
|
||||
@@ -1474,7 +1476,7 @@ svga_read_common(uint32_t addr, uint8_t linear, void *priv)
|
||||
cycles -= svga->monitor->mon_video_timing_read_b;
|
||||
|
||||
if (!linear) {
|
||||
if (xga_active) {
|
||||
if (xga_active && xga) {
|
||||
if (((xga->op_mode & 7) >= 4) && (xga->aperture_cntl >= 1)) {
|
||||
if (xga->test == 0xa5) { /*Memory size test of XGA*/
|
||||
if (addr == 0xa0001) {
|
||||
|
||||
@@ -1462,7 +1462,7 @@ tgui_accel_command(int count, uint32_t cpu_dat, tgui_t *tgui)
|
||||
}
|
||||
}
|
||||
|
||||
/*See this: https://android.googlesource.com/kernel/tegra/+/android-tegra-flounder-3.10-lollipop-release/drivers/video/tridentfb.c for the pitch*/
|
||||
/* See Linux kernel drivers/video/tridentfb.c for the pitch */
|
||||
tgui->accel.pitch = svga->rowoffset;
|
||||
|
||||
switch (svga->bpp) {
|
||||
|
||||
@@ -76,6 +76,8 @@ int hide_status_bar = 0;
|
||||
int hide_tool_bar = 0;
|
||||
int dpi = 96;
|
||||
|
||||
int status_icons_fullscreen = 0; /* unused. */
|
||||
|
||||
extern char openfilestring[512];
|
||||
extern WCHAR wopenfilestring[512];
|
||||
|
||||
|
||||
Reference in New Issue
Block a user