Merge branch 'master' of https://github.com/86Box/86Box
This commit is contained in:
@@ -194,6 +194,21 @@ main(int argc, char *argv[])
|
|||||||
QApplication::setFont(QFont(font_name, font_size.toInt()));
|
QApplication::setFont(QFont(font_name, font_size.toInt()));
|
||||||
SetCurrentProcessExplicitAppUserModelID(L"86Box.86Box");
|
SetCurrentProcessExplicitAppUserModelID(L"86Box.86Box");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef RELEASE_BUILD
|
||||||
|
app.setWindowIcon(QIcon(":/settings/win/icons/86Box-green.ico"));
|
||||||
|
#elif defined ALPHA_BUILD
|
||||||
|
app.setWindowIcon(QIcon(":/settings/win/icons/86Box-red.ico"));
|
||||||
|
#elif defined BETA_BUILD
|
||||||
|
app.setWindowIcon(QIcon(":/settings/win/icons/86Box-yellow.ico"));
|
||||||
|
#else
|
||||||
|
app.setWindowIcon(QIcon(":/settings/win/icons/86Box-gray.ico"));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (!defined(Q_OS_WINDOWS) && !defined(__APPLE__))
|
||||||
|
app.setDesktopFileName("net.86box.86Box");
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!pc_init_modules()) {
|
if (!pc_init_modules()) {
|
||||||
ui_msgbox_header(MBX_FATAL, (void *) IDS_2121, (void *) IDS_2056);
|
ui_msgbox_header(MBX_FATAL, (void *) IDS_2121, (void *) IDS_2056);
|
||||||
return 6;
|
return 6;
|
||||||
|
@@ -196,15 +196,6 @@ MainWindow::MainWindow(QWidget *parent)
|
|||||||
auto toolbar_label = new QLabel();
|
auto toolbar_label = new QLabel();
|
||||||
ui->toolBar->addWidget(toolbar_label);
|
ui->toolBar->addWidget(toolbar_label);
|
||||||
|
|
||||||
#ifdef RELEASE_BUILD
|
|
||||||
this->setWindowIcon(QIcon(":/settings/win/icons/86Box-green.ico"));
|
|
||||||
#elif defined ALPHA_BUILD
|
|
||||||
this->setWindowIcon(QIcon(":/settings/win/icons/86Box-red.ico"));
|
|
||||||
#elif defined BETA_BUILD
|
|
||||||
this->setWindowIcon(QIcon(":/settings/win/icons/86Box-yellow.ico"));
|
|
||||||
#else
|
|
||||||
this->setWindowIcon(QIcon(":/settings/win/icons/86Box-gray.ico"));
|
|
||||||
#endif
|
|
||||||
this->setWindowFlag(Qt::MSWindowsFixedSizeDialogHint, vid_resize != 1);
|
this->setWindowFlag(Qt::MSWindowsFixedSizeDialogHint, vid_resize != 1);
|
||||||
this->setWindowFlag(Qt::WindowMaximizeButtonHint, vid_resize == 1);
|
this->setWindowFlag(Qt::WindowMaximizeButtonHint, vid_resize == 1);
|
||||||
|
|
||||||
|
@@ -1032,6 +1032,8 @@ mystique_update_irqs(mystique_t *mystique)
|
|||||||
|
|
||||||
if ((mystique->status & mystique->ien) & STATUS_SOFTRAPEN)
|
if ((mystique->status & mystique->ien) & STATUS_SOFTRAPEN)
|
||||||
irq = 1;
|
irq = 1;
|
||||||
|
if ((mystique->status & mystique->ien) & STATUS_VLINEPEN)
|
||||||
|
irq = 1;
|
||||||
if ((mystique->status & STATUS_VSYNCPEN) && (svga->crtc[0x11] & 0x30) == 0x10)
|
if ((mystique->status & STATUS_VSYNCPEN) && (svga->crtc[0x11] & 0x30) == 0x10)
|
||||||
irq = 1;
|
irq = 1;
|
||||||
|
|
||||||
@@ -1442,7 +1444,7 @@ mystique_ctrl_read_b(uint32_t addr, void *priv)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case REG_IEN:
|
case REG_IEN:
|
||||||
ret = mystique->ien & 0x64;
|
ret = mystique->ien & 0x65;
|
||||||
break;
|
break;
|
||||||
case REG_IEN + 1:
|
case REG_IEN + 1:
|
||||||
case REG_IEN + 2:
|
case REG_IEN + 2:
|
||||||
@@ -1985,6 +1987,7 @@ mystique_ctrl_write_b(uint32_t addr, uint8_t val, void *priv)
|
|||||||
switch (addr & 0x3fff) {
|
switch (addr & 0x3fff) {
|
||||||
case REG_ICLEAR:
|
case REG_ICLEAR:
|
||||||
if (val & ICLEAR_SOFTRAPICLR) {
|
if (val & ICLEAR_SOFTRAPICLR) {
|
||||||
|
//pclog("softrapiclr\n");
|
||||||
mystique->status &= ~STATUS_SOFTRAPEN;
|
mystique->status &= ~STATUS_SOFTRAPEN;
|
||||||
mystique_update_irqs(mystique);
|
mystique_update_irqs(mystique);
|
||||||
}
|
}
|
||||||
@@ -2401,7 +2404,7 @@ mystique_accel_ctrl_write_l(uint32_t addr, uint32_t val, void *priv)
|
|||||||
mystique->dma.words_expected = 0;
|
mystique->dma.words_expected = 0;
|
||||||
mystique->endprdmasts_pending = 1;
|
mystique->endprdmasts_pending = 1;
|
||||||
mystique->softrap_pending_val = val;
|
mystique->softrap_pending_val = val;
|
||||||
mystique->softrap_pending = 1;
|
mystique->softrap_pending += 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@@ -2669,6 +2672,11 @@ run_dma(mystique_t *mystique)
|
|||||||
thread_wait_mutex(mystique->dma.lock);
|
thread_wait_mutex(mystique->dma.lock);
|
||||||
|
|
||||||
if (mystique->dma.state == DMA_STATE_IDLE) {
|
if (mystique->dma.state == DMA_STATE_IDLE) {
|
||||||
|
if (!(mystique->status & STATUS_ENDPRDMASTS))
|
||||||
|
{
|
||||||
|
/* Force this to appear. */
|
||||||
|
mystique->endprdmasts_pending = 1;
|
||||||
|
}
|
||||||
thread_release_mutex(mystique->dma.lock);
|
thread_release_mutex(mystique->dma.lock);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -2685,6 +2693,7 @@ run_dma(mystique_t *mystique)
|
|||||||
}
|
}
|
||||||
if (mystique->dma.pri_state == 0 && !mystique->dma.words_expected) {
|
if (mystique->dma.pri_state == 0 && !mystique->dma.words_expected) {
|
||||||
dma_bm_read(mystique->dma.primaddress & DMA_ADDR_MASK, (uint8_t *) &mystique->dma.pri_header, 4, 4);
|
dma_bm_read(mystique->dma.primaddress & DMA_ADDR_MASK, (uint8_t *) &mystique->dma.pri_header, 4, 4);
|
||||||
|
//pclog("DMA header: 0x%08X\n", mystique->dma.pri_header);
|
||||||
mystique->dma.primaddress += 4;
|
mystique->dma.primaddress += 4;
|
||||||
mystique->dma.words_expected = 4;
|
mystique->dma.words_expected = 4;
|
||||||
words_transferred++;
|
words_transferred++;
|
||||||
@@ -2712,7 +2721,12 @@ run_dma(mystique_t *mystique)
|
|||||||
if ((reg_addr & 0x300) == 0x100)
|
if ((reg_addr & 0x300) == 0x100)
|
||||||
mystique->blitter_submit_dma_refcount++;
|
mystique->blitter_submit_dma_refcount++;
|
||||||
|
|
||||||
|
//pclog("DMA value: 0x%08X to reg 0x%04X\n", val, reg_addr);
|
||||||
mystique_accel_ctrl_write_l(reg_addr, val, mystique);
|
mystique_accel_ctrl_write_l(reg_addr, val, mystique);
|
||||||
|
if (reg_addr == REG_SOFTRAP) {
|
||||||
|
mystique->dma.primaddress += 4;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mystique->dma.words_expected)
|
if (mystique->dma.words_expected)
|
||||||
@@ -2723,8 +2737,6 @@ run_dma(mystique_t *mystique)
|
|||||||
mystique->dma.pri_state = (mystique->dma.pri_state + 1) & 3;
|
mystique->dma.pri_state = (mystique->dma.pri_state + 1) & 3;
|
||||||
|
|
||||||
if (mystique->dma.state == DMA_STATE_SEC) {
|
if (mystique->dma.state == DMA_STATE_SEC) {
|
||||||
mystique->dma.pri_state = 0;
|
|
||||||
mystique->dma.words_expected = 0;
|
|
||||||
mystique->dma.sec_state = 0;
|
mystique->dma.sec_state = 0;
|
||||||
}
|
}
|
||||||
else if ((mystique->dma.primaddress & DMA_ADDR_MASK) >= (mystique->dma.primend & DMA_ADDR_MASK)) {
|
else if ((mystique->dma.primaddress & DMA_ADDR_MASK) >= (mystique->dma.primend & DMA_ADDR_MASK)) {
|
||||||
@@ -2756,9 +2768,23 @@ run_dma(mystique_t *mystique)
|
|||||||
if (mystique->dma.sec_state == 0) {
|
if (mystique->dma.sec_state == 0) {
|
||||||
dma_bm_read(mystique->dma.secaddress & DMA_ADDR_MASK, (uint8_t *) &mystique->dma.sec_header, 4, 4);
|
dma_bm_read(mystique->dma.secaddress & DMA_ADDR_MASK, (uint8_t *) &mystique->dma.sec_header, 4, 4);
|
||||||
mystique->dma.secaddress += 4;
|
mystique->dma.secaddress += 4;
|
||||||
|
//pclog("DMA header (secondary): 0x%08X\n", mystique->dma.sec_header);
|
||||||
words_transferred++;
|
words_transferred++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((mystique->dma.secaddress & DMA_ADDR_MASK) >= (mystique->dma.secend & DMA_ADDR_MASK)) {
|
||||||
|
if ((mystique->dma.primaddress & DMA_ADDR_MASK) >= (mystique->dma.primend & DMA_ADDR_MASK)) {
|
||||||
|
mystique->endprdmasts_pending = 1;
|
||||||
|
mystique->dma.state = DMA_STATE_IDLE;
|
||||||
|
mystique->dma.pri_state = 0;
|
||||||
|
mystique->dma.words_expected = 0;
|
||||||
|
} else {
|
||||||
|
mystique->dma.state = DMA_STATE_PRI;
|
||||||
|
mystique->dma.words_expected = 0;
|
||||||
|
mystique->dma.pri_state = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t val;
|
uint32_t val;
|
||||||
uint32_t reg_addr;
|
uint32_t reg_addr;
|
||||||
|
|
||||||
@@ -2775,7 +2801,7 @@ run_dma(mystique_t *mystique)
|
|||||||
mystique->blitter_submit_dma_refcount++;
|
mystique->blitter_submit_dma_refcount++;
|
||||||
|
|
||||||
mystique_accel_ctrl_write_l(reg_addr, val, mystique);
|
mystique_accel_ctrl_write_l(reg_addr, val, mystique);
|
||||||
|
//pclog("DMA value (secondary): 0x%08X\n", val);
|
||||||
mystique->dma.sec_header >>= 8;
|
mystique->dma.sec_header >>= 8;
|
||||||
mystique->dma.sec_state = (mystique->dma.sec_state + 1) & 3;
|
mystique->dma.sec_state = (mystique->dma.sec_state + 1) & 3;
|
||||||
|
|
||||||
@@ -2851,13 +2877,13 @@ fifo_thread(void *priv)
|
|||||||
mystique_t *mystique = (mystique_t *) priv;
|
mystique_t *mystique = (mystique_t *) priv;
|
||||||
|
|
||||||
while (mystique->thread_run) {
|
while (mystique->thread_run) {
|
||||||
|
int words_transferred = 0;
|
||||||
thread_set_event(mystique->fifo_not_full_event);
|
thread_set_event(mystique->fifo_not_full_event);
|
||||||
thread_wait_event(mystique->wake_fifo_thread, -1);
|
thread_wait_event(mystique->wake_fifo_thread, -1);
|
||||||
thread_reset_event(mystique->wake_fifo_thread);
|
thread_reset_event(mystique->wake_fifo_thread);
|
||||||
|
|
||||||
while (!FIFO_EMPTY || mystique->dma.state != DMA_STATE_IDLE) {
|
while (!FIFO_EMPTY || mystique->dma.state != DMA_STATE_IDLE) {
|
||||||
int words_transferred = 0;
|
words_transferred = 0;
|
||||||
|
|
||||||
while (!FIFO_EMPTY && words_transferred < 100) {
|
while (!FIFO_EMPTY && words_transferred < 100) {
|
||||||
fifo_entry_t *fifo = &mystique->fifo[mystique->fifo_read_idx & FIFO_MASK];
|
fifo_entry_t *fifo = &mystique->fifo[mystique->fifo_read_idx & FIFO_MASK];
|
||||||
|
|
||||||
@@ -2884,13 +2910,13 @@ fifo_thread(void *priv)
|
|||||||
|
|
||||||
words_transferred++;
|
words_transferred++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*Only run DMA once the FIFO is empty. Required by
|
|
||||||
Screamer 2 / Rally which will incorrectly clip an ILOAD
|
|
||||||
if DMA runs ahead*/
|
|
||||||
if (!words_transferred)
|
|
||||||
run_dma(mystique);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*Only run DMA once the FIFO is empty. Required by
|
||||||
|
Screamer 2 / Rally which will incorrectly clip an ILOAD
|
||||||
|
if DMA runs ahead*/
|
||||||
|
if (!words_transferred)
|
||||||
|
run_dma(mystique);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2946,12 +2972,16 @@ mystique_softrap_pending_timer(void *priv)
|
|||||||
mystique->status |= STATUS_ENDPRDMASTS;
|
mystique->status |= STATUS_ENDPRDMASTS;
|
||||||
}
|
}
|
||||||
if (mystique->softrap_pending) {
|
if (mystique->softrap_pending) {
|
||||||
mystique->softrap_pending = 0;
|
mystique->softrap_pending--;
|
||||||
|
|
||||||
mystique->dma.secaddress = mystique->softrap_pending_val;
|
mystique->dma.secaddress = mystique->softrap_pending_val;
|
||||||
mystique->status |= STATUS_SOFTRAPEN;
|
mystique->status |= STATUS_SOFTRAPEN;
|
||||||
|
//pclog("softrapen\n");
|
||||||
mystique_update_irqs(mystique);
|
mystique_update_irqs(mystique);
|
||||||
}
|
}
|
||||||
|
/* Force ENDPRDMASTS flag to be set. */
|
||||||
|
if (mystique->dma.state == DMA_STATE_IDLE && !(mystique->status & STATUS_ENDPRDMASTS))
|
||||||
|
wake_fifo_thread(mystique);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
Reference in New Issue
Block a user