diff --git a/src/floppy/fdc.c b/src/floppy/fdc.c index bce34e327..3fd492bd2 100644 --- a/src/floppy/fdc.c +++ b/src/floppy/fdc.c @@ -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 diff --git a/src/floppy/fdd_86f.c b/src/floppy/fdd_86f.c index fa1c070f1..35ddbb1dd 100644 --- a/src/floppy/fdd_86f.c +++ b/src/floppy/fdd_86f.c @@ -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); diff --git a/src/include/86box/fdc.h b/src/include/86box/fdc.h index e03785df6..ef78239cd 100644 --- a/src/include/86box/fdc.h +++ b/src/include/86box/fdc.h @@ -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]; diff --git a/src/include/86box/port_92.h b/src/include/86box/port_92.h index 2dd4319be..838b7ca28 100644 --- a/src/include/86box/port_92.h +++ b/src/include/86box/port_92.h @@ -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; diff --git a/src/machine/m_at_386dx_486.c b/src/machine/m_at_386dx_486.c index 82f946314..6b0ffae50 100644 --- a/src/machine/m_at_386dx_486.c +++ b/src/machine/m_at_386dx_486.c @@ -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); diff --git a/src/machine/m_pcjr.c b/src/machine/m_pcjr.c index 6638402f7..9ac4ff631 100644 --- a/src/machine/m_pcjr.c +++ b/src/machine/m_pcjr.c @@ -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*/ diff --git a/src/network/net_modem.c b/src/network/net_modem.c index 241e46502..2ed219edf 100644 --- a/src/network/net_modem.c +++ b/src/network/net_modem.c @@ -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 diff --git a/src/network/network.c b/src/network/network.c index c972e80da..7c02609ae 100644 --- a/src/network/network.c +++ b/src/network/network.c @@ -54,9 +54,7 @@ #include #include #include -#ifndef _WIN32 -# include -#endif /* _WIN32 */ +#include #include #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++; } diff --git a/src/port_92.c b/src/port_92.c index 1307ecba9..18e60326c 100644 --- a/src/port_92.c +++ b/src/port_92.c @@ -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", diff --git a/src/qt/icons/warning.ico b/src/qt/icons/warning.ico new file mode 100644 index 000000000..2f283e2c4 Binary files /dev/null and b/src/qt/icons/warning.ico differ diff --git a/src/qt/qt_settingsmachine.cpp b/src/qt/qt_settingsmachine.cpp index aff55203e..30b163687 100644 --- a/src/qt/qt_settingsmachine.cpp +++ b/src/qt/qt_settingsmachine.cpp @@ -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); diff --git a/src/qt_resources.qrc b/src/qt_resources.qrc index 2c4e9775a..1f6341786 100644 --- a/src/qt_resources.qrc +++ b/src/qt_resources.qrc @@ -63,6 +63,9 @@ qt/icons/send_cae.ico qt/icons/settings.ico + + qt/icons/warning.ico + qt/texture_vert.spv qt/texture_frag.spv diff --git a/src/unix/unix.c b/src/unix/unix.c index 1fe477a23..d4d73817f 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -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"; diff --git a/src/video/vid_svga.c b/src/video/vid_svga.c index cfb984a5a..93c1eb669 100644 --- a/src/video/vid_svga.c +++ b/src/video/vid_svga.c @@ -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;