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

Obsah / Utility / CHARSET / Inicializace tabulek znakových sad

Zdrojový kód: INCLUDE\UTIL\CHARSET.INC, UTIL\CHARSET.ASM


Inicializace tabulek znakových sad

Funkce pro inicializaci tabulek znakových sad je volána během startu systému.


; ------------- Initialize ISO 8895-1 (Latin 1) table

CharTabInit:	mov	edi,CP28591ToUniTab+32*2 ; EDI <- 0a0h character
		xor	eax,eax		; EAX <- 0
		mov	al,0a0h		; EAX <- 0a0h, first character
CharTabInit1:	stosw			; store one character
		inc	al		; increase character
		jnz	CharTabInit1	; initialize table 0..0ffh

Pro zmenšení velikosti souboru jádra systému je převodní tabulka stránky ISO 88951-1 generována programově, protože obsahuje inkrementované hodnoty od kódu 0A0h po 0FFh.


; ------------- Prepare to initialize conversion table from Unicode

		mov	ebx,CharSetTab	; EBX <- first character set
CharTabInit2:	test	byte [ebx+CHSET_Flags],CHSET_MBYTE ; multibyte?
		jnz	CharTabInit5	; charset need not be initialized
		mov	esi,[ebx+CHSET_ToUni] ; ESI <- table to Unicode
		mov	dl,80h		; DL <- 80h, first character

Dále následuje vygenerování tabulek pro převod znaků z kódu Unicode. Do registru EBX je připraven ukazatel na první znakovou sadu. Jedná-li se o vícebajtovou znakovou sadu, obsluha se přeskočí, protože konverzní tabulky se používají pouze u 1-bajtových znakových sad. Do registru ESI je připraven ukazatel na tabulku pro převod na Unicode kód, do registru DL kód prvního generovaného znaku (80h, znaky menší než 80h se nekonvertují).


; ------------- Get one character in Unicode (-> AX)

CharTabInit3:	lodsw			; AX <- Unicode character
		movzx	edi,ah		; EDI <- page index

; ------------- Get page address (-> EDI)

		shl	edi,2		; EDI <- offset of page address
		add	edi,[ebx+CHSET_FromUni] ; EDI <- table from Unicode
		mov	ecx,[edi]	; ECX <- pointer to subpage
		or	ecx,ecx		; is subpage already allocated?
		jnz	CharTabInit4	; page is already allocated

; ------------- Allocate new subpage

		mov	ecx,[CharSetFromNext] ; ECX <- next subpage
		add	dword [CharSetFromNext],256 ; shift pointer to next subpage
		mov	[edi],ecx	; store pointer to subpage

Na začátku cyklu generování jedné tabulky se načte Unicode kód každého znaku (přitom v registru DL je odpovídající 1-bajtový kód znaku). Vyšší bajt kódu se použije jako index podstránky. Z ukazatele CHSET_FromUni se pomocí tohoto indexu zjistí, zda je podstránka již alokována. Víme přitom, že seznamy podstránek jsou již vynulovány, protože leží v oblasti neinicializovaných dat systému, která je nulována při jeho startu. Pokud nebyla podstránka dosud alokována, alokuje se pomocí ukazatele CharSetFromNext z pole CharSetFromSub. Dostatečná velikost pole je zajištěna konstantou UNISUBPAGES.


; ------------- Store character into page

CharTabInit4:	movzx	edi,al		; EDI <- offset of the character
		mov	[edi+ecx],dl	; store character

; ------------- Next character

		inc	dl		; increase character index
		jnz	CharTabInit3	; next character

; ------------- Next character set

CharTabInit5:	add	ebx,CHARSET_size ; EBX <- next character set
		cmp	ebx,CharSetTab2	; end of table?
		jb	CharTabInit2	; next table	
		ret

Nižší bajt kódu znaku je načten do registru EDI a s jeho pomocí je do podtabulky uložen odpovídající 1-bajtový kód znaku. Dále se zvýší kód znaku v registru DL a pokračuje se generováním kódu pro další znak. Jsou-li pro příslušnou kódovou stránku vygenerovány všechny znaky, pokračuje se další znakovou sadou.


Obsah / Utility / CHARSET / Inicializace tabulek znakových sad