mirror of
https://github.com/86Box/86Box.git
synced 2026-02-22 09:35:32 -07:00
Merge remote-tracking branch 'origin/master' into cdrom_changes
This commit is contained in:
@@ -213,6 +213,7 @@ int do_auto_pause = 0; /* (C) Auto-pa
|
||||
int hook_enabled = 1; /* (C) Keyboard hook is enabled */
|
||||
int test_mode = 0; /* (C) Test mode */
|
||||
char uuid[MAX_UUID_LEN] = { '\0' }; /* (C) UUID or machine identifier */
|
||||
int sound_muted = 0; /* (C) Is sound muted? */
|
||||
|
||||
int other_ide_present = 0; /* IDE controllers from non-IDE cards are
|
||||
present */
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#include <wchar.h>
|
||||
#define HAVE_STDARG_H
|
||||
#include <86box/86box.h>
|
||||
#include "cpu.h"
|
||||
#include <86box/timer.h>
|
||||
|
||||
#include <86box/device.h>
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#include <wchar.h>
|
||||
#define HAVE_STDARG_H
|
||||
#include <86box/86box.h>
|
||||
#include "cpu.h"
|
||||
#include <86box/timer.h>
|
||||
|
||||
#include <86box/device.h>
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#include <wchar.h>
|
||||
#define HAVE_STDARG_H
|
||||
#include <86box/86box.h>
|
||||
#include "cpu.h"
|
||||
#include <86box/timer.h>
|
||||
#include <86box/device.h>
|
||||
#include <86box/io.h>
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
#include <86box/io.h>
|
||||
#include <86box/pci.h>
|
||||
#include <86box/pic.h>
|
||||
#include "cpu.h"
|
||||
#include <86box/timer.h>
|
||||
#include <86box/pit.h>
|
||||
#include <86box/device.h>
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
#define HAVE_STDARG_H
|
||||
#include <86box/86box.h>
|
||||
#include <86box/nmi.h>
|
||||
#include "cpu.h"
|
||||
#include <86box/timer.h>
|
||||
#include <86box/pit.h>
|
||||
#include <86box/mem.h>
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#include <86box/86box.h>
|
||||
#include <86box/device.h>
|
||||
#include <86box/io.h>
|
||||
#include "cpu.h"
|
||||
#include <86box/timer.h>
|
||||
#include <86box/dma.h>
|
||||
#include <86box/mem.h>
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#include <86box/86box.h>
|
||||
#include <86box/device.h>
|
||||
#include <86box/io.h>
|
||||
#include "cpu.h"
|
||||
#include <86box/timer.h>
|
||||
|
||||
#include <86box/dma.h>
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#include <86box/86box.h>
|
||||
#include <86box/device.h>
|
||||
#include <86box/io.h>
|
||||
#include "cpu.h"
|
||||
#include <86box/timer.h>
|
||||
#include <86box/dma.h>
|
||||
#include <86box/mem.h>
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#include <86box/86box.h>
|
||||
#include <86box/device.h>
|
||||
#include <86box/io.h>
|
||||
#include "cpu.h"
|
||||
#include <86box/timer.h>
|
||||
#include <86box/dma.h>
|
||||
#include <86box/mem.h>
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#include <86box/86box.h>
|
||||
#include <86box/device.h>
|
||||
#include <86box/io.h>
|
||||
#include "cpu.h"
|
||||
#include <86box/timer.h>
|
||||
#include <86box/dma.h>
|
||||
#include <86box/mem.h>
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#include <86box/86box.h>
|
||||
#include <86box/device.h>
|
||||
#include <86box/io.h>
|
||||
#include "cpu.h"
|
||||
#include <86box/timer.h>
|
||||
#include <86box/dma.h>
|
||||
#include <86box/mem.h>
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
#include <86box/86box.h>
|
||||
#include <86box/device.h>
|
||||
#include <86box/io.h>
|
||||
#include "cpu.h"
|
||||
#include <86box/timer.h>
|
||||
#include <86box/apm.h>
|
||||
#include <86box/machine.h>
|
||||
|
||||
@@ -168,6 +168,7 @@ load_general(void)
|
||||
kbd_req_capture = ini_section_get_int(cat, "kbd_req_capture", 0);
|
||||
hide_status_bar = ini_section_get_int(cat, "hide_status_bar", 0);
|
||||
hide_tool_bar = ini_section_get_int(cat, "hide_tool_bar", 0);
|
||||
sound_muted = ini_section_get_int(cat, "sound_muted", 0);
|
||||
|
||||
confirm_reset = ini_section_get_int(cat, "confirm_reset", 1);
|
||||
confirm_exit = ini_section_get_int(cat, "confirm_exit", 1);
|
||||
@@ -1846,6 +1847,10 @@ save_general(void)
|
||||
|
||||
const char *va_name;
|
||||
|
||||
ini_section_set_int(cat, "sound_muted", sound_muted);
|
||||
if (sound_muted == 0)
|
||||
ini_section_delete_var(cat, "sound_muted");
|
||||
|
||||
ini_section_set_int(cat, "vid_resize", vid_resize);
|
||||
if (vid_resize == 0)
|
||||
ini_section_delete_var(cat, "vid_resize");
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#include <wchar.h>
|
||||
#define HAVE_STDARG_H
|
||||
#include <86box/86box.h>
|
||||
#include "cpu.h"
|
||||
#include <86box/timer.h>
|
||||
#include <86box/plat.h>
|
||||
#include <86box/ui.h>
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
#include <wchar.h>
|
||||
#include <86box/86box.h>
|
||||
#include <86box/device.h>
|
||||
#include "cpu.h"
|
||||
#include <86box/timer.h>
|
||||
#include <86box/fdd.h>
|
||||
#include <86box/machine.h>
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
#define HAVE_STDARG_H
|
||||
#include <86box/86box.h>
|
||||
#include <86box/device.h>
|
||||
#include "cpu.h"
|
||||
#include <86box/timer.h>
|
||||
#include <86box/machine.h>
|
||||
#include <86box/io.h>
|
||||
|
||||
@@ -158,6 +158,7 @@ extern int other_scsi_present; /* SCSI controllers from non-SCSI ca
|
||||
extern int hard_reset_pending;
|
||||
extern int fixed_size_x;
|
||||
extern int fixed_size_y;
|
||||
extern int sound_muted; /* (C) Is sound muted? */
|
||||
extern int do_auto_pause; /* (C) Auto-pause the emulator on focus loss */
|
||||
extern int auto_paused;
|
||||
extern double mouse_sensitivity; /* (C) Mouse sensitivity scale */
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#ifndef _TIMER_H_
|
||||
#define _TIMER_H_
|
||||
|
||||
#include "cpu.h"
|
||||
extern uint64_t tsc;
|
||||
|
||||
/* Maximum period, currently 1 second. */
|
||||
#define MAX_USEC64 1000000ULL
|
||||
|
||||
@@ -213,7 +213,7 @@ typedef struct ibm8514_t {
|
||||
int vdisp2;
|
||||
int disp_cntl;
|
||||
int interlace;
|
||||
uint8_t subsys_cntl;
|
||||
uint16_t subsys_cntl;
|
||||
uint8_t subsys_stat;
|
||||
|
||||
atomic_int fifo_idx;
|
||||
|
||||
@@ -69,6 +69,8 @@ enum {
|
||||
#define VIDEO_FLAG_TYPE_NONE 5
|
||||
#define VIDEO_FLAG_TYPE_MASK 7
|
||||
|
||||
#define VIDEO_FLAG_TYPE_SECONDARY VIDEO_FLAG_TYPE_SPECIAL
|
||||
|
||||
typedef struct video_timings_t {
|
||||
int type;
|
||||
int write_b;
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
#include <86box/fdc_ext.h>
|
||||
#include <86box/hdc.h>
|
||||
#include <86box/hdc_ide.h>
|
||||
#include "cpu.h"
|
||||
#include <86box/timer.h>
|
||||
#include <86box/fdd.h>
|
||||
#include <86box/fdc.h>
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
#include <wchar.h>
|
||||
#define HAVE_STDARG_H
|
||||
#include <86box/86box.h>
|
||||
#include "cpu.h"
|
||||
#include <86box/timer.h>
|
||||
#include <86box/io.h>
|
||||
#include <86box/pic.h>
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
#define HAVE_STDARG_H
|
||||
#include <86box/86box.h>
|
||||
#include <86box/nmi.h>
|
||||
#include "cpu.h"
|
||||
#include <86box/timer.h>
|
||||
#include <86box/pit.h>
|
||||
#include <86box/mem.h>
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
#include <86box/device.h>
|
||||
#include <86box/mem.h>
|
||||
#include <86box/machine.h>
|
||||
#include "cpu.h"
|
||||
#include <86box/timer.h>
|
||||
#include <86box/nvr.h>
|
||||
#include <86box/plat.h>
|
||||
|
||||
BIN
src/qt/icons/sound_mute.ico
Normal file
BIN
src/qt/icons/sound_mute.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 9.4 KiB |
@@ -19,9 +19,6 @@
|
||||
#include "qt_machinestatus.hpp"
|
||||
|
||||
extern "C" {
|
||||
#define EMU_CPU_H // superhack - don't want timer.h to include cpu.h here, and some combo is preventing a compile
|
||||
extern uint64_t tsc;
|
||||
|
||||
#include <86box/hdd.h>
|
||||
#include <86box/timer.h>
|
||||
#include <86box/86box.h>
|
||||
@@ -42,6 +39,7 @@ extern uint64_t tsc;
|
||||
#include <86box/network.h>
|
||||
#include <86box/ui.h>
|
||||
#include <86box/machine_status.h>
|
||||
#include <86box/config.h>
|
||||
};
|
||||
|
||||
#include <QIcon>
|
||||
@@ -92,7 +90,7 @@ struct Pixmaps {
|
||||
PixmapSetEmptyActive mo;
|
||||
PixmapSetActive hd;
|
||||
PixmapSetEmptyActive net;
|
||||
QPixmap sound;
|
||||
QPixmap sound, soundMuted;
|
||||
};
|
||||
|
||||
struct StateActive {
|
||||
@@ -218,6 +216,7 @@ struct MachineStatus::States {
|
||||
pixmaps.hd.load("/hard_disk%1.ico");
|
||||
pixmaps.net.load("/network%1.ico");
|
||||
pixmaps.sound = ProgSettings::loadIcon("/sound.ico").pixmap(pixmap_size);
|
||||
pixmaps.soundMuted = ProgSettings::loadIcon("/sound_mute.ico").pixmap(pixmap_size);
|
||||
|
||||
cartridge[0].pixmaps = &pixmaps.cartridge;
|
||||
cartridge[1].pixmaps = &pixmaps.cartridge;
|
||||
@@ -259,12 +258,19 @@ MachineStatus::MachineStatus(QObject *parent)
|
||||
, refreshTimer(new QTimer(this))
|
||||
{
|
||||
d = std::make_unique<MachineStatus::States>(this);
|
||||
muteUnmuteAction = nullptr;
|
||||
connect(refreshTimer, &QTimer::timeout, this, &MachineStatus::refreshIcons);
|
||||
refreshTimer->start(75);
|
||||
}
|
||||
|
||||
MachineStatus::~MachineStatus() = default;
|
||||
|
||||
void
|
||||
MachineStatus::setSoundGainAction(QAction* action)
|
||||
{
|
||||
soundGainAction = action;
|
||||
}
|
||||
|
||||
bool
|
||||
MachineStatus::hasCassette()
|
||||
{
|
||||
@@ -497,6 +503,28 @@ MachineStatus::refresh(QStatusBar *sbar)
|
||||
}
|
||||
sbar->removeWidget(d->sound.get());
|
||||
|
||||
if (!muteUnmuteAction) {
|
||||
muteUnmuteAction = new QAction;
|
||||
connect(muteUnmuteAction, &QAction::triggered, this, [this]() {
|
||||
sound_muted ^= 1;
|
||||
config_save();
|
||||
if (d->sound)
|
||||
d->sound->setPixmap(sound_muted ? d->pixmaps.soundMuted : d->pixmaps.sound);
|
||||
|
||||
muteUnmuteAction->setText(sound_muted ? tr("&Unmute") : tr("&Mute"));
|
||||
});
|
||||
}
|
||||
|
||||
if (!soundMenu) {
|
||||
soundMenu = new QMenu((QWidget*)parent());
|
||||
|
||||
soundMenu->addAction(muteUnmuteAction);
|
||||
soundMenu->addSeparator();
|
||||
soundMenu->addAction(soundGainAction);
|
||||
|
||||
muteUnmuteAction->setParent(soundMenu);
|
||||
}
|
||||
|
||||
if (cassette_enable) {
|
||||
d->cassette.label = std::make_unique<ClickableLabel>();
|
||||
d->cassette.setEmpty(QString(cassette_fname).isEmpty());
|
||||
@@ -665,12 +693,14 @@ MachineStatus::refresh(QStatusBar *sbar)
|
||||
}
|
||||
|
||||
d->sound = std::make_unique<ClickableLabel>();
|
||||
d->sound->setPixmap(d->pixmaps.sound);
|
||||
|
||||
connect(d->sound.get(), &ClickableLabel::doubleClicked, d->sound.get(), [](QPoint pos) {
|
||||
SoundGain gain(main_window);
|
||||
gain.exec();
|
||||
d->sound->setPixmap(sound_muted ? d->pixmaps.soundMuted : d->pixmaps.sound);
|
||||
if (muteUnmuteAction)
|
||||
muteUnmuteAction->setText(sound_muted ? tr("&Unmute") : tr("&Mute"));
|
||||
|
||||
connect(d->sound.get(), &ClickableLabel::clicked, this, [this](QPoint pos) {
|
||||
this->soundMenu->popup(pos - QPoint(0, this->soundMenu->sizeHint().height()));
|
||||
});
|
||||
|
||||
d->sound->setToolTip(tr("Sound"));
|
||||
sbar->addWidget(d->sound.get());
|
||||
d->text = std::make_unique<QLabel>();
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
#ifndef QT_MACHINESTATUS_HPP
|
||||
#define QT_MACHINESTATUS_HPP
|
||||
|
||||
#include <QAction>
|
||||
#include <QMenu>
|
||||
#include <QWidget>
|
||||
#include <QLabel>
|
||||
#include <QMouseEvent>
|
||||
@@ -71,6 +73,7 @@ public:
|
||||
|
||||
QString getMessage();
|
||||
void clearActivity();
|
||||
void setSoundGainAction(QAction* action);
|
||||
public slots:
|
||||
void refresh(QStatusBar *sbar);
|
||||
void message(const QString &msg);
|
||||
@@ -82,6 +85,9 @@ private:
|
||||
struct States;
|
||||
std::unique_ptr<States> d;
|
||||
QTimer *refreshTimer;
|
||||
QAction *soundGainAction;
|
||||
QAction *muteUnmuteAction;
|
||||
QMenu *soundMenu;
|
||||
};
|
||||
|
||||
#endif // QT_MACHINESTATUS_HPP
|
||||
|
||||
@@ -86,6 +86,7 @@ extern MainWindow *main_window;
|
||||
|
||||
extern "C" {
|
||||
#include <86box/keyboard.h>
|
||||
#include "cpu.h"
|
||||
#include <86box/timer.h>
|
||||
#include <86box/nvr.h>
|
||||
extern int qt_nvr_save(void);
|
||||
|
||||
@@ -48,11 +48,10 @@ extern "C" {
|
||||
#include <86box/machine.h>
|
||||
#include <86box/vid_ega.h>
|
||||
#include <86box/version.h>
|
||||
#if 0
|
||||
#include <86box/acpi.h> /* Requires timer.h include, which conflicts with Qt headers */
|
||||
#endif
|
||||
extern atomic_int acpi_pwrbut_pressed;
|
||||
extern int acpi_enabled;
|
||||
#include <86box/timer.h>
|
||||
#include <86box/apm.h>
|
||||
#include <86box/nvr.h>
|
||||
#include <86box/acpi.h>
|
||||
|
||||
#ifdef USE_VNC
|
||||
# include <86box/vnc.h>
|
||||
@@ -179,6 +178,7 @@ MainWindow::MainWindow(QWidget *parent)
|
||||
extern MainWindow *main_window;
|
||||
main_window = this;
|
||||
ui->setupUi(this);
|
||||
status->setSoundGainAction(ui->actionSound_gain);
|
||||
ui->stackedWidget->setMouseTracking(true);
|
||||
statusBar()->setVisible(!hide_status_bar);
|
||||
statusBar()->setStyleSheet("QStatusBar::item {border: None; } QStatusBar QLabel { margin-right: 2px; margin-bottom: 1px; }");
|
||||
|
||||
@@ -220,9 +220,9 @@ SettingsDisplay::on_comboBoxVideo_currentIndexChanged(int index)
|
||||
int secondaryFlags = video_card_get_flags(c);
|
||||
if (video_card_available(c)
|
||||
&& device_is_valid(video_dev, machineId)
|
||||
&& !((secondaryFlags == primaryFlags) && (secondaryFlags != VIDEO_FLAG_TYPE_SPECIAL))
|
||||
&& !(((primaryFlags == VIDEO_FLAG_TYPE_8514) || (primaryFlags == VIDEO_FLAG_TYPE_XGA)) && (secondaryFlags != VIDEO_FLAG_TYPE_MDA) && (secondaryFlags != VIDEO_FLAG_TYPE_SPECIAL))
|
||||
&& !((primaryFlags != VIDEO_FLAG_TYPE_MDA) && (primaryFlags != VIDEO_FLAG_TYPE_SPECIAL) && ((secondaryFlags == VIDEO_FLAG_TYPE_8514) || (secondaryFlags == VIDEO_FLAG_TYPE_XGA)))) {
|
||||
&& !((secondaryFlags == primaryFlags) && (secondaryFlags != VIDEO_FLAG_TYPE_SECONDARY))
|
||||
&& !(((primaryFlags == VIDEO_FLAG_TYPE_8514) || (primaryFlags == VIDEO_FLAG_TYPE_XGA)) && (secondaryFlags != VIDEO_FLAG_TYPE_MDA) && (secondaryFlags != VIDEO_FLAG_TYPE_SECONDARY))
|
||||
&& !((primaryFlags != VIDEO_FLAG_TYPE_MDA) && (primaryFlags != VIDEO_FLAG_TYPE_SECONDARY) && ((secondaryFlags == VIDEO_FLAG_TYPE_8514) || (secondaryFlags == VIDEO_FLAG_TYPE_XGA)))) {
|
||||
ui->comboBoxVideoSecondary->addItem(name, c);
|
||||
if (c == curVideoCard_2)
|
||||
ui->comboBoxVideoSecondary->setCurrentIndex(ui->comboBoxVideoSecondary->count() - 1);
|
||||
|
||||
@@ -32,13 +32,9 @@ extern "C" {
|
||||
#include <86box/config.h>
|
||||
#include <86box/device.h>
|
||||
#include <86box/machine.h>
|
||||
#include <86box/nvr.h>
|
||||
}
|
||||
|
||||
// from nvr.h, which we can't import into CPP code
|
||||
#define TIME_SYNC_DISABLED 0
|
||||
#define TIME_SYNC_ENABLED 1
|
||||
#define TIME_SYNC_UTC 2
|
||||
|
||||
#include "qt_deviceconfig.hpp"
|
||||
#include "qt_models_common.hpp"
|
||||
|
||||
|
||||
@@ -43,6 +43,7 @@
|
||||
<file>qt/icons/other_removable_devices.ico</file>
|
||||
<file>qt/icons/ports.ico</file>
|
||||
<file>qt/icons/sound.ico</file>
|
||||
<file>qt/icons/sound_mute.ico</file>
|
||||
<file>qt/icons/storage_controllers.ico</file>
|
||||
<file>qt/icons/zip.ico</file>
|
||||
<file>qt/icons/zip_active.ico</file>
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
#define HAVE_STDARG_H
|
||||
#include <86box/86box.h>
|
||||
#include <86box/io.h>
|
||||
#include "cpu.h"
|
||||
#include <86box/timer.h>
|
||||
#include <86box/dma.h>
|
||||
#include <86box/pic.h>
|
||||
|
||||
@@ -278,7 +278,7 @@ givealbuffer_common(const void *buf, const uint8_t src, const int size, const in
|
||||
|
||||
alGetSourcei(source[src], AL_BUFFERS_PROCESSED, &processed);
|
||||
if (processed >= 1) {
|
||||
const double gain = pow(10.0, (double) sound_gain / 20.0);
|
||||
const double gain = sound_muted ? 0.0 : pow(10.0, (double) sound_gain / 20.0);
|
||||
alListenerf(AL_GAIN, (float) gain);
|
||||
|
||||
alSourceUnqueueBuffers(source[src], 1, &buffer);
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
#include <86box/pci.h>
|
||||
#include <86box/snd_ac97.h>
|
||||
#include <86box/sound.h>
|
||||
#include "cpu.h"
|
||||
#include <86box/timer.h>
|
||||
#include <86box/plat_unused.h>
|
||||
#include <86box/snd_akm4531.h>
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
#include <86box/nmi.h>
|
||||
#include <86box/pic.h>
|
||||
#include <86box/sound.h>
|
||||
#include "cpu.h"
|
||||
#include <86box/timer.h>
|
||||
#ifdef USE_GUSMAX
|
||||
# include <86box/snd_ad1848.h>
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
#include <86box/86box.h>
|
||||
#include <86box/sound.h>
|
||||
#include <86box/device.h>
|
||||
#include "cpu.h"
|
||||
#include <86box/timer.h>
|
||||
#include <86box/snd_opl.h>
|
||||
#include <86box/plat_unused.h>
|
||||
|
||||
@@ -46,6 +46,7 @@
|
||||
#define HAVE_STDARG_H
|
||||
#include <86box/86box.h>
|
||||
#include <86box/sound.h>
|
||||
#include "cpu.h"
|
||||
#include <86box/timer.h>
|
||||
#include <86box/device.h>
|
||||
#include <86box/snd_opl.h>
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
#include <86box/pic.h>
|
||||
#include <86box/rom.h>
|
||||
#include <86box/sound.h>
|
||||
#include "cpu.h"
|
||||
#include <86box/timer.h>
|
||||
#include <86box/snd_sb.h>
|
||||
#include <86box/plat_unused.h>
|
||||
|
||||
@@ -245,7 +245,7 @@ givealbuffer_common(const void *buf, IXAudio2SourceVoice *sourcevoice, const siz
|
||||
if (!initialized)
|
||||
return;
|
||||
|
||||
(void) IXAudio2MasteringVoice_SetVolume(mastervoice, pow(10.0, (double) sound_gain / 20.0),
|
||||
(void) IXAudio2MasteringVoice_SetVolume(mastervoice, sound_muted ? 0.0 : pow(10.0, (double) sound_gain / 20.0),
|
||||
XAUDIO2_COMMIT_NOW);
|
||||
XAUDIO2_BUFFER buffer = { 0 };
|
||||
buffer.Flags = 0;
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
#include <string.h>
|
||||
#include <wchar.h>
|
||||
#include <86box/86box.h>
|
||||
#include "cpu.h"
|
||||
#include <86box/timer.h>
|
||||
#include <86box/nv/vid_nv_rivatimer.h>
|
||||
|
||||
|
||||
@@ -38,6 +38,7 @@
|
||||
#include <86box/device.h>
|
||||
#include <86box/gameport.h>
|
||||
#include <86box/unix_sdl.h>
|
||||
#include "cpu.h"
|
||||
#include <86box/timer.h>
|
||||
#include <86box/nvr.h>
|
||||
#include <86box/version.h>
|
||||
|
||||
@@ -715,27 +715,13 @@ ibm8514_accel_out(uint16_t port, uint32_t val, svga_t *svga, int len)
|
||||
break;
|
||||
|
||||
case 0x42e8:
|
||||
if (val & 0x01)
|
||||
dev->subsys_stat &= ~0x01;
|
||||
if (val & 0x02)
|
||||
dev->subsys_stat &= ~0x02;
|
||||
if (val & 0x04)
|
||||
dev->subsys_stat &= ~0x04;
|
||||
if (val & 0x08)
|
||||
dev->subsys_stat &= ~0x08;
|
||||
ibm8514_log("VBLANK stat=%02x, val=%02x.\n", dev->subsys_stat, val);
|
||||
dev->subsys_cntl = (dev->subsys_cntl & 0xff00) | val;
|
||||
dev->subsys_stat &= ~val;
|
||||
break;
|
||||
case 0x42e9:
|
||||
dev->subsys_cntl = val;
|
||||
if (val & 0x01)
|
||||
dev->subsys_stat |= 0x01;
|
||||
if (val & 0x02)
|
||||
dev->subsys_stat |= 0x02;
|
||||
if (val & 0x04)
|
||||
dev->subsys_stat |= 0x04;
|
||||
if (val & 0x08)
|
||||
dev->subsys_stat |= 0x08;
|
||||
|
||||
if ((val & 0xc0) == 0xc0) {
|
||||
dev->subsys_cntl = (dev->subsys_cntl & 0xff) | (val << 8);
|
||||
if ((val & 0xc0) == 0x80) {
|
||||
dev->fifo_idx = 0;
|
||||
dev->force_busy = 0;
|
||||
dev->force_busy2 = 0;
|
||||
@@ -882,10 +868,10 @@ ibm8514_accel_in(uint16_t port, svga_t *svga)
|
||||
|
||||
switch (port) {
|
||||
case 0x2e8:
|
||||
if (dev->vc == dev->v_syncstart)
|
||||
if (dev->vc == dev->dispend)
|
||||
temp |= 0x02;
|
||||
|
||||
ibm8514_log("0x2E8 read: Display Status=%02x.\n", temp);
|
||||
ibm8514_log("Read: Display Status1=%02x.\n", temp);
|
||||
break;
|
||||
|
||||
case 0x6e8:
|
||||
@@ -910,21 +896,25 @@ ibm8514_accel_in(uint16_t port, svga_t *svga)
|
||||
|
||||
case 0x42e8:
|
||||
case 0x42e9:
|
||||
if (dev->vc == dev->v_syncstart)
|
||||
dev->subsys_stat |= 0x01;
|
||||
if ((dev->subsys_cntl & 0x01) && !(dev->subsys_stat & 0x01) && (dev->vc == dev->dispend))
|
||||
temp |= 0x01;
|
||||
|
||||
if (cmd == 6) {
|
||||
if ((dev->accel.dx >= clip_l) &&
|
||||
if ((dev->subsys_cntl & 0x02) &&
|
||||
!(dev->subsys_stat & 0x02) &&
|
||||
(dev->accel.dx >= clip_l) &&
|
||||
(dev->accel.dx <= clip_r_ibm) &&
|
||||
(dev->accel.dy >= clip_t) &&
|
||||
(dev->accel.dy <= clip_b_ibm))
|
||||
dev->subsys_stat |= 0x02;
|
||||
temp |= 0x02;
|
||||
} else {
|
||||
if ((dev->accel.cx >= clip_l) &&
|
||||
if ((dev->subsys_cntl & 0x02) &&
|
||||
!(dev->subsys_stat & 0x02) &&
|
||||
(dev->accel.cx >= clip_l) &&
|
||||
(dev->accel.cx <= clip_r_ibm) &&
|
||||
(dev->accel.cy >= clip_t) &&
|
||||
(dev->accel.cy <= clip_b_ibm))
|
||||
dev->subsys_stat |= 0x02;
|
||||
temp |= 0x02;
|
||||
}
|
||||
|
||||
if (!dev->fifo_idx) {
|
||||
@@ -932,9 +922,10 @@ ibm8514_accel_in(uint16_t port, svga_t *svga)
|
||||
temp |= 0x08;
|
||||
}
|
||||
|
||||
if (port & 1)
|
||||
if (port & 1) {
|
||||
temp = dev->vram_512k_8514 ? 0x00 : 0x80;
|
||||
else {
|
||||
temp |= (dev->subsys_cntl >> 8);
|
||||
} else {
|
||||
temp |= (dev->subsys_stat | (dev->vram_512k_8514 ? 0x00 : 0x80));
|
||||
temp |= 0x20;
|
||||
}
|
||||
@@ -1155,6 +1146,7 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat
|
||||
(dev->accel.cx <= clip_r) &&
|
||||
(dev->accel.cy >= clip_t) &&
|
||||
(dev->accel.cy <= clip_b)) {
|
||||
dev->subsys_stat |= 0x02;
|
||||
switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) {
|
||||
case 0:
|
||||
src_dat = bkgd_color;
|
||||
@@ -1250,6 +1242,7 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat
|
||||
(dev->accel.cx <= clip_r) &&
|
||||
(dev->accel.cy >= clip_t) &&
|
||||
(dev->accel.cy <= clip_b)) {
|
||||
dev->subsys_stat |= 0x02;
|
||||
switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) {
|
||||
case 0:
|
||||
src_dat = bkgd_color;
|
||||
@@ -1385,6 +1378,7 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat
|
||||
(dev->accel.cx <= clip_r) &&
|
||||
(dev->accel.cy >= clip_t) &&
|
||||
(dev->accel.cy <= clip_b)) {
|
||||
dev->subsys_stat |= 0x02;
|
||||
if (ibm8514_cpu_dest(svga) && (pixcntl == 0)) {
|
||||
mix_dat = mix_mask; /* Mix data = forced to foreground register. */
|
||||
} else if (ibm8514_cpu_dest(svga) && (pixcntl == 3)) {
|
||||
@@ -1543,6 +1537,7 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat
|
||||
(dev->accel.cx <= clip_r) &&
|
||||
(dev->accel.cy >= clip_t) &&
|
||||
(dev->accel.cy <= clip_b)) {
|
||||
dev->subsys_stat |= 0x02;
|
||||
if (ibm8514_cpu_dest(svga)) {
|
||||
READ((dev->accel.cy * dev->pitch) + dev->accel.cx, src_dat);
|
||||
} else
|
||||
@@ -1634,6 +1629,7 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat
|
||||
(dev->accel.cx <= clip_r) &&
|
||||
(dev->accel.cy >= clip_t) &&
|
||||
(dev->accel.cy <= clip_b)) {
|
||||
dev->subsys_stat |= 0x02;
|
||||
if (ibm8514_cpu_dest(svga) && (pixcntl == 0)) {
|
||||
mix_dat = mix_mask; /* Mix data = forced to foreground register. */
|
||||
} else if (ibm8514_cpu_dest(svga) && (pixcntl == 3)) {
|
||||
@@ -1832,6 +1828,7 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat
|
||||
(dev->accel.cx <= clip_r) &&
|
||||
(dev->accel.cy >= clip_t) &&
|
||||
(dev->accel.cy <= clip_b)) {
|
||||
dev->subsys_stat |= 0x02;
|
||||
switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) {
|
||||
case 0:
|
||||
src_dat = bkgd_color;
|
||||
@@ -1989,6 +1986,7 @@ skip_vector_rect_write:
|
||||
(dev->accel.cx <= clip_r) &&
|
||||
(dev->accel.cy >= clip_t) &&
|
||||
(dev->accel.cy <= clip_b)) {
|
||||
dev->subsys_stat |= 0x02;
|
||||
if (ibm8514_cpu_dest(svga) && (pixcntl == 0)) {
|
||||
mix_dat = mix_mask; /* Mix data = forced to foreground register. */
|
||||
} else if (ibm8514_cpu_dest(svga) && (pixcntl == 3)) {
|
||||
@@ -2150,6 +2148,7 @@ skip_nibble_rect_write:
|
||||
(dev->accel.cx <= clip_r) &&
|
||||
(dev->accel.cy >= clip_t) &&
|
||||
(dev->accel.cy <= clip_b)) {
|
||||
dev->subsys_stat |= 0x02;
|
||||
switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) {
|
||||
case 0:
|
||||
src_dat = bkgd_color;
|
||||
@@ -2232,6 +2231,7 @@ skip_nibble_rect_write:
|
||||
(dev->accel.cx <= clip_r) &&
|
||||
(dev->accel.cy >= clip_t) &&
|
||||
(dev->accel.cy <= clip_b)) {
|
||||
dev->subsys_stat |= 0x02;
|
||||
switch ((mix_dat & 0x01) ? frgd_mix : bkgd_mix) {
|
||||
case 0:
|
||||
src_dat = bkgd_color;
|
||||
@@ -2313,6 +2313,7 @@ skip_nibble_rect_write:
|
||||
(dev->accel.cx <= clip_r) &&
|
||||
(dev->accel.cy >= clip_t) &&
|
||||
(dev->accel.cy <= clip_b)) {
|
||||
dev->subsys_stat |= 0x02;
|
||||
switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) {
|
||||
case 0:
|
||||
src_dat = bkgd_color;
|
||||
@@ -2424,6 +2425,7 @@ skip_nibble_rect_write:
|
||||
(dev->accel.cx <= clip_r) &&
|
||||
(dev->accel.cy >= clip_t) &&
|
||||
(dev->accel.cy <= clip_b)) {
|
||||
dev->subsys_stat |= 0x02;
|
||||
switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) {
|
||||
case 0:
|
||||
src_dat = bkgd_color;
|
||||
@@ -2546,6 +2548,7 @@ skip_nibble_rect_write:
|
||||
(dev->accel.cx <= clip_r) &&
|
||||
(dev->accel.cy >= clip_t) &&
|
||||
(dev->accel.cy <= clip_b)) {
|
||||
dev->subsys_stat |= 0x02;
|
||||
switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) {
|
||||
case 0:
|
||||
src_dat = bkgd_color;
|
||||
@@ -2650,9 +2653,10 @@ skip_nibble_rect_write:
|
||||
dev->accel.cx = CLAMP(dev->accel.cx, clip_l, clip_r);
|
||||
|
||||
if ((dev->accel.cx >= clip_l) &&
|
||||
(dev->accel.cx < clip_r) &&
|
||||
(dev->accel.cx <= clip_r) &&
|
||||
(dev->accel.cy >= clip_t) &&
|
||||
(dev->accel.cy <= clip_b)) {
|
||||
dev->subsys_stat |= 0x02;
|
||||
switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) {
|
||||
case 0:
|
||||
src_dat = bkgd_color;
|
||||
@@ -2811,6 +2815,7 @@ skip_nibble_rect_write:
|
||||
(dev->accel.dx <= clip_r) &&
|
||||
(dev->accel.dy >= clip_t) &&
|
||||
(dev->accel.dy <= clip_b)) {
|
||||
dev->subsys_stat |= 0x02;
|
||||
if (pixcntl == 3) {
|
||||
if (!(dev->accel.cmd & 0x10) && ((frgd_mix != 3) || (bkgd_mix != 3))) {
|
||||
READ(dev->accel.src + dev->accel.cx, mix_dat);
|
||||
@@ -2978,6 +2983,7 @@ skip_nibble_bitblt_write:
|
||||
(dev->accel.dx <= clip_r) &&
|
||||
(dev->accel.dy >= clip_t) &&
|
||||
(dev->accel.dy <= clip_b)) {
|
||||
dev->subsys_stat |= 0x02;
|
||||
switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) {
|
||||
case 0:
|
||||
src_dat = bkgd_color;
|
||||
@@ -3075,6 +3081,7 @@ skip_nibble_bitblt_write:
|
||||
(dev->accel.dx <= clip_r) &&
|
||||
(dev->accel.dy >= clip_t) &&
|
||||
(dev->accel.dy <= clip_b)) {
|
||||
dev->subsys_stat |= 0x02;
|
||||
switch ((mix_dat & 0x01) ? frgd_mix : bkgd_mix) {
|
||||
case 0:
|
||||
src_dat = bkgd_color;
|
||||
@@ -3174,6 +3181,7 @@ skip_nibble_bitblt_write:
|
||||
(dx <= (((uint64_t)clip_r) * 3)) &&
|
||||
(dev->accel.dy >= (clip_t << 1)) &&
|
||||
(dev->accel.dy <= (clip_b << 1))) {
|
||||
dev->subsys_stat |= 0x02;
|
||||
|
||||
READ(dev->accel.src + cx, src_dat);
|
||||
READ(dev->accel.dest + dx, dest_dat);
|
||||
@@ -3196,6 +3204,7 @@ skip_nibble_bitblt_write:
|
||||
(dev->accel.dx <= clip_r) &&
|
||||
(dev->accel.dy >= clip_t) &&
|
||||
(dev->accel.dy <= clip_b)) {
|
||||
dev->subsys_stat |= 0x02;
|
||||
if (pixcntl == 3) {
|
||||
if (!(dev->accel.cmd & 0x10) && ((frgd_mix != 3) || (bkgd_mix != 3))) {
|
||||
READ(dev->accel.src + dev->accel.cx, mix_dat);
|
||||
@@ -3704,6 +3713,8 @@ ibm8514_poll(void *priv)
|
||||
dev->vc &= 0xfff;
|
||||
|
||||
if (dev->vc == dev->dispend) {
|
||||
dev->subsys_stat |= 0x01;
|
||||
ibm8514_log("VBLANK irq.\n");
|
||||
dev->dispon = 0;
|
||||
|
||||
for (x = 0; x < ((dev->vram_mask + 1) >> 12); x++) {
|
||||
|
||||
@@ -70,20 +70,19 @@ void
|
||||
ati68860_ramdac_out(uint16_t addr, uint8_t val, void *priv, svga_t *svga)
|
||||
{
|
||||
ati68860_ramdac_t *ramdac = (ati68860_ramdac_t *) priv;
|
||||
const ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
|
||||
|
||||
switch (addr) {
|
||||
case 0:
|
||||
svga_out((dev && dev->on) ? 0x2ec : 0x3c8, val, svga);
|
||||
svga_out(0x3c8, val, svga);
|
||||
break;
|
||||
case 1:
|
||||
svga_out((dev && dev->on) ? 0x2ed : 0x3c9, val, svga);
|
||||
svga_out(0x3c9, val, svga);
|
||||
break;
|
||||
case 2:
|
||||
svga_out((dev && dev->on) ? 0x2ea : 0x3c6, val, svga);
|
||||
svga_out(0x3c6, val, svga);
|
||||
break;
|
||||
case 3:
|
||||
svga_out((dev && dev->on) ? 0x2eb : 0x3c7, val, svga);
|
||||
svga_out(0x3c7, val, svga);
|
||||
break;
|
||||
default:
|
||||
ramdac->regs[addr & 0xf] = val;
|
||||
@@ -176,21 +175,20 @@ uint8_t
|
||||
ati68860_ramdac_in(uint16_t addr, void *priv, svga_t *svga)
|
||||
{
|
||||
const ati68860_ramdac_t *ramdac = (ati68860_ramdac_t *) priv;
|
||||
const ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
|
||||
uint8_t temp = 0;
|
||||
|
||||
switch (addr) {
|
||||
case 0:
|
||||
temp = svga_in((dev && dev->on) ? 0x2ec : 0x3c8, svga);
|
||||
temp = svga_in(0x3c8, svga);
|
||||
break;
|
||||
case 1:
|
||||
temp = svga_in((dev && dev->on) ? 0x2ed : 0x3c9, svga);
|
||||
temp = svga_in(0x3c9, svga);
|
||||
break;
|
||||
case 2:
|
||||
temp = svga_in((dev && dev->on) ? 0x2ea : 0x3c6, svga);
|
||||
temp = svga_in(0x3c6, svga);
|
||||
break;
|
||||
case 3:
|
||||
temp = svga_in((dev && dev->on) ? 0x2eb : 0x3c7, svga);
|
||||
temp = svga_in(0x3c7, svga);
|
||||
break;
|
||||
case 4:
|
||||
case 8:
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
#include <86box/device.h>
|
||||
#include <86box/io.h>
|
||||
#include <86box/mem.h>
|
||||
#include "cpu.h"
|
||||
#include <86box/timer.h>
|
||||
#include <86box/pci.h>
|
||||
#include <86box/rom.h>
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
#include <86box/device.h>
|
||||
#include <86box/io.h>
|
||||
#include <86box/mem.h>
|
||||
#include "cpu.h"
|
||||
#include <86box/timer.h>
|
||||
#include <86box/mca.h>
|
||||
#include <86box/pci.h>
|
||||
@@ -437,6 +438,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3
|
||||
(dev->accel.dx <= clip_r) &&
|
||||
(dev->accel.dy >= clip_t) &&
|
||||
(dev->accel.dy <= clip_b)) {
|
||||
dev->subsys_stat |= 0x02;
|
||||
switch (mix ? frgd_sel : bkgd_sel) {
|
||||
case 0:
|
||||
src_dat = dev->accel.bkgd_color;
|
||||
@@ -660,6 +662,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3
|
||||
(dev->accel.dx <= clip_r) &&
|
||||
(dev->accel.dy >= clip_t) &&
|
||||
(dev->accel.dy <= clip_b)) {
|
||||
dev->subsys_stat |= 0x02;
|
||||
switch (mix ? frgd_sel : bkgd_sel) {
|
||||
case 0:
|
||||
src_dat = dev->accel.bkgd_color;
|
||||
@@ -1066,6 +1069,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3
|
||||
(dev->accel.dx <= clip_r) &&
|
||||
(dev->accel.dy >= clip_t) &&
|
||||
(dev->accel.dy <= clip_b)) {
|
||||
dev->subsys_stat |= 0x02;
|
||||
if (mach->accel.dp_config & 0x02) {
|
||||
READ(dev->accel.src + dev->accel.cx, poly_src);
|
||||
poly_src = ((poly_src & rd_mask) == rd_mask);
|
||||
@@ -1307,6 +1311,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3
|
||||
(dev->accel.cx <= clip_r) &&
|
||||
(dev->accel.cy >= clip_t) &&
|
||||
(dev->accel.cy <= clip_b)) {
|
||||
dev->subsys_stat |= 0x02;
|
||||
mach->accel.clip_overrun = 0;
|
||||
switch (mix ? frgd_sel : bkgd_sel) {
|
||||
case 0:
|
||||
@@ -1440,6 +1445,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3
|
||||
(dev->accel.cx <= clip_r) &&
|
||||
(dev->accel.cy >= clip_t) &&
|
||||
(dev->accel.cy <= clip_b)) {
|
||||
dev->subsys_stat |= 0x02;
|
||||
mach->accel.clip_overrun = 0;
|
||||
if (mach->accel.linedraw_opt & 0x02) {
|
||||
if (dev->bpp) {
|
||||
@@ -1598,6 +1604,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3
|
||||
(dev->accel.cx <= clip_r) &&
|
||||
(dev->accel.cy >= clip_t) &&
|
||||
(dev->accel.cy <= clip_b)) {
|
||||
dev->subsys_stat |= 0x02;
|
||||
mach->accel.clip_overrun = 0;
|
||||
switch (mix ? frgd_sel : bkgd_sel) {
|
||||
case 0:
|
||||
@@ -1732,6 +1739,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3
|
||||
(dev->accel.cx <= clip_r) &&
|
||||
(dev->accel.cy >= clip_t) &&
|
||||
(dev->accel.cy <= clip_b)) {
|
||||
dev->subsys_stat |= 0x02;
|
||||
mach->accel.clip_overrun = 0;
|
||||
switch (mix ? frgd_sel : bkgd_sel) {
|
||||
case 0:
|
||||
@@ -2027,6 +2035,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3
|
||||
(dev->accel.dx <= clip_r) &&
|
||||
(dev->accel.dy >= clip_t) &&
|
||||
(dev->accel.dy <= clip_b)) {
|
||||
dev->subsys_stat |= 0x02;
|
||||
switch (mix ? frgd_sel : bkgd_sel) {
|
||||
case 0:
|
||||
src_dat = dev->accel.bkgd_color;
|
||||
@@ -2332,6 +2341,7 @@ mach_out(uint16_t addr, uint8_t val, void *priv)
|
||||
case 0x2ed:
|
||||
rs2 = !!(mach->accel.ext_ge_config & 0x1000);
|
||||
rs3 = !!(mach->accel.ext_ge_config & 0x2000);
|
||||
mach_log("8514/A RS2=%d, RS3=%d, addr=%03x.\n", rs2, rs3, addr);
|
||||
if ((dev->local & 0xff) >= 0x02) {
|
||||
if (mach->regs[0xb0] & 0x20) { /*ATI extended 8514/A mode.*/
|
||||
mach_log("Extended 8514/A mode.\n");
|
||||
@@ -2340,10 +2350,14 @@ mach_out(uint16_t addr, uint8_t val, void *priv)
|
||||
svga_recalctimings(svga);
|
||||
mach32_updatemapping(mach, svga);
|
||||
}
|
||||
if (mach->pci_bus && !mach->ramdac_type)
|
||||
ati68860_ramdac_out((addr & 0x03) | (rs2 << 2) | (rs3 << 3), val, svga->ramdac, svga);
|
||||
else
|
||||
ati68875_ramdac_out(addr, rs2, rs3, val, svga->ramdac, svga);
|
||||
if (dev->on)
|
||||
svga_out(addr, val, svga);
|
||||
else {
|
||||
if (mach->pci_bus && !mach->ramdac_type)
|
||||
ati68860_ramdac_out((addr & 0x03) | (rs2 << 2) | (rs3 << 3), val, svga->ramdac, svga);
|
||||
else
|
||||
ati68875_ramdac_out(addr, rs2, rs3, val, svga->ramdac, svga);
|
||||
}
|
||||
} else
|
||||
svga_out(addr, val, svga);
|
||||
return;
|
||||
@@ -2354,6 +2368,7 @@ mach_out(uint16_t addr, uint8_t val, void *priv)
|
||||
case 0x3C9:
|
||||
rs2 = !!(mach->regs[0xa0] & 0x20);
|
||||
rs3 = !!(mach->regs[0xa0] & 0x40);
|
||||
mach_log("VGA RS2=%d, RS3=%d, addr=%03x.\n", rs2, rs3, addr);
|
||||
if ((dev->local & 0xff) >= 0x02) {
|
||||
if (svga->attrregs[0x10] & 0x40) {
|
||||
mach_log("VGA mode.\n");
|
||||
@@ -2362,10 +2377,14 @@ mach_out(uint16_t addr, uint8_t val, void *priv)
|
||||
svga_recalctimings(svga);
|
||||
mach32_updatemapping(mach, svga);
|
||||
}
|
||||
if (mach->pci_bus && !mach->ramdac_type)
|
||||
ati68860_ramdac_out((addr & 0x03) | (rs2 << 2) | (rs3 << 3), val, svga->ramdac, svga);
|
||||
else
|
||||
ati68875_ramdac_out(addr, rs2, rs3, val, svga->ramdac, svga);
|
||||
if (dev->on)
|
||||
svga_out(addr, val, svga);
|
||||
else {
|
||||
if (mach->pci_bus && !mach->ramdac_type)
|
||||
ati68860_ramdac_out((addr & 0x03) | (rs2 << 2) | (rs3 << 3), val, svga->ramdac, svga);
|
||||
else
|
||||
ati68875_ramdac_out(addr, rs2, rs3, val, svga->ramdac, svga);
|
||||
}
|
||||
} else
|
||||
svga_out(addr, val, svga);
|
||||
return;
|
||||
@@ -2480,10 +2499,14 @@ mach_in(uint16_t addr, void *priv)
|
||||
rs2 = !!(mach->accel.ext_ge_config & 0x1000);
|
||||
rs3 = !!(mach->accel.ext_ge_config & 0x2000);
|
||||
if ((dev->local & 0xff) >= 0x02) {
|
||||
if (mach->pci_bus && !mach->ramdac_type)
|
||||
temp = ati68860_ramdac_in((addr & 3) | (rs2 << 2) | (rs3 << 3), svga->ramdac, svga);
|
||||
else
|
||||
temp = ati68875_ramdac_in(addr, rs2, rs3, svga->ramdac, svga);
|
||||
if (dev->on)
|
||||
temp = svga_in(addr, svga);
|
||||
else {
|
||||
if (mach->pci_bus && !mach->ramdac_type)
|
||||
temp = ati68860_ramdac_in((addr & 3) | (rs2 << 2) | (rs3 << 3), svga->ramdac, svga);
|
||||
else
|
||||
temp = ati68875_ramdac_in(addr, rs2, rs3, svga->ramdac, svga);
|
||||
}
|
||||
} else
|
||||
temp = svga_in(addr, svga);
|
||||
break;
|
||||
@@ -3406,7 +3429,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u
|
||||
static void
|
||||
mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8514_t *dev)
|
||||
{
|
||||
if (port != 0x42e8 && port != 0x42e9)
|
||||
if (port == 0x42e8 || port == 0x42e9)
|
||||
mach_log("[%04X:%08X]: Port CALL OUT=%04x, val=%02x.\n", CS, cpu_state.pc, port, val);
|
||||
|
||||
switch (port) {
|
||||
@@ -3421,7 +3444,7 @@ mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8
|
||||
break;
|
||||
case 0x42e9:
|
||||
ibm8514_accel_out(port, val, svga, 2);
|
||||
if ((val & 0xc0) == 0xc0) {
|
||||
if ((val & 0xc0) == 0x80) {
|
||||
dev->ext_fifo_idx = 0;
|
||||
mach->force_busy = 0;
|
||||
}
|
||||
@@ -3512,6 +3535,11 @@ mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8
|
||||
svga_recalctimings(svga);
|
||||
break;
|
||||
|
||||
case 0x46e8:
|
||||
case 0x46e9:
|
||||
mach_log("0x%04x write: VGA subsystem enable add-on=%02x.\n", port, val);
|
||||
break;
|
||||
|
||||
case 0x4ae8:
|
||||
dev->accel.advfunc_cntl = val;
|
||||
dev->on = dev->accel.advfunc_cntl & 0x01;
|
||||
@@ -4200,6 +4228,7 @@ mach_accel_in_call(uint16_t port, mach_t *mach, svga_t *svga, ibm8514_t *dev)
|
||||
|
||||
switch (port) {
|
||||
case 0x2e8:
|
||||
case 0x2e9:
|
||||
case 0x6e8:
|
||||
case 0x22e8:
|
||||
case 0x26e8:
|
||||
@@ -4211,18 +4240,22 @@ mach_accel_in_call(uint16_t port, mach_t *mach, svga_t *svga, ibm8514_t *dev)
|
||||
|
||||
case 0x42e8:
|
||||
case 0x42e9:
|
||||
if (dev->vc == dev->v_syncstart)
|
||||
if ((dev->subsys_cntl & 0x01) && !(dev->subsys_stat & 0x01) && (dev->vc == dev->dispend))
|
||||
temp |= 0x01;
|
||||
|
||||
if (mach->accel.cmd_type == -1) {
|
||||
if (cmd == 6) {
|
||||
if ((dev->accel.dx >= clip_l) &&
|
||||
if ((dev->subsys_cntl & 0x02) &&
|
||||
!(dev->subsys_stat & 0x02) &&
|
||||
(dev->accel.dx >= clip_l) &&
|
||||
(dev->accel.dx <= clip_r_ibm) &&
|
||||
(dev->accel.dy >= clip_t) &&
|
||||
(dev->accel.dy <= clip_b_ibm))
|
||||
temp |= 0x02;
|
||||
} else {
|
||||
if ((dev->accel.cx >= clip_l) &&
|
||||
if ((dev->subsys_cntl & 0x02) &&
|
||||
!(dev->subsys_stat & 0x02) &&
|
||||
(dev->accel.cx >= clip_l) &&
|
||||
(dev->accel.cx <= clip_r_ibm) &&
|
||||
(dev->accel.cy >= clip_t) &&
|
||||
(dev->accel.cy <= clip_b_ibm))
|
||||
@@ -4233,7 +4266,9 @@ mach_accel_in_call(uint16_t port, mach_t *mach, svga_t *svga, ibm8514_t *dev)
|
||||
case 1:
|
||||
case 2:
|
||||
case 5:
|
||||
if ((dev->accel.dx >= clip_l) &&
|
||||
if ((dev->subsys_cntl & 0x02) &&
|
||||
!(dev->subsys_stat & 0x02) &&
|
||||
(dev->accel.dx >= clip_l) &&
|
||||
(dev->accel.dx <= clip_r) &&
|
||||
(dev->accel.dy >= clip_t) &&
|
||||
(dev->accel.dy <= clip_b))
|
||||
@@ -4241,7 +4276,9 @@ mach_accel_in_call(uint16_t port, mach_t *mach, svga_t *svga, ibm8514_t *dev)
|
||||
break;
|
||||
case 3:
|
||||
case 4:
|
||||
if ((dev->accel.cx >= clip_l) &&
|
||||
if ((dev->subsys_cntl & 0x02) &&
|
||||
!(dev->subsys_stat & 0x02) &&
|
||||
(dev->accel.cx >= clip_l) &&
|
||||
(dev->accel.cx <= clip_r) &&
|
||||
(dev->accel.cy >= clip_t) &&
|
||||
(dev->accel.cy <= clip_b))
|
||||
@@ -4256,16 +4293,17 @@ mach_accel_in_call(uint16_t port, mach_t *mach, svga_t *svga, ibm8514_t *dev)
|
||||
if ((!dev->force_busy && !dev->force_busy2) || !mach->force_busy)
|
||||
temp |= 0x08;
|
||||
}
|
||||
if (port & 1)
|
||||
if (port & 1) {
|
||||
temp = dev->vram_512k_8514 ? 0x00 : 0x80;
|
||||
else {
|
||||
temp |= (dev->subsys_cntl >> 8);
|
||||
} else {
|
||||
temp |= (dev->subsys_stat | (dev->vram_512k_8514 ? 0x00 : 0x80));
|
||||
if (mach->accel.ext_ge_config & 0x08)
|
||||
temp |= ((mach->accel.ext_ge_config & 0x07) << 4);
|
||||
else
|
||||
temp |= 0x20;
|
||||
}
|
||||
mach_log("0x%04x read: Subsystem Status=%02x.\n", port, temp);
|
||||
mach_log("0x%04x read: Subsystem Status=%02x, monitoralias=%02x.\n", port, temp, mach->accel.ext_ge_config & 0x07);
|
||||
break;
|
||||
|
||||
/*ATI Mach8/32 specific registers*/
|
||||
@@ -4402,7 +4440,8 @@ mach_accel_in_call(uint16_t port, mach_t *mach, svga_t *svga, ibm8514_t *dev)
|
||||
default:
|
||||
break;
|
||||
}
|
||||
mach_log("[%04X:%08X]: Port NORMAL IN=%04x, temp=%04x.\n", CS, cpu_state.pc, port, temp);
|
||||
if (port == 0x2ee8 || port == 0x2ee9 || port == 0x42e8 || port == 0x42e9)
|
||||
mach_log("[%04X:%08X]: Port NORMAL IN=%04x, temp=%04x.\n", CS, cpu_state.pc, port, temp);
|
||||
|
||||
return temp;
|
||||
}
|
||||
@@ -5418,6 +5457,10 @@ mach32_updatemapping(mach_t *mach, svga_t *svga)
|
||||
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 {
|
||||
if (!dev->on) {
|
||||
memset(dev->vram, 0, dev->vram_size);
|
||||
memset(dev->changedvram, 0, (dev->vram_size >> 12) + 1);
|
||||
}
|
||||
mach_log("IBM compatible banked mapping.\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);
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
#include <86box/mem.h>
|
||||
#include <86box/rom.h>
|
||||
#include <86box/device.h>
|
||||
#include "cpu.h"
|
||||
#include <86box/timer.h>
|
||||
#include <86box/video.h>
|
||||
#include <86box/vid_svga.h>
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
#include <stdatomic.h>
|
||||
#include <86box/86box.h>
|
||||
#include <86box/io.h>
|
||||
#include "cpu.h"
|
||||
#include <86box/timer.h>
|
||||
#include <86box/mem.h>
|
||||
#include <86box/pci.h>
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
#include <86box/io.h>
|
||||
#include <86box/video.h>
|
||||
#include <86box/86box.h>
|
||||
#include "cpu.h"
|
||||
#include <86box/timer.h>
|
||||
#include <86box/mem.h>
|
||||
#include <86box/pit.h>
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
#include <86box/io.h>
|
||||
#include <86box/video.h>
|
||||
#include <86box/86box.h>
|
||||
#include "cpu.h"
|
||||
#include <86box/timer.h>
|
||||
#include <86box/mem.h>
|
||||
#include <86box/pit.h>
|
||||
|
||||
@@ -141,10 +141,10 @@ video_cards[] = {
|
||||
{ .device = &chips_69000_device, .flags = VIDEO_FLAG_TYPE_NONE },
|
||||
{ .device = &gd5430_pci_device, .flags = VIDEO_FLAG_TYPE_NONE },
|
||||
{ .device = &gd5434_pci_device, .flags = VIDEO_FLAG_TYPE_NONE },
|
||||
{ .device = &gd5436_pci_device, .flags = VIDEO_FLAG_TYPE_SPECIAL },
|
||||
{ .device = &gd5436_pci_device, .flags = VIDEO_FLAG_TYPE_SECONDARY },
|
||||
{ .device = &gd5440_pci_device, .flags = VIDEO_FLAG_TYPE_NONE },
|
||||
{ .device = &gd5446_pci_device, .flags = VIDEO_FLAG_TYPE_SPECIAL },
|
||||
{ .device = &gd5446_stb_pci_device, .flags = VIDEO_FLAG_TYPE_SPECIAL },
|
||||
{ .device = &gd5446_pci_device, .flags = VIDEO_FLAG_TYPE_SECONDARY },
|
||||
{ .device = &gd5446_stb_pci_device, .flags = VIDEO_FLAG_TYPE_SECONDARY },
|
||||
{ .device = &gd5480_pci_device, .flags = VIDEO_FLAG_TYPE_NONE },
|
||||
{ .device = &et4000w32p_videomagic_revb_pci_device, .flags = VIDEO_FLAG_TYPE_NONE },
|
||||
{ .device = &et4000w32p_revc_pci_device, .flags = VIDEO_FLAG_TYPE_NONE },
|
||||
|
||||
Reference in New Issue
Block a user