Introduction
Une des connaissances oublier de tous, c'est que certains modèles de clone de XT ont déjà supporté différents CMOS de fabricant tiers. Afin de facilité la compréhension du problème j'ai retiré certaines partie du code source de démarrage de la bibliothèque du Malte Genesis V: Alias Adèle du progiciel du MonsterBook dont voici pour le plus grand bénéfice de tous l'extrait du source :
- ; ---------------------------------------------------------------------------------------------------------------------------------------------------------------------
- ; Extrait du système de démarrage du progiciel MonsterBook
- ; Tous droits réservés par les Gladir.com
- ; Developpeur: Sylvain Maltais (smaltais@gladir.com)
- ;
- ; Utilisation à titre éducatif ou communautaire seulement
- ; ---------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
- ;Drapeau d'existance des Interruptions de la variable IntExistFlag
- flgInt10h equ 1 ; Drapeau indiquant l'existance de l'interruption 10h
- flgInt11h equ 2 ; Drapeau indiquant l'existance de l'interruption 11h
- flgInt12h equ 4 ; Drapeau indiquant l'existance de l'interruption 12h
- flgInt13h equ 8 ; Drapeau indiquant l'existance de l'interruption 13h
- flgInt14h equ 0010h ; Drapeau indiquant l'existance de l'interruption 14h
- flgInt15h equ 0020h ; Drapeau indiquant l'existance de l'interruption 15h
- flgInt16h equ 0040h ; Drapeau indiquant l'existance de l'interruption 16h
- flgInt1Ah equ 0080h ; Drapeau indiquant l'existance de l'interruption 1Ah
- flgInt21h equ 0100h ; Drapeau indiquant l'existance de l'interruption 21h
- flgInt2Ah equ 0200h ; Drapeau indiquant l'existance de l'interruption 2Ah
- flgInt2Fh equ 0400h ; Drapeau indiquant l'existance de l'interruption 2Fh
- flgInt33h equ 0800h ; Drapeau indiquant l'existance de l'interruption 33h
- flgInt67h equ 1000h ; Drapeau indiquant l'existance de l'interruption 67h
-
- ; ---------------------------------------------------------------------------------------------------------------------------------------------------------------------
- ; Structure des cavaliers du démarrage
- ; ---------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
- Jumper STRUC
- FlgMethod DW ?
- ENDS
-
- ; ---------------------------------------------------------------------------------------------------------------------------------------------------------------------
- ; Structure de démarrage
- ; ---------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
- StartUpRec STRUC
- ; Info sur le Micro-Processeur et son bus système
- CPU DB ? ; Modèle de CPU
- Up32Bits DB ? ; Boolean: Support les instructions 32 bits?
- CPUIDSupport DB ? ; Boolean: Support l'instruction CPUID?
- CPUVendor DB ? ; Byte: Fabricant du CPU?
- Bus DB ? ; Taille du Bus de données
- ; Info sur le modèle d'Ordinateur
- ComputerName DW ?
- PS2 DB ? ; Est-ce un PS/2 d'IBM?
- ; Info sur les Interruptions
- IntExistFlags DW ?
- ;Information sur le DOS
- GetDosVer DW ?
- GetDosBlock DD ? ; DosBlockPtr
- HandleExist DB ? ; Boolean: Est-ce que les Handles existent?
- ;Information sur OS/2 et Windows
- OS2 DB ? ; Boolean
- OS2HiVer DB ? ; Version OS/2
- OS2LoVer DB ? ; Sous-version OS/2
- Win DB ? ; Mode de fonctionnement de Windows
- WinLoVer DB ? ; Sous-version Windows
- WinHiVer DB ? ; Version Windows
- ;Information de pays
- CountryCode DW ?
- CodePage DW ?
- Date DW ? ; Format de la date
- Curr DB 5 DUP(?) ; Array[0..4]of Chr
- ThSep DW ? ; Array[0..1]of Chr
- DeSep DW ? ; Array[0..1]of Chr
- DtSep DW ? ; Array[0..1]of Chr
- TmSep DW ? ; Array[0..1]of Chr
- CurrStyle DB ?
- Digits DB ?
- Time DB ? ; TimeType
- CaseUp DD ? ; Pointer
- DaSep DW ? ; Array[0..1]of Chr
- ;Information sur le(s) lecteur(s) de disquette
- FloppyDskExist DB ? ; Boolean
- NmFloppyDsk DB ?
- ;Info sur le(s) disque(s) dur
- HardDskExist DB ? ; Boolean
- NmHardDsk DB ?
- HardDskCtrl DW ? ; Modèle de contrôleur de disque dur
- ; Information réseau
- IsNovell DB ? ; Boolean: Réseau Novell présent
- ; Spooler d'imprimante
- Spooler DB ?
- ;Information sur la manette de jeu
- JoyExist DB ?
- BiosJoy DB ?
- JoyPort DW ?
- JoyPotentioMeter DW ?
- ;Information sur le clavier
- KbdModel DB ?
- KbdCtrl DB ?
- KbdReadPort DW ?
- BiosKbdEnh DB ?
- ;Information sur le port parallèle
- LPTExist DB ? ; Boolean
- NmLPT DB ?
- Get1LPT DB ?
- ;Information sur le port série
- ComExist DB ? ; Boolean
- NmCom DB ?
- ;Information sur la mémoire conventionnel
- MemTotalSize DW ?
- ;Information sur l'Expanded Memory Manager (EMS)
- EmmExist DB ? ; Boolean
- EmmSeg DW ?
- EmmTotalSize DW ?
- ;Information sur l'eXtended Memory Manager (XMS)
- XmmExist DB ? ; Boolean
- XmmCtrl DD ? ; Pointer
- XmsTotalSize DW ?
- ;Information sur la mémoire étendu géré par le Bios Int 15h
- ExtBiosExist DB ? ; Boolean
- ExtBiosSizeK DW ?
- ;Information sur le CMOS
- CtrlCmos DB ?
- CmosPort DW ?
- ;Information sur la souris
- Mouse DB ?
- MouseVer DW ?
- MsButton DW ?
- ; Index de procédures ou fonctions à référence ressource RLL
- indAltPress DB ? ; AltPressed
- indCtrlPress DB ? ; CtrlPressed
- indFillChr DB ? ; FillByte/FillCharacter
- indGetIntVec DB ? ; GetInterruptVector
- indGetRawTimer DB ? ; GetRawTimer
- indGetRawTimerB DB ? ; GetRawTimerInByte
- indJoyPos DB ? ; JoystickPosition
- indKeyPress DB ? ; KeyPressed
- indLShiftPress DB ? ; LeftShiftPressed
- indMove DB ? ; Move/MoveLeft
- indPushKey DB ? ; PushKey
- indReadKey DB ? ; ReadKey
- indRShiftPress DB ? ; RightShiftPressed
- indSetIntVec DB ? ; SetInterruptVector
- indShiftPress DB ? ; ShiftPressed
- ENDS
-
- ; ***********************************************************************************************
- ; Détection de la présence des interruptions et de certains services de base ici ...
- ; ***********************************************************************************************
-
- ;-----------------------------------------------------------------------------------------------------------------------------
- ;-- Détection du CMOS
- ;-- (GetCmosPort/CtrlCmos/ExtBiosExist)
- ;-----------------------------------------------------------------------------------------------------------------------------
- MOV StartUp.StartUpRec.ExtBiosExist,No
- MOV StartUp.StartUpRec.ExtBiosSizeK,0
- TEST Jump.Jumper.FlgMethod,flgProtectedMode
- JNZ nXTCmosTst
- TEST StartUp.StartUpRec.IntExistFlags,flgInt15h
- MOV AX,0FFFFh
- MOV ES,AX
- JZ @@SetCmosPort ;
- CMP Byte Ptr ES:[0Eh],253
- JA @@SetCmosPort
- nXTCmosTst:
- XOR AX,AX
- TEST Jump.Jumper.FlgMethod,flgNoExtBiosMemDetect
- JNZ nExtInt15
- MOV AH,88h
- INT 15h
- nExtInt15:
- OR AX,AX
- MOV CX,70h
- MOV BL,ctrlCmosMC146818
- JE @@SetCmosPort ; Pas de Ext Bios Int 15h
- MOV StartUp.StartUpRec.ExtBiosExist,Ya
- MOV StartUp.StartUpRec.ExtBiosSizeK,AX
- JMP @@DetectCmos
- @@SetCmosPort:
- MOV AX,0FFFFh
- MOV ES,AX
- CMP Byte Ptr ES:[0Eh],252
- JE @@DetectCmos
- TEST Jump.Jumper.FlgMethod,flgNoCmosDetect
- JZ @@NoCmos
- CMP Byte Ptr ES:[0Eh],255 ; PC ?
- JE @@NoCmos
- CMP Byte Ptr ES:[0Eh],253 ; PC Junior ?
- JE @@NoCmos
- MOV DX,02C0h
- IN AL,DX
- TEST AL,0Fh
- JNZ @TooBad
- MOV DX,2CBh
- IN AL,DX
- CMP AL,0DEh
- JE @CmosB
- MOV AL,0DEh
- OUT DX,AL
- IN AL,DX
- CMP AL,0DEh
- JE @CmosB
- @TooBad:
- XOR AL,AL
- OUT DX,AL
- INC DX
- IN AL,DX
- DEC DX
- TEST AL,0Fh
- JNZ @TriBad
- MOV AL,0Bh
- OUT DX,AL
- INC DX
- IN AL,DX
- CMP AL,0DEh
- JE @CmosC
- MOV AL,0DEh
- OUT DX,AL
- IN AL,DX
- CMP AL,0DEh
- JE @CmosC
- @TriBad:
- XOR AL,AL
- OUT DX,AL
- MOV AL,80h
- OUT DX,AL
- MOV BL,0Eh
- INC DX
- MOV AL,BL
- OUT DX,AL
- DEC DX
- MOV AL,88h
- OUT DX,AL
- MOV AL,98h
- OUT DX,AL
- MOV AL,88h
- OUT DX,AL
- MOV AL,80h
- OUT DX,AL
- MOV AL,0A0h
- OUT DX,AL
- INC DX
- MOV CX,100h
- @LoopA:
- IN AL,DX
- TEST AL,1
- LOOPZ @LoopA
- JZ @NoCmosXT
- MOV CX,100h
- @LoopB:
- IN AL,DX
- TEST AL,1
- LOOPNZ @LoopB
- JZ @CmosA
- @NoCmosXT:
- MOV DX,2C0h
- XOR AL,AL
- OUT DX,AL
- ; XT, difficile à dire si un CMOS existe... Wyse, Commodore,...
- ; mais si oui: le Port est E0h pour les ordinateurs Wyses XT
- MOV CX,0E0h
- MOV BL,ctrlCmosUnknown
- JMP nCmosXT
- @CmosA:
- MOV BL,ctrlCmosRTC58321 ; RTC-58321, 2C0h-2C1h
- JMP @SetCmosXTPort
- @CmosB:
- MOV BL,ctrlCmosMM58167a ; MM58167, 2C0h-2DFh
- JMP @SetCmosXTPort
- @CmosC:
- MOV BL,ctrlCmosMM58167b ; MM58167, 2C0h-2C7h
- @SetCmosXTPort:
- MOV CX,02C0h
- nCmosXT:
- JMP @@DetectCmos
- @@NoCmos:
- XOR CX,CX ; Je fixe le port à 0, mais il faudrait
- ; surtout pas essayez pour voir...
- MOV BL,ctrlCmosNo
- @@DetectCmos:
- ; LES DI,StartUp
- MOV StartUp.StartUpRec.CmosPort,CX
- MOV StartUp.StartUpRec.CtrlCmos,BL
-
-
- ; ***********************************************************************************************
- ; Suite des routines détections du démarrage ici...
- ; ***********************************************************************************************
Voir également
Basic Pro: Fonction CMOS
Basic Pro: Fonction CMOSEXIST
Basic Pro: Fonction CMOSPORT
Dernière mise à jour : Vendredi, le 4 mars 2016