extlinux: when building for klibc, mknod() needs to be a block device
[syslinux.git] / font.inc
blob820459af74e30f0824ea459425044b80b80079cb
1 ;; -----------------------------------------------------------------------
2 ;;
3 ;;   Copyright 1994-2004 H. Peter Anvin - All Rights Reserved
4 ;;
5 ;;   This program is free software; you can redistribute it and/or modify
6 ;;   it under the terms of the GNU General Public License as published by
7 ;;   the Free Software Foundation, Inc., 53 Temple Place Ste 330,
8 ;;   Boston MA 02111-1307, USA; either version 2 of the License, or
9 ;;   (at your option) any later version; incorporated herein by reference.
11 ;; -----------------------------------------------------------------------
14 ;; font.inc
16 ;; VGA font handling code
19                 section .text
22 ; loadfont:     Load a .psf font file and install it onto the VGA console
23 ;               (if we're not on a VGA screen then ignore.)  It is called with
24 ;               SI and DX:AX set by routine searchdir
26 loadfont:
27                 mov bx,trackbuf                 ; The trackbuf is >= 16K; the part
28                 mov cx,[BufSafe]                ; of a PSF file we care about is no
29                 call getfssec                   ; more than 8K+4 bytes
31                 mov ax,[trackbuf]               ; Magic number
32                 cmp ax,0436h
33                 jne lf_ret
35                 mov al,[trackbuf+2]             ; File mode
36                 cmp al,5                        ; Font modes 0-5 supported
37                 ja lf_ret
39                 mov bh,byte [trackbuf+3]        ; Height of font
40                 cmp bh,2                        ; VGA minimum
41                 jb lf_ret
42                 cmp bh,32                       ; VGA maximum
43                 ja lf_ret
45                 ; Copy to font buffer
46                 mov si,trackbuf+4               ; Start of font data
47                 mov [VGAFontSize],bh
48                 mov di,vgafontbuf
49                 mov cx,(32*256) >> 2            ; Maximum size
50                 rep movsd
52                 mov [UserFont], byte 1          ; Set font flag
54                 ; Fall through to use_font
57 ; use_font:
58 ;       This routine activates whatever font happens to be in the
59 ;       vgafontbuf, and updates the adjust_screen data.
60 ;       Must be called with CS = DS = ES
62 use_font:
63                 test [UserFont], byte 1         ; Are we using a user-specified font?
64                 jz adjust_screen                ; If not, just do the normal stuff
66                 mov bp,vgafontbuf
67                 mov bh,[VGAFontSize]
69                 xor bl,bl                       ; Needed by both INT 10h calls
70                 cmp [UsingVGA], byte 1          ; Are we in graphics mode?
71                 jne .text
73 .graphics:
74                 xor cx,cx
75                 mov cl,bh                       ; CX = bytes/character
76                 mov ax,480
77                 div cl                          ; Compute char rows per screen
78                 mov dl,al
79                 dec al
80                 mov [VidRows],al
81                 mov ax,1121h                    ; Set user character table
82                 int 10h
83                 mov [VidCols], byte 79          ; Always 80 bytes/line
84 .lf_ret:        ret                             ; No need to call adjust_screen
86 .text:
87                 mov cx,256
88                 xor dx,dx
89                 mov ax,1110h
90                 int 10h                         ; Load into VGA RAM
92                 xor bl,bl
93                 mov ax,1103h                    ; Select page 0
94                 int 10h
96                 ; Fall through to adjust_screen
98 lf_ret          equ use_font.lf_ret
101 ; adjust_screen: Set the internal variables associated with the screen size.
102 ;               This is a subroutine in case we're loading a custom font.
104 adjust_screen:
105                 pusha
106                 mov al,[BIOS_vidrows]
107                 and al,al
108                 jnz vidrows_ok
109                 mov al,24                       ; No vidrows in BIOS, assume 25
110                                                 ; (Remember: vidrows == rows-1)
111 vidrows_ok:     mov [VidRows],al
112                 mov ah,0fh
113                 int 10h                         ; Read video state
114                 dec ah                          ; Store count-1 (same as rows)
115                 mov [VidCols],ah
116                 popa
117                 ret
120 ; VGA font buffer at the end of memory (so loading a font works even
121 ; in graphics mode, but don't put too much pressure on the .bss)
122                 section .latebss
123 vgafontbuf      resb 8192
125                 section .data
126                 align 2, db 0
127 VGAFontSize     dw 16                   ; Defaults to 16 byte font
128 UserFont        db 0                    ; Using a user-specified font