Je n'ai pas été seul ici à essayer de
faire tourner Windows 3.1 sur du matériel moderne, et à constater que ce système d'exploitation, en Mode Étendue 386, n'est pas compatible avec les contrôleurs SATA en mode AHCI. Je présumais que c'était à cause de quelques incompatibilités fondamentales entre la spécification AHCI et les codes de gestion de disques de Win3.1. Mais j'ai fait quelques investigations, et j'ai trouvé qu'en fait (au moins sur mon PC), cette incompatibilité vient d'un simple
bug de firmware dans les contrôleurs AHCI d'Intel !
Lors d'un
int 13h, si le système tourne sous Windows ou sous EMM386, le firmware du contrôleur AHCI se sert de
int 4Bh pour traduire les adresses virtuelles. Mais malheureusement, il fait systématiquement des appels
invalides à
int 4Bh AX=8104h, où la structure DDS se trouve à DS:DI au lieu de ES:DI. Sous EMM386, ceci ne pose pas de problème, pour n'importe quelle raison, mais sous Windows 3.1 en Mode Étendue 386, ça provoque un crash du système.
Heureusement, je suis en train d'écrire un petit VxD, qui intercepte
int 4Bh, et détecte et règle ces appels invalides. En ce moment, ce VxD ne fonctionne qu'avec un DOS démarré avec EMM386, et pour quelque raison la souris ne fonctionne pas avec.

Mais j'ai l'intention de régler ces problèmes et publier ce VxD sur mon GitHub.
Et comment j'ai trouvé tout ça ? J'ai utilisé le débugueur WDEB386, qui vient avec
le DDK Win16. Je ne sais pas si c'est déjà connu, mais pour faire fonctionner ce débugueur j'ai dû faire un petit patch :
Comparing files WIN16DDK\386\TOOLS\WDEB386.EXE and C:\WINDOWS\WDEB386.EXE
000063D8: 0F 66
000063D9: 24 33
000063DA: F0 C0
000063DF: 0F 66
000063E0: 24 33
000063E1: F8 C0
|
Ceci vire les instructions
mov eax,tr6 et
mov eax,tr7, qui crashent le système parce que les registres TR6 et TR7 n'existent plus depuis le Pentium.
