Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                              ;;
  3. ;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
  4. ;; Distributed under terms of the GNU General Public License    ;;
  5. ;;                                                              ;;
  6. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  7.  
  8.  
  9. struc VBE_VGAInfo {
  10.   .VESASignature          dd ?    ; char
  11.   .VESAVersion            dw ?    ; short
  12.   .OemStringPtr           dd ?    ; char *
  13.   .Capabilities           dd ?    ; ulong
  14.   .VideoModePtr           dd ?    ; ulong
  15.   .TotalMemory            dw ?    ; short
  16.   ; VBE 2.0+
  17.   .OemSoftwareRev         db ?    ; short
  18.   .OemVendorNamePtr       dw ?    ; char *
  19.   .OemProductNamePtr      dw ?    ; char *
  20.   .OemProductRevPtr       dw ?    ; char *
  21.   .reserved               rb 222  ; char
  22.   .OemData                rb 256  ; char
  23. }
  24.  
  25. struc VBE_ModeInfo {
  26.   .ModeAttributes         dw ?    ; short
  27.   .WinAAttributes         db ?    ; char
  28.   .WinBAttributes         db ?    ; char
  29.   .WinGranularity         dw ?    ; short
  30.   .WinSize                dw ?    ; short
  31.   .WinASegment            dw ?    ; ushort
  32.   .WinBSegment            dw ?    ; ushort
  33.   .WinFuncPtr             dd ?    ; void *
  34.   .BytesPerScanLine       dw ?    ; short
  35.   .XRes                   dw ?    ; short
  36.   .YRes                   dw ?    ; short
  37.   .XCharSize              db ?    ; char
  38.   .YCharSize              db ?    ; char
  39.   .NumberOfPlanes         db ?    ; char
  40.   .BitsPerPixel           db ?    ; char
  41.   .NumberOfBanks          db ?    ; char
  42.   .MemoryModel            db ?    ; char
  43.   .BankSize               db ?    ; char
  44.   .NumberOfImagePages     db ?    ; char
  45.   .res1                   db ?    ; char
  46.   .RedMaskSize            db ?    ; char
  47.   .RedFieldPosition       db ?    ; char
  48.   .GreenMaskSize          db ?    ; char
  49.   .GreenFieldPosition     db ?    ; char
  50.   .BlueMaskSize           db ?    ; char
  51.   .BlueFieldPosition      db ?    ; char
  52.   .RsvedMaskSize          db ?    ; char
  53.   .RsvedFieldPosition     db ?    ; char
  54.   .DirectColorModeInfo    db ?    ; char ; MISSED IN THIS TUTORIAL!! SEE ABOVE
  55.   ; VBE 2.0+
  56.   .PhysBasePtr            dd ?    ; ulong
  57.   .OffScreenMemOffset     dd ?    ; ulong
  58.   .OffScreenMemSize       dw ?    ; short
  59.   ; VBE 3.0+
  60.   .LinbytesPerScanLine    dw ?    ; short
  61.   .BankNumberOfImagePages db ?    ; char
  62.   .LinNumberOfImagePages  db ?    ; char
  63.   .LinRedMaskSize         db ?    ; char
  64.   .LinRedFieldPosition    db ?    ; char
  65.   .LingreenMaskSize       db ?    ; char
  66.   .LinGreenFieldPosition  db ?    ; char
  67.   .LinBlueMaskSize        db ?    ; char
  68.   .LinBlueFieldPosition   db ?    ; char
  69.   .LinRsvdMaskSize        db ?    ; char
  70.   .LinRsvdFieldPosition   db ?    ; char
  71.   .MaxPixelClock          dd ?    ; ulong
  72.   .res2                   rb 190  ; char
  73. }
  74.  
  75. virtual at $A000
  76.   vi VBE_VGAInfo
  77.   mi VBE_ModeInfo
  78. modes_table:
  79. end virtual
  80. cursor_pos  dw 0         ;âðåìåííîå õðàíåíèå êóðñîðà.
  81. home_cursor dw 0    ;current shows rows a table
  82. end_cursor  dw 0     ;end of position current shows rows a table
  83. scroll_start dw 0    ;start position of scroll bar
  84. scroll_end  dw 0     ;end position of scroll bar
  85. long_v_table equ 9   ;long of visible video table
  86. size_of_step equ 10
  87. scroll_area_size equ (long_v_table-2)
  88. int2str:
  89.         dec     bl
  90.         jz      @f
  91.         xor     edx,edx
  92.         div     ecx
  93.         push    edx
  94.         call    int2str
  95.         pop     eax
  96.     @@: or      al,0x30
  97.         mov     [ds:di],al
  98.         inc     di
  99.         ret
  100.  
  101. int2strnz:
  102.         cmp     eax,ecx
  103.         jb      @f
  104.         xor     edx,edx
  105.         div     ecx
  106.         push    edx
  107.         call    int2strnz
  108.         pop     eax
  109.     @@: or      al,0x30
  110.         mov     [es:di],al
  111.         inc     di
  112.         ret
  113.  
  114. ;-------------------------------------------------------
  115. ;Write message about incorrect v_mode and write message about jmp on swith v_mode
  116. v_mode_error:
  117.         _setcursor 19,2
  118.         mov     si, fatalsel
  119.         call    printplain
  120.         _setcursor 20,2
  121.         mov     si,pres_key
  122.         call    printplain
  123.         xor     eax,eax
  124.         int     16h
  125.         jmp     cfgmanager.d
  126. ;-------------------------------------------------------
  127. ;
  128.  
  129.  
  130.  
  131. ;-------------------------------------------------------
  132. print_vesa_info:
  133.         _setcursor 5,2
  134.  
  135.         mov     [es:vi.VESASignature],'VBE2'
  136.         mov     ax,0x4F00
  137.         mov     di,vi      ;0xa000
  138.         int     0x10
  139.         or      ah,ah
  140.         jz      @f
  141.         mov     [es:vi.VESASignature],'VESA'
  142.         mov     ax,$4F00
  143.         mov     di,vi
  144.         int     0x10
  145.         or      ah,ah
  146.         jnz     .exit
  147.   @@:
  148.         cmp     [es:vi.VESASignature],'VESA'
  149.         jne     .exit
  150.         cmp     [es:vi.VESAVersion],0x0100
  151.         jb      .exit
  152.         jmp     .vesaok2
  153.  
  154.   .exit:
  155.         mov     si,novesa
  156.         call    printplain
  157.         ret
  158.  
  159.   .vesaok2:
  160.         mov     ax,[es:vi.VESAVersion]
  161.         add     ax,'00'
  162.  
  163.         mov     [s_vesa.ver], ah
  164.         mov     [s_vesa.ver+2], al
  165.         mov     si,s_vesa
  166.         call    printplain
  167.  
  168.         _setcursor 4,2
  169.         mov     si,word[es:vi.OemStringPtr]
  170.         mov     di,si
  171.  
  172.         push    ds
  173.         mov     ds,word[es:vi.OemStringPtr+2]
  174.         call    printplain
  175.         pop     ds
  176.  
  177.         ret
  178. ;-----------------------------------------------------------------------------
  179.  
  180. calc_vmodes_table:
  181.         pushad
  182.  
  183. ;        push    0
  184. ;        pop     es
  185.  
  186.         lfs     si, [es:vi.VideoModePtr]
  187.  
  188.         mov     bx,modes_table
  189. ;save no vesa mode of work 320x200, EGA/CGA 256 梥⮢ and 640x480, VGA 16 梥⮢
  190.         mov     word [es:bx],640
  191.         mov     word [es:bx+2],480
  192.         mov     word [es:bx+6],0x13
  193.        
  194.         mov     word [es:bx+10],640
  195.         mov     word [es:bx+12],480
  196.         mov     word [es:bx+16],0x12
  197.         add     bx,20
  198.   .next_mode:
  199.         mov     cx,word [fs:si] ; mode number
  200.         cmp     cx,-1
  201.         je      .modes_ok.2
  202.  
  203.         mov     ax,0x4F01
  204.         mov     di,mi
  205.         int     0x10
  206.  
  207.         or      ah,ah
  208.         jnz     .modes_ok.2;vesa_info.exit
  209.  
  210.         test    [es:mi.ModeAttributes],00000001b   ;videomode support ?
  211.         jz      @f
  212.         test    [es:mi.ModeAttributes],00010000b   ;picture ?
  213.         jz      @f
  214.         test    [es:mi.ModeAttributes],10000000b   ;LFB ?
  215.         jz      @f
  216.  
  217.         cmp     [es:mi.BitsPerPixel], 24        ;It show only videomodes to have support 24 and 32 bpp
  218.         jb      @f
  219.  
  220. ;        cmp     [es:mi.BitsPerPixel],16
  221. ;        jne     .l0
  222. ;        cmp     [es:mi.GreenMaskSize],5
  223. ;        jne     .l0
  224. ;        mov     [es:mi.BitsPerPixel],15
  225.  
  226.  
  227. .l0:
  228.         cmp     [es:mi.XRes],640
  229.         jb      @f
  230.         cmp     [es:mi.YRes],480
  231.         jb      @f
  232. ;        cmp     [es:mi.BitsPerPixel],8
  233. ;        jb      @f
  234.  
  235.         mov     ax,[es:mi.XRes]
  236.         mov     [es:bx+0],ax               ; +0[2] : resolution X
  237.         mov     ax,[es:mi.YRes]
  238.         mov     [es:bx+2],ax               ; +2[2] : resolution Y
  239.         mov     ax,[es:mi.ModeAttributes]
  240.         mov     [es:bx+4],ax               ; +4[2] : attributes
  241.  
  242.         cmp     [s_vesa.ver],'2'
  243.         jb      .lp1
  244.  
  245.         or      cx,0x4000  ; use LFB
  246. .lp1:   mov     [es:bx+6],cx               ; +6 : mode number
  247.         movzx   ax,byte [es:mi.BitsPerPixel]
  248.         mov     word [es:bx+8],ax               ; +8 : bits per pixel
  249.         add     bx,size_of_step                 ; size of record
  250.  
  251.     @@:
  252.         add     si,2
  253.         jmp     .next_mode
  254.  
  255.   .modes_ok.2:
  256.  
  257.         mov     word[es:bx],-1  ;end video table
  258.         mov     word[end_cursor],bx     ;save end cursor position
  259. ;;;;;;;;;;;;;;;;;;
  260. ;Sort array
  261. ;        mov     si,modes_table
  262. ;.new_mode:
  263. ;        mov     ax,word [es:si]
  264. ;        cmp     ax,-1
  265. ;        je      .exxit
  266. ;        add     ax,word [es:si+2]
  267. ;        add     ax,word [es:si+8]
  268. ;        mov     bp,si
  269. ;.again:
  270. ;        add     bp,12
  271. ;        mov     bx,word [es:bp]
  272. ;        cmp     bx,-1
  273. ;        je      .exit
  274. ;        add     bx,word [es:bp+2]
  275. ;        add     bx,word [es:bp+8]
  276. ;        
  277. ;        cmp     ax,bx
  278. ;        ja      .loops
  279. ;        jmp     .again
  280. ;.loops:
  281. ;        push    dword [es:si]
  282. ;        push    dword [es:si+4]
  283. ;        push    dword [es:si+8]
  284. ;        push    dword [es:bp]
  285. ;        push    dword [es:bp+4]
  286. ;        push    dword [es:bp+8]
  287. ;
  288. ;        pop     dword [es:si+8]
  289. ;        pop     dword [es:si+4]
  290. ;        pop     dword [es:si]
  291. ;        pop     dword [es:bp+8]
  292. ;        pop     dword [es:bp+4]
  293. ;        pop     dword [es:bp]
  294. ;        jmp     .new_mode
  295. ;
  296. ;.exit:  add     si,12
  297. ;        jmp     .new_mode
  298. ;.exxit:
  299.         popad
  300.         ret
  301.  
  302. ;-----------------------------------------------------------------------------
  303.  
  304. draw_current_vmode:
  305.         push    0
  306.         pop     es
  307.  
  308.         mov     si,word [cursor_pos]
  309.  
  310.         cmp     word [es:si+6],0x12
  311.         je      .no_vesa_0x12
  312.  
  313.         cmp     word [es:si+6],0x13
  314.         je      .no_vesa_0x13
  315.  
  316.         mov     di,loader_block_error
  317.         movzx   eax,word[es:si+0]
  318.         mov     ecx,10
  319.         call    int2strnz
  320.         mov     byte[es:di],'x'
  321.         inc     di
  322.         movzx   eax,word[es:si+2]
  323.         call    int2strnz
  324.         mov     byte[es:di],'x'
  325.         inc     di
  326.         movzx   eax,word[es:si+8]
  327.         call    int2strnz
  328.         mov     dword[es:di],0x00000d0a
  329.         mov     si,loader_block_error
  330.         push    ds
  331.         push    es
  332.         pop     ds
  333.         call    printplain
  334.         pop     ds
  335.         ret
  336. .no_vesa_0x13:
  337.         mov     si,mode0
  338.         jmp     .print
  339. .no_vesa_0x12:
  340.         mov     si,mode9
  341. .print:
  342.         call    printplain
  343.         ret        
  344. ;-----------------------------------------------------------------------------
  345. check_first_parm:
  346.         mov     si,word [preboot_graph]
  347.         test    si,si
  348.         jnz      .no_zero        ;if no zero
  349. .zerro:
  350. ;        mov     ax,modes_table
  351. ;        mov     word [cursor_pos],ax
  352. ;        mov     word [home_cursor],ax
  353. ;        mov     word [preboot_graph],ax
  354. ;SET default video of mode first probe will fined a move of work 1024x768@32
  355.  
  356.         mov     ax,1024
  357.         mov     bx,768
  358.         mov     si,modes_table
  359.         call    .loops
  360.         test    ax,ax
  361.         jz     .ok_found_mode
  362.         mov     ax,800
  363.         mov     bx,600
  364.         mov     si,modes_table
  365.         call    .loops
  366.         test    ax,ax
  367.         jz     .ok_found_mode
  368.         mov     ax,640
  369.         mov     bx,480
  370.         mov     si,modes_table
  371.         call    .loops
  372.         test    ax,ax
  373.         jz     .ok_found_mode
  374.  
  375.         mov     si,modes_table
  376.         jmp     .ok_found_mode
  377.  
  378.  
  379.  
  380. .no_zero:
  381.         mov     bp,word [number_vm]
  382.         cmp     bp,word [es:si+6]
  383.         jz      .ok_found_mode
  384.         mov     ax,word [x_save]
  385.         mov     bx,word [y_save]
  386.         mov     si,modes_table
  387.         call    .loops
  388.         test    ax,ax
  389.         jz     .ok_found_mode
  390.  
  391.         mov    si,modes_table
  392. ;        cmp     ax,modes_table
  393. ;        jb      .zerro           ;check on correct if bellow
  394. ;        cmp     ax,word [end_cursor]
  395. ;        ja      .zerro           ;check on correct if anymore
  396.  
  397. .ok_found_mode:
  398.         mov     word [home_cursor],si
  399. ;        mov     word [cursor_pos],si
  400.         mov     word [preboot_graph],si
  401.         mov     ax,si
  402.  
  403.         mov     ecx,long_v_table
  404.  
  405. .loop:  add     ax,size_of_step
  406.         cmp     ax,word [end_cursor]
  407.         jae     .next_step
  408.         loop    .loop
  409. .next_step:
  410.         sub     ax,size_of_step*long_v_table
  411.         cmp     ax,modes_table
  412.         jae     @f
  413.         mov     ax,modes_table
  414. @@:
  415.  
  416.         mov     word [home_cursor],ax
  417.         mov     si,[preboot_graph]
  418.         mov     word [cursor_pos],si
  419.  
  420.         push    word [es:si]
  421.         pop     word [x_save]
  422.         push    word [es:si+2]
  423.         pop     word [y_save]
  424.         push    word [es:si+6]
  425.         pop     word [number_vm]
  426.  
  427.         ret
  428. ;;;;;;;;;;;;;;;;;;;;;;;;;;;
  429. .loops:
  430.         cmp     ax,word [es:si]
  431.         jne     .next
  432.         cmp     bx,word [es:si+2]
  433.         jne     .next
  434.         cmp     word [es:si+8],32
  435.         je      .ok
  436.         cmp     word [es:si+8],24
  437.         je      .ok
  438. .next:  add     si,size_of_step
  439.         cmp     word [es:si],-1
  440.         je      .exit
  441.         jmp     .loops
  442. .ok:    xor     ax,ax        
  443.         ret
  444. .exit:  or      ax,-1
  445.         ret
  446.  
  447.  
  448. ;-----------------------------------------------------------------------------
  449.  
  450. ;default_vmode:
  451.        
  452. ;-----------------------------------------------------------------------------
  453. draw_vmodes_table:
  454.         _setcursor 9, 2
  455.         mov     si,gr_mode
  456.         call    printplain
  457.  
  458.         mov     si,_st
  459.         call    printplain
  460.  
  461.         push    word [cursor_pos]
  462.         pop     ax
  463.         push    word [home_cursor]
  464.         pop     si
  465.         mov     cx,si
  466.  
  467.         cmp     ax,si
  468.         je      .ok
  469.         jb      .low
  470.  
  471.  
  472.         add     cx,size_of_step*long_v_table
  473.        
  474.         cmp     ax,cx
  475.         jb      .ok
  476.        
  477.         sub     cx,size_of_step*long_v_table
  478.         add     cx,size_of_step
  479.         cmp     cx,word[end_cursor]
  480.         jae     .ok
  481.         add     si,size_of_step
  482.         push    si
  483.         pop     word [home_cursor]
  484.         jmp     .ok
  485.  
  486.  
  487. .low:   sub     cx,size_of_step
  488.         cmp     cx,modes_table
  489.         jb      .ok
  490.         push    cx
  491.         push    cx
  492.         pop     word [home_cursor]
  493.         pop     si
  494.  
  495.  
  496. .ok:
  497. ; calculate scroll position
  498.         push    si
  499.         mov     ax, [end_cursor]
  500.         sub     ax, modes_table
  501.         mov     bx, size_of_step
  502.         cwd
  503.         div     bx
  504.         mov     si, ax          ; si = size of list
  505.         mov     ax, [home_cursor]
  506.         sub     ax, modes_table
  507.         cwd
  508.         div     bx
  509.         mov     di, ax
  510.         mov     ax, scroll_area_size*long_v_table
  511.         cwd
  512.         div     si
  513.         test    ax, ax
  514.         jnz     @f
  515.         inc     ax
  516. @@:
  517.         cmp     al, scroll_area_size
  518.         jb      @f
  519.         mov     al, scroll_area_size
  520. @@:
  521.         mov     cx, ax
  522. ; cx = scroll height
  523. ; calculate scroll pos
  524.         xor     bx, bx          ; initialize scroll pos
  525.         sub     al, scroll_area_size+1
  526.         neg     al
  527.         sub     si, long_v_table-1
  528.         jbe     @f
  529.         mul     di
  530.         div     si
  531.         mov     bx, ax
  532. @@:
  533.         inc     bx
  534.         imul    ax, bx, size_of_step
  535.         add     ax, [home_cursor]
  536.         mov     [scroll_start], ax
  537.         imul    cx, size_of_step
  538.         add     ax, cx
  539.         mov     [scroll_end], ax
  540.         pop     si
  541.         mov     bp,long_v_table               ;show rows
  542. .@@_next_bit:
  543. ;clear cursor
  544.         mov     ax,'  '
  545.         mov     word[ds:_r1+21],ax
  546.         mov     word[ds:_r1+50],ax
  547.  
  548.         mov     word[ds:_r2+21],ax
  549.         mov     word[ds:_r2+45],ax
  550.  
  551.         mov     word[ds:_rs+21],ax
  552.         mov     word[ds:_rs+46],ax
  553. ; draw string
  554.         cmp     word [es:si+6],0x12
  555.         je      .show_0x12
  556.         cmp     word [es:si+6],0x13
  557.         je      .show_0x13
  558.  
  559.         movzx   eax,word[es:si]
  560.         cmp     ax,-1
  561.         je      .@@_end
  562.         mov     di,_rs+23          
  563.         mov     ecx,10
  564.         mov     bl,4
  565.         call    int2str
  566.         movzx   eax,word[es:si+2]
  567.         inc     di
  568.         mov     bl,4
  569.         call    int2str
  570.  
  571.         movzx   eax,word[es:si+8]
  572.         inc     di
  573.         mov     bl,2
  574.         call    int2str
  575.  
  576.         cmp     si, word [cursor_pos]
  577.         jne     .next
  578. ;draw   cursor
  579.         mov     word[ds:_rs+21],'>>'
  580.         mov     word[ds:_rs+46],'<<'
  581.        
  582.  
  583.  
  584. .next:
  585.         push    si
  586.         mov     si,_rs
  587. .@@_sh:
  588. ; add to the string pseudographics for scrollbar
  589.         pop     bx
  590.         push    bx
  591.         mov     byte [si+53], ' '
  592.         cmp     bx, [scroll_start]
  593.         jb      @f
  594.         cmp     bx, [scroll_end]
  595.         jae     @f
  596.         mov     byte [si+53], 0xDB ; filled bar
  597. @@:
  598.         push    bx
  599.         add     bx, size_of_step
  600.         cmp     bx, [end_cursor]
  601.         jnz     @f
  602.         mov     byte [si+53], 31 ; 'down arrow' symbol
  603. @@:
  604.         sub     bx, [home_cursor]
  605.         cmp     bx, size_of_step*long_v_table
  606.         jnz     @f
  607.         mov     byte [si+53], 31 ; 'down arrow' symbol
  608. @@:
  609.         pop     bx
  610.         cmp     bx, [home_cursor]
  611.         jnz     @f
  612.         mov     byte [si+53], 30 ; 'up arrow' symbol
  613. @@:
  614.         call    printplain
  615.         pop     si
  616.         add     si,size_of_step
  617.  
  618.         dec     bp
  619.         jnz     .@@_next_bit
  620.  
  621. .@@_end:
  622.         mov     si,_bt
  623.         call    printplain
  624.         ret
  625. .show_0x13:
  626.         push    si
  627.  
  628.         cmp     si, word [cursor_pos]
  629.         jne     @f
  630.         mov     word[ds:_r1+21],'>>'
  631.         mov     word[ds:_r1+50],'<<'        
  632. @@:
  633.         mov     si,_r1
  634.         jmp     .@@_sh
  635. .show_0x12:
  636.         push    si
  637.         cmp     si, word [cursor_pos]
  638.         jne     @f
  639.  
  640.         mov     word[ds:_r2+21],'>>'
  641.         mov     word[ds:_r2+45],'<<'
  642. @@:
  643.         mov     si,_r2
  644.         jmp     .@@_sh
  645.  
  646. ;-----------------------------------------------------------------------------
  647. ;Clear arrea of current video page (0xb800)
  648. clear_vmodes_table:
  649.         pusha
  650.        ; draw frames
  651.         push    es
  652.         push    0xb800
  653.         pop     es
  654.         mov     di,1444
  655.         xor     ax,ax
  656.         mov     ah, 1*16+15
  657.         mov     cx,70
  658.         mov     bp,12
  659. .loop_start:
  660.         rep     stosw
  661.         mov     cx,70
  662.         add     di,20
  663.         dec     bp
  664.         jns             .loop_start      
  665.         pop     es
  666.         popa
  667.         ret
  668.  
  669. ;-----------------------------------------------------------------------------
  670.  
  671. set_vmode:
  672.         push    0 ;0;x1000
  673.         pop     es
  674.  
  675.         mov     si,word [preboot_graph]            ;[preboot_graph]
  676.         mov     cx,word [es:si+6]            ; number of mode
  677.        
  678.  
  679.         mov     ax,word [es:si+0]            ; resolution X
  680.         mov     bx,word [es:si+2]            ; resolution Y
  681.  
  682.  
  683.         mov     word [es:0x900A],ax              ; resolution X
  684.         mov     word [es:0x900C],bx              ; resolution Y
  685.         mov     word [es:0x9008],cx              ; number of mode
  686.  
  687.         cmp     cx,0x12
  688.         je      .mode0x12_0x13
  689.         cmp     cx,0x13
  690.         je      .mode0x12_0x13
  691.  
  692.  
  693.         cmp     byte [s_vesa.ver],'2'
  694.         jb      .vesa12
  695.  
  696. ;  VESA 2 and Vesa 3
  697.  
  698.         mov     ax,0x4f01
  699.         and     cx,0xfff
  700.         mov     di,mi;0xa000
  701.         int     0x10
  702.         ; LFB
  703.         mov     eax,[es:mi.PhysBasePtr];di+0x28]
  704.         mov     [es:0x9018],eax
  705.         ; ---- vbe voodoo
  706.         BytesPerLine equ 0x10
  707.         mov     ax, [es:di+BytesPerLine]
  708.         mov     [es:0x9001], ax
  709.         ; BPP
  710.         cmp     [es:mi.BitsPerPixel],16
  711.         jne     .l0
  712.         cmp     [es:mi.GreenMaskSize],5
  713.         jne     .l0
  714.         mov     [es:mi.BitsPerPixel],15
  715. .l0:
  716.         mov     al, byte [es:di+0x19]
  717.         mov     [es:0x9000], al
  718.         jmp     .exit
  719.  
  720. .mode0x12_0x13:
  721.         mov     byte [es:0x9000], 32
  722.         or      dword [es:0x9018], 0xFFFFFFFF; 0x800000
  723.  
  724.  
  725. ;  VESA 1.2 PM BANK SWITCH ADDRESS
  726.  
  727. .vesa12:
  728.  
  729.  
  730.         mov     ax,0x4f0A
  731.         xor     bx,bx
  732.         int     0x10
  733.         xor     eax,eax
  734.         xor     ebx,ebx
  735.         mov     ax,es
  736.         shl     eax,4
  737.         mov     bx,di
  738.         add     eax,ebx
  739.         movzx   ebx,word[es:di]
  740.         add     eax,ebx
  741.         push    0x0000
  742.         pop     es
  743.         mov     [es:0x9014],eax
  744.   .exit:
  745.         ret
  746.  
  747.  
  748. ;        mov     dword[es:0x9018],0x000A0000
  749. ;        ret
  750.  
  751. ;=============================================================================
  752. ;=============================================================================
  753. ;=============================================================================
  754.  
  755.