diff options
Diffstat (limited to 'contrib/syslinux-4.02/core/font.inc')
-rw-r--r-- | contrib/syslinux-4.02/core/font.inc | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/contrib/syslinux-4.02/core/font.inc b/contrib/syslinux-4.02/core/font.inc new file mode 100644 index 0000000..1223635 --- /dev/null +++ b/contrib/syslinux-4.02/core/font.inc @@ -0,0 +1,152 @@ +;; ----------------------------------------------------------------------- +;; +;; Copyright 1994-2008 H. Peter Anvin - All Rights Reserved +;; +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, Inc., 53 Temple Place Ste 330, +;; Boston MA 02111-1307, USA; either version 2 of the License, or +;; (at your option) any later version; incorporated herein by reference. +;; +;; ----------------------------------------------------------------------- + +;; +;; font.inc +;; +;; VGA font handling code +;; + + section .text16 + +; +; loadfont: Load a .psf font file and install it onto the VGA console +; (if we're not on a VGA screen then ignore.) +; The font is on top of the getc stack. +; +loadfont.err: jmp close ; Tailcall the close routine + +loadfont: + mov di,trackbuf + mov cx,4 + call readc ; Read header + jc .err + + mov ax,[trackbuf] ; Magic number + cmp ax,0436h + jne .err + + mov al,[trackbuf+2] ; File mode + cmp al,5 ; Font modes 0-5 supported + ja .err + + xor bx,bx + mov bh,[trackbuf+3] ; Height of font + cmp bh,2 ; VGA minimum + jb .err + cmp bh,32 ; VGA maximum + ja .err + + ; Load the actual font + mov di,trackbuf + mov cx,bx ; Bytes = font height * 256 + call readc + jc .err + + call close + + ; Copy to font buffer + mov si,trackbuf ; Start of font data + mov [VGAFontSize],bh + push es + mov cx,aux_seg + mov es,cx + mov di,aux.fontbuf + mov cx,bx + shr cx,2 + rep movsd + pop es + + mov [UserFont], byte 1 ; Set font flag + +; +; use_font: +; This routine activates whatever font happens to be in the +; vgafontbuf, and updates the adjust_screen data. +; Must be called with CS = DS +; +use_font: + test byte [UsingVGA], ~03h ; Nonstandard mode? + jz .modeok + call vgaclearmode + +.modeok: + test [UserFont], byte 1 ; Are we using a user-specified font? + jz adjust_screen ; If not, just do the normal stuff + + push es + mov bp,aux_seg + mov es,bp + + mov bp,aux.fontbuf ; ES:BP -> font + mov bh,[VGAFontSize] + xor bl,bl ; Needed by both INT 10h calls + + test byte [UsingVGA], 01h ; Are we in graphics mode? + jz .text + +.graphics: + xor cx,cx + mov cl,bh ; CX = bytes/character + mov ax,[GXPixRows] + div cl ; Compute char rows per screen + mov dl,al + dec ax + mov [VidRows],al + mov ax,1121h ; Set user character table + int 10h + mov ax,[GXPixCols] + shr ax,3 ; 8 pixels/character + dec ax + mov [VidCols],al + pop es + ret ; No need to call adjust_screen + +.text: + mov cx,256 + xor dx,dx + mov ax,1110h + int 10h ; Load into VGA RAM + pop es + + xor bl,bl + mov ax,1103h ; Select page 0 + int 10h + +; +; adjust_screen: Set the internal variables associated with the screen size. +; This is a subroutine in case we're loading a custom font. +; +adjust_screen: + pusha + mov al,[BIOS_vidrows] + and al,al + jnz vidrows_ok + mov al,24 ; No vidrows in BIOS, assume 25 + ; (Remember: vidrows == rows-1) +vidrows_ok: mov [VidRows],al + mov ah,0fh + int 10h ; Read video state + dec ah ; Store count-1 (same as rows) + mov [VidCols],ah + popa + ret + + section .data16 + alignz 2 +VGAFontSize dw 16 ; Defaults to 16 byte font +UserFont db 0 ; Using a user-specified font + + section .bss16 + alignb 4 +GXPixCols resw 1 ; Graphics mode pixel columns +GXPixRows resw 1 ; Graphics mode pixel rows |