Tvůrce webu je i pro tebe! Postav třeba web. Bez grafika. Bez kodéra. Hned.
wz

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