Merge branch 'master' into pc98x1

This commit is contained in:
TC1995
2024-07-28 19:51:07 +02:00
14 changed files with 131 additions and 119 deletions

View File

@@ -561,9 +561,6 @@ static void
fdc_rate(fdc_t *fdc, int drive)
{
fdc_update_rate(fdc, drive);
#if 0
fdc_log("FDD %c: Setting rate: %i, %i, %i (%i, %i)\n", 0x41 + drive, fdc->drvrate[drive], fdc->rate, fdc_get_densel(fdc, drive), fdc->rwc[drive], fdc->densel_force);
#endif
fdc_log("FDD %c: [%i] Setting rate: %i, %i, %i (%i, %i, %i)\n", 0x41 + drive, fdc->enh_mode, fdc->drvrate[drive], fdc->rate, fdc_get_densel(fdc, drive), fdc->rwc[drive], fdc->densel_force, fdc->densel_polarity);
fdd_set_densel(fdc_get_densel(fdc, drive));
fdc_log("FDD %c: [%i] Densel: %i\n", 0x41 + drive, fdc->enh_mode, fdc_get_densel(fdc, drive));
@@ -596,17 +593,6 @@ fdc_bad_command(fdc_t *fdc)
static void
fdc_io_command_phase1(fdc_t *fdc, int out)
{
#if 0
int i;
pclog_toggle_suppr();
pclog("%02X ", fdc->processed_cmd);
for (i = 0; i < fdc->pnum; i++)
pclog("%02X ", fdc->params[i]);
pclog("\n");
pclog_toggle_suppr();
#endif
fifo_reset(fdc->fifo_p);
fdc_rate(fdc, fdc->drive);
fdc->head = fdc->params[2];
@@ -1125,9 +1111,6 @@ fdc_write(uint16_t addr, uint8_t val, void *priv)
fdc->stat = (1 << fdc->drive);
if (!(fdc->flags & FDC_FLAG_PCJR))
fdc->stat |= 0x80;
#if 0
fdc->head = (fdc->params[0] & 4) ? 1 : 0;
#endif
fdc->head = 0; /* TODO: See if this is correct. */
fdc->st0 = fdc->params[0] & 0x03;
fdc->st0 |= (fdc->params[0] & 4);
@@ -1418,7 +1401,6 @@ fdc_read(uint16_t addr, void *priv)
default:
ret = 0xFF;
}
// fdc_log("Read FDC %04X %02X\n", addr, ret);
fdc_log("[%04X:%08X] Read FDC %04X %02X [%i:%02X]\n", CS, cpu_state.pc, addr, ret, drive, fdc->dor & (0x10 << drive));
return ret;
}
@@ -1628,8 +1610,10 @@ fdc_callback(void *priv)
if (fdc->sector == fdc->params[5]) {
/* Reached end of track, MT bit is clear */
if (!(fdc->command & 0x80)) {
fdc->rw_track++;
fdc->sector = 1;
if (fdc->dma) {
fdc->rw_track++;
fdc->sector = 1;
}
if (!(fdc->flags & FDC_FLAG_PCJR) && fdc->dma && (old_sector == 255))
fdc_no_dma_end(fdc, compare);
else
@@ -1638,10 +1622,12 @@ fdc_callback(void *priv)
}
/* Reached end of track, MT bit is set, head is 1 */
if (fdd_get_head(real_drive(fdc, fdc->drive)) == 1) {
fdc->rw_track++;
fdc->sector = 1;
fdc->head &= 0xFE;
fdd_set_head(real_drive(fdc, fdc->drive), 0);
if (fdc->dma) {
fdc->rw_track++;
fdc->sector = 1;
fdc->head &= 0xFE;
fdd_set_head(real_drive(fdc, fdc->drive), 0);
}
if (!(fdc->flags & FDC_FLAG_PCJR) && fdc->dma && (old_sector == 255))
fdc_no_dma_end(fdc, compare);
else
@@ -1649,8 +1635,6 @@ fdc_callback(void *priv)
return;
}
if (fdd_get_head(real_drive(fdc, fdc->drive)) == 0) {
fdc->sector = 1;
fdc->head |= 1;
fdd_set_head(real_drive(fdc, fdc->drive), 1);
if (!fdd_is_double_sided(real_drive(fdc, fdc->drive))) {
fdc_noidam(fdc);
@@ -1659,6 +1643,8 @@ fdc_callback(void *priv)
}
} else if (fdc->sector < fdc->params[5])
fdc->sector++;
else if (fdc->params[5] == 0)
fdc->sector++;
ui_sb_update_icon(SB_FLOPPY | real_drive(fdc, fdc->drive), 1);
switch (fdc->interrupt) {
case 5:
@@ -1811,7 +1797,6 @@ void
fdc_error(fdc_t *fdc, int st5, int st6)
{
dma_set_drq(fdc->dma_ch, 0);
#if 1
timer_disable(&fdc->timer);
fdc_int(fdc, 1);
@@ -1823,6 +1808,10 @@ fdc_error(fdc_t *fdc, int st5, int st6)
fdc->st0 |= 0x08;
fdc->res[5] = st5;
fdc->res[6] = st6;
if (fdc->wrong_am) {
fdc->res[6] |= 0x40;
fdc->wrong_am = 0;
}
fdc_log("FDC Error: %02X %02X %02X\n", fdc->res[4], fdc->res[5], fdc->res[6]);
switch (fdc->interrupt) {
case 0x02:
@@ -1848,48 +1837,6 @@ fdc_error(fdc_t *fdc, int st5, int st6)
}
ui_sb_update_icon(SB_FLOPPY | real_drive(fdc, fdc->drive), 0);
fdc->paramstogo = 7;
#else
switch (fdc->interrupt) {
case 0x02:
case 0x05:
case 0x06:
case 0x09:
case 0x0C:
case 0x11:
case 0x16:
case 0x19:
case 0x1D:
fdc->error = 1;
fdc->st5 = st5;
fdc->st6 = st6;
fdc->tc = 1;
fdc->stat = 0x10;
fdc_callback(fdc);
break;
default:
timer_disable(&fdc->timer);
fdc_int(fdc, 1);
if (!(fdc->flags & FDC_FLAG_PS1))
fdc->fintr = 0;
fdc->stat = 0xD0;
fdc->st0 = fdc->res[4] = 0x40 | (fdd_get_head(real_drive(fdc, fdc->drive)) ? 4 : 0) | fdc->rw_drive;
if (fdc->head && !fdd_is_double_sided(real_drive(fdc, fdc->drive)))
fdc->st0 |= 0x08;
fdc->res[5] = st5;
fdc->res[6] = st6;
fdc_log("FDC Error: %02X %02X %02X\n", fdc->res[4], fdc->res[5], fdc->res[6]);
fdc->res[7] = 0;
fdc->res[8] = 0;
fdc->res[9] = 0;
fdc->res[10] = 0;
ui_sb_update_icon(SB_FLOPPY | real_drive(fdc, fdc->drive), 0);
fdc->paramstogo = 7;
break;
}
#endif
}
void

View File

@@ -1298,7 +1298,16 @@ d86f_find_address_mark_fm(int drive, int side, find_t *find, uint16_t req_am, ui
find->sync_pos = 0xFFFFFFFF;
if (ignore_other_am & 1) {
/* Skip mode, let's go back to finding ID. */
dev->state -= 2;
fdc_set_wrong_am(d86f_fdc);
dev->data_find.sync_marks = dev->data_find.bits_obtained = dev->data_find.bytes_obtained = 0;
dev->error_condition = 0;
dev->state = STATE_IDLE;
if (dev->state == STATE_02_READ_DATA)
fdc_track_finishread(d86f_fdc, dev->error_condition);
else if (dev->state == STATE_11_SCAN_DATA)
fdc_sector_finishcompare(d86f_fdc, (dev->satisfying_bytes == ((128 << ((uint32_t) dev->last_sector.id.n)) - 1)) ? 1 : 0);
else
fdc_sector_finishread(d86f_fdc);
} else {
/* Not skip mode, process the sector anyway. */
fdc_set_wrong_am(d86f_fdc);
@@ -1377,7 +1386,16 @@ d86f_find_address_mark_mfm(int drive, int side, find_t *find, uint16_t req_am, u
find->sync_pos = 0xFFFFFFFF;
if (ignore_other_am & 1) {
/* Skip mode, let's go back to finding ID. */
dev->state -= 2;
fdc_set_wrong_am(d86f_fdc);
dev->data_find.sync_marks = dev->data_find.bits_obtained = dev->data_find.bytes_obtained = 0;
dev->error_condition = 0;
dev->state = STATE_IDLE;
if (dev->state == STATE_02_READ_DATA)
fdc_track_finishread(d86f_fdc, dev->error_condition);
else if (dev->state == STATE_11_SCAN_DATA)
fdc_sector_finishcompare(d86f_fdc, (dev->satisfying_bytes == ((128 << ((uint32_t) dev->last_sector.id.n)) - 1)) ? 1 : 0);
else
fdc_sector_finishread(d86f_fdc);
} else {
/* Not skip mode, process the sector anyway. */
fdc_set_wrong_am(d86f_fdc);

View File

@@ -120,7 +120,7 @@ typedef struct fdc_t {
uint8_t params[15];
uint8_t specify[2];
uint8_t res[11];
uint8_t eot[4];
uint16_t eot[4];
uint8_t rwc[4];
uint16_t pcn[4];

View File

@@ -37,6 +37,7 @@ extern void port_92_add(void *priv);
extern void port_92_remove(void *priv);
extern const device_t port_92_device;
extern const device_t port_92_key_device;
extern const device_t port_92_inv_device;
extern const device_t port_92_word_device;
extern const device_t port_92_pci_device;

View File

@@ -2333,7 +2333,7 @@ machine_at_genoa486_init(const machine_t *model)
machine_at_common_init(model);
device_add(&compaq_genoa_device);
device_add(&port_92_device);
device_add(&port_92_key_device);
device_add(&keyboard_at_ami_device);

View File

@@ -465,22 +465,22 @@ vid_poll(void *priv)
buffer32->line[l][ef_x + 2] = buffer32->line[l][ef_x + 3] =
buffer32->line[l + 1][ef_x] = buffer32->line[l + 1][ef_x + 1] =
buffer32->line[l + 1][ef_x + 2] = buffer32->line[l + 1][ef_x + 3] =
pcjr->array[((dat >> 12) & pcjr->array[1]) + 16] + 16;
pcjr->array[((dat >> 12) & pcjr->array[1] & 0x0f) + 16] + 16;
buffer32->line[l][ef_x + 4] = buffer32->line[l][ef_x + 5] =
buffer32->line[l][ef_x + 6] = buffer32->line[l][ef_x + 7] =
buffer32->line[l + 1][(x << 4) + 12] = buffer32->line[l + 1][(x << 4) + 13] =
buffer32->line[l + 1][(x << 4) + 14] = buffer32->line[l + 1][(x << 4) + 15] =
pcjr->array[((dat >> 8) & pcjr->array[1]) + 16] + 16;
buffer32->line[l + 1][ef_x + 4] = buffer32->line[l + 1][ef_x + 5] =
buffer32->line[l + 1][ef_x + 6] = buffer32->line[l + 1][ef_x + 7] =
pcjr->array[((dat >> 8) & pcjr->array[1] & 0x0f) + 16] + 16;
buffer32->line[l][ef_x + 8] = buffer32->line[l][ef_x + 9] =
buffer32->line[l][ef_x + 10] = buffer32->line[l][ef_x + 11] =
buffer32->line[l + 1][ef_x + 8] = buffer32->line[l + 1][ef_x + 9] =
buffer32->line[l + 1][ef_x + 10] = buffer32->line[l + 1][ef_x + 11] =
pcjr->array[((dat >> 4) & pcjr->array[1]) + 16] + 16;
pcjr->array[((dat >> 4) & pcjr->array[1] & 0x0f) + 16] + 16;
buffer32->line[l][ef_x + 12] = buffer32->line[l][ef_x + 13] =
buffer32->line[l][ef_x + 14] = buffer32->line[l][ef_x + 15] =
buffer32->line[l + 1][ef_x + 12] = buffer32->line[l + 1][ef_x + 13] =
buffer32->line[l + 1][ef_x + 14] = buffer32->line[l + 1][ef_x + 15] =
pcjr->array[(dat & pcjr->array[1]) + 16] + 16;
pcjr->array[(dat & pcjr->array[1] & 0x0f) + 16] + 16;
}
break;
case 0x03: /*640x200x4*/

View File

@@ -14,7 +14,8 @@
* The DOSBox Team
*
* Copyright 2024 Cacodemon345
* Copyright 2002-2021 The DOSBox Team
* Copyright (C) 2022 The DOSBox Staging Team
* Copyright (C) 2002-2021 The DOSBox Team
*/
#include <stdarg.h>

View File

@@ -54,9 +54,7 @@
#include <stdlib.h>
#include <wchar.h>
#include <time.h>
#ifndef _WIN32
# include <sys/time.h>
#endif /* _WIN32 */
#include <sys/time.h>
#include <stdbool.h>
#define HAVE_STDARG_H
#include <86box/86box.h>
@@ -122,8 +120,7 @@ int network_ndev;
netdev_t network_devs[NET_HOST_INTF_MAX];
/* Local variables. */
#if defined ENABLE_NETWORK_LOG && !defined(_WIN32)
#ifdef ENABLE_NETWORK_LOG
int network_do_log = ENABLE_NETWORK_LOG;
static FILE *network_dump = NULL;
static mutex_t *network_dump_mutex;
@@ -149,9 +146,15 @@ network_dump_packet(netpkt_t *pkt)
struct timeval tv;
gettimeofday(&tv, NULL);
struct {
uint32_t ts_sec, ts_usec, incl_len, orig_len;
uint32_t ts_sec;
uint32_t ts_usec;
uint32_t incl_len;
uint32_t orig_len;
} pcap_packet_hdr = {
tv.tv_sec, tv.tv_usec, pkt->len, pkt->len
.ts_sec = tv.tv_sec,
.ts_usec = tv.tv_usec,
.incl_len = pkt->len,
.orig_len = pkt->len
};
if (network_dump_mutex)
@@ -165,8 +168,9 @@ network_dump_packet(netpkt_t *pkt)
if ((written = fwrite(pkt->data, 1, pkt->len, network_dump)) < pkt->len) {
network_log("NETWORK: failed to write dump packet data\n");
fseek(network_dump, -written - sizeof(pcap_packet_hdr), SEEK_CUR);
} else {
fflush(network_dump);
}
fflush(network_dump);
}
if (network_dump_mutex)
@@ -219,28 +223,41 @@ network_init(void)
#ifdef HAS_VDE
// Try to load the VDE plug library
if(net_vde_prepare()==0) {
if (!net_vde_prepare())
network_devmap.has_vde = 1;
}
#endif
#if defined ENABLE_NETWORK_LOG && !defined(_WIN32)
#ifdef ENABLE_NETWORK_LOG
/* Start packet dump. */
network_dump = fopen("network.pcap", "wb");
struct {
uint32_t magic_number;
uint16_t version_major, version_minor;
int32_t thiszone;
uint32_t sigfigs, snaplen, network;
} pcap_hdr = {
0xa1b2c3d4,
2, 4,
0,
0, 65535, 1
};
fwrite(&pcap_hdr, sizeof(pcap_hdr), 1, network_dump);
fflush(network_dump);
if (network_dump) {
struct {
uint32_t magic_number;
uint16_t version_major;
uint16_t version_minor;
int32_t thiszone;
uint32_t sigfigs;
uint32_t snaplen;
uint32_t network;
} pcap_hdr = {
.magic_number = 0xa1b2c3d4,
.version_major = 2,
.version_minor = 4,
.thiszone = 0,
.sigfigs = 0,
.snaplen = 65535,
.network = 1
};
if (fwrite(&pcap_hdr, 1, sizeof(pcap_hdr), network_dump) < sizeof(pcap_hdr)) {
network_log("NETWORK: failed to write dump header\n");
fclose(network_dump);
network_dump = NULL;
} else {
fflush(network_dump);
}
} else {
network_log("NETWORK: failed to open dump file\n");
}
#endif
}
@@ -297,10 +314,8 @@ network_queue_put_swap(netqueue_t *queue, netpkt_t *src_pkt)
network_log("Discarded zero length packet.\n");
} else if (src_pkt->len > NET_MAX_FRAME) {
network_log("Discarded oversized packet of len=%d.\n", src_pkt->len);
network_dump_packet(src_pkt);
} else {
network_log("Discarded %d bytes packet because the queue is full.\n", src_pkt->len);
network_dump_packet(src_pkt);
}
#endif
return 0;
@@ -444,8 +459,9 @@ network_attach(void *card_drv, uint8_t *mac, NETRXCB rx, NETSETLINKSTATE set_lin
network_queue_init(&card->queues[i]);
}
if (!strcmp(network_card_get_internal_name(net_cards_conf[net_card_current].device_num), "modem") && net_type >= NET_TYPE_PCAP) {
/* Force SLiRP here. Modem only operates on non-Ethernet frames. */
if ((!strcmp(network_card_get_internal_name(net_cards_conf[net_card_current].device_num), "modem") ||
!strcmp(network_card_get_internal_name(net_cards_conf[net_card_current].device_num), "plip")) && (net_type >= NET_TYPE_PCAP)) {
/* Force SLiRP here. Modem and PLIP only operate on non-Ethernet frames. */
net_type = NET_TYPE_SLIRP;
}
@@ -501,7 +517,7 @@ network_attach(void *card_drv, uint8_t *mac, NETRXCB rx, NETSETLINKSTATE set_lin
free(card->queued_pkt.data);
free(card);
// Placeholder - insert the error message
fatal("Error initializing the network device: Null driver initialization failed");
fatal("Error initializing the network device: Null driver initialization failed\n");
return NULL;
}
@@ -533,7 +549,7 @@ netcard_close(netcard_t *card)
void
network_close(void)
{
#if defined ENABLE_NETWORK_LOG && !defined(_WIN32)
#ifdef ENABLE_NETWORK_LOG
thread_close_mutex(network_dump_mutex);
network_dump_mutex = NULL;
#endif
@@ -554,7 +570,7 @@ network_reset(void)
{
ui_sb_update_icon(SB_NETWORK, 0);
#if defined ENABLE_NETWORK_LOG && !defined(_WIN32)
#ifdef ENABLE_NETWORK_LOG
network_dump_mutex = thread_create_mutex();
#endif
@@ -598,6 +614,7 @@ network_tx_popv(netcard_t *card, netpkt_t *pkt_vec, int vec_size)
for (int i = 0; i < vec_size; i++) {
if (!network_queue_get_swap(queue, pkt_vec))
break;
network_dump_packet(pkt_vec);
pkt_count++;
pkt_vec++;
}

View File

@@ -36,6 +36,7 @@
#define PORT_92_PCI 4
#define PORT_92_RESET 8
#define PORT_92_A20 16
#define PORT_92_KEY 32
static uint8_t
port_92_readb(uint16_t port, void *priv)
@@ -46,7 +47,10 @@ port_92_readb(uint16_t port, void *priv)
if (port == 0x92) {
/* Return bit 1 directly from mem_a20_alt, so the
pin can be reset independently of the device. */
ret = (dev->reg & ~0x03) | (mem_a20_alt & 2) | (cpu_alt_reset & 1);
if (dev->flags & PORT_92_KEY)
ret = (dev->reg & ~0x03) | (mem_a20_key & 2) | (cpu_alt_reset & 1);
else
ret = (dev->reg & ~0x03) | (mem_a20_alt & 2) | (cpu_alt_reset & 1);
if (dev->flags & PORT_92_INV)
ret |= 0xfc;
@@ -94,8 +98,11 @@ port_92_writeb(uint16_t port, uint8_t val, void *priv)
dev->reg = val & 0x03;
if ((mem_a20_alt ^ val) & 2) {
mem_a20_alt = (val & 2);
if (dev->flags & PORT_92_KEY) {
mem_a20_key = val & 2;
mem_a20_recalc();
} else if ((mem_a20_alt ^ val) & 2) {
mem_a20_alt = (mem_a20_alt & 0xfd) | (val & 2);
mem_a20_recalc();
}
@@ -234,6 +241,20 @@ const device_t port_92_device = {
.config = NULL
};
const device_t port_92_key_device = {
.name = "Port 92 Register (using A20 key)",
.internal_name = "port_92_key",
.flags = 0,
.local = PORT_92_KEY,
.init = port_92_init,
.close = port_92_close,
.reset = NULL,
{ .available = NULL },
.speed_changed = NULL,
.force_redraw = NULL,
.config = NULL
};
const device_t port_92_inv_device = {
.name = "Port 92 Register (inverted bits 2-7)",
.internal_name = "port_92_inv",

BIN
src/qt/icons/warning.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

View File

@@ -61,7 +61,7 @@ SettingsMachine::SettingsMachine(QWidget *parent)
break;
}
auto warning_icon = ui->softFloatWarningIcon->style()->standardIcon(QStyle::SP_MessageBoxWarning);
auto warning_icon = QIcon(":/misc/qt/icons/warning.ico");
ui->softFloatWarningIcon->setPixmap(warning_icon.pixmap(warning_icon.actualSize(QSize(16, 16))));
ui->softFloatWarningIcon->setVisible(false);
ui->softFloatWarningText->setVisible(false);

View File

@@ -63,6 +63,9 @@
<file>qt/icons/send_cae.ico</file>
<file>qt/icons/settings.ico</file>
</qresource>
<qresource prefix="/misc">
<file>qt/icons/warning.ico</file>
</qresource>
<qresource prefix="/">
<file alias="/texture_vert.spv">qt/texture_vert.spv</file>
<file alias="/texture_frag.spv">qt/texture_frag.spv</file>

View File

@@ -640,8 +640,12 @@ ui_msgbox_header(int flags, void *header, void *message)
SDL_MessageBoxData msgdata;
SDL_MessageBoxButtonData msgbtn;
if (!header)
header = (void *) ((flags & MBX_ANSI) ? "86Box" : L"86Box");
if (!header) {
if (flags & MBX_ANSI)
header = (void *) "86Box";
else
header = (void *) L"86Box";
}
msgbtn.buttonid = 1;
msgbtn.text = "OK";

View File

@@ -1341,7 +1341,7 @@ svga_init(const device_t *info, svga_t *svga, void *priv, int memsize,
svga->dispontime = 1000ULL << 32;
svga->dispofftime = 1000ULL << 32;
svga->bpp = 8;
svga->vram = calloc(memsize, 1);
svga->vram = calloc(memsize + 8, 1);
svga->vram_max = memsize;
svga->vram_display_mask = svga->vram_mask = memsize - 1;
svga->decode_mask = 0x7fffff;