Obsah / Ovladače / CMOS / Interní funkce ovladače paměti CMOS
Zdrojový kód:
DRIVERS\SYSTEM\CMOS.ASM
Interní
funkce ovladače paměti CMOS
Definice konstant a
maker ovladače:
CMOS_BASE EQU 70h ; CMOS base register
CMOS_INDEX EQU CMOS_BASE+0 ; CMOS index register
CMOS_DATA EQU CMOS_BASE+1 ; CMOS data register
; ------------- Macro - read byte from CMOS (INPUT: %1=index, OUTPUT: AL=value)
; (It takes aprox. 4 us)
%macro GET_CMOS 1
mov al,%1 ; AL <- index of the byte
out CMOS_INDEX,al ; set index of the byte
SHORT_DELAY ; short delay
in al,CMOS_DATA ; read byte from the CMOS
%endmacro
; ------------- Macro - pack binary data in AL to BCD format (destroys AH)
%macro BINBCD 0
aam 10 ; unpack digits modulo 10
aad 16 ; pack digits modulo 16
%endmacro
; ------------- Macro - unpack BCD format in AL to binary data (destroys AH)
%macro BCDBIN 0
aam 16 ; unpack digits modulo 16
aad 10 ; pack digits modulo 10
%endmacro
|
CMOS_BASE je bázová
adresa portu řadiče paměti CMOS. CMOS_INDEX je port indexu
registru CMOS, CMOS_DATA je port dat registru CMOS.
Makro GET_CMOS načte
bajt z paměti CMOS. Parametrem makra je index registru CMOS
(konstanta nebo 8-bitový registr). Makro vrací v registru AL
načtenou hodnotu. Makro se provádí zhruba 4 mikrosekundy.
Makro BINBCD převede
data v registru AL z binárního formátu na BCD formát. Makro
BCDBIN převede data obráceně z formátu BCD na binární
formát. Makra ničí obsah registru AH.
; -----------------------------------------------------------------------------
; Internal function: Read byte from CMOS in BCD or BIN mode into buffer
; -----------------------------------------------------------------------------
; INPUT: ESI = index of the byte in CMOS (in BCD or BIN mode)
; EDI = buffer to store byte (in BIN mode)
; EAX = bit 31 "BIN mode" flag
; OUTPUT: AL = byte in BIN mode (was stored into [EDI])
; ESI = ESI + 1
; EDI = EDI + 1
; DESTROYS: AH
; NOTES: It takes aprox. 4 us.
; -----------------------------------------------------------------------------
CMOSReadBCD: xchg eax,esi ; AL <- index of the byte
out CMOS_INDEX,al ; set index of the byte
inc eax ; increase index of the byte
xchg eax,esi ; ESI <- save new index of the byte
SHORT_DELAY ; short delay
in al,CMOS_DATA ; read byte from the CMOS
or eax,eax ; BIN mode flag?
js CMOSReadBCD2 ; byte is in BIN mode
BCDBIN ; convert from BCD to BIN
CMOSReadBCD2: stosb ; store byte
ret
|
CMOSReadBCD
je interní funkce ovladače CMOS používaná funkcí
CMOSDevGetTime a sloužící k načtení položky data či času
v módu BIN nebo BCD. Na vstupu funkce obsahuje registr ESI index
bajtu CMOS k načtení, registr EDI ukazatel bufferu k uložení
bajtu a bit 31 registru EAX příznak binárního formátu dat.
Na výstupu obsahuje registr AL načtený bajt v binárním
formátu (bajt je současně uložen do bufferu [EDI]) a registry
ESI a EDI jsou zvýšené o 1. Funkce ničí obsah registru AH a
trvá přibližně 4 mikrosekundy.
; -----------------------------------------------------------------------------
; Internal function: Write byte to CMOS in BCD or BIN mode from buffer
; -----------------------------------------------------------------------------
; INPUT: AL = byte in BIN mode
; EDI = index of the byte in CMOS (in BCD or BIN mode)
; DL = bit 2 "BIN mode" flag
; OUTPUT: EDI = EDI + 1
; DESTROYS: AL, AH
; NOTES: It takes aprox. 4 us.
; -----------------------------------------------------------------------------
CMOSWriteBCD: xchg eax,edi ; AL <- index of the byte
out CMOS_INDEX,al ; set index of the byte
inc eax ; increase index of the byte
xchg eax,edi ; EDI <- save new index of the byte
SHORT_DELAY ; short delay
test dl,RTC_BIN ; BIN mode?
jnz CMOSWriteBCD2 ; BIN mode
BINBCD ; convert BIN to BCD
CMOSWriteBCD2: out CMOS_DATA,al ; write byte to CMOS
ret
|
CMOSWriteBCD
je interní funkce ovladače CMOS používaná funkcí CMOSDevSetTime
a sloužící k uložení položky data či času v módu BIN
nebo BCD. Na vstupu funkce obsahuje registr AL bajt k uložení,
registr EDI index bajtu CMOS a bit 2 registru DL příznak
binárního formátu dat. Na výstupu je registr EDI zvýšený o
1. Funkce ničí obsah registrů AL a AH a trvá přibližně 4
mikrosekundy.
; -----------------------------------------------------------------------------
; Internal function: Read alarm from CMOS in BCD or BIN mode into buffer
; -----------------------------------------------------------------------------
; INPUT: AL = index of the byte in CMOS (in BCD or BIN mode)
; AH = flags to set into CL if byte is valid
; EAX = bit 31 "BIN mode" flag
; EDI = buffer to store byte (in BIN mode)
; CL = flag accumulator
; OUTPUT: EDI = EDI + 1
; DESTROYS: AL, AH
; NOTES: It takes aprox. 4 us.
; -----------------------------------------------------------------------------
CMOSReadAlarm: out CMOS_INDEX,al ; set index of the byte
SHORT_DELAY ; short delay
in al,CMOS_DATA ; read byte from the CMOS
cmp al,0c0h ; is byte valid?
jae CMOSReadAlarm4 ; byte is not valid
or cl,ah ; set byte valid flag
or eax,eax ; BIN mode flag?
js CMOSReadAlarm2 ; byte is in BIN mode
BCDBIN ; convert from BCD to BIN
CMOSReadAlarm2: stosb ; store byte
dec edi ; decrease pointer
CMOSReadAlarm4: inc edi ; increase pointer
ret
|
CMOSReadAlarm
je interní funkce ovladače CMOS používaná funkcí CMOSDevGetAlrm
a sloužící k načtení položky alarmu v módu BIN nebo BCD.
Na vstupu funkce obsahuje registr AL index bajtu CMOS k
načtení, registr AH příznak knastavení do registru CL je-li
bajt platný, registr CL střadač příznaků, registr EDI
ukazatel bufferu k uložení bajtu a bit 31 registru EAX
příznak binárního formátu dat. Na výstupu je registr EDI
zvýšený o 1. Funkce ničí obsah registrů AL a AH a trvá
přibližně 4 mikrosekundy.
; -----------------------------------------------------------------------------
; Internal function: Write alarm to CMOS in BCD or BIN mode from buffer
; -----------------------------------------------------------------------------
; INPUT: AL = index of the byte in CMOS (in BCD or BIN mode)
; AH = flags to test in CL
; EAX = bit 31 "BIN mode" flag
; ESI = buffer to load byte (in BIN mode)
; CL = flags
; OUTPUT: ESI = ESI + 1
; DESTROYS: AL, AH
; NOTES: It takes aprox. 4 us.
; -----------------------------------------------------------------------------
CMOSWriteAlarm: out CMOS_INDEX,al ; set index of the byte
SHORT_DELAY ; short delay
inc esi ; skip data
mov al,0ffh ; AL <- invalid value
test cl,ah ; is byte valid?
jz CMOSWriteAlarm2 ; byte is not valid
dec esi ; return pointer
lodsb ; load seconds
or eax,eax ; BIN mode flag?
js CMOSWriteAlarm2 ; byte is in BIN mode
BINBCD ; convert BIN to BCD
CMOSWriteAlarm2:out CMOS_DATA,al ; write byte to CMOS
ret
|
CMOSWriteAlarm
je interní funkce ovladače CMOS používaná funkcí CMOSDevSetAlrm
a sloužící k uložení položky alarmu v módu BIN nebo BCD.
Na vstupu funkce obsahuje registr AL index bajtu CMOS, registr AH
příznak k testování platnosti bajtu v registru CL, bit 31
registru EAX příznak binárního formátu dat, registr ESI
ukazatel bufferu k načtení bajtu a registr CL příznaky
platnosti bajtu. Na výstupu je registr ESI zvýšen o 1. Funkce
ničí obsah registrů AL a AH a trvá přibližně 4
mikrosekundy.
Obsah / Ovladače / CMOS / Interní funkce ovladače paměti CMOS