diff --git a/src/config.c b/src/config.c index 06049713c..edd713755 100644 --- a/src/config.c +++ b/src/config.c @@ -910,10 +910,10 @@ load_network(void) nc->slirp_net[0] = '\0'; } - sprintf(temp, "net_%02i_switch_group", c + 1); - nc->switch_group = ini_section_get_int(cat, temp, NET_SWITCH_GRP_MIN); - if (nc->switch_group < NET_SWITCH_GRP_MIN) - nc->switch_group = NET_SWITCH_GRP_MIN; + sprintf(temp, "net_%02i_secret", c + 1); + p = ini_section_get_string(cat, temp, NULL); + strncpy(nc->secret, p ? p : "", sizeof(nc->secret) - 1); + nc->secret[sizeof(net_cards_conf[c].secret) - 1] = '\0'; sprintf(temp, "net_%02i_promisc", c + 1); nc->promisc_mode = ini_section_get_int(cat, temp, 0); @@ -3019,11 +3019,11 @@ save_network(void) ini_section_delete_var(cat, temp); } - sprintf(temp, "net_%02i_switch_group", c + 1); - if (nc->switch_group == NET_SWITCH_GRP_MIN) + sprintf(temp, "net_%02i_secret", c + 1); + if (nc->secret[0] == '\0') ini_section_delete_var(cat, temp); else - ini_section_set_int(cat, temp, nc->switch_group); + ini_section_set_string(cat, temp, net_cards_conf[c].secret); sprintf(temp, "net_%02i_promisc", c + 1); if (nc->promisc_mode == 0) diff --git a/src/device/kbc_at.c b/src/device/kbc_at.c index 4cb23428e..d50dfb5d1 100644 --- a/src/device/kbc_at.c +++ b/src/device/kbc_at.c @@ -2184,6 +2184,7 @@ read_p1(atkbc_t *dev) ----------------- IBM PS/1: xxxxxxxx IBM PS/2 MCA: xxxxx1xx + IBM PS/2 Model 30-286: xxxxx1xx Intel AMI Pentium BIOS'es with AMI MegaKey KB-5 keyboard controller: x1x1xxxx Acer: xxxxx0xx Packard Bell PB450: xxxxx1xx @@ -2198,6 +2199,7 @@ read_p1(atkbc_t *dev) Acer: Pull down bit 6 if primary display is MDA. Pull down bit 2 always (must be so to enable CMOS Setup). IBM PS/1: Pull down bit 6 if current floppy drive is 3.5". + IBM PS/2 Model 30-286: Pull down bits 5 and 4 based on planar memory size. Epson Action Tower 2600: Pull down bit 3 always (for Epson logo). NCR: Pull down bit 5 always (power-on default speed = high). Pull down bit 3 if there is no FPU. @@ -2216,11 +2218,18 @@ read_p1(atkbc_t *dev) Compaq: 0 = Compaq dual-scan display, 1 = non-Compaq display. Bit 5: Mostly, manufacturing jumper: 0 = installed (infinite loop at POST), 1 = not installed; NCR: power-on default speed: 0 = high, 1 = low; + IBM PS/2 Model 30-286: memory presence detect pin 1; Compaq: System board DIP switch 5: 0 = ON, 1 = OFF. Bit 4: (Which board?): RAM on motherboard: 0 = 512 kB, 1 = 256 kB; NCR: RAM on motherboard: 0 = unsupported, 1 = 512 kB; Intel AMI MegaKey KB-5: Must be 1; IBM PS/1: Ignored; + IBM PS/2 Model 30-286: memory presence detect pin 2; + Bit 5, 4: + 1, 1: 256Kx2 SIMM memory installed; + 1, 0: 256Kx4 SIMM memory installed; + 0, 1: 1Mx2 SIMM memory installed; + 0, 0: 1Mx4 SIMM memory installed. Compaq: 0 = Auto speed selected, 1 = High speed selected. Bit 3: TriGem AMIKey: most significant bit of 2-bit OEM ID; NCR: Coprocessor detect (1 = yes, 0 = no); diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index 6eed8810c..af39e17e4 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -426,6 +426,7 @@ extern uint8_t machine_compaq_p1_handler(void); extern uint8_t machine_generic_p1_handler(void); extern uint8_t machine_ncr_p1_handler(void); extern uint8_t machine_ps1_p1_handler(void); +extern uint8_t machine_ps2_isa_p1_handler(void); extern uint8_t machine_t3100e_p1_handler(void); extern uint8_t machine_get_p1_default(void); @@ -1386,6 +1387,9 @@ extern const device_t ps1_hdc_device; #endif /* m_ps2_isa.c */ +#ifdef EMU_DEVICE_H +extern const device_t ps2_m30_286_device; +#endif extern int machine_ps2_m30_286_init(const machine_t *); /* m_ps2_mca.c */ diff --git a/src/include/86box/network.h b/src/include/86box/network.h index f3f1b1f8a..d208cd345 100644 --- a/src/include/86box/network.h +++ b/src/include/86box/network.h @@ -60,8 +60,6 @@ #define NET_QUEUE_COUNT 4 #define NET_CARD_MAX 4 #define NET_HOST_INTF_MAX 64 -#define NET_SWITCH_GRP_MIN 1 -#define NET_SWITCH_GRP_MAX 10 #define NET_PERIOD_10M 0.8 #define NET_PERIOD_100M 0.08 @@ -97,7 +95,7 @@ typedef struct netcard_conf_t { int net_type; char host_dev_name[128]; uint32_t link_state; - uint8_t switch_group; + char secret[256]; uint8_t promisc_mode; char slirp_net[16]; char nrs_hostname[128]; diff --git a/src/include/shathree.h b/src/include/shathree.h new file mode 100644 index 000000000..98e804b33 --- /dev/null +++ b/src/include/shathree.h @@ -0,0 +1,481 @@ +/* +** This code is from SQLite +** (https://sqlite.org/src/info/2025-02-27T21:17:55z), at file path +** ext/misc/shathree.c. The SQLite functions have been removed, but +** it is the same code written by D. Richard Hipp. +*/ + +#ifndef SHATHREE_H + +/* +** 2017-03-08 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +*/ +#include +#include +#include + +/****************************************************************************** +** The Hash Engine +*/ +/* +** Macros to determine whether the machine is big or little endian, +** and whether or not that determination is run-time or compile-time. +** +** For best performance, an attempt is made to guess at the byte-order +** using C-preprocessor macros. If that is unsuccessful, or if +** -DSHA3_BYTEORDER=0 is set, then byte-order is determined +** at run-time. +*/ +#ifndef SHA3_BYTEORDER +# if defined(i386) || defined(__i386__) || defined(_M_IX86) || \ + defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || \ + defined(_M_AMD64) || defined(_M_ARM) || defined(__x86) || \ + defined(__arm__) +# define SHA3_BYTEORDER 1234 +# elif defined(sparc) || defined(__ppc__) +# define SHA3_BYTEORDER 4321 +# else +# define SHA3_BYTEORDER 0 +# endif +#endif + +#define u64 uint64_t + + +/* +** State structure for a SHA3 hash in progress +*/ +typedef struct SHA3Context SHA3Context; +struct SHA3Context { + union { + u64 s[25]; /* Keccak state. 5x5 lines of 64 bits each */ + unsigned char x[1600]; /* ... or 1600 bytes */ + } u; + unsigned nRate; /* Bytes of input accepted per Keccak iteration */ + unsigned nLoaded; /* Input bytes loaded into u.x[] so far this cycle */ + unsigned ixMask; /* Insert next input into u.x[nLoaded^ixMask]. */ + unsigned iSize; /* 224, 256, 358, or 512 */ +}; + +/* +** A single step of the Keccak mixing function for a 1600-bit state +*/ +static void KeccakF1600Step(SHA3Context *p){ + int i; + u64 b0, b1, b2, b3, b4; + u64 c0, c1, c2, c3, c4; + u64 d0, d1, d2, d3, d4; + static const u64 RC[] = { + 0x0000000000000001ULL, 0x0000000000008082ULL, + 0x800000000000808aULL, 0x8000000080008000ULL, + 0x000000000000808bULL, 0x0000000080000001ULL, + 0x8000000080008081ULL, 0x8000000000008009ULL, + 0x000000000000008aULL, 0x0000000000000088ULL, + 0x0000000080008009ULL, 0x000000008000000aULL, + 0x000000008000808bULL, 0x800000000000008bULL, + 0x8000000000008089ULL, 0x8000000000008003ULL, + 0x8000000000008002ULL, 0x8000000000000080ULL, + 0x000000000000800aULL, 0x800000008000000aULL, + 0x8000000080008081ULL, 0x8000000000008080ULL, + 0x0000000080000001ULL, 0x8000000080008008ULL + }; +# define a00 (p->u.s[0]) +# define a01 (p->u.s[1]) +# define a02 (p->u.s[2]) +# define a03 (p->u.s[3]) +# define a04 (p->u.s[4]) +# define a10 (p->u.s[5]) +# define a11 (p->u.s[6]) +# define a12 (p->u.s[7]) +# define a13 (p->u.s[8]) +# define a14 (p->u.s[9]) +# define a20 (p->u.s[10]) +# define a21 (p->u.s[11]) +# define a22 (p->u.s[12]) +# define a23 (p->u.s[13]) +# define a24 (p->u.s[14]) +# define a30 (p->u.s[15]) +# define a31 (p->u.s[16]) +# define a32 (p->u.s[17]) +# define a33 (p->u.s[18]) +# define a34 (p->u.s[19]) +# define a40 (p->u.s[20]) +# define a41 (p->u.s[21]) +# define a42 (p->u.s[22]) +# define a43 (p->u.s[23]) +# define a44 (p->u.s[24]) +# define ROL64(a,x) ((a<>(64-x))) + + for(i=0; i<24; i+=4){ + c0 = a00^a10^a20^a30^a40; + c1 = a01^a11^a21^a31^a41; + c2 = a02^a12^a22^a32^a42; + c3 = a03^a13^a23^a33^a43; + c4 = a04^a14^a24^a34^a44; + d0 = c4^ROL64(c1, 1); + d1 = c0^ROL64(c2, 1); + d2 = c1^ROL64(c3, 1); + d3 = c2^ROL64(c4, 1); + d4 = c3^ROL64(c0, 1); + + b0 = (a00^d0); + b1 = ROL64((a11^d1), 44); + b2 = ROL64((a22^d2), 43); + b3 = ROL64((a33^d3), 21); + b4 = ROL64((a44^d4), 14); + a00 = b0 ^((~b1)& b2 ); + a00 ^= RC[i]; + a11 = b1 ^((~b2)& b3 ); + a22 = b2 ^((~b3)& b4 ); + a33 = b3 ^((~b4)& b0 ); + a44 = b4 ^((~b0)& b1 ); + + b2 = ROL64((a20^d0), 3); + b3 = ROL64((a31^d1), 45); + b4 = ROL64((a42^d2), 61); + b0 = ROL64((a03^d3), 28); + b1 = ROL64((a14^d4), 20); + a20 = b0 ^((~b1)& b2 ); + a31 = b1 ^((~b2)& b3 ); + a42 = b2 ^((~b3)& b4 ); + a03 = b3 ^((~b4)& b0 ); + a14 = b4 ^((~b0)& b1 ); + + b4 = ROL64((a40^d0), 18); + b0 = ROL64((a01^d1), 1); + b1 = ROL64((a12^d2), 6); + b2 = ROL64((a23^d3), 25); + b3 = ROL64((a34^d4), 8); + a40 = b0 ^((~b1)& b2 ); + a01 = b1 ^((~b2)& b3 ); + a12 = b2 ^((~b3)& b4 ); + a23 = b3 ^((~b4)& b0 ); + a34 = b4 ^((~b0)& b1 ); + + b1 = ROL64((a10^d0), 36); + b2 = ROL64((a21^d1), 10); + b3 = ROL64((a32^d2), 15); + b4 = ROL64((a43^d3), 56); + b0 = ROL64((a04^d4), 27); + a10 = b0 ^((~b1)& b2 ); + a21 = b1 ^((~b2)& b3 ); + a32 = b2 ^((~b3)& b4 ); + a43 = b3 ^((~b4)& b0 ); + a04 = b4 ^((~b0)& b1 ); + + b3 = ROL64((a30^d0), 41); + b4 = ROL64((a41^d1), 2); + b0 = ROL64((a02^d2), 62); + b1 = ROL64((a13^d3), 55); + b2 = ROL64((a24^d4), 39); + a30 = b0 ^((~b1)& b2 ); + a41 = b1 ^((~b2)& b3 ); + a02 = b2 ^((~b3)& b4 ); + a13 = b3 ^((~b4)& b0 ); + a24 = b4 ^((~b0)& b1 ); + + c0 = a00^a20^a40^a10^a30; + c1 = a11^a31^a01^a21^a41; + c2 = a22^a42^a12^a32^a02; + c3 = a33^a03^a23^a43^a13; + c4 = a44^a14^a34^a04^a24; + d0 = c4^ROL64(c1, 1); + d1 = c0^ROL64(c2, 1); + d2 = c1^ROL64(c3, 1); + d3 = c2^ROL64(c4, 1); + d4 = c3^ROL64(c0, 1); + + b0 = (a00^d0); + b1 = ROL64((a31^d1), 44); + b2 = ROL64((a12^d2), 43); + b3 = ROL64((a43^d3), 21); + b4 = ROL64((a24^d4), 14); + a00 = b0 ^((~b1)& b2 ); + a00 ^= RC[i+1]; + a31 = b1 ^((~b2)& b3 ); + a12 = b2 ^((~b3)& b4 ); + a43 = b3 ^((~b4)& b0 ); + a24 = b4 ^((~b0)& b1 ); + + b2 = ROL64((a40^d0), 3); + b3 = ROL64((a21^d1), 45); + b4 = ROL64((a02^d2), 61); + b0 = ROL64((a33^d3), 28); + b1 = ROL64((a14^d4), 20); + a40 = b0 ^((~b1)& b2 ); + a21 = b1 ^((~b2)& b3 ); + a02 = b2 ^((~b3)& b4 ); + a33 = b3 ^((~b4)& b0 ); + a14 = b4 ^((~b0)& b1 ); + + b4 = ROL64((a30^d0), 18); + b0 = ROL64((a11^d1), 1); + b1 = ROL64((a42^d2), 6); + b2 = ROL64((a23^d3), 25); + b3 = ROL64((a04^d4), 8); + a30 = b0 ^((~b1)& b2 ); + a11 = b1 ^((~b2)& b3 ); + a42 = b2 ^((~b3)& b4 ); + a23 = b3 ^((~b4)& b0 ); + a04 = b4 ^((~b0)& b1 ); + + b1 = ROL64((a20^d0), 36); + b2 = ROL64((a01^d1), 10); + b3 = ROL64((a32^d2), 15); + b4 = ROL64((a13^d3), 56); + b0 = ROL64((a44^d4), 27); + a20 = b0 ^((~b1)& b2 ); + a01 = b1 ^((~b2)& b3 ); + a32 = b2 ^((~b3)& b4 ); + a13 = b3 ^((~b4)& b0 ); + a44 = b4 ^((~b0)& b1 ); + + b3 = ROL64((a10^d0), 41); + b4 = ROL64((a41^d1), 2); + b0 = ROL64((a22^d2), 62); + b1 = ROL64((a03^d3), 55); + b2 = ROL64((a34^d4), 39); + a10 = b0 ^((~b1)& b2 ); + a41 = b1 ^((~b2)& b3 ); + a22 = b2 ^((~b3)& b4 ); + a03 = b3 ^((~b4)& b0 ); + a34 = b4 ^((~b0)& b1 ); + + c0 = a00^a40^a30^a20^a10; + c1 = a31^a21^a11^a01^a41; + c2 = a12^a02^a42^a32^a22; + c3 = a43^a33^a23^a13^a03; + c4 = a24^a14^a04^a44^a34; + d0 = c4^ROL64(c1, 1); + d1 = c0^ROL64(c2, 1); + d2 = c1^ROL64(c3, 1); + d3 = c2^ROL64(c4, 1); + d4 = c3^ROL64(c0, 1); + + b0 = (a00^d0); + b1 = ROL64((a21^d1), 44); + b2 = ROL64((a42^d2), 43); + b3 = ROL64((a13^d3), 21); + b4 = ROL64((a34^d4), 14); + a00 = b0 ^((~b1)& b2 ); + a00 ^= RC[i+2]; + a21 = b1 ^((~b2)& b3 ); + a42 = b2 ^((~b3)& b4 ); + a13 = b3 ^((~b4)& b0 ); + a34 = b4 ^((~b0)& b1 ); + + b2 = ROL64((a30^d0), 3); + b3 = ROL64((a01^d1), 45); + b4 = ROL64((a22^d2), 61); + b0 = ROL64((a43^d3), 28); + b1 = ROL64((a14^d4), 20); + a30 = b0 ^((~b1)& b2 ); + a01 = b1 ^((~b2)& b3 ); + a22 = b2 ^((~b3)& b4 ); + a43 = b3 ^((~b4)& b0 ); + a14 = b4 ^((~b0)& b1 ); + + b4 = ROL64((a10^d0), 18); + b0 = ROL64((a31^d1), 1); + b1 = ROL64((a02^d2), 6); + b2 = ROL64((a23^d3), 25); + b3 = ROL64((a44^d4), 8); + a10 = b0 ^((~b1)& b2 ); + a31 = b1 ^((~b2)& b3 ); + a02 = b2 ^((~b3)& b4 ); + a23 = b3 ^((~b4)& b0 ); + a44 = b4 ^((~b0)& b1 ); + + b1 = ROL64((a40^d0), 36); + b2 = ROL64((a11^d1), 10); + b3 = ROL64((a32^d2), 15); + b4 = ROL64((a03^d3), 56); + b0 = ROL64((a24^d4), 27); + a40 = b0 ^((~b1)& b2 ); + a11 = b1 ^((~b2)& b3 ); + a32 = b2 ^((~b3)& b4 ); + a03 = b3 ^((~b4)& b0 ); + a24 = b4 ^((~b0)& b1 ); + + b3 = ROL64((a20^d0), 41); + b4 = ROL64((a41^d1), 2); + b0 = ROL64((a12^d2), 62); + b1 = ROL64((a33^d3), 55); + b2 = ROL64((a04^d4), 39); + a20 = b0 ^((~b1)& b2 ); + a41 = b1 ^((~b2)& b3 ); + a12 = b2 ^((~b3)& b4 ); + a33 = b3 ^((~b4)& b0 ); + a04 = b4 ^((~b0)& b1 ); + + c0 = a00^a30^a10^a40^a20; + c1 = a21^a01^a31^a11^a41; + c2 = a42^a22^a02^a32^a12; + c3 = a13^a43^a23^a03^a33; + c4 = a34^a14^a44^a24^a04; + d0 = c4^ROL64(c1, 1); + d1 = c0^ROL64(c2, 1); + d2 = c1^ROL64(c3, 1); + d3 = c2^ROL64(c4, 1); + d4 = c3^ROL64(c0, 1); + + b0 = (a00^d0); + b1 = ROL64((a01^d1), 44); + b2 = ROL64((a02^d2), 43); + b3 = ROL64((a03^d3), 21); + b4 = ROL64((a04^d4), 14); + a00 = b0 ^((~b1)& b2 ); + a00 ^= RC[i+3]; + a01 = b1 ^((~b2)& b3 ); + a02 = b2 ^((~b3)& b4 ); + a03 = b3 ^((~b4)& b0 ); + a04 = b4 ^((~b0)& b1 ); + + b2 = ROL64((a10^d0), 3); + b3 = ROL64((a11^d1), 45); + b4 = ROL64((a12^d2), 61); + b0 = ROL64((a13^d3), 28); + b1 = ROL64((a14^d4), 20); + a10 = b0 ^((~b1)& b2 ); + a11 = b1 ^((~b2)& b3 ); + a12 = b2 ^((~b3)& b4 ); + a13 = b3 ^((~b4)& b0 ); + a14 = b4 ^((~b0)& b1 ); + + b4 = ROL64((a20^d0), 18); + b0 = ROL64((a21^d1), 1); + b1 = ROL64((a22^d2), 6); + b2 = ROL64((a23^d3), 25); + b3 = ROL64((a24^d4), 8); + a20 = b0 ^((~b1)& b2 ); + a21 = b1 ^((~b2)& b3 ); + a22 = b2 ^((~b3)& b4 ); + a23 = b3 ^((~b4)& b0 ); + a24 = b4 ^((~b0)& b1 ); + + b1 = ROL64((a30^d0), 36); + b2 = ROL64((a31^d1), 10); + b3 = ROL64((a32^d2), 15); + b4 = ROL64((a33^d3), 56); + b0 = ROL64((a34^d4), 27); + a30 = b0 ^((~b1)& b2 ); + a31 = b1 ^((~b2)& b3 ); + a32 = b2 ^((~b3)& b4 ); + a33 = b3 ^((~b4)& b0 ); + a34 = b4 ^((~b0)& b1 ); + + b3 = ROL64((a40^d0), 41); + b4 = ROL64((a41^d1), 2); + b0 = ROL64((a42^d2), 62); + b1 = ROL64((a43^d3), 55); + b2 = ROL64((a44^d4), 39); + a40 = b0 ^((~b1)& b2 ); + a41 = b1 ^((~b2)& b3 ); + a42 = b2 ^((~b3)& b4 ); + a43 = b3 ^((~b4)& b0 ); + a44 = b4 ^((~b0)& b1 ); + } +} + +/* +** Initialize a new hash. iSize determines the size of the hash +** in bits and should be one of 224, 256, 384, or 512. Or iSize +** can be zero to use the default hash size of 256 bits. +*/ +static void SHA3Init(SHA3Context *p, int iSize){ + memset(p, 0, sizeof(*p)); + p->iSize = iSize; + if( iSize>=128 && iSize<=512 ){ + p->nRate = (1600 - ((iSize + 31)&~31)*2)/8; + }else{ + p->nRate = (1600 - 2*256)/8; + } +#if SHA3_BYTEORDER==1234 + /* Known to be little-endian at compile-time. No-op */ +#elif SHA3_BYTEORDER==4321 + p->ixMask = 7; /* Big-endian */ +#else + { + static unsigned int one = 1; + if( 1==*(unsigned char*)&one ){ + /* Little endian. No byte swapping. */ + p->ixMask = 0; + }else{ + /* Big endian. Byte swap. */ + p->ixMask = 7; + } + } +#endif +} + +/* +** Make consecutive calls to the SHA3Update function to add new content +** to the hash +*/ +static void SHA3Update( + SHA3Context *p, + const unsigned char *aData, + unsigned int nData +){ + unsigned int i = 0; + if( aData==0 ) return; +#if SHA3_BYTEORDER==1234 + if( (p->nLoaded % 8)==0 && ((aData - (const unsigned char*)0)&7)==0 ){ + for(; i+7u.s[p->nLoaded/8] ^= *(u64*)&aData[i]; + p->nLoaded += 8; + if( p->nLoaded>=p->nRate ){ + KeccakF1600Step(p); + p->nLoaded = 0; + } + } + } +#endif + for(; iu.x[p->nLoaded] ^= aData[i]; +#elif SHA3_BYTEORDER==4321 + p->u.x[p->nLoaded^0x07] ^= aData[i]; +#else + p->u.x[p->nLoaded^p->ixMask] ^= aData[i]; +#endif + p->nLoaded++; + if( p->nLoaded==p->nRate ){ + KeccakF1600Step(p); + p->nLoaded = 0; + } + } +} + +/* +** After all content has been added, invoke SHA3Final() to compute +** the final hash. The function returns a pointer to the binary +** hash value. +*/ +static unsigned char *SHA3Final(SHA3Context *p){ + unsigned int i; + if( p->nLoaded==p->nRate-1 ){ + const unsigned char c1 = 0x86; + SHA3Update(p, &c1, 1); + }else{ + const unsigned char c2 = 0x06; + const unsigned char c3 = 0x80; + SHA3Update(p, &c2, 1); + p->nLoaded = p->nRate - 1; + SHA3Update(p, &c3, 1); + } + for(i=0; inRate; i++){ + p->u.x[i+p->nRate] = p->u.x[i^p->ixMask]; + } + return &p->u.x[p->nRate]; +} + +#endif diff --git a/src/machine/m_ps2_isa.c b/src/machine/m_ps2_isa.c index 5754eee11..64a8da2ed 100644 --- a/src/machine/m_ps2_isa.c +++ b/src/machine/m_ps2_isa.c @@ -146,6 +146,58 @@ ps2_read(uint16_t port, void *priv) return temp; } +static const device_config_t ps2_m30_286_config[] = { + // clang-format off + { + .name = "bios", + .description = "BIOS Version", + .type = CONFIG_BIOS, + .default_string = "ibmps2_m30_286", + .default_int = 0, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { { 0 } }, + .bios = { + { + .name = "Model 30-286 rev. 0 BIOS", + .internal_name = "ibmps2_m30_286_rev0", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 131072, + .files = { "roms/machines/ibmps2_m30_286/27F4092.BIN", "" } + }, + { + .name = "Model 30-286 rev. 2 BIOS", + .internal_name = "ibmps2_m30_286", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 131072, + .files = { "roms/machines/ibmps2_m30_286/33f5381a.bin", "" } + }, + { .files_no = 0 } + } + }, + { .name = "", .description = "", .type = CONFIG_END } + // clang-format on +}; + +const device_t ps2_m30_286_device = { + .name = "IBM PS/2 model 30-286", + .internal_name = "ps2_m30_286_device", + .flags = 0, + .local = 0, + .init = NULL, + .close = NULL, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = ps2_m30_286_config +}; + + static void ps2_isa_setup(int model, int cpu_type) { @@ -205,17 +257,46 @@ ps2_isa_common_init(const machine_t *model) device_add(&port_6x_ps2_device); } +uint8_t +machine_ps2_isa_p1_handler(void) +{ + uint8_t mem_p1; + + switch (mem_size / 1024) { + case 0: /*256Kx2*/ + mem_p1 = 0xf0; + break; + case 1: /*256Kx4*/ + mem_p1 = 0xe0; + break; + case 2: /*1Mx2*/ + case 3: + mem_p1 = 0xd0; + break; + case 4: /*1Mx4*/ + default: + mem_p1 = 0xc0; + break; + } + + return mem_p1; +} + int machine_ps2_m30_286_init(const machine_t *model) { - int ret; + int ret = 0; + const char *fn; - ret = bios_load_linear("roms/machines/ibmps2_m30_286/33f5381a.bin", - 0x000e0000, 131072, 0); - - if (bios_only || !ret) + /* No ROMs available */ + if (!device_available(model->device)) return ret; + device_context(model->device); + fn = device_get_bios_file(machine_get_device(machine), device_get_config_bios("bios"), 0); + ret = bios_load_linear(fn, 0x000e0000, 131072, 0); + device_context_restore(); + ps2_isa_common_init(model); ps2_isa_setup(30, 286); diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 236c8321b..45e3a0729 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -3173,7 +3173,7 @@ const machine_t machines[] = { .type = MACHINE_TYPE_286, .chipset = MACHINE_CHIPSET_PROPRIETARY, .init = machine_ps2_m30_286_init, - .p1_handler = machine_generic_p1_handler, + .p1_handler = machine_ps2_isa_p1_handler, .gpio_handler = NULL, .available_flag = MACHINE_AVAILABLE, .gpio_acpi_handler = NULL, @@ -3202,7 +3202,7 @@ const machine_t machines[] = { .kbc_p1 = 0x00000cf0, .gpio = 0xffffffff, .gpio_acpi = 0xffffffff, - .device = NULL, + .device = &ps2_m30_286_device, .kbd_device = NULL, .fdc_device = NULL, .sio_device = NULL, diff --git a/src/network/net_switch.c b/src/network/net_switch.c index d29513f74..ced2f0392 100644 --- a/src/network/net_switch.c +++ b/src/network/net_switch.c @@ -49,10 +49,11 @@ #include <86box/config.h> #include <86box/net_event.h> #include <86box/bswap.h> +#include #define SWITCH_PKT_BATCH NET_QUEUE_LEN -#define SWITCH_MULTICAST_GROUP 0xefff5656 /* 239.255.86.86 */ +#define SWITCH_MULTICAST_GROUP 0xefff5056 /* 239.255.80.86 */ #define SWITCH_MULTICAST_PORT 8086 enum { @@ -80,6 +81,8 @@ typedef struct net_switch_t { net_switch_hostaddr_t *hostaddrs; uint16_t port_out; + uint8_t secret_enabled; + uint8_t secret_hash[32]; uint8_t promisc; union { uint8_t mac_addr[6]; @@ -123,6 +126,15 @@ net_switch_in_available(void *priv) net_event_set(&netswitch->tx_event); } +static void +net_switch_secret_hash(const char *secret, uint8_t *hash) +{ + SHA3Context cx; + SHA3Init(&cx, 256); + SHA3Update(&cx, (const uint8_t *)secret, strlen(secret)); + memcpy(hash, SHA3Final(&cx), 32); +} + static unsigned int net_switch_add_hostaddr(net_switch_t *netswitch, net_switch_sockaddr_t *addr, net_switch_sockaddr_t *broadcast, net_switch_sockaddr_t *netmask, unsigned int flags) { @@ -186,10 +198,12 @@ net_switch_add_hostaddr(net_switch_t *netswitch, net_switch_sockaddr_t *addr, ne } /* Join IPv4 multicast group. */ - struct ip_mreq mreq = { - .imr_multiaddr = { .s_addr = htonl(SWITCH_MULTICAST_GROUP) }, - .imr_interface = { .s_addr = hostaddr->addr.sin.sin_addr.s_addr } - }; + struct ip_mreq mreq = { .imr_interface = { .s_addr = hostaddr->addr.sin.sin_addr.s_addr } }; + if (netswitch->secret_enabled) + mreq.imr_multiaddr.s_addr = htonl(SWITCH_MULTICAST_GROUP); + else + mreq.imr_multiaddr.s_addr = htonl(SWITCH_MULTICAST_GROUP + 0x600); // 239.255.86.86 + if (setsockopt(netswitch->socket_rx, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *) &mreq, sizeof(mreq)) < 0) { netswitch_log("Network Switch: could not join multicast group on interface %s\n", buf); goto broadcast; @@ -374,16 +388,35 @@ net_switch_thread(void *priv) packets = network_tx_popv(netswitch->card, netswitch->pkt_tx_v, SWITCH_PKT_BATCH); if (!(net_cards_conf[netswitch->card->card_num].link_state & NET_LINK_DOWN)) { for (int i = 0; i < packets; i++) { + int orig_len = netswitch->pkt_tx_v[i].len; + int send_len = orig_len; + uint8_t augmented[sizeof(netswitch->secret_hash) + NET_MAX_FRAME]; + if (netswitch->secret_enabled) { + send_len = orig_len + sizeof(netswitch->secret_hash); + + /* Build header with secret hash */ + uint8_t *hdr = augmented; + memcpy(hdr, netswitch->secret_hash, sizeof(netswitch->secret_hash)); + memcpy(augmented + sizeof(netswitch->secret_hash), + netswitch->pkt_tx_v[i].data, orig_len); + } + #define MAC_FORMAT "(%02X:%02X:%02X:%02X:%02X:%02X -> %02X:%02X:%02X:%02X:%02X:%02X)" -#define MAC_FORMAT_ARGS(p) (p)[6], (p)[7], (p)[8], (p)[9], (p)[10], (p)[11], (p)[0], (p)[1], (p)[2], (p)[3], (p)[4], (p)[5] +#define MAC_FORMAT_NOSECRET_ARGS(p) (p)[6], (p)[7], (p)[8], (p)[9], (p)[10], (p)[11], (p)[0], (p)[1], (p)[2], (p)[3], (p)[4], (p)[5] +#define MAC_FORMAT_ARGS(p) (p)[38], (p)[39], (p)[40], (p)[41], (p)[42], (p)[43], (p)[32], (p)[33], (p)[34], (p)[35], (p)[36], (p)[37] netswitch_log("Network Switch: sending %d-byte packet " MAC_FORMAT "\n", - netswitch->pkt_tx_v[i].len, MAC_FORMAT_ARGS(netswitch->pkt_tx_v[i].data)); + netswitch->pkt_tx_v[i].len, + netswitch->secret_enabled ? MAC_FORMAT_ARGS(netswitch->pkt_tx_v[i].data) + : MAC_FORMAT_NOSECRET_ARGS(netswitch->pkt_tx_v[i].data)); /* Send through all known host interfaces. */ for (net_switch_hostaddr_t *hostaddr = netswitch->hostaddrs; hostaddr; hostaddr = hostaddr->next) - sendto(hostaddr->socket_tx, - (char *) netswitch->pkt_tx_v[i].data, netswitch->pkt_tx_v[i].len, 0, - &hostaddr->addr_tx.sa, sizeof(hostaddr->addr_tx.sa)); + if (netswitch->secret_enabled) + sendto(hostaddr->socket_tx, (char *)augmented, send_len, 0, + &hostaddr->addr_tx.sa, sizeof(hostaddr->addr_tx.sa)); + else + sendto(hostaddr->socket_tx, (char *)netswitch->pkt_tx_v[i].data, + send_len, 0, &hostaddr->addr_tx.sa, sizeof(hostaddr->addr_tx.sa)); } } netswitch->during_tx = 0; @@ -406,10 +439,32 @@ net_switch_thread(void *priv) } if (pfd[NET_EVENT_RX].revents & POLLIN) { #endif - len = recv(netswitch->socket_rx, (char *) netswitch->pkt.data, NET_MAX_FRAME, 0); - if (len < 12) { - netswitch_log("Network Switch: recv error (%d)\n", len); - } else if ((AS_U64(netswitch->pkt.data[6]) & le64_to_cpu(0xffffffffffffULL)) == netswitch->mac_addr_u64) { + if (netswitch->secret_enabled) { + len = recv(netswitch->socket_rx, (char *) netswitch->pkt.data, NET_MAX_FRAME + sizeof(netswitch->secret_hash), 0); + if (len < sizeof(netswitch->secret_hash) + 12) { + netswitch_log("Network Switch: recv error (%d)\n", len); + continue; + } + + if (memcmp(netswitch->pkt.data, netswitch->secret_hash, sizeof(netswitch->secret_hash)) != 0) { + /* This packet contains a different secret hash, ignore it. */ + continue; + } else { + memmove(netswitch->pkt.data, + netswitch->pkt.data + sizeof(netswitch->secret_hash), + len - sizeof(netswitch->secret_hash)); + len = len - sizeof(netswitch->secret_hash); + netswitch->pkt.len = len; + } + } else { + len = recv(netswitch->socket_rx, (char *) netswitch->pkt.data, NET_MAX_FRAME, 0); + if (len < 12) { + netswitch_log("Network Switch: recv error (%d)\n", len); + continue; + } + } + + if ((AS_U64(netswitch->pkt.data[netswitch->secret_enabled ? 38 : 6]) & le64_to_cpu(0xffffffffffffULL)) == netswitch->mac_addr_u64) { /* A packet we've sent has looped back, drop it. */ } else if (!(net_cards_conf[netswitch->card->card_num].link_state & NET_LINK_DOWN) && (netswitch->promisc || /* promiscuous mode? */ (netswitch->pkt.data[0] & 1) || /* broadcast packet? */ @@ -443,13 +498,20 @@ net_switch_init(const netcard_t *card, const uint8_t *mac_addr, void *priv, char { netcard_conf_t *netcard = (netcard_conf_t *) priv; - netswitch_log("Network Switch: initializing with group %d...\n", netcard->switch_group); - net_switch_t *netswitch = calloc(1, sizeof(net_switch_t)); memcpy(netswitch->mac_addr, mac_addr, sizeof(netswitch->mac_addr)); netswitch->card = (netcard_t *) card; netswitch->promisc = !!netcard->promisc_mode; + if (netcard->secret[0] != '\0') { + uint8_t temp[32]; + net_switch_secret_hash((const uint8_t *)netcard->secret, (uint8_t *) temp); + memcpy(netswitch->secret_hash, temp, 32); + netswitch->secret_enabled = 1; + } else { + netswitch->secret_enabled = 0; + } + /* Initialize receive socket. */ netswitch->socket_rx = socket(AF_INET, SOCK_DGRAM, 0); if (netswitch->socket_rx < 0) { @@ -473,7 +535,7 @@ net_switch_init(const netcard_t *card, const uint8_t *mac_addr, void *priv, char val = 0; setsockopt(netswitch->socket_rx, IPPROTO_IP, IP_MULTICAST_LOOP, (char *) &val, sizeof(val)); - netswitch->port_out = htons(SWITCH_MULTICAST_PORT - NET_SWITCH_GRP_MIN + netcard->switch_group); + netswitch->port_out = htons(SWITCH_MULTICAST_PORT); struct sockaddr_in addr = { .sin_family = AF_INET, .sin_addr = { .s_addr = htonl(INADDR_ANY) }, diff --git a/src/qt/languages/86box.pot b/src/qt/languages/86box.pot index c62c18ea8..8bcc5c794 100644 --- a/src/qt/languages/86box.pot +++ b/src/qt/languages/86box.pot @@ -2832,7 +2832,7 @@ msgstr "" msgid "Remote Switch" msgstr "" -msgid "Switch:" +msgid "Shared secret:" msgstr "" msgid "Hub Mode" diff --git a/src/qt/languages/ca-ES.po b/src/qt/languages/ca-ES.po index 0c1c8ac89..813b82dcb 100644 --- a/src/qt/languages/ca-ES.po +++ b/src/qt/languages/ca-ES.po @@ -2838,8 +2838,8 @@ msgstr "Commutador local" msgid "Remote Switch" msgstr "Commutador remot" -msgid "Switch:" -msgstr "Commutador:" +msgid "Shared secret:" +msgstr "Secret compartit:" msgid "Hub Mode" msgstr "Modalitat de concentrador" diff --git a/src/qt/languages/cs-CZ.po b/src/qt/languages/cs-CZ.po index 1df82475f..f27ac9d3c 100644 --- a/src/qt/languages/cs-CZ.po +++ b/src/qt/languages/cs-CZ.po @@ -2838,8 +2838,8 @@ msgstr "Lokální switch" msgid "Remote Switch" msgstr "Vzdálený switch" -msgid "Switch:" -msgstr "Switch:" +msgid "Shared secret:" +msgstr "Sdílené tajemství:" msgid "Hub Mode" msgstr "Režim hubu" diff --git a/src/qt/languages/de-DE.po b/src/qt/languages/de-DE.po index d0e649bc2..fc201c303 100644 --- a/src/qt/languages/de-DE.po +++ b/src/qt/languages/de-DE.po @@ -2838,8 +2838,8 @@ msgstr "Lokaler Schalter" msgid "Remote Switch" msgstr "Entfernter Schalter" -msgid "Switch:" -msgstr "Schalter:" +msgid "Shared secret:" +msgstr "Gemeinsames Geheimnis:" msgid "Hub Mode" msgstr "Hub-Modus" diff --git a/src/qt/languages/el-GR.po b/src/qt/languages/el-GR.po index 1442183df..7465743e0 100644 --- a/src/qt/languages/el-GR.po +++ b/src/qt/languages/el-GR.po @@ -2883,8 +2883,8 @@ msgstr "Τοπικός Διακόπτης" msgid "Remote Switch" msgstr "Απομακρυσμένος Διακόπτης" -msgid "Switch:" -msgstr "Διακόπτης:" +msgid "Shared secret:" +msgstr "Κοινό μυστικό:" msgid "Hub Mode" msgstr "Λειτουργία Hub" diff --git a/src/qt/languages/es-ES.po b/src/qt/languages/es-ES.po index af2e1e75e..54e3d2079 100644 --- a/src/qt/languages/es-ES.po +++ b/src/qt/languages/es-ES.po @@ -2838,8 +2838,8 @@ msgstr "Conmutador local" msgid "Remote Switch" msgstr "Conmutador remoto" -msgid "Switch:" -msgstr "Conmutador:" +msgid "Shared secret:" +msgstr "Secreto compartido:" msgid "Hub Mode" msgstr "Modo de concentrador" diff --git a/src/qt/languages/fi-FI.po b/src/qt/languages/fi-FI.po index 2351f1afa..9d4e84f39 100644 --- a/src/qt/languages/fi-FI.po +++ b/src/qt/languages/fi-FI.po @@ -2838,8 +2838,8 @@ msgstr "Paikallinen kytkin" msgid "Remote Switch" msgstr "Etäkytkin" -msgid "Switch:" -msgstr "Kytkin:" +msgid "Shared secret:" +msgstr "Jaettu salaisuus:" msgid "Hub Mode" msgstr "Hubitila" diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po index 42f1a8f40..453b52de4 100644 --- a/src/qt/languages/fr-FR.po +++ b/src/qt/languages/fr-FR.po @@ -2838,8 +2838,8 @@ msgstr "Commutateur local" msgid "Remote Switch" msgstr "Commutateur distant" -msgid "Switch:" -msgstr "Commutateur :" +msgid "Shared secret:" +msgstr "Secret partagé:" msgid "Hub Mode" msgstr "Mode concentrateur" diff --git a/src/qt/languages/hr-HR.po b/src/qt/languages/hr-HR.po index 32aaf1cf7..f1e8e3688 100644 --- a/src/qt/languages/hr-HR.po +++ b/src/qt/languages/hr-HR.po @@ -2840,8 +2840,8 @@ msgstr "Lokalni prekidač" msgid "Remote Switch" msgstr "Udaljeni prekidač" -msgid "Switch:" -msgstr "Prekidač:" +msgid "Shared secret:" +msgstr "Zajednička tajna:" msgid "Hub Mode" msgstr "Način čvorišta" diff --git a/src/qt/languages/it-IT.po b/src/qt/languages/it-IT.po index f46d09159..71fc69bce 100644 --- a/src/qt/languages/it-IT.po +++ b/src/qt/languages/it-IT.po @@ -2838,8 +2838,8 @@ msgstr "Commutatore locale" msgid "Remote Switch" msgstr "Commutatore remoto" -msgid "Switch:" -msgstr "Commutatore:" +msgid "Shared secret:" +msgstr "Segreto condiviso:" msgid "Hub Mode" msgstr "Modalità Hub" diff --git a/src/qt/languages/ja-JP.po b/src/qt/languages/ja-JP.po index 027b05204..487e5e297 100644 --- a/src/qt/languages/ja-JP.po +++ b/src/qt/languages/ja-JP.po @@ -2839,8 +2839,8 @@ msgstr "ローカルスイッチ" msgid "Remote Switch" msgstr "リモートスイッチ" -msgid "Switch:" -msgstr "スイッチ:" +msgid "Shared secret:" +msgstr "共有秘密:" msgid "Hub Mode" msgstr "ハブモード" diff --git a/src/qt/languages/ko-KR.po b/src/qt/languages/ko-KR.po index a46dc07c7..cd85aec57 100644 --- a/src/qt/languages/ko-KR.po +++ b/src/qt/languages/ko-KR.po @@ -2838,8 +2838,8 @@ msgstr "로컬 스위치" msgid "Remote Switch" msgstr "원격 스위치" -msgid "Switch:" -msgstr "스위치:" +msgid "Shared secret:" +msgstr "공유 비밀:" msgid "Hub Mode" msgstr "허브 모드" diff --git a/src/qt/languages/nb-NO.po b/src/qt/languages/nb-NO.po index b22f0bf69..b8370fedb 100644 --- a/src/qt/languages/nb-NO.po +++ b/src/qt/languages/nb-NO.po @@ -2839,8 +2839,8 @@ msgstr "Lokal svitsj" msgid "Remote Switch" msgstr "Ekstern svitsj" -msgid "Switch:" -msgstr "Svitsj:" +msgid "Shared secret:" +msgstr "Delt hemmelighet:" msgid "Hub Mode" msgstr "Hub-modus" diff --git a/src/qt/languages/nl-NL.po b/src/qt/languages/nl-NL.po index 3ad6f4feb..e48409dcd 100644 --- a/src/qt/languages/nl-NL.po +++ b/src/qt/languages/nl-NL.po @@ -2838,8 +2838,8 @@ msgstr "Lokale Switch" msgid "Remote Switch" msgstr "Externe Switch" -msgid "Switch:" -msgstr "Switch:" +msgid "Shared secret:" +msgstr "Gedeeld geheim:" msgid "Hub Mode" msgstr "Hub-modus" diff --git a/src/qt/languages/pl-PL.po b/src/qt/languages/pl-PL.po index e67ada685..e235bf995 100644 --- a/src/qt/languages/pl-PL.po +++ b/src/qt/languages/pl-PL.po @@ -2839,8 +2839,8 @@ msgstr "Switch lokalny" msgid "Remote Switch" msgstr "Switch zdalny" -msgid "Switch:" -msgstr "Switch:" +msgid "Shared secret:" +msgstr "Wspólny sekret:" msgid "Hub Mode" msgstr "Tryb hub" diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index 5ffbc2c72..bd95c22ce 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -2832,8 +2832,8 @@ msgstr "Switch Local" msgid "Remote Switch" msgstr "Switch Remoto" -msgid "Switch:" -msgstr "Switch:" +msgid "Shared secret:" +msgstr "Segredo compartilhado:" msgid "Hub Mode" msgstr "Modo Hub" diff --git a/src/qt/languages/pt-PT.po b/src/qt/languages/pt-PT.po index 8f0f55caf..123376ee1 100644 --- a/src/qt/languages/pt-PT.po +++ b/src/qt/languages/pt-PT.po @@ -2839,8 +2839,8 @@ msgstr "Comutador local" msgid "Remote Switch" msgstr "Comutador remoto" -msgid "Switch:" -msgstr "Comutador:" +msgid "Shared secret:" +msgstr "Segredo partilhado:" msgid "Hub Mode" msgstr "Modo de concentrador" diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index 9ca679356..2f272b262 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -2851,8 +2851,8 @@ msgstr "Локальный коммутатор" msgid "Remote Switch" msgstr "Удалённый коммутатор" -msgid "Switch:" -msgstr "Номер коммутатора:" +msgid "Shared secret:" +msgstr "Общий секрет:" msgid "Hub Mode" msgstr "Режим концентратора" diff --git a/src/qt/languages/sk-SK.po b/src/qt/languages/sk-SK.po index a5570faeb..2de580e32 100644 --- a/src/qt/languages/sk-SK.po +++ b/src/qt/languages/sk-SK.po @@ -2838,8 +2838,8 @@ msgstr "Lokálny prepínač" msgid "Remote Switch" msgstr "Vzdialený prepínač" -msgid "Switch:" -msgstr "Prepínač:" +msgid "Shared secret:" +msgstr "Zdieľané tajomstvo:" msgid "Hub Mode" msgstr "Režim hubu" diff --git a/src/qt/languages/sl-SI.po b/src/qt/languages/sl-SI.po index dfe0acbcd..bbddd9a7e 100644 --- a/src/qt/languages/sl-SI.po +++ b/src/qt/languages/sl-SI.po @@ -2840,8 +2840,8 @@ msgstr "Lokalno stikalo" msgid "Remote Switch" msgstr "Oddaljeno stikalo" -msgid "Switch:" -msgstr "Stikalo:" +msgid "Shared secret:" +msgstr "Skupna skrivnost:" msgid "Hub Mode" msgstr "Način koncentratorja" diff --git a/src/qt/languages/sv-SE.po b/src/qt/languages/sv-SE.po index 5a8c7291c..c5a09f506 100644 --- a/src/qt/languages/sv-SE.po +++ b/src/qt/languages/sv-SE.po @@ -2838,8 +2838,8 @@ msgstr "Lokal switch" msgid "Remote Switch" msgstr "Fjärr-switch" -msgid "Switch:" -msgstr "Switch:" +msgid "Shared secret:" +msgstr "Delad hemlighet:" msgid "Hub Mode" msgstr "Hubb-läge" diff --git a/src/qt/languages/tr-TR.po b/src/qt/languages/tr-TR.po index 510fd82f3..d113c92b8 100644 --- a/src/qt/languages/tr-TR.po +++ b/src/qt/languages/tr-TR.po @@ -2838,8 +2838,8 @@ msgstr "Yerel Switch" msgid "Remote Switch" msgstr "Uzak Switch" -msgid "Switch:" -msgstr "Switch:" +msgid "Shared secret:" +msgstr "Paylaşılan sır:" msgid "Hub Mode" msgstr "Hub Modu" diff --git a/src/qt/languages/uk-UA.po b/src/qt/languages/uk-UA.po index d1964e647..3e6b695e1 100644 --- a/src/qt/languages/uk-UA.po +++ b/src/qt/languages/uk-UA.po @@ -2840,8 +2840,8 @@ msgstr "Локальний комутатор" msgid "Remote Switch" msgstr "Віддалений комутатор" -msgid "Switch:" -msgstr "Номер комутатора:" +msgid "Shared secret:" +msgstr "Спільний секрет:" msgid "Hub Mode" msgstr "Режим концентратора" diff --git a/src/qt/languages/vi-VN.po b/src/qt/languages/vi-VN.po index 73b59831a..4bd9d7baa 100644 --- a/src/qt/languages/vi-VN.po +++ b/src/qt/languages/vi-VN.po @@ -2839,8 +2839,8 @@ msgstr "Công tắc cục bộ" msgid "Remote Switch" msgstr "Công tắc từ xa" -msgid "Switch:" -msgstr "Công tắc:" +msgid "Shared secret:" +msgstr "Bí mật chia sẻ:" msgid "Hub Mode" msgstr "Chế độ hub" diff --git a/src/qt/languages/zh-CN.po b/src/qt/languages/zh-CN.po index 7e98480cd..706c7f8ad 100644 --- a/src/qt/languages/zh-CN.po +++ b/src/qt/languages/zh-CN.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2026-01-23 17:57+0000\n" +"PO-Revision-Date: 2026-02-11 06:30+0000\n" "Last-Translator: BlueRain-debug \n" "Language-Team: Chinese (Simplified Han script) \n" @@ -2839,8 +2839,8 @@ msgstr "本地交换机" msgid "Remote Switch" msgstr "远程交换机" -msgid "Switch:" -msgstr "交换机:" +msgid "Shared secret:" +msgstr "共享密钥:" msgid "Hub Mode" msgstr "集线器模式" diff --git a/src/qt/languages/zh-TW.po b/src/qt/languages/zh-TW.po index 78365a911..2b2189f2c 100644 --- a/src/qt/languages/zh-TW.po +++ b/src/qt/languages/zh-TW.po @@ -2839,8 +2839,8 @@ msgstr "本地交換器" msgid "Remote Switch" msgstr "遠端交換器" -msgid "Switch:" -msgstr "交換器:" +msgid "Shared secret:" +msgstr "共用秘鑰:" msgid "Hub Mode" msgstr "集線器模式" diff --git a/src/qt/qt_settingsnetwork.cpp b/src/qt/qt_settingsnetwork.cpp index 878944e60..ff933fceb 100644 --- a/src/qt/qt_settingsnetwork.cpp +++ b/src/qt/qt_settingsnetwork.cpp @@ -49,13 +49,9 @@ SettingsNetwork::enableElements(Ui::SettingsNetwork *ui) auto *option_list_label = findChild(QString("labelOptionList%1").arg(i + 1)); auto *option_list_line = findChild(QString("lineOptionList%1").arg(i + 1)); - // Switch group - auto *switch_group_label = findChild(QString("labelSwitch%1").arg(i + 1)); - // auto *switch_group_hlayout = findChild(QString("HLayoutSwitch%1").arg(i + 1)); - // auto *switch_group_hspacer = findChild(QString("horizontalSpacerSwitch%1").arg(i + 1)); - auto *switch_group_value = findChild(QString("spinnerSwitch%1").arg(i + 1)); - switch_group_value->setMinimum(NET_SWITCH_GRP_MIN); - switch_group_value->setMaximum(NET_SWITCH_GRP_MAX); + // Shared secret + auto *secret_label = findChild(QString("labelSecret%1").arg(i + 1)); + auto *secret_value = findChild(QString("secretSwitch%1").arg(i + 1)); // Promiscuous option auto *promisc_label = findChild(QString("labelPromisc%1").arg(i + 1)); @@ -73,10 +69,8 @@ SettingsNetwork::enableElements(Ui::SettingsNetwork *ui) // NEW STUFF // Make all options invisible by default - // Switch group - switch_group_label->setVisible(false); - switch_group_value->setVisible(false); - // switch_group_hspacer->setVisible(false); + secret_label->setVisible(false); + secret_value->setVisible(false); // Promiscuous options promisc_label->setVisible(false); @@ -142,10 +136,9 @@ SettingsNetwork::enableElements(Ui::SettingsNetwork *ui) option_list_label->setVisible(true); option_list_line->setVisible(true); - // Switch group - switch_group_label->setVisible(true); - switch_group_value->setVisible(true); - // switch_group_hspacer->setVisible(false); + // Shared secret + secret_label->setVisible(true); + secret_value->setVisible(true); // Promiscuous options promisc_label->setVisible(true); @@ -157,10 +150,9 @@ SettingsNetwork::enableElements(Ui::SettingsNetwork *ui) option_list_label->setVisible(true); option_list_line->setVisible(true); - // Switch group - switch_group_label->setVisible(true); - switch_group_value->setVisible(true); - // switch_group_hspacer->setVisible(false); + // Shared secret + secret_label->setVisible(true); + secret_value->setVisible(true); // Hostname hostname_label->setVisible(true); @@ -215,7 +207,7 @@ SettingsNetwork::save() cbox = findChild(QString("comboBoxIntf%1").arg(i + 1)); auto *hostname_value = findChild(QString("hostnameSwitch%1").arg(i + 1)); auto *promisc_value = findChild(QString("boxPromisc%1").arg(i + 1)); - auto *switch_group_value = findChild(QString("spinnerSwitch%1").arg(i + 1)); + auto *secret_value = findChild(QString("secretSwitch%1").arg(i + 1)); memset(net_cards_conf[i].host_dev_name, '\0', sizeof(net_cards_conf[i].host_dev_name)); if (net_cards_conf[i].net_type == NET_TYPE_PCAP) strncpy(net_cards_conf[i].host_dev_name, network_devs[cbox->currentData().toInt()].device, sizeof(net_cards_conf[i].host_dev_name) - 1); @@ -230,10 +222,12 @@ SettingsNetwork::save() else if (net_cards_conf[i].net_type == NET_TYPE_NRSWITCH) { memset(net_cards_conf[i].nrs_hostname, '\0', sizeof(net_cards_conf[i].nrs_hostname)); strncpy(net_cards_conf[i].nrs_hostname, hostname_value->text().toUtf8().constData(), sizeof(net_cards_conf[i].nrs_hostname) - 1); - net_cards_conf[i].switch_group = switch_group_value->value(); + memset(net_cards_conf[i].secret, '\0', sizeof(net_cards_conf[i].secret)); + strncpy(net_cards_conf[i].secret, secret_value->text().toUtf8().constData(), sizeof(net_cards_conf[i].secret) - 1); } else if (net_cards_conf[i].net_type == NET_TYPE_NLSWITCH) { net_cards_conf[i].promisc_mode = promisc_value->isChecked(); - net_cards_conf[i].switch_group = switch_group_value->value(); + memset(net_cards_conf[i].secret, '\0', sizeof(net_cards_conf[i].secret)); + strncpy(net_cards_conf[i].secret, secret_value->text().toUtf8().constData(), sizeof(net_cards_conf[i].secret) - 1); } } } @@ -349,13 +343,13 @@ SettingsNetwork::onCurrentMachineChanged(int machineId) } else if (net_cards_conf[i].net_type == NET_TYPE_NLSWITCH) { auto *promisc_value = findChild(QString("boxPromisc%1").arg(i + 1)); promisc_value->setCheckState(net_cards_conf[i].promisc_mode == 1 ? Qt::CheckState::Checked : Qt::CheckState::Unchecked); - auto *switch_group_value = findChild(QString("spinnerSwitch%1").arg(i + 1)); - switch_group_value->setValue(net_cards_conf[i].switch_group); + auto *secret_value = findChild(QString("secretSwitch%1").arg(i + 1)); + secret_value->setText(net_cards_conf[i].secret); } else if (net_cards_conf[i].net_type == NET_TYPE_NRSWITCH) { auto *hostname_value = findChild(QString("hostnameSwitch%1").arg(i + 1)); hostname_value->setText(net_cards_conf[i].nrs_hostname); - auto *switch_group_value = findChild(QString("spinnerSwitch%1").arg(i + 1)); - switch_group_value->setValue(net_cards_conf[i].switch_group); + auto *secret_value = findChild(QString("secretSwitch%1").arg(i + 1)); + secret_value->setText(net_cards_conf[i].secret); } } } diff --git a/src/qt/qt_settingsnetwork.ui b/src/qt/qt_settingsnetwork.ui index 12b74004f..5f7bd316a 100644 --- a/src/qt/qt_settingsnetwork.ui +++ b/src/qt/qt_settingsnetwork.ui @@ -170,38 +170,18 @@ - + - Switch: + Shared secret: - - - - - 1 - - - 10 - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - + + + 256 + + @@ -385,38 +365,18 @@ - + - Switch: + Shared secret: - - - - - 1 - - - 10 - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - + + + 256 + + @@ -600,38 +560,18 @@ - + - Switch: + Shared secret: - - - - - 1 - - - 10 - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - + + + 256 + + @@ -815,38 +755,18 @@ - + - Switch: + Shared secret: - - - - - 1 - - - 10 - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - + + + 256 + + diff --git a/src/video/vid_cl54xx.c b/src/video/vid_cl54xx.c index 7979758ef..0a3060467 100644 --- a/src/video/vid_cl54xx.c +++ b/src/video/vid_cl54xx.c @@ -1870,10 +1870,12 @@ gd54xx_recalctimings(svga_t *svga) svga->interlace = (svga->crtc[0x1a] & 0x01); - if (!(svga->gdcreg[6] & 1) && !(svga->attrregs[0x10] & 1)) { /*Text mode*/ - svga->interlace = 0; + if (!svga->scrblank && svga->attr_palette_enable) { + if (!(svga->gdcreg[6] & 1) && !(svga->attrregs[0x10] & 1)) /*Text mode*/ + svga->interlace = 0; } + pclog("CRTC1a=%x, interlace=%x.\n", svga->crtc[0x1a] & 0x01, svga->interlace); clocksel = (svga->miscout >> 2) & 3; if (!gd54xx->vclk_n[clocksel] || !gd54xx->vclk_d[clocksel]) @@ -2059,19 +2061,19 @@ gd54xx_recalctimings(svga_t *svga) } } - svga->vram_display_mask = (svga->crtc[0x1b] & 2) ? gd54xx->vram_mask : 0x3ffff; + svga->vram_display_mask = (svga->crtc[0x1b] & 0x02) ? gd54xx->vram_mask : 0x3ffff; if (svga->crtc[0x27] >= CIRRUS_ID_CLGD5430) svga->htotal += ((svga->crtc[0x1c] >> 3) & 0x07); - if (!(svga->gdcreg[6] & 1) && !(svga->attrregs[0x10] & 1)) { /*Text mode*/ + if (!(svga->gdcreg[6] & 0x01) && !(svga->attrregs[0x10] & 0x01)) { /*Text mode*/ if (svga->seqregs[1] & 8) svga->render = svga_render_text_40; else svga->render = svga_render_text_80; } - if (!(svga->seqregs[0x07] & CIRRUS_SR7_BPP_SVGA)) { + if (!(svga->seqregs[0x07] & CIRRUS_SR7_BPP_SVGA) && (((svga->gdcreg[6] >> 2) & 0x03) != 0x01)) { svga->extra_banks[0] = 0; svga->extra_banks[1] = 0x8000; } @@ -2288,7 +2290,7 @@ gd54xx_write(uint32_t addr, uint8_t val, void *priv) xga_write_test(addr, val, svga); - if (!(svga->seqregs[0x07] & CIRRUS_SR7_BPP_SVGA)) { + if (!(svga->seqregs[0x07] & CIRRUS_SR7_BPP_SVGA) && (((svga->gdcreg[6] >> 2) & 0x03) != 0x01)) { svga_write(addr, val, svga); return; } @@ -2318,7 +2320,7 @@ gd54xx_writew(uint32_t addr, uint16_t val, void *priv) xga_write_test(addr, val, svga); xga_write_test(addr + 1, val >> 8, svga); - if (!(svga->seqregs[0x07] & CIRRUS_SR7_BPP_SVGA)) { + if (!(svga->seqregs[0x07] & CIRRUS_SR7_BPP_SVGA) && (((svga->gdcreg[6] >> 2) & 0x03) != 0x01)) { svga_writew(addr, val, svga); return; } @@ -2357,7 +2359,7 @@ gd54xx_writel(uint32_t addr, uint32_t val, void *priv) xga_write_test(addr + 2, val >> 16, svga); xga_write_test(addr + 3, val >> 24, svga); - if (!(svga->seqregs[0x07] & CIRRUS_SR7_BPP_SVGA)) { + if (!(svga->seqregs[0x07] & CIRRUS_SR7_BPP_SVGA) && (((svga->gdcreg[6] >> 2) & 0x03) != 0x01)) { svga_writel(addr, val, svga); return; } @@ -2914,7 +2916,7 @@ gd54xx_read(uint32_t addr, void *priv) svga_t *svga = (svga_t *) priv; gd54xx_t *gd54xx = (gd54xx_t *) svga->local; - if (!(svga->seqregs[0x07] & CIRRUS_SR7_BPP_SVGA)) + if (!(svga->seqregs[0x07] & CIRRUS_SR7_BPP_SVGA) && (((svga->gdcreg[6] >> 2) & 0x03) != 0x01)) return svga_read(addr, svga); if (gd54xx->countminusone && gd54xx->blt.ms_is_dest && @@ -2935,7 +2937,7 @@ gd54xx_readw(uint32_t addr, void *priv) gd54xx_t *gd54xx = (gd54xx_t *) svga->local; uint16_t ret; - if (!(svga->seqregs[0x07] & CIRRUS_SR7_BPP_SVGA)) + if (!(svga->seqregs[0x07] & CIRRUS_SR7_BPP_SVGA) && (((svga->gdcreg[6] >> 2) & 0x03) != 0x01)) return svga_readw(addr, svga); if (gd54xx->countminusone && gd54xx->blt.ms_is_dest && @@ -2960,7 +2962,7 @@ gd54xx_readl(uint32_t addr, void *priv) gd54xx_t *gd54xx = (gd54xx_t *) svga->local; uint32_t ret; - if (!(svga->seqregs[0x07] & CIRRUS_SR7_BPP_SVGA)) + if (!(svga->seqregs[0x07] & CIRRUS_SR7_BPP_SVGA) && (((svga->gdcreg[6] >> 2) & 0x03) != 0x01)) return svga_readl(addr, svga); if (gd54xx->countminusone && gd54xx->blt.ms_is_dest && @@ -4421,6 +4423,7 @@ gd54xx_init(const device_t *info) vram = 1024; else vram = device_get_config_int("memory"); + gd54xx->vram_size = vram << 10; } else { if (id <= CIRRUS_ID_CLGD5428) { @@ -4432,6 +4435,7 @@ gd54xx_init(const device_t *info) vram = 512; else vram = device_get_config_int("memory"); + gd54xx->vram_size = vram << 10; } else { vram = device_get_config_int("memory"); diff --git a/src/video/vid_rtg310x.c b/src/video/vid_rtg310x.c index 76b8d8f3f..f43e7f643 100644 --- a/src/video/vid_rtg310x.c +++ b/src/video/vid_rtg310x.c @@ -76,7 +76,7 @@ rtg_in(uint16_t addr, void *priv) case 0x3cf: if (svga->gdcaddr == 0x0c) - return svga->gdcreg[0x0c] | 4; + return svga->gdcreg[0x0c] | 0x04; else if ((svga->gdcaddr > 8) && (svga->gdcaddr != 0x0c)) return svga->gdcreg[svga->gdcaddr]; break; @@ -89,13 +89,13 @@ rtg_in(uint16_t addr, void *priv) return dev->type << 6; if (svga->crtcreg == 0x1e) { ret = svga->crtc[0x1e]; - ret &= ~3; + ret &= ~0x03; if (dev->vram_size == 1024) - ret = 2; + ret = 0x02; else if (dev->vram_size == 512) - ret = 1; + ret = 0x01; else - ret = 0; + ret = 0x00; return ret; } return svga->crtc[svga->crtcreg]; @@ -207,60 +207,60 @@ rtg_out(uint16_t addr, uint8_t val, void *priv) static void rtg_recalctimings(svga_t *svga) { - const rtg_t *dev = (rtg_t *) svga->priv; + const rtg_t *dev = (rtg_t *) svga->priv; + int clk_sel = ((svga->miscout >> 2) & 0x03) | ((svga->gdcreg[0x0c] & 0x20) >> 3); svga->memaddr_latch |= ((svga->crtc[0x19] & 0x10) << 16) | ((svga->crtc[0x19] & 0x40) << 17); - svga->interlace = (svga->crtc[0x19] & 1); + svga->interlace = (svga->crtc[0x19] & 0x01); - /*Clock table not available, currently a guesswork*/ - switch (((svga->miscout >> 2) & 3) | ((svga->gdcreg[0x0c] & 0x20) >> 3)) { - case 0: - case 1: - break; + /*Source: xfree86 3.3.6 source code, rt_driver.c.*/ + switch (clk_sel) { case 2: - svga->clock = (cpuclock * (double) (1ULL << 32)) / 36000000.0; - break; - case 3: - svga->clock = (cpuclock * (double) (1ULL << 32)) / 65100000.0; - break; - case 4: svga->clock = (cpuclock * (double) (1ULL << 32)) / 44900000.0; break; + case 3: + svga->clock = (cpuclock * (double) (1ULL << 32)) / 71600000.0; + break; + case 4: + svga->clock = (cpuclock * (double) (1ULL << 32)) / 73000000.0; + break; case 5: - svga->clock = (cpuclock * (double) (1ULL << 32)) / 50000000.0; + svga->clock = (cpuclock * (double) (1ULL << 32)) / 64000000.0; break; case 6: - svga->clock = (cpuclock * (double) (1ULL << 32)) / 80000000.0; + svga->clock = (cpuclock * (double) (1ULL << 32)) / 84000000.0; break; case 7: - svga->clock = (cpuclock * (double) (1ULL << 32)) / 75000000.0; + svga->clock = (cpuclock * (double) (1ULL << 32)) / 79000000.0; break; default: break; } - switch (svga->gdcreg[0x0c] & 3) { - case 1: - svga->clock /= 1.5; - break; - case 2: - svga->clock /= 2; - break; - case 3: - svga->clock /= 4; - break; + if (clk_sel >= 2) { + switch (svga->gdcreg[0x0b] & 0x03) { + case 1: + svga->clock *= 1.5; + break; + case 2: + svga->clock *= 2.0; + break; + case 3: + svga->clock *= 4.0; + break; - default: - break; + default: + break; + } } if (!svga->scrblank && (svga->crtc[0x17] & 0x80) && svga->attr_palette_enable) { if ((svga->gdcreg[6] & 1) || (svga->attrregs[0x10] & 1)) { switch (svga->gdcreg[5] & 0x60) { case 0x00: - if (svga->seqregs[1] & 8) /*Low res (320)*/ + if (svga->seqregs[1] & 0x08) /*Low res (320)*/ svga->render = svga_render_4bpp_lowres; else { if (svga->hdisp == 1280) @@ -270,17 +270,18 @@ rtg_recalctimings(svga_t *svga) } break; case 0x20: /*4 colours*/ - if (svga->seqregs[1] & 8) /*Low res (320)*/ + if (svga->seqregs[1] & 0x08) /*Low res (320)*/ svga->render = svga_render_2bpp_lowres; else svga->render = svga_render_2bpp_highres; break; case 0x40: case 0x60: - if (svga->crtc[0x19] & 2) { - if (svga->hdisp == 1280) + if (svga->crtc[0x19] & 0x02) { + if (svga->hdisp == 1280) { svga->hdisp >>= 1; - else if (dev->type == 2) + svga->dots_per_clock >>= 1; + } else if (dev->type == 2) svga->rowoffset <<= 1; svga->render = svga_render_8bpp_highres;