Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci-2.6.23
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci-2.6.23
Commits
fac15a8e
Commit
fac15a8e
authored
May 02, 2007
by
Andi Kleen
Committed by
Andi Kleen
May 02, 2007
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[PATCH] x86-64: Share identical video.S between i386 and x86-64
Signed-off-by:
Andi Kleen
<
ak@suse.de
>
parent
2136220d
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
1 addition
and
2044 deletions
+1
-2044
arch/x86_64/boot/setup.S
arch/x86_64/boot/setup.S
+1
-1
arch/x86_64/boot/video.S
arch/x86_64/boot/video.S
+0
-2043
No files found.
arch/x86_64/boot/setup.S
View file @
fac15a8e
...
...
@@ -807,7 +807,7 @@ gdt_48:
#
Include
video
setup
&
detection
code
#include "video.S"
#include "
../../i386/boot/
video.S"
#
Setup
signature
--
must
be
last
setup_sig1
:
.
word
SIG1
...
...
arch/x86_64/boot/video.S
deleted
100644 → 0
View file @
2136220d
/*
video.S
*
*
Display
adapter
&
video
mode
setup
,
version
2
.13
(
14
-
May
-
99
)
*
*
Copyright
(
C
)
1995
--
1998
Martin
Mares
<
mj
@
ucw
.
cz
>
*
Based
on
the
original
setup
.
S
code
(
C
)
Linus
Torvalds
and
Mats
Anderson
*
*
Rewritten
to
use
GNU
'as'
by
Chris
Noe
<
stiker
@
northlink
.
com
>
May
1999
*
*
For
further
information
,
look
at
Documentation
/
svga
.
txt
.
*
*/
/*
Enable
autodetection
of
SVGA
adapters
and
modes
.
*/
#undef CONFIG_VIDEO_SVGA
/*
Enable
autodetection
of
VESA
modes
*/
#define CONFIG_VIDEO_VESA
/*
Enable
compacting
of
mode
table
*/
#define CONFIG_VIDEO_COMPACT
/*
Retain
screen
contents
when
switching
modes
*/
#define CONFIG_VIDEO_RETAIN
/*
Enable
local
mode
list
*/
#undef CONFIG_VIDEO_LOCAL
/*
Force
400
scan
lines
for
standard
modes
(
hack
to
fix
bad
BIOS
behaviour
*/
#undef CONFIG_VIDEO_400_HACK
/*
Hack
that
lets
you
force
specific
BIOS
mode
ID
and
specific
dimensions
*/
#undef CONFIG_VIDEO_GFX_HACK
#define VIDEO_GFX_BIOS_AX 0x4f02 /* 800x600 on ThinkPad */
#define VIDEO_GFX_BIOS_BX 0x0102
#define VIDEO_GFX_DUMMY_RESOLUTION 0x6425 /* 100x37 */
/*
This
code
uses
an
extended
set
of
video
mode
numbers
.
These
include
:
*
Aliases
for
standard
modes
*
NORMAL_VGA
(-
1
)
*
EXTENDED_VGA
(-
2
)
*
ASK_VGA
(-
3
)
*
Video
modes
numbered
by
menu
position
--
NOT
RECOMMENDED
because
of
lack
*
of
compatibility
when
extending
the
table
.
These
are
between
0x00
and
0xff
.
*/
#define VIDEO_FIRST_MENU 0x0000
/*
Standard
BIOS
video
modes
(
BIOS
number
+
0x0100
)
*/
#define VIDEO_FIRST_BIOS 0x0100
/*
VESA
BIOS
video
modes
(
VESA
number
+
0x0200
)
*/
#define VIDEO_FIRST_VESA 0x0200
/*
Video7
special
modes
(
BIOS
number
+
0x0900
)
*/
#define VIDEO_FIRST_V7 0x0900
/*
Special
video
modes
*/
#define VIDEO_FIRST_SPECIAL 0x0f00
#define VIDEO_80x25 0x0f00
#define VIDEO_8POINT 0x0f01
#define VIDEO_80x43 0x0f02
#define VIDEO_80x28 0x0f03
#define VIDEO_CURRENT_MODE 0x0f04
#define VIDEO_80x30 0x0f05
#define VIDEO_80x34 0x0f06
#define VIDEO_80x60 0x0f07
#define VIDEO_GFX_HACK 0x0f08
#define VIDEO_LAST_SPECIAL 0x0f09
/*
Video
modes
given
by
resolution
*/
#define VIDEO_FIRST_RESOLUTION 0x1000
/*
The
"recalculate timings"
flag
*/
#define VIDEO_RECALC 0x8000
/*
Positions
of
various
video
parameters
passed
to
the
kernel
*/
/*
(
see
also
include
/
linux
/
tty
.
h
)
*/
#define PARAM_CURSOR_POS 0x00
#define PARAM_VIDEO_PAGE 0x04
#define PARAM_VIDEO_MODE 0x06
#define PARAM_VIDEO_COLS 0x07
#define PARAM_VIDEO_EGA_BX 0x0a
#define PARAM_VIDEO_LINES 0x0e
#define PARAM_HAVE_VGA 0x0f
#define PARAM_FONT_POINTS 0x10
#define PARAM_LFB_WIDTH 0x12
#define PARAM_LFB_HEIGHT 0x14
#define PARAM_LFB_DEPTH 0x16
#define PARAM_LFB_BASE 0x18
#define PARAM_LFB_SIZE 0x1c
#define PARAM_LFB_LINELENGTH 0x24
#define PARAM_LFB_COLORS 0x26
#define PARAM_VESAPM_SEG 0x2e
#define PARAM_VESAPM_OFF 0x30
#define PARAM_LFB_PAGES 0x32
#define PARAM_VESA_ATTRIB 0x34
#define PARAM_CAPABILITIES 0x36
/*
Define
DO_STORE
according
to
CONFIG_VIDEO_RETAIN
*/
#ifdef CONFIG_VIDEO_RETAIN
#define DO_STORE call store_screen
#else
#define DO_STORE
#endif /* CONFIG_VIDEO_RETAIN */
#
This
is
the
main
entry
point
called
by
setup
.
S
#
%
ds
*
must
*
be
pointing
to
the
bootsector
video
:
pushw
%
ds
#
We
use
different
segments
pushw
%
ds
#
FS
contains
original
DS
popw
%
fs
pushw
%
cs
#
DS
is
equal
to
CS
popw
%
ds
pushw
%
cs
#
ES
is
equal
to
CS
popw
%
es
xorw
%
ax
,
%
ax
movw
%
ax
,
%
gs
#
GS
is
zero
cld
call
basic_detect
#
Basic
adapter
type
testing
(
EGA
/
VGA
/
MDA
/
CGA
)
#ifdef CONFIG_VIDEO_SELECT
movw
%
fs
:
(
0x01fa
),
%
ax
#
User
selected
video
mode
cmpw
$ASK_VGA
,
%
ax
#
Bring
up
the
menu
jz
vid2
call
mode_set
#
Set
the
mode
jc
vid1
leaw
badmdt
,
%
si
#
Invalid
mode
ID
call
prtstr
vid2
:
call
mode_menu
vid1
:
#ifdef CONFIG_VIDEO_RETAIN
call
restore_screen
#
Restore
screen
contents
#endif /* CONFIG_VIDEO_RETAIN */
call
store_edid
#endif /* CONFIG_VIDEO_SELECT */
call
mode_params
#
Store
mode
parameters
popw
%
ds
#
Restore
original
DS
ret
#
Detect
if
we
have
CGA
,
MDA
,
EGA
or
VGA
and
pass
it
to
the
kernel
.
basic_detect
:
movb
$
0
,
%
fs
:
(
PARAM_HAVE_VGA
)
movb
$
0x12
,
%
ah
#
Check
EGA
/
VGA
movb
$
0x10
,
%
bl
int
$
0x10
movw
%
bx
,
%
fs
:
(
PARAM_VIDEO_EGA_BX
)
#
Identifies
EGA
to
the
kernel
cmpb
$
0x10
,
%
bl
#
No
,
it
's a CGA/MDA/HGA card.
je
basret
incb
adapter
movw
$
0x1a00
,
%
ax
#
Check
EGA
or
VGA
?
int
$
0x10
cmpb
$
0x1a
,
%
al
#
1
a
means
VGA
...
jne
basret
#
anything
else
is
EGA
.
incb
%
fs
:
(
PARAM_HAVE_VGA
)
#
We
've detected a VGA
incb
adapter
basret
:
ret
#
Store
the
video
mode
parameters
for
later
usage
by
the
kernel
.
#
This
is
done
by
asking
the
BIOS
except
for
the
rows
/
columns
#
parameters
in
the
default
80
x25
mode
--
these
are
set
directly
,
#
because
some
very
obscure
BIOSes
supply
insane
values
.
mode_params
:
#ifdef CONFIG_VIDEO_SELECT
cmpb
$
0
,
graphic_mode
jnz
mopar_gr
#endif
movb
$
0x03
,
%
ah
#
Read
cursor
position
xorb
%
bh
,
%
bh
int
$
0x10
movw
%
dx
,
%
fs
:
(
PARAM_CURSOR_POS
)
movb
$
0x0f
,
%
ah
#
Read
page
/
mode
/
width
int
$
0x10
movw
%
bx
,
%
fs
:
(
PARAM_VIDEO_PAGE
)
movw
%
ax
,
%
fs
:
(
PARAM_VIDEO_MODE
)
#
Video
mode
and
screen
width
cmpb
$
0x7
,
%
al
#
MDA
/
HGA
=>
segment
differs
jnz
mopar0
movw
$
0xb000
,
video_segment
mopar0
:
movw
%
gs
:
(
0x485
),
%
ax
#
Font
size
movw
%
ax
,
%
fs
:
(
PARAM_FONT_POINTS
)
#
(
valid
only
on
EGA
/
VGA
)
movw
force_size
,
%
ax
#
Forced
size
?
orw
%
ax
,
%
ax
jz
mopar1
movb
%
ah
,
%
fs
:
(
PARAM_VIDEO_COLS
)
movb
%
al
,
%
fs
:
(
PARAM_VIDEO_LINES
)
ret
mopar1
:
movb
$
25
,
%
al
cmpb
$
0
,
adapter
#
If
we
are
on
CGA
/
MDA
/
HGA
,
the
jz
mopar2
#
screen
must
have
25
lines
.
movb
%
gs
:
(
0x484
),
%
al
#
On
EGA
/
VGA
,
use
the
EGA
+
BIOS
incb
%
al
#
location
of
max
lines
.
mopar2
:
movb
%
al
,
%
fs
:
(
PARAM_VIDEO_LINES
)
ret
#ifdef CONFIG_VIDEO_SELECT
#
Fetching
of
VESA
frame
buffer
parameters
mopar_gr
:
leaw
modelist
+
1024
,
%
di
movb
$
0x23
,
%
fs
:
(
PARAM_HAVE_VGA
)
movw
16
(%
di
),
%
ax
movw
%
ax
,
%
fs
:
(
PARAM_LFB_LINELENGTH
)
movw
18
(%
di
),
%
ax
movw
%
ax
,
%
fs
:
(
PARAM_LFB_WIDTH
)
movw
20
(%
di
),
%
ax
movw
%
ax
,
%
fs
:
(
PARAM_LFB_HEIGHT
)
movb
25
(%
di
),
%
al
movb
$
0
,
%
ah
movw
%
ax
,
%
fs
:
(
PARAM_LFB_DEPTH
)
movb
29
(%
di
),
%
al
movb
$
0
,
%
ah
movw
%
ax
,
%
fs
:
(
PARAM_LFB_PAGES
)
movl
40
(%
di
),
%
eax
movl
%
eax
,
%
fs
:
(
PARAM_LFB_BASE
)
movl
31
(%
di
),
%
eax
movl
%
eax
,
%
fs
:
(
PARAM_LFB_COLORS
)
movl
35
(%
di
),
%
eax
movl
%
eax
,
%
fs
:
(
PARAM_LFB_COLORS
+
4
)
movw
0
(%
di
),
%
ax
movw
%
ax
,
%
fs
:
(
PARAM_VESA_ATTRIB
)
#
get
video
mem
size
leaw
modelist
+
1024
,
%
di
movw
$
0x4f00
,
%
ax
int
$
0x10
xorl
%
eax
,
%
eax
movw
18
(%
di
),
%
ax
movl
%
eax
,
%
fs
:
(
PARAM_LFB_SIZE
)
#
store
mode
capabilities
movl
10
(%
di
),
%
eax
movl
%
eax
,
%
fs
:
(
PARAM_CAPABILITIES
)
#
switching
the
DAC
to
8
-
bit
is
for
<=
8
bpp
only
movw
%
fs
:
(
PARAM_LFB_DEPTH
),
%
ax
cmpw
$
8
,
%
ax
jg
dac_done
#
get
DAC
switching
capability
xorl
%
eax
,
%
eax
movb
10
(%
di
),
%
al
testb
$
1
,
%
al
jz
dac_set
#
attempt
to
switch
DAC
to
8
-
bit
movw
$
0x4f08
,
%
ax
movw
$
0x0800
,
%
bx
int
$
0x10
cmpw
$
0x004f
,
%
ax
jne
dac_set
movb
%
bh
,
dac_size
#
store
actual
DAC
size
dac_set
:
#
set
color
size
to
DAC
size
movb
dac_size
,
%
al
movb
%
al
,
%
fs
:
(
PARAM_LFB_COLORS
+
0
)
movb
%
al
,
%
fs
:
(
PARAM_LFB_COLORS
+
2
)
movb
%
al
,
%
fs
:
(
PARAM_LFB_COLORS
+
4
)
movb
%
al
,
%
fs
:
(
PARAM_LFB_COLORS
+
6
)
#
set
color
offsets
to
0
movb
$
0
,
%
fs
:
(
PARAM_LFB_COLORS
+
1
)
movb
$
0
,
%
fs
:
(
PARAM_LFB_COLORS
+
3
)
movb
$
0
,
%
fs
:
(
PARAM_LFB_COLORS
+
5
)
movb
$
0
,
%
fs
:
(
PARAM_LFB_COLORS
+
7
)
dac_done
:
#
get
protected
mode
interface
informations
movw
$
0x4f0a
,
%
ax
xorw
%
bx
,
%
bx
xorw
%
di
,
%
di
int
$
0x10
cmp
$
0x004f
,
%
ax
jnz
no_pm
movw
%
es
,
%
fs
:
(
PARAM_VESAPM_SEG
)
movw
%
di
,
%
fs
:
(
PARAM_VESAPM_OFF
)
no_pm
:
ret
#
The
video
mode
menu
mode_menu
:
leaw
keymsg
,
%
si
#
"Return/Space/Timeout"
message
call
prtstr
call
flush
nokey
:
call
getkt
cmpb
$
0x0d
,
%
al
#
ENTER
?
je
listm
#
yes
-
manual
mode
selection
cmpb
$
0x20
,
%
al
#
SPACE
?
je
defmd1
#
no
-
repeat
call
beep
jmp
nokey
defmd1
:
ret
#
No
mode
chosen
?
Default
80
x25
listm
:
call
mode_table
#
List
mode
table
listm0
:
leaw
name_bann
,
%
si
#
Print
adapter
name
call
prtstr
movw
card_name
,
%
si
orw
%
si
,
%
si
jnz
an2
movb
adapter
,
%
al
leaw
old_name
,
%
si
orb
%
al
,
%
al
jz
an1
leaw
ega_name
,
%
si
decb
%
al
jz
an1
leaw
vga_name
,
%
si
jmp
an1
an2
:
call
prtstr
leaw
svga_name
,
%
si
an1
:
call
prtstr
leaw
listhdr
,
%
si
#
Table
header
call
prtstr
movb
$
0x30
,
%
dl
#
DL
holds
mode
number
leaw
modelist
,
%
si
lm1
:
cmpw
$ASK_VGA
,
(%
si
)
#
End
?
jz
lm2
movb
%
dl
,
%
al
#
Menu
selection
number
call
prtchr
call
prtsp2
lodsw
call
prthw
#
Mode
ID
call
prtsp2
movb
0x1
(%
si
),
%
al
call
prtdec
#
Rows
movb
$
0x78
,
%
al
#
the
letter
'x'
call
prtchr
lodsw
call
prtdec
#
Columns
movb
$
0x0d
,
%
al
#
New
line
call
prtchr
movb
$
0x0a
,
%
al
call
prtchr
incb
%
dl
#
Next
character
cmpb
$
0x3a
,
%
dl
jnz
lm1
movb
$
0x61
,
%
dl
jmp
lm1
lm2
:
leaw
prompt
,
%
si
#
Mode
prompt
call
prtstr
leaw
edit_buf
,
%
di
#
Editor
buffer
lm3
:
call
getkey
cmpb
$
0x0d
,
%
al
#
Enter
?
jz
lment
cmpb
$
0x08
,
%
al
#
Backspace
?
jz
lmbs
cmpb
$
0x20
,
%
al
#
Printable
?
jc
lm3
cmpw
$edit_buf
+
4
,
%
di
#
Enough
space
?
jz
lm3
stosb
call
prtchr
jmp
lm3
lmbs
:
cmpw
$edit_buf
,
%
di
#
Backspace
jz
lm3
decw
%
di
movb
$
0x08
,
%
al
call
prtchr
call
prtspc
movb
$
0x08
,
%
al
call
prtchr
jmp
lm3
lment
:
movb
$
0
,
(%
di
)
leaw
crlft
,
%
si
call
prtstr
leaw
edit_buf
,
%
si
cmpb
$
0
,
(%
si
)
#
Empty
string
=
default
mode
jz
lmdef
cmpb
$
0
,
1
(%
si
)
#
One
character
=
menu
selection
jz
mnusel
cmpw
$
0x6373
,
(%
si
)
#
"scan"
=>
mode
scanning
jnz
lmhx
cmpw
$
0x6e61
,
2
(%
si
)
jz
lmscan
lmhx
:
xorw
%
bx
,
%
bx
#
Else
=>
mode
ID
in
hex
lmhex
:
lodsb
orb
%
al
,
%
al
jz
lmuse1
subb
$
0x30
,
%
al
jc
lmbad
cmpb
$
10
,
%
al
jc
lmhx1
subb
$
7
,
%
al
andb
$
0xdf
,
%
al
cmpb
$
10
,
%
al
jc
lmbad
cmpb
$
16
,
%
al
jnc
lmbad
lmhx1
:
shlw
$
4
,
%
bx
orb
%
al
,
%
bl
jmp
lmhex
lmuse1
:
movw
%
bx
,
%
ax
jmp
lmuse
mnusel
:
lodsb
#
Menu
selection
xorb
%
ah
,
%
ah
subb
$
0x30
,
%
al
jc
lmbad
cmpb
$
10
,
%
al
jc
lmuse
cmpb
$
0x61
-
0x30
,
%
al
jc
lmbad
subb
$
0x61
-
0x30
-
10
,
%
al
cmpb
$
36
,
%
al
jnc
lmbad
lmuse
:
call
mode_set
jc
lmdef
lmbad
:
leaw
unknt
,
%
si
call
prtstr
jmp
lm2
lmscan
:
cmpb
$
0
,
adapter
#
Scanning
only
on
EGA
/
VGA
jz
lmbad
movw
$
0
,
mt_end
#
Scanning
of
modes
is
movb
$
1
,
scanning
#
done
as
new
autodetection
.
call
mode_table
jmp
listm0
lmdef
:
ret
#
Additional
parts
of
mode_set
...
(
relative
jumps
,
you
know
)
setv7
:
#
Video7
extended
modes
DO_STORE
subb
$VIDEO_FIRST_V7
>>
8
,
%
bh
movw
$
0x6f05
,
%
ax
int
$
0x10
stc
ret
_setrec
:
jmp
setrec
#
Ugly
...
_set_80x25
:
jmp
set_80x25
#
Aliases
for
backward
compatibility
.
setalias
:
movw
$VIDEO_80x25
,
%
ax
incw
%
bx
jz
mode_set
movb
$VIDEO_8POINT
-
VIDEO_FIRST_SPECIAL
,
%
al
incw
%
bx
jnz
setbad
#
Fall
-
through
!
#
Setting
of
user
mode
(
AX
=
mode
ID
)
=>
CF
=
success
mode_set
:
movw
%
ax
,
%
fs
:
(
0x01fa
)
#
Store
mode
for
use
in
acpi_wakeup
.
S
movw
%
ax
,
%
bx
cmpb
$
0xff
,
%
ah
jz
setalias
testb
$VIDEO_RECALC
>>
8
,
%
ah
jnz
_setrec
cmpb
$VIDEO_FIRST_RESOLUTION
>>
8
,
%
ah
jnc
setres
cmpb
$VIDEO_FIRST_SPECIAL
>>
8
,
%
ah
jz
setspc
cmpb
$VIDEO_FIRST_V7
>>
8
,
%
ah
jz
setv7
cmpb
$VIDEO_FIRST_VESA
>>
8
,
%
ah
jnc
check_vesa
orb
%
ah
,
%
ah
jz
setmenu
decb
%
ah
jz
setbios
setbad
:
clc
movb
$
0
,
do_restore
#
The
screen
needn
't be restored
ret
setvesa
:
DO_STORE
subb
$VIDEO_FIRST_VESA
>>
8
,
%
bh
movw
$
0x4f02
,
%
ax
#
VESA
BIOS
mode
set
call
int
$
0x10
cmpw
$
0x004f
,
%
ax
#
AL
=
4
f
if
implemented
jnz
setbad
#
AH
=
0
if
OK
stc
ret
setbios
:
DO_STORE
int
$
0x10
#
Standard
BIOS
mode
set
call
pushw
%
bx
movb
$
0x0f
,
%
ah
#
Check
if
really
set
int
$
0x10
popw
%
bx
cmpb
%
bl
,
%
al
jnz
setbad
stc
ret
setspc
:
xorb
%
bh
,
%
bh
#
Set
special
mode
cmpb
$VIDEO_LAST_SPECIAL
-
VIDEO_FIRST_SPECIAL
,
%
bl
jnc
setbad
addw
%
bx
,
%
bx
jmp
*
spec_inits
(%
bx
)
setmenu
:
orb
%
al
,
%
al
#
80
x25
is
an
exception
jz
_set_80x25
pushw
%
bx
#
Set
mode
chosen
from
menu
call
mode_table
#
Build
the
mode
table
popw
%
ax
shlw
$
2
,
%
ax
addw
%
ax
,
%
si
cmpw
%
di
,
%
si
jnc
setbad
movw
(%
si
),
%
ax
#
Fetch
mode
ID
_m_s
:
jmp
mode_set
setres
:
pushw
%
bx
#
Set
mode
chosen
by
resolution
call
mode_table
popw
%
bx
xchgb
%
bl
,
%
bh
setr1
:
lodsw
cmpw
$ASK_VGA
,
%
ax
#
End
of
the
list
?
jz
setbad
lodsw
cmpw
%
bx
,
%
ax
jnz
setr1
movw
-
4
(%
si
),
%
ax
#
Fetch
mode
ID
jmp
_m_s
check_vesa
:
#ifdef CONFIG_FIRMWARE_EDID
leaw
modelist
+
1024
,
%
di
movw
$
0x4f00
,
%
ax
int
$
0x10
cmpw
$
0x004f
,
%
ax
jnz
setbad
movw
4
(%
di
),
%
ax
movw
%
ax
,
vbe_version
#endif
leaw
modelist
+
1024
,
%
di
subb
$VIDEO_FIRST_VESA
>>
8
,
%
bh
movw
%
bx
,
%
cx
#
Get
mode
information
structure
movw
$
0x4f01
,
%
ax
int
$
0x10
addb
$VIDEO_FIRST_VESA
>>
8
,
%
bh
cmpw
$
0x004f
,
%
ax
jnz
setbad
movb
(%
di
),
%
al
#
Check
capabilities
.
andb
$
0x19
,
%
al
cmpb
$
0x09
,
%
al
jz
setvesa
#
This
is
a
text
mode
movb
(%
di
),
%
al
#
Check
capabilities
.
andb
$
0x99
,
%
al
cmpb
$
0x99
,
%
al
jnz
_setbad
#
Doh
!
No
linear
frame
buffer
.
subb
$VIDEO_FIRST_VESA
>>
8
,
%
bh
orw
$
0x4000
,
%
bx
#
Use
linear
frame
buffer
movw
$
0x4f02
,
%
ax
#
VESA
BIOS
mode
set
call
int
$
0x10
cmpw
$
0x004f
,
%
ax
#
AL
=
4
f
if
implemented
jnz
_setbad
#
AH
=
0
if
OK
movb
$
1
,
graphic_mode
#
flag
graphic
mode
movb
$
0
,
do_restore
#
no
screen
restore
stc
ret
_setbad
:
jmp
setbad
#
Ugly
...
#
Recalculate
vertical
display
end
registers
--
this
fixes
various
#
inconsistencies
of
extended
modes
on
many
adapters
.
Called
when
#
the
VIDEO_RECALC
flag
is
set
in
the
mode
ID
.
setrec
:
subb
$VIDEO_RECALC
>>
8
,
%
ah
#
Set
the
base
mode
call
mode_set
jnc
rct3
movw
%
gs
:
(
0x485
),
%
ax
#
Font
size
in
pixels
movb
%
gs
:
(
0x484
),
%
bl
#
Number
of
rows
incb
%
bl
mulb
%
bl
#
Number
of
visible
decw
%
ax
#
scan
lines
-
1
movw
$
0x3d4
,
%
dx
movw
%
ax
,
%
bx
movb
$
0x12
,
%
al
#
Lower
8
bits
movb
%
bl
,
%
ah
outw
%
ax
,
%
dx
movb
$
0x07
,
%
al
#
Bits
8
and
9
in
the
overflow
register
call
inidx
xchgb
%
al
,
%
ah
andb
$
0xbd
,
%
ah
shrb
%
bh
jnc
rct1
orb
$
0x02
,
%
ah
rct1
:
shrb
%
bh
jnc
rct2
orb
$
0x40
,
%
ah
rct2
:
movb
$
0x07
,
%
al
outw
%
ax
,
%
dx
stc
rct3
:
ret
#
Table
of
routines
for
setting
of
the
special
modes
.
spec_inits
:
.
word
set_80x25
.
word
set_8pixel
.
word
set_80x43
.
word
set_80x28
.
word
set_current
.
word
set_80x30
.
word
set_80x34
.
word
set_80x60
.
word
set_gfx
#
Set
the
80
x25
mode
.
If
already
set
,
do
nothing
.
set_80x25
:
movw
$
0x5019
,
force_size
#
Override
possibly
broken
BIOS
use_80x25
:
#ifdef CONFIG_VIDEO_400_HACK
movw
$
0x1202
,
%
ax
#
Force
400
scan
lines
movb
$
0x30
,
%
bl
int
$
0x10
#else
movb
$
0x0f
,
%
ah
#
Get
current
mode
ID
int
$
0x10
cmpw
$
0x5007
,
%
ax
#
Mode
7
(
80
x25
mono
)
is
the
only
one
available
jz
st80
#
on
CGA
/
MDA
/
HGA
and
is
also
available
on
EGAM
cmpw
$
0x5003
,
%
ax
#
Unknown
mode
,
force
80
x25
color
jnz
force3
st80
:
cmpb
$
0
,
adapter
#
CGA
/
MDA
/
HGA
=>
mode
3
/
7
is
always
80
x25
jz
set80
movb
%
gs
:
(
0x0484
),
%
al
#
This
is
EGA
+
--
beware
of
80
x50
etc
.
orb
%
al
,
%
al
#
Some
buggy
BIOS
'es set 0 rows
jz
set80
cmpb
$
24
,
%
al
#
It
's hopefully correct
jz
set80
#endif /* CONFIG_VIDEO_400_HACK */
force3
:
DO_STORE
movw
$
0x0003
,
%
ax
#
Forced
set
int
$
0x10
set80
:
stc
ret
#
Set
the
80
x50
/
80
x43
8
-
pixel
mode
.
Simple
BIOS
calls
.
set_8pixel
:
DO_STORE
call
use_80x25
#
The
base
is
80
x25
set_8pt
:
movw
$
0x1112
,
%
ax
#
Use
8
x8
font
xorb
%
bl
,
%
bl
int
$
0x10
movw
$
0x1200
,
%
ax
#
Use
alternate
print
screen
movb
$
0x20
,
%
bl
int
$
0x10
movw
$
0x1201
,
%
ax
#
Turn
off
cursor
emulation
movb
$
0x34
,
%
bl
int
$
0x10
movb
$
0x01
,
%
ah
#
Define
cursor
scan
lines
6
-
7
movw
$
0x0607
,
%
cx
int
$
0x10
set_current
:
stc
ret
#
Set
the
80
x28
mode
.
This
mode
works
on
all
VGA
's, because it'
s
a
standard
#
80
x25
mode
with
14
-
point
fonts
instead
of
16
-
point
.
set_80x28
:
DO_STORE
call
use_80x25
#
The
base
is
80
x25
set14
:
movw
$
0x1111
,
%
ax
#
Use
9
x14
font
xorb
%
bl
,
%
bl
int
$
0x10
movb
$
0x01
,
%
ah
#
Define
cursor
scan
lines
11
-
12
movw
$
0x0b0c
,
%
cx
int
$
0x10
stc
ret
#
Set
the
80
x43
mode
.
This
mode
is
works
on
all
VGA
's.
#
It
'
s
a
350
-
scanline
mode
with
8
-
pixel
font
.
set_80x43
:
DO_STORE
movw
$
0x1201
,
%
ax
#
Set
350
scans
movb
$
0x30
,
%
bl
int
$
0x10
movw
$
0x0003
,
%
ax
#
Reset
video
mode
int
$
0x10
jmp
set_8pt
#
Use
8
-
pixel
font
#
Set
the
80
x30
mode
(
all
VGA
's). 480 scanlines, 16-pixel font.
set_80x30
:
call
use_80x25
#
Start
with
real
80
x25
DO_STORE
movw
$
0x3cc
,
%
dx
#
Get
CRTC
port
inb
%
dx
,
%
al
movb
$
0xd4
,
%
dl
rorb
%
al
#
Mono
or
color
?
jc
set48a
movb
$
0xb4
,
%
dl
set48a
:
movw
$
0x0c11
,
%
ax
#
Vertical
sync
end
(
also
unlocks
CR0
-
7
)
call
outidx
movw
$
0x0b06
,
%
ax
#
Vertical
total
call
outidx
movw
$
0x3e07
,
%
ax
#
(
Vertical
)
overflow
call
outidx
movw
$
0xea10
,
%
ax
#
Vertical
sync
start
call
outidx
movw
$
0xdf12
,
%
ax
#
Vertical
display
end
call
outidx
movw
$
0xe715
,
%
ax
#
Vertical
blank
start
call
outidx
movw
$
0x0416
,
%
ax
#
Vertical
blank
end
call
outidx
pushw
%
dx
movb
$
0xcc
,
%
dl
#
Misc
output
register
(
read
)
inb
%
dx
,
%
al
movb
$
0xc2
,
%
dl
#
(
write
)
andb
$
0x0d
,
%
al
#
Preserve
clock
select
bits
and
color
bit
orb
$
0xe2
,
%
al
#
Set
correct
sync
polarity
outb
%
al
,
%
dx
popw
%
dx
movw
$
0x501e
,
force_size
stc
#
That
's all.
ret
#
Set
the
80
x34
mode
(
all
VGA
's). 480 scans, 14-pixel font.
set_80x34
:
call
set_80x30
#
Set
480
scans
call
set14
#
And
14
-
pt
font
movw
$
0xdb12
,
%
ax
#
VGA
vertical
display
end
movw
$
0x5022
,
force_size
setvde
:
call
outidx
stc
ret
#
Set
the
80
x60
mode
(
all
VGA
's). 480 scans, 8-pixel font.
set_80x60
:
call
set_80x30
#
Set
480
scans
call
set_8pt
#
And
8
-
pt
font
movw
$
0xdf12
,
%
ax
#
VGA
vertical
display
end
movw
$
0x503c
,
force_size
jmp
setvde
#
Special
hack
for
ThinkPad
graphics
set_gfx
:
#ifdef CONFIG_VIDEO_GFX_HACK
movw
$VIDEO_GFX_BIOS_AX
,
%
ax
movw
$VIDEO_GFX_BIOS_BX
,
%
bx
int
$
0x10
movw
$VIDEO_GFX_DUMMY_RESOLUTION
,
force_size
stc
#endif
ret
#ifdef CONFIG_VIDEO_RETAIN
#
Store
screen
contents
to
temporary
buffer
.
store_screen
:
cmpb
$
0
,
do_restore
#
Already
stored
?
jnz
stsr
testb
$CAN_USE_HEAP
,
loadflags
#
Have
we
space
for
storing
?
jz
stsr
pushw
%
ax
pushw
%
bx
pushw
force_size
#
Don
't force specific size
movw
$
0
,
force_size
call
mode_params
#
Obtain
params
of
current
mode
popw
force_size
movb
%
fs
:
(
PARAM_VIDEO_LINES
),
%
ah
movb
%
fs
:
(
PARAM_VIDEO_COLS
),
%
al
movw
%
ax
,
%
bx
#
BX
=
dimensions
mulb
%
ah
movw
%
ax
,
%
cx
#
CX
=
number
of
characters
addw
%
ax
,
%
ax
#
Calculate
image
size
addw
$modelist
+
1024
+
4
,
%
ax
cmpw
heap_end_ptr
,
%
ax
jnc
sts1
#
Unfortunately
,
out
of
memory
movw
%
fs
:
(
PARAM_CURSOR_POS
),
%
ax
#
Store
mode
params
leaw
modelist
+
1024
,
%
di
stosw
movw
%
bx
,
%
ax
stosw
pushw
%
ds
#
Store
the
screen
movw
video_segment
,
%
ds
xorw
%
si
,
%
si
rep
movsw
popw
%
ds
incb
do_restore
#
Screen
will
be
restored
later
sts1
:
popw
%
bx
popw
%
ax
stsr
:
ret
#
Restore
screen
contents
from
temporary
buffer
.
restore_screen
:
cmpb
$
0
,
do_restore
#
Has
the
screen
been
stored
?
jz
res1
call
mode_params
#
Get
parameters
of
current
mode
movb
%
fs
:
(
PARAM_VIDEO_LINES
),
%
cl
movb
%
fs
:
(
PARAM_VIDEO_COLS
),
%
ch
leaw
modelist
+
1024
,
%
si
#
Screen
buffer
lodsw
#
Set
cursor
position
movw
%
ax
,
%
dx
cmpb
%
cl
,
%
dh
jc
res2
movb
%
cl
,
%
dh
decb
%
dh
res2
:
cmpb
%
ch
,
%
dl
jc
res3
movb
%
ch
,
%
dl
decb
%
dl
res3
:
movb
$
0x02
,
%
ah
movb
$
0x00
,
%
bh
int
$
0x10
lodsw
#
Display
size
movb
%
ah
,
%
dl
#
DL
=
number
of
lines
movb
$
0
,
%
ah
#
BX
=
phys
.
length
of
orig
.
line
movw
%
ax
,
%
bx
cmpb
%
cl
,
%
dl
#
Too
many
?
jc
res4
pushw
%
ax
movb
%
dl
,
%
al
subb
%
cl
,
%
al
mulb
%
bl
addw
%
ax
,
%
si
addw
%
ax
,
%
si
popw
%
ax
movb
%
cl
,
%
dl
res4
:
cmpb
%
ch
,
%
al
#
Too
wide
?
jc
res5
movb
%
ch
,
%
al
#
AX
=
width
of
src
.
line
res5
:
movb
$
0
,
%
cl
xchgb
%
ch
,
%
cl
movw
%
cx
,
%
bp
#
BP
=
width
of
dest
.
line
pushw
%
es
movw
video_segment
,
%
es
xorw
%
di
,
%
di
#
Move
the
data
addw
%
bx
,
%
bx
#
Convert
BX
and
BP
to
_bytes_
addw
%
bp
,
%
bp
res6
:
pushw
%
si
pushw
%
di
movw
%
ax
,
%
cx
rep
movsw
popw
%
di
popw
%
si
addw
%
bp
,
%
di
addw
%
bx
,
%
si
decb
%
dl
jnz
res6
popw
%
es
#
Done
res1
:
ret
#endif /* CONFIG_VIDEO_RETAIN */
#
Write
to
indexed
VGA
register
(
AL
=
index
,
AH
=
data
,
DX
=
index
reg
.
port
)
outidx
:
outb
%
al
,
%
dx
pushw
%
ax
movb
%
ah
,
%
al
incw
%
dx
outb
%
al
,
%
dx
decw
%
dx
popw
%
ax
ret
#
Build
the
table
of
video
modes
(
stored
after
the
setup
.
S
code
at
the
#
`
modelist
'
label
.
Each
video
mode
record
looks
like
:
#
.
word
MODE
-
ID
(
our
special
mode
ID
(
see
above
))
#
.
byte
rows
(
number
of
rows
)
#
.
byte
columns
(
number
of
columns
)
#
Returns
address
of
the
end
of
the
table
in
DI
,
the
end
is
marked
#
with
a
ASK_VGA
ID
.
mode_table
:
movw
mt_end
,
%
di
#
Already
filled
?
orw
%
di
,
%
di
jnz
mtab1x
leaw
modelist
,
%
di
#
Store
standard
modes
:
movl
$VIDEO_80x25
+
0x50190000
,
%
eax
#
The
80
x25
mode
(
ALL
)
stosl
movb
adapter
,
%
al
#
CGA
/
MDA
/
HGA
--
no
more
modes
orb
%
al
,
%
al
jz
mtabe
decb
%
al
jnz
mtabv
movl
$VIDEO_8POINT
+
0x502b0000
,
%
eax
#
The
80
x43
EGA
mode
stosl
jmp
mtabe
mtab1x
:
jmp
mtab1
mtabv
:
leaw
vga_modes
,
%
si
#
All
modes
for
std
VGA
movw
$vga_modes_end
-
vga_modes
,
%
cx
rep
#
I
'm unable to use movsw as I don'
t
know
how
to
store
a
half
movsb
#
of
the
expression
above
to
cx
without
using
explicit
shr
.
cmpb
$
0
,
scanning
#
Mode
scan
requested
?
jz
mscan1
call
mode_scan
mscan1
:
#ifdef CONFIG_VIDEO_LOCAL
call
local_modes
#endif /* CONFIG_VIDEO_LOCAL */
#ifdef CONFIG_VIDEO_VESA
call
vesa_modes
#
Detect
VESA
VGA
modes
#endif /* CONFIG_VIDEO_VESA */
#ifdef CONFIG_VIDEO_SVGA
cmpb
$
0
,
scanning
#
Bypass
when
scanning
jnz
mscan2
call
svga_modes
#
Detect
SVGA
cards
&
modes
mscan2
:
#endif /* CONFIG_VIDEO_SVGA */
mtabe
:
#ifdef CONFIG_VIDEO_COMPACT
leaw
modelist
,
%
si
movw
%
di
,
%
dx
movw
%
si
,
%
di
cmt1
:
cmpw
%
dx
,
%
si
#
Scan
all
modes
jz
cmt2
leaw
modelist
,
%
bx
#
Find
in
previous
entries
movw
2
(%
si
),
%
cx
cmt3
:
cmpw
%
bx
,
%
si
jz
cmt4
cmpw
2
(%
bx
),
%
cx
#
Found
=>
don
't copy this entry
jz
cmt5
addw
$
4
,
%
bx
jmp
cmt3
cmt4
:
movsl
#
Copy
entry
jmp
cmt1
cmt5
:
addw
$
4
,
%
si
#
Skip
entry
jmp
cmt1
cmt2
:
#endif /* CONFIG_VIDEO_COMPACT */
movw
$ASK_VGA
,
(%
di
)
#
End
marker
movw
%
di
,
mt_end
mtab1
:
leaw
modelist
,
%
si
#
SI
=
mode
list
,
DI
=
list
end
ret0
:
ret
#
Modes
usable
on
all
standard
VGAs
vga_modes
:
.
word
VIDEO_8POINT
.
word
0x5032
#
80
x50
.
word
VIDEO_80x43
.
word
0x502b
#
80
x43
.
word
VIDEO_80x28
.
word
0x501c
#
80
x28
.
word
VIDEO_80x30
.
word
0x501e
#
80
x30
.
word
VIDEO_80x34
.
word
0x5022
#
80
x34
.
word
VIDEO_80x60
.
word
0x503c
#
80
x60
#ifdef CONFIG_VIDEO_GFX_HACK
.
word
VIDEO_GFX_HACK
.
word
VIDEO_GFX_DUMMY_RESOLUTION
#endif
vga_modes_end
:
#
Detect
VESA
modes
.
#ifdef CONFIG_VIDEO_VESA
vesa_modes
:
cmpb
$
2
,
adapter
#
VGA
only
jnz
ret0
movw
%
di
,
%
bp
#
BP
=
original
mode
table
end
addw
$
0x200
,
%
di
#
Buffer
space
movw
$
0x4f00
,
%
ax
#
VESA
Get
card
info
call
int
$
0x10
movw
%
bp
,
%
di
cmpw
$
0x004f
,
%
ax
#
Successful
?
jnz
ret0
cmpw
$
0x4556
,
0x200
(%
di
)
jnz
ret0
cmpw
$
0x4153
,
0x202
(%
di
)
jnz
ret0
movw
$vesa_name
,
card_name
#
Set
name
to
"VESA VGA"
pushw
%
gs
lgsw
0x20e
(%
di
),
%
si
#
GS
:
SI
=
mode
list
movw
$
128
,
%
cx
#
Iteration
limit
vesa1
:
#
gas
version
2
.9.1
,
using
BFD
version
2
.9.1.0.23
buggers
the
next
inst
.
#
XXX
:
lodsw
%
gs
:
(%
si
),
%
ax
#
Get
next
mode
in
the
list
gs
; lodsw
cmpw
$
0xffff
,
%
ax
#
End
of
the
table
?
jz
vesar
cmpw
$
0x0080
,
%
ax
#
Check
validity
of
mode
ID
jc
vesa2
orb
%
ah
,
%
ah
#
Valid
IDs
:
0x0000
-
0x007f
/
0x0100
-
0x07ff
jz
vesan
#
Certain
BIOSes
report
0x80
-
0xff
!
cmpw
$
0x0800
,
%
ax
jnc
vesae
vesa2
:
pushw
%
cx
movw
%
ax
,
%
cx
#
Get
mode
information
structure
movw
$
0x4f01
,
%
ax
int
$
0x10
movw
%
cx
,
%
bx
#
BX
=
mode
number
addb
$VIDEO_FIRST_VESA
>>
8
,
%
bh
popw
%
cx
cmpw
$
0x004f
,
%
ax
jnz
vesan
#
Don
't report errors (buggy BIOSES)
movb
(%
di
),
%
al
#
Check
capabilities
.
We
require
andb
$
0x19
,
%
al
#
a
color
text
mode
.
cmpb
$
0x09
,
%
al
jnz
vesan
cmpw
$
0xb800
,
8
(%
di
)
#
Standard
video
memory
address
required
jnz
vesan
testb
$
2
,
(%
di
)
#
Mode
characteristics
supplied
?
movw
%
bx
,
(%
di
)
#
Store
mode
number
jz
vesa3
xorw
%
dx
,
%
dx
movw
0x12
(%
di
),
%
bx
#
Width
orb
%
bh
,
%
bh
jnz
vesan
movb
%
bl
,
0x3
(%
di
)
movw
0x14
(%
di
),
%
ax
#
Height
orb
%
ah
,
%
ah
jnz
vesan
movb
%
al
,
2
(%
di
)
mulb
%
bl
cmpw
$
8193
,
%
ax
#
Small
enough
for
Linux
console
driver
?
jnc
vesan
jmp
vesaok
vesa3
:
subw
$
0x8108
,
%
bx
#
This
mode
has
no
detailed
info
specified
,
jc
vesan
#
so
it
must
be
a
standard
VESA
mode
.
cmpw
$
5
,
%
bx
jnc
vesan
movw
vesa_text_mode_table
(%
bx
),
%
ax
movw
%
ax
,
2
(%
di
)
vesaok
:
addw
$
4
,
%
di
#
The
mode
is
valid
.
Store
it
.
vesan
:
loop
vesa1
#
Next
mode
.
Limit
exceeded
=>
error
vesae
:
leaw
vesaer
,
%
si
call
prtstr
movw
%
bp
,
%
di
#
Discard
already
found
modes
.
vesar
:
popw
%
gs
ret
#
Dimensions
of
standard
VESA
text
modes
vesa_text_mode_table
:
.
byte
60
,
80
#
0108
.
byte
25
,
132
#
0109
.
byte
43
,
132
#
010
A
.
byte
50
,
132
#
010
B
.
byte
60
,
132
#
010
C
#endif /* CONFIG_VIDEO_VESA */
#
Scan
for
video
modes
.
A
bit
dirty
,
but
should
work
.
mode_scan
:
movw
$
0x0100
,
%
cx
#
Start
with
mode
0
scm1
:
movb
$
0
,
%
ah
#
Test
the
mode
movb
%
cl
,
%
al
int
$
0x10
movb
$
0x0f
,
%
ah
int
$
0x10
cmpb
%
cl
,
%
al
jnz
scm2
#
Mode
not
set
movw
$
0x3c0
,
%
dx
#
Test
if
it
's a text mode
movb
$
0x10
,
%
al
#
Mode
bits
call
inidx
andb
$
0x03
,
%
al
jnz
scm2
movb
$
0xce
,
%
dl
#
Another
set
of
mode
bits
movb
$
0x06
,
%
al
call
inidx
shrb
%
al
jc
scm2
movb
$
0xd4
,
%
dl
#
Cursor
location
movb
$
0x0f
,
%
al
call
inidx
orb
%
al
,
%
al
jnz
scm2
movw
%
cx
,
%
ax
#
Ok
,
store
the
mode
stosw
movb
%
gs
:
(
0x484
),
%
al
#
Number
of
rows
incb
%
al
stosb
movw
%
gs
:
(
0x44a
),
%
ax
#
Number
of
columns
stosb
scm2
:
incb
%
cl
jns
scm1
movw
$
0x0003
,
%
ax
#
Return
back
to
mode
3
int
$
0x10
ret
tstidx
:
outw
%
ax
,
%
dx
#
OUT
DX
,
AX
and
inidx
inidx
:
outb
%
al
,
%
dx
#
Read
from
indexed
VGA
register
incw
%
dx
#
AL
=
index
,
DX
=
index
reg
port
->
AL
=
data
inb
%
dx
,
%
al
decw
%
dx
ret
#
Try
to
detect
type
of
SVGA
card
and
supply
(
usually
approximate
)
video
#
mode
table
for
it
.
#ifdef CONFIG_VIDEO_SVGA
svga_modes
:
leaw
svga_table
,
%
si
#
Test
all
known
SVGA
adapters
dosvga
:
lodsw
movw
%
ax
,
%
bp
#
Default
mode
table
orw
%
ax
,
%
ax
jz
didsv1
lodsw
#
Pointer
to
test
routine
pushw
%
si
pushw
%
di
pushw
%
es
movw
$
0xc000
,
%
bx
movw
%
bx
,
%
es
call
*%
ax
#
Call
test
routine
popw
%
es
popw
%
di
popw
%
si
orw
%
bp
,
%
bp
jz
dosvga
movw
%
bp
,
%
si
#
Found
,
copy
the
modes
movb
svga_prefix
,
%
ah
cpsvga
:
lodsb
orb
%
al
,
%
al
jz
didsv
stosw
movsw
jmp
cpsvga
didsv
:
movw
%
si
,
card_name
#
Store
pointer
to
card
name
didsv1
:
ret
#
Table
of
all
known
SVGA
cards
.
For
each
card
,
we
store
a
pointer
to
#
a
table
of
video
modes
supported
by
the
card
and
a
pointer
to
a
routine
#
used
for
testing
of
presence
of
the
card
.
The
video
mode
table
is
always
#
followed
by
the
name
of
the
card
or
the
chipset
.
svga_table
:
.
word
ati_md
,
ati_test
.
word
oak_md
,
oak_test
.
word
paradise_md
,
paradise_test
.
word
realtek_md
,
realtek_test
.
word
s3_md
,
s3_test
.
word
chips_md
,
chips_test
.
word
video7_md
,
video7_test
.
word
cirrus5_md
,
cirrus5_test
.
word
cirrus6_md
,
cirrus6_test
.
word
cirrus1_md
,
cirrus1_test
.
word
ahead_md
,
ahead_test
.
word
everex_md
,
everex_test
.
word
genoa_md
,
genoa_test
.
word
trident_md
,
trident_test
.
word
tseng_md
,
tseng_test
.
word
0
#
Test
routines
and
mode
tables
:
#
S3
-
The
test
algorithm
was
taken
from
the
SuperProbe
package
#
for
XFree86
1
.2.1.
Report
bugs
to
Christoph
.
Niemann
@
linux
.
org
s3_test
:
movw
$
0x0f35
,
%
cx
#
we
store
some
constants
in
cl
/
ch
movw
$
0x03d4
,
%
dx
movb
$
0x38
,
%
al
call
inidx
movb
%
al
,
%
bh
#
store
current
CRT
-
register
0x38
movw
$
0x0038
,
%
ax
call
outidx
#
disable
writing
to
special
regs
movb
%
cl
,
%
al
#
check
whether
we
can
write
special
reg
0x35
call
inidx
movb
%
al
,
%
bl
#
save
the
current
value
of
CRT
reg
0x35
andb
$
0xf0
,
%
al
#
clear
bits
0
-
3
movb
%
al
,
%
ah
movb
%
cl
,
%
al
#
and
write
it
to
CRT
reg
0x35
call
outidx
call
inidx
#
now
read
it
back
andb
%
ch
,
%
al
#
clear
the
upper
4
bits
jz
s3_2
#
the
first
test
failed
.
But
we
have
a
movb
%
bl
,
%
ah
#
second
chance
movb
%
cl
,
%
al
call
outidx
jmp
s3_1
#
do
the
other
tests
s3_2
:
movw
%
cx
,
%
ax
#
load
ah
with
0xf
and
al
with
0x35
orb
%
bl
,
%
ah
#
set
the
upper
4
bits
of
ah
with
the
orig
value
call
outidx
#
write
...
call
inidx
#
...
and
reread
andb
%
cl
,
%
al
#
turn
off
the
upper
4
bits
pushw
%
ax
movb
%
bl
,
%
ah
#
restore
old
value
in
register
0x35
movb
%
cl
,
%
al
call
outidx
popw
%
ax
cmpb
%
ch
,
%
al
#
setting
lower
4
bits
was
successful
=>
bad
je
no_s3
#
writing
is
allowed
=>
this
is
not
an
S3
s3_1
:
movw
$
0x4838
,
%
ax
#
allow
writing
to
special
regs
by
putting
call
outidx
#
magic
number
into
CRT
-
register
0x38
movb
%
cl
,
%
al
#
check
whether
we
can
write
special
reg
0x35
call
inidx
movb
%
al
,
%
bl
andb
$
0xf0
,
%
al
movb
%
al
,
%
ah
movb
%
cl
,
%
al
call
outidx
call
inidx
andb
%
ch
,
%
al
jnz
no_s3
#
no
,
we
can
't write => no S3
movw
%
cx
,
%
ax
orb
%
bl
,
%
ah
call
outidx
call
inidx
andb
%
ch
,
%
al
pushw
%
ax
movb
%
bl
,
%
ah
#
restore
old
value
in
register
0x35
movb
%
cl
,
%
al
call
outidx
popw
%
ax
cmpb
%
ch
,
%
al
jne
no_s31
#
writing
not
possible
=>
no
S3
movb
$
0x30
,
%
al
call
inidx
#
now
get
the
S3
id
...
leaw
idS3
,
%
di
movw
$
0x10
,
%
cx
repne
scasb
je
no_s31
movb
%
bh
,
%
ah
movb
$
0x38
,
%
al
jmp
s3rest
no_s3
:
movb
$
0x35
,
%
al
#
restore
CRT
register
0x35
movb
%
bl
,
%
ah
call
outidx
no_s31
:
xorw
%
bp
,
%
bp
#
Detection
failed
s3rest
:
movb
%
bh
,
%
ah
movb
$
0x38
,
%
al
#
restore
old
value
of
CRT
register
0x38
jmp
outidx
idS3
:
.
byte
0x81
,
0x82
,
0x90
,
0x91
,
0x92
,
0x93
,
0x94
,
0x95
.
byte
0xa0
,
0xa1
,
0xa2
,
0xa3
,
0xa4
,
0xa5
,
0xa8
,
0xb0
s3_md
:
.
byte
0x54
,
0x2b
,
0x84
.
byte
0x55
,
0x19
,
0x84
.
byte
0
.
ascii
"S3"
.
byte
0
#
ATI
cards
.
ati_test
:
leaw
idati
,
%
si
movw
$
0x31
,
%
di
movw
$
0x09
,
%
cx
repe
cmpsb
je
atiok
xorw
%
bp
,
%
bp
atiok
:
ret
idati
:
.
ascii
"761295520"
ati_md
:
.
byte
0x23
,
0x19
,
0x84
.
byte
0x33
,
0x2c
,
0x84
.
byte
0x22
,
0x1e
,
0x64
.
byte
0x21
,
0x19
,
0x64
.
byte
0x58
,
0x21
,
0x50
.
byte
0x5b
,
0x1e
,
0x50
.
byte
0
.
ascii
"ATI"
.
byte
0
#
AHEAD
ahead_test
:
movw
$
0x200f
,
%
ax
movw
$
0x3ce
,
%
dx
outw
%
ax
,
%
dx
incw
%
dx
inb
%
dx
,
%
al
cmpb
$
0x20
,
%
al
je
isahed
cmpb
$
0x21
,
%
al
je
isahed
xorw
%
bp
,
%
bp
isahed
:
ret
ahead_md
:
.
byte
0x22
,
0x2c
,
0x84
.
byte
0x23
,
0x19
,
0x84
.
byte
0x24
,
0x1c
,
0x84
.
byte
0x2f
,
0x32
,
0xa0
.
byte
0x32
,
0x22
,
0x50
.
byte
0x34
,
0x42
,
0x50
.
byte
0
.
ascii
"Ahead"
.
byte
0
#
Chips
&
Tech
.
chips_test
:
movw
$
0x3c3
,
%
dx
inb
%
dx
,
%
al
orb
$
0x10
,
%
al
outb
%
al
,
%
dx
movw
$
0x104
,
%
dx
inb
%
dx
,
%
al
movb
%
al
,
%
bl
movw
$
0x3c3
,
%
dx
inb
%
dx
,
%
al
andb
$
0xef
,
%
al
outb
%
al
,
%
dx
cmpb
$
0xa5
,
%
bl
je
cantok
xorw
%
bp
,
%
bp
cantok
:
ret
chips_md
:
.
byte
0x60
,
0x19
,
0x84
.
byte
0x61
,
0x32
,
0x84
.
byte
0
.
ascii
"Chips & Technologies"
.
byte
0
#
Cirrus
Logic
5
X0
cirrus1_test
:
movw
$
0x3d4
,
%
dx
movb
$
0x0c
,
%
al
outb
%
al
,
%
dx
incw
%
dx
inb
%
dx
,
%
al
movb
%
al
,
%
bl
xorb
%
al
,
%
al
outb
%
al
,
%
dx
decw
%
dx
movb
$
0x1f
,
%
al
outb
%
al
,
%
dx
incw
%
dx
inb
%
dx
,
%
al
movb
%
al
,
%
bh
xorb
%
ah
,
%
ah
shlb
$
4
,
%
al
movw
%
ax
,
%
cx
movb
%
bh
,
%
al
shrb
$
4
,
%
al
addw
%
ax
,
%
cx
shlw
$
8
,
%
cx
addw
$
6
,
%
cx
movw
%
cx
,
%
ax
movw
$
0x3c4
,
%
dx
outw
%
ax
,
%
dx
incw
%
dx
inb
%
dx
,
%
al
andb
%
al
,
%
al
jnz
nocirr
movb
%
bh
,
%
al
outb
%
al
,
%
dx
inb
%
dx
,
%
al
cmpb
$
0x01
,
%
al
je
iscirr
nocirr
:
xorw
%
bp
,
%
bp
iscirr
:
movw
$
0x3d4
,
%
dx
movb
%
bl
,
%
al
xorb
%
ah
,
%
ah
shlw
$
8
,
%
ax
addw
$
0x0c
,
%
ax
outw
%
ax
,
%
dx
ret
cirrus1_md
:
.
byte
0x1f
,
0x19
,
0x84
.
byte
0x20
,
0x2c
,
0x84
.
byte
0x22
,
0x1e
,
0x84
.
byte
0x31
,
0x25
,
0x64
.
byte
0
.
ascii
"Cirrus Logic 5X0"
.
byte
0
#
Cirrus
Logic
54
XX
cirrus5_test
:
movw
$
0x3c4
,
%
dx
movb
$
6
,
%
al
call
inidx
movb
%
al
,
%
bl
#
BL
=
backup
movw
$
6
,
%
ax
call
tstidx
cmpb
$
0x0f
,
%
al
jne
c5fail
movw
$
0x1206
,
%
ax
call
tstidx
cmpb
$
0x12
,
%
al
jne
c5fail
movb
$
0x1e
,
%
al
call
inidx
movb
%
al
,
%
bh
movb
%
bh
,
%
ah
andb
$
0xc0
,
%
ah
movb
$
0x1e
,
%
al
call
tstidx
andb
$
0x3f
,
%
al
jne
c5xx
movb
$
0x1e
,
%
al
movb
%
bh
,
%
ah
orb
$
0x3f
,
%
ah
call
tstidx
xorb
$
0x3f
,
%
al
andb
$
0x3f
,
%
al
c5xx
:
pushf
movb
$
0x1e
,
%
al
movb
%
bh
,
%
ah
outw
%
ax
,
%
dx
popf
je
c5done
c5fail
:
xorw
%
bp
,
%
bp
c5done
:
movb
$
6
,
%
al
movb
%
bl
,
%
ah
outw
%
ax
,
%
dx
ret
cirrus5_md
:
.
byte
0x14
,
0x19
,
0x84
.
byte
0x54
,
0x2b
,
0x84
.
byte
0
.
ascii
"Cirrus Logic 54XX"
.
byte
0
#
Cirrus
Logic
64
XX
--
no
known
extra
modes
,
but
must
be
identified
,
because
#
it
'
s
misidentified
by
the
Ahead
test
.
cirrus6_test
:
movw
$
0x3ce
,
%
dx
movb
$
0x0a
,
%
al
call
inidx
movb
%
al
,
%
bl
#
BL
=
backup
movw
$
0xce0a
,
%
ax
call
tstidx
orb
%
al
,
%
al
jne
c2fail
movw
$
0xec0a
,
%
ax
call
tstidx
cmpb
$
0x01
,
%
al
jne
c2fail
movb
$
0xaa
,
%
al
call
inidx
#
4
X
,
5
X
,
7
X
and
8
X
are
valid
64
XX
chip
ID
's.
shrb
$
4
,
%
al
subb
$
4
,
%
al
jz
c6done
decb
%
al
jz
c6done
subb
$
2
,
%
al
jz
c6done
decb
%
al
jz
c6done
c2fail
:
xorw
%
bp
,
%
bp
c6done
:
movb
$
0x0a
,
%
al
movb
%
bl
,
%
ah
outw
%
ax
,
%
dx
ret
cirrus6_md
:
.
byte
0
.
ascii
"Cirrus Logic 64XX"
.
byte
0
#
Everex
/
Trident
everex_test
:
movw
$
0x7000
,
%
ax
xorw
%
bx
,
%
bx
int
$
0x10
cmpb
$
0x70
,
%
al
jne
noevrx
shrw
$
4
,
%
dx
cmpw
$
0x678
,
%
dx
je
evtrid
cmpw
$
0x236
,
%
dx
jne
evrxok
evtrid
:
leaw
trident_md
,
%
bp
evrxok
:
ret
noevrx
:
xorw
%
bp
,
%
bp
ret
everex_md
:
.
byte
0x03
,
0x22
,
0x50
.
byte
0x04
,
0x3c
,
0x50
.
byte
0x07
,
0x2b
,
0x64
.
byte
0x08
,
0x4b
,
0x64
.
byte
0x0a
,
0x19
,
0x84
.
byte
0x0b
,
0x2c
,
0x84
.
byte
0x16
,
0x1e
,
0x50
.
byte
0x18
,
0x1b
,
0x64
.
byte
0x21
,
0x40
,
0xa0
.
byte
0x40
,
0x1e
,
0x84
.
byte
0
.
ascii
"Everex/Trident"
.
byte
0
#
Genoa
.
genoa_test
:
leaw
idgenoa
,
%
si
#
Check
Genoa
'clues'
xorw
%
ax
,
%
ax
movb
%
es
:
(
0x37
),
%
al
movw
%
ax
,
%
di
movw
$
0x04
,
%
cx
decw
%
si
decw
%
di
l1
:
incw
%
si
incw
%
di
movb
(%
si
),
%
al
testb
%
al
,
%
al
jz
l2
cmpb
%
es
:
(%
di
),
%
al
l2
:
loope
l1
orw
%
cx
,
%
cx
je
isgen
xorw
%
bp
,
%
bp
isgen
:
ret
idgenoa
:
.
byte
0x77
,
0x00
,
0x99
,
0x66
genoa_md
:
.
byte
0x58
,
0x20
,
0x50
.
byte
0x5a
,
0x2a
,
0x64
.
byte
0x60
,
0x19
,
0x84
.
byte
0x61
,
0x1d
,
0x84
.
byte
0x62
,
0x20
,
0x84
.
byte
0x63
,
0x2c
,
0x84
.
byte
0x64
,
0x3c
,
0x84
.
byte
0x6b
,
0x4f
,
0x64
.
byte
0x72
,
0x3c
,
0x50
.
byte
0x74
,
0x42
,
0x50
.
byte
0x78
,
0x4b
,
0x64
.
byte
0
.
ascii
"Genoa"
.
byte
0
#
OAK
oak_test
:
leaw
idoakvga
,
%
si
movw
$
0x08
,
%
di
movw
$
0x08
,
%
cx
repe
cmpsb
je
isoak
xorw
%
bp
,
%
bp
isoak
:
ret
idoakvga
:
.
ascii
"OAK VGA "
oak_md
:
.
byte
0x4e
,
0x3c
,
0x50
.
byte
0x4f
,
0x3c
,
0x84
.
byte
0x50
,
0x19
,
0x84
.
byte
0x51
,
0x2b
,
0x84
.
byte
0
.
ascii
"OAK"
.
byte
0
#
WD
Paradise
.
paradise_test
:
leaw
idparadise
,
%
si
movw
$
0x7d
,
%
di
movw
$
0x04
,
%
cx
repe
cmpsb
je
ispara
xorw
%
bp
,
%
bp
ispara
:
ret
idparadise
:
.
ascii
"VGA="
paradise_md
:
.
byte
0x41
,
0x22
,
0x50
.
byte
0x47
,
0x1c
,
0x84
.
byte
0x55
,
0x19
,
0x84
.
byte
0x54
,
0x2c
,
0x84
.
byte
0
.
ascii
"Paradise"
.
byte
0
#
Trident
.
trident_test
:
movw
$
0x3c4
,
%
dx
movb
$
0x0e
,
%
al
outb
%
al
,
%
dx
incw
%
dx
inb
%
dx
,
%
al
xchgb
%
al
,
%
ah
xorb
%
al
,
%
al
outb
%
al
,
%
dx
inb
%
dx
,
%
al
xchgb
%
ah
,
%
al
movb
%
al
,
%
bl
#
Strange
thing
...
in
the
book
this
wasn
't
andb
$
0x02
,
%
bl
#
necessary
but
it
worked
on
my
card
which
jz
setb2
#
is
a
trident
.
Without
it
the
screen
goes
#
blurred
...
andb
$
0xfd
,
%
al
jmp
clrb2
setb2
:
orb
$
0x02
,
%
al
clrb2
:
outb
%
al
,
%
dx
andb
$
0x0f
,
%
ah
cmpb
$
0x02
,
%
ah
je
istrid
xorw
%
bp
,
%
bp
istrid
:
ret
trident_md
:
.
byte
0x50
,
0x1e
,
0x50
.
byte
0x51
,
0x2b
,
0x50
.
byte
0x52
,
0x3c
,
0x50
.
byte
0x57
,
0x19
,
0x84
.
byte
0x58
,
0x1e
,
0x84
.
byte
0x59
,
0x2b
,
0x84
.
byte
0x5a
,
0x3c
,
0x84
.
byte
0
.
ascii
"Trident"
.
byte
0
#
Tseng
.
tseng_test
:
movw
$
0x3cd
,
%
dx
inb
%
dx
,
%
al
#
Could
things
be
this
simple
!
:
-)
movb
%
al
,
%
bl
movb
$
0x55
,
%
al
outb
%
al
,
%
dx
inb
%
dx
,
%
al
movb
%
al
,
%
ah
movb
%
bl
,
%
al
outb
%
al
,
%
dx
cmpb
$
0x55
,
%
ah
je
istsen
isnot
:
xorw
%
bp
,
%
bp
istsen
:
ret
tseng_md
:
.
byte
0x26
,
0x3c
,
0x50
.
byte
0x2a
,
0x28
,
0x64
.
byte
0x23
,
0x19
,
0x84
.
byte
0x24
,
0x1c
,
0x84
.
byte
0x22
,
0x2c
,
0x84
.
byte
0x21
,
0x3c
,
0x84
.
byte
0
.
ascii
"Tseng"
.
byte
0
#
Video7
.
video7_test
:
movw
$
0x3cc
,
%
dx
inb
%
dx
,
%
al
movw
$
0x3b4
,
%
dx
andb
$
0x01
,
%
al
jz
even7
movw
$
0x3d4
,
%
dx
even7
:
movb
$
0x0c
,
%
al
outb
%
al
,
%
dx
incw
%
dx
inb
%
dx
,
%
al
movb
%
al
,
%
bl
movb
$
0x55
,
%
al
outb
%
al
,
%
dx
inb
%
dx
,
%
al
decw
%
dx
movb
$
0x1f
,
%
al
outb
%
al
,
%
dx
incw
%
dx
inb
%
dx
,
%
al
movb
%
al
,
%
bh
decw
%
dx
movb
$
0x0c
,
%
al
outb
%
al
,
%
dx
incw
%
dx
movb
%
bl
,
%
al
outb
%
al
,
%
dx
movb
$
0x55
,
%
al
xorb
$
0xea
,
%
al
cmpb
%
bh
,
%
al
jne
isnot
movb
$VIDEO_FIRST_V7
>>
8
,
svga_prefix
#
Use
special
mode
switching
ret
video7_md
:
.
byte
0x40
,
0x2b
,
0x50
.
byte
0x43
,
0x3c
,
0x50
.
byte
0x44
,
0x3c
,
0x64
.
byte
0x41
,
0x19
,
0x84
.
byte
0x42
,
0x2c
,
0x84
.
byte
0x45
,
0x1c
,
0x84
.
byte
0
.
ascii
"Video 7"
.
byte
0
#
Realtek
VGA
realtek_test
:
leaw
idrtvga
,
%
si
movw
$
0x45
,
%
di
movw
$
0x0b
,
%
cx
repe
cmpsb
je
isrt
xorw
%
bp
,
%
bp
isrt
:
ret
idrtvga
:
.
ascii
"REALTEK VGA"
realtek_md
:
.
byte
0x1a
,
0x3c
,
0x50
.
byte
0x1b
,
0x19
,
0x84
.
byte
0x1c
,
0x1e
,
0x84
.
byte
0x1d
,
0x2b
,
0x84
.
byte
0x1e
,
0x3c
,
0x84
.
byte
0
.
ascii
"REALTEK"
.
byte
0
#endif /* CONFIG_VIDEO_SVGA */
#
User
-
defined
local
mode
table
(
VGA
only
)
#ifdef CONFIG_VIDEO_LOCAL
local_modes
:
leaw
local_mode_table
,
%
si
locm1
:
lodsw
orw
%
ax
,
%
ax
jz
locm2
stosw
movsw
jmp
locm1
locm2
:
ret
#
This
is
the
table
of
local
video
modes
which
can
be
supplied
manually
#
by
the
user
.
Each
entry
consists
of
mode
ID
(
word
)
and
dimensions
#
(
byte
for
column
count
and
another
byte
for
row
count
)
.
These
modes
#
are
placed
before
all
SVGA
and
VESA
modes
and
override
them
if
table
#
compacting
is
enabled
.
The
table
must
end
with
a
zero
word
followed
#
by
NUL
-
terminated
video
adapter
name
.
local_mode_table
:
.
word
0x0100
#
Example
:
40
x25
.
byte
25
,
40
.
word
0
.
ascii
"Local"
.
byte
0
#endif /* CONFIG_VIDEO_LOCAL */
#
Read
a
key
and
return
the
ASCII
code
in
al
,
scan
code
in
ah
getkey
:
xorb
%
ah
,
%
ah
int
$
0x16
ret
#
Read
a
key
with
a
timeout
of
30
seconds
.
#
The
hardware
clock
is
used
to
get
the
time
.
getkt
:
call
gettime
addb
$
30
,
%
al
#
Wait
30
seconds
cmpb
$
60
,
%
al
jl
lminute
subb
$
60
,
%
al
lminute
:
movb
%
al
,
%
cl
again
:
movb
$
0x01
,
%
ah
int
$
0x16
jnz
getkey
#
key
pressed
,
so
get
it
call
gettime
cmpb
%
cl
,
%
al
jne
again
movb
$
0x20
,
%
al
#
timeout
,
return
`
space
'
ret
#
Flush
the
keyboard
buffer
flush
:
movb
$
0x01
,
%
ah
int
$
0x16
jz
empty
xorb
%
ah
,
%
ah
int
$
0x16
jmp
flush
empty
:
ret
#
Print
hexadecimal
number
.
prthw
:
pushw
%
ax
movb
%
ah
,
%
al
call
prthb
popw
%
ax
prthb
:
pushw
%
ax
shrb
$
4
,
%
al
call
prthn
popw
%
ax
andb
$
0x0f
,
%
al
prthn
:
cmpb
$
0x0a
,
%
al
jc
prth1
addb
$
0x07
,
%
al
prth1
:
addb
$
0x30
,
%
al
jmp
prtchr
#
Print
decimal
number
in
al
prtdec
:
pushw
%
ax
pushw
%
cx
xorb
%
ah
,
%
ah
movb
$
0x0a
,
%
cl
idivb
%
cl
cmpb
$
0x09
,
%
al
jbe
lt100
call
prtdec
jmp
skip10
lt100
:
addb
$
0x30
,
%
al
call
prtchr
skip10
:
movb
%
ah
,
%
al
addb
$
0x30
,
%
al
call
prtchr
popw
%
cx
popw
%
ax
ret
store_edid
:
#ifdef CONFIG_FIRMWARE_EDID
pushw
%
es
#
just
save
all
registers
pushw
%
ax
pushw
%
bx
pushw
%
cx
pushw
%
dx
pushw
%
di
pushw
%
fs
popw
%
es
movl
$
0x13131313
,
%
eax
#
memset
block
with
0x13
movw
$
32
,
%
cx
movw
$
0x140
,
%
di
cld
rep
stosl
cmpw
$
0x0200
,
vbe_version
#
only
do
EDID
on
>=
VBE2
.0
jl
no_edid
pushw
%
es
#
save
ES
xorw
%
di
,
%
di
#
Report
Capability
pushw
%
di
popw
%
es
#
ES
:
DI
must
be
0
:
0
movw
$
0x4f15
,
%
ax
xorw
%
bx
,
%
bx
xorw
%
cx
,
%
cx
int
$
0x10
popw
%
es
#
restore
ES
cmpb
$
0x00
,
%
ah
#
call
successful
jne
no_edid
cmpb
$
0x4f
,
%
al
#
function
supported
jne
no_edid
movw
$
0x4f15
,
%
ax
#
do
VBE
/
DDC
movw
$
0x01
,
%
bx
movw
$
0x00
,
%
cx
movw
$
0x00
,
%
dx
movw
$
0x140
,
%
di
int
$
0x10
no_edid
:
popw
%
di
#
restore
all
registers
popw
%
dx
popw
%
cx
popw
%
bx
popw
%
ax
popw
%
es
#endif
ret
#
VIDEO_SELECT
-
only
variables
mt_end
:
.
word
0
#
End
of
video
mode
table
if
built
edit_buf
:
.
space
6
#
Line
editor
buffer
card_name
:
.
word
0
#
Pointer
to
adapter
name
scanning
:
.
byte
0
#
Performing
mode
scan
do_restore
:
.
byte
0
#
Screen
contents
altered
during
mode
change
svga_prefix
:
.
byte
VIDEO_FIRST_BIOS
>>
8
#
Default
prefix
for
BIOS
modes
graphic_mode
:
.
byte
0
#
Graphic
mode
with
a
linear
frame
buffer
dac_size
:
.
byte
6
#
DAC
bit
depth
vbe_version
:
.
word
0
#
VBE
bios
version
#
Status
messages
keymsg
:
.
ascii
"Press <RETURN> to see video modes available, "
.
ascii
"<SPACE> to continue or wait 30 secs"
.
byte
0x0d
,
0x0a
,
0
listhdr
:
.
byte
0x0d
,
0x0a
.
ascii
"Mode: COLSxROWS:"
crlft
:
.
byte
0x0d
,
0x0a
,
0
prompt
:
.
byte
0x0d
,
0x0a
.
asciz
"Enter mode number or `scan': "
unknt
:
.
asciz
"Unknown mode ID. Try again."
badmdt
:
.
ascii
"You passed an undefined mode number."
.
byte
0x0d
,
0x0a
,
0
vesaer
:
.
ascii
"Error: Scanning of VESA modes failed. Please "
.
ascii
"report to <mj@ucw.cz>."
.
byte
0x0d
,
0x0a
,
0
old_name
:
.
asciz
"CGA/MDA/HGA"
ega_name
:
.
asciz
"EGA"
svga_name
:
.
ascii
" "
vga_name
:
.
asciz
"VGA"
vesa_name
:
.
asciz
"VESA"
name_bann
:
.
asciz
"Video adapter: "
#endif /* CONFIG_VIDEO_SELECT */
#
Other
variables
:
adapter
:
.
byte
0
#
Video
adapter
:
0
=
CGA
/
MDA
/
HGA
,
1
=
EGA
,
2
=
VGA
video_segment
:
.
word
0xb800
#
Video
memory
segment
force_size
:
.
word
0
#
Use
this
size
instead
of
the
one
in
BIOS
vars
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment