VOGONS


First post, by superfury

User metadata
Rank l33t++
Rank
l33t++

I know the purpose for this is to make my emulator's ET4000/W32 not have bugs anymore (thus the emulation subforum), but the question also applies to software used for real ET4000/W32 video card (which is just software made to test video cards without being made for emulators, expecting a real graphics card to check). So I thought I'd ask here. Maybe some people know something about it in this subforum.

As I said, I'm trying to iron out the remaining bugs in my ET4000/W32 accelerator, but VDIAG reports some weird unknown error (just referring to the problem being something called "Stat"). Also Windows 9x renders fine for the most part using it, but all fonts that are normal foreground color (disabled buttons are grayed out text just fine) are somehow rendered with what seems like a very corrupted font (seemingly random pixels). Already verified that by making the mix map data forced to an on/off pattern(AA), causing each character to display a |||| kind of pattern(looking just like that, although each character being different heights).

Anyone knows more about such a kind of (emulated) hardware bug? Or does anyone know of more programs that can help me identify problems with the ET4000/W32 emulated chip (and verify that the chip emulation is fully acccurate)?

Weirdly, I can easily find documentation on the W32i and W32p on Google, but somehow plain W32 documentation is non-existent? Are there even graphics cards with a ET4000/W32 chip (not i/p) in existence? Or did they immediately skip to W32i, never producing any ET4000/W32 boards (and thus no documentation exists on said chip itself)?

Also, slightly related, does anyone knows the difference between the various types of methods that start the accelerator (back) up? There's the 4th byte of the destination address, memory aperture writes, resume bit in the operation state register and the ACL Accelerator Status Register XY Status bit.
Can anyone explain exactly what they do to the context of the registers and internal state, as well as the weird notion of 'suspended' screen-to-screen operations(since it can be resumed)? How do the X/Y position registers count into all this?

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

Reply 1 of 4, by weedeewee

User metadata
Rank l33t
Rank
l33t

Copper Demo ?

Right to repair is fundamental. You own it, you're allowed to fix it.
How To Ask Questions The Smart Way
Do not ask Why !
https://www.vogonswiki.com/index.php/Serial_port

Reply 2 of 4, by superfury

User metadata
Rank l33t++
Rank
l33t++
weedeewee wrote on 2021-03-29, 19:56:

Never tried that one yet. At least the vertical timings should work. The same with horizontal, as long as CRTC timings itself aren't changed outside of retraces (both horizontal and vertical).
And of course stuff like the rendering dword latched don't reload until the next time a boundary is reached (every 8 pixel clocks).
And the CPU can run in both cycle-accurate and IPS clocking mode. It would probably need cycle-accurate mode, though? CPU Timings above 386 (486+) instructions are 1 cycle execution timings and 1-cycle memory access timings, though. (BIU ticking 1 byte/word/dword every cycle and CPU instruction duration outside of BIU transfers take 1 cycle (instead of for example 2 cycles for a SUB instruction). So for example a SUB using memory as destination is 3 cycles (1 for read, 1 for processing, 1 for write), not counting instruction fetching (1 cycle for dword/word/byte to fill the prefetch queue, 1 cycle in parallel(EU) to read an operand or opcode(8/16/32-bit chunks) with 1-cycle waitstate on the prefetch unit not having data ready(1/2/4 bytes)).
CRTC timings work using horizontal and vertical 'rails'-style precalcs, with each entry being the next pixel handling to perform. It takes the current x and y position from both rails to determine the current CRT and VRAM handling to perform. Besides said rails style precalcs determining the CRTC actions to perform, there's a secondary horizontal rails that determines what to do with VRAM(dot clock determination to tick or not, reload intervals(depending on text/graphics mode), character clock subticking (every 4 ticks) for said reloading timings), NOP cycles etc.). That one restarts at entry 0 only every scanline, always ticking it's next entry each clock.
8088MPH for example runs it's effects fine with it (only failing in part due to 8088 CPU cycle timing not being 100% yet(~100 cycles off during startup tests)).

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

Reply 3 of 4, by TheMobRules

User metadata
Rank Oldbie
Rank
Oldbie
superfury wrote on 2021-03-29, 19:01:

Weirdly, I can easily find documentation on the W32i and W32p on Google, but somehow plain W32 documentation is non-existent? Are there even graphics cards with a ET4000/W32 chip (not i/p) in existence? Or did they immediately skip to W32i, never producing any ET4000/W32 boards (and thus no documentation exists on said chip itself)?

I have a VLB ET4000/W32 (non i/p), let me know if it would be useful to run any utilities/diagnostics on it.

The card seems to have been made in early 1993 by Tseng Labs themselves according to the FCC ID. One thing I noticed is that the W32 chip gets really hot, especially when compared to my W32p which barely gets warm, I find this odd since these two chips shouldn't be THAT different. I haven't made any serious performance comparison between the two yet.

Reply 4 of 4, by superfury

User metadata
Rank l33t++
Rank
l33t++

Any idea how exactly the register 30h and extended CPU VGA VRAM memory aperture works? Is it just the bits 22-29 of the memory address by the CPU in the register 30h? Or just bits 22-23(thus choices of a base address of 4MB, 8MB, 12MB and 16MB, where RAM might also be (which would explain why it wouldn't 'work' according to documentation)? Or is i 1-bit with the highest/upper(bit 1 of said register) bit being an enable flag of sorts (docs say SEGE)?
Unfortunately, the mapping chip connecting it to SEGE/lines 20-24 from said chip(the inputs to said chip being the CPU's address lines and CS16 from the ISA bus?
Anyone?

I'm having troubles with getting the emulated chip to work(windows 95 text blitting issues and VDIAG having more accelerator problems somehow with the newly added handling of the suspend/terminate register bits(bit 0&3 of said register triggering it when written set)).
VDIAG seems to complain a lot having added it (two simulataneous buffers, one byte queue for the queued stuff(containing either registers to write(80h+ range) or memory aperture writes from MMU 0-2 aperture)) and another containing a simple OR-toggle (only cleared by hardware processing) for the terminate/suspend bits.
Loading the queue and/or suspend/terminate register(with 01h or 10h or 11h) sets bit 0 of thr status register. Only clearing and hardware processing of those two clear said but when both queue and suspend/terminate are cleared in their buffers.
Bit 1 of the status is set when one of the queues and suspend/terminate are loaded. It's only cleared when the accelerator checks for new data from the queue(indicated by bit 0 in the status register) and finds it cleared(thus no data has been supplied when it expects the queue to deliver the next 1 or 8 pixel data or register write to process (and also requiring the suspend/terminate latch to not be 'filled' with bit 0/4).
Suspend/terminate happens when it's finished procesding the pixel data that's loaded already and it finds the flags set internally.
Would that be correct behaviour?

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