VOGONS


Reply 40 of 591, by superfury

User metadata
Rank l33t++
Rank
l33t++

I've just retried Jazz Jackrabbit on the current release(I've only improved a few things since the last release yesterday, mainly single-step exception faulting better by a little bit(saving registers properly instead of resetting them to pre-instruction state incorrectly), saving CPL and changed segment descriptor cache for restoration on faults(previously only the segment selectors were restored), modifying the TR and it's cache to do the same as the SS, DS,ES,FS and GS descriptors(just use the same pool buffer), small OPL2 phase conversion warning fix and finally some PIQ filling optimization during IPS clocking mode(using less memory checks, as they're now checked(up to 3 memory checks instead of the old up to PIQ size memory checks(e.g. 16)) before fetching as much as can be fetched into the PIQ in said clocking mode only(a full PIQ should suffice for any instruction that the 80486 can handle(more than the maximum PIQ buffer anyway, except during redundant prefixes, in which case the EU will fault when fetching them, which triggers a PIQ refetch anyways).

The entire game seems to work properly, except the text input for inputting the save game (file)name. When inputting said text, it seems to either have some weird key input-based delay(you need to press x more keys before the first keys inputted are shifted into the field) or perhaps some issue that has something to do with it only seeing keys that are different from the previous key inputted somehow? MS-DOS works just fine(when inputting text at least and other required functionality too afaik), so why would Jazz Jackrabbit mess up the key input part? Does it do something special with the keyboard controller, it's key buffer or some internal processing of keys that were inputted? Oddly enough, gameplay seems to be unaffected by said bug?

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

Reply 41 of 591, by Stenzek

User metadata
Rank Newbie
Rank
Newbie

Hmm, I also had the delayed text input issue at one point. Not sure if it's related, but it went away after I'd rewritten my keyboard controller emulation with the serial timing (so reading the port twice would give the same value, until the next scancode is filled).

Reply 42 of 591, by superfury

User metadata
Rank l33t++
Rank
l33t++

Well, UniPCemu already does that? Reading an empty 8042 buffer(poft 0x60) gives the last value read until a new byte is received.

Receiving takes 11 clocks, sending takes 12 clocks(sending has priority).

Sending and receiving is checked each clock. It simply sums 1 to the total clocks each time. When the counter is 11 or higher, 11 is substracted for receiving or 12 for sending. Then counting up resumes like earlier.

When the output buffer is filled, nothing new is received(and the counter keeps filling).

void update8042(DOUBLE timepassed) //Update 8042 input/output timings!
{
uint_64 clocks; //Clocks to tick!
//Sending costs 12 clocks(1 start bit, 8 data bits, 1 parity bit, 1 stop bit, 1 ACN bit), Receiving costs 11 clocks(1 start bit, 8 data bits, 1 parity bit, 1 stop bit)
timing8042 += timepassed; //For ticking!
clocks = (uint_64)SAFEDIV(timing8042,timing8042_tick); //How much to tick in whole ticks!
timing8042 -= (clocks*timing8042_tick); //Substract the clocks we tick!

//Now clocks contains the amount of clocks we're to tick! First clock input to the device(sending data to the device has higher priority), then output from the device!
clocks8042 += clocks; //Add the clocks we're to tick to the clocks to tick to get the new amount of clocks passed!
byte outputpending, inputpending, outputprocessed, inputprocessed;
outputpending = (Controller8042.status_buffer & 2); //Output pending to be sent? Takes 12 clocks
inputpending = ((Controller8042.status_buffer & 1) == 0); //Input pending to be received? Takes 11 clocks
outputprocessed = inputprocessed = 0; //Default: not processed!
//Information about the clocks can be found at: http://halicery.com/8042/8042_INTERN_TXT.htm
for (;(((clocks8042>=11) && inputpending) || ((clocks8042>=12) && outputpending));) //Enough to tick at at least once?
{
if (outputpending && (outputprocessed==0)) //Output buffer is full?
{
if (clocks8042 >= 12) //Are enough clocks ready to send?
{
if (Controller8042.WritePending) //Write(Input buffer) is pending?
{
Controller8042.status_buffer &= ~0x2; //Cleared input buffer!
if (Controller8042.WritePending==3) //To 8042 command?
{
Controller8042.WritePending = 0; //Not pending anymore!
if (is_XT==0) //We're an AT?
{
#ifdef LOG8042
if (force8042 == 0) //Not forced for initialization?
{
dolog("8042", "Write port 0x64: %02X", value);
}
#endif
Controller8042.status_high = 0; //Disable high status, we're writing a new command!
Controller8042.command = Controller8042.input_buffer; //Set command!
commandwritten_8042(); //Written handler!
}
}
else if (Controller8042.WritePending==4) //To first PS/2 Output?
{
Controller8042.WritePending = 0; //Not pending anymore!
Controller8042.output_buffer = Controller8042.input_buffer; //Input to output!
Controller8042.status_buffer |= 0x1; //Set output buffer full!
Controller8042.status_buffer &= ~0x20; //Clear AUX bit!
if (PS2_FIRSTPORTINTERRUPTENABLED(Controller8042))
{
lowerirq(12); //Remove the mouse IRQ!
acnowledgeIRQrequest(12); //Acnowledge!
lowerirq(1); //Remove the keyboard IRQ!
raiseirq(1); //Call the interrupt if neccesary!
}
goto finishwrite; //Abort normal process!
}
else if (Controller8042.WritePending==5) //To second PS/2 Output?
{
Controller8042.WritePending = 0; //Not pending anymore!
Controller8042.output_buffer = Controller8042.input_buffer; //Input to output!
Controller8042.status_buffer |= 0x1; //Set output buffer full!
Show last 95 lines
						Controller8042.status_buffer |= 0x20; //Set AUX bit!
if (PS2_SECONDPORTINTERRUPTENABLED(Controller8042))
{
lowerirq(1); //Remove the keyboard IRQ!
acnowledgeIRQrequest(1); //Acnowledge!
lowerirq(12); //Remove the mouse IRQ!
raiseirq(12); //Call the interrupt if neccesary!
}
goto finishwrite; //Abort normal process!
}
else
{
if (Controller8042.inputtingsecurity) //Inputting security string?
{
Controller8042.securitychecksum += Controller8042.input_buffer; //Add to the value!
if (Controller8042.input_buffer==0)
{
Controller8042.inputtingsecurity = 0; //Finished inputting?
Controller8042.securitykey = Controller8042.securitychecksum; //Set the new security key!
}
goto finishwrite; //Don't process normally!
}
if (Controller8042.writeoutputport) //Write the output port?
{
Controller8042.outputport = Controller8042.input_buffer; //Write the output port directly!
refresh_outputport(); //Handle the new output port!
Controller8042.writeoutputport = 0; //Not anymore!
goto finishwrite; //Don't process normally!
}
if (Controller8042.Write_RAM) //Write to VRAM byte?
{
if (Controller8042.Write_RAM == 1) //Might require enabling the ports?
{
if (((Controller8042.data[0]&0x10)==0x10) && ((Controller8042.input_buffer&0x10)==0)) //Was disabled and is enabled?
{
if (Controller8042.portenabledhandler[0]) //Enabled handler?
{
Controller8042.portenabledhandler[0](2); //Handle the hardware being turned on by it resetting!
}
}
else if (((Controller8042.data[0] & 0x10) == 0x00) && ((Controller8042.input_buffer & 0x10) == 0x10)) //Was enabled and is disabled?
{
if (Controller8042.portenabledhandler[0]) //Enabled handler?
{
Controller8042.portenabledhandler[0](0x82); //Handle the hardware being turned on by it resetting!
}
}
if (((Controller8042.data[0]&0x20)==0x20) && ((Controller8042.input_buffer&0x20)==0)) //Was disabled and is enabled?
{
if (Controller8042.portenabledhandler[1]) //Enabled handler?
{
Controller8042.portenabledhandler[1](2); //Handle the hardware being turned on by it resetting!
}
}
else if (((Controller8042.data[0] & 0x20) == 0x00) && ((Controller8042.input_buffer & 0x20) == 0x20)) //Was enabled and is disabled?
{
if (Controller8042.portenabledhandler[1]) //Enabled handler?
{
Controller8042.portenabledhandler[1](0x82); //Handle the hardware being turned on by it resetting!
}
}
}

Controller8042.RAM[Controller8042.Write_RAM-1] = Controller8042.input_buffer; //Set data in RAM!
Controller8042.Write_RAM = 0; //Not anymore!
goto finishwrite; //Don't process normally!
}
Controller8042.portwrite[Controller8042.WritePending-1](Controller8042.input_buffer); //Write data to the specified port!
finishwrite: //Not a normal hardware write?
Controller8042.WritePending = 0; //Not pending anymore!
}
clocks8042 -= 12; //Substract the pending data, because we're now processed and sent completely!
}
}
outputprocessed = 1; //We're processed!
}
else if ((inputpending) && (inputprocessed==0)) //Output buffer is empty?
{
if (clocks8042 >= 11) //Are enough clocks ready to receive?
{
if (fill8042_output_buffer(1)) //Have we received something?
{
clocks8042 -= 11; //Substract from our clocks, because we've received something!
}
}
inputprocessed = 1; //We're processed!
}
else if ((outputprocessed || (outputpending==0)) && ((inputprocessed) || (inputpending==0))) //Nothing to be done? Both have been checked!
break; //Stop:
}
if (!((inputpending&~inputprocessed)|(outputpending&~outputprocessed))) //Input and output isn't pending?
{
clocks8042 = 0; //Start counting again! Reset out sending/receiving!
}
}

The connected hardware response itself(keyboard and mouse) are instantaneous when sending/receiving to(fill8042_output_buffer for receiving from peripheral and Controller8042.portwrite[port](byte val) for sending to keyboard/mouse). The only timing they have is some basic response time and packet timeout(mouse) and key rate/delay(keyboard). Buffers aren't filled when they don't have enough space, the state of the input becomes pending in that case(and will be handled once there is enough room).

The signal(the first few rows of the function handle that, where it determines and adds to clocks8042) is ticking at 16.7kHz.

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

Reply 43 of 591, by superfury

User metadata
Rank l33t++
Rank
l33t++

Any games that you know of requiring all 80286 protected mode functionality to work and run properly? So proper interrupts, task switching, gates, segmentation etc.? So essentially everything that's not 32-bit and paging?

Edit: A bit of progress on Windows 3.0. It's finally running in Standard mode! 😁

1064-Windows 3.0a in Standard mode is running like Windows 3.1.jpg
Filename
1064-Windows 3.0a in Standard mode is running like Windows 3.1.jpg
File size
79.99 KiB
Views
1767 views
File comment
Windows 3.0a in Standard mode is running like Windows 3.1 in Standard mode now.
File license
Fair use/fair dealing exception

It has the exact same problem as Windows 3.1 regarding MS-DOS applications being run in that mode.

Everything went fine(ran notepad, clipboard, program manager, setup in parallel perfectly fine, using alt+tab to switch between them.

Now when I try to run the "MS-DOS prompt" shortcut, I see a full-screen MS-DOS 6.22 command.com being ran to a MS-DOS prompt. Then, typing "dir" just shows "r" being typed, then the keyboard is unresponsive(kind of like Windows 3.1 in Standard mode). 3.11 fully crashes to a blinking cursor on black background in top-left corner.

So, there's some real mode or keyboard issue still left somehow? Anyone?

Edit: Windows 3.0 and 3.1 behave the same regarding to MS-DOS applications, except 3.0 seems to have taken a bit of input before not accepting any input anymore. At least in Standard mode, this is the case.
Edit: Just tried Windows 3.0 in Real mode. Everything runs fine as well, until I start the MS-DOS prompt with the shortcut. Then the same issue as with Protected mode occurs. Typing "dir" a few times makes an "r" being typed in the MS-DOS prompt. No other input seems to get through, not even Alt-Tab.

So all modes(3.0 in real and Standard modes, 3.1 in Standard mode) run fine until a MS-DOS application is ran. Windows 3.0 types "r" when typing "dir" and then doesn't respond to keyboard input anymore. Windows 3.1 doesn't repond for any keyboard input.

This happens on UniPCemu's 80386 emulation(80386DX in IPS clocking mode at 3 MIPS speed).

1065-Windows 3.0a in Standard mode running MS-DOS prompt shortcut typing dir a few times.jpg
Filename
1065-Windows 3.0a in Standard mode running MS-DOS prompt shortcut typing dir a few times.jpg
File size
16.1 KiB
Views
1763 views
File comment
Windows 3.0a in Real mode running the MS-DOS prompt shortcut typing dir a few times.
File license
Fair use/fair dealing exception

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

Reply 44 of 591, by superfury

User metadata
Rank l33t++
Rank
l33t++

Managed to fix two PS/2 keyboard bugs(command F3(set key delay/rate) not being handled properly since emulating at cycle accuracy and the 8042 output buffer being filled with the escape F0 part of the scancode without setting status bit 0, being changed to fully handled properly again and leaving the last value of the output buffer in the output register until it's fully received and decoded(so F0xx->yy instead of F0xx->F0yy(F0 not setting status bit 0).

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

Reply 45 of 591, by superfury

User metadata
Rank l33t++
Rank
l33t++

Hmmmm... Since Windows 3.x in real and standard mode exhibit the same issue with the PS/2 keyboard, and the PS/2 keyboard is working properly(generating XT scancodes properly) and the MS-DOS prompt doesn't see it in that case, that would mean there's a real mode cpu problem? And since it's built for 8086+, the issue must lie somewhere in the 8086+ opcode emulation?

Edit: Now that the 8042 is properly fixed, as well as the PS/2 keyboard's missing command, now keyboard input works properly for all cases that were going wrong(Jazz Jackrabit, Windows 3.x ) 😁

So it's back to finding bugs in the CPU now. Primarily 80386-related bugs afaik. Didn't find any known bugs with my 80286+ software so far.

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

Reply 46 of 591, by superfury

User metadata
Rank l33t++
Rank
l33t++

Just retried Windows 3.0a with HIMEM and EMM386 from the Windows folder loaded, running it with the /3 switch for 386 Enhanced mode. It seems to hang/crash on a HLT at 0000:0000, previous opcode being at 0048:0868?

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

Reply 47 of 591, by superfury

User metadata
Rank l33t++
Rank
l33t++

Just reinstalled Windows 3.0a and fixed the config.sys drivers to use it properly.

Now, running Windows 3.0 in 386 enhanced mode(with himem.sys and emm386.sys loaded(emm386 reporting 256k memory)), EMM386 crashes with a "EMM386 Exception error #08 - press ENTER to reboot".

So a double fault occurs for some odd reason?

Edit: Either a double fault or timer IRQ0?
Edit: Just found a bug in the addressing of a 32-bit BT instruction(using the same ModR/M offset addition as a 16-bit BT instruction(DIV 16 times 2) instead of it's proper DIV 32 times 4 addition).

Edit: Having fixed those, I no longer see Page faults from Windows 3.0 booting in 386 enhanced mode, but I do see an INT 41h from privilege level 1(which fails due to not having enough rights for the PL0 interrupt gate), after which I eventually see something trying to use the DS segment, which is pointing at a privilege level 1 segment(the same as the original INT 41h fault handler) with only 1 byte of valid space(thus limited to only byte #0, according to the segment descriptor)?
Edit: That INT 41h seems to be correct, according to the logging I have of Windows 3.0 booting in 386 enhanced mode. I see some STI and CLI instructions faulting, which seems normal to me. Then I see DS being loaded with value 0x17D(which has a limit of 0, thus only 1 byte large)? That seems to be causing further trouble down the road, after faulting to kernel mode.

It happens at 0105:56DD. Somehow, I don't think that's supposed to happen when booting Windows 3.1 in 386 enhanced mode?
Edit: It seems I'm right. It doesn't appear anywhere in the win30_3 log file.
Edit: So the problem is somewhere in the program or driver at segment 0105h.
So it's probably something starting at 0105:04CD in protected mode?
Edit: Hmmmm.... Looking for the very first instruction of that segment, it's at 105:7c58 in UniPCemu. The previous opcode seems to have been at a5:7c57? The log also doesn't mention segment a5, but immediately before the jump to segment 105h, it's at segment 05a5 instead?

Edit: I see it diverging paths at 0028:80006c7e, which is a 0xFF opcode JMP to the dword location incorrectly?

UniPCemu's log of that location:

0028:80006c71 0F 82 82 26 00 00 jc 800092f9	RealRAM(p):0010bc7c=01(); RAM(p):0016bc7c=01(); Physical(p):0016bc7c=01(); Paged(p):80006c7c=01(); Normal(p):80006c7c=01(); RealRAM(p):0010bc7d=80(?); RAM(p):0016bc7d=80(?); Physical(p):0016bc7d=80(?); Paged(p):80006c7d=80(?); Normal(p):80006c7d=80(?); RealRAM(p):0010bc7e=ff(?); RAM(p):0016bc7e=ff(?); Physical(p):0016bc7e=ff(?); Paged(p):80006c7e=ff(?); Normal(p):80006c7e=ff(?); RealRAM(p):0010bc7f=24($); RAM(p):0016bc7f=24($); Physical(p):0016bc7f=24($); Paged(p):80006c7f=24($); Normal(p):80006c7f=24($); RealRAM(p):0010bc80=c5(?); RAM(p):0016bc80=c5(?); Physical(p):0016bc80=c5(?); Paged(p):80006c80=c5(?); Normal(p):80006c80=c5(?)
Registers:
EAX: 0000014b EBX: 80561000 ECX: 0000f4f4 EDX: 00000180
ESP: 800132b4 EBP: 80013390 ESI: 0000014b EDI: 000000f4
CS: 0028 DS: 0030 ES: 0030 FS: 0039 GS: 0000 SS: 0030 TR: 0018 LDTR: 0060
EIP: 80006c71 EFLAGS: 00000206
CR0: 80000001 CR1: 00000000 CR2: 000b8000 CR3: 001a6000
DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000
DR6: 00000000 DR7: 00000000
GDTR: 00008010011c010f IDTR: 00008062b00002ff
FLAGSINFO: 00000000000000vr0n00odItsz0a0P1c
0028:80006c77 8B 14 C5 40 3A 01 80 mov edx,dword ds:[80013a40+eax*8] RealRAM(p):0010bc81=3c(<); RAM(p):0016bc81=3c(<); Physical(p):0016bc81=3c(<); Paged(p):80006c81=3c(<); Normal(p):80006c81=3c(<); RealRAM(p):0010bc82=3a(:); RAM(p):0016bc82=3a(:); Physical(p):0016bc82=3a(:); Paged(p):80006c82=3a(:); Normal(p):80006c82=3a(:); RealRAM(p):0010bc83=01(); RAM(p):0016bc83=01(); Physical(p):0016bc83=01(); Paged(p):80006c83=01(); Normal(p):80006c83=01(); RealRAM(p):0010bc84=80(?); RAM(p):0016bc84=80(?); Physical(p):0016bc84=80(?); Paged(p):80006c84=80(?); Normal(p):80006c84=80(?); RealRAM(p):0010bc85=cd(?); RAM(p):0016bc85=cd(?); Physical(p):0016bc85=cd(?); Paged(p):80006c85=cd(?); Normal(p):80006c85=cd(?); RealRAM(p):0010bc86=20( ); RAM(p):0016bc86=20( ); Physical(p):0016bc86=20( ); Paged(p):80006c86=20( ); Normal(p):80006c86=20( ); RealRAM(r):00119498=21(!); RAM(r):00179498=21(!); Physical(r):00179498=21(!); Paged(r):80014498=21(!); RealRAM(r):00119499=00( ); RAM(r):00179499=00( ); Physical(r):00179499=00( ); Paged(r):80014499=00( ); RealRAM(r):0011949a=00( ); RAM(r):0017949a=00( ); Physical(r):0017949a=00( ); Paged(r):8001449a=00( ); RealRAM(r):0011949b=00( ); RAM(r):0017949b=00( ); Physical(r):0017949b=00( ); Paged(r):8001449b=00( )
Registers:
EAX: 0000014b EBX: 80561000 ECX: 0000f4f4 EDX: 00000180
ESP: 800132b4 EBP: 80013390 ESI: 0000014b EDI: 000000f4
CS: 0028 DS: 0030 ES: 0030 FS: 0039 GS: 0000 SS: 0030 TR: 0018 LDTR: 0060
EIP: 80006c77 EFLAGS: 00000206
CR0: 80000001 CR1: 00000000 CR2: 000b8000 CR3: 001a6000
DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000
DR6: 00000000 DR7: 00000000
GDTR: 00008010011c010f IDTR: 00008062b00002ff
FLAGSINFO: 00000000000000vr0n00odItsz0a0P1c
0028:80006c7e FF 24 C5 3C 3A 01 80 jmp dword ds:[80013a3c+eax*8] RealRAM(p):0010bc87=2f(/); RAM(p):0016bc87=2f(/); Physical(p):0016bc87=2f(/); Paged(p):80006c87=2f(/); Normal(p):80006c87=2f(/); RealRAM(p):0010bc88=80(?); RAM(p):0016bc88=80(?); Physical(p):0016bc88=80(?); Paged(p):80006c88=80(?); Normal(p):80006c88=80(?); RealRAM(p):0010bc89=01(); RAM(p):0016bc89=01(); Physical(p):0016bc89=01(); Paged(p):80006c89=01(); Normal(p):80006c89=01(); RealRAM(p):0010bc8a=00( ); RAM(p):0016bc8a=00( ); Physical(p):0016bc8a=00( ); Paged(p):80006c8a=00( ); Normal(p):80006c8a=00( ); RealRAM(p):0010bc8b=90(?); RAM(p):0016bc8b=90(?); Physical(p):0016bc8b=90(?); Paged(p):80006c8b=90(?); Normal(p):80006c8b=90(?); RealRAM(p):0010bc8c=8b(?); RAM(p):0016bc8c=8b(?); Physical(p):0016bc8c=8b(?); Paged(p):80006c8c=8b(?); Normal(p):80006c8c=8b(?); RealRAM(p):0010bc8d=0d( ); RAM(p):0016bc8d=0d( ); Physical(p):0016bc8d=0d( ); Paged(p):80006c8d=0d( ); Normal(p):80006c8d=0d( ); RealRAM(r):00119494=6c(l); RAM(r):00179494=6c(l); Physical(r):00179494=6c(l); Paged(r):80014494=6c(l); RealRAM(r):00119495=cf(?); RAM(r):00179495=cf(?); Physical(r):00179495=cf(?); Paged(r):80014495=cf(?); RealRAM(r):00119496=02(); RAM(r):00179496=02(); Physical(r):00179496=02(); Paged(r):80014496=02(); RealRAM(r):00119497=80(?); RAM(r):00179497=80(?); Physical(r):00179497=80(?); Paged(r):80014497=80(?)
Registers:
EAX: 0000014b EBX: 80561000 ECX: 0000f4f4 EDX: 00000021
ESP: 800132b4 EBP: 80013390 ESI: 0000014b EDI: 000000f4
CS: 0028 DS: 0030 ES: 0030 FS: 0039 GS: 0000 SS: 0030 TR: 0018 LDTR: 0060
EIP: 80006c7e EFLAGS: 00000206
CR0: 80000001 CR1: 00000000 CR2: 000b8000 CR3: 001a6000
DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000
DR6: 00000000 DR7: 00000000
GDTR: 00008010011c010f IDTR: 00008062b00002ff
FLAGSINFO: 00000000000000vr0n00odItsz0a0P1c
0028:8002cf6c FF 15 20 35 01 80 call dword ds:[80013520] RealRAM(p):00138f6c=ff(?); RAM(p):00198f6c=ff(?); Physical(p):00198f6c=ff(?); Paged(p):8002cf6c=ff(?); Normal(p):8002cf6c=ff(?); RealRAM(p):00138f6d=15(); RAM(p):00198f6d=15(); Physical(p):00198f6d=15(); Paged(p):8002cf6d=15(); Normal(p):8002cf6d=15(); RealRAM(p):00138f6e=20( ); RAM(p):00198f6e=20( ); Physical(p):00198f6e=20( ); Paged(p):8002cf6e=20( ); Normal(p):8002cf6e=20( ); RealRAM(p):00138f6f=35(5); RAM(p):00198f6f=35(5); Physical(p):00198f6f=35(5); Paged(p):8002cf6f=35(5); Normal(p):8002cf6f=35(5); RealRAM(p):00138f70=01(); RAM(p):00198f70=01(); Physical(p):00198f70=01(); Paged(p):8002cf70=01(); Normal(p):8002cf70=01(); RealRAM(p):00138f71=80(?); RAM(p):00198f71=80(?); Physical(p):00198f71=80(?); Paged(p):8002cf71=80(?); Normal(p):8002cf71=80(?); RealRAM(p):00138f72=0f(); RAM(p):00198f72=0f(); Physical(p):00198f72=0f(); Paged(p):8002cf72=0f(); Normal(p):8002cf72=0f(); RealRAM(p):00138f73=b6(?); RAM(p):00198f73=b6(?); Physical(p):00198f73=b6(?); Paged(p):8002cf73=b6(?); Normal(p):8002cf73=b6(?); RealRAM(p):00138f74=45(E); RAM(p):00198f74=45(E); Physical(p):00198f74=45(E); Paged(p):8002cf74=45(E); Normal(p):8002cf74=45(E); RealRAM(p):00138f75=1d(); RAM(p):00198f75=1d(); Physical(p):00198f75=1d(); Paged(p):8002cf75=1d(); Normal(p):8002cf75=1d(); RealRAM(p):00138f76=83(?); RAM(p):00198f76=83(?); Physical(p):00198f76=83(?); Paged(p):8002cf76=83(?); Normal(p):8002cf76=83(?); RealRAM(p):00138f77=f8(?); RAM(p):00198f77=f8(?); Physical(p):00198f77=f8(?); Paged(p):8002cf77=f8(?); Normal(p):8002cf77=f8(?); RealRAM(p):00138f78=68(h); RAM(p):00198f78=68(h); Physical(p):00198f78=68(h); Paged(p):8002cf78=68(h); Normal(p):8002cf78=68(h); RealRAM(p):00138f79=77(w); RAM(p):00198f79=77(w); Physical(p):00198f79=77(w); Paged(p):8002cf79=77(w); Normal(p):8002cf79=77(w); RealRAM(p):00138f7a=14(); RAM(p):00198f7a=14(); Physical(p):00198f7a=14(); Paged(p):8002cf7a=14(); Normal(p):8002cf7a=14(); RealRAM(p):00138f7b=0f(); RAM(p):00198f7b=0f(); Physical(p):00198f7b=0f(); Paged(p):8002cf7b=0f(); Normal(p):8002cf7b=0f(); RealRAM(r):00118520=44(D); RAM(r):00178520=44(D); Physical(r):00178520=44(D); Paged(r):80013520=44(D); RealRAM(r):00118521=95(?); RAM(r):00178521=95(?); Physical(r):00178521=95(?); Paged(r):80013521=95(?); RealRAM(r):00118522=00( ); RAM(r):00178522=00( ); Physical(r):00178522=00( ); Paged(r):80013522=00( ); RealRAM(r):00118523=80(?); RAM(r):00178523=80(?); Physical(r):00178523=80(?); Paged(r):80013523=80(?); Paged(w):800132b0=72(r); Physical(w):001782b0=72(r); RAM(w):001782b0=72(r); RealRAM(w):001182b0=72(r); Paged(w):800132b1=cf(?); Physical(w):001782b1=cf(?); RAM(w):001782b1=cf(?); RealRAM(w):001182b1=cf(?); Paged(w):800132b2=02(); Physical(w):001782b2=02(); RAM(w):001782b2=02(); RealRAM(w):001182b2=02(); Paged(w):800132b3=80(?); Physical(w):001782b3=80(?); RAM(w):001782b3=80(?); RealRAM(w):001182b3=80(?)
Registers:
EAX: 0000014b EBX: 80561000 ECX: 0000f4f4 EDX: 00000021
ESP: 800132b4 EBP: 80013390 ESI: 0000014b EDI: 000000f4
CS: 0028 DS: 0030 ES: 0030 FS: 0039 GS: 0000 SS: 0030 TR: 0018 LDTR: 0060
EIP: 8002cf6c EFLAGS: 00000206
CR0: 80000001 CR1: 00000000 CR2: 000b8000 CR3: 001a6000
DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000
DR6: 00000000 DR7: 00000000
GDTR: 00008010011c010f IDTR: 00008062b00002ff
FLAGSINFO: 00000000000000vr0n00odItsz0a0P1c
0028:80009544 60 pushad RealRAM(p):0010e544=60(`); RAM(p):0016e544=60(`); Physical(p):0016e544=60(`); Paged(p):80009544=60(`); Normal(p):80009544=60(`); RealRAM(p):0010e545=8b(?); RAM(p):0016e545=8b(?); Physical(p):0016e545=8b(?); Paged(p):80009545=8b(?); Normal(p):80009545=8b(?); RealRAM(p):0010e546=1d(); RAM(p):0016e546=1d(); Physical(p):0016e546=1d(); Paged(p):80009546=1d(); Normal(p):80009546=1d(); RealRAM(p):0010e547=6c(l); RAM(p):0016e547=6c(l); Physical(p):0016e547=6c(l); Paged(p):80009547=6c(l); Normal(p):80009547=6c(l); RealRAM(p):0010e548=61(a); RAM(p):0016e548=61(a); Physical(p):0016e548=61(a); Paged(p):80009548=61(a); Normal(p):80009548=61(a); RealRAM(p):0010e549=01(); RAM(p):0016e549=01(); Physical(p):0016e549=01(); Paged(p):80009549=01(); Normal(p):80009549=01(); RealRAM(p):0010e54a=80(?); RAM(p):0016e54a=80(?); Physical(p):0016e54a=80(?); Paged(p):8000954a=80(?); Normal(p):8000954a=80(?); RealRAM(p):0010e54b=8b(?); RAM(p):0016e54b=8b(?); Physical(p):0016e54b=8b(?); Paged(p):8000954b=8b(?); Normal(p):8000954b=8b(?); RealRAM(p):0010e54c=6b(k); RAM(p):0016e54c=6b(k); Physical(p):0016e54c=6b(k); Paged(p):8000954c=6b(k); Normal(p):8000954c=6b(k); RealRAM(p):0010e54d=08(); RAM(p):0016e54d=08(); Physical(p):0016e54d=08(); Paged(p):8000954d=08(); Normal(p):8000954d=08(); RealRAM(p):0010e54e=f7(?); RAM(p):0016e54e=f7(?); Physical(p):0016e54e=f7(?); Paged(p):8000954e=f7(?); Normal(p):8000954e=f7(?); RealRAM(p):0010e54f=03(); RAM(p):0016e54f=03(); Physical(p):0016e54f=03(); Paged(p):8000954f=03(); Normal(p):8000954f=03(); RealRAM(p):0010e550=20( ); RAM(p):0016e550=20( ); Physical(p):0016e550=20( ); Paged(p):80009550=20( ); Normal(p):80009550=20( ); RealRAM(p):0010e551=00( ); RAM(p):0016e551=00( ); Physical(p):0016e551=00( ); Paged(p):80009551=00( ); Normal(p):80009551=00( ); RealRAM(p):0010e552=00( ); RAM(p):0016e552=00( ); Physical(p):0016e552=00( ); Paged(p):80009552=00( ); Normal(p):80009552=00( ); RealRAM(p):0010e553=00( ); RAM(p):0016e553=00( ); Physical(p):0016e553=00( ); Paged(p):80009553=00( ); Normal(p):80009553=00( ); Paged(w):800132ac=4b(K); Physical(w):001782ac=4b(K); RAM(w):001782ac=4b(K); RealRAM(w):001182ac=4b(K); Paged(w):800132ad=01(); Physical(w):001782ad=01(); RAM(w):001782ad=01(); RealRAM(w):001182ad=01(); Paged(w):800132ae=00( ); Physical(w):001782ae=00( ); RAM(w):001782ae=00( ); RealRAM(w):001182ae=00( ); Paged(w):800132af=00( ); Physical(w):001782af=00( ); RAM(w):001782af=00( ); RealRAM(w):001182af=00( ); Paged(w):800132a8=f4(?); Physical(w):001782a8=f4(?); RAM(w):001782a8=f4(?); RealRAM(w):001182a8=f4(?); Paged(w):800132a9=f4(?); Physical(w):001782a9=f4(?); RAM(w):001782a9=f4(?); RealRAM(w):001182a9=f4(?); Paged(w):800132aa=00( ); Physical(w):001782aa=00( ); RAM(w):001782aa=00( ); RealRAM(w):001182aa=00( ); Paged(w):800132ab=00( ); Physical(w):001782ab=00( ); RAM(w):001782ab=00( ); RealRAM(w):001182ab=00( ); Paged(w):800132a4=21(!); Physical(w):001782a4=21(!); RAM(w):001782a4=21(!); RealRAM(w):001182a4=21(!); Paged(w):800132a5=00( ); Physical(w):001782a5=00( ); RAM(w):001782a5=00( ); RealRAM(w):001182a5=00( ); Paged(w):800132a6=00( ); Physical(w):001782a6=00( ); RAM(w):001782a6=00( ); RealRAM(w):001182a6=00( ); Paged(w):800132a7=00( ); Physical(w):001782a7=00( ); RAM(w):001782a7=00( ); RealRAM(w):001182a7=00( ); Paged(w):800132a0=00( ); Physical(w):001782a0=00( ); RAM(w):001782a0=00( ); RealRAM(w):001182a0=00( ); Paged(w):800132a1=10(); Physical(w):001782a1=10(); RAM(w):001782a1=10(); RealRAM(w):001182a1=10(); Paged(w):800132a2=56(V); Physical(w):001782a2=56(V); RAM(w):001782a2=56(V); RealRAM(w):001182a2=56(V); Paged(w):800132a3=80(?); Physical(w):001782a3=80(?); RAM(w):001782a3=80(?); RealRAM(w):001182a3=80(?); Paged(w):8001329c=b0(?); Physical(w):0017829c=b0(?); RAM(w):0017829c=b0(?); RealRAM(w):0011829c=b0(?); Paged(w):8001329d=32(2); Physical(w):0017829d=32(2); RAM(w):0017829d=32(2); RealRAM(w):0011829d=32(2); Paged(w):8001329e=01(); Physical(w):0017829e=01(); RAM(w):0017829e=01(); RealRAM(w):0011829e=01(); Paged(w):8001329f=80(?); Physical(w):0017829f=80(?); RAM(w):0017829f=80(?); RealRAM(w):0011829f=80(?); Paged(w):80013298=90(?); Physical(w):00178298=90(?); RAM(w):00178298=90(?); RealRAM(w):00118298=90(?); Paged(w):80013299=33(3); Physical(w):00178299=33(3); RAM(w):00178299=33(3); RealRAM(w):00118299=33(3); Paged(w):8001329a=01(); Physical(w):0017829a=01(); RAM(w):0017829a=01(); RealRAM(w):0011829a=01(); Paged(w):8001329b=80(?); Physical(w):0017829b=80(?); RAM(w):0017829b=80(?); RealRAM(w):0011829b=80(?); Paged(w):80013294=4b(K); Physical(w):00178294=4b(K); RAM(w):00178294=4b(K); RealRAM(w):00118294=4b(K); Paged(w):80013295=01(); Physical(w):00178295=01(); RAM(w):00178295=01(); RealRAM(w):00118295=01(); Paged(w):80013296=00( ); Physical(w):00178296=00( ); RAM(w):00178296=00( ); RealRAM(w):00118296=00( ); Paged(w):80013297=00( ); Physical(w):00178297=00( ); RAM(w):00178297=00( ); RealRAM(w):00118297=00( ); Paged(w):80013290=f4(?); Physical(w):00178290=f4(?); RAM(w):00178290=f4(?); RealRAM(w):00118290=f4(?); Paged(w):80013291=00( ); Physical(w):00178291=00( ); RAM(w):00178291=00( ); RealRAM(w):00118291=00( ); Paged(w):80013292=00( ); Physical(w):00178292=00( ); RAM(w):00178292=00( ); RealRAM(w):00118292=00( ); Paged(w):80013293=00( ); Physical(w):00178293=00( ); RAM(w):00178293=00( ); RealRAM(w):00118293=00( )
Registers:
EAX: 0000014b EBX: 80561000 ECX: 0000f4f4 EDX: 00000021
ESP: 800132b0 EBP: 80013390 ESI: 0000014b EDI: 000000f4
CS: 0028 DS: 0030 ES: 0030 FS: 0039 GS: 0000 SS: 0030 TR: 0018 LDTR: 0060
EIP: 80009544 EFLAGS: 00000206
CR0: 80000001 CR1: 00000000 CR2: 000b8000 CR3: 001a6000
DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000
DR6: 00000000 DR7: 00000000
GDTR: 00008010011c010f IDTR: 00008062b00002ff
FLAGSINFO: 00000000000000vr0n00odItsz0a0P1c

win30_3.txt:

0028:80006c77 8B 14 C5 40 3A 01 80 mov edx,dword ds:[eax*8-7ffec5c0]
Registers:
EAX: 0000014b EBX: 804a1000 ECX: 0000f4f4 EDX: 00000180
ESP: 800132b4 EBP: 80013390 ESI: 0000014b EDI: 000000f4
CS: 0028 DS: 0030 ES: 0030 FS: 0039 GS: 0000 SS: 0030 TR: 0018 LDTR: 0060
EIP: 80006c77 EFLAGS: 00000206
CR0: e0000011 CR2: 000b8000 CR3: 00350000
DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000
DR6: 00000000 DR7: 00000000
GDTR: 8010011c0000010f IDTR: 80563000000002ff
FLAGSINFO: 00000000000000vr0n00odItsz0a0P1c
0028:80006c7e FF 24 C5 3C 3A 01 80 jmp near dword ds:[eax*8-7ffec5c4]
Registers:
EAX: 0000014b EBX: 804a1000 ECX: 0000f4f4 EDX: 00000021
ESP: 800132b4 EBP: 80013390 ESI: 0000014b EDI: 000000f4
CS: 0028 DS: 0030 ES: 0030 FS: 0039 GS: 0000 SS: 0030 TR: 0018 LDTR: 0060
EIP: 80006c7e EFLAGS: 00000206
CR0: e0000011 CR2: 000b8000 CR3: 00350000
DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000
DR6: 00000000 DR7: 00000000
GDTR: 8010011c0000010f IDTR: 80563000000002ff
FLAGSINFO: 00000000000000vr0n00odItsz0a0P1c
0028:8002d080 FF 15 20 35 01 80 call near dword ds:[80013520]
Registers:
EAX: 0000014b EBX: 804a1000 ECX: 0000f4f4 EDX: 00000021
ESP: 800132b4 EBP: 80013390 ESI: 0000014b EDI: 000000f4
CS: 0028 DS: 0030 ES: 0030 FS: 0039 GS: 0000 SS: 0030 TR: 0018 LDTR: 0060
EIP: 8002d080 EFLAGS: 00000206
CR0: e0000011 CR2: 000b8000 CR3: 00350000
DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000
DR6: 00000000 DR7: 00000000
GDTR: 8010011c0000010f IDTR: 80563000000002ff
FLAGSINFO: 00000000000000vr0n00odItsz0a0P1c
0028:80009544 60 pusha
Registers:
EAX: 0000014b EBX: 804a1000 ECX: 0000f4f4 EDX: 00000021
ESP: 800132b0 EBP: 80013390 ESI: 0000014b EDI: 000000f4
CS: 0028 DS: 0030 ES: 0030 FS: 0039 GS: 0000 SS: 0030 TR: 0018 LDTR: 0060
EIP: 80009544 EFLAGS: 00000206
CR0: e0000011 CR2: 000b8000 CR3: 00350000
DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000
DR6: 00000000 DR7: 00000000
GDTR: 8010011c0000010f IDTR: 80563000000002ff
FLAGSINFO: 00000000000000vr0n00odItsz0a0P1c

It seems to do the same, but the location is different?

Edit: I'm comparing against Stenzek's logs:
https://drive.google.com/file/d/1xzyAhsnJxr6C … iew?usp=sharing

See: Windows 3.0/3.1 enhanced mode and 3.0 standard mode issues in UniPCemu?

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

Reply 48 of 591, by superfury

User metadata
Rank l33t++
Rank
l33t++

This is a log of UniPCemu booting Windows 3.0 in enhanced mode, with MS-DOS 6.22 and it's HIMEM.SYS, Windows' EMM386.SYS(~300KB EMS memory?) and failing drive preload program(can't remember it's name) from the Windows directory(which says invalid MS-DOS version?).

I've executed win without parameters(thus defaulting to 386 enhanced mode).

https://www.dropbox.com/s/4cunioq1thx75hf/deb … 31_1457.7z?dl=0

It looks like SDL2 refuses to somehow go past 4GB?

Edit: Managed to fix a file I/O bug in the common emulator framework. It seems to be a SDL2 RWops problem there(it's erroring out on writes to files that are opened with appending rights). The solution was simple: replace the "ab" flags with "rb+"/"r+b" rights and simply seek to EOF for every write in the wrapper. That has the same effect as appending properly with the "ab" rights, while being able to properly append to the file.

This is the newly createn log of UniPCemu running until it seems to have reached text mode and the problem program mentioned before:
https://www.dropbox.com/s/omi7d9bx2exgtg1/deb … 01_0120.7z?dl=0

Anyone can see what's going wrong?

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

Reply 49 of 591, by superfury

User metadata
Rank l33t++
Rank
l33t++

Looking upwards, I see the address being written to memory at 0028:80006c3b.
Further up, it's source is LA 8001523c.

Hmmm.... [8001523c] is only used by inc and mov in UniPCemu, while only used by cmp and mov in win30_3.txt?

Since said location reads as a 32-bit integer, does that mean there's an issue in a 32-bit opcode?

Edit: Hmmmm.... ESI doesn't match, thus further down the code there's a mismatch?

UniPCemu:

0028:8020016f 4E dec esi	RealRAM(p):0011d16f=4e(N); RAM(p):0017d16f=4e(N); Physical(p):0017d16f=4e(N); Paged(p):8020016f=4e(N); Normal(p):8020016f=4e(N); RealRAM(p):0011d170=66(f); RAM(p):0017d170=66(f); Physical(p):0017d170=66(f); Paged(p):80200170=66(f); Normal(p):80200170=66(f); RealRAM(p):0011d171=3b(;); RAM(p):0017d171=3b(;); Physical(p):0017d171=3b(;); Paged(p):80200171=3b(;); Normal(p):80200171=3b(;); RealRAM(p):0011d172=33(3); RAM(p):0017d172=33(3); Physical(p):0017d172=33(3); Paged(p):80200172=33(3); Normal(p):80200172=33(3); RealRAM(p):0011d173=73(s); RAM(p):0017d173=73(s); Physical(p):0017d173=73(s); Paged(p):80200173=73(s); Normal(p):80200173=73(s); RealRAM(p):0011d174=b1(?); RAM(p):0017d174=b1(?); Physical(p):0017d174=b1(?); Paged(p):80200174=b1(?); Normal(p):80200174=b1(?); RealRAM(p):0011d175=83(?); RAM(p):0017d175=83(?); Physical(p):0017d175=83(?); Paged(p):80200175=83(?); Normal(p):80200175=83(?); RealRAM(p):0011d176=eb(?); RAM(p):0017d176=eb(?); Physical(p):0017d176=eb(?); Paged(p):80200176=eb(?); Normal(p):80200176=eb(?); RealRAM(p):0011d177=04(); RAM(p):0017d177=04(); Physical(p):0017d177=04(); Paged(p):80200177=04(); Normal(p):80200177=04(); RealRAM(p):0011d178=eb(?); RAM(p):0017d178=eb(?); Physical(p):0017d178=eb(?); Paged(p):80200178=eb(?); Normal(p):80200178=eb(?); RealRAM(p):0011d179=90(?); RAM(p):0017d179=90(?); Physical(p):0017d179=90(?); Paged(p):80200179=90(?); Normal(p):80200179=90(?); RealRAM(p):0011d17a=a1(?); RAM(p):0017d17a=a1(?); Physical(p):0017d17a=a1(?); Paged(p):8020017a=a1(?); Normal(p):8020017a=a1(?); RealRAM(p):0011d17b=88(?); RAM(p):0017d17b=88(?); Physical(p):0017d17b=88(?); Paged(p):8020017b=88(?); Normal(p):8020017b=88(?); RealRAM(p):0011d17c=00( ); RAM(p):0017d17c=00( ); Physical(p):0017d17c=00( ); Paged(p):8020017c=00( ); Normal(p):8020017c=00( ); RealRAM(p):0011d17d=01(); RAM(p):0017d17d=01(); Physical(p):0017d17d=01(); Paged(p):8020017d=01(); Normal(p):8020017d=01(); RealRAM(p):0011d17e=80(?); RAM(p):0017d17e=80(?); Physical(p):0017d17e=80(?); Paged(p):8020017e=80(?); Normal(p):8020017e=80(?)
Registers:
EAX: 00000000 EBX: 0000b49c ECX: 0000001e EDX: 00000000
ESP: 800131f8 EBP: 800132ac ESI: 00000353 EDI: 00353000
CS: 0028 DS: 0030 ES: 0030 FS: 0030 GS: 0030 SS: 0030 TR: 0018 LDTR: 0000
EIP: 8020016f EFLAGS: 00003002
CR0: 80000001 CR1: 00000000 CR2: 00000000 CR3: 001a6000
DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000
DR6: 00000000 DR7: 00000000
GDTR: 00008010011c010f IDTR: 00008001008c02ff
FLAGSINFO: 00000000000000vr0n11oditsz0a0p1c
0028:80200170 66 3B 33 cmp si,word ds:[ebx] RealRAM(p):0011d17f=66(f); RAM(p):0017d17f=66(f); Physical(p):0017d17f=66(f); Paged(p):8020017f=66(f); Normal(p):8020017f=66(f); RealRAM(r):0000b49c=a9(?); RAM(r):0000b49c=a9(?); Physical(r):0000b49c=a9(?); Paged(r):0000b49c=a9(?); RealRAM(r):0000b49d=01(); RAM(r):0000b49d=01(); Physical(r):0000b49d=01(); Paged(r):0000b49d=01()
Registers:
EAX: 00000000 EBX: 0000b49c ECX: 0000001e EDX: 00000000
ESP: 800131f8 EBP: 800132ac ESI: 00000352 EDI: 00353000
CS: 0028 DS: 0030 ES: 0030 FS: 0030 GS: 0030 SS: 0030 TR: 0018 LDTR: 0000
EIP: 80200170 EFLAGS: 00003002
CR0: 80000001 CR1: 00000000 CR2: 00000000 CR3: 001a6000
DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000
DR6: 00000000 DR7: 00000000
GDTR: 00008010011c010f IDTR: 00008001008c02ff
FLAGSINFO: 00000000000000vr0n11oditsz0a0p1c
0028:80200173 73 B1 jnc 80200126 RealRAM(p):0011d180=83(?); RAM(p):0017d180=83(?); Physical(p):0017d180=83(?); Paged(p):80200180=83(?); Normal(p):80200180=83(?); RealRAM(p):0011d181=78(x); RAM(p):0017d181=78(x); Physical(p):0017d181=78(x); Paged(p):80200181=78(x); Normal(p):80200181=78(x); RealRAM(p):0011d182=14(); RAM(p):0017d182=14(); Physical(p):0017d182=14(); Paged(p):80200182=14(); Normal(p):80200182=14()
Registers:
EAX: 00000000 EBX: 0000b49c ECX: 0000001e EDX: 00000000
ESP: 800131f8 EBP: 800132ac ESI: 00000352 EDI: 00353000
CS: 0028 DS: 0030 ES: 0030 FS: 0030 GS: 0030 SS: 0030 TR: 0018 LDTR: 0000
EIP: 80200173 EFLAGS: 00003016
CR0: 80000001 CR1: 00000000 CR2: 00000000 CR3: 001a6000
DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000
DR6: 00000000 DR7: 00000000
GDTR: 00008010011c010f IDTR: 00008001008c02ff
FLAGSINFO: 00000000000000vr0n11oditsz0A0P1c
0028:80200126 81 FE 00 01 00 00 cmp esi,00000100 RealRAM(p):0011d126=81(?); RAM(p):0017d126=81(?); Physical(p):0017d126=81(?); Paged(p):80200126=81(?); Normal(p):80200126=81(?); RealRAM(p):0011d127=fe(?); RAM(p):0017d127=fe(?); Physical(p):0017d127=fe(?); Paged(p):80200127=fe(?); Normal(p):80200127=fe(?); RealRAM(p):0011d128=00( ); RAM(p):0017d128=00( ); Physical(p):0017d128=00( ); Paged(p):80200128=00( ); Normal(p):80200128=00( ); RealRAM(p):0011d129=01(); RAM(p):0017d129=01(); Physical(p):0017d129=01(); Paged(p):80200129=01(); Normal(p):80200129=01(); RealRAM(p):0011d12a=00( ); RAM(p):0017d12a=00( ); Physical(p):0017d12a=00( ); Paged(p):8020012a=00( ); Normal(p):8020012a=00( ); RealRAM(p):0011d12b=00( ); RAM(p):0017d12b=00( ); Physical(p):0017d12b=00( ); Paged(p):8020012b=00( ); Normal(p):8020012b=00( ); RealRAM(p):0011d12c=0f(); RAM(p):0017d12c=0f(); Physical(p):0017d12c=0f(); Paged(p):8020012c=0f(); Normal(p):8020012c=0f(); RealRAM(p):0011d12d=82(?); RAM(p):0017d12d=82(?); Physical(p):0017d12d=8

Hmmmm....

Edit: Perhaps the EBX is invalid to start with? It's FCE4 in win30_3.txt.
Edit: The troube already seems to be there with ESI being a different value at the start of the protected-mode code. It seems to be incorrect in real mode already? So the problem is in the real-mode part?

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

Reply 50 of 591, by superfury

User metadata
Rank l33t++
Rank
l33t++

I've made a little log of the real mode part of Windows 3.0 booting(from command prompt, pressing enter(and having "win" already typed):

https://www.dropbox.com/s/ynaebhcez40om5c/deb … 01_0120.7z?dl=0

Anyone can see why ESI is incorrect?

Edit: So far seem to have traced it back to some DWORD value at memory address 00009afe?

Edit: It's the base value calculated of DS(99f) multiplied by 16(for a real mode base address). At that point(0787:0996), DS=ES=99f.

Edit: Also interesting: Windows 3.0's emm386.sys finds just a little RAM to use? Only ~300KB? 12MB(11 extended) is installed according to mem.exe.

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

Reply 51 of 591, by superfury

User metadata
Rank l33t++
Rank
l33t++

Just improved the handling of the setting of the Accessed bit of the segment descriptor(only when a descriptor reaches a segment's descriptor cache).
Interestingly enough, Windows 95 now seems to completely hang due to infinite ARPL faults being thrown(or what looks like them anyways)? It's opcode 632D at location C4D8:9a9a.

Anyone knows what that one is?

Edit: Interestingly, the Windows 95 bootlog now becomes very very short:

[000D00EF] LoadSuccess    = C:\WINDOWS\HIMEM.SYS
[000D00EF] Loading Device = C:\WINDOWS\IFSHLP.SYS
[000D00F0] LoadSuccess = C:\WINDOWS\IFSHLP.SYS
[000D00F0] Loading Device = C:\WINDOWS\SETVER.EXE
[000D00F0] LoadSuccess = C:\WINDOWS\SETVER.EXE
[000D0280] Loading Vxd = VMM
[000D0292] LoadSuccess = VMM
[000D0292] Loading Vxd = C:\WINDOWS\SMARTDRV.EXE
[000D0292] LoadSuccess = C:\WINDOWS\SMARTDRV.EXE
[000D0294] Loading Vxd = CONFIGMG
[000D029C] LoadSuccess = CONFIGMG
[000D029C] Loading Vxd = VSHARE
[000D029E] LoadSuccess = VSHARE
[000D029E] Loading Vxd = VWIN32
[000D02A2] LoadSuccess = VWIN32
[000D02A2] Loading Vxd = VFBACKUP
[000D02A3] LoadSuccess = VFBACKUP
[000D02A3] Loading Vxd = VCOMM
[000D02A4] LoadSuccess = VCOMM
[000D02A4] Loading Vxd = COMBUFF
[000D02A5] LoadSuccess = COMBUFF
[000D02A5] Loading Vxd = C:\WINDOWS\system\VMM32\IFSMGR.VXD
[000D02A9] LoadSuccess = C:\WINDOWS\system\VMM32\IFSMGR.VXD
[000D02A9] Loading Vxd = C:\WINDOWS\system\VMM32\IOS.VXD

Since all loading of VXD drivers goes fine until after IFSMGR.VXD(Installable file system and block device manager) loads, the issue must be in IFSMGR.VXD?
Edit: Looking again, I see it triple faulting on trying to raise an interrupt(stack fault) pushing BP on the stack with ESP being 1. Thus SP becomes FFFF for the memory checks, which causes a triple fault in real mode(as is documented)! Then the computer(emulator) reboots.

Edit: Oddly enough, even reverting the code to an older commit(since before I made the latest changes) makes Windows 95 setup crash at that point?

CWSDPMI with engine crashes with a double fault. DPMI32 triple faults and resets the emulator when engine is ran immediately when it(engine)'s ran.

Edit: Reinstalling Windows 95 it loads up to the second ESDI_506.PDR file again(using a normal boot)?

[0012DF94] Loading Device = C:\WINDOWS\HIMEM.SYS
[0012DF95] LoadSuccess = C:\WINDOWS\HIMEM.SYS
[0012DF95] Loading Device = C:\WINDOWS\IFSHLP.SYS
[0012DF95] LoadSuccess = C:\WINDOWS\IFSHLP.SYS
[0012DF95] Loading Device = C:\WINDOWS\SETVER.EXE
[0012DF96] LoadSuccess = C:\WINDOWS\SETVER.EXE
[0012E0FA] Loading Vxd = VMM
[0012E10B] LoadSuccess = VMM
[0012E10C] Loading Vxd = CONFIGMG
[0012E112] LoadSuccess = CONFIGMG
[0012E112] Loading Vxd = VSHARE
[0012E114] LoadSuccess = VSHARE
[0012E114] Loading Vxd = VWIN32
[0012E118] LoadSuccess = VWIN32
[0012E118] Loading Vxd = VFBACKUP
[0012E119] LoadSuccess = VFBACKUP
[0012E119] Loading Vxd = VCOMM
[0012E11A] LoadSuccess = VCOMM
[0012E11A] Loading Vxd = COMBUFF
[0012E11B] LoadSuccess = COMBUFF
[0012E11B] Loading Vxd = IFSMGR
[0012E129] LoadSuccess = IFSMGR
[0012E129] Loading Vxd = IOS
[0012E12E] LoadSuccess = IOS
[0012E12E] Loading Vxd = SPOOLER
[0012E12F] LoadSuccess = SPOOLER
[0012E130] Loading Vxd = VFAT
[0012E134] LoadSuccess = VFAT
[0012E134] Loading Vxd = VCACHE
[0012E136] LoadSuccess = VCACHE
[0012E136] Loading Vxd = VCOND
[0012E138] LoadSuccess = VCOND
[0012E138] Loading Vxd = VCDFSD
[0012E139] LoadSuccess = VCDFSD
[0012E13A] Loading Vxd = VXDLDR
[0012E13B] LoadSuccess = VXDLDR
[0012E13B] Loading Vxd = VDEF
[0012E13C] LoadSuccess = VDEF
[0012E13C] Loading Vxd = VPICD
[0012E13E] LoadSuccess = VPICD
[0012E13E] Loading Vxd = VTD
[0012E140] LoadSuccess = VTD
[0012E140] Loading Vxd = REBOOT
[0012E141] LoadSuccess = REBOOT
[0012E141] Loading Vxd = VDMAD
[0012E142] LoadSuccess = VDMAD
[0012E142] Loading Vxd = VSD
[0012E143] LoadSuccess = VSD
[0012E143] Loading Vxd = V86MMGR
[0012E147] LoadSuccess = V86MMGR
[0012E147] Loading Vxd = PAGESWAP
[0012E148] LoadSuccess = PAGESWAP
[0012E149] Loading Vxd = DOSMGR
[0012E14D] LoadSuccess = DOSMGR
[0012E14D] Loading Vxd = VMPOLL
[0012E14E] LoadSuccess = VMPOLL
[0012E14E] Loading Vxd = SHELL
[0012E151] LoadSuccess = SHELL
[0012E152] Loading Vxd = PARITY
[0012E152] LoadSuccess = PARITY
Show last 232 lines
[0012E152] Loading Vxd = BIOSXLAT
[0012E152] LoadSuccess = BIOSXLAT
[0012E153] Loading Vxd = VMCPD
[0012E153] LoadSuccess = VMCPD
[0012E154] Loading Vxd = VTDAPI
[0012E154] LoadSuccess = VTDAPI
[0012E154] Loading Vxd = PERF
[0012E156] LoadSuccess = PERF
[0012E156] Loading Vxd = ebios
[0012E157] LoadSuccess = ebios
[0012E157] Loading Vxd = vshare
[0012E158] LoadFailed = vshare
[0012E158] Loading Vxd = dynapage
[0012E15A] LoadSuccess = dynapage
[0012E15A] Loading Vxd = vcd
[0012E15B] LoadSuccess = vcd
[0012E15C] Loading Vxd = vpd
[0012E15D] LoadSuccess = vpd
[0012E15D] Loading Vxd = int13
[0012E15E] LoadSuccess = int13
[0012E15E] Loading Vxd = vkd
[0012E160] LoadSuccess = vkd
[0012E160] Loading Vxd = vdd
[0012E164] LoadSuccess = vdd
[0012E164] Loading Vxd = vflatd
[0012E165] LoadSuccess = vflatd
[0012E165] Loading Vxd = vmouse
[0012E167] LoadSuccess = vmouse
[0012E167] Loading Vxd = msmouse.vxd
[0012E167] LoadSuccess = msmouse.vxd
[0012E168] Loading Vxd = enable
[0012E16A] LoadSuccess = enable
[0012E16F] SYSCRITINIT = VMM
[0012E170] SYSCRITINITSUCCESS = VMM
[0012E170] SYSCRITINIT = VCACHE
[0012E170] SYSCRITINITSUCCESS = VCACHE
[0012E170] SYSCRITINIT = PERF
[0012E170] SYSCRITINITSUCCESS = PERF
[0012E171] SYSCRITINIT = VPICD
[0012E171] SYSCRITINITSUCCESS = VPICD
[0012E171] SYSCRITINIT = VTD
[0012E171] SYSCRITINITSUCCESS = VTD
[0012E171] SYSCRITINIT = VXDLDR
[0012E172] SYSCRITINITSUCCESS = VXDLDR
[0012E172] SYSCRITINIT = CONFIGMG
[0012E172] SYSCRITINITSUCCESS = CONFIGMG
[0012E172] SYSCRITINIT = VCDFSD
[0012E172] SYSCRITINITSUCCESS = VCDFSD
[0012E172] SYSCRITINIT = IOS
[0012E173] SYSCRITINITSUCCESS = IOS
[0012E173] SYSCRITINIT = PAGEFILE
[0012E173] SYSCRITINITSUCCESS = PAGEFILE
[0012E173] SYSCRITINIT = PAGESWAP
[0012E173] SYSCRITINITSUCCESS = PAGESWAP
[0012E174] SYSCRITINIT = PARITY
[0012E174] SYSCRITINITSUCCESS = PARITY
[0012E174] SYSCRITINIT = REBOOT
[0012E174] SYSCRITINITSUCCESS = REBOOT
[0012E174] SYSCRITINIT = EBIOS
[0012E174] SYSCRITINITSUCCESS = EBIOS
[0012E175] SYSCRITINIT = VDD
[0012E175] SYSCRITINITSUCCESS = VDD
[0012E175] SYSCRITINIT = VSD
[0012E175] SYSCRITINITSUCCESS = VSD
[0012E175] SYSCRITINIT = COMBUFF
[0012E175] SYSCRITINITSUCCESS = COMBUFF
[0012E176] SYSCRITINIT = VCD
[0012E176] SYSCRITINITSUCCESS = VCD
[0012E176] SYSCRITINIT = VMOUSE
[0012E176] SYSCRITINITSUCCESS = VMOUSE
[0012E176] SYSCRITINIT = MSMINI
[0012E176] SYSCRITINITSUCCESS = MSMINI
[0012E177] SYSCRITINIT = VKD
[0012E177] SYSCRITINITSUCCESS = VKD
[0012E177] SYSCRITINIT = ENABLE
[0012E177] SYSCRITINITSUCCESS = ENABLE
[0012E177] SYSCRITINIT = VPD
[0012E178] SYSCRITINITSUCCESS = VPD
[0012E178] SYSCRITINIT = INT13
[0012E178] SYSCRITINITSUCCESS = INT13
[0012E178] SYSCRITINIT = VMCPD
[0012E178] SYSCRITINITSUCCESS = VMCPD
[0012E178] SYSCRITINIT = BIOSXLAT
[0012E179] SYSCRITINITSUCCESS = BIOSXLAT
[0012E179] SYSCRITINIT = DOSMGR
[0012E179] SYSCRITINITSUCCESS = DOSMGR
[0012E179] SYSCRITINIT = VSHARE
[0012E179] SYSCRITINITSUCCESS = VSHARE
[0012E17A] SYSCRITINIT = VMPOLL
[0012E17A] SYSCRITINITSUCCESS = VMPOLL
[0012E17A] SYSCRITINIT = VWIN32
[0012E17A] SYSCRITINITSUCCESS = VWIN32
[0012E17A] SYSCRITINIT = VCOMM
[0012E17A] SYSCRITINITSUCCESS = VCOMM
[0012E17B] SYSCRITINIT = VCOND
[0012E17B] SYSCRITINITSUCCESS = VCOND
[0012E17B] SYSCRITINIT = VTDAPI
[0012E17B] SYSCRITINITSUCCESS = VTDAPI
[0012E17C] SYSCRITINIT = VFLATD
[0012E17C] SYSCRITINITSUCCESS = VFLATD
[0012E17C] SYSCRITINIT = VDMAD
[0012E17C] SYSCRITINITSUCCESS = VDMAD
[0012E17C] SYSCRITINIT = V86MMGR
[0012E17C] SYSCRITINITSUCCESS = V86MMGR
[0012E17D] SYSCRITINIT = SPOOLER
[0012E17D] SYSCRITINITSUCCESS = SPOOLER
[0012E17D] SYSCRITINIT = VFAT
[0012E17D] SYSCRITINITSUCCESS = VFAT
[0012E17D] SYSCRITINIT = VDEF
[0012E17D] SYSCRITINITSUCCESS = VDEF
[0012E17E] SYSCRITINIT = IFSMGR
[0012E17E] SYSCRITINITSUCCESS = IFSMGR
[0012E17E] SYSCRITINIT = VFBACKUP
[0012E17E] SYSCRITINITSUCCESS = VFBACKUP
[0012E17E] SYSCRITINIT = SHELL
[0012E17E] SYSCRITINITSUCCESS = SHELL
[0012E180] DEVICEINIT = VMM
[0012E180] DEVICEINITSUCCESS = VMM
[0012E180] DEVICEINIT = VCACHE
[0012E180] DEVICEINITSUCCESS = VCACHE
[0012E181] DEVICEINIT = PERF
[0012E181] DEVICEINITSUCCESS = PERF
[0012E182] DEVICEINIT = VPICD
[0012E182] DEVICEINITSUCCESS = VPICD
[0012E182] DEVICEINIT = VTD
[0012E182] DEVICEINITSUCCESS = VTD
[0012E182] DEVICEINIT = VXDLDR
[0012E1A1] DEVICEINITSUCCESS = VXDLDR
[0012E1A6] Dynamic load device isapnp.vxd
[0012E1B1] Dynamic init device ISAPNP
[0012E1B1] Dynamic init success ISAPNP
[0012E1B1] Dynamic load success isapnp.vxd
[0012E1B2] Dynamic load device mmdevldr.vxd
[0012E1C1] Dynamic init device MMDEVLDR
[0012E1C2] Dynamic init success MMDEVLDR
[0012E1C2] Dynamic load success mmdevldr.vxd
[0012E1C2] Dynamic load device vjoyd.vxd
[0012E1C6] Dynamic init device VJOYD
[0012E1C6] Dynamic init success VJOYD
[0012E1C6] Dynamic load success vjoyd.vxd
[0012E1C6] DEVICEINIT = CONFIGMG
[0012E1C7] DEVICEINITSUCCESS = CONFIGMG
[0012E1C7] DEVICEINIT = VCDFSD
[0012E1C7] DEVICEINITSUCCESS = VCDFSD
[0012E1C7] DEVICEINIT = IOS
[0012E1DA] Dynamic load device C:\WINDOWS\system\IOSUBSYS\apix.vxd
[0012E1DB] Dynamic load success C:\WINDOWS\system\IOSUBSYS\apix.vxd
[0012E1DB] Dynamic load device C:\WINDOWS\system\IOSUBSYS\cdfs.vxd
[0012E1DC] Dynamic load success C:\WINDOWS\system\IOSUBSYS\cdfs.vxd
[0012E1DC] Dynamic load device C:\WINDOWS\system\IOSUBSYS\cdtsd.vxd
[0012E1DD] Dynamic load success C:\WINDOWS\system\IOSUBSYS\cdtsd.vxd
[0012E1DD] Dynamic load device C:\WINDOWS\system\IOSUBSYS\cdvsd.vxd
[0012E1DE] Dynamic load success C:\WINDOWS\system\IOSUBSYS\cdvsd.vxd
[0012E1DE] Dynamic load device C:\WINDOWS\system\IOSUBSYS\disktsd.vxd
[0012E1DF] Dynamic load success C:\WINDOWS\system\IOSUBSYS\disktsd.vxd
[0012E1DF] Dynamic load device C:\WINDOWS\system\IOSUBSYS\diskvsd.vxd
[0012E1E0] Dynamic load success C:\WINDOWS\system\IOSUBSYS\diskvsd.vxd
[0012E1E0] Dynamic load device C:\WINDOWS\system\IOSUBSYS\voltrack.vxd
[0012E1E1] Dynamic load success C:\WINDOWS\system\IOSUBSYS\voltrack.vxd
[0012E1E1] Dynamic load device C:\WINDOWS\system\IOSUBSYS\necatapi.vxd
[0012E1E2] Dynamic load success C:\WINDOWS\system\IOSUBSYS\necatapi.vxd
[0012E1E2] Dynamic load device C:\WINDOWS\system\IOSUBSYS\scsi1hlp.vxd
[0012E1E3] Dynamic load success C:\WINDOWS\system\IOSUBSYS\scsi1hlp.vxd
[0012E1E3] Dynamic load device C:\WINDOWS\system\IOSUBSYS\rmm.pdr
[0012E1E4] Dynamic load success C:\WINDOWS\system\IOSUBSYS\rmm.pdr
[0012E1E5] DEVICEINITSUCCESS = IOS
[0012E1E6] DEVICEINIT = PAGEFILE
[0012E1E6] DEVICEINITSUCCESS = PAGEFILE
[0012E1E6] DEVICEINIT = PAGESWAP
[0012E1E6] DEVICEINITSUCCESS = PAGESWAP
[0012E1E7] DEVICEINIT = PARITY
[0012E1E7] DEVICEINITSUCCESS = PARITY
[0012E1E7] DEVICEINIT = REBOOT
[0012E1E7] DEVICEINITSUCCESS = REBOOT
[0012E1E8] DEVICEINIT = EBIOS
[0012E1E8] DEVICEINITSUCCESS = EBIOS
[0012E1E8] DEVICEINIT = VDD
[0012E1EA] DEVICEINITSUCCESS = VDD
[0012E1EA] DEVICEINIT = VSD
[0012E1EA] DEVICEINITSUCCESS = VSD
[0012E1EA] DEVICEINIT = COMBUFF
[0012E1EA] DEVICEINITSUCCESS = COMBUFF
[0012E1EB] DEVICEINIT = VCD
[0012E1EB] DEVICEINITSUCCESS = VCD
[0012E1EC] DEVICEINIT = VMOUSE
[0012E1EC] DEVICEINITSUCCESS = VMOUSE
[0012E1EC] DEVICEINIT = MSMINI
[0012E1EF] DEVICEINITSUCCESS = MSMINI
[0012E1EF] DEVICEINIT = VKD
[0012E1EF] DEVICEINITSUCCESS = VKD
[0012E1EF] DEVICEINIT = ENABLE
[0012E1F0] DEVICEINITSUCCESS = ENABLE
[0012E1F0] DEVICEINIT = VPD
[0012E1F0] DEVICEINITSUCCESS = VPD
[0012E1F0] DEVICEINIT = INT13
[0012E1F1] DEVICEINITSUCCESS = INT13
[0012E1F1] DEVICEINIT = VMCPD
[0012E1F1] DEVICEINITSUCCESS = VMCPD
[0012E1F1] DEVICEINIT = BIOSXLAT
[0012E1F1] DEVICEINITSUCCESS = BIOSXLAT
[0012E1F2] DEVICEINIT = DOSMGR
[0012E1F2] DEVICEINITSUCCESS = DOSMGR
[0012E1F2] DEVICEINIT = VSHARE
[0012E1F3] DEVICEINITSUCCESS = VSHARE
[0012E1F3] DEVICEINIT = VMPOLL
[0012E1F4] DEVICEINITSUCCESS = VMPOLL
[0012E1F4] DEVICEINIT = VWIN32
[0012E1F4] DEVICEINITSUCCESS = VWIN32
[0012E1F4] DEVICEINIT = VCOMM
[0012E1F5] DEVICEINITSUCCESS = VCOMM
[0012E1F5] DEVICEINIT = VCOND
[0012E1F5] DEVICEINITSUCCESS = VCOND
[0012E1F5] DEVICEINIT = VTDAPI
[0012E1F5] DEVICEINITSUCCESS = VTDAPI
[0012E1F6] DEVICEINIT = VFLATD
[0012E1F6] DEVICEINITSUCCESS = VFLATD
[0012E1F6] DEVICEINIT = VDMAD
[0012E1F6] DEVICEINITSUCCESS = VDMAD
[0012E1F6] DEVICEINIT = V86MMGR
[0012E1F7] DEVICEINITSUCCESS = V86MMGR
[0012E1F8] DEVICEINIT = SPOOLER
[0012E1F8] DEVICEINITSUCCESS = SPOOLER
[0012E1F8] DEVICEINIT = VFAT
[0012E1F8] DEVICEINITSUCCESS = VFAT
[0012E1F9] DEVICEINIT = VDEF
[0012E1F9] DEVICEINITSUCCESS = VDEF
[0012E1FB] Initing hsflop.pdr
[0012E24D] Init Success hsflop.pdr
[0012E24F] Initing esdi_506.pdr
[0012E26C] Init Success esdi_506.pdr
[0012E26C] Initing esdi_506.pdr

Edit: In Safe mode, it's once again back to the "Initializing KERNEL".

[001325FE] Loading Device = C:\WINDOWS\HIMEM.SYS
[00132827] LoadSuccess = C:\WINDOWS\HIMEM.SYS
[00132827] Loading Device = C:\WINDOWS\DBLBUFF.SYS
[00132828] LoadSuccess = C:\WINDOWS\DBLBUFF.SYS
[00132828] Loading Device = C:\WINDOWS\IFSHLP.SYS
[00132828] LoadSuccess = C:\WINDOWS\IFSHLP.SYS
[0013282A] (Safe boot)
[001329DA] Loading Vxd = VMM
[001329EB] LoadSuccess = VMM
[001329EB] Loading Vxd = vmouse
[001329ED] LoadSuccess = vmouse
[001329ED] Loading Vxd = configmg
[001329F3] LoadSuccess = configmg
[001329F3] Loading Vxd = vwin32
[001329F7] LoadSuccess = vwin32
[001329F7] Loading Vxd = vfbackup
[001329F8] LoadSuccess = vfbackup
[001329F8] Loading Vxd = vcomm
[001329F9] LoadSuccess = vcomm
[001329F9] Loading Vxd = ifsmgr
[00132A07] LoadSuccess = ifsmgr
[00132A07] Loading Vxd = ios
[00132A0C] LoadSuccess = ios
[00132A0C] Loading Vxd = vfat
[00132A11] LoadSuccess = vfat
[00132A11] Loading Vxd = vcache
[00132A13] LoadSuccess = vcache
[00132A13] Loading Vxd = vcond
[00132A15] LoadSuccess = vcond
[00132A15] Loading Vxd = int13
[00132A16] LoadSuccess = int13
[00132A16] Loading Vxd = vxdldr
[00132A17] LoadSuccess = vxdldr
[00132A17] Loading Vxd = vdef
[00132A18] LoadSuccess = vdef
[00132A18] Loading Vxd = dynapage
[00132A1A] LoadSuccess = dynapage
[00132A1A] Loading Vxd = reboot
[00132A1B] LoadSuccess = reboot
[00132A1B] Loading Vxd = vsd
[00132A1C] LoadSuccess = vsd
[00132A1C] Loading Vxd = parity
[00132A1C] LoadSuccess = parity
[00132A1C] Loading Vxd = biosxlat
[00132A1D] LoadSuccess = biosxlat
[00132A1D] Loading Vxd = vmcpd
[00132A1E] LoadSuccess = vmcpd
[00132A1E] Loading Vxd = vkd
[00132A20] LoadSuccess = vkd
[00132A20] Loading Vxd = vdd
[00132A24] LoadSuccess = vdd
[00132A24] Loading Vxd = ebios
[00132A25] LoadSuccess = ebios
[00132A25] Loading Vxd = vtdapi
[00132A26] LoadSuccess = vtdapi
[00132A26] Loading Vxd = vmpoll
[00132A27] LoadSuccess = vmpoll
[00132A27] Loading Vxd = VPICD
[00132A29] LoadSuccess = VPICD
[00132A29] Loading Vxd = VDMAD
Show last 243 lines
[00132A2B] LoadSuccess = VDMAD
[00132A2B] Loading Vxd = VTD
[00132A2C] LoadSuccess = VTD
[00132A2D] Loading Vxd = V86MMGR
[00132A31] LoadSuccess = V86MMGR
[00132A31] Loading Vxd = PAGESWAP
[00132A32] LoadSuccess = PAGESWAP
[00132A32] Loading Vxd = DOSMGR
[00132A36] LoadSuccess = DOSMGR
[00132A37] Loading Vxd = SHELL
[00132A3A] LoadSuccess = SHELL
[00132A3A] Loading Vxd = VCD
[00132A3C] LoadSuccess = VCD
[00132A3C] Loading Vxd = VPD
[00132A3D] LoadSuccess = VPD
[00132A3E] SYSCRITINIT = VMM
[00132A3E] SYSCRITINITSUCCESS = VMM
[00132A3E] SYSCRITINIT = VCACHE
[00132A3E] SYSCRITINITSUCCESS = VCACHE
[00132A3F] SYSCRITINIT = VPICD
[00132A3F] SYSCRITINITSUCCESS = VPICD
[00132A3F] SYSCRITINIT = VTD
[00132A3F] SYSCRITINITSUCCESS = VTD
[00132A3F] SYSCRITINIT = VXDLDR
[00132A40] SYSCRITINITSUCCESS = VXDLDR
[00132A40] SYSCRITINIT = CONFIGMG
[00132A40] SYSCRITINITSUCCESS = CONFIGMG
[00132A40] SYSCRITINIT = IOS
[00132A40] SYSCRITINITSUCCESS = IOS
[00132A40] SYSCRITINIT = PAGEFILE
[00132A41] SYSCRITINITSUCCESS = PAGEFILE
[00132A41] SYSCRITINIT = PAGESWAP
[00132A41] SYSCRITINITSUCCESS = PAGESWAP
[00132A41] SYSCRITINIT = PARITY
[00132A41] SYSCRITINITSUCCESS = PARITY
[00132A42] SYSCRITINIT = REBOOT
[00132A42] SYSCRITINITSUCCESS = REBOOT
[00132A42] SYSCRITINIT = EBIOS
[00132A42] SYSCRITINITSUCCESS = EBIOS
[00132A42] SYSCRITINIT = VDD
[00132A42] SYSCRITINITSUCCESS = VDD
[00132A43] SYSCRITINIT = VSD
[00132A43] SYSCRITINITSUCCESS = VSD
[00132A43] SYSCRITINIT = VCD
[00132A43] SYSCRITINITSUCCESS = VCD
[00132A43] SYSCRITINIT = VMOUSE
[00132A44] SYSCRITINITSUCCESS = VMOUSE
[00132A44] SYSCRITINIT = VKD
[00132A44] SYSCRITINITSUCCESS = VKD
[00132A44] SYSCRITINIT = VPD
[00132A44] SYSCRITINITSUCCESS = VPD
[00132A44] SYSCRITINIT = INT13
[00132A45] SYSCRITINITSUCCESS = INT13
[00132A45] SYSCRITINIT = VMCPD
[00132A45] SYSCRITINITSUCCESS = VMCPD
[00132A45] SYSCRITINIT = BIOSXLAT
[00132A46] SYSCRITINITSUCCESS = BIOSXLAT
[00132A46] SYSCRITINIT = DOSMGR
[00132A46] SYSCRITINITSUCCESS = DOSMGR
[00132A46] SYSCRITINIT = VMPOLL
[00132A46] SYSCRITINITSUCCESS = VMPOLL
[00132A46] SYSCRITINIT = VWIN32
[00132A47] SYSCRITINITSUCCESS = VWIN32
[00132A47] SYSCRITINIT = VCOMM
[00132A47] SYSCRITINITSUCCESS = VCOMM
[00132A47] SYSCRITINIT = VCOND
[00132A47] SYSCRITINITSUCCESS = VCOND
[00132A47] SYSCRITINIT = VTDAPI
[00132A48] SYSCRITINITSUCCESS = VTDAPI
[00132A48] SYSCRITINIT = VDMAD
[00132A48] SYSCRITINITSUCCESS = VDMAD
[00132A48] SYSCRITINIT = V86MMGR
[00132A48] SYSCRITINITSUCCESS = V86MMGR
[00132A49] SYSCRITINIT = VFAT
[00132A49] SYSCRITINITSUCCESS = VFAT
[00132A49] SYSCRITINIT = VDEF
[00132A49] SYSCRITINITSUCCESS = VDEF
[00132A49] SYSCRITINIT = IFSMGR
[00132A4A] SYSCRITINITSUCCESS = IFSMGR
[00132A4A] SYSCRITINIT = VFBACKUP
[00132A4A] SYSCRITINITSUCCESS = VFBACKUP
[00132A4A] SYSCRITINIT = SHELL
[00132A4A] SYSCRITINITSUCCESS = SHELL
[00132A4B] DEVICEINIT = VMM
[00132A4C] DEVICEINITSUCCESS = VMM
[00132A4C] DEVICEINIT = VCACHE
[00132A4C] DEVICEINITSUCCESS = VCACHE
[00132A4D] DEVICEINIT = VPICD
[00132A4D] DEVICEINITSUCCESS = VPICD
[00132A4D] DEVICEINIT = VTD
[00132A4D] DEVICEINITSUCCESS = VTD
[00132A4D] DEVICEINIT = VXDLDR
[00132A6A] DEVICEINITSUCCESS = VXDLDR
[00132A6A] DEVICEINIT = CONFIGMG
[00132A6A] DEVICEINITSUCCESS = CONFIGMG
[00132A6A] DEVICEINIT = IOS
[00132A7C] Dynamic load device C:\WINDOWS\system\IOSUBSYS\apix.vxd
[00132A7D] Dynamic load success C:\WINDOWS\system\IOSUBSYS\apix.vxd
[00132A7D] Dynamic load device C:\WINDOWS\system\IOSUBSYS\cdfs.vxd
[00132A7F] Dynamic load success C:\WINDOWS\system\IOSUBSYS\cdfs.vxd
[00132A7F] Dynamic load device C:\WINDOWS\system\IOSUBSYS\cdtsd.vxd
[00132A80] Dynamic load success C:\WINDOWS\system\IOSUBSYS\cdtsd.vxd
[00132A80] Dynamic load device C:\WINDOWS\system\IOSUBSYS\cdvsd.vxd
[00132A81] Dynamic load success C:\WINDOWS\system\IOSUBSYS\cdvsd.vxd
[00132A82] Dynamic load device C:\WINDOWS\system\IOSUBSYS\disktsd.vxd
[00132A82] Dynamic load success C:\WINDOWS\system\IOSUBSYS\disktsd.vxd
[00132A83] Dynamic load device C:\WINDOWS\system\IOSUBSYS\diskvsd.vxd
[00132A83] Dynamic load success C:\WINDOWS\system\IOSUBSYS\diskvsd.vxd
[00132A84] Dynamic load device C:\WINDOWS\system\IOSUBSYS\voltrack.vxd
[00132A85] Dynamic load success C:\WINDOWS\system\IOSUBSYS\voltrack.vxd
[00132A85] Dynamic load device C:\WINDOWS\system\IOSUBSYS\necatapi.vxd
[00132A85] Dynamic load success C:\WINDOWS\system\IOSUBSYS\necatapi.vxd
[00132A86] Dynamic load device C:\WINDOWS\system\IOSUBSYS\scsi1hlp.vxd
[00132A87] Dynamic load success C:\WINDOWS\system\IOSUBSYS\scsi1hlp.vxd
[00132A87] Dynamic load device C:\WINDOWS\system\IOSUBSYS\rmm.pdr
[00132A88] Dynamic load success C:\WINDOWS\system\IOSUBSYS\rmm.pdr
[00132A88] DEVICEINITSUCCESS = IOS
[00132A88] DEVICEINIT = PAGEFILE
[00132A89] DEVICEINITSUCCESS = PAGEFILE
[00132A89] DEVICEINIT = PAGESWAP
[00132A89] DEVICEINITSUCCESS = PAGESWAP
[00132A89] DEVICEINIT = PARITY
[00132A8A] DEVICEINITSUCCESS = PARITY
[00132A8A] DEVICEINIT = REBOOT
[00132A8A] DEVICEINITSUCCESS = REBOOT
[00132A8A] DEVICEINIT = EBIOS
[00132A8A] DEVICEINITSUCCESS = EBIOS
[00132A8A] DEVICEINIT = VDD
[00132A8C] DEVICEINITSUCCESS = VDD
[00132A8D] DEVICEINIT = VSD
[00132A8D] DEVICEINITSUCCESS = VSD
[00132A8D] DEVICEINIT = VCD
[00132A8D] DEVICEINITSUCCESS = VCD
[00132A8D] DEVICEINIT = VMOUSE
[00132A8E] DEVICEINITSUCCESS = VMOUSE
[00132A8E] DEVICEINIT = VKD
[00132A8E] DEVICEINITSUCCESS = VKD
[00132A8E] DEVICEINIT = VPD
[00132A8E] DEVICEINITSUCCESS = VPD
[00132A8F] DEVICEINIT = INT13
[00132A8F] DEVICEINITSUCCESS = INT13
[00132A8F] DEVICEINIT = VMCPD
[00132A8F] DEVICEINITSUCCESS = VMCPD
[00132A90] DEVICEINIT = BIOSXLAT
[00132A90] DEVICEINITSUCCESS = BIOSXLAT
[00132A90] DEVICEINIT = DOSMGR
[00132A90] DEVICEINITSUCCESS = DOSMGR
[00132A91] DEVICEINIT = VMPOLL
[00132A92] DEVICEINITSUCCESS = VMPOLL
[00132A92] DEVICEINIT = VWIN32
[00132A92] DEVICEINITSUCCESS = VWIN32
[00132A92] DEVICEINIT = VCOMM
[00132A92] DEVICEINITSUCCESS = VCOMM
[00132A93] DEVICEINIT = VCOND
[00132A93] DEVICEINITSUCCESS = VCOND
[00132A93] DEVICEINIT = VTDAPI
[00132A93] DEVICEINITSUCCESS = VTDAPI
[00132A93] DEVICEINIT = VDMAD
[00132A93] DEVICEINITSUCCESS = VDMAD
[00132A94] DEVICEINIT = V86MMGR
[00132A94] DEVICEINITSUCCESS = V86MMGR
[00132A95] DEVICEINIT = VFAT
[00132A95] DEVICEINITSUCCESS = VFAT
[00132A95] DEVICEINIT = VDEF
[00132A96] DEVICEINITSUCCESS = VDEF
[00132AC0] INITCOMPLETE = VMM
[00132AC0] INITCOMPLETESUCCESS = VMM
[00132AC1] INITCOMPLETE = VCACHE
[00132AC1] INITCOMPLETESUCCESS = VCACHE
[00132AC1] INITCOMPLETE = VPICD
[00132AC7] INITCOMPLETESUCCESS = VPICD
[00132AC9] INITCOMPLETE = VTD
[00132AC9] INITCOMPLETESUCCESS = VTD
[00132ACA] INITCOMPLETE = VXDLDR
[00132ACA] INITCOMPLETESUCCESS = VXDLDR
[00132ACA] INITCOMPLETE = CONFIGMG
[00132ACA] INITCOMPLETESUCCESS = CONFIGMG
[00132ACB] INITCOMPLETE = IOS
[00132AED] INITCOMPLETESUCCESS = IOS
[00132AEE] INITCOMPLETE = PAGEFILE
[00132AEE] INITCOMPLETESUCCESS = PAGEFILE
[00132AEE] INITCOMPLETE = PAGESWAP
[00132AEE] INITCOMPLETESUCCESS = PAGESWAP
[00132AEF] INITCOMPLETE = PARITY
[00132AEF] INITCOMPLETESUCCESS = PARITY
[00132AEF] INITCOMPLETE = REBOOT
[00132AEF] INITCOMPLETESUCCESS = REBOOT
[00132AF0] INITCOMPLETE = EBIOS
[00132AF0] INITCOMPLETESUCCESS = EBIOS
[00132AF0] INITCOMPLETE = VDD
[00132AF0] INITCOMPLETESUCCESS = VDD
[00132AF1] INITCOMPLETE = VSD
[00132AF1] INITCOMPLETESUCCESS = VSD
[00132AF1] INITCOMPLETE = VCD
[00132AF2] INITCOMPLETESUCCESS = VCD
[00132AF2] INITCOMPLETE = VMOUSE
[00132AF2] INITCOMPLETESUCCESS = VMOUSE
[00132AF3] INITCOMPLETE = VKD
[00132AF3] INITCOMPLETESUCCESS = VKD
[00132AF3] INITCOMPLETE = VPD
[00132AF4] INITCOMPLETESUCCESS = VPD
[00132AF4] INITCOMPLETE = INT13
[00132AF4] INITCOMPLETESUCCESS = INT13
[00132AF4] INITCOMPLETE = VMCPD
[00132AF5] INITCOMPLETESUCCESS = VMCPD
[00132AF5] INITCOMPLETE = BIOSXLAT
[00132AF5] INITCOMPLETESUCCESS = BIOSXLAT
[00132AF6] INITCOMPLETE = DOSMGR
[00132AF6] INITCOMPLETESUCCESS = DOSMGR
[00132AF6] INITCOMPLETE = VMPOLL
[00132AF6] INITCOMPLETESUCCESS = VMPOLL
[00132AF7] INITCOMPLETE = VWIN32
[00132AF9] INITCOMPLETESUCCESS = VWIN32
[00132AF9] INITCOMPLETE = VCOMM
[00132AFA] INITCOMPLETESUCCESS = VCOMM
[00132AFA] INITCOMPLETE = VCOND
[00132AFA] INITCOMPLETESUCCESS = VCOND
[00132AFA] INITCOMPLETE = VTDAPI
[00132AFB] INITCOMPLETESUCCESS = VTDAPI
[00132AFB] INITCOMPLETE = DiskTSD
[00132AFB] INITCOMPLETESUCCESS = DiskTSD
[00132AFC] INITCOMPLETE = voltrack
[00132AFC] INITCOMPLETESUCCESS = voltrack
[00132AFC] INITCOMPLETE = RMM
[00132AFD] INITCOMPLETESUCCESS = RMM
[00132AFD] INITCOMPLETE = VDMAD
[00132AFD] INITCOMPLETESUCCESS = VDMAD
[00132AFE] INITCOMPLETE = V86MMGR
[00132AFE] INITCOMPLETESUCCESS = V86MMGR
[00132AFE] INITCOMPLETE = VFAT
[00132AFF] INITCOMPLETESUCCESS = VFAT
[00132AFF] INITCOMPLETE = VDEF
[00132AFF] INITCOMPLETESUCCESS = VDEF
[00132B00] INITCOMPLETE = IFSMGR
[00132B00] INITCOMPLETESUCCESS = IFSMGR
[00132B00] INITCOMPLETE = VFD
[00132B00] INITCOMPLETESUCCESS = VFD
[00132B01] INITCOMPLETE = VFBACKUP
[00132B01] INITCOMPLETESUCCESS = VFBACKUP
[00132B01] INITCOMPLETE = SHELL
[00132B02] INITCOMPLETESUCCESS = SHELL
Initializing KERNEL

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

Reply 52 of 591, by superfury

User metadata
Rank l33t++
Rank
l33t++

I did see something interesting while Windows 95(a) setup was starting up it's GUI(at least until displaying the welcome to setup screen): it keeps trying to throwing #NP faults for a RETF to segment E0h? Anyone knows anything about that? It doesn't seem to stop throwing them at some point, they just keep coming?

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

Reply 53 of 591, by superfury

User metadata
Rank l33t++
Rank
l33t++

Just tried running Privateer again. It still hangs, but I've noticed something: It's stuck in an infinite (32- bit V86 instructions, except the conditional jump back to the start of the loop) comparision loop comparing DS:[ESI] with some memory location, jumping to the start again when carry isn't set(which it never is). Interrupt flag is cleared, so infinite loop.
Edit: I believe it was at EIP 0x1FC?

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

Reply 54 of 591, by superfury

User metadata
Rank l33t++
Rank
l33t++

Just tried running Windows for Workgroups 3.11 again. It seems to boot successfully, The MS-DOS prompt seems to run quite well, both full screen and windowed 😁

It just went wrong(double fault) when it tried to execute a far call in Virtual 8086 mode(opcode FF), which tried to push data on the stack that wasn't paged in properly?

Edit: Just managed to run Ultima II within a MS-DOS prompt inside a window of Windows 3.11. Then I tried to run Alley Cat inside a second MS-DOS window. Then Windows seems to hang?

Edit: Alley Cat seems to run fine with the minimal config.sys configuration(no drivers) as well as with EMM386(from MS-DOS 6.22) loaded. So the issue is somewhere within Windows 3.11?
Edit: With the 3.11 config.sys and not booted Windows 3.11 it also runs fine, without problems.
Edit: OK. Alley cat is running fine within Windows 3.11. Now to start Ultima II as well(multitasking)...
Edit: Seems to run fine now. It just has the issue it can't terminate, since the Q command won't have effect(It just says: "CMD: Quit or Save (...)"?

Edit: Luckily, Within Windows, pressing Ctrl+Alt+Del twice gives a blue screen which allows the application to be terminated(although incorrectly) 😁

So, Windows for Workgroups 3.11 running without visible errors(both Windows and MS-DOS prompt inside it running) must mean that at least most problems have been solved, if not all of them?

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

Reply 55 of 591, by superfury

User metadata
Rank l33t++
Rank
l33t++

Just tried running Pink Panther: Hocus Pocus Pink inside Windows 3.11. It ran fine until I tried the Sound Test from it's Windows menus, which eventually causes a triple fault during a ADD instruction at logical memory location 80000FFC(it's location on the stack that faults)? It tries to push data on the stack, but the stack is invalid, page faulting again on that, causing a triple fault because of said reason.

Edit: Thinking about it, isn't the high zero page(page number 0x80000) deliberately unmapped, due to processor issues with said memory location incorrectly aliasing to the zeroth page(page 0x00000) on some buggy processors? So perhaps that instruction itself or just the stack is the cause(invalid kernel stack)?

Edit: The problem happens in the kernel at 0x80006ec6. The stack is 80010004, which reaches the invalid area during the page fault, which itself faults on that handling the page fault, thus double faulting and triple faulting because of the invalid stack pointer?

Edit: So the kernel stack is having an overflow. That isn't supposed to happen normally, according to my knowledge? Anybody has an idea what the cause could be? ESP is 80001004 at the time of the triple fault(during it's triggering instruction).

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

Reply 56 of 591, by superfury

User metadata
Rank l33t++
Rank
l33t++

Just gave all Windows versions but Windows for Workgroups 3.1 a go. All of them at least seems to install properly 😁 Although I did notice that the 3.1/3.11 versions (both normal and for Workgroups) seems to take a long time checking the harddisk after analyzing the hardware. Maybe that's just because the C drive is large(2GB)?

It at least is supposed to provide a new base(after MS-DOS) for testing the hardware(since 95 still doesn't run).

Is there any software that tests win32s functionality and checks for any errors in that(seeing as I noticed that component failing combined with 3.11)? Or perhaps some CPU diagnostics?

Edit: Just took a look at AMIDIAG 5.0 again. Ran the CPU Protected Mode Test again(which was previously failing on the LAR instruction(as it said what was failing)). It now no longer reports any errors there and says:

A20 LINE: OK
Protected Mode Instructions: OK

So that's some bugs that were already fixed 😁

Now, what more can I use to test and verify my emulation? Windows 3.11 software is now an option besides MS-DOS 6.22. Anyone got any ideas?

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

Reply 57 of 591, by keenmaster486

User metadata
Rank l33t
Rank
l33t

BIG test that often fails on real hardware:

Cyberflix's Titanic: Adventure Out of Time.

It's a legendary game, and works great on Windows 9x, but often has issues in Windows 3.1.

It will work in DOSBox if you set it up correctly. But on real hardware it can be unpredictable.

Requires Win32s and WinG (installs them itself if cannot be found)

World's foremost 486 enjoyer.

Reply 58 of 591, by superfury

User metadata
Rank l33t++
Rank
l33t++

Isn't Windows 3.x supposed to have a TSS for the double fault handling? Since the double fault doesn't cause a task switch(it's a normal interrupt or trap gate), it tries to push information about the fault on the stack, which isn't reloaded(again, because SS:[ESP-4] from the kernel is invalid due to unpaging the zero page due to CPU issues), thus again causing a page fault which becomes a triple fault instead.

So why doesn't the win32s application(compared to MS-DOS apps) have a double fault task gate installed?
Edit: Perhaps the kernel isn't supposed to double fault at all?
Edit: Hmmm... When I answer Yes to the question to change the display resolution to 640x480(it's at 800x600), it faults some times. Eventually, it starts faulting on address x06f40074(opcode 3b4104), which is cmp eax,dword [ecx+04].
That one is recursively faulting, keeps lowering the stack address until eventually double faulting and maybe even triple faulting... Now checking it out... Said fault is occurring on memory location 80007266.

Edit: Interestingly, changing the breakpoint to fault at locations below or at 80000FFF, resolves in the breakpoint triggering on 80006ec6(sounds familiar?), executing instruction 0x0080dc6e0080. That is ADD byte [eax-7fff9124],al. That fault it causes at address 967f7b74 causes a page fault, which causes a page fault on it's stack, that causes a double fault to 0028:80006e78, which uses a normal interrupt gate, which tries to use the same invalid stack, thus triple faulting the CPU.

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

Reply 59 of 591, by keenmaster486

User metadata
Rank l33t
Rank
l33t

The "change screen resolution?" option always fails even on real hardware.

Change it to 640x480 256 colors yourself before trying to run it.

Also, you can experiment with having SHARE.EXE loaded or not loaded, and various parameters thereof. You can also try messing with the Windows virtual memory settings.

World's foremost 486 enjoyer.