| 1 | ;; ----------------------------------------------------------------------- |
|---|
| 2 | ;; |
|---|
| 3 | ;; Copyright 1994-2008 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. |
|---|
| 10 | ;; |
|---|
| 11 | ;; ----------------------------------------------------------------------- |
|---|
| 12 | |
|---|
| 13 | ;; |
|---|
| 14 | ;; font.inc |
|---|
| 15 | ;; |
|---|
| 16 | ;; VGA font handling code |
|---|
| 17 | ;; |
|---|
| 18 | |
|---|
| 19 | section .text16 |
|---|
| 20 | |
|---|
| 21 | ; |
|---|
| 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.) |
|---|
| 24 | ; The font is on top of the getc stack. |
|---|
| 25 | ; |
|---|
| 26 | loadfont.err: jmp close ; Tailcall the close routine |
|---|
| 27 | |
|---|
| 28 | loadfont: |
|---|
| 29 | mov di,trackbuf |
|---|
| 30 | mov cx,4 |
|---|
| 31 | call readc ; Read header |
|---|
| 32 | jc .err |
|---|
| 33 | |
|---|
| 34 | mov ax,[trackbuf] ; Magic number |
|---|
| 35 | cmp ax,0436h |
|---|
| 36 | jne .err |
|---|
| 37 | |
|---|
| 38 | mov al,[trackbuf+2] ; File mode |
|---|
| 39 | cmp al,5 ; Font modes 0-5 supported |
|---|
| 40 | ja .err |
|---|
| 41 | |
|---|
| 42 | xor bx,bx |
|---|
| 43 | mov bh,[trackbuf+3] ; Height of font |
|---|
| 44 | cmp bh,2 ; VGA minimum |
|---|
| 45 | jb .err |
|---|
| 46 | cmp bh,32 ; VGA maximum |
|---|
| 47 | ja .err |
|---|
| 48 | |
|---|
| 49 | ; Load the actual font |
|---|
| 50 | mov di,trackbuf |
|---|
| 51 | mov cx,bx ; Bytes = font height * 256 |
|---|
| 52 | call readc |
|---|
| 53 | jc .err |
|---|
| 54 | |
|---|
| 55 | call close |
|---|
| 56 | |
|---|
| 57 | ; Copy to font buffer |
|---|
| 58 | mov si,trackbuf ; Start of font data |
|---|
| 59 | mov [VGAFontSize],bh |
|---|
| 60 | push es |
|---|
| 61 | mov cx,aux_seg |
|---|
| 62 | mov es,cx |
|---|
| 63 | mov di,aux.fontbuf |
|---|
| 64 | mov cx,bx |
|---|
| 65 | shr cx,2 |
|---|
| 66 | rep movsd |
|---|
| 67 | pop es |
|---|
| 68 | |
|---|
| 69 | mov [UserFont], byte 1 ; Set font flag |
|---|
| 70 | |
|---|
| 71 | ; |
|---|
| 72 | ; use_font: |
|---|
| 73 | ; This routine activates whatever font happens to be in the |
|---|
| 74 | ; vgafontbuf, and updates the adjust_screen data. |
|---|
| 75 | ; Must be called with CS = DS |
|---|
| 76 | ; |
|---|
| 77 | use_font: |
|---|
| 78 | test byte [UsingVGA], ~03h ; Nonstandard mode? |
|---|
| 79 | jz .modeok |
|---|
| 80 | call vgaclearmode |
|---|
| 81 | |
|---|
| 82 | .modeok: |
|---|
| 83 | test [UserFont], byte 1 ; Are we using a user-specified font? |
|---|
| 84 | jz adjust_screen ; If not, just do the normal stuff |
|---|
| 85 | |
|---|
| 86 | push es |
|---|
| 87 | mov bp,aux_seg |
|---|
| 88 | mov es,bp |
|---|
| 89 | |
|---|
| 90 | mov bp,aux.fontbuf ; ES:BP -> font |
|---|
| 91 | mov bh,[VGAFontSize] |
|---|
| 92 | xor bl,bl ; Needed by both INT 10h calls |
|---|
| 93 | |
|---|
| 94 | test byte [UsingVGA], 01h ; Are we in graphics mode? |
|---|
| 95 | jz .text |
|---|
| 96 | |
|---|
| 97 | .graphics: |
|---|
| 98 | xor cx,cx |
|---|
| 99 | mov cl,bh ; CX = bytes/character |
|---|
| 100 | mov ax,[GXPixRows] |
|---|
| 101 | div cl ; Compute char rows per screen |
|---|
| 102 | mov dl,al |
|---|
| 103 | dec ax |
|---|
| 104 | mov [VidRows],al |
|---|
| 105 | mov ax,1121h ; Set user character table |
|---|
| 106 | int 10h |
|---|
| 107 | mov ax,[GXPixCols] |
|---|
| 108 | shr ax,3 ; 8 pixels/character |
|---|
| 109 | dec ax |
|---|
| 110 | mov [VidCols],al |
|---|
| 111 | pop es |
|---|
| 112 | ret ; No need to call adjust_screen |
|---|
| 113 | |
|---|
| 114 | .text: |
|---|
| 115 | mov cx,256 |
|---|
| 116 | xor dx,dx |
|---|
| 117 | mov ax,1110h |
|---|
| 118 | int 10h ; Load into VGA RAM |
|---|
| 119 | pop es |
|---|
| 120 | |
|---|
| 121 | xor bl,bl |
|---|
| 122 | mov ax,1103h ; Select page 0 |
|---|
| 123 | int 10h |
|---|
| 124 | |
|---|
| 125 | ; |
|---|
| 126 | ; adjust_screen: Set the internal variables associated with the screen size. |
|---|
| 127 | ; This is a subroutine in case we're loading a custom font. |
|---|
| 128 | ; |
|---|
| 129 | adjust_screen: |
|---|
| 130 | pusha |
|---|
| 131 | mov al,[BIOS_vidrows] |
|---|
| 132 | and al,al |
|---|
| 133 | jnz vidrows_ok |
|---|
| 134 | mov al,24 ; No vidrows in BIOS, assume 25 |
|---|
| 135 | ; (Remember: vidrows == rows-1) |
|---|
| 136 | vidrows_ok: mov [VidRows],al |
|---|
| 137 | mov ah,0fh |
|---|
| 138 | int 10h ; Read video state |
|---|
| 139 | dec ah ; Store count-1 (same as rows) |
|---|
| 140 | mov [VidCols],ah |
|---|
| 141 | popa |
|---|
| 142 | ret |
|---|
| 143 | |
|---|
| 144 | section .data16 |
|---|
| 145 | alignz 2 |
|---|
| 146 | VGAFontSize dw 16 ; Defaults to 16 byte font |
|---|
| 147 | UserFont db 0 ; Using a user-specified font |
|---|
| 148 | |
|---|
| 149 | section .bss16 |
|---|
| 150 | alignb 4 |
|---|
| 151 | GXPixCols resw 1 ; Graphics mode pixel columns |
|---|
| 152 | GXPixRows resw 1 ; Graphics mode pixel rows |
|---|