VOGONS


Reply 220 of 591, by superfury

User metadata
Rank l33t++
Rank
l33t++

Just added a bit of extra checks(making floppy disk image creation and hard disk image creation check if the destination disk image is currently mounted. In the case of hard disk comversion, it'll now force a reboot of the emulated client(hard disk image is overwritten by another one, thus invalid for the currently emulated system(esp. Windows/linux, which may have parts cached in memory)). In the case of a mounted floppy it'll force a remount of the disk image(just unmount and remount it, making the FDC think the disk is ejected, changed on another PC and reinserted after that, because remounting it sets the disk changed flag(or drive door opened flag in bit 7 of the HDD-shared I/O port)).

I've also added an option to create empty, unformatted(only single 0-type 128-byte sectors on tracks) IMD disk images.

Author of the UniPCemu emulator.
UniPCemu Git repository
UniPCemu for Android, Windows, PSP, Vita and Switch on itch.io

Reply 221 of 591, by superfury

User metadata
Rank l33t++
Rank
l33t++

Just tried running PC-Check 6.21 on my 80486 emulation. It seems to display the GUI with the logo, then hang on some instructions from 5BF0:6454, which mostly consists of 0x0000 bytes being executed by the CPU?

The logo displays fine, while the bottom of the screen says:

Pc-Check 6.21, Loading Drive Library...                                       (rights side of the screen)10001  

Author of the UniPCemu emulator.
UniPCemu Git repository
UniPCemu for Android, Windows, PSP, Vita and Switch on itch.io

Reply 222 of 591, by superfury

User metadata
Rank l33t++
Rank
l33t++

OK. It seems that the location MS-DOS 6.22 setup crashes from is starting at F000:8985, executing an IRET. So that's address 985h in the BIOS ROM itself(the two ROMs combined).

The last interrupt fired was a single-step interrupt(INT 01h) it seems.

Edit: OK, interesting... Tracing the BIOS disassembly back, I see that it might actually be a INT 13h call from MS-DOS 6.22 that went awry, somehow setting the Trap flag along the way?

Author of the UniPCemu emulator.
UniPCemu Git repository
UniPCemu for Android, Windows, PSP, Vita and Switch on itch.io

Reply 223 of 591, by superfury

User metadata
Rank l33t++
Rank
l33t++

OK. So, according to the Compaq Deskpro 386 technical reference manual, it uses a "B237A-5 Byte DMA Controller" (taken from https://www.pcjs.org/machines/pcx86/compaq/deskpro386/ , the COMPAQ DeskPro 386 Technical Reference Guide
(Volume I, Sep 1986) page 2-38.

It is indeed a normal DMA controller according to what follows in the documentation(it also explains something about the DMA page registers' working). Apparently it even has a second PIT at 48h-4Bh, although I have no idea how said " Failsafe Clock" actually works, but it's probably just a normal NMI(according to page 4-67). So it's the normal failsafe timer. That's not actually implemented in UniPCemu yet.

Edit: Having fixed the DMA controller to behave as intended(at least it's intended that way with the FDC), MS-DOS 6.22 setup now properly loads and doesn't crash(because the data to write to memory is discarded by the DMA controller since it's in verify mode during that part). 😁

Author of the UniPCemu emulator.
UniPCemu Git repository
UniPCemu for Android, Windows, PSP, Vita and Switch on itch.io

Reply 224 of 591, by superfury

User metadata
Rank l33t++
Rank
l33t++

I've also now implemented the "Failsafe Clock" from the documentation. It now ticks and triggers an NMI (when it's enabled), replacing the memory I/O NMI, as documented in the Compaq Deskpro 386 technical reference guide.
So now, the motherboard is fully emulated(according to that documentation on it's I/O ports and peripherals). The only thing I actually left out and didn't implement is the Numeric Coprocessor part, but no 80387 or 80*87 is implemented, so it shouldn't be a problem, right?

Author of the UniPCemu emulator.
UniPCemu Git repository
UniPCemu for Android, Windows, PSP, Vita and Switch on itch.io

Reply 225 of 591, by superfury

User metadata
Rank l33t++
Rank
l33t++

OK. Just reinstalled Windows 95 RTM. Now the explorer.exe seems to be hanging itself somehow?

When opening the Start menu or This PC, it starts hanging until you terminate it using the task manager?
Something went quite wrong in those last builds... I doubt it's the DMA controller, though.

Author of the UniPCemu emulator.
UniPCemu Git repository
UniPCemu for Android, Windows, PSP, Vita and Switch on itch.io

Reply 226 of 591, by superfury

User metadata
Rank l33t++
Rank
l33t++

It's happening quite strangely: when Windows 95 RTM boots, it loads the desktop(OK), then proceeds to load the first time boot message(that What's new in Windows 95 program), then about right after that the mouse still responds, but all applications pretty much start doing nothing at all?

Anyone knows what might be the cause? I ran wincheckit 4's bootdisk, but it immediately crashes with a "Divide error"?

Author of the UniPCemu emulator.
UniPCemu Git repository
UniPCemu for Android, Windows, PSP, Vita and Switch on itch.io

Reply 227 of 591, by superfury

User metadata
Rank l33t++
Rank
l33t++

OK. It might be that either explorer.exe(which contains all that hangs) is damaged, or it's actually not running in the correct way.
Would there be an easy way to verify this?

Author of the UniPCemu emulator.
UniPCemu Git repository
UniPCemu for Android, Windows, PSP, Vita and Switch on itch.io

Reply 228 of 591, by superfury

User metadata
Rank l33t++
Rank
l33t++

OK. Running the program manager as the shell in Windows 95 doesn't crash. So it's clearly a problem with Explorer.exe.

And while debugging the issue in Visual Studio, once again the debugger took Visual Studio along it to hang... Getting pretty annoying by now, trying to debug only to have Visual Studio hang on me while doing so...

But at least the Program Manager seemed to work fine. So that's at least something to test the Windows 95 kernel with! 😁

Author of the UniPCemu emulator.
UniPCemu Git repository
UniPCemu for Android, Windows, PSP, Vita and Switch on itch.io

Reply 229 of 591, by superfury

User metadata
Rank l33t++
Rank
l33t++

OK. I just tried to run the File Manager application from the Windows 95 Main program group. It seems to hang as well?
Edit: Yup. Windows 95's Winfile.exe also seems to stop responding when starting up, just like Explorer.exe.

Edit: Tried running Hyperterminal to check if the COM port was functioning properly, which opened the folder for the Hyperterminal programs. Then running Hyperterminal itself ran fine(other than it not being able to propely send any dial commands to the serial modem. I see it modifying RTS and DTR, but since the modem is setup for having CTS and DSR always set(default settings), it seems that Hyperterminal(and Windows for that matter) don't like it?
I do see the modem responding to DTR being lowered, by resetting the modem to it's default settings, though.

Anyone knows something about how the serial modem's default settings are supposed to be like?

The current defaults are:

	modem.communicationstandard = 0; //Default communication standard!
modem.echomode = 1; //Default: echo back!
//Speaker controls
modem.speakervolume = 3; //Max level speaker volume!
modem.speakercontrol = 1; //Enabled speaker!
//Result defaults
modem.verbosemode = 1; //Text-mode verbose!
modem.callprogressmethod = 4;
//Default handling of the Hardware lines is also loaded:
modem.DCDisCarrier = 1; //Default: DCD=Set Data Carrier Detect (DCD) signal according to remote modem data carrier signal..
modem.DTROffResponse = 2; //Default: Hang-up and Goto AT command mode?!
modem.flowcontrol = 3; //Default: Enable RTS/CTS flow control!
modem.communicationsmode = 5; //Default: communications mode 5 for V-series system products, &Q0 for Smartmodem products! So use &Q5 here!
modem.CTSAlwaysActive = 1; //Default: CTS controlled by flow control!
modem.DSRisConnectionEstablished = 0; //Default: DSR always ON!
//Finish up the default settings!
modem.datamode = 0; //In command mode!

Are those default settings correct?

UniPCemu sets the lines as follows:

	//0: Clear to Send(Can we buffer data to be sent), 1: Data Set Ready(Not hang up, are we ready for use), 2: Ring Indicator, 3: Carrrier detect
if (modem.communicationsmode && (modem.communicationsmode < 4)) //Synchronous mode? CTS is affected!
{
switch (modem.CTSAlwaysActive)
{
case 0: //Track RTS?
result |= ((modem.effectiveline >> 1) & 1); //Track RTS!
break;
case 1: //Depends on the buffers!
result |= ((modem.datamode == 1) ? ((modem.connectionid >= 0) ? (fifobuffer_freesize(modem.outputbuffer[modem.connectionid]) ? 1 : 0) : 1) : 1); //Can we send to the modem?
break;
case 2: //Always on?
result |= 1; //Always on!
break;
}
}
else
{
//Hayes documentation says it doesn't control CTS and RTS functions!
result |= ((modem.effectiveline >> 1) & 1); //Always on! &Rn has no effect according to Hayes docs! But do this anyways!
}
//DSRisConnectionEstablished: 0:1, 1:DTR
if ((modem.communicationsmode) && (modem.communicationsmode < 5)) //Special actions taken?
{
//((modem.outputline & 1) << 1)
switch (modem.DSRisConnectionEstablished) //What state?
{
default:
case 0: //S0?
case 1: //S1?
//0 at command state and idle, handshake(connected) turns on, lowered when hanged up.
if ((modem.connected == 1) && (modem.datamode != 2)) //Handshaked?
{
result |= 2; //Raise the line!
}
//Otherwise, lower the line!
break;
case 2: //S2?
//0 at command state and idle, prior to handshake turns on, lowered when hanged up.
if ((modem.connected == 1) && (modem.datamode)) //Handshaked or pending handshake?
{
result |= 2; //Raise the line!
}
//Otherwise, lower the line!
break;
}
}
else //Q0/5/6?
{
switch (modem.DSRisConnectionEstablished) //What state?
{
default:
case 0: //S0?
result |= 2; //Always raised!
break;
case 1: //S1?
result |= ((modem.outputline & 1) << 1); //Follow handshake!
break;
case 2: //S2?
result |= ((modem.outputline & 1) << 1); //Follow handshake!
Show last 7 lines
			break;
}
}
result |= (((modem.ringing&1)&((modem.ringing)>>1))?4:0)| //Currently Ringing?
(((modem.connected==1)||(modem.DCDisCarrier==0))?8:0); //Connected or forced on?
return result; //Give the resulting line status!
}

Anyone?

Author of the UniPCemu emulator.
UniPCemu Git repository
UniPCemu for Android, Windows, PSP, Vita and Switch on itch.io

Reply 230 of 591, by superfury

User metadata
Rank l33t++
Rank
l33t++

OK. Reinstalling Windows 95 RTM from scratch(with a cleared harddisk) seemed to have fixed the Start menu problem at least! 😁 Haven't checked the explorer yet, though(File explorer in the 3.1 interface, Explorer.exe as well as This PC). System properties works fine, though! 😁

Although I noticed I had to configure various hardware devices(primarily IRQ settings) manually from the System Properties? Those devices are incorrectly detecting things like IRQ settings(mainly).

Those are:
- Sound Blaster IRQ somehow set to 3. This is actually the IRQ of the second COM port. It's supposed to be 5(which is what the hardware raises and lowers).
- The serial mouse is detected twice and the duplicate has to be removed? Why would this happen? It's only responding on one UART(COM1) at 3F8?
- It only detects one of the two CD-ROM drives by default? It's set up for drive n-n, where n=n, so only one drive is visible(two drives on the secondary slave are present)?
- The UARTs have the FIFO enabled, while they have none.

There's also something I don't know:
- "IO read data port for ISA Plug and Play enumerator". Looking at it's automatic settings says 270h,370h,238h,338h(4 ports each at said address).
Anyone knows what this is?

The MPU-401(whose Intellingent version is a slightly adjusted version of Dosbox's, with my own MIDI softsynth connected to it(either my softsynth or passed through to Windows, setup by the Soundfont setting and passthrough setting in the emulator settings)) is currently not enabled in the emulation settings. It's the only device still unlisted.

Anyone?

Author of the UniPCemu emulator.
UniPCemu Git repository
UniPCemu for Android, Windows, PSP, Vita and Switch on itch.io

Reply 231 of 591, by superfury

User metadata
Rank l33t++
Rank
l33t++

When running the add new hardware wizard, I actually see the IRR register setting it's IR bits when handling the interrupt, until the Sound Blaster status register is read, which clears the IR line.
Since the IRR register is still set then, that would mean the IRQ5(Of the Sound Blaster) is masked off or not raised yet due to cleared interrupt flag? Anyone knows how Windows 95 detects hardware IRQs?

Author of the UniPCemu emulator.
UniPCemu Git repository
UniPCemu for Android, Windows, PSP, Vita and Switch on itch.io

Reply 232 of 591, by superfury

User metadata
Rank l33t++
Rank
l33t++

Just found a tiny bug in the multithreading code(the code that's responsible for all threads starting, parameters and finishing/deleting and registration of threads). When a thread was requested to be started, it would immediately return with the unstarted thread(thread pool allocated and request given to start, but the thread itself hasn't marked it as being running or terminated yet(which is done from the thread itself)) in some cases. So when the main thread after starting another thread(or the debugger thread starting another thread), it would see the thread as not running anymore and delete the thread pointer(set it to NULL, blindly assuming the thread has ended).

I've now added some bit of code to the multithreading thread start handler(which is called for starting a new thread) that does some synchronization with the thread, waiting for it to start executing and mark itself as running or terminated, only returning after that is detected(or the thread has been deleted by finishing the thread from within the thread itself, in which case no problem occurs with the caller(it's terminated anyway)).

Author of the UniPCemu emulator.
UniPCemu Git repository
UniPCemu for Android, Windows, PSP, Vita and Switch on itch.io

Reply 233 of 591, by superfury

User metadata
Rank l33t++
Rank
l33t++

Just found a bug in the ATAPI bytes left detection(for partial transfers). When a transfer had exactly 64K as the amount of bytes to transfer in one go, it would report 0x10000 bytes to use, which would be truncated to 0 bytes because it's stored in a 16-bit variable(for example, with the cylinder high/low registers). I've just fixed it to become 0xFFFE bytes instead in that case(which IS a valid value to transfer) instead of 0 in that case. The same case was happening for the end-of-transfer detection, which was being truncated to 0 in that case(and invalid 16-bit truncated values for anything larger than 64K becoming modulo 64K, which is incorrect). Now it's properly handling those cases as 0xFFFE bytes instead(the largest that can be transferred in one go).

That seems to get rid of all the Status=0x48 IRQ time out messages on Debian Bo.

Author of the UniPCemu emulator.
UniPCemu Git repository
UniPCemu for Android, Windows, PSP, Vita and Switch on itch.io

Reply 234 of 591, by superfury

User metadata
Rank l33t++
Rank
l33t++

Lol. Although I was testing the hardware and CPU emulation with Debian Bo, I also found out how it archieves it's 'screen saver' functionality: simply have the start of rendered characters at a window's end address(at least one window of characters worth) through the start address registers, then set the cursor location within that window's addresses(so it won't display at all), and fill the entire wndow with black(attribute 0 for foreground and background) 'space'(0x20) characters. So in that way, it creates a black display area without cursor, simulating the display being off!

Wouldn't it be easier to just set the Sequencer Clocking Mode register bit 5(SD -- Screen Disable) bit?

Author of the UniPCemu emulator.
UniPCemu Git repository
UniPCemu for Android, Windows, PSP, Vita and Switch on itch.io

Reply 235 of 591, by superfury

User metadata
Rank l33t++
Rank
l33t++

Just tried running Windows 95 OSR 2.5 again(aka Windows 95C).

It seems to end up at address 1E:xxxxh, executing a FFFFh instruction, which is GRP5 /7, which doesn't exist?
This seems to fault directly to the BIOS, causing the entire thing to come crashing down(hanging with infinite #UD faults at the same address)?

Edit: OK. The first opcode at that segment being executed is this:

Details

RealRAM(p):00010085=75(u); RAM(p):00010085=75(u); Physical(p):00010085=75(u); Paged(p):00010085=75(u); Normal(p):0000fea5=75(u); RealRAM(p):00010086=7c(|); RAM(p):00010086=7c(|); Physical(p):00010086=7c(|); Paged(p):00010086=7c(|); Normal(p):0000fea6=7c(|); RealRAM(p):00010087=ff(ÿ); RAM(p):00010087=ff(ÿ); Physical(p):00010087=ff(ÿ); Paged(p):00010087=ff(ÿ); Normal(p):0000fea7=ff(ÿ); RealRAM(p):00010088=76(v); RAM(p):00010088=76(v); Physical(p):00010088=76(v); Paged(p):00010088=76(v); Normal(p):0000fea8=76(v); RealRAM(p):00010089=f2(ò); RAM(p):00010089=f2(ò); Physical(p):00010089=f2(ò); Paged(p):00010089=f2(ò); Normal(p):0000fea9=f2(ò); RealRAM(p):0001008a=ff(ÿ); RAM(p):0001008a=ff(ÿ); Physical(p):0001008a=ff(ÿ); Paged(p):0001008a=ff(ÿ); Normal(p):0000feaa=ff(ÿ); RealRAM(p):0001008b=76(v); RAM(p):0001008b=76(v); Physical(p):0001008b=76(v); Paged(p):0001008b=76(v); Normal(p):0000feab=76(v); RealRAM(p):0001008c=f0(ð); RAM(p):0001008c=f0(ð); Physical(p):0001008c=f0(ð); Paged(p):0001008c=f0(ð); Normal(p):0000feac=f0(ð); RealRAM(p):0001008d=e8(è); RAM(p):0001008d=e8(è); Physical(p):0001008d=e8(è); Paged(p):0001008d=e8(è); Normal(p):0000fead=e8(è); RealRAM(p):0001008e=54(T); RAM(p):0001008e=54(T); Physical(p):0001008e=54(T); Paged(p):0001008e=54(T); Normal(p):0000feae=54(T); RealRAM(p):0001008f=37(7); RAM(p):0001008f=37(7); Physical(p):0001008f=37(7); Paged(p):0001008f=37(7); Normal(p):0000feaf=37(7); RealRAM(p):00010090=83(ƒ); RAM(p):00010090=83(ƒ); Physical(p):00010090=83(ƒ); Paged(p):00010090=83(ƒ); Normal(p):0000feb0=83(ƒ); RealRAM(p):00010091=c4(Ä); RAM(p):00010091=c4(Ä); Physical(p):00010091=c4(Ä); Paged(p):00010091=c4(Ä); Normal(p):0000feb1=c4(Ä); RealRAM(p):00010092=04(); RAM(p):00010092=04(); Physical(p):00010092=04(); Paged(p):00010092=04(); Normal(p):0000feb2=04(); RealRAM(p):00010093=ff(ÿ); RAM(p):00010093=ff(ÿ); Physical(p):00010093=ff(ÿ); Paged(p):00010093=ff(ÿ); Normal(p):0000feb3=ff(ÿ)
001e:0000fea5 75 7C jnz 0000ff23
Registers:
EAX: 000008a3 EBX: 00000004 ECX: 00000000 EDX: 00000007
ESP: 00000940 EBP: 0000001b ESI: 00001560 EDI: 0000c000
CS: 001e DS: 24d0 ES: 08a3 FS: 0000 GS: 0000 SS: 08a3 TR: 0000 LDTR: 0000
EIP: 0000fea5 EFLAGS: 00000246
CR0: 00000000 CR1: 00000000 CR2: 00000000 CR3: 00000000
DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000
DR6: 00000000 DR7: 00000000
GDTR: 00000000d15b0018 IDTR: 000000000000ffff
CS descriptor: 0000930001E0FFFF
DS descriptor: 00CF93024D00FFFF
ES descriptor: 00CF93008A30FFFF
FS descriptor: 000093000000FFFF
GS descriptor: 000093000000FFFF
SS descriptor: 000093008A30FFFF
TR descriptor: 000082000000FFFF
LDTR descriptor: 0000000000000000
Previous CS:EIP: 0070:00000378
FLAGSINFO: 00000000000000vr0n00odItsZ0a0P1c
RealRAM(p):00010094=76(v); RAM(p):00010094=76(v); Physical(p):00010094=76(v); Paged(p):00010094=76(v); Normal(p):0000feb4=76(v); RealRAM(p):00010095=fa(ú); RAM(p):00010095=fa(ú); Physical(p):00010095=fa(ú); Paged(p):00010095=fa(ú); Normal(p):0000feb5=fa(ú)
001e:0000fea7 FF 76 F2 push word ss:[bp-0e] RealRAM(r):00008a3d=00( ); RAM(r):00008a3d=00( ); Physical(r):00008a3d=00( ); Paged(r):00008a3d=00( ); RealRAM(r):00008a3e=46(F); RAM(r):00008a3e=46(F); Physical(r):00008a3e=46(F); Paged(r):00008a3e=46(F); Paged(w):0000936e=00( ); Physical(w):0000936e=00( ); RAM(w):0000936e=00( ); RealRAM(w):0000936e=00( ); Paged(w):0000936f=46(F); Physical(w):0000936f=46(F); RAM(w):0000936f=46(F); RealRAM(w):0000936f=46(F)
Registers:
EAX: 000008a3 EBX: 00000004 ECX: 00000000 EDX: 00000007
ESP: 00000940 EBP: 0000001b ESI: 00001560 EDI: 0000c000
CS: 001e DS: 24d0 ES: 08a3 FS: 0000 GS: 0000 SS: 08a3 TR: 0000 LDTR: 0000
EIP: 0000fea7 EFLAGS: 00000246
CR0: 00000000 CR1: 00000000 CR2: 00000000 CR3: 00000000
DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000
DR6: 00000000 DR7: 00000000
GDTR: 00000000d15b0018 IDTR: 000000000000ffff
CS descriptor: 0000930001E0FFFF
DS descriptor: 00CF93024D00FFFF
ES descriptor: 00CF93008A30FFFF
FS descriptor: 000093000000FFFF
GS descriptor: 000093000000FFFF
SS descriptor: 000093008A30FFFF
TR descriptor: 000082000000FFFF
LDTR descriptor: 0000000000000000
FLAGSINFO: 00000000000000vr0n00odItsZ0a0P1c

That's kind of a strange way to start a program or driver? What software starts with a JNZ to a ridiculously high address? Also, segment 1Eh in real mode is in the middle of the IVT? So that shouldn't happen to begin with?

This is what happens(full common emulator format log with extra details):

Filename
debugger_Windows95C_crash_UniPCemu_20200504_2047.7z
File size
27.96 KiB
Downloads
44 downloads
File comment
Debugger log of Windows 95 crash into BIOS #UD with extra details added.
File license
Fair use/fair dealing exception

Interestingly, the previous instruction was at 0070:00000378. 378h is the port of the LPT1? Or perhaps some weird address being addressed inside the IO.SYS?
Although it's outside the 64K barrier(address 10085h).

Author of the UniPCemu emulator.
UniPCemu Git repository
UniPCemu for Android, Windows, PSP, Vita and Switch on itch.io

Reply 236 of 591, by superfury

User metadata
Rank l33t++
Rank
l33t++

Just tried running some games for verifying if they still run properly(various MS-DOS 32-bit games).

I noticed, when running Discworld, that there were still a lot of DPMI(or what seemed like it) processes loaded in memory, according to "mem /D /p"?
Is that supposed to happen? Aren't those supposed to be cleaned up and unloaded once the game is terminated?

Author of the UniPCemu emulator.
UniPCemu Git repository
UniPCemu for Android, Windows, PSP, Vita and Switch on itch.io

Reply 237 of 591, by superfury

User metadata
Rank l33t++
Rank
l33t++

With the latest commits, UniPCemu now keeps most of it's previous machine settings(Emulated CPU, Data bus size, (Turbo) CPU speed, Turbo CPU speed mode, clocking mode) in the architecture-specific section. The architecture, execution mode, show CPU speed, BIOS ROM mode and inboard initial waitstates are still a global setting.

Said architecture-specific settings are now(together with other settings like emulated memory, CMOS state, timekeeping and mode as well as the floppy drive type without any disk inserted) only set for the currently selected architecture. Said architecture is selected when the emulator is started(the architecture setting). You can change the architecture setting to be loaded when the emulator restarts or is started, but it won't apply until the emulator is actually rebooted or started again(which makes said architecture active).

Perhaps I'll add a little text in the Settings menu that shows the currently active architecture to show which one is currently being changed...
Edit: Just added said marker just below the Settings menu text, above the current menu title.

Author of the UniPCemu emulator.
UniPCemu Git repository
UniPCemu for Android, Windows, PSP, Vita and Switch on itch.io

Reply 238 of 591, by superfury

User metadata
Rank l33t++
Rank
l33t++

Just tried Comanche: Maximum Overkill on UniPCemu's latest commit. It seems to run without visible issues.
Windows 95 B and up still hang during boot at real mode segment 1Eh executing opcode FFFFh?
Edit: Privateer still hangs(at least with Sound Blaster being setup for both effects and music)? Anyone knows if this is a software issue or some CPU emulation issue itself that must have a problem?

Author of the UniPCemu emulator.
UniPCemu Git repository
UniPCemu for Android, Windows, PSP, Vita and Switch on itch.io

Reply 239 of 591, by superfury

User metadata
Rank l33t++
Rank
l33t++

Just added a new little feature to UniPCemu's parameters:

You can now direct added joysticks(by plugging them in when using SDL2 builds) to make UniPCemu only start connecting to it when it has focus(so only the active window receives the input event that tells it to connect to the joystick).
Said feature also adds a little extra: when a joystick is connected while the parameter is used, UniPCemu will even respond to it when it doesn't have focus, allowing for multiplayer using multiple joysticks connected to multiple instances of UniPCemu(each joystick on one instance).

Said parameter is multiplayerjoysticks .

So, to start such a multiplayer session, simply open up one instances of UniPCemu with said parameter added to the command line(or using a shortcut to UniPCemu's executable on Windows) for each of the players.

Then follow the following steps to associate a joystick with an instance:
1. Give window focus to the instance to associate it with
2. Connect the controller to associate with the instance.

These steps are repeated for each controller to associate with an instance (no more than 1 controller for each instance).

Although it currently still only supports XBox 360 controllers (Using the old pre-SDL2 gamecontroller method).

So if you have multiple XBox 360 controllers, you can now use them to play multiplayer joystick games using, for example, two UniPCemu instances running a mulitplayer game over the modem! 😁

Last edited by superfury on 2020-08-17, 16:41. Edited 1 time in total.

Author of the UniPCemu emulator.
UniPCemu Git repository
UniPCemu for Android, Windows, PSP, Vita and Switch on itch.io