!
!    setup.S        Copyright (C) 1991, 1992 Linus Torvalds
!
! setup.s is responsible for getting the system data from the BIOS,
! and putting them into the appropriate places in system memory.
! both setup.s and system has been loaded by the bootblock.
!
! This code asks the bios for memory/disk/other parameters, and
! puts them in a "safe" place: 0x90000-0x901FF, ie where the
! boot-block used to be. It is then up to the protected mode
! system to read them from there before the area is overwritten
! for buffer-blocks.
!
! Move PS/2 aux init code to psaux.c
! (troyer@saifr00.cfsat.Honeywell.COM) 03Oct92
!
! some changes and additional features by Christoph Niemann, March 1993
! (niemann@rubdv15.ETDV.Ruhr-Uni-Bochum.De)
!

! NOTE! These had better be the same as in bootsect.s!
#include <linux/config.h>
#include <linux/segment.h>

#ifndef SVGA_MODE
#define SVGA_MODE ASK_VGA
#endif

INITSEG  = DEF_INITSEG    ! we move boot here - out of the way
SYSSEG   = DEF_SYSSEG    ! system loaded at 0x10000 (65536).
SETUPSEG = DEF_SETUPSEG    ! this is the current segment

.globl begtext, begdata, begbss, endtext, enddata, endbss
.text
begtext:
.data
begdata:
.bss
begbss:
.text

! 程序入口
entry start
start:

! ok, the read went well so we get current cursor position and save it for
! posterity.
! ok,读取正常,现在我们获取当前光标位置然后保存

! 设定ds段位置
    mov    ax,#INITSEG    ! this is done in bootsect already, but...
    mov    ds,ax

! Get memory size (extended mem, kB)
! 获取内存
    mov    ah,#0x88
    int    0x15
    mov    [2],ax

! set the keyboard repeat rate to the max
! 设置键盘最大重复速率
    mov    ax,#0x0305
    xor    bx,bx        ! clear bx
    int    0x16

! check for EGA/VGA and some config parameters
! 检测EGA/VGA并配置参数

mov    ah,#0x12
    mov    bl,#0x10
    int    0x10
    mov    [8],ax
    mov    [10],bx
    mov    [12],cx
    mov    ax,#0x5019
    cmp    bl,#0x10
    je    novga
    mov    ax,#0x1a00    ! Added check for EGA/VGA discrimination
    int    0x10
    mov    bx,ax
    mov    ax,#0x5019
    cmp    bl,#0x1a    ! 1a means VGA, anything else EGA or lower
    jne    novga    
    call    chsvga  ! 子函数,过程比较简单,但是读取的可能配置比较多
novga:    mov    [14],ax
    mov    ah,#0x03    ! read cursor pos
    xor    bh,bh        ! clear bh
    int    0x10        ! save it in known place, con_init fetches
    mov    [0],dx        ! it from 0x90000.
    
! Get video-card data:
! 获取显卡数据
    
    mov    ah,#0x0f
    int    0x10
    mov    [4],bx        ! bh = display page
    mov    [6],ax        ! al = video mode, ah = window width

! Get hd0 data
! 获取第一个硬盘数据

xor    ax,ax        ! clear ax
    mov    ds,ax
    lds    si,[4*0x41]
    mov    ax,#INITSEG
    mov    es,ax
    mov    di,#0x0080
    mov    cx,#0x10
    cld
    rep
    movsb

! Get hd1 data
! 获取第二个硬盘数据

xor    ax,ax        ! clear ax
    mov    ds,ax
    lds    si,[4*0x46]
    mov    ax,#INITSEG
    mov    es,ax
    mov    di,#0x0090
    mov    cx,#0x10
    cld
    rep
    movsb

! Check that there IS a hd1 :-)
! 检测硬盘数量
    mov    ax,#0x01500
    mov    dl,#0x81
    int    0x13
    jc    no_disk1
    cmp    ah,#3
    je    is_disk1
no_disk1:           ! 没有第二块硬盘的处理
    mov    ax,#INITSEG
    mov    es,ax
    mov    di,#0x0090
    mov    cx,#0x10
    xor    ax,ax        ! clear ax
    cld
    rep
    stosb
is_disk1:

! check for PS/2 pointing device
! 检测PS/2设备,应该是鼠标
    mov    ax,#INITSEG
    mov    ds,ax
    mov    [0x1ff],#0    ! default is no pointing device
    int    0x11        ! int 0x11: equipment determination
    test    al,#0x04    ! check if pointing device installed
    jz    no_psmouse
    mov    [0x1ff],#0xaa    ! device present
no_psmouse:
! now we want to move to protected mode ...
! 准备进入保护模式
    cli            ! no interrupts allowed !
    mov    al,#0x80    ! disable NMI for the bootup sequence
    out    #0x70,al

! first we move the system to its rightful place
! 首先我们移动system到正确的位置
    mov    ax,#0x100    ! start of destination segment
    mov    bx,#0x1000    ! start of source segment
    cld            ! 'direction'=0, movs moves forward
do_move:            ! 上面是初始化,下面开始移动
    mov    es,ax        ! destination segment
    add    ax,#0x100
    cmp    ax,#0x9000
    jz    end_move
    mov    ds,bx        ! source segment
    add    bx,#0x100
    sub    di,di
    sub    si,si
    mov     cx,#0x800
    rep
    movsw
    jmp    do_move

! then we load the segment descriptors
! 移动完毕,我们加载段描述符

end_move:
    mov    ax,#SETUPSEG    ! right, forgot this at first. didn't work :-)
    mov    ds,ax
    ! 加载idt
    lidt    idt_48        ! load idt with 0,0   
    ! 加载gdt
    lgdt    gdt_48        ! load gdt with whatever appropriate

! that was painless, now we enable A20
! 设置完毕,我们现在准备打开A20地址线

call    empty_8042
    mov    al,#0xD1        ! command write
    out    #0x64,al
    call    empty_8042
    mov    al,#0xDF        ! A20 on
    out    #0x60,al
    call    empty_8042

! make sure any possible coprocessor is properly reset..
! 确保处理器正确设置

xor    ax,ax
    out    #0xf0,al
    call    delay
    out    #0xf1,al
    call    delay

! well, that went ok, I hope. Now we have to reprogram the interrupts :-(
! we put them right after the intel-reserved hardware interrupts, at
! int 0x20-0x2F. There they won't mess up anything. Sadly IBM really
! messed this up with the original PC, and they haven't been able to
! rectify it afterwards. Thus the bios puts interrupts at 0x08-0x0f,
! which is used for the internal hardware interrupts as well. We just
! have to reprogram the 8259's, and it isn't fun.

! 重新设置中断
    mov    al,#0x11        ! initialization sequence
    out    #0x20,al        ! send it to 8259A-1
    call    delay
    out    #0xA0,al        ! and to 8259A-2
    call    delay
    mov    al,#0x20        ! start of hardware int's (0x20)
    out    #0x21,al
    call    delay
    mov    al,#0x28        ! start of hardware int's 2 (0x28)
    out    #0xA1,al
    call    delay
    mov    al,#0x04        ! 8259-1 is master
    out    #0x21,al
    call    delay
    mov    al,#0x02        ! 8259-2 is slave
    out    #0xA1,al
    call    delay
    mov    al,#0x01        ! 8086 mode for both
    out    #0x21,al
    call    delay
    out    #0xA1,al
    call    delay
    mov    al,#0xFF        ! mask off all interrupts for now
    out    #0xA1,al
    call    delay
    mov    al,#0xFB        ! mask all irq's but irq2 which
    out    #0x21,al        ! is cascaded

! well, that certainly wasn't fun :-(. Hopefully it works, and we don't
! need no steenking BIOS anyway (except for the initial loading :-).
! The BIOS-routine wants lots of unnecessary data, and it's less
! "interesting" anyway. This is how REAL programmers do it.
!
! Well, now's the time to actually move into protected mode. To make
! things as simple as possible, we do no register set-up or anything,
! we let the gnu-compiled 32-bit programs do that. We just jump to
! absolute address 0x00000, in 32-bit protected mode.
!
! Note that the short jump isn't strictly needed, althought there are
! reasons why it might be a good idea. It won't hurt in any case.
!
! 打开地址线,进入保护模式
    mov    ax,#0x0001    ! protected mode (PE) bit
    lmsw    ax        ! This is it!
    jmp    flush_instr
flush_instr:
    jmpi    0x1000,KERNEL_CS    ! jmp offset 1000 of segment 0x10 (cs)
    ! 跳转到cs段的偏移为0x1000处执行,即执行zBoot/head.s

! This routine checks that the keyboard command queue is empty
! (after emptying the output buffers)
!
! No timeout is used - if this hangs there is something wrong with
! the machine, and we probably couldn't proceed anyway.
empty_8042:
    call    delay
    in    al,#0x64    ! 8042 status port
    test    al,#1        ! output buffer?
    jz    no_output
    call    delay
    in    al,#0x60    ! read it
    jmp    empty_8042
no_output:
    test    al,#2        ! is input buffer full?
    jnz    empty_8042    ! yes - loop
    ret
!
! Read a key and return the (US-)ascii code in al, scan code in ah
!
getkey:
    xor    ah,ah
    int    0x16
    ret

!
! Read a key with a timeout of 30 seconds. The cmos clock is used to get
! the time.
!
getkt:
    call    gettime
    add    al,#30        ! wait 30 seconds
    cmp    al,#60
    jl    lminute
    sub    al,#60
lminute:
    mov    cl,al
again:    mov    ah,#0x01
    int    0x16
    jnz    getkey        ! key pressed, so get it
    call    gettime
    cmp    al,cl
    jne    again
    mov    al,#0x20    ! timeout, return default char `space'
    ret

!
! Flush the keyboard buffer
!
flush:    mov    ah,#0x01
    int    0x16
    jz    empty
    xor    ah,ah
    int    0x16
    jmp    flush
empty:    ret

!
! Read the cmos clock. Return the seconds in al
!
gettime:
    push    cx
    mov    ah,#0x02
    int    0x1a
    mov    al,dh            ! dh contains the seconds
    and    al,#0x0f
    mov    ah,dh
    mov    cl,#0x04
    shr    ah,cl
    aad
    pop    cx
    ret

!
! Delay is needed after doing i/o
!
delay:
    .word    0x00eb            ! jmp $+2
    ret

! Routine trying to recognize type of SVGA-board present (if any)
! and if it recognize one gives the choices of resolution it offers.
! If one is found the resolution chosen is given by al,ah (rows,cols).

chsvga:    cld
    push    ds
    push    cs
    mov    ax,[0x01fa]
    pop    ds
    mov    modesave,ax
    mov     ax,#0xc000
    mov    es,ax
    mov    ax,modesave
    cmp    ax,#NORMAL_VGA
    je    defvga
    cmp    ax,#EXTENDED_VGA
    je    vga50
    cmp    ax,#ASK_VGA
    jne    svga
    lea    si,msg1
    call    prtstr
    call    flush
nokey:    call    getkt
    cmp    al,#0x0d        ! enter ?
    je    svga            ! yes - svga selection
    cmp    al,#0x20        ! space ?
    je    defvga            ! no - repeat
    call     beep
    jmp    nokey
defvga:    mov    ax,#0x5019
    pop    ds
    ret
/* extended vga mode: 80x50 */
vga50:
    mov    ax,#0x1112
    xor    bl,bl
    int    0x10        ! use 8x8 font set (50 lines on VGA)
    mov    ax,#0x1200
    mov    bl,#0x20
    int    0x10        ! use alternate print screen
    mov    ax,#0x1201
    mov    bl,#0x34
    int    0x10        ! turn off cursor emulation
    mov    ah,#0x01
    mov    cx,#0x0607
    int    0x10        ! turn on cursor (scan lines 6 to 7)
    pop    ds
    mov    ax,#0x5032    ! return 80x50
    ret
/* extended vga mode: 80x28 */
vga28:
    pop    ax        ! clean the stack
    mov    ax,#0x1111
    xor    bl,bl
    int    0x10        ! use 9x14 fontset (28 lines on VGA)
    mov    ah, #0x01
    mov    cx,#0x0b0c
    int    0x10        ! turn on cursor (scan lines 11 to 12)
    pop    ds
    mov    ax,#0x501c    ! return 80x28
    ret
/* svga modes */
svga:   cld
        lea     si,id9GXE    ! Check for the #9GXE (jyanowit@orixa.mtholyoke.edu,thanks dlm40629@uxa.cso.uiuc.edu)
        mov     di,#0x49    ! id string is at c000:049
        mov     cx,#0x11    ! length of "Graphics Power By"
        repe
        cmpsb
        jne     of1280
is9GXE:    lea     si,dsc9GXE    ! table of descriptions of video modes for BIOS
    lea    di,mo9GXE    ! table of sizes of video modes for my BIOS
    br    selmod        ! go ask for video mode
of1280:    cld    
    lea    si,idf1280    ! Check for Orchid F1280 (dingbat@diku.dk)
    mov    di,#0x10a    ! id string is at c000:010a
    mov    cx,#0x21    ! length
    repe
    cmpsb
    jne    nf1280    
isVRAM:    lea    si,dscf1280
    lea    di,mof1280
    br    selmod
nf1280:    lea    si,idVRAM
    mov    di,#0x10a
    mov    cx,#0x0c
    repe
    cmpsb
    je    isVRAM
    cld
    lea     si,idati        ! Check ATI 'clues'
    mov    di,#0x31
    mov     cx,#0x09
    repe
    cmpsb
    jne    noati
    lea    si,dscati
    lea    di,moati
    br    selmod
noati:    mov    ax,#0x200f        ! Check Ahead 'clues'
    mov    dx,#0x3ce
    out    dx,ax
    inc    dx
    in    al,dx
    cmp    al,#0x20
    je    isahed
    cmp    al,#0x21
    jne    noahed
isahed:    lea    si,dscahead
    lea    di,moahead
    br    selmod
noahed:    mov    dx,#0x3c3        ! Check Chips & Tech. 'clues'
    in    al,dx
    or    al,#0x10
    out    dx,al
    mov    dx,#0x104        
    in    al,dx
    mov    bl,al
    mov    dx,#0x3c3
    in    al,dx
    and    al,#0xef
    out    dx,al
    cmp    bl,[idcandt]
    jne    nocant
    lea    si,dsccandt
    lea    di,mocandt
    br    selmod
nocant:    mov    dx,#0x3d4        ! Check Cirrus 'clues'
    mov    al,#0x0c
    out    dx,al
    inc    dx
    in    al,dx
    mov    bl,al
    xor    al,al
    out    dx,al
    dec    dx
    mov    al,#0x1f
    out    dx,al
    inc    dx
    in    al,dx
    mov    bh,al
    xor    ah,ah
    shl    al,#4
    mov    cx,ax
    mov    al,bh
    shr    al,#4
    add    cx,ax
    shl    cx,#8
    add    cx,#6
    mov    ax,cx
    mov    dx,#0x3c4
    out    dx,ax
    inc    dx
    in    al,dx
    and    al,al
    jnz    nocirr
    mov    al,bh
    out    dx,al
    in    al,dx
    cmp    al,#0x01
    jne    nocirr
    call    rst3d4    
    lea    si,dsccirrus
    lea    di,mocirrus
    br    selmod
rst3d4:    mov    dx,#0x3d4
    mov    al,bl
    xor    ah,ah
    shl    ax,#8
    add    ax,#0x0c
    out    dx,ax
    ret    
nocirr:    call    rst3d4            ! Check Everex 'clues'
    mov    ax,#0x7000
    xor    bx,bx
    int    0x10
    cmp    al,#0x70
    jne    noevrx
    shr    dx,#4
    cmp    dx,#0x678
    je    istrid
    cmp    dx,#0x236
    je    istrid
    lea    si,dsceverex
    lea    di,moeverex
    br    selmod
istrid:    lea    cx,ev2tri
    jmp    cx
noevrx:    lea    si,idgenoa        ! Check Genoa 'clues'
    xor     ax,ax
    seg es
    mov    al,[0x37]
    mov    di,ax
    mov    cx,#0x04
    dec    si
    dec    di
l1:    inc    si
    inc    di
    mov    al,(si)
    test    al,al
    jz    l2
    seg es
    cmp    al,(di)
l2:    loope     l1
    cmp    cx,#0x00
    jne    nogen
    lea    si,dscgenoa
    lea    di,mogenoa
    br    selmod
nogen:    cld
    lea    si,idoakvga
    mov    di,#0x08
    mov    cx,#0x08
    repe
    cmpsb
    jne    nooak
    lea    si,dscoakvga
    lea    di,mooakvga
    br    selmod
nooak:    cld
    lea    si,idparadise        ! Check Paradise 'clues'
    mov    di,#0x7d
    mov    cx,#0x04
    repe
    cmpsb
    jne    nopara
    lea    si,dscparadise
    lea    di,moparadise
    br    selmod
nopara:    mov    dx,#0x3c4        ! Check Trident 'clues'
    mov    al,#0x0e
    out    dx,al
    inc    dx
    in    al,dx
    xchg    ah,al
    xor    al,al
    out    dx,al
    in    al,dx
    xchg    al,ah
    mov    bl,al        ! Strange thing ... in the book this wasn't
    and    bl,#0x02    ! necessary but it worked on my card which
    jz    setb2        ! is a trident. Without it the screen goes
    and    al,#0xfd    ! blurred ...
    jmp    clrb2        !
setb2:    or    al,#0x02    !
clrb2:    out    dx,al
    and    ah,#0x0f
    cmp    ah,#0x02
    jne    notrid
ev2tri:    lea    si,dsctrident
    lea    di,motrident
    jmp    selmod
notrid:    mov    dx,#0x3cd        ! Check Tseng 'clues'
    in    al,dx            ! Could things be this simple ! :-)
    mov    bl,al
    mov    al,#0x55
    out    dx,al
    in    al,dx
    mov    ah,al
    mov    al,bl
    out    dx,al
    cmp    ah,#0x55
     jne    notsen
    lea    si,dsctseng
    lea    di,motseng
    jmp    selmod
notsen:    mov    dx,#0x3cc        ! Check Video7 'clues'
    in    al,dx
    mov    dx,#0x3b4
    and    al,#0x01
    jz    even7
    mov    dx,#0x3d4
even7:    mov    al,#0x0c
    out    dx,al
    inc    dx
    in    al,dx
    mov    bl,al
    mov    al,#0x55
    out    dx,al
    in    al,dx
    dec    dx
    mov    al,#0x1f
    out    dx,al
    inc    dx
    in    al,dx
    mov    bh,al
    dec    dx
    mov    al,#0x0c
    out    dx,al
    inc    dx
    mov    al,bl
    out    dx,al
    mov    al,#0x55
    xor    al,#0xea
    cmp    al,bh
    jne    novid7
    lea    si,dscvideo7
    lea    di,movideo7
    jmp    selmod
novid7:    lea    si,dsunknown
    lea    di,mounknown
selmod:    xor    cx,cx
    mov    cl,(di)
    mov    ax,modesave
    cmp    ax,#ASK_VGA
    je    askmod
    cmp    ax,#NORMAL_VGA
    je    askmod
    cmp    al,cl
    jl    gotmode
    push    si
    lea    si,msg4
    call    prtstr
    pop    si
askmod:    push    si
    lea    si,msg2
    call    prtstr
    pop    si
    push    si
    push    cx
tbl:    pop    bx
    push    bx
    mov    al,bl
    sub    al,cl
    call    modepr
    lodsw
    xchg    al,ah
    call    dprnt
    xchg    ah,al
    push    ax
    mov    al,#0x78
    call    prnt1
    pop    ax
    call    dprnt
    push    si
    lea    si,crlf        ! print CR+LF
    call    prtstr
    pop    si
    loop    tbl
    pop    cx
    lea    si,msg3
    call    prtstr
    pop    si
    add    cl,#0x30
    jmp    nonum
nonumb:    call    beep
nonum:    call    getkey
    cmp    al,#0x30    ! ascii `0'
    jb    nonumb
    cmp    al,#0x3a    ! ascii `9'
    jbe    number
    cmp    al,#0x61    ! ascii `a'
    jb    nonumb
    cmp    al,#0x7a    ! ascii `z'
    ja    nonumb
    sub    al,#0x27
    cmp    al,cl
    jae    nonumb
    sub    al,#0x30
    jmp    gotmode
number: cmp    al,cl
    jae    nonumb
    sub    al,#0x30
gotmode:    xor    ah,ah
    or    al,al
    beq    vga50
    push    ax
    dec    ax
    beq    vga28
    add    di,ax
    mov    al,(di)
    int     0x10
    pop    ax
    shl    ax,#1
    add    si,ax
    lodsw
    pop    ds
    ret

! Routine to print asciiz-string at DS:SI

prtstr:    lodsb
    and    al,al
    jz    fin
    call    prnt1
    jmp    prtstr
fin:    ret

! Routine to print a decimal value on screen, the value to be
! printed is put in al (i.e 0-255).

dprnt:    push    ax
    push    cx
    xor    ah,ah        ! Clear ah
    mov    cl,#0x0a
    idiv    cl
    cmp    al,#0x09
    jbe    lt100
    call    dprnt
    jmp    skip10
lt100:    add    al,#0x30
    call    prnt1
skip10:    mov    al,ah
    add    al,#0x30
    call    prnt1    
    pop    cx
    pop    ax
    ret

!
! Routine to print the mode number key on screen. Mode numbers
! 0-9 print the ascii values `0' to '9', 10-35 are represented by
! the letters `a' to `z'. This routine prints some spaces around the
! mode no.
!

modepr:    push    ax
    cmp    al,#0x0a
    jb    digit        ! Here is no check for number > 35
    add    al,#0x27
digit:    add    al,#0x30
    mov    modenr, al
    push     si
    lea    si, modestring
    call    prtstr
    pop    si
    pop    ax
    ret

! Part of above routine, this one just prints ascii al

prnt1:    push    ax
    push    cx
    xor    bh,bh
    mov    cx,#0x01
    mov    ah,#0x0e
    int    0x10
    pop    cx
    pop    ax
    ret

beep:    mov    al,#0x07
    jmp    prnt1
    
gdt:
    .word    0,0,0,0        ! dummy

.word    0,0,0,0        ! unused

.word    0x07FF        ! 8Mb - limit=2047 (2048*4096=8Mb)
    .word    0x0000        ! base address=0
    .word    0x9A00        ! code read/exec
    .word    0x00C0        ! granularity=4096, 386

.word    0x07FF        ! 8Mb - limit=2047 (2048*4096=8Mb)
    .word    0x0000        ! base address=0
    .word    0x9200        ! data read/write
    .word    0x00C0        ! granularity=4096, 386

idt_48:
    .word    0            ! idt limit=0
    .word    0,0            ! idt base=0L

gdt_48:
    .word    0x800        ! gdt limit=2048, 256 GDT entries
    .word    512+gdt,0x9    ! gdt base = 0X9xxxx

msg1:        .ascii    "Press <RETURN> to see SVGA-modes available, <SPACE> to continue or wait 30 secs."
        db    0x0d, 0x0a, 0x0a, 0x00
msg2:        .ascii    "Mode:  COLSxROWS:"
        db    0x0d, 0x0a, 0x0a, 0x00
msg3:        db    0x0d, 0x0a
        .ascii    "Choose mode by pressing the corresponding number or letter."
crlf:        db    0x0d, 0x0a, 0x00
msg4:        .ascii    "You passed an undefined mode number to setup. Please choose a new mode."
        db    0x0d, 0x0a, 0x0a, 0x07, 0x00
modestring:    .ascii    "   "
modenr:        db    0x00    ! mode number
        .ascii    ":    "
        db    0x00
        
idati:        .ascii    "761295520"
idcandt:    .byte    0xa5
idgenoa:    .byte    0x77, 0x00, 0x99, 0x66
idparadise:    .ascii    "VGA="
idoakvga:    .ascii  "OAK VGA "
idf1280:    .ascii    "Orchid Technology Fahrenheit 1280"
id9GXE:        .ascii  "Graphics Power By"
idVRAM:        .ascii    "Stealth VRAM"

! Manufacturer:      Numofmodes+2:    Mode:
! Number of modes is the number of chip-specific svga modes plus the extended
! modes available on any vga (currently 2)

moati:        .byte    0x04,    0x23, 0x33
moahead:    .byte    0x07,    0x22, 0x23, 0x24, 0x2f, 0x34
mocandt:    .byte    0x04,    0x60, 0x61
mocirrus:    .byte    0x06,    0x1f, 0x20, 0x22, 0x31
moeverex:    .byte    0x0c,    0x03, 0x04, 0x07, 0x08, 0x0a, 0x0b, 0x16, 0x18, 0x21, 0x40
mogenoa:    .byte    0x0c,    0x58, 0x5a, 0x60, 0x61, 0x62, 0x63, 0x64, 0x72, 0x74, 0x78
moparadise:    .byte    0x04,    0x55, 0x54
motrident:    .byte    0x09,    0x50, 0x51, 0x52, 0x57, 0x58, 0x59, 0x5a
motseng:    .byte    0x07,    0x26, 0x2a, 0x23, 0x24, 0x22
movideo7:    .byte    0x08,    0x40, 0x43, 0x44, 0x41, 0x42, 0x45
mooakvga:    .byte   0x08,   0x00, 0x07, 0x4e, 0x4f, 0x50, 0x51
mo9GXE:        .byte    0x04,    0x54, 0x55
mof1280:    .byte    0x04,    0x54, 0x55
mounknown:    .byte    0x02

!            msb = Cols lsb = Rows:
! The first two modes are standard vga modes available on any vga.
! mode 0 is 80x50 and mode 1 is 80x28

dscati:        .word    0x5032, 0x501c, 0x8419, 0x842c
dscahead:    .word    0x5032, 0x501c, 0x842c, 0x8419, 0x841c, 0xa032, 0x5042
dsccandt:    .word    0x5032, 0x501c, 0x8419, 0x8432
dsccirrus:    .word    0x5032, 0x501c, 0x8419, 0x842c, 0x841e, 0x6425
dsceverex:    .word    0x5032, 0x501c, 0x5022, 0x503c, 0x642b, 0x644b, 0x8419, 0x842c, 0x501e, 0x641b, 0xa040, 0x841e
dscgenoa:    .word    0x5032, 0x501c, 0x5020, 0x642a, 0x8419, 0x841d, 0x8420, 0x842c, 0x843c, 0x503c, 0x5042, 0x644b
dscparadise:    .word    0x5032, 0x501c, 0x8419, 0x842b
dsctrident:    .word     0x5032, 0x501c, 0x501e, 0x502b, 0x503c, 0x8419, 0x841e, 0x842b, 0x843c
dsctseng:    .word    0x5032, 0x501c, 0x503c, 0x6428, 0x8419, 0x841c, 0x842c
dscvideo7:    .word    0x5032, 0x501c, 0x502b, 0x503c, 0x643c, 0x8419, 0x842c, 0x841c
dscoakvga:    .word   0x5032, 0x501c, 0x2819, 0x5019, 0x503c, 0x843c, 0x8419, 0x842b
dscf1280:    .word    0x5032, 0x501c, 0x842b, 0x8419
dsc9GXE:    .word    0x5032, 0x501c, 0x842b, 0x8419
dsunknown:    .word    0x5032, 0x501c
modesave:    .word    SVGA_MODE

.text
endtext:
.data
enddata:
.bss
endbss:

boot/setup.S的更多相关文章

  1. Linux引导启动程序 - boot

    主要描述 boot/目录中的三个汇编代码文件,见列表 3-1 所示.正如在前一章中提到的,这三个 文件虽然都是汇编程序,但却使用了两种语法格式.bootsect.s 和 setup.s 采用近似于 I ...

  2. linux内核升级图文攻略(转)

    一.Linux内核概览Linux是一个一体化内核(monolithic kernel)系统.设备驱动程序可以完全访问硬件.Linux内的设备驱动程序可以方便地以模块化(modularize)的形式设置 ...

  3. [No000031]操作系统 Operating Systems 之Open the OS!

    从打开电源开始… 这神秘的黑色背后发生着什么?… 打开电源,计算机执行的第一句指令什么? 计算模型(图灵机) ⇒ 我们要 关注 指针IP 及其 指向的内容 看看x86 PC (1) 刚开机时CPU 处 ...

  4. Linux 中断详解 【转】

    转自:http://blog.csdn.net/tiangwan2011/article/details/7891818 原文地址 http://www.yesky.com/20010813/1921 ...

  5. system(linux) power on note

    读詹荣开文档摘 BIOS 在完成硬件检测和资源分配后,将硬盘 MBR 中的 Boot Loader 读到系统的 RAM 中,然后将控制权交给 OS Boot Loader Boot Loader执行全 ...

  6. VMDK镜像迁移到KVM

    The vmware system consists of two disks in raw format: the old boot disk and the second one. It is W ...

  7. tools/build.c

    /* *  linux/tools/build.c * *  Copyright (C) 1991, 1992  Linus Torvalds */ /* * This file builds a d ...

  8. Linux1.0源代码编译过程

    根据源代码包中的readme文件及http://chfj007.blog.163.com/blog/static/173145044201191195856806/?suggestedreading& ...

  9. 嵌入式 uboot引导kernel,kernel引导fs

    1.uboot引导kernel: u-boot中有个bootm命令,它可以引导内存中的应用程序映像(Kernel),bootm命令对应 common/cmd_bootm.c中的do_bootm()函数 ...

随机推荐

  1. http://bootswatch.com/

    http://bootswatch.com/ http://v3.bootcss.com/examples/dashboard/

  2. Delphi 的 7zip 压缩算法

    http://blog.csdn.net/warrially/article/details/8039915

  3. C++-模板的声明和实现为何要放在头文件中

    源: http://blog.csdn.net/lqk1985/archive/2008/10/24/3136364.aspx 如何组织编写模板程序 发表日期: 1/21/2003 12:28:58 ...

  4. CCNA 6.9

    page 201 show ip route    Correction(05-4)   Basic configuration of R1:   enable configure terminal ...

  5. acvitity的日常 启动模式(上)

    1. 基本介绍 大家平时只要懂一点Android知识的话,都一定会知道,一个应用的组成,往往包含了许多的activity组件,每个activity都应该围绕用户的特定动作进行跳转设计.比如说,一个电话 ...

  6. ssh原理

     客户端向服务器端发出连接请求 服务器端向客户端发出自己的公钥 客户端使用服务器端的公钥加密通讯密钥然后发给服务器端 如果通讯过程被截获,由于窃听者即使获知公钥和经过公钥加密的内容,但不拥有私 ...

  7. SharePoint安全 - SharePoint网站常用页面URL索引

    博客地址 http://blog.csdn.net/foxdave 一. 主要网站内容 首页 /default.aspx /Pages/default.aspx 网站设置 /_layouts/sett ...

  8. struts2的返回类型

    return 一个字符串,如果是success 直接 服务器端跳转 返回到和方法名对应的页面去 不过如果返回的页面和方法没有太大关系,比如删除修改添加之后要 客户端跳转 返回所有用户列表,这个时候可以 ...

  9. python几大排序算法

    1.插入排序 原理:有数列[k1,k2,k3...],假设k1是排好序的,插入k2,排序完成,然后再插入k3,以此类推 def insert_sort(arr): for i in range(1,l ...

  10. JDK的下载与安装

    一.下载 在Oracle公司的官方网站(www.oracle.com)下载. 二.安装 1.双击运行JDK程序,弹出JDK安装导向窗口,点击“下一步” 2.点击“更改",将安装地址修改为 C ...