HalpInitializeClock函数分析之CMOS_WRITE宏定义和CMOS_CONTROL_PORT=0x70和CMOS_DATA_PORT=0x71
F:\srv03rtm\base\hals/halmps/i386/mpclock.asm:279:cPublicProc _HalpInitializeClock ,0
F:\srv03rtm\base\hals/halmps/i386/mpclock.asm:366: stdRET _HalpInitializeClock
F:\srv03rtm\base\hals/halmps/i386/mpclock.asm:368:stdENDP _HalpInitializeClock
第一部分:
;
; Set the interrupt rate to what is actually needed
;
stdCall _HalpAcquireCmosSpinLock ; intr disabled
mov eax, _HalpCurrentRTCRegisterA
shl ax, 8
mov al, 0AH ; Register A
CMOS_WRITE ; Initialize it
;
; Don't clobber the Daylight Savings Time bit in register B, because we
; stash the LastKnownGood "environment variable" there.
;
mov ax, 0bh
CMOS_READ
and al, 1
mov ah, al
or ah, REGISTER_B_ENABLE_PERIODIC_INTERRUPT
mov al, 0bh
CMOS_WRITE ; Initialize it
mov al,0CH ; Register C
CMOS_READ ; Read to initialize
mov al,0DH ; Register D
CMOS_READ ; Read to initialize
stdCall _HalpReleaseCmosSpinLock
第二部分:
;
; CMOS_READ
;
; Description: This macro reads a byte from the CMOS register specified
; in (AL).
;
; Parameter: (AL) = address/register to read
; Returns: (AL) = data
;
CMOS_READ MACRO
OUT CMOS_CONTROL_PORT,AL ; ADDRESS LOCATION AND DISABLE NMI
IODelay ; I/O DELAY
IN AL,CMOS_DATA_PORT ; READ IN REQUESTED CMOS DATA
IODelay ; I/O DELAY
ENDM
;
; CMOS_WRITE
;
; Description: This macro reads a byte from the CMOS register specified
; in (AL).
;
; Parameter: (AL) = address/register to read
; (AH) = data to be written
;
; Return: None
;
CMOS_WRITE MACRO
OUT CMOS_CONTROL_PORT,AL ; ADDRESS LOCATION AND DISABLE NMI
IODelay ; I/O DELAY
MOV AL,AH ; (AL) = DATA
OUT CMOS_DATA_PORT,AL ; PLACE IN REQUESTED CMOS LOCATION
IODelay ; I/O DELAY
ENDM
第三部分:
//
// CMOS related definitions and macros
//
#define CMOS_CONTROL_PORT 0x70 // cmos command port
#define CMOS_DATA_PORT 0x71 // cmos data port
#define CMOS_FLOPPY_CONFIG_BYTE 0x10