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 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210
|
; =====================================================================
;
; EGA/VGA codepage selection routines
;
; Copyright (C) 9 Aug 2000 Ilya V. Vasilyev aka AtH//UgF@hMoscow
; e-mail: hscool@netclub.ru
; ( minimum touches by Aitor )
;
; . . . . . line that rules
;
; Fn: SModeTest
; Does: Determines wether text mode or graphic mode is enabled
; In: nothing
; Out: Carry set if graphic mode is set
;
; (EGA/VGA only!)
SModeTest:
push ax
mov al,6
push dx
mov dx,3ceH
out dx,al
call sfr ; Small delay
inc dx
in al,dx ; Graph Controller Misc Register
pop dx
shr al,1
pop ax
sfr: ret
; Fn: EGASSelect
; Does: Set a proper localized font for a given video mode
; In: AL Screen mode (-1 if unknown)
; Mod: (none)
;
; Summary: self-determine rows per character, then call the
; load-character-table function, which is int10h:
; AX=1100h (for text mode),
; AX=1121h (for graphics mode)
;
; NOTES:
; - AX, CX, DS, ES, DI will be used and not preserved
;
EGASSelect:
push cs ; we require ES==CS
pop es
push dx
push bx
push si
push bp
;************ initialise DX to number of lines (rows)
; in the screen
xor bx,bx ; BL: Zero!
mov ds,bx
mov dx,[484H]
mov bh,dh ; BH: bytes per character
inc dx ; DL: number of lines
;************ restore int1Fh vector with pointer to 8x8 table
mov WORD [7cH],bFont8x8+1024; Kinda tradition to restore
mov [7eH],cs ; vector 1fH every time
;************ determine the table to be installed (the number
; of rows)
cmp BYTE [cs:bAdapter],VGA ; if VGA (or better) or BH>=16,
jb sfNo8x16 ; then 8x16
cmp bh,16
jb sfNo8x16
mov bh,16 ; force bh=16 (in case it's >16)
mov bp,bFont8x16
jmp SHORT sfSetIt
sfNo8x16:
cmp bh,14 ; check bh>=14
jb sfNo8x14
mov bh,14 ; force bh=14 (in case it's >14)
mov bp,bFont8x14
jmp SHORT sfSetIt
sfNo8x14:
cmp bh,8 ; check bh>=8 If below 8,
jb sfpr ; then unsupported ->RETURN
mov bh,8 ; force bh=8 (in case it's >8)
mov bp,bFont8x8
;************ We have checked the number of rows, then set it
sfSetIt:
cmp al,13H
ja sfTest ; Screen modes above 13H are unknown
cmp al,0dH
jae sfGraph ; Screen modes 0d..13H are graphics
cmp al,4
jb sfText ; Screen modes 0..3 are text
cmp al,7
jz sfText ; Screen mode 7 is text
jb sfGraph ; Screen modes 4..6 are graphics
;************ unknown, test if text/graphics mode
sfTest: call SModeTest
jc sfGraph
;************ set the font for text mode: use int10h / ax=1100h
sfText:
mov cx,256 ; Load 256 characters
mov ax,1100H ; Load user font, reprogram controller
cwd ; DX=0, BL is already zero, BH=bpc
jmp SHORT sfi10
;************ set the font for graphics mode:
; use int10h / ax=1121h
sfGraph:
mov cl,bh ; bytes per character
sub ch,ch ; BL is already zero, DL=# of lines
mov ax,1121H ; Set vector 43H for user font
;************ call the appropriate interrupt function
sfi10: pushf
call FAR [cs:dOld10]
;************ end of interrupt
sfpr:
pop bp
pop si
pop bx
pop dx
clc ; just in case, always SUCCEED
ret
; Fn: old10call
; Does: clears BX and calls the old driver
; In: AX = some function of the old 10handler
; Out: results of the call
old10call: xor bx, bx
pushf
call FAR [cs:dOld10]
ret
; Fn: RefreshHWcp
; Does: Sets the hardware codepage, helped by the old int 10h handler
; In: CL: index of hardware font page to select (0, 1,...)
; Out: -
EGAHSelect:
push ax
push bx
;*********************** try Arabic/Hebrew first
inc cl
mov ax,0ad42h
int 02fh
;*********************** now call BIOS to refresh
mov cx,[cs:wNumSubFonts]
call SModeTest
jc RestoreGraph
mov ax, 1101h ; text mode calls
call old10call
cmp cl,2
jb RefreshHWcpEnd
mov ax, 1102h
call old10call
cmp cl,3
jb RefreshHWcpEnd
mov ax, 1104h
call old10call
jmp RefreshHWcpEnd
RestoreGraph: ; graphics mode calls
mov ax, 1122h
call old10call
cmp cl,2
jb RefreshHWcpEnd
mov ax, 1123h
call old10call
cmp cl,3
jb RefreshHWcpEnd
mov ax, 1124h
call old10call
RefreshHWcpEnd:
clc
pop bx
pop ax
ret
|