summaryrefslogtreecommitdiff
path: root/boot1/video.asm
blob: 61ff1535234492863bdec14307e87558ededa842 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
;;; Display the ASCIIZ string at ds:si via BIOS VIDEO call (real mode only)
Write:
        lodsb                   ; load char to al, increment si
        or al, al               ; see if it's null
        jz .DONE                ; if so, we're finished
        mov ah, 0x0E            ; service 0x0E: output one char
        mov bh, 0x00            ; display page 0
        mov bl, 0x07            ; char text attrib (white on black)
        int 0x10                ; invoke bios
        jmp Write      ; next char
.DONE:
        ret

;;; Probe the video system of the machine via BIOS VIDEO calls, populate 
;;; the HARDWARE_INFO buffer (real mode only).
PROBE_VIDEO:
        ;; identify the display type
        call DISP_ID
        mov [bDisplayType], al

        ;; determine the font size
        call FONT_SIZE
        mov [bFontSize], al
        ret

;;; Determine the font size (width in pixels) of the current display.
FONT_SIZE:
        cmp al, 0x0a
        jl .TRY_OLD
        mov al, BYTE 16
        ret
.TRY_OLD:
        cmp al, BYTE 1
        jne .TRY_CGA
        mov al, BYTE 14
        ret
.TRY_CGA:       
        cmp al, BYTE 2
        jne .TRY_VGA
        mov al, BYTE 8
        ret
.TRY_VGA:
        mov ah, 0x11
        mov al, 0x30
        mov bh, 0
        int 0x10
        mov al, cl
        ret

;;; Determine the video type via BIOS VIDEO call
DISP_ID:
        xor ax, ax
        mov ah, 0x1a
        int 0x10
        cmp al, 0x1a
        jne .TRY_EGA
        mov al, bl
        ret
.TRY_EGA:
        mov ah, 0x12
        mov bx, 0x10
        int 0x10
        cmp bx, 0x10
        je .OLD_BOARDS
        cmp bh, 0
        je .EGA_COLOR
        mov al, 5
        ret
.EGA_COLOR:
        mov al, 4
        ret
.OLD_BOARDS:
        int 0x11
        and al, 0x30
        cmp al, 0x30
        jne .CGA
        mov al, 1
        ret
.CGA:
        mov al, 2
        ret