I'm a bit curious now how the ET4000AX actually deals with it's linear mode.
The documentation says:
Bit 4, when set to 1, will define the most significant 4-bits of display memory
address lines as directly from the microprocessor address bus llinear system). Note
also that GDC Indexed Register 6, bits 3 & 2 must be set for 128K bytes 10,0).
Since the linear system responds to a contiguous 1MB address space, the host
addresses IA(23:20») should be used to avoid address conflicts with the host.
When set to 0, defines these address lines as derived from the Segment Select
Register (port 3CD).
Is anything known how those top 4 bits of the 24-bit address inputted are mapped by the ET4000AX?
Perhaps the Segment Select Register (3CD) is used for that for both reads and writes (reads/writes using either the top(read) or bottom(write) 4 bits depending on if it's a read or a write?), since it's unused in this mode?
So combined with my new ISA adapter to map the upper address bits into the ISA space (in 16MB chunks), you can position it anywhere in 1MB(ET4000AX) or 4MB(ET4000/W32) locations within that 16MB(ISA) address space. Combining those two, you can put it anywhere inside 4GB memory locations (including the first MB, which you obviously shouldn't).
The ISA space is defined by the PCI-to-ISA adapter, while the location of the ET4000 memory within that is defined by:
- The Segment Select register (3CD) on the ET4000AX (low 4 bits for writes, high 4 bits for reads, usually you'd map them equal).
- Register 30h on the W32i chips, using bits 0-1 for A22-A23 (to specify the address space used, in 4MB chunks) and bits 2-4 to 111b for legacy mode (normal VGA mapping, the power-on default) and 110b for linear memory mode (provided the linear memory map bit in register 36h (bit 4) is set).
In fact, does bits 2-4 of the register 30h registers even need to be modified? Can't it just be kept at 111b and simply bits 0-1 used to map?
Edit: Just checked and cross-referenced with Aleks's card schematics. Since DB11 is low during PORI (grounded), the ISA A23 (AT connector) is like in his card mapped to SEGE. SEGE then is used as bit 1 input to register 30h. Bit 0 is the usual A22 (AT connector). A21-17 are there on the AT connector too. So the bottom bits are forced low on segmented mode, thus mapping to 0-4MB. But in segmented mode, A21-20 are compared to low as well, thus forcing to only respond to the first ISA 1MB. And then the normal A0000-BFFFF mapping applies inside the chip.
When set to linear mode, A23-22 are thus matched to reg 30h bit 0-1 and if matched address the linear memory area.
My emulator now is modified to support it that way too (SEG0-2 are ignored now).
And the personal PCI-to-ISA bridge of my software implementation (A IT8888G PCI-to-ISA bridge) can remap it past the memory present to prevent conflicts. It's as documented, except with a ROM (also documented) to load a subvendor/subdevice ID to identify it as the ET4000AX(W32P with low 8 bits being 00h, so 100C:3200h) or ET4000/W32i rev 2 (W32P with low 8 bits being 03h (100C:3203)).
The card itself also once again identifies as ISA now (no PCI/VLB).
So it can map the space anywhere in 4GB now (low 23 bits using register 30h or 3CD(ET4000AX) and upper bits (24-32) using the IT8888G PCI-to-ISA relocation feature). Although Windows 9x doesn't have drivers for it afaik? Or is that just a 95 issue (95 RTM identifies it as a 'broken' PCI-to-ISA bridge (error 2))? 95 OSR 2.5(C) thinks it's a generic PCI bus?
Neither think that the ET4000/W32i is on that bus it seems?