In text modes the EGA and VGA draw characters from fonts held in the card's own memory, not from a fixed ROM as the CGA and MDA did. That makes the font replaceable: a program can load the ROM's other fonts or one of its own, redraw single glyphs (box drawing, national letters, a mouse arrow made from characters), and by loading a lower font fit more lines on the screen. Function 11h does all of this; AL selects the subfunction.

ALWhat it does
00hload CX glyphs of a user font from ES:BP, from character DX on, BH bytes each, into font block BL
01hload the ROM 8×14 font
02hload the ROM 8×8 font
03hchoose which font blocks are in use (BL)
04hload the ROM 8×16 font (VGA)
10h, 11h, 12h, 14has 00h, 01h, 02h, 04h, and set the character height and the number of rows to match
20h–24hfonts for graphics modes (through vectors 1Fh and 43h)
30hget information: BH chooses the font, ES:BP returns its address

The 0xh forms only replace glyphs, for changing a few characters. The 1xh forms also reprogram the character height and recompute the rows, as a mode set would; they are meant to be called right after function 00h. 12h in mode 03h gives 400 / 8 = 50 lines on a VGA, 350 / 8 = 43 on an EGA:

Prints "rows on the screen: 50"; on the screen the text switches to the small 8×8 font, 50 lines, for 2 seconds, then mode 03h clears the screen back to 25 lines.
MOV AX, 1112h ; load the 8x8 ROM font, recompute the rows
MOV BL, 0 ; into font block 0, the one in use
INT 10h
MOV AX, 1130h ; font information: DL = rows - 1
MOV BH, 0
INT 10h
INC DL
MOV [ROWS1], DL
MOV CX, 001Eh ; wait 2 s: CX:DX = 1E8480h microseconds
MOV DX, 8480h
MOV AH, 86h ; BIOS: wait
INT 15h
MOV AX, 0003h ; mode 03h: the 8x16 font and 25 rows again
INT 10h
MOV AH, 09h
MOV DX, OFFSET TXT1
INT 21h
MOV AL, [ROWS1]
CALL PDEC2
MOV AH, 09h
MOV DX, OFFSET CRLF1
INT 21h
ROWS1 DB 0
TXT1 DB "rows on the screen: $"
CRLF1 DB 13, 10, "$"
PDEC2: ; print AL (0..99) as two decimal digits
AAM ; AH = AL / 10, AL = AL mod 10
ADD AX, 3030h ; both into "0".."9"
PUSH AX
MOV DL, AH
MOV AH, 02h
INT 21h
POP AX
MOV DL, AL
MOV AH, 02h
INT 21h
RET

Font information

With AL = 30h the BIOS returns in ES:BP the address of the font chosen by BH, in CX the height of the font in use (16 in mode 03h on a VGA) and in DL the number of rows minus one. The fonts are laid out simply: one byte per row of dots, bit 7 on the left, the rows of a character one after the other, so in the 8×16 font character n starts at n × 16. Here the BIOS's "A" is printed with DOS, a # for each dot:

Prints "16 scan lines, 25 rows", then the letter A of the 8×16 ROM font as 16 lines of eight characters, # for a dot and . for none; the first two and the last four lines are all dots.
MOV AX, 1130h ; get font information
MOV BH, 06h ; which font: the ROM 8x16
INT 10h ; ES:BP = font, CX = height in use, DL = rows - 1
MOV [FH1], CL
INC DL
MOV [ROWS1], DL
MOV AL, [FH1]
CALL PDEC2
MOV AH, 09h
MOV DX, OFFSET TXT1
INT 21h
MOV AL, [ROWS1]
CALL PDEC2
MOV AH, 09h
MOV DX, OFFSET TXT2
INT 21h
ADD BP, 41h * 16 ; "A" is character 41h: 16 bytes each
MOV SI, 16 ; 16 rows in the glyph
GROW1:
MOV BL, ES:[BP] ; one row: a bit per dot, bit 7 on the left
INC BP
MOV CX, 8
GBIT1:
MOV DL, "."
SHL BL, 1 ; the next dot into CF
JNC GDOT1
MOV DL, "#"
GDOT1:
MOV AH, 02h
INT 21h
LOOP GBIT1
MOV AH, 09h
MOV DX, OFFSET CRLF1
INT 21h
DEC SI
JNZ GROW1
FH1 DB 0
ROWS1 DB 0
TXT1 DB " scan lines, $"
TXT2 DB " rows", 13, 10, "$"
CRLF1 DB 13, 10, "$"
PDEC2: ; print AL (0..99) as two decimal digits
AAM ; AH = AL / 10, AL = AL mod 10
ADD AX, 3030h ; both into "0".."9"
PUSH AX
MOV DL, AH
MOV AH, 02h
INT 21h
POP AX
MOV DL, AL
MOV AH, 02h
INT 21h
RET
BHFont returned by AL = 30h
00hthe one vector 1Fh points to (characters 80h–FFh in CGA graphics modes)
01hthe one vector 43h points to (graphics modes)
02hROM 8×14
03hROM 8×8, characters 00h–7Fh
04hROM 8×8, characters 80h–FFh
05hROM 9×14 replacement glyphs
06hROM 8×16 (VGA)
07hROM 9×16 replacement glyphs (VGA)

Pitfalls

A program that changes the font or the number of lines must put it back, and setting mode 03h again is the simple way: it reloads the 8×16 font and 25 lines. Many programs assume 25 lines and misbehave otherwise. CX from AL = 30h is the height of the font in use, not of the font BH asked for. A loaded font only lives in the card's memory; the next mode set replaces it.